diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..68a94afe49 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,44 @@ +*.log +*.log.archive +*.out +*.prof +coverage.html + +# cadaver +*.cdv +*.cdv.archive + +# swagger +swagger.json +swagger.json.validated +kmdSwaggerWrappers.go +bundledSpecInject.go + +# Exclude GoLand files +.idea/ + +# Exclude VSCode files +.vscode/ + +# Exclude go binaries built in-place +cmd/algod/algod +cmd/goal/goal +cmd/updater/updater + +# Exclude our local temp directory +tmp/dev_pkg +tmp/out +tmp/node_pkgs + +# Ignore vim backup and swap files +*~ +*.swp +*.swo + +# Mac +.DS_Store + +# doc intermediates +data/transactions/logic/*.md + +*.pem diff --git a/.gitignore b/.gitignore index 44bec0113d..319b89b478 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,10 @@ crypto/libsodium-fork/**/Makefile.in crypto/libsodium-fork/aclocal.m4 crypto/libsodium-fork/build-aux/ +# Ignore libsodium files generated during ci process +crypto/copies +crypto/libs + # Ignore vim backup and swap files *~ *.swp @@ -54,3 +58,6 @@ data/transactions/logic/*.md *.pem +# Folder for collecting release assets +assets + diff --git a/Makefile b/Makefile index da976915aa..4a9b979bbd 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ export GO111MODULE UNAME := $(shell uname) SRCPATH := $(shell pwd) ARCH := $(shell ./scripts/archtype.sh) +OS_TYPE := $(shell ./scripts/ostype.sh) # If build number already set, use it - to ensure same build number across multiple platforms being built BUILDNUMBER ?= $(shell ./scripts/compute_build_number.sh) @@ -27,6 +28,13 @@ endif GOTAGSLIST += osusergo netgo static_build GOBUILDMODE := -buildmode pie endif +ifeq ($(ARCH), arm) +ifneq ("$(wildcard /etc/alpine-release)","") +EXTLDFLAGS += -static +GOTAGSLIST += osusergo netgo static_build +GOBUILDMODE := -buildmode pie +endif +endif endif GOTAGS := --tags "$(GOTAGSLIST)" @@ -44,7 +52,7 @@ GOLDFLAGS := $(GOLDFLAGS_BASE) \ UNIT_TEST_SOURCES := $(sort $(shell GO111MODULE=off go list ./... | grep -v /go-algorand/test/ )) ALGOD_API_PACKAGES := $(sort $(shell GO111MODULE=off cd daemon/algod/api; go list ./... )) -MSGP_GENERATE := ./protocol ./crypto ./data/basics ./data/transactions ./data/committee ./data/bookkeeping ./data/hashable ./auction ./agreement +MSGP_GENERATE := ./protocol ./crypto ./data/basics ./data/transactions ./data/committee ./data/bookkeeping ./data/hashable ./auction ./agreement ./rpcs ./node default: build @@ -85,14 +93,16 @@ generate: deps msgp: $(patsubst %,%/msgp_gen.go,$(MSGP_GENERATE)) %/msgp_gen.go: deps ALWAYS - $(GOPATH1)/bin/msgp -file ./$(@D) -o $@ 1>/dev/null + $(GOPATH1)/bin/msgp -file ./$(@D) -o $@ -warnmask github.com/algorand/go-algorand ALWAYS: # build our fork of libsodium, placing artifacts into crypto/lib/ and crypto/include/ -crypto/lib/libsodium.a: - cd crypto/libsodium-fork && \ - ./autogen.sh && \ - ./configure --disable-shared --prefix="$(SRCPATH)/crypto/" && \ +crypto/libs/$(OS_TYPE)/$(ARCH)/lib/libsodium.a: + mkdir -p crypto/copies/$(OS_TYPE)/$(ARCH) + cp -R crypto/libsodium-fork crypto/copies/$(OS_TYPE)/$(ARCH)/libsodium-fork + cd crypto/copies/$(OS_TYPE)/$(ARCH)/libsodium-fork && \ + ./autogen.sh --prefix $(SRCPATH)/crypto/libs/$(OS_TYPE)/$(ARCH) && \ + ./configure --disable-shared --prefix="$(SRCPATH)/crypto/libs/$(OS_TYPE)/$(ARCH)" && \ $(MAKE) && \ $(MAKE) install @@ -108,7 +118,7 @@ ALGOD_API_FILES := $(shell find daemon/algod/api/server/common daemon/algod/api/ ALGOD_API_SWAGGER_INJECT := daemon/algod/api/server/lib/bundledSpecInject.go # Note that swagger.json requires the go-swagger dep. -$(ALGOD_API_SWAGGER_SPEC): $(ALGOD_API_FILES) crypto/lib/libsodium.a +$(ALGOD_API_SWAGGER_SPEC): $(ALGOD_API_FILES) crypto/libs/$(OS_TYPE)/$(ARCH)/lib/libsodium.a cd daemon/algod/api && \ PATH=$(GOPATH1)/bin:$$PATH \ go generate ./... @@ -122,7 +132,7 @@ KMD_API_FILES := $(shell find daemon/kmd/api/ -type f | grep -v $(KMD_API_SWAGGE KMD_API_SWAGGER_WRAPPER := kmdSwaggerWrappers.go KMD_API_SWAGGER_INJECT := daemon/kmd/lib/kmdapi/bundledSpecInject.go -$(KMD_API_SWAGGER_SPEC): $(KMD_API_FILES) crypto/lib/libsodium.a +$(KMD_API_SWAGGER_SPEC): $(KMD_API_FILES) crypto/libs/$(OS_TYPE)/$(ARCH)/lib/libsodium.a cd daemon/kmd/lib/kmdapi && \ python genSwaggerWrappers.py $(KMD_API_SWAGGER_WRAPPER) cd daemon/kmd && \ @@ -147,7 +157,7 @@ $(KMD_API_SWAGGER_INJECT): $(KMD_API_SWAGGER_SPEC) $(KMD_API_SWAGGER_SPEC).valid build: buildsrc gen -buildsrc: crypto/lib/libsodium.a node_exporter NONGO_BIN deps $(ALGOD_API_SWAGGER_INJECT) $(KMD_API_SWAGGER_INJECT) +buildsrc: crypto/libs/$(OS_TYPE)/$(ARCH)/lib/libsodium.a node_exporter NONGO_BIN deps $(ALGOD_API_SWAGGER_INJECT) $(KMD_API_SWAGGER_INJECT) go install $(GOTRIMPATH) $(GOTAGS) $(GOBUILDMODE) -ldflags="$(GOLDFLAGS)" ./... SOURCES_RACE := github.com/algorand/go-algorand/cmd/kmd @@ -209,6 +219,8 @@ clean: cd crypto/libsodium-fork && \ test ! -e Makefile || make clean rm -rf crypto/lib + rm -rf crypto/libs + rm -rf crypto/copies # clean without crypto cleango: @@ -265,3 +277,13 @@ install: build scripts/dev_install.sh -p $(GOPATH1)/bin .PHONY: default fmt vet lint check_license check_shell sanity cover prof deps build test fulltest shorttest clean cleango deploy node_exporter install %gen gen NONGO_BIN + +### TARGETS FOR CICD PROCESS + +ci-deps: + scripts/configure_dev-deps.sh && \ + scripts/check_deps.sh + +ci-build: buildsrc gen + mkdir -p $(SRCPATH)/tmp/node_pkgs/$(OS_TYPE)/$(ARCH) && \ + PKG_ROOT=$(SRCPATH)/tmp/node_pkgs/$(OS_TYPE)/$(ARCH) NO_BUILD=True VARIATIONS=$(OS_TYPE)/$(ARCH) scripts/build_packages.sh $(OS_TYPE)/$(ARCH) diff --git a/agreement/abstractions.go b/agreement/abstractions.go index 97b1c0f2f7..b8d8c80e60 100644 --- a/agreement/abstractions.go +++ b/agreement/abstractions.go @@ -201,9 +201,9 @@ type LedgerWriter interface { // as above. EnsureValidatedBlock(ValidatedBlock, Certificate) - // EnsureDigest waits until some Block that corresponds to a given - // Certificate appears in the ledger. EnsureDigest does not wait for - // the block to be written to disk; use Wait() if needed. + // EnsureDigest signals the Ledger to attempt to fetch a Block matching + // the given Certificate. EnsureDigest does not wait for the block to + // be written to disk; use Wait() if needed. // // The Ledger must guarantee that after this method returns, any Seed, // Record, or Circulation call reflects the contents of the Block @@ -215,7 +215,7 @@ type LedgerWriter interface { // this is the case, the behavior of Ledger is undefined. // (Implementations are encouraged to panic or otherwise fail loudly in // this case, because it means that a fork has occurred.) - EnsureDigest(Certificate, chan struct{}, *AsyncVoteVerifier) + EnsureDigest(Certificate, *AsyncVoteVerifier) } // A KeyManager stores and deletes participation keys. diff --git a/agreement/actions.go b/agreement/actions.go index 376a3ce151..7058e2e391 100644 --- a/agreement/actions.go +++ b/agreement/actions.go @@ -46,6 +46,7 @@ const ( // ledger ensure + stageDigest // time rezero @@ -123,7 +124,7 @@ func (a networkAction) do(ctx context.Context, s *Service) { if a.T == broadcastVotes { tag := protocol.AgreementVoteTag for i, uv := range a.UnauthenticatedVotes { - data := protocol.Encode(uv) + data := protocol.Encode(&uv) sendErr := s.Network.Broadcast(tag, data) if sendErr != nil { s.log.Warnf("Network was unable to queue votes for broadcast(%v). %d / %d votes for round %d period %d step %d were dropped.", @@ -144,16 +145,16 @@ func (a networkAction) do(ctx context.Context, s *Service) { var data []byte switch a.Tag { case protocol.AgreementVoteTag: - data = protocol.Encode(a.UnauthenticatedVote) + data = protocol.Encode(&a.UnauthenticatedVote) case protocol.VoteBundleTag: - data = protocol.Encode(a.UnauthenticatedBundle) + data = protocol.Encode(&a.UnauthenticatedBundle) case protocol.ProposalPayloadTag: msg := a.CompoundMessage payload := transmittedPayload{ unauthenticatedProposal: msg.Proposal, PriorVote: msg.Vote, } - data = protocol.Encode(payload) + data = protocol.Encode(&payload) } switch a.T { @@ -178,6 +179,7 @@ type cryptoAction struct { Proposal proposalValue // TODO deprecate Round round Period period + Step step Pinned bool TaskIndex int } @@ -197,15 +199,16 @@ func (a cryptoAction) do(ctx context.Context, s *Service) { case verifyPayload: s.demux.verifyPayload(ctx, a.M, a.Round, a.Period, a.Pinned) case verifyBundle: - s.demux.verifyBundle(ctx, a.M, a.Round, a.Period) + s.demux.verifyBundle(ctx, a.M, a.Round, a.Period, a.Step) } } type ensureAction struct { nonpersistent - Payload proposal - PayloadOk bool + // the payload that we will give to the ledger + Payload proposal + // the certificate proving commitment Certificate Certificate } @@ -214,7 +217,7 @@ func (a ensureAction) t() actionType { } func (a ensureAction) String() string { - return fmt.Sprintf("%v: %.5v", a.t().String(), a.Payload.Digest().String()) + return fmt.Sprintf("%s: %.5s: %v, %v, %.5s", a.t().String(), a.Payload.Digest().String(), a.Certificate.Round, a.Certificate.Period, a.Certificate.Proposal.BlockDigest.String()) } func (a ensureAction) do(ctx context.Context, s *Service) { @@ -227,7 +230,7 @@ func (a ensureAction) do(ctx context.Context, s *Service) { if a.Payload.ve != nil { logEvent.Type = logspec.RoundConcluded - s.log.with(logEvent).Infof("committed round %v with pre-validated block %v", a.Certificate.Round, a.Certificate.Proposal) + s.log.with(logEvent).Infof("committed round %d with pre-validated block %v", a.Certificate.Round, a.Certificate.Proposal) s.log.EventWithDetails(telemetryspec.Agreement, telemetryspec.BlockAcceptedEvent, telemetryspec.BlockAcceptedEventDetails{ Address: a.Certificate.Proposal.OriginalProposer.String(), Hash: a.Certificate.Proposal.BlockDigest.String(), @@ -236,28 +239,48 @@ func (a ensureAction) do(ctx context.Context, s *Service) { s.Ledger.EnsureValidatedBlock(a.Payload.ve, a.Certificate) } else { block := a.Payload.Block - if !a.PayloadOk { - logEvent.Type = logspec.RoundWaiting - s.log.with(logEvent).Infof("round %v concluded without block for %v; waiting on ledger", a.Certificate.Round, a.Certificate.Proposal) - s.Ledger.EnsureDigest(a.Certificate, s.quit, s.voteVerifier) - } else { - logEvent.Type = logspec.RoundConcluded - s.log.with(logEvent).Infof("committed round %v with block %v", a.Certificate.Round, a.Certificate.Proposal) - s.log.EventWithDetails(telemetryspec.Agreement, telemetryspec.BlockAcceptedEvent, telemetryspec.BlockAcceptedEventDetails{ - Address: a.Certificate.Proposal.OriginalProposer.String(), - Hash: a.Certificate.Proposal.BlockDigest.String(), - Round: uint64(a.Certificate.Round), - }) - s.Ledger.EnsureBlock(block, a.Certificate) - } + logEvent.Type = logspec.RoundConcluded + s.log.with(logEvent).Infof("committed round %d with block %v", a.Certificate.Round, a.Certificate.Proposal) + s.log.EventWithDetails(telemetryspec.Agreement, telemetryspec.BlockAcceptedEvent, telemetryspec.BlockAcceptedEventDetails{ + Address: a.Certificate.Proposal.OriginalProposer.String(), + Hash: a.Certificate.Proposal.BlockDigest.String(), + Round: uint64(a.Certificate.Round), + }) + s.Ledger.EnsureBlock(block, a.Certificate) } logEventStart := logEvent logEventStart.Type = logspec.RoundStart - s.log.with(logEventStart).Infof("finished round %v", a.Certificate.Round) + s.log.with(logEventStart).Infof("finished round %d", a.Certificate.Round) s.tracer.timeR().StartRound(a.Certificate.Round + 1) s.tracer.timeR().RecStep(0, propose, bottom) } +type stageDigestAction struct { + nonpersistent + // Certificate identifies a block and is a proof commitment + Certificate Certificate // a block digest is probably sufficient; keep certificate for now to match ledger interface +} + +func (a stageDigestAction) t() actionType { + return stageDigest +} + +func (a stageDigestAction) String() string { + return fmt.Sprintf("%s: %.5s. %v. %v", a.t().String(), a.Certificate.Proposal.BlockDigest.String(), a.Certificate.Round, a.Certificate.Period) +} + +func (a stageDigestAction) do(ctx context.Context, service *Service) { + logEvent := logspec.AgreementEvent{ + Hash: a.Certificate.Proposal.BlockDigest.String(), + Round: uint64(a.Certificate.Round), + Period: uint64(a.Certificate.Period), + Sender: a.Certificate.Proposal.OriginalProposer.String(), + Type: logspec.RoundWaiting, + } + service.log.with(logEvent).Infof("round %v concluded without block for %v; (async) waiting on ledger", a.Certificate.Round, a.Certificate.Proposal) + service.Ledger.EnsureDigest(a.Certificate, service.voteVerifier) +} + type rezeroAction struct { nonpersistent @@ -408,10 +431,6 @@ func relayAction(e messageEvent, tag protocol.Tag, o interface{}) action { return a } -func verifyBundleAction(e messageEvent, r round, p period) action { - return cryptoAction{T: verifyBundle, M: e.Input, Round: r, Period: p} -} - func verifyVoteAction(e messageEvent, r round, p period, taskIndex int) action { return cryptoAction{T: verifyVote, M: e.Input, Round: r, Period: p, TaskIndex: taskIndex} } @@ -420,6 +439,10 @@ func verifyPayloadAction(e messageEvent, r round, p period, pinned bool) action return cryptoAction{T: verifyPayload, M: e.Input, Round: r, Period: p, Pinned: pinned} } +func verifyBundleAction(e messageEvent, r round, p period, s step) action { + return cryptoAction{T: verifyBundle, M: e.Input, Round: r, Period: p, Step: s} +} + func zeroAction(t actionType) action { switch t { case noop: diff --git a/agreement/actiontype_string.go b/agreement/actiontype_string.go index a9279d7723..c27b9138bb 100644 --- a/agreement/actiontype_string.go +++ b/agreement/actiontype_string.go @@ -18,16 +18,17 @@ func _() { _ = x[verifyPayload-7] _ = x[verifyBundle-8] _ = x[ensure-9] - _ = x[rezero-10] - _ = x[attest-11] - _ = x[assemble-12] - _ = x[repropose-13] - _ = x[checkpoint-14] + _ = x[stageDigest-10] + _ = x[rezero-11] + _ = x[attest-12] + _ = x[assemble-13] + _ = x[repropose-14] + _ = x[checkpoint-15] } -const _actionType_name = "noopignorebroadcastrelaydisconnectbroadcastVotesverifyVoteverifyPayloadverifyBundleensurerezeroattestassemblereproposecheckpoint" +const _actionType_name = "noopignorebroadcastrelaydisconnectbroadcastVotesverifyVoteverifyPayloadverifyBundleensurestageDigestrezeroattestassemblereproposecheckpoint" -var _actionType_index = [...]uint8{0, 4, 10, 19, 24, 34, 48, 58, 71, 83, 89, 95, 101, 109, 118, 128} +var _actionType_index = [...]uint8{0, 4, 10, 19, 24, 34, 48, 58, 71, 83, 89, 100, 106, 112, 120, 129, 139} func (i actionType) String() string { if i < 0 || i >= actionType(len(_actionType_index)-1) { diff --git a/agreement/agreementtest/simulate.go b/agreement/agreementtest/simulate.go index c08ece3679..43b716ca58 100644 --- a/agreement/agreementtest/simulate.go +++ b/agreement/agreementtest/simulate.go @@ -18,9 +18,7 @@ package agreementtest import ( - "context" "fmt" - "net/http" "strconv" "time" @@ -28,12 +26,11 @@ import ( "github.com/algorand/go-algorand/agreement" "github.com/algorand/go-algorand/agreement/gossip" + "github.com/algorand/go-algorand/components/mocks" "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/network" - "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/util/db" "github.com/algorand/go-algorand/util/timers" ) @@ -116,48 +113,14 @@ func (i *instant) HasPending(queueName string) bool { return true } -type blackhole struct{} +type blackhole struct { + mocks.MockNetwork +} func (b *blackhole) Address() (string, bool) { return "blackhole", true } -func (b *blackhole) Broadcast(ctx context.Context, tag protocol.Tag, data []byte, wait bool, except network.Peer) error { - return nil -} - -func (b *blackhole) Relay(ctx context.Context, tag protocol.Tag, data []byte, wait bool, except network.Peer) error { - return nil -} - -func (b *blackhole) Disconnect(badpeer network.Peer) {} - -func (b *blackhole) DisconnectPeers() {} - -func (b *blackhole) GetPeers(options ...network.PeerOption) []network.Peer { - return nil -} - -func (b *blackhole) Ready() chan struct{} { - var closed chan struct{} - close(closed) - return closed -} - -func (b *blackhole) RegisterRPCName(string, interface{}) {} -func (b *blackhole) RegisterHTTPHandler(path string, handler http.Handler) { -} - -func (b *blackhole) RequestConnectOutgoing(bool, <-chan struct{}) {} - -func (b *blackhole) Start() {} - -func (b *blackhole) Stop() {} - -func (b *blackhole) RegisterHandlers(dispatch []network.TaggedMessageHandler) {} - -func (b *blackhole) ClearHandlers() {} - // CryptoRandomSource is a random source that is based off our crypto library. type CryptoRandomSource struct{} @@ -218,7 +181,7 @@ func Simulate(dbname string, n basics.Round, roundDeadline time.Duration, ledger select { case <-ledger.Wait(r): case <-deadlineCh: - return fmt.Errorf("agreementtest.Simulate: round %v failed to complete by the deadline (%v)", r, roundDeadline) + return fmt.Errorf("agreementtest.Simulate: round %d failed to complete by the deadline (%v)", r, roundDeadline) } } diff --git a/agreement/agreementtest/simulate_test.go b/agreement/agreementtest/simulate_test.go index 0d9a83a5a2..ab472146d4 100644 --- a/agreement/agreementtest/simulate_test.go +++ b/agreement/agreementtest/simulate_test.go @@ -42,7 +42,7 @@ import ( var poolAddr = basics.Address{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} -var deadline = time.Second +var deadline = time.Second * 5 var proto = protocol.ConsensusCurrentVersion @@ -251,7 +251,7 @@ func (l *testLedger) EnsureBlock(e bookkeeping.Block, c agreement.Certificate) { if _, ok := l.entries[e.Round()]; ok { if l.entries[e.Round()].Digest() != e.Digest() { - err := fmt.Errorf("testLedger.EnsureBlock called with conflicting entries in round %v", e.Round()) + err := fmt.Errorf("testLedger.EnsureBlock called with conflicting entries in round %d", e.Round()) panic(err) } } @@ -266,7 +266,7 @@ func (l *testLedger) EnsureBlock(e bookkeeping.Block, c agreement.Certificate) { l.notify(e.Round()) } -func (l *testLedger) EnsureDigest(c agreement.Certificate, quit chan struct{}, verifier *agreement.AsyncVoteVerifier) { +func (l *testLedger) EnsureDigest(c agreement.Certificate, verifier *agreement.AsyncVoteVerifier) { r := c.Round consistencyCheck := func() bool { l.mu.Lock() @@ -274,7 +274,7 @@ func (l *testLedger) EnsureDigest(c agreement.Certificate, quit chan struct{}, v if r < l.nextRound { if l.entries[r].Digest() != c.Proposal.BlockDigest { - err := fmt.Errorf("testLedger.EnsureDigest called with conflicting entries in round %v", r) + err := fmt.Errorf("testLedger.EnsureDigest called with conflicting entries in round %d", r) panic(err) } return true @@ -286,14 +286,10 @@ func (l *testLedger) EnsureDigest(c agreement.Certificate, quit chan struct{}, v return } - select { - case <-quit: - return - case <-l.Wait(r): - if !consistencyCheck() { - err := fmt.Errorf("Wait channel fired without matching block in round %v", r) - panic(err) - } + <-l.Wait(r) + if !consistencyCheck() { + err := fmt.Errorf("Wait channel fired without matching block in round %d", r) + panic(err) } } diff --git a/agreement/common_test.go b/agreement/common_test.go index 39c7db72a8..9d9dfa2cf4 100644 --- a/agreement/common_test.go +++ b/agreement/common_test.go @@ -315,7 +315,7 @@ func (l *testLedger) EnsureBlock(e bookkeeping.Block, c Certificate) { if _, ok := l.entries[e.Round()]; ok { if l.entries[e.Round()].Digest() != e.Digest() { - err := fmt.Errorf("testLedger.EnsureBlock: called with conflicting entries in round %v", e.Round()) + err := fmt.Errorf("testLedger.EnsureBlock: called with conflicting entries in round %d", e.Round()) panic(err) } } @@ -326,42 +326,28 @@ func (l *testLedger) EnsureBlock(e bookkeeping.Block, c Certificate) { if l.nextRound == e.Round() { l.nextRound = e.Round() + 1 } else if l.nextRound < e.Round() { - err := fmt.Errorf("testLedger.EnsureBlock: attempted to write block in future round: %v < %v", l.nextRound, e.Round()) + err := fmt.Errorf("testLedger.EnsureBlock: attempted to write block in future round: %d < %d", l.nextRound, e.Round()) panic(err) } l.notify(e.Round()) } -func (l *testLedger) EnsureDigest(c Certificate, quit chan struct{}, verifier *AsyncVoteVerifier) { +func (l *testLedger) EnsureDigest(c Certificate, verifier *AsyncVoteVerifier) { r := c.Round - consistencyCheck := func() bool { - l.mu.Lock() - defer l.mu.Unlock() - - if r < l.nextRound { - if l.entries[r].Digest() != c.Proposal.BlockDigest { - err := fmt.Errorf("testLedger.EnsureDigest called with conflicting entries in round %v", r) - panic(err) - } - return true - } - return false - } - - if consistencyCheck() { - return - } + l.mu.Lock() + defer l.mu.Unlock() - select { - case <-quit: - return - case <-l.Wait(r): - if !consistencyCheck() { - err := fmt.Errorf("Wait channel fired without matching block in round %v", r) + if r < l.nextRound { + if l.entries[r].Digest() != c.Proposal.BlockDigest { + err := fmt.Errorf("testLedger.EnsureDigest called with conflicting entries in round %d", r) panic(err) } } + // the mock ledger does not actually need to wait for the block. + // Agreement should function properly even if it never happens. + // No test right now expects the ledger to eventually ensure digest (we can add one if need be) + return } func (l *testLedger) ConsensusParams(r basics.Round) (config.ConsensusParams, error) { @@ -383,7 +369,7 @@ type testAccountData struct { func makeProposalsTesting(accs testAccountData, round basics.Round, period period, factory BlockFactory, ledger Ledger) (ps []proposal, vs []vote) { ve, err := factory.AssembleBlock(round, time.Now().Add(time.Minute)) if err != nil { - logging.Base().Errorf("Could not generate a proposal for round %v: %v", round, err) + logging.Base().Errorf("Could not generate a proposal for round %d: %v", round, err) return nil, nil } diff --git a/agreement/cryptoRequestContext.go b/agreement/cryptoRequestContext.go index 8a94ef7c8f..6bb2234a86 100644 --- a/agreement/cryptoRequestContext.go +++ b/agreement/cryptoRequestContext.go @@ -18,8 +18,6 @@ package agreement import ( "context" - - "github.com/algorand/go-algorand/protocol" ) // periodRequestsContext keeps a context for all tasks associated with the same period, so we can cancel them if the period becomes irrelevant. @@ -35,7 +33,10 @@ type periodRequestsContext struct { // It allows for the pinned value to act as a sentinel. type cryptoRequestCtxKey struct { period period - pinned bool // If this is set, period should be 0. + + // note: following two booleans are mutually exclusive + certify bool // If this is set, period should be 0. + pinned bool // If this is set, period should be 0. } // roundRequestsContext keeps a the root context for all cryptoRequests associated with a round. @@ -53,71 +54,58 @@ func makePendingRequestsContext() pendingRequestsContext { return make(map[round]roundRequestsContext) } -// add returns a context associated with a given request -func (pending pendingRequestsContext) add(request cryptoRequest) context.Context { +// getReqCtx gets the roundRequestsContext for a round and cryptoRequestCtxKey. +func (pending pendingRequestsContext) getReqCtx(rnd round, pkey cryptoRequestCtxKey) periodRequestsContext { // create round context - if _, has := pending[request.Round]; !has { + if _, has := pending[rnd]; !has { roundCtx, cancel := context.WithCancel(context.Background()) - pending[request.Round] = roundRequestsContext{ctx: roundCtx, cancel: cancel, periods: make(map[cryptoRequestCtxKey]periodRequestsContext)} - } - - pkey := cryptoRequestCtxKey{period: request.Period} - if request.Pinned { - pkey = cryptoRequestCtxKey{pinned: request.Pinned} + pending[rnd] = roundRequestsContext{ctx: roundCtx, cancel: cancel, periods: make(map[cryptoRequestCtxKey]periodRequestsContext)} } // create period context - if _, has := pending[request.Round].periods[pkey]; !has { - periodCtx, periodCancel := context.WithCancel(pending[request.Round].ctx) - pending[request.Round].periods[pkey] = periodRequestsContext{ctx: periodCtx, cancel: periodCancel} - } - - // find the right context for the request - roundCtx := pending[request.Round] - periodCtx, has := roundCtx.periods[pkey] - - if request.Tag == protocol.ProposalPayloadTag { - // we have a new proposal, so cancel validation of an old proposal for the same round and period - if has && periodCtx.proposalCancelFunc != nil { - periodCtx.proposalCancelFunc() - } - - // create a context for the new proposal - var proposalContext context.Context - proposalContext, periodCtx.proposalCancelFunc = context.WithCancel(periodCtx.ctx) - pending[request.Round].periods[pkey] = periodCtx - return proposalContext + if _, has := pending[rnd].periods[pkey]; !has { + periodCtx, periodCancel := context.WithCancel(pending[rnd].ctx) + pending[rnd].periods[pkey] = periodRequestsContext{ctx: periodCtx, cancel: periodCancel} } - return periodCtx.ctx + return pending[rnd].periods[pkey] } -// add returns a context associated with a given request +// addVote returns a context associated with a given request func (pending pendingRequestsContext) addVote(request cryptoVoteRequest) context.Context { - // create round context - if _, has := pending[request.Round]; !has { - roundCtx, cancel := context.WithCancel(context.Background()) - pending[request.Round] = roundRequestsContext{ctx: roundCtx, cancel: cancel, periods: make(map[cryptoRequestCtxKey]periodRequestsContext)} - } + return pending.getReqCtx(request.Round, cryptoRequestCtxKey{period: request.Period}).ctx +} +// addProposal returns a context associated with a given request (and cancels any older similar request) +func (pending pendingRequestsContext) addProposal(request cryptoProposalRequest) context.Context { pkey := cryptoRequestCtxKey{period: request.Period} if request.Pinned { pkey = cryptoRequestCtxKey{pinned: request.Pinned} } + rqctx := pending.getReqCtx(request.Round, pkey) - // create period context - if _, has := pending[request.Round].periods[pkey]; !has { - periodCtx, periodCancel := context.WithCancel(pending[request.Round].ctx) - pending[request.Round].periods[pkey] = periodRequestsContext{ctx: periodCtx, cancel: periodCancel} + if rqctx.proposalCancelFunc != nil { + // we have a new proposal, so cancel validation of an old proposal for the same round and period + rqctx.proposalCancelFunc() } - // find the right context for the request - roundCtx := pending[request.Round] - periodCtx := roundCtx.periods[pkey] - return periodCtx.ctx + // create a context for the new proposal + var proposalContext context.Context + proposalContext, rqctx.proposalCancelFunc = context.WithCancel(rqctx.ctx) + pending[request.Round].periods[pkey] = rqctx + return proposalContext +} + +// addBundle returns a context associated with a given request +func (pending pendingRequestsContext) addBundle(request cryptoBundleRequest) context.Context { + pkey := cryptoRequestCtxKey{period: request.Period} + if request.Certify { + pkey = cryptoRequestCtxKey{certify: request.Certify} + } + return pending.getReqCtx(request.Round, pkey).ctx } // clearStaleContexts cancels contexts associated with cryptoRequests that are no longer relevant at the given round and period -func (pending pendingRequestsContext) clearStaleContexts(r round, p period, pinned bool) { +func (pending pendingRequestsContext) clearStaleContexts(r round, p period, pinned bool, certify bool) { // at round r + 2 we can clear tasks from round r oldRounds := make([]round, 0) for round := range pending { @@ -125,22 +113,22 @@ func (pending pendingRequestsContext) clearStaleContexts(r round, p period, pinn oldRounds = append(oldRounds, round) } } - - // we got a new pinned proposal: do not clear period tasks - if pinned { - return - } - - // at period p + 3 we can clear tasks from period p for _, oldRound := range oldRounds { pending[oldRound].cancel() delete(pending, oldRound) } + // we got a new pinned proposal or a cert bundle: + // do not clear period tasks + if pinned || certify { + return + } + + // at period p + 3 we can clear tasks from period p if _, has := pending[r]; has { oldPeriods := make([]cryptoRequestCtxKey, 0) for pkey := range pending[r].periods { - if !pkey.pinned && pkey.period+3 <= p { + if !pkey.pinned && !pkey.certify && pkey.period+3 <= p { oldPeriods = append(oldPeriods, pkey) } } diff --git a/agreement/cryptoRequestContext_test.go b/agreement/cryptoRequestContext_test.go index aa107c1826..648dcdc3b6 100644 --- a/agreement/cryptoRequestContext_test.go +++ b/agreement/cryptoRequestContext_test.go @@ -17,6 +17,7 @@ package agreement import ( + "context" "testing" "github.com/stretchr/testify/require" @@ -24,51 +25,88 @@ import ( "github.com/algorand/go-algorand/protocol" ) +func forEachTagDo(fn func(protocol.Tag)) { + for _, tag := range []protocol.Tag{protocol.AgreementVoteTag, protocol.ProposalPayloadTag, protocol.VoteBundleTag} { + fn(tag) + } +} + func TestCryptoRequestContextAddCancelRound(t *testing.T) { pending := makePendingRequestsContext() - req := cryptoRequest{Round: 10, Period: 10} - ctx := pending.add(req) - - roundCtx, hasRound := pending[req.Round] - require.True(t, hasRound) - - _, hasPeriod := pending[req.Round].periods[cryptoRequestCtxKey{period: req.Period}] - require.True(t, hasPeriod) - - roundCtx.cancel() - select { - case <-ctx.Done(): - default: - t.Errorf("did not cancel request") - } + rnd := round(10) + per := period(10) + forEachTagDo(func(tag protocol.Tag) { + var ctx context.Context + switch tag { + case protocol.AgreementVoteTag: + req := cryptoVoteRequest{Round: rnd, Period: per} + ctx = pending.addVote(req) + case protocol.ProposalPayloadTag: + req := cryptoProposalRequest{Round: rnd, Period: per} + ctx = pending.addProposal(req) + case protocol.VoteBundleTag: + req := cryptoBundleRequest{Round: rnd, Period: per} + ctx = pending.addBundle(req) + } + + roundCtx, hasRound := pending[rnd] + require.True(t, hasRound) + + _, hasPeriod := pending[rnd].periods[cryptoRequestCtxKey{period: per}] + require.True(t, hasPeriod) + + roundCtx.cancel() + select { + case <-ctx.Done(): + default: + t.Errorf("did not cancel request") + } + }) } func TestCryptoRequestContextAddCancelPeriod(t *testing.T) { pending := makePendingRequestsContext() - req := cryptoRequest{Round: 10, Period: 10} - ctx := pending.add(req) - - _, hasRound := pending[req.Round] - require.True(t, hasRound) - - periodCtx, hasPeriod := pending[req.Round].periods[cryptoRequestCtxKey{period: req.Period}] - require.True(t, hasPeriod) - - periodCtx.cancel() - select { - case <-ctx.Done(): - default: - t.Errorf("did not cancel request") - } + rnd := round(10) + per := period(10) + + forEachTagDo(func(tag protocol.Tag) { + var ctx context.Context + switch tag { + case protocol.AgreementVoteTag: + req := cryptoVoteRequest{Round: rnd, Period: per} + ctx = pending.addVote(req) + case protocol.ProposalPayloadTag: + req := cryptoProposalRequest{Round: rnd, Period: per} + ctx = pending.addProposal(req) + case protocol.VoteBundleTag: + req := cryptoBundleRequest{Round: rnd, Period: per} + ctx = pending.addBundle(req) + } + + _, hasRound := pending[rnd] + require.True(t, hasRound) + + periodCtx, hasPeriod := pending[rnd].periods[cryptoRequestCtxKey{period: per}] + require.True(t, hasPeriod) + + periodCtx.cancel() + select { + case <-ctx.Done(): + default: + t.Errorf("did not cancel request") + } + }) } func TestCryptoRequestContextAddCancelProposal(t *testing.T) { pending := makePendingRequestsContext() - proposal := cryptoRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: 10, Period: 10} - ctx := pending.add(proposal) + rnd := round(10) + per := period(10) + proposal := cryptoProposalRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: rnd, Period: per} + ctx := pending.addProposal(proposal) - proposal2 := cryptoRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: 10, Period: 10} - ctx2 := pending.add(proposal2) + proposal2 := cryptoProposalRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: rnd, Period: per} + ctx2 := pending.addProposal(proposal2) select { case <-ctx.Done(): @@ -86,11 +124,12 @@ func TestCryptoRequestContextAddCancelProposal(t *testing.T) { func TestCryptoRequestContextAddCancelPinnedProposal(t *testing.T) { pending := makePendingRequestsContext() - proposal := cryptoRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: 10, Pinned: true} - ctx := pending.add(proposal) + rnd := round(10) + proposal := cryptoProposalRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: rnd, Pinned: true} + ctx := pending.addProposal(proposal) - proposal2 := cryptoRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: 10, Pinned: true} - ctx2 := pending.add(proposal2) + proposal2 := cryptoProposalRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: rnd, Pinned: true} + ctx2 := pending.addProposal(proposal2) select { case <-ctx.Done(): @@ -108,11 +147,13 @@ func TestCryptoRequestContextAddCancelPinnedProposal(t *testing.T) { func TestCryptoRequestContextAddNoCancelPinnedProposal(t *testing.T) { pending := makePendingRequestsContext() - proposal := cryptoRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: 10, Pinned: true} - ctx := pending.add(proposal) + rnd := round(10) + per := period(10) + proposal := cryptoProposalRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: rnd, Pinned: true} + ctx := pending.addProposal(proposal) - proposal2 := cryptoRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: 10, Period: 10} - ctx2 := pending.add(proposal2) + proposal2 := cryptoProposalRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: rnd, Period: per} + ctx2 := pending.addProposal(proposal2) select { case <-ctx.Done(): @@ -129,11 +170,13 @@ func TestCryptoRequestContextAddNoCancelPinnedProposal(t *testing.T) { func TestCryptoRequestContextAddNoInterferencePinnedProposal(t *testing.T) { pending := makePendingRequestsContext() - proposal := cryptoRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: 10, Period: 10} - ctx := pending.add(proposal) + rnd := round(10) + per := period(10) + proposal := cryptoProposalRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: rnd, Period: per} + ctx := pending.addProposal(proposal) - proposal2 := cryptoRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: 10, Pinned: true} - ctx2 := pending.add(proposal2) + proposal2 := cryptoProposalRequest{message: message{Tag: protocol.ProposalPayloadTag}, Round: rnd, Pinned: true} + ctx2 := pending.addProposal(proposal2) select { case <-ctx.Done(): @@ -150,129 +193,215 @@ func TestCryptoRequestContextAddNoInterferencePinnedProposal(t *testing.T) { func TestCryptoRequestContextCleanupByRound(t *testing.T) { pending := makePendingRequestsContext() - req := cryptoRequest{Round: 10, Period: 10} - ctx := pending.add(req) - - _, hasRound := pending[req.Round] - require.True(t, hasRound) - - _, hasPeriod := pending[req.Round].periods[cryptoRequestCtxKey{period: req.Period}] - require.True(t, hasPeriod) - - pending.clearStaleContexts(11, 20, false) - select { - case <-ctx.Done(): - t.Errorf("cancelled request") - default: - } - - pending.clearStaleContexts(12, 20, false) - select { - case <-ctx.Done(): - default: - t.Errorf("did not cancel request") - } - - _, hasRound = pending[req.Round] - require.False(t, hasRound) - - _, hasPeriod = pending[req.Round].periods[cryptoRequestCtxKey{period: req.Period}] - require.False(t, hasPeriod) + rnd := round(10) + per := period(10) + + forEachTagDo(func(tag protocol.Tag) { + var ctx context.Context + switch tag { + case protocol.AgreementVoteTag: + req := cryptoVoteRequest{Round: rnd, Period: per} + ctx = pending.addVote(req) + case protocol.ProposalPayloadTag: + req := cryptoProposalRequest{Round: rnd, Period: per} + ctx = pending.addProposal(req) + case protocol.VoteBundleTag: + req := cryptoBundleRequest{Round: rnd, Period: per} + ctx = pending.addBundle(req) + } + + _, hasRound := pending[rnd] + require.True(t, hasRound) + + _, hasPeriod := pending[rnd].periods[cryptoRequestCtxKey{period: per}] + require.True(t, hasPeriod) + + pending.clearStaleContexts(rnd+1, 20, false, false) + select { + case <-ctx.Done(): + t.Errorf("cancelled request") + default: + } + + pending.clearStaleContexts(rnd+2, 20, false, false) + select { + case <-ctx.Done(): + default: + t.Errorf("did not cancel request") + } + + _, hasRound = pending[rnd] + require.False(t, hasRound) + + _, hasPeriod = pending[rnd].periods[cryptoRequestCtxKey{period: per}] + require.False(t, hasPeriod) + }) } -func TestCryptoRequestContextCleanupByRoundPinned(t *testing.T) { +func TestCryptoRequestContextCleanupByRoundPinnedCertify(t *testing.T) { pending := makePendingRequestsContext() - req := cryptoRequest{Round: 10, Pinned: true} - ctx := pending.add(req) - - _, hasRound := pending[req.Round] - require.True(t, hasRound) - - _, hasPeriod := pending[req.Round].periods[cryptoRequestCtxKey{pinned: req.Pinned}] - require.True(t, hasPeriod) - - pending.clearStaleContexts(11, 20, false) - select { - case <-ctx.Done(): - t.Errorf("cancelled request") - default: - } - - pending.clearStaleContexts(12, 20, false) - select { - case <-ctx.Done(): - default: - t.Errorf("did not cancel request") - } - - _, hasRound = pending[req.Round] - require.False(t, hasRound) - - _, hasPeriod = pending[req.Round].periods[cryptoRequestCtxKey{pinned: req.Pinned}] - require.False(t, hasPeriod) + rnd := round(10) + + forEachTagDo(func(tag protocol.Tag) { + var ctx context.Context + var hasRound, hasPeriod bool + switch tag { + case protocol.AgreementVoteTag: + return + case protocol.ProposalPayloadTag: + req := cryptoProposalRequest{Round: rnd, Pinned: true} + ctx = pending.addProposal(req) + + _, hasRound = pending[rnd] + require.True(t, hasRound) + + _, hasPeriod = pending[rnd].periods[cryptoRequestCtxKey{pinned: true}] + require.True(t, hasPeriod) + + case protocol.VoteBundleTag: + req := cryptoBundleRequest{Round: rnd, Certify: true} + ctx = pending.addBundle(req) + + _, hasRound = pending[rnd] + require.True(t, hasRound) + + _, hasPeriod = pending[rnd].periods[cryptoRequestCtxKey{certify: true}] + require.True(t, hasPeriod) + } + + pending.clearStaleContexts(rnd+1, 20, false, false) + select { + case <-ctx.Done(): + t.Errorf("cancelled request") + default: + } + + pending.clearStaleContexts(rnd+2, 20, false, false) + select { + case <-ctx.Done(): + default: + t.Errorf("did not cancel request") + } + + _, hasRound = pending[rnd] + require.False(t, hasRound) + + switch tag { + case protocol.AgreementVoteTag: + return + case protocol.ProposalPayloadTag: + _, hasPeriod = pending[rnd].periods[cryptoRequestCtxKey{pinned: true}] + require.False(t, hasPeriod) + case protocol.VoteBundleTag: + _, hasPeriod = pending[rnd].periods[cryptoRequestCtxKey{certify: true}] + require.False(t, hasPeriod) + } + }) } func TestCryptoRequestContextCleanupByPeriod(t *testing.T) { pending := makePendingRequestsContext() - req := cryptoRequest{Round: 10, Period: 10} - ctx := pending.add(req) - - _, hasRound := pending[req.Round] - require.True(t, hasRound) - - _, hasPeriod := pending[req.Round].periods[cryptoRequestCtxKey{period: req.Period}] - require.True(t, hasPeriod) - - pending.clearStaleContexts(10, 12, false) - select { - case <-ctx.Done(): - t.Errorf("cancelled request") - default: - } - - pending.clearStaleContexts(10, 13, true) - select { - case <-ctx.Done(): - t.Errorf("cancelled request via pinned") - default: - } - - pending.clearStaleContexts(10, 13, false) - select { - case <-ctx.Done(): - default: - t.Errorf("did not cancel request") - } - - _, hasRound = pending[req.Round] - require.False(t, hasRound) - - _, hasPeriod = pending[req.Round].periods[cryptoRequestCtxKey{period: req.Period}] - require.False(t, hasPeriod) + rnd := round(10) + per := period(10) + + forEachTagDo(func(tag protocol.Tag) { + var ctx context.Context + switch tag { + case protocol.AgreementVoteTag: + req := cryptoVoteRequest{Round: rnd, Period: per} + ctx = pending.addVote(req) + case protocol.ProposalPayloadTag: + req := cryptoProposalRequest{Round: rnd, Period: per} + ctx = pending.addProposal(req) + case protocol.VoteBundleTag: + req := cryptoBundleRequest{Round: rnd, Period: per} + ctx = pending.addBundle(req) + } + + _, hasRound := pending[rnd] + require.True(t, hasRound) + + _, hasPeriod := pending[rnd].periods[cryptoRequestCtxKey{period: per}] + require.True(t, hasPeriod) + + pending.clearStaleContexts(rnd, per+2, false, false) + select { + case <-ctx.Done(): + t.Errorf("cancelled request") + default: + } + + pending.clearStaleContexts(rnd, per+3, true, false) + select { + case <-ctx.Done(): + t.Errorf("cancelled request via pinned") + default: + } + + pending.clearStaleContexts(rnd, per+3, false, true) + select { + case <-ctx.Done(): + t.Errorf("cancelled request via certify") + default: + } + + pending.clearStaleContexts(rnd, per+3, false, false) + select { + case <-ctx.Done(): + default: + t.Errorf("did not cancel request") + } + + _, hasRound = pending[rnd] + require.False(t, hasRound) + + _, hasPeriod = pending[rnd].periods[cryptoRequestCtxKey{period: per}] + require.False(t, hasPeriod) + }) } func TestCryptoRequestContextCleanupByPeriodPinned(t *testing.T) { pending := makePendingRequestsContext() - req := cryptoRequest{Round: 10, Pinned: true} - ctx := pending.add(req) - - _, hasRound := pending[req.Round] - require.True(t, hasRound) - - _, hasPeriod := pending[req.Round].periods[cryptoRequestCtxKey{pinned: req.Pinned}] - require.True(t, hasPeriod) - - pending.clearStaleContexts(10, 12, false) - select { - case <-ctx.Done(): - t.Errorf("cancelled request") - default: - } - - pending.clearStaleContexts(10, 13, false) - select { - case <-ctx.Done(): - t.Errorf("cancelled request but pinned") - default: - } + rnd := round(10) + + forEachTagDo(func(tag protocol.Tag) { + var ctx context.Context + switch tag { + case protocol.AgreementVoteTag: + return + case protocol.ProposalPayloadTag: + req := cryptoProposalRequest{Round: rnd, Pinned: true} + ctx = pending.addProposal(req) + + _, hasRound := pending[rnd] + require.True(t, hasRound) + + _, hasPeriod := pending[rnd].periods[cryptoRequestCtxKey{pinned: req.Pinned}] + require.True(t, hasPeriod) + + case protocol.VoteBundleTag: + req := cryptoBundleRequest{Round: rnd, Certify: true} + ctx = pending.addBundle(req) + + _, hasRound := pending[rnd] + require.True(t, hasRound) + + _, hasPeriod := pending[rnd].periods[cryptoRequestCtxKey{certify: req.Certify}] + require.True(t, hasPeriod) + } + + pending.clearStaleContexts(rnd, 12, false, false) + select { + case <-ctx.Done(): + t.Errorf("cancelled request") + default: + } + + pending.clearStaleContexts(rnd, 13, false, false) + select { + case <-ctx.Done(): + t.Errorf("cancelled request but pinned/certify set") + default: + } + }) } diff --git a/agreement/cryptoVerifier.go b/agreement/cryptoVerifier.go index 5a695a7cc7..5d69ac669a 100644 --- a/agreement/cryptoVerifier.go +++ b/agreement/cryptoVerifier.go @@ -41,19 +41,20 @@ type ( // If no goroutine is dequeuing cryptoResults from cryptoVerifier.Verified*, deadlock could occur. // To avoid this scenario, callers should call cryptoVerifier.ChannelFull to back off from submitting requests. cryptoVerifier interface { - // Verify enqueues the request to be verified. + // VerifyVote enqueues the request to be verified. // // The passed-in context ctx may be used to cancel the enqueuing request. - // - // The Verify function supports proposals and bundles. - Verify(ctx context.Context, request cryptoRequest) + VerifyVote(ctx context.Context, request cryptoVoteRequest) - // VerifyVote enqueues the request to be verified. + // VerifyProposal enqueues the request to be verified. // // The passed-in context ctx may be used to cancel the enqueuing request. + VerifyProposal(ctx context.Context, request cryptoProposalRequest) + + // VerifyBundle enqueues the request to be verified. // - // The VerifyVote function supports votes only. - VerifyVote(ctx context.Context, request cryptoVoteRequest) + // The passed-in context ctx may be used to cancel the enqueuing request. + VerifyBundle(ctx context.Context, request cryptoBundleRequest) // Verified returns a channel which contains verification results. // @@ -82,11 +83,10 @@ type ( TaskIndex int // Caller specific number that would be passed back in the asyncVerifyVoteResponse.TaskIndex field Round round // The round that we're going to test against. Period period // The period associated with the message we're going to test. - Pinned bool // A flag that is set if this is a pinned value for the given round. ctx context.Context // A context for this request, if the context is cancelled then the request is stale. } - cryptoRequest struct { + cryptoProposalRequest struct { message // the message we would like to verify. TaskIndex int // Caller specific number that would be passed back in the cryptoResult.TaskIndex field Round round // The round that we're going to test against. @@ -95,6 +95,15 @@ type ( ctx context.Context // A context for this request, if the context is cancelled then the request is stale. } + cryptoBundleRequest struct { + message // the message we would like to verify. + TaskIndex int // Caller specific number that would be passed back in the asyncVerifyVoteResponse.TaskIndex field + Round round // The round that we're going to test against. + Period period // The period associated with the message we're going to test. + Certify bool // A flag that set if this is a cert bundle. + ctx context.Context // A context for this request, if the context is cancelled then the request is stale. + } + cryptoResult struct { message Err serializableError @@ -106,8 +115,8 @@ type ( poolCryptoVerifier struct { voteVerifier *AsyncVoteVerifier votes voteChanPair - bundles chanPair - proposals chanPair + proposals proposalChanPair + bundles bundleChanPair validator BlockValidator ledger LedgerReader @@ -118,16 +127,21 @@ type ( wg sync.WaitGroup } - chanPair struct { - in chan cryptoRequest - out chan cryptoResult - } - voteChanPair struct { in chan cryptoVoteRequest out chan asyncVerifyVoteResponse } + proposalChanPair struct { + in chan cryptoProposalRequest + out chan cryptoResult + } + + bundleChanPair struct { + in chan cryptoBundleRequest + out chan cryptoResult + } + bundleFuture struct { message index int @@ -147,8 +161,8 @@ func makeCryptoVerifier(l LedgerReader, v BlockValidator, voteVerifier *AsyncVot in: make(chan cryptoVoteRequest, voteVerifier.Parallelism()), out: make(chan asyncVerifyVoteResponse, 3*voteVerifier.Parallelism()), } - c.bundles = chanPair{ - in: make(chan cryptoRequest, 1), + c.bundles = bundleChanPair{ + in: make(chan cryptoBundleRequest, 1), out: make(chan cryptoResult, 3), } @@ -156,8 +170,8 @@ func makeCryptoVerifier(l LedgerReader, v BlockValidator, voteVerifier *AsyncVot // TODO We want proper backpressure from the proposalTable into the network. baseBuffer := 3 maxVotes := cap(c.votes.in) + cap(c.votes.out) + voteVerifier.Parallelism() - c.proposals = chanPair{ - in: make(chan cryptoRequest, 1), + c.proposals = proposalChanPair{ + in: make(chan cryptoProposalRequest, 1), out: make(chan cryptoResult, maxVotes+baseBuffer), } @@ -247,15 +261,24 @@ func (c *poolCryptoVerifier) bundleWaitWorker(fromVoteFill <-chan bundleFuture) } } -func (c *poolCryptoVerifier) Verify(ctx context.Context, request cryptoRequest) { - c.proposalContexts.clearStaleContexts(request.Round, request.Period, request.Pinned) - request.ctx = c.proposalContexts.add(request) +func (c *poolCryptoVerifier) VerifyVote(ctx context.Context, request cryptoVoteRequest) { + c.proposalContexts.clearStaleContexts(request.Round, request.Period, false, false) + request.ctx = c.proposalContexts.addVote(request) switch request.Tag { - case protocol.VoteBundleTag: + case protocol.AgreementVoteTag: select { - case c.bundles.in <- request: + case c.votes.in <- request: case <-ctx.Done(): } + default: + logging.Base().Panicf("Verify action called on bad type: request is %v", request) + } +} + +func (c *poolCryptoVerifier) VerifyProposal(ctx context.Context, request cryptoProposalRequest) { + c.proposalContexts.clearStaleContexts(request.Round, request.Period, request.Pinned, false) + request.ctx = c.proposalContexts.addProposal(request) + switch request.Tag { case protocol.ProposalPayloadTag: select { case c.proposals.in <- request: @@ -266,13 +289,13 @@ func (c *poolCryptoVerifier) Verify(ctx context.Context, request cryptoRequest) } } -func (c *poolCryptoVerifier) VerifyVote(ctx context.Context, request cryptoVoteRequest) { - c.proposalContexts.clearStaleContexts(request.Round, request.Period, request.Pinned) - request.ctx = c.proposalContexts.addVote(request) +func (c *poolCryptoVerifier) VerifyBundle(ctx context.Context, request cryptoBundleRequest) { + c.proposalContexts.clearStaleContexts(request.Round, request.Period, false, request.Certify) + request.ctx = c.proposalContexts.addBundle(request) switch request.Tag { - case protocol.AgreementVoteTag: + case protocol.VoteBundleTag: select { - case c.votes.in <- request: + case c.bundles.in <- request: case <-ctx.Done(): } default: @@ -332,7 +355,7 @@ func (c *poolCryptoVerifier) proposalVerifyWorker() { } } -func (c *poolCryptoVerifier) verifyProposalPayload(request cryptoRequest) cryptoResult { +func (c *poolCryptoVerifier) verifyProposalPayload(request cryptoProposalRequest) cryptoResult { m := request.message up := request.UnauthenticatedProposal diff --git a/agreement/cryptoVerifier_test.go b/agreement/cryptoVerifier_test.go index b6b0f88a4d..b31d09169f 100644 --- a/agreement/cryptoVerifier_test.go +++ b/agreement/cryptoVerifier_test.go @@ -157,7 +157,14 @@ func TestCryptoVerifierBuffers(t *testing.T) { msgID := msgIDs[0] msgIDs = msgIDs[1:] usedMsgIDs[msgID] = struct{}{} - verifier.Verify(ctx, cryptoRequest{message: makeMessage(msgID, msgType, addresses[senderIdx], ledger, selections[senderIdx], votings[senderIdx], 300, 0, 0), Round: ledger.NextRound()}) + switch msgType { + case protocol.AgreementVoteTag: + verifier.VerifyVote(ctx, cryptoVoteRequest{message: makeMessage(msgID, msgType, addresses[senderIdx], ledger, selections[senderIdx], votings[senderIdx], 300, 0, 0), Round: ledger.NextRound()}) + case protocol.ProposalPayloadTag: + verifier.VerifyProposal(ctx, cryptoProposalRequest{message: makeMessage(msgID, msgType, addresses[senderIdx], ledger, selections[senderIdx], votings[senderIdx], 300, 0, 0), Round: ledger.NextRound()}) + case protocol.VoteBundleTag: + verifier.VerifyBundle(ctx, cryptoBundleRequest{message: makeMessage(msgID, msgType, addresses[senderIdx], ledger, selections[senderIdx], votings[senderIdx], 300, 0, 0), Round: ledger.NextRound()}) + } } // test to see that queues are full assert.Equal(t, len(verifier.Verified(msgType)), getSelectorCapacity(msgType)*2) @@ -195,7 +202,15 @@ func TestCryptoVerifierBuffers(t *testing.T) { msgIDs = msgIDs[1:] usedMsgIDs[msgID] = struct{}{} msgIDMutex.Unlock() - verifier.Verify(ctx, cryptoRequest{message: makeMessage(msgID, tag, addresses[senderIdx], ledger, selections[senderIdx], votings[senderIdx], 300, 0, 0), Round: ledger.NextRound()}) + + switch tag { + case protocol.AgreementVoteTag: + verifier.VerifyVote(ctx, cryptoVoteRequest{message: makeMessage(msgID, tag, addresses[senderIdx], ledger, selections[senderIdx], votings[senderIdx], 300, 0, 0), Round: ledger.NextRound()}) + case protocol.ProposalPayloadTag: + verifier.VerifyProposal(ctx, cryptoProposalRequest{message: makeMessage(msgID, tag, addresses[senderIdx], ledger, selections[senderIdx], votings[senderIdx], 300, 0, 0), Round: ledger.NextRound()}) + case protocol.VoteBundleTag: + verifier.VerifyBundle(ctx, cryptoBundleRequest{message: makeMessage(msgID, tag, addresses[senderIdx], ledger, selections[senderIdx], votings[senderIdx], 300, 0, 0), Round: ledger.NextRound()}) + } } else { atomic.AddInt32(&writeTotals, -1) return @@ -268,11 +283,11 @@ func BenchmarkCryptoVerifierVoteVertification(b *testing.B) { c := verifier.Verified(protocol.AgreementVoteTag) senderIdx := findSender(ledger, basics.Round(300), 0, 0, addresses, selections) - request := cryptoRequest{message: makeMessage(0, protocol.AgreementVoteTag, addresses[senderIdx], ledger, selections[senderIdx], votings[senderIdx], 300, 0, 0), Round: ledger.NextRound()} + request := cryptoVoteRequest{message: makeMessage(0, protocol.AgreementVoteTag, addresses[senderIdx], ledger, selections[senderIdx], votings[senderIdx], 300, 0, 0), Round: ledger.NextRound()} b.ResetTimer() go func() { for n := 0; n < b.N; n++ { - verifier.Verify(ctx, request) + verifier.VerifyVote(ctx, request) } }() for n := 0; n < b.N; n++ { @@ -310,7 +325,7 @@ func BenchmarkCryptoVerifierProposalVertification(b *testing.B) { verifier := makeCryptoVerifier(ledger, testBlockValidator{}, MakeAsyncVoteVerifier(nil), logging.Base()) c := verifier.Verified(protocol.ProposalPayloadTag) - request := cryptoRequest{ + request := cryptoProposalRequest{ message: message{ MessageHandle: MessageHandle(0), Tag: protocol.ProposalPayloadTag, @@ -322,7 +337,7 @@ func BenchmarkCryptoVerifierProposalVertification(b *testing.B) { b.ResetTimer() go func() { for n := 0; n < b.N; n++ { - verifier.Verify(ctx, request) + verifier.VerifyProposal(ctx, request) } }() for n := 0; n < b.N; n++ { @@ -339,7 +354,7 @@ func BenchmarkCryptoVerifierBundleVertification(b *testing.B) { Step := step(5) senders := findSenders(ledger, ledger.NextRound(), 0, Step, addresses, selections) - request := cryptoRequest{message: makeMessage(0, protocol.VoteBundleTag, addresses[senders[0]], ledger, selections[senders[0]], votings[senders[0]], ledger.NextRound(), 0, Step), Round: ledger.NextRound()} + request := cryptoBundleRequest{message: makeMessage(0, protocol.VoteBundleTag, addresses[senders[0]], ledger, selections[senders[0]], votings[senders[0]], ledger.NextRound(), 0, Step), Round: ledger.NextRound()} for _, senderIdx := range senders { uv := makeUnauthenticatedVote(ledger, addresses[senderIdx], selections[senderIdx], votings[senderIdx], request.message.UnauthenticatedBundle.Round, request.message.UnauthenticatedBundle.Period, Step, request.message.UnauthenticatedBundle.Proposal) v, err := uv.verify(ledger) @@ -359,7 +374,7 @@ func BenchmarkCryptoVerifierBundleVertification(b *testing.B) { b.ResetTimer() go func() { for n := 0; n < b.N; n++ { - verifier.Verify(ctx, request) + verifier.VerifyBundle(ctx, request) } }() for n := 0; n < b.N; n++ { diff --git a/agreement/demux.go b/agreement/demux.go index 12877aa954..3917822e99 100644 --- a/agreement/demux.go +++ b/agreement/demux.go @@ -158,14 +158,14 @@ func (d *demux) verifyVote(ctx context.Context, m message, taskIndex int, r roun func (d *demux) verifyPayload(ctx context.Context, m message, r round, p period, pinned bool) { d.UpdateEventsQueue(eventQueueCryptoVerifierProposal, 1) d.monitor.inc(cryptoVerifierCoserviceType) - d.crypto.Verify(ctx, cryptoRequest{message: m, Round: r, Period: p, Pinned: pinned}) + d.crypto.VerifyProposal(ctx, cryptoProposalRequest{message: m, Round: r, Period: p, Pinned: pinned}) } // verifyBundle enqueues a bundle message to be verified. -func (d *demux) verifyBundle(ctx context.Context, m message, r round, p period) { +func (d *demux) verifyBundle(ctx context.Context, m message, r round, p period, s step) { d.UpdateEventsQueue(eventQueueCryptoVerifierBundle, 1) d.monitor.inc(cryptoVerifierCoserviceType) - d.crypto.Verify(ctx, cryptoRequest{message: m, Round: r, Period: p}) + d.crypto.VerifyBundle(ctx, cryptoBundleRequest{message: m, Round: r, Period: p, Certify: s == cert}) } // next blocks until it observes an external input event of interest for the state machine. @@ -232,7 +232,7 @@ func (d *demux) next(s *Service, deadline time.Duration, fastDeadline time.Durat fastDeadlineCh = s.Clock.TimeoutAt(fastDeadline) } if err != nil { - logging.Base().Errorf("could not get consensus parameters for round %v: %v", ParamsRound(currentRound), err) + logging.Base().Errorf("could not get consensus parameters for round %d: %v", ParamsRound(currentRound), err) } d.UpdateEventsQueue(eventQueueDemux, 0) @@ -271,7 +271,7 @@ func (d *demux) next(s *Service, deadline time.Duration, fastDeadline time.Durat Round: uint64(previousRound), } - s.log.with(logEvent).Infof("agreement: round %v ended early due to concurrent write; next round is %v", previousRound, nextRound) + s.log.with(logEvent).Infof("agreement: round %d ended early due to concurrent write; next round is %d", previousRound, nextRound) e = roundInterruptionEvent{Round: nextRound} d.UpdateEventsQueue(eventQueueDemux, 1) d.monitor.inc(demuxCoserviceType) diff --git a/agreement/demux_test.go b/agreement/demux_test.go index c585d2e048..c5fb6c1621 100644 --- a/agreement/demux_test.go +++ b/agreement/demux_test.go @@ -515,12 +515,17 @@ func (t *demuxTester) EnsureValidatedBlock(ValidatedBlock, Certificate) { } // implement Ledger -func (t *demuxTester) EnsureDigest(Certificate, chan struct{}, *AsyncVoteVerifier) { +func (t *demuxTester) EnsureDigest(Certificate, *AsyncVoteVerifier) { // we don't care about this function in this test. } // implement cryptoVerifier -func (t *demuxTester) Verify(ctx context.Context, request cryptoRequest) { +func (t *demuxTester) VerifyProposal(ctx context.Context, request cryptoProposalRequest) { + // we don't care about this function in this test. +} + +// implement cryptoVerifier +func (t *demuxTester) VerifyBundle(ctx context.Context, request cryptoBundleRequest) { // we don't care about this function in this test. } diff --git a/agreement/events.go b/agreement/events.go index c28397a915..1a4d448108 100644 --- a/agreement/events.go +++ b/agreement/events.go @@ -108,6 +108,8 @@ const ( // roundInterruption is emitted by the Ledger as input to the player // state machine when an external source observes that the player's // current round has completed concurrent with the player's operation. + // roundInterruption is also emitted (internally, by the player itself) after + // calling ensureBlock. roundInterruption // timeout is emitted by the Clock as input to the player state machine @@ -658,7 +660,7 @@ func (e thresholdEvent) ComparableStr() string { // // The ordering is given as follows: // -// - certThreshold events are fresher than all other events. +// - certThreshold events are fresher than all other non-certThreshold events. // - Events from a later period are fresher than events from an older period. // - nextThreshold events are fresher than softThreshold events from the same // period. diff --git a/agreement/fuzzer/ledger_test.go b/agreement/fuzzer/ledger_test.go index 20c0c564dd..dce87b17d9 100644 --- a/agreement/fuzzer/ledger_test.go +++ b/agreement/fuzzer/ledger_test.go @@ -206,7 +206,7 @@ func (l *testLedger) Seed(r basics.Round) (committee.Seed, error) { defer l.mu.Unlock() if r >= l.nextRound { - err := fmt.Errorf("Seed for round %v doesn't exists in ledger. Current ledger round is %v", r, l.nextRound-1) + err := fmt.Errorf("Seed for round %d doesn't exists in ledger. Current ledger round is %d", r, l.nextRound-1) return committee.Seed{}, err } @@ -219,7 +219,7 @@ func (l *testLedger) LookupDigest(r basics.Round) (crypto.Digest, error) { defer l.mu.Unlock() if r >= l.nextRound { - err := fmt.Errorf("LookupDigest called on future round: %v >= %v! (this is probably a bug)", r, l.nextRound) + err := fmt.Errorf("LookupDigest called on future round: %d >= %d! (this is probably a bug)", r, l.nextRound) panic(err) } @@ -231,7 +231,7 @@ func (l *testLedger) BalanceRecord(r basics.Round, a basics.Address) (basics.Bal defer l.mu.Unlock() if r >= l.nextRound { - err := fmt.Errorf("BalanceRecord called on future round: %v >= %v! (this is probably a bug)", r, l.nextRound) + err := fmt.Errorf("BalanceRecord called on future round: %d >= %d! (this is probably a bug)", r, l.nextRound) panic(err) } return l.state[a], nil @@ -242,7 +242,7 @@ func (l *testLedger) Circulation(r basics.Round) (basics.MicroAlgos, error) { defer l.mu.Unlock() if r >= l.nextRound { - err := fmt.Errorf("Circulation called on future round: %v >= %v! (this is probably a bug)", r, l.nextRound) + err := fmt.Errorf("Circulation called on future round: %d >= %d! (this is probably a bug)", r, l.nextRound) panic(err) } @@ -263,7 +263,7 @@ func (l *testLedger) EnsureBlock(e bookkeeping.Block, c agreement.Certificate) { if _, ok := l.entries[e.Round()]; ok { if l.entries[e.Round()].Digest() != e.Digest() { - err := fmt.Errorf("testLedger.EnsureBlock: called with conflicting entries in round %v", e.Round()) + err := fmt.Errorf("testLedger.EnsureBlock: called with conflicting entries in round %d", e.Round()) panic(err) } } @@ -274,7 +274,7 @@ func (l *testLedger) EnsureBlock(e bookkeeping.Block, c agreement.Certificate) { if l.nextRound == e.Round() { l.nextRound = e.Round() + 1 } else if l.nextRound < e.Round() { - err := fmt.Errorf("testLedger.EnsureBlock: attempted to write block in future round: %v < %v", l.nextRound, e.Round()) + err := fmt.Errorf("testLedger.EnsureBlock: attempted to write block in future round: %d < %d", l.nextRound, e.Round()) panic(err) } @@ -282,7 +282,7 @@ func (l *testLedger) EnsureBlock(e bookkeeping.Block, c agreement.Certificate) { l.catchingUp = false } -func (l *testLedger) EnsureDigest(c agreement.Certificate, quit chan struct{}, verifier *agreement.AsyncVoteVerifier) { +func (l *testLedger) EnsureDigest(c agreement.Certificate, verifier *agreement.AsyncVoteVerifier) { r := c.Round consistencyCheck := func() bool { l.mu.Lock() @@ -290,7 +290,7 @@ func (l *testLedger) EnsureDigest(c agreement.Certificate, quit chan struct{}, v if r < l.nextRound { if l.entries[r].Digest() != c.Proposal.BlockDigest { - err := fmt.Errorf("testLedger.EnsureDigest called with conflicting entries in round %v", r) + err := fmt.Errorf("testLedger.EnsureDigest called with conflicting entries in round %d", r) panic(err) } return true diff --git a/agreement/fuzzer/tests_test.go b/agreement/fuzzer/tests_test.go index a2599e03f5..89c1217236 100644 --- a/agreement/fuzzer/tests_test.go +++ b/agreement/fuzzer/tests_test.go @@ -66,7 +66,7 @@ func printResults(t *testing.T, r *RunResult) { return } require.Truef(t, (r.PostRecoveryHighRound-r.PostRecoveryLowRound <= 1), - "Initial Rounds %v-%v\nPre Recovery Rounds %v-%v\nPost Recovery Rounds %v-%v", + "Initial Rounds %d-%d\nPre Recovery Rounds %d-%d\nPost Recovery Rounds %d-%d", r.StartLowRound, r.StartHighRound, r.PreRecoveryLowRound, r.PreRecoveryHighRound, r.PostRecoveryLowRound, r.PostRecoveryHighRound, @@ -79,12 +79,12 @@ func printResults(t *testing.T, r *RunResult) { ) if r.PreRecoveryHighRound != r.PreRecoveryLowRound { // network got disupted by the filters. - fmt.Printf("%v partitioned the network ( %v - %v ), but recovered correctly reaching round %v\n", t.Name(), r.PreRecoveryLowRound, r.PreRecoveryHighRound, r.PostRecoveryHighRound) + fmt.Printf("%v partitioned the network ( %d - %d ), but recovered correctly reaching round %d\n", t.Name(), r.PreRecoveryLowRound, r.PreRecoveryHighRound, r.PostRecoveryHighRound) } else { if r.PreRecoveryHighRound == r.StartLowRound { - fmt.Printf("%v stalled the network, and the network reached round %v\n", t.Name(), r.PostRecoveryHighRound) + fmt.Printf("%v stalled the network, and the network reached round %d\n", t.Name(), r.PostRecoveryHighRound) } else { - fmt.Printf("%v did not partition the network, and the network reached round %v\n", t.Name(), r.PostRecoveryHighRound) + fmt.Printf("%v did not partition the network, and the network reached round %d\n", t.Name(), r.PostRecoveryHighRound) } } }*/ @@ -112,7 +112,7 @@ func TestCircularNetworkTopology(t *testing.T) { } for i := range nodeCounts { nodeCount := nodeCounts[i] - t.Run(fmt.Sprintf("TestCircularNetworkTopology-%v", nodeCount), + t.Run(fmt.Sprintf("TestCircularNetworkTopology-%d", nodeCount), func(t *testing.T) { nodes := nodeCount topologyConfig := TopologyFilterConfig{ @@ -122,7 +122,7 @@ func TestCircularNetworkTopology(t *testing.T) { topologyConfig.NodesConnection[i] = []int{(i + nodes - 1) % nodes, (i + 1) % nodes} } netConfig := &FuzzerConfig{ - FuzzerName: fmt.Sprintf("circularNetworkTopology-%v", nodes), + FuzzerName: fmt.Sprintf("circularNetworkTopology-%d", nodes), NodesCount: nodes, Filters: []NetworkFilterFactory{NetworkFilterFactory(MakeTopologyFilter(topologyConfig))}, LogLevel: logging.Info, @@ -491,7 +491,7 @@ func TestNetworkBandwidth(t *testing.T) { } for i := range nodeCounts { nodeCount := nodeCounts[i] - t.Run(fmt.Sprintf("TestNetworkBandwidth-%v", nodeCount), + t.Run(fmt.Sprintf("TestNetworkBandwidth-%d", nodeCount), func(t *testing.T) { nodes := nodeCount topologyConfig := TopologyFilterConfig{ @@ -518,7 +518,7 @@ func TestNetworkBandwidth(t *testing.T) { } netConfig := &FuzzerConfig{ - FuzzerName: fmt.Sprintf("networkBandwidth-%v", nodes), + FuzzerName: fmt.Sprintf("networkBandwidth-%d", nodes), NodesCount: nodes + relayCounts, OnlineNodes: onlineNodes, Filters: []NetworkFilterFactory{ @@ -593,7 +593,7 @@ func TestUnstakedNetworkLinearGrowth(t *testing.T) { statFilterFactory := MakeTrafficStatisticsFilterFactory(statConf) netConfig := &FuzzerConfig{ - FuzzerName: fmt.Sprintf("networkUnstakedLinearGrowth-%v", nodes), + FuzzerName: fmt.Sprintf("networkUnstakedLinearGrowth-%d", nodes), NodesCount: nodes + relayCount, OnlineNodes: onlineNodes, Filters: []NetworkFilterFactory{ @@ -704,7 +704,7 @@ func TestStakedNetworkQuadricGrowth(t *testing.T) { statFilterFactory := MakeTrafficStatisticsFilterFactory(statConf) netConfig := &FuzzerConfig{ - FuzzerName: fmt.Sprintf("stakedNetworkQuadricGrowth-%v", nodes), + FuzzerName: fmt.Sprintf("stakedNetworkQuadricGrowth-%d", nodes), NodesCount: nodes + relayCount, OnlineNodes: onlineNodes, Filters: []NetworkFilterFactory{ @@ -810,7 +810,7 @@ func TestRegossipinngElimination(t *testing.T) { } netConfig := &FuzzerConfig{ - FuzzerName: fmt.Sprintf("networkRegossiping-baseline-%v", nodes), + FuzzerName: fmt.Sprintf("networkRegossiping-baseline-%d", nodes), NodesCount: nodes + relayCounts, OnlineNodes: onlineNodes, Filters: []NetworkFilterFactory{ @@ -829,7 +829,7 @@ func TestRegossipinngElimination(t *testing.T) { validator.Go(netConfig) netConfig2 := &FuzzerConfig{ - FuzzerName: fmt.Sprintf("networkRegossiping-eliminated-regossip-%v", nodes), + FuzzerName: fmt.Sprintf("networkRegossiping-eliminated-regossip-%d", nodes), NodesCount: nodes + relayCounts, OnlineNodes: onlineNodes, Filters: []NetworkFilterFactory{ @@ -910,7 +910,7 @@ func BenchmarkNetworkPerformance(b *testing.B) { statFilterFactory := MakeTrafficStatisticsFilterFactory(statConf) netConfig := &FuzzerConfig{ - FuzzerName: fmt.Sprintf("networkUnstakedLinearGrowth-%v", nodes), + FuzzerName: fmt.Sprintf("networkUnstakedLinearGrowth-%d", nodes), NodesCount: nodes + relayCount, OnlineNodes: onlineNodes, Filters: []NetworkFilterFactory{ diff --git a/agreement/fuzzer/validator_test.go b/agreement/fuzzer/validator_test.go index 74d1acaeef..d78a72420d 100644 --- a/agreement/fuzzer/validator_test.go +++ b/agreement/fuzzer/validator_test.go @@ -70,7 +70,7 @@ func (v *Validator) CheckNetworkRecovery() { return } require.Truef(v.tb, (v.runResult.PostRecoveryHighRound-v.runResult.PostRecoveryLowRound <= 1), - "Initial Rounds %v-%v\nPre Recovery Rounds %v-%v\nPost Recovery Rounds %v-%v", + "Initial Rounds %d-%d\nPre Recovery Rounds %d-%d\nPost Recovery Rounds %d-%d", v.runResult.StartLowRound, v.runResult.StartHighRound, v.runResult.PreRecoveryLowRound, v.runResult.PreRecoveryHighRound, v.runResult.PostRecoveryLowRound, v.runResult.PostRecoveryHighRound, @@ -83,12 +83,12 @@ func (v *Validator) CheckNetworkRecovery() { ) if v.runResult.PreRecoveryHighRound != v.runResult.PreRecoveryLowRound { // network got disupted by the filters. - fmt.Printf("%v partitioned the network ( %v - %v ), but recovered correctly reaching round %v\n", v.tb.Name(), v.runResult.PreRecoveryLowRound, v.runResult.PreRecoveryHighRound, v.runResult.PostRecoveryHighRound) + fmt.Printf("%v partitioned the network ( %d - %d ), but recovered correctly reaching round %d\n", v.tb.Name(), v.runResult.PreRecoveryLowRound, v.runResult.PreRecoveryHighRound, v.runResult.PostRecoveryHighRound) } else { if v.runResult.PreRecoveryHighRound == v.runResult.StartLowRound { - fmt.Printf("%v stalled the network, and the network reached round %v\n", v.tb.Name(), v.runResult.PostRecoveryHighRound) + fmt.Printf("%v stalled the network, and the network reached round %d\n", v.tb.Name(), v.runResult.PostRecoveryHighRound) } else { - fmt.Printf("%v did not partition the network, and the network reached round %v\n", v.tb.Name(), v.runResult.PostRecoveryHighRound) + fmt.Printf("%v did not partition the network, and the network reached round %d\n", v.tb.Name(), v.runResult.PostRecoveryHighRound) } } } diff --git a/agreement/fuzzer/voteFilter_test.go b/agreement/fuzzer/voteFilter_test.go index 16188113ef..044e8e37b7 100644 --- a/agreement/fuzzer/voteFilter_test.go +++ b/agreement/fuzzer/voteFilter_test.go @@ -111,7 +111,7 @@ func (n *VoteFilter) Eval(tag protocol.Tag, data []byte, direction string) bool } if !included { if n.config.DebugMessages { - fmt.Printf("VoteFilter(%s) service-%v : (%v,%v,%v) skipped. Rules (%v-%v, %v-%v, %v-%v)\n", direction, n.nodeID, uv.R.Round, uv.R.Period, uv.R.Step, n.config.IncludeMasks[0].StartRound, n.config.IncludeMasks[0].EndRound, n.config.IncludeMasks[0].StartPeriod, n.config.IncludeMasks[0].EndPeriod, n.config.IncludeMasks[0].StartStep, n.config.IncludeMasks[0].EndStep) + fmt.Printf("VoteFilter(%s) service-%v : (%d,%d,%d) skipped. Rules (%d-%d, %d-%d, %d-%d)\n", direction, n.nodeID, uv.R.Round, uv.R.Period, uv.R.Step, n.config.IncludeMasks[0].StartRound, n.config.IncludeMasks[0].EndRound, n.config.IncludeMasks[0].StartPeriod, n.config.IncludeMasks[0].EndPeriod, n.config.IncludeMasks[0].StartStep, n.config.IncludeMasks[0].EndStep) } return false } @@ -128,13 +128,13 @@ func (n *VoteFilter) Eval(tag protocol.Tag, data []byte, direction string) bool if excluded { if n.config.DebugMessages { - fmt.Printf("VoteFilter(%s) service-%v : (%v,%v,%v) skipped\n", direction, n.nodeID, uv.R.Round, uv.R.Period, uv.R.Step) + fmt.Printf("VoteFilter(%s) service-%v : (%d,%d,%d) skipped\n", direction, n.nodeID, uv.R.Round, uv.R.Period, uv.R.Step) } return false } if n.config.DebugMessages { - fmt.Printf("VoteFilter(%s) service-%v : (%v,%v,%v) passed\n", direction, n.nodeID, uv.R.Round, uv.R.Period, uv.R.Step) + fmt.Printf("VoteFilter(%s) service-%v : (%d,%d,%d) passed\n", direction, n.nodeID, uv.R.Round, uv.R.Period, uv.R.Step) } return true } diff --git a/agreement/gossip/networkFull_test.go b/agreement/gossip/networkFull_test.go index b888ee1e50..dc68ab0731 100644 --- a/agreement/gossip/networkFull_test.go +++ b/agreement/gossip/networkFull_test.go @@ -54,15 +54,14 @@ func spinNetwork(t *testing.T, nodesCount int) ([]*networkImpl, []*messageCounte cfg.OutgoingMessageFilterBucketCount = 3 cfg.OutgoingMessageFilterBucketSize = 32 cfg.EnableOutgoingNetworkMessageFiltering = false + cfg.DNSBootstrapID = "" // prevent attempts of getting bootstrap SRV from DNS server(s) log := logging.TestingLog(t) start := time.Now() nodesAddresses := []string{} gossipNodes := []network.GossipNode{} - phonebooks := make([]*network.ThreadsafePhonebook, nodesCount) for nodeIdx := 0; nodeIdx < nodesCount; nodeIdx++ { - phonebooks[nodeIdx] = network.MakeThreadsafePhonebook() - gossipNode, err := network.NewWebsocketGossipNode(log.With("node", nodeIdx), cfg, phonebooks[nodeIdx], "go-test-agreement-network-genesis", config.Devtestnet) + gossipNode, err := network.NewWebsocketGossipNode(log.With("node", nodeIdx), cfg, nodesAddresses, "go-test-agreement-network-genesis", config.Devtestnet) if err != nil { t.Fatalf("fail making ws node: %v", err) } @@ -73,11 +72,7 @@ func spinNetwork(t *testing.T, nodesCount int) ([]*networkImpl, []*messageCounte gossipNodes = append(gossipNodes, gossipNode) } - for nodeIdx, gossipNode := range gossipNodes { - others := []string{} - others = append(others, nodesAddresses[nodeIdx+1:]...) - phonebooks[nodeIdx].ReplacePeerList(others) - log.Debugf("phonebook[%d] %#v", nodeIdx, others) + for _, gossipNode := range gossipNodes { gossipNode.RequestConnectOutgoing(false, nil) // no disconnect. } diff --git a/agreement/msgp_gen.go b/agreement/msgp_gen.go index 100fefd7a3..cb534f001a 100644 --- a/agreement/msgp_gen.go +++ b/agreement/msgp_gen.go @@ -1211,6 +1211,9 @@ func (z period) MarshalMsg(b []byte) (o []byte, err error) { func (_ period) CanMarshalMsg(z interface{}) bool { _, ok := (z).(period) + if !ok { + _, ok = (z).(*period) + } return ok } @@ -2839,6 +2842,9 @@ func (z serializableErrorUnderlying) MarshalMsg(b []byte) (o []byte, err error) func (_ serializableErrorUnderlying) CanMarshalMsg(z interface{}) bool { _, ok := (z).(serializableErrorUnderlying) + if !ok { + _, ok = (z).(*serializableErrorUnderlying) + } return ok } @@ -2882,6 +2888,9 @@ func (z step) MarshalMsg(b []byte) (o []byte, err error) { func (_ step) CanMarshalMsg(z interface{}) bool { _, ok := (z).(step) + if !ok { + _, ok = (z).(*step) + } return ok } diff --git a/agreement/persistence.go b/agreement/persistence.go index ce0ee23b0c..ff20602a1a 100644 --- a/agreement/persistence.go +++ b/agreement/persistence.go @@ -51,14 +51,14 @@ func persistent(as []action) bool { // encode serializes the current state into a byte array. func encode(t timers.Clock, rr rootRouter, p player, a []action) []byte { var s diskState - s.Router = protocol.Encode(rr) - s.Player = protocol.Encode(p) + s.Router = protocol.EncodeReflect(rr) + s.Player = protocol.EncodeReflect(p) s.Clock = t.Encode() for _, act := range a { s.ActionTypes = append(s.ActionTypes, act.t()) - s.Actions = append(s.Actions, protocol.Encode(act)) + s.Actions = append(s.Actions, protocol.EncodeReflect(act)) } - raw := protocol.Encode(s) + raw := protocol.EncodeReflect(s) return raw } @@ -173,7 +173,7 @@ func decode(raw []byte, t0 timers.Clock) (t timers.Clock, rr rootRouter, p playe a2 := []action{} var s diskState - err = protocol.Decode(raw, &s) + err = protocol.DecodeReflect(raw, &s) if err != nil { logging.Base().Errorf("decode (agreement): error decoding retrieved state (len = %v): %v", len(raw), err) return @@ -184,20 +184,20 @@ func decode(raw []byte, t0 timers.Clock) (t timers.Clock, rr rootRouter, p playe return } - err = protocol.Decode(s.Player, &p2) + err = protocol.DecodeReflect(s.Player, &p2) if err != nil { return } rr2 = makeRootRouter(p2) - err = protocol.Decode(s.Router, &rr2) + err = protocol.DecodeReflect(s.Router, &rr2) if err != nil { return } for i := range s.Actions { act := zeroAction(s.ActionTypes[i]) - err = protocol.Decode(s.Actions[i], &act) + err = protocol.DecodeReflect(s.Actions[i], &act) if err != nil { return } @@ -282,12 +282,6 @@ func (p *asyncPersistenceLoop) loop(ctx context.Context) { case <-p.ledger.Wait(s.round.SubSaturate(1)): } - // sanity check - _, _, _, _, derr := decode(s.raw, s.clock) - if derr != nil { - logging.Base().Errorf("could not decode own encoded disk state: %v", derr) - } - // store the state. err := persist(p.log, p.crashDb, s.round, s.period, s.step, s.raw) @@ -299,5 +293,13 @@ func (p *asyncPersistenceLoop) loop(ctx context.Context) { done: s.done, } close(s.events) + + // sanity check; we check it after the fact, since it's not expected to ever happen. + // performance-wise, it takes approximitly 300000ns to execute, and we don't want it to + // block the persist operation. + _, _, _, _, derr := decode(s.raw, s.clock) + if derr != nil { + logging.Base().Errorf("could not decode own encoded disk state: %v", derr) + } } } diff --git a/agreement/player.go b/agreement/player.go index 61c1639621..c2b731bb8e 100644 --- a/agreement/player.go +++ b/agreement/player.go @@ -198,7 +198,11 @@ func (p *player) issueNextVote(r routerHandle) []action { res := r.dispatch(*p, nextThresholdStatusRequestEvent{}, voteMachinePeriod, p.Round, p.Period-1, 0) nextStatus := res.(nextThresholdStatusEvent) // panic if violate postcondition if !nextStatus.Bottom { - // note that this is bottom if we fast-forwarded to this period or entered via a soft threshold. + // if we fast-forwarded to this period or entered via a soft/cert threshold, + // nextStatus.Bottom will be false and we will next vote bottom. + // As long as a majority of honest users (in the cert threshold case) do not vote bottom (as assumed), we are safe. + // Note that cert threshold fast-forwarding will never change a next value vote to a next bottom vote - + // if a player has voted for a value, they have the block, and should have ended the round. a.Proposal = nextStatus.Proposal } } @@ -231,8 +235,8 @@ func (p *player) issueFastVote(r routerHandle) (actions []action) { res := r.dispatch(*p, nextThresholdStatusRequestEvent{}, voteMachinePeriod, p.Round, p.Period-1, 0) nextStatus := res.(nextThresholdStatusEvent) // panic if violate postcondition if !nextStatus.Bottom { - // note that this is bottom if we fast-forwarded to this period or entered via a soft threshold. a.Step = redo + // note that this is bottom if we fast-forwarded to this period or entered via a soft/cert threshold. a.Proposal = nextStatus.Proposal } } @@ -258,39 +262,53 @@ func (p *player) handleCheckpointEvent(r routerHandle, e checkpointEvent) []acti func (p *player) handleThresholdEvent(r routerHandle, e thresholdEvent) []action { r.t.timeR().RecThreshold(e) - // Special case all cert thresholds: we must not ignore them, because they are the freshest bundle var actions []action - if e.t() == certThreshold { - // this threshold must be for p.Round, and originates from the vote SM tree - cert := Certificate(e.Bundle) + switch e.t() { + case certThreshold: + // for future periods, fast-forwarding below will ensure correct staging + // for past periods, having a freshest certThreshold will prevent losing the block + r.dispatch(*p, e, proposalMachine, 0, 0, 0) + // Now, also check if we have the block. res := stagedValue(*p, r, e.Round, e.Period) - a0 := ensureAction{Payload: res.Payload, PayloadOk: res.Committable, Certificate: cert} - actions = append(actions, a0) - as := p.enterRound(r, e, p.Round+1) - return append(actions, as...) - } - - // We might receive a next threshold event for the previous period due to fast-forwarding or a soft threshold. - // If we do, this is okay, but the proposalMachine contract-checker will complain. - // TODO test this case and update the contract-checker so it does not complain when this is benign - if p.Period >= e.Period+1 { - return nil - } + if res.Committable { + cert := Certificate(e.Bundle) + a0 := ensureAction{Payload: res.Payload, Certificate: cert} + actions = append(actions, a0) + as := p.enterRound(r, e, p.Round+1) + return append(actions, as...) + } + // we don't have the block! We need to ensure we will be able to receive the block. + // In addition, hint to the ledger to fetch by digest. + actions = append(actions, stageDigestAction{Certificate: Certificate(e.Bundle)}) + if p.Period < e.Period { + actions = append(actions, p.enterPeriod(r, e, e.Period)...) + } + return actions - switch e.t() { case softThreshold: - if p.Period == e.Period { - ec := r.dispatch(*p, e, proposalMachine, p.Round, p.Period, 0) - if ec.t() == proposalCommittable && p.Step <= cert { - actions = append(actions, p.issueCertVote(r, ec.(committableEvent))) - } - return actions + // note that it is ok not to stage softThresholds from previous periods; relaying the pinned block + // handles any edge case (w.r.t. resynchronization, at least) + if p.Period > e.Period { + return nil } - return p.enterPeriod(r, e, e.Period) + if p.Period < e.Period { + return p.enterPeriod(r, e, e.Period) + } + ec := r.dispatch(*p, e, proposalMachine, p.Round, p.Period, 0) + if ec.t() == proposalCommittable && p.Step <= cert { + actions = append(actions, p.issueCertVote(r, ec.(committableEvent))) + } + return actions + case nextThreshold: + // We might receive a next threshold event for the previous period due to fast-forwarding or a soft threshold. + // If we do, this is okay, but the proposalMachine contract-checker will complain. + // TODO test this case and update the contract-checker so it does not complain when this is benign + if p.Period > e.Period { + return nil + } return p.enterPeriod(r, e, e.Period+1) default: - // certThreshold was handled previously panic("bad event") } } @@ -335,11 +353,17 @@ func (p *player) enterPeriod(r routerHandle, source thresholdEvent, target perio func (p *player) enterRound(r routerHandle, source event, target round) []action { var actions []action - // this happens here so that the proposalMachine contract does not complain - e := r.dispatch(*p, source, proposalMachine, target, 0, 0) - if source.t() != roundInterruption { + newRoundEvent := source + // passing in a cert threshold to the proposalMachine is now ambiguous, + // so replace with an explicit new round event. + // In addition, handle a new source: payloadVerified (which can trigger new round if + // received after cert threshold) + if source.t() == certThreshold || source.t() == payloadVerified { // i.e., source.t() != roundInterruption r.t.logRoundStart(*p, target) + newRoundEvent = roundInterruptionEvent{Round: target} } + // this happens here so that the proposalMachine contract does not complain + e := r.dispatch(*p, newRoundEvent, proposalMachine, target, 0, 0) p.LastConcluding = p.Step p.Round = target @@ -365,7 +389,6 @@ func (p *player) enterRound(r routerHandle, source event, target round) []action } // we might need to handle a pipelined threshold event - res := r.dispatch(*p, freshestBundleRequestEvent{}, voteMachineRound, p.Round, 0, 0) freshestRes := res.(freshestBundleEvent) // panic if violate postcondition if freshestRes.Ok { @@ -540,6 +563,20 @@ func (p *player) handleMessageEvent(r routerHandle, e messageEvent) (actions []a a := relayAction(e, protocol.ProposalPayloadTag, compoundMessage{Proposal: up, Vote: uv}) actions = append(actions, a) + // If the payload is valid, check it against any received cert threshold. + // Of course, this should only trigger for payloadVerified case. + // This allows us to handle late payloads (relative to cert-bundles, i.e., certificates) without resorting to catchup. + if ef.t() == proposalCommittable || ef.t() == payloadAccepted { + freshestRes := r.dispatch(*p, freshestBundleRequestEvent{}, voteMachineRound, p.Round, 0, 0).(freshestBundleEvent) + if freshestRes.Ok && freshestRes.Event.t() == certThreshold && freshestRes.Event.Proposal == e.Input.Proposal.value() { + cert := Certificate(freshestRes.Event.Bundle) + a0 := ensureAction{Payload: e.Input.Proposal, Certificate: cert} + actions = append(actions, a0) + as := p.enterRound(r, delegatedE, cert.Round+1) + return append(actions, as...) + } + } + if ef.t() == proposalCommittable && p.Step <= cert { actions = append(actions, p.issueCertVote(r, ef.(committableEvent))) } @@ -578,7 +615,7 @@ func (p *player) handleMessageEvent(r routerHandle, e messageEvent) (actions []a } if e.t() == bundlePresent { ub := e.Input.UnauthenticatedBundle - return append(actions, verifyBundleAction(e, ub.Round, ub.Period)) + return append(actions, verifyBundleAction(e, ub.Round, ub.Period, ub.Step)) } a0 := relayAction(e, protocol.VoteBundleTag, ef.(thresholdEvent).Bundle) a1 := p.handle(r, ef) diff --git a/agreement/player_test.go b/agreement/player_test.go index f2f505406b..719d04ee81 100644 --- a/agreement/player_test.go +++ b/agreement/player_test.go @@ -24,10 +24,20 @@ import ( "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/data/committee" //TODO(upgrade) remove this line "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" ) +// TODO(upgrade) remove the entire lessMaybeBuggy function once the upgrade goes through +func lessMaybeBuggy(cred, other committee.Credential) bool { + // this function calls either Less or LessBuggy depending on ConsensusCurrentVersion, which is what the agreement tests use + if config.Consensus[protocol.ConsensusCurrentVersion].UseBuggyProposalLowestOutput { + return cred.LessBuggy(other) + } + return cred.Less(other) +} + var playerTracer tracer func init() { @@ -59,7 +69,8 @@ func generateProposalEvents(t *testing.T, player player, accs testAccountData, f lowestCredential := votes[0].Cred lowestProposal = votes[0].R.Proposal for _, vote := range votes { - if vote.Cred.Less(lowestCredential) { + // if vote.Cred.Less(lowestCredential) { //TODO(upgrade) uncomment this line + if lessMaybeBuggy(vote.Cred, lowestCredential) { // TODO(upgrade) remove this line lowestCredential = vote.Cred lowestProposal = vote.R.Proposal } @@ -1424,9 +1435,71 @@ func TestPlayerProposesNewRound(t *testing.T) { const r = round(209) const p = period(0) pWhite, pM, helper := setupP(t, r-1, p, soft) + pP, pV := helper.MakeRandomProposalPayload(t, r-1) + + // send a payload + // store an arbitrary proposal/payload + vVote := helper.MakeVerifiedVote(t, 0, r-1, p, propose, *pV) + inMsg := messageEvent{ + T: voteVerified, + Input: message{ + Vote: vVote, + UnauthenticatedVote: vVote.u(), + }, + } + err, panicErr := pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + inMsg = messageEvent{ + T: payloadVerified, + Input: message{ + Proposal: *pP, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) // gen cert to move into the next round - pV := helper.MakeRandomProposalValue() + votes := make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) + for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { + votes[i] = helper.MakeVerifiedVote(t, i, r-1, p, cert, *pV) + } + bun := unauthenticatedBundle{ + Round: r - 1, + Period: p, + Proposal: *pV, + } + inMsg = messageEvent{ + T: bundleVerified, + Input: message{ + Bundle: bundle{ + U: bun, + Votes: votes, + }, + UnauthenticatedBundle: bun, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + + require.Equalf(t, r, pWhite.Round, "player did not enter new round") + require.Equalf(t, period(0), pWhite.Period, "player did not enter period 0 in new round") + assembleEvent := ev(pseudonodeAction{T: assemble, Round: r, Period: 0}) + require.Truef(t, pM.getTrace().Contains(assembleEvent), "Player should try to assemble new proposal") +} + +func TestPlayerCertificateThenPayloadEntersNewRound(t *testing.T) { + // player should create a new proposal on new round + const r = round(209) + const p = period(0) + pWhite, pM, helper := setupP(t, r-1, p, soft) + pP, pV := helper.MakeRandomProposalPayload(t, r-1) + + // gen cert; this should not advance into next round votes := make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { votes[i] = helper.MakeVerifiedVote(t, i, r-1, p, cert, *pV) @@ -1451,9 +1524,24 @@ func TestPlayerProposesNewRound(t *testing.T) { require.NoError(t, err) require.NoError(t, panicErr) + require.Equalf(t, r-1, pWhite.Round, "player entered new round but shouldn't have without payload") + assembleEvent := ev(pseudonodeAction{T: assemble, Round: r, Period: 0}) + require.Falsef(t, pM.getTrace().Contains(assembleEvent), "Player should not try to assemble new proposal without new round") + + // send a payload corresponding with previous cert. now we should enter new round + inMsg = messageEvent{ + T: payloadVerified, + Input: message{ + Proposal: *pP, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + require.Equalf(t, r, pWhite.Round, "player did not enter new round") require.Equalf(t, period(0), pWhite.Period, "player did not enter period 0 in new round") - assembleEvent := ev(pseudonodeAction{T: assemble, Round: r, Period: 0}) require.Truef(t, pM.getTrace().Contains(assembleEvent), "Player should try to assemble new proposal") } @@ -1602,9 +1690,33 @@ func TestPlayerCommitsCertThreshold(t *testing.T) { const r = round(20239) const p = period(1001) pWhite, pM, helper := setupP(t, r-1, p, soft) + pP, pV := helper.MakeRandomProposalPayload(t, r-1) + + // send a payload + // store an arbitrary proposal/payload + vVote := helper.MakeVerifiedVote(t, 0, r-1, p, propose, *pV) + inMsg := messageEvent{ + T: voteVerified, + Input: message{ + Vote: vVote, + UnauthenticatedVote: vVote.u(), + }, + } + err, panicErr := pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + inMsg = messageEvent{ + T: payloadVerified, + Input: message{ + Proposal: *pP, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) // gen cert to move into the next round - pV := helper.MakeRandomProposalValue() votes := make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { votes[i] = helper.MakeVerifiedVote(t, i, r-1, p, cert, *pV) @@ -1614,7 +1726,7 @@ func TestPlayerCommitsCertThreshold(t *testing.T) { Period: p, Proposal: *pV, } - inMsg := messageEvent{ + inMsg = messageEvent{ T: bundleVerified, Input: message{ Bundle: bundle{ @@ -1625,13 +1737,13 @@ func TestPlayerCommitsCertThreshold(t *testing.T) { }, Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, } - err, panicErr := pM.transition(inMsg) + err, panicErr = pM.transition(inMsg) require.NoError(t, err) require.NoError(t, panicErr) require.Equalf(t, r, pWhite.Round, "player did not enter new round") require.Equalf(t, period(0), pWhite.Period, "player did not enter period 0 in new round") - commitEvent := ev(ensureAction{Certificate: Certificate(bun)}) + commitEvent := ev(ensureAction{Certificate: Certificate(bun), Payload: *pP}) require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should try to ensure block/digest on ledger") } @@ -2172,14 +2284,39 @@ func TestPlayerRequestsPipelinedPayloadVerification(t *testing.T) { require.Falsef(t, pM.getTrace().Contains(verifyEvent), "Player should not verify payload from r + 1") // now enter next round + pP, pV := helper.MakeRandomProposalPayload(t, r) + // send a payload + // store an arbitrary proposal/payload + vVote := helper.MakeVerifiedVote(t, 0, r, p, propose, *pV) + inMsg = messageEvent{ + T: voteVerified, + Input: message{ + Vote: vVote, + UnauthenticatedVote: vVote.u(), + }, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + inMsg = messageEvent{ + T: payloadVerified, + Input: message{ + Proposal: *pP, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + votes := make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { - votes[i] = helper.MakeVerifiedVote(t, i, r, p, cert, *pVTwo) + votes[i] = helper.MakeVerifiedVote(t, i, r, p, cert, *pV) } bun := unauthenticatedBundle{ Round: r, Period: p, - Proposal: *pVTwo, + Proposal: *pV, } inMsg = messageEvent{ T: bundleVerified, @@ -2198,7 +2335,7 @@ func TestPlayerRequestsPipelinedPayloadVerification(t *testing.T) { require.Equalf(t, r+1, pWhite.Round, "player did not enter new round") require.Equalf(t, period(0), pWhite.Period, "player did not enter period 0 in new round") - commitEvent := ev(ensureAction{Certificate: Certificate(bun)}) + commitEvent := ev(ensureAction{Certificate: Certificate(bun), Payload: *pP}) require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should try to ensure block/digest on ledger") // make sure we sent out pipelined payload verify requests @@ -2253,7 +2390,30 @@ func TestPlayerHandlesPipelinedThresholds(t *testing.T) { } // now, enter next round - _, pVTwo := helper.MakeRandomProposalPayload(t, r) + pPTwo, pVTwo := helper.MakeRandomProposalPayload(t, r) + // store pPTwo + vVote := helper.MakeVerifiedVote(t, 0, r, p, propose, *pVTwo) + inMsg := messageEvent{ + T: voteVerified, + Input: message{ + Vote: vVote, + UnauthenticatedVote: vVote.u(), + }, + } + err, panicErr := pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + inMsg = messageEvent{ + T: payloadVerified, + Input: message{ + Proposal: *pPTwo, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + votes = make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { votes[i] = helper.MakeVerifiedVote(t, i, r, p, cert, *pVTwo) @@ -2263,7 +2423,7 @@ func TestPlayerHandlesPipelinedThresholds(t *testing.T) { Period: p, Proposal: *pVTwo, } - inMsg := messageEvent{ + inMsg = messageEvent{ T: bundleVerified, Input: message{ Bundle: bundle{ @@ -2274,7 +2434,7 @@ func TestPlayerHandlesPipelinedThresholds(t *testing.T) { }, Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, } - err, panicErr := pM.transition(inMsg) + err, panicErr = pM.transition(inMsg) require.NoError(t, err) require.NoError(t, panicErr) require.Equalf(t, r+1, pWhite.Round, "player did not enter new round") @@ -2304,7 +2464,7 @@ func TestPlayerRegression_EnsuresCertThreshFromOldPeriod_8ba23942(t *testing.T) pWhite, pM, helper := setupP(t, r, p, cert) // send a next threshold to send player into period 1 - pV := helper.MakeRandomProposalValue() + pP, pV := helper.MakeRandomProposalPayload(t, r) votes := make([]vote, int(next.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) for i := 0; i < int(next.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { votes[i] = helper.MakeVerifiedVote(t, i, r, p, next, *pV) @@ -2332,6 +2492,17 @@ func TestPlayerRegression_EnsuresCertThreshFromOldPeriod_8ba23942(t *testing.T) require.Equalf(t, p+1, pWhite.Period, "player did not fast forward to new period") // gen cert threshold in period 0, should move into next round + // store an arbitrary payload. It should be accepted since the next quorum pinned pV. + inMsg = messageEvent{ + T: payloadVerified, + Input: message{ + Proposal: *pP, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) votes = make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { votes[i] = helper.MakeVerifiedVote(t, i, r, p, cert, *pV) // period 0 @@ -2355,8 +2526,340 @@ func TestPlayerRegression_EnsuresCertThreshFromOldPeriod_8ba23942(t *testing.T) } require.Equalf(t, r+1, pWhite.Round, "player did not enter new round") require.Equalf(t, period(0), pWhite.Period, "player did not enter period 0 in new round") - commitEvent := ev(ensureAction{Certificate: Certificate(bun)}) - require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should try to ensure block/digest on ledger") + commitEvent := ev(ensureAction{Certificate: Certificate(bun), Payload: *pP}) + require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should try to ensure block on ledger") +} + +func TestPlayer_RejectsCertThresholdFromPreviousRound(t *testing.T) { + const r = round(20) + const p = period(0) + pWhite, pM, helper := setupP(t, r, p, cert) + + _, pV := helper.MakeRandomProposalPayload(t, r) + votes := make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) + for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { + votes[i] = helper.MakeVerifiedVote(t, i, r-1, p+1, cert, *pV) + msg := messageEvent{ + T: voteVerified, + Input: message{ + Vote: votes[i], + UnauthenticatedVote: votes[i].u(), + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr := pM.transition(msg) + require.NoError(t, err) + require.NoError(t, panicErr) + } + bun := unauthenticatedBundle{ + Round: r - 1, + Period: p + 1, + Step: cert, + Proposal: *pV, + } + require.Equalf(t, r, pWhite.Round, "player entered new round... bad!") + require.Equalf(t, p, pWhite.Period, "player changed periods... bad!") + commitEvent := ev(stageDigestAction{Certificate: Certificate(bun)}) + require.Falsef(t, pM.getTrace().Contains(commitEvent), "Player should not try to stage anything") +} + +func TestPlayer_CommitsCertThresholdWithoutPreStaging(t *testing.T) { + // if player has pinned a block, then sees a cert threshold, it should commit + const r = round(20) + const p = period(0) + pWhite, pM, helper := setupP(t, r, p, cert) + + // send a next threshold to send player into period 1 + pP, pV := helper.MakeRandomProposalPayload(t, r) + votes := make([]vote, int(next.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) + for i := 0; i < int(next.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { + votes[i] = helper.MakeVerifiedVote(t, i, r, p, next, *pV) + } + bun := unauthenticatedBundle{ + Round: r, + Period: p, + Step: next, + Proposal: *pV, + } + inMsg := messageEvent{ + T: bundleVerified, + Input: message{ + Bundle: bundle{ + U: bun, + Votes: votes, + }, + UnauthenticatedBundle: bun, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr := pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + require.Equalf(t, p+1, pWhite.Period, "player did not fast forward to new period") + + // store an arbitrary payload. It should be accepted since the next quorum pinned pV. + inMsg = messageEvent{ + T: payloadVerified, + Input: message{ + Proposal: *pP, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + + // generate a cert threshold for period 1. This should ensureBlock since we have the payload. + votes = make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) + for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { + votes[i] = helper.MakeVerifiedVote(t, i, r, p+1, cert, *pV) // period 0 + msg := messageEvent{ + T: voteVerified, + Input: message{ + Vote: votes[i], + UnauthenticatedVote: votes[i].u(), + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(msg) + require.NoError(t, err) + require.NoError(t, panicErr) + } + bun = unauthenticatedBundle{ + Round: r, + Period: p + 1, + Step: cert, + Proposal: *pV, + } + require.Equalf(t, r+1, pWhite.Round, "player did not enter new round") + require.Equalf(t, period(0), pWhite.Period, "player did not enter period 0 in new round") + commitEvent := ev(ensureAction{Certificate: Certificate(bun), Payload: *pP}) + require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should try to ensure block on ledger") +} + +func TestPlayer_CertThresholdDoesNotBlock(t *testing.T) { + // check that ledger gets a hint to stage digest + const r = round(20) + const p = period(0) + pWhite, pM, helper := setupP(t, r, p, cert) + + _, pV := helper.MakeRandomProposalPayload(t, r) + votes := make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) + for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { + votes[i] = helper.MakeVerifiedVote(t, i, r, p, cert, *pV) + msg := messageEvent{ + T: voteVerified, + Input: message{ + Vote: votes[i], + UnauthenticatedVote: votes[i].u(), + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr := pM.transition(msg) + require.NoError(t, err) + require.NoError(t, panicErr) + } + bun := unauthenticatedBundle{ + Round: r, + Period: p, + Step: cert, + Proposal: *pV, + } + require.Equalf(t, r, pWhite.Round, "player entered new round... bad!") + require.Equalf(t, p, pWhite.Period, "player changed periods... bad!") + commitEvent := ev(stageDigestAction{Certificate: Certificate(bun)}) + require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should have staged something but didn't") +} + +func TestPlayer_CertThresholdDoesNotBlockFuturePeriod(t *testing.T) { + // check that ledger gets a hint to stage digest + const r = round(20) + const p = period(0) + pWhite, pM, helper := setupP(t, r, p, cert) + + _, pV := helper.MakeRandomProposalPayload(t, r) + votes := make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) + for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { + votes[i] = helper.MakeVerifiedVote(t, i, r, p+1, cert, *pV) + msg := messageEvent{ + T: voteVerified, + Input: message{ + Vote: votes[i], + UnauthenticatedVote: votes[i].u(), + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr := pM.transition(msg) + require.NoError(t, err) + require.NoError(t, panicErr) + } + bun := unauthenticatedBundle{ + Round: r, + Period: p + 1, + Step: cert, + Proposal: *pV, + } + require.Equalf(t, r, pWhite.Round, "player entered new round... bad!") + require.Equalf(t, p+1, pWhite.Period, "player should have changed periods but didn't") + commitEvent := ev(stageDigestAction{Certificate: Certificate(bun)}) + require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should have staged something but didn't") +} + +func TestPlayer_CertThresholdFastForwards(t *testing.T) { + const r = round(20) + const p = period(0) + pWhite, pM, helper := setupP(t, r, p, cert) + + _, pV := helper.MakeRandomProposalPayload(t, r) + // send a bundle - individual votes will get filtered. + votes := make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) + for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { + votes[i] = helper.MakeVerifiedVote(t, i, r, p+2, cert, *pV) + } + bun := unauthenticatedBundle{ + Round: r, + Period: p + 2, + Step: cert, + Proposal: *pV, + } + inMsg := messageEvent{ + T: bundleVerified, + Input: message{ + Bundle: bundle{ + U: bun, + Votes: votes, + }, + UnauthenticatedBundle: bun, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr := pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + + require.Equalf(t, r, pWhite.Round, "player entered new round... bad!") + require.Equalf(t, p+2, pWhite.Period, "player should have changed periods but didn't") + commitEvent := ev(stageDigestAction{Certificate: Certificate(bun)}) + require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should have staged something but didn't") +} + +func TestPlayer_CertThresholdCommitsFuturePeriodIfAlreadyHasBlock(t *testing.T) { + const r = round(20) + const p = period(0) + pWhite, pM, helper := setupP(t, r, p, cert) + + payload, pV := helper.MakeRandomProposalPayload(t, r) + // give player a proposal/payload. + proposalVote := helper.MakeVerifiedVote(t, 0, r, p, propose, *pV) + inMsg := messageEvent{ + T: voteVerified, + Input: message{ + Vote: proposalVote, + UnauthenticatedVote: proposalVote.u(), + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr := pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + inMsg = messageEvent{ + T: payloadVerified, + Input: message{ + Proposal: *payload, + UnauthenticatedProposal: payload.u(), + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + + // send a bundle - individual votes will get filtered. + votes := make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) + for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { + votes[i] = helper.MakeVerifiedVote(t, i, r, p+2, cert, *pV) + } + bun := unauthenticatedBundle{ + Round: r, + Period: p + 2, + Step: cert, + Proposal: *pV, + } + inMsg = messageEvent{ + T: bundleVerified, + Input: message{ + Bundle: bundle{ + U: bun, + Votes: votes, + }, + UnauthenticatedBundle: bun, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + + require.Equalf(t, r+1, pWhite.Round, "player did not enter new round... bad!") + require.Equalf(t, period(0), pWhite.Period, "player should have entered period 0 of new round but didn't") + commitEvent := ev(ensureAction{Certificate: Certificate(bun), Payload: *payload}) + require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should have commited a block but didn't") +} + +func TestPlayer_PayloadAfterCertThresholdCommits(t *testing.T) { + const r = round(20) + const p = period(0) + pWhite, pM, helper := setupP(t, r, p, cert) + + pP, pV := helper.MakeRandomProposalPayload(t, r) + // send a bundle - individual votes will get filtered. + votes := make([]vote, int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion]))) + for i := 0; i < int(cert.threshold(config.Consensus[protocol.ConsensusCurrentVersion])); i++ { + votes[i] = helper.MakeVerifiedVote(t, i, r, p+2, cert, *pV) + } + bun := unauthenticatedBundle{ + Round: r, + Period: p + 2, + Step: cert, + Proposal: *pV, + } + inMsg := messageEvent{ + T: bundleVerified, + Input: message{ + Bundle: bundle{ + U: bun, + Votes: votes, + }, + UnauthenticatedBundle: bun, + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr := pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + + require.Equalf(t, r, pWhite.Round, "player entered new round... bad!") + require.Equalf(t, p+2, pWhite.Period, "player should have changed periods but didn't") + commitEvent := ev(stageDigestAction{Certificate: Certificate(bun)}) + require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should have staged something but didn't") + pM.resetTrace() + + // now, deliver payload, commit. + inMsg = messageEvent{ + T: payloadVerified, + Input: message{ + Proposal: *pP, + UnauthenticatedProposal: pP.u(), + }, + Proto: ConsensusVersionView{Version: protocol.ConsensusCurrentVersion}, + } + err, panicErr = pM.transition(inMsg) + require.NoError(t, err) + require.NoError(t, panicErr) + require.Equalf(t, r+1, pWhite.Round, "player did not enter new round... bad!") + require.Equalf(t, period(0), pWhite.Period, "player should have entered period 0 but didn't") + commitEvent = ev(ensureAction{Certificate: Certificate(bun), Payload: *pP}) + require.Truef(t, pM.getTrace().Contains(commitEvent), "Player should have committed but didn't") } func TestPlayerAlwaysResynchsPinnedValue(t *testing.T) { diff --git a/agreement/proposal.go b/agreement/proposal.go index 84cbfe7fa8..1e305d0f23 100644 --- a/agreement/proposal.go +++ b/agreement/proposal.go @@ -62,7 +62,7 @@ type unauthenticatedProposal struct { // ToBeHashed implements the Hashable interface. func (p unauthenticatedProposal) ToBeHashed() (protocol.HashID, []byte) { - return protocol.Payload, protocol.Encode(p) + return protocol.Payload, protocol.Encode(&p) } // value returns the proposal-value associated with this proposal. @@ -111,7 +111,7 @@ type proposerSeed struct { // ToBeHashed implements the Hashable interface. func (s proposerSeed) ToBeHashed() (protocol.HashID, []byte) { - return protocol.ProposerSeed, protocol.Encode(s) + return protocol.ProposerSeed, protocol.Encode(&s) } // A seedInput is a Hashable input to seed rerandomization. @@ -124,7 +124,7 @@ type seedInput struct { // ToBeHashed implements the Hashable interface. func (i seedInput) ToBeHashed() (protocol.HashID, []byte) { - return protocol.ProposerSeed, protocol.Encode(i) + return protocol.ProposerSeed, protocol.Encode(&i) } func deriveNewSeed(address basics.Address, vrf *crypto.VRFSecrets, rnd round, period period, ledger LedgerReader) (newSeed committee.Seed, seedProof crypto.VRFProof, reterr error) { @@ -133,13 +133,13 @@ func deriveNewSeed(address basics.Address, vrf *crypto.VRFSecrets, rnd round, pe cparams, err := ledger.ConsensusParams(ParamsRound(rnd)) if err != nil { - err = fmt.Errorf("failed to obtain consensus parameters in round %v: %v", ParamsRound(rnd), err) + err = fmt.Errorf("failed to obtain consensus parameters in round %d: %v", ParamsRound(rnd), err) return } var alpha crypto.Digest prevSeed, err := ledger.Seed(seedRound(rnd, cparams)) if err != nil { - reterr = fmt.Errorf("failed read seed of round %v: %v", seedRound(rnd, cparams), err) + reterr = fmt.Errorf("failed read seed of round %d: %v", seedRound(rnd, cparams), err) return } @@ -166,7 +166,7 @@ func deriveNewSeed(address basics.Address, vrf *crypto.VRFSecrets, rnd round, pe digrnd := rnd.SubSaturate(basics.Round(cparams.SeedLookback * cparams.SeedRefreshInterval)) oldDigest, err := ledger.LookupDigest(digrnd) if err != nil { - reterr = fmt.Errorf("could not lookup old entry digest (for seed) from round %v: %v", digrnd, err) + reterr = fmt.Errorf("could not lookup old entry digest (for seed) from round %d: %v", digrnd, err) return } input.History = oldDigest @@ -180,19 +180,19 @@ func verifyNewSeed(p unauthenticatedProposal, ledger LedgerReader) error { rnd := p.Round() cparams, err := ledger.ConsensusParams(ParamsRound(rnd)) if err != nil { - return fmt.Errorf("failed to obtain consensus parameters in round %v: %v", ParamsRound(rnd), err) + return fmt.Errorf("failed to obtain consensus parameters in round %d: %v", ParamsRound(rnd), err) } balanceRound := balanceRound(rnd, cparams) proposerRecord, err := ledger.BalanceRecord(balanceRound, value.OriginalProposer) if err != nil { - return fmt.Errorf("failed to obtain balance record for address %v in round %v: %v", value.OriginalProposer, balanceRound, err) + return fmt.Errorf("failed to obtain balance record for address %v in round %d: %v", value.OriginalProposer, balanceRound, err) } var alpha crypto.Digest prevSeed, err := ledger.Seed(seedRound(rnd, cparams)) if err != nil { - return fmt.Errorf("failed read seed of round %v: %v", seedRound(rnd, cparams), err) + return fmt.Errorf("failed read seed of round %d: %v", seedRound(rnd, cparams), err) } if value.OriginalPeriod == 0 { @@ -218,7 +218,7 @@ func verifyNewSeed(p unauthenticatedProposal, ledger LedgerReader) error { digrnd := rnd.SubSaturate(basics.Round(cparams.SeedLookback * cparams.SeedRefreshInterval)) oldDigest, err := ledger.LookupDigest(digrnd) if err != nil { - return fmt.Errorf("could not lookup old entry digest (for seed) from round %v: %v", digrnd, err) + return fmt.Errorf("could not lookup old entry digest (for seed) from round %d: %v", digrnd, err) } input.History = oldDigest } diff --git a/agreement/proposalManager.go b/agreement/proposalManager.go index 21013c438f..eb2276d7c4 100644 --- a/agreement/proposalManager.go +++ b/agreement/proposalManager.go @@ -45,12 +45,12 @@ func (m *proposalManager) underlying() listener { // - It applies message relay rules to votePresent, voteVerified, // payloadPresent, and payloadVerified events. // -// - It enters a new round given a roundInterruption or a certThreshold event. +// - It enters a new round given a roundInterruption. // // - It enters a new period given a nextThreshold event. It also enters a new -// period given a softThreshold event, if necessary. -// - On entering a new period due to a softThreshold event, it dispatches -// this event to the proposalMachineRound. +// period given a softThreshold/certThreshold event, if necessary. +// - On entering a new period due to a softThreshold/certThreshold, it +// dispatches this event to the proposalMachineRound. // // For more details, see each method's respective documentation below. func (m *proposalManager) handle(r routerHandle, p player, e event) event { @@ -59,9 +59,7 @@ func (m *proposalManager) handle(r routerHandle, p player, e event) event { return m.handleMessageEvent(r, p, e.(filterableMessageEvent)) case roundInterruption: return m.handleNewRound(r, p, e.(roundInterruptionEvent).Round) - case certThreshold: - return m.handleNewRound(r, p, e.(thresholdEvent).Round+1) - case softThreshold: + case softThreshold, certThreshold: e := e.(thresholdEvent) if p.Period < e.Period { r = m.handleNewPeriod(r, p, e) @@ -85,9 +83,8 @@ func (m *proposalManager) handleNewRound(r routerHandle, p player, round round) return e } -// handleNewPeriod is called for nextThreshold events and softThreshold events -// (when the softThreshold event is for a new period). These events are -// dispatched to the proposalMachineRound, and an empty event is returned. +// handleNewPeriod is called for threshold events that move the state machine into a new period. +// These events are dispatched to the proposalMachineRound, and an empty event is returned. func (m *proposalManager) handleNewPeriod(r routerHandle, p player, e thresholdEvent) routerHandle { target := e.Period if e.t() == nextThreshold { @@ -227,7 +224,7 @@ func (m *proposalManager) filterProposalVote(p player, r routerHandle, uv unauth qe := voteFilterRequestEvent{RawVote: uv.R} sawVote := r.dispatch(p, qe, proposalMachinePeriod, uv.R.Round, uv.R.Period, 0) if sawVote.t() == voteFiltered { - return fmt.Errorf("proposalManager: filtered proposal-vote: sender %v had already sent a vote in round %v period %v", uv.R.Sender, uv.R.Round, uv.R.Period) + return fmt.Errorf("proposalManager: filtered proposal-vote: sender %v had already sent a vote in round %d period %d", uv.R.Sender, uv.R.Round, uv.R.Period) } return nil } @@ -237,17 +234,17 @@ func proposalFresh(freshData freshnessData, vote unauthenticatedVote) error { switch vote.R.Round { case freshData.PlayerRound: if freshData.PlayerPeriod != 0 && freshData.PlayerPeriod-1 > vote.R.Period { - return fmt.Errorf("filtered stale proposal: period %v - 1 > %v", freshData.PlayerPeriod, vote.R.Period) + return fmt.Errorf("filtered stale proposal: period %d - 1 > %d", freshData.PlayerPeriod, vote.R.Period) } if freshData.PlayerPeriod+1 < vote.R.Period { - return fmt.Errorf("filtered premature proposal: period %v + 1 < %v", freshData.PlayerPeriod, vote.R.Period) + return fmt.Errorf("filtered premature proposal: period %d + 1 < %d", freshData.PlayerPeriod, vote.R.Period) } case freshData.PlayerRound + 1: if vote.R.Period != 0 { - return fmt.Errorf("filtered premature proposal from next round: period %v > 0", vote.R.Period) + return fmt.Errorf("filtered premature proposal from next round: period %d > 0", vote.R.Period) } default: - return fmt.Errorf("filtered proposal from bad round: p.Round=%v, vote.Round=%v", freshData.PlayerRound, vote.R.Round) + return fmt.Errorf("filtered proposal from bad round: p.Round=%d, vote.Round=%d", freshData.PlayerRound, vote.R.Round) } return nil } diff --git a/agreement/proposalManager_test.go b/agreement/proposalManager_test.go index eb38161578..5cc80d1067 100644 --- a/agreement/proposalManager_test.go +++ b/agreement/proposalManager_test.go @@ -105,8 +105,6 @@ func TestProposalManagerThresholdSoftStage(t *testing.T) { } func TestProposalManagerThresholdCert(t *testing.T) { - // this event is only actually generated by adversaries. - // check that manager tells store to enter new round const p = 10 const r = 1 _, pM, helper := setupManager(t, r) @@ -126,10 +124,19 @@ func TestProposalManagerThresholdCert(t *testing.T) { require.NoError(t, err) require.NoError(t, panicErr) - // check that the inner trace contains a boost period message - nxtPeriodEvent := newRoundEvent{} - require.Truef(t, pM.getTraceVisible().Contains(nxtPeriodEvent), - "Proposal Manager must tell lower level to increment round") + // check that the inner trace contains a forwarded cert threshold + // (this is very much white box testing) + count := 0 + require.Truef(t, pM.getTraceVisible().ContainsFn(func(b event) bool { + if b.ComparableStr() == inMsg.ComparableStr() { + count++ + } + if count > 1 { + return true + } + return false + }), + "Proposal Manager must forward cert threshold to proposal round machine") } func TestProposalManagerThresholdNext(t *testing.T) { diff --git a/agreement/proposalStore.go b/agreement/proposalStore.go index dff13095be..4f2d1e6c49 100644 --- a/agreement/proposalStore.go +++ b/agreement/proposalStore.go @@ -170,8 +170,8 @@ func (store *proposalStore) underlying() listener { // credential it has seen and possibly a cached authenticator (if not, it // returns an empty event). // -// - A softThreshold event is delivered when the player state has observed a -// quorum of soft votes for the current round and period. The proposalStore +// - A soft/certThreshold event is delivered when the player state has observed a +// quorum of soft/cert votes for the current round and period. The proposalStore // dispatches this event to the proposalMachinePeriod. If the proposalStore // has the proposal payload corresponding to the proposal-value of the quorum, // it returns a proposalCommittable event; otherwise, it propagates the @@ -307,13 +307,13 @@ func (store *proposalStore) handle(r routerHandle, p player, e event) event { } return emptyEvent{} - case softThreshold: + case softThreshold, certThreshold: te := e.(thresholdEvent) - // in particular, this will set te.Period.Staging = val(softThreshold) - // as a consequence, only val(softThreshold) will generate proposalAccepted in the future - // therefore store.Relevant[te.Period] will not be reset + // in particular, this will set te.Period.Staging = val(softThreshold/certThreshold) + // as a consequence, only val(softThreshold/certThreshold) will generate proposalAccepted in the future + // for this period, therefore store.Relevant[te.Period] will not be reset e := r.dispatch(p, e, proposalMachinePeriod, te.Round, te.Period, 0).(proposalAcceptedEvent) - // return commitableEvent if ready; else, return proposalAcceptedEvent + // return committableEvent if ready; else, return proposalAcceptedEvent if store.Assemblers[e.Proposal].Assembled { authVote := store.Assemblers[e.Proposal].authenticator(p.Period) return committableEvent{ diff --git a/agreement/proposalStore_test.go b/agreement/proposalStore_test.go index cf1fabae4d..4bc0903e95 100644 --- a/agreement/proposalStore_test.go +++ b/agreement/proposalStore_test.go @@ -61,7 +61,7 @@ func TestBlockAssemblerPipeline(t *testing.T) { round := player.Round period := player.Period testBlockFactory, err := factory.AssembleBlock(player.Round, time.Now().Add(time.Minute)) - require.NoError(t, err, "Could not generate a proposal for round %v: %v", round, err) + require.NoError(t, err, "Could not generate a proposal for round %d: %v", round, err) accountIndex := 0 proposal, _, _ := proposalForBlock(accounts.addresses[accountIndex], accounts.vrfs[accountIndex], testBlockFactory, period, ledger) @@ -127,7 +127,7 @@ func TestBlockAssemblerBind(t *testing.T) { player, _, accounts, factory, ledger := testSetup(0) testBlockFactory, err := factory.AssembleBlock(player.Round, time.Now().Add(time.Minute)) - require.NoError(t, err, "Could not generate a proposal for round %v: %v", player.Round, err) + require.NoError(t, err, "Could not generate a proposal for round %d: %v", player.Round, err) accountIndex := 0 @@ -193,7 +193,7 @@ func TestBlockAssemblerAuthenticator(t *testing.T) { player, _, accounts, factory, ledger := testSetup(0) testBlockFactory, err := factory.AssembleBlock(player.Round, time.Now().Add(time.Minute)) - require.NoError(t, err, "Could not generate a proposal for round %v: %v", player.Round, err) + require.NoError(t, err, "Could not generate a proposal for round %d: %v", player.Round, err) accountIndex := 0 proposalPayload, _, _ := proposalForBlock(accounts.addresses[accountIndex], accounts.vrfs[accountIndex], testBlockFactory, player.Period, ledger) @@ -257,7 +257,7 @@ func TestBlockAssemblerTrim(t *testing.T) { player, _, accounts, factory, ledger := testSetup(0) testBlockFactory, err := factory.AssembleBlock(player.Round, time.Now().Add(time.Minute)) - require.NoError(t, err, "Could not generate a proposal for round %v: %v", player.Round, err) + require.NoError(t, err, "Could not generate a proposal for round %d: %v", player.Round, err) accountIndex := 0 proposalPayload, _, _ := proposalForBlock(accounts.addresses[accountIndex], accounts.vrfs[accountIndex], testBlockFactory, player.Period, ledger) @@ -329,7 +329,7 @@ func TestProposalStoreT(t *testing.T) { player, _, accounts, factory, ledger := testSetup(0) testBlockFactory, err := factory.AssembleBlock(player.Round, time.Now().Add(time.Minute)) - require.NoError(t, err, "Could not generate a proposal for round %v: %v", player.Round, err) + require.NoError(t, err, "Could not generate a proposal for round %d: %v", player.Round, err) accountIndex := 0 proposalPayload, proposalV, _ := proposalForBlock(accounts.addresses[accountIndex], accounts.vrfs[accountIndex], testBlockFactory, player.Period, ledger) @@ -401,7 +401,7 @@ func TestProposalStoreUnderlying(t *testing.T) { player, _, accounts, factory, ledger := testSetup(0) testBlockFactory, err := factory.AssembleBlock(player.Round, time.Now().Add(time.Minute)) - require.NoError(t, err, "Could not generate a proposal for round %v: %v", player.Round, err) + require.NoError(t, err, "Could not generate a proposal for round %d: %v", player.Round, err) accountIndex := 0 proposalPayload, proposalV, _ := proposalForBlock(accounts.addresses[accountIndex], accounts.vrfs[accountIndex], testBlockFactory, player.Period, ledger) @@ -463,7 +463,7 @@ func TestProposalStoreHandle(t *testing.T) { proposalVoteEventBatch, proposalPayloadEventBatch, _ := generateProposalEvents(t, player, accounts, factory, ledger) testBlockFactory, err := factory.AssembleBlock(player.Round, time.Now().Add(time.Minute)) - require.NoError(t, err, "Could not generate a proposal for round %v: %v", player.Round, err) + require.NoError(t, err, "Could not generate a proposal for round %d: %v", player.Round, err) accountIndex := 0 _, proposalV0, _ := proposalForBlock(accounts.addresses[accountIndex], accounts.vrfs[accountIndex], testBlockFactory, player.Period, ledger) accountIndex++ @@ -645,7 +645,7 @@ func TestProposalStoreGetPinnedValue(t *testing.T) { // create proposal Store player, router, accounts, factory, ledger := testPlayerSetup() testBlockFactory, err := factory.AssembleBlock(player.Round, time.Now().Add(time.Minute)) - require.NoError(t, err, "Could not generate a proposal for round %v: %v", player.Round, err) + require.NoError(t, err, "Could not generate a proposal for round %d: %v", player.Round, err) accountIndex := 0 // create a route handler for the proposal store rHandle := routerHandle{ diff --git a/agreement/proposalTracker.go b/agreement/proposalTracker.go index 1df9d106d3..add3c94480 100644 --- a/agreement/proposalTracker.go +++ b/agreement/proposalTracker.go @@ -19,6 +19,7 @@ package agreement import ( "fmt" + "github.com/algorand/go-algorand/config" // TODO(upgrade): Please remove this line after the upgrade goes through "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/logging" ) @@ -37,14 +38,23 @@ type proposalSeeker struct { // accept compares a given vote with the current lowest-credentialled vote and // sets it if freeze has not been called. -func (s proposalSeeker) accept(v vote) (proposalSeeker, error) { +// TODO(upgrade): Please remove the "useBuggyLowestOutput" argument as soon as the protocol upgrade goes through +func (s proposalSeeker) accept(v vote, useBuggyLowestOutput bool) (proposalSeeker, error) { if s.Frozen { return s, errProposalSeekerFrozen{} } - if s.Filled && !v.Cred.Less(s.Lowest.Cred) { - return s, errProposalSeekerNotLess{NewSender: v.R.Sender, LowestSender: s.Lowest.R.Sender} - } + // TODO(upgrade): Please remove the lines below as soon as the upgrade goes through + if useBuggyLowestOutput { + if s.Filled && !v.Cred.LessBuggy(s.Lowest.Cred) { + return s, errProposalSeekerNotLess{NewSender: v.R.Sender, LowestSender: s.Lowest.R.Sender} + } + } else { + // TODO(upgrade): Please remove the lines above as soon as the upgrade goes through + if s.Filled && !v.Cred.Less(s.Lowest.Cred) { + return s, errProposalSeekerNotLess{NewSender: v.R.Sender, LowestSender: s.Lowest.R.Sender} + } + } // TODO(upgrade): Please remove this line when the upgrade goes through s.Lowest = v s.Filled = true @@ -146,7 +156,7 @@ func (t *proposalTracker) handle(r routerHandle, p player, e event) event { } var err error - t.Freezer, err = t.Freezer.accept(v) + t.Freezer, err = t.Freezer.accept(v, config.Consensus[e.Proto.Version].UseBuggyProposalLowestOutput) // TODO(upgrade): Please remove the second argument as soon as the upgrade goes through if err != nil { err := errProposalTrackerPS{Sub: err} return filteredEvent{T: voteFiltered, Err: makeSerErr(err)} @@ -164,7 +174,7 @@ func (t *proposalTracker) handle(r routerHandle, p player, e event) event { t.Freezer = t.Freezer.freeze() return e - case softThreshold: + case softThreshold, certThreshold: e := e.(thresholdEvent) t.Staging = e.Proposal @@ -208,7 +218,7 @@ type errProposalTrackerSenderDup struct { } func (err errProposalTrackerSenderDup) Error() string { - return fmt.Sprintf("proposalTracker: filtered vote: sender %v had already sent a vote in round %v period %v", err.Sender, err.Round, err.Period) + return fmt.Sprintf("proposalTracker: filtered vote: sender %v had already sent a vote in round %d period %d", err.Sender, err.Round, err.Period) } diff --git a/agreement/proposalTrackerContract.go b/agreement/proposalTrackerContract.go index cff7ed03e9..f61876b348 100644 --- a/agreement/proposalTrackerContract.go +++ b/agreement/proposalTrackerContract.go @@ -24,13 +24,13 @@ type proposalTrackerContract struct { SawOneVote bool Froze bool SawSoftThreshold bool - Expected proposalValue + SawCertThreshold bool } // TODO check concrete types of events func (c *proposalTrackerContract) pre(p player, in event) (pre []error) { switch in.t() { - case voteVerified, proposalFrozen, softThreshold, voteFilterRequest, readStaging: + case voteVerified, proposalFrozen, softThreshold, certThreshold, voteFilterRequest, readStaging: default: pre = append(pre, fmt.Errorf("incoming event has invalid type: %v", in.t())) } @@ -72,7 +72,7 @@ func (c *proposalTrackerContract) post(p player, in, out event) (post []error) { return } - if !c.SawOneVote && !c.Froze && !c.SawSoftThreshold { + if !c.SawOneVote && !c.Froze && !c.SawSoftThreshold && !c.SawCertThreshold { if out.t() != proposalAccepted { post = append(post, fmt.Errorf("expected first vote to have event type %v; had %v", proposalAccepted, out.t())) } else if out.(proposalAcceptedEvent).Proposal != in.(messageEvent).Input.Vote.R.Proposal { @@ -80,8 +80,8 @@ func (c *proposalTrackerContract) post(p player, in, out event) (post []error) { } } - if (c.Froze || c.SawSoftThreshold) && out.t() != voteFiltered { - post = append(post, fmt.Errorf("Frozen state = %v and soft threshold state = %v but got event type %v != voteFiltered", c.Froze, c.SawSoftThreshold, out.t())) + if (c.Froze || c.SawSoftThreshold || c.SawCertThreshold) && out.t() != voteFiltered { + post = append(post, fmt.Errorf("Frozen state = %v and soft threshold state = %v and cert threshold state = %v but got event type %v != voteFiltered", c.Froze, c.SawSoftThreshold, c.SawCertThreshold, out.t())) } if !c.SawOneVote { @@ -103,7 +103,6 @@ func (c *proposalTrackerContract) post(p player, in, out event) (post []error) { } c.Froze = true - c.Expected = out.(proposalFrozenEvent).Proposal case softThreshold: if out.t() != proposalAccepted { post = append(post, fmt.Errorf("output event from proposalFrozen has bad type: %v", out.t())) @@ -121,7 +120,19 @@ func (c *proposalTrackerContract) post(p player, in, out event) (post []error) { } c.SawSoftThreshold = true - c.Expected = out.(proposalAcceptedEvent).Proposal + case certThreshold: + if out.t() != proposalAccepted { + post = append(post, fmt.Errorf("output event from certThreshold has bad type: %v", out.t())) + } + _, ok := out.(proposalAcceptedEvent) + if !ok { + post = append(post, fmt.Errorf("output event does not cast to proposalAcceptedEvent: output is %#v", out)) + } + outProp := out.(proposalAcceptedEvent).Proposal + if outProp != in.(thresholdEvent).Proposal { + post = append(post, fmt.Errorf("expected proposal-value %v; instead got %v", outProp, in.(thresholdEvent).Proposal)) + } + c.SawCertThreshold = true } return } diff --git a/agreement/proposalTracker_test.go b/agreement/proposalTracker_test.go index b0f8348644..84b23fb237 100644 --- a/agreement/proposalTracker_test.go +++ b/agreement/proposalTracker_test.go @@ -62,19 +62,19 @@ func TestProposalTrackerProposalSeeker(t *testing.T) { assert.False(t, s.Filled) // issue events in the following order: 2, 3, 1, (freeze), 0 - s, err = s.accept(votes[2]) + s, err = s.accept(votes[2], false) //TODO(upgrade) delete the ", false" assert.NoError(t, err) assert.False(t, s.Frozen) assert.True(t, s.Filled) assert.True(t, s.Lowest.equals(votes[2])) - s, err = s.accept(votes[3]) + s, err = s.accept(votes[3], false) //TODO(upgrade) delete the ", false" assert.Error(t, err) assert.False(t, s.Frozen) assert.True(t, s.Filled) assert.True(t, s.Lowest.equals(votes[2])) - s, err = s.accept(votes[1]) + s, err = s.accept(votes[1], false) //TODO(upgrade) delete the ", false" assert.NoError(t, err) assert.False(t, s.Frozen) assert.True(t, s.Filled) @@ -85,7 +85,7 @@ func TestProposalTrackerProposalSeeker(t *testing.T) { assert.True(t, s.Filled) assert.True(t, s.Lowest.equals(votes[1])) - s, err = s.accept(votes[0]) + s, err = s.accept(votes[0], false) //TODO(upgrade) delete the ", false" assert.Error(t, err) assert.True(t, s.Frozen) assert.True(t, s.Filled) @@ -266,6 +266,30 @@ func (s *proposalTrackerTestShadow) stage(pv proposalValue) { s.outputs = append(s.outputs, res) } +func (s *proposalTrackerTestShadow) stageWithCert(pv proposalValue) { + var req, res event + + // check staging + req = stagingValueEvent{} + res = stagingValueEvent{} + s.inputs = append(s.inputs, req) + s.outputs = append(s.outputs, res) + + // deliver cert threshold + req = thresholdEvent{T: certThreshold, Proposal: pv} + res = proposalAcceptedEvent{Round: s.round, Period: s.period, Proposal: pv} + s.inputs = append(s.inputs, req) + s.outputs = append(s.outputs, res) + s.staged = true + s.staging = pv + + // check staging + req = stagingValueEvent{} + res = stagingValueEvent{Proposal: pv} + s.inputs = append(s.inputs, req) + s.outputs = append(s.outputs, res) +} + // create many proposal-votes, sorted in increasing credential-order. func setupProposalTrackerTests(t *testing.T) (votes []vote) { ledger, addrs, vrfs, ots := readOnlyFixture100() @@ -406,6 +430,56 @@ func TestProposalTrackerBasic(t *testing.T) { lowDelivery(shadow, "failed to track votes properly after staged") midDelivery(shadow, "failed to track votes properly after staged") }) + + t.Run("EarlyStagingCert", func(t *testing.T) { + targetCert := midvotes[0] + shadow := makeProposalTrackerTestShadow(votes[0].R.Round, votes[0].R.Period) + + shadow.stageWithCert(targetCert.R.Proposal) + shadow.execute(t, "failed to deliver cert threshold properly") + + highDelivery(shadow, "failed to track votes after staged") + + shadow.freeze() + shadow.execute(t, "failed to freeze machine properly") + + lowDelivery(shadow, "failed to track votes properly after staged") + midDelivery(shadow, "failed to track votes properly after staged") + }) + + t.Run("LateStagingCert", func(t *testing.T) { + targetCert := midvotes[0] + shadow := makeProposalTrackerTestShadow(votes[0].R.Round, votes[0].R.Period) + + highDelivery(shadow, "failed to track votes properly at zero state") + + shadow.freeze() + shadow.execute(t, "failed to freeze machine properly") + + midDelivery(shadow, "failed to track votes properly after frozen (but not staged)") + + shadow.stageWithCert(targetCert.R.Proposal) + shadow.execute(t, "failed to deliver soft threshold properly") + + lowDelivery(shadow, "failed to track votes properly after staged") + }) + + t.Run("SynchronousCert", func(t *testing.T) { + targetCert := lowvotes[0] + shadow := makeProposalTrackerTestShadow(votes[0].R.Round, votes[0].R.Period) + + midDelivery(shadow, "failed to track votes properly at zero state") + highDelivery(shadow, "failed to track votes properly at zero state") + lowDelivery(shadow, "failed to track votes properly at zero state") + + shadow.freeze() + shadow.execute(t, "failed to freeze machine properly") + + shadow.stageWithCert(targetCert.R.Proposal) + shadow.execute(t, "failed to deliver cert threshold properly") + + }) + } // func TestProposalTrackerSenderSpam(t *testing.T) { diff --git a/agreement/proposal_test.go b/agreement/proposal_test.go index 8cb358bd8e..b54a4326c8 100644 --- a/agreement/proposal_test.go +++ b/agreement/proposal_test.go @@ -48,7 +48,7 @@ func testSetup(periodCount uint64) (player, rootRouter, testAccountData, testBlo func createProposalsTesting(accs testAccountData, round basics.Round, period period, factory BlockFactory, ledger Ledger) (ps []proposal, vs []vote) { ve, err := factory.AssembleBlock(round, time.Now().Add(time.Minute)) if err != nil { - logging.Base().Errorf("Could not generate a proposal for round %v: %v", round, err) + logging.Base().Errorf("Could not generate a proposal for round %d: %v", round, err) return nil, nil } @@ -119,7 +119,7 @@ func TestProposalFunctions(t *testing.T) { round := player.Round period := player.Period ve, err := factory.AssembleBlock(player.Round, time.Now().Add(time.Minute)) - require.NoError(t, err, "Could not generate a proposal for round %v: %v", round, err) + require.NoError(t, err, "Could not generate a proposal for round %d: %v", round, err) validator := testBlockValidator{} @@ -157,7 +157,7 @@ func TestProposalUnauthenticated(t *testing.T) { round := player.Round period := player.Period testBlockFactory, err := factory.AssembleBlock(player.Round, time.Now().Add(time.Minute)) - require.NoError(t, err, "Could not generate a proposal for round %v: %v", round, err) + require.NoError(t, err, "Could not generate a proposal for round %d: %v", round, err) validator := testBlockValidator{} diff --git a/agreement/pseudonode.go b/agreement/pseudonode.go index db7bf10ea2..eac9febc83 100644 --- a/agreement/pseudonode.go +++ b/agreement/pseudonode.go @@ -254,7 +254,7 @@ func (n asyncPseudonode) makeProposals(round basics.Round, period period, accoun deadline := time.Now().Add(AssemblyTime) ve, err := n.factory.AssembleBlock(round, deadline) if err != nil { - n.log.Errorf("pseudonode.makeProposals: could not generate a proposal for round %v: %v", round, err) + n.log.Errorf("pseudonode.makeProposals: could not generate a proposal for round %d: %v", round, err) return nil, nil } @@ -362,31 +362,35 @@ func (t pseudonodeVotesTask) execute(verifier *AsyncVoteVerifier, quit chan stru for _, result := range verifiedResults { totalWeight += result.v.Cred.Weight } - for _, result := range verifiedResults { - vote := result.v - logEvent := logspec.AgreementEvent{ - Type: logspec.VoteBroadcast, - Sender: vote.R.Sender.String(), - Hash: vote.R.Proposal.BlockDigest.String(), - ObjectRound: uint64(vote.R.Round), - ObjectPeriod: uint64(vote.R.Period), - ObjectStep: uint64(vote.R.Step), - Weight: vote.Cred.Weight, - WeightTotal: totalWeight, + if t.node.log.IsLevelEnabled(logging.Info) { + for _, result := range verifiedResults { + vote := result.v + logEvent := logspec.AgreementEvent{ + Type: logspec.VoteBroadcast, + Sender: vote.R.Sender.String(), + Hash: vote.R.Proposal.BlockDigest.String(), + ObjectRound: uint64(vote.R.Round), + ObjectPeriod: uint64(vote.R.Period), + ObjectStep: uint64(vote.R.Step), + Weight: vote.Cred.Weight, + WeightTotal: totalWeight, + } + t.node.log.with(logEvent).Infof("vote created for broadcast (weight %d, total weight %d)", vote.Cred.Weight, totalWeight) + if !t.node.log.GetTelemetryEnabled() { + continue + } + t.node.log.EventWithDetails(telemetryspec.Agreement, telemetryspec.VoteSentEvent, telemetryspec.VoteEventDetails{ + Address: vote.R.Sender.String(), + Hash: vote.R.Proposal.BlockDigest.String(), + Round: uint64(vote.R.Round), + Period: uint64(vote.R.Period), + Step: uint64(vote.R.Step), + Weight: vote.Cred.Weight, + // Recovered: false, + }) } - t.node.log.with(logEvent).Infof("vote created for broadcast (weight %v, total weight %v)", vote.Cred.Weight, totalWeight) - t.node.log.EventWithDetails(telemetryspec.Agreement, telemetryspec.VoteSentEvent, telemetryspec.VoteEventDetails{ - Address: vote.R.Sender.String(), - Hash: vote.R.Proposal.BlockDigest.String(), - Round: uint64(vote.R.Round), - Period: uint64(vote.R.Period), - Step: uint64(vote.R.Step), - Weight: vote.Cred.Weight, - // Recovered: false, - }) - } - t.node.log.Infof("pseudonode.makeVotes: %v votes created for %v at (%v, %v, %v), total weight %v", len(verifiedResults), t.prop, t.round, t.period, t.step, totalWeight) - + t.node.log.Infof("pseudonode.makeVotes: %v votes created for %v at (%v, %v, %v), total weight %v", len(verifiedResults), t.prop, t.round, t.period, t.step, totalWeight) + } if len(verifiedResults) > 0 { // wait until the persist state is flushed, as we don't want to send any vote unless we've completed flushing it to disk. // at this point, the error was already logged. @@ -477,15 +481,17 @@ func (t pseudonodeProposalsTask) execute(verifier *AsyncVoteVerifier, quit chan ObjectRound: uint64(vote.R.Round), ObjectPeriod: uint64(vote.R.Period), } - t.node.log.with(logEvent).Infof("pseudonode.makeProposals: proposal created for (%v, %v)", vote.R.Round, vote.R.Period) - t.node.log.EventWithDetails(telemetryspec.Agreement, telemetryspec.BlockProposedEvent, telemetryspec.BlockProposedEventDetails{ - Hash: vote.R.Proposal.BlockDigest.String(), - Address: vote.R.Sender.String(), - Round: uint64(vote.R.Round), - Period: uint64(vote.R.Period), - }) - } - t.node.log.Infof("pseudonode.makeProposals: %v proposals created for round %v, period %v", len(verifiedVotes), t.round, t.period) + t.node.log.with(logEvent).Infof("pseudonode.makeProposals: proposal created for (%d, %d)", vote.R.Round, vote.R.Period) + if t.node.log.GetTelemetryEnabled() { + t.node.log.EventWithDetails(telemetryspec.Agreement, telemetryspec.BlockProposedEvent, telemetryspec.BlockProposedEventDetails{ + Hash: vote.R.Proposal.BlockDigest.String(), + Address: vote.R.Sender.String(), + Round: uint64(vote.R.Round), + Period: uint64(vote.R.Period), + }) + } + } + t.node.log.Infof("pseudonode.makeProposals: %d proposals created for round %d, period %d", len(verifiedVotes), t.round, t.period) for range verifiedVotes { t.node.monitor.inc(pseudonodeCoserviceType) diff --git a/agreement/pseudonode_test.go b/agreement/pseudonode_test.go index 71645abac2..c8192c22ab 100644 --- a/agreement/pseudonode_test.go +++ b/agreement/pseudonode_test.go @@ -114,7 +114,7 @@ func compareEventChannels(t *testing.T, ch1, ch2 <-chan externalEvent) bool { if !compareUnauthenticatedProposal(t, uo, up2) { return false } - if !assert.Equal(t, protocol.Encode(uo), protocol.Encode(up2)) { + if !assert.Equal(t, protocol.Encode(&uo), protocol.Encode(&up2)) { return false } if !assert.Equal(t, uo.Digest(), up2.Digest()) { @@ -298,7 +298,7 @@ func (n serializedPseudonode) MakeProposals(ctx context.Context, r round, p peri } for i, proposal := range proposals { - verifier.Verify(ctx, cryptoRequest{message: message{Tag: protocol.ProposalPayloadTag, UnauthenticatedProposal: proposal.u()}, Round: r}) + verifier.VerifyProposal(ctx, cryptoProposalRequest{message: message{Tag: protocol.ProposalPayloadTag, UnauthenticatedProposal: proposal.u()}, Round: r}) select { case cryptoResult, ok := <-verifier.Verified(protocol.ProposalPayloadTag): if !ok { diff --git a/agreement/selector.go b/agreement/selector.go index 9d7c535c0d..f52bb58163 100644 --- a/agreement/selector.go +++ b/agreement/selector.go @@ -38,7 +38,7 @@ type selector struct { // ToBeHashed implements the crypto.Hashable interface. func (sel selector) ToBeHashed() (protocol.HashID, []byte) { - return protocol.AgreementSelector, protocol.Encode(sel) + return protocol.AgreementSelector, protocol.Encode(&sel) } // CommitteeSize returns the size of the committee, which is determined by @@ -66,19 +66,19 @@ func membership(l LedgerReader, addr basics.Address, r basics.Round, p period, s record, err := l.BalanceRecord(balanceRound, addr) if err != nil { - err = fmt.Errorf("Service.initializeVote (r=%v): Failed to obtain balance record for address %v in round %v: %v", r, addr, balanceRound, err) + err = fmt.Errorf("Service.initializeVote (r=%d): Failed to obtain balance record for address %v in round %d: %v", r, addr, balanceRound, err) return } total, err := l.Circulation(balanceRound) if err != nil { - err = fmt.Errorf("Service.initializeVote (r=%v): Failed to obtain total circulation in round %v: %v", r, balanceRound, err) + err = fmt.Errorf("Service.initializeVote (r=%d): Failed to obtain total circulation in round %d: %v", r, balanceRound, err) return } seed, err := l.Seed(seedRound) if err != nil { - err = fmt.Errorf("Service.initializeVote (r=%v): Failed to obtain seed in round %v: %v", r, seedRound, err) + err = fmt.Errorf("Service.initializeVote (r=%d): Failed to obtain seed in round %d: %v", r, seedRound, err) return } diff --git a/agreement/service_test.go b/agreement/service_test.go index 0de42e5005..85221d6ed4 100644 --- a/agreement/service_test.go +++ b/agreement/service_test.go @@ -152,6 +152,7 @@ type testingNetwork struct { compoundPocket chan<- multicastParams partitionedNodes map[nodeID]bool crownedNodes map[nodeID]bool + relayNodes map[nodeID]bool interceptFn multicastInterceptFn } @@ -219,7 +220,7 @@ func (n *testingNetwork) multicast(tag protocol.Tag, data []byte, source nodeID, tag, data, source, exclude = out.tag, out.data, out.source, out.exclude } - if n.dropSoftVotes || n.dropSlowNextVotes || n.dropVotes || n.certVotePocket != nil || n.softVotePocket != nil || n.compoundPocket != nil || n.crownedNodes != nil { + if n.dropSoftVotes || n.dropSlowNextVotes || n.dropVotes || n.certVotePocket != nil || n.softVotePocket != nil || n.compoundPocket != nil { if tag == protocol.ProposalPayloadTag { r := bytes.NewBuffer(data) @@ -300,13 +301,18 @@ func (n *testingNetwork) multicast(tag protocol.Tag, data []byte, source nodeID, continue } if n.partitionedNodes != nil { - if n.partitionedNodes[source] != n.partitionedNodes[nodeID(i)] { + if n.partitionedNodes[source] != n.partitionedNodes[peerid] { continue } } if n.crownedNodes != nil { - if !n.crownedNodes[nodeID(i)] { - return + if !n.crownedNodes[peerid] { + continue + } + } + if n.relayNodes != nil { + if !n.relayNodes[source] && !n.relayNodes[peerid] { + continue } } @@ -377,6 +383,7 @@ func (n *testingNetwork) repairAll() { n.compoundPocket = nil n.partitionedNodes = nil n.crownedNodes = nil + n.relayNodes = nil n.interceptFn = nil } @@ -406,7 +413,17 @@ func (n *testingNetwork) crown(prophets ...nodeID) { defer n.mu.Unlock() n.crownedNodes = make(map[nodeID]bool) for i := 0; i < len(prophets); i++ { - n.crownedNodes[nodeID(i)] = true + n.crownedNodes[prophets[i]] = true + } +} + +// Star topology with the given nodes at the center; to revert, call repairAll +func (n *testingNetwork) makeRelays(relays ...nodeID) { + n.mu.Lock() + defer n.mu.Unlock() + n.relayNodes = make(map[nodeID]bool) + for i := 0; i < len(relays); i++ { + n.relayNodes[relays[i]] = true } } @@ -443,16 +460,16 @@ func (n *testingNetwork) testingNetworkEndpoint(id nodeID) *testingNetworkEndpoi func (n *testingNetwork) prepareAllMulticast() { n.mu.Lock() defer n.mu.Unlock() - for i := 0; i < len(n.monitors); i++ { - n.monitors[nodeID(i)].inc(networkCoserviceType) + for _, monitor := range n.monitors { + monitor.inc(networkCoserviceType) } } func (n *testingNetwork) finishAllMulticast() { n.mu.Lock() defer n.mu.Unlock() - for i := 0; i < len(n.monitors); i++ { - n.monitors[nodeID(i)].dec(networkCoserviceType) + for _, monitor := range n.monitors { + monitor.dec(networkCoserviceType) } } @@ -549,7 +566,7 @@ func (m *activityMonitor) waitForActivity() { func (m *activityMonitor) waitForQuiet() { select { case <-m.quiet: - case <-time.After(5 * time.Second): + case <-time.After(10 * time.Second): m.dump() var buf [1000000]byte @@ -779,8 +796,8 @@ func setupAgreementWithValidator(t *testing.T, numNodes int, traceLevel traceLev } cleanupFn := func() { - for _, accessor := range dbAccessors { - defer accessor.Close() + for idx := 0; idx < len(dbAccessors); idx++ { + dbAccessors[idx].Close() } if r := recover(); r != nil { @@ -1999,10 +2016,10 @@ func TestAgreementRegression_WrongPeriodPayloadVerificationCancellation_8ba23942 baseNetwork, baseLedger, cleanupFn, services, clocks, ledgers, activityMonitor := setupAgreementWithValidator(t, numNodes, disabled, validator, makeTestLedger) startRound := baseLedger.NextRound() defer cleanupFn() + for i := 0; i < numNodes; i++ { services[i].Start() } - activityMonitor.waitForActivity() activityMonitor.waitForQuiet() zeroes := expectNewPeriod(clocks, 0) @@ -2101,7 +2118,7 @@ func TestAgreementRegression_WrongPeriodPayloadVerificationCancellation_8ba23942 } // resume block verification, replay potentially cancelled blocks to ensure good caching - // then wait for network to converge (round should terminate at this point) + // then wait for network to converge (round should terminate at this point) activityMonitor.setCallback(nil) close(ch) @@ -2140,3 +2157,118 @@ func TestAgreementRegression_WrongPeriodPayloadVerificationCancellation_8ba23942 } } } + +// Receiving a certificate should not cause a node to stop relaying important messages +// (such as blocks and pipelined messages for the next round) +// Note that the stall will be resolved by catchup even if the relay blocks. +func TestAgreementCertificateDoesNotStallSingleRelay(t *testing.T) { + numNodes := 5 // single relay, four leaf nodes + relayID := nodeID(0) + baseNetwork, baseLedger, cleanupFn, services, clocks, ledgers, activityMonitor := setupAgreement(t, numNodes, disabled, makeTestLedger) + + startRound := baseLedger.NextRound() + defer cleanupFn() + for i := 0; i < numNodes; i++ { + services[i].Start() + } + activityMonitor.waitForActivity() + activityMonitor.waitForQuiet() + zeroes := expectNewPeriod(clocks, 0) + // run two rounds + zeroes = runRound(clocks, activityMonitor, zeroes) + // make sure relay does not see block proposal for round 3 + baseNetwork.intercept(func(params multicastParams) multicastParams { + if params.tag == protocol.ProposalPayloadTag { + var tp transmittedPayload + err := protocol.DecodeStream(bytes.NewBuffer(params.data), &tp) + if err != nil { + panic(err) + } + if tp.Round() == basics.Round(startRound+2) { + params.exclude = relayID + } + } + if params.source == relayID { + // must also drop relay's proposal so it cannot win leadership + r := bytes.NewBuffer(params.data) + if params.tag == protocol.AgreementVoteTag { + var uv unauthenticatedVote + err := protocol.DecodeStream(r, &uv) + if err != nil { + panic(err) + } + if uv.R.Step != propose { + return params + } + } + params.tag = protocol.UnknownMsgTag + } + + return params + }) + zeroes = runRound(clocks, activityMonitor, zeroes) + + // Round 3: + // First partition the relay to prevent it from seeing certificate or block + baseNetwork.repairAll() + baseNetwork.partition(relayID) + // Get a copy of the certificate + pocketCert := make(chan multicastParams, 100) + baseNetwork.intercept(func(params multicastParams) multicastParams { + if params.tag == protocol.AgreementVoteTag { + r := bytes.NewBuffer(params.data) + var uv unauthenticatedVote + err := protocol.DecodeStream(r, &uv) + if err != nil { + panic(err) + } + if uv.R.Step == cert { + pocketCert <- params + } + } + return params + }) + // And with some hypothetical second relay the network achieves consensus on a certificate and block. + triggerGlobalTimeout(filterTimeout, clocks, activityMonitor) + zeroes = expectNewPeriod(clocks[1:], zeroes) + require.Equal(t, uint(3), clocks[0].(*testingClock).zeroes) + close(pocketCert) + + // Round 4: + // Return to the relay topology + baseNetwork.repairAll() + baseNetwork.makeRelays(relayID) + // Trigger ensureDigest on the relay + baseNetwork.prepareAllMulticast() + for p := range pocketCert { + baseNetwork.multicast(p.tag, p.data, p.source, p.exclude) + } + baseNetwork.finishAllMulticast() + activityMonitor.waitForActivity() + activityMonitor.waitForQuiet() + // this relay must still relay initial messages. Note that payloads were already relayed with + // the previous global timeout. + triggerGlobalTimeout(filterTimeout, clocks[1:], activityMonitor) + zeroes = expectNewPeriod(clocks[1:], zeroes) + require.Equal(t, uint(3), clocks[0].(*testingClock).zeroes) + + for i := 0; i < numNodes; i++ { + services[i].Shutdown() + } + const expectNumRounds = 4 + for i := 1; i < numNodes; i++ { + if ledgers[i].NextRound() != startRound+round(expectNumRounds) { + panic("did not progress 4 rounds") + } + } + for j := 0; j < expectNumRounds; j++ { + ledger := ledgers[1].(*testLedger) + reference := ledger.entries[startRound+round(j)].Digest() + for i := 1; i < numNodes; i++ { + ledger := ledgers[i].(*testLedger) + if ledger.entries[startRound+round(j)].Digest() != reference { + panic("wrong block confirmed") + } + } + } +} diff --git a/agreement/vote.go b/agreement/vote.go index 277f736845..e38c588e98 100644 --- a/agreement/vote.go +++ b/agreement/vote.go @@ -100,14 +100,14 @@ func (uv unauthenticatedVote) verify(l LedgerReader) (vote, error) { } // The following check could apply to all steps, but it's sufficient to only check in the propose step. if rv.Proposal.OriginalPeriod > rv.Period { - return vote{}, fmt.Errorf("unauthenticatedVote.verify: proposal-vote in period %v claims to repropose block from future period %v", rv.Period, rv.Proposal.OriginalPeriod) + return vote{}, fmt.Errorf("unauthenticatedVote.verify: proposal-vote in period %d claims to repropose block from future period %d", rv.Period, rv.Proposal.OriginalPeriod) } fallthrough case soft: fallthrough case cert: if rv.Proposal == bottom { - return vote{}, fmt.Errorf("unauthenticatedVote.verify: votes from step %v cannot validate bottom", rv.Step) + return vote{}, fmt.Errorf("unauthenticatedVote.verify: votes from step %d cannot validate bottom", rv.Step) } } @@ -156,18 +156,18 @@ func makeVote(rv rawVote, voting crypto.OneTimeSigner, selection *crypto.VRFSecr switch rv.Step { case propose, soft, cert, late, redo: if rv.Proposal == bottom { - logging.Base().Panicf("makeVote: votes from step %v cannot validate bottom", rv.Step) + logging.Base().Panicf("makeVote: votes from step %d cannot validate bottom", rv.Step) } case down: if rv.Proposal != bottom { - logging.Base().Panicf("makeVote: votes from step %v must validate bottom", rv.Step) + logging.Base().Panicf("makeVote: votes from step %d must validate bottom", rv.Step) } } } else { switch rv.Step { case propose, soft, cert: if rv.Proposal == bottom { - logging.Base().Panicf("makeVote: votes from step %v cannot validate bottom", rv.Step) + logging.Base().Panicf("makeVote: votes from step %d cannot validate bottom", rv.Step) } } } @@ -184,7 +184,7 @@ func makeVote(rv rawVote, voting crypto.OneTimeSigner, selection *crypto.VRFSecr // ToBeHashed implements the Hashable interface. func (rv rawVote) ToBeHashed() (protocol.HashID, []byte) { - return protocol.Vote, protocol.Encode(rv) + return protocol.Vote, protocol.Encode(&rv) } func (v vote) u() unauthenticatedVote { diff --git a/agreement/voteAggregator.go b/agreement/voteAggregator.go index 1e4d309fb4..710bd5d346 100644 --- a/agreement/voteAggregator.go +++ b/agreement/voteAggregator.go @@ -197,7 +197,7 @@ func (agg *voteAggregator) filterVote(proto protocol.ConsensusVersion, p player, switch filterRes.t() { case voteFilteredStep: // we'll rebuild the filtered event later - return fmt.Errorf("voteAggregator: rejected vote: sender %v had already sent a vote in round %v period %v step %v", uv.R.Sender, uv.R.Round, uv.R.Period, uv.R.Step) + return fmt.Errorf("voteAggregator: rejected vote: sender %v had already sent a vote in round %d period %d step %d", uv.R.Sender, uv.R.Round, uv.R.Period, uv.R.Step) case none: return nil } @@ -205,8 +205,7 @@ func (agg *voteAggregator) filterVote(proto protocol.ConsensusVersion, p player, panic("not reached") } -// filterBundle filters a bundle, checking if it is both fresh and is neither a -// duplicate nor equivocates twice. +// filterBundle filters a bundle, checking if it is fresh. // TODO consider optimizing recovery by filtering bundles for some value if we // have already seen the threshold met for that value. This will filter // repeated bundles sent by honest peers. @@ -234,10 +233,10 @@ func voteStepFresh(descr string, proto protocol.ConsensusVersion, mine, vote ste } if mine != 0 && mine-1 > vote { - return fmt.Errorf("filtered stale vote %s: step %v - 1 > %v", descr, mine, vote) + return fmt.Errorf("filtered stale vote %s: step %d - 1 > %d", descr, mine, vote) } if mine+1 < vote { - return fmt.Errorf("filtered premature vote %s: step %v + 1 < %v", descr, mine, vote) + return fmt.Errorf("filtered premature vote %s: step %d + 1 < %d", descr, mine, vote) } return nil @@ -276,11 +275,15 @@ func voteFresh(proto protocol.ConsensusVersion, freshData freshnessData, vote un // bundleFresh determines whether a bundle satisfies freshness rules. func bundleFresh(freshData freshnessData, b unauthenticatedBundle) error { if freshData.PlayerRound != b.Round { - return fmt.Errorf("filtered bundle from different round: round %v != %v", freshData.PlayerRound, b.Round) + return fmt.Errorf("filtered bundle from different round: round %d != %d", freshData.PlayerRound, b.Round) + } + + if b.Step == cert { + return nil } if freshData.PlayerPeriod != 0 && freshData.PlayerPeriod-1 > b.Period { - return fmt.Errorf("filtered stale bundle: period %v >= %v", freshData.PlayerPeriod, b.Period) + return fmt.Errorf("filtered stale bundle: period %d >= %d", freshData.PlayerPeriod, b.Period) } return nil diff --git a/agreement/voteAuxiliary.go b/agreement/voteAuxiliary.go index c224b815c5..7fd64ec486 100644 --- a/agreement/voteAuxiliary.go +++ b/agreement/voteAuxiliary.go @@ -39,7 +39,7 @@ func (t *voteTrackerPeriod) underlying() listener { // A voteTrackerPeriod handles: // - voteAcceptedEvent, which it forwards to the vote tracker. This generates either // a threshold event or an empty event (forwarded to the sender) -// - nextThresholds: It updates its next threshodl cache if this +// - nextThresholds: It updates its next threshold cache if this // is a new next vote bundle for this period. Emits empty event. (We split this out // so that we can unit test the voteTrackerPeriod trace without depending on the // voteTrackerStep.) @@ -92,7 +92,8 @@ func (t *voteTrackerPeriod) handle(r routerHandle, p player, e event) event { // // Bundle "freshness" is an ordering relation defined on thresholdEvents. The // relation is defined as follows: -// - thresholdEvents are fresher than thresholdEvents from older periods. +// - certThresholds are fresher than other kinds of thresholdEvent. +// - other thresholdEvents are fresher than thresholdEvents from older periods. // - nextThresholds are fresher than softThreshold in the same period. // - nextThresholds for the bottom proposal-value are fresher than // nextThresholds for another proposal-value. diff --git a/agreement/voteTracker.go b/agreement/voteTracker.go index 5aba4c9509..9d27feb14b 100644 --- a/agreement/voteTracker.go +++ b/agreement/voteTracker.go @@ -183,7 +183,7 @@ func (tracker *voteTracker) handle(r routerHandle, p player, e0 event) event { // In order for this to be triggered, more than 75% of the vote for the given step need to vote for more than // a single proposal. In that state, all the proposals become "above threshold". That's a serious issue, since // it would compromise the honest node core assumption. - logging.Base().Panicf("too many equivocators for step %v: %v", e.Vote.R.Step, tracker.EquivocatorsCount) + logging.Base().Panicf("too many equivocators for step %d: %d", e.Vote.R.Step, tracker.EquivocatorsCount) } // decrease their weight from any block proposal they already diff --git a/agreement/voteTrackerContract.go b/agreement/voteTrackerContract.go index 9555be8058..3df30cde48 100644 --- a/agreement/voteTrackerContract.go +++ b/agreement/voteTrackerContract.go @@ -61,7 +61,7 @@ func (c *voteTrackerContract) pre(p player, in0 event) (pre []error) { c.Step = in.Vote.R.Step } else { if c.Step != in.Vote.R.Step { - pre = append(pre, fmt.Errorf("incoming event has step %v but expected step %v", in.Vote.R.Step, c.Step)) + pre = append(pre, fmt.Errorf("incoming event has step %d but expected step %d", in.Vote.R.Step, c.Step)) } } return @@ -82,15 +82,15 @@ func (c *voteTrackerContract) post(p player, in0, out0 event) (post []error) { case none: case softThreshold: if in.Vote.R.Step != soft { - post = append(post, fmt.Errorf("incoming event has step %v but outgoing event has type softThreshold", in.Vote.R.Step)) + post = append(post, fmt.Errorf("incoming event has step %d but outgoing event has type softThreshold", in.Vote.R.Step)) } case certThreshold: if in.Vote.R.Step != cert { - post = append(post, fmt.Errorf("incoming event has step %v but outgoing event has type certThreshold", in.Vote.R.Step)) + post = append(post, fmt.Errorf("incoming event has step %d but outgoing event has type certThreshold", in.Vote.R.Step)) } case nextThreshold: if in.Vote.R.Step <= cert { - post = append(post, fmt.Errorf("incoming event has step %v but outgoing event has type nextThreshold", in.Vote.R.Step)) + post = append(post, fmt.Errorf("incoming event has step %d but outgoing event has type nextThreshold", in.Vote.R.Step)) } default: post = append(post, fmt.Errorf("outgoing event has invalid type: %v", out0.t())) @@ -115,10 +115,10 @@ func (c *voteTrackerContract) post(p player, in0, out0 event) (post []error) { emptyBundle := len(out.Bundle.Votes) == 0 if (out.T == none) != emptyBundle { - post = append(post, fmt.Errorf("out.T must be none if and only if out.Bundle is empty, but out.T = %v while len(out.Bundle.Votes) = %v", out.T, len(out.Bundle.Votes))) + post = append(post, fmt.Errorf("out.T must be none if and only if out.Bundle is empty, but out.T = %v while len(out.Bundle.Votes) = %d", out.T, len(out.Bundle.Votes))) } if out.T != none && out.Proposal == bottom && out.Step < next { - post = append(post, fmt.Errorf("outgoing event has bottom proposal but step %v", out.Step)) + post = append(post, fmt.Errorf("outgoing event has bottom proposal but step %d", out.Step)) } return case voteFilterRequest: diff --git a/auction/msgp_gen.go b/auction/msgp_gen.go index f20489843e..2c8afc131a 100644 --- a/auction/msgp_gen.go +++ b/auction/msgp_gen.go @@ -2245,6 +2245,9 @@ func (z NoteFieldType) MarshalMsg(b []byte) (o []byte, err error) { func (_ NoteFieldType) CanMarshalMsg(z interface{}) bool { _, ok := (z).(NoteFieldType) + if !ok { + _, ok = (z).(*NoteFieldType) + } return ok } diff --git a/buildnumber.dat b/buildnumber.dat index b4de394767..48082f72f0 100644 --- a/buildnumber.dat +++ b/buildnumber.dat @@ -1 +1 @@ -11 +12 diff --git a/rpcs/fetcher.go b/catchup/fetcher.go similarity index 95% rename from rpcs/fetcher.go rename to catchup/fetcher.go index 56b30da5d4..15e4b009a0 100644 --- a/rpcs/fetcher.go +++ b/catchup/fetcher.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . -package rpcs +package catchup import ( "context" @@ -31,6 +31,7 @@ import ( "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/network" "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/rpcs" ) // DefaultFetchTimeout is the default time a fetcher should wait for a block @@ -61,9 +62,9 @@ type FetcherFactory interface { // NetworkFetcherFactory creates network fetchers type NetworkFetcherFactory struct { - net PeerSource + net network.GossipNode peerLimit int - fs *WsFetcherService + fs *rpcs.WsFetcherService log logging.Logger } @@ -71,7 +72,7 @@ type NetworkFetcherFactory struct { func (factory NetworkFetcherFactory) makeHTTPFetcherFromPeer(log logging.Logger, peer network.Peer) FetcherClient { hp, ok := peer.(network.HTTPPeer) if ok { - return MakeHTTPFetcher(log, hp) + return MakeHTTPFetcher(log, hp, factory.net) } log.Errorf("%T %#v is not HTTPPeer", peer, peer) return nil @@ -79,7 +80,7 @@ func (factory NetworkFetcherFactory) makeHTTPFetcherFromPeer(log logging.Logger, // MakeNetworkFetcherFactory returns a network fetcher factory, that associates fetchers with no more than peerLimit peers from the aggregator. // WSClientSource can be nil, if no network exists to create clients from (defaults to http clients) -func MakeNetworkFetcherFactory(net PeerSource, peerLimit int, fs *WsFetcherService) NetworkFetcherFactory { +func MakeNetworkFetcherFactory(net network.GossipNode, peerLimit int, fs *rpcs.WsFetcherService) NetworkFetcherFactory { var factory NetworkFetcherFactory factory.net = net factory.peerLimit = peerLimit @@ -116,7 +117,9 @@ func (factory NetworkFetcherFactory) New() Fetcher { } } -// NewOverGossip returns a gossip fetcher using the given message tag. +// NewOverGossip returns a fetcher using the given message tag. +// If there are gossip peers, then it returns a fetcher over gossip +// Otherwise, it returns an HTTP fetcher // We should never build two fetchers utilising the same tag. Why? func (factory NetworkFetcherFactory) NewOverGossip(tag protocol.Tag) Fetcher { gossipPeers := factory.net.GetPeers(network.PeersConnectedIn) @@ -295,7 +298,7 @@ func (cf *ComposedFetcher) Close() { /* Utils */ func processBlockBytes(fetchedBuf []byte, r basics.Round, debugStr string) (blk *bookkeeping.Block, cert *agreement.Certificate, err error) { - var decodedEntry EncodedBlockCert + var decodedEntry rpcs.EncodedBlockCert err = protocol.Decode(fetchedBuf, &decodedEntry) if err != nil { err = fmt.Errorf("networkFetcher.FetchBlock(%d): cannot decode block from peer %v: %v", r, debugStr, err) diff --git a/catchup/fetcher_test.go b/catchup/fetcher_test.go new file mode 100644 index 0000000000..ba153e9911 --- /dev/null +++ b/catchup/fetcher_test.go @@ -0,0 +1,907 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package catchup + +import ( + "context" + "errors" + "net" + "net/http" + "net/rpc" + "net/url" + "strings" + "testing" + "time" + + "github.com/gorilla/mux" + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/agreement" + "github.com/algorand/go-algorand/components/mocks" + "github.com/algorand/go-algorand/config" + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/data" + "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/data/bookkeeping" + "github.com/algorand/go-algorand/data/transactions" + "github.com/algorand/go-algorand/logging" + "github.com/algorand/go-algorand/network" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/rpcs" + "github.com/algorand/go-algorand/util/bloom" +) + +type mockRunner struct { + ran bool + done chan *rpc.Call + failWithNil bool + failWithError bool + txgroups [][]transactions.SignedTxn +} + +type mockRPCClient struct { + client *mockRunner + closed bool + rootURL string + log logging.Logger +} + +func (client *mockRPCClient) Close() error { + client.closed = true + return nil +} + +func (client *mockRPCClient) Address() string { + return "mock.address." +} +func (client *mockRPCClient) Sync(ctx context.Context, bloom *bloom.Filter) (txgroups [][]transactions.SignedTxn, err error) { + client.log.Info("MockRPCClient.Sync") + select { + case <-ctx.Done(): + return nil, errors.New("cancelled") + default: + } + if client.client.failWithNil { + return nil, errors.New("old failWithNil") + } + if client.client.failWithError { + return nil, errors.New("failing call") + } + return client.client.txgroups, nil +} +func (client *mockRPCClient) GetBlockBytes(ctx context.Context, r basics.Round) (data []byte, err error) { + return nil, nil +} + +// network.HTTPPeer interface +func (client *mockRPCClient) GetAddress() string { + return client.rootURL +} +func (client *mockRPCClient) GetHTTPClient() *http.Client { + return nil +} +func (client *mockRPCClient) PrepareURL(x string) string { + return strings.Replace(x, "{genesisID}", "test genesisID", -1) +} + +type mockClientAggregator struct { + mocks.MockNetwork + peers []network.Peer +} + +func (mca *mockClientAggregator) GetPeers(options ...network.PeerOption) []network.Peer { + return mca.peers +} + +const numberOfPeers = 10 + +func makeMockClientAggregator(t *testing.T, failWithNil bool, failWithError bool) *mockClientAggregator { + clients := make([]network.Peer, 0) + for i := 0; i < numberOfPeers; i++ { + runner := mockRunner{failWithNil: failWithNil, failWithError: failWithError, done: make(chan *rpc.Call)} + clients = append(clients, &mockRPCClient{client: &runner, log: logging.TestingLog(t)}) + } + t.Logf("len(mca.clients) = %d", len(clients)) + return &mockClientAggregator{peers: clients} +} + +func getAllClientsSelectedForRound(t *testing.T, fetcher *NetworkFetcher, round basics.Round) map[FetcherClient]basics.Round { + selected := make(map[FetcherClient]basics.Round, 0) + for i := 0; i < 1000; i++ { + c, err := fetcher.selectClient(round) + if err != nil { + return selected + } + selected[c.(FetcherClient)] = fetcher.roundUpperBound[c] + } + return selected +} + +func TestSelectValidRemote(t *testing.T) { + network := makeMockClientAggregator(t, false, false) + factory := MakeNetworkFetcherFactory(network, numberOfPeers, nil) + factory.log = logging.TestingLog(t) + fetcher := factory.New() + require.Equal(t, numberOfPeers, len(fetcher.(*NetworkFetcher).peers)) + + var oldClient FetcherClient + var newClient FetcherClient + i := 0 + for _, client := range fetcher.(*NetworkFetcher).peers { + if i == 0 { + oldClient = client + r := basics.Round(2) + fetcher.(*NetworkFetcher).roundUpperBound[client] = r + } else if i == 1 { + newClient = client + r := basics.Round(4) + fetcher.(*NetworkFetcher).roundUpperBound[client] = r + } else if i > 2 { + r := basics.Round(3) + fetcher.(*NetworkFetcher).roundUpperBound[client] = r + } // skip i == 2 + i++ + } + + require.Equal(t, numberOfPeers, len(fetcher.(*NetworkFetcher).availablePeers(1))) + selected := getAllClientsSelectedForRound(t, fetcher.(*NetworkFetcher), 1) + require.Equal(t, numberOfPeers, len(selected)) + _, hasOld := selected[oldClient] + require.True(t, hasOld) + + _, hasNew := selected[newClient] + require.True(t, hasNew) + + require.Equal(t, numberOfPeers-1, len(fetcher.(*NetworkFetcher).availablePeers(2))) + selected = getAllClientsSelectedForRound(t, fetcher.(*NetworkFetcher), 2) + require.Equal(t, numberOfPeers-1, len(selected)) + _, hasOld = selected[oldClient] + require.False(t, hasOld) + _, hasNew = selected[newClient] + require.True(t, hasNew) + + require.Equal(t, 2, len(fetcher.(*NetworkFetcher).availablePeers(3))) + selected = getAllClientsSelectedForRound(t, fetcher.(*NetworkFetcher), 3) + require.Equal(t, 2, len(selected)) + _, hasOld = selected[oldClient] + require.False(t, hasOld) + _, hasNew = selected[newClient] + require.True(t, hasNew) + + require.Equal(t, 1, len(fetcher.(*NetworkFetcher).availablePeers(4))) + selected = getAllClientsSelectedForRound(t, fetcher.(*NetworkFetcher), 4) + require.Equal(t, 1, len(selected)) + _, hasOld = selected[oldClient] + require.False(t, hasOld) + _, hasNew = selected[newClient] + require.False(t, hasNew) +} + +type dummyFetcher struct { + failWithNil bool + failWithError bool + fetchTimeout time.Duration +} + +// FetcherClient interface +func (df *dummyFetcher) GetBlockBytes(ctx context.Context, r basics.Round) (data []byte, err error) { + if df.failWithNil { + return nil, nil + } + if df.failWithError { + return nil, errors.New("failing call") + } + + timer := time.NewTimer(df.fetchTimeout) + defer timer.Stop() + + // Fill in the dummy response with the correct round + dummyBlock := rpcs.EncodedBlockCert{ + Block: bookkeeping.Block{ + BlockHeader: bookkeeping.BlockHeader{ + Round: r, + }, + }, + Certificate: agreement.Certificate{ + Round: r, + }, + } + + encodedData := protocol.Encode(&dummyBlock) + + select { + case <-timer.C: + case <-ctx.Done(): + return nil, ctx.Err() + } + + return encodedData, nil +} + +// FetcherClient interface +func (df *dummyFetcher) Address() string { + //logging.Base().Debug("dummyFetcher Address") + return "dummyFetcher address" +} + +// FetcherClient interface +func (df *dummyFetcher) Close() error { + //logging.Base().Debug("dummyFetcher Close") + return nil +} + +func makeDummyFetchers(failWithNil bool, failWithError bool, timeout time.Duration) []FetcherClient { + out := make([]FetcherClient, numberOfPeers) + for i := range out { + out[i] = &dummyFetcher{failWithNil, failWithError, timeout} + } + return out +} + +func TestFetchBlock(t *testing.T) { + fetcher := &NetworkFetcher{ + roundUpperBound: make(map[FetcherClient]basics.Round), + activeFetches: make(map[FetcherClient]int), + peers: makeDummyFetchers(false, false, 100*time.Millisecond), + log: logging.TestingLog(t), + } + + var err error + var block *bookkeeping.Block + var cert *agreement.Certificate + var client FetcherClient + + fetched := false + for i := 0; i < numberOfPeers; i++ { + start := time.Now() + block, cert, client, err = fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) + require.NoError(t, err) + require.NotNil(t, client) + end := time.Now() + require.True(t, end.Sub(start) > 100*time.Millisecond) + require.True(t, end.Sub(start) < 100*time.Millisecond+5*time.Second) // we want to have a higher margin here, as the machine we're running on might be slow. + if err == nil { + require.NotEqual(t, nil, block) + require.NotEqual(t, nil, cert) + _, _, client, err = fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) + require.NotNil(t, client) + require.NoError(t, err) + fetched = true + } + } + require.True(t, fetched) +} + +func TestFetchBlockFail(t *testing.T) { + fetcher := &NetworkFetcher{ + roundUpperBound: make(map[FetcherClient]basics.Round), + activeFetches: make(map[FetcherClient]int), + peers: makeDummyFetchers(true, false, 100*time.Millisecond), + log: logging.TestingLog(t), + } + + for i := 0; i < numberOfPeers; i++ { + require.False(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) + _, _, _, err := fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) + require.Error(t, err) + } + require.True(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) +} + +func TestFetchBlockAborted(t *testing.T) { + fetcher := &NetworkFetcher{ + roundUpperBound: make(map[FetcherClient]basics.Round), + activeFetches: make(map[FetcherClient]int), + peers: makeDummyFetchers(false, false, 2*time.Second), + log: logging.TestingLog(t), + } + + ctx, cf := context.WithCancel(context.Background()) + defer cf() + go func() { + cf() + }() + start := time.Now() + _, _, client, err := fetcher.FetchBlock(ctx, basics.Round(1)) + end := time.Now() + require.True(t, strings.Contains(err.Error(), context.Canceled.Error())) + require.Nil(t, client) + require.True(t, end.Sub(start) < 10*time.Second) +} + +func TestFetchBlockTimeout(t *testing.T) { + fetcher := &NetworkFetcher{ + roundUpperBound: make(map[FetcherClient]basics.Round), + activeFetches: make(map[FetcherClient]int), + peers: makeDummyFetchers(false, false, 10*time.Second), + log: logging.TestingLog(t), + } + start := time.Now() + ctx, cf := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cf() + _, _, client, err := fetcher.FetchBlock(ctx, basics.Round(1)) + end := time.Now() + require.True(t, strings.Contains(err.Error(), context.DeadlineExceeded.Error())) + require.Nil(t, client) + require.True(t, end.Sub(start) >= 500*time.Millisecond) + require.True(t, end.Sub(start) < 10*time.Second) +} + +func TestFetchBlockErrorCall(t *testing.T) { + fetcher := &NetworkFetcher{ + roundUpperBound: make(map[FetcherClient]basics.Round), + activeFetches: make(map[FetcherClient]int), + peers: makeDummyFetchers(false, true, 10*time.Millisecond), + log: logging.TestingLog(t), + } + + require.False(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) + _, _, client, err := fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) + require.Error(t, err) + require.Nil(t, client) +} + +func TestFetchBlockComposedNoOp(t *testing.T) { + f := &NetworkFetcher{ + roundUpperBound: make(map[FetcherClient]basics.Round), + activeFetches: make(map[FetcherClient]int), + peers: makeDummyFetchers(false, false, 1*time.Millisecond), + log: logging.TestingLog(t), + } + fetcher := &ComposedFetcher{fetchers: []Fetcher{f, nil}} + + var err error + var block *bookkeeping.Block + var cert *agreement.Certificate + var client FetcherClient + + fetched := false + for i := 0; i < numberOfPeers; i++ { + start := time.Now() + block, cert, client, err = fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) + require.NoError(t, err) + require.NotNil(t, client) + end := time.Now() + require.True(t, end.Sub(start) >= 1*time.Millisecond) + require.True(t, end.Sub(start) < 1*time.Millisecond+10*time.Second) // we take a very high margin here for the fetcher to complete. + if err == nil { + require.NotEqual(t, nil, block) + require.NotEqual(t, nil, cert) + _, _, client, err = fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) + require.NotNil(t, client) + require.NoError(t, err) + fetched = true + } + } + require.True(t, fetched) +} + +// Make sure composed fetchers are hit in priority order +func TestFetchBlockComposedFail(t *testing.T) { + f := &NetworkFetcher{ + roundUpperBound: make(map[FetcherClient]basics.Round), + activeFetches: make(map[FetcherClient]int), + peers: makeDummyFetchers(true, false, 1*time.Millisecond), + log: logging.TestingLog(t), + } + f2 := &NetworkFetcher{ + roundUpperBound: make(map[FetcherClient]basics.Round), + activeFetches: make(map[FetcherClient]int), + peers: makeDummyFetchers(false, false, 1*time.Millisecond), + log: logging.TestingLog(t), + } + fetcher := &ComposedFetcher{fetchers: []Fetcher{f, f2}} + + for i := 0; i < numberOfPeers; i++ { + require.False(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) + _, _, _, err := fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) + require.Error(t, err) + } + require.False(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) + for i := 0; i < numberOfPeers; i++ { + require.False(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) + _, _, client, err := fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) + require.NotNil(t, client) + require.NoError(t, err) + } +} + +func buildTestLedger(t *testing.T) (ledger *data.Ledger, next basics.Round, b bookkeeping.Block, err error) { + var user basics.Address + user[0] = 123 + + proto := config.Consensus[protocol.ConsensusCurrentVersion] + genesis := make(map[basics.Address]basics.AccountData) + genesis[user] = basics.AccountData{ + Status: basics.Online, + MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, + } + genesis[sinkAddr] = basics.AccountData{ + Status: basics.Online, + MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, + } + genesis[poolAddr] = basics.AccountData{ + Status: basics.Online, + MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, + } + + log := logging.TestingLog(t) + genBal := data.MakeGenesisBalances(genesis, sinkAddr, poolAddr) + genHash := crypto.Digest{0x42} + const inMem = true + const archival = true + ledger, err = data.LoadLedger( + log, t.Name(), inMem, protocol.ConsensusCurrentVersion, genBal, "", genHash, + nil, archival, + ) + if err != nil { + t.Fatal("couldn't build ledger", err) + return + } + next = ledger.NextRound() + tx := transactions.Transaction{ + Type: protocol.PaymentTx, + Header: transactions.Header{ + Sender: user, + Fee: basics.MicroAlgos{Raw: proto.MinTxnFee}, + FirstValid: next, + LastValid: next, + GenesisHash: genHash, + }, + PaymentTxnFields: transactions.PaymentTxnFields{ + Receiver: user, + Amount: basics.MicroAlgos{Raw: 2}, + }, + } + signedtx := transactions.SignedTxn{ + Txn: tx, + } + + prev, err := ledger.Block(ledger.LastRound()) + require.NoError(t, err) + b.RewardsLevel = prev.RewardsLevel + b.BlockHeader.Round = next + b.BlockHeader.GenesisHash = genHash + b.CurrentProtocol = protocol.ConsensusCurrentVersion + txib, err := b.EncodeSignedTxn(signedtx, transactions.ApplyData{}) + require.NoError(t, err) + b.Payset = []transactions.SignedTxnInBlock{ + txib, + } + + require.NoError(t, ledger.AddBlock(b, agreement.Certificate{Round: next})) + return +} + +type basicRPCNode struct { + listener net.Listener + server http.Server + rmux *mux.Router + peers []network.Peer + mocks.MockNetwork +} + +func (b *basicRPCNode) RegisterHTTPHandler(path string, handler http.Handler) { + if b.rmux == nil { + b.rmux = mux.NewRouter() + } + b.rmux.Handle(path, handler) +} + +func (b *basicRPCNode) RegisterHandlers(dispatch []network.TaggedMessageHandler) { +} + +func (b *basicRPCNode) start() bool { + var err error + b.listener, err = net.Listen("tcp", "") + if err != nil { + logging.Base().Error("tcp listen", err) + return false + } + if b.rmux == nil { + b.rmux = mux.NewRouter() + } + b.server.Handler = b.rmux + go b.server.Serve(b.listener) + return true +} +func (b *basicRPCNode) rootURL() string { + addr := b.listener.Addr().String() + rootURL := url.URL{Scheme: "http", Host: addr, Path: ""} + return rootURL.String() +} + +func (b *basicRPCNode) stop() { + b.server.Close() +} + +func (b *basicRPCNode) GetPeers(options ...network.PeerOption) []network.Peer { + return b.peers +} + +type httpTestPeerSource struct { + peers []network.Peer + mocks.MockNetwork + dispatchHandlers []network.TaggedMessageHandler +} + +func (s *httpTestPeerSource) GetPeers(options ...network.PeerOption) []network.Peer { + return s.peers +} + +func (s *httpTestPeerSource) RegisterHandlers(dispatch []network.TaggedMessageHandler) { + s.dispatchHandlers = append(s.dispatchHandlers, dispatch...) +} + +// implement network.HTTPPeer +type testHTTPPeer string + +func (p *testHTTPPeer) GetAddress() string { + return string(*p) +} +func (p *testHTTPPeer) PrepareURL(x string) string { + return strings.Replace(x, "{genesisID}", "test genesisID", -1) +} +func (p *testHTTPPeer) GetHTTPClient() *http.Client { + return &http.Client{} +} +func (p *testHTTPPeer) GetHTTPPeer() network.HTTPPeer { + return p +} + +func buildTestHTTPPeerSource(rootURLs ...string) *httpTestPeerSource { + peers := []network.Peer{} + for url := range rootURLs { + peer := testHTTPPeer(url) + peers = append(peers, &peer) + } + return &httpTestPeerSource{peers: peers} +} +func (s *httpTestPeerSource) addPeer(rootURL string) { + peer := testHTTPPeer(rootURL) + s.peers = append(s.peers, &peer) +} + +// Build a ledger with genesis and one block, start an HTTPServer around it, use NetworkFetcher to fetch the block. +// For smaller test, see ledgerService_test.go TestGetBlockHTTP +// todo - fix this one +func TestGetBlockHTTP(t *testing.T) { + // start server + ledger, next, b, err := buildTestLedger(t) + if err != nil { + t.Fatal(err) + return + } + net := buildTestHTTPPeerSource() + ls := rpcs.RegisterLedgerService(config.GetDefaultLocal(), ledger, net, "test genesisID") + + nodeA := basicRPCNode{} + nodeA.RegisterHTTPHandler(rpcs.LedgerServiceBlockPath, ls) + nodeA.start() + defer nodeA.stop() + rootURL := nodeA.rootURL() + + // run fetcher + net.addPeer(rootURL) + _, ok := net.GetPeers(network.PeersConnectedOut)[0].(network.HTTPPeer) + require.True(t, ok) + factory := MakeNetworkFetcherFactory(net, numberOfPeers, nil) + factory.log = logging.TestingLog(t) + fetcher := factory.New() + // we have one peer, the HTTP block server + require.Equal(t, len(fetcher.(*NetworkFetcher).peers), 1) + + var block *bookkeeping.Block + var cert *agreement.Certificate + var client FetcherClient + + start := time.Now() + block, cert, client, err = fetcher.FetchBlock(context.Background(), next) + end := time.Now() + require.NotNil(t, client) + require.NoError(t, err) + + require.True(t, end.Sub(start) < 10*time.Second) + require.Equal(t, &b, block) + if err == nil { + require.NotEqual(t, nil, block) + require.NotEqual(t, nil, cert) + } +} + +func nodePair() (*basicRPCNode, *basicRPCNode) { + nodeA := &basicRPCNode{} + nodeA.start() + nodeB := &basicRPCNode{} + nodeB.start() + httpPeerA := testHTTPPeer(nodeA.rootURL()) + httpPeerB := testHTTPPeer(nodeB.rootURL()) + nodeB.peers = []network.Peer{&httpPeerA} + nodeA.peers = []network.Peer{&httpPeerB} + return nodeA, nodeB +} + +func TestGetBlockMocked(t *testing.T) { + var user basics.Address + user[0] = 123 + + proto := config.Consensus[protocol.ConsensusCurrentVersion] + genesis := make(map[basics.Address]basics.AccountData) + genesis[user] = basics.AccountData{ + Status: basics.Online, + MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, + } + genesis[sinkAddr] = basics.AccountData{ + Status: basics.Online, + MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, + } + genesis[poolAddr] = basics.AccountData{ + Status: basics.Online, + MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, + } + + log := logging.TestingLog(t) + // A network with two nodes, A and B + nodeA, nodeB := nodePair() + defer nodeA.stop() + defer nodeB.stop() + + // A is running the ledger service and will respond to fetch requests + genBal := data.MakeGenesisBalances(genesis, sinkAddr, poolAddr) + const inMem = true + const archival = true + ledgerA, err := data.LoadLedger( + log.With("name", "A"), t.Name(), inMem, + protocol.ConsensusCurrentVersion, genBal, "", crypto.Digest{}, + nil, archival, + ) + if err != nil { + t.Errorf("Couldn't make ledger: %v", err) + } + rpcs.RegisterLedgerService(config.GetDefaultLocal(), ledgerA, nodeA, "test genesisID") + + next := ledgerA.NextRound() + genHash := crypto.Digest{0x42} + tx := transactions.Transaction{ + Type: protocol.PaymentTx, + Header: transactions.Header{ + Sender: user, + Fee: basics.MicroAlgos{Raw: proto.MinTxnFee}, + FirstValid: next, + LastValid: next, + GenesisHash: genHash, + }, + PaymentTxnFields: transactions.PaymentTxnFields{ + Receiver: user, + Amount: basics.MicroAlgos{Raw: 2}, + }, + } + signedtx := transactions.SignedTxn{ + Txn: tx, + } + + var b bookkeeping.Block + prev, err := ledgerA.Block(ledgerA.LastRound()) + require.NoError(t, err) + b.RewardsLevel = prev.RewardsLevel + b.BlockHeader.Round = next + b.BlockHeader.GenesisHash = genHash + b.CurrentProtocol = protocol.ConsensusCurrentVersion + txib, err := b.EncodeSignedTxn(signedtx, transactions.ApplyData{}) + require.NoError(t, err) + b.Payset = []transactions.SignedTxnInBlock{ + txib, + } + require.NoError(t, ledgerA.AddBlock(b, agreement.Certificate{Round: next})) + + // B tries to fetch block + factory := MakeNetworkFetcherFactory(nodeB, 10, nil) + factory.log = logging.TestingLog(t) + nodeBRPC := factory.New() + ctx, cf := context.WithTimeout(context.Background(), time.Second) + defer cf() + eblock, _, _, err := nodeBRPC.FetchBlock(ctx, next) + if err != nil { + require.Failf(t, "Error fetching block", "%v", err) + } + block, err := ledgerA.Block(next) + require.NoError(t, err) + if eblock.Hash() != block.Hash() { + t.Errorf("FetchBlock returned wrong block: expected %v; got %v", block.Hash(), eblock) + } +} + +func TestGetFutureBlock(t *testing.T) { + log := logging.TestingLog(t) + // A network with two nodes, A and B + nodeA, nodeB := nodePair() + defer nodeA.stop() + defer nodeB.stop() + + proto := config.Consensus[protocol.ConsensusCurrentVersion] + genesis := make(map[basics.Address]basics.AccountData) + genesis[sinkAddr] = basics.AccountData{ + Status: basics.Online, + MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, + } + genesis[poolAddr] = basics.AccountData{ + Status: basics.Online, + MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, + } + + gen := data.MakeGenesisBalances(genesis, sinkAddr, poolAddr) + // A is running the ledger service and will respond to fetch requests + const inMem = true + const archival = true + ledgerA, err := data.LoadLedger( + log.With("name", "A"), t.Name(), inMem, + protocol.ConsensusCurrentVersion, gen, "", crypto.Digest{}, + nil, archival, + ) + if err != nil { + t.Errorf("Couldn't make ledger: %v", err) + } + rpcs.RegisterLedgerService(config.GetDefaultLocal(), ledgerA, nodeA, "test genesisID") + + // B tries to fetch block 4 + factory := MakeNetworkFetcherFactory(nodeB, 10, nil) + factory.log = logging.TestingLog(t) + nodeBRPC := factory.New() + ctx, cf := context.WithTimeout(context.Background(), time.Second) + defer cf() + _, _, client, err := nodeBRPC.FetchBlock(ctx, ledgerA.NextRound()) + require.Error(t, err) + require.Nil(t, client) +} + +// implement network.UnicastPeer +type testUnicastPeer struct { + gn network.GossipNode + version string + responseChannels map[uint64]chan *network.Response + t *testing.T +} + +func (p *testUnicastPeer) GetAddress() string { + return "test" +} + +func (p *testUnicastPeer) Request(ctx context.Context, tag protocol.Tag, topics network.Topics) (resp *network.Response, e error) { + + responseChannel := make(chan *network.Response, 1) + p.responseChannels[0] = responseChannel + + ps := p.gn.(*httpTestPeerSource) + var dispather network.MessageHandler + for _, v := range ps.dispatchHandlers { + if v.Tag == tag { + dispather = v.MessageHandler + break + } + } + require.NotNil(p.t, dispather) + dispather.Handle(network.IncomingMessage{Tag: tag, Data: topics.MarshallTopics(), Sender: p, Net: p.gn}) + + // wait for the channel. + select { + case resp = <-responseChannel: + return resp, nil + case <-ctx.Done(): + return resp, ctx.Err() + } +} + +func (p *testUnicastPeer) Respond(ctx context.Context, reqMsg network.IncomingMessage, responseTopics network.Topics) (e error) { + + hashKey := uint64(0) + channel, found := p.responseChannels[hashKey] + if !found { + } + + select { + case channel <- &network.Response{Topics: responseTopics}: + default: + } + + return nil +} + +func (p *testUnicastPeer) Version() string { + return p.version +} + +func (p *testUnicastPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag) error { + ps := p.gn.(*httpTestPeerSource) + var dispather network.MessageHandler + for _, v := range ps.dispatchHandlers { + if v.Tag == tag { + dispather = v.MessageHandler + break + } + } + require.NotNil(p.t, dispather) + dispather.Handle(network.IncomingMessage{Tag: tag, Data: msg, Sender: p, Net: p.gn}) + return nil +} + +func makeTestUnicastPeer(gn network.GossipNode, version string, t *testing.T) network.UnicastPeer { + wsp := testUnicastPeer{} + wsp.gn = gn + wsp.t = t + wsp.version = version + wsp.responseChannels = make(map[uint64]chan *network.Response) + return &wsp +} + +// A quick GetBlock over websockets test hitting a mocked websocket server (no actual connection) +func TestGetBlockWS(t *testing.T) { + // test the WS fetcher: + // 1. fetcher sends UniCatchupReqTag to http peer + // 2. peer send message to gossip node + // 3. gossip node send message to ledger service + // 4. ledger service responds with UniCatchupResTag sending it back to the http peer + // 5. the http peer send it to the network + // 6. the network send it back to the fetcher + + // start server + ledger, next, b, err := buildTestLedger(t) + if err != nil { + t.Fatal(err) + return + } + + versions := []string{"1", "2.1"} + for _, version := range versions { // range network.SupportedProtocolVersions { + + net := buildTestHTTPPeerSource() + ledgerServiceConfig := config.GetDefaultLocal() + ledgerServiceConfig.CatchupParallelBlocks = 5 + ls := rpcs.RegisterLedgerService(ledgerServiceConfig, ledger, net, "test genesisID") + + ls.Start() + + up := makeTestUnicastPeer(net, version, t) + net.peers = append(net.peers, up) + + fs := rpcs.RegisterWsFetcherService(logging.TestingLog(t), net) + + _, ok := net.GetPeers(network.PeersConnectedIn)[0].(network.UnicastPeer) + require.True(t, ok) + factory := MakeNetworkFetcherFactory(net, numberOfPeers, fs) + factory.log = logging.TestingLog(t) + fetcher := factory.NewOverGossip(protocol.UniCatchupReqTag) + // we have one peer, the Ws block server + require.Equal(t, fetcher.NumPeers(), 1) + + var block *bookkeeping.Block + var cert *agreement.Certificate + var client FetcherClient + + // start := time.Now() + block, cert, client, err = fetcher.FetchBlock(context.Background(), next) + require.NotNil(t, client) + require.NoError(t, err) + // end := time.Now() + // require.True(t, end.Sub(start) < 10*time.Second) + require.Equal(t, &b, block) + if err == nil { + require.NotEqual(t, nil, block) + require.NotEqual(t, nil, cert) + } + fetcher.Close() + } +} diff --git a/rpcs/httpFetcher.go b/catchup/httpFetcher.go similarity index 90% rename from rpcs/httpFetcher.go rename to catchup/httpFetcher.go index 18bd05e4a9..e09d7d0587 100644 --- a/rpcs/httpFetcher.go +++ b/catchup/httpFetcher.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . -package rpcs +package catchup import ( "context" @@ -27,6 +27,7 @@ import ( "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/network" + "github.com/algorand/go-algorand/rpcs" ) // set max fetcher size to 5MB, this is enough to fit the block and certificate @@ -45,6 +46,7 @@ type FetcherClient interface { type HTTPFetcher struct { peer network.HTTPPeer rootURL string + net network.GossipNode client *http.Client @@ -52,8 +54,8 @@ type HTTPFetcher struct { } // MakeHTTPFetcher wraps an HTTPPeer so that we can get blocks from it -func MakeHTTPFetcher(log logging.Logger, peer network.HTTPPeer) (fc FetcherClient) { - fc = &HTTPFetcher{peer, peer.GetAddress(), peer.GetHTTPClient(), log} +func MakeHTTPFetcher(log logging.Logger, peer network.HTTPPeer, net network.GossipNode) (fc FetcherClient) { + fc = &HTTPFetcher{peer, peer.GetAddress(), net, peer.GetHTTPClient(), log} return } @@ -104,13 +106,13 @@ func (hf *HTTPFetcher) GetBlockBytes(ctx context.Context, r basics.Round) (data // TODO: Temporarily allow old and new content types so we have time for lazy upgrades // Remove this 'old' string after next release. const ledgerResponseContentTypeOld = "application/algorand-block-v1" - if contentTypes[0] != LedgerResponseContentType && contentTypes[0] != ledgerResponseContentTypeOld { + if contentTypes[0] != rpcs.LedgerResponseContentType && contentTypes[0] != ledgerResponseContentTypeOld { hf.log.Warnf("http block fetcher response has an invalid content type : %s", contentTypes[0]) response.Body.Close() return nil, fmt.Errorf("http block fetcher invalid content type '%s'", contentTypes[0]) } - return responseBytes(response, hf.log, fetcherMaxBlockBytes) + return rpcs.ResponseBytes(response, hf.log, fetcherMaxBlockBytes) } // Address is part of FetcherClient interface. diff --git a/catchup/service.go b/catchup/service.go index d906f6b3b1..fabcc5f565 100644 --- a/catchup/service.go +++ b/catchup/service.go @@ -63,7 +63,7 @@ type Service struct { syncStartNS int64 // at top of struct to keep 64 bit aligned for atomic.* ops cfg config.Local ledger Ledger - fetcherFactory rpcs.FetcherFactory + fetcherFactory FetcherFactory ctx context.Context cancel func() done chan struct{} @@ -81,7 +81,7 @@ type Service struct { lastSupportedRound basics.Round unmatchedPendingCertificates <-chan PendingUnmatchedCertificate - latestRoundFetcherFactory rpcs.FetcherFactory + latestRoundFetcherFactory FetcherFactory } // A BlockAuthenticator authenticates blocks given a certificate. @@ -102,13 +102,13 @@ func MakeService(log logging.Logger, config config.Local, net network.GossipNode s = &Service{} s.ctx, s.cancel = context.WithCancel(context.Background()) s.cfg = config - s.fetcherFactory = rpcs.MakeNetworkFetcherFactory(net, catchupPeersForSync, wsf) + s.fetcherFactory = MakeNetworkFetcherFactory(net, catchupPeersForSync, wsf) s.ledger = ledger s.net = net s.auth = auth s.unmatchedPendingCertificates = unmatchedPendingCertificates - s.latestRoundFetcherFactory = rpcs.MakeNetworkFetcherFactory(net, blockQueryPeerLimit, wsf) + s.latestRoundFetcherFactory = MakeNetworkFetcherFactory(net, blockQueryPeerLimit, wsf) s.log = log.With("Context", "sync") s.InitialSyncDone = make(chan struct{}) @@ -153,8 +153,8 @@ func (s *Service) SynchronizingTime() time.Duration { } // function scope to make a bunch of defer statements better -func (s *Service) innerFetch(fetcher rpcs.Fetcher, r basics.Round) (blk *bookkeeping.Block, cert *agreement.Certificate, rpcc rpcs.FetcherClient, err error) { - ctx, cf := context.WithTimeout(s.ctx, rpcs.DefaultFetchTimeout) +func (s *Service) innerFetch(fetcher Fetcher, r basics.Round) (blk *bookkeeping.Block, cert *agreement.Certificate, rpcc FetcherClient, err error) { + ctx, cf := context.WithTimeout(s.ctx, DefaultFetchTimeout) defer cf() stopWaitingForLedgerRound := make(chan struct{}) defer close(stopWaitingForLedgerRound) @@ -170,7 +170,7 @@ func (s *Service) innerFetch(fetcher rpcs.Fetcher, r basics.Round) (blk *bookkee // fetchAndWrite fetches a block, checks the cert, and writes it to the ledger. Cert checking and ledger writing both wait for the ledger to advance if necessary. // Returns false if we couldn't fetch or write (i.e., if we failed even after a given number of retries or if we were told to abort.) -func (s *Service) fetchAndWrite(fetcher rpcs.Fetcher, r basics.Round, prevFetchCompleteChan chan bool, lookbackComplete chan bool) bool { +func (s *Service) fetchAndWrite(fetcher Fetcher, r basics.Round, prevFetchCompleteChan chan bool, lookbackComplete chan bool) bool { i := 0 hasLookback := false for !fetcher.OutOfPeers(r) { @@ -287,7 +287,7 @@ func (s *Service) fetchAndWrite(fetcher rpcs.Fetcher, r basics.Round, prevFetchC type task func() basics.Round -func (s *Service) pipelineCallback(fetcher rpcs.Fetcher, r basics.Round, thisFetchComplete chan bool, prevFetchCompleteChan chan bool, lookbackChan chan bool) func() basics.Round { +func (s *Service) pipelineCallback(fetcher Fetcher, r basics.Round, thisFetchComplete chan bool, prevFetchCompleteChan chan bool, lookbackChan chan bool) func() basics.Round { return func() basics.Round { fetchResult := s.fetchAndWrite(fetcher, r, prevFetchCompleteChan, lookbackChan) @@ -483,7 +483,7 @@ func (s *Service) sync(cert *PendingUnmatchedCertificate) { seedLookback := uint64(2) proto, err := s.ledger.ConsensusParams(pr) if err != nil { - s.log.Errorf("catchup: could not get consensus parameters for round %v: $%v", pr, err) + s.log.Errorf("catchup: could not get consensus parameters for round %v: %v", pr, err) } else { seedLookback = proto.SeedLookback } @@ -578,9 +578,9 @@ func (s *Service) nextRoundIsNotSupported(nextRound basics.Round) bool { lastLedgerRound := s.ledger.LastRound() supportedUpgrades := config.Consensus - block, error := s.ledger.Block(lastLedgerRound) - if error != nil { - s.log.Errorf("nextRoundIsNotSupported: could not retrieve last block (%d) from the ledger.", lastLedgerRound) + block, err := s.ledger.Block(lastLedgerRound) + if err != nil { + s.log.Errorf("nextRoundIsNotSupported: could not retrieve last block (%d) from the ledger : %v", lastLedgerRound, err) return false } bh := block.BlockHeader diff --git a/catchup/service_test.go b/catchup/service_test.go index d12d313550..bed670a148 100644 --- a/catchup/service_test.go +++ b/catchup/service_test.go @@ -36,7 +36,6 @@ import ( "github.com/algorand/go-algorand/data/committee" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/rpcs" ) var defaultConfig = config.Local{ @@ -62,13 +61,13 @@ func makeMockFactory(fetcher *MockedFetcher) *MockedFetcherFactory { return &factory } -func (factory *MockedFetcherFactory) New() rpcs.Fetcher { +func (factory *MockedFetcherFactory) New() Fetcher { factory.mu.Lock() defer factory.mu.Unlock() return factory.fetcher } -func (factory *MockedFetcherFactory) NewOverGossip(tag protocol.Tag) rpcs.Fetcher { +func (factory *MockedFetcherFactory) NewOverGossip(tag protocol.Tag) Fetcher { return factory.New() } @@ -107,9 +106,9 @@ type MockedFetcher struct { mu deadlock.Mutex } -func (m *MockedFetcher) FetchBlock(ctx context.Context, round basics.Round) (*bookkeeping.Block, *agreement.Certificate, rpcs.FetcherClient, error) { +func (m *MockedFetcher) FetchBlock(ctx context.Context, round basics.Round) (*bookkeeping.Block, *agreement.Certificate, FetcherClient, error) { if m.timeout { - time.Sleep(rpcs.DefaultFetchTimeout + time.Second) + time.Sleep(DefaultFetchTimeout + time.Second) } time.Sleep(m.latency) diff --git a/rpcs/wsFetcher.go b/catchup/wsFetcher.go similarity index 96% rename from rpcs/wsFetcher.go rename to catchup/wsFetcher.go index 7005a1bb34..ef3cc3f4a8 100644 --- a/rpcs/wsFetcher.go +++ b/catchup/wsFetcher.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . -package rpcs +package catchup import ( "context" @@ -28,6 +28,7 @@ import ( "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/network" "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/rpcs" ) // Buffer messages from the network to have fewer drops. @@ -43,7 +44,7 @@ type WsFetcher struct { clients map[network.Peer]*wsFetcherClient // service - service *WsFetcherService + service *rpcs.WsFetcherService // metadata log logging.Logger @@ -53,7 +54,7 @@ type WsFetcher struct { // MakeWsFetcher creates a fetcher that fetches over the gossip network. // It instantiates a NetworkFetcher under the hood, registers as a handler for the given message tag, // and demuxes messages appropriately to the corresponding fetcher clients. -func MakeWsFetcher(log logging.Logger, tag protocol.Tag, peers []network.Peer, service *WsFetcherService) Fetcher { +func MakeWsFetcher(log logging.Logger, tag protocol.Tag, peers []network.Peer, service *rpcs.WsFetcherService) Fetcher { f := &WsFetcher{ log: log, tag: tag, @@ -104,7 +105,7 @@ func (wsf *WsFetcher) Close() { type wsFetcherClient struct { target network.UnicastPeer // the peer where we're going to send the request. tag protocol.Tag // the tag that is associated with the request/ - service *WsFetcherService // the fetcher service. This is where we perform the actual request and waiting for the response. + service *rpcs.WsFetcherService // the fetcher service. This is where we perform the actual request and waiting for the response. pendingCtxs map[context.Context]context.CancelFunc // a map of all the current pending contexts. closed bool // a flag indicating that the fetcher will not perform additional block retrivals. diff --git a/cmd/algod/main.go b/cmd/algod/main.go index 189581847f..f09ecbd2c0 100644 --- a/cmd/algod/main.go +++ b/cmd/algod/main.go @@ -159,6 +159,12 @@ func main() { log.Fatalf("Cannot load config: %v", err) } + err = config.LoadConfigurableConsensusProtocols(absolutePath) + if err != nil { + // log is not setup yet, this will log to stderr + log.Fatalf("Unable to load optional consensus protocols file: %v", err) + } + // Enable telemetry hook in daemon to send logs to cloud // If ALGOTEST env variable is set, telemetry is disabled - allows disabling telemetry for tests isTest := os.Getenv("ALGOTEST") != "" @@ -243,7 +249,23 @@ func main() { log.Fatalf("DefaultDeadlock is somehow not set to an expected value (enable / disable): %s", config.DefaultDeadlock) } - err = s.Initialize(cfg) + var phonebookAddresses []string + if peerOverrideArray != nil { + phonebookAddresses = peerOverrideArray + } else { + ex, err := os.Executable() + if err != nil { + log.Errorf("cannot locate node executable: %s", err) + } else { + phonebookDir := filepath.Dir(ex) + phonebookAddresses, err = config.LoadPhonebook(phonebookDir) + if err != nil { + log.Debugf("Cannot load static phonebook: %v", err) + } + } + } + + err = s.Initialize(cfg, phonebookAddresses) if err != nil { fmt.Fprintln(os.Stderr, err) log.Error(err) @@ -254,10 +276,6 @@ func main() { return } - if peerOverrideArray != nil { - s.OverridePhonebook(peerOverrideArray...) - } - deadlockState := "enabled" if deadlock.Opts.Disable { deadlockState = "disabled" diff --git a/cmd/auctionbank/main.go b/cmd/auctionbank/main.go index 2677345599..96bc25e0e5 100644 --- a/cmd/auctionbank/main.go +++ b/cmd/auctionbank/main.go @@ -402,7 +402,7 @@ func depositAuction(w http.ResponseWriter, r *http.Request) { var status depositStatus status.Success = true - status.SignedDepositNote = protocol.Encode(auction.NoteField{ + status.SignedDepositNote = protocol.Encode(&auction.NoteField{ Type: auction.NoteDeposit, SignedDeposit: sigDep, }) diff --git a/cmd/auctionmaster/main.go b/cmd/auctionmaster/main.go index 9072e1e023..bf2e9d0620 100644 --- a/cmd/auctionmaster/main.go +++ b/cmd/auctionmaster/main.go @@ -97,7 +97,7 @@ func readFile(filename string) ([]byte, error) { // atomicEncode writes the encoding of [obj] using atomicWrite func atomicEncode(filename string, obj interface{}) { - atomicWrite(filename, protocol.Encode(obj)) + atomicWrite(filename, protocol.EncodeReflect(obj)) } // readAndDecode reads data from [filename] using readFile, and @@ -108,7 +108,7 @@ func readAndDecode(filename string, obj interface{}) { panic(fmt.Sprintf("reading %s: %v", filename, err)) } - err = protocol.Decode(data, obj) + err = protocol.DecodeReflect(data, obj) if err != nil { panic(fmt.Sprintf("decoding from %s: %v", filename, err)) } @@ -140,7 +140,7 @@ func noteTxn(masterKey *crypto.SignatureSecrets, note auction.NoteField) transac Fee: basics.MicroAlgos{Raw: *notesFee}, FirstValid: basics.Round(*txnRound), LastValid: basics.Round(*txnRound + maxTxnLife), - Note: protocol.Encode(note), + Note: protocol.Encode(¬e), GenesisHash: genHash, }, PaymentTxnFields: transactions.PaymentTxnFields{ @@ -372,7 +372,7 @@ func settleAuction() { Msig: msigBase, } - paymentData = append(paymentData, protocol.Encode(signedTx)...) + paymentData = append(paymentData, protocol.Encode(&signedTx)...) } atomicWrite(fmt.Sprintf("auction%d.paymenttx", auctionID), paymentData) diff --git a/cmd/auctionminion/main.go b/cmd/auctionminion/main.go index 9d7b3e1c99..9bf4892398 100644 --- a/cmd/auctionminion/main.go +++ b/cmd/auctionminion/main.go @@ -235,7 +235,7 @@ func main() { fmt.Printf("Collected %d auctionmaster inputs\n", len(results)) outfile := fmt.Sprintf("auction%d.inputs", cfg.AuctionID) - err = ioutil.WriteFile(outfile, protocol.Encode(results), 0666) + err = ioutil.WriteFile(outfile, protocol.EncodeReflect(results), 0666) if err != nil { fmt.Printf("Cannot write to %s: %v\n", outfile, err) os.Exit(1) diff --git a/cmd/catchupsrv/main.go b/cmd/catchupsrv/main.go index e5f1129830..261a30d212 100644 --- a/cmd/catchupsrv/main.go +++ b/cmd/catchupsrv/main.go @@ -19,8 +19,11 @@ package main import ( "encoding/base64" "flag" + "fmt" "io/ioutil" + "math/rand" "net/http" + "os" "path" "strconv" @@ -35,6 +38,7 @@ import ( var addrFlag = flag.String("addr", "127.0.0.1:4160", "Address to listen on") var dirFlag = flag.String("dir", "", "Directory containing catchup blocks") +var tarDirFlag = flag.String("tardir", "", "Directory containing catchup blocks in M_N.tar.bz2") func main() { flag.Parse() @@ -42,8 +46,18 @@ func main() { log := logging.Base() log.SetLevel(logging.Info) - if *dirFlag == "" { - panic("Must specify -dir") + if *dirFlag == "" && *tarDirFlag == "" { + panic("Must specify -dir or -tardir") + } + + var blocktars *tarBlockSet + if *tarDirFlag != "" { + var err error + blocktars, err = openTarBlockDir(*tarDirFlag) + if err != nil { + fmt.Fprintf(os.Stderr, "%s: error opening block tar dir, %v\n", *tarDirFlag, err) + os.Exit(1) + } } if *downloadFlag { @@ -94,22 +108,33 @@ func main() { roundStr := pathVars["round"] genesisID := pathVars["genesisID"] - blkPath, err := stringBlockToPath(roundStr) + roundNumber, err := stringToBlock(roundStr) if err != nil { log.Infof("%s %s: %v", r.Method, r.URL, err) http.NotFound(w, r) return } - data, err := ioutil.ReadFile( - path.Join( - *dirFlag, - "v"+versionStr, - genesisID, - "block", - blkPath, - ), - ) + var data []byte + if *dirFlag != "" { + blkPath := blockToPath(roundNumber) + data, err = ioutil.ReadFile( + path.Join( + *dirFlag, + "v"+versionStr, + genesisID, + "block", + blkPath, + ), + ) + } else if blocktars != nil { + data, err = blocktars.getBlock(roundNumber) + } else { + fmt.Fprintf(os.Stderr, "config err, no block dir and no block tar dir\n") + defer os.Exit(1) + w.WriteHeader(http.StatusInternalServerError) + return + } if err != nil { log.Infof("%s %s: %v", r.Method, r.URL, err) http.NotFound(w, r) @@ -120,8 +145,12 @@ func main() { w.Header().Set("Content-Length", strconv.Itoa(len(data))) w.WriteHeader(http.StatusOK) w.Write(data) + if rand.Intn(20) == 0 { + log.Infof("OK %d", roundNumber) + } }) + log.Infof("serving %s", srv.Addr) err := srv.ListenAndServe() if err != nil { panic(err) diff --git a/cmd/catchupsrv/tarblocks.go b/cmd/catchupsrv/tarblocks.go new file mode 100644 index 0000000000..726add15c3 --- /dev/null +++ b/cmd/catchupsrv/tarblocks.go @@ -0,0 +1,228 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package main + +import ( + "archive/tar" + "compress/bzip2" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strconv" + "strings" + + "github.com/algorand/go-algorand/logging" + "github.com/algorand/go-deadlock" +) + +type tarBlockSet struct { + // known tarfiles + entries []*tarBlockFile + + // tarfiles with an open handle + // a cache with random replacement + open []*tarBlockFile + + // replacement index + nextOpen int + + l deadlock.Mutex +} + +const maxOpenTars = 3 + +func openTarBlockDir(path string) (tars *tarBlockSet, err error) { + out := &tarBlockSet{} + matches, err := filepath.Glob(filepath.Join(path, "*_*.tar.bz2")) + if err != nil { + return nil, err + } + out.entries = make([]*tarBlockFile, 0, len(matches)) + for _, path := range matches { + tbf := parseTarPathname(path) + if tbf != nil { + out.entries = append(out.entries, tbf) + } + } + logging.Base().Infof("found %d block tarfiles", len(out.entries)) + out.open = make([]*tarBlockFile, 0, maxOpenTars) + return out, nil +} + +func (tars *tarBlockSet) getBlock(round uint64) (data []byte, err error) { + tars.l.Lock() + defer tars.l.Unlock() + for _, tbf := range tars.open { + if tbf.first <= round && round <= tbf.last { + return tbf.getBlock(round) + } + } + for _, tbf := range tars.entries { + if tbf.first <= round && round <= tbf.last { + if len(tars.open) >= maxOpenTars { + tars.open[tars.nextOpen].close() + tars.open[tars.nextOpen] = tbf + tars.nextOpen = (tars.nextOpen + 1) % len(tars.open) + } else { + tars.open = append(tars.open, tbf) + } + return tbf.getBlock(round) + } + } + return nil, nil +} + +type tarBlockFile struct { + path string + first uint64 + last uint64 + + // fields valid when tarfile is open + rawFile io.ReadCloser + bz2Stream io.Reader + tarfile *tar.Reader + current *tar.Header + currentRound uint64 + + l deadlock.Mutex + + blocks map[uint64][]byte +} + +func parseTarPathname(path string) (tbf *tarBlockFile) { + fname := filepath.Base(path) + underscore := strings.IndexRune(fname, '_') + if underscore < 0 { + return nil + } + dottar := strings.Index(fname, ".tar") + if dottar < 0 { + return nil + } + first, err := strconv.ParseUint(fname[:underscore], 10, 64) + if err != nil { + return nil + } + last, err := strconv.ParseUint(fname[underscore+1:dottar], 10, 64) + if err != nil { + return nil + } + return &tarBlockFile{ + path: path, + first: first, + last: last, + } +} + +func (tbf *tarBlockFile) _open() (err error) { + if tbf.tarfile != nil { + logging.Base().Infof("%s already open", tbf.path) + return nil + } + tbf.rawFile, err = os.Open(tbf.path) + if err != nil { + err = fmt.Errorf("%s: os.open %v", tbf.path, err) + tbf.rawFile = nil + return + } + logging.Base().Infof("open %p %s", tbf, tbf.path) + if strings.HasSuffix(tbf.path, ".bz2") { + tbf.bz2Stream = bzip2.NewReader(tbf.rawFile) + tbf.tarfile = tar.NewReader(tbf.bz2Stream) + } else { + tbf.tarfile = tar.NewReader(tbf.rawFile) + } + tbf.blocks = make(map[uint64][]byte, 1000) + return nil +} + +func (tbf *tarBlockFile) close() (err error) { + tbf.l.Lock() + defer tbf.l.Unlock() + return tbf._close() +} + +func (tbf *tarBlockFile) _close() (err error) { + if tbf.rawFile != nil { + err = tbf.rawFile.Close() + logging.Base().Infof("close %p %s, %v", tbf, tbf.path, err) + tbf.rawFile = nil + tbf.bz2Stream = nil + tbf.tarfile = nil + tbf.current = nil + tbf.blocks = nil + } else { + logging.Base().Infof("close %p %s", tbf, tbf.path) + } + return +} + +func (tbf *tarBlockFile) getBlock(round uint64) (data []byte, err error) { + tbf.l.Lock() + defer tbf.l.Unlock() + if tbf.blocks != nil { + var ok bool + data, ok = tbf.blocks[round] + if ok { + return + } + } + //logging.Base().Infof("get block %d", round) + //defer logging.Base().Infof("get block %d done %v", round, err) + if tbf.tarfile == nil { + err = tbf._open() + if err != nil { + err = fmt.Errorf("%s: open, %v", tbf.path, err) + return + } + if tbf.tarfile == nil { + err = fmt.Errorf("%s: tarfile didn't open", tbf.path) + return + } + } + err = nil + for true { + tbf.current, err = tbf.tarfile.Next() + if err == io.EOF { + tbf._close() + // we don't have it + return nil, nil + } + if err != nil { + err = fmt.Errorf("%s: next, %v", tbf.path, err) + tbf._close() + return nil, err + } + tbf.currentRound, err = strconv.ParseUint(tbf.current.Name, 10, 64) + if err != nil { + err = fmt.Errorf("%s: could not parse block file name %#v, %v", tbf.path, tbf.current.Name, err) + return nil, err + } + data = make([]byte, tbf.current.Size) + _, err = io.ReadFull(tbf.tarfile, data) + if err != nil { + err = fmt.Errorf("%s: read %s, %v", tbf.path, tbf.current.Name, err) + } + tbf.blocks[tbf.currentRound] = data + if tbf.currentRound == round { + return + } + } + return nil, errors.New("this should be unreachable") +} diff --git a/cmd/genesis/newgenesis.go b/cmd/genesis/newgenesis.go index bba3d8d3b7..0b9fe51467 100644 --- a/cmd/genesis/newgenesis.go +++ b/cmd/genesis/newgenesis.go @@ -21,6 +21,7 @@ import ( "fmt" "log" + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/gen" "github.com/algorand/go-algorand/util" ) @@ -53,7 +54,7 @@ func main() { genesisData.NetworkName = *netName } - err = gen.GenerateGenesisFiles(genesisData, *outDir, !*quiet) + err = gen.GenerateGenesisFiles(genesisData, config.Consensus, *outDir, !*quiet) if err != nil { reportErrorf("Cannot write genesis files: %s", err) } diff --git a/cmd/goal/account.go b/cmd/goal/account.go index 157ca64367..7553a6c4b2 100644 --- a/cmd/goal/account.go +++ b/cmd/goal/account.go @@ -1018,6 +1018,7 @@ var importRootKeysCmd = &cobra.Command{ // Fetch an account.Participation from the database root, err := algodAcct.RestoreRoot(handle) + handle.Close() if err != nil { // Couldn't read it, skip it err = nil diff --git a/cmd/goal/clerk.go b/cmd/goal/clerk.go index 9159aad897..f2fb2c0213 100644 --- a/cmd/goal/clerk.go +++ b/cmd/goal/clerk.go @@ -207,7 +207,7 @@ func writeTxnToFile(client libgoal.Client, signTx bool, dataDir string, walletNa return err } // Write the SignedTxn to the output file - return writeFile(filename, protocol.Encode(stxn), 0600) + return writeFile(filename, protocol.Encode(&stxn), 0600) } func getProgramArgs() [][]byte { @@ -392,7 +392,7 @@ var sendCmd = &cobra.Command{ } } } else { - err = writeFile(txFilename, protocol.Encode(stx), 0600) + err = writeFile(txFilename, protocol.Encode(&stx), 0600) if err != nil { reportErrorf(err.Error()) } @@ -514,7 +514,7 @@ var rawsendCmd = &cobra.Command{ } fmt.Printf(" %s: %s\n", txid, errmsg) - rejectsData = append(rejectsData, protocol.Encode(txn)...) + rejectsData = append(rejectsData, protocol.Encode(&txn)...) } f, err := os.OpenFile(rejectsFilename, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666) @@ -669,7 +669,7 @@ var signCmd = &cobra.Command{ } } - outData = append(outData, protocol.Encode(signedTxn)...) + outData = append(outData, protocol.Encode(&signedTxn)...) count++ } err = writeFile(outFilename, outData, 0600) @@ -715,7 +715,7 @@ var groupCmd = &cobra.Command{ var outData []byte for _, txn := range txns { txn.Txn.Group = crypto.HashObj(group) - outData = append(outData, protocol.Encode(txn)...) + outData = append(outData, protocol.Encode(&txn)...) } err = writeFile(outFilename, outData, 0600) @@ -756,7 +756,7 @@ var splitCmd = &cobra.Command{ outBase := outFilename[:len(outFilename)-len(outExt)] for idx, txn := range txns { fn := fmt.Sprintf("%s-%d%s", outBase, idx, outExt) - err = writeFile(fn, protocol.Encode(txn), 0600) + err = writeFile(fn, protocol.Encode(&txn), 0600) if err != nil { reportErrorf(fileWriteError, outFilename, err) } @@ -850,7 +850,7 @@ var compileCmd = &cobra.Command{ reportErrorf(errorSigningTX, err) } ls := transactions.LogicSig{Logic: program, Sig: signature} - outblob = protocol.Encode(ls) + outblob = protocol.Encode(&ls) } if !noProgramOutput { fout, err := os.Create(outname) diff --git a/cmd/goal/inspect.go b/cmd/goal/inspect.go index 8b81568a4d..f00b189c22 100644 --- a/cmd/goal/inspect.go +++ b/cmd/goal/inspect.go @@ -106,7 +106,7 @@ func inspectTxn(stxn transactions.SignedTxn) (sti inspectSignedTxn, err error) { err = fmt.Errorf("non-idempotent transformation to inspectSignedTxn (DeepEqual)") return } - if !reflect.DeepEqual(protocol.Encode(sti), protocol.Encode(stxn)) { + if !reflect.DeepEqual(protocol.EncodeReflect(sti), protocol.Encode(&stxn)) { err = fmt.Errorf("non-idempotent transformation to inspectSignedTxn (protocol.Encode)") return } diff --git a/cmd/goal/messages.go b/cmd/goal/messages.go index 5e96e58268..2bc7b221ca 100644 --- a/cmd/goal/messages.go +++ b/cmd/goal/messages.go @@ -66,6 +66,7 @@ const ( errorNodeRunning = "Node must be stopped before writing APIToken" errorNodeFailGenToken = "Cannot generate API token: %s" errorNodeCreation = "Error during node creation: %v" + errorNodeManagedBySystemd = "This node is managed by systemd, you must run the following command to make your desired state change to your node:\n\nsystemctl %s algorand.service" errorKill = "Cannot kill node: %s" errorCloningNode = "Error cloning the node: %s" infoNodeCloned = "Node cloned successfully to: %s" @@ -116,6 +117,22 @@ const ( multisigProgramCollision = "should have at most one of --program/-p | --program-bytes/-P | --lsig/-L" + tealsignMutKeyArgs = "--keyfile and --account are mutually exclusive" + tealsignMutLsigArgs = "Need exactly one of --contract-addr or --lsig-txn" + tealsignKeyfileFail = "Failed to read keyfile: %v" + tealsignNoWithAcct = "--account is not yet supported" + tealsignEmptyLogic = "LogicSig must have non-empty program" + tealsignParseAddr = "Failed to parse contract addr: %v" + tealsignParseData = "Failed to parse data to sign: %v" + tealsignParseb64 = "failed to base64 decode data to sign: %v" + tealsignParseb32 = "failed to base32 decode data to sign: %v" + tealsignTxIDLsigReq = "--sign-txid requires --lsig-txn" + tealsignSetArgLsigReq = "--set-lsig-arg-idx requires --lsig-txn" + tealsignDataReq = "need exactly one of --sign-txid, --data-file, --data-b64, or --data-b32" + tealsignInfoSig = "Generated signature: %s" + tealsignTooManyArg = "--set-lsig-arg-idx too large, maximum of %d arguments" + tealsignInfoWroteSig = "Wrote signature for %s to LSig.Args[%d]" + // Wallet infoRecoveryPrompt = "Please type your recovery mnemonic below, and hit return when you are done: " infoChoosePasswordPrompt = "Please choose a password for wallet '%s': " diff --git a/cmd/goal/multisig.go b/cmd/goal/multisig.go index d58f733761..5198e549ad 100644 --- a/cmd/goal/multisig.go +++ b/cmd/goal/multisig.go @@ -126,7 +126,7 @@ var addSigCmd = &cobra.Command{ // The following line makes stxn.cachedEncodingLen incorrect, but it's okay because we're just serializing it to a file stxn.Msig = msig - outData = append(outData, protocol.Encode(stxn)...) + outData = append(outData, protocol.Encode(&stxn)...) } err = writeFile(txFilename, outData, 0600) @@ -214,7 +214,7 @@ var signProgramCmd = &cobra.Command{ reportErrorf(errorSigningTX, err) } lsig.Msig = msig - lsigblob := protocol.Encode(lsig) + lsigblob := protocol.Encode(&lsig) err = writeFile(outname, lsigblob, 0600) if err != nil { reportErrorf("%s: %s", outname, err) @@ -284,7 +284,7 @@ var mergeSigCmd = &cobra.Command{ // Write out the transactions to the output file var mergedData []byte for _, txn := range mergedTxns { - mergedData = append(mergedData, protocol.Encode(txn)...) + mergedData = append(mergedData, protocol.Encode(&txn)...) } err := writeFile(txFilename, mergedData, 0600) diff --git a/cmd/goal/network.go b/cmd/goal/network.go index 75b2153525..3b34a23265 100644 --- a/cmd/goal/network.go +++ b/cmd/goal/network.go @@ -93,7 +93,7 @@ var networkCreateCmd = &cobra.Command{ panic(err) } - network, err := netdeploy.CreateNetworkFromTemplate(networkName, networkRootDir, networkTemplateFile, binDir, !noImportKeys, nil) + network, err := netdeploy.CreateNetworkFromTemplate(networkName, networkRootDir, networkTemplateFile, binDir, !noImportKeys, nil, nil) if err != nil { if noClean { reportInfof(" ** failed ** - Preserving network rootdir '%s'", networkRootDir) diff --git a/cmd/goal/node.go b/cmd/goal/node.go index eeaf7844b2..d44dba2d53 100644 --- a/cmd/goal/node.go +++ b/cmd/goal/node.go @@ -107,6 +107,10 @@ var startCmd = &cobra.Command{ panic(err) } onDataDirs(func(dataDir string) { + if libgoal.AlgorandDaemonSystemdManaged(dataDir) { + reportErrorf(errorNodeManagedBySystemd, "start") + } + nc := nodecontrol.MakeNodeController(binDir, dataDir) nodeArgs := nodecontrol.AlgodStartArgs{ PeerAddress: peerDial, @@ -153,6 +157,10 @@ var stopCmd = &cobra.Command{ panic(err) } onDataDirs(func(dataDir string) { + if libgoal.AlgorandDaemonSystemdManaged(dataDir) { + reportErrorf(errorNodeManagedBySystemd, "stop") + } + nc := nodecontrol.MakeNodeController(binDir, dataDir) log.Info(infoTryingToStopNode) @@ -177,6 +185,10 @@ var restartCmd = &cobra.Command{ panic(err) } onDataDirs(func(dataDir string) { + if libgoal.AlgorandDaemonSystemdManaged(dataDir) { + reportErrorf(errorNodeManagedBySystemd, "restart") + } + nc := nodecontrol.MakeNodeController(binDir, dataDir) _, err = nc.GetAlgodPID() diff --git a/cmd/goal/tealsign.go b/cmd/goal/tealsign.go new file mode 100644 index 0000000000..d0a6e7af30 --- /dev/null +++ b/cmd/goal/tealsign.go @@ -0,0 +1,229 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package main + +import ( + "encoding/base32" + "encoding/base64" + "io/ioutil" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/data/transactions" + "github.com/algorand/go-algorand/data/transactions/logic" + "github.com/algorand/go-algorand/protocol" + + "github.com/spf13/cobra" +) + +var ( + keyFilename string + signerAcct string + lsigTxnFilename string + contractAddr string + signTxID bool + dataFile string + datab64 string + datab32 string + setLsigArg int +) + +func init() { + clerkCmd.AddCommand(tealsignCmd) + + tealsignCmd.Flags().StringVar(&keyFilename, "keyfile", "", "algokey private key file to sign with") + tealsignCmd.Flags().StringVar(&signerAcct, "account", "", "Address of account to sign with") + tealsignCmd.Flags().StringVar(&lsigTxnFilename, "lsig-txn", "", "Transaction with logicsig to sign data for") + tealsignCmd.Flags().StringVar(&contractAddr, "contract-addr", "", "Contract address to sign data for. not necessary if --lsig-txn is provided") + tealsignCmd.Flags().BoolVar(&signTxID, "sign-txid", false, "Use the txid of --lsig-txn as the data to sign") + tealsignCmd.Flags().StringVar(&dataFile, "data-file", "", "Data file to sign") + tealsignCmd.Flags().StringVar(&datab64, "data-b64", "", "base64 data to sign") + tealsignCmd.Flags().StringVar(&datab32, "data-b32", "", "base32 data to sign") + tealsignCmd.Flags().IntVar(&setLsigArg, "set-lsig-arg-idx", -1, "If --lsig-txn is also specified, set the lsig arg at this index to the raw signature bytes. Overwrites any existing argument at this index. Updates --lsig-txn file in place. nil args will be appended until index is valid.") +} + +var tealsignCmd = &cobra.Command{ + Use: "tealsign", + Short: "Sign data to be verified in a TEAL program", + Long: `Sign data to be verified in a TEAL program. + +Data verified by the ed25519verify TEAL opcode must be domain separated. As part of this process, the signed payload includes the hash of the program logic. This hash must be specified. To do this, provide a transaction whose logic sig contains the program via --lsig-txn, or provide a contract address directly with --contract-addr. These options are mutually exclusive. + +Next, you must specify the data to be signed. When using --lsig-txn, you can use the --sign-txid flag to sign that transaction's txid. Alternatively, arbitrary data can be signed with the --data-file, --data-b64, or --data-b32 options. These options are mutually exclusive. + +The base64 encoding of the signature will always be printed to stdout. Optionally, when using --lsig-txn, you may specify that the signature be used as a TEAL argument for that transaction. Specify the argument index with the --set-lsig-arg-idx flag. The --lsig-txn file will be updated in place, and any existing argument at that index will be overwritten.`, + Args: validateNoPosArgsFn, + Run: func(cmd *cobra.Command, args []string) { + /* + * First, fetch the key for signing + */ + + if keyFilename != "" && signerAcct != "" { + reportErrorf(tealsignMutKeyArgs) + } + + var kdata []byte + var err error + if keyFilename != "" { + kdata, err = ioutil.ReadFile(keyFilename) + if err != nil { + reportErrorf(tealsignKeyfileFail, err) + } + } + + // --account not yet supported, coming in another PR + // (need to add kmd support for signing logicsig data) + if signerAcct != "" { + reportErrorf(tealsignNoWithAcct) + } + + // Create signature secrets from the seed + var seed crypto.Seed + copy(seed[:], kdata) + sec := crypto.GenerateSignatureSecrets(seed) + + /* + * Next, fetch the hash of the program for use in the domain + * separated signature payload + */ + + var lsigHashArgs int + if lsigTxnFilename != "" { + lsigHashArgs++ + } + if contractAddr != "" { + lsigHashArgs++ + } + + // Ensure there is one unambiguous source of program hash + if lsigHashArgs != 1 { + reportErrorf(tealsignMutLsigArgs) + } + + var progHash crypto.Digest + var stxn transactions.SignedTxn + if lsigTxnFilename != "" { + // If passed a SignedTxn with a logic sig, compute + // the hash of the program within the logic sig + stxnBytes, err := ioutil.ReadFile(lsigTxnFilename) + if err != nil { + reportErrorf(fileReadError, lsigTxnFilename, err) + } + + err = protocol.Decode(stxnBytes, &stxn) + if err != nil { + reportErrorf(txDecodeError, lsigTxnFilename, err) + } + + // Ensure signed transaction has a logic sig with a + // program + if len(stxn.Lsig.Logic) == 0 { + reportErrorf(tealsignEmptyLogic) + } + + progHash = crypto.HashObj(logic.Program(stxn.Lsig.Logic)) + } else { + // Otherwise, the contract address is the logic hash + parsedAddr, err := basics.UnmarshalChecksumAddress(contractAddr) + if err != nil { + reportErrorf(tealsignParseAddr, err) + } + + // Copy parsed address as program hash + copy(progHash[:], parsedAddr[:]) + } + + /* + * Next, fetch the data to sign + */ + + var dataArgs int + var dataToSign []byte + + if dataFile != "" { + dataToSign, err = ioutil.ReadFile(dataFile) + if err != nil { + reportErrorf(tealsignParseData, err) + } + dataArgs++ + } + if datab64 != "" { + dataToSign, err = base64.StdEncoding.DecodeString(datab64) + if err != nil { + reportErrorf(tealsignParseb64, err) + } + dataArgs++ + } + if datab32 != "" { + dataToSign, err = base32.StdEncoding.WithPadding(base32.NoPadding).DecodeString(datab32) + if err != nil { + reportErrorf(tealsignParseb32, err) + } + dataArgs++ + } + if signTxID { + if lsigTxnFilename == "" { + reportErrorf(tealsignTxIDLsigReq) + } + txid := stxn.Txn.ID() + dataToSign = txid[:] + dataArgs++ + } + + // Ensure there is one unambiguous source of data + if dataArgs != 1 { + reportErrorf(tealsignDataReq) + } + + /* + * Sign the payload + */ + + signature := sec.Sign(logic.Msg{ + ProgramHash: progHash, + Data: dataToSign, + }) + + /* + * If requested, fill in logic sig arg + */ + + if setLsigArg >= 0 { + if lsigTxnFilename == "" { + reportErrorf(tealsignSetArgLsigReq) + } + if setLsigArg > transactions.EvalMaxArgs-1 { + reportErrorf(tealsignTooManyArg, transactions.EvalMaxArgs) + } + for len(stxn.Lsig.Args) < setLsigArg+1 { + stxn.Lsig.Args = append(stxn.Lsig.Args, nil) + } + stxn.Lsig.Args[setLsigArg] = signature[:] + + // Write out the modified stxn + err = writeFile(lsigTxnFilename, protocol.Encode(&stxn), 0600) + if err != nil { + reportErrorf(fileWriteError, lsigTxnFilename, err) + } + reportInfof(tealsignInfoWroteSig, lsigTxnFilename, setLsigArg) + } + + // Always print signature to stdout + signatureb64 := base64.StdEncoding.EncodeToString(signature[:]) + reportInfof(tealsignInfoSig, signatureb64) + }, +} diff --git a/cmd/kmd/codes/codes.go b/cmd/kmd/codes/codes.go index ba8d86992c..752c05a193 100644 --- a/cmd/kmd/codes/codes.go +++ b/cmd/kmd/codes/codes.go @@ -17,8 +17,6 @@ package codes const ( - // ExitCodeKMDInvalidArgs is returned if any cli arguments are invalid - ExitCodeKMDInvalidArgs = 1 // ExitCodeKMDLogError is returned if we can't open the log file ExitCodeKMDLogError = 2 // ExitCodeKMDError is the catch-all exit code for most kmd errors diff --git a/cmd/kmd/main.go b/cmd/kmd/main.go index 60f49cc77a..27cf2f7202 100644 --- a/cmd/kmd/main.go +++ b/cmd/kmd/main.go @@ -17,13 +17,15 @@ package main import ( - "flag" + "fmt" "os" "os/signal" "path/filepath" "time" "golang.org/x/sys/unix" + "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" "github.com/algorand/go-algorand/cmd/kmd/codes" "github.com/algorand/go-algorand/daemon/kmd" @@ -36,30 +38,44 @@ const ( kmdLogFilePerm = 0640 ) -func main() { - dataDir := flag.String("d", "", "kmd data directory") - timeoutSecs := flag.Uint("t", 0, "number of seconds after which to kill kmd if there are no requests. 0 means no timeout.") - flag.Parse() +var ( + dataDir string + timeoutSecs uint64 +) + +func init() { + kmdCmd.Flags().StringVarP(&dataDir, "data-dir", "d", "", "kmd data directory.") + kmdCmd.Flags().Uint64VarP(&timeoutSecs, "timout-secs", "t", 0, "Number of seconds that kmd will run for before termination.") + kmdCmd.MarkFlagRequired("data-dir") +} +var kmdCmd = &cobra.Command{ + Use: "kmd", + Short: "Key Management Daemon (kmd)", + Long: `The Key Management Daemon (kmd) is a low level wallet and key management +tool. It works in conjunction with algod and goal to keep secrets safe. An +optional timeout flag will automatically terminate kmd after a number of +seconds has elapsed, allowing a simple way to ensure kmd will be shutdown in +a timely manner. This is a blocking command.`, + Run: func(cmd *cobra.Command, args []string) { + runKmd(dataDir, timeoutSecs) + }, +} + +func runKmd(dataDir string, timeoutSecs uint64) { // Use logging package instead of stdin/stdout log := logging.NewLogger() log.SetLevel(logging.Info) - // Validate flags - if *dataDir == "" { - log.Errorf("dataDir (-d) is a required argument") - os.Exit(codes.ExitCodeKMDInvalidArgs) - } - // Parse timeout duration. 0 timeout -> nil timeout var timeout *time.Duration - if *timeoutSecs != 0 { - t := time.Duration(*timeoutSecs) * time.Second + if timeoutSecs != 0 { + t := time.Duration(timeoutSecs) * time.Second timeout = &t } // We have a dataDir now, so use log files - kmdLogFilePath := filepath.Join(*dataDir, kmdLogFileName) + kmdLogFilePath := filepath.Join(dataDir, kmdLogFileName) kmdLogFileMode := os.O_CREATE | os.O_WRONLY | os.O_APPEND logFile, err := os.OpenFile(kmdLogFilePath, kmdLogFileMode, kmdLogFilePerm) if err != nil { @@ -82,7 +98,7 @@ func main() { // Build a kmd StartConfig startConfig := kmd.StartConfig{ - DataDir: *dataDir, + DataDir: dataDir, Kill: kill, Log: log, Timeout: timeout, @@ -105,3 +121,21 @@ func main() { <-died log.Infof("kmd server died. exiting...") } + +func main() { + // Hidden command to generate docs in a given directory + // kmd generate-docs [path] + if len(os.Args) == 3 && os.Args[1] == "generate-docs" { + err := doc.GenMarkdownTree(kmdCmd, os.Args[2]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + os.Exit(0) + } + + if err := kmdCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/cmd/netdummy/main.go b/cmd/netdummy/main.go index e12cbc1118..648482dfa6 100644 --- a/cmd/netdummy/main.go +++ b/cmd/netdummy/main.go @@ -47,12 +47,13 @@ func main() { log.SetLevel(logging.Debug) log.SetOutput(os.Stderr) - addrs := network.MakeArrayPhonebook() - addrs.Entries.ReplacePeerList([]string{*serverAddress}) - var nodes []network.GossipNode for i := 0; i < *numClients; i++ { - n, _ := network.NewWebsocketGossipNode(log, conf, addrs, *genesisID, protocol.NetworkID(*networkID)) + n, _ := network.NewWebsocketGossipNode(log, + conf, + []string{*serverAddress}, + *genesisID, + protocol.NetworkID(*networkID)) n.Start() nodes = append(nodes, n) } diff --git a/cmd/netgoal/generate.go b/cmd/netgoal/generate.go index 6042a9329e..5f845dfd4b 100644 --- a/cmd/netgoal/generate.go +++ b/cmd/netgoal/generate.go @@ -19,6 +19,7 @@ package main import ( "encoding/json" "errors" + "math/big" "math/rand" "os" "regexp" @@ -28,6 +29,7 @@ import ( "github.com/spf13/cobra" "github.com/algorand/go-algorand/gen" + "github.com/algorand/go-algorand/netdeploy" "github.com/algorand/go-algorand/netdeploy/remote" "github.com/algorand/go-algorand/util/codecs" ) @@ -67,7 +69,8 @@ func init() { } var generateTemplateLines = []string{ - "net => network template according to -R -N -n -w options", + "net => network template according to -R -N -n -w options. Suitable for 'netgoal build'", + "goalnet => goal network template according to -R -n -w options. Suitable for 'goal network'", "genesis => genesis.json according to -w option", "otwt => OneThousandWallets network template", "otwg => OneThousandWallets genesis data", @@ -123,13 +126,14 @@ template modes for -t:`, } else { baseRelay = baseNode } - switch strings.ToLower(templateToGenerate) { + templateType := strings.ToLower(templateToGenerate) + switch templateType { case "genesis", "wallets": if walletsToGenerate < 0 { reportErrorf("must specify number of wallets with -w") } err = generateWalletGenesis(outputFilename, walletsToGenerate, nonPartnodesHostsToGenerate) - case "net", "network": + case "net", "network", "goalnet": if walletsToGenerate < 0 { reportErrorf("must specify number of wallets with -w") } @@ -142,8 +146,11 @@ template modes for -t:`, if relaysToGenerate < 0 { reportErrorf("must specify number of relays with -R") } - - err = generateNetworkTemplate(outputFilename, walletsToGenerate, relaysToGenerate, nodeHostsToGenerate, nodesToGenerate, nonPartnodesHostsToGenerate, baseNode, baseNonParticipatingNode, baseRelay) + if templateType == "goalnet" { + err = generateNetworkGoalTemplate(outputFilename, walletsToGenerate, relaysToGenerate, nodesToGenerate, nonPartnodesHostsToGenerate) + } else { + err = generateNetworkTemplate(outputFilename, walletsToGenerate, relaysToGenerate, nodeHostsToGenerate, nodesToGenerate, nonPartnodesHostsToGenerate, baseNode, baseNonParticipatingNode, baseRelay) + } case "otwt": err = generateNetworkTemplate(outputFilename, 1000, 10, 20, 100, 0, baseNode, baseNonParticipatingNode, baseRelay) case "otwg": @@ -202,6 +209,82 @@ func pickNodeConfig(alt []remote.NodeConfig, name string) remote.NodeConfig { return alt[0] } +func generateNetworkGoalTemplate(templateFilename string, wallets, relays, nodes, npnHosts int) error { + template := netdeploy.NetworkTemplate{} + template.Nodes = make([]remote.NodeConfigGoal, 0, relays+nodes+npnHosts) + template.Genesis = generateWalletGenesisData(walletsToGenerate, 0) + for i := 0; i < relays; i++ { + name := "relay" + strconv.Itoa(i+1) + newNode := remote.NodeConfigGoal{ + Name: name, + IsRelay: true, + Wallets: nil, + } + template.Nodes = append(template.Nodes, newNode) + } + + for i := 0; i < nodes; i++ { + name := "node" + strconv.Itoa(i+1) + newNode := remote.NodeConfigGoal{ + Name: name, + Wallets: make([]remote.NodeWalletData, 0), + } + template.Nodes = append(template.Nodes, newNode) + } + + for i := 0; i < npnHosts; i++ { + name := "nonParticipatingNode" + strconv.Itoa(i+1) + newNode := remote.NodeConfigGoal{ + Name: name, + Wallets: make([]remote.NodeWalletData, 0), + } + template.Nodes = append(template.Nodes, newNode) + } + walletIndex := 0 + for walletIndex < wallets { + for nodei, node := range template.Nodes { + if node.Name[0:4] != "node" { + continue + } + wallet := remote.NodeWalletData{ + Name: "Wallet" + strconv.Itoa(walletIndex+1), + ParticipationOnly: false, + } + template.Nodes[nodei].Wallets = append(template.Nodes[nodei].Wallets, wallet) + walletIndex++ + if walletIndex >= wallets { + break + } + } + if walletIndex >= wallets { + break + } + } + + if npnHosts > 0 { + for walletIndex < wallets { + for nodei, node := range template.Nodes { + if node.Name[0:4] != "nonP" { + continue + } + wallet := remote.NodeWalletData{ + Name: "Wallet" + strconv.Itoa(walletIndex+1), + ParticipationOnly: false, + } + template.Nodes[nodei].Wallets = append(template.Nodes[nodei].Wallets, wallet) + walletIndex++ + if walletIndex >= wallets { + break + } + } + if walletIndex >= wallets { + break + } + } + } + return saveGoalTemplateToDisk(template, templateFilename) +} + func generateNetworkTemplate(templateFilename string, wallets, relays, nodeHosts, nodes, npnHosts int, baseNode, baseNonPartNode, baseRelay remote.NodeConfig) error { network := remote.DeployedNetworkConfig{} @@ -332,30 +415,50 @@ func saveTemplateToDisk(template remote.DeployedNetworkConfig, filename string) return err } -func generateWalletGenesis(filename string, wallets, npnHosts int) error { +func saveGoalTemplateToDisk(template netdeploy.NetworkTemplate, filename string) error { + f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + if err == nil { + defer f.Close() + + enc := codecs.NewFormattedJSONEncoder(f) + err = enc.Encode(template) + } + return err +} + +func generateWalletGenesisData(wallets, npnHosts int) gen.GenesisData { data := gen.DefaultGenesis if npnHosts > 0 { wallets = 2 * wallets } data.Wallets = make([]gen.WalletData, wallets) - stake := 100.0 / float64(wallets) + stake := big.NewRat(int64(100), int64(wallets)) + + ratZero := big.NewRat(int64(0), int64(1)) + ratHundred := big.NewRat(int64(100), int64(1)) - stakeSum := float64(0) + stakeSum := new(big.Rat).Set(ratZero) for i := 0; i < wallets; i++ { if i == (wallets - 1) { // use the last wallet to workaround roundoff and get back to 1.0 - stake = 100.0 - stakeSum + stake = stake.Sub(new(big.Rat).Set(ratHundred), stakeSum) } + floatStake, _ := stake.Float64() w := gen.WalletData{ Name: "Wallet" + strconv.Itoa(i+1), // Wallet names are 1-based for this template - Stake: stake, + Stake: floatStake, } if (i < (wallets / 2)) || (npnHosts == 0) { w.Online = true } - stakeSum += stake + stakeSum = stakeSum.Add(stakeSum, stake) data.Wallets[i] = w } + return data +} + +func generateWalletGenesis(filename string, wallets, npnHosts int) error { + data := generateWalletGenesisData(wallets, npnHosts) return saveGenesisDataToDisk(data, filename) } diff --git a/cmd/updater/update.sh b/cmd/updater/update.sh index 9b4ed5d2a8..14ec51b924 100755 --- a/cmd/updater/update.sh +++ b/cmd/updater/update.sh @@ -138,8 +138,88 @@ function determine_current_version() { echo Current Version = ${CURRENTVER} } +function get_updater_url() { + local UNAME + local OS + local ARCH + UNAME=$(uname) + if [[ "${UNAME}" = "Darwin" ]]; then + OS="darwin" + UNAME=$(uname -m) + if [[ "${UNAME}" = "x86_64" ]]; then + ARCH="amd64" + else + echo "This platform ${UNAME} is not supported by updater." + exit 1 + fi + elif [[ "${UNAME}" = "Linux" ]]; then + OS="linux" + UNAME=$(uname -m) + if [[ "${UNAME}" = "x86_64" ]]; then + ARCH="amd64" + elif [[ "${UNAME}" = "armv6l" ]]; then + ARCH="arm" + elif [[ "${UNAME}" = "armv7l" ]]; then + ARCH="arm" + elif [[ "${UNAME}" = "aarch64" ]]; then + ARCH="arm64" + else + echo "This platform ${UNAME} is not supported by updater." + exit 1 + fi + else + echo "This operation system ${UNAME} is not supported by updater." + exit 1 + fi + UPDATER_FILENAME="install_master_${OS}-${ARCH}.tar.gz" + UPDATER_URL="https://github.com/algorand/go-algorand-doc/raw/master/downloads/installers/${OS}_${ARCH}/${UPDATER_FILENAME}" +} + +# check to see if the binary updater exists. if not, it will automatically the correct updater binary for the current platform +function check_for_updater() { + # check if the updater binary exist. + if [ -f "${SCRIPTPATH}/updater" ]; then + return 0 + fi + get_updater_url + + # check the curl is available. + CURL_VER=$(curl -V 2>/dev/null || true) + if [ "${CURL_VER}" = "" ]; then + # no curl is installed. + echo "updater binary is missing and cannot be downloaded since curl is missing." + if [[ "$(uname)" = "Linux" ]]; then + echo "To install curl, run the following command:" + echo "apt-get update; apt-get install -y curl" + fi + exit 1 + fi + + CURL_OUT=$(curl -LJO --silent ${UPDATER_URL}) + if [ "$?" != "0" ]; then + echo "failed to download updater binary from ${UPDATER_URL} using curl." + echo "${CURL_OUT}" + exit 1 + fi + + if [ ! -f "${SCRIPTPATH}/${UPDATER_FILENAME}" ]; then + echo "downloaded file ${SCRIPTPATH}/${UPDATER_FILENAME} is missing." + exit + fi + + tar -zxvf "${SCRIPTPATH}/${UPDATER_FILENAME}" updater + if [ "$?" != "0" ]; then + echo "failed to extract updater binary from ${SCRIPTPATH}/${UPDATER_FILENAME}" + exit 1 + fi + + rm -f "${SCRIPTPATH}/${UPDATER_FILENAME}" + echo "updater binary was downloaded" +} + function check_for_update() { determine_current_version + check_for_updater LATEST="$(${SCRIPTPATH}/updater ver check -c ${CHANNEL} ${BUCKET} | sed -n '2 p')" if [ $? -ne 0 ]; then echo "No remote updates found" diff --git a/components/mocks/mockNetwork.go b/components/mocks/mockNetwork.go index 92ee3af726..3076693be1 100644 --- a/components/mocks/mockNetwork.go +++ b/components/mocks/mockNetwork.go @@ -56,6 +56,10 @@ func (network *MockNetwork) Stop() { func (network *MockNetwork) RequestConnectOutgoing(replace bool, quit <-chan struct{}) { } +// Disconnect - unused function +func (network *MockNetwork) Disconnect(badpeer network.Peer) { +} + // DisconnectPeers - unused function func (network *MockNetwork) DisconnectPeers() { } @@ -69,6 +73,11 @@ func (network *MockNetwork) GetPeers(options ...network.PeerOption) []network.Pe return nil } +// GetRoundTripper -- returns the network round tripper +func (network *MockNetwork) GetRoundTripper() http.RoundTripper { + return http.DefaultTransport +} + // Ready - always ready func (network *MockNetwork) Ready() chan struct{} { c := make(chan struct{}) @@ -87,3 +96,6 @@ func (network *MockNetwork) ClearHandlers() { // RegisterHTTPHandler - empty implementation func (network *MockNetwork) RegisterHTTPHandler(path string, handler http.Handler) { } + +// OnNetworkAdvance - empty implementation +func (network *MockNetwork) OnNetworkAdvance() {} diff --git a/config/config.go b/config/config.go index 7d19108d54..20543b57c4 100644 --- a/config/config.go +++ b/config/config.go @@ -23,7 +23,6 @@ import ( "os" "os/user" "path/filepath" - "strconv" "strings" "time" @@ -46,577 +45,6 @@ const Mainnet protocol.NetworkID = "mainnet" // GenesisJSONFile is the name of the genesis.json file const GenesisJSONFile = "genesis.json" -// Global defines global Algorand protocol parameters which should not be overriden. -type Global struct { - SmallLambda time.Duration // min amount of time to wait for leader's credential (i.e., time to propagate one credential) - BigLambda time.Duration // max amount of time to wait for leader's proposal (i.e., time to propagate one block) -} - -// Protocol holds the global configuration settings for the agreement protocol, -// initialized with our current defaults. This is used across all nodes we create. -var Protocol = Global{ - SmallLambda: 2000 * time.Millisecond, - BigLambda: 15000 * time.Millisecond, -} - -// ConsensusParams specifies settings that might vary based on the -// particular version of the consensus protocol. -type ConsensusParams struct { - // Consensus protocol upgrades. Votes for upgrades are collected for - // UpgradeVoteRounds. If the number of positive votes is over - // UpgradeThreshold, the proposal is accepted. - // - // UpgradeVoteRounds needs to be long enough to collect an - // accurate sample of participants, and UpgradeThreshold needs - // to be high enough to ensure that there are sufficient participants - // after the upgrade. - // - // A consensus protocol upgrade may specify the delay between its - // acceptance and its execution. This gives clients time to notify - // users. This delay is specified by the upgrade proposer and must - // be between MinUpgradeWaitRounds and MaxUpgradeWaitRounds (inclusive) - // in the old protocol's parameters. Note that these parameters refer - // to the representation of the delay in a block rather than the actual - // delay: if the specified delay is zero, it is equivalent to - // DefaultUpgradeWaitRounds. - // - // The maximum length of a consensus version string is - // MaxVersionStringLen. - UpgradeVoteRounds uint64 - UpgradeThreshold uint64 - DefaultUpgradeWaitRounds uint64 - MinUpgradeWaitRounds uint64 - MaxUpgradeWaitRounds uint64 - MaxVersionStringLen int - - // MaxTxnBytesPerBlock determines the maximum number of bytes - // that transactions can take up in a block. Specifically, - // the sum of the lengths of encodings of each transaction - // in a block must not exceed MaxTxnBytesPerBlock. - MaxTxnBytesPerBlock int - - // MaxTxnBytesPerBlock is the maximum size of a transaction's Note field. - MaxTxnNoteBytes int - - // MaxTxnLife is how long a transaction can be live for: - // the maximum difference between LastValid and FirstValid. - // - // Note that in a protocol upgrade, the ledger must first be upgraded - // to hold more past blocks for this value to be raised. - MaxTxnLife uint64 - - // ApprovedUpgrades describes the upgrade proposals that this protocol - // implementation will vote for, along with their delay value - // (in rounds). A delay value of zero is the same as a delay of - // DefaultUpgradeWaitRounds. - ApprovedUpgrades map[protocol.ConsensusVersion]uint64 - - // SupportGenesisHash indicates support for the GenesisHash - // fields in transactions (and requires them in blocks). - SupportGenesisHash bool - - // RequireGenesisHash indicates that GenesisHash must be present - // in every transaction. - RequireGenesisHash bool - - // DefaultKeyDilution specifies the granularity of top-level ephemeral - // keys. KeyDilution is the number of second-level keys in each batch, - // signed by a top-level "batch" key. The default value can be - // overriden in the account state. - DefaultKeyDilution uint64 - - // MinBalance specifies the minimum balance that can appear in - // an account. To spend money below MinBalance requires issuing - // an account-closing transaction, which transfers all of the - // money from the account, and deletes the account state. - MinBalance uint64 - - // MinTxnFee specifies the minimum fee allowed on a transaction. - // A minimum fee is necessary to prevent DoS. In some sense this is - // a way of making the spender subsidize the cost of storing this transaction. - MinTxnFee uint64 - - // RewardUnit specifies the number of MicroAlgos corresponding to one reward - // unit. - // - // Rewards are received by whole reward units. Fractions of - // RewardUnits do not receive rewards. - RewardUnit uint64 - - // RewardsRateRefreshInterval is the number of rounds after which the - // rewards level is recomputed for the next RewardsRateRefreshInterval rounds. - RewardsRateRefreshInterval uint64 - - // seed-related parameters - SeedLookback uint64 // how many blocks back we use seeds from in sortition. delta_s in the spec - SeedRefreshInterval uint64 // how often an old block hash is mixed into the seed. delta_r in the spec - - // ledger retention policy - MaxBalLookback uint64 // (current round - MaxBalLookback) is the oldest round the ledger must answer balance queries for - - // sortition threshold factors - NumProposers uint64 - SoftCommitteeSize uint64 - SoftCommitteeThreshold uint64 - CertCommitteeSize uint64 - CertCommitteeThreshold uint64 - NextCommitteeSize uint64 // for any non-FPR votes >= deadline step, committee sizes and thresholds are constant - NextCommitteeThreshold uint64 - LateCommitteeSize uint64 - LateCommitteeThreshold uint64 - RedoCommitteeSize uint64 - RedoCommitteeThreshold uint64 - DownCommitteeSize uint64 - DownCommitteeThreshold uint64 - - FastRecoveryLambda time.Duration // time between fast recovery attempts - FastPartitionRecovery bool // set when fast partition recovery is enabled - - // commit to payset using a hash of entire payset, - // instead of txid merkle tree - PaysetCommitFlat bool - - MaxTimestampIncrement int64 // maximum time between timestamps on successive blocks - - // support for the efficient encoding in SignedTxnInBlock - SupportSignedTxnInBlock bool - - // force the FeeSink address to be non-participating in the genesis balances. - ForceNonParticipatingFeeSink bool - - // support for ApplyData in SignedTxnInBlock - ApplyData bool - - // track reward distributions in ApplyData - RewardsInApplyData bool - - // domain-separated credentials - CredentialDomainSeparationEnabled bool - - // support for transactions that mark an account non-participating - SupportBecomeNonParticipatingTransactions bool - - // fix the rewards calculation by avoiding subtracting too much from the rewards pool - PendingResidueRewards bool - - // asset support - Asset bool - - // max number of assets per account - MaxAssetsPerAccount int - - // max length of asset name - MaxAssetNameBytes int - - // max length of asset unit name - MaxAssetUnitNameBytes int - - // max length of asset url - MaxAssetURLBytes int - - // support sequential transaction counter TxnCounter - TxnCounter bool - - // transaction groups - SupportTxGroups bool - - // max group size - MaxTxGroupSize int - - // support for transaction leases - SupportTransactionLeases bool - - // 0 for no support, otherwise highest version supported - LogicSigVersion uint64 - - // len(LogicSig.Logic) + len(LogicSig.Args[*]) must be less than this - LogicSigMaxSize uint64 - - // sum of estimated op cost must be less than this - LogicSigMaxCost uint64 - - // max decimal precision for assets - MaxAssetDecimals uint32 -} - -// Consensus tracks the protocol-level settings for different versions of the -// consensus protocol. -var Consensus map[protocol.ConsensusVersion]ConsensusParams - -// MaxVoteThreshold is the largest threshold for a bundle over all supported -// consensus protocols, used for decoding purposes. -var MaxVoteThreshold int - -func maybeMaxVoteThreshold(t uint64) { - if int(t) > MaxVoteThreshold { - MaxVoteThreshold = int(t) - } -} - -func init() { - Consensus = make(map[protocol.ConsensusVersion]ConsensusParams) - - initConsensusProtocols() - initConsensusTestProtocols() - - // This must appear last, since it depends on all of the other - // versions to already be registered (by the above calls). - initConsensusTestFastUpgrade() - - // Allow tuning SmallLambda for faster consensus in single-machine e2e - // tests. Useful for development. This might make sense to fold into - // a protocol-version-specific setting, once we move SmallLambda into - // ConsensusParams. - algoSmallLambda, err := strconv.ParseInt(os.Getenv("ALGOSMALLLAMBDAMSEC"), 10, 64) - if err == nil { - Protocol.SmallLambda = time.Duration(algoSmallLambda) * time.Millisecond - } - - for _, p := range Consensus { - maybeMaxVoteThreshold(p.SoftCommitteeThreshold) - maybeMaxVoteThreshold(p.CertCommitteeThreshold) - maybeMaxVoteThreshold(p.NextCommitteeThreshold) - maybeMaxVoteThreshold(p.LateCommitteeThreshold) - maybeMaxVoteThreshold(p.RedoCommitteeThreshold) - maybeMaxVoteThreshold(p.DownCommitteeThreshold) - } -} - -func initConsensusProtocols() { - // WARNING: copying a ConsensusParams by value into a new variable - // does not copy the ApprovedUpgrades map. Make sure that each new - // ConsensusParams structure gets a fresh ApprovedUpgrades map. - - // Base consensus protocol version, v7. - v7 := ConsensusParams{ - UpgradeVoteRounds: 10000, - UpgradeThreshold: 9000, - DefaultUpgradeWaitRounds: 10000, - MaxVersionStringLen: 64, - - MinBalance: 10000, - MinTxnFee: 1000, - MaxTxnLife: 1000, - MaxTxnNoteBytes: 1024, - MaxTxnBytesPerBlock: 1000000, - DefaultKeyDilution: 10000, - - MaxTimestampIncrement: 25, - - RewardUnit: 1e6, - RewardsRateRefreshInterval: 5e5, - - ApprovedUpgrades: map[protocol.ConsensusVersion]uint64{}, - - NumProposers: 30, - SoftCommitteeSize: 2500, - SoftCommitteeThreshold: 1870, - CertCommitteeSize: 1000, - CertCommitteeThreshold: 720, - NextCommitteeSize: 10000, - NextCommitteeThreshold: 7750, - LateCommitteeSize: 10000, - LateCommitteeThreshold: 7750, - RedoCommitteeSize: 10000, - RedoCommitteeThreshold: 7750, - DownCommitteeSize: 10000, - DownCommitteeThreshold: 7750, - - FastRecoveryLambda: 5 * time.Minute, - - SeedLookback: 2, - SeedRefreshInterval: 100, - - MaxBalLookback: 320, - - MaxTxGroupSize: 1, - } - - v7.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV7] = v7 - - // v8 uses parameters and a seed derivation policy (the "twin seeds") from Georgios' new analysis - v8 := v7 - - v8.SeedRefreshInterval = 80 - v8.NumProposers = 9 - v8.SoftCommitteeSize = 2990 - v8.SoftCommitteeThreshold = 2267 - v8.CertCommitteeSize = 1500 - v8.CertCommitteeThreshold = 1112 - v8.NextCommitteeSize = 5000 - v8.NextCommitteeThreshold = 3838 - v8.LateCommitteeSize = 5000 - v8.LateCommitteeThreshold = 3838 - v8.RedoCommitteeSize = 5000 - v8.RedoCommitteeThreshold = 3838 - v8.DownCommitteeSize = 5000 - v8.DownCommitteeThreshold = 3838 - - v8.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV8] = v8 - - // v7 can be upgraded to v8. - v7.ApprovedUpgrades[protocol.ConsensusV8] = 0 - - // v9 increases the minimum balance to 100,000 microAlgos. - v9 := v8 - v9.MinBalance = 100000 - v9.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV9] = v9 - - // v8 can be upgraded to v9. - v8.ApprovedUpgrades[protocol.ConsensusV9] = 0 - - // v10 introduces fast partition recovery (and also raises NumProposers). - v10 := v9 - v10.FastPartitionRecovery = true - v10.NumProposers = 20 - v10.LateCommitteeSize = 500 - v10.LateCommitteeThreshold = 320 - v10.RedoCommitteeSize = 2400 - v10.RedoCommitteeThreshold = 1768 - v10.DownCommitteeSize = 6000 - v10.DownCommitteeThreshold = 4560 - v10.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV10] = v10 - - // v9 can be upgraded to v10. - v9.ApprovedUpgrades[protocol.ConsensusV10] = 0 - - // v11 introduces SignedTxnInBlock. - v11 := v10 - v11.SupportSignedTxnInBlock = true - v11.PaysetCommitFlat = true - v11.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV11] = v11 - - // v10 can be upgraded to v11. - v10.ApprovedUpgrades[protocol.ConsensusV11] = 0 - - // v12 increases the maximum length of a version string. - v12 := v11 - v12.MaxVersionStringLen = 128 - v12.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV12] = v12 - - // v11 can be upgraded to v12. - v11.ApprovedUpgrades[protocol.ConsensusV12] = 0 - - // v13 makes the consensus version a meaningful string. - v13 := v12 - v13.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV13] = v13 - - // v12 can be upgraded to v13. - v12.ApprovedUpgrades[protocol.ConsensusV13] = 0 - - // v14 introduces tracking of closing amounts in ApplyData, and enables - // GenesisHash in transactions. - v14 := v13 - v14.ApplyData = true - v14.SupportGenesisHash = true - v14.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV14] = v14 - - // v13 can be upgraded to v14. - v13.ApprovedUpgrades[protocol.ConsensusV14] = 0 - - // v15 introduces tracking of reward distributions in ApplyData. - v15 := v14 - v15.RewardsInApplyData = true - v15.ForceNonParticipatingFeeSink = true - v15.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV15] = v15 - - // v14 can be upgraded to v15. - v14.ApprovedUpgrades[protocol.ConsensusV15] = 0 - - // v16 fixes domain separation in credentials. - v16 := v15 - v16.CredentialDomainSeparationEnabled = true - v16.RequireGenesisHash = true - v16.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV16] = v16 - - // v15 can be upgraded to v16. - v15.ApprovedUpgrades[protocol.ConsensusV16] = 0 - - // ConsensusV17 points to 'final' spec commit - v17 := v16 - v17.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusV17] = v17 - - // v16 can be upgraded to v17. - v16.ApprovedUpgrades[protocol.ConsensusV17] = 0 - - // ConsensusV18 points to reward calculation spec commit - v18 := v17 - v18.PendingResidueRewards = true - v18.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - v18.TxnCounter = true - v18.Asset = true - v18.LogicSigVersion = 1 - v18.LogicSigMaxSize = 1000 - v18.LogicSigMaxCost = 20000 - v18.MaxAssetsPerAccount = 1000 - v18.SupportTxGroups = true - v18.MaxTxGroupSize = 16 - v18.SupportTransactionLeases = true - v18.SupportBecomeNonParticipatingTransactions = true - v18.MaxAssetNameBytes = 32 - v18.MaxAssetUnitNameBytes = 8 - v18.MaxAssetURLBytes = 32 - Consensus[protocol.ConsensusV18] = v18 - - // ConsensusV19 is the official spec commit ( teal, assets, group tx ) - v19 := v18 - v19.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - - Consensus[protocol.ConsensusV19] = v19 - - // v18 can be upgraded to v19. - v18.ApprovedUpgrades[protocol.ConsensusV19] = 0 - // v17 can be upgraded to v19. - v17.ApprovedUpgrades[protocol.ConsensusV19] = 0 - - // v20 points to adding the precision to the assets. - v20 := v19 - v20.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - v20.MaxAssetDecimals = 19 - // we want to adjust the upgrade time to be roughly one week. - // one week, in term of rounds would be: - // 140651 = (7 * 24 * 60 * 60 / 4.3) - // for the sake of future manual calculations, we'll round that down - // a bit : - v20.DefaultUpgradeWaitRounds = 140000 - Consensus[protocol.ConsensusV20] = v20 - - // v19 can be upgraded to v20. - v19.ApprovedUpgrades[protocol.ConsensusV20] = 0 - - // ConsensusFuture is used to test features that are implemented - // but not yet released in a production protocol version. - vFuture := v20 - vFuture.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - vFuture.MinUpgradeWaitRounds = 10000 - vFuture.MaxUpgradeWaitRounds = 150000 - Consensus[protocol.ConsensusFuture] = vFuture -} - -func initConsensusTestProtocols() { - // Various test protocol versions - Consensus[protocol.ConsensusTest0] = ConsensusParams{ - UpgradeVoteRounds: 2, - UpgradeThreshold: 1, - DefaultUpgradeWaitRounds: 2, - MaxVersionStringLen: 64, - - MaxTxnBytesPerBlock: 1000000, - DefaultKeyDilution: 10000, - - ApprovedUpgrades: map[protocol.ConsensusVersion]uint64{ - protocol.ConsensusTest1: 0, - }, - } - - Consensus[protocol.ConsensusTest1] = ConsensusParams{ - UpgradeVoteRounds: 10, - UpgradeThreshold: 8, - DefaultUpgradeWaitRounds: 10, - MaxVersionStringLen: 64, - - MaxTxnBytesPerBlock: 1000000, - DefaultKeyDilution: 10000, - - ApprovedUpgrades: map[protocol.ConsensusVersion]uint64{}, - } - - testBigBlocks := Consensus[protocol.ConsensusCurrentVersion] - testBigBlocks.MaxTxnBytesPerBlock = 100000000 - testBigBlocks.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusTestBigBlocks] = testBigBlocks - - rapidRecalcParams := Consensus[protocol.ConsensusCurrentVersion] - rapidRecalcParams.RewardsRateRefreshInterval = 10 - //because rapidRecalcParams is based on ConsensusCurrentVersion, - //it *shouldn't* have any ApprovedUpgrades - //but explicitly mark "no approved upgrades" just in case - rapidRecalcParams.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusTestRapidRewardRecalculation] = rapidRecalcParams - - // Setting the testShorterLookback parameters derived from ConsensusCurrentVersion - // Will result in MaxBalLookback = 32 - // Used to run tests faster where past MaxBalLookback values are checked - testShorterLookback := Consensus[protocol.ConsensusCurrentVersion] - testShorterLookback.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - - // MaxBalLookback = 2 x SeedRefreshInterval x SeedLookback - // ref. https://github.com/algorandfoundation/specs/blob/master/dev/abft.md - testShorterLookback.SeedLookback = 2 - testShorterLookback.SeedRefreshInterval = 8 - testShorterLookback.MaxBalLookback = 2 * testShorterLookback.SeedLookback * testShorterLookback.SeedRefreshInterval // 32 - Consensus[protocol.ConsensusTestShorterLookback] = testShorterLookback - - // The following two protocols: testUnupgradedProtocol and testUnupgradedToProtocol - // are used to test the case when some nodes in the network do not make progress. - - // testUnupgradedToProtocol is derived from ConsensusCurrentVersion and upgraded - // from testUnupgradedProtocol. - testUnupgradedToProtocol := Consensus[protocol.ConsensusCurrentVersion] - testUnupgradedToProtocol.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - Consensus[protocol.ConsensusTestUnupgradedToProtocol] = testUnupgradedToProtocol - - // testUnupgradedProtocol is used to control the upgrade of a node. This is used - // to construct and run a network where some node is upgraded, and some other - // node is not upgraded. - // testUnupgradedProtocol is derived from ConsensusCurrentVersion and upgrades to - // testUnupgradedToProtocol. - testUnupgradedProtocol := Consensus[protocol.ConsensusCurrentVersion] - testUnupgradedProtocol.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - - testUnupgradedProtocol.UpgradeVoteRounds = 3 - testUnupgradedProtocol.UpgradeThreshold = 2 - testUnupgradedProtocol.DefaultUpgradeWaitRounds = 3 - b, err := strconv.ParseBool(os.Getenv("ALGORAND_TEST_UNUPGRADEDPROTOCOL_DELETE_UPGRADE")) - // Do not upgrade to the next version if - // ALGORAND_TEST_UNUPGRADEDPROTOCOL_DELETE_UPGRADE is set to true (e.g. 1, TRUE) - if err == nil && b { - // Configure as if testUnupgradedToProtocol is not supported by the binary - delete(Consensus, protocol.ConsensusTestUnupgradedToProtocol) - } else { - // Direct upgrade path from ConsensusTestUnupgradedProtocol to ConsensusTestUnupgradedToProtocol - // This is needed for the voting nodes vote to upgrade to the next protocol - testUnupgradedProtocol.ApprovedUpgrades[protocol.ConsensusTestUnupgradedToProtocol] = 0 - } - Consensus[protocol.ConsensusTestUnupgradedProtocol] = testUnupgradedProtocol -} - -func initConsensusTestFastUpgrade() { - fastUpgradeProtocols := make(map[protocol.ConsensusVersion]ConsensusParams) - - for proto, params := range Consensus { - fastParams := params - fastParams.UpgradeVoteRounds = 5 - fastParams.UpgradeThreshold = 3 - fastParams.DefaultUpgradeWaitRounds = 5 - fastParams.MaxVersionStringLen += len(protocol.ConsensusTestFastUpgrade("")) - fastParams.ApprovedUpgrades = make(map[protocol.ConsensusVersion]uint64) - - for ver := range params.ApprovedUpgrades { - fastParams.ApprovedUpgrades[protocol.ConsensusTestFastUpgrade(ver)] = 0 - } - - fastUpgradeProtocols[protocol.ConsensusTestFastUpgrade(proto)] = fastParams - } - - // Put the test protocols into the Consensus struct; this - // is done as a separate step so we don't recurse forever. - for proto, params := range fastUpgradeProtocols { - Consensus[proto] = params - } -} - // Local holds the per-node-instance configuration settings for the protocol. type Local struct { // Version tracks the current version of the defaults so we can migrate old -> new @@ -825,6 +253,25 @@ type Local struct { // TelemetryToLog records messages to node.log that are normally sent to remote event monitoring TelemetryToLog bool + + // DNSSecurityFlags instructs algod validating DNS responses. + // Possible fla values + // 0x00 - disabled + // 0x01 (dnssecSRV) - validate SRV response + // 0x02 (dnssecRelayAddr) - validate relays' names to addresses resolution + // 0x04 (dnssecTelemetryAddr) - validate telemetry and metrics names to addresses resolution + // ... + DNSSecurityFlags uint32 + + // EnablePingHandler controls whether the gossip node would respond to ping messages with a pong message. + EnablePingHandler bool + + // DisableOutgoingConnectionThrottling disables the connection throttling of the network library, which + // allow the network library to continuesly disconnect relays based on their relative ( and absolute ) performance. + DisableOutgoingConnectionThrottling bool + + // NetworkProtocolVersion overrides network protocol version ( if present ) + NetworkProtocolVersion string } // Filenames of config files within the configdir (e.g. ~/.algorand) @@ -842,6 +289,11 @@ const LedgerFilenamePrefix = "ledger" // It is used to recover from node crashes. const CrashFilename = "crash.sqlite" +// ConfigurableConsensusProtocolsFilename defines a set of consensus prototocols that +// are to be loaded from the data directory ( if present ), to override the +// built-in supported consensus protocols. +const ConfigurableConsensusProtocolsFilename = "consensus.json" + // LoadConfigFromDisk returns a Local config structure based on merging the defaults // with settings loaded from the config file from the custom dir. If the custom file // cannot be loaded, the default config is returned (with the error from loading the @@ -1028,3 +480,24 @@ func GetDefaultConfigFilePath() (string, error) { } return filepath.Join(currentUser.HomeDir, ".algorand"), nil } + +const ( + dnssecSRV = 1 << iota + dnssecRelayAddr + dnssecTelemetryAddr +) + +// DNSSecuritySRVEnforced returns true if SRV response verification enforced +func (cfg Local) DNSSecuritySRVEnforced() bool { + return cfg.DNSSecurityFlags&dnssecSRV != 0 +} + +// DNSSecurityRelayAddrEnforced returns true if relay name to ip addr resolution enforced +func (cfg Local) DNSSecurityRelayAddrEnforced() bool { + return cfg.DNSSecurityFlags&dnssecRelayAddr != 0 +} + +// DNSSecurityTelemeryAddrEnforced returns true if relay name to ip addr resolution enforced +func (cfg Local) DNSSecurityTelemeryAddrEnforced() bool { + return cfg.DNSSecurityFlags&dnssecTelemetryAddr != 0 +} diff --git a/config/config_test.go b/config/config_test.go index 273b88eed0..b273e842e4 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -314,7 +314,7 @@ func TestConfigMigrateFromDisk(t *testing.T) { func TestConfigInvariant(t *testing.T) { a := require.New(t) - a.Equal(uint32(5), configVersion, "If you bump Config Version, please update this test (and consider if you should be adding more)") + a.Equal(uint32(6), configVersion, "If you bump Config Version, please update this test (and consider if you should be adding more)") ourPath, err := os.Getwd() a.NoError(err) @@ -349,6 +349,11 @@ func TestConfigInvariant(t *testing.T) { err = codecs.LoadObjectFromFile(filepath.Join(configsPath, "config-v5.json"), &c5) a.NoError(err) a.Equal(defaultLocalV5, c5) + + c6 := Local{} + err = codecs.LoadObjectFromFile(filepath.Join(configsPath, "config-v6.json"), &c6) + a.NoError(err) + a.Equal(defaultLocalV6, c6) } func TestConfigLatestVersion(t *testing.T) { diff --git a/config/consensus.go b/config/consensus.go new file mode 100644 index 0000000000..663b1f664d --- /dev/null +++ b/config/consensus.go @@ -0,0 +1,589 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package config + +import ( + "encoding/json" + "io/ioutil" + "os" + "path/filepath" + "strconv" + "time" + + "github.com/algorand/go-algorand/protocol" +) + +// ConsensusParams specifies settings that might vary based on the +// particular version of the consensus protocol. +type ConsensusParams struct { + // Consensus protocol upgrades. Votes for upgrades are collected for + // UpgradeVoteRounds. If the number of positive votes is over + // UpgradeThreshold, the proposal is accepted. + // + // UpgradeVoteRounds needs to be long enough to collect an + // accurate sample of participants, and UpgradeThreshold needs + // to be high enough to ensure that there are sufficient participants + // after the upgrade. + // + // A consensus protocol upgrade may specify the delay between its + // acceptance and its execution. This gives clients time to notify + // users. This delay is specified by the upgrade proposer and must + // be between MinUpgradeWaitRounds and MaxUpgradeWaitRounds (inclusive) + // in the old protocol's parameters. Note that these parameters refer + // to the representation of the delay in a block rather than the actual + // delay: if the specified delay is zero, it is equivalent to + // DefaultUpgradeWaitRounds. + // + // The maximum length of a consensus version string is + // MaxVersionStringLen. + UpgradeVoteRounds uint64 + UpgradeThreshold uint64 + DefaultUpgradeWaitRounds uint64 + MinUpgradeWaitRounds uint64 + MaxUpgradeWaitRounds uint64 + MaxVersionStringLen int + + // MaxTxnBytesPerBlock determines the maximum number of bytes + // that transactions can take up in a block. Specifically, + // the sum of the lengths of encodings of each transaction + // in a block must not exceed MaxTxnBytesPerBlock. + MaxTxnBytesPerBlock int + + // MaxTxnBytesPerBlock is the maximum size of a transaction's Note field. + MaxTxnNoteBytes int + + // MaxTxnLife is how long a transaction can be live for: + // the maximum difference between LastValid and FirstValid. + // + // Note that in a protocol upgrade, the ledger must first be upgraded + // to hold more past blocks for this value to be raised. + MaxTxnLife uint64 + + // ApprovedUpgrades describes the upgrade proposals that this protocol + // implementation will vote for, along with their delay value + // (in rounds). A delay value of zero is the same as a delay of + // DefaultUpgradeWaitRounds. + ApprovedUpgrades map[protocol.ConsensusVersion]uint64 + + // SupportGenesisHash indicates support for the GenesisHash + // fields in transactions (and requires them in blocks). + SupportGenesisHash bool + + // RequireGenesisHash indicates that GenesisHash must be present + // in every transaction. + RequireGenesisHash bool + + // DefaultKeyDilution specifies the granularity of top-level ephemeral + // keys. KeyDilution is the number of second-level keys in each batch, + // signed by a top-level "batch" key. The default value can be + // overriden in the account state. + DefaultKeyDilution uint64 + + // MinBalance specifies the minimum balance that can appear in + // an account. To spend money below MinBalance requires issuing + // an account-closing transaction, which transfers all of the + // money from the account, and deletes the account state. + MinBalance uint64 + + // MinTxnFee specifies the minimum fee allowed on a transaction. + // A minimum fee is necessary to prevent DoS. In some sense this is + // a way of making the spender subsidize the cost of storing this transaction. + MinTxnFee uint64 + + // RewardUnit specifies the number of MicroAlgos corresponding to one reward + // unit. + // + // Rewards are received by whole reward units. Fractions of + // RewardUnits do not receive rewards. + RewardUnit uint64 + + // RewardsRateRefreshInterval is the number of rounds after which the + // rewards level is recomputed for the next RewardsRateRefreshInterval rounds. + RewardsRateRefreshInterval uint64 + + // seed-related parameters + SeedLookback uint64 // how many blocks back we use seeds from in sortition. delta_s in the spec + SeedRefreshInterval uint64 // how often an old block hash is mixed into the seed. delta_r in the spec + + // ledger retention policy + MaxBalLookback uint64 // (current round - MaxBalLookback) is the oldest round the ledger must answer balance queries for + + // sortition threshold factors + NumProposers uint64 + SoftCommitteeSize uint64 + SoftCommitteeThreshold uint64 + CertCommitteeSize uint64 + CertCommitteeThreshold uint64 + NextCommitteeSize uint64 // for any non-FPR votes >= deadline step, committee sizes and thresholds are constant + NextCommitteeThreshold uint64 + LateCommitteeSize uint64 + LateCommitteeThreshold uint64 + RedoCommitteeSize uint64 + RedoCommitteeThreshold uint64 + DownCommitteeSize uint64 + DownCommitteeThreshold uint64 + + FastRecoveryLambda time.Duration // time between fast recovery attempts + FastPartitionRecovery bool // set when fast partition recovery is enabled + + // commit to payset using a hash of entire payset, + // instead of txid merkle tree + PaysetCommitFlat bool + + MaxTimestampIncrement int64 // maximum time between timestamps on successive blocks + + // support for the efficient encoding in SignedTxnInBlock + SupportSignedTxnInBlock bool + + // force the FeeSink address to be non-participating in the genesis balances. + ForceNonParticipatingFeeSink bool + + // support for ApplyData in SignedTxnInBlock + ApplyData bool + + // track reward distributions in ApplyData + RewardsInApplyData bool + + // domain-separated credentials + CredentialDomainSeparationEnabled bool + + // support for transactions that mark an account non-participating + SupportBecomeNonParticipatingTransactions bool + + // fix the rewards calculation by avoiding subtracting too much from the rewards pool + PendingResidueRewards bool + + // asset support + Asset bool + + // max number of assets per account + MaxAssetsPerAccount int + + // max length of asset name + MaxAssetNameBytes int + + // max length of asset unit name + MaxAssetUnitNameBytes int + + // max length of asset url + MaxAssetURLBytes int + + // support sequential transaction counter TxnCounter + TxnCounter bool + + // transaction groups + SupportTxGroups bool + + // max group size + MaxTxGroupSize int + + // support for transaction leases + SupportTransactionLeases bool + + // 0 for no support, otherwise highest version supported + LogicSigVersion uint64 + + // len(LogicSig.Logic) + len(LogicSig.Args[*]) must be less than this + LogicSigMaxSize uint64 + + // sum of estimated op cost must be less than this + LogicSigMaxCost uint64 + + // max decimal precision for assets + MaxAssetDecimals uint32 + + // whether to use the old buggy Credential.lowestOutput function + // TODO(upgrade): Please remove as soon as the upgrade goes through + UseBuggyProposalLowestOutput bool +} + +// ConsensusProtocols defines a set of supported protocol versions and their +// corresponding parameters. +type ConsensusProtocols map[protocol.ConsensusVersion]ConsensusParams + +// Consensus tracks the protocol-level settings for different versions of the +// consensus protocol. +var Consensus ConsensusProtocols + +// MaxVoteThreshold is the largest threshold for a bundle over all supported +// consensus protocols, used for decoding purposes. +var MaxVoteThreshold int + +func maybeMaxVoteThreshold(t uint64) { + if int(t) > MaxVoteThreshold { + MaxVoteThreshold = int(t) + } +} + +// SaveConfigurableConsensus saves the configurable protocols file to the provided data directory. +func SaveConfigurableConsensus(dataDirectory string, params ConsensusProtocols) error { + consensusProtocolPath := filepath.Join(dataDirectory, ConfigurableConsensusProtocolsFilename) + + encodedConsensusParams, err := json.Marshal(params) + if err != nil { + return err + } + err = ioutil.WriteFile(consensusProtocolPath, encodedConsensusParams, 0644) + return err +} + +// DeepCopy creates a deep copy of a consensus protocols map. +func (cp ConsensusProtocols) DeepCopy() ConsensusProtocols { + staticConsensus := make(ConsensusProtocols) + for consensusVersion, consensusParams := range cp { + // recreate the ApprovedUpgrades map since we don't want to modify the original one. + if consensusParams.ApprovedUpgrades != nil { + newApprovedUpgrades := make(map[protocol.ConsensusVersion]uint64) + for ver, when := range consensusParams.ApprovedUpgrades { + newApprovedUpgrades[ver] = when + } + consensusParams.ApprovedUpgrades = newApprovedUpgrades + } + staticConsensus[consensusVersion] = consensusParams + } + return staticConsensus +} + +// Merge merges a configurable consensus ontop of the existing consensus protocol and return +// a new consensus protocol without modify any of the incoming structures. +func (cp ConsensusProtocols) Merge(configurableConsensus ConsensusProtocols) ConsensusProtocols { + staticConsensus := cp.DeepCopy() + + for consensusVersion, consensusParams := range configurableConsensus { + if consensusParams.ApprovedUpgrades == nil { + // if we were provided with an empty ConsensusParams, delete the existing reference to this consensus version + for cVer, cParam := range staticConsensus { + if cVer == consensusVersion { + delete(staticConsensus, cVer) + } else if _, has := cParam.ApprovedUpgrades[consensusVersion]; has { + // delete upgrade to deleted version + delete(cParam.ApprovedUpgrades, consensusVersion) + } + } + } else { + // need to add/update entry + staticConsensus[consensusVersion] = consensusParams + } + } + + return staticConsensus +} + +// LoadConfigurableConsensusProtocols loads the configurable protocols from the data directroy +func LoadConfigurableConsensusProtocols(dataDirectory string) error { + newConsensus, err := PreloadConfigurableConsensusProtocols(dataDirectory) + if err != nil { + return err + } + if newConsensus != nil { + Consensus = newConsensus + } + return nil +} + +// PreloadConfigurableConsensusProtocols loads the configurable protocols from the data directroy +// and merge it with a copy of the Consensus map. Then, it returns it to the caller. +func PreloadConfigurableConsensusProtocols(dataDirectory string) (ConsensusProtocols, error) { + consensusProtocolPath := filepath.Join(dataDirectory, ConfigurableConsensusProtocolsFilename) + file, err := os.Open(consensusProtocolPath) + + if err != nil { + if os.IsNotExist(err) { + // this file is not required, only optional. if it's missing, no harm is done. + return Consensus, nil + } + return nil, err + } + defer file.Close() + + configurableConsensus := make(ConsensusProtocols) + + decoder := json.NewDecoder(file) + err = decoder.Decode(&configurableConsensus) + if err != nil { + return nil, err + } + return Consensus.Merge(configurableConsensus), nil +} + +func initConsensusProtocols() { + // WARNING: copying a ConsensusParams by value into a new variable + // does not copy the ApprovedUpgrades map. Make sure that each new + // ConsensusParams structure gets a fresh ApprovedUpgrades map. + + // Base consensus protocol version, v7. + v7 := ConsensusParams{ + UpgradeVoteRounds: 10000, + UpgradeThreshold: 9000, + DefaultUpgradeWaitRounds: 10000, + MaxVersionStringLen: 64, + + MinBalance: 10000, + MinTxnFee: 1000, + MaxTxnLife: 1000, + MaxTxnNoteBytes: 1024, + MaxTxnBytesPerBlock: 1000000, + DefaultKeyDilution: 10000, + + MaxTimestampIncrement: 25, + + RewardUnit: 1e6, + RewardsRateRefreshInterval: 5e5, + + ApprovedUpgrades: map[protocol.ConsensusVersion]uint64{}, + + NumProposers: 30, + SoftCommitteeSize: 2500, + SoftCommitteeThreshold: 1870, + CertCommitteeSize: 1000, + CertCommitteeThreshold: 720, + NextCommitteeSize: 10000, + NextCommitteeThreshold: 7750, + LateCommitteeSize: 10000, + LateCommitteeThreshold: 7750, + RedoCommitteeSize: 10000, + RedoCommitteeThreshold: 7750, + DownCommitteeSize: 10000, + DownCommitteeThreshold: 7750, + + FastRecoveryLambda: 5 * time.Minute, + + SeedLookback: 2, + SeedRefreshInterval: 100, + + MaxBalLookback: 320, + + MaxTxGroupSize: 1, + UseBuggyProposalLowestOutput: true, // TODO(upgrade): Please remove as soon as the upgrade goes through + } + + v7.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV7] = v7 + + // v8 uses parameters and a seed derivation policy (the "twin seeds") from Georgios' new analysis + v8 := v7 + + v8.SeedRefreshInterval = 80 + v8.NumProposers = 9 + v8.SoftCommitteeSize = 2990 + v8.SoftCommitteeThreshold = 2267 + v8.CertCommitteeSize = 1500 + v8.CertCommitteeThreshold = 1112 + v8.NextCommitteeSize = 5000 + v8.NextCommitteeThreshold = 3838 + v8.LateCommitteeSize = 5000 + v8.LateCommitteeThreshold = 3838 + v8.RedoCommitteeSize = 5000 + v8.RedoCommitteeThreshold = 3838 + v8.DownCommitteeSize = 5000 + v8.DownCommitteeThreshold = 3838 + + v8.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV8] = v8 + + // v7 can be upgraded to v8. + v7.ApprovedUpgrades[protocol.ConsensusV8] = 0 + + // v9 increases the minimum balance to 100,000 microAlgos. + v9 := v8 + v9.MinBalance = 100000 + v9.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV9] = v9 + + // v8 can be upgraded to v9. + v8.ApprovedUpgrades[protocol.ConsensusV9] = 0 + + // v10 introduces fast partition recovery (and also raises NumProposers). + v10 := v9 + v10.FastPartitionRecovery = true + v10.NumProposers = 20 + v10.LateCommitteeSize = 500 + v10.LateCommitteeThreshold = 320 + v10.RedoCommitteeSize = 2400 + v10.RedoCommitteeThreshold = 1768 + v10.DownCommitteeSize = 6000 + v10.DownCommitteeThreshold = 4560 + v10.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV10] = v10 + + // v9 can be upgraded to v10. + v9.ApprovedUpgrades[protocol.ConsensusV10] = 0 + + // v11 introduces SignedTxnInBlock. + v11 := v10 + v11.SupportSignedTxnInBlock = true + v11.PaysetCommitFlat = true + v11.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV11] = v11 + + // v10 can be upgraded to v11. + v10.ApprovedUpgrades[protocol.ConsensusV11] = 0 + + // v12 increases the maximum length of a version string. + v12 := v11 + v12.MaxVersionStringLen = 128 + v12.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV12] = v12 + + // v11 can be upgraded to v12. + v11.ApprovedUpgrades[protocol.ConsensusV12] = 0 + + // v13 makes the consensus version a meaningful string. + v13 := v12 + v13.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV13] = v13 + + // v12 can be upgraded to v13. + v12.ApprovedUpgrades[protocol.ConsensusV13] = 0 + + // v14 introduces tracking of closing amounts in ApplyData, and enables + // GenesisHash in transactions. + v14 := v13 + v14.ApplyData = true + v14.SupportGenesisHash = true + v14.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV14] = v14 + + // v13 can be upgraded to v14. + v13.ApprovedUpgrades[protocol.ConsensusV14] = 0 + + // v15 introduces tracking of reward distributions in ApplyData. + v15 := v14 + v15.RewardsInApplyData = true + v15.ForceNonParticipatingFeeSink = true + v15.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV15] = v15 + + // v14 can be upgraded to v15. + v14.ApprovedUpgrades[protocol.ConsensusV15] = 0 + + // v16 fixes domain separation in credentials. + v16 := v15 + v16.CredentialDomainSeparationEnabled = true + v16.RequireGenesisHash = true + v16.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV16] = v16 + + // v15 can be upgraded to v16. + v15.ApprovedUpgrades[protocol.ConsensusV16] = 0 + + // ConsensusV17 points to 'final' spec commit + v17 := v16 + v17.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + Consensus[protocol.ConsensusV17] = v17 + + // v16 can be upgraded to v17. + v16.ApprovedUpgrades[protocol.ConsensusV17] = 0 + + // ConsensusV18 points to reward calculation spec commit + v18 := v17 + v18.PendingResidueRewards = true + v18.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + v18.TxnCounter = true + v18.Asset = true + v18.LogicSigVersion = 1 + v18.LogicSigMaxSize = 1000 + v18.LogicSigMaxCost = 20000 + v18.MaxAssetsPerAccount = 1000 + v18.SupportTxGroups = true + v18.MaxTxGroupSize = 16 + v18.SupportTransactionLeases = true + v18.SupportBecomeNonParticipatingTransactions = true + v18.MaxAssetNameBytes = 32 + v18.MaxAssetUnitNameBytes = 8 + v18.MaxAssetURLBytes = 32 + Consensus[protocol.ConsensusV18] = v18 + + // ConsensusV19 is the official spec commit ( teal, assets, group tx ) + v19 := v18 + v19.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + + Consensus[protocol.ConsensusV19] = v19 + + // v18 can be upgraded to v19. + v18.ApprovedUpgrades[protocol.ConsensusV19] = 0 + // v17 can be upgraded to v19. + v17.ApprovedUpgrades[protocol.ConsensusV19] = 0 + + // v20 points to adding the precision to the assets. + v20 := v19 + v20.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + v20.MaxAssetDecimals = 19 + // we want to adjust the upgrade time to be roughly one week. + // one week, in term of rounds would be: + // 140651 = (7 * 24 * 60 * 60 / 4.3) + // for the sake of future manual calculations, we'll round that down + // a bit : + v20.DefaultUpgradeWaitRounds = 140000 + Consensus[protocol.ConsensusV20] = v20 + + // v19 can be upgraded to v20. + v19.ApprovedUpgrades[protocol.ConsensusV20] = 0 + + // v21 fixes a bug in Credential.lowestOutput that would cause larger accounts to be selected to propose disproportionately more often than small accounts + v21 := v20 + v21.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + v21.UseBuggyProposalLowestOutput = false // TODO(upgrade): Please remove this line as soon as the protocol upgrade goes through + Consensus[protocol.ConsensusV21] = v21 + // v20 can be upgraded to v21. + v20.ApprovedUpgrades[protocol.ConsensusV21] = 0 + + // ConsensusFuture is used to test features that are implemented + // but not yet released in a production protocol version. + vFuture := v21 + vFuture.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + vFuture.MinUpgradeWaitRounds = 10000 + vFuture.MaxUpgradeWaitRounds = 150000 + Consensus[protocol.ConsensusFuture] = vFuture +} + +// Global defines global Algorand protocol parameters which should not be overriden. +type Global struct { + SmallLambda time.Duration // min amount of time to wait for leader's credential (i.e., time to propagate one credential) + BigLambda time.Duration // max amount of time to wait for leader's proposal (i.e., time to propagate one block) +} + +// Protocol holds the global configuration settings for the agreement protocol, +// initialized with our current defaults. This is used across all nodes we create. +var Protocol = Global{ + SmallLambda: 2000 * time.Millisecond, + BigLambda: 15000 * time.Millisecond, +} + +func init() { + Consensus = make(ConsensusProtocols) + + initConsensusProtocols() + + // Allow tuning SmallLambda for faster consensus in single-machine e2e + // tests. Useful for development. This might make sense to fold into + // a protocol-version-specific setting, once we move SmallLambda into + // ConsensusParams. + algoSmallLambda, err := strconv.ParseInt(os.Getenv("ALGOSMALLLAMBDAMSEC"), 10, 64) + if err == nil { + Protocol.SmallLambda = time.Duration(algoSmallLambda) * time.Millisecond + } + + for _, p := range Consensus { + maybeMaxVoteThreshold(p.SoftCommitteeThreshold) + maybeMaxVoteThreshold(p.CertCommitteeThreshold) + maybeMaxVoteThreshold(p.NextCommitteeThreshold) + maybeMaxVoteThreshold(p.LateCommitteeThreshold) + maybeMaxVoteThreshold(p.RedoCommitteeThreshold) + maybeMaxVoteThreshold(p.DownCommitteeThreshold) + } +} diff --git a/config/local_defaults.go b/config/local_defaults.go index 6e8dedb117..7f4c1208c9 100644 --- a/config/local_defaults.go +++ b/config/local_defaults.go @@ -21,9 +21,9 @@ import ( "time" ) -var defaultLocal = defaultLocalV5 +var defaultLocal = defaultLocalV6 -const configVersion = uint32(5) +const configVersion = uint32(6) // !!! WARNING !!! // @@ -39,6 +39,62 @@ const configVersion = uint32(5) // // !!! WARNING !!! +var defaultLocalV6 = Local{ + // DO NOT MODIFY VALUES - New values may be added carefully - See WARNING at top of file + Version: 6, + Archival: false, + BaseLoggerDebugLevel: 4, + BroadcastConnectionsLimit: -1, + AnnounceParticipationKey: true, + PriorityPeers: map[string]bool{}, + CadaverSizeTarget: 1073741824, + CatchupFailurePeerRefreshRate: 10, + CatchupParallelBlocks: 16, + ConnectionsRateLimitingCount: 60, + ConnectionsRateLimitingWindowSeconds: 1, + DeadlockDetection: 0, + DNSBootstrapID: ".algorand.network", + EnableAgreementReporting: false, + EnableAgreementTimeMetrics: false, + EnableIncomingMessageFilter: false, + EnableMetricReporting: false, + EnableOutgoingNetworkMessageFiltering: true, + EnableRequestLogger: false, + EnableTopAccountsReporting: false, + EndpointAddress: "127.0.0.1:0", + GossipFanout: 4, + IncomingConnectionsLimit: 10000, + IncomingMessageFilterBucketCount: 5, + IncomingMessageFilterBucketSize: 512, + LogArchiveName: "node.archive.log", + LogArchiveMaxAge: "", + LogSizeLimit: 1073741824, + MaxConnectionsPerIP: 30, + NetAddress: "", + NetworkProtocolVersion: "", + NodeExporterListenAddress: ":9100", + NodeExporterPath: "./node_exporter", + OutgoingMessageFilterBucketCount: 3, + OutgoingMessageFilterBucketSize: 128, + ReconnectTime: 1 * time.Minute, + ReservedFDs: 256, + RestReadTimeoutSeconds: 15, + RestWriteTimeoutSeconds: 120, + RunHosted: false, + SuggestedFeeBlockHistory: 3, + SuggestedFeeSlidingWindowSize: 50, + TelemetryToLog: true, + TxPoolExponentialIncreaseFactor: 2, + TxPoolSize: 15000, + TxSyncIntervalSeconds: 60, + TxSyncTimeoutSeconds: 30, + TxSyncServeResponseSize: 1000000, + PeerConnectionsUpdateInterval: 3600, + DNSSecurityFlags: 0x01, // New value with default 0x01 + EnablePingHandler: true, + // DO NOT MODIFY VALUES - New values may be added carefully - See WARNING at top of file +} + var defaultLocalV5 = Local{ // DO NOT MODIFY VALUES - New values may be added carefully - See WARNING at top of file Version: 5, @@ -53,6 +109,7 @@ var defaultLocalV5 = Local{ ConnectionsRateLimitingCount: 60, ConnectionsRateLimitingWindowSeconds: 1, DeadlockDetection: 0, + DisableOutgoingConnectionThrottling: false, DNSBootstrapID: ".algorand.network", EnableAgreementReporting: false, EnableAgreementTimeMetrics: false, @@ -75,6 +132,7 @@ var defaultLocalV5 = Local{ NodeExporterPath: "./node_exporter", OutgoingMessageFilterBucketCount: 3, OutgoingMessageFilterBucketSize: 128, + PeerConnectionsUpdateInterval: 3600, ReconnectTime: 1 * time.Minute, // Was 60ns ReservedFDs: 256, RestReadTimeoutSeconds: 15, @@ -88,7 +146,6 @@ var defaultLocalV5 = Local{ TxSyncIntervalSeconds: 60, TxSyncTimeoutSeconds: 30, TxSyncServeResponseSize: 1000000, - PeerConnectionsUpdateInterval: 3600, // DO NOT MODIFY VALUES - New values may be added carefully - See WARNING at top of file } @@ -357,6 +414,18 @@ func migrate(cfg Local) (newCfg Local, err error) { newCfg.Version = 5 } + // Migrate 5 -> 6 + if newCfg.Version == 5 { + if newCfg.DNSSecurityFlags == 0 { + newCfg.DNSSecurityFlags = defaultLocalV6.DNSSecurityFlags + } + if newCfg.EnablePingHandler == defaultLocalV5.EnablePingHandler { + newCfg.EnablePingHandler = defaultLocalV6.EnablePingHandler + } + + newCfg.Version = 6 + } + if newCfg.Version != configVersion { err = fmt.Errorf("failed to migrate config version %d (stuck at %d) to latest %d", cfg.Version, newCfg.Version, configVersion) } diff --git a/crypto/curve25519.go b/crypto/curve25519.go index 23aa64447f..3f721c4328 100644 --- a/crypto/curve25519.go +++ b/crypto/curve25519.go @@ -17,8 +17,14 @@ package crypto // #cgo CFLAGS: -Wall -std=c99 -// #cgo CFLAGS: -I${SRCDIR}/include -// #cgo LDFLAGS: ${SRCDIR}/lib/libsodium.a +// #cgo darwin,amd64 CFLAGS: -I${SRCDIR}/libs/darwin/amd64/include +// #cgo darwin,amd64 LDFLAGS: ${SRCDIR}/libs/darwin/amd64/lib/libsodium.a +// #cgo linux,amd64 CFLAGS: -I${SRCDIR}/libs/linux/amd64/include +// #cgo linux,amd64 LDFLAGS: ${SRCDIR}/libs/linux/amd64/lib/libsodium.a +// #cgo linux,arm64 CFLAGS: -I${SRCDIR}/libs/linux/arm64/include +// #cgo linux,arm64 LDFLAGS: ${SRCDIR}/libs/linux/arm64/lib/libsodium.a +// #cgo linux,arm CFLAGS: -I${SRCDIR}/libs/linux/arm/include +// #cgo linux,arm LDFLAGS: ${SRCDIR}/libs/linux/arm/lib/libsodium.a // #include // #include "sodium.h" import "C" @@ -124,6 +130,8 @@ type SignatureVerifier = PublicKey // SignatureSecrets are used by an entity to produce unforgeable signatures over // a message. type SignatureSecrets struct { + _struct struct{} `codec:""` + SignatureVerifier SK ed25519PrivateKey } diff --git a/crypto/libsodium-fork/autogen.sh b/crypto/libsodium-fork/autogen.sh index 394e6f7a14..0de498c855 100755 --- a/crypto/libsodium-fork/autogen.sh +++ b/crypto/libsodium-fork/autogen.sh @@ -32,5 +32,5 @@ fi $LIBTOOLIZE && \ aclocal && \ -automake --add-missing --force-missing --include-deps && \ +automake $* --add-missing --force-missing --include-deps && \ autoconf diff --git a/crypto/msgp_gen.go b/crypto/msgp_gen.go index 9b5de8349a..c863fa25e0 100644 --- a/crypto/msgp_gen.go +++ b/crypto/msgp_gen.go @@ -1713,6 +1713,232 @@ func (z *Signature) MsgIsZero() bool { return (*z) == (Signature{}) } +// MarshalMsg implements msgp.Marshaler +func (z *SignatureSecrets) MarshalMsg(b []byte) (o []byte, err error) { + o = msgp.Require(b, z.Msgsize()) + // map header, size 2 + // string "SK" + o = append(o, 0x82, 0xa2, 0x53, 0x4b) + o = msgp.AppendBytes(o, ((*z).SK)[:]) + // string "SignatureVerifier" + o = append(o, 0xb1, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x72) + o, err = (*z).SignatureVerifier.MarshalMsg(o) + if err != nil { + err = msgp.WrapError(err, "SignatureVerifier") + return + } + return +} + +func (_ *SignatureSecrets) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*SignatureSecrets) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *SignatureSecrets) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0002 int + var zb0003 bool + zb0002, zb0003, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 > 0 { + zb0002-- + bts, err = (*z).SignatureVerifier.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "SignatureVerifier") + return + } + } + if zb0002 > 0 { + zb0002-- + bts, err = msgp.ReadExactBytes(bts, ((*z).SK)[:]) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "SK") + return + } + } + if zb0002 > 0 { + err = msgp.ErrTooManyArrayFields(zb0002) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0003 { + (*z) = SignatureSecrets{} + } + for zb0002 > 0 { + zb0002-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "SignatureVerifier": + bts, err = (*z).SignatureVerifier.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "SignatureVerifier") + return + } + case "SK": + bts, err = msgp.ReadExactBytes(bts, ((*z).SK)[:]) + if err != nil { + err = msgp.WrapError(err, "SK") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *SignatureSecrets) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*SignatureSecrets) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *SignatureSecrets) Msgsize() (s int) { + s = 1 + 18 + (*z).SignatureVerifier.Msgsize() + 3 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) + return +} + +// MsgIsZero returns whether this is a zero value +func (z *SignatureSecrets) MsgIsZero() bool { + return ((*z).SignatureVerifier.MsgIsZero()) && ((*z).SK == (ed25519PrivateKey{})) +} + +// MarshalMsg implements msgp.Marshaler +func (z *VRFSecrets) MarshalMsg(b []byte) (o []byte, err error) { + o = msgp.Require(b, z.Msgsize()) + // map header, size 2 + // string "PK" + o = append(o, 0x82, 0xa2, 0x50, 0x4b) + o = msgp.AppendBytes(o, ((*z).PK)[:]) + // string "SK" + o = append(o, 0xa2, 0x53, 0x4b) + o = msgp.AppendBytes(o, ((*z).SK)[:]) + return +} + +func (_ *VRFSecrets) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*VRFSecrets) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *VRFSecrets) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0003 int + var zb0004 bool + zb0003, zb0004, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0003, zb0004, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0003 > 0 { + zb0003-- + bts, err = msgp.ReadExactBytes(bts, ((*z).PK)[:]) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "PK") + return + } + } + if zb0003 > 0 { + zb0003-- + bts, err = msgp.ReadExactBytes(bts, ((*z).SK)[:]) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "SK") + return + } + } + if zb0003 > 0 { + err = msgp.ErrTooManyArrayFields(zb0003) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0004 { + (*z) = VRFSecrets{} + } + for zb0003 > 0 { + zb0003-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "PK": + bts, err = msgp.ReadExactBytes(bts, ((*z).PK)[:]) + if err != nil { + err = msgp.WrapError(err, "PK") + return + } + case "SK": + bts, err = msgp.ReadExactBytes(bts, ((*z).SK)[:]) + if err != nil { + err = msgp.WrapError(err, "SK") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *VRFSecrets) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*VRFSecrets) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *VRFSecrets) Msgsize() (s int) { + s = 1 + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 3 + msgp.ArrayHeaderSize + (64 * (msgp.ByteSize)) + return +} + +// MsgIsZero returns whether this is a zero value +func (z *VRFSecrets) MsgIsZero() bool { + return ((*z).PK == (VrfPubkey{})) && ((*z).SK == (VrfPrivkey{})) +} + // MarshalMsg implements msgp.Marshaler func (z *VrfOutput) MarshalMsg(b []byte) (o []byte, err error) { o = msgp.Require(b, z.Msgsize()) diff --git a/crypto/msgp_gen_test.go b/crypto/msgp_gen_test.go index 6b4266149a..cdf29cb7d4 100644 --- a/crypto/msgp_gen_test.go +++ b/crypto/msgp_gen_test.go @@ -877,6 +877,130 @@ func BenchmarkUnmarshalSignature(b *testing.B) { } } +func TestMarshalUnmarshalSignatureSecrets(t *testing.T) { + v := SignatureSecrets{} + bts, err := v.MarshalMsg(nil) + if err != nil { + t.Fatal(err) + } + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingSignatureSecrets(t *testing.T) { + protocol.RunEncodingTest(t, &SignatureSecrets{}) +} + +func BenchmarkMarshalMsgSignatureSecrets(b *testing.B) { + v := SignatureSecrets{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgSignatureSecrets(b *testing.B) { + v := SignatureSecrets{} + bts := make([]byte, 0, v.Msgsize()) + bts, _ = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts, _ = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalSignatureSecrets(b *testing.B) { + v := SignatureSecrets{} + bts, _ := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalVRFSecrets(t *testing.T) { + v := VRFSecrets{} + bts, err := v.MarshalMsg(nil) + if err != nil { + t.Fatal(err) + } + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingVRFSecrets(t *testing.T) { + protocol.RunEncodingTest(t, &VRFSecrets{}) +} + +func BenchmarkMarshalMsgVRFSecrets(b *testing.B) { + v := VRFSecrets{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgVRFSecrets(b *testing.B) { + v := VRFSecrets{} + bts := make([]byte, 0, v.Msgsize()) + bts, _ = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts, _ = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalVRFSecrets(b *testing.B) { + v := VRFSecrets{} + bts, _ := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + func TestMarshalUnmarshalVrfOutput(t *testing.T) { v := VrfOutput{} bts, err := v.MarshalMsg(nil) diff --git a/crypto/vrf.go b/crypto/vrf.go index 53a13a6a64..25de87e7cb 100644 --- a/crypto/vrf.go +++ b/crypto/vrf.go @@ -17,8 +17,14 @@ package crypto // #cgo CFLAGS: -Wall -std=c99 -// #cgo CFLAGS: -I${SRCDIR}/include/ -// #cgo LDFLAGS: ${SRCDIR}/lib/libsodium.a +// #cgo darwin,amd64 CFLAGS: -I${SRCDIR}/libs/darwin/amd64/include +// #cgo darwin,amd64 LDFLAGS: ${SRCDIR}/libs/darwin/amd64/lib/libsodium.a +// #cgo linux,amd64 CFLAGS: -I${SRCDIR}/libs/linux/amd64/include +// #cgo linux,amd64 LDFLAGS: ${SRCDIR}/libs/linux/amd64/lib/libsodium.a +// #cgo linux,arm64 CFLAGS: -I${SRCDIR}/libs/linux/arm64/include +// #cgo linux,arm64 LDFLAGS: ${SRCDIR}/libs/linux/arm64/lib/libsodium.a +// #cgo linux,arm CFLAGS: -I${SRCDIR}/libs/linux/arm/include +// #cgo linux,arm LDFLAGS: ${SRCDIR}/libs/linux/arm/lib/libsodium.a // #include // #include "sodium.h" import "C" @@ -39,6 +45,8 @@ type VRFProof = VrfProof // VRFSecrets is a wrapper for a VRF keypair. Use *VrfPrivkey instead type VRFSecrets struct { + _struct struct{} `codec:""` + PK VrfPubkey SK VrfPrivkey } diff --git a/daemon/algod/server.go b/daemon/algod/server.go index 6437f6ce91..63ab8e51fb 100644 --- a/daemon/algod/server.go +++ b/daemon/algod/server.go @@ -59,7 +59,7 @@ type Server struct { } // Initialize creates a Node instance with applicable network services -func (s *Server) Initialize(cfg config.Local) error { +func (s *Server) Initialize(cfg config.Local, phonebookAddresses []string) error { // set up node s.log = logging.Base() @@ -119,13 +119,7 @@ func (s *Server) Initialize(cfg config.Local) error { NodeExporterPath: cfg.NodeExporterPath, }) - ex, err := os.Executable() - if err != nil { - return fmt.Errorf("cannot locate node executable: %s", err) - } - phonebookDir := filepath.Dir(ex) - - s.node, err = node.MakeFull(s.log, s.RootPath, cfg, phonebookDir, s.Genesis) + s.node, err = node.MakeFull(s.log, s.RootPath, cfg, phonebookAddresses, s.Genesis) if os.IsNotExist(err) { return fmt.Errorf("node has not been installed: %s", err) } @@ -272,9 +266,3 @@ func (s *Server) Stop() { os.Remove(s.netFile) os.Remove(s.netListenFile) } - -// OverridePhonebook is used to replace the phonebook associated with -// the server's node. -func (s *Server) OverridePhonebook(dialOverride ...string) { - s.node.ReplacePeerList(dialOverride...) -} diff --git a/daemon/kmd/wallet/driver/ledger.go b/daemon/kmd/wallet/driver/ledger.go index 4ebddf1885..3383288687 100644 --- a/daemon/kmd/wallet/driver/ledger.go +++ b/daemon/kmd/wallet/driver/ledger.go @@ -18,10 +18,12 @@ package driver import ( "bytes" + "crypto/sha512" "encoding/binary" "errors" "fmt" "sort" + "strings" "github.com/algorand/go-deadlock" @@ -36,6 +38,7 @@ import ( const ( ledgerWalletDriverName = "ledger" ledgerWalletDriverVersion = 1 + ledgerIDLen = 16 ledgerClass = uint8(0x80) ledgerInsGetPublicKey = uint8(0x03) @@ -116,14 +119,15 @@ func (lwd *LedgerWalletDriver) scanWalletsLocked() error { // Try to open each new device, skipping ones that are already open. var newDevs []LedgerUSB for _, info := range infos { - if curPaths[info.Path] { - delete(curPaths, info.Path) + walletID := pathToID(info.Path) + if curPaths[walletID] { + delete(curPaths, walletID) continue } dev, err := info.Open() if err != nil { - lwd.log.Warnf("enumerated but failed to open ledger %x: %v", info.ProductID, err) + lwd.log.Warnf("enumerated but failed to open ledger %s %x: %v", info.Path, info.ProductID, err) continue } @@ -141,13 +145,22 @@ func (lwd *LedgerWalletDriver) scanWalletsLocked() error { delete(lwd.wallets, deadPath) } - // Add in new devices + // Add in new ledger wallets if they appear valid for _, dev := range newDevs { - id := dev.USBInfo().Path - lwd.wallets[id] = &LedgerWallet{ + newWallet := &LedgerWallet{ dev: dev, } + + // Check that device responds to Algorand app requests + _, err := newWallet.ListKeys() + if err != nil { + continue + } + + id := pathToID(dev.USBInfo().Path) + lwd.wallets[id] = newWallet } + return nil } @@ -211,15 +224,27 @@ func (lw *LedgerWallet) ExportMasterDerivationKey(pw []byte) (crypto.MasterDeriv return crypto.MasterDerivationKey{}, errNotSupported } +func pathToID(path string) string { + // The Path USB info field is platform-dependent and sometimes + // very long. We hash it to make the wallet name/ID less unwieldy + pathHashFull := sha512.Sum512_256([]byte(path)) + return fmt.Sprintf("%x", pathHashFull[:ledgerIDLen]) +} + // Metadata implements the Wallet interface. func (lw *LedgerWallet) Metadata() (wallet.Metadata, error) { lw.mu.Lock() defer lw.mu.Unlock() info := lw.dev.USBInfo() + + walletID := pathToID(info.Path) + walletName := fmt.Sprintf("%s-%s-%s-%s", info.Manufacturer, info.Product, info.Serial, walletID) + walletName = strings.Replace(walletName, " ", "-", -1) + return wallet.Metadata{ - ID: []byte(info.Path), - Name: []byte(fmt.Sprintf("%s %s (serial %s, path %s)", info.Manufacturer, info.Product, info.Serial, info.Path)), + ID: []byte(walletID), + Name: []byte(walletName), DriverName: ledgerWalletDriverName, DriverVersion: ledgerWalletDriverVersion, SupportedTransactions: ledgerWalletSupportedTxs, diff --git a/daemon/kmd/wallet/driver/sqlite.go b/daemon/kmd/wallet/driver/sqlite.go index 4f80f8f49c..71a530fff1 100644 --- a/daemon/kmd/wallet/driver/sqlite.go +++ b/daemon/kmd/wallet/driver/sqlite.go @@ -44,7 +44,7 @@ const ( sqliteWalletDriverVersion = 1 sqliteWalletsDirName = "sqlite_wallets" sqliteWalletsDirPermissions = 0700 - sqliteWalletDBOptions = "_secure_delete=on&_tx_lock=exclusive" + sqliteWalletDBOptions = "_secure_delete=on&_txlock=exclusive" sqliteMaxWalletNameLen = 64 sqliteMaxWalletIDLen = 64 sqliteIntOverflow = 1 << 63 @@ -831,7 +831,7 @@ func (sw *SQLiteWallet) GenerateKey(displayMnemonic bool) (addr crypto.Digest, e return } - // Begin an exclusive database transaction (we set _tx_lock=exclusive on the + // Begin an exclusive database transaction (we set _txlock=exclusive on the // database connection string) tx, err := db.Beginx() if err != nil { diff --git a/data/account/account.go b/data/account/account.go index c97162ebd9..a61c64630d 100644 --- a/data/account/account.go +++ b/data/account/account.go @@ -111,7 +111,8 @@ func RestoreRoot(store db.Accessor) (acc Root, err error) { return } - err = protocol.Decode(raw, &acc.secrets) + acc.secrets = &crypto.SignatureSecrets{} + err = protocol.Decode(raw, acc.secrets) if err != nil { err = fmt.Errorf("RestoreRoot: error decoding account: %v", err) return @@ -165,12 +166,14 @@ func RestoreParticipation(store db.Accessor) (acc Participation, err error) { return Participation{}, err } - err = protocol.Decode(rawVRF, &acc.VRF) + acc.VRF = &crypto.VRFSecrets{} + err = protocol.Decode(rawVRF, acc.VRF) if err != nil { return Participation{}, err } - err = protocol.Decode(rawVoting, &acc.Voting) + acc.Voting = &crypto.OneTimeSignatureSecrets{} + err = protocol.Decode(rawVoting, acc.Voting) if err != nil { return Participation{}, err } diff --git a/data/account/participation.go b/data/account/participation.go index af5e403859..c2f0c1d837 100644 --- a/data/account/participation.go +++ b/data/account/participation.go @@ -100,7 +100,8 @@ func (part Participation) DeleteOldKeys(current basics.Round, proto config.Conse }) close(errorCh) } - encodedVotingSecrets := protocol.Encode(part.Voting.Snapshot()) + voting := part.Voting.Snapshot() + encodedVotingSecrets := protocol.Encode(&voting) go deleteOldKeys(encodedVotingSecrets) return errorCh } @@ -191,7 +192,8 @@ func FillDBWithParticipationKeys(store db.Accessor, address basics.Address, firs // Persist writes a Participation out to a database on the disk func (part Participation) Persist() error { rawVRF := protocol.Encode(part.VRF) - rawVoting := protocol.Encode(part.Voting.Snapshot()) + voting := part.Voting.Snapshot() + rawVoting := protocol.Encode(&voting) return part.Store.Atomic(func(tx *sql.Tx) error { err := partInstallDatabase(tx) diff --git a/data/basics/msgp_gen.go b/data/basics/msgp_gen.go index cc9b6fc442..f540d8b5d7 100644 --- a/data/basics/msgp_gen.go +++ b/data/basics/msgp_gen.go @@ -852,6 +852,9 @@ func (z AssetIndex) MarshalMsg(b []byte) (o []byte, err error) { func (_ AssetIndex) CanMarshalMsg(z interface{}) bool { _, ok := (z).(AssetIndex) + if !ok { + _, ok = (z).(*AssetIndex) + } return ok } @@ -1951,6 +1954,9 @@ func (z Round) MarshalMsg(b []byte) (o []byte, err error) { func (_ Round) CanMarshalMsg(z interface{}) bool { _, ok := (z).(Round) + if !ok { + _, ok = (z).(*Round) + } return ok } @@ -1994,6 +2000,9 @@ func (z RoundInterval) MarshalMsg(b []byte) (o []byte, err error) { func (_ RoundInterval) CanMarshalMsg(z interface{}) bool { _, ok := (z).(RoundInterval) + if !ok { + _, ok = (z).(*RoundInterval) + } return ok } @@ -2037,6 +2046,9 @@ func (z Status) MarshalMsg(b []byte) (o []byte, err error) { func (_ Status) CanMarshalMsg(z interface{}) bool { _, ok := (z).(Status) + if !ok { + _, ok = (z).(*Status) + } return ok } diff --git a/data/basics/units.go b/data/basics/units.go index 23feb02531..95fe82266a 100644 --- a/data/basics/units.go +++ b/data/basics/units.go @@ -73,6 +73,12 @@ func (a *MicroAlgos) CodecDecodeSelf(dec *codec.Decoder) { dec.MustDecode(&a.Raw) } +// CanMarshalMsg implements msgp.Marshaler +func (MicroAlgos) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(MicroAlgos) + return ok +} + // MarshalMsg implements msgp.Marshaler func (a MicroAlgos) MarshalMsg(b []byte) (o []byte, err error) { o = msgp.Require(b, msgp.Uint64Size) @@ -80,6 +86,12 @@ func (a MicroAlgos) MarshalMsg(b []byte) (o []byte, err error) { return } +// CanUnmarshalMsg implements msgp.Unmarshaler +func (*MicroAlgos) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*MicroAlgos) + return ok +} + // UnmarshalMsg implements msgp.Unmarshaler func (a *MicroAlgos) UnmarshalMsg(bts []byte) (o []byte, err error) { a.Raw, o, err = msgp.ReadUint64Bytes(bts) diff --git a/data/committee/common_test.go b/data/committee/common_test.go index bbd8c6d29d..fe2264765f 100644 --- a/data/committee/common_test.go +++ b/data/committee/common_test.go @@ -171,7 +171,7 @@ type AgreementSelector struct { // ToBeHashed implements the crypto.Hashable interface. func (sel AgreementSelector) ToBeHashed() (protocol.HashID, []byte) { - return protocol.AgreementSelector, protocol.Encode(&sel) + return protocol.AgreementSelector, protocol.EncodeReflect(&sel) } // CommitteeSize returns the size of the committee, diff --git a/data/committee/credential.go b/data/committee/credential.go index 2d5dfe2ef8..fc9abb8cc8 100644 --- a/data/committee/credential.go +++ b/data/committee/credential.go @@ -134,6 +134,7 @@ func MakeCredential(secrets *crypto.VrfPrivkey, sel Selector) UnauthenticatedCre // Less returns true if this Credential is less than the other credential; false // otherwise (i.e., >=). +// Used for breaking ties when there are multiple proposals. // // Precondition: both credentials have nonzero weight func (cred Credential) Less(otherCred Credential) bool { @@ -155,9 +156,60 @@ func (cred Credential) Selected() bool { return cred.Weight > 0 } +// lowestOutput is used for breaking ties when there are multiple proposals. +// People will vote for the proposal whose credential has the lowest lowestOutput. +// +// We hash the credential and interpret the output as a bigint. +// For credentials with weight w > 1, we hash the credential w times (with +// different counter values) and use the lowest output. +// +// This is because a weight w credential is simulating being selected to be on the +// leader committee w times, so each of the w proposals would have a different hash, +// and the lowest would win. func (cred Credential) lowestOutput() *big.Int { var lowest big.Int + h1 := cred.VrfOut + // It is important that i start at 1 rather than 0 because cred.Hashable + // was already hashed with iter = 0 earlier (in UnauthenticatedCredential.Verify) + // for determining the weight of the credential. A nonzero iter provides + // domain separation between lowestOutput and UnauthenticatedCredential.Verify + // + // If we reused the iter = 0 hash output here it would be nonuniformly + // distributed (because lowestOutput can only get called if weight > 0). + // In particular if i starts at 0 then weight-1 credentials are at a + // significant disadvantage because UnauthenticatedCredential.Verify + // wants the hash to be large but tiebreaking between proposals wants + // the hash to be small. + for i := uint64(1); i <= cred.Weight; i++ { + var h crypto.Digest + if cred.DomainSeparationEnabled { + cred.Hashable.Iter = i + h = crypto.HashObj(cred.Hashable) + } else { + var h2 crypto.Digest + binary.BigEndian.PutUint64(h2[:], i) + h = crypto.Hash(append(h1[:], h2[:]...)) + } + + if i == 1 { + lowest.SetBytes(h[:]) + } else { + var temp big.Int + temp.SetBytes(h[:]) + if temp.Cmp(&lowest) < 0 { + lowest.Set(&temp) + } + } + } + + return &lowest +} + +// TODO(upgrade): Please remove the entire lowestOutputBuggy function as soon as the corresponding protocol upgrade goes through. +func (cred Credential) lowestOutputBuggy() *big.Int { + var lowest big.Int + h1 := cred.VrfOut for i := uint64(0); i < cred.Weight; i++ { var h crypto.Digest @@ -184,6 +236,28 @@ func (cred Credential) lowestOutput() *big.Int { return &lowest } +// LessBuggy is the buggy version of Less +// TODO(upgrade): Please remove the entire LessBuggy function as soon as the corresponding protocol upgrade goes through +func (cred Credential) LessBuggy(otherCred Credential) bool { + i1 := cred.lowestOutputBuggy() + i2 := otherCred.lowestOutputBuggy() + + return i1.Cmp(i2) < 0 +} + +// LowestOutputDigest gives the lowestOutput as a crypto.Digest, which allows +// pretty-printing a proposal's lowest output. +// This function is only used for debugging. +func (cred Credential) LowestOutputDigest() crypto.Digest { + lbytes := cred.lowestOutput().Bytes() + var out crypto.Digest + if len(lbytes) > len(out) { + panic("Cred lowest output too long") + } + copy(out[len(out) - len(lbytes):], lbytes) + return out +} + func (cred hashableCredential) ToBeHashed() (protocol.HashID, []byte) { return protocol.Credential, protocol.Encode(&cred) } diff --git a/data/datatest/impls.go b/data/datatest/impls.go index 9c570a654a..1ccbeb9076 100644 --- a/data/datatest/impls.go +++ b/data/datatest/impls.go @@ -137,7 +137,7 @@ func (i ledgerImpl) ConsensusVersion(r basics.Round) (protocol.ConsensusVersion, } // EnsureDigest implements Ledger.EnsureDigest. -func (i ledgerImpl) EnsureDigest(cert agreement.Certificate, quit chan struct{}, verifier *agreement.AsyncVoteVerifier) { +func (i ledgerImpl) EnsureDigest(cert agreement.Certificate, verifier *agreement.AsyncVoteVerifier) { r := cert.Round consistencyCheck := func() bool { if r < i.NextRound() { @@ -158,14 +158,4 @@ func (i ledgerImpl) EnsureDigest(cert agreement.Certificate, quit chan struct{}, if consistencyCheck() { return } - - select { - case <-quit: - return - case <-i.Wait(r): - if !consistencyCheck() { - err := fmt.Errorf("Wait channel fired without matching block in round %v", r) - panic(err) - } - } } diff --git a/data/ledger.go b/data/ledger.go index bbfefdc059..c3f1302503 100644 --- a/data/ledger.go +++ b/data/ledger.go @@ -286,6 +286,7 @@ func (l *Ledger) EnsureValidatedBlock(vb *ledger.ValidatedBlock, c agreement.Cer // EnsureBlock ensures that the block, and associated certificate c, are // written to the ledger, or that some other block for the same round is // written to the ledger. +// This function can be called concurrently. func (l *Ledger) EnsureBlock(block *bookkeeping.Block, c agreement.Certificate) { round := block.Round() protocolErrorLogged := false diff --git a/data/ledger_test.go b/data/ledger_test.go index 76a3c902d1..4d79d7dd70 100644 --- a/data/ledger_test.go +++ b/data/ledger_test.go @@ -34,7 +34,6 @@ import ( "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/logging/telemetryspec" "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/util/execpool" ) func incaddr(user *basics.Address) { @@ -70,9 +69,6 @@ func BenchmarkAssemblePayset(b *testing.B) { secrets := make([]*crypto.SignatureSecrets, numUsers) addresses := make([]basics.Address, numUsers) - backlogPool := execpool.MakeBacklog(nil, 0, execpool.LowPriority, nil) - defer backlogPool.Shutdown() - genesis := make(map[basics.Address]basics.AccountData) for i := 0; i < numUsers; i++ { secret := keypair() @@ -164,7 +160,7 @@ func BenchmarkAssemblePayset(b *testing.B) { } b.StartTimer() newEmptyBlk := bookkeeping.MakeBlock(prev) - eval, err := l.StartEvaluator(newEmptyBlk.BlockHeader, tp, backlogPool) + eval, err := l.StartEvaluator(newEmptyBlk.BlockHeader) if err != nil { b.Errorf("could not make proposals at round %d: could not start evaluator: %v", next, err) return diff --git a/data/pools/transactionPool.go b/data/pools/transactionPool.go index efc4c6bc95..e2c47513d0 100644 --- a/data/pools/transactionPool.go +++ b/data/pools/transactionPool.go @@ -451,16 +451,6 @@ func (pool *TransactionPool) OnNewBlock(block bookkeeping.Block, delta ledger.St } } -// alwaysVerifiedPool implements ledger.VerifiedTxnCache and returns every -// transaction as verified. -type alwaysVerifiedPool struct { - pool *TransactionPool -} - -func (*alwaysVerifiedPool) Verified(txn transactions.SignedTxn, params verify.Params) bool { - return true -} - func (pool *TransactionPool) addToPendingBlockEvaluatorOnce(txgroup []transactions.SignedTxn) error { r := pool.pendingBlockEvaluator.Round() + pool.numPendingWholeBlocks for _, tx := range txgroup { @@ -521,7 +511,7 @@ func (pool *TransactionPool) recomputeBlockEvaluator(committedTxIds map[transact next := bookkeeping.MakeBlock(prev) pool.numPendingWholeBlocks = 0 - pool.pendingBlockEvaluator, err = pool.ledger.StartEvaluator(next.BlockHeader, &alwaysVerifiedPool{pool}, nil) + pool.pendingBlockEvaluator, err = pool.ledger.StartEvaluator(next.BlockHeader) if err != nil { logging.Base().Warnf("TransactionPool.recomputeBlockEvaluator: cannot start evaluator: %v", err) return diff --git a/data/pools/transactionPool_test.go b/data/pools/transactionPool_test.go index 757b14b0fe..9cbd86d10a 100644 --- a/data/pools/transactionPool_test.go +++ b/data/pools/transactionPool_test.go @@ -102,7 +102,7 @@ func newBlockEvaluator(t TestingT, l *ledger.Ledger) *ledger.BlockEvaluator { require.NoError(t, err) next := bookkeeping.MakeBlock(prev) - eval, err := l.StartEvaluator(next.BlockHeader, &alwaysVerifiedPool{}, nil) + eval, err := l.StartEvaluator(next.BlockHeader) require.NoError(t, err) return eval diff --git a/data/transactions/logic/assembler.go b/data/transactions/logic/assembler.go index c0262a080a..dd995b7c4a 100644 --- a/data/transactions/logic/assembler.go +++ b/data/transactions/logic/assembler.go @@ -775,10 +775,14 @@ func typecheck(expected, got StackType) bool { } func filterFieldsForLineComment(fields []string) []string { + prevField := "" for i, s := range fields { if strings.HasPrefix(s, "//") { - return fields[:i] + if prevField != "base64" && prevField != "b64" { + return fields[:i] + } } + prevField = s } return fields } diff --git a/data/transactions/logic/assembler_test.go b/data/transactions/logic/assembler_test.go index 9daf98e579..f3975e94ff 100644 --- a/data/transactions/logic/assembler_test.go +++ b/data/transactions/logic/assembler_test.go @@ -240,6 +240,25 @@ bnz wat` require.Nil(t, program) } +func TestAssembleBase64(t *testing.T) { + text := `byte base64 //GWRM+yy3BCavBDXO/FYTNZ6o2Jai5edsMCBdDEz+0= +byte base64 avGWRM+yy3BCavBDXO/FYTNZ6o2Jai5edsMCBdDEz//= +// +//text +== +int 1 //sometext +&& //somemoretext +== +byte b64 //GWRM+yy3BCavBDXO/FYTNZ6o2Jai5edsMCBdDEz+8= +byte b64 avGWRM+yy3BCavBDXO/FYTNZ6o2Jai5edsMCBdDEz//= +== +||` + program, err := AssembleString(text) + require.NoError(t, err) + s := hex.EncodeToString(program) + require.Equal(t, "01200101260320fff19644cfb2cb70426af0435cefc5613359ea8d896a2e5e76c30205d0c4cfed206af19644cfb2cb70426af0435cefc5613359ea8d896a2e5e76c30205d0c4cfff20fff19644cfb2cb70426af0435cefc5613359ea8d896a2e5e76c30205d0c4cfef2829122210122a291211", s) +} + func TestAssembleRejectUnkLabel(t *testing.T) { text := `int 1 bnz nowhere` diff --git a/data/transactions/msgp_gen.go b/data/transactions/msgp_gen.go index 56e2bb1c86..b59a4327f6 100644 --- a/data/transactions/msgp_gen.go +++ b/data/transactions/msgp_gen.go @@ -1504,6 +1504,9 @@ func (z MinFeeError) MarshalMsg(b []byte) (o []byte, err error) { func (_ MinFeeError) CanMarshalMsg(z interface{}) bool { _, ok := (z).(MinFeeError) + if !ok { + _, ok = (z).(*MinFeeError) + } return ok } @@ -1722,6 +1725,9 @@ func (z Payset) MarshalMsg(b []byte) (o []byte, err error) { func (_ Payset) CanMarshalMsg(z interface{}) bool { _, ok := (z).(Payset) + if !ok { + _, ok = (z).(*Payset) + } return ok } diff --git a/data/transactions/payment_test.go b/data/transactions/payment_test.go index 6bd3fd6249..ec62805d32 100644 --- a/data/transactions/payment_test.go +++ b/data/transactions/payment_test.go @@ -45,28 +45,28 @@ func TestAlgosEncoding(t *testing.T) { var i uint64 a.Raw = 222233333 - err := protocol.Decode(protocol.Encode(a), &b) + err := protocol.Decode(protocol.Encode(&a), &b) if err != nil { panic(err) } require.Equal(t, a, b) a.Raw = 12345678 - err = protocol.Decode(protocol.Encode(a), &i) + err = protocol.DecodeReflect(protocol.Encode(a), &i) if err != nil { panic(err) } require.Equal(t, a.Raw, i) i = 87654321 - err = protocol.Decode(protocol.Encode(i), &a) + err = protocol.Decode(protocol.EncodeReflect(i), &a) if err != nil { panic(err) } require.Equal(t, a.Raw, i) x := true - err = protocol.Decode(protocol.Encode(x), &a) + err = protocol.Decode(protocol.EncodeReflect(x), &a) if err == nil { panic("decode of bool into MicroAlgos succeeded") } diff --git a/data/txHandler.go b/data/txHandler.go index b2d7c2287c..9d27621840 100644 --- a/data/txHandler.go +++ b/data/txHandler.go @@ -113,7 +113,7 @@ func (handler *TxHandler) Stop() { func reencode(stxns []transactions.SignedTxn) []byte { var result [][]byte for _, stxn := range stxns { - result = append(result, protocol.Encode(stxn)) + result = append(result, protocol.Encode(&stxn)) } return bytes.Join(result, nil) } diff --git a/docker/build/Dockerfile-deploy b/docker/build/Dockerfile-deploy index 69fdbd3145..356298eab8 100644 --- a/docker/build/Dockerfile-deploy +++ b/docker/build/Dockerfile-deploy @@ -8,7 +8,7 @@ ENV GOROOT=/usr/local/go \ GOPATH=$HOME/go RUN mkdir -p $GOPATH/src/github.com/algorand WORKDIR $GOPATH/src/github.com/algorand -COPY ./go-algorand ./go-algorand/ +COPY . ./go-algorand/ ENV PATH=$GOPATH/bin:$GOROOT/bin:$PATH \ BRANCH=${BRANCH} \ CHANNEL=${CHANNEL} \ diff --git a/docker/build/arm.Dockerfile b/docker/build/arm.Dockerfile new file mode 100644 index 0000000000..bc2a79917e --- /dev/null +++ b/docker/build/arm.Dockerfile @@ -0,0 +1,30 @@ +FROM arm32v6/golang:1.12-alpine +RUN apk update && \ + apk add make && \ + apk add bash && \ + apk add git && \ + apk add python3 && \ + apk add boost-dev && \ + apk add expect && \ + apk add jq && \ + apk add autoconf && \ + apk add --update alpine-sdk && \ + apk add libtool && \ + apk add automake && \ + apk add fmt && \ + apk add build-base && \ + apk add musl-dev && \ + apk add sqlite + +RUN apk add dpkg && \ + wget http://deb.debian.org/debian/pool/main/s/shellcheck/shellcheck_0.5.0-3_armhf.deb && \ + dpkg-deb -R shellcheck_0.5.0-3_armhf.deb shellcheck && \ + cd shellcheck && \ + mv usr/bin/shellcheck /usr/bin/ +COPY . $GOPATH/src/github.com/algorand/go-algorand +WORKDIR $GOPATH/src/github.com/algorand/go-algorand +ENV GCC_CONFIG="--with-arch=armv6" +RUN make ci-deps && make clean +RUN rm -rf $GOPATH/src/github.com/algorand/go-algorand && \ + mkdir -p $GOPATH/src/github.com/algorand/go-algorand +CMD ["/bin/bash"] diff --git a/docker/build/cicd.Dockerfile b/docker/build/cicd.Dockerfile new file mode 100644 index 0000000000..d2c58ee3f2 --- /dev/null +++ b/docker/build/cicd.Dockerfile @@ -0,0 +1,29 @@ +ARG ARCH="amd64" + +FROM ${ARCH}/centos:7 +ENV GOLANG_VERSION 1.12 +ARG ARCH="amd64" +RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm && \ + yum update -y && \ + yum install -y autoconf wget awscli git gnupg2 nfs-utils python36 sqlite3 boost-devel expect jq libtool gcc-c++ libstdc++-devel libstdc++-static rpmdevtools createrepo rpm-sign bzip2 which ShellCheck +WORKDIR /root +RUN wget https://dl.google.com/go/go${GOLANG_VERSION}.linux-${ARCH%v*}.tar.gz \ + && tar -xvf go${GOLANG_VERSION}.linux-${ARCH%v*}.tar.gz && \ + mv go /usr/local +ENV GOROOT=/usr/local/go \ + GOPATH=$HOME/go +RUN mkdir -p $GOPATH/src/github.com/algorand +COPY . $GOPATH/src/github.com/algorand/go-algorand +ENV PATH=$GOPATH/bin:$GOROOT/bin:$PATH \ + BRANCH=${BRANCH} \ + CHANNEL=${CHANNEL} \ + BUILDCHANNEL=${BUILDCHANNEL} \ + DEFAULTNETWORK=${DEFAULTNETWORK} \ + FULLVERSION=${FULLVERSION} \ + PKG_ROOT=${PKG_ROOT} +WORKDIR $GOPATH/src/github.com/algorand/go-algorand +RUN make ci-deps && make clean +RUN rm -rf $GOPATH/src/github.com/algorand/go-algorand && \ + mkdir -p $GOPATH/src/github.com/algorand/go-algorand +RUN echo "vm.max_map_count = 262144" >> /etc/sysctl.conf +CMD ["/bin/bash"] diff --git a/gen/generate.go b/gen/generate.go index c80186b151..f062a55541 100644 --- a/gen/generate.go +++ b/gen/generate.go @@ -21,7 +21,12 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" "sort" + "sync" + "sync/atomic" + + "github.com/algorand/go-deadlock" "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/data/account" @@ -51,7 +56,7 @@ type genesisAllocation struct { } // GenerateGenesisFiles generates the genesis.json file and wallet files for a give genesis configuration. -func GenerateGenesisFiles(genesisData GenesisData, outDir string, verbose bool) error { +func GenerateGenesisFiles(genesisData GenesisData, consensus config.ConsensusProtocols, outDir string, verbose bool) error { err := os.Mkdir(outDir, os.ModeDir|os.FileMode(0777)) if err != nil && os.IsNotExist(err) { return fmt.Errorf("couldn't make output directory '%s': %v", outDir, err.Error()) @@ -93,127 +98,183 @@ func GenerateGenesisFiles(genesisData GenesisData, outDir string, verbose bool) genesisData.RewardsPool = defaultPoolAddr } - return generateGenesisFiles(outDir, proto, genesisData.NetworkName, genesisData.VersionModifier, allocation, genesisData.FirstPartKeyRound, genesisData.LastPartKeyRound, genesisData.PartKeyDilution, genesisData.FeeSink, genesisData.RewardsPool, genesisData.Comment, verbose) + consensusParams, ok := consensus[proto] + if !ok { + return fmt.Errorf("protocol %s not supported", proto) + } + + return generateGenesisFiles(outDir, proto, consensusParams, genesisData.NetworkName, genesisData.VersionModifier, allocation, genesisData.FirstPartKeyRound, genesisData.LastPartKeyRound, genesisData.PartKeyDilution, genesisData.FeeSink, genesisData.RewardsPool, genesisData.Comment, verbose) } -func generateGenesisFiles(outDir string, proto protocol.ConsensusVersion, netName string, schemaVersionModifier string, +func generateGenesisFiles(outDir string, protoVersion protocol.ConsensusVersion, protoParams config.ConsensusParams, netName string, schemaVersionModifier string, allocation []genesisAllocation, firstWalletValid uint64, lastWalletValid uint64, partKeyDilution uint64, feeSink, rewardsPool basics.Address, comment string, verbose bool) (err error) { genesisAddrs := make(map[string]basics.Address) records := make(map[string]basics.AccountData) - params, ok := config.Consensus[proto] - if !ok { - return fmt.Errorf("protocol %s not supported", proto) - } if partKeyDilution == 0 { - partKeyDilution = params.DefaultKeyDilution + partKeyDilution = protoParams.DefaultKeyDilution } // Sort account names alphabetically sort.SliceStable(allocation, func(i, j int) bool { return allocation[i].Name < allocation[j].Name }) - rootKeyCreated := 0 - partKeyCreated := 0 - - for _, wallet := range allocation { - var root account.Root - var part account.Participation - - wfilename := filepath.Join(outDir, config.RootKeyFilename(wallet.Name)) - pfilename := filepath.Join(outDir, config.PartKeyFilename(wallet.Name, firstWalletValid, lastWalletValid)) + rootKeyCreated := int64(0) + partKeyCreated := int64(0) + + pendingWallets := make(chan genesisAllocation, len(allocation)) + + concurrentWalletGenerators := runtime.NumCPU() * 2 + errorsChannel := make(chan error, concurrentWalletGenerators) + verbosedOutput := make(chan string) + var creatingWalletsWaitGroup sync.WaitGroup + var writeMu deadlock.Mutex + + createWallet := func() { + var err error + defer creatingWalletsWaitGroup.Done() + for { + var wallet genesisAllocation + select { + case wallet = <-pendingWallets: + default: + return + } + var root account.Root + var part account.Participation - root, rootDB, rootkeyErr := loadRootKey(wfilename) - if rootkeyErr != nil && !os.IsNotExist(rootkeyErr) { - return rootkeyErr - } + wfilename := filepath.Join(outDir, config.RootKeyFilename(wallet.Name)) + pfilename := filepath.Join(outDir, config.PartKeyFilename(wallet.Name, firstWalletValid, lastWalletValid)) - part, partDB, partkeyErr := loadPartKeys(pfilename) - if partkeyErr != nil && !os.IsNotExist(partkeyErr) && partkeyErr != account.ErrUnsupportedSchema { - return partkeyErr - } + root, rootDB, rootkeyErr := loadRootKey(wfilename) + if rootkeyErr != nil && !os.IsNotExist(rootkeyErr) { + errorsChannel <- rootkeyErr + return + } - if rootkeyErr == nil && partkeyErr == nil { - if verbose { - fmt.Println("Reusing existing wallet:", wfilename, pfilename) + part, partDB, partkeyErr := loadPartKeys(pfilename) + if partkeyErr != nil && !os.IsNotExist(partkeyErr) && partkeyErr != account.ErrUnsupportedSchema { + errorsChannel <- partkeyErr + return } - } else { - // At this point either rootKeys is valid or rootkeyErr != nil - // Likewise, either partkey is valid or partkeyErr != nil - if rootkeyErr != nil { - os.Remove(wfilename) - - rootDB, err = db.MakeErasableAccessor(wfilename) - if err != nil { - err = fmt.Errorf("couldn't open root DB accessor %s: %v", wfilename, err) - } else { - root, err = account.GenerateRoot(rootDB) + + if rootkeyErr == nil && partkeyErr == nil { + if verbose { + verbosedOutput <- fmt.Sprintln("Reusing existing wallet:", wfilename, pfilename) } - if err != nil { + } else { + // At this point either rootKeys is valid or rootkeyErr != nil + // Likewise, either partkey is valid or partkeyErr != nil + if rootkeyErr != nil { os.Remove(wfilename) - return + + rootDB, err = db.MakeErasableAccessor(wfilename) + if err != nil { + err = fmt.Errorf("couldn't open root DB accessor %s: %v", wfilename, err) + } else { + root, err = account.GenerateRoot(rootDB) + } + if err != nil { + os.Remove(wfilename) + errorsChannel <- err + return + } + if verbose { + verbosedOutput <- fmt.Sprintf("Created new rootkey: %s", wfilename) + } + atomic.AddInt64(&rootKeyCreated, 1) } - if verbose { - fmt.Printf("Created new rootkey: %s\n", wfilename) + + if partkeyErr != nil && wallet.Online == basics.Online { + os.Remove(pfilename) + + partDB, err = db.MakeErasableAccessor(pfilename) + if err != nil { + err = fmt.Errorf("couldn't open participation DB accessor %s: %v", pfilename, err) + os.Remove(pfilename) + errorsChannel <- err + return + } + + part, err = account.FillDBWithParticipationKeys(partDB, root.Address(), basics.Round(firstWalletValid), basics.Round(lastWalletValid), partKeyDilution) + if err != nil { + err = fmt.Errorf("could not generate new participation file %s: %v", pfilename, err) + os.Remove(pfilename) + errorsChannel <- err + return + } + if verbose { + verbosedOutput <- fmt.Sprintf("Created new partkey: %s", pfilename) + } + atomic.AddInt64(&partKeyCreated, 1) } - rootKeyCreated++ } - if partkeyErr != nil && wallet.Online == basics.Online { - os.Remove(pfilename) + var data basics.AccountData + data.Status = wallet.Online + data.MicroAlgos.Raw = wallet.Stake + if wallet.Online == basics.Online { + data.VoteID = part.VotingSecrets().OneTimeSignatureVerifier + data.SelectionID = part.VRFSecrets().PK + data.VoteFirstValid = part.FirstValid + data.VoteLastValid = part.LastValid + data.VoteKeyDilution = part.KeyDilution + } - partDB, err = db.MakeErasableAccessor(pfilename) - if err != nil { - err = fmt.Errorf("couldn't open participation DB accessor %s: %v", pfilename, err) - os.Remove(pfilename) - return - } + writeMu.Lock() + records[wallet.Name] = data - part, err = account.FillDBWithParticipationKeys(partDB, root.Address(), basics.Round(firstWalletValid), basics.Round(lastWalletValid), partKeyDilution) - if err != nil { - err = fmt.Errorf("could not generate new participation file %s: %v", pfilename, err) - os.Remove(pfilename) - return - } - if verbose { - fmt.Printf("Created new partkey: %s\n", pfilename) - } - partKeyCreated++ + genesisAddrs[wallet.Name] = root.Address() + writeMu.Unlock() + + rootDB.Close() + if wallet.Online == basics.Online { + partDB.Close() } } + } - var data basics.AccountData - data.Status = wallet.Online - data.MicroAlgos.Raw = wallet.Stake - if wallet.Online == basics.Online { - data.VoteID = part.VotingSecrets().OneTimeSignatureVerifier - data.SelectionID = part.VRFSecrets().PK - data.VoteFirstValid = part.FirstValid - data.VoteLastValid = part.LastValid - data.VoteKeyDilution = part.KeyDilution - } + for _, wallet := range allocation { + pendingWallets <- wallet + } + + if verbose { + // create a listener for the verbosedOutput + go func() { + for textOut := range verbosedOutput { + fmt.Printf("%s\n", textOut) + } + }() + } - records[wallet.Name] = data + creatingWalletsWaitGroup.Add(concurrentWalletGenerators) + for routinesCounter := 0; routinesCounter < concurrentWalletGenerators; routinesCounter++ { + go createWallet() + } - genesisAddrs[wallet.Name] = root.Address() + // wait until all goroutines are done. + creatingWalletsWaitGroup.Wait() - rootDB.Close() - if wallet.Online == basics.Online { - partDB.Close() - } + close(verbosedOutput) + + // check to see if we had any errors. + select { + case err := <-errorsChannel: + return err + default: } genesisAddrs["FeeSink"] = feeSink genesisAddrs["RewardsPool"] = rewardsPool if verbose { - fmt.Println(proto, config.Consensus[proto].MinBalance) + fmt.Println(protoVersion, protoParams.MinBalance) } records["FeeSink"] = basics.AccountData{ Status: basics.NotParticipating, - MicroAlgos: basics.MicroAlgos{Raw: config.Consensus[proto].MinBalance}, + MicroAlgos: basics.MicroAlgos{Raw: protoParams.MinBalance}, } records["RewardsPool"] = basics.AccountData{ Status: basics.NotParticipating, @@ -222,7 +283,7 @@ func generateGenesisFiles(outDir string, proto protocol.ConsensusVersion, netNam sinkAcct := genesisAllocation{ Name: "FeeSink", - Stake: config.Consensus[proto].MinBalance, + Stake: protoParams.MinBalance, Online: basics.NotParticipating, } poolAcct := genesisAllocation{ @@ -238,7 +299,7 @@ func generateGenesisFiles(outDir string, proto protocol.ConsensusVersion, netNam g := bookkeeping.Genesis{ SchemaID: schemaID + schemaVersionModifier, - Proto: proto, + Proto: protoVersion, Network: protocol.NetworkID(netName), Timestamp: 0, FeeSink: feeSink.String(), diff --git a/gen/generate_test.go b/gen/generate_test.go new file mode 100644 index 0000000000..47748a7448 --- /dev/null +++ b/gen/generate_test.go @@ -0,0 +1,102 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package gen + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + "testing" + + "github.com/algorand/go-algorand/data/account" + "github.com/algorand/go-algorand/util/db" + + "github.com/stretchr/testify/require" +) + +func TestLoadMultiRootKeyConcurrent(t *testing.T) { + t.Skip() // skip in auto-test mode + a := require.New(t) + tempDir, err := ioutil.TempDir("", "loadkey-test-") + a.NoError(err) + defer os.RemoveAll(tempDir) + + const numThreads = 100 + var wg sync.WaitGroup + wg.Add(numThreads) + + for i := 0; i < numThreads; i++ { + go func(idx int) { + defer wg.Done() + wallet := filepath.Join(tempDir, fmt.Sprintf("wallet%d", idx+1)) + rootDB, err := db.MakeErasableAccessor(wallet) + defer rootDB.Close() + a.NoError(err) + _, err = account.GenerateRoot(rootDB) + a.NoError(err) + }(i) + } + + wg.Wait() + + for r := 0; r < 1000; r++ { + var wg sync.WaitGroup + wg.Add(numThreads) + for i := 0; i < numThreads; i++ { + go func(idx int) { + defer wg.Done() + wallet := filepath.Join(tempDir, fmt.Sprintf("wallet%d", idx+1)) + _, db, err := loadRootKey(wallet) + a.NoError(err) + db.Close() + }(i) + } + wg.Wait() + } +} + +func TestLoadSingleRootKeyConcurrent(t *testing.T) { + t.Skip() // skip in auto-test mode + a := require.New(t) + tempDir, err := ioutil.TempDir("", "loadkey-test-") + a.NoError(err) + defer os.RemoveAll(tempDir) + + wallet := filepath.Join(tempDir, "wallet1") + rootDB, err := db.MakeErasableAccessor(wallet) + a.NoError(err) + _, err = account.GenerateRoot(rootDB) + rootDB.Close() + a.NoError(err) + + const numThreads = 10000 + var wg sync.WaitGroup + wg.Add(numThreads) + + for i := 0; i < numThreads; i++ { + go func(idx int) { + defer wg.Done() + wallet := filepath.Join(tempDir, "wallet1") + _, db, err := loadRootKey(wallet) + a.NoError(err) + db.Close() + }(i) + } + wg.Wait() +} diff --git a/go.mod b/go.mod index 84fb806f50..727a471038 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.12 require ( github.com/algorand/go-codec/codec v0.0.0-20190507210007-269d70b6135d github.com/algorand/go-deadlock v0.0.0-20181221160745-78d8cb5e2759 - github.com/algorand/msgp v1.1.37 + github.com/algorand/msgp v1.1.39 github.com/algorand/websocket v1.4.1 github.com/aws/aws-sdk-go v1.16.5 github.com/cpuguy83/go-md2man v1.0.8 // indirect @@ -31,6 +31,7 @@ require ( github.com/mattn/go-colorable v0.0.9 // indirect github.com/mattn/go-isatty v0.0.4 // indirect github.com/mattn/go-sqlite3 v1.10.0 + github.com/miekg/dns v1.1.27 github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect github.com/olivere/elastic v6.2.14+incompatible github.com/onsi/ginkgo v1.8.0 // indirect diff --git a/go.sum b/go.sum index 569f26213e..e41c9c54fb 100644 --- a/go.sum +++ b/go.sum @@ -4,12 +4,10 @@ github.com/algorand/go-codec/codec v0.0.0-20190507210007-269d70b6135d h1:W9MgGUo github.com/algorand/go-codec/codec v0.0.0-20190507210007-269d70b6135d/go.mod h1:qm6LyXvDa1+uZJxaVg8X+OEjBqt/zDinDa2EohtTDxU= github.com/algorand/go-deadlock v0.0.0-20181221160745-78d8cb5e2759 h1:IiCuOE1YCReVyEr1IQHKTBTvFLKdeBCfQuxrqhniq+I= github.com/algorand/go-deadlock v0.0.0-20181221160745-78d8cb5e2759/go.mod h1:Kve3O9VpxZIHsPzpfxNdyFltFU9jBTeVYMYxSC99tdg= -github.com/algorand/msgp v1.1.33 h1:v4WXJa2r9Z+hBcSTx7sLuzybU0zeGdWxgC67JI3xz3I= -github.com/algorand/msgp v1.1.33/go.mod h1:LtOntbYiCHj/Sl/Sqxtf8CZOrDt2a8Dv3tLaS6mcnUE= -github.com/algorand/msgp v1.1.34 h1:Now8/CFnsea11GYboThekL2SGFIOSoVeioU8mSSDKIc= -github.com/algorand/msgp v1.1.34/go.mod h1:LtOntbYiCHj/Sl/Sqxtf8CZOrDt2a8Dv3tLaS6mcnUE= -github.com/algorand/msgp v1.1.37 h1:RzEtCgliE4rRqzrHKI8Jy1RdoiDLYWBqstzB2RKVyH0= -github.com/algorand/msgp v1.1.37/go.mod h1:LtOntbYiCHj/Sl/Sqxtf8CZOrDt2a8Dv3tLaS6mcnUE= +github.com/algorand/msgp v1.1.38 h1:nR125Hsit9jn+acfkcq97w1fsxkt3z1JGOFtrgFx0UI= +github.com/algorand/msgp v1.1.38/go.mod h1:LtOntbYiCHj/Sl/Sqxtf8CZOrDt2a8Dv3tLaS6mcnUE= +github.com/algorand/msgp v1.1.39 h1:sVDmS0CH7hDtJHWwNqwy3wgu5DQ9EM3VBIXS3KaNlNI= +github.com/algorand/msgp v1.1.39/go.mod h1:LtOntbYiCHj/Sl/Sqxtf8CZOrDt2a8Dv3tLaS6mcnUE= github.com/algorand/websocket v1.4.1 h1:FPoNHI8i2VZWZzhCscY8JTzsAE7Vv73753cMbzb3udk= github.com/algorand/websocket v1.4.1/go.mod h1:0nFSn+xppw/GZS9hgWPS3b8/4FcA3Pj7XQxm+wqHGx8= github.com/aws/aws-sdk-go v1.16.5 h1:NVxzZXIuwX828VcJrpNxxWjur1tlOBISdMdDdHIKHcc= @@ -76,6 +74,8 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM= +github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/olivere/elastic v6.2.14+incompatible h1:k+KadwNP/dkXE0/eu+T6otk1+5fe0tEpPyQJ4XVm5i8= @@ -123,6 +123,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0O golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -135,6 +136,7 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c h1:+EXw7AwNOKzPFXMZ1yNjO40aW golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13 h1:tdsQdquKbTNMsSZLqnLELJGzCANp9oXhu6zFBW6ODx4= golang.org/x/sys v0.0.0-20190902133755-9109b7679e13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -144,6 +146,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207224406-61798d64f025 h1:i84/3szN87uN9jFX/jRqUbszQto2oAsFlqPf6lbR8H4= golang.org/x/tools v0.0.0-20200207224406-61798d64f025/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/installer/config.json.example b/installer/config.json.example index c0b5eef526..a710ab850c 100644 --- a/installer/config.json.example +++ b/installer/config.json.example @@ -1,5 +1,5 @@ { - "Version": 5, + "Version": 6, "AnnounceParticipationKey": true, "Archival": false, "BaseLoggerDebugLevel": 4, @@ -9,6 +9,7 @@ "CatchupParallelBlocks": 16, "ConnectionsRateLimitingCount": 60, "ConnectionsRateLimitingWindowSeconds": 1, + "DisableOutgoingConnectionThrottling": false, "DeadlockDetection": 0, "DNSBootstrapID": ".algorand.network", "EnableIncomingMessageFilter": false, @@ -33,6 +34,7 @@ "NodeExporterPath": "./node_exporter", "OutgoingMessageFilterBucketCount": 3, "OutgoingMessageFilterBucketSize": 128, + "PeerConnectionsUpdateInterval": 3600, "PriorityPeers": {}, "ReconnectTime": 60000000000, "ReservedFDs": 256, @@ -47,5 +49,7 @@ "TxSyncIntervalSeconds": 60, "TxSyncServeResponseSize": 1000000, "TxSyncTimeoutSeconds": 30, - "PeerConnectionsUpdateInterval": 3600 + "PeerConnectionsUpdateInterval": 3600, + "DNSSecurityFlags": 1, + "EnablePingHandler": true } diff --git a/installer/system.json b/installer/system.json index 8985824659..0e0ea1cb09 100644 --- a/installer/system.json +++ b/installer/system.json @@ -1 +1,4 @@ -{"shared_server":true} +{ + "shared_server":true, + "systemd_managed": true +} diff --git a/ledger/accountdb_test.go b/ledger/accountdb_test.go index db6babcda0..ed8c3add92 100644 --- a/ledger/accountdb_test.go +++ b/ledger/accountdb_test.go @@ -160,6 +160,7 @@ func TestAccountDBInit(t *testing.T) { proto := config.Consensus[protocol.ConsensusCurrentVersion] dbs := dbOpenTest(t) + setDbLogging(t, dbs) defer dbs.close() tx, err := dbs.wdb.Handle.Begin() @@ -180,6 +181,7 @@ func TestAccountDBRound(t *testing.T) { proto := config.Consensus[protocol.ConsensusCurrentVersion] dbs := dbOpenTest(t) + setDbLogging(t, dbs) defer dbs.close() tx, err := dbs.wdb.Handle.Begin() diff --git a/ledger/acctupdates.go b/ledger/acctupdates.go index 05440629ed..23a624558f 100644 --- a/ledger/acctupdates.go +++ b/ledger/acctupdates.go @@ -161,12 +161,12 @@ func (au *accountUpdates) loadFromDisk(l ledgerForTracker) error { for loaded < latest { next := loaded + 1 - blk, aux, err := l.blockAux(next) + blk, err := l.Block(next) if err != nil { return err } - delta, err := l.trackerEvalVerified(blk, aux) + delta, err := l.trackerEvalVerified(blk) if err != nil { return err } diff --git a/ledger/acctupdates_test.go b/ledger/acctupdates_test.go index d218526bbc..ad2bc1741e 100644 --- a/ledger/acctupdates_test.go +++ b/ledger/acctupdates_test.go @@ -34,11 +34,15 @@ import ( type mockLedgerForTracker struct { dbs dbPair blocks []blockEntry + log logging.Logger } func makeMockLedgerForTracker(t *testing.T) *mockLedgerForTracker { dbs := dbOpenTest(t) - return &mockLedgerForTracker{dbs: dbs} + dblogger := logging.TestingLog(t) + dbs.rdb.SetLogger(dblogger) + dbs.wdb.SetLogger(dblogger) + return &mockLedgerForTracker{dbs: dbs, log: dblogger} } func (ml *mockLedgerForTracker) close() { @@ -49,7 +53,7 @@ func (ml *mockLedgerForTracker) Latest() basics.Round { return basics.Round(len(ml.blocks)) - 1 } -func (ml *mockLedgerForTracker) trackerEvalVerified(blk bookkeeping.Block, aux evalAux) (StateDelta, error) { +func (ml *mockLedgerForTracker) trackerEvalVerified(blk bookkeeping.Block) (StateDelta, error) { delta := StateDelta{ hdr: &bookkeeping.BlockHeader{}, } @@ -72,20 +76,12 @@ func (ml *mockLedgerForTracker) BlockHdr(rnd basics.Round) (bookkeeping.BlockHea return ml.blocks[int(rnd)].block.BlockHeader, nil } -func (ml *mockLedgerForTracker) blockAux(rnd basics.Round) (bookkeeping.Block, evalAux, error) { - if rnd > ml.Latest() { - return bookkeeping.Block{}, evalAux{}, fmt.Errorf("rnd %d out of bounds", rnd) - } - - return ml.blocks[int(rnd)].block, ml.blocks[int(rnd)].aux, nil -} - func (ml *mockLedgerForTracker) trackerDB() dbPair { return ml.dbs } func (ml *mockLedgerForTracker) trackerLog() logging.Logger { - return logging.Base() + return ml.log } func checkAcctUpdates(t *testing.T, au *accountUpdates, base basics.Round, latestRnd basics.Round, accts []map[basics.Address]basics.AccountData, rewards []uint64, proto config.ConsensusParams) { diff --git a/ledger/archival_test.go b/ledger/archival_test.go index 853450e996..b7ad33b635 100644 --- a/ledger/archival_test.go +++ b/ledger/archival_test.go @@ -59,13 +59,8 @@ func (wl *wrappedLedger) BlockHdr(rnd basics.Round) (bookkeeping.BlockHeader, er return wl.l.BlockHdr(rnd) } -func (wl *wrappedLedger) blockAux(rnd basics.Round) (bookkeeping.Block, evalAux, error) { - wl.recordBlockQuery(rnd) - return wl.l.blockAux(rnd) -} - -func (wl *wrappedLedger) trackerEvalVerified(blk bookkeeping.Block, aux evalAux) (StateDelta, error) { - return wl.l.trackerEvalVerified(blk, aux) +func (wl *wrappedLedger) trackerEvalVerified(blk bookkeeping.Block) (StateDelta, error) { + return wl.l.trackerEvalVerified(blk) } func (wl *wrappedLedger) Latest() basics.Round { @@ -109,7 +104,8 @@ func TestArchival(t *testing.T) { genesisInitState := getInitState() const inMem = true const archival = true - l, err := OpenLedger(logging.Base(), dbName, inMem, genesisInitState, archival) + log := logging.TestingLog(t) + l, err := OpenLedger(log, dbName, inMem, genesisInitState, archival) require.NoError(t, err) defer l.Close() wl := &wrappedLedger{ @@ -500,7 +496,8 @@ func TestArchivalFromNonArchival(t *testing.T) { const inMem = false // use persistent storage archival := false - l, err := OpenLedger(logging.Base(), dbPrefix, inMem, genesisInitState, archival) + log := logging.TestingLog(t) + l, err := OpenLedger(log, dbPrefix, inMem, genesisInitState, archival) require.NoError(t, err) blk := genesisInitState.Block @@ -529,7 +526,7 @@ func TestArchivalFromNonArchival(t *testing.T) { l.Close() archival = true - l, err = OpenLedger(logging.Base(), dbPrefix, inMem, genesisInitState, archival) + l, err = OpenLedger(log, dbPrefix, inMem, genesisInitState, archival) require.NoError(t, err) defer l.Close() diff --git a/ledger/blockdb.go b/ledger/blockdb.go index aabaf2b3e6..73e4abcada 100644 --- a/ledger/blockdb.go +++ b/ledger/blockdb.go @@ -28,14 +28,14 @@ import ( "github.com/algorand/go-algorand/protocol" ) +// 2019-12-15: removed column 'auxdata blob' from 'CREATE TABLE' statement. It was not explicitly removed from databases and may continue to exist with empty entries in some old databases. var blockSchema = []string{ `CREATE TABLE IF NOT EXISTS blocks ( rnd integer primary key, proto text, hdrdata blob, blkdata blob, - certdata blob, - auxdata blob)`, + certdata blob)`, } var blockResetExprs = []string{ @@ -46,7 +46,7 @@ func blockInit(tx *sql.Tx, initBlocks []bookkeeping.Block) error { for _, tableCreate := range blockSchema { _, err := tx.Exec(tableCreate) if err != nil { - return err + return fmt.Errorf("blockdb blockInit could not create table %v", err) } } @@ -57,7 +57,7 @@ func blockInit(tx *sql.Tx, initBlocks []bookkeeping.Block) error { if next == 0 { for _, blk := range initBlocks { - err = blockPut(tx, blk, agreement.Certificate{}, evalAux{}) + err = blockPut(tx, blk, agreement.Certificate{}) if err != nil { serr, ok := err.(sqlite3.Error) if ok && serr.Code == sqlite3.ErrConstraint { @@ -141,27 +141,7 @@ func blockGetCert(tx *sql.Tx, rnd basics.Round) (blk bookkeeping.Block, cert agr return } -func blockGetAux(tx *sql.Tx, rnd basics.Round) (blk bookkeeping.Block, aux evalAux, err error) { - var blkbuf []byte - var auxbuf []byte - err = tx.QueryRow("SELECT blkdata, auxdata FROM blocks WHERE rnd=?", rnd).Scan(&blkbuf, &auxbuf) - if err != nil { - if err == sql.ErrNoRows { - err = ErrNoEntry{Round: rnd} - } - - return - } - - err = protocol.Decode(blkbuf, &blk) - if err != nil { - return - } - - return -} - -func blockPut(tx *sql.Tx, blk bookkeeping.Block, cert agreement.Certificate, aux evalAux) error { +func blockPut(tx *sql.Tx, blk bookkeeping.Block, cert agreement.Certificate) error { var max sql.NullInt64 err := tx.QueryRow("SELECT MAX(rnd) FROM blocks").Scan(&max) if err != nil { @@ -180,12 +160,13 @@ func blockPut(tx *sql.Tx, blk bookkeeping.Block, cert agreement.Certificate, aux } } - _, err = tx.Exec("INSERT INTO blocks (rnd, proto, hdrdata, blkdata, certdata, auxdata) VALUES (?, ?, ?, ?, ?, ?)", - blk.Round(), blk.CurrentProtocol, - protocol.Encode(blk.BlockHeader), - protocol.Encode(blk), - protocol.Encode(cert), - protocol.Encode(aux)) + _, err = tx.Exec("INSERT INTO blocks (rnd, proto, hdrdata, blkdata, certdata) VALUES (?, ?, ?, ?, ?)", + blk.Round(), + blk.CurrentProtocol, + protocol.Encode(&blk.BlockHeader), + protocol.Encode(&blk), + protocol.Encode(&cert), + ) return err } diff --git a/ledger/blockdb_test.go b/ledger/blockdb_test.go index d57a3ad558..3a3550cead 100644 --- a/ledger/blockdb_test.go +++ b/ledger/blockdb_test.go @@ -26,13 +26,13 @@ import ( "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" + "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" ) func randomBlock(r basics.Round) blockEntry { b := bookkeeping.Block{} c := agreement.Certificate{} - a := evalAux{} b.BlockHeader.Round = r b.BlockHeader.TimeStamp = int64(crypto.RandUint64()) @@ -43,7 +43,6 @@ func randomBlock(r basics.Round) blockEntry { return blockEntry{ block: b, cert: c, - aux: a, } } @@ -52,7 +51,6 @@ func randomInitChain(proto protocol.ConsensusVersion, nblock int) []blockEntry { for i := 0; i < nblock; i++ { blkent := randomBlock(basics.Round(i)) blkent.cert = agreement.Certificate{} - blkent.aux = evalAux{} blkent.block.CurrentProtocol = proto res = append(res, blkent) } @@ -97,19 +95,21 @@ func checkBlockDB(t *testing.T, tx *sql.Tx, blocks []blockEntry) { require.NoError(t, err) require.Equal(t, blk, blocks[rnd].block) require.Equal(t, cert, blocks[rnd].cert) - - blk, aux, err := blockGetAux(tx, rnd) - require.NoError(t, err) - require.Equal(t, blk, blocks[rnd].block) - require.Equal(t, aux, blocks[rnd].aux) } _, err = blockGet(tx, basics.Round(len(blocks))) require.Error(t, err) } +func setDbLogging(t *testing.T, dbs dbPair) { + dblogger := logging.TestingLog(t) + dbs.rdb.SetLogger(dblogger) + dbs.wdb.SetLogger(dblogger) +} + func TestBlockDBEmpty(t *testing.T) { dbs := dbOpenTest(t) + setDbLogging(t, dbs) defer dbs.close() tx, err := dbs.wdb.Handle.Begin() @@ -123,6 +123,7 @@ func TestBlockDBEmpty(t *testing.T) { func TestBlockDBInit(t *testing.T) { dbs := dbOpenTest(t) + setDbLogging(t, dbs) defer dbs.close() tx, err := dbs.wdb.Handle.Begin() @@ -142,6 +143,7 @@ func TestBlockDBInit(t *testing.T) { func TestBlockDBAppend(t *testing.T) { dbs := dbOpenTest(t) + setDbLogging(t, dbs) defer dbs.close() tx, err := dbs.wdb.Handle.Begin() @@ -156,7 +158,7 @@ func TestBlockDBAppend(t *testing.T) { for i := 0; i < 10; i++ { blkent := randomBlock(basics.Round(len(blocks))) - err = blockPut(tx, blkent.block, blkent.cert, blkent.aux) + err = blockPut(tx, blkent.block, blkent.cert) require.NoError(t, err) blocks = append(blocks, blkent) diff --git a/ledger/blockqueue.go b/ledger/blockqueue.go index a76b669661..e1b34cede2 100644 --- a/ledger/blockqueue.go +++ b/ledger/blockqueue.go @@ -33,7 +33,6 @@ import ( type blockEntry struct { block bookkeeping.Block cert agreement.Certificate - aux evalAux } type blockQueue struct { @@ -92,7 +91,7 @@ func (bq *blockQueue) syncer() { err := bq.l.blockDBs.wdb.Atomic(func(tx *sql.Tx) error { for _, e := range workQ { - err0 := blockPut(tx, e.block, e.cert, e.aux) + err0 := blockPut(tx, e.block, e.cert) if err0 != nil { return err0 } @@ -156,7 +155,7 @@ func (bq *blockQueue) latestCommitted() basics.Round { return bq.lastCommitted } -func (bq *blockQueue) putBlock(blk bookkeeping.Block, cert agreement.Certificate, aux evalAux) error { +func (bq *blockQueue) putBlock(blk bookkeeping.Block, cert agreement.Certificate) error { bq.mu.Lock() defer bq.mu.Unlock() @@ -183,7 +182,6 @@ func (bq *blockQueue) putBlock(blk bookkeeping.Block, cert agreement.Certificate bq.q = append(bq.q, blockEntry{ block: blk, cert: cert, - aux: aux, }) bq.cond.Broadcast() return nil @@ -304,22 +302,3 @@ func (bq *blockQueue) getBlockCert(r basics.Round) (blk bookkeeping.Block, cert err = updateErrNoEntry(err, lastCommitted, latest) return } - -func (bq *blockQueue) getBlockAux(r basics.Round) (blk bookkeeping.Block, aux evalAux, err error) { - e, lastCommitted, latest, err := bq.checkEntry(r) - if e != nil { - return e.block, e.aux, nil - } - - if err != nil { - return - } - - err = bq.l.blockDBs.rdb.Atomic(func(tx *sql.Tx) error { - var err0 error - blk, aux, err0 = blockGetAux(tx, r) - return err0 - }) - err = updateErrNoEntry(err, lastCommitted, latest) - return -} diff --git a/ledger/eval.go b/ledger/eval.go index 05de0d5bc6..b98465e651 100644 --- a/ledger/eval.go +++ b/ledger/eval.go @@ -36,11 +36,6 @@ import ( // ErrNoSpace indicates insufficient space for transaction in block var ErrNoSpace = errors.New("block does not have space for transaction") -// evalAux is left after removing explicit reward claims, -// in case we need this infrastructure in the future. -type evalAux struct { -} - // VerifiedTxnCache captures the interface for a cache of previously // verified transactions. This is expected to match the transaction // pool object. @@ -159,10 +154,8 @@ func (cs *roundCowState) ConsensusParams() config.ConsensusParams { // against the ledger. type BlockEvaluator struct { state *roundCowState - aux *evalAux validate bool generate bool - txcache VerifiedTxnCache prevHeader bookkeeping.BlockHeader // cached proto config.ConsensusParams @@ -171,8 +164,6 @@ type BlockEvaluator struct { block bookkeeping.Block blockTxBytes int - verificationPool execpool.BacklogPool - l ledgerForEvaluator } @@ -189,20 +180,16 @@ type ledgerForEvaluator interface { // StartEvaluator creates a BlockEvaluator, given a ledger and a block header // of the block that the caller is planning to evaluate. -func (l *Ledger) StartEvaluator(hdr bookkeeping.BlockHeader, txcache VerifiedTxnCache, executionPool execpool.BacklogPool) (*BlockEvaluator, error) { - return startEvaluator(l, hdr, nil, true, true, txcache, executionPool) +func (l *Ledger) StartEvaluator(hdr bookkeeping.BlockHeader) (*BlockEvaluator, error) { + return startEvaluator(l, hdr, true, true) } -func startEvaluator(l ledgerForEvaluator, hdr bookkeeping.BlockHeader, aux *evalAux, validate bool, generate bool, txcache VerifiedTxnCache, executionPool execpool.BacklogPool) (*BlockEvaluator, error) { +func startEvaluator(l ledgerForEvaluator, hdr bookkeeping.BlockHeader, validate bool, generate bool) (*BlockEvaluator, error) { proto, ok := config.Consensus[hdr.CurrentProtocol] if !ok { return nil, protocol.Error(hdr.CurrentProtocol) } - if aux == nil { - aux = &evalAux{} - } - base := &roundCowBase{ l: l, // round that lookups come from is previous block. We validate @@ -214,15 +201,12 @@ func startEvaluator(l ledgerForEvaluator, hdr bookkeeping.BlockHeader, aux *eval } eval := &BlockEvaluator{ - aux: aux, - validate: validate, - generate: generate, - txcache: txcache, - block: bookkeeping.Block{BlockHeader: hdr}, - proto: proto, - genesisHash: l.GenesisHash(), - verificationPool: executionPool, - l: l, + validate: validate, + generate: generate, + block: bookkeeping.Block{BlockHeader: hdr}, + proto: proto, + genesisHash: l.GenesisHash(), + l: l, } if hdr.Round > 0 { @@ -404,11 +388,6 @@ func (eval *BlockEvaluator) TestTransactionGroup(txgroup []transactions.SignedTx // on a single transaction, but does not actually add the transaction to the block // evaluator, or modify the block evaluator state in any other visible way. func (eval *BlockEvaluator) testTransaction(txn transactions.SignedTxn, cow *roundCowState) error { - // Verify that groups are supported. - if !txn.Txn.Group.IsZero() && !eval.proto.SupportTxGroups { - return fmt.Errorf("transaction groups not supported") - } - // Transaction valid (not expired)? err := txn.Txn.Alive(eval.block) if err != nil { @@ -478,17 +457,10 @@ func (eval *BlockEvaluator) transactionGroup(txgroup []transactions.SignedTxnWit cow := eval.state.child() - groupNoAD := make([]transactions.SignedTxn, len(txgroup)) - for i := range txgroup { - groupNoAD[i] = txgroup[i].SignedTxn - } - - ctxs := verify.PrepareContexts(groupNoAD, eval.block.BlockHeader) - for gi, txad := range txgroup { var txib transactions.SignedTxnInBlock - err := eval.transaction(txad.SignedTxn, txad.ApplyData, groupNoAD, gi, ctxs[gi], cow, &txib) + err := eval.transaction(txad.SignedTxn, txad.ApplyData, cow, &txib) if err != nil { return err } @@ -538,16 +510,10 @@ func (eval *BlockEvaluator) transactionGroup(txgroup []transactions.SignedTxnWit // transaction tentatively executes a new transaction as part of this block evaluation. // If the transaction cannot be added to the block without violating some constraints, // an error is returned and the block evaluator state is unchanged. -func (eval *BlockEvaluator) transaction(txn transactions.SignedTxn, ad transactions.ApplyData, txgroup []transactions.SignedTxn, groupIndex int, ctx verify.Context, cow *roundCowState, txib *transactions.SignedTxnInBlock) error { +func (eval *BlockEvaluator) transaction(txn transactions.SignedTxn, ad transactions.ApplyData, cow *roundCowState, txib *transactions.SignedTxnInBlock) error { var err error - spec := transactions.SpecialAddresses{ - FeeSink: eval.block.BlockHeader.FeeSink, - RewardsPool: eval.block.BlockHeader.RewardsPool, - } - if eval.validate { - // Transaction valid (not expired)? err = txn.Txn.Alive(eval.block) if err != nil { return err @@ -562,24 +528,11 @@ func (eval *BlockEvaluator) transaction(txn transactions.SignedTxn, ad transacti if dup { return TransactionInLedgerError{txn.ID()} } + } - // Well-formed on its own? - err = txn.Txn.WellFormed(spec, eval.proto) - if err != nil { - return fmt.Errorf("transaction %v: malformed: %v", txn.ID(), err) - } - - if eval.txcache == nil || !eval.txcache.Verified(txn, ctx.Params) { - err = verify.TxnPool(&txn, ctx, eval.verificationPool) - if err != nil { - return fmt.Errorf("transaction %v: failed to verify: %v", txn.ID(), err) - } - } - - // Verify that groups are supported. - if !txn.Txn.Group.IsZero() && !eval.proto.SupportTxGroups { - return fmt.Errorf("transaction groups not supported") - } + spec := transactions.SpecialAddresses{ + FeeSink: eval.block.BlockHeader.FeeSink, + RewardsPool: eval.block.BlockHeader.RewardsPool, } // Apply the transaction, updating the cow balances @@ -702,53 +655,145 @@ func (eval *BlockEvaluator) GenerateBlock() (*ValidatedBlock, error) { vb := ValidatedBlock{ blk: eval.block, delta: eval.state.mods, - aux: *eval.aux, } return &vb, nil } -func (l *Ledger) eval(ctx context.Context, blk bookkeeping.Block, aux *evalAux, validate bool, txcache VerifiedTxnCache, executionPool execpool.BacklogPool) (StateDelta, evalAux, error) { - eval, err := startEvaluator(l, blk.BlockHeader, aux, validate, false, txcache, executionPool) +type evalTxValidator struct { + txcache VerifiedTxnCache + block bookkeeping.Block + proto config.ConsensusParams + verificationPool execpool.BacklogPool + + ctx context.Context + cf context.CancelFunc + txgroups chan []transactions.SignedTxnWithAD + done chan error +} + +func (validator *evalTxValidator) run() { + for txgroup := range validator.txgroups { + select { + case <-validator.ctx.Done(): + validator.done <- validator.ctx.Err() + validator.cf() + close(validator.done) + return + default: + } + groupNoAD := make([]transactions.SignedTxn, len(txgroup)) + for i := range txgroup { + groupNoAD[i] = txgroup[i].SignedTxn + } + ctxs := verify.PrepareContexts(groupNoAD, validator.block.BlockHeader) + + for gi, tx := range txgroup { + err := validateTransaction(tx.SignedTxn, validator.block, validator.proto, validator.txcache, ctxs[gi], validator.verificationPool) + if err != nil { + validator.done <- err + validator.cf() + close(validator.done) + return + } + } + } + close(validator.done) +} + +func validateTransaction(txn transactions.SignedTxn, block bookkeeping.Block, proto config.ConsensusParams, txcache VerifiedTxnCache, ctx verify.Context, verificationPool execpool.BacklogPool) error { + // Transaction valid (not expired)? + err := txn.Txn.Alive(block) if err != nil { - return StateDelta{}, evalAux{}, err + return err } - // TODO: batch tx sig verification: ingest blk.Payset and output a list of ValidatedTx + if txcache == nil || !txcache.Verified(txn, ctx.Params) { + err = verify.TxnPool(&txn, ctx, verificationPool) + if err != nil { + return fmt.Errorf("transaction %v: failed to verify: %v", txn.ID(), err) + } + } + return nil +} + +// used by Ledger.Validate() Ledger.AddBlock() Ledger.trackerEvalVerified()(accountUpdates.loadFromDisk()) +// +// Validate: eval(ctx, blk, true, txcache, executionPool) +// AddBlock: eval(context.Background(), blk, false, nil, nil) +// tracker: eval(context.Background(), blk, false, nil, nil) +func (l *Ledger) eval(ctx context.Context, blk bookkeeping.Block, validate bool, txcache VerifiedTxnCache, executionPool execpool.BacklogPool) (StateDelta, error) { + eval, err := startEvaluator(l, blk.BlockHeader, validate, false) + if err != nil { + return StateDelta{}, err + } // Next, transactions paysetgroups, err := blk.DecodePaysetGroups() if err != nil { - return StateDelta{}, evalAux{}, err + return StateDelta{}, err + } + + var txvalidator evalTxValidator + ctx, cf := context.WithCancel(ctx) + defer cf() + if validate { + proto, ok := config.Consensus[blk.CurrentProtocol] + if !ok { + return StateDelta{}, protocol.Error(blk.CurrentProtocol) + } + txvalidator.txcache = txcache + txvalidator.block = blk + txvalidator.proto = proto + txvalidator.verificationPool = executionPool + + txvalidator.ctx = ctx + txvalidator.cf = cf + txvalidator.txgroups = make(chan []transactions.SignedTxnWithAD, len(paysetgroups)) + txvalidator.done = make(chan error, 1) + go txvalidator.run() } for _, txgroup := range paysetgroups { select { case <-ctx.Done(): - return StateDelta{}, evalAux{}, ctx.Err() + select { + case err := <-txvalidator.done: + return StateDelta{}, err + default: + } + return StateDelta{}, ctx.Err() default: } + if validate { + txvalidator.txgroups <- txgroup + } err = eval.TransactionGroup(txgroup) if err != nil { - return StateDelta{}, evalAux{}, err + return StateDelta{}, err } } // Finally, procees any pending end-of-block state changes err = eval.endOfBlock() if err != nil { - return StateDelta{}, evalAux{}, err + return StateDelta{}, err } // If validating, do final block checks that depend on our new state if validate { + close(txvalidator.txgroups) + err, gotErr := <-txvalidator.done + if gotErr && err != nil { + return StateDelta{}, err + } err = eval.finalValidation() if err != nil { - return StateDelta{}, evalAux{}, err + return StateDelta{}, err } } - return eval.state.mods, *eval.aux, nil + return eval.state.mods, nil } // Validate uses the ledger to validate block blk as a candidate next block. @@ -756,7 +801,7 @@ func (l *Ledger) eval(ctx context.Context, blk bookkeeping.Block, aux *evalAux, // not a valid block (e.g., it has duplicate transactions, overspends some // account, etc). func (l *Ledger) Validate(ctx context.Context, blk bookkeeping.Block, txcache VerifiedTxnCache, executionPool execpool.BacklogPool) (*ValidatedBlock, error) { - delta, aux, err := l.eval(ctx, blk, nil, true, txcache, executionPool) + delta, err := l.eval(ctx, blk, true, txcache, executionPool) if err != nil { return nil, err } @@ -764,7 +809,6 @@ func (l *Ledger) Validate(ctx context.Context, blk bookkeeping.Block, txcache Ve vb := ValidatedBlock{ blk: blk, delta: delta, - aux: aux, } return &vb, nil } @@ -775,7 +819,6 @@ func (l *Ledger) Validate(ctx context.Context, blk bookkeeping.Block, txcache Ve type ValidatedBlock struct { blk bookkeeping.Block delta StateDelta - aux evalAux } // Block returns the underlying Block for a ValidatedBlock. @@ -791,6 +834,5 @@ func (vb ValidatedBlock) WithSeed(s committee.Seed) ValidatedBlock { return ValidatedBlock{ blk: newblock, delta: vb.delta, - aux: vb.aux, } } diff --git a/ledger/eval_test.go b/ledger/eval_test.go index 310f77e361..c5a934b419 100644 --- a/ledger/eval_test.go +++ b/ledger/eval_test.go @@ -30,7 +30,6 @@ import ( "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/util/execpool" ) var testPoolAddr = basics.Address{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} @@ -45,9 +44,6 @@ func init() { func TestBlockEvaluator(t *testing.T) { genesisInitState, addrs, keys := genesis(10) - backlogPool := execpool.MakeBacklog(nil, 0, execpool.LowPriority, nil) - defer backlogPool.Shutdown() - dbName := fmt.Sprintf("%s.%d", t.Name(), crypto.RandUint64()) const inMem = true const archival = true @@ -56,7 +52,7 @@ func TestBlockEvaluator(t *testing.T) { defer l.Close() newBlock := bookkeeping.MakeBlock(genesisInitState.Block.BlockHeader) - eval, err := l.StartEvaluator(newBlock.BlockHeader, nil, backlogPool) + eval, err := l.StartEvaluator(newBlock.BlockHeader) require.NoError(t, err) genHash := genesisInitState.Block.BlockHeader.GenesisHash @@ -75,20 +71,8 @@ func TestBlockEvaluator(t *testing.T) { }, } - // Zero signature should fail - st := transactions.SignedTxn{ - Txn: txn, - } - err = eval.Transaction(st, transactions.ApplyData{}) - require.Error(t, err) - - // Random signature should fail - crypto.RandBytes(st.Sig[:]) - err = eval.Transaction(st, transactions.ApplyData{}) - require.Error(t, err) - // Correct signature should work - st = txn.Sign(keys[0]) + st := txn.Sign(keys[0]) err = eval.Transaction(st, transactions.ApplyData{}) require.NoError(t, err) diff --git a/ledger/ledger.go b/ledger/ledger.go index befee4f838..cb8a90c8e3 100644 --- a/ledger/ledger.go +++ b/ledger/ledger.go @@ -99,18 +99,25 @@ func OpenLedger( l.trackerDBs, l.blockDBs, err = openLedgerDB(dbPathPrefix, dbMem) if err != nil { + err = fmt.Errorf("OpenLedger.openLedgerDB %v", err) return nil, err } + l.trackerDBs.rdb.SetLogger(log) + l.trackerDBs.wdb.SetLogger(log) + l.blockDBs.rdb.SetLogger(log) + l.blockDBs.wdb.SetLogger(log) err = l.blockDBs.wdb.Atomic(func(tx *sql.Tx) error { return initBlocksDB(tx, l, []bookkeeping.Block{genesisInitState.Block}, isArchival) }) if err != nil { + err = fmt.Errorf("OpenLedger.initBlocksDB %v", err) return nil, err } l.blockQ, err = bqInit(l) if err != nil { + err = fmt.Errorf("OpenLedger.bqInit %v", err) return nil, err } @@ -132,6 +139,7 @@ func OpenLedger( err = l.trackers.loadFromDisk(l) if err != nil { + err = fmt.Errorf("OpenLedger.loadFromDisk %v", err) return nil, err } @@ -207,6 +215,7 @@ func openLedgerDB(dbPathPrefix string, dbMem bool) (trackerDBs dbPair, blockDBs func initBlocksDB(tx *sql.Tx, l *Ledger, initBlocks []bookkeeping.Block, isArchival bool) (err error) { err = blockInit(tx, initBlocks) if err != nil { + err = fmt.Errorf("initBlocksDB.blockInit %v", err) return err } @@ -214,6 +223,7 @@ func initBlocksDB(tx *sql.Tx, l *Ledger, initBlocks []bookkeeping.Block, isArchi if isArchival { earliest, err := blockEarliest(tx) if err != nil { + err = fmt.Errorf("initBlocksDB.blockEarliest %v", err) return err } @@ -223,10 +233,12 @@ func initBlocksDB(tx *sql.Tx, l *Ledger, initBlocks []bookkeeping.Block, isArchi l.log.Warnf("resetting blocks DB (earliest block is %v)", earliest) err := blockResetDB(tx) if err != nil { + err = fmt.Errorf("initBlocksDB.blockResetDB %v", err) return err } err = blockInit(tx, initBlocks) if err != nil { + err = fmt.Errorf("initBlocksDB.blockInit 2 %v", err) return err } } @@ -356,10 +368,6 @@ func (l *Ledger) LatestCommitted() basics.Round { return l.blockQ.latestCommitted() } -func (l *Ledger) blockAux(rnd basics.Round) (bookkeeping.Block, evalAux, error) { - return l.blockQ.getBlockAux(rnd) -} - // Block returns the block for round rnd. func (l *Ledger) Block(rnd basics.Round) (blk bookkeeping.Block, err error) { return l.blockQ.getBlock(rnd) @@ -395,7 +403,7 @@ func (l *Ledger) BlockCert(rnd basics.Round) (blk bookkeeping.Block, cert agreem // is returned if this is not the expected next block number. func (l *Ledger) AddBlock(blk bookkeeping.Block, cert agreement.Certificate) error { // passing nil as the verificationPool is ok since we've asking the evaluator to skip verification. - updates, aux, err := l.eval(context.Background(), blk, nil, false, nil, nil) + updates, err := l.eval(context.Background(), blk, false, nil, nil) if err != nil { return err } @@ -403,7 +411,6 @@ func (l *Ledger) AddBlock(blk bookkeeping.Block, cert agreement.Certificate) err vb := ValidatedBlock{ blk: blk, delta: updates, - aux: aux, } return l.AddValidatedBlock(vb, cert) @@ -419,7 +426,7 @@ func (l *Ledger) AddValidatedBlock(vb ValidatedBlock, cert agreement.Certificate l.trackerMu.Lock() defer l.trackerMu.Unlock() - err := l.blockQ.putBlock(vb.blk, cert, vb.aux) + err := l.blockQ.putBlock(vb.blk, cert) if err != nil { return err } @@ -474,9 +481,9 @@ func (l *Ledger) trackerLog() logging.Logger { return l.log } -func (l *Ledger) trackerEvalVerified(blk bookkeeping.Block, aux evalAux) (StateDelta, error) { +func (l *Ledger) trackerEvalVerified(blk bookkeeping.Block) (StateDelta, error) { // passing nil as the verificationPool is ok since we've asking the evaluator to skip verification. - delta, _, err := l.eval(context.Background(), blk, &aux, false, nil, nil) + delta, err := l.eval(context.Background(), blk, false, nil, nil) return delta, err } diff --git a/ledger/ledger_test.go b/ledger/ledger_test.go index 4925b397b4..e06bb74008 100644 --- a/ledger/ledger_test.go +++ b/ledger/ledger_test.go @@ -202,7 +202,8 @@ func TestLedgerBasic(t *testing.T) { genesisInitState, _ := testGenerateInitState(t, protocol.ConsensusCurrentVersion) const inMem = true const archival = true - l, err := OpenLedger(logging.Base(), t.Name(), inMem, genesisInitState, archival) + log := logging.TestingLog(t) + l, err := OpenLedger(log, t.Name(), inMem, genesisInitState, archival) require.NoError(t, err, "could not open ledger") defer l.Close() } @@ -353,7 +354,8 @@ func TestLedgerSingleTx(t *testing.T) { genesisInitState, initSecrets := testGenerateInitState(t, protocol.ConsensusV7) const inMem = true const archival = true - l, err := OpenLedger(logging.Base(), t.Name(), inMem, genesisInitState, archival) + log := logging.TestingLog(t) + l, err := OpenLedger(log, t.Name(), inMem, genesisInitState, archival) a.NoError(err, "could not open ledger") defer l.Close() @@ -488,6 +490,11 @@ func TestLedgerSingleTx(t *testing.T) { sbadTx.Sig = crypto.Signature{} a.Error(l.appendUnvalidatedSignedTx(t, initAccounts, sbadTx, ad), "added tx with no signature") + badTx = correctPay + sbadTx = sign(initSecrets, badTx) + sbadTx.Sig[5]++ + a.Error(l.appendUnvalidatedSignedTx(t, initAccounts, sbadTx, ad), "added tx with corrupt signature") + // TODO set multisig and test badTx = correctPay @@ -538,7 +545,8 @@ func testLedgerSingleTxApplyData(t *testing.T, version protocol.ConsensusVersion genesisInitState, initSecrets := testGenerateInitState(t, version) const inMem = true const archival = true - l, err := OpenLedger(logging.Base(), t.Name(), inMem, genesisInitState, archival) + log := logging.TestingLog(t) + l, err := OpenLedger(log, t.Name(), inMem, genesisInitState, archival) a.NoError(err, "could not open ledger") defer l.Close() diff --git a/ledger/perf_test.go b/ledger/perf_test.go index becb1c8e5e..31aa586196 100644 --- a/ledger/perf_test.go +++ b/ledger/perf_test.go @@ -111,7 +111,7 @@ func BenchmarkManyAccounts(b *testing.B) { txib, err := blk.EncodeSignedTxn(st, transactions.ApplyData{}) require.NoError(b, err) - txlen := len(protocol.Encode(txib)) + txlen := len(protocol.Encode(&txib)) if txbytes+txlen > proto.MaxTxnBytesPerBlock { break } @@ -170,7 +170,7 @@ func BenchmarkValidate(b *testing.B) { txib, err := newblk.EncodeSignedTxn(st, transactions.ApplyData{}) require.NoError(b, err) - txlen := len(protocol.Encode(txib)) + txlen := len(protocol.Encode(&txib)) if txbytes+txlen > proto.MaxTxnBytesPerBlock { break } diff --git a/ledger/tracker.go b/ledger/tracker.go index 55f8202424..babb09fd86 100644 --- a/ledger/tracker.go +++ b/ledger/tracker.go @@ -81,12 +81,11 @@ type ledgerTracker interface { type ledgerForTracker interface { trackerDB() dbPair trackerLog() logging.Logger - trackerEvalVerified(bookkeeping.Block, evalAux) (StateDelta, error) + trackerEvalVerified(bookkeeping.Block) (StateDelta, error) Latest() basics.Round Block(basics.Round) (bookkeeping.Block, error) BlockHdr(basics.Round) (bookkeeping.BlockHeader, error) - blockAux(basics.Round) (bookkeeping.Block, evalAux, error) } type trackerRegistry struct { diff --git a/libgoal/libgoal.go b/libgoal/libgoal.go index cbf64dcced..2a092c1b17 100644 --- a/libgoal/libgoal.go +++ b/libgoal/libgoal.go @@ -50,6 +50,7 @@ type Client struct { kmdStartArgs nodecontrol.KMDStartArgs dataDir string cacheDir string + consensus config.ConsensusProtocols } // ClientConfig is data to configure a Client @@ -164,6 +165,11 @@ func (c *Client) init(config ClientConfig, clientType ClientType) error { return err } } + + c.consensus, err = nc.GetConsensus() + if err != nil { + return err + } return nil } @@ -495,7 +501,7 @@ func (c *Client) ComputeValidityRounds(firstValid, lastValid, validRounds uint64 if err != nil { return 0, 0, err } - cparams, ok := config.Consensus[protocol.ConsensusVersion(params.ConsensusVersion)] + cparams, ok := c.consensus[protocol.ConsensusVersion(params.ConsensusVersion)] if !ok { return 0, 0, fmt.Errorf("cannot construct transaction: unknown consensus protocol %s", params.ConsensusVersion) } @@ -558,7 +564,7 @@ func (c *Client) ConstructPayment(from, to string, fee, amount uint64, note []by return transactions.Transaction{}, err } - cp, ok := config.Consensus[protocol.ConsensusVersion(params.ConsensusVersion)] + cp, ok := c.consensus[protocol.ConsensusVersion(params.ConsensusVersion)] if !ok { return transactions.Transaction{}, fmt.Errorf("ConstructPayment: unknown consensus protocol %s", params.ConsensusVersion) } @@ -795,7 +801,7 @@ func (c *Client) ConsensusParams(round uint64) (consensus config.ConsensusParams return } - params, ok := config.Consensus[protocol.ConsensusVersion(block.CurrentProtocol)] + params, ok := c.consensus[protocol.ConsensusVersion(block.CurrentProtocol)] if !ok { err = fmt.Errorf("ConsensusParams: unknown consensus protocol %s", block.CurrentProtocol) return diff --git a/libgoal/lockedFile.go b/libgoal/lockedFile.go index 36a96b2d7b..fc46a3f811 100644 --- a/libgoal/lockedFile.go +++ b/libgoal/lockedFile.go @@ -28,11 +28,15 @@ type locker interface { unlock(fd *os.File) error } -func newLockedFile(path string) *lockedFile { +func newLockedFile(path string) (*lockedFile, error) { + locker, err := makeLocker() + if err != nil { + return nil, err + } return &lockedFile{ path: path, - locker: makeLocker(), - } + locker: locker, + }, nil } // lockedFile implementation diff --git a/libgoal/lockedFileLinux.go b/libgoal/lockedFileLinux.go index 5330723351..982d9eb8a8 100644 --- a/libgoal/lockedFileLinux.go +++ b/libgoal/lockedFileLinux.go @@ -19,53 +19,70 @@ package libgoal import ( + "fmt" "io" "os" - "syscall" "golang.org/x/sys/unix" ) type linuxLocker struct { + setLockWait int } // makeLocker create a unix file locker. -// note that the desired way is to use the OFD locker, which locks on the file descriptor level. -// falling back to the non-OFD lock would allow obtaining two locks by the same process. If this becomes -// and issue, we might want to use flock, which wouldn't work across NFS. -func makeLocker() *linuxLocker { +// Note that the desired way is to use the OFD locker, which locks on the file descriptor level. +// Since older kernels (Linux kernel < 3.15) do not support OFD, we fall back to non-OFD in that case. +// Falling back to the non-OFD lock would allow obtaining two locks by the same process. If this becomes +// and issue, we might want to use flock, which wouldn't work across NFS on older Linux kernels. +func makeLocker() (*linuxLocker, error) { locker := &linuxLocker{} - return locker + + // Check whether F_OFD_SETLKW is supported + getlk := unix.Flock_t{Type: unix.F_RDLCK} + err := unix.FcntlFlock(0, unix.F_OFD_GETLK, &getlk) + if err == nil { + locker.setLockWait = unix.F_OFD_SETLKW + } else if err == unix.EINVAL { + // The command F_OFD_SETLKW is not available + // Fall back to non-OFD locks + locker.setLockWait = unix.F_SETLKW + } else { + // Another unknown error occurred + return nil, fmt.Errorf("unknown error of FnctlFlock: %v", err) + } + + return locker, nil } // the FcntlFlock has the most consistent behaviour across platforms, // and supports both local and network file systems. func (f *linuxLocker) tryRLock(fd *os.File) error { - flock := &syscall.Flock_t{ - Type: syscall.F_RDLCK, + flock := &unix.Flock_t{ + Type: unix.F_RDLCK, Whence: int16(io.SeekStart), Start: 0, Len: 0, } - return syscall.FcntlFlock(fd.Fd(), unix.F_OFD_SETLKW, flock) + return unix.FcntlFlock(fd.Fd(), f.setLockWait, flock) } func (f *linuxLocker) tryLock(fd *os.File) error { - flock := &syscall.Flock_t{ - Type: syscall.F_WRLCK, + flock := &unix.Flock_t{ + Type: unix.F_WRLCK, Whence: int16(io.SeekStart), Start: 0, Len: 0, } - return syscall.FcntlFlock(fd.Fd(), unix.F_OFD_SETLKW, flock) + return unix.FcntlFlock(fd.Fd(), f.setLockWait, flock) } func (f *linuxLocker) unlock(fd *os.File) error { - flock := &syscall.Flock_t{ - Type: syscall.F_UNLCK, + flock := &unix.Flock_t{ + Type: unix.F_UNLCK, Whence: int16(io.SeekStart), Start: 0, Len: 0, } - return syscall.FcntlFlock(fd.Fd(), unix.F_OFD_SETLKW, flock) + return unix.FcntlFlock(fd.Fd(), f.setLockWait, flock) } diff --git a/libgoal/lockedFileUnix.go b/libgoal/lockedFileUnix.go index 917d63209a..d7905e61de 100644 --- a/libgoal/lockedFileUnix.go +++ b/libgoal/lockedFileUnix.go @@ -14,64 +14,61 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . -// +build !linux,!windows +// Support all unix system except linux +// in https://github.com/golang/sys/blob/master/unix/syscall_unix.go + +// +build aix darwin dragonfly freebsd netbsd openbsd solaris package libgoal import ( "io" "os" - "syscall" + + "golang.org/x/sys/unix" ) type unixLocker struct { - setLockWait int } // makeLocker create a unix file locker. -// note that the desired way is to use the OFD locker, which locks on the file descriptor level. -// falling back to the non-OFD lock would allow obtaining two locks by the same process. If this becomes +// Note that the desired way is to use the OFD locker, which locks on the file descriptor level. +// As OFD is not available on non-Linux OS, we fall back to the non-OFD lock +// Falling back to the non-OFD lock would allow obtaining two locks by the same process. If this becomes // and issue, we might want to use flock, which wouldn't work across NFS. -func makeLocker() *unixLocker { +func makeLocker() (*unixLocker, error) { locker := &unixLocker{} - getlk := syscall.Flock_t{Type: syscall.F_RDLCK} - if err := syscall.FcntlFlock(0, 36 /*F_OFD_GETLK*/, &getlk); err == nil { - // constants from /usr/include/bits/fcntl-linux.h - locker.setLockWait = 38 // F_OFD_SETLKW - } else { - locker.setLockWait = syscall.F_SETLKW - } - return locker + return locker, nil } // the FcntlFlock has the most unixLocker behaviour across platforms, // and supports both local and network file systems. func (f *unixLocker) tryRLock(fd *os.File) error { - flock := &syscall.Flock_t{ - Type: syscall.F_RDLCK, + flock := &unix.Flock_t{ + Type: unix.F_RDLCK, Whence: int16(io.SeekStart), Start: 0, Len: 0, } - return syscall.FcntlFlock(fd.Fd(), f.setLockWait, flock) + return unix.FcntlFlock(fd.Fd(), unix.F_SETLKW, flock) } func (f *unixLocker) tryLock(fd *os.File) error { - flock := &syscall.Flock_t{ - Type: syscall.F_WRLCK, + flock := &unix.Flock_t{ + Type: unix.F_WRLCK, Whence: int16(io.SeekStart), Start: 0, Len: 0, } - return syscall.FcntlFlock(fd.Fd(), f.setLockWait, flock) + return unix.FcntlFlock(fd.Fd(), unix.F_SETLKW, flock) } func (f *unixLocker) unlock(fd *os.File) error { - flock := &syscall.Flock_t{ - Type: syscall.F_UNLCK, + flock := &unix.Flock_t{ + Type: unix.F_UNLCK, Whence: int16(io.SeekStart), Start: 0, Len: 0, } - return syscall.FcntlFlock(fd.Fd(), f.setLockWait, flock) + return unix.FcntlFlock(fd.Fd(), unix.F_SETLKW, flock) } diff --git a/libgoal/participation.go b/libgoal/participation.go index 53b9d20c23..6acd607ea6 100644 --- a/libgoal/participation.go +++ b/libgoal/participation.go @@ -132,7 +132,7 @@ func (c *Client) GenParticipationKeysTo(address string, firstValid, lastValid, k return } - proto, ok := config.Consensus[protocol.ConsensusVersion(stat.LastVersion)] + proto, ok := c.consensus[protocol.ConsensusVersion(stat.LastVersion)] if !ok { err = fmt.Errorf("consensus protocol %s not supported", stat.LastVersion) return @@ -214,7 +214,7 @@ func (c *Client) InstallParticipationKeys(inputfile string) (part account.Partic return } - proto, ok := config.Consensus[protocol.ConsensusCurrentVersion] + proto, ok := c.consensus[protocol.ConsensusCurrentVersion] if !ok { err = fmt.Errorf("Unknown consensus protocol %s", protocol.ConsensusCurrentVersion) return diff --git a/libgoal/system.go b/libgoal/system.go index 58238bfe8b..e5f78a3763 100644 --- a/libgoal/system.go +++ b/libgoal/system.go @@ -26,7 +26,8 @@ import ( type SystemConfig struct { // SharedServer is true if this is a daemon on a multiuser system. // If not shared, kmd and other files are often stored under $ALGORAND_DATA when otherwise they might go under $HOME/.algorand/ - SharedServer bool `json:"shared_server,omitempty"` + SharedServer bool `json:"shared_server,omitempty"` + SystemdManaged bool `json:"systemd_managed,omitempty"` } // map data dir to loaded config @@ -72,3 +73,16 @@ func AlgorandDataIsPrivate(dataDir string) bool { } return !sc.SharedServer } + +// AlgorandDaemonSystemdManaged returns true if the algod process for a given data dir is managed by systemd +// if not, algod will be managed as an indivudal process for the dir +func AlgorandDaemonSystemdManaged(dataDir string) bool { + if dataDir == "" { + return false + } + sc, err := ReadSystemConfig(dataDir) + if err != nil { + return false + } + return sc.SystemdManaged +} diff --git a/libgoal/transactions.go b/libgoal/transactions.go index 63a0ed1fd9..e278561125 100644 --- a/libgoal/transactions.go +++ b/libgoal/transactions.go @@ -20,7 +20,6 @@ import ( "errors" "fmt" - "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/daemon/algod/api/spec/v1" "github.com/algorand/go-algorand/data/account" @@ -67,7 +66,7 @@ func (c *Client) SignProgramWithWallet(walletHandle, pw []byte, addr string, pro // MultisigSignTransactionWithWallet creates a multisig (or adds to an existing partial multisig, if one is provided), signing with the key corresponding to the given address and using the specified wallet // TODO instead of returning MultisigSigs, accept and return blobs func (c *Client) MultisigSignTransactionWithWallet(walletHandle, pw []byte, utx transactions.Transaction, signerAddr string, partial crypto.MultisigSig) (msig crypto.MultisigSig, err error) { - txBytes := protocol.Encode(utx) + txBytes := protocol.Encode(&utx) addr, err := basics.UnmarshalChecksumAddress(signerAddr) if err != nil { return @@ -154,7 +153,7 @@ func (c *Client) MakeUnsignedGoOnlineTx(address string, part *account.Participat return transactions.Transaction{}, err } - cparams, ok := config.Consensus[protocol.ConsensusVersion(params.ConsensusVersion)] + cparams, ok := c.consensus[protocol.ConsensusVersion(params.ConsensusVersion)] if !ok { return transactions.Transaction{}, errors.New("unknown consensus version") } @@ -211,7 +210,7 @@ func (c *Client) MakeUnsignedGoOfflineTx(address string, firstValid, lastValid, return transactions.Transaction{}, err } - cparams, ok := config.Consensus[protocol.ConsensusVersion(params.ConsensusVersion)] + cparams, ok := c.consensus[protocol.ConsensusVersion(params.ConsensusVersion)] if !ok { return transactions.Transaction{}, errors.New("unknown consensus version") } @@ -266,7 +265,7 @@ func (c *Client) MakeUnsignedBecomeNonparticipatingTx(address string, firstValid return transactions.Transaction{}, err } - cparams, ok := config.Consensus[protocol.ConsensusVersion(params.ConsensusVersion)] + cparams, ok := c.consensus[protocol.ConsensusVersion(params.ConsensusVersion)] if !ok { return transactions.Transaction{}, errors.New("unknown consensus version") } @@ -321,7 +320,7 @@ func (c *Client) FillUnsignedTxTemplate(sender string, firstValid, lastValid, fe return transactions.Transaction{}, err } - cparams, ok := config.Consensus[protocol.ConsensusVersion(params.ConsensusVersion)] + cparams, ok := c.consensus[protocol.ConsensusVersion(params.ConsensusVersion)] if !ok { return transactions.Transaction{}, errors.New("unknown consensus version") } @@ -407,11 +406,20 @@ func (c *Client) MakeUnsignedAssetCreateTx(total uint64, defaultFrozen bool, man return transactions.Transaction{}, err } - cparams, ok := config.Consensus[protocol.ConsensusVersion(params.ConsensusVersion)] + cparams, ok := c.consensus[protocol.ConsensusVersion(params.ConsensusVersion)] if !ok { return transactions.Transaction{}, errors.New("unknown consensus version") } + // If assets are not yet enabled, lookup the base parameters to allow creating assets during catchup + if !cparams.Asset { + cparams, ok = c.consensus[protocol.ConsensusCurrentVersion] + + if !ok { + return transactions.Transaction{}, errors.New("unknown consensus version") + } + } + if len(url) > cparams.MaxAssetURLBytes { return tx, fmt.Errorf("asset url %s is too long (max %d bytes)", url, cparams.MaxAssetURLBytes) } diff --git a/libgoal/walletHandles.go b/libgoal/walletHandles.go index 5a5bd5e4b1..ece9a7a0c2 100644 --- a/libgoal/walletHandles.go +++ b/libgoal/walletHandles.go @@ -31,12 +31,18 @@ type walletHandles struct { } func readLocked(path string) ([]byte, error) { - lf := newLockedFile(path) + lf, err := newLockedFile(path) + if err != nil { + return nil, err + } return lf.read() } func writeLocked(path string, data []byte, perm os.FileMode) error { - lf := newLockedFile(path) + lf, err := newLockedFile(path) + if err != nil { + return err + } return lf.write(data, perm) } diff --git a/logging/log.go b/logging/log.go index 182e18799f..a500eba5b9 100644 --- a/logging/log.go +++ b/logging/log.go @@ -373,9 +373,6 @@ func (l logger) EnableTelemetry(cfg TelemetryConfig) (err error) { } func (l logger) UpdateTelemetryURI(uri string) (err error) { - if l.loggerState.telemetry.hook == nil { - return nil - } err = l.loggerState.telemetry.hook.UpdateHookURI(uri) if err == nil { telemetryConfig.URI = uri diff --git a/logging/telemetry.go b/logging/telemetry.go index d195f9d39b..313ebdc804 100644 --- a/logging/telemetry.go +++ b/logging/telemetry.go @@ -84,6 +84,8 @@ func makeTelemetryState(cfg TelemetryConfig, hookFactory hookFactory) (*telemetr return nil, err } telemetry.hook = createAsyncHookLevels(hook, 32, 100, makeLevels(cfg.MinLogLevel)) + } else { + telemetry.hook = new(dummyHook) } telemetry.sendToLog = cfg.SendToLog return telemetry, nil @@ -227,13 +229,13 @@ func (t *telemetryState) logTelemetry(l logger, message string, details interfac if t.sendToLog { entry.Info(message) } - if t.hook != nil { - t.hook.Fire(entry) - } + t.hook.Fire(entry) } func (t *telemetryState) Close() { - t.hook.Close() + if t.hook != nil { + t.hook.Close() + } } func (t *telemetryState) Flush() { diff --git a/logging/telemetryCommon.go b/logging/telemetryCommon.go index 1e8762c172..a66484e5c9 100644 --- a/logging/telemetryCommon.go +++ b/logging/telemetryCommon.go @@ -35,9 +35,20 @@ type TelemetryOperation struct { pending int32 } +type telemetryHook interface { + Fire(entry *logrus.Entry) error + Levels() []logrus.Level + Close() + Flush() + UpdateHookURI(uri string) (err error) + + appendEntry(entry *logrus.Entry) bool + waitForEventAndReady() bool +} + type telemetryState struct { history *logBuffer - hook *asyncTelemetryHook + hook telemetryHook sendToLog bool } @@ -70,4 +81,7 @@ type asyncTelemetryHook struct { urlUpdate chan bool } +// A dummy noop type to get rid of checks like telemetry.hook != nil +type dummyHook struct{} + type hookFactory func(cfg TelemetryConfig) (logrus.Hook, error) diff --git a/logging/telemetryConfig.go b/logging/telemetryConfig.go index 439d05dcf4..062159f458 100644 --- a/logging/telemetryConfig.go +++ b/logging/telemetryConfig.go @@ -64,6 +64,7 @@ func createTelemetryConfig() TelemetryConfig { URI: "", MinLogLevel: logrus.WarnLevel, ReportHistoryLevel: logrus.WarnLevel, + // These credentials are here intentionally. Not a bug. UserName: "telemetry-v9", Password: "oq%$FA1TOJ!yYeMEcJ7D688eEOE#MGCu", } diff --git a/logging/telemetryConfig_test.go b/logging/telemetryConfig_test.go index d19a3cd719..a30abdff50 100644 --- a/logging/telemetryConfig_test.go +++ b/logging/telemetryConfig_test.go @@ -33,6 +33,7 @@ func Test_loadTelemetryConfig(t *testing.T) { URI: "elastic.algorand.com", MinLogLevel: 4, ReportHistoryLevel: 4, + // These credentials are here intentionally. Not a bug. UserName: "telemetry-v9", Password: "oq%$FA1TOJ!yYeMEcJ7D688eEOE#MGCu", } diff --git a/logging/telemetryhook.go b/logging/telemetryhook.go index 801ac75d54..48aeacc1a6 100644 --- a/logging/telemetryhook.go +++ b/logging/telemetryhook.go @@ -48,7 +48,25 @@ func createAsyncHookLevels(wrappedHook logrus.Hook, channelDepth uint, maxQueueD } go func() { - defer hook.wg.Done() + defer func() { + // flush the channel + moreEntries := true + for moreEntries { + select { + case entry := <-hook.entries: + hook.appendEntry(entry) + default: + moreEntries = false + } + } + for range hook.pending { + // The telemetry service is + // exiting. Un-wait for the left out + // messages. + hook.wg.Done() + } + hook.wg.Done() + }() exit := false for !exit { @@ -126,6 +144,9 @@ func (hook *asyncTelemetryHook) waitForEventAndReady() bool { func (hook *asyncTelemetryHook) Fire(entry *logrus.Entry) error { hook.wg.Add(1) select { + case <-hook.quit: + // telemetry quit + hook.wg.Done() case hook.entries <- entry: default: hook.wg.Done() @@ -156,6 +177,27 @@ func (hook *asyncTelemetryHook) Flush() { hook.wg.Wait() } +func (hook *dummyHook) UpdateHookURI(uri string) (err error) { + return +} +func (hook *dummyHook) Levels() []logrus.Level { + return []logrus.Level{} +} +func (hook *dummyHook) Fire(entry *logrus.Entry) error { + return nil +} +func (hook *dummyHook) Close() { +} +func (hook *dummyHook) Flush() { +} + +func (hook *dummyHook) appendEntry(entry *logrus.Entry) bool { + return true +} +func (hook *dummyHook) waitForEventAndReady() bool { + return true +} + func createElasticHook(cfg TelemetryConfig) (hook logrus.Hook, err error) { // Returning an error here causes issues... need the hooks to be created even if the elastic hook fails so that // things can recover later. diff --git a/logging/telemetryspec/event.go b/logging/telemetryspec/event.go index c809b5704c..c528fcd9f5 100644 --- a/logging/telemetryspec/event.go +++ b/logging/telemetryspec/event.go @@ -184,6 +184,10 @@ type PeerEventDetails struct { HostName string Incoming bool InstanceName string + // Endpoint is the dialed-to address, for an outgoing connection. Not being used for incoming connection. + Endpoint string `json:",omitempty"` + // MessageDelay is the avarage relative message delay. Not being used for incoming connection. + MessageDelay int64 `json:",omitempty"` } // ConnectPeerFailEvent event @@ -275,4 +279,6 @@ type PeerConnectionDetails struct { ConnectionDuration uint // Endpoint is the dialed-to address, for an outgoing connection. Not being used for incoming connection. Endpoint string `json:",omitempty"` + // MessageDelay is the avarage relative message delay. Not being used for incoming connection. + MessageDelay int64 `json:",omitempty"` } diff --git a/mule.yaml b/mule.yaml new file mode 100644 index 0000000000..57acd25c1d --- /dev/null +++ b/mule.yaml @@ -0,0 +1,54 @@ +stages: + build-linux-amd64: + - task: docker.Version + name: linux-amd64 + arch: amd64 + configFilePath: scripts/configure_dev-deps.sh + - task: shell.docker.Ensure + image: algorand/go-algorand-linux + arch: amd64 + version: '{{ docker.Version.linux-amd64.version }}' + dockerFilePath: docker/build/cicd.Dockerfile + - task: docker.Make + image: algorand/go-algorand-linux + version: '{{ docker.Version.linux-amd64.version }}' + workDir: /go/src/github.com/algorand/go-algorand + target: fulltest ci-build + build-linux-arm64: + - task: docker.Version + name: linux-arm64 + arch: arm64v8 + configFilePath: scripts/configure_dev-deps.sh + - task: shell.docker.Ensure + image: algorand/go-algorand-linux + arch: arm64v8 + version: '{{ docker.Version.linux-arm64.version }}' + dockerFilePath: docker/build/cicd.Dockerfile + - task: docker.Make + image: algorand/go-algorand-linux + version: '{{ docker.Version.linux-arm64.version }}' + workDir: /go/src/github.com/algorand/go-algorand + target: fulltest ci-build + build-linux-arm: + - task: docker.Version + name: linux-arm + arch: arm32v6 + configFilePath: scripts/configure_dev-deps.sh + - task: shell.docker.Ensure + image: algorand/go-algorand-linux + arch: arm32v6 + version: '{{ docker.Version.linux-arm.version }}' + dockerFilePath: docker/build/arm.Dockerfile + - task: docker.Make + image: algorand/go-algorand-linux + version: '{{ docker.Version.linux-arm.version }}' + workDir: /go/src/github.com/algorand/go-algorand + target: ci-build + build-local: + - task: shell.Make + target: ci-deps fulltest ci-build + release: + - task: release.notes.GenerateReleaseNotes + releaseVersion: ${GO_ALGORAND_RELEASE_VERSION} + githubPatToken: ${GITHUB_PAT_TOKEN} + githubRepoFullName: algorand/go-algorand diff --git a/netdeploy/network.go b/netdeploy/network.go index 06eead476f..89e9e82fec 100644 --- a/netdeploy/network.go +++ b/netdeploy/network.go @@ -57,7 +57,7 @@ type Network struct { // CreateNetworkFromTemplate uses the specified template to deploy a new private network // under the specified root directory. -func CreateNetworkFromTemplate(name, rootDir, templateFile, binDir string, importKeys bool, nodeExitCallback nodecontrol.AlgodExitErrorCallback) (Network, error) { +func CreateNetworkFromTemplate(name, rootDir, templateFile, binDir string, importKeys bool, nodeExitCallback nodecontrol.AlgodExitErrorCallback, consensus config.ConsensusProtocols) (Network, error) { n := Network{ rootDir: rootDir, nodeExitCallback: nodeExitCallback, @@ -78,7 +78,7 @@ func CreateNetworkFromTemplate(name, rootDir, templateFile, binDir string, impor if err != nil { return n, err } - + template.Consensus = consensus err = template.generateGenesisAndWallets(rootDir, name, binDir) if err != nil { return n, err @@ -90,6 +90,7 @@ func CreateNetworkFromTemplate(name, rootDir, templateFile, binDir string, impor } err = n.Save(rootDir) + n.SetConsensus(binDir, consensus) return n, err } @@ -437,3 +438,25 @@ func (n Network) Delete(binDir string) error { n.Stop(binDir) return os.RemoveAll(n.rootDir) } + +// SetConsensus applies a new consensus settings which would get deployed before +// any of the nodes starts +func (n Network) SetConsensus(binDir string, consensus config.ConsensusProtocols) error { + for _, relayDir := range n.cfg.RelayDirs { + relayFulllPath := n.getNodeFullPath(relayDir) + nc := nodecontrol.MakeNodeController(binDir, relayFulllPath) + err := nc.SetConsensus(consensus) + if err != nil { + return err + } + } + for _, nodeDir := range n.nodeDirs { + nodeFulllPath := n.getNodeFullPath(nodeDir) + nc := nodecontrol.MakeNodeController(binDir, nodeFulllPath) + err := nc.SetConsensus(consensus) + if err != nil { + return err + } + } + return nil +} diff --git a/netdeploy/networkTemplate.go b/netdeploy/networkTemplate.go index 8462bdd70f..1f6e365848 100644 --- a/netdeploy/networkTemplate.go +++ b/netdeploy/networkTemplate.go @@ -21,6 +21,7 @@ import ( "fmt" "io" "io/ioutil" + "math/big" "os" "path/filepath" "runtime" @@ -30,25 +31,15 @@ import ( "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/gen" "github.com/algorand/go-algorand/libgoal" + "github.com/algorand/go-algorand/netdeploy/remote" "github.com/algorand/go-algorand/util" ) -type walletTemplateData struct { - Name string - ParticipationOnly bool -} - -type nodeConfig struct { - Name string - IsRelay bool - Wallets []walletTemplateData - DeadlockDetection int -} - // NetworkTemplate represents the template used for creating private named networks type NetworkTemplate struct { - Genesis gen.GenesisData - Nodes []nodeConfig + Genesis gen.GenesisData + Nodes []remote.NodeConfigGoal + Consensus config.ConsensusProtocols } var defaultNetworkTemplate = NetworkTemplate{ @@ -58,7 +49,8 @@ var defaultNetworkTemplate = NetworkTemplate{ func (t NetworkTemplate) generateGenesisAndWallets(targetFolder, networkName, binDir string) error { genesisData := t.Genesis genesisData.NetworkName = networkName - return gen.GenerateGenesisFiles(genesisData, targetFolder, true) + mergedConsensus := config.Consensus.Merge(t.Consensus) + return gen.GenerateGenesisFiles(genesisData, mergedConsensus, targetFolder, true) } // Create data folders for all NodeConfigs, configuring relays appropriately and @@ -146,7 +138,7 @@ func (t NetworkTemplate) createNodeDirectories(targetFolder string, binDir strin // Create any necessary config.json file for this node nodeCfg := filepath.Join(nodeDir, config.ConfigFilename) - err = cfg.createConfigFile(nodeCfg, len(t.Nodes)-1) // minus 1 to avoid counting self + err = createConfigFile(cfg, nodeCfg, len(t.Nodes)-1) // minus 1 to avoid counting self if err != nil { return } @@ -180,17 +172,21 @@ func loadTemplateFromReader(reader io.Reader, template *NetworkTemplate) error { func (t NetworkTemplate) Validate() error { // Genesis wallet percentages must add up to 100 // Genesis account names must be unique - totalPct := uint(0) + totalPct := big.NewFloat(float64(0)) accounts := make(map[string]bool) for _, wallet := range t.Genesis.Wallets { - totalPct += uint(wallet.Stake) + if wallet.Stake < 0 { + return fmt.Errorf("invalid template: negative stake on Genesis account %s", wallet.Name) + } + totalPct = totalPct.Add(totalPct, big.NewFloat(wallet.Stake)) upperAcct := strings.ToUpper(wallet.Name) if _, found := accounts[upperAcct]; found { return fmt.Errorf("invalid template: duplicate Genesis account %s", wallet.Name) } accounts[upperAcct] = true } - if totalPct != 100 { + totalPctInt, _ := totalPct.Int64() + if totalPctInt != 100 { return fmt.Errorf("invalid template: Genesis account allocations must total 100 (actual %v)", totalPct) } @@ -218,7 +214,7 @@ func (t NetworkTemplate) Validate() error { } // TODO: Build the JSON object using a real encoder -func (node nodeConfig) createConfigFile(configFile string, numNodes int) error { +func createConfigFile(node remote.NodeConfigGoal, configFile string, numNodes int) error { // Override default :8080 REST endpoint, and disable SRV lookup configString := `{ "GossipFanout": ` + fmt.Sprintf("%d", numNodes) + `, "EndpointAddress": "127.0.0.1:0", "DNSBootstrapID": "", "EnableProfiler": true` diff --git a/netdeploy/networkTemplates_test.go b/netdeploy/networkTemplates_test.go index 042b244359..18d02a76d4 100644 --- a/netdeploy/networkTemplates_test.go +++ b/netdeploy/networkTemplates_test.go @@ -64,3 +64,22 @@ func TestGenerateGenesis(t *testing.T) { fileExists := err == nil a.True(fileExists) } + +func TestValidate(t *testing.T) { + a := require.New(t) + + templateDir, _ := filepath.Abs("../test/testdata/nettemplates") + template, _ := loadTemplate(filepath.Join(templateDir, "David20.json")) + err := template.Validate() + a.NoError(err) + + templateDir, _ = filepath.Abs("../test/testdata/nettemplates") + template, _ = loadTemplate(filepath.Join(templateDir, "TenThousandAccountsEqual.json")) + err = template.Validate() + a.NoError(err) + + templateDir, _ = filepath.Abs("../test/testdata/nettemplates") + template, _ = loadTemplate(filepath.Join(templateDir, "NegativeStake.json")) + err = template.Validate() + a.Error(err) +} diff --git a/netdeploy/remote/deployedNetwork.go b/netdeploy/remote/deployedNetwork.go index f29391de5c..5e10ebeb99 100644 --- a/netdeploy/remote/deployedNetwork.go +++ b/netdeploy/remote/deployedNetwork.go @@ -253,7 +253,7 @@ func (cfg DeployedNetwork) BuildNetworkFromTemplate(buildCfg BuildConfig, rootDi if cfg.useExistingGenesis { fmt.Println(" *** using existing genesis files ***") } else { - if err = gen.GenerateGenesisFiles(cfg.GenesisData, genesisFolder, true); err != nil { + if err = gen.GenerateGenesisFiles(cfg.GenesisData, config.Consensus, genesisFolder, true); err != nil { return } } diff --git a/netdeploy/remote/nodeConfig.go b/netdeploy/remote/nodeConfig.go index 5d70f367bb..5eba9282ff 100644 --- a/netdeploy/remote/nodeConfig.go +++ b/netdeploy/remote/nodeConfig.go @@ -50,3 +50,11 @@ func (nc NodeConfig) IsRelay() bool { // If we advertise to the world an address where we listen for gossip network connections, we are taking on the role of relay. return nc.NetAddress != "" } + +// NodeConfigGoal represents is a simplified version of NodeConfig used with 'goal network' commands +type NodeConfigGoal struct { + Name string + IsRelay bool `json:",omitempty"` + Wallets []NodeWalletData + DeadlockDetection int `json:"-"` +} diff --git a/network/connPerfMon.go b/network/connPerfMon.go new file mode 100644 index 0000000000..896bd774c8 --- /dev/null +++ b/network/connPerfMon.go @@ -0,0 +1,351 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package network + +import ( + "sort" + "time" + + "github.com/algorand/go-deadlock" + + "github.com/algorand/go-algorand/crypto" +) + +type pmStage int + +const ( + pmStagePresync pmStage = iota // pmStagePresync used as a warmup for the monitoring. it ensures that we've received at least a single message from each peer, and that we've waited enough time before attempting to sync up. + pmStageSync pmStage = iota // pmStageSync is syncing up the peer message streams. It exists once all the connections have demonstrated a given idle time. + pmStageAccumulate pmStage = iota // pmStageAccumulate monitors streams and accumulate the messages between the connections. + pmStageStopping pmStage = iota // pmStageStopping keep monitoring the streams, but do not accept new messages. It tries to expire pending messages until all pending messages expires. + pmStageStopped pmStage = iota // pmStageStopped is the final stage; it means that the performance monitor reached a conclusion regarding the performance statistics +) + +const ( + pmPresyncTime = 10 * time.Second + pmSyncIdleTime = 2 * time.Second + pmSyncMaxTime = 25 * time.Second + pmAccumulationTime = 60 * time.Second + pmAccumulationTimeRange = 30 * time.Second + pmAccumulationIdlingTime = 2 * time.Second + pmMaxMessageWaitTime = 15 * time.Second + pmUndeliveredMessagePenaltyTime = 5 * time.Second + pmDesiredMessegeDelayThreshold = 50 * time.Millisecond +) + +// pmMessage is the internal storage for a single message. We save the time the message arrived from each of the peers. +type pmMessage struct { + peerMsgTime map[Peer]int64 // for each peer, when did we see a message the first time + firstPeerTime int64 // the timestamp of the first peer that has seen this message. +} + +// pmPeerStatistics is the per-peer resulting datastructure of the performance analysis. +type pmPeerStatistics struct { + peer Peer // the peer interface + peerDelay int64 // the peer avarage relative message delay + peerFirstMessage float32 // what precentage of the messages were delivered by this peer before any other peer +} + +// pmStatistics is the resulting datastructure of the performance analysis. +type pmStatistics struct { + peerStatistics []pmPeerStatistics // an ordered list of the peers performance statistics + messageCount int64 // the number of messages used to calculate the above statistics +} + +// connectionPerformanceMonitor is the connection monitor datatype. We typically would like to have a single monitor for all +// the outgoing connections. +type connectionPerformanceMonitor struct { + deadlock.Mutex + monitoredConnections map[Peer]bool // the map of the connection we're going to monitor. Messages coming from other connections would be ignored. + monitoredMessageTags map[Tag]bool // the map of the message tags we're interested in monitoring. Messages that aren't broadcast-type typically would be a good choice here. + stage pmStage // the performance monitoring stage. + peerLastMsgTime map[Peer]int64 // the map describing the last time we received a message from each of the peers. + lastIncomingMsgTime int64 // the time at which the last message was received from any of the peers. + stageStartTime int64 // the timestamp at which we switched to the current stage. + pendingMessages map[crypto.Digest]*pmMessage // the pendingMessages map contains messages that haven't been received from all the peers within the pmMaxMessageWaitTime + connectionDelay map[Peer]int64 // contains the total delay we've sustained by each peer when we're in stages pmStagePresync-pmStageStopping and the average delay after that. ( in nano seconds ) + firstMessageCount map[Peer]int64 // maps the peers to their accumulated first messages ( the number of times a message seen coming from this peer first ) + msgCount int64 // total number of messages that we've accumulated. + accumulationTime int64 // the duration of which we're going to accumulate messages. This will get randomized to prevent cross-node syncronization. +} + +// makeConnectionPerformanceMonitor creates a new performance monitor instance, that is configured for monitoring the given message tags. +func makeConnectionPerformanceMonitor(messageTags []Tag) *connectionPerformanceMonitor { + msgTagMap := make(map[Tag]bool, len(messageTags)) + for _, tag := range messageTags { + msgTagMap[tag] = true + } + return &connectionPerformanceMonitor{ + monitoredConnections: make(map[Peer]bool, 0), + monitoredMessageTags: msgTagMap, + } +} + +// GetPeersStatistics returns the statistics result of the performance monitoring, once these becomes available. +// otherwise, it returns nil. +func (pm *connectionPerformanceMonitor) GetPeersStatistics() (stat *pmStatistics) { + pm.Lock() + defer pm.Unlock() + if pm.stage != pmStageStopped || len(pm.connectionDelay) == 0 { + return nil + } + stat = &pmStatistics{ + peerStatistics: make([]pmPeerStatistics, 0, len(pm.connectionDelay)), + messageCount: pm.msgCount, + } + for peer, delay := range pm.connectionDelay { + peerStat := pmPeerStatistics{ + peer: peer, + peerDelay: delay, + } + if pm.msgCount > 0 { + peerStat.peerFirstMessage = float32(pm.firstMessageCount[peer]) / float32(pm.msgCount) + } + stat.peerStatistics = append(stat.peerStatistics, peerStat) + } + sort.Slice(stat.peerStatistics, func(i, j int) bool { + return stat.peerStatistics[i].peerDelay > stat.peerStatistics[j].peerDelay + }) + return +} + +// ComparePeers compares the given peers list or the existing peers being monitored. If the +// peers list have changed since Reset was called, it would return false. +// The method is insensitive to peer ordering and uses the peer interface pointer to determine equality. +func (pm *connectionPerformanceMonitor) ComparePeers(peers []Peer) bool { + pm.Lock() + defer pm.Unlock() + for _, peer := range peers { + if pm.monitoredConnections[peer] == false { + return false + } + } + return len(peers) == len(pm.monitoredConnections) +} + +// Reset updates the existing peers list to the one provided. The Reset method is expected to be used +// in three scenarios : +// 1. clearing out the existing monitoring - which brings it to initial state and disable monitoring. +// 2. change monitored peers - in case we've had some of our peers disconnected/reconnected during the monitoring process. +// 3. start monitoring +func (pm *connectionPerformanceMonitor) Reset(peers []Peer) { + pm.Lock() + defer pm.Unlock() + pm.pendingMessages = make(map[crypto.Digest]*pmMessage, 0) + pm.monitoredConnections = make(map[Peer]bool, len(peers)) + pm.peerLastMsgTime = make(map[Peer]int64, len(peers)) + pm.connectionDelay = make(map[Peer]int64, len(peers)) + pm.firstMessageCount = make(map[Peer]int64, len(peers)) + pm.msgCount = 0 + pm.advanceStage(pmStagePresync, time.Now().UnixNano()) + pm.accumulationTime = int64(pmAccumulationTime) + int64(crypto.RandUint63())%int64(pmAccumulationTime) + + for _, peer := range peers { + pm.monitoredConnections[peer] = true + pm.peerLastMsgTime[peer] = pm.stageStartTime + pm.connectionDelay[peer] = 0 + pm.firstMessageCount[peer] = 0 + } + +} + +// Notify is the single entrypoint for an incoming message processing. When an outgoing connection +// is being monitored, it would make a call to Notify, sending the incoming message details. +// The Notify function will forward this notification to the current stage processing function. +func (pm *connectionPerformanceMonitor) Notify(msg *IncomingMessage) { + pm.Lock() + defer pm.Unlock() + if pm.monitoredConnections[msg.Sender] == false { + return + } + if pm.monitoredMessageTags[msg.Tag] == false { + return + } + switch pm.stage { + case pmStagePresync: + pm.notifyPresync(msg) + case pmStageSync: + pm.notifySync(msg) + case pmStageAccumulate: + pm.notifyAccumulate(msg) + case pmStageStopping: + pm.notifyStopping(msg) + default: // pmStageStopped + } +} + +// notifyPresync waits until pmPresyncTime has passed and monitor the last arrivial time +// of messages from each of the peers. +func (pm *connectionPerformanceMonitor) notifyPresync(msg *IncomingMessage) { + pm.peerLastMsgTime[msg.Sender] = msg.Received + if (msg.Received - pm.stageStartTime) < int64(pmPresyncTime) { + return + } + // presync complete. move to the next stage. + noMsgPeers := make(map[Peer]bool, 0) + for peer, lastMsgTime := range pm.peerLastMsgTime { + if lastMsgTime == pm.stageStartTime { + // we haven't received a single message from this peer during the entire presync time. + noMsgPeers[peer] = true + } + } + if len(noMsgPeers) >= (len(pm.peerLastMsgTime) / 2) { + // if more than half of the peers have not sent us a single message, + // extend the presync time. We might be in agreement recovery, where we have very low + // traffic. If this becomes a repeated issue, it will get solved by the + // clique detection algorithm and some of the nodes would get disconnected. + pm.stageStartTime = msg.Received + return + } + if len(noMsgPeers) > 0 { + // we have one or more peers that did not send a single message thoughtout the presync time. + // ( but less than half ). since we cannot rely on these to send us messages in the future, + // we'll disconnect from these peers. + pm.advanceStage(pmStageStopped, msg.Received) + for peer := range pm.monitoredConnections { + if noMsgPeers[peer] { + pm.connectionDelay[peer] = int64(pmUndeliveredMessagePenaltyTime) + } else { + pm.connectionDelay[peer] = 0 + } + } + return + } + pm.lastIncomingMsgTime = msg.Received + // otherwise, once we recieved a message from each of the peers, move to the sync stage. + pm.advanceStage(pmStageSync, msg.Received) +} + +// notifySync waits for all the peers connection's to go into an idle phase. +// when we go into this stage, the peerLastMsgTime will be already updated +// with the recent message time per peer. +func (pm *connectionPerformanceMonitor) notifySync(msg *IncomingMessage) { + minMsgInterval := pm.updateMessageIdlingInterval(msg.Received) + if minMsgInterval > int64(pmSyncIdleTime) || (msg.Received-pm.stageStartTime > int64(pmSyncMaxTime)) { + // if we hit the first expression, then it means that we've managed to sync up the connections. + // otherwise, we've failed to sync up the connections. That's not great, as we're likely to + // have some "penalties" applied, but we can't do much about it. + pm.accumulateMessage(msg, true) + pm.advanceStage(pmStageAccumulate, msg.Received) + } +} + +// notifyAccumulate accumulate the incoming message as needed, and waiting between pm.accumulationTime to +// (pm.accumulationTime + pmAccumulationTimeRange) before moving to the next stage. +func (pm *connectionPerformanceMonitor) notifyAccumulate(msg *IncomingMessage) { + minMsgInterval := pm.updateMessageIdlingInterval(msg.Received) + if msg.Received-pm.stageStartTime >= pm.accumulationTime { + if minMsgInterval > int64(pmAccumulationIdlingTime) || + (msg.Received-pm.stageStartTime >= pm.accumulationTime+int64(pmAccumulationTimeRange)) { + // move to the next stage. + pm.advanceStage(pmStageStopping, msg.Received) + return + } + } + pm.accumulateMessage(msg, true) + pm.pruneOldMessages(msg.Received) +} + +// notifyStopping attempts to stop the message accumulation. Once we reach this stage, no new messages are being +// added, and old pending messages are being pruned. Once all messages are pruned, it moves to the next stage. +func (pm *connectionPerformanceMonitor) notifyStopping(msg *IncomingMessage) { + pm.accumulateMessage(msg, false) + pm.pruneOldMessages(msg.Received) + if len(pm.pendingMessages) > 0 { + return + } + // time to wrap up. + if pm.msgCount > 0 { + for peer := range pm.monitoredConnections { + pm.connectionDelay[peer] /= int64(pm.msgCount) + } + } + pm.advanceStage(pmStageStopped, msg.Received) +} + +// advanceStage set the stage variable and update the stage start time. +func (pm *connectionPerformanceMonitor) advanceStage(newStage pmStage, now int64) { + pm.stage = newStage + pm.stageStartTime = now +} + +// updateMessageIdlingInterval updates the last message received timestamps and determines how long it has been since +// the last message was received on any of the incoming peers +func (pm *connectionPerformanceMonitor) updateMessageIdlingInterval(now int64) (minMsgInterval int64) { + currentIncomingMsgTime := pm.lastIncomingMsgTime + if pm.lastIncomingMsgTime < now { + pm.lastIncomingMsgTime = now + } + if currentIncomingMsgTime <= now { + return now - currentIncomingMsgTime + } + return 0 +} + +func (pm *connectionPerformanceMonitor) pruneOldMessages(now int64) { + oldestMessage := now - int64(pmMaxMessageWaitTime) + for digest, pendingMsg := range pm.pendingMessages { + if oldestMessage < pendingMsg.firstPeerTime { + continue + } + for peer := range pm.monitoredConnections { + if msgTime, hasPeer := pendingMsg.peerMsgTime[peer]; hasPeer { + msgDelayInterval := msgTime - pendingMsg.firstPeerTime + pm.connectionDelay[peer] += msgDelayInterval + } else { + // we never received this message from this peer. + pm.connectionDelay[peer] += int64(pmUndeliveredMessagePenaltyTime) + } + } + delete(pm.pendingMessages, digest) + } +} + +func (pm *connectionPerformanceMonitor) accumulateMessage(msg *IncomingMessage, newMessages bool) { + msgDigest := generateMessageDigest(msg.Tag, msg.Data) + + pendingMsg := pm.pendingMessages[msgDigest] + if pendingMsg == nil { + if newMessages { + // we don't have this one yet, add it. + pm.pendingMessages[msgDigest] = &pmMessage{ + peerMsgTime: map[Peer]int64{ + msg.Sender: msg.Received, + }, + firstPeerTime: msg.Received, + } + pm.firstMessageCount[msg.Sender]++ + pm.msgCount++ + } + return + } + // we already seen this digest + // make sure we're only moving forward in time. This could be caused when + // we have lock contension. + pendingMsg.peerMsgTime[msg.Sender] = msg.Received + if msg.Received < pendingMsg.firstPeerTime { + pendingMsg.firstPeerTime = msg.Received + } + + if len(pendingMsg.peerMsgTime) == len(pm.monitoredConnections) { + // we've received the same message from all out peers. + for peer, msgTime := range pendingMsg.peerMsgTime { + pm.connectionDelay[peer] += msgTime - pendingMsg.firstPeerTime + } + delete(pm.pendingMessages, msgDigest) + } +} diff --git a/network/dialer.go b/network/dialer.go new file mode 100644 index 0000000000..26cd6ac088 --- /dev/null +++ b/network/dialer.go @@ -0,0 +1,94 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package network + +import ( + "context" + "net" + "time" + + "github.com/algorand/go-algorand/tools/network/dnssec" +) + +type netDialer interface { + DialContext(ctx context.Context, network, address string) (net.Conn, error) +} + +// Dialer establish tcp-level connection with the destination +type Dialer struct { + phonebook Phonebook + innerDialer netDialer + resolver *net.Resolver +} + +// makeRateLimitingDialer creates a rate limiting dialer that would limit the connections +// according to the entries in the phonebook. +func makeRateLimitingDialer(phonebook Phonebook, resolver *dnssec.Resolver) Dialer { + var innerDialer netDialer = &net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + DualStack: true, + } + + // if a DNSSEC-aware resolver provided, use a wrapping dnssec.Dialer to parse addr, resolve it securely + // and call a regular net.Dialer + if resolver != nil { + innerDialer = &dnssec.Dialer{ + InnerDialer: innerDialer.(*net.Dialer), + Resolver: resolver, + } + } + + return Dialer{ + phonebook: phonebook, + innerDialer: innerDialer, + } +} + +// Dial connects to the address on the named network. +// It waits if needed not to exceed connectionsRateLimitingCount. +func (d *Dialer) Dial(network, address string) (net.Conn, error) { + return d.DialContext(context.Background(), network, address) +} + +// DialContext connects to the address on the named network using the provided context. +// It waits if needed not to exceed connectionsRateLimitingCount. +func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { + var waitTime time.Duration + var provisionalTime time.Time + + for { + _, waitTime, provisionalTime = d.phonebook.GetConnectionWaitTime(address) + if waitTime == 0 { + break // break out of the loop and proceed to the connection + } + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-time.After(waitTime): + } + } + conn, err := d.innerDialContext(ctx, network, address) + d.phonebook.UpdateConnectionTime(address, provisionalTime) + + return conn, err +} + +func (d *Dialer) innerDialContext(ctx context.Context, network, address string) (net.Conn, error) { + // this would be a good place to have the dnssec evaluated. + return d.innerDialer.DialContext(ctx, network, address) +} diff --git a/network/msgOfInterest.go b/network/msgOfInterest.go new file mode 100644 index 0000000000..2c4af3362e --- /dev/null +++ b/network/msgOfInterest.go @@ -0,0 +1,65 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package network + +import ( + "errors" + "strings" + + "github.com/algorand/go-algorand/protocol" +) + +var errUnableUnmarshallMessage = errors.New("unmarshalMessageOfInterest: could not unmarshall message") +var errInvalidMessageOfInterest = errors.New("unmarshalMessageOfInterest: message missing the tags key") +var errInvalidMessageOfInterestLength = errors.New("unmarshalMessageOfInterest: message length is too long") + +const maxMessageOfInterestTags = 1024 + +func unmarshallMessageOfInterest(data []byte) (map[protocol.Tag]bool, error) { + // decode the message, and ensure it's a valid message. + topics, err := UnmarshallTopics(data) + if err != nil { + return nil, errUnableUnmarshallMessage + } + tags, found := topics.GetValue("tags") + if !found { + return nil, errInvalidMessageOfInterest + } + if len(tags) > maxMessageOfInterestTags { + return nil, errInvalidMessageOfInterestLength + } + // convert the tags into a tags map. + msgTagsMap := make(map[protocol.Tag]bool, len(tags)) + for _, tag := range strings.Split(string(tags), ",") { + msgTagsMap[protocol.Tag(tag)] = true + } + return msgTagsMap, nil +} + +// MarshallMessageOfInterest generate a message of interest message body for a given set of message tags. +func MarshallMessageOfInterest(messageTags []protocol.Tag) []byte { + // create a long string with all these messages. + tags := "" + for _, tag := range messageTags { + tags += "," + string(tag) + } + if len(tags) > 0 { + tags = tags[1:] + } + topics := Topics{Topic{key: "tags", data: []byte(tags)}} + return topics.MarshallTopics() +} diff --git a/network/msgOfInterest_test.go b/network/msgOfInterest_test.go new file mode 100644 index 0000000000..b1b22b8a50 --- /dev/null +++ b/network/msgOfInterest_test.go @@ -0,0 +1,67 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package network + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/protocol" +) + +func TestUnmarshallMessageOfInterestErrors(t *testing.T) { + tags, err := unmarshallMessageOfInterest([]byte{0x88}) + require.Equal(t, errUnableUnmarshallMessage, err) + require.Equal(t, 0, len(tags)) + + invalidTopics := Topics{Topic{key: "something-else", data: []byte{}}} + tags, err = unmarshallMessageOfInterest(invalidTopics.MarshallTopics()) + require.Equal(t, errInvalidMessageOfInterest, err) + require.Equal(t, 0, len(tags)) + + longTagsList := "" + for i := 0; i < 1024; i++ { + longTagsList += ",XQ" + } + longTagsList = longTagsList[1:] + longtagsTopics := Topics{Topic{key: "tags", data: []byte(longTagsList)}} + tags, err = unmarshallMessageOfInterest(longtagsTopics.MarshallTopics()) + require.Equal(t, errInvalidMessageOfInterestLength, err) + require.Equal(t, 0, len(tags)) +} + +func TestMarshallMessageOfInterest(t *testing.T) { + bytes := MarshallMessageOfInterest([]protocol.Tag{protocol.AgreementVoteTag}) + tags, err := unmarshallMessageOfInterest(bytes) + require.NoError(t, err) + require.Equal(t, tags[protocol.AgreementVoteTag], true) + require.Equal(t, 1, len(tags)) + + bytes = MarshallMessageOfInterest([]protocol.Tag{protocol.AgreementVoteTag, protocol.NetPrioResponseTag}) + tags, err = unmarshallMessageOfInterest(bytes) + require.NoError(t, err) + require.Equal(t, tags[protocol.AgreementVoteTag], true) + require.Equal(t, tags[protocol.NetPrioResponseTag], true) + require.Equal(t, 2, len(tags)) + + bytes = MarshallMessageOfInterest([]protocol.Tag{protocol.AgreementVoteTag, protocol.AgreementVoteTag}) + tags, err = unmarshallMessageOfInterest(bytes) + require.NoError(t, err) + require.Equal(t, tags[protocol.AgreementVoteTag], true) + require.Equal(t, 1, len(tags)) +} diff --git a/network/netprio_test.go b/network/netprio_test.go index 7f6cc457f7..4e9bd299e5 100644 --- a/network/netprio_test.go +++ b/network/netprio_test.go @@ -52,12 +52,12 @@ func (nps *netPrioStub) MakePrioResponse(challenge string) []byte { Addr: nps.addr, Prio: nps.prio, } - return protocol.Encode(r) + return protocol.EncodeReflect(r) } func (nps *netPrioStub) VerifyPrioResponse(challenge string, response []byte) (addr basics.Address, err error) { var r netPrioStubResponse - err = protocol.Decode(response, &r) + err = protocol.DecodeReflect(response, &r) if err != nil { return } diff --git a/network/phonebook.go b/network/phonebook.go index aabe08eb57..ad7db2dcec 100644 --- a/network/phonebook.go +++ b/network/phonebook.go @@ -35,17 +35,97 @@ type Phonebook interface { // UpdateRetryAfter updates the retry-after field for the entries matching the given address UpdateRetryAfter(addr string, retryAfter time.Time) + + // GetConnectionWaitTime will calculate and return the wait + // time to prevent exceeding connectionsRateLimitingCount. + // The connection should be established when the waitTime is 0. + // It will register a provisional next connection time when the waitTime is 0. + // The provisional time should be updated after the connection with UpdateConnectionTime + GetConnectionWaitTime(addr string) (addrInPhonebook bool, + waitTime time.Duration, provisionalTime time.Time) + + // UpdateConnectionTime will update the provisional connection time. + // Returns true of the addr was in the phonebook + UpdateConnectionTime(addr string, provisionalTime time.Time) bool + + // ReplacePeerList merges a set of addresses with that passed in for networkName + // new entries in dnsAddresses are being added + // existing items that aren't included in dnsAddresses are being removed + // matching entries don't change + ReplacePeerList(dnsAddresses []string, networkName string) + + // ExtendPeerList adds unique addresses to this set of addresses + ExtendPeerList(more []string, networkName string) +} + +// addressData: holds the information associated with each phonebook address. +// retryAfter: is the time to wait before retrying to connect to the address. +// recentConnectionTimes: is the log of connection times used to observe the maximum +// connections to the address in a given time window. +// networkNames: lists the networks to which the given address belongs. +type addressData struct { + retryAfter time.Time + recentConnectionTimes []time.Time + networkNames map[string]bool +} + +func makePhonebookEntryData(networkName string) addressData { + pbData := addressData{ + networkNames: make(map[string]bool), + recentConnectionTimes: make([]time.Time, 0), + } + pbData.networkNames[networkName] = true + return pbData +} + +// phonebookImpl holds the server connection configuration values +// and the list of request times within the time window for each +// address. +type phonebookImpl struct { + connectionsRateLimitingCount uint + connectionsRateLimitingWindow time.Duration + data map[string]addressData + lock deadlock.RWMutex +} + +// MakePhonebook creates phonebookImpl with the passed configuration values +func MakePhonebook(connectionsRateLimitingCount uint, + connectionsRateLimitingWindow time.Duration) Phonebook { + return &phonebookImpl{ + connectionsRateLimitingCount: connectionsRateLimitingCount, + connectionsRateLimitingWindow: connectionsRateLimitingWindow, + data: make(map[string]addressData, 0), + } } -type phonebookData struct { - retryAfter time.Time +func (e *phonebookImpl) deletePhonebookEntry(entryName, networkName string) { + pbEntry := e.data[entryName] + delete(pbEntry.networkNames, networkName) + if 0 == len(pbEntry.networkNames) { + delete(e.data, entryName) + } } -type phonebookEntries map[string]phonebookData +// PopEarliestTime removes the earliest time from recentConnectionTimes in +// addressData for addr +// It is expected to be later than ConnectionsRateLimitingWindow +func (e *phonebookImpl) popNElements(n int, addr string) { + entry := e.data[addr] + entry.recentConnectionTimes = entry.recentConnectionTimes[n:] + e.data[addr] = entry +} -func (e *phonebookEntries) filterRetryTime(t time.Time) []string { - o := make([]string, 0, len(*e)) - for addr, entry := range *e { +// AppendTime adds the current time to recentConnectionTimes in +// addressData of addr +func (e *phonebookImpl) appendTime(addr string, t time.Time) { + entry := e.data[addr] + entry.recentConnectionTimes = append(entry.recentConnectionTimes, t) + e.data[addr] = entry +} + +func (e *phonebookImpl) filterRetryTime(t time.Time) []string { + o := make([]string, 0, len(e.data)) + for addr, entry := range e.data { if t.After(entry.retryAfter) { o = append(o, addr) } @@ -54,47 +134,130 @@ func (e *phonebookEntries) filterRetryTime(t time.Time) []string { } // ReplacePeerList merges a set of addresses with that passed in. -// new entries in they are being added -// existing items that aren't included in they are being removed +// new entries in addressesThey are being added +// existing items that aren't included in addressesThey are being removed // matching entries don't change -func (e *phonebookEntries) ReplacePeerList(they []string) { +func (e *phonebookImpl) ReplacePeerList(addressesThey []string, networkName string) { + e.lock.Lock() + defer e.lock.Unlock() // prepare a map of items we'd like to remove. removeItems := make(map[string]bool, 0) - for k := range *e { - removeItems[k] = true + for k, pbd := range e.data { + if pbd.networkNames[networkName] { + removeItems[k] = true + } } - for _, addr := range they { - if _, has := (*e)[addr]; has { - // we already have this. do nothing. + for _, addr := range addressesThey { + if pbData, has := e.data[addr]; has { + // we already have this. + // Update the networkName + pbData.networkNames[networkName] = true + + // do not remove this entry delete(removeItems, addr) } else { // we don't have this item. add it. - (*e)[addr] = phonebookData{} + e.data[addr] = makePhonebookEntryData(networkName) } } - // remove items that were missing in they + // remove items that were missing in addressesThey for k := range removeItems { - delete((*e), k) + e.deletePhonebookEntry(k, networkName) } } -func (e *phonebookEntries) updateRetryAfter(addr string, retryAfter time.Time) { - (*e)[addr] = phonebookData{retryAfter: retryAfter} +func (e *phonebookImpl) UpdateRetryAfter(addr string, retryAfter time.Time) { + e.lock.Lock() + defer e.lock.Unlock() + + var entry addressData + + entry, found := e.data[addr] + if !found { + return + } + entry.retryAfter = retryAfter + e.data[addr] = entry } -// ArrayPhonebook is a simple wrapper on a phonebookEntries map -type ArrayPhonebook struct { - Entries phonebookEntries +// GetConnectionWaitTime will calculate and return the wait +// time to prevent exceeding connectionsRateLimitingCount. +// The connection should be established when the waitTime is 0. +// It will register a provisional next connection time when the waitTime is 0. +// The provisional time should be updated after the connection with UpdateConnectionTime +func (e *phonebookImpl) GetConnectionWaitTime(addr string) (addrInPhonebook bool, + waitTime time.Duration, provisionalTime time.Time) { + e.lock.Lock() + defer e.lock.Unlock() + + _, addrInPhonebook = e.data[addr] + curTime := time.Now() + if !addrInPhonebook { + // The addr is not in this phonebook. + // Will find the addr in a different phonebook. + return addrInPhonebook, 0 /* not unsed */, curTime /* not unsed */ + } + + var timeSince time.Duration + var numElmtsToRemove int + // Remove from recentConnectionTimes the times later than ConnectionsRateLimitingWindowSeconds + for numElmtsToRemove < len(e.data[addr].recentConnectionTimes) { + timeSince = curTime.Sub((e.data[addr].recentConnectionTimes)[numElmtsToRemove]) + if timeSince >= e.connectionsRateLimitingWindow { + numElmtsToRemove++ + } else { + break // break the loop. The rest are earlier than 1 second + } + } + // Remove the expired elements from e.data[addr].recentConnectionTimes + e.popNElements(numElmtsToRemove, addr) + + // If there are max number of connections within the time window, wait + numElts := len(e.data[addr].recentConnectionTimes) + if uint(numElts) >= e.connectionsRateLimitingCount { + return addrInPhonebook, /* true */ + (e.connectionsRateLimitingWindow - timeSince), curTime /* not unsed */ + } + + // Else, there is space in connectionsRateLimitingCount. The + // connection request of the caller will proceed + // Update curTime, since it may have significantly changed if waited + provisionalTime = time.Now() + // Append the provisional time for the next connection request + e.appendTime(addr, provisionalTime) + return addrInPhonebook /* true */, 0 /* no wait. proceed */, provisionalTime } -// MakeArrayPhonebook creates a ArrayPhonebook -func MakeArrayPhonebook() *ArrayPhonebook { - return &ArrayPhonebook{ - Entries: make(phonebookEntries, 0), +// UpdateConnectionTime will update the provisional connection time. +// Returns true of the addr was in the phonebook +func (e *phonebookImpl) UpdateConnectionTime(addr string, provisionalTime time.Time) bool { + e.lock.Lock() + defer e.lock.Unlock() + + entry, found := e.data[addr] + if !found { + return false + } + + defer func() { + e.data[addr] = entry + }() + + // Find the provisionalTime and update it + for indx, val := range entry.recentConnectionTimes { + if provisionalTime == val { + entry.recentConnectionTimes[indx] = time.Now() + return true + } } + // Case where the time is not found: it was removed from the list. + // This may happen when the time expires before the connection was established with the server. + // The time should be added again. + entry.recentConnectionTimes = append(entry.recentConnectionTimes, time.Now()) + return true } func shuffleStrings(set []string) { @@ -126,133 +289,29 @@ func shuffleSelect(set []string, n int) []string { return out } -// UpdateRetryAfter updates the retry-after field for the entries matching the given address -func (p *ArrayPhonebook) UpdateRetryAfter(addr string, retryAfter time.Time) { - p.Entries.updateRetryAfter(addr, retryAfter) -} - -// GetAddresses returns up to N shuffled address -func (p *ArrayPhonebook) GetAddresses(n int) []string { - return shuffleSelect(p.Entries.filterRetryTime(time.Now()), n) -} - -// ThreadsafePhonebook implements Phonebook interface -type ThreadsafePhonebook struct { - lock deadlock.RWMutex - entries phonebookEntries -} - -// MakeThreadsafePhonebook creates a ThreadsafePhonebook -func MakeThreadsafePhonebook() *ThreadsafePhonebook { - return &ThreadsafePhonebook{ - entries: make(phonebookEntries, 0), - } -} - // GetAddresses returns up to N shuffled address -func (p *ThreadsafePhonebook) GetAddresses(n int) []string { - p.lock.RLock() - defer p.lock.RUnlock() - return shuffleSelect(p.entries.filterRetryTime(time.Now()), n) -} - -// UpdateRetryAfter updates the retry-after field for the entries matching the given address -func (p *ThreadsafePhonebook) UpdateRetryAfter(addr string, retryAfter time.Time) { - p.lock.RLock() - defer p.lock.RUnlock() - p.entries.updateRetryAfter(addr, retryAfter) +func (e *phonebookImpl) GetAddresses(n int) []string { + e.lock.RLock() + defer e.lock.RUnlock() + return shuffleSelect(e.filterRetryTime(time.Now()), n) } // ExtendPeerList adds unique addresses to this set of addresses -func (p *ThreadsafePhonebook) ExtendPeerList(more []string) { - p.lock.Lock() - defer p.lock.Unlock() - // TODO: if this gets bad because p.addrs gets long, replace storage with a map[string]bool +func (e *phonebookImpl) ExtendPeerList(more []string, networkName string) { + e.lock.Lock() + defer e.lock.Unlock() for _, addr := range more { - if _, has := p.entries[addr]; has { + if pbEntry, has := e.data[addr]; has { + pbEntry.networkNames[networkName] = true continue } - p.entries[addr] = phonebookData{} + e.data[addr] = makePhonebookEntryData(networkName) } } // Length returns the number of addrs contained -func (p *ThreadsafePhonebook) Length() int { - p.lock.RLock() - defer p.lock.RUnlock() - return len(p.entries) -} - -// ReplacePeerList merges a set of addresses with that passed in. -// new entries in they are being added -// existing items that aren't included in they are being removed -// matching entries don't change -func (p *ThreadsafePhonebook) ReplacePeerList(they []string) { - p.lock.Lock() - defer p.lock.Unlock() - p.entries.ReplacePeerList(they) -} - -// MultiPhonebook contains a map of phonebooks -type MultiPhonebook struct { - phonebookMap map[string]Phonebook - lock deadlock.RWMutex -} - -// MakeMultiPhonebook constructs and returns a new Multi Phonebook -func MakeMultiPhonebook() *MultiPhonebook { - return &MultiPhonebook{phonebookMap: make(map[string]Phonebook)} -} - -// GetAddresses returns up to N address -func (mp *MultiPhonebook) GetAddresses(n int) []string { - mp.lock.RLock() - defer mp.lock.RUnlock() - - if len(mp.phonebookMap) == 1 { - for _, phonebook := range mp.phonebookMap { - return phonebook.GetAddresses(n) - } - } - uniqueEntries := make(map[string]bool, 0) - for _, p := range mp.phonebookMap { - for _, addr := range p.GetAddresses(getAllAddresses) { - uniqueEntries[addr] = true - } - } - out := make([]string, len(uniqueEntries)) - i := 0 - for k := range uniqueEntries { - out[i] = k - i++ - } - - rand.Shuffle(len(out), func(i, j int) { t := out[i]; out[i] = out[j]; out[j] = t }) - if n < len(out) { - return out[:n] - } - return out -} - -// GetPhonebook retrieves a phonebook by it's name -func (mp *MultiPhonebook) GetPhonebook(bootstrapNetworkName string) (p Phonebook) { - mp.lock.Lock() - defer mp.lock.Unlock() - return mp.phonebookMap[bootstrapNetworkName] -} - -// AddOrUpdatePhonebook adds or updates Phonebook in Phonebook map -func (mp *MultiPhonebook) AddOrUpdatePhonebook(bootstrapNetworkName string, p Phonebook) { - mp.lock.Lock() - defer mp.lock.Unlock() - mp.phonebookMap[bootstrapNetworkName] = p -} - -// UpdateRetryAfter updates the retry-after field for the entries matching the given address -func (mp *MultiPhonebook) UpdateRetryAfter(addr string, retryAfter time.Time) { - mp.lock.Lock() - defer mp.lock.Unlock() - for _, op := range mp.phonebookMap { - op.UpdateRetryAfter(addr, retryAfter) - } +func (e *phonebookImpl) Length() int { + e.lock.RLock() + defer e.lock.RUnlock() + return len(e.data) } diff --git a/network/phonebook_test.go b/network/phonebook_test.go index 196d41caca..6a8ac78c04 100644 --- a/network/phonebook_test.go +++ b/network/phonebook_test.go @@ -21,8 +21,10 @@ import ( "math/rand" "sync" "testing" + "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func testPhonebookAll(t *testing.T, set []string, ph Phonebook) { @@ -85,46 +87,62 @@ func testPhonebookUniform(t *testing.T, set []string, ph Phonebook, getsize int) func TestArrayPhonebookAll(t *testing.T) { set := []string{"a", "b", "c", "d", "e"} - ph := MakeArrayPhonebook() + ph := MakePhonebook(1, 1).(*phonebookImpl) for _, e := range set { - ph.Entries[e] = phonebookData{} + ph.data[e] = addressData{} } testPhonebookAll(t, set, ph) } func TestArrayPhonebookUniform1(t *testing.T) { set := []string{"a", "b", "c", "d", "e"} - ph := MakeArrayPhonebook() + ph := MakePhonebook(1, 1).(*phonebookImpl) for _, e := range set { - ph.Entries[e] = phonebookData{} + ph.data[e] = addressData{} } testPhonebookUniform(t, set, ph, 1) } func TestArrayPhonebookUniform3(t *testing.T) { set := []string{"a", "b", "c", "d", "e"} - ph := MakeArrayPhonebook() + ph := MakePhonebook(1, 1).(*phonebookImpl) for _, e := range set { - ph.Entries[e] = phonebookData{} + ph.data[e] = addressData{} } testPhonebookUniform(t, set, ph, 3) } -func extenderThread(th *ThreadsafePhonebook, more []string, wg *sync.WaitGroup, repetitions int) { +// TestPhonebookExtension tests for extending different phonebooks with +// addresses. +func TestPhonebookExtension(t *testing.T) { + setA := []string{"a"} + moreB := []string{"b"} + ph := MakePhonebook(1, 1).(*phonebookImpl) + ph.ReplacePeerList(setA, "default") + ph.ExtendPeerList(moreB, "default") + ph.ExtendPeerList(setA, "other") + assert.Equal(t, 2, ph.Length()) + assert.Equal(t, true, ph.data["a"].networkNames["default"]) + assert.Equal(t, true, ph.data["a"].networkNames["other"]) + assert.Equal(t, true, ph.data["b"].networkNames["default"]) + assert.Equal(t, false, ph.data["b"].networkNames["other"]) +} + +func extenderThread(th *phonebookImpl, more []string, wg *sync.WaitGroup, repetitions int) { defer wg.Done() for i := 0; i <= repetitions; i++ { start := rand.Intn(len(more)) end := rand.Intn(len(more)-start) + start - th.ExtendPeerList(more[start:end]) + th.ExtendPeerList(more[start:end], "default") } - th.ExtendPeerList(more) + th.ExtendPeerList(more, "default") } func TestThreadsafePhonebookExtension(t *testing.T) { set := []string{"a", "b", "c", "d", "e"} more := []string{"f", "g", "h", "i", "j"} - ph := MakeThreadsafePhonebook() - ph.ReplacePeerList(set) + ph := MakePhonebook(1, 1).(*phonebookImpl) + ph.ReplacePeerList(set, "default") wg := sync.WaitGroup{} wg.Add(5) for ti := 0; ti < 5; ti++ { @@ -135,7 +153,7 @@ func TestThreadsafePhonebookExtension(t *testing.T) { assert.Equal(t, 10, ph.Length()) } -func threadTestThreadsafePhonebookExtensionLong(wg *sync.WaitGroup, ph *ThreadsafePhonebook, setSize, repetitions int) { +func threadTestThreadsafePhonebookExtensionLong(wg *sync.WaitGroup, ph *phonebookImpl, setSize, repetitions int) { set := make([]string, setSize) for i := range set { set[i] = fmt.Sprintf("%06d", i) @@ -149,7 +167,7 @@ func TestThreadsafePhonebookExtensionLong(t *testing.T) { t.SkipNow() return } - ph := MakeThreadsafePhonebook() + ph := MakePhonebook(1, 1).(*phonebookImpl) wg := sync.WaitGroup{} const threads = 5 const setSize = 1000 @@ -166,17 +184,17 @@ func TestThreadsafePhonebookExtensionLong(t *testing.T) { func TestMultiPhonebook(t *testing.T) { set := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"} - pha := MakeArrayPhonebook() + pha := make([]string, 0) for _, e := range set[:5] { - pha.Entries[e] = phonebookData{} + pha = append(pha, e) } - phb := MakeArrayPhonebook() + phb := make([]string, 0) for _, e := range set[5:] { - phb.Entries[e] = phonebookData{} + phb = append(phb, e) } - mp := MakeMultiPhonebook() - mp.AddOrUpdatePhonebook("pha", pha) - mp.AddOrUpdatePhonebook("phb", phb) + mp := MakePhonebook(1, 1*time.Millisecond) + mp.ReplacePeerList(pha, "pha") + mp.ReplacePeerList(phb, "phb") testPhonebookAll(t, set, mp) testPhonebookUniform(t, set, mp, 1) @@ -185,25 +203,154 @@ func TestMultiPhonebook(t *testing.T) { func TestMultiPhonebookDuplicateFiltering(t *testing.T) { set := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"} - pha := MakeArrayPhonebook() + pha := make([]string, 0) for _, e := range set[:7] { - pha.Entries[e] = phonebookData{} + pha = append(pha, e) } - phb := MakeArrayPhonebook() + phb := make([]string, 0) for _, e := range set[3:] { - phb.Entries[e] = phonebookData{} + phb = append(phb, e) } - mp := MakeMultiPhonebook() - mp.AddOrUpdatePhonebook("pha", pha) - mp.AddOrUpdatePhonebook("phb", phb) + mp := MakePhonebook(1, 1*time.Millisecond) + mp.ReplacePeerList(pha, "pha") + mp.ReplacePeerList(phb, "phb") testPhonebookAll(t, set, mp) testPhonebookUniform(t, set, mp, 1) testPhonebookUniform(t, set, mp, 3) } +func TestWaitAndAddConnectionTimeLongtWindow(t *testing.T) { + entries := MakePhonebook(3, 200*time.Millisecond).(*phonebookImpl) + addr1 := "addrABC" + addr2 := "addrXYZ" + + // Address not in. Should return false + addrInPhonebook, _, provisionalTime := entries.GetConnectionWaitTime(addr1) + require.Equal(t, false, addrInPhonebook) + require.Equal(t, false, entries.UpdateConnectionTime(addr1, provisionalTime)) + + // Test the addresses are populated in the phonebook and a + // time can be added to one of them + entries.ReplacePeerList([]string{addr1, addr2}, "default") + addrInPhonebook, waitTime, provisionalTime := entries.GetConnectionWaitTime(addr1) + require.Equal(t, true, addrInPhonebook) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr1, provisionalTime)) + phBookData := entries.data[addr1].recentConnectionTimes + require.Equal(t, 1, len(phBookData)) + + // introduce a gap between the two requests + time.Sleep(100 * time.Millisecond) + + // add another value to addr + addrInPhonebook, waitTime, provisionalTime = entries.GetConnectionWaitTime(addr1) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr1, provisionalTime)) + phBookData = entries.data[addr1].recentConnectionTimes + require.Equal(t, 2, len(phBookData)) + + // wait for the time the first element should be removed + time.Sleep(100 * time.Millisecond) + + // the first time should be removed and a new one added + // there should not be any wait + addrInPhonebook, waitTime, provisionalTime = entries.GetConnectionWaitTime(addr1) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr1, provisionalTime)) + phBookData2 := entries.data[addr1].recentConnectionTimes + require.Equal(t, 2, len(phBookData2)) + + // make sure the right time was removed + require.Equal(t, phBookData[1], phBookData2[0]) + require.Equal(t, true, phBookData2[0].Before(phBookData2[1])) + + // try requesting from another address, make sure + // a separate array is used for these new requests + + // add 3 values to another address. should not wait + // value 1 + _, waitTime, provisionalTime = entries.GetConnectionWaitTime(addr2) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr2, provisionalTime)) + + // introduce a gap between the two requests so that only the first will be removed later when waited + time.Sleep(100 * time.Millisecond) + + // value 2 + addrInPhonebook, waitTime, provisionalTime = entries.GetConnectionWaitTime(addr2) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr2, provisionalTime)) + // value 3 + _, waitTime, provisionalTime = entries.GetConnectionWaitTime(addr2) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr2, provisionalTime)) + + phBookData = entries.data[addr2].recentConnectionTimes + // all three times should be queued + require.Equal(t, 3, len(phBookData)) + + // add another element to trigger wait + _, waitTime, provisionalTime = entries.GetConnectionWaitTime(addr2) + require.Greater(t, int64(waitTime), int64(0)) + // no element should be removed + phBookData2 = entries.data[addr2].recentConnectionTimes + require.Equal(t, phBookData[0], phBookData2[0]) + require.Equal(t, phBookData[1], phBookData2[1]) + require.Equal(t, phBookData[2], phBookData2[2]) + + time.Sleep(waitTime) + + // The wait should be sufficient + _, waitTime, provisionalTime = entries.GetConnectionWaitTime(addr2) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr2, provisionalTime)) + // only one element should be removed, and one added + phBookData2 = entries.data[addr2].recentConnectionTimes + require.Equal(t, 3, len(phBookData)) + + // make sure the right time was removed + require.Equal(t, phBookData[1], phBookData2[0]) + require.Equal(t, phBookData[2], phBookData2[1]) +} + +func TestWaitAndAddConnectionTimeShortWindow(t *testing.T) { + entries := MakePhonebook(3, 2*time.Millisecond).(*phonebookImpl) + addr1 := "addrABC" + + // Init the data structures + entries.ReplacePeerList([]string{addr1}, "default") + + // add 3 values. should not wait + // value 1 + addrInPhonebook, waitTime, provisionalTime := entries.GetConnectionWaitTime(addr1) + require.Equal(t, true, addrInPhonebook) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr1, provisionalTime)) + // value 2 + _, waitTime, provisionalTime = entries.GetConnectionWaitTime(addr1) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr1, provisionalTime)) + // value 3 + _, waitTime, provisionalTime = entries.GetConnectionWaitTime(addr1) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr1, provisionalTime)) + + // give enough time to expire all the elements + time.Sleep(10 * time.Millisecond) + + // there should not be any wait + _, waitTime, provisionalTime = entries.GetConnectionWaitTime(addr1) + require.Equal(t, time.Duration(0), waitTime) + require.Equal(t, true, entries.UpdateConnectionTime(addr1, provisionalTime)) + + // only one time should be left (the newly added) + phBookData := entries.data[addr1].recentConnectionTimes + require.Equal(t, 1, len(phBookData)) +} + func BenchmarkThreadsafePhonebook(b *testing.B) { - ph := MakeThreadsafePhonebook() + ph := MakePhonebook(1, 1).(*phonebookImpl) threads := 5 if b.N < threads { threads = b.N diff --git a/network/ping_test.go b/network/ping_test.go index 870c056c5b..f719798dfe 100644 --- a/network/ping_test.go +++ b/network/ping_test.go @@ -27,15 +27,17 @@ import ( func TestPing(t *testing.T) { netA := makeTestWebsocketNode(t) netA.config.GossipFanout = 1 + netA.config.PeerPingPeriodSeconds = 5 netA.Start() defer func() { t.Log("stopping A"); netA.Stop(); t.Log("A done") }() netB := makeTestWebsocketNode(t) netB.config.GossipFanout = 1 + netB.config.PeerPingPeriodSeconds = 5 addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - netB.phonebook = MakeMultiPhonebook() - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook = MakePhonebook(1, 1*time.Millisecond) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() diff --git a/network/rateLimitingTransport.go b/network/rateLimitingTransport.go new file mode 100644 index 0000000000..f7c167e785 --- /dev/null +++ b/network/rateLimitingTransport.go @@ -0,0 +1,74 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package network + +import ( + "errors" + "net/http" + "time" +) + +// rateLimitingTransport is the transport for execute a single HTTP transaction, obtaining the Response for a given Request. +type rateLimitingTransport struct { + phonebook Phonebook + innerTransport *http.Transport + queueingTimeout time.Duration +} + +// ErrConnectionQueueingTimeout indicates that we've exceeded the time allocated for +// queueing the current request before the request attempt could be made. +var ErrConnectionQueueingTimeout = errors.New("rateLimitingTransport: queueing timeout") + +// makeRateLimitingTransport creates a rate limiting http transport that would limit the requests rate +// according to the entries in the phonebook. +func makeRateLimitingTransport(phonebook Phonebook, queueingTimeout time.Duration, dialer *Dialer) rateLimitingTransport { + defaultTransport := http.DefaultTransport.(*http.Transport) + return rateLimitingTransport{ + phonebook: phonebook, + innerTransport: &http.Transport{ + Proxy: defaultTransport.Proxy, + DialContext: dialer.innerDialContext, + MaxIdleConns: defaultTransport.MaxIdleConns, + IdleConnTimeout: defaultTransport.IdleConnTimeout, + TLSHandshakeTimeout: defaultTransport.TLSHandshakeTimeout, + ExpectContinueTimeout: defaultTransport.ExpectContinueTimeout, + }, + queueingTimeout: queueingTimeout, + } +} + +// RoundTrip connects to the address on the named network using the provided context. +// It waits if needed not to exceed connectionsRateLimitingCount. +func (r *rateLimitingTransport) RoundTrip(req *http.Request) (res *http.Response, err error) { + var waitTime time.Duration + var provisionalTime time.Time + queueingTimedOut := time.After(r.queueingTimeout) + for { + _, waitTime, provisionalTime = r.phonebook.GetConnectionWaitTime(req.Host) + if waitTime == 0 { + break // break out of the loop and proceed to the connection + } + select { + case <-time.After(waitTime): + case <-queueingTimedOut: + return nil, ErrConnectionQueueingTimeout + } + } + res, err = r.innerTransport.RoundTrip(req) + r.phonebook.UpdateConnectionTime(req.Host, provisionalTime) + return +} diff --git a/network/requestLogger_test.go b/network/requestLogger_test.go index 0e0b19088c..5bceb3b087 100644 --- a/network/requestLogger_test.go +++ b/network/requestLogger_test.go @@ -46,7 +46,7 @@ func TestRequestLogger(t *testing.T) { netA := &WebsocketNetwork{ log: dl, config: defaultConfig, - phonebook: MakeMultiPhonebook(), + phonebook: MakePhonebook(1, 1*time.Millisecond), GenesisID: "go-test-network-genesis", NetworkID: config.Devtestnet, } @@ -62,8 +62,8 @@ func TestRequestLogger(t *testing.T) { addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - netB.phonebook = MakeMultiPhonebook() - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook = MakePhonebook(1, 1*time.Millisecond) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() diff --git a/network/requestTracker_test.go b/network/requestTracker_test.go index e1f9d51489..2f8f1957a6 100644 --- a/network/requestTracker_test.go +++ b/network/requestTracker_test.go @@ -78,7 +78,7 @@ func TestRateLimiting(t *testing.T) { wn := &WebsocketNetwork{ log: log, config: defaultConfig, - phonebook: MakeMultiPhonebook(), + phonebook: MakePhonebook(1,1), GenesisID: "go-test-network-genesis", NetworkID: config.Devtestnet, } @@ -95,8 +95,6 @@ func TestRateLimiting(t *testing.T) { defer func() { t.Log("stopping A"); netA.Stop(); t.Log("A done") }() - counter := newMessageCounter(t, 5) - netA.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: counter}}) netA.Start() addrA, postListen := netA.Address() require.Truef(t, postListen, "Listening network failed to start") @@ -107,14 +105,15 @@ func TestRateLimiting(t *testing.T) { clientsCount := int(defaultConfig.ConnectionsRateLimitingCount + 5) networks := make([]*WebsocketNetwork, clientsCount) - phonebooks := make([]*ThreadsafePhonebook, clientsCount) + phonebooks := make([]Phonebook, clientsCount) for i := 0; i < clientsCount; i++ { networks[i] = makeTestWebsocketNodeWithConfig(t, noAddressConfig) networks[i].config.GossipFanout = 1 - phonebooks[i] = MakeThreadsafePhonebook() - phonebooks[i].ReplacePeerList([]string{addrA}) - networks[i].phonebook = MakeMultiPhonebook() - networks[i].phonebook.AddOrUpdatePhonebook("default", phonebooks[i]) + phonebooks[i] = MakePhonebook(networks[i].config.ConnectionsRateLimitingCount, + time.Duration(networks[i].config.ConnectionsRateLimitingWindowSeconds)*time.Second) + phonebooks[i].ReplacePeerList([]string{addrA}, "default") + networks[i].phonebook = MakePhonebook(1, 1*time.Millisecond) + networks[i].phonebook.ReplacePeerList([]string{addrA}, "default") defer func(net *WebsocketNetwork, i int) { t.Logf("stopping network %d", i) net.Stop() diff --git a/network/topics.go b/network/topics.go new file mode 100644 index 0000000000..5aaeaaa9cf --- /dev/null +++ b/network/topics.go @@ -0,0 +1,143 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package network + +import ( + "encoding/binary" + "fmt" + + "github.com/algorand/go-algorand/crypto" +) + +// Constant strings used as keys for topics +const ( + requestHashKey = "RequestHash" + ErrorKey = "Error" // used for passing an error message +) + +// Topic is a key-value pair +type Topic struct { + key string + data []byte +} + +// MakeTopic Creates a Topic +func MakeTopic(key string, data []byte) Topic { + return Topic{key: key, data: data} +} + +// Topics is an array of type Topic +// The maximum number of topics allowed is 32 +// Each topic key can be 64 characters long and cannot be size 0 +type Topics []Topic + +// MarshallTopics serializes the topics into a byte array +func (ts Topics) MarshallTopics() (b []byte) { + + // Calculate the total buffer size required to store the topics + bufferSize := binary.MaxVarintLen32 // store topic array size + + for _, val := range ts { + bufferSize += 2 * binary.MaxVarintLen32 // store key size and the data size + bufferSize += len(val.key) + bufferSize += len(val.data) + } + + buffer := make([]byte, bufferSize) + bidx := binary.PutUvarint(buffer, uint64(len(ts))) + for _, val := range ts { + // write the key size + n := binary.PutUvarint(buffer[bidx:], uint64(len(val.key))) + bidx += n + // write the key + n = copy(buffer[bidx:], []byte(val.key)) + bidx += n + + // write the data size + n = binary.PutUvarint(buffer[bidx:], uint64(len(val.data))) + bidx += n + // write the data + n = copy(buffer[bidx:], val.data) + bidx += n + } + return buffer[:bidx] +} + +// UnmarshallTopics unmarshalls the topics from the byte array +func UnmarshallTopics(buffer []byte) (ts Topics, err error) { + // Get the number of topics + var idx int + numTopics, nr := binary.Uvarint(buffer[idx:]) + if nr <= 0 { + return nil, fmt.Errorf("UnmarshallTopics: could not read the number of topics") + } + if numTopics > 32 { // numTopics is uint64 + return nil, fmt.Errorf("UnmarshallTopics: number of topics %d is greater than 32", numTopics) + } + idx += nr + topics := make([]Topic, numTopics) + + for x := 0; x < int(numTopics); x++ { + // read the key length + strlen, nr := binary.Uvarint(buffer[idx:]) + if nr <= 0 { + return nil, fmt.Errorf("UnmarshallTopics: could not read the key length") + } + idx += nr + + // read the key + if len(buffer) < idx+int(strlen) || strlen > 64 || strlen == 0 { + return nil, fmt.Errorf("UnmarshallTopics: could not read the key") + } + topics[x].key = string(buffer[idx : idx+int(strlen)]) + idx += int(strlen) + + // read the data length + dataLen, nr := binary.Uvarint(buffer[idx:]) + if nr <= 0 { + return nil, fmt.Errorf("UnmarshallTopics: could not read the data length") + } + idx += nr + + // read the data + if len(buffer) < idx+int(dataLen) { + return nil, fmt.Errorf("UnmarshallTopics: data larger than buffer size") + } + topics[x].data = make([]byte, dataLen) + copy(topics[x].data, buffer[idx:idx+int(dataLen)]) + idx += int(dataLen) + } + return topics, nil +} + +// hashTopics returns the hash of serialized topics. +// Expects the nonce to be already added as a topic +func hashTopics(topics []byte) (partialHash uint64) { + digest := crypto.Hash(topics) + partialHash = digest.TrimUint64() + return partialHash +} + +// GetValue returns the value of the key if the key is found in the topics +func (ts *Topics) GetValue(key string) (val []byte, found bool) { + for _, t := range *ts { + if t.key == key { + return t.data, true + } + } + return +} diff --git a/network/topics_test.go b/network/topics_test.go new file mode 100644 index 0000000000..83ab1f6b01 --- /dev/null +++ b/network/topics_test.go @@ -0,0 +1,123 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package network + +import ( + "encoding/binary" + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +// Test the marshall/unmarshall of Topics +func TestTopics(t *testing.T) { + + topics := Topics{ + Topic{ + key: "key1", + data: []byte("value 1"), + }, + Topic{ + key: "Key2", + data: []byte("value of key2"), + }, + } + + // Check if the topics were initialized correctly + require.Equal(t, 2, len(topics)) + + require.Equal(t, "key1", topics[0].key) + require.Equal(t, "value 1", string(topics[0].data)) + + require.Equal(t, "Key2", topics[1].key) + val, found := topics.GetValue("Key2") + require.Equal(t, true, found) + require.Equal(t, "value of key2", string(val)) + + // Check if can be marshalled without errors + buffer := topics.MarshallTopics() + + // Check if can be unmarshalled without errors + unMarshalled, e := UnmarshallTopics(buffer) + require.Empty(t, e) + + // Check if the unmarshalled is equal to the original + require.Equal(t, len(topics), len(unMarshalled)) + + require.Equal(t, topics[0].key, unMarshalled[0].key) + require.Equal(t, topics[0].data, unMarshalled[0].data) + + require.Equal(t, topics[1].key, unMarshalled[1].key) + require.Equal(t, topics[1].data, unMarshalled[1].data) +} + +// TestCurruptedTopics checks the errors +// Makes sure UnmarshallTopics will not attempt to read beyond the buffer limits +func TestCurruptedTopics(t *testing.T) { + + var buffer []byte + + // empty buffer + buffer = make([]byte, 0) + _, err := UnmarshallTopics(buffer) + require.Equal(t, err, fmt.Errorf("UnmarshallTopics: could not read the number of topics")) + + // more than 32 topics + buffer = make([]byte, binary.MaxVarintLen32) + binary.PutUvarint(buffer, 33) + _, err = UnmarshallTopics(buffer) + require.Equal(t, err, fmt.Errorf("UnmarshallTopics: number of topics %d is greater than 32", 33)) + + // no room for the key length + buffer = make([]byte, 1) + binary.PutUvarint(buffer, 1) + _, err = UnmarshallTopics(buffer) + require.Equal(t, err, fmt.Errorf("UnmarshallTopics: could not read the key length")) + + // key length > buffer size + buffer = make([]byte, 2) + binary.PutUvarint(buffer, 1) + binary.PutUvarint(buffer[1:], 5) + _, err = UnmarshallTopics(buffer) + require.Equal(t, err, fmt.Errorf("UnmarshallTopics: could not read the key")) + + // key length > buffer size 64 + buffer = make([]byte, 100) + binary.PutUvarint(buffer, 1) + binary.PutUvarint(buffer[1:], 65) + _, err = UnmarshallTopics(buffer) + require.Equal(t, err, fmt.Errorf("UnmarshallTopics: could not read the key")) + + // no room for the data length + buffer = make([]byte, 3) + binary.PutUvarint(buffer, 1) // 1 topic + binary.PutUvarint(buffer[1:], 1) // 1 char key + _, err = UnmarshallTopics(buffer) + require.Equal(t, err, fmt.Errorf("UnmarshallTopics: could not read the data length")) + + // datalen > buffer size + buffer = make([]byte, 5) + binary.PutUvarint(buffer, 1) // 1 topic + binary.PutUvarint(buffer[1:], 1) // 1 char key + // buffer size is 5. Room for 1 byte data. + // [/*topics:*/1, /*key len:*/ 1, /*key:*/ 0, /*data len:*/ 2, /*1 byte space for data*/ 0] + // 2 byte data size should error + binary.PutUvarint(buffer[3:], 2) + _, err = UnmarshallTopics(buffer) + require.Equal(t, err, fmt.Errorf("UnmarshallTopics: data larger than buffer size")) +} diff --git a/network/wsNetwork.go b/network/wsNetwork.go index a369b9332f..4675fdf098 100644 --- a/network/wsNetwork.go +++ b/network/wsNetwork.go @@ -27,6 +27,7 @@ import ( "math/rand" "net" "net/http" + "net/textproto" "net/url" "path" "regexp" @@ -37,6 +38,7 @@ import ( "sync" "sync/atomic" "time" + //"os" "github.com/algorand/go-deadlock" "github.com/algorand/websocket" @@ -50,6 +52,7 @@ import ( "github.com/algorand/go-algorand/logging/telemetryspec" "github.com/algorand/go-algorand/protocol" tools_network "github.com/algorand/go-algorand/tools/network" + "github.com/algorand/go-algorand/tools/network/dnssec" "github.com/algorand/go-algorand/util/metrics" ) @@ -173,6 +176,15 @@ type GossipNode interface { // ClearHandlers deregisters all the existing message handlers. ClearHandlers() + + // GetRoundTripper returns a Transport that would limit the number of outgoing connections. + GetRoundTripper() http.RoundTripper + + // OnNetworkAdvance notifies the network library that the agreement protocol was able to make a notable progress. + // this is the only indication that we have that we haven't formed a clique, where all incoming messages + // arrive very quickly, but might be missing some votes. The usage of this call is expected to have similar + // characteristics as with a watchdog timer. + OnNetworkAdvance() } // IncomingMessage represents a message arriving from some peer in our p2p network @@ -205,6 +217,7 @@ type OutgoingMessage struct { Action ForwardingPolicy Tag Tag Payload []byte + Topics Topics } // ForwardingPolicy is an enum indicating to whom we should send a message @@ -219,6 +232,9 @@ const ( // Broadcast - forward to everyone (except the sender) Broadcast + + // Respond - reply to the sender + Respond ) // MessageHandler takes a IncomingMessage (e.g., vote, transaction), processes it, and returns what (if anything) @@ -246,7 +262,7 @@ type TaggedMessageHandler struct { // Propagate is a convenience function to save typing in the common case of a message handler telling us to propagate an incoming message // "return network.Propagate(msg)" instead of "return network.OutgoingMsg{network.Broadcast, msg.Tag, msg.Data}" func Propagate(msg IncomingMessage) OutgoingMessage { - return OutgoingMessage{Broadcast, msg.Tag, msg.Data} + return OutgoingMessage{Broadcast, msg.Tag, msg.Data, nil} } // GossipNetworkPath is the URL path to connect to the websocket gossip node at. @@ -281,7 +297,7 @@ type WebsocketNetwork struct { broadcastQueueHighPrio chan broadcastRequest broadcastQueueBulk chan broadcastRequest - phonebook *MultiPhonebook + phonebook Phonebook GenesisID string NetworkID protocol.NetworkID @@ -320,6 +336,24 @@ type WebsocketNetwork struct { // lastPeerConnectionsSent is the last time the peer connections were sent ( or attempted to be sent ) to the telemetry server. lastPeerConnectionsSent time.Time + + // connPerfMonitor is used on outgoing connections to measure their relative message timing + connPerfMonitor *connectionPerformanceMonitor + + // lastNetworkAdvanceMu syncronized teh access to lastNetworkAdvance + lastNetworkAdvanceMu deadlock.Mutex + + // lastNetworkAdvance contains the last timestamp where the agreement protocol was able to make a notable progress. + // it used as a watchdog to help us detect connectivity issues ( such as cliques ) + lastNetworkAdvance time.Time + + // number of throttled outgoing connections "slots" needed to be populated. + throttledOutgoingConnections int32 + + // transport and dialer are customized to limit the number of + // connection in compliance with connectionsRateLimitingCount. + transport rateLimitingTransport + dialer Dialer } type broadcastRequest struct { @@ -499,7 +533,8 @@ func (wn *WebsocketNetwork) GetPeers(options ...PeerOption) []Peer { var addrs []string addrs = wn.phonebook.GetAddresses(1000) for _, addr := range addrs { - outPeers = append(outPeers, &wsPeerCore{net: wn, rootURL: addr}) + peerCore := makePeerCore(wn, addr, wn.GetRoundTripper(), "" /*origin address*/) + outPeers = append(outPeers, &peerCore) } case PeersConnectedIn: wn.peersLock.RLock() @@ -515,6 +550,12 @@ func (wn *WebsocketNetwork) GetPeers(options ...PeerOption) []Peer { } func (wn *WebsocketNetwork) setup() { + var preferredResolver *dnssec.Resolver + if wn.config.DNSSecurityRelayAddrEnforced() { + preferredResolver = &dnssec.DefaultResolver + } + wn.dialer = makeRateLimitingDialer(wn.phonebook, preferredResolver) + wn.transport = makeRateLimitingTransport(wn.phonebook, 10*time.Second, &wn.dialer) wn.upgrader.ReadBufferSize = 4096 wn.upgrader.WriteBufferSize = 4096 @@ -571,6 +612,13 @@ func (wn *WebsocketNetwork) setup() { if wn.config.EnableIncomingMessageFilter { wn.incomingMsgFilter = makeMessageFilter(wn.config.IncomingMessageFilterBucketCount, wn.config.IncomingMessageFilterBucketSize) } + wn.connPerfMonitor = makeConnectionPerformanceMonitor([]Tag{protocol.AgreementVoteTag, protocol.TxnTag}) + wn.lastNetworkAdvance = time.Now().UTC() + wn.handlers.log = wn.log + + if wn.config.NetworkProtocolVersion != "" { + SupportedProtocolVersions = []string{wn.config.NetworkProtocolVersion} + } } func (wn *WebsocketNetwork) rlimitIncomingConnections() error { @@ -643,6 +691,13 @@ func (wn *WebsocketNetwork) Start() { // wrap the limited connection listener with a requests tracker listener wn.listener = wn.requestsTracker.Listener(listener) wn.log.Debugf("listening on %s", wn.listener.Addr().String()) + wn.throttledOutgoingConnections = int32(wn.config.GossipFanout / 2) + } else { + // on non-relay, all the outgoing connections are throttled. + wn.throttledOutgoingConnections = int32(wn.config.GossipFanout) + } + if wn.config.DisableOutgoingConnectionThrottling { + wn.throttledOutgoingConnections = 0 } if wn.config.TLSCertFile != "" && wn.config.TLSKeyFile != "" { wn.scheme = "https" @@ -650,8 +705,12 @@ func (wn *WebsocketNetwork) Start() { wn.scheme = "http" } wn.meshUpdateRequests <- meshRequest{false, nil} - wn.RegisterHandlers(pingHandlers) - wn.RegisterHandlers(prioHandlers) + if wn.config.EnablePingHandler { + wn.RegisterHandlers(pingHandlers) + } + if wn.prioScheme != nil { + wn.RegisterHandlers(prioHandlers) + } if wn.listener != nil { wn.wg.Add(1) go wn.httpdThread() @@ -736,40 +795,39 @@ func (wn *WebsocketNetwork) setHeaders(header http.Header) { localInstanceName := wn.log.GetInstanceName() header.Set(TelemetryIDHeader, localTelemetryGUID) header.Set(InstanceNameHeader, localInstanceName) - header.Set(ProtocolVersionHeader, ProtocolVersion) header.Set(AddressHeader, wn.PublicAddress()) header.Set(NodeRandomHeader, wn.RandomID) } // checkServerResponseVariables check that the version and random-id in the request headers matches the server ones. // it returns true if it's a match, and false otherwise. -func (wn *WebsocketNetwork) checkServerResponseVariables(header http.Header, addr string) bool { - otherVersion := header.Get(ProtocolVersionHeader) - if otherVersion != ProtocolVersion { - wn.log.Infof("new peer %s version mismatch, mine=%s theirs=%s, headers %#v", addr, ProtocolVersion, otherVersion, header) - return false +func (wn *WebsocketNetwork) checkServerResponseVariables(otherHeader http.Header, addr string) (bool, string) { + matchingVersion, otherVersion := wn.checkProtocolVersionMatch(otherHeader) + if matchingVersion == "" { + wn.log.Infof("new peer %s version mismatch, mine=%v theirs=%s, headers %#v", addr, SupportedProtocolVersions, otherVersion, otherHeader) + return false, "" } - otherRandom := header.Get(NodeRandomHeader) + otherRandom := otherHeader.Get(NodeRandomHeader) if otherRandom == wn.RandomID || otherRandom == "" { // This is pretty harmless and some configurations of phonebooks or DNS records make this likely. Quietly filter it out. if otherRandom == "" { // missing header. - wn.log.Warnf("new peer %s did not include random ID header in request. mine=%s headers %#v", addr, wn.RandomID, header) + wn.log.Warnf("new peer %s did not include random ID header in request. mine=%s headers %#v", addr, wn.RandomID, otherHeader) } else { wn.log.Debugf("new peer %s has same node random id, am I talking to myself? %s", addr, wn.RandomID) } - return false + return false, "" } - otherGenesisID := header.Get(GenesisHeader) + otherGenesisID := otherHeader.Get(GenesisHeader) if wn.GenesisID != otherGenesisID { if otherGenesisID != "" { - wn.log.Warnf("new peer %#v genesis mismatch, mine=%#v theirs=%#v, headers %#v", addr, wn.GenesisID, otherGenesisID, header) + wn.log.Warnf("new peer %#v genesis mismatch, mine=%#v theirs=%#v, headers %#v", addr, wn.GenesisID, otherGenesisID, otherHeader) } else { - wn.log.Warnf("new peer %#v did not include genesis header in response. mine=%#v headers %#v", addr, wn.GenesisID, header) + wn.log.Warnf("new peer %#v did not include genesis header in response. mine=%#v headers %#v", addr, wn.GenesisID, otherHeader) } - return false + return false, "" } - return true + return true, matchingVersion } // getCommonHeaders retreives the common headers for both incoming and outgoing connections from the provided headers. @@ -814,6 +872,28 @@ func (wn *WebsocketNetwork) checkIncomingConnectionLimits(response http.Response return http.StatusOK } +// checkProtocolVersionMatch test ProtocolAcceptVersionHeader and ProtocolVersionHeader headers from the request/response and see if it can find a match. +func (wn *WebsocketNetwork) checkProtocolVersionMatch(otherHeaders http.Header) (matchingVersion string, otherVersion string) { + otherAcceptedVersions := otherHeaders[textproto.CanonicalMIMEHeaderKey(ProtocolAcceptVersionHeader)] + for _, otherAcceptedVersion := range otherAcceptedVersions { + // do we have a matching version ? + for _, supportedProtocolVersion := range SupportedProtocolVersions { + if supportedProtocolVersion == otherAcceptedVersion { + matchingVersion = supportedProtocolVersion + return matchingVersion, "" + } + } + } + + otherVersion = otherHeaders.Get(ProtocolVersionHeader) + for _, supportedProtocolVersion := range SupportedProtocolVersions { + if supportedProtocolVersion == otherVersion { + return supportedProtocolVersion, otherVersion + } + } + return "", otherVersion +} + // checkIncomingConnectionVariables checks the variables that were provided on the request, and compares them to the // local server supported parameters. If all good, it returns http.StatusOK; otherwise, it write the error to the ResponseWriter // and returns the http status. @@ -835,19 +915,6 @@ func (wn *WebsocketNetwork) checkIncomingConnectionVariables(response http.Respo return http.StatusPreconditionFailed } - otherVersion := request.Header.Get(ProtocolVersionHeader) - if otherVersion != ProtocolVersion { - wn.log.Infof("new peer %s version mismatch, mine=%s theirs=%s, headers %#v", request.RemoteAddr, ProtocolVersion, otherVersion, request.Header) - networkConnectionsDroppedTotal.Inc(map[string]string{"reason": "mismatching protocol version"}) - response.WriteHeader(http.StatusPreconditionFailed) - message := fmt.Sprintf("Requested version %s = %s mismatches server version", ProtocolVersionHeader, otherVersion) - n, err := response.Write([]byte(message)) - if err != nil { - wn.log.Warnf("ws failed to write response '%s' : n = %d err = %v", message, n, err) - } - return http.StatusPreconditionFailed - } - otherRandom := request.Header.Get(NodeRandomHeader) if otherRandom == "" { // This is pretty harmless and some configurations of phonebooks or DNS records make this likely. Quietly filter it out. @@ -887,6 +954,19 @@ func (wn *WebsocketNetwork) ServeHTTP(response http.ResponseWriter, request *htt return } + matchingVersion, otherVersion := wn.checkProtocolVersionMatch(request.Header) + if matchingVersion == "" { + wn.log.Infof("new peer %s version mismatch, mine=%v theirs=%s, headers %#v", request.RemoteAddr, SupportedProtocolVersions, otherVersion, request.Header) + networkConnectionsDroppedTotal.Inc(map[string]string{"reason": "mismatching protocol version"}) + response.WriteHeader(http.StatusPreconditionFailed) + message := fmt.Sprintf("Requested version %s not in %v mismatches server version", otherVersion, SupportedProtocolVersions) + n, err := response.Write([]byte(message)) + if err != nil { + wn.log.Warnf("ws failed to write response '%s' : n = %d err = %v", message, n, err) + } + return + } + if wn.checkIncomingConnectionVariables(response, request) != http.StatusOK { // we've already logged and written all response(s). return @@ -895,15 +975,16 @@ func (wn *WebsocketNetwork) ServeHTTP(response http.ResponseWriter, request *htt // if UseXForwardedForAddressField is not empty, attempt to override the otherPublicAddr with the X Forwarded For origin trackedRequest.otherPublicAddr = trackedRequest.remoteAddr - requestHeader := make(http.Header) - wn.setHeaders(requestHeader) - requestHeader.Set(GenesisHeader, wn.GenesisID) + responseHeader := make(http.Header) + wn.setHeaders(responseHeader) + responseHeader.Set(ProtocolVersionHeader, matchingVersion) + responseHeader.Set(GenesisHeader, wn.GenesisID) var challenge string if wn.prioScheme != nil { challenge = wn.prioScheme.NewPrioChallenge() - requestHeader.Set(PriorityChallengeHeader, challenge) + responseHeader.Set(PriorityChallengeHeader, challenge) } - conn, err := wn.upgrader.Upgrade(response, request, requestHeader) + conn, err := wn.upgrader.Upgrade(response, request, responseHeader) if err != nil { wn.log.Info("ws upgrade fail ", err) networkConnectionsDroppedTotal.Inc(map[string]string{"reason": "ws upgrade fail"}) @@ -916,17 +997,14 @@ func (wn *WebsocketNetwork) ServeHTTP(response http.ResponseWriter, request *htt } peer := &wsPeer{ - wsPeerCore: wsPeerCore{ - net: wn, - rootURL: trackedRequest.otherPublicAddr, - originAddress: trackedRequest.remoteHost, - }, + wsPeerCore: makePeerCore(wn, trackedRequest.otherPublicAddr, wn.GetRoundTripper(), trackedRequest.remoteHost), conn: conn, outgoing: false, InstanceName: trackedRequest.otherInstanceName, incomingMsgFilter: wn.incomingMsgFilter, prioChallenge: challenge, createTime: trackedRequest.created, + version: matchingVersion, } peer.TelemetryGUID = trackedRequest.otherTelemetryGUID peer.init(wn.config, wn.outgoingMessagesBufferSize) @@ -967,6 +1045,7 @@ func (wn *WebsocketNetwork) messageHandlerThread() { } //wn.log.Debugf("msg handling %#v [%d]byte", msg.Tag, len(msg.Data)) start := time.Now() + // now, send to global handlers outmsg := wn.handlers.Handle(msg) handled := time.Now() @@ -980,6 +1059,8 @@ func (wn *WebsocketNetwork) messageHandlerThread() { go wn.disconnectThread(msg.Sender, disconnectBadData) case Broadcast: wn.Broadcast(wn.ctx, msg.Tag, msg.Data, false, msg.Sender) + case Respond: + msg.Sender.(*wsPeer).Respond(wn.ctx, msg, outmsg.Topics) default: } case <-inactivityCheckTicker.C: @@ -1027,7 +1108,7 @@ func (wn *WebsocketNetwork) checkSlowWritingPeers() { func (wn *WebsocketNetwork) sendFilterMessage(msg IncomingMessage) { digest := generateMessageDigest(msg.Tag, msg.Data) //wn.log.Debugf("send filter %s(%d) %v", msg.Tag, len(msg.Data), digest) - wn.Broadcast(context.Background(), protocol.MsgSkipTag, digest[:], false, msg.Sender) + wn.Broadcast(context.Background(), protocol.MsgDigestSkipTag, digest[:], false, msg.Sender) } func (wn *WebsocketNetwork) broadcastThread() { @@ -1093,7 +1174,7 @@ func (wn *WebsocketNetwork) innerBroadcast(request broadcastRequest, prio bool, copy(mbytes[len(tbytes):], request.data) var digest crypto.Digest - if request.tag != protocol.MsgSkipTag && len(request.data) >= messageFilterSize { + if request.tag != protocol.MsgDigestSkipTag && len(request.data) >= messageFilterSize { digest = crypto.Hash(mbytes) } @@ -1131,6 +1212,19 @@ func (wn *WebsocketNetwork) NumPeers() int { return len(wn.peers) } +// outgoingPeers returns an array of the outgoing peers. +func (wn *WebsocketNetwork) outgoingPeers() (peers []Peer) { + wn.peersLock.RLock() + defer wn.peersLock.RUnlock() + peers = make([]Peer, 0, len(wn.peers)) + for _, peer := range wn.peers { + if peer.outgoing { + peers = append(peers, peer) + } + } + return +} + func (wn *WebsocketNetwork) numOutgoingPeers() int { wn.peersLock.RLock() defer wn.peersLock.RUnlock() @@ -1180,6 +1274,7 @@ func (wn *WebsocketNetwork) connectedForIP(host string) (totalConnections int) { } const meshThreadInterval = time.Minute +const cliqueResolveInterval = 5 * time.Minute type meshRequest struct { disconnect bool @@ -1219,40 +1314,25 @@ func (wn *WebsocketNetwork) meshThread() { dnsAddrs := wn.getDNSAddrs(dnsBootstrap) if len(dnsAddrs) > 0 { wn.log.Debugf("got %d dns addrs, %#v", len(dnsAddrs), dnsAddrs[:imin(5, len(dnsAddrs))]) - dnsPhonebook := wn.phonebook.GetPhonebook(dnsBootstrap) - if dnsPhonebook == nil { - // create one, if we don't have one already. - dnsPhonebook = MakeThreadsafePhonebook() - wn.phonebook.AddOrUpdatePhonebook(dnsBootstrap, dnsPhonebook) - } - if tsPhonebook, ok := dnsPhonebook.(*ThreadsafePhonebook); ok { - tsPhonebook.ReplacePeerList(dnsAddrs) - } + wn.phonebook.ReplacePeerList(dnsAddrs, dnsBootstrap) } else { wn.log.Infof("got no DNS addrs for network %s", wn.NetworkID) } } - desired := wn.config.GossipFanout - numOutgoing := wn.numOutgoingPeers() + wn.numOutgoingPending() - need := desired - numOutgoing - if need > 0 { - // get more than we need so that we can ignore duplicates - newAddrs := wn.phonebook.GetAddresses(desired + numOutgoing) - for _, na := range newAddrs { - if na == wn.config.PublicAddress { - continue - } - gossipAddr, ok := wn.tryConnectReserveAddr(na) - if ok { - wn.wg.Add(1) - go wn.tryConnect(na, gossipAddr) - need-- - if need == 0 { - break - } - } + + // as long as the call to checkExistingConnectionsNeedDisconnecting is deleting existing connections, we want to + // kick off the creation of new connections. + for { + if wn.checkNewConnectionsNeeded() { + // new connections were created. + break + } + if !wn.checkExistingConnectionsNeedDisconnecting() { + // no connection were removed. + break } } + if request.done != nil { close(request.done) } @@ -1264,6 +1344,123 @@ func (wn *WebsocketNetwork) meshThread() { } } +// checkNewConnectionsNeeded checks to see if we need to have more connections to meet the GossipFanout target. +// if we do, it will spin async connection go routines. +// it returns false if no connections are needed, and true otherwise. +// note that the determination of needed connection could be inaccurate, and it might return false while +// more connection should be created. +func (wn *WebsocketNetwork) checkNewConnectionsNeeded() bool { + desired := wn.config.GossipFanout + numOutgoingTotal := wn.numOutgoingPeers() + wn.numOutgoingPending() + need := desired - numOutgoingTotal + if need <= 0 { + return false + } + // get more than we need so that we can ignore duplicates + newAddrs := wn.phonebook.GetAddresses(desired + numOutgoingTotal) + for _, na := range newAddrs { + if na == wn.config.PublicAddress { + // filter out self-public address, so we won't try to connect to outselves. + continue + } + gossipAddr, ok := wn.tryConnectReserveAddr(na) + if ok { + wn.wg.Add(1) + go wn.tryConnect(na, gossipAddr) + need-- + if need == 0 { + break + } + } + } + return true +} + +// checkExistingConnectionsNeedDisconnecting check to see if existing connection need to be dropped due to +// performance issues and/or network being stalled. +func (wn *WebsocketNetwork) checkExistingConnectionsNeedDisconnecting() bool { + // we already connected ( or connecting.. ) to GossipFanout peers. + // get the actual peers. + outgoingPeers := wn.outgoingPeers() + if len(outgoingPeers) < wn.config.GossipFanout { + // reset the performance monitor. + wn.connPerfMonitor.Reset([]Peer{}) + return wn.checkNetworkAdvanceDisconnect() + } + + if !wn.connPerfMonitor.ComparePeers(outgoingPeers) { + // different set of peers. restart monitoring. + wn.connPerfMonitor.Reset(outgoingPeers) + } + + // same set of peers. + peerStat := wn.connPerfMonitor.GetPeersStatistics() + if peerStat == nil { + // performance metrics are not yet ready. + return wn.checkNetworkAdvanceDisconnect() + } + + // update peers with the performance metrics we've gathered. + var leastPerformingPeer *wsPeer = nil + for _, stat := range peerStat.peerStatistics { + wsPeer := stat.peer.(*wsPeer) + wsPeer.peerMessageDelay = stat.peerDelay + wn.log.Infof("network performance monitor - peer '%s' delay %d first message portion %d%%", wsPeer.GetAddress(), stat.peerDelay, int(stat.peerFirstMessage*100)) + if wsPeer.throttledOutgoingConnection && leastPerformingPeer == nil { + leastPerformingPeer = wsPeer + } + } + if leastPerformingPeer == nil { + return wn.checkNetworkAdvanceDisconnect() + } + wn.disconnect(leastPerformingPeer, disconnectLeastPerformingPeer) + wn.connPerfMonitor.Reset([]Peer{}) + + return true +} + +// checkNetworkAdvanceDisconnect is using the lastNetworkAdvance indicator to see if the network is currently "stuck". +// if it's seems to be "stuck", a randomally picked peer would be disconnected. +func (wn *WebsocketNetwork) checkNetworkAdvanceDisconnect() bool { + lastNetworkAdvance := wn.getLastNetworkAdvance() + if time.Now().UTC().Sub(lastNetworkAdvance) < cliqueResolveInterval { + return false + } + outgoingPeers := wn.outgoingPeers() + if len(outgoingPeers) == 0 { + return false + } + if wn.numOutgoingPending() > 0 { + // we're currently trying to extend the list of outgoing connections. no need to + // disconnect any existing connection to free up room for another connection. + return false + } + var peer *wsPeer + disconnectPeerIdx := crypto.RandUint63() % uint64(len(outgoingPeers)) + peer = outgoingPeers[disconnectPeerIdx].(*wsPeer) + + wn.disconnect(peer, disconnectCliqueResolve) + wn.connPerfMonitor.Reset([]Peer{}) + wn.OnNetworkAdvance() + return true +} + +func (wn *WebsocketNetwork) getLastNetworkAdvance() time.Time { + wn.lastNetworkAdvanceMu.Lock() + defer wn.lastNetworkAdvanceMu.Unlock() + return wn.lastNetworkAdvance +} + +// OnNetworkAdvance notifies the network library that the agreement protocol was able to make a notable progress. +// this is the only indication that we have that we haven't formed a clique, where all incoming messages +// arrive very quickly, but might be missing some votes. The usage of this call is expected to have similar +// characteristics as with a watchdog timer. +func (wn *WebsocketNetwork) OnNetworkAdvance() { + wn.lastNetworkAdvanceMu.Lock() + defer wn.lastNetworkAdvanceMu.Unlock() + wn.lastNetworkAdvance = time.Now().UTC() +} + // sendPeerConnectionsTelemetryStatus sends a snapshot of the currently connected peers // to the telemetry server. Internally, it's using a timer to ensure that it would only // send the information once every hour ( configurable via PeerConnectionsUpdateInterval ) @@ -1286,6 +1483,7 @@ func (wn *WebsocketNetwork) sendPeerConnectionsTelemetryStatus() { if peer.outgoing { connDetail.Address = justHost(peer.conn.RemoteAddr().String()) connDetail.Endpoint = peer.GetAddress() + connDetail.MessageDelay = peer.peerMessageDelay connectionDetails.OutgoingPeers = append(connectionDetails.OutgoingPeers, connDetail) } else { connDetail.Address = peer.OriginAddress() @@ -1406,7 +1604,7 @@ func (wn *WebsocketNetwork) peersToPing() []*wsPeer { } func (wn *WebsocketNetwork) getDNSAddrs(dnsBootstrap string) []string { - srvPhonebook, err := tools_network.ReadFromSRV("algobootstrap", "tcp", dnsBootstrap, wn.config.FallbackDNSResolverAddress) + srvPhonebook, err := tools_network.ReadFromSRV("algobootstrap", "tcp", dnsBootstrap, wn.config.FallbackDNSResolverAddress, wn.config.DNSSecuritySRVEnforced()) if err != nil { // only log this warning on testnet or devnet if wn.NetworkID == config.Devnet || wn.NetworkID == config.Testnet { @@ -1417,9 +1615,15 @@ func (wn *WebsocketNetwork) getDNSAddrs(dnsBootstrap string) []string { return srvPhonebook } -// ProtocolVersionHeader HTTP header for protocol version. TODO: this may be unneeded redundance since we also have url versioning "/v1/..." +// ProtocolVersionHeader HTTP header for protocol version. const ProtocolVersionHeader = "X-Algorand-Version" +// ProtocolAcceptVersionHeader HTTP header for accept protocol version. Client use this to advertise supported protocol versions. +const ProtocolAcceptVersionHeader = "X-Algorand-Accept-Version" + +// SupportedProtocolVersions contains the list of supported protocol versions by this node ( in order of preference ). +var SupportedProtocolVersions = []string{"2.1", "1"} + // ProtocolVersion is the current version attached to the ProtocolVersionHeader header const ProtocolVersion = "1" @@ -1526,10 +1730,10 @@ func (wn *WebsocketNetwork) numOutgoingPending() int { return len(wn.tryConnectAddrs) } -var websocketDialer = websocket.Dialer{ - Proxy: http.ProxyFromEnvironment, - HandshakeTimeout: 45 * time.Second, - EnableCompression: false, +// GetRoundTripper returns an http.Transport that limits the number of connection +// to comply with connectionsRateLimitingCount. +func (wn *WebsocketNetwork) GetRoundTripper() http.RoundTripper { + return &wn.transport } // tryConnect opens websocket connection and checks initial connection parameters. @@ -1544,9 +1748,22 @@ func (wn *WebsocketNetwork) tryConnect(addr, gossipAddr string) { defer wn.wg.Done() requestHeader := make(http.Header) wn.setHeaders(requestHeader) + for _, supportedProtocolVersion := range SupportedProtocolVersions { + requestHeader.Add(ProtocolAcceptVersionHeader, supportedProtocolVersion) + } + // for backward compatability, include the ProtocolVersion header as well. + requestHeader.Set(ProtocolVersionHeader, ProtocolVersion) SetUserAgentHeader(requestHeader) myInstanceName := wn.log.GetInstanceName() requestHeader.Set(InstanceNameHeader, myInstanceName) + var websocketDialer = websocket.Dialer{ + Proxy: http.ProxyFromEnvironment, + HandshakeTimeout: 45 * time.Second, + EnableCompression: false, + NetDialContext: wn.dialer.DialContext, + NetDial: wn.dialer.Dial, + } + conn, response, err := websocketDialer.DialContext(wn.ctx, gossipAddr, requestHeader) if err != nil { if err == websocket.ErrBadHandshake { @@ -1583,15 +1800,30 @@ func (wn *WebsocketNetwork) tryConnect(addr, gossipAddr string) { } // no need to test the response.StatusCode since we know it's going to be http.StatusSwitchingProtocols, as it's already being tested inside websocketDialer.DialContext. - // checking the headers here is abit redundent; the server has already verified that the headers match. But we will need this in the future - - // once our server would support multiple protocols, we would need to verify here that we use the correct protocol, out of the "proposed" protocols we have provided in the - // request headers. - if !wn.checkServerResponseVariables(response.Header, gossipAddr) { + // we need to examine the headers here to extract which protocol version we should be using. + responseHeaderOk, matchingVersion := wn.checkServerResponseVariables(response.Header, gossipAddr) + if !responseHeaderOk { // The error was already logged, so no need to log again. return } - peer := &wsPeer{wsPeerCore: wsPeerCore{net: wn, rootURL: addr}, conn: conn, outgoing: true, incomingMsgFilter: wn.incomingMsgFilter, createTime: time.Now()} + throttledConnection := false + if atomic.AddInt32(&wn.throttledOutgoingConnections, int32(-1)) >= 0 { + throttledConnection = true + } else { + atomic.AddInt32(&wn.throttledOutgoingConnections, int32(1)) + } + + peer := &wsPeer{ + wsPeerCore: makePeerCore(wn, addr, wn.GetRoundTripper(), "" /* origin */), + conn: conn, + outgoing: true, + incomingMsgFilter: wn.incomingMsgFilter, + createTime: time.Now(), + connMonitor: wn.connPerfMonitor, + throttledOutgoingConnection: throttledConnection, + version: matchingVersion, + } peer.TelemetryGUID, peer.InstanceName, _ = getCommonHeaders(response.Header) peer.init(wn.config, wn.outgoingMessagesBufferSize) wn.addPeer(peer) @@ -1603,6 +1835,7 @@ func (wn *WebsocketNetwork) tryConnect(addr, gossipAddr string) { HostName: peer.TelemetryGUID, Incoming: false, InstanceName: peer.InstanceName, + Endpoint: peer.GetAddress(), }) peers.Set(float64(wn.NumPeers()), nil) @@ -1624,18 +1857,25 @@ func (wn *WebsocketNetwork) tryConnect(addr, gossipAddr string) { } // NewWebsocketNetwork constructor for websockets based gossip network -func NewWebsocketNetwork(log logging.Logger, config config.Local, phonebook Phonebook, genesisID string, networkID protocol.NetworkID) (wn *WebsocketNetwork, err error) { - outerPhonebook := MakeMultiPhonebook() - outerPhonebook.AddOrUpdatePhonebook("default", phonebook) - wn = &WebsocketNetwork{log: log, config: config, phonebook: outerPhonebook, GenesisID: genesisID, NetworkID: networkID} +func NewWebsocketNetwork(log logging.Logger, config config.Local, phonebookAddresses []string, genesisID string, networkID protocol.NetworkID) (wn *WebsocketNetwork, err error) { + phonebook := MakePhonebook(config.ConnectionsRateLimitingCount, + time.Duration(config.ConnectionsRateLimitingWindowSeconds)*time.Second) + phonebook.ReplacePeerList(phonebookAddresses, config.DNSBootstrapID) + wn = &WebsocketNetwork{ + log: log, + config: config, + phonebook: phonebook, + GenesisID: genesisID, + NetworkID: networkID, + } wn.setup() return wn, nil } // NewWebsocketGossipNode constructs a websocket network node and returns it as a GossipNode interface implementation -func NewWebsocketGossipNode(log logging.Logger, config config.Local, phonebook Phonebook, genesisID string, networkID protocol.NetworkID) (gn GossipNode, err error) { - return NewWebsocketNetwork(log, config, phonebook, genesisID, networkID) +func NewWebsocketGossipNode(log logging.Logger, config config.Local, phonebookAddresses []string, genesisID string, networkID protocol.NetworkID) (gn GossipNode, err error) { + return NewWebsocketNetwork(log, config, phonebookAddresses, genesisID, networkID) } // SetPrioScheme specifies the network priority scheme for a network node @@ -1652,7 +1892,11 @@ func (wn *WebsocketNetwork) removePeer(peer *wsPeer, reason disconnectReason) { // first logging, then take the lock and do the actual accounting. // definitely don't change this to do the logging while holding the lock. localAddr, _ := wn.Address() - wn.log.With("event", "Disconnected").With("remote", peer.rootURL).With("local", localAddr).Infof("Peer %s disconnected: %s", peer.rootURL, reason) + logEntry := wn.log.With("event", "Disconnected").With("remote", peer.rootURL).With("local", localAddr) + if peer.outgoing && peer.peerMessageDelay > 0 { + logEntry = logEntry.With("messageDelay", peer.peerMessageDelay) + } + logEntry.Infof("Peer %s disconnected: %s", peer.rootURL, reason) peerAddr := peer.OriginAddress() // we might be able to get addr out of conn, or it might be closed if peerAddr == "" && peer.conn != nil { @@ -1671,15 +1915,20 @@ func (wn *WebsocketNetwork) removePeer(peer *wsPeer, reason disconnectReason) { peerAddr = justHost(peer.rootURL) } } + eventDetails := telemetryspec.PeerEventDetails{ + Address: peerAddr, + HostName: peer.TelemetryGUID, + Incoming: !peer.outgoing, + InstanceName: peer.InstanceName, + } + if peer.outgoing { + eventDetails.Endpoint = peer.GetAddress() + eventDetails.MessageDelay = peer.peerMessageDelay + } wn.log.EventWithDetails(telemetryspec.Network, telemetryspec.DisconnectPeerEvent, telemetryspec.DisconnectPeerEventDetails{ - PeerEventDetails: telemetryspec.PeerEventDetails{ - Address: peerAddr, - HostName: peer.TelemetryGUID, - Incoming: !peer.outgoing, - InstanceName: peer.InstanceName, - }, - Reason: string(reason), + PeerEventDetails: eventDetails, + Reason: string(reason), }) peers.Set(float64(wn.NumPeers()), nil) @@ -1691,6 +1940,9 @@ func (wn *WebsocketNetwork) removePeer(peer *wsPeer, reason disconnectReason) { if peer.peerIndex < len(wn.peers) && wn.peers[peer.peerIndex] == peer { heap.Remove(peersHeap{wn}, peer.peerIndex) wn.prioTracker.removePeer(peer) + if peer.throttledOutgoingConnection { + atomic.AddInt32(&wn.throttledOutgoingConnections, int32(1)) + } } wn.countPeersSetGauges() } diff --git a/network/wsNetwork_test.go b/network/wsNetwork_test.go index b4d6780f57..40059ee1dd 100644 --- a/network/wsNetwork_test.go +++ b/network/wsNetwork_test.go @@ -87,6 +87,16 @@ func (e *oneEntryPhonebook) UpdateRetryAfter(addr string, retryAfter time.Time) } } +func (e *oneEntryPhonebook) GetConnectionWaitTime(addr string) (addrInPhonebook bool, + waitTime time.Duration, provisionalTime time.Time) { + var t time.Time + return false, 0, t +} + +func (e *oneEntryPhonebook) UpdateConnectionTime(addr string, t time.Time) bool { + return false +} + var defaultConfig config.Local func init() { @@ -106,7 +116,7 @@ func makeTestWebsocketNodeWithConfig(t testing.TB, conf config.Local) *Websocket wn := &WebsocketNetwork{ log: log, config: conf, - phonebook: MakeMultiPhonebook(), + phonebook: MakePhonebook(1, 1*time.Millisecond), GenesisID: "go-test-network-genesis", NetworkID: config.Devtestnet, } @@ -188,8 +198,6 @@ func newMessageCounter(t testing.TB, target int) *messageCounterHandler { return &messageCounterHandler{target: target, done: make(chan struct{}), t: t} } -const debugTag = protocol.Tag("DD") - func TestWebsocketNetworkStartStop(t *testing.T) { netA := makeTestWebsocketNode(t) netA.Start() @@ -218,12 +226,12 @@ func TestWebsocketNetworkBasic(t *testing.T) { addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := newMessageCounter(t, 2) counterDone := counter.done - netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: counter}}) + netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.TxnTag, MessageHandler: counter}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -231,8 +239,8 @@ func TestWebsocketNetworkBasic(t *testing.T) { waitReady(t, netB, readyTimeout.C) t.Log("b ready") - netA.Broadcast(context.Background(), debugTag, []byte("foo"), false, nil) - netA.Broadcast(context.Background(), debugTag, []byte("bar"), false, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte("foo"), false, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte("bar"), false, nil) select { case <-counterDone: @@ -252,12 +260,12 @@ func TestWebsocketNetworkUnicast(t *testing.T) { addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := newMessageCounter(t, 2) counterDone := counter.done - netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: counter}}) + netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.TxnTag, MessageHandler: counter}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -268,9 +276,9 @@ func TestWebsocketNetworkUnicast(t *testing.T) { require.Equal(t, 1, len(netA.peers)) require.Equal(t, 1, len(netA.GetPeers(PeersConnectedIn))) peerB := netA.peers[0] - err := peerB.Unicast(context.Background(), []byte("foo"), debugTag) + err := peerB.Unicast(context.Background(), []byte("foo"), protocol.TxnTag) assert.NoError(t, err) - err = peerB.Unicast(context.Background(), []byte("bar"), debugTag) + err = peerB.Unicast(context.Background(), []byte("bar"), protocol.TxnTag) assert.NoError(t, err) select { @@ -294,12 +302,12 @@ func TestWebsocketNetworkNoAddress(t *testing.T) { addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := newMessageCounter(t, 2) counterDone := counter.done - netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: counter}}) + netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.TxnTag, MessageHandler: counter}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -307,8 +315,8 @@ func TestWebsocketNetworkNoAddress(t *testing.T) { waitReady(t, netB, readyTimeout.C) t.Log("b ready") - netA.Broadcast(context.Background(), debugTag, []byte("foo"), false, nil) - netA.Broadcast(context.Background(), debugTag, []byte("bar"), false, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte("foo"), false, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte("bar"), false, nil) select { case <-counterDone: @@ -330,8 +338,8 @@ func lineNetwork(t *testing.T, numNodes int) (nodes []*WebsocketNetwork, counter if i > 0 { addrPrev, postListen := nodes[i-1].Address() require.True(t, postListen) - nodes[i].phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrPrev}) - nodes[i].RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: &counters[i]}}) + nodes[i].phonebook.ReplacePeerList([]string{addrPrev}, "default") + nodes[i].RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.TxnTag, MessageHandler: &counters[i]}}) } nodes[i].Start() counters[i].t = t @@ -386,7 +394,7 @@ func TestLineNetwork(t *testing.T) { sendTime := time.Now().UnixNano() var timeblob [8]byte binary.LittleEndian.PutUint64(timeblob[:], uint64(sendTime)) - nodes[0].Broadcast(context.Background(), debugTag, timeblob[:], true, nil) + nodes[0].Broadcast(context.Background(), protocol.TxnTag, timeblob[:], true, nil) } select { case <-counterDone: @@ -677,7 +685,7 @@ func makeTestFilterWebsocketNode(t *testing.T, nodename string) *WebsocketNetwor wn := &WebsocketNetwork{ log: logging.TestingLog(t).With("node", nodename), config: dc, - phonebook: MakeMultiPhonebook(), + phonebook: MakePhonebook(1, 1*time.Millisecond), GenesisID: "go-test-network-genesis", NetworkID: config.Devtestnet, } @@ -698,12 +706,12 @@ func TestDupFilter(t *testing.T) { addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := &messageCounterHandler{t: t, limit: 1, done: make(chan struct{})} netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.AgreementVoteTag, MessageHandler: counter}}) - debugTag2 := protocol.Tag("D2") + debugTag2 := protocol.ProposalPayloadTag counter2 := &messageCounterHandler{t: t, limit: 1, done: make(chan struct{})} netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag2, MessageHandler: counter2}}) @@ -711,7 +719,7 @@ func TestDupFilter(t *testing.T) { require.True(t, postListen) netC := makeTestFilterWebsocketNode(t, "c") netC.config.GossipFanout = 1 - netC.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrB}) + netC.phonebook.ReplacePeerList([]string{addrB}, "default") netC.Start() defer netC.Stop() @@ -777,9 +785,8 @@ func TestGetPeers(t *testing.T) { addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - phba := &oneEntryPhonebook{addr: addrA} - phbMulti := MakeMultiPhonebook() - phbMulti.AddOrUpdatePhonebook("phba", phba) + phbMulti := MakePhonebook(1, 1*time.Millisecond) + phbMulti.ReplacePeerList([]string{addrA}, "phba") netB.phonebook = phbMulti netB.Start() defer netB.Stop() @@ -790,8 +797,7 @@ func TestGetPeers(t *testing.T) { waitReady(t, netB, readyTimeout.C) t.Log("b ready") - ph := ArrayPhonebook{Entries: phonebookEntries{"a": phonebookData{}, "b": phonebookData{}, "c": phonebookData{}}} - phbMulti.AddOrUpdatePhonebook("ph", &ph) + phbMulti.ReplacePeerList([]string{"a", "b", "c"}, "ph") //addrB, _ := netB.Address() @@ -844,12 +850,12 @@ func BenchmarkWebsocketNetworkBasic(t *testing.B) { addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() returns := make(chan uint64, 100) bhandler := benchmarkHandler{returns} - netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: &bhandler}}) + netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.TxnTag, MessageHandler: &bhandler}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -872,7 +878,7 @@ func BenchmarkWebsocketNetworkBasic(t *testing.B) { } msg := make([]byte, msgSize) binary.LittleEndian.PutUint64(msg, uint64(i)) - err := netA.Broadcast(context.Background(), debugTag, msg, true, nil) + err := netA.Broadcast(context.Background(), protocol.TxnTag, msg, true, nil) if err != nil { t.Errorf("error on broadcast: %v", err) return @@ -924,7 +930,7 @@ func TestWebsocketNetworkPrio(t *testing.T) { addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() @@ -968,8 +974,8 @@ func TestWebsocketNetworkPrioLimit(t *testing.T) { netB := makeTestWebsocketNode(t) netB.SetPrioScheme(&prioB) netB.config.GossipFanout = 1 - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) - netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: counterB}}) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") + netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.TxnTag, MessageHandler: counterB}}) netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() @@ -981,8 +987,8 @@ func TestWebsocketNetworkPrioLimit(t *testing.T) { netC := makeTestWebsocketNode(t) netC.SetPrioScheme(&prioC) netC.config.GossipFanout = 1 - netC.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) - netC.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: counterC}}) + netC.phonebook.ReplacePeerList([]string{addrA}, "default") + netC.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.TxnTag, MessageHandler: counterC}}) netC.Start() defer func() { t.Log("stopping C"); netC.Stop(); t.Log("C done") }() @@ -999,7 +1005,7 @@ func TestWebsocketNetworkPrioLimit(t *testing.T) { } waitReady(t, netA, time.After(time.Second)) - netA.Broadcast(context.Background(), debugTag, nil, true, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, nil, true, nil) select { case <-counterBdone: @@ -1049,7 +1055,7 @@ func TestWebsocketNetworkManyIdle(t *testing.T) { for i := 0; i < numClients; i++ { client := makeTestWebsocketNodeWithConfig(t, clientConf) client.config.GossipFanout = 1 - client.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: relayAddr}) + client.phonebook.ReplacePeerList([]string{relayAddr}, "default") client.Start() defer client.Stop() @@ -1102,29 +1108,35 @@ func TestWebsocketNetwork_checkServerResponseVariables(t *testing.T) { header.Set(ProtocolVersionHeader, ProtocolVersion) header.Set(NodeRandomHeader, wn.RandomID+"tag") header.Set(GenesisHeader, wn.GenesisID) - require.Equal(t, true, wn.checkServerResponseVariables(header, "addressX")) + responseVariableOk, matchingVersion := wn.checkServerResponseVariables(header, "addressX") + require.Equal(t, true, responseVariableOk) + require.Equal(t, matchingVersion, ProtocolVersion) noVersionHeader := http.Header{} noVersionHeader.Set(NodeRandomHeader, wn.RandomID+"tag") noVersionHeader.Set(GenesisHeader, wn.GenesisID) - require.Equal(t, false, wn.checkServerResponseVariables(noVersionHeader, "addressX")) + responseVariableOk, matchingVersion = wn.checkServerResponseVariables(noVersionHeader, "addressX") + require.Equal(t, false, responseVariableOk) noRandomHeader := http.Header{} noRandomHeader.Set(ProtocolVersionHeader, ProtocolVersion) noRandomHeader.Set(GenesisHeader, wn.GenesisID) - require.Equal(t, false, wn.checkServerResponseVariables(noRandomHeader, "addressX")) + responseVariableOk, _ = wn.checkServerResponseVariables(noRandomHeader, "addressX") + require.Equal(t, false, responseVariableOk) sameRandomHeader := http.Header{} sameRandomHeader.Set(ProtocolVersionHeader, ProtocolVersion) sameRandomHeader.Set(NodeRandomHeader, wn.RandomID) sameRandomHeader.Set(GenesisHeader, wn.GenesisID) - require.Equal(t, false, wn.checkServerResponseVariables(sameRandomHeader, "addressX")) + responseVariableOk, _ = wn.checkServerResponseVariables(sameRandomHeader, "addressX") + require.Equal(t, false, responseVariableOk) differentGenesisIDHeader := http.Header{} differentGenesisIDHeader.Set(ProtocolVersionHeader, ProtocolVersion) differentGenesisIDHeader.Set(NodeRandomHeader, wn.RandomID+"tag") differentGenesisIDHeader.Set(GenesisHeader, wn.GenesisID+"tag") - require.Equal(t, false, wn.checkServerResponseVariables(differentGenesisIDHeader, "addressX")) + responseVariableOk, _ = wn.checkServerResponseVariables(differentGenesisIDHeader, "addressX") + require.Equal(t, false, responseVariableOk) } func (wn *WebsocketNetwork) broadcastWithTimestamp(tag protocol.Tag, data []byte, when time.Time) error { @@ -1156,12 +1168,12 @@ func TestDelayedMessageDrop(t *testing.T) { addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() counter := newMessageCounter(t, 5) counterDone := counter.done - netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: counter}}) + netB.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.TxnTag, MessageHandler: counter}}) readyTimeout := time.NewTimer(2 * time.Second) waitReady(t, netA, readyTimeout.C) @@ -1169,7 +1181,7 @@ func TestDelayedMessageDrop(t *testing.T) { currentTime := time.Now() for i := 0; i < 10; i++ { - err := netA.broadcastWithTimestamp(debugTag, []byte("foo"), currentTime.Add(time.Hour*time.Duration(i-5))) + err := netA.broadcastWithTimestamp(protocol.TxnTag, []byte("foo"), currentTime.Add(time.Hour*time.Duration(i-5))) require.NoErrorf(t, err, "No error was expected") } @@ -1186,7 +1198,7 @@ func TestSlowPeerDisconnection(t *testing.T) { wn := &WebsocketNetwork{ log: log, config: defaultConfig, - phonebook: MakeMultiPhonebook(), + phonebook: MakePhonebook(1, 1*time.Millisecond), GenesisID: "go-test-network-genesis", NetworkID: config.Devtestnet, slowWritingPeerMonitorInterval: time.Millisecond * 50, @@ -1206,7 +1218,7 @@ func TestSlowPeerDisconnection(t *testing.T) { addrA, postListen := netA.Address() require.True(t, postListen) t.Log(addrA) - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() @@ -1240,7 +1252,7 @@ func TestForceMessageRelaying(t *testing.T) { wn := &WebsocketNetwork{ log: log, config: defaultConfig, - phonebook: MakeMultiPhonebook(), + phonebook: MakePhonebook(1, 1*time.Millisecond), GenesisID: "go-test-network-genesis", NetworkID: config.Devtestnet, } @@ -1254,7 +1266,7 @@ func TestForceMessageRelaying(t *testing.T) { counter := newMessageCounter(t, 5) counterDone := counter.done - netA.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: counter}}) + netA.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.TxnTag, MessageHandler: counter}}) netA.Start() addrA, postListen := netA.Address() require.Truef(t, postListen, "Listening network failed to start") @@ -1263,14 +1275,14 @@ func TestForceMessageRelaying(t *testing.T) { noAddressConfig.NetAddress = "" netB := makeTestWebsocketNodeWithConfig(t, noAddressConfig) netB.config.GossipFanout = 1 - netB.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() noAddressConfig.ForceRelayMessages = true netC := makeTestWebsocketNodeWithConfig(t, noAddressConfig) netC.config.GossipFanout = 1 - netC.phonebook.AddOrUpdatePhonebook("default", &oneEntryPhonebook{addr: addrA}) + netC.phonebook.ReplacePeerList([]string{addrA}, "default") netC.Start() defer func() { t.Log("stopping C"); netC.Stop(); t.Log("C done") }() @@ -1281,9 +1293,9 @@ func TestForceMessageRelaying(t *testing.T) { // send 5 messages from both netB and netC to netA for i := 0; i < 5; i++ { - err := netB.Relay(context.Background(), debugTag, []byte{1, 2, 3}, true, nil) + err := netB.Relay(context.Background(), protocol.TxnTag, []byte{1, 2, 3}, true, nil) require.NoError(t, err) - err = netC.Relay(context.Background(), debugTag, []byte{1, 2, 3}, true, nil) + err = netC.Relay(context.Background(), protocol.TxnTag, []byte{1, 2, 3}, true, nil) require.NoError(t, err) } @@ -1299,13 +1311,13 @@ func TestForceMessageRelaying(t *testing.T) { netA.ClearHandlers() counter = newMessageCounter(t, 10) counterDone = counter.done - netA.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: debugTag, MessageHandler: counter}}) + netA.RegisterHandlers([]TaggedMessageHandler{TaggedMessageHandler{Tag: protocol.TxnTag, MessageHandler: counter}}) // hack the relayMessages on the netB so that it would start sending messages. netB.relayMessages = true // send additional 10 messages from netB for i := 0; i < 10; i++ { - err := netB.Relay(context.Background(), debugTag, []byte{1, 2, 3}, true, nil) + err := netB.Relay(context.Background(), protocol.TxnTag, []byte{1, 2, 3}, true, nil) require.NoError(t, err) } @@ -1323,3 +1335,209 @@ func TestSetUserAgentHeader(t *testing.T) { require.Equal(t, 1, len(headers)) t.Log(headers) } + +func TestCheckProtocolVersionMatch(t *testing.T) { + // note - this test changes the SupportedProtocolVersions global variable ( SupportedProtocolVersions ) and therefore cannot be parallelized. + originalSupportedProtocolVersions := SupportedProtocolVersions + defer func() { + SupportedProtocolVersions = originalSupportedProtocolVersions + }() + log := logging.TestingLog(t) + log.SetLevel(logging.Level(defaultConfig.BaseLoggerDebugLevel)) + wn := &WebsocketNetwork{ + log: log, + config: defaultConfig, + phonebook: MakePhonebook(1, 1*time.Millisecond), + GenesisID: "go-test-network-genesis", + NetworkID: config.Devtestnet, + } + wn.setup() + + SupportedProtocolVersions = []string{"2", "1"} + + header1 := make(http.Header) + header1.Add(ProtocolAcceptVersionHeader, "1") + header1.Add(ProtocolVersionHeader, "3") + matchingVersion, otherVersion := wn.checkProtocolVersionMatch(header1) + require.Equal(t, "1", matchingVersion) + require.Equal(t, "", otherVersion) + + header2 := make(http.Header) + header2.Add(ProtocolAcceptVersionHeader, "3") + header2.Add(ProtocolAcceptVersionHeader, "4") + header2.Add(ProtocolVersionHeader, "1") + matchingVersion, otherVersion = wn.checkProtocolVersionMatch(header2) + require.Equal(t, "1", matchingVersion) + require.Equal(t, "1", otherVersion) + + header3 := make(http.Header) + header3.Add(ProtocolVersionHeader, "3") + matchingVersion, otherVersion = wn.checkProtocolVersionMatch(header3) + require.Equal(t, "", matchingVersion) + require.Equal(t, "3", otherVersion) +} + +func handleTopicRequest(msg IncomingMessage) (out OutgoingMessage) { + + topics, err := UnmarshallTopics(msg.Data) + if err != nil { + return + } + + val1b, f := topics.GetValue("val1") + if !f { + return + } + val2b, f := topics.GetValue("val2") + if !f { + return + } + val1 := int(val1b[0]) + val2 := int(val2b[0]) + + respTopics := Topics{ + Topic{ + key: "value", + data: []byte{byte(val1 + val2)}, + }, + } + return OutgoingMessage{ + Action: Respond, + Tag: protocol.TopicMsgRespTag, + Topics: respTopics, + } +} + +// Set up two nodes, test topics send/recieve is working +func TestWebsocketNetworkTopicRoundtrip(t *testing.T) { + var topicMsgReqTag Tag = protocol.UniCatchupReqTag + netA := makeTestWebsocketNode(t) + netA.config.GossipFanout = 1 + netA.Start() + defer func() { t.Log("stopping A"); netA.Stop(); t.Log("A done") }() + netB := makeTestWebsocketNode(t) + netB.config.GossipFanout = 1 + addrA, postListen := netA.Address() + require.True(t, postListen) + t.Log(addrA) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") + netB.Start() + defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() + + netB.RegisterHandlers([]TaggedMessageHandler{ + TaggedMessageHandler{ + Tag: topicMsgReqTag, + MessageHandler: HandlerFunc(handleTopicRequest), + }, + }) + + readyTimeout := time.NewTimer(2 * time.Second) + waitReady(t, netA, readyTimeout.C) + t.Log("a ready") + waitReady(t, netB, readyTimeout.C) + t.Log("b ready") + + peerA := netA.peers[0] + + topics := Topics{ + Topic{ + key: "command", + data: []byte("add"), + }, + Topic{ + key: "val1", + data: []byte{1}, + }, + Topic{ + key: "val2", + data: []byte{4}, + }, + } + + resp, err := peerA.Request(context.Background(), topicMsgReqTag, topics) + assert.NoError(t, err) + + sum, found := resp.Topics.GetValue("value") + assert.Equal(t, true, found) + assert.Equal(t, 5, int(sum[0])) +} + +// Set up two nodes, have one of them request a certain message tag mask, and verify the other follow that. +func TestWebsocketNetworkMessageOfInterest(t *testing.T) { + netA := makeTestWebsocketNode(t) + netA.config.GossipFanout = 1 + netA.config.EnablePingHandler = false + + netA.Start() + defer func() { t.Log("stopping A"); netA.Stop(); t.Log("A done") }() + netB := makeTestWebsocketNode(t) + netB.config.GossipFanout = 1 + netB.config.EnablePingHandler = false + addrA, postListen := netA.Address() + require.True(t, postListen) + t.Log(addrA) + netB.phonebook.ReplacePeerList([]string{addrA}, "default") + netB.Start() + defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() + + incomingMsgSync := deadlock.Mutex{} + msgCounters := make(map[protocol.Tag]int) + messageArriveWg := sync.WaitGroup{} + msgHandler := func(msg IncomingMessage) (out OutgoingMessage) { + incomingMsgSync.Lock() + defer incomingMsgSync.Unlock() + msgCounters[msg.Tag] = msgCounters[msg.Tag] + 1 + messageArriveWg.Done() + return + } + messageFilterArriveWg := sync.WaitGroup{} + messageFilterArriveWg.Add(1) + waitMessageArriveHandler := func(msg IncomingMessage) (out OutgoingMessage) { + messageFilterArriveWg.Done() + return + } + + // register all the handlers. + taggedHandlers := []TaggedMessageHandler{} + for tag := range defaultSendMessageTags { + taggedHandlers = append(taggedHandlers, TaggedMessageHandler{ + Tag: tag, + MessageHandler: HandlerFunc(msgHandler), + }) + } + netB.RegisterHandlers(taggedHandlers) + netA.RegisterHandlers([]TaggedMessageHandler{ + TaggedMessageHandler{ + Tag: protocol.AgreementVoteTag, + MessageHandler: HandlerFunc(waitMessageArriveHandler), + }}) + + readyTimeout := time.NewTimer(2 * time.Second) + waitReady(t, netA, readyTimeout.C) + waitReady(t, netB, readyTimeout.C) + + // have netB asking netA to send it only AgreementVoteTag and ProposalPayloadTag + netB.Broadcast(context.Background(), protocol.MsgOfInterestTag, MarshallMessageOfInterest([]protocol.Tag{protocol.AgreementVoteTag, protocol.ProposalPayloadTag}), true, nil) + // send another message which we can track, so that we'll know that the first message was delivered. + netB.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) + messageFilterArriveWg.Wait() + + messageArriveWg.Add(5 * 2) // we're expecting exactly 10 messages. + // send 5 messages of few types. + for i := 0; i < 5; i++ { + netA.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.UniEnsBlockResTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.ProposalPayloadTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.VoteBundleTag, []byte{0, 1, 2, 3, 4}, true, nil) + } + // wait until all the expected messages arrive. + messageArriveWg.Wait() + for tag, count := range msgCounters { + if tag == protocol.AgreementVoteTag || tag == protocol.ProposalPayloadTag { + require.Equal(t, 5, count) + } else { + require.Equal(t, 0, count) + } + } +} diff --git a/network/wsPeer.go b/network/wsPeer.go index 379f02198e..c01a61f3b8 100644 --- a/network/wsPeer.go +++ b/network/wsPeer.go @@ -18,6 +18,7 @@ package network import ( "context" + "encoding/binary" "fmt" "io" "math/rand" @@ -60,6 +61,25 @@ var duplicateNetworkMessageReceivedBytesTotal = metrics.MakeCounter(metrics.Dupl var outgoingNetworkMessageFilteredOutTotal = metrics.MakeCounter(metrics.OutgoingNetworkMessageFilteredOutTotal) var outgoingNetworkMessageFilteredOutBytesTotal = metrics.MakeCounter(metrics.OutgoingNetworkMessageFilteredOutBytesTotal) +// defaultSendMessageTags is the default list of messages which a peer would +// allow to be sent without receiving any explicit request. +var defaultSendMessageTags = map[protocol.Tag]bool{ + protocol.AgreementVoteTag: true, + protocol.MsgDigestSkipTag: true, + protocol.NetPrioResponseTag: true, + protocol.PingTag: true, + protocol.PingReplyTag: true, + protocol.ProposalPayloadTag: true, + protocol.TopicMsgRespTag: true, + protocol.MsgOfInterestTag: true, + protocol.TxnTag: true, + protocol.UniCatchupReqTag: true, + protocol.UniEnsBlockReqTag: true, + protocol.UniEnsBlockResTag: true, + protocol.UniCatchupResTag: true, + protocol.VoteBundleTag: true, +} + // interface allows substituting debug implementation for *websocket.Conn type wsPeerWebsocketConn interface { RemoteAddr() net.Addr @@ -72,15 +92,16 @@ type wsPeerWebsocketConn interface { type sendMessage struct { data []byte - enqueued time.Time // the time at which the message was first generated - peerEnqueued time.Time // the time at which the peer was attempting to enqueue the message + enqueued time.Time // the time at which the message was first generated + peerEnqueued time.Time // the time at which the peer was attempting to enqueue the message + msgTags map[protocol.Tag]bool // when msgTags is speficied ( i.e. non-nil ), the send goroutine is to replace the message tag filter with this one. No data would be accompanied to this message. } // wsPeerCore also works for non-connected peers we want to do HTTP GET from type wsPeerCore struct { net *WebsocketNetwork rootURL string - originAddress string + originAddress string // incoming connection remote host client http.Client } @@ -92,6 +113,13 @@ const disconnectReadError disconnectReason = "ReadError" const disconnectWriteError disconnectReason = "WriteError" const disconnectIdleConn disconnectReason = "IdleConnection" const disconnectSlowConn disconnectReason = "SlowConnection" +const disconnectLeastPerformingPeer disconnectReason = "LeastPerformingPeer" +const disconnectCliqueResolve disconnectReason = "CliqueResolving" + +// Response is the structure holding the response from the server +type Response struct { + Topics Topics +} type wsPeer struct { // lastPacketTime contains the UnixNano at the last time a successfull communication was made with the peer. @@ -148,6 +176,34 @@ type wsPeer struct { // createTime is the time at which the connection was established with the peer. createTime time.Time + + // peer version ( this is one of the version supported by the current node and listed in SupportedProtocolVersions ) + version string + + // Nonce used to uniquely identify requests + requestNonce uint64 + + // responseChannels used by the client to wait on the response of the request + responseChannels map[uint64]chan *Response + + // responseChannelsMutex guards the operations of responseChannels + responseChannelsMutex deadlock.RWMutex + + // sendMessageTag is a map of allowed message to send to a peer. We don't use any syncronization on this map, and the + // only gurentee is that it's being accessed only during startup and/or by the sending loop go routine. + sendMessageTag map[protocol.Tag]bool + + // connMonitor used to measure the relative performance of the connection + // compared to the other outgoing connections. Incoming connections would have this + // field set to nil. + connMonitor *connectionPerformanceMonitor + + // peerMessageDelay is calculated by the connection monitor; it's the relative avarage per-message delay. + peerMessageDelay int64 + + // throttledOutgoingConnection determines if this outgoing connection will be throttled bassed on it's + // performance or not. Throttled connections are more likely to be short-lived connections. + throttledOutgoingConnection bool } // HTTPPeer is what the opaque Peer might be. @@ -167,6 +223,20 @@ type UnicastPeer interface { GetAddress() string // Unicast sends the given bytes to this specific peer. Does not wait for message to be sent. Unicast(ctx context.Context, data []byte, tag protocol.Tag) error + // Version returns the matching version from network.SupportedProtocolVersions + Version() string + Request(ctx context.Context, tag Tag, topics Topics) (resp *Response, e error) + Respond(ctx context.Context, reqMsg IncomingMessage, topics Topics) (e error) +} + +// Create a wsPeerCore object +func makePeerCore(net *WebsocketNetwork, rootURL string, roundTripper http.RoundTripper, originAddress string) wsPeerCore { + return wsPeerCore{ + net: net, + rootURL: rootURL, + originAddress: originAddress, + client: http.Client{Transport: roundTripper}, + } } // GetAddress returns the root url to use to connect to this peer. @@ -186,6 +256,11 @@ func (wp *wsPeerCore) PrepareURL(rawURL string) string { return strings.Replace(rawURL, "{genesisID}", wp.net.GenesisID, -1) } +// Version returns the matching version from network.SupportedProtocolVersions +func (wp *wsPeer) Version() string { + return wp.version +} + // Unicast sends the given bytes to this specific peer. Does not wait for message to be sent. // (Implements UnicastPeer) func (wp *wsPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag) error { @@ -196,7 +271,7 @@ func (wp *wsPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag) err copy(mbytes, tbytes) copy(mbytes[len(tbytes):], msg) var digest crypto.Digest - if tag != protocol.MsgSkipTag && len(msg) >= messageFilterSize { + if tag != protocol.MsgDigestSkipTag && len(msg) >= messageFilterSize { digest = crypto.Hash(mbytes) } @@ -209,6 +284,35 @@ func (wp *wsPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag) err return err } +// Respond sends the response of a request message +func (wp *wsPeer) Respond(ctx context.Context, reqMsg IncomingMessage, responseTopics Topics) (e error) { + + // Get the hash/key of the request message + requestHash := hashTopics(reqMsg.Data) + + // Add the request hash + requestHashData := make([]byte, binary.MaxVarintLen64) + binary.PutUvarint(requestHashData, requestHash) + responseTopics = append(responseTopics, Topic{key: requestHashKey, data: requestHashData}) + + // Serialize the topics + serializedMsg := responseTopics.MarshallTopics() + + // Send serializedMsg + select { + case wp.sendBufferBulk <- sendMessage{ + data: append([]byte(protocol.TopicMsgRespTag), serializedMsg...), + enqueued: time.Now(), + peerEnqueued: time.Now()}: + case <-wp.closing: + wp.net.log.Debugf("peer closing %s", wp.conn.RemoteAddr().String()) + return + case <-ctx.Done(): + return ctx.Err() + } + return nil +} + // setup values not trivially assigned func (wp *wsPeer) init(config config.Local, sendBufferLength int) { wp.net.log.Debugf("wsPeer init outgoing=%v %#v", wp.outgoing, wp.rootURL) @@ -216,6 +320,8 @@ func (wp *wsPeer) init(config config.Local, sendBufferLength int) { wp.sendBufferHighPrio = make(chan sendMessage, sendBufferLength) wp.sendBufferBulk = make(chan sendMessage, sendBufferLength) atomic.StoreInt64(&wp.lastPacketTime, time.Now().UnixNano()) + wp.responseChannels = make(map[uint64]chan *Response) + wp.sendMessageTag = defaultSendMessageTags // processed is a channel that messageHandlerThread writes to // when it's done with one of our messages, so that we can queue @@ -300,7 +406,46 @@ func (wp *wsPeer) readLoop() { networkReceivedBytesTotal.AddUint64(uint64(len(msg.Data)+2), nil) networkMessageReceivedTotal.AddUint64(1, nil) msg.Sender = wp - if msg.Tag == protocol.MsgSkipTag { + + // for outgoing connections, we want to notify the connection monitor that we've received + // a message. The connection monitor would update it's statistics accordingly. + if wp.connMonitor != nil { + wp.connMonitor.Notify(&msg) + } + + switch msg.Tag { + case protocol.MsgOfInterestTag: + // try to decode the message-of-interest + if wp.handleMessageOfInterest(msg) { + return + } + continue + case protocol.TopicMsgRespTag: // Handle Topic message + topics, err := UnmarshallTopics(msg.Data) + if err != nil { + wp.net.log.Warnf("wsPeer readLoop: could not read the message from: %s %s", wp.conn.RemoteAddr().String(), err) + continue + } + requestHash, found := topics.GetValue(requestHashKey) + if !found { + wp.net.log.Warnf("wsPeer readLoop: message from %s is missing the %s", wp.conn.RemoteAddr().String(), requestHashKey) + continue + } + hashKey, _ := binary.Uvarint(requestHash) + channel, found := wp.getAndRemoveResponseChannel(hashKey) + if !found { + wp.net.log.Warnf("wsPeer readLoop: received a message response from %s for a stale request", wp.conn.RemoteAddr().String()) + continue + } + + select { + case channel <- &Response{Topics: topics}: + // do nothing. writing was successfull. + default: + wp.net.log.Warnf("wsPeer readLoop: channel blocked. Could not pass the response to the requester", wp.conn.RemoteAddr().String()) + } + continue + case protocol.MsgDigestSkipTag: // network maintenance message handled immediately instead of handing off to general handlers wp.handleFilterMessage(msg) continue @@ -334,6 +479,42 @@ func (wp *wsPeer) readLoop() { } } +func (wp *wsPeer) handleMessageOfInterest(msg IncomingMessage) (shutdown bool) { + shutdown = false + // decode the message, and ensure it's a valid message. + msgTagsMap, err := unmarshallMessageOfInterest(msg.Data) + if err != nil { + wp.net.log.Warnf("wsPeer handleMessageOfInterest: could not unmarshall message from: %s %v", wp.conn.RemoteAddr().String(), err) + return + } + sm := sendMessage{ + data: nil, + enqueued: time.Now(), + peerEnqueued: time.Now(), + msgTags: msgTagsMap, + } + + // try to send the message to the send loop. The send loop will store the message locally and would use it. + // the rationale here is that this message is rarely sent, and we would benefit from having it being lock-free. + select { + case wp.sendBufferHighPrio <- sm: + return + case <-wp.closing: + wp.net.log.Debugf("peer closing %s", wp.conn.RemoteAddr().String()) + shutdown = true + default: + } + + select { + case wp.sendBufferHighPrio <- sm: + case wp.sendBufferBulk <- sm: + case <-wp.closing: + wp.net.log.Debugf("peer closing %s", wp.conn.RemoteAddr().String()) + shutdown = true + } + return +} + func (wp *wsPeer) readLoopCleanup() { wp.internalClose(disconnectReadError) wp.wg.Done() @@ -360,6 +541,19 @@ func (wp *wsPeer) writeLoopSend(msg sendMessage) (exit bool) { // just drop it, don't break the connection return false } + if msg.msgTags != nil { + // when msg.msgTags is non-nil, the read loop has received a message-of-interest message that we want to apply. + // in order to avoid any locking, it sent it to this queue so that we could set it as the new outgoing message tag filter. + wp.sendMessageTag = msg.msgTags + return false + } + // the tags are always 2 char long; note that this is safe since it's only being used for messages that we have generated locally. + tag := protocol.Tag(msg.data[:2]) + if !wp.sendMessageTag[tag] { + // the peer isn't interested in this message. + return false + } + // check if this message was waiting in the queue for too long. If this is the case, return "true" to indicate that we want to close the connection. msgWaitDuration := time.Now().Sub(msg.enqueued) if msgWaitDuration > maxMessageQueueDuration { @@ -512,3 +706,71 @@ func (wp *wsPeer) CheckSlowWritingPeer(now time.Time) bool { timeSinceMessageCreated := now.Sub(time.Unix(0, ongoingMessageTime)) return timeSinceMessageCreated > maxMessageQueueDuration } + +// getRequestNonce returns the byte representation of ever increasing uint64 +// The value is stored on wsPeer +func (wp *wsPeer) getRequestNonce() []byte { + buf := make([]byte, binary.MaxVarintLen64) + binary.PutUvarint(buf, atomic.AddUint64(&wp.requestNonce, 1)) + return buf +} + +// Request submits the request to the server, waits for a response +func (wp *wsPeer) Request(ctx context.Context, tag Tag, topics Topics) (resp *Response, e error) { + + // Add nonce as a topic + nonce := wp.getRequestNonce() + topics = append(topics, Topic{key: "nonce", data: nonce}) + + // serialize the topics + serializedMsg := topics.MarshallTopics() + + // Get the topics' hash + hash := hashTopics(serializedMsg) + + // Make a response channel to wait on the server response + responseChannel := wp.makeResponseChannel(hash) + defer wp.getAndRemoveResponseChannel(hash) + + // Send serializedMsg + select { + case wp.sendBufferBulk <- sendMessage{ + data: append([]byte(tag), serializedMsg...), + enqueued: time.Now(), + peerEnqueued: time.Now()}: + case <-wp.closing: + e = fmt.Errorf("peer closing %s", wp.conn.RemoteAddr().String()) + return + case <-ctx.Done(): + return resp, ctx.Err() + } + + // wait for the channel. + select { + case resp = <-responseChannel: + return resp, nil + case <-wp.closing: + e = fmt.Errorf("peer closing %s", wp.conn.RemoteAddr().String()) + return + case <-ctx.Done(): + return resp, ctx.Err() + } +} + +func (wp *wsPeer) makeResponseChannel(key uint64) (responseChannel chan *Response) { + newChan := make(chan *Response, 1) + wp.responseChannelsMutex.Lock() + defer wp.responseChannelsMutex.Unlock() + wp.responseChannels[key] = newChan + return newChan +} + +// getAndRemoveResponseChannel returns the channel and deletes the channel from the map +func (wp *wsPeer) getAndRemoveResponseChannel(key uint64) (respChan chan *Response, found bool) { + wp.responseChannelsMutex.Lock() + defer wp.responseChannelsMutex.Unlock() + respChan, found = wp.responseChannels[key] + delete(wp.responseChannels, key) + + return +} diff --git a/network/wsPeer_test.go b/network/wsPeer_test.go index 8524412a7e..f6acda7138 100644 --- a/network/wsPeer_test.go +++ b/network/wsPeer_test.go @@ -17,6 +17,7 @@ package network import ( + "encoding/binary" "testing" "time" @@ -37,3 +38,42 @@ func TestCheckSlowWritingPeer(t *testing.T) { require.Equal(t, peer.CheckSlowWritingPeer(now), true) } + +// TestGetRequestNonce tests if unique values are generated each time +func TestGetRequestNonce(t *testing.T) { + numValues := 1000 + peer := wsPeer{} + valueChannel := make(chan uint64, numValues) + for x := 0; x < numValues; x++ { + go func() { + ans := peer.getRequestNonce() + val, _ := binary.Uvarint(ans) + valueChannel <- val + }() + } + + // Timeout + maxWait := time.After(2 * time.Second) + + // check if all the values are unique + seenValue := make([]bool, numValues+1) + for x := 0; x < numValues; x++ { + select { + case val := <-valueChannel: + require.Equal(t, false, seenValue[val]) + seenValue[val] = true + case <-maxWait: + break + } + } + // Check if all the values were generated + for x := 1; x <= numValues; x++ { + require.Equal(t, true, seenValue[x]) + } +} + +func TestDefaultMessageTagsLength(t *testing.T) { + for tag := range defaultSendMessageTags { + require.Equal(t, 2, len(tag)) + } +} diff --git a/node/impls.go b/node/impls.go index 92176bf68c..1310c63408 100644 --- a/node/impls.go +++ b/node/impls.go @@ -31,6 +31,7 @@ import ( "github.com/algorand/go-algorand/ledger" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/logging/telemetryspec" + "github.com/algorand/go-algorand/network" "github.com/algorand/go-algorand/util/execpool" ) @@ -93,7 +94,7 @@ func (i *blockFactoryImpl) AssembleBlock(round basics.Round, deadline time.Time) newEmptyBlk := bookkeeping.MakeBlock(prev) - eval, err := i.l.StartEvaluator(newEmptyBlk.BlockHeader, i.tp, i.verificationPool) + eval, err := i.l.StartEvaluator(newEmptyBlk.BlockHeader) if err != nil { return nil, fmt.Errorf("could not make proposals at round %d: could not start evaluator: %v", round, err) } @@ -142,28 +143,38 @@ func (vb validatedBlock) Block() bookkeeping.Block { type agreementLedger struct { *data.Ledger UnmatchedPendingCertificates chan catchup.PendingUnmatchedCertificate + n network.GossipNode } -func makeAgreementLedger(ledger *data.Ledger) agreementLedger { +func makeAgreementLedger(ledger *data.Ledger, net network.GossipNode) agreementLedger { return agreementLedger{ Ledger: ledger, UnmatchedPendingCertificates: make(chan catchup.PendingUnmatchedCertificate, 1), + n: net, } } // EnsureBlock implements agreement.LedgerWriter.EnsureBlock. func (l agreementLedger) EnsureBlock(e bookkeeping.Block, c agreement.Certificate) { l.Ledger.EnsureBlock(&e, c) + // let the network know that we've made some progress. + l.n.OnNetworkAdvance() } // EnsureValidatedBlock implements agreement.LedgerWriter.EnsureValidatedBlock. func (l agreementLedger) EnsureValidatedBlock(ve agreement.ValidatedBlock, c agreement.Certificate) { l.Ledger.EnsureValidatedBlock(ve.(validatedBlock).vb, c) + // let the network know that we've made some progress. + l.n.OnNetworkAdvance() } // EnsureDigest implements agreement.LedgerWriter.EnsureDigest. -func (l agreementLedger) EnsureDigest(cert agreement.Certificate, quit chan struct{}, verifier *agreement.AsyncVoteVerifier) { - certRoundReachedCh := l.Wait(cert.Round) +func (l agreementLedger) EnsureDigest(cert agreement.Certificate, verifier *agreement.AsyncVoteVerifier) { + // let the network know that we've made some progress. + // this might be controverasl since we haven't received the entire block, but we did get the + // certificate, which means that network connections are likely to be just fine. + l.n.OnNetworkAdvance() + // clear out the pending certificates ( if any ) select { case pendingCert := <-l.UnmatchedPendingCertificates: @@ -171,35 +182,10 @@ func (l agreementLedger) EnsureDigest(cert agreement.Certificate, quit chan stru default: } - // if the quit channel is closed, we want to exit here before placing the request on the UnmatchedPendingCertificates - // channel. - select { - case <-quit: - logging.Base().Debugf("EnsureDigest was asked to quit before we enqueue the certificate request") - return - default: - } - // The channel send to UnmatchedPendingCertificates is guaranteed to be non-blocking since due to the fact that - // 1. the channel capacity is 1 // 2. we just cleared a single item off this channel ( if there was any ) // 3. the EnsureDigest method is being called with the agreeement service guarantee // 4. no other senders to this channel exists - // we want to have this as a select statement to check if we neeed to exit before enqueueing the task to the catchup service. l.UnmatchedPendingCertificates <- catchup.PendingUnmatchedCertificate{Cert: cert, VoteVerifier: verifier} - - defer func() { - // clear out the content of the UnmatchedPendingCertificates channel if we somehow managed to get this round aquired by a different method ( i.e. regular catchup ) - select { - case <-l.UnmatchedPendingCertificates: - default: - } - }() - - select { - case <-quit: - logging.Base().Debugf("EnsureDigest was asked to quit before we could acquire the block") - case <-certRoundReachedCh: - // great! we've reached the desired round. - } } diff --git a/node/msgp_gen.go b/node/msgp_gen.go new file mode 100644 index 0000000000..7257a3e397 --- /dev/null +++ b/node/msgp_gen.go @@ -0,0 +1,413 @@ +package node + +// Code generated by github.com/algorand/msgp DO NOT EDIT. + +import ( + "github.com/algorand/msgp/msgp" +) + +// MarshalMsg implements msgp.Marshaler +func (z *netPrioResponse) MarshalMsg(b []byte) (o []byte, err error) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0001Len := uint32(1) + var zb0001Mask uint8 /* 2 bits */ + if (*z).Nonce == "" { + zb0001Len-- + zb0001Mask |= 0x1 + } + // variable map header, size zb0001Len + o = append(o, 0x80|uint8(zb0001Len)) + if zb0001Len != 0 { + if (zb0001Mask & 0x1) == 0 { // if not empty + // string "Nonce" + o = append(o, 0xa5, 0x4e, 0x6f, 0x6e, 0x63, 0x65) + o = msgp.AppendString(o, (*z).Nonce) + } + } + return +} + +func (_ *netPrioResponse) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*netPrioResponse) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *netPrioResponse) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0001 int + var zb0002 bool + zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0001 > 0 { + zb0001-- + (*z).Nonce, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Nonce") + return + } + } + if zb0001 > 0 { + err = msgp.ErrTooManyArrayFields(zb0001) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 { + (*z) = netPrioResponse{} + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "Nonce": + (*z).Nonce, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Nonce") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *netPrioResponse) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*netPrioResponse) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *netPrioResponse) Msgsize() (s int) { + s = 1 + 6 + msgp.StringPrefixSize + len((*z).Nonce) + return +} + +// MsgIsZero returns whether this is a zero value +func (z *netPrioResponse) MsgIsZero() bool { + return ((*z).Nonce == "") +} + +// MarshalMsg implements msgp.Marshaler +func (z *netPrioResponseSigned) MarshalMsg(b []byte) (o []byte, err error) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0001Len := uint32(4) + var zb0001Mask uint8 /* 5 bits */ + if (*z).Response.Nonce == "" { + zb0001Len-- + zb0001Mask |= 0x1 + } + if (*z).Round.MsgIsZero() { + zb0001Len-- + zb0001Mask |= 0x2 + } + if (*z).Sender.MsgIsZero() { + zb0001Len-- + zb0001Mask |= 0x4 + } + if (*z).Sig.MsgIsZero() { + zb0001Len-- + zb0001Mask |= 0x8 + } + // variable map header, size zb0001Len + o = append(o, 0x80|uint8(zb0001Len)) + if zb0001Len != 0 { + if (zb0001Mask & 0x1) == 0 { // if not empty + // string "Response" + o = append(o, 0xa8, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65) + // omitempty: check for empty values + zb0002Len := uint32(1) + var zb0002Mask uint8 /* 2 bits */ + if (*z).Response.Nonce == "" { + zb0002Len-- + zb0002Mask |= 0x1 + } + // variable map header, size zb0002Len + o = append(o, 0x80|uint8(zb0002Len)) + if (zb0002Mask & 0x1) == 0 { // if not empty + // string "Nonce" + o = append(o, 0xa5, 0x4e, 0x6f, 0x6e, 0x63, 0x65) + o = msgp.AppendString(o, (*z).Response.Nonce) + } + } + if (zb0001Mask & 0x2) == 0 { // if not empty + // string "Round" + o = append(o, 0xa5, 0x52, 0x6f, 0x75, 0x6e, 0x64) + o, err = (*z).Round.MarshalMsg(o) + if err != nil { + err = msgp.WrapError(err, "Round") + return + } + } + if (zb0001Mask & 0x4) == 0 { // if not empty + // string "Sender" + o = append(o, 0xa6, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72) + o, err = (*z).Sender.MarshalMsg(o) + if err != nil { + err = msgp.WrapError(err, "Sender") + return + } + } + if (zb0001Mask & 0x8) == 0 { // if not empty + // string "Sig" + o = append(o, 0xa3, 0x53, 0x69, 0x67) + o, err = (*z).Sig.MarshalMsg(o) + if err != nil { + err = msgp.WrapError(err, "Sig") + return + } + } + } + return +} + +func (_ *netPrioResponseSigned) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*netPrioResponseSigned) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *netPrioResponseSigned) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0001 int + var zb0002 bool + zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0001 > 0 { + zb0001-- + var zb0003 int + var zb0004 bool + zb0003, zb0004, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0003, zb0004, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Response") + return + } + if zb0003 > 0 { + zb0003-- + (*z).Response.Nonce, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Response", "struct-from-array", "Nonce") + return + } + } + if zb0003 > 0 { + err = msgp.ErrTooManyArrayFields(zb0003) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Response", "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Response") + return + } + if zb0004 { + (*z).Response = netPrioResponse{} + } + for zb0003 > 0 { + zb0003-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Response") + return + } + switch string(field) { + case "Nonce": + (*z).Response.Nonce, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Response", "Nonce") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Response") + return + } + } + } + } + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).Round.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Round") + return + } + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).Sender.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Sender") + return + } + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).Sig.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Sig") + return + } + } + if zb0001 > 0 { + err = msgp.ErrTooManyArrayFields(zb0001) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 { + (*z) = netPrioResponseSigned{} + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "Response": + var zb0005 int + var zb0006 bool + zb0005, zb0006, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0005, zb0006, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Response") + return + } + if zb0005 > 0 { + zb0005-- + (*z).Response.Nonce, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Response", "struct-from-array", "Nonce") + return + } + } + if zb0005 > 0 { + err = msgp.ErrTooManyArrayFields(zb0005) + if err != nil { + err = msgp.WrapError(err, "Response", "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err, "Response") + return + } + if zb0006 { + (*z).Response = netPrioResponse{} + } + for zb0005 > 0 { + zb0005-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err, "Response") + return + } + switch string(field) { + case "Nonce": + (*z).Response.Nonce, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Response", "Nonce") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err, "Response") + return + } + } + } + } + case "Round": + bts, err = (*z).Round.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Round") + return + } + case "Sender": + bts, err = (*z).Sender.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sender") + return + } + case "Sig": + bts, err = (*z).Sig.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sig") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *netPrioResponseSigned) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*netPrioResponseSigned) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *netPrioResponseSigned) Msgsize() (s int) { + s = 1 + 9 + 1 + 6 + msgp.StringPrefixSize + len((*z).Response.Nonce) + 6 + (*z).Round.Msgsize() + 7 + (*z).Sender.Msgsize() + 4 + (*z).Sig.Msgsize() + return +} + +// MsgIsZero returns whether this is a zero value +func (z *netPrioResponseSigned) MsgIsZero() bool { + return ((*z).Response.Nonce == "") && ((*z).Round.MsgIsZero()) && ((*z).Sender.MsgIsZero()) && ((*z).Sig.MsgIsZero()) +} diff --git a/node/msgp_gen_test.go b/node/msgp_gen_test.go new file mode 100644 index 0000000000..170a47393a --- /dev/null +++ b/node/msgp_gen_test.go @@ -0,0 +1,134 @@ +package node + +// Code generated by github.com/algorand/msgp DO NOT EDIT. + +import ( + "testing" + + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/msgp/msgp" +) + +func TestMarshalUnmarshalnetPrioResponse(t *testing.T) { + v := netPrioResponse{} + bts, err := v.MarshalMsg(nil) + if err != nil { + t.Fatal(err) + } + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingnetPrioResponse(t *testing.T) { + protocol.RunEncodingTest(t, &netPrioResponse{}) +} + +func BenchmarkMarshalMsgnetPrioResponse(b *testing.B) { + v := netPrioResponse{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgnetPrioResponse(b *testing.B) { + v := netPrioResponse{} + bts := make([]byte, 0, v.Msgsize()) + bts, _ = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts, _ = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalnetPrioResponse(b *testing.B) { + v := netPrioResponse{} + bts, _ := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalnetPrioResponseSigned(t *testing.T) { + v := netPrioResponseSigned{} + bts, err := v.MarshalMsg(nil) + if err != nil { + t.Fatal(err) + } + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingnetPrioResponseSigned(t *testing.T) { + protocol.RunEncodingTest(t, &netPrioResponseSigned{}) +} + +func BenchmarkMarshalMsgnetPrioResponseSigned(b *testing.B) { + v := netPrioResponseSigned{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgnetPrioResponseSigned(b *testing.B) { + v := netPrioResponseSigned{} + bts := make([]byte, 0, v.Msgsize()) + bts, _ = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts, _ = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalnetPrioResponseSigned(b *testing.B) { + v := netPrioResponseSigned{} + bts, _ := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} diff --git a/node/netprio.go b/node/netprio.go index dc6a4466da..57913e6422 100644 --- a/node/netprio.go +++ b/node/netprio.go @@ -27,10 +27,14 @@ import ( ) type netPrioResponse struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + Nonce string } type netPrioResponseSigned struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + Response netPrioResponse Round basics.Round Sender basics.Address @@ -38,7 +42,7 @@ type netPrioResponseSigned struct { } func (npr netPrioResponse) ToBeHashed() (protocol.HashID, []byte) { - return protocol.NetPrioResponse, protocol.Encode(npr) + return protocol.NetPrioResponse, protocol.Encode(&npr) } // NewPrioChallenge implements the network.NetPrioScheme interface @@ -104,7 +108,7 @@ func (node *AlgorandFullNode) MakePrioResponse(challenge string) []byte { rs.Sender = maxPart.Address() rs.Sig = signer.Sign(ephID, rs.Response) - return protocol.Encode(rs) + return protocol.Encode(&rs) } // VerifyPrioResponse implements the network.NetPrioScheme interface diff --git a/node/node.go b/node/node.go index 8b7bbd2a20..45041e8e40 100644 --- a/node/node.go +++ b/node/node.go @@ -84,9 +84,8 @@ type AlgorandFullNode struct { cancelCtx context.CancelFunc config config.Local - ledger *data.Ledger - net network.GossipNode - phonebook *network.ThreadsafePhonebook + ledger *data.Ledger + net network.GossipNode transactionPool *pools.TransactionPool txHandler *data.TxHandler @@ -140,7 +139,7 @@ type TxnWithStatus struct { // MakeFull sets up an Algorand full node // (i.e., it returns a node that participates in consensus) -func MakeFull(log logging.Logger, rootDir string, cfg config.Local, phonebookDir string, genesis bookkeeping.Genesis) (*AlgorandFullNode, error) { +func MakeFull(log logging.Logger, rootDir string, cfg config.Local, phonebookAddresses []string, genesis bookkeeping.Genesis) (*AlgorandFullNode, error) { node := new(AlgorandFullNode) node.rootDir = rootDir @@ -148,16 +147,9 @@ func MakeFull(log logging.Logger, rootDir string, cfg config.Local, phonebookDir node.log = log.With("name", cfg.NetAddress) node.genesisID = genesis.ID() node.genesisHash = crypto.HashObj(genesis) - node.phonebook = network.MakeThreadsafePhonebook() - - addrs, err := config.LoadPhonebook(phonebookDir) - if err != nil { - log.Debugf("Cannot load static phonebook: %v", err) - } - node.phonebook.ReplacePeerList(addrs) // tie network, block fetcher, and agreement services together - p2pNode, err := network.NewWebsocketNetwork(node.log, node.config, node.phonebook, genesis.ID(), genesis.Network) + p2pNode, err := network.NewWebsocketNetwork(node.log, node.config, phonebookAddresses, genesis.ID(), genesis.Network) if err != nil { log.Errorf("could not create websocket node: %v", err) return nil, err @@ -230,7 +222,7 @@ func MakeFull(log logging.Logger, rootDir string, cfg config.Local, phonebookDir blockFactory := makeBlockFactory(node.ledger, node.transactionPool, node.config.EnableProcessBlockStats, node.highPriorityCryptoVerificationPool) blockValidator := blockValidatorImpl{l: node.ledger, tp: node.transactionPool, verificationPool: node.highPriorityCryptoVerificationPool} - agreementLedger := makeAgreementLedger(node.ledger) + agreementLedger := makeAgreementLedger(node.ledger, node.net) agreementParameters := agreement.Parameters{ Logger: log, @@ -418,7 +410,7 @@ func (node *AlgorandFullNode) BroadcastSignedTxGroup(txgroup []transactions.Sign var enc []byte var txids []transactions.Txid for _, tx := range txgroup { - enc = append(enc, protocol.Encode(tx)...) + enc = append(enc, protocol.Encode(&tx)...) txids = append(txids, tx.ID()) } err = node.net.Broadcast(context.TODO(), protocol.TxnTag, enc, true, nil) @@ -592,16 +584,6 @@ func (node *AlgorandFullNode) PoolStats() PoolStats { } } -// ExtendPeerList dynamically adds a peer to a node's peer list. -func (node *AlgorandFullNode) ExtendPeerList(peers ...string) { - node.phonebook.ExtendPeerList(peers) -} - -// ReplacePeerList replaces the current peer list with a different one -func (node *AlgorandFullNode) ReplacePeerList(peers ...string) { - node.phonebook.ReplacePeerList(peers) -} - // SuggestedFee returns the suggested fee per byte recommended to ensure a new transaction is processed in a timely fashion. // Caller should set fee to max(MinTxnFee, SuggestedFee() * len(encoded SignedTxn)) func (node *AlgorandFullNode) SuggestedFee() basics.MicroAlgos { diff --git a/node/node_test.go b/node/node_test.go index d4ede125a4..922e89d547 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -55,7 +55,7 @@ var defaultConfig = config.Local{ IncomingConnectionsLimit: -1, } -func setupFullNodes(t *testing.T, proto protocol.ConsensusVersion, verificationPool execpool.BacklogPool) ([]*AlgorandFullNode, []string, []string) { +func setupFullNodes(t *testing.T, proto protocol.ConsensusVersion, verificationPool execpool.BacklogPool, customConsensus config.ConsensusProtocols) ([]*AlgorandFullNode, []string, []string) { util.RaiseRlimit(1000) f, _ := os.Create(t.Name() + ".log") logging.Base().SetJSONFormatter() @@ -84,9 +84,11 @@ func setupFullNodes(t *testing.T, proto protocol.ConsensusVersion, verificationP // because we explicitly generated the sqlite database above (in // installFullNode). g := bookkeeping.Genesis{ - SchemaID: "go-test-node-genesis", - Proto: proto, - Network: config.Devtestnet, + SchemaID: "go-test-node-genesis", + Proto: proto, + Network: config.Devtestnet, + FeeSink: sinkAddr.String(), + RewardsPool: poolAddr.String(), } for i := range wallets { @@ -115,6 +117,7 @@ func setupFullNodes(t *testing.T, proto protocol.ConsensusVersion, verificationP panic(err) } root, err := account.GenerateRoot(access) + access.Close() if err != nil { panic(err) } @@ -125,6 +128,7 @@ func setupFullNodes(t *testing.T, proto protocol.ConsensusVersion, verificationP panic(err) } part, err := account.FillDBWithParticipationKeys(access, root.Address(), firstRound, lastRound, config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution) + access.Close() if err != nil { panic(err) } @@ -144,6 +148,12 @@ func setupFullNodes(t *testing.T, proto protocol.ConsensusVersion, verificationP for i, rootDirectory := range rootDirs { genesisDir := filepath.Join(rootDirectory, g.ID()) ledgerFilenamePrefix := filepath.Join(genesisDir, config.LedgerFilenamePrefix) + if customConsensus != nil { + err := config.SaveConfigurableConsensus(genesisDir, customConsensus) + require.Nil(t, err) + } + err1 := config.LoadConfigurableConsensusProtocols(genesisDir) + require.Nil(t, err1) nodeID := fmt.Sprintf("Node%d", i) const inMem = false const archival = true @@ -156,7 +166,7 @@ func setupFullNodes(t *testing.T, proto protocol.ConsensusVersion, verificationP cfg, err := config.LoadConfigFromDisk(rootDirectory) require.NoError(t, err) - node, err := MakeFull(logging.Base().With("source", t.Name()+strconv.Itoa(i)), rootDirectory, cfg, "", g) + node, err := MakeFull(logging.Base().With("source", t.Name()+strconv.Itoa(i)), rootDirectory, cfg, []string{}, g) nodes[i] = node require.NoError(t, err) } @@ -170,7 +180,7 @@ func TestSyncingFullNode(t *testing.T) { backlogPool := execpool.MakeBacklog(nil, 0, execpool.LowPriority, nil) defer backlogPool.Shutdown() - nodes, wallets, rootDirs := setupFullNodes(t, protocol.ConsensusCurrentVersion, backlogPool) + nodes, wallets, rootDirs := setupFullNodes(t, protocol.ConsensusCurrentVersion, backlogPool, nil) for i := 0; i < len(nodes); i++ { defer os.Remove(wallets[i]) defer os.RemoveAll(rootDirs[i]) @@ -227,7 +237,7 @@ func TestInitialSync(t *testing.T) { backlogPool := execpool.MakeBacklog(nil, 0, execpool.LowPriority, nil) defer backlogPool.Shutdown() - nodes, wallets, rootdirs := setupFullNodes(t, protocol.ConsensusCurrentVersion, backlogPool) + nodes, wallets, rootdirs := setupFullNodes(t, protocol.ConsensusCurrentVersion, backlogPool, nil) for i := 0; i < len(nodes); i++ { defer os.Remove(wallets[i]) defer os.RemoveAll(rootdirs[i]) @@ -255,12 +265,46 @@ func TestInitialSync(t *testing.T) { } func TestSimpleUpgrade(t *testing.T) { - t.Skip("Randomly failing: node_test.go:~283 : no block notification for account. Re-enable after agreement bug-fix pass") + t.Skip("Randomly failing: node_test.go:~330 : no block notification for account. Re-enable after agreement bug-fix pass") backlogPool := execpool.MakeBacklog(nil, 0, execpool.LowPriority, nil) defer backlogPool.Shutdown() - nodes, wallets, rootDirs := setupFullNodes(t, protocol.ConsensusTest0, backlogPool) + // ConsensusTest0 is a version of ConsensusV0 used for testing + // (it has different approved upgrade paths). + const consensusTest0 = protocol.ConsensusVersion("test0") + + // ConsensusTest1 is an extension of ConsensusTest0 that + // supports a sorted-list balance commitment. + const consensusTest1 = protocol.ConsensusVersion("test1") + + configurableConsensus := make(config.ConsensusProtocols) + + testParams0 := config.Consensus[protocol.ConsensusCurrentVersion] + testParams0.SupportGenesisHash = false + testParams0.UpgradeVoteRounds = 2 + testParams0.UpgradeThreshold = 1 + testParams0.DefaultUpgradeWaitRounds = 2 + testParams0.MaxVersionStringLen = 64 + testParams0.MaxTxnBytesPerBlock = 1000000 + testParams0.DefaultKeyDilution = 10000 + testParams0.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{ + consensusTest1: 0, + } + configurableConsensus[consensusTest0] = testParams0 + + testParams1 := config.Consensus[protocol.ConsensusCurrentVersion] + testParams1.SupportGenesisHash = false + testParams1.UpgradeVoteRounds = 10 + testParams1.UpgradeThreshold = 8 + testParams1.DefaultUpgradeWaitRounds = 10 + testParams1.MaxVersionStringLen = 64 + testParams1.MaxTxnBytesPerBlock = 1000000 + testParams1.DefaultKeyDilution = 10000 + testParams1.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + configurableConsensus[consensusTest1] = testParams1 + + nodes, wallets, rootDirs := setupFullNodes(t, consensusTest0, backlogPool, configurableConsensus) for i := 0; i < len(nodes); i++ { defer os.Remove(wallets[i]) defer os.RemoveAll(rootDirs[i]) @@ -301,7 +345,7 @@ func TestSimpleUpgrade(t *testing.T) { roundsCheckedForUpgrade++ for i := range wallets { - require.Equal(t, protocol.ConsensusTest0, blocks[i].CurrentProtocol) + require.Equal(t, consensusTest0, blocks[i].CurrentProtocol) } } @@ -310,7 +354,7 @@ func TestSimpleUpgrade(t *testing.T) { roundsCheckedForUpgrade++ for i := range wallets { - require.Equal(t, protocol.ConsensusTest1, blocks[i].CurrentProtocol) + require.Equal(t, consensusTest1, blocks[i].CurrentProtocol) } } } @@ -347,7 +391,7 @@ func connectPeers(nodes []*AlgorandFullNode) { } for _, node := range nodes { - node.ExtendPeerList(neighbors...) + // node.ExtendPeerList(neighbors...) node.net.RequestConnectOutgoing(false, nil) } } @@ -362,9 +406,9 @@ func delayStartNode(node *AlgorandFullNode, peers []*AlgorandFullNode, delay tim }() wg.Wait() - node0Addr := node.config.NetAddress + // node0Addr := node.config.NetAddress for _, peer := range peers { - peer.ExtendPeerList(node0Addr) + // peer.ExtendPeerList(node0Addr) peer.net.RequestConnectOutgoing(false, nil) } } diff --git a/nodecontrol/algodControl.go b/nodecontrol/algodControl.go index 7563b95c92..53f6ebf0de 100644 --- a/nodecontrol/algodControl.go +++ b/nodecontrol/algodControl.go @@ -375,3 +375,14 @@ func (nc NodeController) readGenesisJSON(genesisFile string) (genesisLedger book err = protocol.DecodeJSON(genesisText, &genesisLedger) return } + +// SetConsensus applies a new consensus settings which would get deployed before +// any of the nodes starts +func (nc NodeController) SetConsensus(consensus config.ConsensusProtocols) error { + return config.SaveConfigurableConsensus(nc.algodDataDir, consensus) +} + +// GetConsensus rebuild the consensus version from the data directroy +func (nc NodeController) GetConsensus() (config.ConsensusProtocols, error) { + return config.PreloadConfigurableConsensusProtocols(nc.algodDataDir) +} diff --git a/protocol/codec.go b/protocol/codec.go index 6407e07db3..1a6549fb88 100644 --- a/protocol/codec.go +++ b/protocol/codec.go @@ -19,6 +19,7 @@ package protocol import ( "fmt" "io" + "os" "sync" "github.com/algorand/go-codec/codec" @@ -109,31 +110,15 @@ func EncodeMsgp(obj msgp.Marshaler) []byte { } // Encode returns a msgpack-encoded byte buffer for a given object. -func Encode(obj interface{}) []byte { - msgp, ok := obj.(msgp.Marshaler) - if ok && msgp.CanMarshalMsg(msgp) { - return EncodeMsgp(msgp) +func Encode(obj msgp.Marshaler) []byte { + if obj.CanMarshalMsg(obj) { + return EncodeMsgp(obj) } - return EncodeReflect(obj) -} -// CountingWriter is an implementation of io.Writer that tracks the number -// of bytes written (but discards the actual bytes). -type CountingWriter struct { - N int -} - -func (cw *CountingWriter) Write(b []byte) (int, error) { - blen := len(b) - cw.N += blen - return blen, nil -} - -// EncodeLen returns len(Encode(obj)) -func EncodeLen(obj interface{}) int { - var cw CountingWriter - EncodeStream(&cw, obj) - return cw.N + // Use fmt instead of logging to avoid import loops; + // the expectation is that this should never happen. + fmt.Fprintf(os.Stderr, "Encoding %T using go-codec; stray embedded field?\n", obj) + return EncodeReflect(obj) } // EncodeStream is like Encode but writes to an io.Writer instead. @@ -190,11 +175,15 @@ func DecodeMsgp(b []byte, objptr msgp.Unmarshaler) (err error) { // Decode attempts to decode a msgpack-encoded byte buffer // into an object instance pointed to by objptr. -func Decode(b []byte, objptr interface{}) error { - msgp, ok := objptr.(msgp.Unmarshaler) - if ok && msgp.CanUnmarshalMsg(msgp) { - return DecodeMsgp(b, msgp) +func Decode(b []byte, objptr msgp.Unmarshaler) error { + if objptr.CanUnmarshalMsg(objptr) { + return DecodeMsgp(b, objptr) } + + // Use fmt instead of logging to avoid import loops; + // the expectation is that this should never happen. + fmt.Fprintf(os.Stderr, "Decoding %T using go-codec; stray embedded field?\n", objptr) + return DecodeReflect(b, objptr) } diff --git a/protocol/codec_test.go b/protocol/codec_test.go index 4058f95212..d8c7bc4642 100644 --- a/protocol/codec_test.go +++ b/protocol/codec_test.go @@ -53,7 +53,7 @@ type HelperStruct2 struct { func TestOmitEmpty(t *testing.T) { var x TestStruct - enc := Encode(&x) + enc := EncodeReflect(&x) require.Equal(t, 1, len(enc)) } @@ -72,7 +72,7 @@ func TestEncodeOrder(t *testing.T) { b.A = 1 b.B = "foo" - require.Equal(t, Encode(&a), Encode(&b)) + require.Equal(t, EncodeReflect(&a), EncodeReflect(&b)) var c struct { A int `codec:"x"` @@ -102,8 +102,8 @@ func TestEncodeOrder(t *testing.T) { e.R = 1 e.Q = "foo" - require.Equal(t, Encode(&c), Encode(&d)) - require.Equal(t, Encode(&c), Encode(&e)) + require.Equal(t, EncodeReflect(&c), EncodeReflect(&d)) + require.Equal(t, EncodeReflect(&c), EncodeReflect(&e)) } type InlineChild struct { @@ -118,5 +118,26 @@ func TestEncodeInline(t *testing.T) { a := InlineChild{X: 5} b := InlineParent{InlineChild: a} - require.Equal(t, Encode(a), Encode(b)) + require.Equal(t, EncodeReflect(a), EncodeReflect(b)) +} + +type embeddedMsgp struct { + TxType + A uint64 +} + +func TestEncodeEmbedded(t *testing.T) { + var x embeddedMsgp + + x.TxType = PaymentTx + x.A = 5 + + require.Equal(t, Encode(x), Encode(&x)) + require.Equal(t, Encode(x.TxType), Encode(&x.TxType)) + require.NotEqual(t, Encode(&x), Encode(&x.TxType)) + + var y embeddedMsgp + + require.NoError(t, Decode(Encode(&x), &y)) + require.Equal(t, x, y) } diff --git a/protocol/consensus.go b/protocol/consensus.go index 38d9a3da2d..8b8d26467a 100644 --- a/protocol/consensus.go +++ b/protocol/consensus.go @@ -113,6 +113,11 @@ const ConsensusV20 = ConsensusVersion( "https://github.com/algorandfoundation/specs/tree/4a9db6a25595c6fd097cf9cc137cc83027787eaa", ) +// ConsensusV21 fixes a bug in credential.lowestOutput +const ConsensusV21 = ConsensusVersion( + "https://github.com/algorandfoundation/specs/tree/8096e2df2da75c3339986317f9abe69d4fa86b4b", +) + // ConsensusFuture is a protocol that should not appear in any production // network, but is used to test features before they are released. const ConsensusFuture = ConsensusVersion( @@ -125,46 +130,7 @@ const ConsensusFuture = ConsensusVersion( // ConsensusCurrentVersion is the latest version and should be used // when a specific version is not provided. -const ConsensusCurrentVersion = ConsensusV20 - -// ConsensusTest0 is a version of ConsensusV0 used for testing -// (it has different approved upgrade paths). -const ConsensusTest0 = ConsensusVersion("test0") - -// ConsensusTest1 is an extension of ConsensusTest0 that -// supports a sorted-list balance commitment. -const ConsensusTest1 = ConsensusVersion("test1") - -// ConsensusTestBigBlocks is a version of ConsensusV0 used for testing -// with big block size (large MaxTxnBytesPerBlock). -// at the time versioning was introduced. -const ConsensusTestBigBlocks = ConsensusVersion("test-big-blocks") - -// ConsensusTestRapidRewardRecalculation is a version of ConsensusCurrentVersion -// that decreases the RewardRecalculationInterval greatly. -const ConsensusTestRapidRewardRecalculation = ConsensusVersion("test-fast-reward-recalculation") - -// ConsensusTestShorterLookback is a version of ConsensusCurrentVersion -// that decreases the MaxBalLookback greatly. -const ConsensusTestShorterLookback = ConsensusVersion("test-shorter-lookback") - -// ConsensusTestUnupgradedProtocol is a version of ConsensusCurrentVersion -// that allows the control of the upgrade from ConsensusTestUnupgradedProtocol to -// ConsensusTestUnupgradedProtocol -const ConsensusTestUnupgradedProtocol = ConsensusVersion("test-unupgraded-protocol") - -// ConsensusTestUnupgradedToProtocol is a version of ConsensusCurrentVersion -// It is used as an upgrade from ConsensusTestUnupgradedProtocol -const ConsensusTestUnupgradedToProtocol = ConsensusVersion("test-unupgradedto-protocol") - - -// ConsensusTestFastUpgrade is meant for testing of protocol upgrades: -// during testing, it is equivalent to another protocol with the exception -// of the upgrade parameters, which allow for upgrades to take place after -// only a few rounds. -func ConsensusTestFastUpgrade(proto ConsensusVersion) ConsensusVersion { - return "test-fast-upgrade-" + proto -} +const ConsensusCurrentVersion = ConsensusV21 // Error is used to indicate that an unsupported protocol has been detected. type Error ConsensusVersion diff --git a/protocol/encodebench_test.go b/protocol/encodebench_test.go index 06b542b86b..5eff5235b5 100644 --- a/protocol/encodebench_test.go +++ b/protocol/encodebench_test.go @@ -40,12 +40,6 @@ func BenchmarkCodecEncoder(b *testing.B) { } }) - b.Run("NilLen", func(b *testing.B) { - for i := 0; i < b.N; i++ { - EncodeLen(nil) - } - }) - b.Run("NilReset", func(b *testing.B) { enc := codec.NewEncoderBytes(nil, CodecHandle) for i := 0; i < b.N; i++ { @@ -64,41 +58,9 @@ func BenchmarkCodecEncoder(b *testing.B) { } }) - b.Run("NilCount", func(b *testing.B) { - for i := 0; i < b.N; i++ { - var n CountingWriter - enc := codec.NewEncoder(&n, CodecHandle) - enc.MustEncode(nil) - } - }) - - b.Run("NilCountReset", func(b *testing.B) { - enc := codec.NewEncoder(nil, CodecHandle) - var n CountingWriter - for i := 0; i < b.N; i++ { - enc.Reset(&n) - enc.MustEncode(nil) - } - }) - b.Run("Encode", func(b *testing.B) { for i := 0; i < b.N; i++ { - Encode(s) - } - }) - - b.Run("EncodeStream", func(b *testing.B) { - var n CountingWriter - for i := 0; i < b.N; i++ { - EncodeStream(&n, s) - } - }) - - b.Run("EncodeStreamReuse", func(b *testing.B) { - var n CountingWriter - enc := codec.NewEncoder(&n, CodecHandle) - for i := 0; i < b.N; i++ { - enc.MustEncode(s) + EncodeReflect(s) } }) } diff --git a/protocol/msgp_gen.go b/protocol/msgp_gen.go index 55f3a4aede..2961c4fc72 100644 --- a/protocol/msgp_gen.go +++ b/protocol/msgp_gen.go @@ -15,6 +15,9 @@ func (z ConsensusVersion) MarshalMsg(b []byte) (o []byte, err error) { func (_ ConsensusVersion) CanMarshalMsg(z interface{}) bool { _, ok := (z).(ConsensusVersion) + if !ok { + _, ok = (z).(*ConsensusVersion) + } return ok } @@ -58,6 +61,9 @@ func (z Error) MarshalMsg(b []byte) (o []byte, err error) { func (_ Error) CanMarshalMsg(z interface{}) bool { _, ok := (z).(Error) + if !ok { + _, ok = (z).(*Error) + } return ok } @@ -101,6 +107,9 @@ func (z HashID) MarshalMsg(b []byte) (o []byte, err error) { func (_ HashID) CanMarshalMsg(z interface{}) bool { _, ok := (z).(HashID) + if !ok { + _, ok = (z).(*HashID) + } return ok } @@ -144,6 +153,9 @@ func (z NetworkID) MarshalMsg(b []byte) (o []byte, err error) { func (_ NetworkID) CanMarshalMsg(z interface{}) bool { _, ok := (z).(NetworkID) + if !ok { + _, ok = (z).(*NetworkID) + } return ok } @@ -187,6 +199,9 @@ func (z Tag) MarshalMsg(b []byte) (o []byte, err error) { func (_ Tag) CanMarshalMsg(z interface{}) bool { _, ok := (z).(Tag) + if !ok { + _, ok = (z).(*Tag) + } return ok } @@ -230,6 +245,9 @@ func (z TxType) MarshalMsg(b []byte) (o []byte, err error) { func (_ TxType) CanMarshalMsg(z interface{}) bool { _, ok := (z).(TxType) + if !ok { + _, ok = (z).(*TxType) + } return ok } diff --git a/protocol/tags.go b/protocol/tags.go index 04ceee02aa..9fff2316a5 100644 --- a/protocol/tags.go +++ b/protocol/tags.go @@ -24,11 +24,13 @@ type Tag string const ( UnknownMsgTag Tag = "??" AgreementVoteTag Tag = "AV" - MsgSkipTag Tag = "MS" + MsgDigestSkipTag Tag = "MS" NetPrioResponseTag Tag = "NP" PingTag Tag = "pi" PingReplyTag Tag = "pj" ProposalPayloadTag Tag = "PP" + TopicMsgRespTag Tag = "TS" + MsgOfInterestTag Tag = "MI" TxnTag Tag = "TX" UniCatchupReqTag Tag = "UC" UniEnsBlockReqTag Tag = "UE" diff --git a/protocol/transcode/core_test.go b/protocol/transcode/core_test.go index 17ef93b63b..31e177c397 100644 --- a/protocol/transcode/core_test.go +++ b/protocol/transcode/core_test.go @@ -171,7 +171,7 @@ func TestIdempotence(t *testing.T) { for i := 0; i < niter; i++ { o := randomMap(6, 3) - testIdempotentRoundtrip(t, protocol.Encode(o)) + testIdempotentRoundtrip(t, protocol.EncodeReflect(o)) } } @@ -185,7 +185,7 @@ func TestIdempotenceMultiobject(t *testing.T) { nobj := crypto.RandUint64() % 8 buf := []byte{} for j := 0; j < int(nobj); j++ { - buf = append(buf, protocol.Encode(randomMap(6, 3))...) + buf = append(buf, protocol.EncodeReflect(randomMap(6, 3))...) } testIdempotentRoundtrip(t, buf) } @@ -240,6 +240,6 @@ func TestIdempotenceStruct(t *testing.T) { p.M[fmt.Sprintf("K%dK", crypto.RandUint64())] = fmt.Sprintf("V%dV", crypto.RandUint64()) } - testIdempotentRoundtrip(t, protocol.Encode(p)) + testIdempotentRoundtrip(t, protocol.EncodeReflect(&p)) } } diff --git a/release/release-banner.jpg b/release/release-banner.jpg new file mode 100644 index 0000000000..77c901d75a Binary files /dev/null and b/release/release-banner.jpg differ diff --git a/rpcs/fetcher_test.go b/rpcs/fetcher_test.go deleted file mode 100644 index 67766eb646..0000000000 --- a/rpcs/fetcher_test.go +++ /dev/null @@ -1,413 +0,0 @@ -// Copyright (C) 2019-2020 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package rpcs - -import ( - "context" - "errors" - "net/http" - "net/rpc" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/agreement" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/network" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/util/bloom" -) - -type MockRunner struct { - ran bool - done chan *rpc.Call - failWithNil bool - failWithError bool - txgroups [][]transactions.SignedTxn -} - -type MockRPCClient struct { - client *MockRunner - closed bool - rootURL string - log logging.Logger -} - -func (client *MockRPCClient) Close() error { - client.closed = true - return nil -} - -func (client *MockRPCClient) Address() string { - return "mock.address." -} -func (client *MockRPCClient) Sync(ctx context.Context, bloom *bloom.Filter) (txgroups [][]transactions.SignedTxn, err error) { - client.log.Info("MockRPCClient.Sync") - select { - case <-ctx.Done(): - return nil, errors.New("cancelled") - default: - } - if client.client.failWithNil { - return nil, errors.New("old failWithNil") - } - if client.client.failWithError { - return nil, errors.New("failing call") - } - return client.client.txgroups, nil -} -func (client *MockRPCClient) GetBlockBytes(ctx context.Context, r basics.Round) (data []byte, err error) { - return nil, nil -} - -// network.HTTPPeer interface -func (client *MockRPCClient) GetAddress() string { - return client.rootURL -} -func (client *MockRPCClient) GetHTTPClient() *http.Client { - return nil -} -func (client *MockRPCClient) PrepareURL(x string) string { - return strings.Replace(x, "{genesisID}", "test genesisID", -1) -} - -type MockClientAggregator struct { - peers []network.Peer - Registrar -} - -func (mca *MockClientAggregator) GetPeers(options ...network.PeerOption) []network.Peer { - return mca.peers -} - -const numberOfPeers = 10 - -func makeMockClientAggregator(t *testing.T, failWithNil bool, failWithError bool) *MockClientAggregator { - clients := make([]network.Peer, 0) - for i := 0; i < numberOfPeers; i++ { - runner := MockRunner{failWithNil: failWithNil, failWithError: failWithError, done: make(chan *rpc.Call)} - clients = append(clients, &MockRPCClient{client: &runner, log: logging.TestingLog(t)}) - } - t.Logf("len(mca.clients) = %d", len(clients)) - return &MockClientAggregator{peers: clients} -} - -func getAllClientsSelectedForRound(t *testing.T, fetcher *NetworkFetcher, round basics.Round) map[FetcherClient]basics.Round { - selected := make(map[FetcherClient]basics.Round, 0) - for i := 0; i < 1000; i++ { - c, err := fetcher.selectClient(round) - if err != nil { - return selected - } - selected[c.(FetcherClient)] = fetcher.roundUpperBound[c] - } - return selected -} - -func TestSelectValidRemote(t *testing.T) { - network := makeMockClientAggregator(t, false, false) - factory := MakeNetworkFetcherFactory(network, numberOfPeers, nil) - factory.log = logging.TestingLog(t) - fetcher := factory.New() - require.Equal(t, numberOfPeers, len(fetcher.(*NetworkFetcher).peers)) - - var oldClient FetcherClient - var newClient FetcherClient - i := 0 - for _, client := range fetcher.(*NetworkFetcher).peers { - if i == 0 { - oldClient = client - r := basics.Round(2) - fetcher.(*NetworkFetcher).roundUpperBound[client] = r - } else if i == 1 { - newClient = client - r := basics.Round(4) - fetcher.(*NetworkFetcher).roundUpperBound[client] = r - } else if i > 2 { - r := basics.Round(3) - fetcher.(*NetworkFetcher).roundUpperBound[client] = r - } // skip i == 2 - i++ - } - - require.Equal(t, numberOfPeers, len(fetcher.(*NetworkFetcher).availablePeers(1))) - selected := getAllClientsSelectedForRound(t, fetcher.(*NetworkFetcher), 1) - require.Equal(t, numberOfPeers, len(selected)) - _, hasOld := selected[oldClient] - require.True(t, hasOld) - - _, hasNew := selected[newClient] - require.True(t, hasNew) - - require.Equal(t, numberOfPeers-1, len(fetcher.(*NetworkFetcher).availablePeers(2))) - selected = getAllClientsSelectedForRound(t, fetcher.(*NetworkFetcher), 2) - require.Equal(t, numberOfPeers-1, len(selected)) - _, hasOld = selected[oldClient] - require.False(t, hasOld) - _, hasNew = selected[newClient] - require.True(t, hasNew) - - require.Equal(t, 2, len(fetcher.(*NetworkFetcher).availablePeers(3))) - selected = getAllClientsSelectedForRound(t, fetcher.(*NetworkFetcher), 3) - require.Equal(t, 2, len(selected)) - _, hasOld = selected[oldClient] - require.False(t, hasOld) - _, hasNew = selected[newClient] - require.True(t, hasNew) - - require.Equal(t, 1, len(fetcher.(*NetworkFetcher).availablePeers(4))) - selected = getAllClientsSelectedForRound(t, fetcher.(*NetworkFetcher), 4) - require.Equal(t, 1, len(selected)) - _, hasOld = selected[oldClient] - require.False(t, hasOld) - _, hasNew = selected[newClient] - require.False(t, hasNew) -} - -type dummyFetcher struct { - failWithNil bool - failWithError bool - fetchTimeout time.Duration -} - -// FetcherClient interface -func (df *dummyFetcher) GetBlockBytes(ctx context.Context, r basics.Round) (data []byte, err error) { - if df.failWithNil { - return nil, nil - } - if df.failWithError { - return nil, errors.New("failing call") - } - - timer := time.NewTimer(df.fetchTimeout) - defer timer.Stop() - - // Fill in the dummy response with the correct round - dummyBlock := EncodedBlockCert{ - Block: bookkeeping.Block{ - BlockHeader: bookkeeping.BlockHeader{ - Round: r, - }, - }, - Certificate: agreement.Certificate{ - Round: r, - }, - } - - encodedData := protocol.Encode(dummyBlock) - - select { - case <-timer.C: - case <-ctx.Done(): - return nil, ctx.Err() - } - - return encodedData, nil -} - -// FetcherClient interface -func (df *dummyFetcher) Address() string { - //logging.Base().Debug("dummyFetcher Address") - return "dummyFetcher address" -} - -// FetcherClient interface -func (df *dummyFetcher) Close() error { - //logging.Base().Debug("dummyFetcher Close") - return nil -} - -func makeDummyFetchers(failWithNil bool, failWithError bool, timeout time.Duration) []FetcherClient { - out := make([]FetcherClient, numberOfPeers) - for i := range out { - out[i] = &dummyFetcher{failWithNil, failWithError, timeout} - } - return out -} - -func TestFetchBlock(t *testing.T) { - fetcher := &NetworkFetcher{ - roundUpperBound: make(map[FetcherClient]basics.Round), - activeFetches: make(map[FetcherClient]int), - peers: makeDummyFetchers(false, false, 100*time.Millisecond), - log: logging.TestingLog(t), - } - - var err error - var block *bookkeeping.Block - var cert *agreement.Certificate - var client FetcherClient - - fetched := false - for i := 0; i < numberOfPeers; i++ { - start := time.Now() - block, cert, client, err = fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) - require.NoError(t, err) - require.NotNil(t, client) - end := time.Now() - require.True(t, end.Sub(start) > 100*time.Millisecond) - require.True(t, end.Sub(start) < 100*time.Millisecond+5*time.Second) // we want to have a higher margin here, as the machine we're running on might be slow. - if err == nil { - require.NotEqual(t, nil, block) - require.NotEqual(t, nil, cert) - _, _, client, err = fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) - require.NotNil(t, client) - require.NoError(t, err) - fetched = true - } - } - require.True(t, fetched) -} - -func TestFetchBlockFail(t *testing.T) { - fetcher := &NetworkFetcher{ - roundUpperBound: make(map[FetcherClient]basics.Round), - activeFetches: make(map[FetcherClient]int), - peers: makeDummyFetchers(true, false, 100*time.Millisecond), - log: logging.TestingLog(t), - } - - for i := 0; i < numberOfPeers; i++ { - require.False(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) - _, _, _, err := fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) - require.Error(t, err) - } - require.True(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) -} - -func TestFetchBlockAborted(t *testing.T) { - fetcher := &NetworkFetcher{ - roundUpperBound: make(map[FetcherClient]basics.Round), - activeFetches: make(map[FetcherClient]int), - peers: makeDummyFetchers(false, false, 2*time.Second), - log: logging.TestingLog(t), - } - - ctx, cf := context.WithCancel(context.Background()) - defer cf() - go func() { - cf() - }() - start := time.Now() - _, _, client, err := fetcher.FetchBlock(ctx, basics.Round(1)) - end := time.Now() - require.True(t, strings.Contains(err.Error(), context.Canceled.Error())) - require.Nil(t, client) - require.True(t, end.Sub(start) < 10*time.Second) -} - -func TestFetchBlockTimeout(t *testing.T) { - fetcher := &NetworkFetcher{ - roundUpperBound: make(map[FetcherClient]basics.Round), - activeFetches: make(map[FetcherClient]int), - peers: makeDummyFetchers(false, false, 10*time.Second), - log: logging.TestingLog(t), - } - start := time.Now() - ctx, cf := context.WithTimeout(context.Background(), 500*time.Millisecond) - defer cf() - _, _, client, err := fetcher.FetchBlock(ctx, basics.Round(1)) - end := time.Now() - require.True(t, strings.Contains(err.Error(), context.DeadlineExceeded.Error())) - require.Nil(t, client) - require.True(t, end.Sub(start) >= 500*time.Millisecond) - require.True(t, end.Sub(start) < 10*time.Second) -} - -func TestFetchBlockErrorCall(t *testing.T) { - fetcher := &NetworkFetcher{ - roundUpperBound: make(map[FetcherClient]basics.Round), - activeFetches: make(map[FetcherClient]int), - peers: makeDummyFetchers(false, true, 10*time.Millisecond), - log: logging.TestingLog(t), - } - - require.False(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) - _, _, client, err := fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) - require.Error(t, err) - require.Nil(t, client) -} - -func TestFetchBlockComposedNoOp(t *testing.T) { - f := &NetworkFetcher{ - roundUpperBound: make(map[FetcherClient]basics.Round), - activeFetches: make(map[FetcherClient]int), - peers: makeDummyFetchers(false, false, 1*time.Millisecond), - log: logging.TestingLog(t), - } - fetcher := &ComposedFetcher{fetchers: []Fetcher{f, nil}} - - var err error - var block *bookkeeping.Block - var cert *agreement.Certificate - var client FetcherClient - - fetched := false - for i := 0; i < numberOfPeers; i++ { - start := time.Now() - block, cert, client, err = fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) - require.NoError(t, err) - require.NotNil(t, client) - end := time.Now() - require.True(t, end.Sub(start) >= 1*time.Millisecond) - require.True(t, end.Sub(start) < 1*time.Millisecond+10*time.Second) // we take a very high margin here for the fetcher to complete. - if err == nil { - require.NotEqual(t, nil, block) - require.NotEqual(t, nil, cert) - _, _, client, err = fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) - require.NotNil(t, client) - require.NoError(t, err) - fetched = true - } - } - require.True(t, fetched) -} - -// Make sure composed fetchers are hit in priority order -func TestFetchBlockComposedFail(t *testing.T) { - f := &NetworkFetcher{ - roundUpperBound: make(map[FetcherClient]basics.Round), - activeFetches: make(map[FetcherClient]int), - peers: makeDummyFetchers(true, false, 1*time.Millisecond), - log: logging.TestingLog(t), - } - f2 := &NetworkFetcher{ - roundUpperBound: make(map[FetcherClient]basics.Round), - activeFetches: make(map[FetcherClient]int), - peers: makeDummyFetchers(false, false, 1*time.Millisecond), - log: logging.TestingLog(t), - } - fetcher := &ComposedFetcher{fetchers: []Fetcher{f, f2}} - - for i := 0; i < numberOfPeers; i++ { - require.False(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) - _, _, _, err := fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) - require.Error(t, err) - } - require.False(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) - for i := 0; i < numberOfPeers; i++ { - require.False(t, fetcher.OutOfPeers(basics.Round(numberOfPeers))) - _, _, client, err := fetcher.FetchBlock(context.Background(), basics.Round(numberOfPeers)) - require.NotNil(t, client) - require.NoError(t, err) - } -} diff --git a/rpcs/httpTxSync.go b/rpcs/httpTxSync.go index 75a6cc0389..ded2d0dd7c 100644 --- a/rpcs/httpTxSync.go +++ b/rpcs/httpTxSync.go @@ -39,7 +39,7 @@ import ( type HTTPTxSync struct { rootURL string - peers PeerSource + peers network.GossipNode log logging.Logger @@ -48,7 +48,9 @@ type HTTPTxSync struct { const requestContentType = "application/x-www-form-urlencoded" -func responseBytes(response *http.Response, log logging.Logger, limit uint64) (data []byte, err error) { +// ResponseBytes reads the content of the response object and return the body content +// while obeying the read size limits +func ResponseBytes(response *http.Response, log logging.Logger, limit uint64) (data []byte, err error) { // response.Body is always non-nil defer response.Body.Close() if response.ContentLength >= 0 { @@ -72,7 +74,7 @@ func responseBytes(response *http.Response, log logging.Logger, limit uint64) (d } // create a new http sync object. -func makeHTTPSync(peerSource PeerSource, log logging.Logger, serverResponseSize uint64) *HTTPTxSync { +func makeHTTPSync(peerSource network.GossipNode, log logging.Logger, serverResponseSize uint64) *HTTPTxSync { const transactionArrayEncodingOverhead = uint64(16) // manual tests shown that the actual extra packing cost is typically 3 bytes. We'll take 16 byte to ensure we're on the safe side. return &HTTPTxSync{ peers: peerSource, @@ -103,7 +105,8 @@ func (hts *HTTPTxSync) Sync(ctx context.Context, bloom *bloom.Filter) (txgroups hts.rootURL = hpeer.GetAddress() client := hpeer.GetHTTPClient() if client == nil { - client = http.DefaultClient + client = &http.Client{} + client.Transport = hts.peers.GetRoundTripper() } parsedURL, err := network.ParseHostOrURL(hts.rootURL) if err != nil { @@ -158,7 +161,7 @@ func (hts *HTTPTxSync) Sync(ctx context.Context, bloom *bloom.Filter) (txgroups return nil, fmt.Errorf("txSync POST invalid content type '%s'", contentTypes[0]) } - data, err := responseBytes(response, hts.log, hts.maxTxSyncResponseBytes) + data, err := ResponseBytes(response, hts.log, hts.maxTxSyncResponseBytes) if err != nil { hts.log.Warn("txSync body read failed: ", err) return nil, err @@ -166,7 +169,7 @@ func (hts *HTTPTxSync) Sync(ctx context.Context, bloom *bloom.Filter) (txgroups hts.log.Debugf("http sync got %d bytes", len(data)) var txns []transactions.SignedTxn - err = protocol.Decode(data, &txns) + err = protocol.DecodeReflect(data, &txns) if err != nil { hts.log.Warn("txSync protocol decode: ", err) } diff --git a/rpcs/ledgerService.go b/rpcs/ledgerService.go index 6237b15eb1..62f6db95d3 100644 --- a/rpcs/ledgerService.go +++ b/rpcs/ledgerService.go @@ -18,6 +18,7 @@ package rpcs import ( "context" + "encoding/binary" "net/http" "strconv" @@ -53,12 +54,15 @@ type LedgerService struct { // EncodedBlockCert defines how GetBlockBytes encodes a block and its certificate type EncodedBlockCert struct { + _struct struct{} `codec:""` + Block bookkeeping.Block `codec:"block"` Certificate agreement.Certificate `codec:"cert"` } // PreEncodedBlockCert defines how GetBlockBytes encodes a block and its certificate, // using a pre-encoded Block and Certificate in msgpack format. +//msgp:ignore PreEncodedBlockCert type PreEncodedBlockCert struct { Block codec.Raw `codec:"block"` Certificate codec.Raw `codec:"cert"` @@ -223,39 +227,114 @@ func (ls *LedgerService) ListenForCatchupReq(reqs <-chan network.IncomingMessage } } +const noRoundNumberErrMsg = "can't find the round number" +const noDataTypeErrMsg = "can't find the data-type" +const roundNumberParseErrMsg = "unable to parse round number" +const blockNotAvailabeErrMsg = "requested block is not available" +const datatypeUnsupportedErrMsg = "requested data type is unsupported" + // a blocking function for handling a catchup request func (ls *LedgerService) handleCatchupReq(ctx context.Context, reqMsg network.IncomingMessage) { var res WsGetBlockOut + target := reqMsg.Sender.(network.UnicastPeer) + var respTopics network.Topics + + if target.Version() == "1" { + + defer func() { + ls.sendCatchupRes(ctx, target, reqMsg.Tag, res) + }() + var req WsGetBlockRequest + err := protocol.DecodeReflect(reqMsg.Data, &req) + if err != nil { + res.Error = err.Error() + return + } + res.Round = req.Round + encodedBlob, err := RawBlockBytes(ls.ledger, basics.Round(req.Round)) + + if err != nil { + res.Error = err.Error() + return + } + res.BlockBytes = encodedBlob + return + } + // Else, if version == 2.1 defer func() { - ls.sendCatchupRes(ctx, reqMsg.Sender.(network.UnicastPeer), reqMsg.Tag, res) + target.Respond(ctx, reqMsg, respTopics) }() - var req WsGetBlockRequest - err := protocol.Decode(reqMsg.Data, &req) + topics, err := network.UnmarshallTopics(reqMsg.Data) if err != nil { - res.Error = err.Error() + logging.Base().Infof("LedgerService handleCatchupReq: %s", err.Error()) + respTopics = network.Topics{ + network.MakeTopic(network.ErrorKey, []byte(err.Error()))} + return + } + roundBytes, found := topics.GetValue(roundKey) + if !found { + logging.Base().Infof("LedgerService handleCatchupReq: %s", noRoundNumberErrMsg) + respTopics = network.Topics{ + network.MakeTopic(network.ErrorKey, + []byte(noRoundNumberErrMsg))} + return + } + requestType, found := topics.GetValue(requestDataTypeKey) + if !found { + logging.Base().Infof("LedgerService handleCatchupReq: %s", noDataTypeErrMsg) + respTopics = network.Topics{ + network.MakeTopic(network.ErrorKey, + []byte(noDataTypeErrMsg))} return } - res.Round = req.Round - encodedBlob, err := RawBlockBytes(ls.ledger, basics.Round(req.Round)) - if err != nil { - res.Error = err.Error() + round, read := binary.Uvarint(roundBytes) + if read <= 0 { + logging.Base().Infof("LedgerService handleCatchupReq: %s", roundNumberParseErrMsg) + respTopics = network.Topics{ + network.MakeTopic(network.ErrorKey, + []byte(roundNumberParseErrMsg))} return } - res.BlockBytes = encodedBlob + respTopics = topicBlockBytes(ls.ledger, basics.Round(round), string(requestType)) return } func (ls *LedgerService) sendCatchupRes(ctx context.Context, target network.UnicastPeer, reqTag protocol.Tag, outMsg WsGetBlockOut) { t := reqTag.Complement() logging.Base().Infof("catching down peer: %v, round %v. outcome: %v. ledger: %v", target.GetAddress(), outMsg.Round, outMsg.Error, ls.ledger.LastRound()) - err := target.Unicast(ctx, protocol.Encode(outMsg), t) + err := target.Unicast(ctx, protocol.EncodeReflect(outMsg), t) if err != nil { logging.Base().Info("failed to respond to catchup req", err) } } +func topicBlockBytes(dataLedger *data.Ledger, round basics.Round, requestType string) network.Topics { + blk, cert, err := dataLedger.EncodedBlockCert(round) + if err != nil { + switch err.(type) { + case ledger.ErrNoEntry: + default: + logging.Base().Infof("LedgerService topicBlockBytes: %s", err) + } + return network.Topics{ + network.MakeTopic(network.ErrorKey, []byte(blockNotAvailabeErrMsg))} + } + switch requestType { + case blockAndCertValue: + return network.Topics{ + network.MakeTopic( + blockDataKey, blk), + network.MakeTopic( + certDataKey, cert), + } + default: + return network.Topics{ + network.MakeTopic(network.ErrorKey, []byte(datatypeUnsupportedErrMsg))} + } +} + // RawBlockBytes return the msgpack bytes for a block func RawBlockBytes(ledger *data.Ledger, round basics.Round) ([]byte, error) { blk, cert, err := ledger.EncodedBlockCert(round) @@ -263,7 +342,7 @@ func RawBlockBytes(ledger *data.Ledger, round basics.Round) ([]byte, error) { return nil, err } - return protocol.Encode(PreEncodedBlockCert{ + return protocol.EncodeReflect(PreEncodedBlockCert{ Block: blk, Certificate: cert, }), nil diff --git a/rpcs/ledgerService_test.go b/rpcs/ledgerService_test.go index c23d71863e..073691ad14 100644 --- a/rpcs/ledgerService_test.go +++ b/rpcs/ledgerService_test.go @@ -18,462 +18,84 @@ package rpcs import ( "context" - "net" - "net/http" - "net/url" - "strings" "testing" - "time" - "github.com/gorilla/mux" "github.com/stretchr/testify/require" - "github.com/algorand/go-algorand/agreement" - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/network" "github.com/algorand/go-algorand/protocol" ) -const defaultRewardUnit = 1e6 - -var sinkAddr = basics.Address{0x7, 0xda, 0xcb, 0x4b, 0x6d, 0x9e, 0xd1, 0x41, 0xb1, 0x75, 0x76, 0xbd, 0x45, 0x9a, 0xe6, 0x42, 0x1d, 0x48, 0x6d, 0xa3, 0xd4, 0xef, 0x22, 0x47, 0xc4, 0x9, 0xa3, 0x96, 0xb8, 0x2e, 0xa2, 0x21} -var poolAddr = basics.Address{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} - -type httpTestPeerSource struct { - peers []network.Peer - Registrar -} - -func (s *httpTestPeerSource) GetPeers(options ...network.PeerOption) []network.Peer { - return s.peers -} - -// implement network.HTTPPeer -type testHTTPPeer struct { - rootURL string - client http.Client -} - -func (p *testHTTPPeer) GetAddress() string { - return p.rootURL -} -func (p *testHTTPPeer) PrepareURL(x string) string { - return strings.Replace(x, "{genesisID}", "test genesisID", -1) -} -func (p *testHTTPPeer) GetHTTPClient() *http.Client { - return &p.client -} -func (p *testHTTPPeer) GetHTTPPeer() network.HTTPPeer { - return p +type mockUnicastPeer struct { + responseTopics network.Topics } -func buildTestHTTPPeerSource(rootURL string) PeerSource { - peer := testHTTPPeer{rootURL: rootURL} - var wat network.HTTPPeer - wat = &peer - logging.Base().Infof("wat %#v", wat) - return &httpTestPeerSource{peers: []network.Peer{&peer}} +func (mup *mockUnicastPeer) GetAddress() string { + return "" } - -// Build a ledger with genesis and one block, start an HTTPServer around it, use NetworkFetcher to fetch the block. -// For smaller test, nee ledgerService_test.go TestGetBlockHTTP -func TestGetBlockHTTP(t *testing.T) { - // start server - ledger, next, b, err := buildTestLedger(t) - if err != nil { - t.Fatal(err) - return - } - ls := LedgerService{ledger: ledger, genesisID: "test genesisID"} - nodeA := BasicRPCNode{} - nodeA.RegisterHTTPHandler(LedgerServiceBlockPath, &ls) - nodeA.start() - defer nodeA.stop() - rootURL := nodeA.rootURL() - - // run fetcher - net := buildTestHTTPPeerSource(rootURL) - _, ok := net.GetPeers(network.PeersConnectedOut)[0].(network.HTTPPeer) - require.True(t, ok) - factory := MakeNetworkFetcherFactory(net, numberOfPeers, nil) - factory.log = logging.TestingLog(t) - fetcher := factory.New() - // we have one peer, the HTTP block server - require.Equal(t, len(fetcher.(*NetworkFetcher).peers), 1) - - var block *bookkeeping.Block - var cert *agreement.Certificate - var client FetcherClient - - start := time.Now() - block, cert, client, err = fetcher.FetchBlock(context.Background(), next) - end := time.Now() - require.NotNil(t, client) - require.NoError(t, err) - - require.True(t, end.Sub(start) < 10*time.Second) - require.Equal(t, &b, block) - if err == nil { - require.NotEqual(t, nil, block) - require.NotEqual(t, nil, cert) - } -} - -type testUnicastPeerSrc struct { - peers []network.Peer - handler network.MessageHandler -} - -func (s *testUnicastPeerSrc) GetPeers(options ...network.PeerOption) []network.Peer { - if options[0] == network.PeersConnectedIn { - return s.peers - } +func (mup *mockUnicastPeer) Unicast(ctx context.Context, data []byte, tag protocol.Tag) error { return nil } - -func (s *testUnicastPeerSrc) RegisterHTTPHandler(path string, handler http.Handler) {} -func (s *testUnicastPeerSrc) RegisterHandlers(dispatch []network.TaggedMessageHandler) { - if dispatch[0].Tag == protocol.UniCatchupResTag { - s.handler = dispatch[0].MessageHandler - } -} - -// implement network.UnicastPeer -type testUnicastPeer struct { - c chan network.IncomingMessage - h *testUnicastPeerSrc +func (mup *mockUnicastPeer) Version() string { + return "2.1" } - -func (p *testUnicastPeer) GetAddress() string { - return "test" +func (mup *mockUnicastPeer) Request(ctx context.Context, tag network.Tag, topics network.Topics) (resp *network.Response, e error) { + return nil, nil } - -func (p *testUnicastPeer) Unicast(ctx context.Context, msg []byte, tag protocol.Tag) error { - if tag == protocol.UniCatchupReqTag { // we reuse this peer for both inbound and outbound messages - // deliver to ledger service - p.c <- network.IncomingMessage{Sender: p, Data: msg, Tag: tag} // fine to block when testing - } else if tag == protocol.UniCatchupResTag { - // this is from the ledger service - p.h.handler.Handle(network.IncomingMessage{Sender: p, Data: msg, Tag: tag}) - } +func (mup *mockUnicastPeer) Respond(ctx context.Context, reqMsg network.IncomingMessage, topics network.Topics) (e error) { + mup.responseTopics = topics return nil } -func makeTestUnicastPeer(target chan network.IncomingMessage, delegate *testUnicastPeerSrc) network.UnicastPeer { - wsp := testUnicastPeer{} - wsp.c = target - wsp.h = delegate - return &wsp -} - -func buildTestUnicastPeerSrc(t *testing.T, target chan network.IncomingMessage) *testUnicastPeerSrc { - ps := new(testUnicastPeerSrc) - up := makeTestUnicastPeer(target, ps) - ps.peers = []network.Peer{up} - return ps -} - -// A quick GetBlock over websockets test hitting a mocked websocket server (no actual connection) -func TestGetBlockWS(t *testing.T) { - // start server - ledger, next, b, err := buildTestLedger(t) - if err != nil { - t.Fatal(err) - return - } - c := make(chan network.IncomingMessage, 50) - ls := LedgerService{ledger: ledger, genesisID: "test genesisID", catchupReqs: c} - ls.Start() - - // get ws fetcher - net := buildTestUnicastPeerSrc(t, c) - fs := RegisterWsFetcherService(logging.TestingLog(t), net) - - _, ok := net.GetPeers(network.PeersConnectedIn)[0].(network.UnicastPeer) - require.True(t, ok) - factory := MakeNetworkFetcherFactory(net, numberOfPeers, fs) - factory.log = logging.TestingLog(t) - fetcher := factory.NewOverGossip(protocol.UniCatchupReqTag) - // we have one peer, the Ws block server - require.Equal(t, fetcher.NumPeers(), 1) - - var block *bookkeeping.Block - var cert *agreement.Certificate - var client FetcherClient - - start := time.Now() - block, cert, client, err = fetcher.FetchBlock(context.Background(), next) - require.NotNil(t, client) - require.NoError(t, err) - end := time.Now() - require.True(t, end.Sub(start) < 10*time.Second) - require.Equal(t, &b, block) - if err == nil { - require.NotEqual(t, nil, block) - require.NotEqual(t, nil, cert) - } - fetcher.Close() -} - -type BasicRPCNode struct { - listener net.Listener - server http.Server - rmux *mux.Router - peers []network.Peer -} - -func (b *BasicRPCNode) RegisterHTTPHandler(path string, handler http.Handler) { - if b.rmux == nil { - b.rmux = mux.NewRouter() - } - b.rmux.Handle(path, handler) -} - -func (b *BasicRPCNode) RegisterHandlers(dispatch []network.TaggedMessageHandler) { -} - -func (b *BasicRPCNode) start() bool { - var err error - b.listener, err = net.Listen("tcp", "") - if err != nil { - logging.Base().Error("tcp listen", err) - return false - } - if b.rmux == nil { - b.rmux = mux.NewRouter() - } - b.server.Handler = b.rmux - go b.server.Serve(b.listener) - return true -} -func (b *BasicRPCNode) rootURL() string { - addr := b.listener.Addr().String() - rootURL := url.URL{Scheme: "http", Host: addr, Path: ""} - return rootURL.String() -} - -func (b *BasicRPCNode) stop() { - b.server.Close() -} - -func (b *BasicRPCNode) GetPeers(options ...network.PeerOption) []network.Peer { - return b.peers -} - -func nodePair() (*BasicRPCNode, *BasicRPCNode) { - nodeA := &BasicRPCNode{} - nodeA.start() - nodeB := &BasicRPCNode{} - nodeB.start() - nodeB.peers = []network.Peer{&testHTTPPeer{rootURL: nodeA.rootURL()}} - nodeA.peers = []network.Peer{&testHTTPPeer{rootURL: nodeB.rootURL()}} - return nodeA, nodeB -} - -func TestGetBlockMocked(t *testing.T) { - var user basics.Address - user[0] = 123 +// TestHandleCatchupReqNegative covers the error reporting in handleCatchupReq +func TestHandleCatchupReqNegative(t *testing.T) { - proto := config.Consensus[protocol.ConsensusCurrentVersion] - genesis := make(map[basics.Address]basics.AccountData) - genesis[user] = basics.AccountData{ - Status: basics.Online, - MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, + reqMsg := network.IncomingMessage{ + Sender: &mockUnicastPeer{}, + Data: nil, // topics } - genesis[sinkAddr] = basics.AccountData{ - Status: basics.Online, - MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, - } - genesis[poolAddr] = basics.AccountData{ - Status: basics.Online, - MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, + ls := LedgerService{ + ledger: nil, } - log := logging.TestingLog(t) - // A network with two nodes, A and B - nodeA, nodeB := nodePair() - defer nodeA.stop() - defer nodeB.stop() + // case where topics is nil + ls.handleCatchupReq(context.Background(), reqMsg) + respTopics := reqMsg.Sender.(*mockUnicastPeer).responseTopics + val, found := respTopics.GetValue(network.ErrorKey) + require.Equal(t, true, found) + require.Equal(t, "UnmarshallTopics: could not read the number of topics", string(val)) - // A is running the ledger service and will respond to fetch requests - genBal := data.MakeGenesisBalances(genesis, sinkAddr, poolAddr) - const inMem = true - const archival = true - ledgerA, err := data.LoadLedger( - log.With("name", "A"), t.Name(), inMem, - protocol.ConsensusCurrentVersion, genBal, "", crypto.Digest{}, - nil, archival, - ) - if err != nil { - t.Errorf("Couldn't make ledger: %v", err) - } - RegisterLedgerService(config.GetDefaultLocal(), ledgerA, nodeA, "test genesisID") + // case where round number is missing + reqTopics := network.Topics{} + reqMsg.Data = reqTopics.MarshallTopics() + ls.handleCatchupReq(context.Background(), reqMsg) + respTopics = reqMsg.Sender.(*mockUnicastPeer).responseTopics - next := ledgerA.NextRound() - genHash := crypto.Digest{0x42} - tx := transactions.Transaction{ - Type: protocol.PaymentTx, - Header: transactions.Header{ - Sender: user, - Fee: basics.MicroAlgos{Raw: proto.MinTxnFee}, - FirstValid: next, - LastValid: next, - GenesisHash: genHash, - }, - PaymentTxnFields: transactions.PaymentTxnFields{ - Receiver: user, - Amount: basics.MicroAlgos{Raw: 2}, - }, - } - signedtx := transactions.SignedTxn{ - Txn: tx, - } + val, found = respTopics.GetValue(network.ErrorKey) + require.Equal(t, true, found) + require.Equal(t, noRoundNumberErrMsg, string(val)) - var b bookkeeping.Block - prev, err := ledgerA.Block(ledgerA.LastRound()) - require.NoError(t, err) - b.RewardsLevel = prev.RewardsLevel - b.BlockHeader.Round = next - b.BlockHeader.GenesisHash = genHash - b.CurrentProtocol = protocol.ConsensusCurrentVersion - txib, err := b.EncodeSignedTxn(signedtx, transactions.ApplyData{}) - require.NoError(t, err) - b.Payset = []transactions.SignedTxnInBlock{ - txib, - } - require.NoError(t, ledgerA.AddBlock(b, agreement.Certificate{Round: next})) + // case where data type is missing + roundNumberData := make([]byte, 0) + reqTopics = network.Topics{network.MakeTopic(roundKey, roundNumberData)} + reqMsg.Data = reqTopics.MarshallTopics() + ls.handleCatchupReq(context.Background(), reqMsg) + respTopics = reqMsg.Sender.(*mockUnicastPeer).responseTopics - // B tries to fetch block - factory := MakeNetworkFetcherFactory(nodeB, 10, nil) - factory.log = logging.TestingLog(t) - nodeBRPC := factory.New() - ctx, cf := context.WithTimeout(context.Background(), time.Second) - defer cf() - eblock, _, _, err := nodeBRPC.FetchBlock(ctx, next) - if err != nil { - t.Errorf("Error fetching block: %v", err) - } - block, err := ledgerA.Block(next) - if err != nil { - panic(err) - } - if eblock.Hash() != block.Hash() { - t.Errorf("FetchBlock returned wrong block: expected %v; got %v", block.Hash(), eblock) - } -} - -func TestGetFutureBlock(t *testing.T) { - log := logging.TestingLog(t) - // A network with two nodes, A and B - nodeA, nodeB := nodePair() - defer nodeA.stop() - defer nodeB.stop() - - proto := config.Consensus[protocol.ConsensusCurrentVersion] - genesis := make(map[basics.Address]basics.AccountData) - genesis[sinkAddr] = basics.AccountData{ - Status: basics.Online, - MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, - } - genesis[poolAddr] = basics.AccountData{ - Status: basics.Online, - MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, - } - - gen := data.MakeGenesisBalances(genesis, sinkAddr, poolAddr) - // A is running the ledger service and will respond to fetch requests - const inMem = true - const archival = true - ledgerA, err := data.LoadLedger( - log.With("name", "A"), t.Name(), inMem, - protocol.ConsensusCurrentVersion, gen, "", crypto.Digest{}, - nil, archival, - ) - if err != nil { - t.Errorf("Couldn't make ledger: %v", err) - } - RegisterLedgerService(config.GetDefaultLocal(), ledgerA, nodeA, "test genesisID") - - // B tries to fetch block 4 - factory := MakeNetworkFetcherFactory(nodeB, 10, nil) - factory.log = logging.TestingLog(t) - nodeBRPC := factory.New() - ctx, cf := context.WithTimeout(context.Background(), time.Second) - defer cf() - _, _, client, err := nodeBRPC.FetchBlock(ctx, ledgerA.NextRound()) - require.Error(t, err) - require.Nil(t, client) -} - -func buildTestLedger(t *testing.T) (ledger *data.Ledger, next basics.Round, b bookkeeping.Block, err error) { - var user basics.Address - user[0] = 123 - - proto := config.Consensus[protocol.ConsensusCurrentVersion] - genesis := make(map[basics.Address]basics.AccountData) - genesis[user] = basics.AccountData{ - Status: basics.Online, - MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, - } - genesis[sinkAddr] = basics.AccountData{ - Status: basics.Online, - MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, - } - genesis[poolAddr] = basics.AccountData{ - Status: basics.Online, - MicroAlgos: basics.MicroAlgos{Raw: proto.MinBalance * 2}, - } - - log := logging.TestingLog(t) - genBal := data.MakeGenesisBalances(genesis, sinkAddr, poolAddr) - genHash := crypto.Digest{0x42} - const inMem = true - const archival = true - ledger, err = data.LoadLedger( - log, t.Name(), inMem, protocol.ConsensusCurrentVersion, genBal, "", genHash, - nil, archival, - ) - if err != nil { - t.Fatal("couldn't build ledger", err) - return - } - next = ledger.NextRound() - tx := transactions.Transaction{ - Type: protocol.PaymentTx, - Header: transactions.Header{ - Sender: user, - Fee: basics.MicroAlgos{Raw: proto.MinTxnFee}, - FirstValid: next, - LastValid: next, - GenesisHash: genHash, - }, - PaymentTxnFields: transactions.PaymentTxnFields{ - Receiver: user, - Amount: basics.MicroAlgos{Raw: 2}, - }, - } - signedtx := transactions.SignedTxn{ - Txn: tx, - } + val, found = respTopics.GetValue(network.ErrorKey) + require.Equal(t, true, found) + require.Equal(t, noDataTypeErrMsg, string(val)) - prev, err := ledger.Block(ledger.LastRound()) - require.NoError(t, err) - b.RewardsLevel = prev.RewardsLevel - b.BlockHeader.Round = next - b.BlockHeader.GenesisHash = genHash - b.CurrentProtocol = protocol.ConsensusCurrentVersion - txib, err := b.EncodeSignedTxn(signedtx, transactions.ApplyData{}) - require.NoError(t, err) - b.Payset = []transactions.SignedTxnInBlock{ - txib, + // case where round number is corrupted + roundNumberData = make([]byte, 0) + reqTopics = network.Topics{network.MakeTopic(roundKey, roundNumberData), + network.MakeTopic(requestDataTypeKey, []byte(blockAndCertValue)), } + reqMsg.Data = reqTopics.MarshallTopics() + ls.handleCatchupReq(context.Background(), reqMsg) + respTopics = reqMsg.Sender.(*mockUnicastPeer).responseTopics - require.NoError(t, ledger.AddBlock(b, agreement.Certificate{Round: next})) - return + val, found = respTopics.GetValue(network.ErrorKey) + require.Equal(t, true, found) + require.Equal(t, roundNumberParseErrMsg, string(val)) } diff --git a/rpcs/msgp_gen.go b/rpcs/msgp_gen.go new file mode 100644 index 0000000000..84ae94b9e3 --- /dev/null +++ b/rpcs/msgp_gen.go @@ -0,0 +1,126 @@ +package rpcs + +// Code generated by github.com/algorand/msgp DO NOT EDIT. + +import ( + "github.com/algorand/msgp/msgp" +) + +// MarshalMsg implements msgp.Marshaler +func (z *EncodedBlockCert) MarshalMsg(b []byte) (o []byte, err error) { + o = msgp.Require(b, z.Msgsize()) + // map header, size 2 + // string "block" + o = append(o, 0x82, 0xa5, 0x62, 0x6c, 0x6f, 0x63, 0x6b) + o, err = (*z).Block.MarshalMsg(o) + if err != nil { + err = msgp.WrapError(err, "Block") + return + } + // string "cert" + o = append(o, 0xa4, 0x63, 0x65, 0x72, 0x74) + o, err = (*z).Certificate.MarshalMsg(o) + if err != nil { + err = msgp.WrapError(err, "Certificate") + return + } + return +} + +func (_ *EncodedBlockCert) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*EncodedBlockCert) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *EncodedBlockCert) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0001 int + var zb0002 bool + zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).Block.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Block") + return + } + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).Certificate.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Certificate") + return + } + } + if zb0001 > 0 { + err = msgp.ErrTooManyArrayFields(zb0001) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 { + (*z) = EncodedBlockCert{} + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "block": + bts, err = (*z).Block.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Block") + return + } + case "cert": + bts, err = (*z).Certificate.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Certificate") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *EncodedBlockCert) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*EncodedBlockCert) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *EncodedBlockCert) Msgsize() (s int) { + s = 1 + 6 + (*z).Block.Msgsize() + 5 + (*z).Certificate.Msgsize() + return +} + +// MsgIsZero returns whether this is a zero value +func (z *EncodedBlockCert) MsgIsZero() bool { + return ((*z).Block.MsgIsZero()) && ((*z).Certificate.MsgIsZero()) +} diff --git a/rpcs/msgp_gen_test.go b/rpcs/msgp_gen_test.go new file mode 100644 index 0000000000..7559695a81 --- /dev/null +++ b/rpcs/msgp_gen_test.go @@ -0,0 +1,72 @@ +package rpcs + +// Code generated by github.com/algorand/msgp DO NOT EDIT. + +import ( + "testing" + + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/msgp/msgp" +) + +func TestMarshalUnmarshalEncodedBlockCert(t *testing.T) { + v := EncodedBlockCert{} + bts, err := v.MarshalMsg(nil) + if err != nil { + t.Fatal(err) + } + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingEncodedBlockCert(t *testing.T) { + protocol.RunEncodingTest(t, &EncodedBlockCert{}) +} + +func BenchmarkMarshalMsgEncodedBlockCert(b *testing.B) { + v := EncodedBlockCert{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgEncodedBlockCert(b *testing.B) { + v := EncodedBlockCert{} + bts := make([]byte, 0, v.Msgsize()) + bts, _ = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts, _ = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalEncodedBlockCert(b *testing.B) { + v := EncodedBlockCert{} + bts, _ := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} diff --git a/rpcs/txService.go b/rpcs/txService.go index 9e1fa23388..76eae00295 100644 --- a/rpcs/txService.go +++ b/rpcs/txService.go @@ -130,7 +130,7 @@ func (txs *TxService) ServeHTTP(response http.ResponseWriter, request *http.Requ return } txns := txs.getFilteredTxns(filter) - txblob := protocol.Encode(txns) + txblob := protocol.EncodeReflect(txns) txs.log.Debugf("sending %d txns in %d bytes", len(txns), len(txblob)) response.Header().Set("Content-Length", strconv.Itoa(len(txblob))) response.Header().Set("Content-Type", responseContentType) diff --git a/rpcs/txService_test.go b/rpcs/txService_test.go index 9ae78ab5e7..4346a7619f 100644 --- a/rpcs/txService_test.go +++ b/rpcs/txService_test.go @@ -17,16 +17,23 @@ package rpcs import ( + "net" + "net/http" + "net/url" "os" + "strings" "sync" "sync/atomic" "testing" "time" + "github.com/gorilla/mux" "github.com/stretchr/testify/require" + "github.com/algorand/go-algorand/components/mocks" "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/logging" + "github.com/algorand/go-algorand/network" "github.com/algorand/go-algorand/util/bloom" ) @@ -35,6 +42,89 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } +type httpTestPeerSource struct { + peers []network.Peer + mocks.MockNetwork +} + +func (s *httpTestPeerSource) GetPeers(options ...network.PeerOption) []network.Peer { + return s.peers +} + +// implement network.HTTPPeer +type testHTTPPeer string + +func (p testHTTPPeer) GetAddress() string { + return string(p) +} +func (p *testHTTPPeer) PrepareURL(x string) string { + return strings.Replace(x, "{genesisID}", "test genesisID", -1) +} +func (p *testHTTPPeer) GetHTTPClient() *http.Client { + return &http.Client{} +} +func (p *testHTTPPeer) GetHTTPPeer() network.HTTPPeer { + return p +} + +type basicRPCNode struct { + listener net.Listener + server http.Server + rmux *mux.Router + peers []network.Peer + mocks.MockNetwork +} + +func (b *basicRPCNode) RegisterHTTPHandler(path string, handler http.Handler) { + if b.rmux == nil { + b.rmux = mux.NewRouter() + } + b.rmux.Handle(path, handler) +} + +func (b *basicRPCNode) RegisterHandlers(dispatch []network.TaggedMessageHandler) { +} + +func (b *basicRPCNode) start() bool { + var err error + b.listener, err = net.Listen("tcp", "") + if err != nil { + logging.Base().Error("tcp listen", err) + return false + } + if b.rmux == nil { + b.rmux = mux.NewRouter() + } + b.server.Handler = b.rmux + go b.server.Serve(b.listener) + return true +} +func (b *basicRPCNode) rootURL() string { + addr := b.listener.Addr().String() + rootURL := url.URL{Scheme: "http", Host: addr, Path: ""} + return rootURL.String() +} + +func (b *basicRPCNode) stop() { + b.server.Close() +} + +func (b *basicRPCNode) GetPeers(options ...network.PeerOption) []network.Peer { + return b.peers +} + +func nodePair() (*basicRPCNode, *basicRPCNode) { + nodeA := &basicRPCNode{} + nodeA.start() + nodeB := &basicRPCNode{} + nodeB.start() + httpPeerA := testHTTPPeer(nodeA.rootURL()) + httpPeerB := testHTTPPeer(nodeB.rootURL()) + nodeB.peers = []network.Peer{&httpPeerA} + nodeA.peers = []network.Peer{&httpPeerB} + return nodeA, nodeB +} + func TestTxSync(t *testing.T) { // A network with two nodes, A and B nodeA, nodeB := nodePair() diff --git a/rpcs/txSyncer.go b/rpcs/txSyncer.go index db0acef0f0..81560fcf99 100644 --- a/rpcs/txSyncer.go +++ b/rpcs/txSyncer.go @@ -42,15 +42,10 @@ type TxSyncClient interface { Close() error } -// PeerSource is a subset of network.GossipNode -type PeerSource interface { - GetPeers(options ...network.PeerOption) []network.Peer -} - // TxSyncer fetches pending transactions that are missing from its pool, and feeds them to the handler type TxSyncer struct { pool PendingTxAggregate - clientSource PeerSource + clientSource network.GossipNode handler data.SolicitedTxHandler ctx context.Context cancel context.CancelFunc @@ -63,7 +58,7 @@ type TxSyncer struct { } // MakeTxSyncer returns a TxSyncer -func MakeTxSyncer(pool PendingTxAggregate, clientSource PeerSource, txHandler data.SolicitedTxHandler, syncInterval time.Duration, syncTimeout time.Duration, serverResponseSize int) *TxSyncer { +func MakeTxSyncer(pool PendingTxAggregate, clientSource network.GossipNode, txHandler data.SolicitedTxHandler, syncInterval time.Duration, syncTimeout time.Duration, serverResponseSize int) *TxSyncer { ctx, cancel := context.WithCancel(context.Background()) return &TxSyncer{ pool: pool, @@ -129,7 +124,7 @@ func (syncer *TxSyncer) syncFromClient(client TxSyncClient) error { defer cf() txgroups, err := client.Sync(ctx, filter) if err != nil { - return fmt.Errorf("TxSyncer.Sync: peer %v error %v", client.Address(), err) + return fmt.Errorf("TxSyncer.Sync: peer '%v' error '%v'", client.Address(), err) } // test to see if all the transaction that we've received honor the bloom filter constraints diff --git a/rpcs/txSyncer_test.go b/rpcs/txSyncer_test.go index 9498d51030..049e44ddf6 100644 --- a/rpcs/txSyncer_test.go +++ b/rpcs/txSyncer_test.go @@ -17,20 +17,27 @@ package rpcs import ( + "context" + "errors" + "net/http" "net/rpc" + "strings" "sync/atomic" "testing" "time" "github.com/stretchr/testify/require" + "github.com/algorand/go-algorand/components/mocks" "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/network" "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/util/bloom" ) type mockPendingTxAggregate struct { @@ -85,12 +92,86 @@ func (handler *mockHandler) Handle(txgroup []transactions.SignedTxn) error { const testSyncInterval = 5 * time.Second const testSyncTimeout = 4 * time.Second +type mockRunner struct { + ran bool + done chan *rpc.Call + failWithNil bool + failWithError bool + txgroups [][]transactions.SignedTxn +} + +type mockRPCClient struct { + client *mockRunner + closed bool + rootURL string + log logging.Logger +} + +func (client *mockRPCClient) Close() error { + client.closed = true + return nil +} + +func (client *mockRPCClient) Address() string { + return "mock.address." +} +func (client *mockRPCClient) Sync(ctx context.Context, bloom *bloom.Filter) (txgroups [][]transactions.SignedTxn, err error) { + client.log.Info("MockRPCClient.Sync") + select { + case <-ctx.Done(): + return nil, errors.New("cancelled") + default: + } + if client.client.failWithNil { + return nil, errors.New("old failWithNil") + } + if client.client.failWithError { + return nil, errors.New("failing call") + } + return client.client.txgroups, nil +} +func (client *mockRPCClient) GetBlockBytes(ctx context.Context, r basics.Round) (data []byte, err error) { + return nil, nil +} + +// network.HTTPPeer interface +func (client *mockRPCClient) GetAddress() string { + return client.rootURL +} +func (client *mockRPCClient) GetHTTPClient() *http.Client { + return nil +} +func (client *mockRPCClient) PrepareURL(x string) string { + return strings.Replace(x, "{genesisID}", "test genesisID", -1) +} + +type mockClientAggregator struct { + mocks.MockNetwork + peers []network.Peer +} + +func (mca *mockClientAggregator) GetPeers(options ...network.PeerOption) []network.Peer { + return mca.peers +} + +const numberOfPeers = 10 + +func makeMockClientAggregator(t *testing.T, failWithNil bool, failWithError bool) *mockClientAggregator { + clients := make([]network.Peer, 0) + for i := 0; i < numberOfPeers; i++ { + runner := mockRunner{failWithNil: failWithNil, failWithError: failWithError, done: make(chan *rpc.Call)} + clients = append(clients, &mockRPCClient{client: &runner, log: logging.TestingLog(t)}) + } + t.Logf("len(mca.clients) = %d", len(clients)) + return &mockClientAggregator{peers: clients} +} + func TestSyncFromClient(t *testing.T) { clientPool := makeMockPendingTxAggregate(2) serverPool := makeMockPendingTxAggregate(1) - runner := MockRunner{failWithNil: false, failWithError: false, txgroups: serverPool.Pending()[len(serverPool.Pending())-1:], done: make(chan *rpc.Call)} - client := MockRPCClient{client: &runner, log: logging.TestingLog(t)} - clientAgg := MockClientAggregator{peers: []network.Peer{&client}} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: serverPool.Pending()[len(serverPool.Pending())-1:], done: make(chan *rpc.Call)} + client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} + clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} syncer := MakeTxSyncer(clientPool, &clientAgg, &handler, testSyncInterval, testSyncTimeout, config.GetDefaultLocal().TxSyncServeResponseSize) syncer.log = logging.TestingLog(t) @@ -101,9 +182,9 @@ func TestSyncFromClient(t *testing.T) { func TestSyncFromUnsupportedClient(t *testing.T) { pool := makeMockPendingTxAggregate(3) - runner := MockRunner{failWithNil: true, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} - client := MockRPCClient{client: &runner, log: logging.TestingLog(t)} - clientAgg := MockClientAggregator{peers: []network.Peer{&client}} + runner := mockRunner{failWithNil: true, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} + client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} + clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} syncer := MakeTxSyncer(pool, &clientAgg, &handler, testSyncInterval, testSyncTimeout, config.GetDefaultLocal().TxSyncServeResponseSize) syncer.log = logging.TestingLog(t) @@ -114,9 +195,9 @@ func TestSyncFromUnsupportedClient(t *testing.T) { func TestSyncFromClientAndQuit(t *testing.T) { pool := makeMockPendingTxAggregate(3) - runner := MockRunner{failWithNil: false, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} - client := MockRPCClient{client: &runner, log: logging.TestingLog(t)} - clientAgg := MockClientAggregator{peers: []network.Peer{&client}} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} + client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} + clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} syncer := MakeTxSyncer(pool, &clientAgg, &handler, testSyncInterval, testSyncTimeout, config.GetDefaultLocal().TxSyncServeResponseSize) syncer.log = logging.TestingLog(t) @@ -128,9 +209,9 @@ func TestSyncFromClientAndQuit(t *testing.T) { func TestSyncFromClientAndError(t *testing.T) { pool := makeMockPendingTxAggregate(3) - runner := MockRunner{failWithNil: false, failWithError: true, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} - client := MockRPCClient{client: &runner, log: logging.TestingLog(t)} - clientAgg := MockClientAggregator{peers: []network.Peer{&client}} + runner := mockRunner{failWithNil: false, failWithError: true, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} + client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} + clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} syncer := MakeTxSyncer(pool, &clientAgg, &handler, testSyncInterval, testSyncTimeout, config.GetDefaultLocal().TxSyncServeResponseSize) syncer.log = logging.TestingLog(t) @@ -140,9 +221,9 @@ func TestSyncFromClientAndError(t *testing.T) { func TestSyncFromClientAndTimeout(t *testing.T) { pool := makeMockPendingTxAggregate(3) - runner := MockRunner{failWithNil: false, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} - client := MockRPCClient{client: &runner, log: logging.TestingLog(t)} - clientAgg := MockClientAggregator{peers: []network.Peer{&client}} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} + client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} + clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} syncTimeout := time.Duration(0) syncer := MakeTxSyncer(pool, &clientAgg, &handler, testSyncInterval, syncTimeout, config.GetDefaultLocal().TxSyncServeResponseSize) @@ -153,15 +234,15 @@ func TestSyncFromClientAndTimeout(t *testing.T) { func TestSync(t *testing.T) { pool := makeMockPendingTxAggregate(1) - nodeA := BasicRPCNode{} + nodeA := basicRPCNode{} txservice := makeTxService(pool, "test genesisID", config.GetDefaultLocal().TxPoolSize, config.GetDefaultLocal().TxSyncServeResponseSize) nodeA.RegisterHTTPHandler(TxServiceHTTPPath, txservice) nodeA.start() nodeAURL := nodeA.rootURL() - runner := MockRunner{failWithNil: false, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} - client := MockRPCClient{client: &runner, rootURL: nodeAURL, log: logging.TestingLog(t)} - clientAgg := MockClientAggregator{peers: []network.Peer{&client}} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} + client := mockRPCClient{client: &runner, rootURL: nodeAURL, log: logging.TestingLog(t)} + clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} syncerPool := makeMockPendingTxAggregate(3) syncer := MakeTxSyncer(syncerPool, &clientAgg, &handler, testSyncInterval, testSyncTimeout, config.GetDefaultLocal().TxSyncServeResponseSize) @@ -173,7 +254,7 @@ func TestSync(t *testing.T) { func TestNoClientsSync(t *testing.T) { pool := makeMockPendingTxAggregate(3) - clientAgg := MockClientAggregator{peers: []network.Peer{}} + clientAgg := mockClientAggregator{peers: []network.Peer{}} handler := mockHandler{} syncer := MakeTxSyncer(pool, &clientAgg, &handler, testSyncInterval, testSyncTimeout, config.GetDefaultLocal().TxSyncServeResponseSize) syncer.log = logging.TestingLog(t) @@ -185,9 +266,9 @@ func TestNoClientsSync(t *testing.T) { func TestStartAndStop(t *testing.T) { t.Skip("TODO: replace this test in new client paradigm") pool := makeMockPendingTxAggregate(3) - runner := MockRunner{failWithNil: false, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} - client := MockRPCClient{client: &runner, log: logging.TestingLog(t)} - clientAgg := MockClientAggregator{peers: []network.Peer{&client}} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} + client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} + clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} syncInterval := time.Second syncTimeout := time.Second @@ -213,9 +294,9 @@ func TestStartAndStop(t *testing.T) { func TestStartAndQuit(t *testing.T) { pool := makeMockPendingTxAggregate(3) - runner := MockRunner{failWithNil: false, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} - client := MockRPCClient{client: &runner, log: logging.TestingLog(t)} - clientAgg := MockClientAggregator{peers: []network.Peer{&client}} + runner := mockRunner{failWithNil: false, failWithError: false, txgroups: pool.Pending()[len(pool.Pending())-1:], done: make(chan *rpc.Call)} + client := mockRPCClient{client: &runner, log: logging.TestingLog(t)} + clientAgg := mockClientAggregator{peers: []network.Peer{&client}} handler := mockHandler{} syncInterval := time.Second syncTimeout := time.Second diff --git a/rpcs/wsFetcherService.go b/rpcs/wsFetcherService.go index 140e1d9528..9850e1b7ca 100644 --- a/rpcs/wsFetcherService.go +++ b/rpcs/wsFetcherService.go @@ -18,6 +18,7 @@ package rpcs import ( "context" + "encoding/binary" "fmt" "github.com/algorand/go-deadlock" @@ -36,6 +37,15 @@ type WsFetcherService struct { pendingRequests map[string]chan WsGetBlockOut } +// Constant strings used as keys for topics +const ( + roundKey = "roundKey" // Block round-number topic-key in the request + requestDataTypeKey = "requestDataType" // Data-type topic-key in the request (e.g. block, cert, block+cert) + blockDataKey = "blockData" // Block-data topic-key in the response + certDataKey = "certData" // Cert-data topic-key in the response + blockAndCertValue = "blockAndCert" // block+cert request data (as the value of requestDataTypeKey) +) + func makePendingRequestKey(target network.UnicastPeer, round basics.Round, tag protocol.Tag) string { return fmt.Sprintf("<%s>:%d:%s", target.GetAddress(), round, tag) @@ -60,7 +70,7 @@ func (fs *WsFetcherService) handleNetworkMsg(msg network.IncomingMessage) (out n return } - if decodeErr := protocol.Decode(msg.Data, &resp); decodeErr != nil { + if decodeErr := protocol.DecodeReflect(msg.Data, &resp); decodeErr != nil { fs.log.Warnf("WsFetcherService(%s): request failed: unable to decode message : %v", uniPeer.GetAddress(), decodeErr) out.Action = network.Disconnect return @@ -104,25 +114,66 @@ func (fs *WsFetcherService) RequestBlock(ctx context.Context, target network.Uni delete(fs.pendingRequests, waitKey) fs.mu.Unlock() }() + if target.Version() == "1" { + req := WsGetBlockRequest{Round: uint64(round)} + err := target.Unicast(ctx, protocol.EncodeReflect(req), tag) + if err != nil { + return WsGetBlockOut{}, fmt.Errorf("WsFetcherService.RequestBlock(%d): unicast failed, %v", round, err) + } + select { + case resp := <-waitCh: + return resp, nil + case <-ctx.Done(): + switch ctx.Err() { + case context.DeadlineExceeded: + return WsGetBlockOut{}, fmt.Errorf("WsFetcherService.RequestBlock(%d): request to %s was timed out", round, target.GetAddress()) + case context.Canceled: + return WsGetBlockOut{}, fmt.Errorf("WsFetcherService.RequestBlock(%d): request to %s was cancelled by context", round, target.GetAddress()) + default: + return WsGetBlockOut{}, ctx.Err() + } + } + } - req := WsGetBlockRequest{Round: uint64(round)} - err := target.Unicast(ctx, protocol.Encode(req), tag) + // Else, if version == 2.1 + roundBin := make([]byte, binary.MaxVarintLen64) + binary.PutUvarint(roundBin, uint64(round)) + topics := network.Topics{ + network.MakeTopic(requestDataTypeKey, + []byte(blockAndCertValue)), + network.MakeTopic( + roundKey, + roundBin), + } + resp, err := target.Request(ctx, tag, topics) if err != nil { - return WsGetBlockOut{}, fmt.Errorf("WsFetcherService.RequestBlock(%d): unicast failed, %v", round, err) + return WsGetBlockOut{}, fmt.Errorf("WsFetcherService(%s).RequestBlock(%d): Request failed, %v", target.GetAddress(), round, err) } - select { - case resp := <-waitCh: - return resp, nil - case <-ctx.Done(): - switch ctx.Err() { - case context.DeadlineExceeded: - return WsGetBlockOut{}, fmt.Errorf("WsFetcherService.RequestBlock(%d): request to %s was timed out", round, target.GetAddress()) - case context.Canceled: - return WsGetBlockOut{}, fmt.Errorf("WsFetcherService.RequestBlock(%d): request to %s was cancelled by context", round, target.GetAddress()) - default: - return WsGetBlockOut{}, ctx.Err() - } + + if errMsg, found := resp.Topics.GetValue(network.ErrorKey); found { + return WsGetBlockOut{}, fmt.Errorf("WsFetcherService(%s).RequestBlock(%d): Request failed, %s", target.GetAddress(), round, string(errMsg)) + } + + blk, found := resp.Topics.GetValue(blockDataKey) + if !found { + return WsGetBlockOut{}, fmt.Errorf("WsFetcherService(%s): request failed: block data not found", target.GetAddress()) + } + cert, found := resp.Topics.GetValue(certDataKey) + if !found { + return WsGetBlockOut{}, fmt.Errorf("WsFetcherService(%s): request failed: cert data not found", target.GetAddress()) + } + + // For backward compatibility, the block and cert are repackaged here. + // This can be dropeed once the v1 is dropped. + blockCertBytes := protocol.EncodeReflect(PreEncodedBlockCert{ + Block: blk, + Certificate: cert}) + + wsBlockOut := WsGetBlockOut{ + Round: uint64(round), + BlockBytes: blockCertBytes, } + return wsBlockOut, nil } // RegisterWsFetcherService creates and returns a WsFetcherService that services gossip fetcher responses diff --git a/scripts/build/beta.sh b/scripts/build/beta.sh index 7bf500e259..8615d240c1 100755 --- a/scripts/build/beta.sh +++ b/scripts/build/beta.sh @@ -26,11 +26,3 @@ make git add -A git commit -m "Build ${BUILD_NUMBER}" git push - -TAG=rel/beta-$(scripts/compute_build_number.sh -f) -if [ ! -z "${SIGNING_KEY_ADDR}" ]; then - git tag -s -u "${SIGNING_KEY_ADDR}" ${TAG} -m "Genesis Timestamp: $(cat ./genesistimestamp.dat)" -else - git tag -a ${TAG} -m "Genesis Timestamp: $(cat ./genesistimestamp.dat)" -fi -git push origin ${TAG} diff --git a/scripts/build/nightly.sh b/scripts/build/nightly.sh index 58bb7c9666..1887b1798f 100755 --- a/scripts/build/nightly.sh +++ b/scripts/build/nightly.sh @@ -29,9 +29,5 @@ git add ./genesistimestamp.dat ./buildnumber.dat git commit -m "Build ${BUILD_NUMBER} Data" git push -TAG=rel/nightly-$(scripts/compute_build_number.sh -f) -git tag -a ${TAG} -m "Genesis Timestamp: $(cat ./genesistimestamp.dat)" -git push origin ${TAG} - popd rm -rf ${REPO_DIR} diff --git a/scripts/build/stable.sh b/scripts/build/stable.sh index 675b69eee6..b76f890b6c 100755 --- a/scripts/build/stable.sh +++ b/scripts/build/stable.sh @@ -25,11 +25,3 @@ make git add -A git commit -m "Build ${BUILD_NUMBER}" git push - -TAG=rel/stable-$(scripts/compute_build_number.sh -f) -if [ ! -z "${SIGNING_KEY_ADDR}" ]; then - git tag -s -u "${SIGNING_KEY_ADDR}" ${TAG} -m "Genesis Timestamp: $(cat ./genesistimestamp.dat)" -else - git tag -a ${TAG} -m "Genesis Timestamp: $(cat ./genesistimestamp.dat)" -fi -git push origin ${TAG} diff --git a/scripts/build_deb.sh b/scripts/build_deb.sh index 7899b58008..4ff908c758 100755 --- a/scripts/build_deb.sh +++ b/scripts/build_deb.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +# shellcheck disable=2038,2064 # build_deb.sh - Build a .deb package for one platform. # @@ -15,20 +16,21 @@ fi ## Need to run inside fakeroot to make sure the files in ## the Debian package are owned by root. if [ "$EUID" != "0" ]; then - exec fakeroot $0 "$@" + exec fakeroot "$0" "$@" fi OS=linux ARCH=$1 OUTDIR="$2" -export GOPATH=$(go env GOPATH) +GOPATH=$(go env GOPATH) +export GOPATH REPO_DIR=$(pwd) echo "Building debian package for '${OS} - ${ARCH}'" if [ -z "${NO_BUILD}" ]; then - env GOOS=${OS} GOARCH=${ARCH} scripts/build_prod.sh + env GOOS="${OS}" GOARCH="${ARCH}" scripts/build_prod.sh else echo "already built" true @@ -44,7 +46,7 @@ DEFAULT_RELEASE_NETWORK=$(./scripts/compute_branch_release_network.sh "${DEFAULT PKG_ROOT=$(mktemp -d) trap "rm -rf $PKG_ROOT" 0 -mkdir -p ${PKG_ROOT}/usr/bin +mkdir -p "${PKG_ROOT}/usr/bin" if [ "${VARIATION}" = "" ]; then # NOTE: keep in sync with installer/rpm/algorand.spec @@ -52,37 +54,37 @@ if [ "${VARIATION}" = "" ]; then fi for bin in "${bin_files[@]}"; do - cp ${GOPATH}/bin/${bin} ${PKG_ROOT}/usr/bin - chmod 755 ${PKG_ROOT}/usr/bin/${bin} + cp "${GOPATH}/bin/${bin}" "${PKG_ROOT}"/usr/bin + chmod 755 "${PKG_ROOT}/usr/bin/${bin}" done -mkdir -p ${PKG_ROOT}/usr/lib/algorand +mkdir -p "${PKG_ROOT}/usr/lib/algorand" lib_files=("updater" "find-nodes.sh") for lib in "${lib_files[@]}"; do - cp ${GOPATH}/bin/${lib} ${PKG_ROOT}/usr/lib/algorand - chmod g-w ${PKG_ROOT}/usr/lib/algorand/${lib} + cp "${GOPATH}/bin/${lib}" "${PKG_ROOT}/usr/lib/algorand" + chmod g-w "${PKG_ROOT}/usr/lib/algorand/${lib}" done data_files=("config.json.example" "system.json") -mkdir -p ${PKG_ROOT}/var/lib/algorand +mkdir -p "${PKG_ROOT}/var/lib/algorand" for data in "${data_files[@]}"; do - cp installer/${data} ${PKG_ROOT}/var/lib/algorand + cp "installer/${data}" "${PKG_ROOT}/var/lib/algorand" done if [ ! -z "${RELEASE_GENESIS_PROCESS}" ]; then genesis_dirs=("devnet" "testnet" "mainnet" "betanet") for dir in "${genesis_dirs[@]}"; do - mkdir -p ${PKG_ROOT}/var/lib/algorand/genesis/${dir} - cp ${REPO_DIR}/installer/genesis/${dir}/genesis.json ${PKG_ROOT}/var/lib/algorand/genesis/${dir}/genesis.json + mkdir -p "${PKG_ROOT}/var/lib/algorand/genesis/${dir}" + cp "${REPO_DIR}/installer/genesis/${dir}/genesis.json" "${PKG_ROOT}/var/lib/algorand/genesis/${dir}/genesis.json" #${GOPATH}/bin/buildtools genesis ensure -n ${dir} --source ${REPO_DIR}/gen/${dir}/genesis.json --target ${PKG_ROOT}/var/lib/algorand/genesis/${dir}/genesis.json --releasedir ${REPO_DIR}/installer/genesis done # Copy the appropriate network genesis.json for our default (in root ./genesis folder) - cp ${PKG_ROOT}/var/lib/algorand/genesis/${DEFAULT_RELEASE_NETWORK}/genesis.json ${PKG_ROOT}/var/lib/algorand + cp "${PKG_ROOT}/var/lib/algorand/genesis/${DEFAULT_RELEASE_NETWORK}/genesis.json" "${PKG_ROOT}/var/lib/algorand" elif [[ "${CHANNEL}" == "dev" || "${CHANNEL}" == "stable" || "${CHANNEL}" == "nightly" || "${CHANNEL}" == "beta" ]]; then - cp ${REPO_DIR}/installer/genesis/${DEFAULTNETWORK}/genesis.json ${PKG_ROOT}/var/lib/algorand/genesis.json + cp "${REPO_DIR}/installer/genesis/${DEFAULTNETWORK}/genesis.json" "${PKG_ROOT}/var/lib/algorand/genesis.json" #${GOPATH}/bin/buildtools genesis ensure -n ${DEFAULTNETWORK} --source ${REPO_DIR}/gen/${DEFAULTNETWORK}/genesis.json --target ${PKG_ROOT}/var/lib/algorand/genesis.json --releasedir ${REPO_DIR}/installer/genesis else - cp ${REPO_DIR}/installer/genesis/${DEFAULTNETWORK}/genesis.json ${PKG_ROOT}/var/lib/algorand + cp "${REPO_DIR}/installer/genesis/${DEFAULTNETWORK}/genesis.json" "${PKG_ROOT}/var/lib/algorand" # Disabled because we have static genesis files now #cp gen/${DEFAULTNETWORK}/genesis.json ${PKG_ROOT}/var/lib/algorand #if [ -z "${TIMESTAMP}" ]; then @@ -92,34 +94,34 @@ else fi systemd_files=("algorand.service" "algorand@.service") -mkdir -p ${PKG_ROOT}/lib/systemd/system +mkdir -p "${PKG_ROOT}/lib/systemd/system" for svc in "${systemd_files[@]}"; do - cp installer/${svc} ${PKG_ROOT}/lib/systemd/system - chmod 644 ${PKG_ROOT}/lib/systemd/system/${svc} + cp "installer/${svc}" "${PKG_ROOT}/lib/systemd/system" + chmod 644 "${PKG_ROOT}/lib/systemd/system/${svc}" done unattended_upgrades_files=("51algorand-upgrades") -mkdir -p ${PKG_ROOT}/etc/apt/apt.conf.d +mkdir -p "${PKG_ROOT}/etc/apt/apt.conf.d" for f in "${unattended_upgrades_files[@]}"; do - cp installer/${f} ${PKG_ROOT}/etc/apt/apt.conf.d + cp "installer/${f}" "${PKG_ROOT}/etc/apt/apt.conf.d" done # files should not be group writable but directories should be -chmod -R g-w ${PKG_ROOT}/var/lib/algorand -find ${PKG_ROOT}/var/lib/algorand -type d | xargs chmod g+w +chmod -R g-w "${PKG_ROOT}/var/lib/algorand" +find "${PKG_ROOT}/var/lib/algorand" -type d | xargs chmod g+w -mkdir -p ${PKG_ROOT}/DEBIAN +mkdir -p "${PKG_ROOT}/DEBIAN" debian_files=("control" "postinst" "prerm" "postrm" "conffiles") for ctl in "${debian_files[@]}"; do # Copy first, to preserve permissions, then overwrite to fill in template. - cp -a installer/debian/${ctl} ${PKG_ROOT}/DEBIAN/${ctl} - cat installer/debian/${ctl} \ - | sed -e s,@ARCH@,${ARCH}, \ - -e s,@VER@,${VER}, \ - > ${PKG_ROOT}/DEBIAN/${ctl} + cp -a "installer/debian/${ctl}" "${PKG_ROOT}/DEBIAN/${ctl}" + < installer/debian/"${ctl}" \ + sed -e s,@ARCH@,"${ARCH}", \ + -e s,@VER@,"${VER}", \ + > "${PKG_ROOT}/DEBIAN/${ctl}" done # TODO: make `Files:` segments for vendor/... and crypto/libsodium-fork, but reasonably this should be understood to cover all _our_ files and copied in packages continue to be licenced under their own terms -cat <${PKG_ROOT}/DEBIAN/copyright +cat < "${PKG_ROOT}/DEBIAN/copyright" Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: Algorand Upstream-Contact: Algorand developers @@ -129,9 +131,10 @@ Files: * Copyright: Algorand developers License: AGPL-3+ EOF -sed 's/^$/./g' < COPYING | sed 's/^/ /g' >> ${PKG_ROOT}/DEBIAN/copyright -mkdir -p ${PKG_ROOT}/usr/share/doc/algorand -cp -p ${PKG_ROOT}/DEBIAN/copyright ${PKG_ROOT}/usr/share/doc/algorand/copyright +sed 's/^$/./g' < COPYING | sed 's/^/ /g' >> "${PKG_ROOT}/DEBIAN/copyright" +mkdir -p "${PKG_ROOT}/usr/share/doc/algorand" +cp -p "${PKG_ROOT}/DEBIAN/copyright" "${PKG_ROOT}/usr/share/doc/algorand/copyright" + +OUTPUT="$OUTDIR/algorand_${VER}_${ARCH}.deb" +dpkg-deb --build "${PKG_ROOT}" "${OUTPUT}" -OUTPUT="$OUTDIR"/algorand_${VER}_${ARCH}.deb -dpkg-deb --build ${PKG_ROOT} ${OUTPUT} diff --git a/scripts/build_package.sh b/scripts/build_package.sh index 6f3e41a309..4f1a1b09e7 100755 --- a/scripts/build_package.sh +++ b/scripts/build_package.sh @@ -33,6 +33,7 @@ if [ ! -d "${PKG_ROOT}" ]; then fi export GOPATH=$(go env GOPATH) +export GOPATHBIN=${GOPATH%%:*}/bin REPO_DIR=$(pwd) echo "Building package for '${OS} - ${ARCH}'" @@ -59,7 +60,7 @@ mkdir ${PKG_ROOT}/bin # If you modify this list, also update this list in ./cmd/updater/update.sh backup_binaries() bin_files=("algocfg" "algod" "algoh" "algokey" "carpenter" "catchupsrv" "ddconfig.sh" "diagcfg" "find-nodes.sh" "goal" "kmd" "msgpacktool" "node_exporter" "update.sh" "updater" "COPYING") for bin in "${bin_files[@]}"; do - cp ${GOPATH}/bin/${bin} ${PKG_ROOT}/bin + cp ${GOPATHBIN}/${bin} ${PKG_ROOT}/bin if [ $? -ne 0 ]; then exit 1; fi done @@ -87,7 +88,7 @@ if [ ! -z "${RELEASE_GENESIS_PROCESS}" ]; then for dir in "${genesis_dirs[@]}"; do mkdir -p ${PKG_ROOT}/genesis/${dir} cp ${REPO_DIR}/installer/genesis/${dir}/genesis.json ${PKG_ROOT}/genesis/${dir}/ - #${GOPATH}/bin/buildtools genesis ensure -n ${dir} --source ${REPO_DIR}/gen/${dir}/genesis.json --target ${PKG_ROOT}/genesis/${dir}/genesis.json --releasedir ${REPO_DIR}/installer/genesis + #${GOPATHBIN}/buildtools genesis ensure -n ${dir} --source ${REPO_DIR}/gen/${dir}/genesis.json --target ${PKG_ROOT}/genesis/${dir}/genesis.json --releasedir ${REPO_DIR}/installer/genesis if [ $? -ne 0 ]; then exit 1; fi done # Copy the appropriate network genesis.json for our default (in root ./genesis folder) @@ -95,7 +96,7 @@ if [ ! -z "${RELEASE_GENESIS_PROCESS}" ]; then if [ $? -ne 0 ]; then exit 1; fi elif [[ "${CHANNEL}" == "dev" || "${CHANNEL}" == "stable" || "${CHANNEL}" == "nightly" || "${CHANNEL}" == "beta" ]]; then cp ${REPO_DIR}/installer/genesis/${DEFAULTNETWORK}/genesis.json ${PKG_ROOT}/genesis/ - #${GOPATH}/bin/buildtools genesis ensure -n ${DEFAULTNETWORK} --source ${REPO_DIR}/gen/${DEFAULTNETWORK}/genesis.json --target ${PKG_ROOT}/genesis/genesis.json --releasedir ${REPO_DIR}/installer/genesis + #${GOPATHBIN}/buildtools genesis ensure -n ${DEFAULTNETWORK} --source ${REPO_DIR}/gen/${DEFAULTNETWORK}/genesis.json --target ${PKG_ROOT}/genesis/genesis.json --releasedir ${REPO_DIR}/installer/genesis if [ $? -ne 0 ]; then exit 1; fi else cp installer/genesis/${DEFAULTNETWORK}/genesis.json ${PKG_ROOT}/genesis @@ -103,7 +104,7 @@ else #if [ -z "${TIMESTAMP}" ]; then # TIMESTAMP=$(date +%s) #fi - #${GOPATH}/bin/buildtools genesis timestamp -f ${PKG_ROOT}/genesis/genesis.json -t ${TIMESTAMP} + #${GOPATHBIN}/buildtools genesis timestamp -f ${PKG_ROOT}/genesis/genesis.json -t ${TIMESTAMP} fi TOOLS_ROOT=${PKG_ROOT}/tools @@ -113,7 +114,7 @@ echo "Staging tools package files" bin_files=("algons" "auctionconsole" "auctionmaster" "auctionminion" "coroner" "dispenser" "netgoal" "nodecfg" "pingpong" "cc_service" "cc_agent" "cc_client" "COPYING") mkdir -p ${TOOLS_ROOT} for bin in "${bin_files[@]}"; do - cp ${GOPATH}/bin/${bin} ${TOOLS_ROOT} + cp ${GOPATHBIN}/${bin} ${TOOLS_ROOT} if [ $? -ne 0 ]; then exit 1; fi done diff --git a/scripts/check_deps.sh b/scripts/check_deps.sh index d61f49c93a..92fb4f49d7 100755 --- a/scripts/check_deps.sh +++ b/scripts/check_deps.sh @@ -25,7 +25,7 @@ GO_BIN="$(echo "$GOPATH" | cut -d: -f1)/bin" MISSING=0 missing_dep() { - echo "$YELLOW_FG[WARNING]$END_FG_COLOR Mising dependency \`$TEAL_FG${1}$END_FG_COLOR\`." + echo "$YELLOW_FG[WARNING]$END_FG_COLOR Missing dependency \`$TEAL_FG${1}$END_FG_COLOR\`." MISSING=1 } @@ -52,6 +52,12 @@ check_deps() { then missing_dep shellcheck fi + + # Don't print `sqlite3`s location. + if ! which sqlite3 > /dev/null + then + missing_dep sqlite3 + fi } check_deps @@ -60,7 +66,7 @@ if [ $MISSING -eq 0 ] then echo "$GREEN_FG[$0]$END_FG_COLOR Required dependencies installed." else - echo -e "$RED_FG[$0]$END_FG_COLOR Required dependencies missing. Run \`${TEAL_FG}./scripts/configure-dev.sh$END_FG_COLOR\` to install." + echo -e "$RED_FG[$0]$END_FG_COLOR Required dependencies missing. Run \`${TEAL_FG}./scripts/configure_dev.sh$END_FG_COLOR\` to install." exit 1 fi diff --git a/scripts/configure_dev.sh b/scripts/configure_dev.sh index 1d4721bc9a..11ce3ac421 100755 --- a/scripts/configure_dev.sh +++ b/scripts/configure_dev.sh @@ -21,7 +21,7 @@ if [ "${OS}" = "linux" ]; then fi sudo apt-get update - sudo apt-get install -y libboost-all-dev expect jq autoconf shellcheck + sudo apt-get install -y libboost-all-dev expect jq autoconf shellcheck sqlite3 elif [ "${OS}" = "darwin" ]; then brew update brew tap homebrew/cask diff --git a/scripts/deploy_linux_version.sh b/scripts/deploy_linux_version.sh index 2bda582501..c1be6b2304 100755 --- a/scripts/deploy_linux_version.sh +++ b/scripts/deploy_linux_version.sh @@ -16,7 +16,7 @@ export GOPATH=$(go env GOPATH) # Anchor our repo root reference location REPO_ROOT="$( cd "$(dirname "$0")" ; pwd -P )"/.. -cd ${REPO_ROOT}/.. +cd ${REPO_ROOT} SRCPATH=${REPO_ROOT} TMPDIR="${SRCPATH}/tmp" diff --git a/scripts/get_latest_go.py b/scripts/release/archive/get_latest_go.py similarity index 100% rename from scripts/get_latest_go.py rename to scripts/release/archive/get_latest_go.py diff --git a/scripts/release/build/Jenkinsfile b/scripts/release/build/Jenkinsfile index d5bdde05cb..788e02dfb3 100644 --- a/scripts/release/build/Jenkinsfile +++ b/scripts/release/build/Jenkinsfile @@ -11,9 +11,7 @@ pipeline { agent { dockerfile { filename 'scripts/release/common/docker/setup.Dockerfile' - /* - args '-v /etc/passwd:/etc/passwd' - */ + args '-u root' } } @@ -55,6 +53,12 @@ pipeline { } } + stage("verify signatures") { + steps { + sh script: "scripts/release/build/stage/verify/run.sh" + } + } + stage("upload") { steps { script { diff --git a/scripts/release/build/rpm/build.sh b/scripts/release/build/rpm/build.sh index 45810ca98b..c84efbee0b 100755 --- a/scripts/release/build/rpm/build.sh +++ b/scripts/release/build/rpm/build.sh @@ -11,13 +11,21 @@ export HOME=/root . "${HOME}"/subhome/build_env -GIT_REPO_PATH=https://github.com/algorand/go-algorand mkdir -p "${HOME}/go/src/github.com/algorand" -cd "${HOME}/go/src/github.com/algorand" && git clone --single-branch --branch "${BRANCH}" "${GIT_REPO_PATH}" go-algorand - -# Get golang 1.12 and build its own copy of go-algorand. +cd "${HOME}/go/src/github.com/algorand" +if ! git clone --single-branch --branch "${BRANCH}" https://github.com/algorand/go-algorand go-algorand +then + echo There has been a problem cloning the "$BRANCH" branch. + exit 1 +fi + +# Get golang 1.12.9 and build its own copy of go-algorand. cd "${HOME}" -python3 "${HOME}/go/src/github.com/algorand/go-algorand/scripts/get_latest_go.py" --version-prefix=1.12 +if ! curl -O https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz +then + echo Golang could not be installed! + exit 1 +fi bash -c "cd /usr/local && tar zxf ${HOME}/go*.tar.gz" GOPATH=$(/usr/local/go/bin/go env GOPATH) @@ -29,7 +37,6 @@ REPO_DIR=/root/go/src/github.com/algorand/go-algorand # Build! "${REPO_DIR}"/scripts/configure_dev-deps.sh cd "${REPO_DIR}" -make crypto/lib/libsodium.a make build # Copy binaries to the host for use in the packaging stage. diff --git a/scripts/release/build/stage/build/run.sh b/scripts/release/build/stage/build/run.sh index 87245ee664..62acf252c8 100755 --- a/scripts/release/build/stage/build/run.sh +++ b/scripts/release/build/stage/build/run.sh @@ -2,6 +2,8 @@ set -ex +trap 'bash ./scripts/release/common/ec2/shutdown.sh' ERR + # Path(s) are relative to the root of the Jenkins workspace. ssh -i ReleaseBuildInstanceKey.pem -A ubuntu@"$(cat scripts/release/common/ec2/tmp/instance)" bash go/src/github.com/algorand/go-algorand/scripts/release/build/stage/build/task.sh diff --git a/scripts/release/build/stage/build/task.sh b/scripts/release/build/stage/build/task.sh index a10955979f..ca8df5ce17 100755 --- a/scripts/release/build/stage/build/task.sh +++ b/scripts/release/build/stage/build/task.sh @@ -33,7 +33,7 @@ fi # Run RPM build in Centos7 Docker container sg docker "docker build -t algocentosbuild - < $HOME/go/src/github.com/algorand/go-algorand/scripts/release/common/docker/centos.Dockerfile" -sg docker "docker run --rm --mount type=bind,src=${HOME},dst=/root/subhome algocentosbuild /root/subhome/go/src/github.com/algorand/go-algorand/scripts/release/build/rpm/build.sh" +sg docker "docker run --rm --env-file ${HOME}/build_env_docker --mount type=bind,src=${HOME},dst=/root/subhome algocentosbuild /root/subhome/go/src/github.com/algorand/go-algorand/scripts/release/build/rpm/build.sh" echo date "+build_release end BUILD stage %Y%m%d_%H%M%S" diff --git a/scripts/release/build/stage/package/run.sh b/scripts/release/build/stage/package/run.sh index 08e7ed86e1..8bcd9b32cd 100755 --- a/scripts/release/build/stage/package/run.sh +++ b/scripts/release/build/stage/package/run.sh @@ -2,6 +2,8 @@ set -ex +trap 'bash ./scripts/release/common/ec2/shutdown.sh' ERR + # Path(s) are relative to the root of the Jenkins workspace. ssh -i ReleaseBuildInstanceKey.pem -A ubuntu@"$(cat scripts/release/common/ec2/tmp/instance)" bash go/src/github.com/algorand/go-algorand/scripts/release/build/stage/package/task.sh diff --git a/scripts/release/build/stage/setup/run.sh b/scripts/release/build/stage/setup/run.sh index 2cb79accb9..80916a9eee 100755 --- a/scripts/release/build/stage/setup/run.sh +++ b/scripts/release/build/stage/setup/run.sh @@ -3,9 +3,11 @@ set -ex +trap 'bash ./scripts/release/common/ec2/shutdown.sh' ERR + # Path(s) are relative to the root of the Jenkins workspace. -INSTANCE=$(cat scripts/release/common/ec2/tmp/instance) -BRANCH="$1" +BRANCH=$(./scripts/release/util/check_remote.sh "$1") +INSTANCE=$(cat ./scripts/release/common/ec2/tmp/instance) aws s3 cp s3://algorand-devops-misc/tools/gnupg2.2.9_centos7_amd64.tar.bz2 . scp -i ReleaseBuildInstanceKey.pem -o StrictHostKeyChecking=no -r scripts/release/common/setup.sh gnupg2.2.9_centos7_amd64.tar.bz2 ubuntu@"$INSTANCE": diff --git a/scripts/release/build/stage/sign/run.sh b/scripts/release/build/stage/sign/run.sh index 7fd86557e8..4c40ddf67b 100755 --- a/scripts/release/build/stage/sign/run.sh +++ b/scripts/release/build/stage/sign/run.sh @@ -2,6 +2,8 @@ set -ex +trap 'bash ./scripts/release/common/ec2/shutdown.sh' ERR + # Path(s) are relative to the root of the Jenkins workspace. ssh -i ReleaseBuildInstanceKey.pem -A ubuntu@"$(cat scripts/release/common/ec2/tmp/instance)" bash go/src/github.com/algorand/go-algorand/scripts/release/build/stage/sign/task.sh diff --git a/scripts/release/build/stage/upload/run.sh b/scripts/release/build/stage/upload/run.sh index c96d2d9158..83a7b5d731 100755 --- a/scripts/release/build/stage/upload/run.sh +++ b/scripts/release/build/stage/upload/run.sh @@ -2,6 +2,8 @@ set -ex +trap 'bash ./scripts/release/common/ec2/shutdown.sh' ERR + # Path(s) are relative to the root of the Jenkins workspace. #BUCKET_LOCATION="$2" @@ -15,8 +17,6 @@ rm -rf pkg && mkdir -p pkg/"$FULLVERSION" ssh -i ReleaseBuildInstanceKey.pem -A ubuntu@"$INSTANCE" bash go/src/github.com/algorand/go-algorand/scripts/release/build/stage/upload/task.sh scp -i ReleaseBuildInstanceKey.pem -o StrictHostKeyChecking=no -r ubuntu@"$INSTANCE":~/node_pkg/* pkg/"$FULLVERSION"/ -# Create the buildlog file. -scp -i ReleaseBuildInstanceKey.pem -o StrictHostKeyChecking=no ubuntu@"$INSTANCE":~/build_status_"$CHANNEL"_*.asc.gz pkg/"$FULLVERSION" #aws s3 sync --exclude dev* --exclude master* --exclude nightly* --exclude stable* --acl public-read pkg/"$FULLVERSION" s3://"$BUCKET_LOCATION"/"$CHANNEL"/"$FULLVERSION"/ aws s3 sync --exclude dev* --exclude master* --exclude nightly* --exclude stable* --acl public-read pkg/"$FULLVERSION" s3://ben-test-2.0.3/"$CHANNEL"/"$FULLVERSION"/ diff --git a/scripts/release/build/stage/upload/task.sh b/scripts/release/build/stage/upload/task.sh index bfb53dbf0d..23d39a4171 100755 --- a/scripts/release/build/stage/upload/task.sh +++ b/scripts/release/build/stage/upload/task.sh @@ -58,7 +58,7 @@ EOF # Note this file is scp'd in stage/upload.sh dpkg -l >> "${STATUSFILE}" gpg --clearsign "${STATUSFILE}" -gzip "${STATUSFILE}".asc > "${HOME}"/node_pkg/"${STATUSFILE}".asc.gz +gzip -c "${STATUSFILE}".asc > "${HOME}"/node_pkg/"${STATUSFILE}".asc.gz echo date "+build_release end UPLOAD stage %Y%m%d_%H%M%S" diff --git a/scripts/release/build/stage/verify/run.sh b/scripts/release/build/stage/verify/run.sh new file mode 100755 index 0000000000..0c984d4d18 --- /dev/null +++ b/scripts/release/build/stage/verify/run.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -ex + +trap 'bash ./scripts/release/common/ec2/shutdown.sh' ERR + +# Path(s) are relative to the root of the Jenkins workspace. +ssh -i ReleaseBuildInstanceKey.pem -A ubuntu@"$(cat scripts/release/common/ec2/tmp/instance)" bash go/src/github.com/algorand/go-algorand/scripts/release/build/stage/verify/task.sh + diff --git a/scripts/release/build/stage/verify/task.sh b/scripts/release/build/stage/verify/task.sh new file mode 100755 index 0000000000..038e6e36f4 --- /dev/null +++ b/scripts/release/build/stage/verify/task.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +set -ex + +echo +date "+build_release begin VERIFY %Y%m%d_%H%M%S" +echo + +RETVAL=0 + +cd "$HOME/node_pkg" + +for file in *.{gz,deb,rpm} +do + key_id=dev@algorand.com + + # Check the filename extension. + if [ "${file##*.}" == "rpm" ] + then + key_id=rpm@algorand.com + fi + + if ! gpg -u "$key_id" --verify "$file".sig "$file" + then + echo -e "[$0] Could not verify signature for $file" + RETVAL=1 + fi +done + +if [ $RETVAL -eq 0 ] +then + echo -e "[$0] All signatures have been verified as good." +fi + +echo +date "+build_release end VERIFY stage %Y%m%d_%H%M%S" +echo + +exit $RETVAL + diff --git a/scripts/release/common/docker/setup.Dockerfile b/scripts/release/common/docker/setup.Dockerfile index d68331b62c..b2c15664ba 100644 --- a/scripts/release/common/docker/setup.Dockerfile +++ b/scripts/release/common/docker/setup.Dockerfile @@ -1,5 +1,16 @@ +# Note that we're installing `awscli` from pip rather than from the apt repository because of +# the following error message: +# +# upload failed: pkg/2.0.63803/build_status_dev_2.0.63803.asc.gz to s3://{upload_location}/build_status_dev_2.0.63803.asc.gz seek() takes 2 positional arguments but 3 were given +# +# Note that the error only seems to occur when there is a file to upload with zero bytes, +# but just to be safe we'll still use pip to download and install. +# +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=869194 +# https://github.com/boto/s3transfer/pull/102 + FROM ubuntu:18.04 -RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y awscli jq ssh -#RUN adduser --uid $(grep jenkins /etc/passwd | awk -F: '{ print $3 }') ubuntu -RUN adduser --uid 111 ubuntu +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y jq git python python-pip python3-boto3 ssh && \ + pip install awscli diff --git a/scripts/release/common/ec2/shutdown.sh b/scripts/release/common/ec2/shutdown.sh index 8cc312eeb4..67b5fc5aa5 100755 --- a/scripts/release/common/ec2/shutdown.sh +++ b/scripts/release/common/ec2/shutdown.sh @@ -1,18 +1,12 @@ #!/usr/bin/env bash # shellcheck disable=2164 -AWS_REGION="$1" +AWS_REGION="${1:-us-west-1}" GREEN_FG=$(echo -en "\e[32m") YELLOW_FG=$(echo -en "\e[33m") END_FG_COLOR=$(echo -en "\e[39m") REPO_ROOT="$( cd "$(dirname "$0")" ; pwd -P )" -if [ "$AWS_REGION" = "" ] -then - echo "Missing AWS_REGION argument" - exit 1 -fi - pushd "$REPO_ROOT"/tmp > /dev/null SGID=$(cat sgid) INSTANCE_ID=$(cat instance-id) diff --git a/scripts/release/common/setup.sh b/scripts/release/common/setup.sh index 069258b279..1901a947c6 100755 --- a/scripts/release/common/setup.sh +++ b/scripts/release/common/setup.sh @@ -7,17 +7,25 @@ if [ -z "${BUILDTIMESTAMP}" ]; then BUILDTIMESTAMP=$(cat "${HOME}/buildtimestamp") export BUILDTIMESTAMP echo run "${0}" with output to "${HOME}/buildlog_${BUILDTIMESTAMP}" - (bash "${0}" "${1}" 2>&1) | tee "${HOME}/buildlog_${BUILDTIMESTAMP}" - exit 0 + bash "${0}" "${1}" 2>&1 | tee "${HOME}/buildlog_${BUILDTIMESTAMP}" + # http://tldp.org/LDP/abs/html/internalvariables.html#PIPESTATUSREF + exit "${PIPESTATUS[0]}" fi echo date "+build_release begin SETUP stage %Y%m%d_%H%M%S" echo +# `apt-get` fails randomly when downloading package, this is a hack that "works" reasonably well. +echo -e "deb http://us.archive.ubuntu.com/ubuntu/ bionic main universe multiverse\ndeb http://archive.ubuntu.com/ubuntu/ bionic main universe multiverse" | sudo tee /etc/apt/sources.list.d/ubuntu + sudo apt-get update sudo apt-get upgrade -y -sudo apt-get install -y build-essential automake autoconf awscli docker.io git gpg nfs-common python3 rpm sqlite3 python3-boto3 g++ libtool rng-tools + +# `apt-get` fails randomly when downloading package, this is a hack that "works" reasonably well. +sudo apt-get update + +sudo apt-get install -y build-essential automake autoconf awscli docker.io git gpg nfs-common python python3 rpm sqlite3 python3-boto3 g++ libtool rng-tools sudo rngd -r /dev/urandom #umask 0077 @@ -29,15 +37,25 @@ export BRANCH # Check out mkdir -p "${HOME}/go/src/github.com/algorand" -cd "${HOME}/go/src/github.com/algorand" && git clone --single-branch --branch "${BRANCH}" https://github.com/algorand/go-algorand go-algorand -# TODO: if we are checking out a release tag, `git tag --verify` it +cd "${HOME}/go/src/github.com/algorand" +if ! git clone --single-branch --branch "${BRANCH}" https://github.com/algorand/go-algorand go-algorand +then + echo There has been a problem cloning the "$BRANCH" branch. + exit 1 +fi + +cd go-algorand +COMMIT_HASH=$(git rev-parse "${BRANCH}") export DEBIAN_FRONTEND=noninteractive -# Install latest Go +# Install latest go.1.12.9. cd "${HOME}" -python3 "${HOME}/go/src/github.com/algorand/go-algorand/scripts/get_latest_go.py" --version-prefix=1.12 -# $HOME will be interpreted by the outer shell to create the string passed to sudo bash +if ! curl -O https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz +then + echo Golang could not be installed! + exit 1 +fi sudo bash -c "cd /usr/local && tar zxf ${HOME}/go*.tar.gz" GOPATH=$(/usr/local/go/bin/go env GOPATH) @@ -95,7 +113,11 @@ EOF # Install aptly for building debian repo mkdir -p "$GOPATH/src/github.com/aptly-dev" cd "$GOPATH/src/github.com/aptly-dev" -git clone https://github.com/aptly-dev/aptly +if ! git clone https://github.com/aptly-dev/aptly +then + echo There has been a problem cloning the aptly project. + exit 1 +fi cd aptly && git fetch # As of 2019-06-06 release tag v1.3.0 is 2018-May, GnuPG 2 support was added in October but they haven't tagged a new release yet. Hash below seems to work so far. @@ -111,6 +133,7 @@ PLATFORM_SPLIT=(${PLATFORM//\// }) cat << EOF > "${HOME}"/build_env export BRANCH=${BRANCH} export CHANNEL=$("${GOPATH}"/src/github.com/algorand/go-algorand/scripts/compute_branch_channel.sh "${BRANCH}") +export COMMIT_HASH=${COMMIT_HASH} export DEFAULTNETWORK=$(PATH=${PATH} "${REPO_ROOT}"/scripts/compute_branch_network.sh) export DC_IP=$(curl --silent http://169.254.169.254/latest/meta-data/local-ipv4) export FULLVERSION=$("${GOPATH}"/src/github.com/algorand/go-algorand/scripts/compute_build_number.sh -f) diff --git a/scripts/release/prod/stage/setup/run.sh b/scripts/release/prod/stage/setup/run.sh index dcfe9f8067..901c460eb6 100755 --- a/scripts/release/prod/stage/setup/run.sh +++ b/scripts/release/prod/stage/setup/run.sh @@ -1,10 +1,14 @@ #!/usr/bin/env bash # shellcheck disable=2029 +set -ex + +trap 'bash ./scripts/release/common/ec2/shutdown.sh' ERR + # Path(s) are relative to the root of the Jenkins workspace. +BRANCH=$(./scripts/release/util/check_remote.sh "$1") INSTANCE=$(cat scripts/release/common/ec2/tmp/instance) #BUCKET="$1" -BRANCH="$1" BUILD_ENV=$(ssh -i ReleaseBuildInstanceKey.pem -o -A ubuntu@"$INSTANCE" cat build_env) CHANNEL=$(sed -n 's/.*CHANNEL=\(.*\)/\1/p' <<< "$BUILD_ENV") diff --git a/scripts/release/prod/stage/sync/run.sh b/scripts/release/prod/stage/sync/run.sh index c492a509bb..b22a94b147 100755 --- a/scripts/release/prod/stage/sync/run.sh +++ b/scripts/release/prod/stage/sync/run.sh @@ -1,6 +1,10 @@ #!/usr/bin/env bash # shellcheck disable=2029 +set -ex + +trap 'bash ./scripts/release/common/ec2/shutdown.sh' ERR + # Path(s) are relative to the root of the Jenkins workspace. STAGING="$1" PROD="$2" diff --git a/scripts/release/test/Jenkinsfile b/scripts/release/test/Jenkinsfile index 4b83d7f7e6..bcc8c825e9 100644 --- a/scripts/release/test/Jenkinsfile +++ b/scripts/release/test/Jenkinsfile @@ -15,6 +15,7 @@ pipeline { agent { dockerfile { filename 'scripts/release/common/docker/setup.Dockerfile' + args '-u root' } } diff --git a/scripts/release/test/deb/run_ubuntu.sh b/scripts/release/test/deb/run_ubuntu.sh index 0ea99246eb..8d1cab29ba 100755 --- a/scripts/release/test/deb/run_ubuntu.sh +++ b/scripts/release/test/deb/run_ubuntu.sh @@ -1,6 +1,4 @@ #!/usr/bin/env bash -# -# This script exists to give a trap atexit context for killing the httpd so that we're not waiting on that set -ex diff --git a/scripts/release/test/stage/setup/run.sh b/scripts/release/test/stage/setup/run.sh index c2f905cdb2..b4cd20c7b0 100755 --- a/scripts/release/test/stage/setup/run.sh +++ b/scripts/release/test/stage/setup/run.sh @@ -3,9 +3,11 @@ set -ex +trap 'bash ./scripts/release/common/ec2/shutdown.sh' ERR + # Path(s) are relative to the root of the Jenkins workspace. +BRANCH=$(./scripts/release/util/check_remote.sh "$1") INSTANCE=$(cat scripts/release/common/ec2/tmp/instance) -BRANCH="$1" aws s3 cp s3://algorand-devops-misc/tools/gnupg2.2.9_centos7_amd64.tar.bz2 . scp -i ReleaseBuildInstanceKey.pem -o StrictHostKeyChecking=no -r gnupg2.2.9_centos7_amd64.tar.bz2 ubuntu@"$INSTANCE": diff --git a/scripts/release/test/stage/test/run.sh b/scripts/release/test/stage/test/run.sh index 24e6c41fd1..1107fe7cab 100755 --- a/scripts/release/test/stage/test/run.sh +++ b/scripts/release/test/stage/test/run.sh @@ -2,6 +2,8 @@ set -ex +trap 'bash ./scripts/release/common/ec2/shutdown.sh' ERR + # Path(s) are relative to the root of the Jenkins workspace. INSTANCE=$(cat scripts/release/common/ec2/tmp/instance) diff --git a/scripts/release/test/stage/test/task.sh b/scripts/release/test/stage/test/task.sh index 1e6ac52d1b..77805bb04c 100755 --- a/scripts/release/test/stage/test/task.sh +++ b/scripts/release/test/stage/test/task.sh @@ -17,6 +17,13 @@ date "+build_release done testing ubuntu %Y%m%d_%H%M%S" "${HOME}"/go/src/github.com/algorand/go-algorand/scripts/release/test/rpm/run_centos.sh date "+build_release done testing centos %Y%m%d_%H%M%S" +echo Use Docker to perform a smoke test. +pushd "${HOME}"/go/src/github.com/algorand/go-algorand/scripts/release/test/util +# Copy all packages to the same directory where the Dockerfile will reside. +cp "${HOME}"/node_pkg/* . +./test_package.sh +popd + echo date "+build_release end TEST stage %Y%m%d_%H%M%S" echo diff --git a/scripts/release/test/util/check_sig.sh b/scripts/release/test/util/check_sig.sh new file mode 100755 index 0000000000..fdbe45426c --- /dev/null +++ b/scripts/release/test/util/check_sig.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# shellcheck disable=2045 + +if [ $# -ne 1 ] +then + echo "Usage: $0 " + exit 1 +fi + +GREEN_FG=$(tput setaf 2 2>/dev/null) +RED_FG=$(tput setaf 1 2>/dev/null) +END_FG_COLOR=$(tput sgr0 2>/dev/null) +RETVAL=0 + +pushd "$1" > /dev/null + +for file in $(ls ./*.{gz,deb,rpm}) +do + key_id=dev@algorand.com + + # Check the filename extension. + if [ "${file##*.}" == "rpm" ] + then + key_id=rpm@algorand.com + fi + + if ! gpg -u "$key_id" --verify "$file".sig "$file" + then + echo -e "$RED_FG[$0]$END_FG_COLOR Could not verify signature for $file" + RETVAL=1 + fi +done + +popd > /dev/null + +if [ $RETVAL -eq 0 ] +then + echo -e "$GREEN_FG[$0]$END_FG_COLOR All signatures have been verified as good." +fi + +exit $RETVAL + diff --git a/scripts/release/test/util/gpg-fake.sh b/scripts/release/test/util/gpg-fake.sh new file mode 100755 index 0000000000..756f108fcf --- /dev/null +++ b/scripts/release/test/util/gpg-fake.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +# shellcheck disable=2012 + +set -ex + +echo +date "+build_release begin GPG SETUP stage %Y%m%d_%H%M%S" +echo + +cat <"${HOME}/gpgbin/remote_gpg_socket" +export GOPATH=\${HOME}/go +export PATH=\${HOME}/gpgbin:${GOPATH}/bin:/usr/local/go/bin:${PATH} +gpgconf --list-dirs | grep agent-socket | awk -F: '{ print \$2 }' +EOF + +chmod +x "${HOME}/gpgbin/remote_gpg_socket" + +# This real name and email must precisely match GPG key +git config --global user.name "Algorand developers" +git config --global user.email dev@algorand.com + +# configure GnuPG to rely on forwarded remote gpg-agent +umask 0077 +touch "${HOME}/.gnupg/gpg.conf" +if grep -q no-autostart "${HOME}/.gnupg/gpg.conf"; then + echo "" +else + echo "no-autostart" >> "${HOME}/.gnupg/gpg.conf" +fi + +umask 0002 + +gpgconf --launch gpg-agent + +GNUPGHOME="${HOME}"/.gnupg +gpgconf --kill gpg-agent +chmod 700 "${GNUPGHOME}" + +cat > "${GNUPGHOME}"/keygenscript < "${GNUPGHOME}"/rpmkeygenscript < "${GNUPGHOME}"/gpg-agent.conf +# Only needed for gpg < 2.1.17 (https://wiki.gnupg.org/AgentForwarding) +#extra-socket "${HOME}"/S.gpg-agent.extra +# Enable unattended daemon mode. +allow-preset-passphrase +# Cache password 30 days. +default-cache-ttl 2592000 +max-cache-ttl 2592000 +EOF + +# Added 2020-01-20 +gpgconf --launch gpg-agent + +gpg --gen-key --batch "${GNUPGHOME}"/keygenscript +gpg --gen-key --batch "${GNUPGHOME}"/rpmkeygenscript +gpg --export -a dev@algorand.com > "${HOME}/keys/dev.pub" +gpg --export -a rpm@algorand.com > "${HOME}/keys/rpm.pub" + +gpgconf --kill gpg-agent +gpgconf --launch gpg-agent + +gpgp=$(ls /usr/lib/gnupg{2,,1}/gpg-preset-passphrase | head -1) +for name in {dev,rpm} +do + KEYGRIP=$(gpg -K --with-keygrip --textmode "$name"@algorand.com | grep Keygrip | head -1 | awk '{ print $3 }') + echo foogorand | "${gpgp}" --verbose --preset "${KEYGRIP}" +done + +echo +date "+build_release end GPG SETUP stage %Y%m%d_%H%M%S" +echo + diff --git a/scripts/release/test/util/smoke_test.sh b/scripts/release/test/util/smoke_test.sh new file mode 100755 index 0000000000..996105075f --- /dev/null +++ b/scripts/release/test/util/smoke_test.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +set -ex + +# This is currently used by `test_package.sh`. +# It is copied into a docker image at build time and then invoked at run time. + +BRANCH= +CHANNEL= +COMMIT_HASH= +FULLVERSION= + +while [ "$1" != "" ]; do + case "$1" in + -b) + shift + BRANCH="$1" + ;; + -c) + shift + CHANNEL="$1" + ;; + -h) + shift + COMMIT_HASH="$1" + ;; + -r) + shift + FULLVERSION="$1" + ;; + *) + echo "Unknown option" "$1" + exit 1 + ;; + esac + shift +done + +if [ -z "$BRANCH" ] || [ -z "$CHANNEL" ] || [ -z "$COMMIT_HASH" ] || [ -z "$FULLVERSION" ] +then + echo "[ERROR] $0 -b $BRANCH -c $CHANNEL -h $COMMIT_HASH -r $FULLVERSION" + exit 1 +fi + +echo "[$0] Testing: algod -v" +if < /etc/os-release grep Ubuntu > /dev/null +then + dpkg -i ./*.deb +else + yum install ./*.rpm -y +fi + +STR=$(algod -v) +SHORT_HASH=${COMMIT_HASH:0:8} + +# We're looking for a line that looks like the following: +# +# 2.0.4.stable [rel/stable] (commit #729b125a) +# +# Since we're passing in the full hash, we won't using the closing paren. +# Use a regex over the multi-line string. +if [[ "$STR" =~ .*"$FULLVERSION.$CHANNEL [$BRANCH] (commit #$SHORT_HASH)".* ]] +then + echo -e "[$0] The result of \`algod -v\` is a correct match.\n$STR" + exit 0 +fi + +echo "[$0] The result of \`algod -v\` is an incorrect match." +exit 1 + diff --git a/scripts/release/test/util/test_package.sh b/scripts/release/test/util/test_package.sh new file mode 100755 index 0000000000..1106db0bc6 --- /dev/null +++ b/scripts/release/test/util/test_package.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +# shellcheck disable=1090 + +# TODO: use `trap` instead of cleanup function? + +set -ex + +. "${HOME}"/build_env + +# TODO: The following error happens on centos:8 +# +# Error: +# Problem: conflicting requests +# - nothing provides yum-cron needed by algorand-2.0.4-1.x86_64 +# (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages) +# smoke_test.sh: line 47: algod: command not found + +OS_LIST=( + centos:7 +# centos:8 + fedora:28 + ubuntu:16.04 + ubuntu:18.04 +) + +FAILED=() + +if [ -z "$BRANCH" ] || [ -z "$CHANNEL" ] || [ -z "$COMMIT_HASH" ] || [ -z "$FULLVERSION" ] +then + echo "[ERROR] $0 was not provided with BRANCH, CHANNEL, COMMIT_HASH or FULLVERSION!" + exit 1 +fi + +build_images () { + # We'll use this simple tokenized Dockerfile. + # https://serverfault.com/a/72511 + TOKENIZED=$(echo -e "\ +FROM {{OS}}\n\n\ +WORKDIR /root\n\ +COPY . .\n\ +CMD [\"/bin/bash\"]") + + for item in ${OS_LIST[*]} + do + # Note: we eventually want to move to storing the Dockerfiles. + # + # Use pattern substitution here (like sed). + # ${parameter/pattern/substitution} + echo -e "${TOKENIZED/\{\{OS\}\}/$item}" > Dockerfile + if ! docker build -t "${item}-smoke-test" . + then + FAILED+=("$item") + fi + done +} + +run_images () { + for item in ${OS_LIST[*]} + do + echo "[$0] Running ${item}-test..." + if ! docker run --rm --name algorand -t "${item}-smoke-test" bash smoke_test.sh -b "$BRANCH" -c "$CHANNEL" -h "$COMMIT_HASH" -r "$FULLVERSION" + then + FAILED+=("$item") + fi + done +} + +cleanup() { + rm -f Dockerfile +} + +check_failures() { + if [ "${#FAILED[@]}" -gt 0 ] + then + echo -e "\n[$0] The following images could not be $1:" + + for failed in ${FAILED[*]} + do + echo " - $failed" + done + + echo + + cleanup + exit 1 + fi +} + +build_images +check_failures built +echo "[$0] All builds completed with no failures." + +run_images +check_failures verified +echo "[$0] All runs completed with no failures." + +cleanup + diff --git a/scripts/release/util/check_remote.sh b/scripts/release/util/check_remote.sh new file mode 100755 index 0000000000..aba935c207 --- /dev/null +++ b/scripts/release/util/check_remote.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +# When a Jenkins job watches multiple branches, the GIT_BRANCH env var can return "origin/rel/beta" +# and the remote repo name must be # stripped from the front of the string. + +BRANCH="$1" + +for repo in $(git remote) +do + pattern="$repo"/ + + if [[ "$BRANCH" =~ ^$pattern ]] + then + # Remove matching prefix. + echo "${BRANCH#$pattern}" + exit 0 + fi +done + +echo "$BRANCH" + diff --git a/scripts/travis/before_build.sh b/scripts/travis/before_build.sh index edee4e6525..49ad1a0108 100755 --- a/scripts/travis/before_build.sh +++ b/scripts/travis/before_build.sh @@ -43,13 +43,13 @@ GOPATH=$(go env GOPATH) export GOPATH export GO111MODULE=on -echo "Building libsodium-fork..." -make crypto/lib/libsodium.a - SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" OS=$("${SCRIPTPATH}"/../ostype.sh) ARCH=$("${SCRIPTPATH}"/../archtype.sh) +echo "Building libsodium-fork..." +make crypto/libs/${OS}/${ARCH}/lib/libsodium.a + if [ "${OS}-${ARCH}" = "linux-arm" ]; then echo "Skipping running 'go vet'/gofmt/golint for arm builds" exit 0 diff --git a/scripts/travis/build.sh b/scripts/travis/build.sh index ddf54989cb..6a9eb7de7d 100755 --- a/scripts/travis/build.sh +++ b/scripts/travis/build.sh @@ -58,6 +58,11 @@ scripts/travis/before_build.sh # Force re-evaluation of genesis files to see if source files changed w/o running make touch gen/generate.go +# Force re-generation of msgpack encoders/decoders with msgp. If this re-generated code +# does not match the checked-in code, some structs may have been added or updated without +# refreshing the generated codecs. The enlistment check below will error out, if so. +make msgp + if [ "${OS}-${ARCH}" = "linux-arm" ]; then # for arm, build just the basic distro MAKE_DEBUG_OPTION="" diff --git a/scripts/travis/external_build_printlog.sh b/scripts/travis/external_build_printlog.sh index f42eb8291c..54d7a8665e 100755 --- a/scripts/travis/external_build_printlog.sh +++ b/scripts/travis/external_build_printlog.sh @@ -25,7 +25,15 @@ while [ $SECONDS -lt $end ]; do aws s3 ls "${BUILD_LOG_PATH}"-"${LOG_SEQ}" ${NO_SIGN_REQUEST} 2> /dev/null > /dev/null if [ "$?" = "0" ]; then while true ; do - LOG_CHUNK=$(aws s3 cp "${BUILD_LOG_PATH}"-"${LOG_SEQ}" - ${NO_SIGN_REQUEST} 2> /dev/null) + if [ "${NO_SIGN_REQUEST}" == "--no-sign-request" ]; then + URL="${BUILD_LOG_PATH}-${LOG_SEQ}" + URL="${URL#s3://}" + URL="${URL/\//.s3.amazonaws.com/}" + URL="https://${URL}" + LOG_CHUNK=$(curl --fail "${URL}" 2> /dev/null) + else + LOG_CHUNK=$(aws s3 cp "${BUILD_LOG_PATH}"-"${LOG_SEQ}" - ${NO_SIGN_REQUEST} 2> /dev/null) + fi if [ "$?" = "0" ]; then echo "${LOG_CHUNK}" ((LOG_SEQ++)) diff --git a/test/e2e-go/cli/goal/expect/goalExpectCommon.exp b/test/e2e-go/cli/goal/expect/goalExpectCommon.exp index 50be3903fa..ec19b0a033 100755 --- a/test/e2e-go/cli/goal/expect/goalExpectCommon.exp +++ b/test/e2e-go/cli/goal/expect/goalExpectCommon.exp @@ -56,6 +56,84 @@ proc ::AlgorandGoal::Abort { ERROR } { exit 1 } +# Start the node +proc ::AlgorandGoal::StartNode { TEST_ALGO_DIR {SYSTEMD_MANAGED ""} } { + set ::GLOBAL_TEST_ALGO_DIR $TEST_ALGO_DIR + set timeout 15 + + if { [catch { + puts "node start with $TEST_ALGO_DIR" + if { $SYSTEMD_MANAGED eq "" } { + spawn goal node start -d $TEST_ALGO_DIR + expect { + timeout { close; ::AlgorandGoal::Abort "Did not recieve appropriate message during node start" } + "^Algorand node successfully started!*" {puts "Node started successfully"; close} + } + } else { + spawn goal node start -d $TEST_ALGO_DIR + expect { + timeout { close; ::AlgorandGoal::Abort "Did not recieve appropriate message during node start" } + "^This node is managed by systemd, you must run the following command to make your desired state change to your node:*" { puts "Goal showed correct error message for systemd" ; close} + } + } + } EXCEPTION] } { + puts "ERROR in StartNode: $EXCEPTION" + exit 1 + } +} + +# Stop the node +proc ::AlgorandGoal::StopNode { TEST_ALGO_DIR {SYSTEMD_MANAGED ""} } { + set ::GLOBAL_TEST_ALGO_DIR $TEST_ALGO_DIR + set timeout 15 + + if { [catch { + puts "node stop with $TEST_ALGO_DIR" + if { $SYSTEMD_MANAGED eq "" } { + spawn goal node stop -d $TEST_ALGO_DIR + expect { + timeout { close; ::AlgorandGoal::Abort "Did not recieve appropriate message during node stop" } + "*The node was successfully stopped.*" {puts "Node stopped successfully"; close} + } + } else { + spawn goal node stop -d $TEST_ALGO_DIR + expect { + timeout { close; ::AlgorandGoal::Abort "Did not recieve appropriate message during node stop" } + "*This node is managed by systemd, you must run the following command to make your desired state change to your node:*" { puts "Goal showed correct error message for systemd" ; close} + } + } + } EXCEPTION] } { + puts "ERROR in StopNode: $EXCEPTION" + exit 1 + } +} + +# Restart the node +proc ::AlgorandGoal::RestartNode { TEST_ALGO_DIR {SYSTEMD_MANAGED ""} } { + set ::GLOBAL_TEST_ALGO_DIR $TEST_ALGO_DIR + set timeout 30 + + if { [catch { + puts "node restart with $TEST_ALGO_DIR" + if { $SYSTEMD_MANAGED eq "" } { + spawn goal node restart -d $TEST_ALGO_DIR + expect { + timeout { close; ::AlgorandGoal::Abort "Did not recieve appropriate message during node restart" } + "^The node was successfully stopped.*Algorand node successfully started!*" {puts "Node restarted successfully"; close} + } + } else { + spawn goal node restart -d $TEST_ALGO_DIR + expect { + timeout { close; ::AlgorandGoal::Abort "Did not recieve appropriate message during node restart" } + "^This node is managed by systemd, you must run the following command to make your desired state change to your node:*" { puts "Goal showed correct error message for systemd" ; close} + } + } + } EXCEPTION] } { + puts "ERROR in RestartNode: $EXCEPTION" + exit 1 + } +} + # Start the network proc ::AlgorandGoal::StartNetwork { NETWORK_NAME NETWORK_TEMPLATE TEST_ALGO_DIR TEST_ROOT_DIR } { set ::GLOBAL_TEST_ALGO_DIR $TEST_ALGO_DIR diff --git a/test/e2e-go/cli/goal/expect/goalNodeSystemdTest.exp b/test/e2e-go/cli/goal/expect/goalNodeSystemdTest.exp new file mode 100644 index 0000000000..6fe0e08527 --- /dev/null +++ b/test/e2e-go/cli/goal/expect/goalNodeSystemdTest.exp @@ -0,0 +1,31 @@ +#!/usr/bin/expect -f +#exp_internal 1 +set err 0 +log_user 1 + +if { [catch { + + source goalExpectCommon.exp + set TEST_ALGO_DIR [lindex $argv 0] + set TEST_DATA_DIR [lindex $argv 1] + + puts "TEST_ALGO_DIR: $TEST_ALGO_DIR" + + spawn cp ../../../../testdata/configs/system-v0.json $TEST_ALGO_DIR/system.json + + # Start node + ::AlgorandGoal::StartNode $TEST_ALGO_DIR True + + # Restart node + ::AlgorandGoal::RestartNode $TEST_ALGO_DIR True + + # Stop node + ::AlgorandGoal::StopNode $TEST_ALGO_DIR True + + puts "Basic Goal Test Successful" + + exit 0 +} EXCEPTION] } { + puts "ERROR in goalNodeStartSystemdTest: $EXCEPTION" + exit 1 +} diff --git a/test/e2e-go/cli/goal/expect/goalNodeTest.exp b/test/e2e-go/cli/goal/expect/goalNodeTest.exp new file mode 100644 index 0000000000..d06375f2cc --- /dev/null +++ b/test/e2e-go/cli/goal/expect/goalNodeTest.exp @@ -0,0 +1,45 @@ +#!/usr/bin/expect -f +#exp_internal 1 +set err 0 +log_user 1 + +if { [catch { + + source goalExpectCommon.exp + set TEST_ALGO_DIR [lindex $argv 0] + set TEST_DATA_DIR [lindex $argv 1] + + puts "TEST_ALGO_DIR: $TEST_ALGO_DIR" + puts "TEST_DATA_DIR: $TEST_DATA_DIR" + + set TIME_STAMP [clock seconds] + + set TEST_ROOT_DIR $TEST_ALGO_DIR/root + set TEST_PRIMARY_NODE_DIR $TEST_ROOT_DIR/Primary/ + set NETWORK_NAME test_net_expect_$TIME_STAMP + set NETWORK_TEMPLATE "$TEST_DATA_DIR/nettemplates/TwoNodes50Each.json" + + # Create network + ::AlgorandGoal::StartNetwork $NETWORK_NAME $NETWORK_TEMPLATE $TEST_ALGO_DIR $TEST_ROOT_DIR + + exec sleep 5 + + # Start node + ::AlgorandGoal::StartNode $TEST_PRIMARY_NODE_DIR + + # Restart node + ::AlgorandGoal::RestartNode $TEST_PRIMARY_NODE_DIR + + # Stop node + ::AlgorandGoal::StopNode $TEST_PRIMARY_NODE_DIR + + # Shutdown the network + ::AlgorandGoal::StopNetwork $NETWORK_NAME $TEST_ALGO_DIR $TEST_ROOT_DIR + + puts "Basic Goal Test Successful" + + exit 0 +} EXCEPTION] } { + puts "ERROR in goalNodeStartSystemdTest: $EXCEPTION" + exit 1 +} diff --git a/test/e2e-go/features/catchup/basicCatchup_test.go b/test/e2e-go/features/catchup/basicCatchup_test.go index bc81235cd3..c2ad4df654 100644 --- a/test/e2e-go/features/catchup/basicCatchup_test.go +++ b/test/e2e-go/features/catchup/basicCatchup_test.go @@ -19,12 +19,13 @@ package rewards import ( "os" "path/filepath" - "runtime" "testing" "time" "github.com/stretchr/testify/require" + "github.com/algorand/go-algorand/config" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/framework/fixtures" ) @@ -71,14 +72,27 @@ func TestBasicCatchup(t *testing.T) { a.NoError(err) } +// TestCatchupOverGossip tests catchup across network versions +// The current versions are the original v1 and the upgraded to v2.1 func TestCatchupOverGossip(t *testing.T) { - if runtime.GOOS == "darwin" { - t.Skip() - } + t.Parallel() + // ledger node upgraded version, fetcher node upgraded version + runCatchupOverGossip(t, false, false) + // ledger node older version, fetcher node upgraded version + runCatchupOverGossip(t, true, false) + // ledger node upgraded older version, fetcher node older version + runCatchupOverGossip(t, false, true) + // ledger node older version, fetcher node older version + runCatchupOverGossip(t, true, true) +} + +func runCatchupOverGossip(t *testing.T, + ledgerNodeDowngrade, + fetcherNodeDowngrade bool) { + if testing.Short() { t.Skip() } - t.Parallel() a := require.New(t) // Overview of this test: // Start a two-node network (Primary with 0% stake, Secondary with 100% stake) @@ -89,7 +103,28 @@ func TestCatchupOverGossip(t *testing.T) { // Give the second node (which starts up last) all the stake so that its proposal always has better credentials, // and so that its proposal isn't dropped. Otherwise the test burns 17s to recover. We don't care about stake // distribution for catchup so this is fine. - fixture.Setup(t, filepath.Join("nettemplates", "TwoNodes100Second.json")) + fixture.SetupNoStart(t, filepath.Join("nettemplates", "TwoNodes100Second.json")) + + if ledgerNodeDowngrade { + // Force the node to only support v1 + dir, err := fixture.GetNodeDir("Node") + a.NoError(err) + cfg, err := config.LoadConfigFromDisk(dir) + a.NoError(err) + cfg.NetworkProtocolVersion = "1" + cfg.SaveToDisk(dir) + } + + if fetcherNodeDowngrade { + // Force the node to only support v1 + dir := fixture.PrimaryDataDir() + cfg, err := config.LoadConfigFromDisk(dir) + a.NoError(err) + cfg.NetworkProtocolVersion = "1" + cfg.SaveToDisk(dir) + } + + fixture.Start() defer fixture.Shutdown() ncPrim, err := fixture.GetNodeController("Primary") a.NoError(err) @@ -141,6 +176,15 @@ func TestCatchupOverGossip(t *testing.T) { } } +// consensusTestUnupgradedProtocol is a version of ConsensusCurrentVersion +// that allows the control of the upgrade from consensusTestUnupgradedProtocol to +// consensusTestUnupgradedProtocol +const consensusTestUnupgradedProtocol = protocol.ConsensusVersion("test-unupgraded-protocol") + +// consensusTestUnupgradedToProtocol is a version of ConsensusCurrentVersion +// It is used as an upgrade from consensusTestUnupgradedProtocol +const consensusTestUnupgradedToProtocol = protocol.ConsensusVersion("test-unupgradedto-protocol") + func TestStoppedCatchupOnUnsupported(t *testing.T) { if testing.Short() { t.Skip() @@ -148,8 +192,30 @@ func TestStoppedCatchupOnUnsupported(t *testing.T) { t.Parallel() a := require.New(t) - defer os.Unsetenv("ALGORAND_TEST_UNUPGRADEDPROTOCOL_DELETE_UPGRADE") - os.Setenv("ALGORAND_TEST_UNUPGRADEDPROTOCOL_DELETE_UPGRADE", "0") + consensus := make(config.ConsensusProtocols) + // The following two protocols: testUnupgradedProtocol and testUnupgradedToProtocol + // are used to test the case when some nodes in the network do not make progress. + + // testUnupgradedToProtocol is derived from ConsensusCurrentVersion and upgraded + // from testUnupgradedProtocol. + testUnupgradedToProtocol := config.Consensus[protocol.ConsensusCurrentVersion] + testUnupgradedToProtocol.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + consensus[consensusTestUnupgradedToProtocol] = testUnupgradedToProtocol + + // testUnupgradedProtocol is used to control the upgrade of a node. This is used + // to construct and run a network where some node is upgraded, and some other + // node is not upgraded. + // testUnupgradedProtocol is derived from ConsensusCurrentVersion and upgrades to + // testUnupgradedToProtocol. + testUnupgradedProtocol := config.Consensus[protocol.ConsensusCurrentVersion] + testUnupgradedProtocol.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + + testUnupgradedProtocol.UpgradeVoteRounds = 3 + testUnupgradedProtocol.UpgradeThreshold = 2 + testUnupgradedProtocol.DefaultUpgradeWaitRounds = 3 + + testUnupgradedProtocol.ApprovedUpgrades[consensusTestUnupgradedToProtocol] = 0 + consensus[consensusTestUnupgradedProtocol] = testUnupgradedProtocol // Overview of this test: // Start a two-node network (primary has 0%, secondary has 100%) @@ -157,6 +223,7 @@ func TestStoppedCatchupOnUnsupported(t *testing.T) { // Spin up a third node and see if it catches up var fixture fixtures.RestClientFixture + fixture.SetConsensus(consensus) // Give the second node (which starts up last) all the stake so that its proposal always has better credentials, // and so that its proposal isn't dropped. Otherwise the test burns 17s to recover. We don't care about stake // distribution for catchup so this is fine. @@ -173,13 +240,14 @@ func TestStoppedCatchupOnUnsupported(t *testing.T) { err = fixture.ClientWaitForRoundWithTimeout(fixture.GetAlgodClientForController(nc), waitForRound) a.NoError(err) - os.Setenv("ALGORAND_TEST_UNUPGRADEDPROTOCOL_DELETE_UPGRADE", "1") - // Now spin up third node cloneDataDir := filepath.Join(fixture.PrimaryDataDir(), "../clone") cloneLedger := false err = fixture.NC.Clone(cloneDataDir, cloneLedger) a.NoError(err) + + delete(consensus, consensusTestUnupgradedToProtocol) + fixture.GetNodeControllerForDataDir(cloneDataDir).SetConsensus(consensus) cloneClient, err := fixture.StartNode(cloneDataDir) a.NoError(err) defer shutdownClonedNode(cloneDataDir, &fixture, t) diff --git a/test/e2e-go/features/participation/participationRewards_test.go b/test/e2e-go/features/participation/participationRewards_test.go index e2c48cb631..e22649aec5 100644 --- a/test/e2e-go/features/participation/participationRewards_test.go +++ b/test/e2e-go/features/participation/participationRewards_test.go @@ -301,9 +301,25 @@ func TestRewardRateRecalculation(t *testing.T) { t.Parallel() r := require.New(t) + // consensusTestRapidRewardRecalculation is a version of ConsensusCurrentVersion + // that decreases the RewardsRateRefreshInterval greatly. + const consensusTestRapidRewardRecalculation = protocol.ConsensusVersion("test-fast-reward-recalculation") + + rapidRecalcParams := config.Consensus[protocol.ConsensusCurrentVersion] + rapidRecalcParams.RewardsRateRefreshInterval = 10 + //because rapidRecalcParams is based on ConsensusCurrentVersion, + //it *shouldn't* have any ApprovedUpgrades + //but explicitly mark "no approved upgrades" just in case + rapidRecalcParams.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + var fixture fixtures.RestClientFixture + fixture.SetConsensus(config.ConsensusProtocols{ + consensusTestRapidRewardRecalculation: rapidRecalcParams, + }) fixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50Each_RapidRewardRecalculation.json")) defer fixture.Shutdown() + consensus, err := fixture.NC.GetConsensus() + r.NoError(err) client := fixture.LibGoalClient r.NoError(fixture.WaitForRoundWithTimeout(uint64(5))) @@ -321,8 +337,9 @@ func TestRewardRateRecalculation(t *testing.T) { blk, err := client.Block(curStatus.LastRound) r.NoError(err) - consensus := config.Consensus[protocol.ConsensusVersion(blk.CurrentProtocol)] - rewardRecalcRound := consensus.RewardsRateRefreshInterval + r.Equal(protocol.ConsensusVersion(blk.CurrentProtocol), consensusTestRapidRewardRecalculation) + consensusParams := consensus[protocol.ConsensusVersion(blk.CurrentProtocol)] + rewardRecalcRound := consensusParams.RewardsRateRefreshInterval r.NoError(fixture.WaitForRoundWithTimeout(rewardRecalcRound - 1)) balanceOfRewardsPool, roundQueried := fixture.GetBalanceAndRound(rewardsAccount) if roundQueried != rewardRecalcRound-1 { @@ -333,18 +350,18 @@ func TestRewardRateRecalculation(t *testing.T) { r.NoError(fixture.WaitForRoundWithTimeout(rewardRecalcRound)) blk, err = client.Block(rewardRecalcRound) r.NoError(err) - if !consensus.PendingResidueRewards { + if !consensusParams.PendingResidueRewards { lastRoundBeforeRewardRecals.RewardsResidue = 0 } - r.Equalf((balanceOfRewardsPool-minBal-lastRoundBeforeRewardRecals.RewardsResidue)/consensus.RewardsRateRefreshInterval, blk.RewardsRate, "Mismatching (%d-%d-%d)/%d != %d @ round %d", balanceOfRewardsPool, minBal, lastRoundBeforeRewardRecals.RewardsResidue, consensus.RewardsRateRefreshInterval, blk.RewardsRate, lastRoundBeforeRewardRecals.Round) + r.Equalf((balanceOfRewardsPool-minBal-lastRoundBeforeRewardRecals.RewardsResidue)/consensusParams.RewardsRateRefreshInterval, blk.RewardsRate, "Mismatching (%d-%d-%d)/%d != %d @ round %d", balanceOfRewardsPool, minBal, lastRoundBeforeRewardRecals.RewardsResidue, consensusParams.RewardsRateRefreshInterval, blk.RewardsRate, lastRoundBeforeRewardRecals.Round) curStatus, err = client.Status() r.NoError(err) deadline = curStatus.LastRound + uint64(5) fixture.SendMoneyAndWait(deadline, amountToSend, minFee, richAccount.Address, rewardsAccount) - rewardRecalcRound = rewardRecalcRound + consensus.RewardsRateRefreshInterval + rewardRecalcRound = rewardRecalcRound + consensusParams.RewardsRateRefreshInterval r.NoError(fixture.WaitForRoundWithTimeout(rewardRecalcRound - 1)) balanceOfRewardsPool, roundQueried = fixture.GetBalanceAndRound(rewardsAccount) @@ -353,14 +370,14 @@ func TestRewardRateRecalculation(t *testing.T) { } lastRoundBeforeRewardRecals, err = client.Block(rewardRecalcRound - 1) r.NoError(err) - consensus = config.Consensus[protocol.ConsensusVersion(lastRoundBeforeRewardRecals.CurrentProtocol)] + consensusParams = consensus[protocol.ConsensusVersion(lastRoundBeforeRewardRecals.CurrentProtocol)] r.NoError(fixture.WaitForRoundWithTimeout(rewardRecalcRound)) blk, err = client.Block(rewardRecalcRound) r.NoError(err) - if !consensus.PendingResidueRewards { + if !consensusParams.PendingResidueRewards { lastRoundBeforeRewardRecals.RewardsResidue = 0 } - r.Equal((balanceOfRewardsPool-minBal-lastRoundBeforeRewardRecals.RewardsResidue)/consensus.RewardsRateRefreshInterval, blk.RewardsRate) + r.Equal((balanceOfRewardsPool-minBal-lastRoundBeforeRewardRecals.RewardsResidue)/consensusParams.RewardsRateRefreshInterval, blk.RewardsRate) // if the network keeps progressing without error, // this shows the network is healthy and that we didn't panic finalRound := rewardRecalcRound + uint64(5) diff --git a/test/e2e-go/features/transactions/asset_test.go b/test/e2e-go/features/transactions/asset_test.go index 2ff90965e0..715fa73062 100644 --- a/test/e2e-go/features/transactions/asset_test.go +++ b/test/e2e-go/features/transactions/asset_test.go @@ -19,7 +19,6 @@ package transactions import ( "fmt" "path/filepath" - "runtime" "strings" "testing" @@ -420,9 +419,6 @@ func TestAssetConfig(t *testing.T) { } func TestAssetInformation(t *testing.T) { - if runtime.GOOS == "darwin" { - t.Skip() - } t.Parallel() a := require.New(t) @@ -640,9 +636,6 @@ func TestAssetGroupCreateSendDestroy(t *testing.T) { } func TestAssetSend(t *testing.T) { - if runtime.GOOS == "darwin" { - t.Skip() - } t.Parallel() a := require.New(t) @@ -890,7 +883,7 @@ func TestAssetSend(t *testing.T) { } func TestAssetCreateWaitRestartDelete(t *testing.T) { - a, fixture, client, account0 := setupTestAndNetwork(t, "") + a, fixture, client, account0 := setupTestAndNetwork(t, "", nil) defer fixture.Shutdown() // There should be no assets to start with @@ -954,7 +947,25 @@ func TestAssetCreateWaitBalLookbackDelete(t *testing.T) { if testing.Short() { t.Skip() } - a, fixture, client, account0 := setupTestAndNetwork(t, "TwoNodes50EachTestShorterLookback.json") + configurableConsensus := make(config.ConsensusProtocols) + + consensusVersion := protocol.ConsensusVersion("test-shorter-lookback") + + // Setting the testShorterLookback parameters derived from ConsensusCurrentVersion + // Will result in MaxBalLookback = 32 + // Used to run tests faster where past MaxBalLookback values are checked + consensusParams := config.Consensus[protocol.ConsensusCurrentVersion] + consensusParams.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + + // MaxBalLookback = 2 x SeedRefreshInterval x SeedLookback + // ref. https://github.com/algorandfoundation/specs/blob/master/dev/abft.md + consensusParams.SeedLookback = 2 + consensusParams.SeedRefreshInterval = 8 + consensusParams.MaxBalLookback = 2 * consensusParams.SeedLookback * consensusParams.SeedRefreshInterval // 32 + + configurableConsensus[consensusVersion] = consensusParams + + a, fixture, client, account0 := setupTestAndNetwork(t, "TwoNodes50EachTestShorterLookback.json", configurableConsensus) defer fixture.Shutdown() // There should be no assets to start with @@ -1018,7 +1029,7 @@ func TestAssetCreateWaitBalLookbackDelete(t *testing.T) { /** Helper functions **/ // Setup the test and the network -func setupTestAndNetwork(t *testing.T, networkTemplate string) ( +func setupTestAndNetwork(t *testing.T, networkTemplate string, consensus config.ConsensusProtocols) ( Assertions *require.Assertions, Fixture *fixtures.RestClientFixture, Client *libgoal.Client, Account0 string) { t.Parallel() @@ -1028,6 +1039,9 @@ func setupTestAndNetwork(t *testing.T, networkTemplate string) ( networkTemplate = "TwoNodes50Each.json" } var fixture fixtures.RestClientFixture + if consensus != nil { + fixture.SetConsensus(consensus) + } fixture.Setup(t, filepath.Join("nettemplates", networkTemplate)) accountList, err := fixture.GetWalletsSortedByBalance() asser.NoError(err) diff --git a/test/e2e-go/features/transactions/sendReceive_test.go b/test/e2e-go/features/transactions/sendReceive_test.go index 33c313caea..2f7e59d5bf 100644 --- a/test/e2e-go/features/transactions/sendReceive_test.go +++ b/test/e2e-go/features/transactions/sendReceive_test.go @@ -19,7 +19,6 @@ package transactions import ( "math/rand" "path/filepath" - "runtime" "testing" "github.com/stretchr/testify/require" @@ -41,7 +40,7 @@ func GenerateRandomBytes(n int) []byte { // this test checks that two accounts' balances stay up to date // as they send each other money many times func TestAccountsCanSendMoney(t *testing.T) { - if runtime.GOOS == "darwin" { + if testing.Short() { t.Skip() } if testing.Short() { diff --git a/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go b/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go index 248bd37717..76d8688bd9 100644 --- a/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go +++ b/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go @@ -295,7 +295,7 @@ func TestSignTransaction(t *testing.T) { // Request a signature req1 := kmdapi.APIV1POSTTransactionSignRequest{ WalletHandleToken: walletHandleToken, - Transaction: protocol.Encode(tx), + Transaction: protocol.Encode(&tx), WalletPassword: f.WalletPassword, } resp1 := kmdapi.APIV1POSTTransactionSignResponse{} @@ -399,7 +399,7 @@ func BenchmarkSignTransaction(b *testing.B) { // Request a signature req1 := kmdapi.APIV1POSTTransactionSignRequest{ WalletHandleToken: walletHandleToken, - Transaction: protocol.Encode(tx), + Transaction: protocol.Encode(&tx), WalletPassword: f.WalletPassword, } resp1 := kmdapi.APIV1POSTTransactionSignResponse{} diff --git a/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go b/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go index 299e61f9b4..4c2e70aa13 100644 --- a/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go +++ b/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go @@ -190,7 +190,7 @@ func TestMultisigSign(t *testing.T) { // Try to sign req2 := kmdapi.APIV1POSTMultisigTransactionSignRequest{ WalletHandleToken: walletHandleToken, - Transaction: protocol.Encode(tx), + Transaction: protocol.Encode(&tx), PublicKey: pk1, PartialMsig: crypto.MultisigSig{}, WalletPassword: f.WalletPassword, @@ -206,7 +206,7 @@ func TestMultisigSign(t *testing.T) { // Try to add another signature req3 := kmdapi.APIV1POSTMultisigTransactionSignRequest{ WalletHandleToken: walletHandleToken, - Transaction: protocol.Encode(tx), + Transaction: protocol.Encode(&tx), PublicKey: pk2, PartialMsig: msig, WalletPassword: f.WalletPassword, diff --git a/test/e2e-go/perf/basic_test.go b/test/e2e-go/perf/basic_test.go index d027329c10..f511ddae92 100644 --- a/test/e2e-go/perf/basic_test.go +++ b/test/e2e-go/perf/basic_test.go @@ -85,7 +85,20 @@ func BenchmarkPaymentsThroughput(b *testing.B) { func doBenchTemplate(b *testing.B, template string, moneynode string) { fmt.Printf("Starting to benchmark template %s\n", template) + // consensusTestBigBlocks is a version of ConsensusV0 used for testing + // with big block size (large MaxTxnBytesPerBlock). + // at the time versioning was introduced. + const consensusTestBigBlocks = protocol.ConsensusVersion("test-big-blocks") + var fixture fixtures.RestClientFixture + + testBigBlocks := config.Consensus[protocol.ConsensusCurrentVersion] + testBigBlocks.MaxTxnBytesPerBlock = 100000000 + testBigBlocks.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + + fixture.SetConsensus(config.ConsensusProtocols{ + consensusTestBigBlocks: testBigBlocks, + }) fixture.Setup(b, filepath.Join("nettemplates", template)) defer fixture.Shutdown() diff --git a/test/e2e-go/restAPI/restClient_test.go b/test/e2e-go/restAPI/restClient_test.go index dfd875e6a2..9938b31900 100644 --- a/test/e2e-go/restAPI/restClient_test.go +++ b/test/e2e-go/restAPI/restClient_test.go @@ -24,7 +24,6 @@ import ( "math/rand" "os" "path/filepath" - "runtime" "strings" "testing" "time" @@ -196,9 +195,6 @@ func TestClientCanGetStatusAfterBlock(t *testing.T) { } func TestTransactionsByAddr(t *testing.T) { - if runtime.GOOS == "darwin" { - t.Skip() - } var localFixture fixtures.RestClientFixture localFixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50Each.json")) defer localFixture.Shutdown() diff --git a/test/e2e-go/upgrades/send_receive_upgrade_test.go b/test/e2e-go/upgrades/send_receive_upgrade_test.go index 5367ffaf42..e748a55189 100644 --- a/test/e2e-go/upgrades/send_receive_upgrade_test.go +++ b/test/e2e-go/upgrades/send_receive_upgrade_test.go @@ -26,6 +26,8 @@ import ( "github.com/stretchr/testify/require" + "github.com/algorand/go-algorand/config" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/framework/fixtures" ) @@ -102,11 +104,43 @@ func TestAccountsCanSendMoneyAcrossUpgradeV15toV16(t *testing.T) { testAccountsCanSendMoneyAcrossUpgrade(t, filepath.Join("nettemplates", "TwoNodes50EachV15Upgrade.json")) } +// ConsensusTestFastUpgrade is meant for testing of protocol upgrades: +// during testing, it is equivalent to another protocol with the exception +// of the upgrade parameters, which allow for upgrades to take place after +// only a few rounds. +func consensusTestFastUpgrade(proto protocol.ConsensusVersion) protocol.ConsensusVersion { + return "test-fast-upgrade-" + proto +} + +func generateFastUpgradeConsensus() (fastUpgradeProtocols config.ConsensusProtocols) { + fastUpgradeProtocols = make(config.ConsensusProtocols) + + for proto, params := range config.Consensus { + fastParams := params + fastParams.UpgradeVoteRounds = 5 + fastParams.UpgradeThreshold = 3 + fastParams.DefaultUpgradeWaitRounds = 5 + fastParams.MaxVersionStringLen += len(consensusTestFastUpgrade("")) + fastParams.ApprovedUpgrades = make(map[protocol.ConsensusVersion]uint64) + + for ver := range params.ApprovedUpgrades { + fastParams.ApprovedUpgrades[consensusTestFastUpgrade(ver)] = 0 + } + + fastUpgradeProtocols[consensusTestFastUpgrade(proto)] = fastParams + } + return +} + func testAccountsCanSendMoneyAcrossUpgrade(t *testing.T, templatePath string) { t.Parallel() a := require.New(t) os.Setenv("ALGOSMALLLAMBDAMSEC", "500") + + consensus := generateFastUpgradeConsensus() + var fixture fixtures.RestClientFixture + fixture.SetConsensus(consensus) fixture.Setup(t, templatePath) defer fixture.Shutdown() c := fixture.LibGoalClient diff --git a/test/framework/fixtures/auctionFixture.go b/test/framework/fixtures/auctionFixture.go index 67665f0729..f4ebe9296a 100644 --- a/test/framework/fixtures/auctionFixture.go +++ b/test/framework/fixtures/auctionFixture.go @@ -537,7 +537,7 @@ func (f *AuctionFixture) readAndDecode(filePath string, obj interface{}) { return } - err = protocol.Decode(data, obj) + err = protocol.DecodeReflect(data, obj) if err != nil { f.t.Errorf("Decoding from %s: %v", filePath, err) return @@ -842,7 +842,7 @@ func (f *AuctionFixture) signBid(walletHandle []byte, password string, account s return } - signedBidNote = client.BytesBase64(protocol.Encode(auction.NoteField{ + signedBidNote = client.BytesBase64(protocol.Encode(&auction.NoteField{ Type: auction.NoteBid, SignedBid: auction.SignedBid{ Bid: bid, diff --git a/test/framework/fixtures/libgoalFixture.go b/test/framework/fixtures/libgoalFixture.go index ffc11f12a7..b8ea76404d 100644 --- a/test/framework/fixtures/libgoalFixture.go +++ b/test/framework/fixtures/libgoalFixture.go @@ -53,6 +53,13 @@ type LibGoalFixture struct { t TestingT tMu deadlock.RWMutex clientPartKeys map[string][]account.Participation + consensus config.ConsensusProtocols +} + +// SetConsensus applies a new consensus settings which would get deployed before +// any of the nodes starts +func (f *RestClientFixture) SetConsensus(consensus config.ConsensusProtocols) { + f.consensus = consensus } // Setup is called to initialize the test fixture for the test(s) @@ -86,7 +93,7 @@ func (f *LibGoalFixture) setup(test TestingT, testName string, templateFile stri os.RemoveAll(f.rootDir) templateFile = filepath.Join(f.testDataDir, templateFile) importKeys := false // Don't automatically import root keys when creating folders, we'll import on-demand - network, err := netdeploy.CreateNetworkFromTemplate("test", f.rootDir, templateFile, f.binDir, importKeys, f.nodeExitWithError) + network, err := netdeploy.CreateNetworkFromTemplate("test", f.rootDir, templateFile, f.binDir, importKeys, f.nodeExitWithError, f.consensus) f.failOnError(err, "CreateNetworkFromTemplate failed: %v") f.network = network @@ -448,8 +455,15 @@ func (f *LibGoalFixture) ConsensusParams(round uint64) (consensus config.Consens if err != nil { return } - - return config.Consensus[protocol.ConsensusVersion(block.CurrentProtocol)], nil + version := protocol.ConsensusVersion(block.CurrentProtocol) + if f.consensus != nil { + consensus, has := f.consensus[version] + if has { + return consensus, nil + } + } + consensus = config.Consensus[version] + return } // CurrentMinFeeAndBalance returns the MinTxnFee and MinBalance for the currently active protocol diff --git a/test/framework/fixtures/restClientFixture.go b/test/framework/fixtures/restClientFixture.go index 535275d086..b9b384bfde 100644 --- a/test/framework/fixtures/restClientFixture.go +++ b/test/framework/fixtures/restClientFixture.go @@ -48,7 +48,6 @@ func (f *RestClientFixture) Setup(t TestingT, templateFile string) { // but does not start the network before returning. Call NC.Start() to start later. func (f *RestClientFixture) SetupNoStart(t TestingT, templateFile string) { f.LibGoalFixture.SetupNoStart(t, templateFile) - f.AlgodClient = f.GetAlgodClientForController(f.NC) } // SetupShared is called to initialize the test fixture that will be used for multiple tests diff --git a/test/scripts/e2e_client_runner.py b/test/scripts/e2e_client_runner.py index 72da5ba8c8..aef12cfe39 100755 --- a/test/scripts/e2e_client_runner.py +++ b/test/scripts/e2e_client_runner.py @@ -316,25 +316,25 @@ def xrun(cmd, *args, **kwargs): cmdr = repr(cmd) logger.error('subprocess timed out {}'.format(cmdr), exc_info=True) if p.stdout: - sys.stderr.write('output from {}:\n{}\n\n'.format(cmdr, p.stdout)) + sys.stderr.write('output from {}:\n{}\n\n'.format(cmdr, p.stdout.read())) if p.stderr: - sys.stderr.write('stderr from {}:\n{}\n\n'.format(cmdr, p.stderr)) + sys.stderr.write('stderr from {}:\n{}\n\n'.format(cmdr, p.stderr.read())) raise except Exception as e: cmdr = repr(cmd) logger.error('subprocess exception {}'.format(cmdr), exc_info=True) if p.stdout: - sys.stderr.write('output from {}:\n{}\n\n'.format(cmdr, p.stdout)) + sys.stderr.write('output from {}:\n{}\n\n'.format(cmdr, p.stdout.read())) if p.stderr: - sys.stderr.write('stderr from {}:\n{}\n\n'.format(cmdr, p.stderr)) + sys.stderr.write('stderr from {}:\n{}\n\n'.format(cmdr, p.stderr.read())) raise if p.returncode != 0: cmdr = repr(cmd) logger.error('cmd failed {}'.format(cmdr)) if p.stdout: - sys.stderr.write('output from {}:\n{}\n\n'.format(cmdr, p.stdout)) + sys.stderr.write('output from {}:\n{}\n\n'.format(cmdr, p.stdout.read())) if p.stderr: - sys.stderr.write('stderr from {}:\n{}\n\n'.format(cmdr, p.stderr)) + sys.stderr.write('stderr from {}:\n{}\n\n'.format(cmdr, p.stderr.read())) raise Exception('error: cmd failed: {}'.format(cmdr)) _logging_format = '%(asctime)s :%(lineno)d %(message)s' diff --git a/test/testdata/configs/config-v5.json b/test/testdata/configs/config-v5.json index 984e9aa3c5..fee988caf3 100644 --- a/test/testdata/configs/config-v5.json +++ b/test/testdata/configs/config-v5.json @@ -10,6 +10,7 @@ "ConnectionsRateLimitingWindowSeconds": 1, "ConnectionsRateLimitingCount": 60, "DeadlockDetection": 0, + "DisableOutgoingConnectionThrottling": false, "DNSBootstrapID": ".algorand.network", "EnableAgreementReporting": false, "EnableIncomingMessageFilter": false, @@ -31,6 +32,7 @@ "NodeExporterPath": "./node_exporter", "OutgoingMessageFilterBucketCount": 3, "OutgoingMessageFilterBucketSize": 128, + "PeerConnectionsUpdateInterval": 3600, "PriorityPeers": {}, "ReconnectTime": 60000000000, "ReservedFDs": 256, @@ -38,12 +40,11 @@ "RestWriteTimeoutSeconds": 120, "RunHosted": false, "SuggestedFeeBlockHistory": 3, + "SuggestedFeeSlidingWindowSize": 50, "TelemetryToLog": true, "TxPoolExponentialIncreaseFactor": 2, "TxPoolSize": 15000, "TxSyncIntervalSeconds": 60, "TxSyncTimeoutSeconds": 30, - "TxSyncServeResponseSize": 1000000, - "SuggestedFeeSlidingWindowSize": 50, - "PeerConnectionsUpdateInterval": 3600 + "TxSyncServeResponseSize": 1000000 } diff --git a/test/testdata/configs/config-v6.json b/test/testdata/configs/config-v6.json new file mode 100644 index 0000000000..e56e6f1388 --- /dev/null +++ b/test/testdata/configs/config-v6.json @@ -0,0 +1,51 @@ +{ + "Version": 6, + "AnnounceParticipationKey": true, + "Archival": false, + "BaseLoggerDebugLevel": 4, + "BroadcastConnectionsLimit": -1, + "CadaverSizeTarget": 1073741824, + "CatchupFailurePeerRefreshRate": 10, + "CatchupParallelBlocks": 16, + "ConnectionsRateLimitingWindowSeconds": 1, + "ConnectionsRateLimitingCount": 60, + "DeadlockDetection": 0, + "DNSBootstrapID": ".algorand.network", + "EnableAgreementReporting": false, + "EnableIncomingMessageFilter": false, + "EnableMetricReporting": false, + "EnableOutgoingNetworkMessageFiltering": true, + "EnableRequestLogger": false, + "EnableTopAccountsReporting": false, + "EndpointAddress": "127.0.0.1:0", + "GossipFanout": 4, + "IncomingConnectionsLimit": 10000, + "IncomingMessageFilterBucketCount": 5, + "IncomingMessageFilterBucketSize": 512, + "LogArchiveMaxAge": "", + "LogArchiveName": "node.archive.log", + "LogSizeLimit": 1073741824, + "MaxConnectionsPerIP": 30, + "NetAddress": "", + "NodeExporterListenAddress": ":9100", + "NodeExporterPath": "./node_exporter", + "OutgoingMessageFilterBucketCount": 3, + "OutgoingMessageFilterBucketSize": 128, + "PriorityPeers": {}, + "ReconnectTime": 60000000000, + "ReservedFDs": 256, + "RestReadTimeoutSeconds": 15, + "RestWriteTimeoutSeconds": 120, + "RunHosted": false, + "SuggestedFeeBlockHistory": 3, + "TelemetryToLog": true, + "TxPoolExponentialIncreaseFactor": 2, + "TxPoolSize": 15000, + "TxSyncIntervalSeconds": 60, + "TxSyncTimeoutSeconds": 30, + "TxSyncServeResponseSize": 1000000, + "SuggestedFeeSlidingWindowSize": 50, + "PeerConnectionsUpdateInterval": 3600, + "DNSSecurityFlags": 1, + "EnablePingHandler": true +} diff --git a/test/testdata/configs/system-v0.json b/test/testdata/configs/system-v0.json new file mode 100644 index 0000000000..7828bb4ee5 --- /dev/null +++ b/test/testdata/configs/system-v0.json @@ -0,0 +1,4 @@ +{ + "systemd_managed": true, + "shared_server": true +} diff --git a/test/testdata/deployednettemplates/recipes/scenario3/genesis.json b/test/testdata/deployednettemplates/recipes/scenario3/genesis.json index fe07d441d7..1c489157d2 100644 --- a/test/testdata/deployednettemplates/recipes/scenario3/genesis.json +++ b/test/testdata/deployednettemplates/recipes/scenario3/genesis.json @@ -1,7 +1,7 @@ { "NetworkName": "", "VersionModifier": "", - "ConsensusProtocol": "future", + "ConsensusProtocol": "", "FirstPartKeyRound": 0, "LastPartKeyRound": 3000000, "PartKeyDilution": 0, diff --git a/test/testdata/deployednettemplates/recipes/scenario3/net.json b/test/testdata/deployednettemplates/recipes/scenario3/net.json index 09ac1a84fc..c2bc2b2dad 100644 --- a/test/testdata/deployednettemplates/recipes/scenario3/net.json +++ b/test/testdata/deployednettemplates/recipes/scenario3/net.json @@ -15,7 +15,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -34,7 +34,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -53,7 +53,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -72,7 +72,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -91,7 +91,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -110,7 +110,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -129,7 +129,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -148,7 +148,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -167,7 +167,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -186,7 +186,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -205,7 +205,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -224,7 +224,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -243,7 +243,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -262,7 +262,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -281,7 +281,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -300,7 +300,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -319,7 +319,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -338,7 +338,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -357,7 +357,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -376,7 +376,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -434,7 +434,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node101", @@ -487,7 +487,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node201", @@ -540,7 +540,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node301", @@ -593,7 +593,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node401", @@ -646,7 +646,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node501", @@ -699,7 +699,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node601", @@ -752,7 +752,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node701", @@ -805,7 +805,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node801", @@ -858,7 +858,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node901", @@ -911,7 +911,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -969,7 +969,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node102", @@ -1022,7 +1022,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node202", @@ -1075,7 +1075,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node302", @@ -1128,7 +1128,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node402", @@ -1181,7 +1181,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node502", @@ -1234,7 +1234,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node602", @@ -1287,7 +1287,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node702", @@ -1340,7 +1340,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node802", @@ -1393,7 +1393,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node902", @@ -1446,7 +1446,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -1504,7 +1504,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node103", @@ -1557,7 +1557,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node203", @@ -1610,7 +1610,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node303", @@ -1663,7 +1663,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node403", @@ -1716,7 +1716,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node503", @@ -1769,7 +1769,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node603", @@ -1822,7 +1822,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node703", @@ -1875,7 +1875,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node803", @@ -1928,7 +1928,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node903", @@ -1981,7 +1981,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -2039,7 +2039,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node104", @@ -2092,7 +2092,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node204", @@ -2145,7 +2145,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node304", @@ -2198,7 +2198,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node404", @@ -2251,7 +2251,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node504", @@ -2304,7 +2304,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node604", @@ -2357,7 +2357,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node704", @@ -2410,7 +2410,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node804", @@ -2463,7 +2463,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node904", @@ -2516,7 +2516,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -2574,7 +2574,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node105", @@ -2627,7 +2627,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node205", @@ -2680,7 +2680,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node305", @@ -2733,7 +2733,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node405", @@ -2786,7 +2786,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node505", @@ -2839,7 +2839,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node605", @@ -2892,7 +2892,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node705", @@ -2945,7 +2945,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node805", @@ -2998,7 +2998,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node905", @@ -3051,7 +3051,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -3109,7 +3109,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node106", @@ -3162,7 +3162,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node206", @@ -3215,7 +3215,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node306", @@ -3268,7 +3268,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node406", @@ -3321,7 +3321,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node506", @@ -3374,7 +3374,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node606", @@ -3427,7 +3427,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node706", @@ -3480,7 +3480,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node806", @@ -3533,7 +3533,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node906", @@ -3586,7 +3586,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -3644,7 +3644,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node107", @@ -3697,7 +3697,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node207", @@ -3750,7 +3750,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node307", @@ -3803,7 +3803,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node407", @@ -3856,7 +3856,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node507", @@ -3909,7 +3909,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node607", @@ -3962,7 +3962,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node707", @@ -4015,7 +4015,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node807", @@ -4068,7 +4068,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node907", @@ -4121,7 +4121,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -4179,7 +4179,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node108", @@ -4232,7 +4232,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node208", @@ -4285,7 +4285,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node308", @@ -4338,7 +4338,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node408", @@ -4391,7 +4391,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node508", @@ -4444,7 +4444,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node608", @@ -4497,7 +4497,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node708", @@ -4550,7 +4550,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node808", @@ -4603,7 +4603,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node908", @@ -4656,7 +4656,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -4714,7 +4714,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node109", @@ -4767,7 +4767,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node209", @@ -4820,7 +4820,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node309", @@ -4873,7 +4873,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node409", @@ -4926,7 +4926,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node509", @@ -4979,7 +4979,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node609", @@ -5032,7 +5032,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node709", @@ -5085,7 +5085,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node809", @@ -5138,7 +5138,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node909", @@ -5191,7 +5191,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -5249,7 +5249,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node110", @@ -5302,7 +5302,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node210", @@ -5355,7 +5355,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node310", @@ -5408,7 +5408,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node410", @@ -5461,7 +5461,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node510", @@ -5514,7 +5514,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node610", @@ -5567,7 +5567,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node710", @@ -5620,7 +5620,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node810", @@ -5673,7 +5673,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node910", @@ -5726,7 +5726,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -5784,7 +5784,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node111", @@ -5837,7 +5837,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node211", @@ -5890,7 +5890,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node311", @@ -5943,7 +5943,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node411", @@ -5996,7 +5996,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node511", @@ -6049,7 +6049,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node611", @@ -6102,7 +6102,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node711", @@ -6155,7 +6155,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node811", @@ -6208,7 +6208,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node911", @@ -6261,7 +6261,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -6319,7 +6319,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node112", @@ -6372,7 +6372,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node212", @@ -6425,7 +6425,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node312", @@ -6478,7 +6478,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node412", @@ -6531,7 +6531,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node512", @@ -6584,7 +6584,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node612", @@ -6637,7 +6637,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node712", @@ -6690,7 +6690,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node812", @@ -6743,7 +6743,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node912", @@ -6796,7 +6796,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -6854,7 +6854,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node113", @@ -6907,7 +6907,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node213", @@ -6960,7 +6960,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node313", @@ -7013,7 +7013,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node413", @@ -7066,7 +7066,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node513", @@ -7119,7 +7119,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node613", @@ -7172,7 +7172,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node713", @@ -7225,7 +7225,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node813", @@ -7278,7 +7278,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node913", @@ -7331,7 +7331,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -7389,7 +7389,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node114", @@ -7442,7 +7442,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node214", @@ -7495,7 +7495,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node314", @@ -7548,7 +7548,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node414", @@ -7601,7 +7601,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node514", @@ -7654,7 +7654,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node614", @@ -7707,7 +7707,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node714", @@ -7760,7 +7760,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node814", @@ -7813,7 +7813,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node914", @@ -7866,7 +7866,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -7924,7 +7924,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node115", @@ -7977,7 +7977,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node215", @@ -8030,7 +8030,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node315", @@ -8083,7 +8083,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node415", @@ -8136,7 +8136,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node515", @@ -8189,7 +8189,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node615", @@ -8242,7 +8242,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node715", @@ -8295,7 +8295,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node815", @@ -8348,7 +8348,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node915", @@ -8401,7 +8401,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -8459,7 +8459,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node116", @@ -8512,7 +8512,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node216", @@ -8565,7 +8565,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node316", @@ -8618,7 +8618,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node416", @@ -8671,7 +8671,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node516", @@ -8724,7 +8724,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node616", @@ -8777,7 +8777,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node716", @@ -8830,7 +8830,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node816", @@ -8883,7 +8883,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node916", @@ -8936,7 +8936,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -8994,7 +8994,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node117", @@ -9047,7 +9047,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node217", @@ -9100,7 +9100,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node317", @@ -9153,7 +9153,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node417", @@ -9206,7 +9206,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node517", @@ -9259,7 +9259,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node617", @@ -9312,7 +9312,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node717", @@ -9365,7 +9365,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node817", @@ -9418,7 +9418,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node917", @@ -9471,7 +9471,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -9529,7 +9529,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node118", @@ -9582,7 +9582,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node218", @@ -9635,7 +9635,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node318", @@ -9688,7 +9688,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node418", @@ -9741,7 +9741,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node518", @@ -9794,7 +9794,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node618", @@ -9847,7 +9847,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node718", @@ -9900,7 +9900,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node818", @@ -9953,7 +9953,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node918", @@ -10006,7 +10006,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -10064,7 +10064,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node119", @@ -10117,7 +10117,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node219", @@ -10170,7 +10170,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node319", @@ -10223,7 +10223,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node419", @@ -10276,7 +10276,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node519", @@ -10329,7 +10329,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node619", @@ -10382,7 +10382,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node719", @@ -10435,7 +10435,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node819", @@ -10488,7 +10488,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node919", @@ -10541,7 +10541,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -10599,7 +10599,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node120", @@ -10652,7 +10652,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node220", @@ -10705,7 +10705,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node320", @@ -10758,7 +10758,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node420", @@ -10811,7 +10811,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node520", @@ -10864,7 +10864,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node620", @@ -10917,7 +10917,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node720", @@ -10970,7 +10970,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node820", @@ -11023,7 +11023,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node920", @@ -11076,7 +11076,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -11134,7 +11134,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node121", @@ -11187,7 +11187,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node221", @@ -11240,7 +11240,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node321", @@ -11293,7 +11293,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node421", @@ -11346,7 +11346,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node521", @@ -11399,7 +11399,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node621", @@ -11452,7 +11452,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node721", @@ -11505,7 +11505,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node821", @@ -11558,7 +11558,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node921", @@ -11611,7 +11611,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -11669,7 +11669,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node122", @@ -11722,7 +11722,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node222", @@ -11775,7 +11775,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node322", @@ -11828,7 +11828,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node422", @@ -11881,7 +11881,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node522", @@ -11934,7 +11934,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node622", @@ -11987,7 +11987,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node722", @@ -12040,7 +12040,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node822", @@ -12093,7 +12093,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node922", @@ -12146,7 +12146,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -12204,7 +12204,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node123", @@ -12257,7 +12257,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node223", @@ -12310,7 +12310,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node323", @@ -12363,7 +12363,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node423", @@ -12416,7 +12416,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node523", @@ -12469,7 +12469,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node623", @@ -12522,7 +12522,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node723", @@ -12575,7 +12575,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node823", @@ -12628,7 +12628,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node923", @@ -12681,7 +12681,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -12739,7 +12739,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node124", @@ -12792,7 +12792,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node224", @@ -12845,7 +12845,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node324", @@ -12898,7 +12898,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node424", @@ -12951,7 +12951,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node524", @@ -13004,7 +13004,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node624", @@ -13057,7 +13057,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node724", @@ -13110,7 +13110,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node824", @@ -13163,7 +13163,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node924", @@ -13216,7 +13216,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -13274,7 +13274,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node125", @@ -13327,7 +13327,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node225", @@ -13380,7 +13380,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node325", @@ -13433,7 +13433,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node425", @@ -13486,7 +13486,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node525", @@ -13539,7 +13539,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node625", @@ -13592,7 +13592,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node725", @@ -13645,7 +13645,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node825", @@ -13698,7 +13698,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node925", @@ -13751,7 +13751,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -13809,7 +13809,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node126", @@ -13862,7 +13862,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node226", @@ -13915,7 +13915,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node326", @@ -13968,7 +13968,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node426", @@ -14021,7 +14021,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node526", @@ -14074,7 +14074,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node626", @@ -14127,7 +14127,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node726", @@ -14180,7 +14180,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node826", @@ -14233,7 +14233,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node926", @@ -14286,7 +14286,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -14344,7 +14344,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node127", @@ -14397,7 +14397,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node227", @@ -14450,7 +14450,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node327", @@ -14503,7 +14503,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node427", @@ -14556,7 +14556,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node527", @@ -14609,7 +14609,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node627", @@ -14662,7 +14662,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node727", @@ -14715,7 +14715,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node827", @@ -14768,7 +14768,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node927", @@ -14821,7 +14821,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -14879,7 +14879,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node128", @@ -14932,7 +14932,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node228", @@ -14985,7 +14985,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node328", @@ -15038,7 +15038,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node428", @@ -15091,7 +15091,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node528", @@ -15144,7 +15144,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node628", @@ -15197,7 +15197,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node728", @@ -15250,7 +15250,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node828", @@ -15303,7 +15303,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node928", @@ -15356,7 +15356,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -15414,7 +15414,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node129", @@ -15467,7 +15467,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node229", @@ -15520,7 +15520,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node329", @@ -15573,7 +15573,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node429", @@ -15626,7 +15626,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node529", @@ -15679,7 +15679,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node629", @@ -15732,7 +15732,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node729", @@ -15785,7 +15785,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node829", @@ -15838,7 +15838,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node929", @@ -15891,7 +15891,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -15949,7 +15949,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node130", @@ -16002,7 +16002,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node230", @@ -16055,7 +16055,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node330", @@ -16108,7 +16108,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node430", @@ -16161,7 +16161,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node530", @@ -16214,7 +16214,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node630", @@ -16267,7 +16267,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node730", @@ -16320,7 +16320,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node830", @@ -16373,7 +16373,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node930", @@ -16426,7 +16426,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -16484,7 +16484,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node131", @@ -16537,7 +16537,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node231", @@ -16590,7 +16590,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node331", @@ -16643,7 +16643,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node431", @@ -16696,7 +16696,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node531", @@ -16749,7 +16749,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node631", @@ -16802,7 +16802,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node731", @@ -16855,7 +16855,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node831", @@ -16908,7 +16908,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node931", @@ -16961,7 +16961,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -17019,7 +17019,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node132", @@ -17072,7 +17072,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node232", @@ -17125,7 +17125,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node332", @@ -17178,7 +17178,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node432", @@ -17231,7 +17231,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node532", @@ -17284,7 +17284,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node632", @@ -17337,7 +17337,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node732", @@ -17390,7 +17390,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node832", @@ -17443,7 +17443,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node932", @@ -17496,7 +17496,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -17554,7 +17554,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node133", @@ -17607,7 +17607,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node233", @@ -17660,7 +17660,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node333", @@ -17713,7 +17713,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node433", @@ -17766,7 +17766,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node533", @@ -17819,7 +17819,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node633", @@ -17872,7 +17872,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node733", @@ -17925,7 +17925,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node833", @@ -17978,7 +17978,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node933", @@ -18031,7 +18031,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -18089,7 +18089,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node134", @@ -18142,7 +18142,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node234", @@ -18195,7 +18195,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node334", @@ -18248,7 +18248,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node434", @@ -18301,7 +18301,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node534", @@ -18354,7 +18354,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node634", @@ -18407,7 +18407,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node734", @@ -18460,7 +18460,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node834", @@ -18513,7 +18513,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node934", @@ -18566,7 +18566,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -18624,7 +18624,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node135", @@ -18677,7 +18677,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node235", @@ -18730,7 +18730,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node335", @@ -18783,7 +18783,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node435", @@ -18836,7 +18836,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node535", @@ -18889,7 +18889,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node635", @@ -18942,7 +18942,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node735", @@ -18995,7 +18995,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node835", @@ -19048,7 +19048,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node935", @@ -19101,7 +19101,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -19159,7 +19159,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node136", @@ -19212,7 +19212,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node236", @@ -19265,7 +19265,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node336", @@ -19318,7 +19318,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node436", @@ -19371,7 +19371,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node536", @@ -19424,7 +19424,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node636", @@ -19477,7 +19477,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node736", @@ -19530,7 +19530,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node836", @@ -19583,7 +19583,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node936", @@ -19636,7 +19636,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -19694,7 +19694,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node137", @@ -19747,7 +19747,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node237", @@ -19800,7 +19800,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node337", @@ -19853,7 +19853,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node437", @@ -19906,7 +19906,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node537", @@ -19959,7 +19959,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node637", @@ -20012,7 +20012,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node737", @@ -20065,7 +20065,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node837", @@ -20118,7 +20118,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node937", @@ -20171,7 +20171,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -20229,7 +20229,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node138", @@ -20282,7 +20282,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node238", @@ -20335,7 +20335,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node338", @@ -20388,7 +20388,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node438", @@ -20441,7 +20441,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node538", @@ -20494,7 +20494,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node638", @@ -20547,7 +20547,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node738", @@ -20600,7 +20600,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node838", @@ -20653,7 +20653,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node938", @@ -20706,7 +20706,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -20764,7 +20764,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node139", @@ -20817,7 +20817,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node239", @@ -20870,7 +20870,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node339", @@ -20923,7 +20923,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node439", @@ -20976,7 +20976,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node539", @@ -21029,7 +21029,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node639", @@ -21082,7 +21082,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node739", @@ -21135,7 +21135,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node839", @@ -21188,7 +21188,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node939", @@ -21241,7 +21241,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -21299,7 +21299,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node140", @@ -21352,7 +21352,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node240", @@ -21405,7 +21405,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node340", @@ -21458,7 +21458,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node440", @@ -21511,7 +21511,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node540", @@ -21564,7 +21564,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node640", @@ -21617,7 +21617,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node740", @@ -21670,7 +21670,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node840", @@ -21723,7 +21723,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node940", @@ -21776,7 +21776,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -21834,7 +21834,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node141", @@ -21887,7 +21887,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node241", @@ -21940,7 +21940,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node341", @@ -21993,7 +21993,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node441", @@ -22046,7 +22046,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node541", @@ -22099,7 +22099,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node641", @@ -22152,7 +22152,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node741", @@ -22205,7 +22205,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node841", @@ -22258,7 +22258,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node941", @@ -22311,7 +22311,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -22369,7 +22369,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node142", @@ -22422,7 +22422,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node242", @@ -22475,7 +22475,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node342", @@ -22528,7 +22528,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node442", @@ -22581,7 +22581,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node542", @@ -22634,7 +22634,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node642", @@ -22687,7 +22687,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node742", @@ -22740,7 +22740,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node842", @@ -22793,7 +22793,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node942", @@ -22846,7 +22846,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -22904,7 +22904,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node143", @@ -22957,7 +22957,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node243", @@ -23010,7 +23010,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node343", @@ -23063,7 +23063,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node443", @@ -23116,7 +23116,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node543", @@ -23169,7 +23169,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node643", @@ -23222,7 +23222,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node743", @@ -23275,7 +23275,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node843", @@ -23328,7 +23328,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node943", @@ -23381,7 +23381,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -23439,7 +23439,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node144", @@ -23492,7 +23492,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node244", @@ -23545,7 +23545,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node344", @@ -23598,7 +23598,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node444", @@ -23651,7 +23651,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node544", @@ -23704,7 +23704,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node644", @@ -23757,7 +23757,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node744", @@ -23810,7 +23810,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node844", @@ -23863,7 +23863,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node944", @@ -23916,7 +23916,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -23974,7 +23974,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node145", @@ -24027,7 +24027,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node245", @@ -24080,7 +24080,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node345", @@ -24133,7 +24133,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node445", @@ -24186,7 +24186,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node545", @@ -24239,7 +24239,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node645", @@ -24292,7 +24292,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node745", @@ -24345,7 +24345,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node845", @@ -24398,7 +24398,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node945", @@ -24451,7 +24451,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -24509,7 +24509,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node146", @@ -24562,7 +24562,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node246", @@ -24615,7 +24615,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node346", @@ -24668,7 +24668,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node446", @@ -24721,7 +24721,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node546", @@ -24774,7 +24774,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node646", @@ -24827,7 +24827,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node746", @@ -24880,7 +24880,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node846", @@ -24933,7 +24933,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node946", @@ -24986,7 +24986,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -25044,7 +25044,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node147", @@ -25097,7 +25097,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node247", @@ -25150,7 +25150,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node347", @@ -25203,7 +25203,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node447", @@ -25256,7 +25256,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node547", @@ -25309,7 +25309,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node647", @@ -25362,7 +25362,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node747", @@ -25415,7 +25415,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node847", @@ -25468,7 +25468,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node947", @@ -25521,7 +25521,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -25579,7 +25579,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node148", @@ -25632,7 +25632,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node248", @@ -25685,7 +25685,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node348", @@ -25738,7 +25738,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node448", @@ -25791,7 +25791,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node548", @@ -25844,7 +25844,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node648", @@ -25897,7 +25897,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node748", @@ -25950,7 +25950,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node848", @@ -26003,7 +26003,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node948", @@ -26056,7 +26056,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -26114,7 +26114,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node149", @@ -26167,7 +26167,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node249", @@ -26220,7 +26220,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node349", @@ -26273,7 +26273,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node449", @@ -26326,7 +26326,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node549", @@ -26379,7 +26379,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node649", @@ -26432,7 +26432,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node749", @@ -26485,7 +26485,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node849", @@ -26538,7 +26538,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node949", @@ -26591,7 +26591,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -26649,7 +26649,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node150", @@ -26702,7 +26702,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node250", @@ -26755,7 +26755,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node350", @@ -26808,7 +26808,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node450", @@ -26861,7 +26861,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node550", @@ -26914,7 +26914,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node650", @@ -26967,7 +26967,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node750", @@ -27020,7 +27020,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node850", @@ -27073,7 +27073,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node950", @@ -27126,7 +27126,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -27184,7 +27184,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node151", @@ -27237,7 +27237,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node251", @@ -27290,7 +27290,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node351", @@ -27343,7 +27343,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node451", @@ -27396,7 +27396,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node551", @@ -27449,7 +27449,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node651", @@ -27502,7 +27502,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node751", @@ -27555,7 +27555,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node851", @@ -27608,7 +27608,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node951", @@ -27661,7 +27661,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -27719,7 +27719,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node152", @@ -27772,7 +27772,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node252", @@ -27825,7 +27825,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node352", @@ -27878,7 +27878,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node452", @@ -27931,7 +27931,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node552", @@ -27984,7 +27984,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node652", @@ -28037,7 +28037,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node752", @@ -28090,7 +28090,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node852", @@ -28143,7 +28143,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node952", @@ -28196,7 +28196,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -28254,7 +28254,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node153", @@ -28307,7 +28307,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node253", @@ -28360,7 +28360,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node353", @@ -28413,7 +28413,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node453", @@ -28466,7 +28466,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node553", @@ -28519,7 +28519,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node653", @@ -28572,7 +28572,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node753", @@ -28625,7 +28625,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node853", @@ -28678,7 +28678,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node953", @@ -28731,7 +28731,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -28789,7 +28789,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node154", @@ -28842,7 +28842,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node254", @@ -28895,7 +28895,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node354", @@ -28948,7 +28948,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node454", @@ -29001,7 +29001,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node554", @@ -29054,7 +29054,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node654", @@ -29107,7 +29107,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node754", @@ -29160,7 +29160,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node854", @@ -29213,7 +29213,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node954", @@ -29266,7 +29266,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -29324,7 +29324,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node155", @@ -29377,7 +29377,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node255", @@ -29430,7 +29430,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node355", @@ -29483,7 +29483,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node455", @@ -29536,7 +29536,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node555", @@ -29589,7 +29589,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node655", @@ -29642,7 +29642,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node755", @@ -29695,7 +29695,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node855", @@ -29748,7 +29748,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node955", @@ -29801,7 +29801,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -29859,7 +29859,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node156", @@ -29912,7 +29912,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node256", @@ -29965,7 +29965,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node356", @@ -30018,7 +30018,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node456", @@ -30071,7 +30071,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node556", @@ -30124,7 +30124,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node656", @@ -30177,7 +30177,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node756", @@ -30230,7 +30230,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node856", @@ -30283,7 +30283,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node956", @@ -30336,7 +30336,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -30394,7 +30394,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node157", @@ -30447,7 +30447,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node257", @@ -30500,7 +30500,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node357", @@ -30553,7 +30553,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node457", @@ -30606,7 +30606,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node557", @@ -30659,7 +30659,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node657", @@ -30712,7 +30712,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node757", @@ -30765,7 +30765,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node857", @@ -30818,7 +30818,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node957", @@ -30871,7 +30871,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -30929,7 +30929,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node158", @@ -30982,7 +30982,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node258", @@ -31035,7 +31035,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node358", @@ -31088,7 +31088,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node458", @@ -31141,7 +31141,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node558", @@ -31194,7 +31194,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node658", @@ -31247,7 +31247,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node758", @@ -31300,7 +31300,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node858", @@ -31353,7 +31353,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node958", @@ -31406,7 +31406,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -31464,7 +31464,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node159", @@ -31517,7 +31517,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node259", @@ -31570,7 +31570,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node359", @@ -31623,7 +31623,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node459", @@ -31676,7 +31676,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node559", @@ -31729,7 +31729,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node659", @@ -31782,7 +31782,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node759", @@ -31835,7 +31835,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node859", @@ -31888,7 +31888,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node959", @@ -31941,7 +31941,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -31999,7 +31999,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node160", @@ -32052,7 +32052,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node260", @@ -32105,7 +32105,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node360", @@ -32158,7 +32158,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node460", @@ -32211,7 +32211,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node560", @@ -32264,7 +32264,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node660", @@ -32317,7 +32317,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node760", @@ -32370,7 +32370,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node860", @@ -32423,7 +32423,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node960", @@ -32476,7 +32476,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -32534,7 +32534,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node161", @@ -32587,7 +32587,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node261", @@ -32640,7 +32640,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node361", @@ -32693,7 +32693,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node461", @@ -32746,7 +32746,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node561", @@ -32799,7 +32799,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node661", @@ -32852,7 +32852,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node761", @@ -32905,7 +32905,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node861", @@ -32958,7 +32958,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node961", @@ -33011,7 +33011,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -33069,7 +33069,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node162", @@ -33122,7 +33122,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node262", @@ -33175,7 +33175,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node362", @@ -33228,7 +33228,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node462", @@ -33281,7 +33281,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node562", @@ -33334,7 +33334,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node662", @@ -33387,7 +33387,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node762", @@ -33440,7 +33440,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node862", @@ -33493,7 +33493,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node962", @@ -33546,7 +33546,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -33604,7 +33604,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node163", @@ -33657,7 +33657,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node263", @@ -33710,7 +33710,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node363", @@ -33763,7 +33763,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node463", @@ -33816,7 +33816,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node563", @@ -33869,7 +33869,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node663", @@ -33922,7 +33922,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node763", @@ -33975,7 +33975,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node863", @@ -34028,7 +34028,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node963", @@ -34081,7 +34081,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -34139,7 +34139,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node164", @@ -34192,7 +34192,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node264", @@ -34245,7 +34245,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node364", @@ -34298,7 +34298,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node464", @@ -34351,7 +34351,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node564", @@ -34404,7 +34404,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node664", @@ -34457,7 +34457,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node764", @@ -34510,7 +34510,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node864", @@ -34563,7 +34563,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node964", @@ -34616,7 +34616,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -34674,7 +34674,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node165", @@ -34727,7 +34727,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node265", @@ -34780,7 +34780,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node365", @@ -34833,7 +34833,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node465", @@ -34886,7 +34886,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node565", @@ -34939,7 +34939,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node665", @@ -34992,7 +34992,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node765", @@ -35045,7 +35045,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node865", @@ -35098,7 +35098,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node965", @@ -35151,7 +35151,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -35209,7 +35209,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node166", @@ -35262,7 +35262,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node266", @@ -35315,7 +35315,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node366", @@ -35368,7 +35368,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node466", @@ -35421,7 +35421,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node566", @@ -35474,7 +35474,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node666", @@ -35527,7 +35527,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node766", @@ -35580,7 +35580,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node866", @@ -35633,7 +35633,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node966", @@ -35686,7 +35686,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -35744,7 +35744,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node167", @@ -35797,7 +35797,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node267", @@ -35850,7 +35850,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node367", @@ -35903,7 +35903,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node467", @@ -35956,7 +35956,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node567", @@ -36009,7 +36009,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node667", @@ -36062,7 +36062,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node767", @@ -36115,7 +36115,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node867", @@ -36168,7 +36168,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node967", @@ -36221,7 +36221,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -36279,7 +36279,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node168", @@ -36332,7 +36332,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node268", @@ -36385,7 +36385,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node368", @@ -36438,7 +36438,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node468", @@ -36491,7 +36491,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node568", @@ -36544,7 +36544,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node668", @@ -36597,7 +36597,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node768", @@ -36650,7 +36650,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node868", @@ -36703,7 +36703,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node968", @@ -36756,7 +36756,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -36814,7 +36814,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node169", @@ -36867,7 +36867,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node269", @@ -36920,7 +36920,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node369", @@ -36973,7 +36973,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node469", @@ -37026,7 +37026,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node569", @@ -37079,7 +37079,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node669", @@ -37132,7 +37132,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node769", @@ -37185,7 +37185,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node869", @@ -37238,7 +37238,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node969", @@ -37291,7 +37291,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -37349,7 +37349,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node170", @@ -37402,7 +37402,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node270", @@ -37455,7 +37455,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node370", @@ -37508,7 +37508,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node470", @@ -37561,7 +37561,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node570", @@ -37614,7 +37614,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node670", @@ -37667,7 +37667,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node770", @@ -37720,7 +37720,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node870", @@ -37773,7 +37773,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node970", @@ -37826,7 +37826,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -37884,7 +37884,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node171", @@ -37937,7 +37937,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node271", @@ -37990,7 +37990,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node371", @@ -38043,7 +38043,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node471", @@ -38096,7 +38096,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node571", @@ -38149,7 +38149,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node671", @@ -38202,7 +38202,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node771", @@ -38255,7 +38255,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node871", @@ -38308,7 +38308,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node971", @@ -38361,7 +38361,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -38419,7 +38419,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node172", @@ -38472,7 +38472,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node272", @@ -38525,7 +38525,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node372", @@ -38578,7 +38578,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node472", @@ -38631,7 +38631,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node572", @@ -38684,7 +38684,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node672", @@ -38737,7 +38737,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node772", @@ -38790,7 +38790,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node872", @@ -38843,7 +38843,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node972", @@ -38896,7 +38896,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -38954,7 +38954,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node173", @@ -39007,7 +39007,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node273", @@ -39060,7 +39060,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node373", @@ -39113,7 +39113,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node473", @@ -39166,7 +39166,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node573", @@ -39219,7 +39219,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node673", @@ -39272,7 +39272,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node773", @@ -39325,7 +39325,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node873", @@ -39378,7 +39378,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node973", @@ -39431,7 +39431,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -39489,7 +39489,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node174", @@ -39542,7 +39542,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node274", @@ -39595,7 +39595,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node374", @@ -39648,7 +39648,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node474", @@ -39701,7 +39701,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node574", @@ -39754,7 +39754,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node674", @@ -39807,7 +39807,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node774", @@ -39860,7 +39860,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node874", @@ -39913,7 +39913,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node974", @@ -39966,7 +39966,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -40024,7 +40024,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node175", @@ -40077,7 +40077,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node275", @@ -40130,7 +40130,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node375", @@ -40183,7 +40183,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node475", @@ -40236,7 +40236,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node575", @@ -40289,7 +40289,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node675", @@ -40342,7 +40342,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node775", @@ -40395,7 +40395,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node875", @@ -40448,7 +40448,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node975", @@ -40501,7 +40501,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -40559,7 +40559,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node176", @@ -40612,7 +40612,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node276", @@ -40665,7 +40665,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node376", @@ -40718,7 +40718,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node476", @@ -40771,7 +40771,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node576", @@ -40824,7 +40824,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node676", @@ -40877,7 +40877,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node776", @@ -40930,7 +40930,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node876", @@ -40983,7 +40983,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node976", @@ -41036,7 +41036,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -41094,7 +41094,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node177", @@ -41147,7 +41147,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node277", @@ -41200,7 +41200,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node377", @@ -41253,7 +41253,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node477", @@ -41306,7 +41306,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node577", @@ -41359,7 +41359,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node677", @@ -41412,7 +41412,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node777", @@ -41465,7 +41465,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node877", @@ -41518,7 +41518,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node977", @@ -41571,7 +41571,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -41629,7 +41629,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node178", @@ -41682,7 +41682,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node278", @@ -41735,7 +41735,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node378", @@ -41788,7 +41788,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node478", @@ -41841,7 +41841,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node578", @@ -41894,7 +41894,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node678", @@ -41947,7 +41947,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node778", @@ -42000,7 +42000,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node878", @@ -42053,7 +42053,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node978", @@ -42106,7 +42106,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -42164,7 +42164,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node179", @@ -42217,7 +42217,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node279", @@ -42270,7 +42270,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node379", @@ -42323,7 +42323,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node479", @@ -42376,7 +42376,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node579", @@ -42429,7 +42429,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node679", @@ -42482,7 +42482,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node779", @@ -42535,7 +42535,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node879", @@ -42588,7 +42588,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node979", @@ -42641,7 +42641,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -42699,7 +42699,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node180", @@ -42752,7 +42752,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node280", @@ -42805,7 +42805,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node380", @@ -42858,7 +42858,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node480", @@ -42911,7 +42911,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node580", @@ -42964,7 +42964,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node680", @@ -43017,7 +43017,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node780", @@ -43070,7 +43070,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node880", @@ -43123,7 +43123,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node980", @@ -43176,7 +43176,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -43234,7 +43234,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node181", @@ -43287,7 +43287,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node281", @@ -43340,7 +43340,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node381", @@ -43393,7 +43393,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node481", @@ -43446,7 +43446,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node581", @@ -43499,7 +43499,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node681", @@ -43552,7 +43552,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node781", @@ -43605,7 +43605,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node881", @@ -43658,7 +43658,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node981", @@ -43711,7 +43711,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -43769,7 +43769,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node182", @@ -43822,7 +43822,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node282", @@ -43875,7 +43875,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node382", @@ -43928,7 +43928,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node482", @@ -43981,7 +43981,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node582", @@ -44034,7 +44034,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node682", @@ -44087,7 +44087,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node782", @@ -44140,7 +44140,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node882", @@ -44193,7 +44193,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node982", @@ -44246,7 +44246,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -44304,7 +44304,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node183", @@ -44357,7 +44357,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node283", @@ -44410,7 +44410,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node383", @@ -44463,7 +44463,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node483", @@ -44516,7 +44516,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node583", @@ -44569,7 +44569,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node683", @@ -44622,7 +44622,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node783", @@ -44675,7 +44675,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node883", @@ -44728,7 +44728,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node983", @@ -44781,7 +44781,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -44839,7 +44839,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node184", @@ -44892,7 +44892,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node284", @@ -44945,7 +44945,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node384", @@ -44998,7 +44998,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node484", @@ -45051,7 +45051,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node584", @@ -45104,7 +45104,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node684", @@ -45157,7 +45157,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node784", @@ -45210,7 +45210,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node884", @@ -45263,7 +45263,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node984", @@ -45316,7 +45316,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -45374,7 +45374,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node185", @@ -45427,7 +45427,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node285", @@ -45480,7 +45480,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node385", @@ -45533,7 +45533,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node485", @@ -45586,7 +45586,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node585", @@ -45639,7 +45639,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node685", @@ -45692,7 +45692,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node785", @@ -45745,7 +45745,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node885", @@ -45798,7 +45798,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node985", @@ -45851,7 +45851,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -45909,7 +45909,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node186", @@ -45962,7 +45962,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node286", @@ -46015,7 +46015,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node386", @@ -46068,7 +46068,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node486", @@ -46121,7 +46121,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node586", @@ -46174,7 +46174,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node686", @@ -46227,7 +46227,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node786", @@ -46280,7 +46280,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node886", @@ -46333,7 +46333,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node986", @@ -46386,7 +46386,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -46444,7 +46444,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node187", @@ -46497,7 +46497,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node287", @@ -46550,7 +46550,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node387", @@ -46603,7 +46603,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node487", @@ -46656,7 +46656,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node587", @@ -46709,7 +46709,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node687", @@ -46762,7 +46762,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node787", @@ -46815,7 +46815,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node887", @@ -46868,7 +46868,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node987", @@ -46921,7 +46921,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -46979,7 +46979,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node188", @@ -47032,7 +47032,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node288", @@ -47085,7 +47085,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node388", @@ -47138,7 +47138,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node488", @@ -47191,7 +47191,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node588", @@ -47244,7 +47244,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node688", @@ -47297,7 +47297,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node788", @@ -47350,7 +47350,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node888", @@ -47403,7 +47403,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node988", @@ -47456,7 +47456,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -47514,7 +47514,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node189", @@ -47567,7 +47567,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node289", @@ -47620,7 +47620,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node389", @@ -47673,7 +47673,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node489", @@ -47726,7 +47726,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node589", @@ -47779,7 +47779,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node689", @@ -47832,7 +47832,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node789", @@ -47885,7 +47885,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node889", @@ -47938,7 +47938,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node989", @@ -47991,7 +47991,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -48049,7 +48049,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node190", @@ -48102,7 +48102,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node290", @@ -48155,7 +48155,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node390", @@ -48208,7 +48208,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node490", @@ -48261,7 +48261,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node590", @@ -48314,7 +48314,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node690", @@ -48367,7 +48367,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node790", @@ -48420,7 +48420,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node890", @@ -48473,7 +48473,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node990", @@ -48526,7 +48526,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -48584,7 +48584,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node191", @@ -48637,7 +48637,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node291", @@ -48690,7 +48690,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node391", @@ -48743,7 +48743,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node491", @@ -48796,7 +48796,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node591", @@ -48849,7 +48849,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node691", @@ -48902,7 +48902,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node791", @@ -48955,7 +48955,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node891", @@ -49008,7 +49008,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node991", @@ -49061,7 +49061,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -49119,7 +49119,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node192", @@ -49172,7 +49172,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node292", @@ -49225,7 +49225,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node392", @@ -49278,7 +49278,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node492", @@ -49331,7 +49331,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node592", @@ -49384,7 +49384,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node692", @@ -49437,7 +49437,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node792", @@ -49490,7 +49490,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node892", @@ -49543,7 +49543,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node992", @@ -49596,7 +49596,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -49654,7 +49654,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node193", @@ -49707,7 +49707,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node293", @@ -49760,7 +49760,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node393", @@ -49813,7 +49813,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node493", @@ -49866,7 +49866,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node593", @@ -49919,7 +49919,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node693", @@ -49972,7 +49972,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node793", @@ -50025,7 +50025,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node893", @@ -50078,7 +50078,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node993", @@ -50131,7 +50131,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -50189,7 +50189,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node194", @@ -50242,7 +50242,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node294", @@ -50295,7 +50295,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node394", @@ -50348,7 +50348,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node494", @@ -50401,7 +50401,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node594", @@ -50454,7 +50454,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node694", @@ -50507,7 +50507,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node794", @@ -50560,7 +50560,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node894", @@ -50613,7 +50613,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node994", @@ -50666,7 +50666,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -50724,7 +50724,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node195", @@ -50777,7 +50777,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node295", @@ -50830,7 +50830,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node395", @@ -50883,7 +50883,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node495", @@ -50936,7 +50936,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node595", @@ -50989,7 +50989,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node695", @@ -51042,7 +51042,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node795", @@ -51095,7 +51095,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node895", @@ -51148,7 +51148,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node995", @@ -51201,7 +51201,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -51259,7 +51259,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node196", @@ -51312,7 +51312,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node296", @@ -51365,7 +51365,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node396", @@ -51418,7 +51418,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node496", @@ -51471,7 +51471,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node596", @@ -51524,7 +51524,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node696", @@ -51577,7 +51577,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node796", @@ -51630,7 +51630,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node896", @@ -51683,7 +51683,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node996", @@ -51736,7 +51736,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -51794,7 +51794,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node197", @@ -51847,7 +51847,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node297", @@ -51900,7 +51900,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node397", @@ -51953,7 +51953,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node497", @@ -52006,7 +52006,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node597", @@ -52059,7 +52059,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node697", @@ -52112,7 +52112,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node797", @@ -52165,7 +52165,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node897", @@ -52218,7 +52218,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node997", @@ -52271,7 +52271,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -52329,7 +52329,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node198", @@ -52382,7 +52382,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node298", @@ -52435,7 +52435,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node398", @@ -52488,7 +52488,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node498", @@ -52541,7 +52541,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node598", @@ -52594,7 +52594,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node698", @@ -52647,7 +52647,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node798", @@ -52700,7 +52700,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node898", @@ -52753,7 +52753,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node998", @@ -52806,7 +52806,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -52864,7 +52864,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node199", @@ -52917,7 +52917,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node299", @@ -52970,7 +52970,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node399", @@ -53023,7 +53023,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node499", @@ -53076,7 +53076,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node599", @@ -53129,7 +53129,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node699", @@ -53182,7 +53182,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node799", @@ -53235,7 +53235,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node899", @@ -53288,7 +53288,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node999", @@ -53341,7 +53341,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -53399,7 +53399,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node200", @@ -53452,7 +53452,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node300", @@ -53505,7 +53505,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node400", @@ -53558,7 +53558,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node500", @@ -53611,7 +53611,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node600", @@ -53664,7 +53664,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node700", @@ -53717,7 +53717,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node800", @@ -53770,7 +53770,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node900", @@ -53823,7 +53823,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" }, { "Name": "node1000", @@ -53876,7 +53876,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -56562,7 +56562,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -59248,7 +59248,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -61934,7 +61934,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -64620,7 +64620,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -67306,7 +67306,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -69992,7 +69992,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -72678,7 +72678,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -75364,7 +75364,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -78050,7 +78050,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -80736,7 +80736,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -83418,7 +83418,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -86100,7 +86100,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -88782,7 +88782,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -91464,7 +91464,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] }, @@ -94146,7 +94146,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4 }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } ] } diff --git a/test/testdata/deployednettemplates/recipes/scenario3/node.json b/test/testdata/deployednettemplates/recipes/scenario3/node.json index 7447390623..ad3a50e0d9 100644 --- a/test/testdata/deployednettemplates/recipes/scenario3/node.json +++ b/test/testdata/deployednettemplates/recipes/scenario3/node.json @@ -5,7 +5,7 @@ "TelemetryURI": "{{TelemetryURI}}", "EnableMetrics": false, "MetricsURI": "{{MetricsURI}}", - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }", "AltConfigs": [ { "APIToken": "{{APIToken}}", @@ -14,7 +14,7 @@ "TelemetryURI": "{{TelemetryURI}}", "EnableMetrics": true, "MetricsURI": "{{MetricsURI}}", - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }", "FractionApply": 0.01 } ] diff --git a/test/testdata/deployednettemplates/recipes/scenario3/relay.json b/test/testdata/deployednettemplates/recipes/scenario3/relay.json index 25bb6b5a26..f568eb3ded 100644 --- a/test/testdata/deployednettemplates/recipes/scenario3/relay.json +++ b/test/testdata/deployednettemplates/recipes/scenario3/relay.json @@ -7,5 +7,5 @@ "TelemetryURI": "{{TelemetryURI}}", "EnableMetrics": true, "MetricsURI": "{{MetricsURI}}", - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 3, \"EnableProfiler\": true }" } diff --git a/test/testdata/nettemplates/NegativeStake.json b/test/testdata/nettemplates/NegativeStake.json new file mode 100644 index 0000000000..903faaa52c --- /dev/null +++ b/test/testdata/nettemplates/NegativeStake.json @@ -0,0 +1,34 @@ +{ + "Genesis": { + "NetworkName": "tbd", + "Wallets": [ + { + "Name": "W1", + "Stake": 110, + "Online": true + }, + { + "Name": "W2", + "Stake": -10, + "Online": true + } + ] + }, + "Nodes": [ + { + "Name": "N1", + "IsRelay": true, + "Wallets": [ + { "Name": "W1", + "ParticipationOnly": false } + ] + }, + { + "Name": "N2", + "Wallets": [ + { "Name": "W2", + "ParticipationOnly": false } + ] + } + ] +} diff --git a/test/testdata/nettemplates/TenThousandAccountsEqual.json b/test/testdata/nettemplates/TenThousandAccountsEqual.json new file mode 100644 index 0000000000..e695832798 --- /dev/null +++ b/test/testdata/nettemplates/TenThousandAccountsEqual.json @@ -0,0 +1,90027 @@ +{ + "Genesis": { + "NetworkName": "", + "VersionModifier": "", + "ConsensusProtocol": "", + "FirstPartKeyRound": 0, + "LastPartKeyRound": 3000000, + "PartKeyDilution": 0, + "Wallets": [ + { + "Name": "Wallet1", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet10", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet11", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet12", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet13", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet14", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet15", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet16", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet17", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet18", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet19", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet20", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet21", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet22", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet23", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet24", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet25", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet26", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet27", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet28", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet29", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet30", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet31", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet32", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet33", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet34", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet35", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet36", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet37", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet38", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet39", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet40", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet41", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet42", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet43", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet44", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet45", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet46", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet47", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet48", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet49", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet50", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet51", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet52", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet53", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet54", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet55", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet56", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet57", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet58", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet59", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet60", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet61", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet62", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet63", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet64", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet65", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet66", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet67", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet68", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet69", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet70", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet71", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet72", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet73", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet74", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet75", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet76", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet77", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet78", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet79", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet80", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet81", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet82", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet83", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet84", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet85", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet86", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet87", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet88", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet89", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet90", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet91", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet92", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet93", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet94", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet95", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet96", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet97", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet98", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet99", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet100", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet101", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet102", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet103", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet104", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet105", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet106", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet107", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet108", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet109", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet110", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet111", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet112", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet113", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet114", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet115", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet116", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet117", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet118", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet119", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet120", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet121", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet122", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet123", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet124", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet125", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet126", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet127", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet128", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet129", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet130", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet131", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet132", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet133", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet134", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet135", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet136", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet137", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet138", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet139", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet140", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet141", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet142", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet143", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet144", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet145", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet146", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet147", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet148", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet149", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet150", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet151", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet152", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet153", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet154", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet155", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet156", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet157", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet158", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet159", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet160", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet161", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet162", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet163", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet164", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet165", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet166", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet167", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet168", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet169", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet170", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet171", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet172", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet173", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet174", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet175", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet176", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet177", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet178", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet179", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet180", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet181", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet182", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet183", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet184", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet185", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet186", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet187", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet188", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet189", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet190", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet191", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet192", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet193", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet194", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet195", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet196", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet197", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet198", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet199", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet200", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet201", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet202", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet203", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet204", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet205", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet206", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet207", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet208", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet209", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet210", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet211", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet212", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet213", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet214", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet215", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet216", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet217", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet218", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet219", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet220", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet221", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet222", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet223", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet224", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet225", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet226", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet227", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet228", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet229", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet230", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet231", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet232", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet233", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet234", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet235", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet236", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet237", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet238", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet239", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet240", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet241", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet242", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet243", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet244", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet245", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet246", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet247", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet248", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet249", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet250", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet251", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet252", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet253", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet254", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet255", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet256", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet257", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet258", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet259", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet260", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet261", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet262", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet263", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet264", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet265", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet266", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet267", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet268", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet269", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet270", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet271", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet272", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet273", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet274", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet275", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet276", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet277", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet278", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet279", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet280", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet281", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet282", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet283", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet284", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet285", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet286", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet287", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet288", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet289", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet290", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet291", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet292", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet293", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet294", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet295", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet296", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet297", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet298", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet299", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet300", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet301", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet302", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet303", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet304", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet305", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet306", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet307", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet308", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet309", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet310", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet311", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet312", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet313", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet314", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet315", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet316", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet317", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet318", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet319", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet320", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet321", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet322", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet323", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet324", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet325", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet326", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet327", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet328", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet329", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet330", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet331", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet332", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet333", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet334", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet335", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet336", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet337", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet338", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet339", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet340", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet341", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet342", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet343", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet344", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet345", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet346", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet347", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet348", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet349", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet350", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet351", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet352", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet353", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet354", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet355", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet356", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet357", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet358", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet359", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet360", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet361", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet362", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet363", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet364", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet365", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet366", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet367", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet368", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet369", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet370", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet371", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet372", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet373", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet374", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet375", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet376", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet377", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet378", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet379", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet380", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet381", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet382", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet383", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet384", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet385", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet386", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet387", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet388", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet389", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet390", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet391", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet392", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet393", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet394", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet395", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet396", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet397", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet398", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet399", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet400", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet401", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet402", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet403", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet404", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet405", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet406", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet407", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet408", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet409", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet410", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet411", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet412", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet413", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet414", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet415", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet416", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet417", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet418", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet419", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet420", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet421", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet422", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet423", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet424", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet425", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet426", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet427", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet428", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet429", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet430", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet431", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet432", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet433", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet434", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet435", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet436", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet437", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet438", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet439", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet440", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet441", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet442", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet443", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet444", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet445", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet446", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet447", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet448", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet449", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet450", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet451", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet452", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet453", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet454", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet455", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet456", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet457", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet458", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet459", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet460", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet461", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet462", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet463", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet464", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet465", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet466", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet467", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet468", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet469", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet470", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet471", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet472", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet473", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet474", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet475", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet476", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet477", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet478", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet479", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet480", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet481", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet482", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet483", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet484", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet485", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet486", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet487", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet488", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet489", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet490", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet491", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet492", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet493", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet494", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet495", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet496", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet497", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet498", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet499", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet500", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet501", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet502", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet503", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet504", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet505", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet506", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet507", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet508", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet509", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet510", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet511", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet512", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet513", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet514", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet515", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet516", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet517", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet518", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet519", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet520", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet521", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet522", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet523", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet524", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet525", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet526", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet527", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet528", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet529", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet530", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet531", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet532", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet533", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet534", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet535", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet536", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet537", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet538", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet539", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet540", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet541", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet542", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet543", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet544", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet545", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet546", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet547", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet548", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet549", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet550", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet551", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet552", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet553", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet554", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet555", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet556", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet557", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet558", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet559", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet560", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet561", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet562", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet563", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet564", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet565", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet566", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet567", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet568", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet569", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet570", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet571", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet572", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet573", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet574", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet575", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet576", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet577", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet578", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet579", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet580", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet581", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet582", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet583", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet584", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet585", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet586", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet587", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet588", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet589", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet590", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet591", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet592", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet593", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet594", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet595", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet596", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet597", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet598", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet599", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet600", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet601", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet602", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet603", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet604", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet605", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet606", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet607", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet608", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet609", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet610", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet611", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet612", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet613", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet614", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet615", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet616", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet617", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet618", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet619", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet620", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet621", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet622", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet623", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet624", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet625", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet626", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet627", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet628", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet629", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet630", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet631", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet632", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet633", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet634", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet635", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet636", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet637", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet638", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet639", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet640", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet641", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet642", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet643", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet644", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet645", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet646", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet647", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet648", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet649", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet650", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet651", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet652", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet653", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet654", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet655", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet656", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet657", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet658", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet659", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet660", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet661", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet662", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet663", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet664", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet665", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet666", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet667", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet668", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet669", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet670", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet671", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet672", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet673", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet674", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet675", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet676", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet677", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet678", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet679", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet680", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet681", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet682", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet683", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet684", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet685", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet686", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet687", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet688", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet689", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet690", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet691", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet692", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet693", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet694", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet695", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet696", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet697", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet698", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet699", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet700", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet701", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet702", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet703", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet704", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet705", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet706", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet707", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet708", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet709", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet710", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet711", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet712", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet713", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet714", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet715", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet716", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet717", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet718", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet719", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet720", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet721", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet722", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet723", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet724", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet725", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet726", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet727", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet728", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet729", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet730", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet731", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet732", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet733", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet734", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet735", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet736", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet737", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet738", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet739", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet740", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet741", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet742", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet743", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet744", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet745", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet746", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet747", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet748", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet749", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet750", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet751", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet752", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet753", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet754", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet755", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet756", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet757", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet758", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet759", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet760", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet761", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet762", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet763", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet764", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet765", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet766", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet767", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet768", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet769", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet770", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet771", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet772", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet773", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet774", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet775", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet776", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet777", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet778", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet779", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet780", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet781", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet782", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet783", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet784", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet785", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet786", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet787", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet788", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet789", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet790", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet791", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet792", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet793", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet794", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet795", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet796", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet797", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet798", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet799", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet800", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet801", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet802", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet803", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet804", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet805", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet806", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet807", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet808", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet809", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet810", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet811", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet812", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet813", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet814", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet815", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet816", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet817", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet818", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet819", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet820", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet821", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet822", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet823", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet824", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet825", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet826", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet827", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet828", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet829", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet830", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet831", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet832", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet833", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet834", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet835", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet836", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet837", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet838", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet839", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet840", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet841", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet842", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet843", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet844", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet845", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet846", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet847", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet848", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet849", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet850", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet851", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet852", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet853", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet854", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet855", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet856", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet857", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet858", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet859", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet860", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet861", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet862", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet863", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet864", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet865", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet866", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet867", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet868", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet869", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet870", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet871", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet872", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet873", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet874", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet875", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet876", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet877", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet878", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet879", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet880", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet881", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet882", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet883", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet884", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet885", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet886", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet887", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet888", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet889", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet890", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet891", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet892", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet893", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet894", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet895", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet896", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet897", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet898", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet899", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet900", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet901", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet902", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet903", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet904", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet905", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet906", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet907", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet908", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet909", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet910", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet911", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet912", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet913", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet914", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet915", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet916", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet917", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet918", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet919", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet920", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet921", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet922", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet923", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet924", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet925", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet926", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet927", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet928", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet929", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet930", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet931", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet932", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet933", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet934", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet935", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet936", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet937", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet938", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet939", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet940", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet941", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet942", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet943", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet944", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet945", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet946", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet947", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet948", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet949", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet950", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet951", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet952", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet953", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet954", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet955", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet956", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet957", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet958", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet959", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet960", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet961", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet962", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet963", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet964", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet965", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet966", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet967", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet968", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet969", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet970", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet971", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet972", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet973", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet974", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet975", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet976", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet977", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet978", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet979", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet980", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet981", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet982", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet983", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet984", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet985", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet986", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet987", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet988", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet989", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet990", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet991", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet992", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet993", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet994", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet995", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet996", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet997", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet998", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet999", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1000", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1001", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1002", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1003", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1004", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1005", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1006", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1007", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1008", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1009", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1010", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1011", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1012", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1013", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1014", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1015", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1016", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1017", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1018", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1019", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1020", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1021", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1022", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1023", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1024", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1025", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1026", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1027", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1028", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1029", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1030", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1031", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1032", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1033", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1034", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1035", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1036", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1037", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1038", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1039", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1040", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1041", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1042", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1043", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1044", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1045", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1046", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1047", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1048", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1049", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1050", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1051", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1052", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1053", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1054", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1055", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1056", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1057", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1058", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1059", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1060", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1061", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1062", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1063", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1064", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1065", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1066", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1067", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1068", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1069", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1070", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1071", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1072", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1073", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1074", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1075", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1076", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1077", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1078", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1079", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1080", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1081", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1082", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1083", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1084", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1085", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1086", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1087", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1088", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1089", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1090", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1091", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1092", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1093", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1094", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1095", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1096", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1097", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1098", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1099", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1100", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1101", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1102", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1103", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1104", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1105", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1106", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1107", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1108", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1109", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1110", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1111", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1112", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1113", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1114", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1115", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1116", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1117", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1118", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1119", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1120", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1121", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1122", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1123", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1124", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1125", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1126", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1127", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1128", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1129", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1130", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1131", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1132", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1133", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1134", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1135", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1136", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1137", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1138", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1139", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1140", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1141", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1142", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1143", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1144", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1145", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1146", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1147", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1148", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1149", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1150", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1151", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1152", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1153", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1154", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1155", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1156", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1157", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1158", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1159", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1160", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1161", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1162", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1163", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1164", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1165", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1166", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1167", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1168", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1169", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1170", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1171", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1172", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1173", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1174", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1175", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1176", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1177", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1178", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1179", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1180", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1181", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1182", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1183", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1184", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1185", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1186", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1187", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1188", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1189", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1190", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1191", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1192", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1193", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1194", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1195", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1196", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1197", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1198", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1199", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1200", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1201", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1202", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1203", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1204", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1205", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1206", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1207", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1208", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1209", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1210", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1211", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1212", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1213", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1214", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1215", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1216", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1217", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1218", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1219", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1220", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1221", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1222", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1223", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1224", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1225", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1226", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1227", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1228", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1229", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1230", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1231", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1232", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1233", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1234", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1235", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1236", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1237", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1238", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1239", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1240", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1241", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1242", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1243", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1244", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1245", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1246", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1247", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1248", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1249", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1250", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1251", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1252", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1253", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1254", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1255", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1256", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1257", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1258", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1259", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1260", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1261", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1262", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1263", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1264", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1265", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1266", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1267", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1268", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1269", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1270", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1271", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1272", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1273", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1274", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1275", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1276", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1277", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1278", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1279", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1280", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1281", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1282", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1283", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1284", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1285", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1286", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1287", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1288", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1289", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1290", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1291", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1292", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1293", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1294", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1295", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1296", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1297", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1298", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1299", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1300", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1301", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1302", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1303", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1304", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1305", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1306", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1307", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1308", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1309", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1310", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1311", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1312", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1313", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1314", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1315", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1316", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1317", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1318", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1319", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1320", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1321", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1322", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1323", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1324", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1325", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1326", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1327", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1328", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1329", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1330", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1331", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1332", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1333", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1334", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1335", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1336", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1337", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1338", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1339", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1340", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1341", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1342", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1343", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1344", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1345", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1346", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1347", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1348", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1349", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1350", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1351", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1352", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1353", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1354", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1355", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1356", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1357", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1358", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1359", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1360", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1361", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1362", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1363", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1364", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1365", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1366", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1367", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1368", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1369", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1370", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1371", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1372", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1373", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1374", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1375", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1376", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1377", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1378", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1379", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1380", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1381", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1382", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1383", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1384", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1385", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1386", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1387", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1388", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1389", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1390", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1391", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1392", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1393", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1394", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1395", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1396", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1397", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1398", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1399", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1400", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1401", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1402", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1403", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1404", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1405", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1406", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1407", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1408", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1409", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1410", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1411", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1412", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1413", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1414", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1415", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1416", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1417", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1418", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1419", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1420", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1421", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1422", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1423", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1424", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1425", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1426", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1427", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1428", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1429", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1430", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1431", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1432", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1433", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1434", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1435", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1436", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1437", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1438", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1439", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1440", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1441", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1442", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1443", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1444", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1445", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1446", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1447", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1448", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1449", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1450", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1451", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1452", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1453", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1454", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1455", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1456", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1457", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1458", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1459", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1460", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1461", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1462", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1463", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1464", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1465", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1466", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1467", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1468", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1469", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1470", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1471", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1472", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1473", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1474", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1475", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1476", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1477", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1478", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1479", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1480", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1481", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1482", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1483", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1484", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1485", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1486", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1487", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1488", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1489", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1490", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1491", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1492", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1493", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1494", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1495", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1496", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1497", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1498", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1499", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1500", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1501", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1502", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1503", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1504", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1505", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1506", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1507", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1508", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1509", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1510", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1511", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1512", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1513", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1514", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1515", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1516", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1517", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1518", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1519", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1520", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1521", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1522", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1523", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1524", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1525", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1526", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1527", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1528", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1529", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1530", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1531", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1532", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1533", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1534", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1535", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1536", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1537", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1538", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1539", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1540", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1541", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1542", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1543", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1544", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1545", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1546", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1547", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1548", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1549", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1550", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1551", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1552", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1553", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1554", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1555", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1556", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1557", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1558", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1559", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1560", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1561", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1562", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1563", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1564", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1565", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1566", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1567", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1568", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1569", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1570", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1571", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1572", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1573", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1574", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1575", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1576", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1577", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1578", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1579", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1580", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1581", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1582", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1583", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1584", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1585", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1586", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1587", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1588", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1589", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1590", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1591", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1592", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1593", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1594", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1595", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1596", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1597", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1598", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1599", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1600", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1601", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1602", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1603", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1604", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1605", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1606", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1607", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1608", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1609", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1610", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1611", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1612", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1613", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1614", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1615", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1616", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1617", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1618", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1619", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1620", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1621", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1622", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1623", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1624", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1625", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1626", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1627", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1628", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1629", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1630", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1631", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1632", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1633", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1634", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1635", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1636", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1637", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1638", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1639", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1640", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1641", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1642", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1643", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1644", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1645", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1646", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1647", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1648", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1649", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1650", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1651", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1652", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1653", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1654", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1655", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1656", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1657", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1658", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1659", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1660", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1661", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1662", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1663", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1664", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1665", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1666", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1667", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1668", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1669", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1670", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1671", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1672", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1673", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1674", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1675", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1676", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1677", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1678", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1679", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1680", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1681", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1682", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1683", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1684", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1685", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1686", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1687", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1688", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1689", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1690", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1691", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1692", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1693", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1694", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1695", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1696", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1697", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1698", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1699", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1700", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1701", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1702", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1703", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1704", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1705", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1706", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1707", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1708", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1709", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1710", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1711", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1712", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1713", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1714", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1715", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1716", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1717", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1718", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1719", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1720", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1721", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1722", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1723", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1724", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1725", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1726", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1727", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1728", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1729", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1730", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1731", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1732", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1733", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1734", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1735", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1736", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1737", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1738", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1739", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1740", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1741", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1742", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1743", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1744", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1745", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1746", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1747", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1748", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1749", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1750", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1751", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1752", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1753", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1754", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1755", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1756", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1757", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1758", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1759", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1760", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1761", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1762", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1763", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1764", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1765", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1766", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1767", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1768", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1769", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1770", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1771", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1772", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1773", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1774", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1775", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1776", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1777", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1778", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1779", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1780", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1781", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1782", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1783", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1784", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1785", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1786", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1787", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1788", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1789", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1790", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1791", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1792", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1793", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1794", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1795", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1796", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1797", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1798", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1799", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1800", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1801", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1802", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1803", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1804", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1805", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1806", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1807", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1808", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1809", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1810", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1811", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1812", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1813", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1814", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1815", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1816", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1817", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1818", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1819", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1820", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1821", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1822", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1823", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1824", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1825", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1826", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1827", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1828", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1829", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1830", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1831", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1832", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1833", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1834", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1835", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1836", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1837", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1838", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1839", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1840", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1841", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1842", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1843", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1844", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1845", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1846", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1847", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1848", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1849", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1850", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1851", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1852", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1853", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1854", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1855", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1856", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1857", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1858", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1859", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1860", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1861", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1862", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1863", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1864", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1865", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1866", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1867", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1868", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1869", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1870", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1871", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1872", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1873", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1874", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1875", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1876", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1877", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1878", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1879", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1880", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1881", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1882", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1883", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1884", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1885", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1886", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1887", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1888", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1889", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1890", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1891", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1892", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1893", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1894", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1895", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1896", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1897", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1898", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1899", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1900", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1901", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1902", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1903", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1904", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1905", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1906", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1907", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1908", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1909", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1910", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1911", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1912", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1913", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1914", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1915", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1916", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1917", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1918", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1919", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1920", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1921", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1922", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1923", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1924", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1925", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1926", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1927", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1928", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1929", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1930", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1931", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1932", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1933", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1934", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1935", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1936", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1937", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1938", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1939", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1940", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1941", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1942", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1943", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1944", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1945", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1946", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1947", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1948", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1949", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1950", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1951", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1952", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1953", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1954", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1955", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1956", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1957", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1958", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1959", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1960", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1961", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1962", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1963", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1964", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1965", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1966", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1967", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1968", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1969", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1970", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1971", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1972", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1973", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1974", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1975", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1976", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1977", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1978", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1979", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1980", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1981", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1982", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1983", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1984", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1985", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1986", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1987", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1988", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1989", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1990", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1991", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1992", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1993", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1994", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1995", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1996", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1997", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1998", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet1999", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2000", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2001", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2002", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2003", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2004", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2005", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2006", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2007", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2008", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2009", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2010", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2011", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2012", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2013", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2014", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2015", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2016", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2017", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2018", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2019", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2020", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2021", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2022", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2023", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2024", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2025", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2026", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2027", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2028", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2029", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2030", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2031", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2032", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2033", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2034", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2035", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2036", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2037", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2038", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2039", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2040", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2041", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2042", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2043", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2044", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2045", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2046", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2047", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2048", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2049", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2050", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2051", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2052", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2053", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2054", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2055", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2056", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2057", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2058", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2059", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2060", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2061", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2062", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2063", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2064", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2065", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2066", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2067", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2068", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2069", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2070", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2071", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2072", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2073", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2074", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2075", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2076", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2077", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2078", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2079", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2080", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2081", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2082", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2083", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2084", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2085", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2086", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2087", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2088", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2089", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2090", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2091", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2092", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2093", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2094", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2095", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2096", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2097", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2098", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2099", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2100", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2101", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2102", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2103", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2104", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2105", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2106", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2107", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2108", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2109", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2110", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2111", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2112", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2113", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2114", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2115", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2116", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2117", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2118", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2119", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2120", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2121", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2122", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2123", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2124", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2125", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2126", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2127", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2128", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2129", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2130", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2131", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2132", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2133", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2134", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2135", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2136", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2137", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2138", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2139", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2140", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2141", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2142", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2143", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2144", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2145", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2146", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2147", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2148", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2149", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2150", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2151", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2152", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2153", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2154", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2155", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2156", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2157", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2158", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2159", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2160", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2161", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2162", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2163", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2164", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2165", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2166", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2167", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2168", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2169", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2170", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2171", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2172", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2173", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2174", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2175", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2176", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2177", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2178", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2179", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2180", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2181", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2182", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2183", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2184", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2185", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2186", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2187", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2188", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2189", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2190", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2191", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2192", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2193", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2194", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2195", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2196", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2197", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2198", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2199", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2200", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2201", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2202", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2203", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2204", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2205", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2206", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2207", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2208", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2209", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2210", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2211", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2212", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2213", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2214", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2215", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2216", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2217", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2218", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2219", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2220", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2221", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2222", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2223", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2224", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2225", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2226", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2227", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2228", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2229", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2230", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2231", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2232", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2233", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2234", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2235", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2236", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2237", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2238", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2239", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2240", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2241", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2242", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2243", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2244", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2245", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2246", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2247", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2248", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2249", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2250", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2251", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2252", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2253", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2254", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2255", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2256", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2257", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2258", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2259", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2260", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2261", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2262", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2263", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2264", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2265", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2266", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2267", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2268", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2269", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2270", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2271", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2272", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2273", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2274", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2275", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2276", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2277", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2278", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2279", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2280", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2281", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2282", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2283", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2284", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2285", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2286", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2287", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2288", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2289", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2290", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2291", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2292", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2293", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2294", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2295", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2296", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2297", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2298", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2299", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2300", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2301", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2302", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2303", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2304", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2305", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2306", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2307", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2308", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2309", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2310", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2311", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2312", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2313", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2314", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2315", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2316", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2317", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2318", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2319", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2320", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2321", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2322", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2323", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2324", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2325", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2326", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2327", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2328", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2329", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2330", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2331", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2332", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2333", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2334", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2335", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2336", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2337", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2338", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2339", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2340", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2341", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2342", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2343", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2344", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2345", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2346", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2347", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2348", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2349", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2350", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2351", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2352", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2353", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2354", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2355", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2356", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2357", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2358", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2359", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2360", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2361", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2362", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2363", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2364", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2365", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2366", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2367", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2368", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2369", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2370", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2371", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2372", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2373", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2374", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2375", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2376", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2377", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2378", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2379", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2380", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2381", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2382", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2383", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2384", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2385", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2386", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2387", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2388", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2389", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2390", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2391", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2392", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2393", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2394", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2395", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2396", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2397", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2398", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2399", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2400", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2401", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2402", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2403", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2404", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2405", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2406", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2407", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2408", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2409", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2410", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2411", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2412", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2413", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2414", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2415", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2416", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2417", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2418", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2419", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2420", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2421", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2422", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2423", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2424", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2425", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2426", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2427", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2428", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2429", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2430", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2431", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2432", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2433", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2434", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2435", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2436", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2437", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2438", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2439", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2440", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2441", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2442", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2443", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2444", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2445", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2446", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2447", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2448", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2449", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2450", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2451", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2452", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2453", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2454", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2455", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2456", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2457", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2458", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2459", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2460", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2461", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2462", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2463", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2464", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2465", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2466", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2467", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2468", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2469", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2470", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2471", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2472", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2473", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2474", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2475", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2476", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2477", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2478", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2479", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2480", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2481", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2482", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2483", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2484", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2485", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2486", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2487", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2488", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2489", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2490", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2491", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2492", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2493", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2494", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2495", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2496", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2497", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2498", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2499", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2500", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2501", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2502", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2503", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2504", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2505", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2506", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2507", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2508", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2509", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2510", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2511", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2512", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2513", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2514", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2515", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2516", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2517", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2518", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2519", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2520", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2521", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2522", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2523", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2524", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2525", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2526", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2527", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2528", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2529", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2530", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2531", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2532", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2533", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2534", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2535", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2536", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2537", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2538", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2539", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2540", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2541", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2542", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2543", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2544", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2545", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2546", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2547", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2548", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2549", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2550", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2551", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2552", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2553", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2554", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2555", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2556", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2557", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2558", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2559", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2560", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2561", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2562", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2563", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2564", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2565", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2566", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2567", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2568", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2569", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2570", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2571", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2572", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2573", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2574", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2575", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2576", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2577", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2578", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2579", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2580", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2581", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2582", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2583", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2584", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2585", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2586", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2587", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2588", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2589", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2590", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2591", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2592", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2593", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2594", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2595", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2596", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2597", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2598", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2599", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2600", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2601", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2602", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2603", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2604", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2605", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2606", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2607", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2608", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2609", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2610", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2611", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2612", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2613", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2614", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2615", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2616", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2617", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2618", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2619", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2620", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2621", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2622", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2623", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2624", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2625", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2626", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2627", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2628", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2629", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2630", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2631", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2632", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2633", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2634", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2635", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2636", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2637", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2638", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2639", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2640", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2641", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2642", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2643", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2644", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2645", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2646", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2647", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2648", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2649", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2650", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2651", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2652", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2653", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2654", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2655", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2656", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2657", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2658", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2659", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2660", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2661", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2662", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2663", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2664", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2665", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2666", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2667", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2668", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2669", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2670", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2671", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2672", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2673", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2674", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2675", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2676", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2677", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2678", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2679", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2680", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2681", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2682", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2683", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2684", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2685", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2686", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2687", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2688", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2689", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2690", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2691", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2692", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2693", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2694", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2695", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2696", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2697", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2698", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2699", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2700", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2701", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2702", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2703", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2704", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2705", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2706", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2707", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2708", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2709", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2710", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2711", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2712", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2713", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2714", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2715", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2716", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2717", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2718", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2719", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2720", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2721", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2722", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2723", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2724", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2725", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2726", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2727", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2728", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2729", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2730", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2731", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2732", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2733", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2734", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2735", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2736", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2737", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2738", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2739", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2740", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2741", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2742", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2743", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2744", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2745", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2746", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2747", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2748", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2749", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2750", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2751", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2752", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2753", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2754", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2755", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2756", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2757", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2758", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2759", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2760", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2761", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2762", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2763", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2764", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2765", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2766", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2767", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2768", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2769", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2770", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2771", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2772", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2773", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2774", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2775", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2776", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2777", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2778", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2779", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2780", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2781", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2782", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2783", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2784", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2785", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2786", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2787", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2788", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2789", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2790", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2791", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2792", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2793", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2794", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2795", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2796", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2797", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2798", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2799", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2800", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2801", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2802", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2803", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2804", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2805", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2806", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2807", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2808", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2809", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2810", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2811", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2812", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2813", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2814", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2815", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2816", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2817", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2818", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2819", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2820", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2821", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2822", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2823", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2824", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2825", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2826", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2827", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2828", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2829", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2830", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2831", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2832", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2833", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2834", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2835", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2836", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2837", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2838", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2839", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2840", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2841", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2842", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2843", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2844", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2845", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2846", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2847", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2848", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2849", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2850", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2851", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2852", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2853", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2854", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2855", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2856", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2857", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2858", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2859", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2860", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2861", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2862", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2863", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2864", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2865", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2866", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2867", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2868", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2869", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2870", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2871", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2872", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2873", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2874", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2875", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2876", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2877", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2878", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2879", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2880", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2881", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2882", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2883", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2884", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2885", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2886", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2887", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2888", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2889", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2890", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2891", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2892", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2893", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2894", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2895", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2896", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2897", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2898", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2899", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2900", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2901", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2902", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2903", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2904", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2905", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2906", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2907", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2908", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2909", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2910", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2911", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2912", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2913", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2914", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2915", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2916", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2917", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2918", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2919", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2920", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2921", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2922", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2923", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2924", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2925", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2926", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2927", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2928", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2929", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2930", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2931", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2932", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2933", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2934", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2935", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2936", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2937", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2938", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2939", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2940", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2941", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2942", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2943", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2944", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2945", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2946", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2947", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2948", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2949", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2950", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2951", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2952", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2953", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2954", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2955", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2956", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2957", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2958", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2959", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2960", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2961", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2962", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2963", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2964", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2965", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2966", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2967", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2968", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2969", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2970", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2971", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2972", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2973", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2974", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2975", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2976", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2977", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2978", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2979", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2980", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2981", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2982", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2983", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2984", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2985", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2986", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2987", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2988", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2989", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2990", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2991", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2992", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2993", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2994", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2995", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2996", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2997", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2998", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet2999", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3000", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3001", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3002", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3003", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3004", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3005", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3006", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3007", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3008", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3009", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3010", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3011", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3012", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3013", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3014", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3015", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3016", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3017", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3018", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3019", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3020", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3021", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3022", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3023", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3024", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3025", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3026", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3027", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3028", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3029", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3030", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3031", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3032", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3033", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3034", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3035", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3036", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3037", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3038", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3039", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3040", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3041", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3042", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3043", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3044", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3045", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3046", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3047", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3048", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3049", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3050", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3051", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3052", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3053", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3054", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3055", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3056", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3057", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3058", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3059", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3060", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3061", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3062", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3063", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3064", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3065", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3066", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3067", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3068", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3069", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3070", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3071", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3072", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3073", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3074", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3075", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3076", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3077", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3078", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3079", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3080", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3081", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3082", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3083", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3084", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3085", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3086", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3087", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3088", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3089", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3090", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3091", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3092", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3093", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3094", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3095", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3096", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3097", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3098", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3099", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3100", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3101", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3102", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3103", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3104", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3105", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3106", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3107", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3108", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3109", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3110", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3111", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3112", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3113", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3114", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3115", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3116", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3117", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3118", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3119", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3120", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3121", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3122", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3123", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3124", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3125", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3126", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3127", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3128", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3129", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3130", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3131", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3132", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3133", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3134", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3135", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3136", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3137", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3138", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3139", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3140", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3141", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3142", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3143", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3144", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3145", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3146", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3147", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3148", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3149", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3150", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3151", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3152", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3153", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3154", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3155", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3156", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3157", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3158", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3159", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3160", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3161", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3162", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3163", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3164", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3165", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3166", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3167", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3168", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3169", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3170", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3171", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3172", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3173", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3174", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3175", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3176", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3177", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3178", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3179", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3180", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3181", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3182", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3183", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3184", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3185", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3186", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3187", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3188", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3189", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3190", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3191", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3192", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3193", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3194", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3195", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3196", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3197", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3198", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3199", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3200", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3201", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3202", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3203", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3204", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3205", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3206", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3207", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3208", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3209", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3210", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3211", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3212", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3213", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3214", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3215", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3216", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3217", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3218", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3219", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3220", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3221", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3222", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3223", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3224", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3225", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3226", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3227", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3228", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3229", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3230", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3231", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3232", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3233", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3234", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3235", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3236", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3237", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3238", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3239", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3240", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3241", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3242", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3243", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3244", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3245", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3246", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3247", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3248", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3249", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3250", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3251", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3252", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3253", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3254", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3255", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3256", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3257", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3258", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3259", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3260", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3261", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3262", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3263", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3264", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3265", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3266", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3267", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3268", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3269", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3270", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3271", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3272", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3273", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3274", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3275", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3276", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3277", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3278", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3279", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3280", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3281", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3282", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3283", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3284", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3285", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3286", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3287", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3288", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3289", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3290", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3291", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3292", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3293", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3294", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3295", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3296", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3297", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3298", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3299", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3300", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3301", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3302", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3303", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3304", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3305", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3306", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3307", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3308", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3309", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3310", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3311", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3312", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3313", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3314", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3315", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3316", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3317", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3318", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3319", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3320", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3321", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3322", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3323", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3324", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3325", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3326", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3327", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3328", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3329", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3330", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3331", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3332", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3333", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3334", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3335", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3336", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3337", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3338", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3339", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3340", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3341", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3342", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3343", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3344", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3345", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3346", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3347", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3348", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3349", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3350", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3351", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3352", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3353", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3354", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3355", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3356", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3357", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3358", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3359", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3360", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3361", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3362", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3363", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3364", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3365", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3366", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3367", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3368", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3369", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3370", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3371", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3372", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3373", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3374", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3375", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3376", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3377", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3378", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3379", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3380", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3381", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3382", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3383", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3384", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3385", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3386", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3387", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3388", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3389", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3390", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3391", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3392", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3393", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3394", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3395", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3396", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3397", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3398", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3399", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3400", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3401", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3402", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3403", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3404", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3405", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3406", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3407", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3408", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3409", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3410", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3411", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3412", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3413", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3414", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3415", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3416", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3417", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3418", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3419", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3420", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3421", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3422", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3423", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3424", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3425", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3426", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3427", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3428", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3429", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3430", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3431", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3432", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3433", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3434", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3435", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3436", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3437", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3438", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3439", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3440", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3441", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3442", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3443", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3444", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3445", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3446", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3447", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3448", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3449", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3450", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3451", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3452", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3453", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3454", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3455", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3456", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3457", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3458", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3459", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3460", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3461", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3462", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3463", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3464", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3465", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3466", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3467", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3468", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3469", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3470", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3471", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3472", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3473", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3474", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3475", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3476", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3477", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3478", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3479", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3480", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3481", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3482", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3483", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3484", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3485", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3486", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3487", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3488", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3489", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3490", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3491", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3492", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3493", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3494", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3495", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3496", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3497", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3498", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3499", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3500", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3501", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3502", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3503", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3504", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3505", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3506", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3507", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3508", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3509", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3510", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3511", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3512", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3513", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3514", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3515", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3516", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3517", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3518", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3519", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3520", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3521", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3522", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3523", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3524", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3525", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3526", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3527", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3528", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3529", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3530", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3531", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3532", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3533", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3534", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3535", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3536", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3537", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3538", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3539", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3540", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3541", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3542", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3543", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3544", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3545", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3546", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3547", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3548", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3549", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3550", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3551", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3552", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3553", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3554", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3555", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3556", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3557", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3558", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3559", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3560", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3561", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3562", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3563", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3564", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3565", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3566", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3567", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3568", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3569", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3570", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3571", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3572", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3573", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3574", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3575", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3576", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3577", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3578", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3579", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3580", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3581", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3582", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3583", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3584", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3585", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3586", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3587", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3588", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3589", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3590", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3591", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3592", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3593", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3594", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3595", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3596", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3597", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3598", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3599", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3600", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3601", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3602", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3603", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3604", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3605", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3606", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3607", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3608", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3609", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3610", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3611", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3612", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3613", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3614", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3615", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3616", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3617", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3618", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3619", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3620", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3621", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3622", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3623", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3624", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3625", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3626", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3627", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3628", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3629", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3630", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3631", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3632", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3633", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3634", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3635", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3636", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3637", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3638", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3639", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3640", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3641", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3642", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3643", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3644", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3645", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3646", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3647", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3648", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3649", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3650", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3651", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3652", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3653", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3654", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3655", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3656", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3657", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3658", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3659", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3660", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3661", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3662", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3663", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3664", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3665", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3666", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3667", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3668", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3669", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3670", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3671", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3672", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3673", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3674", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3675", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3676", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3677", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3678", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3679", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3680", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3681", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3682", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3683", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3684", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3685", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3686", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3687", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3688", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3689", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3690", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3691", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3692", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3693", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3694", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3695", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3696", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3697", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3698", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3699", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3700", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3701", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3702", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3703", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3704", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3705", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3706", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3707", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3708", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3709", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3710", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3711", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3712", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3713", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3714", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3715", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3716", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3717", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3718", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3719", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3720", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3721", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3722", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3723", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3724", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3725", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3726", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3727", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3728", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3729", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3730", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3731", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3732", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3733", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3734", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3735", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3736", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3737", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3738", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3739", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3740", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3741", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3742", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3743", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3744", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3745", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3746", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3747", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3748", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3749", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3750", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3751", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3752", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3753", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3754", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3755", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3756", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3757", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3758", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3759", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3760", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3761", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3762", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3763", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3764", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3765", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3766", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3767", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3768", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3769", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3770", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3771", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3772", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3773", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3774", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3775", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3776", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3777", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3778", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3779", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3780", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3781", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3782", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3783", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3784", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3785", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3786", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3787", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3788", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3789", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3790", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3791", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3792", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3793", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3794", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3795", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3796", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3797", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3798", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3799", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3800", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3801", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3802", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3803", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3804", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3805", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3806", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3807", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3808", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3809", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3810", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3811", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3812", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3813", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3814", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3815", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3816", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3817", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3818", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3819", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3820", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3821", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3822", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3823", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3824", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3825", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3826", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3827", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3828", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3829", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3830", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3831", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3832", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3833", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3834", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3835", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3836", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3837", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3838", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3839", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3840", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3841", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3842", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3843", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3844", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3845", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3846", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3847", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3848", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3849", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3850", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3851", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3852", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3853", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3854", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3855", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3856", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3857", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3858", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3859", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3860", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3861", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3862", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3863", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3864", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3865", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3866", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3867", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3868", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3869", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3870", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3871", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3872", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3873", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3874", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3875", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3876", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3877", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3878", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3879", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3880", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3881", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3882", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3883", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3884", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3885", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3886", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3887", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3888", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3889", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3890", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3891", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3892", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3893", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3894", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3895", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3896", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3897", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3898", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3899", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3900", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3901", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3902", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3903", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3904", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3905", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3906", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3907", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3908", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3909", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3910", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3911", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3912", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3913", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3914", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3915", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3916", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3917", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3918", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3919", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3920", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3921", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3922", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3923", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3924", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3925", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3926", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3927", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3928", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3929", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3930", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3931", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3932", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3933", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3934", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3935", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3936", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3937", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3938", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3939", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3940", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3941", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3942", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3943", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3944", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3945", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3946", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3947", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3948", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3949", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3950", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3951", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3952", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3953", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3954", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3955", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3956", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3957", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3958", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3959", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3960", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3961", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3962", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3963", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3964", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3965", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3966", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3967", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3968", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3969", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3970", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3971", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3972", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3973", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3974", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3975", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3976", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3977", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3978", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3979", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3980", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3981", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3982", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3983", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3984", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3985", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3986", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3987", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3988", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3989", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3990", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3991", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3992", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3993", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3994", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3995", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3996", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3997", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3998", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet3999", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4000", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4001", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4002", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4003", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4004", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4005", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4006", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4007", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4008", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4009", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4010", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4011", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4012", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4013", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4014", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4015", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4016", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4017", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4018", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4019", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4020", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4021", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4022", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4023", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4024", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4025", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4026", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4027", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4028", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4029", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4030", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4031", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4032", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4033", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4034", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4035", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4036", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4037", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4038", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4039", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4040", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4041", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4042", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4043", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4044", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4045", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4046", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4047", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4048", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4049", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4050", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4051", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4052", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4053", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4054", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4055", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4056", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4057", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4058", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4059", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4060", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4061", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4062", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4063", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4064", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4065", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4066", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4067", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4068", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4069", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4070", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4071", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4072", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4073", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4074", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4075", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4076", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4077", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4078", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4079", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4080", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4081", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4082", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4083", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4084", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4085", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4086", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4087", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4088", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4089", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4090", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4091", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4092", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4093", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4094", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4095", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4096", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4097", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4098", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4099", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4100", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4101", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4102", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4103", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4104", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4105", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4106", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4107", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4108", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4109", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4110", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4111", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4112", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4113", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4114", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4115", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4116", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4117", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4118", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4119", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4120", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4121", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4122", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4123", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4124", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4125", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4126", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4127", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4128", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4129", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4130", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4131", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4132", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4133", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4134", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4135", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4136", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4137", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4138", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4139", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4140", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4141", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4142", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4143", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4144", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4145", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4146", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4147", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4148", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4149", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4150", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4151", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4152", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4153", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4154", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4155", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4156", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4157", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4158", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4159", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4160", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4161", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4162", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4163", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4164", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4165", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4166", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4167", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4168", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4169", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4170", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4171", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4172", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4173", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4174", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4175", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4176", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4177", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4178", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4179", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4180", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4181", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4182", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4183", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4184", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4185", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4186", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4187", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4188", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4189", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4190", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4191", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4192", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4193", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4194", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4195", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4196", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4197", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4198", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4199", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4200", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4201", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4202", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4203", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4204", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4205", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4206", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4207", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4208", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4209", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4210", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4211", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4212", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4213", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4214", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4215", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4216", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4217", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4218", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4219", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4220", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4221", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4222", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4223", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4224", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4225", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4226", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4227", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4228", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4229", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4230", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4231", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4232", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4233", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4234", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4235", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4236", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4237", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4238", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4239", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4240", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4241", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4242", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4243", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4244", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4245", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4246", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4247", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4248", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4249", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4250", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4251", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4252", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4253", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4254", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4255", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4256", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4257", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4258", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4259", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4260", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4261", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4262", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4263", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4264", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4265", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4266", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4267", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4268", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4269", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4270", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4271", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4272", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4273", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4274", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4275", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4276", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4277", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4278", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4279", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4280", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4281", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4282", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4283", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4284", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4285", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4286", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4287", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4288", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4289", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4290", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4291", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4292", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4293", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4294", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4295", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4296", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4297", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4298", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4299", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4300", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4301", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4302", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4303", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4304", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4305", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4306", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4307", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4308", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4309", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4310", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4311", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4312", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4313", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4314", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4315", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4316", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4317", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4318", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4319", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4320", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4321", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4322", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4323", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4324", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4325", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4326", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4327", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4328", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4329", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4330", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4331", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4332", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4333", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4334", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4335", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4336", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4337", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4338", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4339", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4340", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4341", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4342", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4343", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4344", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4345", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4346", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4347", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4348", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4349", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4350", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4351", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4352", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4353", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4354", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4355", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4356", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4357", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4358", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4359", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4360", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4361", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4362", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4363", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4364", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4365", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4366", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4367", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4368", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4369", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4370", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4371", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4372", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4373", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4374", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4375", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4376", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4377", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4378", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4379", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4380", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4381", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4382", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4383", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4384", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4385", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4386", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4387", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4388", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4389", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4390", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4391", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4392", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4393", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4394", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4395", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4396", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4397", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4398", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4399", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4400", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4401", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4402", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4403", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4404", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4405", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4406", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4407", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4408", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4409", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4410", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4411", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4412", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4413", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4414", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4415", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4416", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4417", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4418", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4419", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4420", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4421", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4422", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4423", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4424", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4425", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4426", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4427", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4428", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4429", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4430", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4431", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4432", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4433", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4434", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4435", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4436", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4437", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4438", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4439", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4440", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4441", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4442", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4443", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4444", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4445", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4446", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4447", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4448", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4449", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4450", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4451", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4452", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4453", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4454", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4455", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4456", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4457", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4458", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4459", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4460", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4461", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4462", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4463", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4464", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4465", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4466", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4467", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4468", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4469", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4470", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4471", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4472", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4473", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4474", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4475", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4476", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4477", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4478", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4479", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4480", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4481", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4482", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4483", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4484", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4485", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4486", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4487", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4488", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4489", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4490", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4491", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4492", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4493", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4494", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4495", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4496", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4497", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4498", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4499", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4500", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4501", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4502", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4503", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4504", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4505", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4506", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4507", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4508", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4509", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4510", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4511", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4512", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4513", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4514", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4515", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4516", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4517", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4518", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4519", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4520", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4521", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4522", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4523", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4524", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4525", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4526", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4527", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4528", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4529", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4530", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4531", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4532", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4533", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4534", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4535", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4536", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4537", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4538", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4539", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4540", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4541", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4542", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4543", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4544", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4545", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4546", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4547", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4548", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4549", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4550", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4551", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4552", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4553", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4554", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4555", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4556", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4557", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4558", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4559", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4560", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4561", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4562", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4563", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4564", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4565", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4566", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4567", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4568", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4569", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4570", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4571", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4572", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4573", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4574", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4575", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4576", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4577", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4578", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4579", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4580", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4581", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4582", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4583", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4584", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4585", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4586", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4587", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4588", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4589", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4590", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4591", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4592", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4593", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4594", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4595", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4596", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4597", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4598", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4599", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4600", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4601", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4602", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4603", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4604", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4605", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4606", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4607", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4608", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4609", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4610", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4611", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4612", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4613", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4614", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4615", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4616", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4617", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4618", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4619", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4620", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4621", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4622", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4623", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4624", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4625", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4626", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4627", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4628", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4629", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4630", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4631", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4632", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4633", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4634", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4635", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4636", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4637", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4638", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4639", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4640", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4641", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4642", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4643", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4644", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4645", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4646", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4647", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4648", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4649", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4650", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4651", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4652", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4653", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4654", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4655", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4656", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4657", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4658", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4659", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4660", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4661", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4662", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4663", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4664", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4665", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4666", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4667", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4668", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4669", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4670", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4671", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4672", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4673", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4674", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4675", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4676", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4677", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4678", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4679", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4680", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4681", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4682", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4683", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4684", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4685", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4686", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4687", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4688", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4689", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4690", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4691", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4692", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4693", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4694", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4695", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4696", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4697", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4698", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4699", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4700", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4701", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4702", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4703", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4704", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4705", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4706", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4707", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4708", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4709", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4710", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4711", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4712", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4713", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4714", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4715", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4716", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4717", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4718", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4719", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4720", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4721", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4722", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4723", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4724", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4725", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4726", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4727", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4728", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4729", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4730", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4731", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4732", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4733", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4734", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4735", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4736", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4737", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4738", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4739", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4740", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4741", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4742", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4743", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4744", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4745", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4746", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4747", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4748", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4749", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4750", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4751", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4752", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4753", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4754", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4755", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4756", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4757", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4758", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4759", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4760", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4761", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4762", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4763", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4764", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4765", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4766", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4767", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4768", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4769", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4770", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4771", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4772", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4773", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4774", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4775", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4776", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4777", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4778", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4779", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4780", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4781", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4782", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4783", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4784", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4785", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4786", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4787", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4788", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4789", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4790", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4791", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4792", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4793", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4794", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4795", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4796", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4797", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4798", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4799", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4800", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4801", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4802", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4803", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4804", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4805", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4806", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4807", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4808", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4809", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4810", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4811", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4812", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4813", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4814", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4815", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4816", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4817", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4818", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4819", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4820", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4821", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4822", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4823", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4824", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4825", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4826", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4827", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4828", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4829", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4830", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4831", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4832", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4833", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4834", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4835", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4836", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4837", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4838", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4839", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4840", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4841", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4842", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4843", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4844", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4845", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4846", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4847", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4848", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4849", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4850", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4851", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4852", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4853", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4854", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4855", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4856", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4857", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4858", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4859", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4860", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4861", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4862", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4863", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4864", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4865", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4866", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4867", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4868", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4869", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4870", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4871", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4872", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4873", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4874", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4875", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4876", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4877", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4878", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4879", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4880", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4881", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4882", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4883", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4884", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4885", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4886", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4887", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4888", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4889", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4890", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4891", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4892", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4893", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4894", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4895", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4896", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4897", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4898", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4899", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4900", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4901", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4902", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4903", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4904", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4905", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4906", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4907", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4908", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4909", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4910", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4911", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4912", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4913", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4914", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4915", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4916", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4917", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4918", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4919", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4920", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4921", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4922", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4923", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4924", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4925", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4926", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4927", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4928", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4929", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4930", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4931", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4932", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4933", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4934", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4935", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4936", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4937", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4938", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4939", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4940", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4941", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4942", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4943", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4944", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4945", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4946", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4947", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4948", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4949", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4950", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4951", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4952", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4953", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4954", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4955", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4956", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4957", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4958", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4959", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4960", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4961", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4962", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4963", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4964", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4965", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4966", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4967", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4968", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4969", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4970", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4971", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4972", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4973", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4974", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4975", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4976", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4977", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4978", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4979", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4980", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4981", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4982", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4983", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4984", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4985", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4986", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4987", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4988", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4989", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4990", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4991", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4992", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4993", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4994", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4995", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4996", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4997", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4998", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet4999", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5000", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5001", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5002", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5003", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5004", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5005", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5006", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5007", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5008", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5009", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5010", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5011", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5012", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5013", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5014", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5015", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5016", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5017", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5018", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5019", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5020", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5021", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5022", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5023", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5024", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5025", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5026", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5027", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5028", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5029", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5030", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5031", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5032", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5033", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5034", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5035", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5036", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5037", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5038", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5039", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5040", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5041", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5042", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5043", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5044", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5045", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5046", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5047", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5048", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5049", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5050", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5051", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5052", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5053", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5054", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5055", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5056", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5057", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5058", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5059", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5060", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5061", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5062", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5063", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5064", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5065", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5066", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5067", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5068", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5069", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5070", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5071", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5072", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5073", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5074", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5075", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5076", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5077", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5078", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5079", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5080", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5081", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5082", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5083", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5084", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5085", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5086", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5087", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5088", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5089", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5090", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5091", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5092", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5093", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5094", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5095", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5096", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5097", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5098", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5099", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5100", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5101", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5102", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5103", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5104", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5105", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5106", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5107", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5108", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5109", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5110", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5111", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5112", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5113", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5114", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5115", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5116", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5117", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5118", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5119", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5120", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5121", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5122", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5123", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5124", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5125", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5126", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5127", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5128", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5129", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5130", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5131", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5132", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5133", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5134", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5135", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5136", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5137", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5138", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5139", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5140", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5141", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5142", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5143", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5144", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5145", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5146", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5147", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5148", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5149", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5150", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5151", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5152", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5153", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5154", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5155", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5156", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5157", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5158", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5159", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5160", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5161", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5162", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5163", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5164", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5165", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5166", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5167", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5168", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5169", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5170", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5171", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5172", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5173", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5174", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5175", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5176", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5177", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5178", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5179", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5180", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5181", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5182", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5183", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5184", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5185", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5186", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5187", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5188", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5189", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5190", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5191", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5192", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5193", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5194", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5195", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5196", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5197", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5198", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5199", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5200", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5201", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5202", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5203", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5204", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5205", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5206", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5207", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5208", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5209", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5210", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5211", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5212", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5213", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5214", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5215", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5216", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5217", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5218", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5219", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5220", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5221", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5222", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5223", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5224", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5225", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5226", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5227", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5228", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5229", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5230", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5231", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5232", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5233", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5234", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5235", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5236", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5237", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5238", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5239", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5240", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5241", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5242", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5243", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5244", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5245", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5246", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5247", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5248", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5249", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5250", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5251", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5252", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5253", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5254", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5255", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5256", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5257", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5258", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5259", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5260", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5261", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5262", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5263", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5264", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5265", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5266", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5267", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5268", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5269", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5270", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5271", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5272", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5273", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5274", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5275", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5276", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5277", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5278", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5279", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5280", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5281", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5282", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5283", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5284", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5285", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5286", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5287", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5288", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5289", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5290", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5291", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5292", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5293", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5294", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5295", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5296", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5297", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5298", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5299", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5300", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5301", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5302", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5303", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5304", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5305", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5306", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5307", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5308", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5309", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5310", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5311", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5312", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5313", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5314", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5315", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5316", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5317", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5318", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5319", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5320", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5321", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5322", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5323", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5324", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5325", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5326", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5327", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5328", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5329", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5330", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5331", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5332", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5333", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5334", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5335", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5336", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5337", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5338", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5339", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5340", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5341", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5342", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5343", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5344", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5345", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5346", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5347", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5348", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5349", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5350", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5351", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5352", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5353", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5354", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5355", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5356", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5357", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5358", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5359", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5360", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5361", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5362", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5363", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5364", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5365", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5366", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5367", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5368", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5369", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5370", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5371", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5372", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5373", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5374", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5375", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5376", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5377", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5378", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5379", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5380", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5381", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5382", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5383", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5384", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5385", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5386", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5387", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5388", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5389", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5390", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5391", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5392", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5393", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5394", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5395", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5396", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5397", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5398", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5399", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5400", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5401", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5402", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5403", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5404", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5405", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5406", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5407", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5408", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5409", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5410", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5411", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5412", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5413", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5414", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5415", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5416", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5417", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5418", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5419", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5420", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5421", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5422", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5423", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5424", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5425", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5426", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5427", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5428", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5429", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5430", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5431", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5432", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5433", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5434", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5435", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5436", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5437", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5438", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5439", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5440", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5441", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5442", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5443", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5444", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5445", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5446", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5447", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5448", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5449", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5450", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5451", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5452", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5453", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5454", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5455", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5456", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5457", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5458", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5459", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5460", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5461", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5462", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5463", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5464", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5465", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5466", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5467", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5468", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5469", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5470", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5471", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5472", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5473", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5474", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5475", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5476", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5477", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5478", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5479", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5480", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5481", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5482", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5483", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5484", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5485", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5486", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5487", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5488", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5489", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5490", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5491", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5492", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5493", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5494", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5495", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5496", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5497", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5498", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5499", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5500", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5501", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5502", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5503", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5504", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5505", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5506", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5507", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5508", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5509", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5510", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5511", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5512", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5513", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5514", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5515", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5516", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5517", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5518", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5519", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5520", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5521", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5522", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5523", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5524", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5525", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5526", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5527", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5528", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5529", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5530", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5531", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5532", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5533", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5534", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5535", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5536", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5537", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5538", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5539", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5540", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5541", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5542", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5543", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5544", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5545", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5546", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5547", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5548", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5549", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5550", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5551", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5552", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5553", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5554", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5555", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5556", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5557", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5558", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5559", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5560", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5561", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5562", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5563", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5564", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5565", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5566", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5567", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5568", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5569", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5570", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5571", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5572", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5573", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5574", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5575", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5576", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5577", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5578", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5579", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5580", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5581", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5582", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5583", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5584", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5585", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5586", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5587", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5588", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5589", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5590", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5591", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5592", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5593", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5594", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5595", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5596", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5597", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5598", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5599", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5600", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5601", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5602", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5603", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5604", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5605", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5606", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5607", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5608", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5609", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5610", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5611", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5612", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5613", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5614", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5615", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5616", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5617", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5618", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5619", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5620", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5621", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5622", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5623", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5624", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5625", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5626", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5627", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5628", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5629", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5630", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5631", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5632", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5633", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5634", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5635", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5636", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5637", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5638", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5639", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5640", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5641", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5642", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5643", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5644", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5645", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5646", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5647", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5648", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5649", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5650", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5651", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5652", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5653", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5654", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5655", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5656", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5657", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5658", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5659", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5660", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5661", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5662", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5663", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5664", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5665", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5666", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5667", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5668", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5669", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5670", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5671", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5672", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5673", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5674", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5675", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5676", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5677", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5678", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5679", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5680", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5681", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5682", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5683", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5684", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5685", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5686", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5687", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5688", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5689", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5690", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5691", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5692", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5693", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5694", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5695", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5696", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5697", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5698", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5699", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5700", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5701", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5702", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5703", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5704", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5705", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5706", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5707", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5708", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5709", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5710", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5711", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5712", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5713", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5714", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5715", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5716", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5717", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5718", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5719", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5720", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5721", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5722", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5723", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5724", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5725", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5726", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5727", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5728", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5729", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5730", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5731", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5732", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5733", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5734", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5735", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5736", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5737", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5738", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5739", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5740", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5741", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5742", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5743", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5744", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5745", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5746", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5747", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5748", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5749", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5750", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5751", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5752", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5753", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5754", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5755", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5756", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5757", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5758", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5759", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5760", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5761", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5762", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5763", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5764", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5765", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5766", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5767", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5768", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5769", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5770", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5771", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5772", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5773", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5774", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5775", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5776", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5777", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5778", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5779", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5780", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5781", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5782", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5783", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5784", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5785", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5786", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5787", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5788", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5789", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5790", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5791", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5792", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5793", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5794", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5795", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5796", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5797", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5798", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5799", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5800", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5801", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5802", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5803", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5804", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5805", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5806", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5807", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5808", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5809", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5810", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5811", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5812", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5813", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5814", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5815", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5816", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5817", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5818", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5819", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5820", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5821", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5822", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5823", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5824", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5825", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5826", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5827", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5828", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5829", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5830", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5831", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5832", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5833", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5834", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5835", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5836", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5837", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5838", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5839", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5840", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5841", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5842", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5843", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5844", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5845", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5846", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5847", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5848", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5849", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5850", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5851", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5852", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5853", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5854", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5855", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5856", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5857", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5858", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5859", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5860", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5861", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5862", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5863", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5864", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5865", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5866", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5867", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5868", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5869", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5870", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5871", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5872", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5873", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5874", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5875", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5876", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5877", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5878", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5879", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5880", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5881", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5882", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5883", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5884", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5885", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5886", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5887", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5888", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5889", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5890", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5891", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5892", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5893", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5894", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5895", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5896", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5897", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5898", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5899", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5900", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5901", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5902", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5903", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5904", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5905", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5906", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5907", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5908", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5909", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5910", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5911", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5912", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5913", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5914", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5915", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5916", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5917", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5918", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5919", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5920", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5921", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5922", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5923", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5924", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5925", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5926", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5927", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5928", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5929", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5930", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5931", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5932", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5933", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5934", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5935", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5936", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5937", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5938", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5939", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5940", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5941", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5942", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5943", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5944", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5945", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5946", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5947", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5948", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5949", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5950", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5951", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5952", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5953", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5954", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5955", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5956", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5957", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5958", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5959", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5960", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5961", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5962", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5963", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5964", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5965", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5966", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5967", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5968", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5969", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5970", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5971", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5972", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5973", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5974", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5975", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5976", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5977", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5978", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5979", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5980", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5981", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5982", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5983", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5984", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5985", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5986", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5987", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5988", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5989", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5990", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5991", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5992", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5993", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5994", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5995", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5996", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5997", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5998", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet5999", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6000", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6001", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6002", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6003", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6004", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6005", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6006", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6007", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6008", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6009", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6010", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6011", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6012", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6013", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6014", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6015", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6016", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6017", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6018", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6019", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6020", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6021", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6022", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6023", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6024", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6025", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6026", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6027", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6028", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6029", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6030", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6031", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6032", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6033", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6034", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6035", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6036", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6037", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6038", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6039", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6040", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6041", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6042", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6043", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6044", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6045", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6046", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6047", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6048", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6049", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6050", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6051", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6052", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6053", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6054", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6055", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6056", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6057", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6058", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6059", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6060", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6061", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6062", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6063", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6064", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6065", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6066", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6067", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6068", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6069", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6070", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6071", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6072", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6073", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6074", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6075", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6076", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6077", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6078", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6079", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6080", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6081", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6082", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6083", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6084", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6085", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6086", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6087", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6088", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6089", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6090", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6091", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6092", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6093", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6094", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6095", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6096", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6097", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6098", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6099", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6100", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6101", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6102", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6103", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6104", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6105", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6106", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6107", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6108", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6109", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6110", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6111", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6112", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6113", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6114", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6115", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6116", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6117", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6118", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6119", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6120", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6121", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6122", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6123", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6124", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6125", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6126", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6127", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6128", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6129", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6130", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6131", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6132", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6133", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6134", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6135", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6136", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6137", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6138", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6139", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6140", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6141", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6142", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6143", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6144", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6145", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6146", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6147", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6148", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6149", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6150", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6151", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6152", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6153", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6154", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6155", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6156", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6157", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6158", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6159", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6160", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6161", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6162", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6163", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6164", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6165", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6166", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6167", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6168", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6169", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6170", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6171", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6172", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6173", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6174", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6175", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6176", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6177", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6178", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6179", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6180", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6181", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6182", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6183", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6184", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6185", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6186", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6187", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6188", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6189", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6190", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6191", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6192", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6193", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6194", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6195", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6196", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6197", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6198", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6199", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6200", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6201", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6202", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6203", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6204", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6205", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6206", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6207", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6208", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6209", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6210", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6211", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6212", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6213", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6214", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6215", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6216", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6217", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6218", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6219", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6220", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6221", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6222", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6223", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6224", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6225", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6226", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6227", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6228", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6229", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6230", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6231", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6232", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6233", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6234", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6235", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6236", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6237", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6238", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6239", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6240", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6241", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6242", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6243", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6244", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6245", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6246", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6247", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6248", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6249", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6250", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6251", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6252", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6253", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6254", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6255", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6256", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6257", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6258", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6259", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6260", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6261", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6262", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6263", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6264", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6265", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6266", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6267", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6268", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6269", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6270", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6271", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6272", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6273", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6274", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6275", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6276", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6277", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6278", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6279", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6280", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6281", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6282", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6283", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6284", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6285", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6286", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6287", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6288", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6289", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6290", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6291", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6292", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6293", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6294", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6295", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6296", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6297", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6298", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6299", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6300", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6301", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6302", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6303", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6304", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6305", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6306", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6307", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6308", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6309", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6310", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6311", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6312", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6313", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6314", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6315", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6316", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6317", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6318", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6319", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6320", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6321", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6322", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6323", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6324", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6325", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6326", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6327", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6328", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6329", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6330", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6331", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6332", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6333", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6334", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6335", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6336", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6337", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6338", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6339", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6340", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6341", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6342", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6343", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6344", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6345", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6346", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6347", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6348", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6349", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6350", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6351", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6352", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6353", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6354", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6355", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6356", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6357", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6358", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6359", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6360", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6361", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6362", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6363", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6364", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6365", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6366", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6367", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6368", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6369", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6370", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6371", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6372", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6373", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6374", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6375", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6376", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6377", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6378", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6379", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6380", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6381", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6382", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6383", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6384", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6385", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6386", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6387", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6388", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6389", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6390", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6391", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6392", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6393", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6394", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6395", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6396", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6397", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6398", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6399", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6400", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6401", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6402", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6403", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6404", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6405", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6406", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6407", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6408", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6409", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6410", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6411", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6412", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6413", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6414", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6415", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6416", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6417", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6418", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6419", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6420", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6421", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6422", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6423", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6424", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6425", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6426", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6427", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6428", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6429", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6430", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6431", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6432", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6433", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6434", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6435", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6436", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6437", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6438", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6439", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6440", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6441", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6442", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6443", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6444", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6445", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6446", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6447", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6448", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6449", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6450", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6451", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6452", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6453", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6454", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6455", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6456", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6457", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6458", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6459", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6460", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6461", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6462", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6463", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6464", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6465", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6466", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6467", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6468", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6469", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6470", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6471", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6472", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6473", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6474", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6475", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6476", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6477", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6478", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6479", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6480", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6481", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6482", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6483", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6484", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6485", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6486", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6487", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6488", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6489", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6490", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6491", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6492", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6493", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6494", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6495", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6496", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6497", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6498", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6499", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6500", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6501", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6502", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6503", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6504", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6505", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6506", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6507", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6508", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6509", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6510", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6511", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6512", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6513", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6514", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6515", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6516", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6517", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6518", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6519", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6520", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6521", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6522", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6523", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6524", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6525", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6526", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6527", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6528", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6529", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6530", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6531", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6532", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6533", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6534", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6535", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6536", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6537", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6538", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6539", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6540", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6541", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6542", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6543", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6544", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6545", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6546", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6547", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6548", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6549", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6550", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6551", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6552", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6553", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6554", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6555", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6556", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6557", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6558", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6559", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6560", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6561", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6562", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6563", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6564", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6565", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6566", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6567", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6568", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6569", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6570", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6571", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6572", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6573", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6574", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6575", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6576", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6577", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6578", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6579", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6580", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6581", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6582", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6583", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6584", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6585", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6586", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6587", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6588", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6589", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6590", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6591", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6592", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6593", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6594", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6595", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6596", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6597", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6598", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6599", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6600", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6601", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6602", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6603", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6604", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6605", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6606", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6607", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6608", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6609", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6610", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6611", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6612", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6613", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6614", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6615", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6616", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6617", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6618", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6619", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6620", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6621", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6622", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6623", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6624", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6625", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6626", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6627", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6628", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6629", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6630", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6631", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6632", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6633", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6634", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6635", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6636", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6637", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6638", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6639", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6640", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6641", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6642", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6643", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6644", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6645", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6646", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6647", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6648", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6649", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6650", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6651", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6652", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6653", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6654", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6655", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6656", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6657", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6658", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6659", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6660", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6661", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6662", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6663", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6664", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6665", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6666", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6667", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6668", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6669", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6670", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6671", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6672", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6673", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6674", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6675", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6676", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6677", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6678", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6679", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6680", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6681", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6682", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6683", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6684", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6685", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6686", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6687", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6688", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6689", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6690", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6691", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6692", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6693", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6694", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6695", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6696", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6697", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6698", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6699", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6700", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6701", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6702", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6703", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6704", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6705", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6706", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6707", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6708", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6709", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6710", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6711", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6712", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6713", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6714", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6715", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6716", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6717", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6718", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6719", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6720", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6721", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6722", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6723", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6724", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6725", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6726", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6727", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6728", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6729", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6730", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6731", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6732", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6733", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6734", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6735", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6736", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6737", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6738", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6739", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6740", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6741", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6742", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6743", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6744", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6745", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6746", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6747", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6748", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6749", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6750", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6751", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6752", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6753", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6754", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6755", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6756", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6757", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6758", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6759", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6760", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6761", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6762", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6763", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6764", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6765", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6766", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6767", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6768", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6769", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6770", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6771", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6772", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6773", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6774", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6775", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6776", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6777", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6778", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6779", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6780", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6781", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6782", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6783", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6784", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6785", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6786", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6787", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6788", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6789", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6790", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6791", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6792", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6793", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6794", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6795", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6796", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6797", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6798", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6799", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6800", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6801", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6802", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6803", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6804", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6805", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6806", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6807", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6808", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6809", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6810", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6811", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6812", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6813", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6814", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6815", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6816", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6817", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6818", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6819", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6820", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6821", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6822", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6823", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6824", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6825", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6826", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6827", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6828", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6829", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6830", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6831", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6832", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6833", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6834", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6835", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6836", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6837", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6838", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6839", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6840", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6841", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6842", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6843", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6844", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6845", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6846", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6847", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6848", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6849", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6850", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6851", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6852", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6853", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6854", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6855", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6856", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6857", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6858", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6859", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6860", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6861", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6862", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6863", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6864", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6865", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6866", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6867", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6868", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6869", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6870", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6871", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6872", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6873", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6874", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6875", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6876", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6877", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6878", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6879", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6880", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6881", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6882", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6883", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6884", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6885", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6886", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6887", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6888", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6889", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6890", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6891", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6892", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6893", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6894", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6895", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6896", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6897", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6898", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6899", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6900", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6901", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6902", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6903", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6904", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6905", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6906", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6907", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6908", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6909", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6910", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6911", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6912", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6913", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6914", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6915", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6916", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6917", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6918", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6919", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6920", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6921", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6922", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6923", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6924", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6925", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6926", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6927", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6928", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6929", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6930", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6931", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6932", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6933", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6934", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6935", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6936", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6937", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6938", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6939", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6940", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6941", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6942", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6943", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6944", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6945", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6946", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6947", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6948", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6949", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6950", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6951", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6952", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6953", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6954", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6955", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6956", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6957", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6958", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6959", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6960", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6961", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6962", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6963", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6964", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6965", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6966", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6967", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6968", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6969", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6970", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6971", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6972", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6973", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6974", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6975", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6976", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6977", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6978", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6979", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6980", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6981", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6982", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6983", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6984", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6985", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6986", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6987", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6988", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6989", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6990", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6991", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6992", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6993", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6994", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6995", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6996", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6997", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6998", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet6999", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7000", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7001", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7002", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7003", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7004", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7005", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7006", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7007", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7008", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7009", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7010", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7011", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7012", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7013", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7014", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7015", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7016", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7017", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7018", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7019", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7020", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7021", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7022", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7023", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7024", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7025", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7026", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7027", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7028", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7029", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7030", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7031", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7032", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7033", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7034", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7035", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7036", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7037", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7038", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7039", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7040", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7041", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7042", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7043", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7044", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7045", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7046", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7047", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7048", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7049", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7050", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7051", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7052", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7053", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7054", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7055", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7056", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7057", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7058", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7059", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7060", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7061", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7062", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7063", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7064", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7065", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7066", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7067", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7068", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7069", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7070", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7071", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7072", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7073", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7074", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7075", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7076", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7077", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7078", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7079", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7080", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7081", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7082", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7083", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7084", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7085", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7086", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7087", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7088", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7089", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7090", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7091", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7092", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7093", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7094", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7095", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7096", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7097", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7098", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7099", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7100", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7101", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7102", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7103", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7104", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7105", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7106", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7107", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7108", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7109", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7110", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7111", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7112", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7113", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7114", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7115", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7116", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7117", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7118", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7119", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7120", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7121", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7122", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7123", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7124", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7125", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7126", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7127", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7128", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7129", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7130", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7131", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7132", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7133", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7134", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7135", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7136", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7137", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7138", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7139", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7140", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7141", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7142", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7143", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7144", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7145", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7146", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7147", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7148", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7149", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7150", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7151", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7152", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7153", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7154", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7155", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7156", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7157", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7158", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7159", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7160", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7161", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7162", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7163", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7164", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7165", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7166", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7167", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7168", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7169", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7170", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7171", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7172", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7173", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7174", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7175", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7176", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7177", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7178", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7179", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7180", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7181", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7182", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7183", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7184", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7185", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7186", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7187", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7188", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7189", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7190", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7191", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7192", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7193", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7194", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7195", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7196", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7197", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7198", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7199", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7200", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7201", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7202", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7203", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7204", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7205", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7206", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7207", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7208", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7209", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7210", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7211", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7212", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7213", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7214", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7215", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7216", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7217", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7218", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7219", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7220", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7221", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7222", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7223", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7224", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7225", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7226", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7227", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7228", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7229", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7230", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7231", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7232", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7233", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7234", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7235", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7236", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7237", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7238", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7239", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7240", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7241", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7242", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7243", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7244", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7245", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7246", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7247", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7248", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7249", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7250", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7251", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7252", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7253", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7254", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7255", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7256", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7257", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7258", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7259", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7260", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7261", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7262", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7263", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7264", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7265", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7266", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7267", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7268", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7269", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7270", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7271", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7272", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7273", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7274", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7275", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7276", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7277", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7278", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7279", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7280", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7281", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7282", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7283", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7284", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7285", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7286", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7287", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7288", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7289", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7290", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7291", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7292", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7293", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7294", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7295", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7296", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7297", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7298", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7299", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7300", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7301", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7302", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7303", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7304", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7305", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7306", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7307", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7308", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7309", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7310", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7311", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7312", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7313", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7314", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7315", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7316", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7317", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7318", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7319", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7320", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7321", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7322", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7323", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7324", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7325", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7326", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7327", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7328", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7329", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7330", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7331", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7332", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7333", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7334", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7335", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7336", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7337", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7338", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7339", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7340", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7341", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7342", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7343", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7344", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7345", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7346", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7347", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7348", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7349", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7350", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7351", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7352", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7353", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7354", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7355", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7356", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7357", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7358", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7359", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7360", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7361", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7362", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7363", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7364", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7365", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7366", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7367", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7368", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7369", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7370", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7371", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7372", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7373", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7374", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7375", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7376", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7377", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7378", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7379", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7380", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7381", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7382", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7383", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7384", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7385", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7386", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7387", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7388", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7389", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7390", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7391", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7392", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7393", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7394", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7395", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7396", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7397", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7398", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7399", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7400", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7401", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7402", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7403", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7404", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7405", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7406", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7407", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7408", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7409", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7410", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7411", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7412", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7413", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7414", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7415", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7416", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7417", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7418", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7419", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7420", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7421", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7422", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7423", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7424", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7425", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7426", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7427", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7428", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7429", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7430", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7431", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7432", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7433", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7434", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7435", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7436", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7437", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7438", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7439", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7440", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7441", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7442", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7443", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7444", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7445", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7446", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7447", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7448", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7449", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7450", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7451", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7452", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7453", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7454", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7455", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7456", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7457", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7458", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7459", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7460", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7461", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7462", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7463", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7464", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7465", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7466", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7467", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7468", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7469", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7470", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7471", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7472", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7473", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7474", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7475", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7476", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7477", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7478", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7479", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7480", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7481", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7482", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7483", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7484", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7485", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7486", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7487", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7488", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7489", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7490", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7491", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7492", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7493", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7494", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7495", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7496", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7497", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7498", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7499", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7500", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7501", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7502", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7503", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7504", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7505", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7506", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7507", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7508", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7509", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7510", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7511", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7512", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7513", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7514", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7515", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7516", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7517", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7518", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7519", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7520", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7521", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7522", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7523", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7524", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7525", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7526", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7527", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7528", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7529", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7530", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7531", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7532", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7533", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7534", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7535", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7536", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7537", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7538", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7539", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7540", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7541", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7542", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7543", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7544", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7545", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7546", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7547", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7548", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7549", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7550", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7551", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7552", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7553", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7554", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7555", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7556", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7557", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7558", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7559", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7560", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7561", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7562", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7563", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7564", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7565", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7566", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7567", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7568", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7569", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7570", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7571", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7572", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7573", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7574", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7575", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7576", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7577", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7578", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7579", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7580", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7581", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7582", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7583", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7584", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7585", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7586", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7587", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7588", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7589", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7590", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7591", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7592", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7593", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7594", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7595", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7596", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7597", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7598", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7599", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7600", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7601", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7602", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7603", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7604", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7605", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7606", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7607", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7608", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7609", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7610", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7611", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7612", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7613", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7614", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7615", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7616", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7617", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7618", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7619", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7620", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7621", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7622", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7623", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7624", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7625", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7626", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7627", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7628", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7629", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7630", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7631", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7632", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7633", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7634", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7635", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7636", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7637", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7638", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7639", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7640", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7641", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7642", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7643", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7644", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7645", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7646", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7647", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7648", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7649", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7650", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7651", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7652", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7653", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7654", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7655", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7656", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7657", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7658", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7659", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7660", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7661", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7662", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7663", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7664", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7665", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7666", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7667", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7668", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7669", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7670", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7671", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7672", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7673", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7674", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7675", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7676", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7677", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7678", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7679", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7680", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7681", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7682", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7683", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7684", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7685", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7686", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7687", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7688", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7689", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7690", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7691", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7692", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7693", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7694", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7695", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7696", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7697", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7698", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7699", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7700", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7701", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7702", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7703", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7704", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7705", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7706", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7707", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7708", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7709", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7710", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7711", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7712", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7713", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7714", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7715", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7716", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7717", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7718", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7719", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7720", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7721", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7722", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7723", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7724", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7725", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7726", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7727", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7728", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7729", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7730", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7731", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7732", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7733", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7734", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7735", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7736", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7737", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7738", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7739", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7740", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7741", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7742", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7743", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7744", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7745", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7746", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7747", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7748", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7749", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7750", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7751", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7752", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7753", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7754", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7755", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7756", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7757", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7758", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7759", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7760", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7761", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7762", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7763", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7764", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7765", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7766", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7767", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7768", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7769", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7770", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7771", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7772", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7773", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7774", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7775", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7776", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7777", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7778", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7779", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7780", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7781", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7782", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7783", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7784", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7785", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7786", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7787", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7788", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7789", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7790", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7791", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7792", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7793", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7794", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7795", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7796", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7797", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7798", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7799", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7800", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7801", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7802", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7803", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7804", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7805", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7806", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7807", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7808", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7809", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7810", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7811", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7812", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7813", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7814", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7815", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7816", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7817", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7818", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7819", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7820", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7821", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7822", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7823", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7824", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7825", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7826", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7827", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7828", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7829", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7830", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7831", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7832", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7833", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7834", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7835", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7836", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7837", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7838", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7839", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7840", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7841", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7842", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7843", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7844", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7845", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7846", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7847", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7848", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7849", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7850", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7851", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7852", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7853", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7854", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7855", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7856", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7857", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7858", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7859", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7860", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7861", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7862", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7863", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7864", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7865", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7866", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7867", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7868", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7869", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7870", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7871", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7872", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7873", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7874", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7875", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7876", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7877", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7878", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7879", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7880", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7881", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7882", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7883", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7884", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7885", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7886", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7887", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7888", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7889", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7890", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7891", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7892", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7893", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7894", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7895", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7896", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7897", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7898", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7899", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7900", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7901", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7902", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7903", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7904", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7905", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7906", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7907", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7908", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7909", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7910", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7911", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7912", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7913", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7914", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7915", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7916", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7917", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7918", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7919", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7920", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7921", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7922", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7923", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7924", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7925", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7926", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7927", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7928", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7929", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7930", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7931", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7932", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7933", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7934", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7935", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7936", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7937", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7938", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7939", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7940", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7941", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7942", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7943", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7944", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7945", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7946", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7947", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7948", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7949", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7950", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7951", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7952", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7953", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7954", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7955", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7956", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7957", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7958", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7959", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7960", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7961", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7962", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7963", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7964", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7965", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7966", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7967", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7968", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7969", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7970", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7971", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7972", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7973", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7974", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7975", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7976", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7977", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7978", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7979", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7980", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7981", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7982", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7983", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7984", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7985", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7986", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7987", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7988", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7989", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7990", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7991", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7992", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7993", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7994", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7995", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7996", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7997", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7998", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet7999", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8000", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8001", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8002", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8003", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8004", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8005", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8006", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8007", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8008", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8009", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8010", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8011", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8012", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8013", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8014", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8015", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8016", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8017", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8018", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8019", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8020", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8021", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8022", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8023", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8024", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8025", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8026", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8027", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8028", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8029", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8030", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8031", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8032", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8033", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8034", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8035", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8036", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8037", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8038", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8039", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8040", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8041", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8042", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8043", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8044", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8045", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8046", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8047", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8048", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8049", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8050", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8051", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8052", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8053", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8054", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8055", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8056", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8057", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8058", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8059", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8060", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8061", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8062", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8063", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8064", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8065", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8066", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8067", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8068", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8069", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8070", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8071", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8072", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8073", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8074", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8075", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8076", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8077", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8078", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8079", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8080", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8081", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8082", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8083", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8084", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8085", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8086", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8087", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8088", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8089", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8090", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8091", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8092", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8093", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8094", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8095", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8096", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8097", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8098", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8099", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8100", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8101", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8102", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8103", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8104", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8105", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8106", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8107", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8108", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8109", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8110", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8111", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8112", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8113", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8114", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8115", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8116", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8117", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8118", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8119", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8120", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8121", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8122", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8123", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8124", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8125", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8126", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8127", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8128", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8129", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8130", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8131", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8132", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8133", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8134", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8135", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8136", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8137", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8138", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8139", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8140", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8141", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8142", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8143", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8144", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8145", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8146", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8147", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8148", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8149", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8150", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8151", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8152", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8153", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8154", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8155", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8156", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8157", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8158", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8159", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8160", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8161", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8162", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8163", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8164", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8165", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8166", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8167", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8168", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8169", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8170", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8171", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8172", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8173", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8174", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8175", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8176", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8177", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8178", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8179", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8180", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8181", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8182", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8183", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8184", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8185", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8186", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8187", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8188", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8189", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8190", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8191", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8192", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8193", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8194", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8195", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8196", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8197", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8198", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8199", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8200", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8201", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8202", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8203", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8204", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8205", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8206", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8207", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8208", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8209", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8210", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8211", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8212", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8213", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8214", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8215", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8216", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8217", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8218", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8219", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8220", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8221", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8222", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8223", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8224", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8225", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8226", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8227", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8228", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8229", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8230", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8231", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8232", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8233", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8234", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8235", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8236", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8237", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8238", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8239", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8240", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8241", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8242", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8243", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8244", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8245", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8246", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8247", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8248", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8249", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8250", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8251", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8252", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8253", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8254", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8255", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8256", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8257", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8258", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8259", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8260", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8261", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8262", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8263", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8264", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8265", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8266", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8267", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8268", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8269", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8270", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8271", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8272", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8273", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8274", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8275", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8276", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8277", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8278", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8279", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8280", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8281", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8282", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8283", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8284", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8285", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8286", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8287", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8288", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8289", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8290", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8291", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8292", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8293", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8294", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8295", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8296", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8297", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8298", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8299", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8300", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8301", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8302", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8303", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8304", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8305", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8306", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8307", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8308", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8309", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8310", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8311", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8312", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8313", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8314", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8315", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8316", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8317", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8318", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8319", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8320", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8321", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8322", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8323", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8324", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8325", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8326", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8327", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8328", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8329", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8330", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8331", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8332", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8333", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8334", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8335", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8336", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8337", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8338", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8339", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8340", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8341", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8342", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8343", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8344", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8345", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8346", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8347", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8348", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8349", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8350", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8351", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8352", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8353", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8354", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8355", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8356", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8357", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8358", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8359", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8360", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8361", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8362", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8363", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8364", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8365", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8366", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8367", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8368", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8369", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8370", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8371", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8372", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8373", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8374", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8375", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8376", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8377", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8378", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8379", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8380", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8381", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8382", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8383", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8384", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8385", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8386", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8387", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8388", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8389", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8390", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8391", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8392", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8393", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8394", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8395", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8396", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8397", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8398", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8399", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8400", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8401", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8402", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8403", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8404", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8405", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8406", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8407", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8408", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8409", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8410", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8411", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8412", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8413", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8414", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8415", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8416", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8417", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8418", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8419", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8420", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8421", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8422", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8423", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8424", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8425", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8426", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8427", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8428", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8429", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8430", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8431", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8432", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8433", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8434", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8435", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8436", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8437", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8438", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8439", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8440", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8441", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8442", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8443", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8444", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8445", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8446", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8447", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8448", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8449", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8450", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8451", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8452", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8453", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8454", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8455", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8456", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8457", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8458", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8459", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8460", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8461", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8462", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8463", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8464", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8465", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8466", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8467", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8468", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8469", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8470", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8471", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8472", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8473", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8474", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8475", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8476", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8477", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8478", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8479", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8480", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8481", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8482", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8483", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8484", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8485", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8486", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8487", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8488", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8489", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8490", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8491", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8492", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8493", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8494", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8495", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8496", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8497", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8498", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8499", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8500", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8501", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8502", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8503", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8504", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8505", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8506", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8507", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8508", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8509", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8510", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8511", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8512", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8513", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8514", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8515", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8516", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8517", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8518", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8519", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8520", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8521", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8522", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8523", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8524", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8525", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8526", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8527", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8528", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8529", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8530", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8531", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8532", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8533", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8534", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8535", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8536", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8537", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8538", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8539", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8540", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8541", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8542", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8543", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8544", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8545", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8546", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8547", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8548", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8549", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8550", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8551", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8552", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8553", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8554", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8555", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8556", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8557", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8558", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8559", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8560", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8561", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8562", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8563", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8564", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8565", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8566", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8567", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8568", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8569", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8570", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8571", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8572", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8573", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8574", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8575", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8576", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8577", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8578", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8579", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8580", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8581", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8582", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8583", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8584", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8585", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8586", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8587", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8588", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8589", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8590", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8591", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8592", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8593", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8594", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8595", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8596", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8597", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8598", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8599", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8600", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8601", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8602", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8603", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8604", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8605", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8606", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8607", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8608", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8609", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8610", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8611", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8612", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8613", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8614", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8615", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8616", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8617", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8618", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8619", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8620", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8621", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8622", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8623", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8624", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8625", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8626", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8627", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8628", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8629", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8630", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8631", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8632", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8633", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8634", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8635", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8636", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8637", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8638", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8639", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8640", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8641", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8642", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8643", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8644", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8645", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8646", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8647", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8648", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8649", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8650", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8651", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8652", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8653", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8654", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8655", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8656", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8657", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8658", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8659", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8660", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8661", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8662", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8663", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8664", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8665", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8666", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8667", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8668", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8669", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8670", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8671", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8672", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8673", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8674", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8675", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8676", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8677", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8678", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8679", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8680", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8681", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8682", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8683", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8684", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8685", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8686", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8687", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8688", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8689", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8690", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8691", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8692", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8693", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8694", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8695", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8696", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8697", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8698", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8699", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8700", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8701", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8702", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8703", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8704", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8705", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8706", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8707", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8708", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8709", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8710", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8711", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8712", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8713", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8714", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8715", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8716", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8717", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8718", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8719", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8720", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8721", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8722", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8723", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8724", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8725", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8726", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8727", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8728", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8729", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8730", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8731", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8732", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8733", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8734", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8735", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8736", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8737", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8738", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8739", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8740", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8741", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8742", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8743", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8744", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8745", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8746", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8747", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8748", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8749", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8750", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8751", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8752", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8753", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8754", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8755", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8756", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8757", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8758", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8759", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8760", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8761", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8762", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8763", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8764", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8765", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8766", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8767", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8768", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8769", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8770", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8771", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8772", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8773", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8774", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8775", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8776", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8777", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8778", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8779", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8780", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8781", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8782", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8783", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8784", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8785", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8786", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8787", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8788", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8789", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8790", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8791", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8792", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8793", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8794", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8795", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8796", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8797", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8798", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8799", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8800", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8801", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8802", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8803", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8804", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8805", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8806", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8807", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8808", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8809", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8810", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8811", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8812", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8813", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8814", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8815", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8816", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8817", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8818", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8819", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8820", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8821", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8822", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8823", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8824", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8825", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8826", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8827", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8828", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8829", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8830", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8831", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8832", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8833", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8834", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8835", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8836", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8837", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8838", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8839", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8840", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8841", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8842", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8843", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8844", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8845", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8846", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8847", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8848", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8849", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8850", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8851", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8852", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8853", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8854", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8855", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8856", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8857", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8858", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8859", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8860", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8861", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8862", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8863", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8864", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8865", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8866", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8867", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8868", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8869", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8870", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8871", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8872", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8873", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8874", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8875", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8876", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8877", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8878", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8879", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8880", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8881", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8882", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8883", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8884", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8885", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8886", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8887", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8888", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8889", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8890", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8891", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8892", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8893", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8894", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8895", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8896", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8897", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8898", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8899", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8900", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8901", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8902", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8903", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8904", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8905", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8906", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8907", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8908", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8909", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8910", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8911", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8912", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8913", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8914", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8915", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8916", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8917", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8918", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8919", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8920", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8921", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8922", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8923", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8924", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8925", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8926", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8927", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8928", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8929", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8930", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8931", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8932", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8933", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8934", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8935", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8936", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8937", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8938", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8939", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8940", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8941", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8942", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8943", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8944", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8945", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8946", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8947", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8948", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8949", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8950", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8951", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8952", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8953", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8954", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8955", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8956", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8957", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8958", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8959", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8960", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8961", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8962", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8963", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8964", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8965", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8966", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8967", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8968", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8969", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8970", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8971", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8972", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8973", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8974", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8975", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8976", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8977", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8978", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8979", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8980", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8981", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8982", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8983", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8984", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8985", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8986", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8987", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8988", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8989", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8990", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8991", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8992", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8993", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8994", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8995", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8996", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8997", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8998", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet8999", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9000", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9001", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9002", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9003", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9004", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9005", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9006", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9007", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9008", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9009", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9010", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9011", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9012", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9013", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9014", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9015", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9016", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9017", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9018", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9019", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9020", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9021", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9022", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9023", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9024", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9025", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9026", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9027", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9028", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9029", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9030", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9031", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9032", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9033", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9034", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9035", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9036", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9037", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9038", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9039", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9040", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9041", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9042", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9043", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9044", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9045", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9046", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9047", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9048", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9049", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9050", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9051", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9052", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9053", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9054", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9055", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9056", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9057", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9058", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9059", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9060", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9061", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9062", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9063", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9064", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9065", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9066", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9067", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9068", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9069", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9070", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9071", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9072", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9073", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9074", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9075", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9076", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9077", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9078", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9079", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9080", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9081", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9082", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9083", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9084", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9085", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9086", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9087", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9088", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9089", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9090", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9091", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9092", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9093", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9094", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9095", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9096", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9097", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9098", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9099", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9100", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9101", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9102", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9103", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9104", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9105", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9106", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9107", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9108", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9109", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9110", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9111", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9112", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9113", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9114", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9115", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9116", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9117", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9118", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9119", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9120", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9121", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9122", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9123", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9124", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9125", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9126", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9127", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9128", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9129", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9130", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9131", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9132", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9133", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9134", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9135", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9136", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9137", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9138", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9139", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9140", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9141", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9142", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9143", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9144", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9145", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9146", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9147", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9148", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9149", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9150", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9151", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9152", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9153", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9154", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9155", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9156", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9157", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9158", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9159", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9160", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9161", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9162", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9163", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9164", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9165", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9166", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9167", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9168", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9169", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9170", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9171", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9172", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9173", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9174", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9175", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9176", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9177", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9178", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9179", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9180", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9181", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9182", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9183", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9184", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9185", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9186", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9187", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9188", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9189", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9190", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9191", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9192", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9193", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9194", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9195", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9196", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9197", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9198", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9199", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9200", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9201", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9202", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9203", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9204", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9205", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9206", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9207", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9208", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9209", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9210", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9211", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9212", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9213", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9214", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9215", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9216", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9217", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9218", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9219", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9220", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9221", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9222", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9223", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9224", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9225", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9226", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9227", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9228", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9229", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9230", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9231", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9232", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9233", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9234", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9235", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9236", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9237", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9238", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9239", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9240", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9241", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9242", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9243", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9244", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9245", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9246", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9247", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9248", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9249", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9250", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9251", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9252", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9253", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9254", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9255", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9256", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9257", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9258", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9259", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9260", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9261", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9262", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9263", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9264", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9265", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9266", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9267", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9268", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9269", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9270", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9271", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9272", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9273", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9274", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9275", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9276", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9277", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9278", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9279", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9280", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9281", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9282", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9283", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9284", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9285", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9286", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9287", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9288", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9289", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9290", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9291", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9292", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9293", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9294", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9295", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9296", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9297", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9298", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9299", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9300", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9301", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9302", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9303", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9304", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9305", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9306", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9307", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9308", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9309", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9310", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9311", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9312", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9313", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9314", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9315", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9316", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9317", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9318", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9319", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9320", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9321", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9322", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9323", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9324", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9325", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9326", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9327", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9328", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9329", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9330", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9331", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9332", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9333", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9334", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9335", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9336", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9337", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9338", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9339", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9340", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9341", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9342", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9343", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9344", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9345", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9346", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9347", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9348", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9349", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9350", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9351", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9352", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9353", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9354", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9355", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9356", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9357", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9358", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9359", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9360", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9361", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9362", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9363", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9364", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9365", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9366", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9367", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9368", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9369", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9370", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9371", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9372", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9373", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9374", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9375", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9376", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9377", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9378", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9379", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9380", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9381", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9382", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9383", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9384", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9385", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9386", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9387", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9388", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9389", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9390", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9391", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9392", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9393", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9394", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9395", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9396", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9397", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9398", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9399", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9400", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9401", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9402", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9403", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9404", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9405", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9406", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9407", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9408", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9409", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9410", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9411", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9412", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9413", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9414", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9415", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9416", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9417", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9418", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9419", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9420", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9421", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9422", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9423", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9424", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9425", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9426", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9427", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9428", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9429", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9430", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9431", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9432", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9433", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9434", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9435", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9436", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9437", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9438", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9439", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9440", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9441", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9442", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9443", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9444", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9445", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9446", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9447", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9448", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9449", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9450", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9451", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9452", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9453", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9454", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9455", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9456", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9457", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9458", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9459", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9460", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9461", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9462", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9463", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9464", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9465", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9466", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9467", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9468", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9469", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9470", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9471", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9472", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9473", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9474", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9475", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9476", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9477", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9478", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9479", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9480", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9481", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9482", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9483", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9484", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9485", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9486", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9487", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9488", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9489", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9490", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9491", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9492", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9493", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9494", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9495", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9496", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9497", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9498", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9499", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9500", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9501", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9502", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9503", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9504", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9505", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9506", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9507", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9508", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9509", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9510", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9511", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9512", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9513", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9514", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9515", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9516", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9517", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9518", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9519", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9520", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9521", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9522", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9523", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9524", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9525", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9526", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9527", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9528", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9529", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9530", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9531", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9532", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9533", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9534", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9535", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9536", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9537", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9538", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9539", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9540", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9541", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9542", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9543", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9544", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9545", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9546", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9547", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9548", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9549", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9550", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9551", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9552", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9553", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9554", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9555", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9556", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9557", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9558", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9559", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9560", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9561", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9562", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9563", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9564", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9565", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9566", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9567", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9568", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9569", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9570", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9571", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9572", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9573", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9574", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9575", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9576", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9577", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9578", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9579", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9580", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9581", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9582", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9583", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9584", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9585", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9586", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9587", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9588", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9589", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9590", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9591", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9592", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9593", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9594", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9595", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9596", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9597", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9598", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9599", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9600", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9601", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9602", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9603", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9604", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9605", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9606", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9607", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9608", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9609", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9610", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9611", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9612", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9613", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9614", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9615", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9616", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9617", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9618", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9619", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9620", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9621", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9622", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9623", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9624", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9625", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9626", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9627", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9628", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9629", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9630", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9631", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9632", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9633", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9634", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9635", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9636", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9637", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9638", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9639", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9640", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9641", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9642", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9643", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9644", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9645", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9646", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9647", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9648", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9649", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9650", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9651", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9652", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9653", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9654", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9655", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9656", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9657", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9658", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9659", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9660", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9661", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9662", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9663", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9664", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9665", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9666", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9667", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9668", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9669", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9670", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9671", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9672", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9673", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9674", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9675", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9676", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9677", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9678", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9679", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9680", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9681", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9682", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9683", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9684", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9685", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9686", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9687", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9688", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9689", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9690", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9691", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9692", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9693", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9694", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9695", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9696", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9697", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9698", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9699", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9700", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9701", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9702", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9703", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9704", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9705", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9706", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9707", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9708", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9709", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9710", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9711", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9712", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9713", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9714", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9715", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9716", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9717", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9718", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9719", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9720", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9721", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9722", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9723", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9724", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9725", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9726", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9727", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9728", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9729", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9730", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9731", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9732", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9733", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9734", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9735", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9736", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9737", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9738", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9739", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9740", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9741", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9742", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9743", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9744", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9745", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9746", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9747", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9748", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9749", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9750", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9751", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9752", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9753", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9754", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9755", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9756", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9757", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9758", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9759", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9760", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9761", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9762", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9763", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9764", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9765", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9766", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9767", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9768", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9769", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9770", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9771", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9772", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9773", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9774", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9775", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9776", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9777", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9778", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9779", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9780", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9781", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9782", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9783", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9784", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9785", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9786", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9787", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9788", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9789", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9790", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9791", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9792", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9793", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9794", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9795", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9796", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9797", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9798", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9799", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9800", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9801", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9802", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9803", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9804", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9805", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9806", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9807", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9808", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9809", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9810", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9811", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9812", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9813", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9814", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9815", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9816", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9817", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9818", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9819", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9820", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9821", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9822", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9823", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9824", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9825", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9826", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9827", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9828", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9829", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9830", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9831", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9832", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9833", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9834", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9835", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9836", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9837", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9838", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9839", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9840", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9841", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9842", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9843", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9844", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9845", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9846", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9847", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9848", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9849", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9850", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9851", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9852", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9853", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9854", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9855", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9856", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9857", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9858", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9859", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9860", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9861", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9862", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9863", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9864", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9865", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9866", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9867", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9868", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9869", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9870", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9871", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9872", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9873", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9874", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9875", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9876", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9877", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9878", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9879", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9880", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9881", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9882", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9883", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9884", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9885", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9886", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9887", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9888", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9889", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9890", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9891", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9892", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9893", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9894", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9895", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9896", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9897", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9898", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9899", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9900", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9901", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9902", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9903", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9904", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9905", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9906", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9907", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9908", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9909", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9910", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9911", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9912", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9913", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9914", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9915", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9916", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9917", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9918", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9919", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9920", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9921", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9922", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9923", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9924", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9925", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9926", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9927", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9928", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9929", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9930", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9931", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9932", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9933", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9934", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9935", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9936", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9937", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9938", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9939", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9940", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9941", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9942", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9943", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9944", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9945", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9946", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9947", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9948", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9949", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9950", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9951", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9952", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9953", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9954", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9955", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9956", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9957", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9958", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9959", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9960", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9961", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9962", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9963", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9964", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9965", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9966", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9967", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9968", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9969", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9970", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9971", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9972", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9973", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9974", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9975", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9976", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9977", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9978", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9979", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9980", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9981", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9982", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9983", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9984", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9985", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9986", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9987", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9988", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9989", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9990", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9991", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9992", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9993", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9994", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9995", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9996", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9997", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9998", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet9999", + "Stake": 0.01, + "Online": true + }, + { + "Name": "Wallet10000", + "Stake": 0.01, + "Online": true + } + ], + "FeeSink": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", + "RewardsPool": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", + "Comment": "" + }, + "Nodes": [ + { + "Name": "relay1", + "IsRelay": true, + "Wallets": null + }, + { + "Name": "node1", + "Wallets": [ + { + "Name": "Wallet1", + "ParticipationOnly": false + }, + { + "Name": "Wallet2", + "ParticipationOnly": false + }, + { + "Name": "Wallet3", + "ParticipationOnly": false + }, + { + "Name": "Wallet4", + "ParticipationOnly": false + }, + { + "Name": "Wallet5", + "ParticipationOnly": false + }, + { + "Name": "Wallet6", + "ParticipationOnly": false + }, + { + "Name": "Wallet7", + "ParticipationOnly": false + }, + { + "Name": "Wallet8", + "ParticipationOnly": false + }, + { + "Name": "Wallet9", + "ParticipationOnly": false + }, + { + "Name": "Wallet10", + "ParticipationOnly": false + }, + { + "Name": "Wallet11", + "ParticipationOnly": false + }, + { + "Name": "Wallet12", + "ParticipationOnly": false + }, + { + "Name": "Wallet13", + "ParticipationOnly": false + }, + { + "Name": "Wallet14", + "ParticipationOnly": false + }, + { + "Name": "Wallet15", + "ParticipationOnly": false + }, + { + "Name": "Wallet16", + "ParticipationOnly": false + }, + { + "Name": "Wallet17", + "ParticipationOnly": false + }, + { + "Name": "Wallet18", + "ParticipationOnly": false + }, + { + "Name": "Wallet19", + "ParticipationOnly": false + }, + { + "Name": "Wallet20", + "ParticipationOnly": false + }, + { + "Name": "Wallet21", + "ParticipationOnly": false + }, + { + "Name": "Wallet22", + "ParticipationOnly": false + }, + { + "Name": "Wallet23", + "ParticipationOnly": false + }, + { + "Name": "Wallet24", + "ParticipationOnly": false + }, + { + "Name": "Wallet25", + "ParticipationOnly": false + }, + { + "Name": "Wallet26", + "ParticipationOnly": false + }, + { + "Name": "Wallet27", + "ParticipationOnly": false + }, + { + "Name": "Wallet28", + "ParticipationOnly": false + }, + { + "Name": "Wallet29", + "ParticipationOnly": false + }, + { + "Name": "Wallet30", + "ParticipationOnly": false + }, + { + "Name": "Wallet31", + "ParticipationOnly": false + }, + { + "Name": "Wallet32", + "ParticipationOnly": false + }, + { + "Name": "Wallet33", + "ParticipationOnly": false + }, + { + "Name": "Wallet34", + "ParticipationOnly": false + }, + { + "Name": "Wallet35", + "ParticipationOnly": false + }, + { + "Name": "Wallet36", + "ParticipationOnly": false + }, + { + "Name": "Wallet37", + "ParticipationOnly": false + }, + { + "Name": "Wallet38", + "ParticipationOnly": false + }, + { + "Name": "Wallet39", + "ParticipationOnly": false + }, + { + "Name": "Wallet40", + "ParticipationOnly": false + }, + { + "Name": "Wallet41", + "ParticipationOnly": false + }, + { + "Name": "Wallet42", + "ParticipationOnly": false + }, + { + "Name": "Wallet43", + "ParticipationOnly": false + }, + { + "Name": "Wallet44", + "ParticipationOnly": false + }, + { + "Name": "Wallet45", + "ParticipationOnly": false + }, + { + "Name": "Wallet46", + "ParticipationOnly": false + }, + { + "Name": "Wallet47", + "ParticipationOnly": false + }, + { + "Name": "Wallet48", + "ParticipationOnly": false + }, + { + "Name": "Wallet49", + "ParticipationOnly": false + }, + { + "Name": "Wallet50", + "ParticipationOnly": false + }, + { + "Name": "Wallet51", + "ParticipationOnly": false + }, + { + "Name": "Wallet52", + "ParticipationOnly": false + }, + { + "Name": "Wallet53", + "ParticipationOnly": false + }, + { + "Name": "Wallet54", + "ParticipationOnly": false + }, + { + "Name": "Wallet55", + "ParticipationOnly": false + }, + { + "Name": "Wallet56", + "ParticipationOnly": false + }, + { + "Name": "Wallet57", + "ParticipationOnly": false + }, + { + "Name": "Wallet58", + "ParticipationOnly": false + }, + { + "Name": "Wallet59", + "ParticipationOnly": false + }, + { + "Name": "Wallet60", + "ParticipationOnly": false + }, + { + "Name": "Wallet61", + "ParticipationOnly": false + }, + { + "Name": "Wallet62", + "ParticipationOnly": false + }, + { + "Name": "Wallet63", + "ParticipationOnly": false + }, + { + "Name": "Wallet64", + "ParticipationOnly": false + }, + { + "Name": "Wallet65", + "ParticipationOnly": false + }, + { + "Name": "Wallet66", + "ParticipationOnly": false + }, + { + "Name": "Wallet67", + "ParticipationOnly": false + }, + { + "Name": "Wallet68", + "ParticipationOnly": false + }, + { + "Name": "Wallet69", + "ParticipationOnly": false + }, + { + "Name": "Wallet70", + "ParticipationOnly": false + }, + { + "Name": "Wallet71", + "ParticipationOnly": false + }, + { + "Name": "Wallet72", + "ParticipationOnly": false + }, + { + "Name": "Wallet73", + "ParticipationOnly": false + }, + { + "Name": "Wallet74", + "ParticipationOnly": false + }, + { + "Name": "Wallet75", + "ParticipationOnly": false + }, + { + "Name": "Wallet76", + "ParticipationOnly": false + }, + { + "Name": "Wallet77", + "ParticipationOnly": false + }, + { + "Name": "Wallet78", + "ParticipationOnly": false + }, + { + "Name": "Wallet79", + "ParticipationOnly": false + }, + { + "Name": "Wallet80", + "ParticipationOnly": false + }, + { + "Name": "Wallet81", + "ParticipationOnly": false + }, + { + "Name": "Wallet82", + "ParticipationOnly": false + }, + { + "Name": "Wallet83", + "ParticipationOnly": false + }, + { + "Name": "Wallet84", + "ParticipationOnly": false + }, + { + "Name": "Wallet85", + "ParticipationOnly": false + }, + { + "Name": "Wallet86", + "ParticipationOnly": false + }, + { + "Name": "Wallet87", + "ParticipationOnly": false + }, + { + "Name": "Wallet88", + "ParticipationOnly": false + }, + { + "Name": "Wallet89", + "ParticipationOnly": false + }, + { + "Name": "Wallet90", + "ParticipationOnly": false + }, + { + "Name": "Wallet91", + "ParticipationOnly": false + }, + { + "Name": "Wallet92", + "ParticipationOnly": false + }, + { + "Name": "Wallet93", + "ParticipationOnly": false + }, + { + "Name": "Wallet94", + "ParticipationOnly": false + }, + { + "Name": "Wallet95", + "ParticipationOnly": false + }, + { + "Name": "Wallet96", + "ParticipationOnly": false + }, + { + "Name": "Wallet97", + "ParticipationOnly": false + }, + { + "Name": "Wallet98", + "ParticipationOnly": false + }, + { + "Name": "Wallet99", + "ParticipationOnly": false + }, + { + "Name": "Wallet100", + "ParticipationOnly": false + }, + { + "Name": "Wallet101", + "ParticipationOnly": false + }, + { + "Name": "Wallet102", + "ParticipationOnly": false + }, + { + "Name": "Wallet103", + "ParticipationOnly": false + }, + { + "Name": "Wallet104", + "ParticipationOnly": false + }, + { + "Name": "Wallet105", + "ParticipationOnly": false + }, + { + "Name": "Wallet106", + "ParticipationOnly": false + }, + { + "Name": "Wallet107", + "ParticipationOnly": false + }, + { + "Name": "Wallet108", + "ParticipationOnly": false + }, + { + "Name": "Wallet109", + "ParticipationOnly": false + }, + { + "Name": "Wallet110", + "ParticipationOnly": false + }, + { + "Name": "Wallet111", + "ParticipationOnly": false + }, + { + "Name": "Wallet112", + "ParticipationOnly": false + }, + { + "Name": "Wallet113", + "ParticipationOnly": false + }, + { + "Name": "Wallet114", + "ParticipationOnly": false + }, + { + "Name": "Wallet115", + "ParticipationOnly": false + }, + { + "Name": "Wallet116", + "ParticipationOnly": false + }, + { + "Name": "Wallet117", + "ParticipationOnly": false + }, + { + "Name": "Wallet118", + "ParticipationOnly": false + }, + { + "Name": "Wallet119", + "ParticipationOnly": false + }, + { + "Name": "Wallet120", + "ParticipationOnly": false + }, + { + "Name": "Wallet121", + "ParticipationOnly": false + }, + { + "Name": "Wallet122", + "ParticipationOnly": false + }, + { + "Name": "Wallet123", + "ParticipationOnly": false + }, + { + "Name": "Wallet124", + "ParticipationOnly": false + }, + { + "Name": "Wallet125", + "ParticipationOnly": false + }, + { + "Name": "Wallet126", + "ParticipationOnly": false + }, + { + "Name": "Wallet127", + "ParticipationOnly": false + }, + { + "Name": "Wallet128", + "ParticipationOnly": false + }, + { + "Name": "Wallet129", + "ParticipationOnly": false + }, + { + "Name": "Wallet130", + "ParticipationOnly": false + }, + { + "Name": "Wallet131", + "ParticipationOnly": false + }, + { + "Name": "Wallet132", + "ParticipationOnly": false + }, + { + "Name": "Wallet133", + "ParticipationOnly": false + }, + { + "Name": "Wallet134", + "ParticipationOnly": false + }, + { + "Name": "Wallet135", + "ParticipationOnly": false + }, + { + "Name": "Wallet136", + "ParticipationOnly": false + }, + { + "Name": "Wallet137", + "ParticipationOnly": false + }, + { + "Name": "Wallet138", + "ParticipationOnly": false + }, + { + "Name": "Wallet139", + "ParticipationOnly": false + }, + { + "Name": "Wallet140", + "ParticipationOnly": false + }, + { + "Name": "Wallet141", + "ParticipationOnly": false + }, + { + "Name": "Wallet142", + "ParticipationOnly": false + }, + { + "Name": "Wallet143", + "ParticipationOnly": false + }, + { + "Name": "Wallet144", + "ParticipationOnly": false + }, + { + "Name": "Wallet145", + "ParticipationOnly": false + }, + { + "Name": "Wallet146", + "ParticipationOnly": false + }, + { + "Name": "Wallet147", + "ParticipationOnly": false + }, + { + "Name": "Wallet148", + "ParticipationOnly": false + }, + { + "Name": "Wallet149", + "ParticipationOnly": false + }, + { + "Name": "Wallet150", + "ParticipationOnly": false + }, + { + "Name": "Wallet151", + "ParticipationOnly": false + }, + { + "Name": "Wallet152", + "ParticipationOnly": false + }, + { + "Name": "Wallet153", + "ParticipationOnly": false + }, + { + "Name": "Wallet154", + "ParticipationOnly": false + }, + { + "Name": "Wallet155", + "ParticipationOnly": false + }, + { + "Name": "Wallet156", + "ParticipationOnly": false + }, + { + "Name": "Wallet157", + "ParticipationOnly": false + }, + { + "Name": "Wallet158", + "ParticipationOnly": false + }, + { + "Name": "Wallet159", + "ParticipationOnly": false + }, + { + "Name": "Wallet160", + "ParticipationOnly": false + }, + { + "Name": "Wallet161", + "ParticipationOnly": false + }, + { + "Name": "Wallet162", + "ParticipationOnly": false + }, + { + "Name": "Wallet163", + "ParticipationOnly": false + }, + { + "Name": "Wallet164", + "ParticipationOnly": false + }, + { + "Name": "Wallet165", + "ParticipationOnly": false + }, + { + "Name": "Wallet166", + "ParticipationOnly": false + }, + { + "Name": "Wallet167", + "ParticipationOnly": false + }, + { + "Name": "Wallet168", + "ParticipationOnly": false + }, + { + "Name": "Wallet169", + "ParticipationOnly": false + }, + { + "Name": "Wallet170", + "ParticipationOnly": false + }, + { + "Name": "Wallet171", + "ParticipationOnly": false + }, + { + "Name": "Wallet172", + "ParticipationOnly": false + }, + { + "Name": "Wallet173", + "ParticipationOnly": false + }, + { + "Name": "Wallet174", + "ParticipationOnly": false + }, + { + "Name": "Wallet175", + "ParticipationOnly": false + }, + { + "Name": "Wallet176", + "ParticipationOnly": false + }, + { + "Name": "Wallet177", + "ParticipationOnly": false + }, + { + "Name": "Wallet178", + "ParticipationOnly": false + }, + { + "Name": "Wallet179", + "ParticipationOnly": false + }, + { + "Name": "Wallet180", + "ParticipationOnly": false + }, + { + "Name": "Wallet181", + "ParticipationOnly": false + }, + { + "Name": "Wallet182", + "ParticipationOnly": false + }, + { + "Name": "Wallet183", + "ParticipationOnly": false + }, + { + "Name": "Wallet184", + "ParticipationOnly": false + }, + { + "Name": "Wallet185", + "ParticipationOnly": false + }, + { + "Name": "Wallet186", + "ParticipationOnly": false + }, + { + "Name": "Wallet187", + "ParticipationOnly": false + }, + { + "Name": "Wallet188", + "ParticipationOnly": false + }, + { + "Name": "Wallet189", + "ParticipationOnly": false + }, + { + "Name": "Wallet190", + "ParticipationOnly": false + }, + { + "Name": "Wallet191", + "ParticipationOnly": false + }, + { + "Name": "Wallet192", + "ParticipationOnly": false + }, + { + "Name": "Wallet193", + "ParticipationOnly": false + }, + { + "Name": "Wallet194", + "ParticipationOnly": false + }, + { + "Name": "Wallet195", + "ParticipationOnly": false + }, + { + "Name": "Wallet196", + "ParticipationOnly": false + }, + { + "Name": "Wallet197", + "ParticipationOnly": false + }, + { + "Name": "Wallet198", + "ParticipationOnly": false + }, + { + "Name": "Wallet199", + "ParticipationOnly": false + }, + { + "Name": "Wallet200", + "ParticipationOnly": false + }, + { + "Name": "Wallet201", + "ParticipationOnly": false + }, + { + "Name": "Wallet202", + "ParticipationOnly": false + }, + { + "Name": "Wallet203", + "ParticipationOnly": false + }, + { + "Name": "Wallet204", + "ParticipationOnly": false + }, + { + "Name": "Wallet205", + "ParticipationOnly": false + }, + { + "Name": "Wallet206", + "ParticipationOnly": false + }, + { + "Name": "Wallet207", + "ParticipationOnly": false + }, + { + "Name": "Wallet208", + "ParticipationOnly": false + }, + { + "Name": "Wallet209", + "ParticipationOnly": false + }, + { + "Name": "Wallet210", + "ParticipationOnly": false + }, + { + "Name": "Wallet211", + "ParticipationOnly": false + }, + { + "Name": "Wallet212", + "ParticipationOnly": false + }, + { + "Name": "Wallet213", + "ParticipationOnly": false + }, + { + "Name": "Wallet214", + "ParticipationOnly": false + }, + { + "Name": "Wallet215", + "ParticipationOnly": false + }, + { + "Name": "Wallet216", + "ParticipationOnly": false + }, + { + "Name": "Wallet217", + "ParticipationOnly": false + }, + { + "Name": "Wallet218", + "ParticipationOnly": false + }, + { + "Name": "Wallet219", + "ParticipationOnly": false + }, + { + "Name": "Wallet220", + "ParticipationOnly": false + }, + { + "Name": "Wallet221", + "ParticipationOnly": false + }, + { + "Name": "Wallet222", + "ParticipationOnly": false + }, + { + "Name": "Wallet223", + "ParticipationOnly": false + }, + { + "Name": "Wallet224", + "ParticipationOnly": false + }, + { + "Name": "Wallet225", + "ParticipationOnly": false + }, + { + "Name": "Wallet226", + "ParticipationOnly": false + }, + { + "Name": "Wallet227", + "ParticipationOnly": false + }, + { + "Name": "Wallet228", + "ParticipationOnly": false + }, + { + "Name": "Wallet229", + "ParticipationOnly": false + }, + { + "Name": "Wallet230", + "ParticipationOnly": false + }, + { + "Name": "Wallet231", + "ParticipationOnly": false + }, + { + "Name": "Wallet232", + "ParticipationOnly": false + }, + { + "Name": "Wallet233", + "ParticipationOnly": false + }, + { + "Name": "Wallet234", + "ParticipationOnly": false + }, + { + "Name": "Wallet235", + "ParticipationOnly": false + }, + { + "Name": "Wallet236", + "ParticipationOnly": false + }, + { + "Name": "Wallet237", + "ParticipationOnly": false + }, + { + "Name": "Wallet238", + "ParticipationOnly": false + }, + { + "Name": "Wallet239", + "ParticipationOnly": false + }, + { + "Name": "Wallet240", + "ParticipationOnly": false + }, + { + "Name": "Wallet241", + "ParticipationOnly": false + }, + { + "Name": "Wallet242", + "ParticipationOnly": false + }, + { + "Name": "Wallet243", + "ParticipationOnly": false + }, + { + "Name": "Wallet244", + "ParticipationOnly": false + }, + { + "Name": "Wallet245", + "ParticipationOnly": false + }, + { + "Name": "Wallet246", + "ParticipationOnly": false + }, + { + "Name": "Wallet247", + "ParticipationOnly": false + }, + { + "Name": "Wallet248", + "ParticipationOnly": false + }, + { + "Name": "Wallet249", + "ParticipationOnly": false + }, + { + "Name": "Wallet250", + "ParticipationOnly": false + }, + { + "Name": "Wallet251", + "ParticipationOnly": false + }, + { + "Name": "Wallet252", + "ParticipationOnly": false + }, + { + "Name": "Wallet253", + "ParticipationOnly": false + }, + { + "Name": "Wallet254", + "ParticipationOnly": false + }, + { + "Name": "Wallet255", + "ParticipationOnly": false + }, + { + "Name": "Wallet256", + "ParticipationOnly": false + }, + { + "Name": "Wallet257", + "ParticipationOnly": false + }, + { + "Name": "Wallet258", + "ParticipationOnly": false + }, + { + "Name": "Wallet259", + "ParticipationOnly": false + }, + { + "Name": "Wallet260", + "ParticipationOnly": false + }, + { + "Name": "Wallet261", + "ParticipationOnly": false + }, + { + "Name": "Wallet262", + "ParticipationOnly": false + }, + { + "Name": "Wallet263", + "ParticipationOnly": false + }, + { + "Name": "Wallet264", + "ParticipationOnly": false + }, + { + "Name": "Wallet265", + "ParticipationOnly": false + }, + { + "Name": "Wallet266", + "ParticipationOnly": false + }, + { + "Name": "Wallet267", + "ParticipationOnly": false + }, + { + "Name": "Wallet268", + "ParticipationOnly": false + }, + { + "Name": "Wallet269", + "ParticipationOnly": false + }, + { + "Name": "Wallet270", + "ParticipationOnly": false + }, + { + "Name": "Wallet271", + "ParticipationOnly": false + }, + { + "Name": "Wallet272", + "ParticipationOnly": false + }, + { + "Name": "Wallet273", + "ParticipationOnly": false + }, + { + "Name": "Wallet274", + "ParticipationOnly": false + }, + { + "Name": "Wallet275", + "ParticipationOnly": false + }, + { + "Name": "Wallet276", + "ParticipationOnly": false + }, + { + "Name": "Wallet277", + "ParticipationOnly": false + }, + { + "Name": "Wallet278", + "ParticipationOnly": false + }, + { + "Name": "Wallet279", + "ParticipationOnly": false + }, + { + "Name": "Wallet280", + "ParticipationOnly": false + }, + { + "Name": "Wallet281", + "ParticipationOnly": false + }, + { + "Name": "Wallet282", + "ParticipationOnly": false + }, + { + "Name": "Wallet283", + "ParticipationOnly": false + }, + { + "Name": "Wallet284", + "ParticipationOnly": false + }, + { + "Name": "Wallet285", + "ParticipationOnly": false + }, + { + "Name": "Wallet286", + "ParticipationOnly": false + }, + { + "Name": "Wallet287", + "ParticipationOnly": false + }, + { + "Name": "Wallet288", + "ParticipationOnly": false + }, + { + "Name": "Wallet289", + "ParticipationOnly": false + }, + { + "Name": "Wallet290", + "ParticipationOnly": false + }, + { + "Name": "Wallet291", + "ParticipationOnly": false + }, + { + "Name": "Wallet292", + "ParticipationOnly": false + }, + { + "Name": "Wallet293", + "ParticipationOnly": false + }, + { + "Name": "Wallet294", + "ParticipationOnly": false + }, + { + "Name": "Wallet295", + "ParticipationOnly": false + }, + { + "Name": "Wallet296", + "ParticipationOnly": false + }, + { + "Name": "Wallet297", + "ParticipationOnly": false + }, + { + "Name": "Wallet298", + "ParticipationOnly": false + }, + { + "Name": "Wallet299", + "ParticipationOnly": false + }, + { + "Name": "Wallet300", + "ParticipationOnly": false + }, + { + "Name": "Wallet301", + "ParticipationOnly": false + }, + { + "Name": "Wallet302", + "ParticipationOnly": false + }, + { + "Name": "Wallet303", + "ParticipationOnly": false + }, + { + "Name": "Wallet304", + "ParticipationOnly": false + }, + { + "Name": "Wallet305", + "ParticipationOnly": false + }, + { + "Name": "Wallet306", + "ParticipationOnly": false + }, + { + "Name": "Wallet307", + "ParticipationOnly": false + }, + { + "Name": "Wallet308", + "ParticipationOnly": false + }, + { + "Name": "Wallet309", + "ParticipationOnly": false + }, + { + "Name": "Wallet310", + "ParticipationOnly": false + }, + { + "Name": "Wallet311", + "ParticipationOnly": false + }, + { + "Name": "Wallet312", + "ParticipationOnly": false + }, + { + "Name": "Wallet313", + "ParticipationOnly": false + }, + { + "Name": "Wallet314", + "ParticipationOnly": false + }, + { + "Name": "Wallet315", + "ParticipationOnly": false + }, + { + "Name": "Wallet316", + "ParticipationOnly": false + }, + { + "Name": "Wallet317", + "ParticipationOnly": false + }, + { + "Name": "Wallet318", + "ParticipationOnly": false + }, + { + "Name": "Wallet319", + "ParticipationOnly": false + }, + { + "Name": "Wallet320", + "ParticipationOnly": false + }, + { + "Name": "Wallet321", + "ParticipationOnly": false + }, + { + "Name": "Wallet322", + "ParticipationOnly": false + }, + { + "Name": "Wallet323", + "ParticipationOnly": false + }, + { + "Name": "Wallet324", + "ParticipationOnly": false + }, + { + "Name": "Wallet325", + "ParticipationOnly": false + }, + { + "Name": "Wallet326", + "ParticipationOnly": false + }, + { + "Name": "Wallet327", + "ParticipationOnly": false + }, + { + "Name": "Wallet328", + "ParticipationOnly": false + }, + { + "Name": "Wallet329", + "ParticipationOnly": false + }, + { + "Name": "Wallet330", + "ParticipationOnly": false + }, + { + "Name": "Wallet331", + "ParticipationOnly": false + }, + { + "Name": "Wallet332", + "ParticipationOnly": false + }, + { + "Name": "Wallet333", + "ParticipationOnly": false + }, + { + "Name": "Wallet334", + "ParticipationOnly": false + }, + { + "Name": "Wallet335", + "ParticipationOnly": false + }, + { + "Name": "Wallet336", + "ParticipationOnly": false + }, + { + "Name": "Wallet337", + "ParticipationOnly": false + }, + { + "Name": "Wallet338", + "ParticipationOnly": false + }, + { + "Name": "Wallet339", + "ParticipationOnly": false + }, + { + "Name": "Wallet340", + "ParticipationOnly": false + }, + { + "Name": "Wallet341", + "ParticipationOnly": false + }, + { + "Name": "Wallet342", + "ParticipationOnly": false + }, + { + "Name": "Wallet343", + "ParticipationOnly": false + }, + { + "Name": "Wallet344", + "ParticipationOnly": false + }, + { + "Name": "Wallet345", + "ParticipationOnly": false + }, + { + "Name": "Wallet346", + "ParticipationOnly": false + }, + { + "Name": "Wallet347", + "ParticipationOnly": false + }, + { + "Name": "Wallet348", + "ParticipationOnly": false + }, + { + "Name": "Wallet349", + "ParticipationOnly": false + }, + { + "Name": "Wallet350", + "ParticipationOnly": false + }, + { + "Name": "Wallet351", + "ParticipationOnly": false + }, + { + "Name": "Wallet352", + "ParticipationOnly": false + }, + { + "Name": "Wallet353", + "ParticipationOnly": false + }, + { + "Name": "Wallet354", + "ParticipationOnly": false + }, + { + "Name": "Wallet355", + "ParticipationOnly": false + }, + { + "Name": "Wallet356", + "ParticipationOnly": false + }, + { + "Name": "Wallet357", + "ParticipationOnly": false + }, + { + "Name": "Wallet358", + "ParticipationOnly": false + }, + { + "Name": "Wallet359", + "ParticipationOnly": false + }, + { + "Name": "Wallet360", + "ParticipationOnly": false + }, + { + "Name": "Wallet361", + "ParticipationOnly": false + }, + { + "Name": "Wallet362", + "ParticipationOnly": false + }, + { + "Name": "Wallet363", + "ParticipationOnly": false + }, + { + "Name": "Wallet364", + "ParticipationOnly": false + }, + { + "Name": "Wallet365", + "ParticipationOnly": false + }, + { + "Name": "Wallet366", + "ParticipationOnly": false + }, + { + "Name": "Wallet367", + "ParticipationOnly": false + }, + { + "Name": "Wallet368", + "ParticipationOnly": false + }, + { + "Name": "Wallet369", + "ParticipationOnly": false + }, + { + "Name": "Wallet370", + "ParticipationOnly": false + }, + { + "Name": "Wallet371", + "ParticipationOnly": false + }, + { + "Name": "Wallet372", + "ParticipationOnly": false + }, + { + "Name": "Wallet373", + "ParticipationOnly": false + }, + { + "Name": "Wallet374", + "ParticipationOnly": false + }, + { + "Name": "Wallet375", + "ParticipationOnly": false + }, + { + "Name": "Wallet376", + "ParticipationOnly": false + }, + { + "Name": "Wallet377", + "ParticipationOnly": false + }, + { + "Name": "Wallet378", + "ParticipationOnly": false + }, + { + "Name": "Wallet379", + "ParticipationOnly": false + }, + { + "Name": "Wallet380", + "ParticipationOnly": false + }, + { + "Name": "Wallet381", + "ParticipationOnly": false + }, + { + "Name": "Wallet382", + "ParticipationOnly": false + }, + { + "Name": "Wallet383", + "ParticipationOnly": false + }, + { + "Name": "Wallet384", + "ParticipationOnly": false + }, + { + "Name": "Wallet385", + "ParticipationOnly": false + }, + { + "Name": "Wallet386", + "ParticipationOnly": false + }, + { + "Name": "Wallet387", + "ParticipationOnly": false + }, + { + "Name": "Wallet388", + "ParticipationOnly": false + }, + { + "Name": "Wallet389", + "ParticipationOnly": false + }, + { + "Name": "Wallet390", + "ParticipationOnly": false + }, + { + "Name": "Wallet391", + "ParticipationOnly": false + }, + { + "Name": "Wallet392", + "ParticipationOnly": false + }, + { + "Name": "Wallet393", + "ParticipationOnly": false + }, + { + "Name": "Wallet394", + "ParticipationOnly": false + }, + { + "Name": "Wallet395", + "ParticipationOnly": false + }, + { + "Name": "Wallet396", + "ParticipationOnly": false + }, + { + "Name": "Wallet397", + "ParticipationOnly": false + }, + { + "Name": "Wallet398", + "ParticipationOnly": false + }, + { + "Name": "Wallet399", + "ParticipationOnly": false + }, + { + "Name": "Wallet400", + "ParticipationOnly": false + }, + { + "Name": "Wallet401", + "ParticipationOnly": false + }, + { + "Name": "Wallet402", + "ParticipationOnly": false + }, + { + "Name": "Wallet403", + "ParticipationOnly": false + }, + { + "Name": "Wallet404", + "ParticipationOnly": false + }, + { + "Name": "Wallet405", + "ParticipationOnly": false + }, + { + "Name": "Wallet406", + "ParticipationOnly": false + }, + { + "Name": "Wallet407", + "ParticipationOnly": false + }, + { + "Name": "Wallet408", + "ParticipationOnly": false + }, + { + "Name": "Wallet409", + "ParticipationOnly": false + }, + { + "Name": "Wallet410", + "ParticipationOnly": false + }, + { + "Name": "Wallet411", + "ParticipationOnly": false + }, + { + "Name": "Wallet412", + "ParticipationOnly": false + }, + { + "Name": "Wallet413", + "ParticipationOnly": false + }, + { + "Name": "Wallet414", + "ParticipationOnly": false + }, + { + "Name": "Wallet415", + "ParticipationOnly": false + }, + { + "Name": "Wallet416", + "ParticipationOnly": false + }, + { + "Name": "Wallet417", + "ParticipationOnly": false + }, + { + "Name": "Wallet418", + "ParticipationOnly": false + }, + { + "Name": "Wallet419", + "ParticipationOnly": false + }, + { + "Name": "Wallet420", + "ParticipationOnly": false + }, + { + "Name": "Wallet421", + "ParticipationOnly": false + }, + { + "Name": "Wallet422", + "ParticipationOnly": false + }, + { + "Name": "Wallet423", + "ParticipationOnly": false + }, + { + "Name": "Wallet424", + "ParticipationOnly": false + }, + { + "Name": "Wallet425", + "ParticipationOnly": false + }, + { + "Name": "Wallet426", + "ParticipationOnly": false + }, + { + "Name": "Wallet427", + "ParticipationOnly": false + }, + { + "Name": "Wallet428", + "ParticipationOnly": false + }, + { + "Name": "Wallet429", + "ParticipationOnly": false + }, + { + "Name": "Wallet430", + "ParticipationOnly": false + }, + { + "Name": "Wallet431", + "ParticipationOnly": false + }, + { + "Name": "Wallet432", + "ParticipationOnly": false + }, + { + "Name": "Wallet433", + "ParticipationOnly": false + }, + { + "Name": "Wallet434", + "ParticipationOnly": false + }, + { + "Name": "Wallet435", + "ParticipationOnly": false + }, + { + "Name": "Wallet436", + "ParticipationOnly": false + }, + { + "Name": "Wallet437", + "ParticipationOnly": false + }, + { + "Name": "Wallet438", + "ParticipationOnly": false + }, + { + "Name": "Wallet439", + "ParticipationOnly": false + }, + { + "Name": "Wallet440", + "ParticipationOnly": false + }, + { + "Name": "Wallet441", + "ParticipationOnly": false + }, + { + "Name": "Wallet442", + "ParticipationOnly": false + }, + { + "Name": "Wallet443", + "ParticipationOnly": false + }, + { + "Name": "Wallet444", + "ParticipationOnly": false + }, + { + "Name": "Wallet445", + "ParticipationOnly": false + }, + { + "Name": "Wallet446", + "ParticipationOnly": false + }, + { + "Name": "Wallet447", + "ParticipationOnly": false + }, + { + "Name": "Wallet448", + "ParticipationOnly": false + }, + { + "Name": "Wallet449", + "ParticipationOnly": false + }, + { + "Name": "Wallet450", + "ParticipationOnly": false + }, + { + "Name": "Wallet451", + "ParticipationOnly": false + }, + { + "Name": "Wallet452", + "ParticipationOnly": false + }, + { + "Name": "Wallet453", + "ParticipationOnly": false + }, + { + "Name": "Wallet454", + "ParticipationOnly": false + }, + { + "Name": "Wallet455", + "ParticipationOnly": false + }, + { + "Name": "Wallet456", + "ParticipationOnly": false + }, + { + "Name": "Wallet457", + "ParticipationOnly": false + }, + { + "Name": "Wallet458", + "ParticipationOnly": false + }, + { + "Name": "Wallet459", + "ParticipationOnly": false + }, + { + "Name": "Wallet460", + "ParticipationOnly": false + }, + { + "Name": "Wallet461", + "ParticipationOnly": false + }, + { + "Name": "Wallet462", + "ParticipationOnly": false + }, + { + "Name": "Wallet463", + "ParticipationOnly": false + }, + { + "Name": "Wallet464", + "ParticipationOnly": false + }, + { + "Name": "Wallet465", + "ParticipationOnly": false + }, + { + "Name": "Wallet466", + "ParticipationOnly": false + }, + { + "Name": "Wallet467", + "ParticipationOnly": false + }, + { + "Name": "Wallet468", + "ParticipationOnly": false + }, + { + "Name": "Wallet469", + "ParticipationOnly": false + }, + { + "Name": "Wallet470", + "ParticipationOnly": false + }, + { + "Name": "Wallet471", + "ParticipationOnly": false + }, + { + "Name": "Wallet472", + "ParticipationOnly": false + }, + { + "Name": "Wallet473", + "ParticipationOnly": false + }, + { + "Name": "Wallet474", + "ParticipationOnly": false + }, + { + "Name": "Wallet475", + "ParticipationOnly": false + }, + { + "Name": "Wallet476", + "ParticipationOnly": false + }, + { + "Name": "Wallet477", + "ParticipationOnly": false + }, + { + "Name": "Wallet478", + "ParticipationOnly": false + }, + { + "Name": "Wallet479", + "ParticipationOnly": false + }, + { + "Name": "Wallet480", + "ParticipationOnly": false + }, + { + "Name": "Wallet481", + "ParticipationOnly": false + }, + { + "Name": "Wallet482", + "ParticipationOnly": false + }, + { + "Name": "Wallet483", + "ParticipationOnly": false + }, + { + "Name": "Wallet484", + "ParticipationOnly": false + }, + { + "Name": "Wallet485", + "ParticipationOnly": false + }, + { + "Name": "Wallet486", + "ParticipationOnly": false + }, + { + "Name": "Wallet487", + "ParticipationOnly": false + }, + { + "Name": "Wallet488", + "ParticipationOnly": false + }, + { + "Name": "Wallet489", + "ParticipationOnly": false + }, + { + "Name": "Wallet490", + "ParticipationOnly": false + }, + { + "Name": "Wallet491", + "ParticipationOnly": false + }, + { + "Name": "Wallet492", + "ParticipationOnly": false + }, + { + "Name": "Wallet493", + "ParticipationOnly": false + }, + { + "Name": "Wallet494", + "ParticipationOnly": false + }, + { + "Name": "Wallet495", + "ParticipationOnly": false + }, + { + "Name": "Wallet496", + "ParticipationOnly": false + }, + { + "Name": "Wallet497", + "ParticipationOnly": false + }, + { + "Name": "Wallet498", + "ParticipationOnly": false + }, + { + "Name": "Wallet499", + "ParticipationOnly": false + }, + { + "Name": "Wallet500", + "ParticipationOnly": false + }, + { + "Name": "Wallet501", + "ParticipationOnly": false + }, + { + "Name": "Wallet502", + "ParticipationOnly": false + }, + { + "Name": "Wallet503", + "ParticipationOnly": false + }, + { + "Name": "Wallet504", + "ParticipationOnly": false + }, + { + "Name": "Wallet505", + "ParticipationOnly": false + }, + { + "Name": "Wallet506", + "ParticipationOnly": false + }, + { + "Name": "Wallet507", + "ParticipationOnly": false + }, + { + "Name": "Wallet508", + "ParticipationOnly": false + }, + { + "Name": "Wallet509", + "ParticipationOnly": false + }, + { + "Name": "Wallet510", + "ParticipationOnly": false + }, + { + "Name": "Wallet511", + "ParticipationOnly": false + }, + { + "Name": "Wallet512", + "ParticipationOnly": false + }, + { + "Name": "Wallet513", + "ParticipationOnly": false + }, + { + "Name": "Wallet514", + "ParticipationOnly": false + }, + { + "Name": "Wallet515", + "ParticipationOnly": false + }, + { + "Name": "Wallet516", + "ParticipationOnly": false + }, + { + "Name": "Wallet517", + "ParticipationOnly": false + }, + { + "Name": "Wallet518", + "ParticipationOnly": false + }, + { + "Name": "Wallet519", + "ParticipationOnly": false + }, + { + "Name": "Wallet520", + "ParticipationOnly": false + }, + { + "Name": "Wallet521", + "ParticipationOnly": false + }, + { + "Name": "Wallet522", + "ParticipationOnly": false + }, + { + "Name": "Wallet523", + "ParticipationOnly": false + }, + { + "Name": "Wallet524", + "ParticipationOnly": false + }, + { + "Name": "Wallet525", + "ParticipationOnly": false + }, + { + "Name": "Wallet526", + "ParticipationOnly": false + }, + { + "Name": "Wallet527", + "ParticipationOnly": false + }, + { + "Name": "Wallet528", + "ParticipationOnly": false + }, + { + "Name": "Wallet529", + "ParticipationOnly": false + }, + { + "Name": "Wallet530", + "ParticipationOnly": false + }, + { + "Name": "Wallet531", + "ParticipationOnly": false + }, + { + "Name": "Wallet532", + "ParticipationOnly": false + }, + { + "Name": "Wallet533", + "ParticipationOnly": false + }, + { + "Name": "Wallet534", + "ParticipationOnly": false + }, + { + "Name": "Wallet535", + "ParticipationOnly": false + }, + { + "Name": "Wallet536", + "ParticipationOnly": false + }, + { + "Name": "Wallet537", + "ParticipationOnly": false + }, + { + "Name": "Wallet538", + "ParticipationOnly": false + }, + { + "Name": "Wallet539", + "ParticipationOnly": false + }, + { + "Name": "Wallet540", + "ParticipationOnly": false + }, + { + "Name": "Wallet541", + "ParticipationOnly": false + }, + { + "Name": "Wallet542", + "ParticipationOnly": false + }, + { + "Name": "Wallet543", + "ParticipationOnly": false + }, + { + "Name": "Wallet544", + "ParticipationOnly": false + }, + { + "Name": "Wallet545", + "ParticipationOnly": false + }, + { + "Name": "Wallet546", + "ParticipationOnly": false + }, + { + "Name": "Wallet547", + "ParticipationOnly": false + }, + { + "Name": "Wallet548", + "ParticipationOnly": false + }, + { + "Name": "Wallet549", + "ParticipationOnly": false + }, + { + "Name": "Wallet550", + "ParticipationOnly": false + }, + { + "Name": "Wallet551", + "ParticipationOnly": false + }, + { + "Name": "Wallet552", + "ParticipationOnly": false + }, + { + "Name": "Wallet553", + "ParticipationOnly": false + }, + { + "Name": "Wallet554", + "ParticipationOnly": false + }, + { + "Name": "Wallet555", + "ParticipationOnly": false + }, + { + "Name": "Wallet556", + "ParticipationOnly": false + }, + { + "Name": "Wallet557", + "ParticipationOnly": false + }, + { + "Name": "Wallet558", + "ParticipationOnly": false + }, + { + "Name": "Wallet559", + "ParticipationOnly": false + }, + { + "Name": "Wallet560", + "ParticipationOnly": false + }, + { + "Name": "Wallet561", + "ParticipationOnly": false + }, + { + "Name": "Wallet562", + "ParticipationOnly": false + }, + { + "Name": "Wallet563", + "ParticipationOnly": false + }, + { + "Name": "Wallet564", + "ParticipationOnly": false + }, + { + "Name": "Wallet565", + "ParticipationOnly": false + }, + { + "Name": "Wallet566", + "ParticipationOnly": false + }, + { + "Name": "Wallet567", + "ParticipationOnly": false + }, + { + "Name": "Wallet568", + "ParticipationOnly": false + }, + { + "Name": "Wallet569", + "ParticipationOnly": false + }, + { + "Name": "Wallet570", + "ParticipationOnly": false + }, + { + "Name": "Wallet571", + "ParticipationOnly": false + }, + { + "Name": "Wallet572", + "ParticipationOnly": false + }, + { + "Name": "Wallet573", + "ParticipationOnly": false + }, + { + "Name": "Wallet574", + "ParticipationOnly": false + }, + { + "Name": "Wallet575", + "ParticipationOnly": false + }, + { + "Name": "Wallet576", + "ParticipationOnly": false + }, + { + "Name": "Wallet577", + "ParticipationOnly": false + }, + { + "Name": "Wallet578", + "ParticipationOnly": false + }, + { + "Name": "Wallet579", + "ParticipationOnly": false + }, + { + "Name": "Wallet580", + "ParticipationOnly": false + }, + { + "Name": "Wallet581", + "ParticipationOnly": false + }, + { + "Name": "Wallet582", + "ParticipationOnly": false + }, + { + "Name": "Wallet583", + "ParticipationOnly": false + }, + { + "Name": "Wallet584", + "ParticipationOnly": false + }, + { + "Name": "Wallet585", + "ParticipationOnly": false + }, + { + "Name": "Wallet586", + "ParticipationOnly": false + }, + { + "Name": "Wallet587", + "ParticipationOnly": false + }, + { + "Name": "Wallet588", + "ParticipationOnly": false + }, + { + "Name": "Wallet589", + "ParticipationOnly": false + }, + { + "Name": "Wallet590", + "ParticipationOnly": false + }, + { + "Name": "Wallet591", + "ParticipationOnly": false + }, + { + "Name": "Wallet592", + "ParticipationOnly": false + }, + { + "Name": "Wallet593", + "ParticipationOnly": false + }, + { + "Name": "Wallet594", + "ParticipationOnly": false + }, + { + "Name": "Wallet595", + "ParticipationOnly": false + }, + { + "Name": "Wallet596", + "ParticipationOnly": false + }, + { + "Name": "Wallet597", + "ParticipationOnly": false + }, + { + "Name": "Wallet598", + "ParticipationOnly": false + }, + { + "Name": "Wallet599", + "ParticipationOnly": false + }, + { + "Name": "Wallet600", + "ParticipationOnly": false + }, + { + "Name": "Wallet601", + "ParticipationOnly": false + }, + { + "Name": "Wallet602", + "ParticipationOnly": false + }, + { + "Name": "Wallet603", + "ParticipationOnly": false + }, + { + "Name": "Wallet604", + "ParticipationOnly": false + }, + { + "Name": "Wallet605", + "ParticipationOnly": false + }, + { + "Name": "Wallet606", + "ParticipationOnly": false + }, + { + "Name": "Wallet607", + "ParticipationOnly": false + }, + { + "Name": "Wallet608", + "ParticipationOnly": false + }, + { + "Name": "Wallet609", + "ParticipationOnly": false + }, + { + "Name": "Wallet610", + "ParticipationOnly": false + }, + { + "Name": "Wallet611", + "ParticipationOnly": false + }, + { + "Name": "Wallet612", + "ParticipationOnly": false + }, + { + "Name": "Wallet613", + "ParticipationOnly": false + }, + { + "Name": "Wallet614", + "ParticipationOnly": false + }, + { + "Name": "Wallet615", + "ParticipationOnly": false + }, + { + "Name": "Wallet616", + "ParticipationOnly": false + }, + { + "Name": "Wallet617", + "ParticipationOnly": false + }, + { + "Name": "Wallet618", + "ParticipationOnly": false + }, + { + "Name": "Wallet619", + "ParticipationOnly": false + }, + { + "Name": "Wallet620", + "ParticipationOnly": false + }, + { + "Name": "Wallet621", + "ParticipationOnly": false + }, + { + "Name": "Wallet622", + "ParticipationOnly": false + }, + { + "Name": "Wallet623", + "ParticipationOnly": false + }, + { + "Name": "Wallet624", + "ParticipationOnly": false + }, + { + "Name": "Wallet625", + "ParticipationOnly": false + }, + { + "Name": "Wallet626", + "ParticipationOnly": false + }, + { + "Name": "Wallet627", + "ParticipationOnly": false + }, + { + "Name": "Wallet628", + "ParticipationOnly": false + }, + { + "Name": "Wallet629", + "ParticipationOnly": false + }, + { + "Name": "Wallet630", + "ParticipationOnly": false + }, + { + "Name": "Wallet631", + "ParticipationOnly": false + }, + { + "Name": "Wallet632", + "ParticipationOnly": false + }, + { + "Name": "Wallet633", + "ParticipationOnly": false + }, + { + "Name": "Wallet634", + "ParticipationOnly": false + }, + { + "Name": "Wallet635", + "ParticipationOnly": false + }, + { + "Name": "Wallet636", + "ParticipationOnly": false + }, + { + "Name": "Wallet637", + "ParticipationOnly": false + }, + { + "Name": "Wallet638", + "ParticipationOnly": false + }, + { + "Name": "Wallet639", + "ParticipationOnly": false + }, + { + "Name": "Wallet640", + "ParticipationOnly": false + }, + { + "Name": "Wallet641", + "ParticipationOnly": false + }, + { + "Name": "Wallet642", + "ParticipationOnly": false + }, + { + "Name": "Wallet643", + "ParticipationOnly": false + }, + { + "Name": "Wallet644", + "ParticipationOnly": false + }, + { + "Name": "Wallet645", + "ParticipationOnly": false + }, + { + "Name": "Wallet646", + "ParticipationOnly": false + }, + { + "Name": "Wallet647", + "ParticipationOnly": false + }, + { + "Name": "Wallet648", + "ParticipationOnly": false + }, + { + "Name": "Wallet649", + "ParticipationOnly": false + }, + { + "Name": "Wallet650", + "ParticipationOnly": false + }, + { + "Name": "Wallet651", + "ParticipationOnly": false + }, + { + "Name": "Wallet652", + "ParticipationOnly": false + }, + { + "Name": "Wallet653", + "ParticipationOnly": false + }, + { + "Name": "Wallet654", + "ParticipationOnly": false + }, + { + "Name": "Wallet655", + "ParticipationOnly": false + }, + { + "Name": "Wallet656", + "ParticipationOnly": false + }, + { + "Name": "Wallet657", + "ParticipationOnly": false + }, + { + "Name": "Wallet658", + "ParticipationOnly": false + }, + { + "Name": "Wallet659", + "ParticipationOnly": false + }, + { + "Name": "Wallet660", + "ParticipationOnly": false + }, + { + "Name": "Wallet661", + "ParticipationOnly": false + }, + { + "Name": "Wallet662", + "ParticipationOnly": false + }, + { + "Name": "Wallet663", + "ParticipationOnly": false + }, + { + "Name": "Wallet664", + "ParticipationOnly": false + }, + { + "Name": "Wallet665", + "ParticipationOnly": false + }, + { + "Name": "Wallet666", + "ParticipationOnly": false + }, + { + "Name": "Wallet667", + "ParticipationOnly": false + }, + { + "Name": "Wallet668", + "ParticipationOnly": false + }, + { + "Name": "Wallet669", + "ParticipationOnly": false + }, + { + "Name": "Wallet670", + "ParticipationOnly": false + }, + { + "Name": "Wallet671", + "ParticipationOnly": false + }, + { + "Name": "Wallet672", + "ParticipationOnly": false + }, + { + "Name": "Wallet673", + "ParticipationOnly": false + }, + { + "Name": "Wallet674", + "ParticipationOnly": false + }, + { + "Name": "Wallet675", + "ParticipationOnly": false + }, + { + "Name": "Wallet676", + "ParticipationOnly": false + }, + { + "Name": "Wallet677", + "ParticipationOnly": false + }, + { + "Name": "Wallet678", + "ParticipationOnly": false + }, + { + "Name": "Wallet679", + "ParticipationOnly": false + }, + { + "Name": "Wallet680", + "ParticipationOnly": false + }, + { + "Name": "Wallet681", + "ParticipationOnly": false + }, + { + "Name": "Wallet682", + "ParticipationOnly": false + }, + { + "Name": "Wallet683", + "ParticipationOnly": false + }, + { + "Name": "Wallet684", + "ParticipationOnly": false + }, + { + "Name": "Wallet685", + "ParticipationOnly": false + }, + { + "Name": "Wallet686", + "ParticipationOnly": false + }, + { + "Name": "Wallet687", + "ParticipationOnly": false + }, + { + "Name": "Wallet688", + "ParticipationOnly": false + }, + { + "Name": "Wallet689", + "ParticipationOnly": false + }, + { + "Name": "Wallet690", + "ParticipationOnly": false + }, + { + "Name": "Wallet691", + "ParticipationOnly": false + }, + { + "Name": "Wallet692", + "ParticipationOnly": false + }, + { + "Name": "Wallet693", + "ParticipationOnly": false + }, + { + "Name": "Wallet694", + "ParticipationOnly": false + }, + { + "Name": "Wallet695", + "ParticipationOnly": false + }, + { + "Name": "Wallet696", + "ParticipationOnly": false + }, + { + "Name": "Wallet697", + "ParticipationOnly": false + }, + { + "Name": "Wallet698", + "ParticipationOnly": false + }, + { + "Name": "Wallet699", + "ParticipationOnly": false + }, + { + "Name": "Wallet700", + "ParticipationOnly": false + }, + { + "Name": "Wallet701", + "ParticipationOnly": false + }, + { + "Name": "Wallet702", + "ParticipationOnly": false + }, + { + "Name": "Wallet703", + "ParticipationOnly": false + }, + { + "Name": "Wallet704", + "ParticipationOnly": false + }, + { + "Name": "Wallet705", + "ParticipationOnly": false + }, + { + "Name": "Wallet706", + "ParticipationOnly": false + }, + { + "Name": "Wallet707", + "ParticipationOnly": false + }, + { + "Name": "Wallet708", + "ParticipationOnly": false + }, + { + "Name": "Wallet709", + "ParticipationOnly": false + }, + { + "Name": "Wallet710", + "ParticipationOnly": false + }, + { + "Name": "Wallet711", + "ParticipationOnly": false + }, + { + "Name": "Wallet712", + "ParticipationOnly": false + }, + { + "Name": "Wallet713", + "ParticipationOnly": false + }, + { + "Name": "Wallet714", + "ParticipationOnly": false + }, + { + "Name": "Wallet715", + "ParticipationOnly": false + }, + { + "Name": "Wallet716", + "ParticipationOnly": false + }, + { + "Name": "Wallet717", + "ParticipationOnly": false + }, + { + "Name": "Wallet718", + "ParticipationOnly": false + }, + { + "Name": "Wallet719", + "ParticipationOnly": false + }, + { + "Name": "Wallet720", + "ParticipationOnly": false + }, + { + "Name": "Wallet721", + "ParticipationOnly": false + }, + { + "Name": "Wallet722", + "ParticipationOnly": false + }, + { + "Name": "Wallet723", + "ParticipationOnly": false + }, + { + "Name": "Wallet724", + "ParticipationOnly": false + }, + { + "Name": "Wallet725", + "ParticipationOnly": false + }, + { + "Name": "Wallet726", + "ParticipationOnly": false + }, + { + "Name": "Wallet727", + "ParticipationOnly": false + }, + { + "Name": "Wallet728", + "ParticipationOnly": false + }, + { + "Name": "Wallet729", + "ParticipationOnly": false + }, + { + "Name": "Wallet730", + "ParticipationOnly": false + }, + { + "Name": "Wallet731", + "ParticipationOnly": false + }, + { + "Name": "Wallet732", + "ParticipationOnly": false + }, + { + "Name": "Wallet733", + "ParticipationOnly": false + }, + { + "Name": "Wallet734", + "ParticipationOnly": false + }, + { + "Name": "Wallet735", + "ParticipationOnly": false + }, + { + "Name": "Wallet736", + "ParticipationOnly": false + }, + { + "Name": "Wallet737", + "ParticipationOnly": false + }, + { + "Name": "Wallet738", + "ParticipationOnly": false + }, + { + "Name": "Wallet739", + "ParticipationOnly": false + }, + { + "Name": "Wallet740", + "ParticipationOnly": false + }, + { + "Name": "Wallet741", + "ParticipationOnly": false + }, + { + "Name": "Wallet742", + "ParticipationOnly": false + }, + { + "Name": "Wallet743", + "ParticipationOnly": false + }, + { + "Name": "Wallet744", + "ParticipationOnly": false + }, + { + "Name": "Wallet745", + "ParticipationOnly": false + }, + { + "Name": "Wallet746", + "ParticipationOnly": false + }, + { + "Name": "Wallet747", + "ParticipationOnly": false + }, + { + "Name": "Wallet748", + "ParticipationOnly": false + }, + { + "Name": "Wallet749", + "ParticipationOnly": false + }, + { + "Name": "Wallet750", + "ParticipationOnly": false + }, + { + "Name": "Wallet751", + "ParticipationOnly": false + }, + { + "Name": "Wallet752", + "ParticipationOnly": false + }, + { + "Name": "Wallet753", + "ParticipationOnly": false + }, + { + "Name": "Wallet754", + "ParticipationOnly": false + }, + { + "Name": "Wallet755", + "ParticipationOnly": false + }, + { + "Name": "Wallet756", + "ParticipationOnly": false + }, + { + "Name": "Wallet757", + "ParticipationOnly": false + }, + { + "Name": "Wallet758", + "ParticipationOnly": false + }, + { + "Name": "Wallet759", + "ParticipationOnly": false + }, + { + "Name": "Wallet760", + "ParticipationOnly": false + }, + { + "Name": "Wallet761", + "ParticipationOnly": false + }, + { + "Name": "Wallet762", + "ParticipationOnly": false + }, + { + "Name": "Wallet763", + "ParticipationOnly": false + }, + { + "Name": "Wallet764", + "ParticipationOnly": false + }, + { + "Name": "Wallet765", + "ParticipationOnly": false + }, + { + "Name": "Wallet766", + "ParticipationOnly": false + }, + { + "Name": "Wallet767", + "ParticipationOnly": false + }, + { + "Name": "Wallet768", + "ParticipationOnly": false + }, + { + "Name": "Wallet769", + "ParticipationOnly": false + }, + { + "Name": "Wallet770", + "ParticipationOnly": false + }, + { + "Name": "Wallet771", + "ParticipationOnly": false + }, + { + "Name": "Wallet772", + "ParticipationOnly": false + }, + { + "Name": "Wallet773", + "ParticipationOnly": false + }, + { + "Name": "Wallet774", + "ParticipationOnly": false + }, + { + "Name": "Wallet775", + "ParticipationOnly": false + }, + { + "Name": "Wallet776", + "ParticipationOnly": false + }, + { + "Name": "Wallet777", + "ParticipationOnly": false + }, + { + "Name": "Wallet778", + "ParticipationOnly": false + }, + { + "Name": "Wallet779", + "ParticipationOnly": false + }, + { + "Name": "Wallet780", + "ParticipationOnly": false + }, + { + "Name": "Wallet781", + "ParticipationOnly": false + }, + { + "Name": "Wallet782", + "ParticipationOnly": false + }, + { + "Name": "Wallet783", + "ParticipationOnly": false + }, + { + "Name": "Wallet784", + "ParticipationOnly": false + }, + { + "Name": "Wallet785", + "ParticipationOnly": false + }, + { + "Name": "Wallet786", + "ParticipationOnly": false + }, + { + "Name": "Wallet787", + "ParticipationOnly": false + }, + { + "Name": "Wallet788", + "ParticipationOnly": false + }, + { + "Name": "Wallet789", + "ParticipationOnly": false + }, + { + "Name": "Wallet790", + "ParticipationOnly": false + }, + { + "Name": "Wallet791", + "ParticipationOnly": false + }, + { + "Name": "Wallet792", + "ParticipationOnly": false + }, + { + "Name": "Wallet793", + "ParticipationOnly": false + }, + { + "Name": "Wallet794", + "ParticipationOnly": false + }, + { + "Name": "Wallet795", + "ParticipationOnly": false + }, + { + "Name": "Wallet796", + "ParticipationOnly": false + }, + { + "Name": "Wallet797", + "ParticipationOnly": false + }, + { + "Name": "Wallet798", + "ParticipationOnly": false + }, + { + "Name": "Wallet799", + "ParticipationOnly": false + }, + { + "Name": "Wallet800", + "ParticipationOnly": false + }, + { + "Name": "Wallet801", + "ParticipationOnly": false + }, + { + "Name": "Wallet802", + "ParticipationOnly": false + }, + { + "Name": "Wallet803", + "ParticipationOnly": false + }, + { + "Name": "Wallet804", + "ParticipationOnly": false + }, + { + "Name": "Wallet805", + "ParticipationOnly": false + }, + { + "Name": "Wallet806", + "ParticipationOnly": false + }, + { + "Name": "Wallet807", + "ParticipationOnly": false + }, + { + "Name": "Wallet808", + "ParticipationOnly": false + }, + { + "Name": "Wallet809", + "ParticipationOnly": false + }, + { + "Name": "Wallet810", + "ParticipationOnly": false + }, + { + "Name": "Wallet811", + "ParticipationOnly": false + }, + { + "Name": "Wallet812", + "ParticipationOnly": false + }, + { + "Name": "Wallet813", + "ParticipationOnly": false + }, + { + "Name": "Wallet814", + "ParticipationOnly": false + }, + { + "Name": "Wallet815", + "ParticipationOnly": false + }, + { + "Name": "Wallet816", + "ParticipationOnly": false + }, + { + "Name": "Wallet817", + "ParticipationOnly": false + }, + { + "Name": "Wallet818", + "ParticipationOnly": false + }, + { + "Name": "Wallet819", + "ParticipationOnly": false + }, + { + "Name": "Wallet820", + "ParticipationOnly": false + }, + { + "Name": "Wallet821", + "ParticipationOnly": false + }, + { + "Name": "Wallet822", + "ParticipationOnly": false + }, + { + "Name": "Wallet823", + "ParticipationOnly": false + }, + { + "Name": "Wallet824", + "ParticipationOnly": false + }, + { + "Name": "Wallet825", + "ParticipationOnly": false + }, + { + "Name": "Wallet826", + "ParticipationOnly": false + }, + { + "Name": "Wallet827", + "ParticipationOnly": false + }, + { + "Name": "Wallet828", + "ParticipationOnly": false + }, + { + "Name": "Wallet829", + "ParticipationOnly": false + }, + { + "Name": "Wallet830", + "ParticipationOnly": false + }, + { + "Name": "Wallet831", + "ParticipationOnly": false + }, + { + "Name": "Wallet832", + "ParticipationOnly": false + }, + { + "Name": "Wallet833", + "ParticipationOnly": false + }, + { + "Name": "Wallet834", + "ParticipationOnly": false + }, + { + "Name": "Wallet835", + "ParticipationOnly": false + }, + { + "Name": "Wallet836", + "ParticipationOnly": false + }, + { + "Name": "Wallet837", + "ParticipationOnly": false + }, + { + "Name": "Wallet838", + "ParticipationOnly": false + }, + { + "Name": "Wallet839", + "ParticipationOnly": false + }, + { + "Name": "Wallet840", + "ParticipationOnly": false + }, + { + "Name": "Wallet841", + "ParticipationOnly": false + }, + { + "Name": "Wallet842", + "ParticipationOnly": false + }, + { + "Name": "Wallet843", + "ParticipationOnly": false + }, + { + "Name": "Wallet844", + "ParticipationOnly": false + }, + { + "Name": "Wallet845", + "ParticipationOnly": false + }, + { + "Name": "Wallet846", + "ParticipationOnly": false + }, + { + "Name": "Wallet847", + "ParticipationOnly": false + }, + { + "Name": "Wallet848", + "ParticipationOnly": false + }, + { + "Name": "Wallet849", + "ParticipationOnly": false + }, + { + "Name": "Wallet850", + "ParticipationOnly": false + }, + { + "Name": "Wallet851", + "ParticipationOnly": false + }, + { + "Name": "Wallet852", + "ParticipationOnly": false + }, + { + "Name": "Wallet853", + "ParticipationOnly": false + }, + { + "Name": "Wallet854", + "ParticipationOnly": false + }, + { + "Name": "Wallet855", + "ParticipationOnly": false + }, + { + "Name": "Wallet856", + "ParticipationOnly": false + }, + { + "Name": "Wallet857", + "ParticipationOnly": false + }, + { + "Name": "Wallet858", + "ParticipationOnly": false + }, + { + "Name": "Wallet859", + "ParticipationOnly": false + }, + { + "Name": "Wallet860", + "ParticipationOnly": false + }, + { + "Name": "Wallet861", + "ParticipationOnly": false + }, + { + "Name": "Wallet862", + "ParticipationOnly": false + }, + { + "Name": "Wallet863", + "ParticipationOnly": false + }, + { + "Name": "Wallet864", + "ParticipationOnly": false + }, + { + "Name": "Wallet865", + "ParticipationOnly": false + }, + { + "Name": "Wallet866", + "ParticipationOnly": false + }, + { + "Name": "Wallet867", + "ParticipationOnly": false + }, + { + "Name": "Wallet868", + "ParticipationOnly": false + }, + { + "Name": "Wallet869", + "ParticipationOnly": false + }, + { + "Name": "Wallet870", + "ParticipationOnly": false + }, + { + "Name": "Wallet871", + "ParticipationOnly": false + }, + { + "Name": "Wallet872", + "ParticipationOnly": false + }, + { + "Name": "Wallet873", + "ParticipationOnly": false + }, + { + "Name": "Wallet874", + "ParticipationOnly": false + }, + { + "Name": "Wallet875", + "ParticipationOnly": false + }, + { + "Name": "Wallet876", + "ParticipationOnly": false + }, + { + "Name": "Wallet877", + "ParticipationOnly": false + }, + { + "Name": "Wallet878", + "ParticipationOnly": false + }, + { + "Name": "Wallet879", + "ParticipationOnly": false + }, + { + "Name": "Wallet880", + "ParticipationOnly": false + }, + { + "Name": "Wallet881", + "ParticipationOnly": false + }, + { + "Name": "Wallet882", + "ParticipationOnly": false + }, + { + "Name": "Wallet883", + "ParticipationOnly": false + }, + { + "Name": "Wallet884", + "ParticipationOnly": false + }, + { + "Name": "Wallet885", + "ParticipationOnly": false + }, + { + "Name": "Wallet886", + "ParticipationOnly": false + }, + { + "Name": "Wallet887", + "ParticipationOnly": false + }, + { + "Name": "Wallet888", + "ParticipationOnly": false + }, + { + "Name": "Wallet889", + "ParticipationOnly": false + }, + { + "Name": "Wallet890", + "ParticipationOnly": false + }, + { + "Name": "Wallet891", + "ParticipationOnly": false + }, + { + "Name": "Wallet892", + "ParticipationOnly": false + }, + { + "Name": "Wallet893", + "ParticipationOnly": false + }, + { + "Name": "Wallet894", + "ParticipationOnly": false + }, + { + "Name": "Wallet895", + "ParticipationOnly": false + }, + { + "Name": "Wallet896", + "ParticipationOnly": false + }, + { + "Name": "Wallet897", + "ParticipationOnly": false + }, + { + "Name": "Wallet898", + "ParticipationOnly": false + }, + { + "Name": "Wallet899", + "ParticipationOnly": false + }, + { + "Name": "Wallet900", + "ParticipationOnly": false + }, + { + "Name": "Wallet901", + "ParticipationOnly": false + }, + { + "Name": "Wallet902", + "ParticipationOnly": false + }, + { + "Name": "Wallet903", + "ParticipationOnly": false + }, + { + "Name": "Wallet904", + "ParticipationOnly": false + }, + { + "Name": "Wallet905", + "ParticipationOnly": false + }, + { + "Name": "Wallet906", + "ParticipationOnly": false + }, + { + "Name": "Wallet907", + "ParticipationOnly": false + }, + { + "Name": "Wallet908", + "ParticipationOnly": false + }, + { + "Name": "Wallet909", + "ParticipationOnly": false + }, + { + "Name": "Wallet910", + "ParticipationOnly": false + }, + { + "Name": "Wallet911", + "ParticipationOnly": false + }, + { + "Name": "Wallet912", + "ParticipationOnly": false + }, + { + "Name": "Wallet913", + "ParticipationOnly": false + }, + { + "Name": "Wallet914", + "ParticipationOnly": false + }, + { + "Name": "Wallet915", + "ParticipationOnly": false + }, + { + "Name": "Wallet916", + "ParticipationOnly": false + }, + { + "Name": "Wallet917", + "ParticipationOnly": false + }, + { + "Name": "Wallet918", + "ParticipationOnly": false + }, + { + "Name": "Wallet919", + "ParticipationOnly": false + }, + { + "Name": "Wallet920", + "ParticipationOnly": false + }, + { + "Name": "Wallet921", + "ParticipationOnly": false + }, + { + "Name": "Wallet922", + "ParticipationOnly": false + }, + { + "Name": "Wallet923", + "ParticipationOnly": false + }, + { + "Name": "Wallet924", + "ParticipationOnly": false + }, + { + "Name": "Wallet925", + "ParticipationOnly": false + }, + { + "Name": "Wallet926", + "ParticipationOnly": false + }, + { + "Name": "Wallet927", + "ParticipationOnly": false + }, + { + "Name": "Wallet928", + "ParticipationOnly": false + }, + { + "Name": "Wallet929", + "ParticipationOnly": false + }, + { + "Name": "Wallet930", + "ParticipationOnly": false + }, + { + "Name": "Wallet931", + "ParticipationOnly": false + }, + { + "Name": "Wallet932", + "ParticipationOnly": false + }, + { + "Name": "Wallet933", + "ParticipationOnly": false + }, + { + "Name": "Wallet934", + "ParticipationOnly": false + }, + { + "Name": "Wallet935", + "ParticipationOnly": false + }, + { + "Name": "Wallet936", + "ParticipationOnly": false + }, + { + "Name": "Wallet937", + "ParticipationOnly": false + }, + { + "Name": "Wallet938", + "ParticipationOnly": false + }, + { + "Name": "Wallet939", + "ParticipationOnly": false + }, + { + "Name": "Wallet940", + "ParticipationOnly": false + }, + { + "Name": "Wallet941", + "ParticipationOnly": false + }, + { + "Name": "Wallet942", + "ParticipationOnly": false + }, + { + "Name": "Wallet943", + "ParticipationOnly": false + }, + { + "Name": "Wallet944", + "ParticipationOnly": false + }, + { + "Name": "Wallet945", + "ParticipationOnly": false + }, + { + "Name": "Wallet946", + "ParticipationOnly": false + }, + { + "Name": "Wallet947", + "ParticipationOnly": false + }, + { + "Name": "Wallet948", + "ParticipationOnly": false + }, + { + "Name": "Wallet949", + "ParticipationOnly": false + }, + { + "Name": "Wallet950", + "ParticipationOnly": false + }, + { + "Name": "Wallet951", + "ParticipationOnly": false + }, + { + "Name": "Wallet952", + "ParticipationOnly": false + }, + { + "Name": "Wallet953", + "ParticipationOnly": false + }, + { + "Name": "Wallet954", + "ParticipationOnly": false + }, + { + "Name": "Wallet955", + "ParticipationOnly": false + }, + { + "Name": "Wallet956", + "ParticipationOnly": false + }, + { + "Name": "Wallet957", + "ParticipationOnly": false + }, + { + "Name": "Wallet958", + "ParticipationOnly": false + }, + { + "Name": "Wallet959", + "ParticipationOnly": false + }, + { + "Name": "Wallet960", + "ParticipationOnly": false + }, + { + "Name": "Wallet961", + "ParticipationOnly": false + }, + { + "Name": "Wallet962", + "ParticipationOnly": false + }, + { + "Name": "Wallet963", + "ParticipationOnly": false + }, + { + "Name": "Wallet964", + "ParticipationOnly": false + }, + { + "Name": "Wallet965", + "ParticipationOnly": false + }, + { + "Name": "Wallet966", + "ParticipationOnly": false + }, + { + "Name": "Wallet967", + "ParticipationOnly": false + }, + { + "Name": "Wallet968", + "ParticipationOnly": false + }, + { + "Name": "Wallet969", + "ParticipationOnly": false + }, + { + "Name": "Wallet970", + "ParticipationOnly": false + }, + { + "Name": "Wallet971", + "ParticipationOnly": false + }, + { + "Name": "Wallet972", + "ParticipationOnly": false + }, + { + "Name": "Wallet973", + "ParticipationOnly": false + }, + { + "Name": "Wallet974", + "ParticipationOnly": false + }, + { + "Name": "Wallet975", + "ParticipationOnly": false + }, + { + "Name": "Wallet976", + "ParticipationOnly": false + }, + { + "Name": "Wallet977", + "ParticipationOnly": false + }, + { + "Name": "Wallet978", + "ParticipationOnly": false + }, + { + "Name": "Wallet979", + "ParticipationOnly": false + }, + { + "Name": "Wallet980", + "ParticipationOnly": false + }, + { + "Name": "Wallet981", + "ParticipationOnly": false + }, + { + "Name": "Wallet982", + "ParticipationOnly": false + }, + { + "Name": "Wallet983", + "ParticipationOnly": false + }, + { + "Name": "Wallet984", + "ParticipationOnly": false + }, + { + "Name": "Wallet985", + "ParticipationOnly": false + }, + { + "Name": "Wallet986", + "ParticipationOnly": false + }, + { + "Name": "Wallet987", + "ParticipationOnly": false + }, + { + "Name": "Wallet988", + "ParticipationOnly": false + }, + { + "Name": "Wallet989", + "ParticipationOnly": false + }, + { + "Name": "Wallet990", + "ParticipationOnly": false + }, + { + "Name": "Wallet991", + "ParticipationOnly": false + }, + { + "Name": "Wallet992", + "ParticipationOnly": false + }, + { + "Name": "Wallet993", + "ParticipationOnly": false + }, + { + "Name": "Wallet994", + "ParticipationOnly": false + }, + { + "Name": "Wallet995", + "ParticipationOnly": false + }, + { + "Name": "Wallet996", + "ParticipationOnly": false + }, + { + "Name": "Wallet997", + "ParticipationOnly": false + }, + { + "Name": "Wallet998", + "ParticipationOnly": false + }, + { + "Name": "Wallet999", + "ParticipationOnly": false + }, + { + "Name": "Wallet1000", + "ParticipationOnly": false + }, + { + "Name": "Wallet1001", + "ParticipationOnly": false + }, + { + "Name": "Wallet1002", + "ParticipationOnly": false + }, + { + "Name": "Wallet1003", + "ParticipationOnly": false + }, + { + "Name": "Wallet1004", + "ParticipationOnly": false + }, + { + "Name": "Wallet1005", + "ParticipationOnly": false + }, + { + "Name": "Wallet1006", + "ParticipationOnly": false + }, + { + "Name": "Wallet1007", + "ParticipationOnly": false + }, + { + "Name": "Wallet1008", + "ParticipationOnly": false + }, + { + "Name": "Wallet1009", + "ParticipationOnly": false + }, + { + "Name": "Wallet1010", + "ParticipationOnly": false + }, + { + "Name": "Wallet1011", + "ParticipationOnly": false + }, + { + "Name": "Wallet1012", + "ParticipationOnly": false + }, + { + "Name": "Wallet1013", + "ParticipationOnly": false + }, + { + "Name": "Wallet1014", + "ParticipationOnly": false + }, + { + "Name": "Wallet1015", + "ParticipationOnly": false + }, + { + "Name": "Wallet1016", + "ParticipationOnly": false + }, + { + "Name": "Wallet1017", + "ParticipationOnly": false + }, + { + "Name": "Wallet1018", + "ParticipationOnly": false + }, + { + "Name": "Wallet1019", + "ParticipationOnly": false + }, + { + "Name": "Wallet1020", + "ParticipationOnly": false + }, + { + "Name": "Wallet1021", + "ParticipationOnly": false + }, + { + "Name": "Wallet1022", + "ParticipationOnly": false + }, + { + "Name": "Wallet1023", + "ParticipationOnly": false + }, + { + "Name": "Wallet1024", + "ParticipationOnly": false + }, + { + "Name": "Wallet1025", + "ParticipationOnly": false + }, + { + "Name": "Wallet1026", + "ParticipationOnly": false + }, + { + "Name": "Wallet1027", + "ParticipationOnly": false + }, + { + "Name": "Wallet1028", + "ParticipationOnly": false + }, + { + "Name": "Wallet1029", + "ParticipationOnly": false + }, + { + "Name": "Wallet1030", + "ParticipationOnly": false + }, + { + "Name": "Wallet1031", + "ParticipationOnly": false + }, + { + "Name": "Wallet1032", + "ParticipationOnly": false + }, + { + "Name": "Wallet1033", + "ParticipationOnly": false + }, + { + "Name": "Wallet1034", + "ParticipationOnly": false + }, + { + "Name": "Wallet1035", + "ParticipationOnly": false + }, + { + "Name": "Wallet1036", + "ParticipationOnly": false + }, + { + "Name": "Wallet1037", + "ParticipationOnly": false + }, + { + "Name": "Wallet1038", + "ParticipationOnly": false + }, + { + "Name": "Wallet1039", + "ParticipationOnly": false + }, + { + "Name": "Wallet1040", + "ParticipationOnly": false + }, + { + "Name": "Wallet1041", + "ParticipationOnly": false + }, + { + "Name": "Wallet1042", + "ParticipationOnly": false + }, + { + "Name": "Wallet1043", + "ParticipationOnly": false + }, + { + "Name": "Wallet1044", + "ParticipationOnly": false + }, + { + "Name": "Wallet1045", + "ParticipationOnly": false + }, + { + "Name": "Wallet1046", + "ParticipationOnly": false + }, + { + "Name": "Wallet1047", + "ParticipationOnly": false + }, + { + "Name": "Wallet1048", + "ParticipationOnly": false + }, + { + "Name": "Wallet1049", + "ParticipationOnly": false + }, + { + "Name": "Wallet1050", + "ParticipationOnly": false + }, + { + "Name": "Wallet1051", + "ParticipationOnly": false + }, + { + "Name": "Wallet1052", + "ParticipationOnly": false + }, + { + "Name": "Wallet1053", + "ParticipationOnly": false + }, + { + "Name": "Wallet1054", + "ParticipationOnly": false + }, + { + "Name": "Wallet1055", + "ParticipationOnly": false + }, + { + "Name": "Wallet1056", + "ParticipationOnly": false + }, + { + "Name": "Wallet1057", + "ParticipationOnly": false + }, + { + "Name": "Wallet1058", + "ParticipationOnly": false + }, + { + "Name": "Wallet1059", + "ParticipationOnly": false + }, + { + "Name": "Wallet1060", + "ParticipationOnly": false + }, + { + "Name": "Wallet1061", + "ParticipationOnly": false + }, + { + "Name": "Wallet1062", + "ParticipationOnly": false + }, + { + "Name": "Wallet1063", + "ParticipationOnly": false + }, + { + "Name": "Wallet1064", + "ParticipationOnly": false + }, + { + "Name": "Wallet1065", + "ParticipationOnly": false + }, + { + "Name": "Wallet1066", + "ParticipationOnly": false + }, + { + "Name": "Wallet1067", + "ParticipationOnly": false + }, + { + "Name": "Wallet1068", + "ParticipationOnly": false + }, + { + "Name": "Wallet1069", + "ParticipationOnly": false + }, + { + "Name": "Wallet1070", + "ParticipationOnly": false + }, + { + "Name": "Wallet1071", + "ParticipationOnly": false + }, + { + "Name": "Wallet1072", + "ParticipationOnly": false + }, + { + "Name": "Wallet1073", + "ParticipationOnly": false + }, + { + "Name": "Wallet1074", + "ParticipationOnly": false + }, + { + "Name": "Wallet1075", + "ParticipationOnly": false + }, + { + "Name": "Wallet1076", + "ParticipationOnly": false + }, + { + "Name": "Wallet1077", + "ParticipationOnly": false + }, + { + "Name": "Wallet1078", + "ParticipationOnly": false + }, + { + "Name": "Wallet1079", + "ParticipationOnly": false + }, + { + "Name": "Wallet1080", + "ParticipationOnly": false + }, + { + "Name": "Wallet1081", + "ParticipationOnly": false + }, + { + "Name": "Wallet1082", + "ParticipationOnly": false + }, + { + "Name": "Wallet1083", + "ParticipationOnly": false + }, + { + "Name": "Wallet1084", + "ParticipationOnly": false + }, + { + "Name": "Wallet1085", + "ParticipationOnly": false + }, + { + "Name": "Wallet1086", + "ParticipationOnly": false + }, + { + "Name": "Wallet1087", + "ParticipationOnly": false + }, + { + "Name": "Wallet1088", + "ParticipationOnly": false + }, + { + "Name": "Wallet1089", + "ParticipationOnly": false + }, + { + "Name": "Wallet1090", + "ParticipationOnly": false + }, + { + "Name": "Wallet1091", + "ParticipationOnly": false + }, + { + "Name": "Wallet1092", + "ParticipationOnly": false + }, + { + "Name": "Wallet1093", + "ParticipationOnly": false + }, + { + "Name": "Wallet1094", + "ParticipationOnly": false + }, + { + "Name": "Wallet1095", + "ParticipationOnly": false + }, + { + "Name": "Wallet1096", + "ParticipationOnly": false + }, + { + "Name": "Wallet1097", + "ParticipationOnly": false + }, + { + "Name": "Wallet1098", + "ParticipationOnly": false + }, + { + "Name": "Wallet1099", + "ParticipationOnly": false + }, + { + "Name": "Wallet1100", + "ParticipationOnly": false + }, + { + "Name": "Wallet1101", + "ParticipationOnly": false + }, + { + "Name": "Wallet1102", + "ParticipationOnly": false + }, + { + "Name": "Wallet1103", + "ParticipationOnly": false + }, + { + "Name": "Wallet1104", + "ParticipationOnly": false + }, + { + "Name": "Wallet1105", + "ParticipationOnly": false + }, + { + "Name": "Wallet1106", + "ParticipationOnly": false + }, + { + "Name": "Wallet1107", + "ParticipationOnly": false + }, + { + "Name": "Wallet1108", + "ParticipationOnly": false + }, + { + "Name": "Wallet1109", + "ParticipationOnly": false + }, + { + "Name": "Wallet1110", + "ParticipationOnly": false + }, + { + "Name": "Wallet1111", + "ParticipationOnly": false + }, + { + "Name": "Wallet1112", + "ParticipationOnly": false + }, + { + "Name": "Wallet1113", + "ParticipationOnly": false + }, + { + "Name": "Wallet1114", + "ParticipationOnly": false + }, + { + "Name": "Wallet1115", + "ParticipationOnly": false + }, + { + "Name": "Wallet1116", + "ParticipationOnly": false + }, + { + "Name": "Wallet1117", + "ParticipationOnly": false + }, + { + "Name": "Wallet1118", + "ParticipationOnly": false + }, + { + "Name": "Wallet1119", + "ParticipationOnly": false + }, + { + "Name": "Wallet1120", + "ParticipationOnly": false + }, + { + "Name": "Wallet1121", + "ParticipationOnly": false + }, + { + "Name": "Wallet1122", + "ParticipationOnly": false + }, + { + "Name": "Wallet1123", + "ParticipationOnly": false + }, + { + "Name": "Wallet1124", + "ParticipationOnly": false + }, + { + "Name": "Wallet1125", + "ParticipationOnly": false + }, + { + "Name": "Wallet1126", + "ParticipationOnly": false + }, + { + "Name": "Wallet1127", + "ParticipationOnly": false + }, + { + "Name": "Wallet1128", + "ParticipationOnly": false + }, + { + "Name": "Wallet1129", + "ParticipationOnly": false + }, + { + "Name": "Wallet1130", + "ParticipationOnly": false + }, + { + "Name": "Wallet1131", + "ParticipationOnly": false + }, + { + "Name": "Wallet1132", + "ParticipationOnly": false + }, + { + "Name": "Wallet1133", + "ParticipationOnly": false + }, + { + "Name": "Wallet1134", + "ParticipationOnly": false + }, + { + "Name": "Wallet1135", + "ParticipationOnly": false + }, + { + "Name": "Wallet1136", + "ParticipationOnly": false + }, + { + "Name": "Wallet1137", + "ParticipationOnly": false + }, + { + "Name": "Wallet1138", + "ParticipationOnly": false + }, + { + "Name": "Wallet1139", + "ParticipationOnly": false + }, + { + "Name": "Wallet1140", + "ParticipationOnly": false + }, + { + "Name": "Wallet1141", + "ParticipationOnly": false + }, + { + "Name": "Wallet1142", + "ParticipationOnly": false + }, + { + "Name": "Wallet1143", + "ParticipationOnly": false + }, + { + "Name": "Wallet1144", + "ParticipationOnly": false + }, + { + "Name": "Wallet1145", + "ParticipationOnly": false + }, + { + "Name": "Wallet1146", + "ParticipationOnly": false + }, + { + "Name": "Wallet1147", + "ParticipationOnly": false + }, + { + "Name": "Wallet1148", + "ParticipationOnly": false + }, + { + "Name": "Wallet1149", + "ParticipationOnly": false + }, + { + "Name": "Wallet1150", + "ParticipationOnly": false + }, + { + "Name": "Wallet1151", + "ParticipationOnly": false + }, + { + "Name": "Wallet1152", + "ParticipationOnly": false + }, + { + "Name": "Wallet1153", + "ParticipationOnly": false + }, + { + "Name": "Wallet1154", + "ParticipationOnly": false + }, + { + "Name": "Wallet1155", + "ParticipationOnly": false + }, + { + "Name": "Wallet1156", + "ParticipationOnly": false + }, + { + "Name": "Wallet1157", + "ParticipationOnly": false + }, + { + "Name": "Wallet1158", + "ParticipationOnly": false + }, + { + "Name": "Wallet1159", + "ParticipationOnly": false + }, + { + "Name": "Wallet1160", + "ParticipationOnly": false + }, + { + "Name": "Wallet1161", + "ParticipationOnly": false + }, + { + "Name": "Wallet1162", + "ParticipationOnly": false + }, + { + "Name": "Wallet1163", + "ParticipationOnly": false + }, + { + "Name": "Wallet1164", + "ParticipationOnly": false + }, + { + "Name": "Wallet1165", + "ParticipationOnly": false + }, + { + "Name": "Wallet1166", + "ParticipationOnly": false + }, + { + "Name": "Wallet1167", + "ParticipationOnly": false + }, + { + "Name": "Wallet1168", + "ParticipationOnly": false + }, + { + "Name": "Wallet1169", + "ParticipationOnly": false + }, + { + "Name": "Wallet1170", + "ParticipationOnly": false + }, + { + "Name": "Wallet1171", + "ParticipationOnly": false + }, + { + "Name": "Wallet1172", + "ParticipationOnly": false + }, + { + "Name": "Wallet1173", + "ParticipationOnly": false + }, + { + "Name": "Wallet1174", + "ParticipationOnly": false + }, + { + "Name": "Wallet1175", + "ParticipationOnly": false + }, + { + "Name": "Wallet1176", + "ParticipationOnly": false + }, + { + "Name": "Wallet1177", + "ParticipationOnly": false + }, + { + "Name": "Wallet1178", + "ParticipationOnly": false + }, + { + "Name": "Wallet1179", + "ParticipationOnly": false + }, + { + "Name": "Wallet1180", + "ParticipationOnly": false + }, + { + "Name": "Wallet1181", + "ParticipationOnly": false + }, + { + "Name": "Wallet1182", + "ParticipationOnly": false + }, + { + "Name": "Wallet1183", + "ParticipationOnly": false + }, + { + "Name": "Wallet1184", + "ParticipationOnly": false + }, + { + "Name": "Wallet1185", + "ParticipationOnly": false + }, + { + "Name": "Wallet1186", + "ParticipationOnly": false + }, + { + "Name": "Wallet1187", + "ParticipationOnly": false + }, + { + "Name": "Wallet1188", + "ParticipationOnly": false + }, + { + "Name": "Wallet1189", + "ParticipationOnly": false + }, + { + "Name": "Wallet1190", + "ParticipationOnly": false + }, + { + "Name": "Wallet1191", + "ParticipationOnly": false + }, + { + "Name": "Wallet1192", + "ParticipationOnly": false + }, + { + "Name": "Wallet1193", + "ParticipationOnly": false + }, + { + "Name": "Wallet1194", + "ParticipationOnly": false + }, + { + "Name": "Wallet1195", + "ParticipationOnly": false + }, + { + "Name": "Wallet1196", + "ParticipationOnly": false + }, + { + "Name": "Wallet1197", + "ParticipationOnly": false + }, + { + "Name": "Wallet1198", + "ParticipationOnly": false + }, + { + "Name": "Wallet1199", + "ParticipationOnly": false + }, + { + "Name": "Wallet1200", + "ParticipationOnly": false + }, + { + "Name": "Wallet1201", + "ParticipationOnly": false + }, + { + "Name": "Wallet1202", + "ParticipationOnly": false + }, + { + "Name": "Wallet1203", + "ParticipationOnly": false + }, + { + "Name": "Wallet1204", + "ParticipationOnly": false + }, + { + "Name": "Wallet1205", + "ParticipationOnly": false + }, + { + "Name": "Wallet1206", + "ParticipationOnly": false + }, + { + "Name": "Wallet1207", + "ParticipationOnly": false + }, + { + "Name": "Wallet1208", + "ParticipationOnly": false + }, + { + "Name": "Wallet1209", + "ParticipationOnly": false + }, + { + "Name": "Wallet1210", + "ParticipationOnly": false + }, + { + "Name": "Wallet1211", + "ParticipationOnly": false + }, + { + "Name": "Wallet1212", + "ParticipationOnly": false + }, + { + "Name": "Wallet1213", + "ParticipationOnly": false + }, + { + "Name": "Wallet1214", + "ParticipationOnly": false + }, + { + "Name": "Wallet1215", + "ParticipationOnly": false + }, + { + "Name": "Wallet1216", + "ParticipationOnly": false + }, + { + "Name": "Wallet1217", + "ParticipationOnly": false + }, + { + "Name": "Wallet1218", + "ParticipationOnly": false + }, + { + "Name": "Wallet1219", + "ParticipationOnly": false + }, + { + "Name": "Wallet1220", + "ParticipationOnly": false + }, + { + "Name": "Wallet1221", + "ParticipationOnly": false + }, + { + "Name": "Wallet1222", + "ParticipationOnly": false + }, + { + "Name": "Wallet1223", + "ParticipationOnly": false + }, + { + "Name": "Wallet1224", + "ParticipationOnly": false + }, + { + "Name": "Wallet1225", + "ParticipationOnly": false + }, + { + "Name": "Wallet1226", + "ParticipationOnly": false + }, + { + "Name": "Wallet1227", + "ParticipationOnly": false + }, + { + "Name": "Wallet1228", + "ParticipationOnly": false + }, + { + "Name": "Wallet1229", + "ParticipationOnly": false + }, + { + "Name": "Wallet1230", + "ParticipationOnly": false + }, + { + "Name": "Wallet1231", + "ParticipationOnly": false + }, + { + "Name": "Wallet1232", + "ParticipationOnly": false + }, + { + "Name": "Wallet1233", + "ParticipationOnly": false + }, + { + "Name": "Wallet1234", + "ParticipationOnly": false + }, + { + "Name": "Wallet1235", + "ParticipationOnly": false + }, + { + "Name": "Wallet1236", + "ParticipationOnly": false + }, + { + "Name": "Wallet1237", + "ParticipationOnly": false + }, + { + "Name": "Wallet1238", + "ParticipationOnly": false + }, + { + "Name": "Wallet1239", + "ParticipationOnly": false + }, + { + "Name": "Wallet1240", + "ParticipationOnly": false + }, + { + "Name": "Wallet1241", + "ParticipationOnly": false + }, + { + "Name": "Wallet1242", + "ParticipationOnly": false + }, + { + "Name": "Wallet1243", + "ParticipationOnly": false + }, + { + "Name": "Wallet1244", + "ParticipationOnly": false + }, + { + "Name": "Wallet1245", + "ParticipationOnly": false + }, + { + "Name": "Wallet1246", + "ParticipationOnly": false + }, + { + "Name": "Wallet1247", + "ParticipationOnly": false + }, + { + "Name": "Wallet1248", + "ParticipationOnly": false + }, + { + "Name": "Wallet1249", + "ParticipationOnly": false + }, + { + "Name": "Wallet1250", + "ParticipationOnly": false + }, + { + "Name": "Wallet1251", + "ParticipationOnly": false + }, + { + "Name": "Wallet1252", + "ParticipationOnly": false + }, + { + "Name": "Wallet1253", + "ParticipationOnly": false + }, + { + "Name": "Wallet1254", + "ParticipationOnly": false + }, + { + "Name": "Wallet1255", + "ParticipationOnly": false + }, + { + "Name": "Wallet1256", + "ParticipationOnly": false + }, + { + "Name": "Wallet1257", + "ParticipationOnly": false + }, + { + "Name": "Wallet1258", + "ParticipationOnly": false + }, + { + "Name": "Wallet1259", + "ParticipationOnly": false + }, + { + "Name": "Wallet1260", + "ParticipationOnly": false + }, + { + "Name": "Wallet1261", + "ParticipationOnly": false + }, + { + "Name": "Wallet1262", + "ParticipationOnly": false + }, + { + "Name": "Wallet1263", + "ParticipationOnly": false + }, + { + "Name": "Wallet1264", + "ParticipationOnly": false + }, + { + "Name": "Wallet1265", + "ParticipationOnly": false + }, + { + "Name": "Wallet1266", + "ParticipationOnly": false + }, + { + "Name": "Wallet1267", + "ParticipationOnly": false + }, + { + "Name": "Wallet1268", + "ParticipationOnly": false + }, + { + "Name": "Wallet1269", + "ParticipationOnly": false + }, + { + "Name": "Wallet1270", + "ParticipationOnly": false + }, + { + "Name": "Wallet1271", + "ParticipationOnly": false + }, + { + "Name": "Wallet1272", + "ParticipationOnly": false + }, + { + "Name": "Wallet1273", + "ParticipationOnly": false + }, + { + "Name": "Wallet1274", + "ParticipationOnly": false + }, + { + "Name": "Wallet1275", + "ParticipationOnly": false + }, + { + "Name": "Wallet1276", + "ParticipationOnly": false + }, + { + "Name": "Wallet1277", + "ParticipationOnly": false + }, + { + "Name": "Wallet1278", + "ParticipationOnly": false + }, + { + "Name": "Wallet1279", + "ParticipationOnly": false + }, + { + "Name": "Wallet1280", + "ParticipationOnly": false + }, + { + "Name": "Wallet1281", + "ParticipationOnly": false + }, + { + "Name": "Wallet1282", + "ParticipationOnly": false + }, + { + "Name": "Wallet1283", + "ParticipationOnly": false + }, + { + "Name": "Wallet1284", + "ParticipationOnly": false + }, + { + "Name": "Wallet1285", + "ParticipationOnly": false + }, + { + "Name": "Wallet1286", + "ParticipationOnly": false + }, + { + "Name": "Wallet1287", + "ParticipationOnly": false + }, + { + "Name": "Wallet1288", + "ParticipationOnly": false + }, + { + "Name": "Wallet1289", + "ParticipationOnly": false + }, + { + "Name": "Wallet1290", + "ParticipationOnly": false + }, + { + "Name": "Wallet1291", + "ParticipationOnly": false + }, + { + "Name": "Wallet1292", + "ParticipationOnly": false + }, + { + "Name": "Wallet1293", + "ParticipationOnly": false + }, + { + "Name": "Wallet1294", + "ParticipationOnly": false + }, + { + "Name": "Wallet1295", + "ParticipationOnly": false + }, + { + "Name": "Wallet1296", + "ParticipationOnly": false + }, + { + "Name": "Wallet1297", + "ParticipationOnly": false + }, + { + "Name": "Wallet1298", + "ParticipationOnly": false + }, + { + "Name": "Wallet1299", + "ParticipationOnly": false + }, + { + "Name": "Wallet1300", + "ParticipationOnly": false + }, + { + "Name": "Wallet1301", + "ParticipationOnly": false + }, + { + "Name": "Wallet1302", + "ParticipationOnly": false + }, + { + "Name": "Wallet1303", + "ParticipationOnly": false + }, + { + "Name": "Wallet1304", + "ParticipationOnly": false + }, + { + "Name": "Wallet1305", + "ParticipationOnly": false + }, + { + "Name": "Wallet1306", + "ParticipationOnly": false + }, + { + "Name": "Wallet1307", + "ParticipationOnly": false + }, + { + "Name": "Wallet1308", + "ParticipationOnly": false + }, + { + "Name": "Wallet1309", + "ParticipationOnly": false + }, + { + "Name": "Wallet1310", + "ParticipationOnly": false + }, + { + "Name": "Wallet1311", + "ParticipationOnly": false + }, + { + "Name": "Wallet1312", + "ParticipationOnly": false + }, + { + "Name": "Wallet1313", + "ParticipationOnly": false + }, + { + "Name": "Wallet1314", + "ParticipationOnly": false + }, + { + "Name": "Wallet1315", + "ParticipationOnly": false + }, + { + "Name": "Wallet1316", + "ParticipationOnly": false + }, + { + "Name": "Wallet1317", + "ParticipationOnly": false + }, + { + "Name": "Wallet1318", + "ParticipationOnly": false + }, + { + "Name": "Wallet1319", + "ParticipationOnly": false + }, + { + "Name": "Wallet1320", + "ParticipationOnly": false + }, + { + "Name": "Wallet1321", + "ParticipationOnly": false + }, + { + "Name": "Wallet1322", + "ParticipationOnly": false + }, + { + "Name": "Wallet1323", + "ParticipationOnly": false + }, + { + "Name": "Wallet1324", + "ParticipationOnly": false + }, + { + "Name": "Wallet1325", + "ParticipationOnly": false + }, + { + "Name": "Wallet1326", + "ParticipationOnly": false + }, + { + "Name": "Wallet1327", + "ParticipationOnly": false + }, + { + "Name": "Wallet1328", + "ParticipationOnly": false + }, + { + "Name": "Wallet1329", + "ParticipationOnly": false + }, + { + "Name": "Wallet1330", + "ParticipationOnly": false + }, + { + "Name": "Wallet1331", + "ParticipationOnly": false + }, + { + "Name": "Wallet1332", + "ParticipationOnly": false + }, + { + "Name": "Wallet1333", + "ParticipationOnly": false + }, + { + "Name": "Wallet1334", + "ParticipationOnly": false + }, + { + "Name": "Wallet1335", + "ParticipationOnly": false + }, + { + "Name": "Wallet1336", + "ParticipationOnly": false + }, + { + "Name": "Wallet1337", + "ParticipationOnly": false + }, + { + "Name": "Wallet1338", + "ParticipationOnly": false + }, + { + "Name": "Wallet1339", + "ParticipationOnly": false + }, + { + "Name": "Wallet1340", + "ParticipationOnly": false + }, + { + "Name": "Wallet1341", + "ParticipationOnly": false + }, + { + "Name": "Wallet1342", + "ParticipationOnly": false + }, + { + "Name": "Wallet1343", + "ParticipationOnly": false + }, + { + "Name": "Wallet1344", + "ParticipationOnly": false + }, + { + "Name": "Wallet1345", + "ParticipationOnly": false + }, + { + "Name": "Wallet1346", + "ParticipationOnly": false + }, + { + "Name": "Wallet1347", + "ParticipationOnly": false + }, + { + "Name": "Wallet1348", + "ParticipationOnly": false + }, + { + "Name": "Wallet1349", + "ParticipationOnly": false + }, + { + "Name": "Wallet1350", + "ParticipationOnly": false + }, + { + "Name": "Wallet1351", + "ParticipationOnly": false + }, + { + "Name": "Wallet1352", + "ParticipationOnly": false + }, + { + "Name": "Wallet1353", + "ParticipationOnly": false + }, + { + "Name": "Wallet1354", + "ParticipationOnly": false + }, + { + "Name": "Wallet1355", + "ParticipationOnly": false + }, + { + "Name": "Wallet1356", + "ParticipationOnly": false + }, + { + "Name": "Wallet1357", + "ParticipationOnly": false + }, + { + "Name": "Wallet1358", + "ParticipationOnly": false + }, + { + "Name": "Wallet1359", + "ParticipationOnly": false + }, + { + "Name": "Wallet1360", + "ParticipationOnly": false + }, + { + "Name": "Wallet1361", + "ParticipationOnly": false + }, + { + "Name": "Wallet1362", + "ParticipationOnly": false + }, + { + "Name": "Wallet1363", + "ParticipationOnly": false + }, + { + "Name": "Wallet1364", + "ParticipationOnly": false + }, + { + "Name": "Wallet1365", + "ParticipationOnly": false + }, + { + "Name": "Wallet1366", + "ParticipationOnly": false + }, + { + "Name": "Wallet1367", + "ParticipationOnly": false + }, + { + "Name": "Wallet1368", + "ParticipationOnly": false + }, + { + "Name": "Wallet1369", + "ParticipationOnly": false + }, + { + "Name": "Wallet1370", + "ParticipationOnly": false + }, + { + "Name": "Wallet1371", + "ParticipationOnly": false + }, + { + "Name": "Wallet1372", + "ParticipationOnly": false + }, + { + "Name": "Wallet1373", + "ParticipationOnly": false + }, + { + "Name": "Wallet1374", + "ParticipationOnly": false + }, + { + "Name": "Wallet1375", + "ParticipationOnly": false + }, + { + "Name": "Wallet1376", + "ParticipationOnly": false + }, + { + "Name": "Wallet1377", + "ParticipationOnly": false + }, + { + "Name": "Wallet1378", + "ParticipationOnly": false + }, + { + "Name": "Wallet1379", + "ParticipationOnly": false + }, + { + "Name": "Wallet1380", + "ParticipationOnly": false + }, + { + "Name": "Wallet1381", + "ParticipationOnly": false + }, + { + "Name": "Wallet1382", + "ParticipationOnly": false + }, + { + "Name": "Wallet1383", + "ParticipationOnly": false + }, + { + "Name": "Wallet1384", + "ParticipationOnly": false + }, + { + "Name": "Wallet1385", + "ParticipationOnly": false + }, + { + "Name": "Wallet1386", + "ParticipationOnly": false + }, + { + "Name": "Wallet1387", + "ParticipationOnly": false + }, + { + "Name": "Wallet1388", + "ParticipationOnly": false + }, + { + "Name": "Wallet1389", + "ParticipationOnly": false + }, + { + "Name": "Wallet1390", + "ParticipationOnly": false + }, + { + "Name": "Wallet1391", + "ParticipationOnly": false + }, + { + "Name": "Wallet1392", + "ParticipationOnly": false + }, + { + "Name": "Wallet1393", + "ParticipationOnly": false + }, + { + "Name": "Wallet1394", + "ParticipationOnly": false + }, + { + "Name": "Wallet1395", + "ParticipationOnly": false + }, + { + "Name": "Wallet1396", + "ParticipationOnly": false + }, + { + "Name": "Wallet1397", + "ParticipationOnly": false + }, + { + "Name": "Wallet1398", + "ParticipationOnly": false + }, + { + "Name": "Wallet1399", + "ParticipationOnly": false + }, + { + "Name": "Wallet1400", + "ParticipationOnly": false + }, + { + "Name": "Wallet1401", + "ParticipationOnly": false + }, + { + "Name": "Wallet1402", + "ParticipationOnly": false + }, + { + "Name": "Wallet1403", + "ParticipationOnly": false + }, + { + "Name": "Wallet1404", + "ParticipationOnly": false + }, + { + "Name": "Wallet1405", + "ParticipationOnly": false + }, + { + "Name": "Wallet1406", + "ParticipationOnly": false + }, + { + "Name": "Wallet1407", + "ParticipationOnly": false + }, + { + "Name": "Wallet1408", + "ParticipationOnly": false + }, + { + "Name": "Wallet1409", + "ParticipationOnly": false + }, + { + "Name": "Wallet1410", + "ParticipationOnly": false + }, + { + "Name": "Wallet1411", + "ParticipationOnly": false + }, + { + "Name": "Wallet1412", + "ParticipationOnly": false + }, + { + "Name": "Wallet1413", + "ParticipationOnly": false + }, + { + "Name": "Wallet1414", + "ParticipationOnly": false + }, + { + "Name": "Wallet1415", + "ParticipationOnly": false + }, + { + "Name": "Wallet1416", + "ParticipationOnly": false + }, + { + "Name": "Wallet1417", + "ParticipationOnly": false + }, + { + "Name": "Wallet1418", + "ParticipationOnly": false + }, + { + "Name": "Wallet1419", + "ParticipationOnly": false + }, + { + "Name": "Wallet1420", + "ParticipationOnly": false + }, + { + "Name": "Wallet1421", + "ParticipationOnly": false + }, + { + "Name": "Wallet1422", + "ParticipationOnly": false + }, + { + "Name": "Wallet1423", + "ParticipationOnly": false + }, + { + "Name": "Wallet1424", + "ParticipationOnly": false + }, + { + "Name": "Wallet1425", + "ParticipationOnly": false + }, + { + "Name": "Wallet1426", + "ParticipationOnly": false + }, + { + "Name": "Wallet1427", + "ParticipationOnly": false + }, + { + "Name": "Wallet1428", + "ParticipationOnly": false + }, + { + "Name": "Wallet1429", + "ParticipationOnly": false + }, + { + "Name": "Wallet1430", + "ParticipationOnly": false + }, + { + "Name": "Wallet1431", + "ParticipationOnly": false + }, + { + "Name": "Wallet1432", + "ParticipationOnly": false + }, + { + "Name": "Wallet1433", + "ParticipationOnly": false + }, + { + "Name": "Wallet1434", + "ParticipationOnly": false + }, + { + "Name": "Wallet1435", + "ParticipationOnly": false + }, + { + "Name": "Wallet1436", + "ParticipationOnly": false + }, + { + "Name": "Wallet1437", + "ParticipationOnly": false + }, + { + "Name": "Wallet1438", + "ParticipationOnly": false + }, + { + "Name": "Wallet1439", + "ParticipationOnly": false + }, + { + "Name": "Wallet1440", + "ParticipationOnly": false + }, + { + "Name": "Wallet1441", + "ParticipationOnly": false + }, + { + "Name": "Wallet1442", + "ParticipationOnly": false + }, + { + "Name": "Wallet1443", + "ParticipationOnly": false + }, + { + "Name": "Wallet1444", + "ParticipationOnly": false + }, + { + "Name": "Wallet1445", + "ParticipationOnly": false + }, + { + "Name": "Wallet1446", + "ParticipationOnly": false + }, + { + "Name": "Wallet1447", + "ParticipationOnly": false + }, + { + "Name": "Wallet1448", + "ParticipationOnly": false + }, + { + "Name": "Wallet1449", + "ParticipationOnly": false + }, + { + "Name": "Wallet1450", + "ParticipationOnly": false + }, + { + "Name": "Wallet1451", + "ParticipationOnly": false + }, + { + "Name": "Wallet1452", + "ParticipationOnly": false + }, + { + "Name": "Wallet1453", + "ParticipationOnly": false + }, + { + "Name": "Wallet1454", + "ParticipationOnly": false + }, + { + "Name": "Wallet1455", + "ParticipationOnly": false + }, + { + "Name": "Wallet1456", + "ParticipationOnly": false + }, + { + "Name": "Wallet1457", + "ParticipationOnly": false + }, + { + "Name": "Wallet1458", + "ParticipationOnly": false + }, + { + "Name": "Wallet1459", + "ParticipationOnly": false + }, + { + "Name": "Wallet1460", + "ParticipationOnly": false + }, + { + "Name": "Wallet1461", + "ParticipationOnly": false + }, + { + "Name": "Wallet1462", + "ParticipationOnly": false + }, + { + "Name": "Wallet1463", + "ParticipationOnly": false + }, + { + "Name": "Wallet1464", + "ParticipationOnly": false + }, + { + "Name": "Wallet1465", + "ParticipationOnly": false + }, + { + "Name": "Wallet1466", + "ParticipationOnly": false + }, + { + "Name": "Wallet1467", + "ParticipationOnly": false + }, + { + "Name": "Wallet1468", + "ParticipationOnly": false + }, + { + "Name": "Wallet1469", + "ParticipationOnly": false + }, + { + "Name": "Wallet1470", + "ParticipationOnly": false + }, + { + "Name": "Wallet1471", + "ParticipationOnly": false + }, + { + "Name": "Wallet1472", + "ParticipationOnly": false + }, + { + "Name": "Wallet1473", + "ParticipationOnly": false + }, + { + "Name": "Wallet1474", + "ParticipationOnly": false + }, + { + "Name": "Wallet1475", + "ParticipationOnly": false + }, + { + "Name": "Wallet1476", + "ParticipationOnly": false + }, + { + "Name": "Wallet1477", + "ParticipationOnly": false + }, + { + "Name": "Wallet1478", + "ParticipationOnly": false + }, + { + "Name": "Wallet1479", + "ParticipationOnly": false + }, + { + "Name": "Wallet1480", + "ParticipationOnly": false + }, + { + "Name": "Wallet1481", + "ParticipationOnly": false + }, + { + "Name": "Wallet1482", + "ParticipationOnly": false + }, + { + "Name": "Wallet1483", + "ParticipationOnly": false + }, + { + "Name": "Wallet1484", + "ParticipationOnly": false + }, + { + "Name": "Wallet1485", + "ParticipationOnly": false + }, + { + "Name": "Wallet1486", + "ParticipationOnly": false + }, + { + "Name": "Wallet1487", + "ParticipationOnly": false + }, + { + "Name": "Wallet1488", + "ParticipationOnly": false + }, + { + "Name": "Wallet1489", + "ParticipationOnly": false + }, + { + "Name": "Wallet1490", + "ParticipationOnly": false + }, + { + "Name": "Wallet1491", + "ParticipationOnly": false + }, + { + "Name": "Wallet1492", + "ParticipationOnly": false + }, + { + "Name": "Wallet1493", + "ParticipationOnly": false + }, + { + "Name": "Wallet1494", + "ParticipationOnly": false + }, + { + "Name": "Wallet1495", + "ParticipationOnly": false + }, + { + "Name": "Wallet1496", + "ParticipationOnly": false + }, + { + "Name": "Wallet1497", + "ParticipationOnly": false + }, + { + "Name": "Wallet1498", + "ParticipationOnly": false + }, + { + "Name": "Wallet1499", + "ParticipationOnly": false + }, + { + "Name": "Wallet1500", + "ParticipationOnly": false + }, + { + "Name": "Wallet1501", + "ParticipationOnly": false + }, + { + "Name": "Wallet1502", + "ParticipationOnly": false + }, + { + "Name": "Wallet1503", + "ParticipationOnly": false + }, + { + "Name": "Wallet1504", + "ParticipationOnly": false + }, + { + "Name": "Wallet1505", + "ParticipationOnly": false + }, + { + "Name": "Wallet1506", + "ParticipationOnly": false + }, + { + "Name": "Wallet1507", + "ParticipationOnly": false + }, + { + "Name": "Wallet1508", + "ParticipationOnly": false + }, + { + "Name": "Wallet1509", + "ParticipationOnly": false + }, + { + "Name": "Wallet1510", + "ParticipationOnly": false + }, + { + "Name": "Wallet1511", + "ParticipationOnly": false + }, + { + "Name": "Wallet1512", + "ParticipationOnly": false + }, + { + "Name": "Wallet1513", + "ParticipationOnly": false + }, + { + "Name": "Wallet1514", + "ParticipationOnly": false + }, + { + "Name": "Wallet1515", + "ParticipationOnly": false + }, + { + "Name": "Wallet1516", + "ParticipationOnly": false + }, + { + "Name": "Wallet1517", + "ParticipationOnly": false + }, + { + "Name": "Wallet1518", + "ParticipationOnly": false + }, + { + "Name": "Wallet1519", + "ParticipationOnly": false + }, + { + "Name": "Wallet1520", + "ParticipationOnly": false + }, + { + "Name": "Wallet1521", + "ParticipationOnly": false + }, + { + "Name": "Wallet1522", + "ParticipationOnly": false + }, + { + "Name": "Wallet1523", + "ParticipationOnly": false + }, + { + "Name": "Wallet1524", + "ParticipationOnly": false + }, + { + "Name": "Wallet1525", + "ParticipationOnly": false + }, + { + "Name": "Wallet1526", + "ParticipationOnly": false + }, + { + "Name": "Wallet1527", + "ParticipationOnly": false + }, + { + "Name": "Wallet1528", + "ParticipationOnly": false + }, + { + "Name": "Wallet1529", + "ParticipationOnly": false + }, + { + "Name": "Wallet1530", + "ParticipationOnly": false + }, + { + "Name": "Wallet1531", + "ParticipationOnly": false + }, + { + "Name": "Wallet1532", + "ParticipationOnly": false + }, + { + "Name": "Wallet1533", + "ParticipationOnly": false + }, + { + "Name": "Wallet1534", + "ParticipationOnly": false + }, + { + "Name": "Wallet1535", + "ParticipationOnly": false + }, + { + "Name": "Wallet1536", + "ParticipationOnly": false + }, + { + "Name": "Wallet1537", + "ParticipationOnly": false + }, + { + "Name": "Wallet1538", + "ParticipationOnly": false + }, + { + "Name": "Wallet1539", + "ParticipationOnly": false + }, + { + "Name": "Wallet1540", + "ParticipationOnly": false + }, + { + "Name": "Wallet1541", + "ParticipationOnly": false + }, + { + "Name": "Wallet1542", + "ParticipationOnly": false + }, + { + "Name": "Wallet1543", + "ParticipationOnly": false + }, + { + "Name": "Wallet1544", + "ParticipationOnly": false + }, + { + "Name": "Wallet1545", + "ParticipationOnly": false + }, + { + "Name": "Wallet1546", + "ParticipationOnly": false + }, + { + "Name": "Wallet1547", + "ParticipationOnly": false + }, + { + "Name": "Wallet1548", + "ParticipationOnly": false + }, + { + "Name": "Wallet1549", + "ParticipationOnly": false + }, + { + "Name": "Wallet1550", + "ParticipationOnly": false + }, + { + "Name": "Wallet1551", + "ParticipationOnly": false + }, + { + "Name": "Wallet1552", + "ParticipationOnly": false + }, + { + "Name": "Wallet1553", + "ParticipationOnly": false + }, + { + "Name": "Wallet1554", + "ParticipationOnly": false + }, + { + "Name": "Wallet1555", + "ParticipationOnly": false + }, + { + "Name": "Wallet1556", + "ParticipationOnly": false + }, + { + "Name": "Wallet1557", + "ParticipationOnly": false + }, + { + "Name": "Wallet1558", + "ParticipationOnly": false + }, + { + "Name": "Wallet1559", + "ParticipationOnly": false + }, + { + "Name": "Wallet1560", + "ParticipationOnly": false + }, + { + "Name": "Wallet1561", + "ParticipationOnly": false + }, + { + "Name": "Wallet1562", + "ParticipationOnly": false + }, + { + "Name": "Wallet1563", + "ParticipationOnly": false + }, + { + "Name": "Wallet1564", + "ParticipationOnly": false + }, + { + "Name": "Wallet1565", + "ParticipationOnly": false + }, + { + "Name": "Wallet1566", + "ParticipationOnly": false + }, + { + "Name": "Wallet1567", + "ParticipationOnly": false + }, + { + "Name": "Wallet1568", + "ParticipationOnly": false + }, + { + "Name": "Wallet1569", + "ParticipationOnly": false + }, + { + "Name": "Wallet1570", + "ParticipationOnly": false + }, + { + "Name": "Wallet1571", + "ParticipationOnly": false + }, + { + "Name": "Wallet1572", + "ParticipationOnly": false + }, + { + "Name": "Wallet1573", + "ParticipationOnly": false + }, + { + "Name": "Wallet1574", + "ParticipationOnly": false + }, + { + "Name": "Wallet1575", + "ParticipationOnly": false + }, + { + "Name": "Wallet1576", + "ParticipationOnly": false + }, + { + "Name": "Wallet1577", + "ParticipationOnly": false + }, + { + "Name": "Wallet1578", + "ParticipationOnly": false + }, + { + "Name": "Wallet1579", + "ParticipationOnly": false + }, + { + "Name": "Wallet1580", + "ParticipationOnly": false + }, + { + "Name": "Wallet1581", + "ParticipationOnly": false + }, + { + "Name": "Wallet1582", + "ParticipationOnly": false + }, + { + "Name": "Wallet1583", + "ParticipationOnly": false + }, + { + "Name": "Wallet1584", + "ParticipationOnly": false + }, + { + "Name": "Wallet1585", + "ParticipationOnly": false + }, + { + "Name": "Wallet1586", + "ParticipationOnly": false + }, + { + "Name": "Wallet1587", + "ParticipationOnly": false + }, + { + "Name": "Wallet1588", + "ParticipationOnly": false + }, + { + "Name": "Wallet1589", + "ParticipationOnly": false + }, + { + "Name": "Wallet1590", + "ParticipationOnly": false + }, + { + "Name": "Wallet1591", + "ParticipationOnly": false + }, + { + "Name": "Wallet1592", + "ParticipationOnly": false + }, + { + "Name": "Wallet1593", + "ParticipationOnly": false + }, + { + "Name": "Wallet1594", + "ParticipationOnly": false + }, + { + "Name": "Wallet1595", + "ParticipationOnly": false + }, + { + "Name": "Wallet1596", + "ParticipationOnly": false + }, + { + "Name": "Wallet1597", + "ParticipationOnly": false + }, + { + "Name": "Wallet1598", + "ParticipationOnly": false + }, + { + "Name": "Wallet1599", + "ParticipationOnly": false + }, + { + "Name": "Wallet1600", + "ParticipationOnly": false + }, + { + "Name": "Wallet1601", + "ParticipationOnly": false + }, + { + "Name": "Wallet1602", + "ParticipationOnly": false + }, + { + "Name": "Wallet1603", + "ParticipationOnly": false + }, + { + "Name": "Wallet1604", + "ParticipationOnly": false + }, + { + "Name": "Wallet1605", + "ParticipationOnly": false + }, + { + "Name": "Wallet1606", + "ParticipationOnly": false + }, + { + "Name": "Wallet1607", + "ParticipationOnly": false + }, + { + "Name": "Wallet1608", + "ParticipationOnly": false + }, + { + "Name": "Wallet1609", + "ParticipationOnly": false + }, + { + "Name": "Wallet1610", + "ParticipationOnly": false + }, + { + "Name": "Wallet1611", + "ParticipationOnly": false + }, + { + "Name": "Wallet1612", + "ParticipationOnly": false + }, + { + "Name": "Wallet1613", + "ParticipationOnly": false + }, + { + "Name": "Wallet1614", + "ParticipationOnly": false + }, + { + "Name": "Wallet1615", + "ParticipationOnly": false + }, + { + "Name": "Wallet1616", + "ParticipationOnly": false + }, + { + "Name": "Wallet1617", + "ParticipationOnly": false + }, + { + "Name": "Wallet1618", + "ParticipationOnly": false + }, + { + "Name": "Wallet1619", + "ParticipationOnly": false + }, + { + "Name": "Wallet1620", + "ParticipationOnly": false + }, + { + "Name": "Wallet1621", + "ParticipationOnly": false + }, + { + "Name": "Wallet1622", + "ParticipationOnly": false + }, + { + "Name": "Wallet1623", + "ParticipationOnly": false + }, + { + "Name": "Wallet1624", + "ParticipationOnly": false + }, + { + "Name": "Wallet1625", + "ParticipationOnly": false + }, + { + "Name": "Wallet1626", + "ParticipationOnly": false + }, + { + "Name": "Wallet1627", + "ParticipationOnly": false + }, + { + "Name": "Wallet1628", + "ParticipationOnly": false + }, + { + "Name": "Wallet1629", + "ParticipationOnly": false + }, + { + "Name": "Wallet1630", + "ParticipationOnly": false + }, + { + "Name": "Wallet1631", + "ParticipationOnly": false + }, + { + "Name": "Wallet1632", + "ParticipationOnly": false + }, + { + "Name": "Wallet1633", + "ParticipationOnly": false + }, + { + "Name": "Wallet1634", + "ParticipationOnly": false + }, + { + "Name": "Wallet1635", + "ParticipationOnly": false + }, + { + "Name": "Wallet1636", + "ParticipationOnly": false + }, + { + "Name": "Wallet1637", + "ParticipationOnly": false + }, + { + "Name": "Wallet1638", + "ParticipationOnly": false + }, + { + "Name": "Wallet1639", + "ParticipationOnly": false + }, + { + "Name": "Wallet1640", + "ParticipationOnly": false + }, + { + "Name": "Wallet1641", + "ParticipationOnly": false + }, + { + "Name": "Wallet1642", + "ParticipationOnly": false + }, + { + "Name": "Wallet1643", + "ParticipationOnly": false + }, + { + "Name": "Wallet1644", + "ParticipationOnly": false + }, + { + "Name": "Wallet1645", + "ParticipationOnly": false + }, + { + "Name": "Wallet1646", + "ParticipationOnly": false + }, + { + "Name": "Wallet1647", + "ParticipationOnly": false + }, + { + "Name": "Wallet1648", + "ParticipationOnly": false + }, + { + "Name": "Wallet1649", + "ParticipationOnly": false + }, + { + "Name": "Wallet1650", + "ParticipationOnly": false + }, + { + "Name": "Wallet1651", + "ParticipationOnly": false + }, + { + "Name": "Wallet1652", + "ParticipationOnly": false + }, + { + "Name": "Wallet1653", + "ParticipationOnly": false + }, + { + "Name": "Wallet1654", + "ParticipationOnly": false + }, + { + "Name": "Wallet1655", + "ParticipationOnly": false + }, + { + "Name": "Wallet1656", + "ParticipationOnly": false + }, + { + "Name": "Wallet1657", + "ParticipationOnly": false + }, + { + "Name": "Wallet1658", + "ParticipationOnly": false + }, + { + "Name": "Wallet1659", + "ParticipationOnly": false + }, + { + "Name": "Wallet1660", + "ParticipationOnly": false + }, + { + "Name": "Wallet1661", + "ParticipationOnly": false + }, + { + "Name": "Wallet1662", + "ParticipationOnly": false + }, + { + "Name": "Wallet1663", + "ParticipationOnly": false + }, + { + "Name": "Wallet1664", + "ParticipationOnly": false + }, + { + "Name": "Wallet1665", + "ParticipationOnly": false + }, + { + "Name": "Wallet1666", + "ParticipationOnly": false + }, + { + "Name": "Wallet1667", + "ParticipationOnly": false + }, + { + "Name": "Wallet1668", + "ParticipationOnly": false + }, + { + "Name": "Wallet1669", + "ParticipationOnly": false + }, + { + "Name": "Wallet1670", + "ParticipationOnly": false + }, + { + "Name": "Wallet1671", + "ParticipationOnly": false + }, + { + "Name": "Wallet1672", + "ParticipationOnly": false + }, + { + "Name": "Wallet1673", + "ParticipationOnly": false + }, + { + "Name": "Wallet1674", + "ParticipationOnly": false + }, + { + "Name": "Wallet1675", + "ParticipationOnly": false + }, + { + "Name": "Wallet1676", + "ParticipationOnly": false + }, + { + "Name": "Wallet1677", + "ParticipationOnly": false + }, + { + "Name": "Wallet1678", + "ParticipationOnly": false + }, + { + "Name": "Wallet1679", + "ParticipationOnly": false + }, + { + "Name": "Wallet1680", + "ParticipationOnly": false + }, + { + "Name": "Wallet1681", + "ParticipationOnly": false + }, + { + "Name": "Wallet1682", + "ParticipationOnly": false + }, + { + "Name": "Wallet1683", + "ParticipationOnly": false + }, + { + "Name": "Wallet1684", + "ParticipationOnly": false + }, + { + "Name": "Wallet1685", + "ParticipationOnly": false + }, + { + "Name": "Wallet1686", + "ParticipationOnly": false + }, + { + "Name": "Wallet1687", + "ParticipationOnly": false + }, + { + "Name": "Wallet1688", + "ParticipationOnly": false + }, + { + "Name": "Wallet1689", + "ParticipationOnly": false + }, + { + "Name": "Wallet1690", + "ParticipationOnly": false + }, + { + "Name": "Wallet1691", + "ParticipationOnly": false + }, + { + "Name": "Wallet1692", + "ParticipationOnly": false + }, + { + "Name": "Wallet1693", + "ParticipationOnly": false + }, + { + "Name": "Wallet1694", + "ParticipationOnly": false + }, + { + "Name": "Wallet1695", + "ParticipationOnly": false + }, + { + "Name": "Wallet1696", + "ParticipationOnly": false + }, + { + "Name": "Wallet1697", + "ParticipationOnly": false + }, + { + "Name": "Wallet1698", + "ParticipationOnly": false + }, + { + "Name": "Wallet1699", + "ParticipationOnly": false + }, + { + "Name": "Wallet1700", + "ParticipationOnly": false + }, + { + "Name": "Wallet1701", + "ParticipationOnly": false + }, + { + "Name": "Wallet1702", + "ParticipationOnly": false + }, + { + "Name": "Wallet1703", + "ParticipationOnly": false + }, + { + "Name": "Wallet1704", + "ParticipationOnly": false + }, + { + "Name": "Wallet1705", + "ParticipationOnly": false + }, + { + "Name": "Wallet1706", + "ParticipationOnly": false + }, + { + "Name": "Wallet1707", + "ParticipationOnly": false + }, + { + "Name": "Wallet1708", + "ParticipationOnly": false + }, + { + "Name": "Wallet1709", + "ParticipationOnly": false + }, + { + "Name": "Wallet1710", + "ParticipationOnly": false + }, + { + "Name": "Wallet1711", + "ParticipationOnly": false + }, + { + "Name": "Wallet1712", + "ParticipationOnly": false + }, + { + "Name": "Wallet1713", + "ParticipationOnly": false + }, + { + "Name": "Wallet1714", + "ParticipationOnly": false + }, + { + "Name": "Wallet1715", + "ParticipationOnly": false + }, + { + "Name": "Wallet1716", + "ParticipationOnly": false + }, + { + "Name": "Wallet1717", + "ParticipationOnly": false + }, + { + "Name": "Wallet1718", + "ParticipationOnly": false + }, + { + "Name": "Wallet1719", + "ParticipationOnly": false + }, + { + "Name": "Wallet1720", + "ParticipationOnly": false + }, + { + "Name": "Wallet1721", + "ParticipationOnly": false + }, + { + "Name": "Wallet1722", + "ParticipationOnly": false + }, + { + "Name": "Wallet1723", + "ParticipationOnly": false + }, + { + "Name": "Wallet1724", + "ParticipationOnly": false + }, + { + "Name": "Wallet1725", + "ParticipationOnly": false + }, + { + "Name": "Wallet1726", + "ParticipationOnly": false + }, + { + "Name": "Wallet1727", + "ParticipationOnly": false + }, + { + "Name": "Wallet1728", + "ParticipationOnly": false + }, + { + "Name": "Wallet1729", + "ParticipationOnly": false + }, + { + "Name": "Wallet1730", + "ParticipationOnly": false + }, + { + "Name": "Wallet1731", + "ParticipationOnly": false + }, + { + "Name": "Wallet1732", + "ParticipationOnly": false + }, + { + "Name": "Wallet1733", + "ParticipationOnly": false + }, + { + "Name": "Wallet1734", + "ParticipationOnly": false + }, + { + "Name": "Wallet1735", + "ParticipationOnly": false + }, + { + "Name": "Wallet1736", + "ParticipationOnly": false + }, + { + "Name": "Wallet1737", + "ParticipationOnly": false + }, + { + "Name": "Wallet1738", + "ParticipationOnly": false + }, + { + "Name": "Wallet1739", + "ParticipationOnly": false + }, + { + "Name": "Wallet1740", + "ParticipationOnly": false + }, + { + "Name": "Wallet1741", + "ParticipationOnly": false + }, + { + "Name": "Wallet1742", + "ParticipationOnly": false + }, + { + "Name": "Wallet1743", + "ParticipationOnly": false + }, + { + "Name": "Wallet1744", + "ParticipationOnly": false + }, + { + "Name": "Wallet1745", + "ParticipationOnly": false + }, + { + "Name": "Wallet1746", + "ParticipationOnly": false + }, + { + "Name": "Wallet1747", + "ParticipationOnly": false + }, + { + "Name": "Wallet1748", + "ParticipationOnly": false + }, + { + "Name": "Wallet1749", + "ParticipationOnly": false + }, + { + "Name": "Wallet1750", + "ParticipationOnly": false + }, + { + "Name": "Wallet1751", + "ParticipationOnly": false + }, + { + "Name": "Wallet1752", + "ParticipationOnly": false + }, + { + "Name": "Wallet1753", + "ParticipationOnly": false + }, + { + "Name": "Wallet1754", + "ParticipationOnly": false + }, + { + "Name": "Wallet1755", + "ParticipationOnly": false + }, + { + "Name": "Wallet1756", + "ParticipationOnly": false + }, + { + "Name": "Wallet1757", + "ParticipationOnly": false + }, + { + "Name": "Wallet1758", + "ParticipationOnly": false + }, + { + "Name": "Wallet1759", + "ParticipationOnly": false + }, + { + "Name": "Wallet1760", + "ParticipationOnly": false + }, + { + "Name": "Wallet1761", + "ParticipationOnly": false + }, + { + "Name": "Wallet1762", + "ParticipationOnly": false + }, + { + "Name": "Wallet1763", + "ParticipationOnly": false + }, + { + "Name": "Wallet1764", + "ParticipationOnly": false + }, + { + "Name": "Wallet1765", + "ParticipationOnly": false + }, + { + "Name": "Wallet1766", + "ParticipationOnly": false + }, + { + "Name": "Wallet1767", + "ParticipationOnly": false + }, + { + "Name": "Wallet1768", + "ParticipationOnly": false + }, + { + "Name": "Wallet1769", + "ParticipationOnly": false + }, + { + "Name": "Wallet1770", + "ParticipationOnly": false + }, + { + "Name": "Wallet1771", + "ParticipationOnly": false + }, + { + "Name": "Wallet1772", + "ParticipationOnly": false + }, + { + "Name": "Wallet1773", + "ParticipationOnly": false + }, + { + "Name": "Wallet1774", + "ParticipationOnly": false + }, + { + "Name": "Wallet1775", + "ParticipationOnly": false + }, + { + "Name": "Wallet1776", + "ParticipationOnly": false + }, + { + "Name": "Wallet1777", + "ParticipationOnly": false + }, + { + "Name": "Wallet1778", + "ParticipationOnly": false + }, + { + "Name": "Wallet1779", + "ParticipationOnly": false + }, + { + "Name": "Wallet1780", + "ParticipationOnly": false + }, + { + "Name": "Wallet1781", + "ParticipationOnly": false + }, + { + "Name": "Wallet1782", + "ParticipationOnly": false + }, + { + "Name": "Wallet1783", + "ParticipationOnly": false + }, + { + "Name": "Wallet1784", + "ParticipationOnly": false + }, + { + "Name": "Wallet1785", + "ParticipationOnly": false + }, + { + "Name": "Wallet1786", + "ParticipationOnly": false + }, + { + "Name": "Wallet1787", + "ParticipationOnly": false + }, + { + "Name": "Wallet1788", + "ParticipationOnly": false + }, + { + "Name": "Wallet1789", + "ParticipationOnly": false + }, + { + "Name": "Wallet1790", + "ParticipationOnly": false + }, + { + "Name": "Wallet1791", + "ParticipationOnly": false + }, + { + "Name": "Wallet1792", + "ParticipationOnly": false + }, + { + "Name": "Wallet1793", + "ParticipationOnly": false + }, + { + "Name": "Wallet1794", + "ParticipationOnly": false + }, + { + "Name": "Wallet1795", + "ParticipationOnly": false + }, + { + "Name": "Wallet1796", + "ParticipationOnly": false + }, + { + "Name": "Wallet1797", + "ParticipationOnly": false + }, + { + "Name": "Wallet1798", + "ParticipationOnly": false + }, + { + "Name": "Wallet1799", + "ParticipationOnly": false + }, + { + "Name": "Wallet1800", + "ParticipationOnly": false + }, + { + "Name": "Wallet1801", + "ParticipationOnly": false + }, + { + "Name": "Wallet1802", + "ParticipationOnly": false + }, + { + "Name": "Wallet1803", + "ParticipationOnly": false + }, + { + "Name": "Wallet1804", + "ParticipationOnly": false + }, + { + "Name": "Wallet1805", + "ParticipationOnly": false + }, + { + "Name": "Wallet1806", + "ParticipationOnly": false + }, + { + "Name": "Wallet1807", + "ParticipationOnly": false + }, + { + "Name": "Wallet1808", + "ParticipationOnly": false + }, + { + "Name": "Wallet1809", + "ParticipationOnly": false + }, + { + "Name": "Wallet1810", + "ParticipationOnly": false + }, + { + "Name": "Wallet1811", + "ParticipationOnly": false + }, + { + "Name": "Wallet1812", + "ParticipationOnly": false + }, + { + "Name": "Wallet1813", + "ParticipationOnly": false + }, + { + "Name": "Wallet1814", + "ParticipationOnly": false + }, + { + "Name": "Wallet1815", + "ParticipationOnly": false + }, + { + "Name": "Wallet1816", + "ParticipationOnly": false + }, + { + "Name": "Wallet1817", + "ParticipationOnly": false + }, + { + "Name": "Wallet1818", + "ParticipationOnly": false + }, + { + "Name": "Wallet1819", + "ParticipationOnly": false + }, + { + "Name": "Wallet1820", + "ParticipationOnly": false + }, + { + "Name": "Wallet1821", + "ParticipationOnly": false + }, + { + "Name": "Wallet1822", + "ParticipationOnly": false + }, + { + "Name": "Wallet1823", + "ParticipationOnly": false + }, + { + "Name": "Wallet1824", + "ParticipationOnly": false + }, + { + "Name": "Wallet1825", + "ParticipationOnly": false + }, + { + "Name": "Wallet1826", + "ParticipationOnly": false + }, + { + "Name": "Wallet1827", + "ParticipationOnly": false + }, + { + "Name": "Wallet1828", + "ParticipationOnly": false + }, + { + "Name": "Wallet1829", + "ParticipationOnly": false + }, + { + "Name": "Wallet1830", + "ParticipationOnly": false + }, + { + "Name": "Wallet1831", + "ParticipationOnly": false + }, + { + "Name": "Wallet1832", + "ParticipationOnly": false + }, + { + "Name": "Wallet1833", + "ParticipationOnly": false + }, + { + "Name": "Wallet1834", + "ParticipationOnly": false + }, + { + "Name": "Wallet1835", + "ParticipationOnly": false + }, + { + "Name": "Wallet1836", + "ParticipationOnly": false + }, + { + "Name": "Wallet1837", + "ParticipationOnly": false + }, + { + "Name": "Wallet1838", + "ParticipationOnly": false + }, + { + "Name": "Wallet1839", + "ParticipationOnly": false + }, + { + "Name": "Wallet1840", + "ParticipationOnly": false + }, + { + "Name": "Wallet1841", + "ParticipationOnly": false + }, + { + "Name": "Wallet1842", + "ParticipationOnly": false + }, + { + "Name": "Wallet1843", + "ParticipationOnly": false + }, + { + "Name": "Wallet1844", + "ParticipationOnly": false + }, + { + "Name": "Wallet1845", + "ParticipationOnly": false + }, + { + "Name": "Wallet1846", + "ParticipationOnly": false + }, + { + "Name": "Wallet1847", + "ParticipationOnly": false + }, + { + "Name": "Wallet1848", + "ParticipationOnly": false + }, + { + "Name": "Wallet1849", + "ParticipationOnly": false + }, + { + "Name": "Wallet1850", + "ParticipationOnly": false + }, + { + "Name": "Wallet1851", + "ParticipationOnly": false + }, + { + "Name": "Wallet1852", + "ParticipationOnly": false + }, + { + "Name": "Wallet1853", + "ParticipationOnly": false + }, + { + "Name": "Wallet1854", + "ParticipationOnly": false + }, + { + "Name": "Wallet1855", + "ParticipationOnly": false + }, + { + "Name": "Wallet1856", + "ParticipationOnly": false + }, + { + "Name": "Wallet1857", + "ParticipationOnly": false + }, + { + "Name": "Wallet1858", + "ParticipationOnly": false + }, + { + "Name": "Wallet1859", + "ParticipationOnly": false + }, + { + "Name": "Wallet1860", + "ParticipationOnly": false + }, + { + "Name": "Wallet1861", + "ParticipationOnly": false + }, + { + "Name": "Wallet1862", + "ParticipationOnly": false + }, + { + "Name": "Wallet1863", + "ParticipationOnly": false + }, + { + "Name": "Wallet1864", + "ParticipationOnly": false + }, + { + "Name": "Wallet1865", + "ParticipationOnly": false + }, + { + "Name": "Wallet1866", + "ParticipationOnly": false + }, + { + "Name": "Wallet1867", + "ParticipationOnly": false + }, + { + "Name": "Wallet1868", + "ParticipationOnly": false + }, + { + "Name": "Wallet1869", + "ParticipationOnly": false + }, + { + "Name": "Wallet1870", + "ParticipationOnly": false + }, + { + "Name": "Wallet1871", + "ParticipationOnly": false + }, + { + "Name": "Wallet1872", + "ParticipationOnly": false + }, + { + "Name": "Wallet1873", + "ParticipationOnly": false + }, + { + "Name": "Wallet1874", + "ParticipationOnly": false + }, + { + "Name": "Wallet1875", + "ParticipationOnly": false + }, + { + "Name": "Wallet1876", + "ParticipationOnly": false + }, + { + "Name": "Wallet1877", + "ParticipationOnly": false + }, + { + "Name": "Wallet1878", + "ParticipationOnly": false + }, + { + "Name": "Wallet1879", + "ParticipationOnly": false + }, + { + "Name": "Wallet1880", + "ParticipationOnly": false + }, + { + "Name": "Wallet1881", + "ParticipationOnly": false + }, + { + "Name": "Wallet1882", + "ParticipationOnly": false + }, + { + "Name": "Wallet1883", + "ParticipationOnly": false + }, + { + "Name": "Wallet1884", + "ParticipationOnly": false + }, + { + "Name": "Wallet1885", + "ParticipationOnly": false + }, + { + "Name": "Wallet1886", + "ParticipationOnly": false + }, + { + "Name": "Wallet1887", + "ParticipationOnly": false + }, + { + "Name": "Wallet1888", + "ParticipationOnly": false + }, + { + "Name": "Wallet1889", + "ParticipationOnly": false + }, + { + "Name": "Wallet1890", + "ParticipationOnly": false + }, + { + "Name": "Wallet1891", + "ParticipationOnly": false + }, + { + "Name": "Wallet1892", + "ParticipationOnly": false + }, + { + "Name": "Wallet1893", + "ParticipationOnly": false + }, + { + "Name": "Wallet1894", + "ParticipationOnly": false + }, + { + "Name": "Wallet1895", + "ParticipationOnly": false + }, + { + "Name": "Wallet1896", + "ParticipationOnly": false + }, + { + "Name": "Wallet1897", + "ParticipationOnly": false + }, + { + "Name": "Wallet1898", + "ParticipationOnly": false + }, + { + "Name": "Wallet1899", + "ParticipationOnly": false + }, + { + "Name": "Wallet1900", + "ParticipationOnly": false + }, + { + "Name": "Wallet1901", + "ParticipationOnly": false + }, + { + "Name": "Wallet1902", + "ParticipationOnly": false + }, + { + "Name": "Wallet1903", + "ParticipationOnly": false + }, + { + "Name": "Wallet1904", + "ParticipationOnly": false + }, + { + "Name": "Wallet1905", + "ParticipationOnly": false + }, + { + "Name": "Wallet1906", + "ParticipationOnly": false + }, + { + "Name": "Wallet1907", + "ParticipationOnly": false + }, + { + "Name": "Wallet1908", + "ParticipationOnly": false + }, + { + "Name": "Wallet1909", + "ParticipationOnly": false + }, + { + "Name": "Wallet1910", + "ParticipationOnly": false + }, + { + "Name": "Wallet1911", + "ParticipationOnly": false + }, + { + "Name": "Wallet1912", + "ParticipationOnly": false + }, + { + "Name": "Wallet1913", + "ParticipationOnly": false + }, + { + "Name": "Wallet1914", + "ParticipationOnly": false + }, + { + "Name": "Wallet1915", + "ParticipationOnly": false + }, + { + "Name": "Wallet1916", + "ParticipationOnly": false + }, + { + "Name": "Wallet1917", + "ParticipationOnly": false + }, + { + "Name": "Wallet1918", + "ParticipationOnly": false + }, + { + "Name": "Wallet1919", + "ParticipationOnly": false + }, + { + "Name": "Wallet1920", + "ParticipationOnly": false + }, + { + "Name": "Wallet1921", + "ParticipationOnly": false + }, + { + "Name": "Wallet1922", + "ParticipationOnly": false + }, + { + "Name": "Wallet1923", + "ParticipationOnly": false + }, + { + "Name": "Wallet1924", + "ParticipationOnly": false + }, + { + "Name": "Wallet1925", + "ParticipationOnly": false + }, + { + "Name": "Wallet1926", + "ParticipationOnly": false + }, + { + "Name": "Wallet1927", + "ParticipationOnly": false + }, + { + "Name": "Wallet1928", + "ParticipationOnly": false + }, + { + "Name": "Wallet1929", + "ParticipationOnly": false + }, + { + "Name": "Wallet1930", + "ParticipationOnly": false + }, + { + "Name": "Wallet1931", + "ParticipationOnly": false + }, + { + "Name": "Wallet1932", + "ParticipationOnly": false + }, + { + "Name": "Wallet1933", + "ParticipationOnly": false + }, + { + "Name": "Wallet1934", + "ParticipationOnly": false + }, + { + "Name": "Wallet1935", + "ParticipationOnly": false + }, + { + "Name": "Wallet1936", + "ParticipationOnly": false + }, + { + "Name": "Wallet1937", + "ParticipationOnly": false + }, + { + "Name": "Wallet1938", + "ParticipationOnly": false + }, + { + "Name": "Wallet1939", + "ParticipationOnly": false + }, + { + "Name": "Wallet1940", + "ParticipationOnly": false + }, + { + "Name": "Wallet1941", + "ParticipationOnly": false + }, + { + "Name": "Wallet1942", + "ParticipationOnly": false + }, + { + "Name": "Wallet1943", + "ParticipationOnly": false + }, + { + "Name": "Wallet1944", + "ParticipationOnly": false + }, + { + "Name": "Wallet1945", + "ParticipationOnly": false + }, + { + "Name": "Wallet1946", + "ParticipationOnly": false + }, + { + "Name": "Wallet1947", + "ParticipationOnly": false + }, + { + "Name": "Wallet1948", + "ParticipationOnly": false + }, + { + "Name": "Wallet1949", + "ParticipationOnly": false + }, + { + "Name": "Wallet1950", + "ParticipationOnly": false + }, + { + "Name": "Wallet1951", + "ParticipationOnly": false + }, + { + "Name": "Wallet1952", + "ParticipationOnly": false + }, + { + "Name": "Wallet1953", + "ParticipationOnly": false + }, + { + "Name": "Wallet1954", + "ParticipationOnly": false + }, + { + "Name": "Wallet1955", + "ParticipationOnly": false + }, + { + "Name": "Wallet1956", + "ParticipationOnly": false + }, + { + "Name": "Wallet1957", + "ParticipationOnly": false + }, + { + "Name": "Wallet1958", + "ParticipationOnly": false + }, + { + "Name": "Wallet1959", + "ParticipationOnly": false + }, + { + "Name": "Wallet1960", + "ParticipationOnly": false + }, + { + "Name": "Wallet1961", + "ParticipationOnly": false + }, + { + "Name": "Wallet1962", + "ParticipationOnly": false + }, + { + "Name": "Wallet1963", + "ParticipationOnly": false + }, + { + "Name": "Wallet1964", + "ParticipationOnly": false + }, + { + "Name": "Wallet1965", + "ParticipationOnly": false + }, + { + "Name": "Wallet1966", + "ParticipationOnly": false + }, + { + "Name": "Wallet1967", + "ParticipationOnly": false + }, + { + "Name": "Wallet1968", + "ParticipationOnly": false + }, + { + "Name": "Wallet1969", + "ParticipationOnly": false + }, + { + "Name": "Wallet1970", + "ParticipationOnly": false + }, + { + "Name": "Wallet1971", + "ParticipationOnly": false + }, + { + "Name": "Wallet1972", + "ParticipationOnly": false + }, + { + "Name": "Wallet1973", + "ParticipationOnly": false + }, + { + "Name": "Wallet1974", + "ParticipationOnly": false + }, + { + "Name": "Wallet1975", + "ParticipationOnly": false + }, + { + "Name": "Wallet1976", + "ParticipationOnly": false + }, + { + "Name": "Wallet1977", + "ParticipationOnly": false + }, + { + "Name": "Wallet1978", + "ParticipationOnly": false + }, + { + "Name": "Wallet1979", + "ParticipationOnly": false + }, + { + "Name": "Wallet1980", + "ParticipationOnly": false + }, + { + "Name": "Wallet1981", + "ParticipationOnly": false + }, + { + "Name": "Wallet1982", + "ParticipationOnly": false + }, + { + "Name": "Wallet1983", + "ParticipationOnly": false + }, + { + "Name": "Wallet1984", + "ParticipationOnly": false + }, + { + "Name": "Wallet1985", + "ParticipationOnly": false + }, + { + "Name": "Wallet1986", + "ParticipationOnly": false + }, + { + "Name": "Wallet1987", + "ParticipationOnly": false + }, + { + "Name": "Wallet1988", + "ParticipationOnly": false + }, + { + "Name": "Wallet1989", + "ParticipationOnly": false + }, + { + "Name": "Wallet1990", + "ParticipationOnly": false + }, + { + "Name": "Wallet1991", + "ParticipationOnly": false + }, + { + "Name": "Wallet1992", + "ParticipationOnly": false + }, + { + "Name": "Wallet1993", + "ParticipationOnly": false + }, + { + "Name": "Wallet1994", + "ParticipationOnly": false + }, + { + "Name": "Wallet1995", + "ParticipationOnly": false + }, + { + "Name": "Wallet1996", + "ParticipationOnly": false + }, + { + "Name": "Wallet1997", + "ParticipationOnly": false + }, + { + "Name": "Wallet1998", + "ParticipationOnly": false + }, + { + "Name": "Wallet1999", + "ParticipationOnly": false + }, + { + "Name": "Wallet2000", + "ParticipationOnly": false + }, + { + "Name": "Wallet2001", + "ParticipationOnly": false + }, + { + "Name": "Wallet2002", + "ParticipationOnly": false + }, + { + "Name": "Wallet2003", + "ParticipationOnly": false + }, + { + "Name": "Wallet2004", + "ParticipationOnly": false + }, + { + "Name": "Wallet2005", + "ParticipationOnly": false + }, + { + "Name": "Wallet2006", + "ParticipationOnly": false + }, + { + "Name": "Wallet2007", + "ParticipationOnly": false + }, + { + "Name": "Wallet2008", + "ParticipationOnly": false + }, + { + "Name": "Wallet2009", + "ParticipationOnly": false + }, + { + "Name": "Wallet2010", + "ParticipationOnly": false + }, + { + "Name": "Wallet2011", + "ParticipationOnly": false + }, + { + "Name": "Wallet2012", + "ParticipationOnly": false + }, + { + "Name": "Wallet2013", + "ParticipationOnly": false + }, + { + "Name": "Wallet2014", + "ParticipationOnly": false + }, + { + "Name": "Wallet2015", + "ParticipationOnly": false + }, + { + "Name": "Wallet2016", + "ParticipationOnly": false + }, + { + "Name": "Wallet2017", + "ParticipationOnly": false + }, + { + "Name": "Wallet2018", + "ParticipationOnly": false + }, + { + "Name": "Wallet2019", + "ParticipationOnly": false + }, + { + "Name": "Wallet2020", + "ParticipationOnly": false + }, + { + "Name": "Wallet2021", + "ParticipationOnly": false + }, + { + "Name": "Wallet2022", + "ParticipationOnly": false + }, + { + "Name": "Wallet2023", + "ParticipationOnly": false + }, + { + "Name": "Wallet2024", + "ParticipationOnly": false + }, + { + "Name": "Wallet2025", + "ParticipationOnly": false + }, + { + "Name": "Wallet2026", + "ParticipationOnly": false + }, + { + "Name": "Wallet2027", + "ParticipationOnly": false + }, + { + "Name": "Wallet2028", + "ParticipationOnly": false + }, + { + "Name": "Wallet2029", + "ParticipationOnly": false + }, + { + "Name": "Wallet2030", + "ParticipationOnly": false + }, + { + "Name": "Wallet2031", + "ParticipationOnly": false + }, + { + "Name": "Wallet2032", + "ParticipationOnly": false + }, + { + "Name": "Wallet2033", + "ParticipationOnly": false + }, + { + "Name": "Wallet2034", + "ParticipationOnly": false + }, + { + "Name": "Wallet2035", + "ParticipationOnly": false + }, + { + "Name": "Wallet2036", + "ParticipationOnly": false + }, + { + "Name": "Wallet2037", + "ParticipationOnly": false + }, + { + "Name": "Wallet2038", + "ParticipationOnly": false + }, + { + "Name": "Wallet2039", + "ParticipationOnly": false + }, + { + "Name": "Wallet2040", + "ParticipationOnly": false + }, + { + "Name": "Wallet2041", + "ParticipationOnly": false + }, + { + "Name": "Wallet2042", + "ParticipationOnly": false + }, + { + "Name": "Wallet2043", + "ParticipationOnly": false + }, + { + "Name": "Wallet2044", + "ParticipationOnly": false + }, + { + "Name": "Wallet2045", + "ParticipationOnly": false + }, + { + "Name": "Wallet2046", + "ParticipationOnly": false + }, + { + "Name": "Wallet2047", + "ParticipationOnly": false + }, + { + "Name": "Wallet2048", + "ParticipationOnly": false + }, + { + "Name": "Wallet2049", + "ParticipationOnly": false + }, + { + "Name": "Wallet2050", + "ParticipationOnly": false + }, + { + "Name": "Wallet2051", + "ParticipationOnly": false + }, + { + "Name": "Wallet2052", + "ParticipationOnly": false + }, + { + "Name": "Wallet2053", + "ParticipationOnly": false + }, + { + "Name": "Wallet2054", + "ParticipationOnly": false + }, + { + "Name": "Wallet2055", + "ParticipationOnly": false + }, + { + "Name": "Wallet2056", + "ParticipationOnly": false + }, + { + "Name": "Wallet2057", + "ParticipationOnly": false + }, + { + "Name": "Wallet2058", + "ParticipationOnly": false + }, + { + "Name": "Wallet2059", + "ParticipationOnly": false + }, + { + "Name": "Wallet2060", + "ParticipationOnly": false + }, + { + "Name": "Wallet2061", + "ParticipationOnly": false + }, + { + "Name": "Wallet2062", + "ParticipationOnly": false + }, + { + "Name": "Wallet2063", + "ParticipationOnly": false + }, + { + "Name": "Wallet2064", + "ParticipationOnly": false + }, + { + "Name": "Wallet2065", + "ParticipationOnly": false + }, + { + "Name": "Wallet2066", + "ParticipationOnly": false + }, + { + "Name": "Wallet2067", + "ParticipationOnly": false + }, + { + "Name": "Wallet2068", + "ParticipationOnly": false + }, + { + "Name": "Wallet2069", + "ParticipationOnly": false + }, + { + "Name": "Wallet2070", + "ParticipationOnly": false + }, + { + "Name": "Wallet2071", + "ParticipationOnly": false + }, + { + "Name": "Wallet2072", + "ParticipationOnly": false + }, + { + "Name": "Wallet2073", + "ParticipationOnly": false + }, + { + "Name": "Wallet2074", + "ParticipationOnly": false + }, + { + "Name": "Wallet2075", + "ParticipationOnly": false + }, + { + "Name": "Wallet2076", + "ParticipationOnly": false + }, + { + "Name": "Wallet2077", + "ParticipationOnly": false + }, + { + "Name": "Wallet2078", + "ParticipationOnly": false + }, + { + "Name": "Wallet2079", + "ParticipationOnly": false + }, + { + "Name": "Wallet2080", + "ParticipationOnly": false + }, + { + "Name": "Wallet2081", + "ParticipationOnly": false + }, + { + "Name": "Wallet2082", + "ParticipationOnly": false + }, + { + "Name": "Wallet2083", + "ParticipationOnly": false + }, + { + "Name": "Wallet2084", + "ParticipationOnly": false + }, + { + "Name": "Wallet2085", + "ParticipationOnly": false + }, + { + "Name": "Wallet2086", + "ParticipationOnly": false + }, + { + "Name": "Wallet2087", + "ParticipationOnly": false + }, + { + "Name": "Wallet2088", + "ParticipationOnly": false + }, + { + "Name": "Wallet2089", + "ParticipationOnly": false + }, + { + "Name": "Wallet2090", + "ParticipationOnly": false + }, + { + "Name": "Wallet2091", + "ParticipationOnly": false + }, + { + "Name": "Wallet2092", + "ParticipationOnly": false + }, + { + "Name": "Wallet2093", + "ParticipationOnly": false + }, + { + "Name": "Wallet2094", + "ParticipationOnly": false + }, + { + "Name": "Wallet2095", + "ParticipationOnly": false + }, + { + "Name": "Wallet2096", + "ParticipationOnly": false + }, + { + "Name": "Wallet2097", + "ParticipationOnly": false + }, + { + "Name": "Wallet2098", + "ParticipationOnly": false + }, + { + "Name": "Wallet2099", + "ParticipationOnly": false + }, + { + "Name": "Wallet2100", + "ParticipationOnly": false + }, + { + "Name": "Wallet2101", + "ParticipationOnly": false + }, + { + "Name": "Wallet2102", + "ParticipationOnly": false + }, + { + "Name": "Wallet2103", + "ParticipationOnly": false + }, + { + "Name": "Wallet2104", + "ParticipationOnly": false + }, + { + "Name": "Wallet2105", + "ParticipationOnly": false + }, + { + "Name": "Wallet2106", + "ParticipationOnly": false + }, + { + "Name": "Wallet2107", + "ParticipationOnly": false + }, + { + "Name": "Wallet2108", + "ParticipationOnly": false + }, + { + "Name": "Wallet2109", + "ParticipationOnly": false + }, + { + "Name": "Wallet2110", + "ParticipationOnly": false + }, + { + "Name": "Wallet2111", + "ParticipationOnly": false + }, + { + "Name": "Wallet2112", + "ParticipationOnly": false + }, + { + "Name": "Wallet2113", + "ParticipationOnly": false + }, + { + "Name": "Wallet2114", + "ParticipationOnly": false + }, + { + "Name": "Wallet2115", + "ParticipationOnly": false + }, + { + "Name": "Wallet2116", + "ParticipationOnly": false + }, + { + "Name": "Wallet2117", + "ParticipationOnly": false + }, + { + "Name": "Wallet2118", + "ParticipationOnly": false + }, + { + "Name": "Wallet2119", + "ParticipationOnly": false + }, + { + "Name": "Wallet2120", + "ParticipationOnly": false + }, + { + "Name": "Wallet2121", + "ParticipationOnly": false + }, + { + "Name": "Wallet2122", + "ParticipationOnly": false + }, + { + "Name": "Wallet2123", + "ParticipationOnly": false + }, + { + "Name": "Wallet2124", + "ParticipationOnly": false + }, + { + "Name": "Wallet2125", + "ParticipationOnly": false + }, + { + "Name": "Wallet2126", + "ParticipationOnly": false + }, + { + "Name": "Wallet2127", + "ParticipationOnly": false + }, + { + "Name": "Wallet2128", + "ParticipationOnly": false + }, + { + "Name": "Wallet2129", + "ParticipationOnly": false + }, + { + "Name": "Wallet2130", + "ParticipationOnly": false + }, + { + "Name": "Wallet2131", + "ParticipationOnly": false + }, + { + "Name": "Wallet2132", + "ParticipationOnly": false + }, + { + "Name": "Wallet2133", + "ParticipationOnly": false + }, + { + "Name": "Wallet2134", + "ParticipationOnly": false + }, + { + "Name": "Wallet2135", + "ParticipationOnly": false + }, + { + "Name": "Wallet2136", + "ParticipationOnly": false + }, + { + "Name": "Wallet2137", + "ParticipationOnly": false + }, + { + "Name": "Wallet2138", + "ParticipationOnly": false + }, + { + "Name": "Wallet2139", + "ParticipationOnly": false + }, + { + "Name": "Wallet2140", + "ParticipationOnly": false + }, + { + "Name": "Wallet2141", + "ParticipationOnly": false + }, + { + "Name": "Wallet2142", + "ParticipationOnly": false + }, + { + "Name": "Wallet2143", + "ParticipationOnly": false + }, + { + "Name": "Wallet2144", + "ParticipationOnly": false + }, + { + "Name": "Wallet2145", + "ParticipationOnly": false + }, + { + "Name": "Wallet2146", + "ParticipationOnly": false + }, + { + "Name": "Wallet2147", + "ParticipationOnly": false + }, + { + "Name": "Wallet2148", + "ParticipationOnly": false + }, + { + "Name": "Wallet2149", + "ParticipationOnly": false + }, + { + "Name": "Wallet2150", + "ParticipationOnly": false + }, + { + "Name": "Wallet2151", + "ParticipationOnly": false + }, + { + "Name": "Wallet2152", + "ParticipationOnly": false + }, + { + "Name": "Wallet2153", + "ParticipationOnly": false + }, + { + "Name": "Wallet2154", + "ParticipationOnly": false + }, + { + "Name": "Wallet2155", + "ParticipationOnly": false + }, + { + "Name": "Wallet2156", + "ParticipationOnly": false + }, + { + "Name": "Wallet2157", + "ParticipationOnly": false + }, + { + "Name": "Wallet2158", + "ParticipationOnly": false + }, + { + "Name": "Wallet2159", + "ParticipationOnly": false + }, + { + "Name": "Wallet2160", + "ParticipationOnly": false + }, + { + "Name": "Wallet2161", + "ParticipationOnly": false + }, + { + "Name": "Wallet2162", + "ParticipationOnly": false + }, + { + "Name": "Wallet2163", + "ParticipationOnly": false + }, + { + "Name": "Wallet2164", + "ParticipationOnly": false + }, + { + "Name": "Wallet2165", + "ParticipationOnly": false + }, + { + "Name": "Wallet2166", + "ParticipationOnly": false + }, + { + "Name": "Wallet2167", + "ParticipationOnly": false + }, + { + "Name": "Wallet2168", + "ParticipationOnly": false + }, + { + "Name": "Wallet2169", + "ParticipationOnly": false + }, + { + "Name": "Wallet2170", + "ParticipationOnly": false + }, + { + "Name": "Wallet2171", + "ParticipationOnly": false + }, + { + "Name": "Wallet2172", + "ParticipationOnly": false + }, + { + "Name": "Wallet2173", + "ParticipationOnly": false + }, + { + "Name": "Wallet2174", + "ParticipationOnly": false + }, + { + "Name": "Wallet2175", + "ParticipationOnly": false + }, + { + "Name": "Wallet2176", + "ParticipationOnly": false + }, + { + "Name": "Wallet2177", + "ParticipationOnly": false + }, + { + "Name": "Wallet2178", + "ParticipationOnly": false + }, + { + "Name": "Wallet2179", + "ParticipationOnly": false + }, + { + "Name": "Wallet2180", + "ParticipationOnly": false + }, + { + "Name": "Wallet2181", + "ParticipationOnly": false + }, + { + "Name": "Wallet2182", + "ParticipationOnly": false + }, + { + "Name": "Wallet2183", + "ParticipationOnly": false + }, + { + "Name": "Wallet2184", + "ParticipationOnly": false + }, + { + "Name": "Wallet2185", + "ParticipationOnly": false + }, + { + "Name": "Wallet2186", + "ParticipationOnly": false + }, + { + "Name": "Wallet2187", + "ParticipationOnly": false + }, + { + "Name": "Wallet2188", + "ParticipationOnly": false + }, + { + "Name": "Wallet2189", + "ParticipationOnly": false + }, + { + "Name": "Wallet2190", + "ParticipationOnly": false + }, + { + "Name": "Wallet2191", + "ParticipationOnly": false + }, + { + "Name": "Wallet2192", + "ParticipationOnly": false + }, + { + "Name": "Wallet2193", + "ParticipationOnly": false + }, + { + "Name": "Wallet2194", + "ParticipationOnly": false + }, + { + "Name": "Wallet2195", + "ParticipationOnly": false + }, + { + "Name": "Wallet2196", + "ParticipationOnly": false + }, + { + "Name": "Wallet2197", + "ParticipationOnly": false + }, + { + "Name": "Wallet2198", + "ParticipationOnly": false + }, + { + "Name": "Wallet2199", + "ParticipationOnly": false + }, + { + "Name": "Wallet2200", + "ParticipationOnly": false + }, + { + "Name": "Wallet2201", + "ParticipationOnly": false + }, + { + "Name": "Wallet2202", + "ParticipationOnly": false + }, + { + "Name": "Wallet2203", + "ParticipationOnly": false + }, + { + "Name": "Wallet2204", + "ParticipationOnly": false + }, + { + "Name": "Wallet2205", + "ParticipationOnly": false + }, + { + "Name": "Wallet2206", + "ParticipationOnly": false + }, + { + "Name": "Wallet2207", + "ParticipationOnly": false + }, + { + "Name": "Wallet2208", + "ParticipationOnly": false + }, + { + "Name": "Wallet2209", + "ParticipationOnly": false + }, + { + "Name": "Wallet2210", + "ParticipationOnly": false + }, + { + "Name": "Wallet2211", + "ParticipationOnly": false + }, + { + "Name": "Wallet2212", + "ParticipationOnly": false + }, + { + "Name": "Wallet2213", + "ParticipationOnly": false + }, + { + "Name": "Wallet2214", + "ParticipationOnly": false + }, + { + "Name": "Wallet2215", + "ParticipationOnly": false + }, + { + "Name": "Wallet2216", + "ParticipationOnly": false + }, + { + "Name": "Wallet2217", + "ParticipationOnly": false + }, + { + "Name": "Wallet2218", + "ParticipationOnly": false + }, + { + "Name": "Wallet2219", + "ParticipationOnly": false + }, + { + "Name": "Wallet2220", + "ParticipationOnly": false + }, + { + "Name": "Wallet2221", + "ParticipationOnly": false + }, + { + "Name": "Wallet2222", + "ParticipationOnly": false + }, + { + "Name": "Wallet2223", + "ParticipationOnly": false + }, + { + "Name": "Wallet2224", + "ParticipationOnly": false + }, + { + "Name": "Wallet2225", + "ParticipationOnly": false + }, + { + "Name": "Wallet2226", + "ParticipationOnly": false + }, + { + "Name": "Wallet2227", + "ParticipationOnly": false + }, + { + "Name": "Wallet2228", + "ParticipationOnly": false + }, + { + "Name": "Wallet2229", + "ParticipationOnly": false + }, + { + "Name": "Wallet2230", + "ParticipationOnly": false + }, + { + "Name": "Wallet2231", + "ParticipationOnly": false + }, + { + "Name": "Wallet2232", + "ParticipationOnly": false + }, + { + "Name": "Wallet2233", + "ParticipationOnly": false + }, + { + "Name": "Wallet2234", + "ParticipationOnly": false + }, + { + "Name": "Wallet2235", + "ParticipationOnly": false + }, + { + "Name": "Wallet2236", + "ParticipationOnly": false + }, + { + "Name": "Wallet2237", + "ParticipationOnly": false + }, + { + "Name": "Wallet2238", + "ParticipationOnly": false + }, + { + "Name": "Wallet2239", + "ParticipationOnly": false + }, + { + "Name": "Wallet2240", + "ParticipationOnly": false + }, + { + "Name": "Wallet2241", + "ParticipationOnly": false + }, + { + "Name": "Wallet2242", + "ParticipationOnly": false + }, + { + "Name": "Wallet2243", + "ParticipationOnly": false + }, + { + "Name": "Wallet2244", + "ParticipationOnly": false + }, + { + "Name": "Wallet2245", + "ParticipationOnly": false + }, + { + "Name": "Wallet2246", + "ParticipationOnly": false + }, + { + "Name": "Wallet2247", + "ParticipationOnly": false + }, + { + "Name": "Wallet2248", + "ParticipationOnly": false + }, + { + "Name": "Wallet2249", + "ParticipationOnly": false + }, + { + "Name": "Wallet2250", + "ParticipationOnly": false + }, + { + "Name": "Wallet2251", + "ParticipationOnly": false + }, + { + "Name": "Wallet2252", + "ParticipationOnly": false + }, + { + "Name": "Wallet2253", + "ParticipationOnly": false + }, + { + "Name": "Wallet2254", + "ParticipationOnly": false + }, + { + "Name": "Wallet2255", + "ParticipationOnly": false + }, + { + "Name": "Wallet2256", + "ParticipationOnly": false + }, + { + "Name": "Wallet2257", + "ParticipationOnly": false + }, + { + "Name": "Wallet2258", + "ParticipationOnly": false + }, + { + "Name": "Wallet2259", + "ParticipationOnly": false + }, + { + "Name": "Wallet2260", + "ParticipationOnly": false + }, + { + "Name": "Wallet2261", + "ParticipationOnly": false + }, + { + "Name": "Wallet2262", + "ParticipationOnly": false + }, + { + "Name": "Wallet2263", + "ParticipationOnly": false + }, + { + "Name": "Wallet2264", + "ParticipationOnly": false + }, + { + "Name": "Wallet2265", + "ParticipationOnly": false + }, + { + "Name": "Wallet2266", + "ParticipationOnly": false + }, + { + "Name": "Wallet2267", + "ParticipationOnly": false + }, + { + "Name": "Wallet2268", + "ParticipationOnly": false + }, + { + "Name": "Wallet2269", + "ParticipationOnly": false + }, + { + "Name": "Wallet2270", + "ParticipationOnly": false + }, + { + "Name": "Wallet2271", + "ParticipationOnly": false + }, + { + "Name": "Wallet2272", + "ParticipationOnly": false + }, + { + "Name": "Wallet2273", + "ParticipationOnly": false + }, + { + "Name": "Wallet2274", + "ParticipationOnly": false + }, + { + "Name": "Wallet2275", + "ParticipationOnly": false + }, + { + "Name": "Wallet2276", + "ParticipationOnly": false + }, + { + "Name": "Wallet2277", + "ParticipationOnly": false + }, + { + "Name": "Wallet2278", + "ParticipationOnly": false + }, + { + "Name": "Wallet2279", + "ParticipationOnly": false + }, + { + "Name": "Wallet2280", + "ParticipationOnly": false + }, + { + "Name": "Wallet2281", + "ParticipationOnly": false + }, + { + "Name": "Wallet2282", + "ParticipationOnly": false + }, + { + "Name": "Wallet2283", + "ParticipationOnly": false + }, + { + "Name": "Wallet2284", + "ParticipationOnly": false + }, + { + "Name": "Wallet2285", + "ParticipationOnly": false + }, + { + "Name": "Wallet2286", + "ParticipationOnly": false + }, + { + "Name": "Wallet2287", + "ParticipationOnly": false + }, + { + "Name": "Wallet2288", + "ParticipationOnly": false + }, + { + "Name": "Wallet2289", + "ParticipationOnly": false + }, + { + "Name": "Wallet2290", + "ParticipationOnly": false + }, + { + "Name": "Wallet2291", + "ParticipationOnly": false + }, + { + "Name": "Wallet2292", + "ParticipationOnly": false + }, + { + "Name": "Wallet2293", + "ParticipationOnly": false + }, + { + "Name": "Wallet2294", + "ParticipationOnly": false + }, + { + "Name": "Wallet2295", + "ParticipationOnly": false + }, + { + "Name": "Wallet2296", + "ParticipationOnly": false + }, + { + "Name": "Wallet2297", + "ParticipationOnly": false + }, + { + "Name": "Wallet2298", + "ParticipationOnly": false + }, + { + "Name": "Wallet2299", + "ParticipationOnly": false + }, + { + "Name": "Wallet2300", + "ParticipationOnly": false + }, + { + "Name": "Wallet2301", + "ParticipationOnly": false + }, + { + "Name": "Wallet2302", + "ParticipationOnly": false + }, + { + "Name": "Wallet2303", + "ParticipationOnly": false + }, + { + "Name": "Wallet2304", + "ParticipationOnly": false + }, + { + "Name": "Wallet2305", + "ParticipationOnly": false + }, + { + "Name": "Wallet2306", + "ParticipationOnly": false + }, + { + "Name": "Wallet2307", + "ParticipationOnly": false + }, + { + "Name": "Wallet2308", + "ParticipationOnly": false + }, + { + "Name": "Wallet2309", + "ParticipationOnly": false + }, + { + "Name": "Wallet2310", + "ParticipationOnly": false + }, + { + "Name": "Wallet2311", + "ParticipationOnly": false + }, + { + "Name": "Wallet2312", + "ParticipationOnly": false + }, + { + "Name": "Wallet2313", + "ParticipationOnly": false + }, + { + "Name": "Wallet2314", + "ParticipationOnly": false + }, + { + "Name": "Wallet2315", + "ParticipationOnly": false + }, + { + "Name": "Wallet2316", + "ParticipationOnly": false + }, + { + "Name": "Wallet2317", + "ParticipationOnly": false + }, + { + "Name": "Wallet2318", + "ParticipationOnly": false + }, + { + "Name": "Wallet2319", + "ParticipationOnly": false + }, + { + "Name": "Wallet2320", + "ParticipationOnly": false + }, + { + "Name": "Wallet2321", + "ParticipationOnly": false + }, + { + "Name": "Wallet2322", + "ParticipationOnly": false + }, + { + "Name": "Wallet2323", + "ParticipationOnly": false + }, + { + "Name": "Wallet2324", + "ParticipationOnly": false + }, + { + "Name": "Wallet2325", + "ParticipationOnly": false + }, + { + "Name": "Wallet2326", + "ParticipationOnly": false + }, + { + "Name": "Wallet2327", + "ParticipationOnly": false + }, + { + "Name": "Wallet2328", + "ParticipationOnly": false + }, + { + "Name": "Wallet2329", + "ParticipationOnly": false + }, + { + "Name": "Wallet2330", + "ParticipationOnly": false + }, + { + "Name": "Wallet2331", + "ParticipationOnly": false + }, + { + "Name": "Wallet2332", + "ParticipationOnly": false + }, + { + "Name": "Wallet2333", + "ParticipationOnly": false + }, + { + "Name": "Wallet2334", + "ParticipationOnly": false + }, + { + "Name": "Wallet2335", + "ParticipationOnly": false + }, + { + "Name": "Wallet2336", + "ParticipationOnly": false + }, + { + "Name": "Wallet2337", + "ParticipationOnly": false + }, + { + "Name": "Wallet2338", + "ParticipationOnly": false + }, + { + "Name": "Wallet2339", + "ParticipationOnly": false + }, + { + "Name": "Wallet2340", + "ParticipationOnly": false + }, + { + "Name": "Wallet2341", + "ParticipationOnly": false + }, + { + "Name": "Wallet2342", + "ParticipationOnly": false + }, + { + "Name": "Wallet2343", + "ParticipationOnly": false + }, + { + "Name": "Wallet2344", + "ParticipationOnly": false + }, + { + "Name": "Wallet2345", + "ParticipationOnly": false + }, + { + "Name": "Wallet2346", + "ParticipationOnly": false + }, + { + "Name": "Wallet2347", + "ParticipationOnly": false + }, + { + "Name": "Wallet2348", + "ParticipationOnly": false + }, + { + "Name": "Wallet2349", + "ParticipationOnly": false + }, + { + "Name": "Wallet2350", + "ParticipationOnly": false + }, + { + "Name": "Wallet2351", + "ParticipationOnly": false + }, + { + "Name": "Wallet2352", + "ParticipationOnly": false + }, + { + "Name": "Wallet2353", + "ParticipationOnly": false + }, + { + "Name": "Wallet2354", + "ParticipationOnly": false + }, + { + "Name": "Wallet2355", + "ParticipationOnly": false + }, + { + "Name": "Wallet2356", + "ParticipationOnly": false + }, + { + "Name": "Wallet2357", + "ParticipationOnly": false + }, + { + "Name": "Wallet2358", + "ParticipationOnly": false + }, + { + "Name": "Wallet2359", + "ParticipationOnly": false + }, + { + "Name": "Wallet2360", + "ParticipationOnly": false + }, + { + "Name": "Wallet2361", + "ParticipationOnly": false + }, + { + "Name": "Wallet2362", + "ParticipationOnly": false + }, + { + "Name": "Wallet2363", + "ParticipationOnly": false + }, + { + "Name": "Wallet2364", + "ParticipationOnly": false + }, + { + "Name": "Wallet2365", + "ParticipationOnly": false + }, + { + "Name": "Wallet2366", + "ParticipationOnly": false + }, + { + "Name": "Wallet2367", + "ParticipationOnly": false + }, + { + "Name": "Wallet2368", + "ParticipationOnly": false + }, + { + "Name": "Wallet2369", + "ParticipationOnly": false + }, + { + "Name": "Wallet2370", + "ParticipationOnly": false + }, + { + "Name": "Wallet2371", + "ParticipationOnly": false + }, + { + "Name": "Wallet2372", + "ParticipationOnly": false + }, + { + "Name": "Wallet2373", + "ParticipationOnly": false + }, + { + "Name": "Wallet2374", + "ParticipationOnly": false + }, + { + "Name": "Wallet2375", + "ParticipationOnly": false + }, + { + "Name": "Wallet2376", + "ParticipationOnly": false + }, + { + "Name": "Wallet2377", + "ParticipationOnly": false + }, + { + "Name": "Wallet2378", + "ParticipationOnly": false + }, + { + "Name": "Wallet2379", + "ParticipationOnly": false + }, + { + "Name": "Wallet2380", + "ParticipationOnly": false + }, + { + "Name": "Wallet2381", + "ParticipationOnly": false + }, + { + "Name": "Wallet2382", + "ParticipationOnly": false + }, + { + "Name": "Wallet2383", + "ParticipationOnly": false + }, + { + "Name": "Wallet2384", + "ParticipationOnly": false + }, + { + "Name": "Wallet2385", + "ParticipationOnly": false + }, + { + "Name": "Wallet2386", + "ParticipationOnly": false + }, + { + "Name": "Wallet2387", + "ParticipationOnly": false + }, + { + "Name": "Wallet2388", + "ParticipationOnly": false + }, + { + "Name": "Wallet2389", + "ParticipationOnly": false + }, + { + "Name": "Wallet2390", + "ParticipationOnly": false + }, + { + "Name": "Wallet2391", + "ParticipationOnly": false + }, + { + "Name": "Wallet2392", + "ParticipationOnly": false + }, + { + "Name": "Wallet2393", + "ParticipationOnly": false + }, + { + "Name": "Wallet2394", + "ParticipationOnly": false + }, + { + "Name": "Wallet2395", + "ParticipationOnly": false + }, + { + "Name": "Wallet2396", + "ParticipationOnly": false + }, + { + "Name": "Wallet2397", + "ParticipationOnly": false + }, + { + "Name": "Wallet2398", + "ParticipationOnly": false + }, + { + "Name": "Wallet2399", + "ParticipationOnly": false + }, + { + "Name": "Wallet2400", + "ParticipationOnly": false + }, + { + "Name": "Wallet2401", + "ParticipationOnly": false + }, + { + "Name": "Wallet2402", + "ParticipationOnly": false + }, + { + "Name": "Wallet2403", + "ParticipationOnly": false + }, + { + "Name": "Wallet2404", + "ParticipationOnly": false + }, + { + "Name": "Wallet2405", + "ParticipationOnly": false + }, + { + "Name": "Wallet2406", + "ParticipationOnly": false + }, + { + "Name": "Wallet2407", + "ParticipationOnly": false + }, + { + "Name": "Wallet2408", + "ParticipationOnly": false + }, + { + "Name": "Wallet2409", + "ParticipationOnly": false + }, + { + "Name": "Wallet2410", + "ParticipationOnly": false + }, + { + "Name": "Wallet2411", + "ParticipationOnly": false + }, + { + "Name": "Wallet2412", + "ParticipationOnly": false + }, + { + "Name": "Wallet2413", + "ParticipationOnly": false + }, + { + "Name": "Wallet2414", + "ParticipationOnly": false + }, + { + "Name": "Wallet2415", + "ParticipationOnly": false + }, + { + "Name": "Wallet2416", + "ParticipationOnly": false + }, + { + "Name": "Wallet2417", + "ParticipationOnly": false + }, + { + "Name": "Wallet2418", + "ParticipationOnly": false + }, + { + "Name": "Wallet2419", + "ParticipationOnly": false + }, + { + "Name": "Wallet2420", + "ParticipationOnly": false + }, + { + "Name": "Wallet2421", + "ParticipationOnly": false + }, + { + "Name": "Wallet2422", + "ParticipationOnly": false + }, + { + "Name": "Wallet2423", + "ParticipationOnly": false + }, + { + "Name": "Wallet2424", + "ParticipationOnly": false + }, + { + "Name": "Wallet2425", + "ParticipationOnly": false + }, + { + "Name": "Wallet2426", + "ParticipationOnly": false + }, + { + "Name": "Wallet2427", + "ParticipationOnly": false + }, + { + "Name": "Wallet2428", + "ParticipationOnly": false + }, + { + "Name": "Wallet2429", + "ParticipationOnly": false + }, + { + "Name": "Wallet2430", + "ParticipationOnly": false + }, + { + "Name": "Wallet2431", + "ParticipationOnly": false + }, + { + "Name": "Wallet2432", + "ParticipationOnly": false + }, + { + "Name": "Wallet2433", + "ParticipationOnly": false + }, + { + "Name": "Wallet2434", + "ParticipationOnly": false + }, + { + "Name": "Wallet2435", + "ParticipationOnly": false + }, + { + "Name": "Wallet2436", + "ParticipationOnly": false + }, + { + "Name": "Wallet2437", + "ParticipationOnly": false + }, + { + "Name": "Wallet2438", + "ParticipationOnly": false + }, + { + "Name": "Wallet2439", + "ParticipationOnly": false + }, + { + "Name": "Wallet2440", + "ParticipationOnly": false + }, + { + "Name": "Wallet2441", + "ParticipationOnly": false + }, + { + "Name": "Wallet2442", + "ParticipationOnly": false + }, + { + "Name": "Wallet2443", + "ParticipationOnly": false + }, + { + "Name": "Wallet2444", + "ParticipationOnly": false + }, + { + "Name": "Wallet2445", + "ParticipationOnly": false + }, + { + "Name": "Wallet2446", + "ParticipationOnly": false + }, + { + "Name": "Wallet2447", + "ParticipationOnly": false + }, + { + "Name": "Wallet2448", + "ParticipationOnly": false + }, + { + "Name": "Wallet2449", + "ParticipationOnly": false + }, + { + "Name": "Wallet2450", + "ParticipationOnly": false + }, + { + "Name": "Wallet2451", + "ParticipationOnly": false + }, + { + "Name": "Wallet2452", + "ParticipationOnly": false + }, + { + "Name": "Wallet2453", + "ParticipationOnly": false + }, + { + "Name": "Wallet2454", + "ParticipationOnly": false + }, + { + "Name": "Wallet2455", + "ParticipationOnly": false + }, + { + "Name": "Wallet2456", + "ParticipationOnly": false + }, + { + "Name": "Wallet2457", + "ParticipationOnly": false + }, + { + "Name": "Wallet2458", + "ParticipationOnly": false + }, + { + "Name": "Wallet2459", + "ParticipationOnly": false + }, + { + "Name": "Wallet2460", + "ParticipationOnly": false + }, + { + "Name": "Wallet2461", + "ParticipationOnly": false + }, + { + "Name": "Wallet2462", + "ParticipationOnly": false + }, + { + "Name": "Wallet2463", + "ParticipationOnly": false + }, + { + "Name": "Wallet2464", + "ParticipationOnly": false + }, + { + "Name": "Wallet2465", + "ParticipationOnly": false + }, + { + "Name": "Wallet2466", + "ParticipationOnly": false + }, + { + "Name": "Wallet2467", + "ParticipationOnly": false + }, + { + "Name": "Wallet2468", + "ParticipationOnly": false + }, + { + "Name": "Wallet2469", + "ParticipationOnly": false + }, + { + "Name": "Wallet2470", + "ParticipationOnly": false + }, + { + "Name": "Wallet2471", + "ParticipationOnly": false + }, + { + "Name": "Wallet2472", + "ParticipationOnly": false + }, + { + "Name": "Wallet2473", + "ParticipationOnly": false + }, + { + "Name": "Wallet2474", + "ParticipationOnly": false + }, + { + "Name": "Wallet2475", + "ParticipationOnly": false + }, + { + "Name": "Wallet2476", + "ParticipationOnly": false + }, + { + "Name": "Wallet2477", + "ParticipationOnly": false + }, + { + "Name": "Wallet2478", + "ParticipationOnly": false + }, + { + "Name": "Wallet2479", + "ParticipationOnly": false + }, + { + "Name": "Wallet2480", + "ParticipationOnly": false + }, + { + "Name": "Wallet2481", + "ParticipationOnly": false + }, + { + "Name": "Wallet2482", + "ParticipationOnly": false + }, + { + "Name": "Wallet2483", + "ParticipationOnly": false + }, + { + "Name": "Wallet2484", + "ParticipationOnly": false + }, + { + "Name": "Wallet2485", + "ParticipationOnly": false + }, + { + "Name": "Wallet2486", + "ParticipationOnly": false + }, + { + "Name": "Wallet2487", + "ParticipationOnly": false + }, + { + "Name": "Wallet2488", + "ParticipationOnly": false + }, + { + "Name": "Wallet2489", + "ParticipationOnly": false + }, + { + "Name": "Wallet2490", + "ParticipationOnly": false + }, + { + "Name": "Wallet2491", + "ParticipationOnly": false + }, + { + "Name": "Wallet2492", + "ParticipationOnly": false + }, + { + "Name": "Wallet2493", + "ParticipationOnly": false + }, + { + "Name": "Wallet2494", + "ParticipationOnly": false + }, + { + "Name": "Wallet2495", + "ParticipationOnly": false + }, + { + "Name": "Wallet2496", + "ParticipationOnly": false + }, + { + "Name": "Wallet2497", + "ParticipationOnly": false + }, + { + "Name": "Wallet2498", + "ParticipationOnly": false + }, + { + "Name": "Wallet2499", + "ParticipationOnly": false + }, + { + "Name": "Wallet2500", + "ParticipationOnly": false + }, + { + "Name": "Wallet2501", + "ParticipationOnly": false + }, + { + "Name": "Wallet2502", + "ParticipationOnly": false + }, + { + "Name": "Wallet2503", + "ParticipationOnly": false + }, + { + "Name": "Wallet2504", + "ParticipationOnly": false + }, + { + "Name": "Wallet2505", + "ParticipationOnly": false + }, + { + "Name": "Wallet2506", + "ParticipationOnly": false + }, + { + "Name": "Wallet2507", + "ParticipationOnly": false + }, + { + "Name": "Wallet2508", + "ParticipationOnly": false + }, + { + "Name": "Wallet2509", + "ParticipationOnly": false + }, + { + "Name": "Wallet2510", + "ParticipationOnly": false + }, + { + "Name": "Wallet2511", + "ParticipationOnly": false + }, + { + "Name": "Wallet2512", + "ParticipationOnly": false + }, + { + "Name": "Wallet2513", + "ParticipationOnly": false + }, + { + "Name": "Wallet2514", + "ParticipationOnly": false + }, + { + "Name": "Wallet2515", + "ParticipationOnly": false + }, + { + "Name": "Wallet2516", + "ParticipationOnly": false + }, + { + "Name": "Wallet2517", + "ParticipationOnly": false + }, + { + "Name": "Wallet2518", + "ParticipationOnly": false + }, + { + "Name": "Wallet2519", + "ParticipationOnly": false + }, + { + "Name": "Wallet2520", + "ParticipationOnly": false + }, + { + "Name": "Wallet2521", + "ParticipationOnly": false + }, + { + "Name": "Wallet2522", + "ParticipationOnly": false + }, + { + "Name": "Wallet2523", + "ParticipationOnly": false + }, + { + "Name": "Wallet2524", + "ParticipationOnly": false + }, + { + "Name": "Wallet2525", + "ParticipationOnly": false + }, + { + "Name": "Wallet2526", + "ParticipationOnly": false + }, + { + "Name": "Wallet2527", + "ParticipationOnly": false + }, + { + "Name": "Wallet2528", + "ParticipationOnly": false + }, + { + "Name": "Wallet2529", + "ParticipationOnly": false + }, + { + "Name": "Wallet2530", + "ParticipationOnly": false + }, + { + "Name": "Wallet2531", + "ParticipationOnly": false + }, + { + "Name": "Wallet2532", + "ParticipationOnly": false + }, + { + "Name": "Wallet2533", + "ParticipationOnly": false + }, + { + "Name": "Wallet2534", + "ParticipationOnly": false + }, + { + "Name": "Wallet2535", + "ParticipationOnly": false + }, + { + "Name": "Wallet2536", + "ParticipationOnly": false + }, + { + "Name": "Wallet2537", + "ParticipationOnly": false + }, + { + "Name": "Wallet2538", + "ParticipationOnly": false + }, + { + "Name": "Wallet2539", + "ParticipationOnly": false + }, + { + "Name": "Wallet2540", + "ParticipationOnly": false + }, + { + "Name": "Wallet2541", + "ParticipationOnly": false + }, + { + "Name": "Wallet2542", + "ParticipationOnly": false + }, + { + "Name": "Wallet2543", + "ParticipationOnly": false + }, + { + "Name": "Wallet2544", + "ParticipationOnly": false + }, + { + "Name": "Wallet2545", + "ParticipationOnly": false + }, + { + "Name": "Wallet2546", + "ParticipationOnly": false + }, + { + "Name": "Wallet2547", + "ParticipationOnly": false + }, + { + "Name": "Wallet2548", + "ParticipationOnly": false + }, + { + "Name": "Wallet2549", + "ParticipationOnly": false + }, + { + "Name": "Wallet2550", + "ParticipationOnly": false + }, + { + "Name": "Wallet2551", + "ParticipationOnly": false + }, + { + "Name": "Wallet2552", + "ParticipationOnly": false + }, + { + "Name": "Wallet2553", + "ParticipationOnly": false + }, + { + "Name": "Wallet2554", + "ParticipationOnly": false + }, + { + "Name": "Wallet2555", + "ParticipationOnly": false + }, + { + "Name": "Wallet2556", + "ParticipationOnly": false + }, + { + "Name": "Wallet2557", + "ParticipationOnly": false + }, + { + "Name": "Wallet2558", + "ParticipationOnly": false + }, + { + "Name": "Wallet2559", + "ParticipationOnly": false + }, + { + "Name": "Wallet2560", + "ParticipationOnly": false + }, + { + "Name": "Wallet2561", + "ParticipationOnly": false + }, + { + "Name": "Wallet2562", + "ParticipationOnly": false + }, + { + "Name": "Wallet2563", + "ParticipationOnly": false + }, + { + "Name": "Wallet2564", + "ParticipationOnly": false + }, + { + "Name": "Wallet2565", + "ParticipationOnly": false + }, + { + "Name": "Wallet2566", + "ParticipationOnly": false + }, + { + "Name": "Wallet2567", + "ParticipationOnly": false + }, + { + "Name": "Wallet2568", + "ParticipationOnly": false + }, + { + "Name": "Wallet2569", + "ParticipationOnly": false + }, + { + "Name": "Wallet2570", + "ParticipationOnly": false + }, + { + "Name": "Wallet2571", + "ParticipationOnly": false + }, + { + "Name": "Wallet2572", + "ParticipationOnly": false + }, + { + "Name": "Wallet2573", + "ParticipationOnly": false + }, + { + "Name": "Wallet2574", + "ParticipationOnly": false + }, + { + "Name": "Wallet2575", + "ParticipationOnly": false + }, + { + "Name": "Wallet2576", + "ParticipationOnly": false + }, + { + "Name": "Wallet2577", + "ParticipationOnly": false + }, + { + "Name": "Wallet2578", + "ParticipationOnly": false + }, + { + "Name": "Wallet2579", + "ParticipationOnly": false + }, + { + "Name": "Wallet2580", + "ParticipationOnly": false + }, + { + "Name": "Wallet2581", + "ParticipationOnly": false + }, + { + "Name": "Wallet2582", + "ParticipationOnly": false + }, + { + "Name": "Wallet2583", + "ParticipationOnly": false + }, + { + "Name": "Wallet2584", + "ParticipationOnly": false + }, + { + "Name": "Wallet2585", + "ParticipationOnly": false + }, + { + "Name": "Wallet2586", + "ParticipationOnly": false + }, + { + "Name": "Wallet2587", + "ParticipationOnly": false + }, + { + "Name": "Wallet2588", + "ParticipationOnly": false + }, + { + "Name": "Wallet2589", + "ParticipationOnly": false + }, + { + "Name": "Wallet2590", + "ParticipationOnly": false + }, + { + "Name": "Wallet2591", + "ParticipationOnly": false + }, + { + "Name": "Wallet2592", + "ParticipationOnly": false + }, + { + "Name": "Wallet2593", + "ParticipationOnly": false + }, + { + "Name": "Wallet2594", + "ParticipationOnly": false + }, + { + "Name": "Wallet2595", + "ParticipationOnly": false + }, + { + "Name": "Wallet2596", + "ParticipationOnly": false + }, + { + "Name": "Wallet2597", + "ParticipationOnly": false + }, + { + "Name": "Wallet2598", + "ParticipationOnly": false + }, + { + "Name": "Wallet2599", + "ParticipationOnly": false + }, + { + "Name": "Wallet2600", + "ParticipationOnly": false + }, + { + "Name": "Wallet2601", + "ParticipationOnly": false + }, + { + "Name": "Wallet2602", + "ParticipationOnly": false + }, + { + "Name": "Wallet2603", + "ParticipationOnly": false + }, + { + "Name": "Wallet2604", + "ParticipationOnly": false + }, + { + "Name": "Wallet2605", + "ParticipationOnly": false + }, + { + "Name": "Wallet2606", + "ParticipationOnly": false + }, + { + "Name": "Wallet2607", + "ParticipationOnly": false + }, + { + "Name": "Wallet2608", + "ParticipationOnly": false + }, + { + "Name": "Wallet2609", + "ParticipationOnly": false + }, + { + "Name": "Wallet2610", + "ParticipationOnly": false + }, + { + "Name": "Wallet2611", + "ParticipationOnly": false + }, + { + "Name": "Wallet2612", + "ParticipationOnly": false + }, + { + "Name": "Wallet2613", + "ParticipationOnly": false + }, + { + "Name": "Wallet2614", + "ParticipationOnly": false + }, + { + "Name": "Wallet2615", + "ParticipationOnly": false + }, + { + "Name": "Wallet2616", + "ParticipationOnly": false + }, + { + "Name": "Wallet2617", + "ParticipationOnly": false + }, + { + "Name": "Wallet2618", + "ParticipationOnly": false + }, + { + "Name": "Wallet2619", + "ParticipationOnly": false + }, + { + "Name": "Wallet2620", + "ParticipationOnly": false + }, + { + "Name": "Wallet2621", + "ParticipationOnly": false + }, + { + "Name": "Wallet2622", + "ParticipationOnly": false + }, + { + "Name": "Wallet2623", + "ParticipationOnly": false + }, + { + "Name": "Wallet2624", + "ParticipationOnly": false + }, + { + "Name": "Wallet2625", + "ParticipationOnly": false + }, + { + "Name": "Wallet2626", + "ParticipationOnly": false + }, + { + "Name": "Wallet2627", + "ParticipationOnly": false + }, + { + "Name": "Wallet2628", + "ParticipationOnly": false + }, + { + "Name": "Wallet2629", + "ParticipationOnly": false + }, + { + "Name": "Wallet2630", + "ParticipationOnly": false + }, + { + "Name": "Wallet2631", + "ParticipationOnly": false + }, + { + "Name": "Wallet2632", + "ParticipationOnly": false + }, + { + "Name": "Wallet2633", + "ParticipationOnly": false + }, + { + "Name": "Wallet2634", + "ParticipationOnly": false + }, + { + "Name": "Wallet2635", + "ParticipationOnly": false + }, + { + "Name": "Wallet2636", + "ParticipationOnly": false + }, + { + "Name": "Wallet2637", + "ParticipationOnly": false + }, + { + "Name": "Wallet2638", + "ParticipationOnly": false + }, + { + "Name": "Wallet2639", + "ParticipationOnly": false + }, + { + "Name": "Wallet2640", + "ParticipationOnly": false + }, + { + "Name": "Wallet2641", + "ParticipationOnly": false + }, + { + "Name": "Wallet2642", + "ParticipationOnly": false + }, + { + "Name": "Wallet2643", + "ParticipationOnly": false + }, + { + "Name": "Wallet2644", + "ParticipationOnly": false + }, + { + "Name": "Wallet2645", + "ParticipationOnly": false + }, + { + "Name": "Wallet2646", + "ParticipationOnly": false + }, + { + "Name": "Wallet2647", + "ParticipationOnly": false + }, + { + "Name": "Wallet2648", + "ParticipationOnly": false + }, + { + "Name": "Wallet2649", + "ParticipationOnly": false + }, + { + "Name": "Wallet2650", + "ParticipationOnly": false + }, + { + "Name": "Wallet2651", + "ParticipationOnly": false + }, + { + "Name": "Wallet2652", + "ParticipationOnly": false + }, + { + "Name": "Wallet2653", + "ParticipationOnly": false + }, + { + "Name": "Wallet2654", + "ParticipationOnly": false + }, + { + "Name": "Wallet2655", + "ParticipationOnly": false + }, + { + "Name": "Wallet2656", + "ParticipationOnly": false + }, + { + "Name": "Wallet2657", + "ParticipationOnly": false + }, + { + "Name": "Wallet2658", + "ParticipationOnly": false + }, + { + "Name": "Wallet2659", + "ParticipationOnly": false + }, + { + "Name": "Wallet2660", + "ParticipationOnly": false + }, + { + "Name": "Wallet2661", + "ParticipationOnly": false + }, + { + "Name": "Wallet2662", + "ParticipationOnly": false + }, + { + "Name": "Wallet2663", + "ParticipationOnly": false + }, + { + "Name": "Wallet2664", + "ParticipationOnly": false + }, + { + "Name": "Wallet2665", + "ParticipationOnly": false + }, + { + "Name": "Wallet2666", + "ParticipationOnly": false + }, + { + "Name": "Wallet2667", + "ParticipationOnly": false + }, + { + "Name": "Wallet2668", + "ParticipationOnly": false + }, + { + "Name": "Wallet2669", + "ParticipationOnly": false + }, + { + "Name": "Wallet2670", + "ParticipationOnly": false + }, + { + "Name": "Wallet2671", + "ParticipationOnly": false + }, + { + "Name": "Wallet2672", + "ParticipationOnly": false + }, + { + "Name": "Wallet2673", + "ParticipationOnly": false + }, + { + "Name": "Wallet2674", + "ParticipationOnly": false + }, + { + "Name": "Wallet2675", + "ParticipationOnly": false + }, + { + "Name": "Wallet2676", + "ParticipationOnly": false + }, + { + "Name": "Wallet2677", + "ParticipationOnly": false + }, + { + "Name": "Wallet2678", + "ParticipationOnly": false + }, + { + "Name": "Wallet2679", + "ParticipationOnly": false + }, + { + "Name": "Wallet2680", + "ParticipationOnly": false + }, + { + "Name": "Wallet2681", + "ParticipationOnly": false + }, + { + "Name": "Wallet2682", + "ParticipationOnly": false + }, + { + "Name": "Wallet2683", + "ParticipationOnly": false + }, + { + "Name": "Wallet2684", + "ParticipationOnly": false + }, + { + "Name": "Wallet2685", + "ParticipationOnly": false + }, + { + "Name": "Wallet2686", + "ParticipationOnly": false + }, + { + "Name": "Wallet2687", + "ParticipationOnly": false + }, + { + "Name": "Wallet2688", + "ParticipationOnly": false + }, + { + "Name": "Wallet2689", + "ParticipationOnly": false + }, + { + "Name": "Wallet2690", + "ParticipationOnly": false + }, + { + "Name": "Wallet2691", + "ParticipationOnly": false + }, + { + "Name": "Wallet2692", + "ParticipationOnly": false + }, + { + "Name": "Wallet2693", + "ParticipationOnly": false + }, + { + "Name": "Wallet2694", + "ParticipationOnly": false + }, + { + "Name": "Wallet2695", + "ParticipationOnly": false + }, + { + "Name": "Wallet2696", + "ParticipationOnly": false + }, + { + "Name": "Wallet2697", + "ParticipationOnly": false + }, + { + "Name": "Wallet2698", + "ParticipationOnly": false + }, + { + "Name": "Wallet2699", + "ParticipationOnly": false + }, + { + "Name": "Wallet2700", + "ParticipationOnly": false + }, + { + "Name": "Wallet2701", + "ParticipationOnly": false + }, + { + "Name": "Wallet2702", + "ParticipationOnly": false + }, + { + "Name": "Wallet2703", + "ParticipationOnly": false + }, + { + "Name": "Wallet2704", + "ParticipationOnly": false + }, + { + "Name": "Wallet2705", + "ParticipationOnly": false + }, + { + "Name": "Wallet2706", + "ParticipationOnly": false + }, + { + "Name": "Wallet2707", + "ParticipationOnly": false + }, + { + "Name": "Wallet2708", + "ParticipationOnly": false + }, + { + "Name": "Wallet2709", + "ParticipationOnly": false + }, + { + "Name": "Wallet2710", + "ParticipationOnly": false + }, + { + "Name": "Wallet2711", + "ParticipationOnly": false + }, + { + "Name": "Wallet2712", + "ParticipationOnly": false + }, + { + "Name": "Wallet2713", + "ParticipationOnly": false + }, + { + "Name": "Wallet2714", + "ParticipationOnly": false + }, + { + "Name": "Wallet2715", + "ParticipationOnly": false + }, + { + "Name": "Wallet2716", + "ParticipationOnly": false + }, + { + "Name": "Wallet2717", + "ParticipationOnly": false + }, + { + "Name": "Wallet2718", + "ParticipationOnly": false + }, + { + "Name": "Wallet2719", + "ParticipationOnly": false + }, + { + "Name": "Wallet2720", + "ParticipationOnly": false + }, + { + "Name": "Wallet2721", + "ParticipationOnly": false + }, + { + "Name": "Wallet2722", + "ParticipationOnly": false + }, + { + "Name": "Wallet2723", + "ParticipationOnly": false + }, + { + "Name": "Wallet2724", + "ParticipationOnly": false + }, + { + "Name": "Wallet2725", + "ParticipationOnly": false + }, + { + "Name": "Wallet2726", + "ParticipationOnly": false + }, + { + "Name": "Wallet2727", + "ParticipationOnly": false + }, + { + "Name": "Wallet2728", + "ParticipationOnly": false + }, + { + "Name": "Wallet2729", + "ParticipationOnly": false + }, + { + "Name": "Wallet2730", + "ParticipationOnly": false + }, + { + "Name": "Wallet2731", + "ParticipationOnly": false + }, + { + "Name": "Wallet2732", + "ParticipationOnly": false + }, + { + "Name": "Wallet2733", + "ParticipationOnly": false + }, + { + "Name": "Wallet2734", + "ParticipationOnly": false + }, + { + "Name": "Wallet2735", + "ParticipationOnly": false + }, + { + "Name": "Wallet2736", + "ParticipationOnly": false + }, + { + "Name": "Wallet2737", + "ParticipationOnly": false + }, + { + "Name": "Wallet2738", + "ParticipationOnly": false + }, + { + "Name": "Wallet2739", + "ParticipationOnly": false + }, + { + "Name": "Wallet2740", + "ParticipationOnly": false + }, + { + "Name": "Wallet2741", + "ParticipationOnly": false + }, + { + "Name": "Wallet2742", + "ParticipationOnly": false + }, + { + "Name": "Wallet2743", + "ParticipationOnly": false + }, + { + "Name": "Wallet2744", + "ParticipationOnly": false + }, + { + "Name": "Wallet2745", + "ParticipationOnly": false + }, + { + "Name": "Wallet2746", + "ParticipationOnly": false + }, + { + "Name": "Wallet2747", + "ParticipationOnly": false + }, + { + "Name": "Wallet2748", + "ParticipationOnly": false + }, + { + "Name": "Wallet2749", + "ParticipationOnly": false + }, + { + "Name": "Wallet2750", + "ParticipationOnly": false + }, + { + "Name": "Wallet2751", + "ParticipationOnly": false + }, + { + "Name": "Wallet2752", + "ParticipationOnly": false + }, + { + "Name": "Wallet2753", + "ParticipationOnly": false + }, + { + "Name": "Wallet2754", + "ParticipationOnly": false + }, + { + "Name": "Wallet2755", + "ParticipationOnly": false + }, + { + "Name": "Wallet2756", + "ParticipationOnly": false + }, + { + "Name": "Wallet2757", + "ParticipationOnly": false + }, + { + "Name": "Wallet2758", + "ParticipationOnly": false + }, + { + "Name": "Wallet2759", + "ParticipationOnly": false + }, + { + "Name": "Wallet2760", + "ParticipationOnly": false + }, + { + "Name": "Wallet2761", + "ParticipationOnly": false + }, + { + "Name": "Wallet2762", + "ParticipationOnly": false + }, + { + "Name": "Wallet2763", + "ParticipationOnly": false + }, + { + "Name": "Wallet2764", + "ParticipationOnly": false + }, + { + "Name": "Wallet2765", + "ParticipationOnly": false + }, + { + "Name": "Wallet2766", + "ParticipationOnly": false + }, + { + "Name": "Wallet2767", + "ParticipationOnly": false + }, + { + "Name": "Wallet2768", + "ParticipationOnly": false + }, + { + "Name": "Wallet2769", + "ParticipationOnly": false + }, + { + "Name": "Wallet2770", + "ParticipationOnly": false + }, + { + "Name": "Wallet2771", + "ParticipationOnly": false + }, + { + "Name": "Wallet2772", + "ParticipationOnly": false + }, + { + "Name": "Wallet2773", + "ParticipationOnly": false + }, + { + "Name": "Wallet2774", + "ParticipationOnly": false + }, + { + "Name": "Wallet2775", + "ParticipationOnly": false + }, + { + "Name": "Wallet2776", + "ParticipationOnly": false + }, + { + "Name": "Wallet2777", + "ParticipationOnly": false + }, + { + "Name": "Wallet2778", + "ParticipationOnly": false + }, + { + "Name": "Wallet2779", + "ParticipationOnly": false + }, + { + "Name": "Wallet2780", + "ParticipationOnly": false + }, + { + "Name": "Wallet2781", + "ParticipationOnly": false + }, + { + "Name": "Wallet2782", + "ParticipationOnly": false + }, + { + "Name": "Wallet2783", + "ParticipationOnly": false + }, + { + "Name": "Wallet2784", + "ParticipationOnly": false + }, + { + "Name": "Wallet2785", + "ParticipationOnly": false + }, + { + "Name": "Wallet2786", + "ParticipationOnly": false + }, + { + "Name": "Wallet2787", + "ParticipationOnly": false + }, + { + "Name": "Wallet2788", + "ParticipationOnly": false + }, + { + "Name": "Wallet2789", + "ParticipationOnly": false + }, + { + "Name": "Wallet2790", + "ParticipationOnly": false + }, + { + "Name": "Wallet2791", + "ParticipationOnly": false + }, + { + "Name": "Wallet2792", + "ParticipationOnly": false + }, + { + "Name": "Wallet2793", + "ParticipationOnly": false + }, + { + "Name": "Wallet2794", + "ParticipationOnly": false + }, + { + "Name": "Wallet2795", + "ParticipationOnly": false + }, + { + "Name": "Wallet2796", + "ParticipationOnly": false + }, + { + "Name": "Wallet2797", + "ParticipationOnly": false + }, + { + "Name": "Wallet2798", + "ParticipationOnly": false + }, + { + "Name": "Wallet2799", + "ParticipationOnly": false + }, + { + "Name": "Wallet2800", + "ParticipationOnly": false + }, + { + "Name": "Wallet2801", + "ParticipationOnly": false + }, + { + "Name": "Wallet2802", + "ParticipationOnly": false + }, + { + "Name": "Wallet2803", + "ParticipationOnly": false + }, + { + "Name": "Wallet2804", + "ParticipationOnly": false + }, + { + "Name": "Wallet2805", + "ParticipationOnly": false + }, + { + "Name": "Wallet2806", + "ParticipationOnly": false + }, + { + "Name": "Wallet2807", + "ParticipationOnly": false + }, + { + "Name": "Wallet2808", + "ParticipationOnly": false + }, + { + "Name": "Wallet2809", + "ParticipationOnly": false + }, + { + "Name": "Wallet2810", + "ParticipationOnly": false + }, + { + "Name": "Wallet2811", + "ParticipationOnly": false + }, + { + "Name": "Wallet2812", + "ParticipationOnly": false + }, + { + "Name": "Wallet2813", + "ParticipationOnly": false + }, + { + "Name": "Wallet2814", + "ParticipationOnly": false + }, + { + "Name": "Wallet2815", + "ParticipationOnly": false + }, + { + "Name": "Wallet2816", + "ParticipationOnly": false + }, + { + "Name": "Wallet2817", + "ParticipationOnly": false + }, + { + "Name": "Wallet2818", + "ParticipationOnly": false + }, + { + "Name": "Wallet2819", + "ParticipationOnly": false + }, + { + "Name": "Wallet2820", + "ParticipationOnly": false + }, + { + "Name": "Wallet2821", + "ParticipationOnly": false + }, + { + "Name": "Wallet2822", + "ParticipationOnly": false + }, + { + "Name": "Wallet2823", + "ParticipationOnly": false + }, + { + "Name": "Wallet2824", + "ParticipationOnly": false + }, + { + "Name": "Wallet2825", + "ParticipationOnly": false + }, + { + "Name": "Wallet2826", + "ParticipationOnly": false + }, + { + "Name": "Wallet2827", + "ParticipationOnly": false + }, + { + "Name": "Wallet2828", + "ParticipationOnly": false + }, + { + "Name": "Wallet2829", + "ParticipationOnly": false + }, + { + "Name": "Wallet2830", + "ParticipationOnly": false + }, + { + "Name": "Wallet2831", + "ParticipationOnly": false + }, + { + "Name": "Wallet2832", + "ParticipationOnly": false + }, + { + "Name": "Wallet2833", + "ParticipationOnly": false + }, + { + "Name": "Wallet2834", + "ParticipationOnly": false + }, + { + "Name": "Wallet2835", + "ParticipationOnly": false + }, + { + "Name": "Wallet2836", + "ParticipationOnly": false + }, + { + "Name": "Wallet2837", + "ParticipationOnly": false + }, + { + "Name": "Wallet2838", + "ParticipationOnly": false + }, + { + "Name": "Wallet2839", + "ParticipationOnly": false + }, + { + "Name": "Wallet2840", + "ParticipationOnly": false + }, + { + "Name": "Wallet2841", + "ParticipationOnly": false + }, + { + "Name": "Wallet2842", + "ParticipationOnly": false + }, + { + "Name": "Wallet2843", + "ParticipationOnly": false + }, + { + "Name": "Wallet2844", + "ParticipationOnly": false + }, + { + "Name": "Wallet2845", + "ParticipationOnly": false + }, + { + "Name": "Wallet2846", + "ParticipationOnly": false + }, + { + "Name": "Wallet2847", + "ParticipationOnly": false + }, + { + "Name": "Wallet2848", + "ParticipationOnly": false + }, + { + "Name": "Wallet2849", + "ParticipationOnly": false + }, + { + "Name": "Wallet2850", + "ParticipationOnly": false + }, + { + "Name": "Wallet2851", + "ParticipationOnly": false + }, + { + "Name": "Wallet2852", + "ParticipationOnly": false + }, + { + "Name": "Wallet2853", + "ParticipationOnly": false + }, + { + "Name": "Wallet2854", + "ParticipationOnly": false + }, + { + "Name": "Wallet2855", + "ParticipationOnly": false + }, + { + "Name": "Wallet2856", + "ParticipationOnly": false + }, + { + "Name": "Wallet2857", + "ParticipationOnly": false + }, + { + "Name": "Wallet2858", + "ParticipationOnly": false + }, + { + "Name": "Wallet2859", + "ParticipationOnly": false + }, + { + "Name": "Wallet2860", + "ParticipationOnly": false + }, + { + "Name": "Wallet2861", + "ParticipationOnly": false + }, + { + "Name": "Wallet2862", + "ParticipationOnly": false + }, + { + "Name": "Wallet2863", + "ParticipationOnly": false + }, + { + "Name": "Wallet2864", + "ParticipationOnly": false + }, + { + "Name": "Wallet2865", + "ParticipationOnly": false + }, + { + "Name": "Wallet2866", + "ParticipationOnly": false + }, + { + "Name": "Wallet2867", + "ParticipationOnly": false + }, + { + "Name": "Wallet2868", + "ParticipationOnly": false + }, + { + "Name": "Wallet2869", + "ParticipationOnly": false + }, + { + "Name": "Wallet2870", + "ParticipationOnly": false + }, + { + "Name": "Wallet2871", + "ParticipationOnly": false + }, + { + "Name": "Wallet2872", + "ParticipationOnly": false + }, + { + "Name": "Wallet2873", + "ParticipationOnly": false + }, + { + "Name": "Wallet2874", + "ParticipationOnly": false + }, + { + "Name": "Wallet2875", + "ParticipationOnly": false + }, + { + "Name": "Wallet2876", + "ParticipationOnly": false + }, + { + "Name": "Wallet2877", + "ParticipationOnly": false + }, + { + "Name": "Wallet2878", + "ParticipationOnly": false + }, + { + "Name": "Wallet2879", + "ParticipationOnly": false + }, + { + "Name": "Wallet2880", + "ParticipationOnly": false + }, + { + "Name": "Wallet2881", + "ParticipationOnly": false + }, + { + "Name": "Wallet2882", + "ParticipationOnly": false + }, + { + "Name": "Wallet2883", + "ParticipationOnly": false + }, + { + "Name": "Wallet2884", + "ParticipationOnly": false + }, + { + "Name": "Wallet2885", + "ParticipationOnly": false + }, + { + "Name": "Wallet2886", + "ParticipationOnly": false + }, + { + "Name": "Wallet2887", + "ParticipationOnly": false + }, + { + "Name": "Wallet2888", + "ParticipationOnly": false + }, + { + "Name": "Wallet2889", + "ParticipationOnly": false + }, + { + "Name": "Wallet2890", + "ParticipationOnly": false + }, + { + "Name": "Wallet2891", + "ParticipationOnly": false + }, + { + "Name": "Wallet2892", + "ParticipationOnly": false + }, + { + "Name": "Wallet2893", + "ParticipationOnly": false + }, + { + "Name": "Wallet2894", + "ParticipationOnly": false + }, + { + "Name": "Wallet2895", + "ParticipationOnly": false + }, + { + "Name": "Wallet2896", + "ParticipationOnly": false + }, + { + "Name": "Wallet2897", + "ParticipationOnly": false + }, + { + "Name": "Wallet2898", + "ParticipationOnly": false + }, + { + "Name": "Wallet2899", + "ParticipationOnly": false + }, + { + "Name": "Wallet2900", + "ParticipationOnly": false + }, + { + "Name": "Wallet2901", + "ParticipationOnly": false + }, + { + "Name": "Wallet2902", + "ParticipationOnly": false + }, + { + "Name": "Wallet2903", + "ParticipationOnly": false + }, + { + "Name": "Wallet2904", + "ParticipationOnly": false + }, + { + "Name": "Wallet2905", + "ParticipationOnly": false + }, + { + "Name": "Wallet2906", + "ParticipationOnly": false + }, + { + "Name": "Wallet2907", + "ParticipationOnly": false + }, + { + "Name": "Wallet2908", + "ParticipationOnly": false + }, + { + "Name": "Wallet2909", + "ParticipationOnly": false + }, + { + "Name": "Wallet2910", + "ParticipationOnly": false + }, + { + "Name": "Wallet2911", + "ParticipationOnly": false + }, + { + "Name": "Wallet2912", + "ParticipationOnly": false + }, + { + "Name": "Wallet2913", + "ParticipationOnly": false + }, + { + "Name": "Wallet2914", + "ParticipationOnly": false + }, + { + "Name": "Wallet2915", + "ParticipationOnly": false + }, + { + "Name": "Wallet2916", + "ParticipationOnly": false + }, + { + "Name": "Wallet2917", + "ParticipationOnly": false + }, + { + "Name": "Wallet2918", + "ParticipationOnly": false + }, + { + "Name": "Wallet2919", + "ParticipationOnly": false + }, + { + "Name": "Wallet2920", + "ParticipationOnly": false + }, + { + "Name": "Wallet2921", + "ParticipationOnly": false + }, + { + "Name": "Wallet2922", + "ParticipationOnly": false + }, + { + "Name": "Wallet2923", + "ParticipationOnly": false + }, + { + "Name": "Wallet2924", + "ParticipationOnly": false + }, + { + "Name": "Wallet2925", + "ParticipationOnly": false + }, + { + "Name": "Wallet2926", + "ParticipationOnly": false + }, + { + "Name": "Wallet2927", + "ParticipationOnly": false + }, + { + "Name": "Wallet2928", + "ParticipationOnly": false + }, + { + "Name": "Wallet2929", + "ParticipationOnly": false + }, + { + "Name": "Wallet2930", + "ParticipationOnly": false + }, + { + "Name": "Wallet2931", + "ParticipationOnly": false + }, + { + "Name": "Wallet2932", + "ParticipationOnly": false + }, + { + "Name": "Wallet2933", + "ParticipationOnly": false + }, + { + "Name": "Wallet2934", + "ParticipationOnly": false + }, + { + "Name": "Wallet2935", + "ParticipationOnly": false + }, + { + "Name": "Wallet2936", + "ParticipationOnly": false + }, + { + "Name": "Wallet2937", + "ParticipationOnly": false + }, + { + "Name": "Wallet2938", + "ParticipationOnly": false + }, + { + "Name": "Wallet2939", + "ParticipationOnly": false + }, + { + "Name": "Wallet2940", + "ParticipationOnly": false + }, + { + "Name": "Wallet2941", + "ParticipationOnly": false + }, + { + "Name": "Wallet2942", + "ParticipationOnly": false + }, + { + "Name": "Wallet2943", + "ParticipationOnly": false + }, + { + "Name": "Wallet2944", + "ParticipationOnly": false + }, + { + "Name": "Wallet2945", + "ParticipationOnly": false + }, + { + "Name": "Wallet2946", + "ParticipationOnly": false + }, + { + "Name": "Wallet2947", + "ParticipationOnly": false + }, + { + "Name": "Wallet2948", + "ParticipationOnly": false + }, + { + "Name": "Wallet2949", + "ParticipationOnly": false + }, + { + "Name": "Wallet2950", + "ParticipationOnly": false + }, + { + "Name": "Wallet2951", + "ParticipationOnly": false + }, + { + "Name": "Wallet2952", + "ParticipationOnly": false + }, + { + "Name": "Wallet2953", + "ParticipationOnly": false + }, + { + "Name": "Wallet2954", + "ParticipationOnly": false + }, + { + "Name": "Wallet2955", + "ParticipationOnly": false + }, + { + "Name": "Wallet2956", + "ParticipationOnly": false + }, + { + "Name": "Wallet2957", + "ParticipationOnly": false + }, + { + "Name": "Wallet2958", + "ParticipationOnly": false + }, + { + "Name": "Wallet2959", + "ParticipationOnly": false + }, + { + "Name": "Wallet2960", + "ParticipationOnly": false + }, + { + "Name": "Wallet2961", + "ParticipationOnly": false + }, + { + "Name": "Wallet2962", + "ParticipationOnly": false + }, + { + "Name": "Wallet2963", + "ParticipationOnly": false + }, + { + "Name": "Wallet2964", + "ParticipationOnly": false + }, + { + "Name": "Wallet2965", + "ParticipationOnly": false + }, + { + "Name": "Wallet2966", + "ParticipationOnly": false + }, + { + "Name": "Wallet2967", + "ParticipationOnly": false + }, + { + "Name": "Wallet2968", + "ParticipationOnly": false + }, + { + "Name": "Wallet2969", + "ParticipationOnly": false + }, + { + "Name": "Wallet2970", + "ParticipationOnly": false + }, + { + "Name": "Wallet2971", + "ParticipationOnly": false + }, + { + "Name": "Wallet2972", + "ParticipationOnly": false + }, + { + "Name": "Wallet2973", + "ParticipationOnly": false + }, + { + "Name": "Wallet2974", + "ParticipationOnly": false + }, + { + "Name": "Wallet2975", + "ParticipationOnly": false + }, + { + "Name": "Wallet2976", + "ParticipationOnly": false + }, + { + "Name": "Wallet2977", + "ParticipationOnly": false + }, + { + "Name": "Wallet2978", + "ParticipationOnly": false + }, + { + "Name": "Wallet2979", + "ParticipationOnly": false + }, + { + "Name": "Wallet2980", + "ParticipationOnly": false + }, + { + "Name": "Wallet2981", + "ParticipationOnly": false + }, + { + "Name": "Wallet2982", + "ParticipationOnly": false + }, + { + "Name": "Wallet2983", + "ParticipationOnly": false + }, + { + "Name": "Wallet2984", + "ParticipationOnly": false + }, + { + "Name": "Wallet2985", + "ParticipationOnly": false + }, + { + "Name": "Wallet2986", + "ParticipationOnly": false + }, + { + "Name": "Wallet2987", + "ParticipationOnly": false + }, + { + "Name": "Wallet2988", + "ParticipationOnly": false + }, + { + "Name": "Wallet2989", + "ParticipationOnly": false + }, + { + "Name": "Wallet2990", + "ParticipationOnly": false + }, + { + "Name": "Wallet2991", + "ParticipationOnly": false + }, + { + "Name": "Wallet2992", + "ParticipationOnly": false + }, + { + "Name": "Wallet2993", + "ParticipationOnly": false + }, + { + "Name": "Wallet2994", + "ParticipationOnly": false + }, + { + "Name": "Wallet2995", + "ParticipationOnly": false + }, + { + "Name": "Wallet2996", + "ParticipationOnly": false + }, + { + "Name": "Wallet2997", + "ParticipationOnly": false + }, + { + "Name": "Wallet2998", + "ParticipationOnly": false + }, + { + "Name": "Wallet2999", + "ParticipationOnly": false + }, + { + "Name": "Wallet3000", + "ParticipationOnly": false + }, + { + "Name": "Wallet3001", + "ParticipationOnly": false + }, + { + "Name": "Wallet3002", + "ParticipationOnly": false + }, + { + "Name": "Wallet3003", + "ParticipationOnly": false + }, + { + "Name": "Wallet3004", + "ParticipationOnly": false + }, + { + "Name": "Wallet3005", + "ParticipationOnly": false + }, + { + "Name": "Wallet3006", + "ParticipationOnly": false + }, + { + "Name": "Wallet3007", + "ParticipationOnly": false + }, + { + "Name": "Wallet3008", + "ParticipationOnly": false + }, + { + "Name": "Wallet3009", + "ParticipationOnly": false + }, + { + "Name": "Wallet3010", + "ParticipationOnly": false + }, + { + "Name": "Wallet3011", + "ParticipationOnly": false + }, + { + "Name": "Wallet3012", + "ParticipationOnly": false + }, + { + "Name": "Wallet3013", + "ParticipationOnly": false + }, + { + "Name": "Wallet3014", + "ParticipationOnly": false + }, + { + "Name": "Wallet3015", + "ParticipationOnly": false + }, + { + "Name": "Wallet3016", + "ParticipationOnly": false + }, + { + "Name": "Wallet3017", + "ParticipationOnly": false + }, + { + "Name": "Wallet3018", + "ParticipationOnly": false + }, + { + "Name": "Wallet3019", + "ParticipationOnly": false + }, + { + "Name": "Wallet3020", + "ParticipationOnly": false + }, + { + "Name": "Wallet3021", + "ParticipationOnly": false + }, + { + "Name": "Wallet3022", + "ParticipationOnly": false + }, + { + "Name": "Wallet3023", + "ParticipationOnly": false + }, + { + "Name": "Wallet3024", + "ParticipationOnly": false + }, + { + "Name": "Wallet3025", + "ParticipationOnly": false + }, + { + "Name": "Wallet3026", + "ParticipationOnly": false + }, + { + "Name": "Wallet3027", + "ParticipationOnly": false + }, + { + "Name": "Wallet3028", + "ParticipationOnly": false + }, + { + "Name": "Wallet3029", + "ParticipationOnly": false + }, + { + "Name": "Wallet3030", + "ParticipationOnly": false + }, + { + "Name": "Wallet3031", + "ParticipationOnly": false + }, + { + "Name": "Wallet3032", + "ParticipationOnly": false + }, + { + "Name": "Wallet3033", + "ParticipationOnly": false + }, + { + "Name": "Wallet3034", + "ParticipationOnly": false + }, + { + "Name": "Wallet3035", + "ParticipationOnly": false + }, + { + "Name": "Wallet3036", + "ParticipationOnly": false + }, + { + "Name": "Wallet3037", + "ParticipationOnly": false + }, + { + "Name": "Wallet3038", + "ParticipationOnly": false + }, + { + "Name": "Wallet3039", + "ParticipationOnly": false + }, + { + "Name": "Wallet3040", + "ParticipationOnly": false + }, + { + "Name": "Wallet3041", + "ParticipationOnly": false + }, + { + "Name": "Wallet3042", + "ParticipationOnly": false + }, + { + "Name": "Wallet3043", + "ParticipationOnly": false + }, + { + "Name": "Wallet3044", + "ParticipationOnly": false + }, + { + "Name": "Wallet3045", + "ParticipationOnly": false + }, + { + "Name": "Wallet3046", + "ParticipationOnly": false + }, + { + "Name": "Wallet3047", + "ParticipationOnly": false + }, + { + "Name": "Wallet3048", + "ParticipationOnly": false + }, + { + "Name": "Wallet3049", + "ParticipationOnly": false + }, + { + "Name": "Wallet3050", + "ParticipationOnly": false + }, + { + "Name": "Wallet3051", + "ParticipationOnly": false + }, + { + "Name": "Wallet3052", + "ParticipationOnly": false + }, + { + "Name": "Wallet3053", + "ParticipationOnly": false + }, + { + "Name": "Wallet3054", + "ParticipationOnly": false + }, + { + "Name": "Wallet3055", + "ParticipationOnly": false + }, + { + "Name": "Wallet3056", + "ParticipationOnly": false + }, + { + "Name": "Wallet3057", + "ParticipationOnly": false + }, + { + "Name": "Wallet3058", + "ParticipationOnly": false + }, + { + "Name": "Wallet3059", + "ParticipationOnly": false + }, + { + "Name": "Wallet3060", + "ParticipationOnly": false + }, + { + "Name": "Wallet3061", + "ParticipationOnly": false + }, + { + "Name": "Wallet3062", + "ParticipationOnly": false + }, + { + "Name": "Wallet3063", + "ParticipationOnly": false + }, + { + "Name": "Wallet3064", + "ParticipationOnly": false + }, + { + "Name": "Wallet3065", + "ParticipationOnly": false + }, + { + "Name": "Wallet3066", + "ParticipationOnly": false + }, + { + "Name": "Wallet3067", + "ParticipationOnly": false + }, + { + "Name": "Wallet3068", + "ParticipationOnly": false + }, + { + "Name": "Wallet3069", + "ParticipationOnly": false + }, + { + "Name": "Wallet3070", + "ParticipationOnly": false + }, + { + "Name": "Wallet3071", + "ParticipationOnly": false + }, + { + "Name": "Wallet3072", + "ParticipationOnly": false + }, + { + "Name": "Wallet3073", + "ParticipationOnly": false + }, + { + "Name": "Wallet3074", + "ParticipationOnly": false + }, + { + "Name": "Wallet3075", + "ParticipationOnly": false + }, + { + "Name": "Wallet3076", + "ParticipationOnly": false + }, + { + "Name": "Wallet3077", + "ParticipationOnly": false + }, + { + "Name": "Wallet3078", + "ParticipationOnly": false + }, + { + "Name": "Wallet3079", + "ParticipationOnly": false + }, + { + "Name": "Wallet3080", + "ParticipationOnly": false + }, + { + "Name": "Wallet3081", + "ParticipationOnly": false + }, + { + "Name": "Wallet3082", + "ParticipationOnly": false + }, + { + "Name": "Wallet3083", + "ParticipationOnly": false + }, + { + "Name": "Wallet3084", + "ParticipationOnly": false + }, + { + "Name": "Wallet3085", + "ParticipationOnly": false + }, + { + "Name": "Wallet3086", + "ParticipationOnly": false + }, + { + "Name": "Wallet3087", + "ParticipationOnly": false + }, + { + "Name": "Wallet3088", + "ParticipationOnly": false + }, + { + "Name": "Wallet3089", + "ParticipationOnly": false + }, + { + "Name": "Wallet3090", + "ParticipationOnly": false + }, + { + "Name": "Wallet3091", + "ParticipationOnly": false + }, + { + "Name": "Wallet3092", + "ParticipationOnly": false + }, + { + "Name": "Wallet3093", + "ParticipationOnly": false + }, + { + "Name": "Wallet3094", + "ParticipationOnly": false + }, + { + "Name": "Wallet3095", + "ParticipationOnly": false + }, + { + "Name": "Wallet3096", + "ParticipationOnly": false + }, + { + "Name": "Wallet3097", + "ParticipationOnly": false + }, + { + "Name": "Wallet3098", + "ParticipationOnly": false + }, + { + "Name": "Wallet3099", + "ParticipationOnly": false + }, + { + "Name": "Wallet3100", + "ParticipationOnly": false + }, + { + "Name": "Wallet3101", + "ParticipationOnly": false + }, + { + "Name": "Wallet3102", + "ParticipationOnly": false + }, + { + "Name": "Wallet3103", + "ParticipationOnly": false + }, + { + "Name": "Wallet3104", + "ParticipationOnly": false + }, + { + "Name": "Wallet3105", + "ParticipationOnly": false + }, + { + "Name": "Wallet3106", + "ParticipationOnly": false + }, + { + "Name": "Wallet3107", + "ParticipationOnly": false + }, + { + "Name": "Wallet3108", + "ParticipationOnly": false + }, + { + "Name": "Wallet3109", + "ParticipationOnly": false + }, + { + "Name": "Wallet3110", + "ParticipationOnly": false + }, + { + "Name": "Wallet3111", + "ParticipationOnly": false + }, + { + "Name": "Wallet3112", + "ParticipationOnly": false + }, + { + "Name": "Wallet3113", + "ParticipationOnly": false + }, + { + "Name": "Wallet3114", + "ParticipationOnly": false + }, + { + "Name": "Wallet3115", + "ParticipationOnly": false + }, + { + "Name": "Wallet3116", + "ParticipationOnly": false + }, + { + "Name": "Wallet3117", + "ParticipationOnly": false + }, + { + "Name": "Wallet3118", + "ParticipationOnly": false + }, + { + "Name": "Wallet3119", + "ParticipationOnly": false + }, + { + "Name": "Wallet3120", + "ParticipationOnly": false + }, + { + "Name": "Wallet3121", + "ParticipationOnly": false + }, + { + "Name": "Wallet3122", + "ParticipationOnly": false + }, + { + "Name": "Wallet3123", + "ParticipationOnly": false + }, + { + "Name": "Wallet3124", + "ParticipationOnly": false + }, + { + "Name": "Wallet3125", + "ParticipationOnly": false + }, + { + "Name": "Wallet3126", + "ParticipationOnly": false + }, + { + "Name": "Wallet3127", + "ParticipationOnly": false + }, + { + "Name": "Wallet3128", + "ParticipationOnly": false + }, + { + "Name": "Wallet3129", + "ParticipationOnly": false + }, + { + "Name": "Wallet3130", + "ParticipationOnly": false + }, + { + "Name": "Wallet3131", + "ParticipationOnly": false + }, + { + "Name": "Wallet3132", + "ParticipationOnly": false + }, + { + "Name": "Wallet3133", + "ParticipationOnly": false + }, + { + "Name": "Wallet3134", + "ParticipationOnly": false + }, + { + "Name": "Wallet3135", + "ParticipationOnly": false + }, + { + "Name": "Wallet3136", + "ParticipationOnly": false + }, + { + "Name": "Wallet3137", + "ParticipationOnly": false + }, + { + "Name": "Wallet3138", + "ParticipationOnly": false + }, + { + "Name": "Wallet3139", + "ParticipationOnly": false + }, + { + "Name": "Wallet3140", + "ParticipationOnly": false + }, + { + "Name": "Wallet3141", + "ParticipationOnly": false + }, + { + "Name": "Wallet3142", + "ParticipationOnly": false + }, + { + "Name": "Wallet3143", + "ParticipationOnly": false + }, + { + "Name": "Wallet3144", + "ParticipationOnly": false + }, + { + "Name": "Wallet3145", + "ParticipationOnly": false + }, + { + "Name": "Wallet3146", + "ParticipationOnly": false + }, + { + "Name": "Wallet3147", + "ParticipationOnly": false + }, + { + "Name": "Wallet3148", + "ParticipationOnly": false + }, + { + "Name": "Wallet3149", + "ParticipationOnly": false + }, + { + "Name": "Wallet3150", + "ParticipationOnly": false + }, + { + "Name": "Wallet3151", + "ParticipationOnly": false + }, + { + "Name": "Wallet3152", + "ParticipationOnly": false + }, + { + "Name": "Wallet3153", + "ParticipationOnly": false + }, + { + "Name": "Wallet3154", + "ParticipationOnly": false + }, + { + "Name": "Wallet3155", + "ParticipationOnly": false + }, + { + "Name": "Wallet3156", + "ParticipationOnly": false + }, + { + "Name": "Wallet3157", + "ParticipationOnly": false + }, + { + "Name": "Wallet3158", + "ParticipationOnly": false + }, + { + "Name": "Wallet3159", + "ParticipationOnly": false + }, + { + "Name": "Wallet3160", + "ParticipationOnly": false + }, + { + "Name": "Wallet3161", + "ParticipationOnly": false + }, + { + "Name": "Wallet3162", + "ParticipationOnly": false + }, + { + "Name": "Wallet3163", + "ParticipationOnly": false + }, + { + "Name": "Wallet3164", + "ParticipationOnly": false + }, + { + "Name": "Wallet3165", + "ParticipationOnly": false + }, + { + "Name": "Wallet3166", + "ParticipationOnly": false + }, + { + "Name": "Wallet3167", + "ParticipationOnly": false + }, + { + "Name": "Wallet3168", + "ParticipationOnly": false + }, + { + "Name": "Wallet3169", + "ParticipationOnly": false + }, + { + "Name": "Wallet3170", + "ParticipationOnly": false + }, + { + "Name": "Wallet3171", + "ParticipationOnly": false + }, + { + "Name": "Wallet3172", + "ParticipationOnly": false + }, + { + "Name": "Wallet3173", + "ParticipationOnly": false + }, + { + "Name": "Wallet3174", + "ParticipationOnly": false + }, + { + "Name": "Wallet3175", + "ParticipationOnly": false + }, + { + "Name": "Wallet3176", + "ParticipationOnly": false + }, + { + "Name": "Wallet3177", + "ParticipationOnly": false + }, + { + "Name": "Wallet3178", + "ParticipationOnly": false + }, + { + "Name": "Wallet3179", + "ParticipationOnly": false + }, + { + "Name": "Wallet3180", + "ParticipationOnly": false + }, + { + "Name": "Wallet3181", + "ParticipationOnly": false + }, + { + "Name": "Wallet3182", + "ParticipationOnly": false + }, + { + "Name": "Wallet3183", + "ParticipationOnly": false + }, + { + "Name": "Wallet3184", + "ParticipationOnly": false + }, + { + "Name": "Wallet3185", + "ParticipationOnly": false + }, + { + "Name": "Wallet3186", + "ParticipationOnly": false + }, + { + "Name": "Wallet3187", + "ParticipationOnly": false + }, + { + "Name": "Wallet3188", + "ParticipationOnly": false + }, + { + "Name": "Wallet3189", + "ParticipationOnly": false + }, + { + "Name": "Wallet3190", + "ParticipationOnly": false + }, + { + "Name": "Wallet3191", + "ParticipationOnly": false + }, + { + "Name": "Wallet3192", + "ParticipationOnly": false + }, + { + "Name": "Wallet3193", + "ParticipationOnly": false + }, + { + "Name": "Wallet3194", + "ParticipationOnly": false + }, + { + "Name": "Wallet3195", + "ParticipationOnly": false + }, + { + "Name": "Wallet3196", + "ParticipationOnly": false + }, + { + "Name": "Wallet3197", + "ParticipationOnly": false + }, + { + "Name": "Wallet3198", + "ParticipationOnly": false + }, + { + "Name": "Wallet3199", + "ParticipationOnly": false + }, + { + "Name": "Wallet3200", + "ParticipationOnly": false + }, + { + "Name": "Wallet3201", + "ParticipationOnly": false + }, + { + "Name": "Wallet3202", + "ParticipationOnly": false + }, + { + "Name": "Wallet3203", + "ParticipationOnly": false + }, + { + "Name": "Wallet3204", + "ParticipationOnly": false + }, + { + "Name": "Wallet3205", + "ParticipationOnly": false + }, + { + "Name": "Wallet3206", + "ParticipationOnly": false + }, + { + "Name": "Wallet3207", + "ParticipationOnly": false + }, + { + "Name": "Wallet3208", + "ParticipationOnly": false + }, + { + "Name": "Wallet3209", + "ParticipationOnly": false + }, + { + "Name": "Wallet3210", + "ParticipationOnly": false + }, + { + "Name": "Wallet3211", + "ParticipationOnly": false + }, + { + "Name": "Wallet3212", + "ParticipationOnly": false + }, + { + "Name": "Wallet3213", + "ParticipationOnly": false + }, + { + "Name": "Wallet3214", + "ParticipationOnly": false + }, + { + "Name": "Wallet3215", + "ParticipationOnly": false + }, + { + "Name": "Wallet3216", + "ParticipationOnly": false + }, + { + "Name": "Wallet3217", + "ParticipationOnly": false + }, + { + "Name": "Wallet3218", + "ParticipationOnly": false + }, + { + "Name": "Wallet3219", + "ParticipationOnly": false + }, + { + "Name": "Wallet3220", + "ParticipationOnly": false + }, + { + "Name": "Wallet3221", + "ParticipationOnly": false + }, + { + "Name": "Wallet3222", + "ParticipationOnly": false + }, + { + "Name": "Wallet3223", + "ParticipationOnly": false + }, + { + "Name": "Wallet3224", + "ParticipationOnly": false + }, + { + "Name": "Wallet3225", + "ParticipationOnly": false + }, + { + "Name": "Wallet3226", + "ParticipationOnly": false + }, + { + "Name": "Wallet3227", + "ParticipationOnly": false + }, + { + "Name": "Wallet3228", + "ParticipationOnly": false + }, + { + "Name": "Wallet3229", + "ParticipationOnly": false + }, + { + "Name": "Wallet3230", + "ParticipationOnly": false + }, + { + "Name": "Wallet3231", + "ParticipationOnly": false + }, + { + "Name": "Wallet3232", + "ParticipationOnly": false + }, + { + "Name": "Wallet3233", + "ParticipationOnly": false + }, + { + "Name": "Wallet3234", + "ParticipationOnly": false + }, + { + "Name": "Wallet3235", + "ParticipationOnly": false + }, + { + "Name": "Wallet3236", + "ParticipationOnly": false + }, + { + "Name": "Wallet3237", + "ParticipationOnly": false + }, + { + "Name": "Wallet3238", + "ParticipationOnly": false + }, + { + "Name": "Wallet3239", + "ParticipationOnly": false + }, + { + "Name": "Wallet3240", + "ParticipationOnly": false + }, + { + "Name": "Wallet3241", + "ParticipationOnly": false + }, + { + "Name": "Wallet3242", + "ParticipationOnly": false + }, + { + "Name": "Wallet3243", + "ParticipationOnly": false + }, + { + "Name": "Wallet3244", + "ParticipationOnly": false + }, + { + "Name": "Wallet3245", + "ParticipationOnly": false + }, + { + "Name": "Wallet3246", + "ParticipationOnly": false + }, + { + "Name": "Wallet3247", + "ParticipationOnly": false + }, + { + "Name": "Wallet3248", + "ParticipationOnly": false + }, + { + "Name": "Wallet3249", + "ParticipationOnly": false + }, + { + "Name": "Wallet3250", + "ParticipationOnly": false + }, + { + "Name": "Wallet3251", + "ParticipationOnly": false + }, + { + "Name": "Wallet3252", + "ParticipationOnly": false + }, + { + "Name": "Wallet3253", + "ParticipationOnly": false + }, + { + "Name": "Wallet3254", + "ParticipationOnly": false + }, + { + "Name": "Wallet3255", + "ParticipationOnly": false + }, + { + "Name": "Wallet3256", + "ParticipationOnly": false + }, + { + "Name": "Wallet3257", + "ParticipationOnly": false + }, + { + "Name": "Wallet3258", + "ParticipationOnly": false + }, + { + "Name": "Wallet3259", + "ParticipationOnly": false + }, + { + "Name": "Wallet3260", + "ParticipationOnly": false + }, + { + "Name": "Wallet3261", + "ParticipationOnly": false + }, + { + "Name": "Wallet3262", + "ParticipationOnly": false + }, + { + "Name": "Wallet3263", + "ParticipationOnly": false + }, + { + "Name": "Wallet3264", + "ParticipationOnly": false + }, + { + "Name": "Wallet3265", + "ParticipationOnly": false + }, + { + "Name": "Wallet3266", + "ParticipationOnly": false + }, + { + "Name": "Wallet3267", + "ParticipationOnly": false + }, + { + "Name": "Wallet3268", + "ParticipationOnly": false + }, + { + "Name": "Wallet3269", + "ParticipationOnly": false + }, + { + "Name": "Wallet3270", + "ParticipationOnly": false + }, + { + "Name": "Wallet3271", + "ParticipationOnly": false + }, + { + "Name": "Wallet3272", + "ParticipationOnly": false + }, + { + "Name": "Wallet3273", + "ParticipationOnly": false + }, + { + "Name": "Wallet3274", + "ParticipationOnly": false + }, + { + "Name": "Wallet3275", + "ParticipationOnly": false + }, + { + "Name": "Wallet3276", + "ParticipationOnly": false + }, + { + "Name": "Wallet3277", + "ParticipationOnly": false + }, + { + "Name": "Wallet3278", + "ParticipationOnly": false + }, + { + "Name": "Wallet3279", + "ParticipationOnly": false + }, + { + "Name": "Wallet3280", + "ParticipationOnly": false + }, + { + "Name": "Wallet3281", + "ParticipationOnly": false + }, + { + "Name": "Wallet3282", + "ParticipationOnly": false + }, + { + "Name": "Wallet3283", + "ParticipationOnly": false + }, + { + "Name": "Wallet3284", + "ParticipationOnly": false + }, + { + "Name": "Wallet3285", + "ParticipationOnly": false + }, + { + "Name": "Wallet3286", + "ParticipationOnly": false + }, + { + "Name": "Wallet3287", + "ParticipationOnly": false + }, + { + "Name": "Wallet3288", + "ParticipationOnly": false + }, + { + "Name": "Wallet3289", + "ParticipationOnly": false + }, + { + "Name": "Wallet3290", + "ParticipationOnly": false + }, + { + "Name": "Wallet3291", + "ParticipationOnly": false + }, + { + "Name": "Wallet3292", + "ParticipationOnly": false + }, + { + "Name": "Wallet3293", + "ParticipationOnly": false + }, + { + "Name": "Wallet3294", + "ParticipationOnly": false + }, + { + "Name": "Wallet3295", + "ParticipationOnly": false + }, + { + "Name": "Wallet3296", + "ParticipationOnly": false + }, + { + "Name": "Wallet3297", + "ParticipationOnly": false + }, + { + "Name": "Wallet3298", + "ParticipationOnly": false + }, + { + "Name": "Wallet3299", + "ParticipationOnly": false + }, + { + "Name": "Wallet3300", + "ParticipationOnly": false + }, + { + "Name": "Wallet3301", + "ParticipationOnly": false + }, + { + "Name": "Wallet3302", + "ParticipationOnly": false + }, + { + "Name": "Wallet3303", + "ParticipationOnly": false + }, + { + "Name": "Wallet3304", + "ParticipationOnly": false + }, + { + "Name": "Wallet3305", + "ParticipationOnly": false + }, + { + "Name": "Wallet3306", + "ParticipationOnly": false + }, + { + "Name": "Wallet3307", + "ParticipationOnly": false + }, + { + "Name": "Wallet3308", + "ParticipationOnly": false + }, + { + "Name": "Wallet3309", + "ParticipationOnly": false + }, + { + "Name": "Wallet3310", + "ParticipationOnly": false + }, + { + "Name": "Wallet3311", + "ParticipationOnly": false + }, + { + "Name": "Wallet3312", + "ParticipationOnly": false + }, + { + "Name": "Wallet3313", + "ParticipationOnly": false + }, + { + "Name": "Wallet3314", + "ParticipationOnly": false + }, + { + "Name": "Wallet3315", + "ParticipationOnly": false + }, + { + "Name": "Wallet3316", + "ParticipationOnly": false + }, + { + "Name": "Wallet3317", + "ParticipationOnly": false + }, + { + "Name": "Wallet3318", + "ParticipationOnly": false + }, + { + "Name": "Wallet3319", + "ParticipationOnly": false + }, + { + "Name": "Wallet3320", + "ParticipationOnly": false + }, + { + "Name": "Wallet3321", + "ParticipationOnly": false + }, + { + "Name": "Wallet3322", + "ParticipationOnly": false + }, + { + "Name": "Wallet3323", + "ParticipationOnly": false + }, + { + "Name": "Wallet3324", + "ParticipationOnly": false + }, + { + "Name": "Wallet3325", + "ParticipationOnly": false + }, + { + "Name": "Wallet3326", + "ParticipationOnly": false + }, + { + "Name": "Wallet3327", + "ParticipationOnly": false + }, + { + "Name": "Wallet3328", + "ParticipationOnly": false + }, + { + "Name": "Wallet3329", + "ParticipationOnly": false + }, + { + "Name": "Wallet3330", + "ParticipationOnly": false + }, + { + "Name": "Wallet3331", + "ParticipationOnly": false + }, + { + "Name": "Wallet3332", + "ParticipationOnly": false + }, + { + "Name": "Wallet3333", + "ParticipationOnly": false + }, + { + "Name": "Wallet3334", + "ParticipationOnly": false + }, + { + "Name": "Wallet3335", + "ParticipationOnly": false + }, + { + "Name": "Wallet3336", + "ParticipationOnly": false + }, + { + "Name": "Wallet3337", + "ParticipationOnly": false + }, + { + "Name": "Wallet3338", + "ParticipationOnly": false + }, + { + "Name": "Wallet3339", + "ParticipationOnly": false + }, + { + "Name": "Wallet3340", + "ParticipationOnly": false + }, + { + "Name": "Wallet3341", + "ParticipationOnly": false + }, + { + "Name": "Wallet3342", + "ParticipationOnly": false + }, + { + "Name": "Wallet3343", + "ParticipationOnly": false + }, + { + "Name": "Wallet3344", + "ParticipationOnly": false + }, + { + "Name": "Wallet3345", + "ParticipationOnly": false + }, + { + "Name": "Wallet3346", + "ParticipationOnly": false + }, + { + "Name": "Wallet3347", + "ParticipationOnly": false + }, + { + "Name": "Wallet3348", + "ParticipationOnly": false + }, + { + "Name": "Wallet3349", + "ParticipationOnly": false + }, + { + "Name": "Wallet3350", + "ParticipationOnly": false + }, + { + "Name": "Wallet3351", + "ParticipationOnly": false + }, + { + "Name": "Wallet3352", + "ParticipationOnly": false + }, + { + "Name": "Wallet3353", + "ParticipationOnly": false + }, + { + "Name": "Wallet3354", + "ParticipationOnly": false + }, + { + "Name": "Wallet3355", + "ParticipationOnly": false + }, + { + "Name": "Wallet3356", + "ParticipationOnly": false + }, + { + "Name": "Wallet3357", + "ParticipationOnly": false + }, + { + "Name": "Wallet3358", + "ParticipationOnly": false + }, + { + "Name": "Wallet3359", + "ParticipationOnly": false + }, + { + "Name": "Wallet3360", + "ParticipationOnly": false + }, + { + "Name": "Wallet3361", + "ParticipationOnly": false + }, + { + "Name": "Wallet3362", + "ParticipationOnly": false + }, + { + "Name": "Wallet3363", + "ParticipationOnly": false + }, + { + "Name": "Wallet3364", + "ParticipationOnly": false + }, + { + "Name": "Wallet3365", + "ParticipationOnly": false + }, + { + "Name": "Wallet3366", + "ParticipationOnly": false + }, + { + "Name": "Wallet3367", + "ParticipationOnly": false + }, + { + "Name": "Wallet3368", + "ParticipationOnly": false + }, + { + "Name": "Wallet3369", + "ParticipationOnly": false + }, + { + "Name": "Wallet3370", + "ParticipationOnly": false + }, + { + "Name": "Wallet3371", + "ParticipationOnly": false + }, + { + "Name": "Wallet3372", + "ParticipationOnly": false + }, + { + "Name": "Wallet3373", + "ParticipationOnly": false + }, + { + "Name": "Wallet3374", + "ParticipationOnly": false + }, + { + "Name": "Wallet3375", + "ParticipationOnly": false + }, + { + "Name": "Wallet3376", + "ParticipationOnly": false + }, + { + "Name": "Wallet3377", + "ParticipationOnly": false + }, + { + "Name": "Wallet3378", + "ParticipationOnly": false + }, + { + "Name": "Wallet3379", + "ParticipationOnly": false + }, + { + "Name": "Wallet3380", + "ParticipationOnly": false + }, + { + "Name": "Wallet3381", + "ParticipationOnly": false + }, + { + "Name": "Wallet3382", + "ParticipationOnly": false + }, + { + "Name": "Wallet3383", + "ParticipationOnly": false + }, + { + "Name": "Wallet3384", + "ParticipationOnly": false + }, + { + "Name": "Wallet3385", + "ParticipationOnly": false + }, + { + "Name": "Wallet3386", + "ParticipationOnly": false + }, + { + "Name": "Wallet3387", + "ParticipationOnly": false + }, + { + "Name": "Wallet3388", + "ParticipationOnly": false + }, + { + "Name": "Wallet3389", + "ParticipationOnly": false + }, + { + "Name": "Wallet3390", + "ParticipationOnly": false + }, + { + "Name": "Wallet3391", + "ParticipationOnly": false + }, + { + "Name": "Wallet3392", + "ParticipationOnly": false + }, + { + "Name": "Wallet3393", + "ParticipationOnly": false + }, + { + "Name": "Wallet3394", + "ParticipationOnly": false + }, + { + "Name": "Wallet3395", + "ParticipationOnly": false + }, + { + "Name": "Wallet3396", + "ParticipationOnly": false + }, + { + "Name": "Wallet3397", + "ParticipationOnly": false + }, + { + "Name": "Wallet3398", + "ParticipationOnly": false + }, + { + "Name": "Wallet3399", + "ParticipationOnly": false + }, + { + "Name": "Wallet3400", + "ParticipationOnly": false + }, + { + "Name": "Wallet3401", + "ParticipationOnly": false + }, + { + "Name": "Wallet3402", + "ParticipationOnly": false + }, + { + "Name": "Wallet3403", + "ParticipationOnly": false + }, + { + "Name": "Wallet3404", + "ParticipationOnly": false + }, + { + "Name": "Wallet3405", + "ParticipationOnly": false + }, + { + "Name": "Wallet3406", + "ParticipationOnly": false + }, + { + "Name": "Wallet3407", + "ParticipationOnly": false + }, + { + "Name": "Wallet3408", + "ParticipationOnly": false + }, + { + "Name": "Wallet3409", + "ParticipationOnly": false + }, + { + "Name": "Wallet3410", + "ParticipationOnly": false + }, + { + "Name": "Wallet3411", + "ParticipationOnly": false + }, + { + "Name": "Wallet3412", + "ParticipationOnly": false + }, + { + "Name": "Wallet3413", + "ParticipationOnly": false + }, + { + "Name": "Wallet3414", + "ParticipationOnly": false + }, + { + "Name": "Wallet3415", + "ParticipationOnly": false + }, + { + "Name": "Wallet3416", + "ParticipationOnly": false + }, + { + "Name": "Wallet3417", + "ParticipationOnly": false + }, + { + "Name": "Wallet3418", + "ParticipationOnly": false + }, + { + "Name": "Wallet3419", + "ParticipationOnly": false + }, + { + "Name": "Wallet3420", + "ParticipationOnly": false + }, + { + "Name": "Wallet3421", + "ParticipationOnly": false + }, + { + "Name": "Wallet3422", + "ParticipationOnly": false + }, + { + "Name": "Wallet3423", + "ParticipationOnly": false + }, + { + "Name": "Wallet3424", + "ParticipationOnly": false + }, + { + "Name": "Wallet3425", + "ParticipationOnly": false + }, + { + "Name": "Wallet3426", + "ParticipationOnly": false + }, + { + "Name": "Wallet3427", + "ParticipationOnly": false + }, + { + "Name": "Wallet3428", + "ParticipationOnly": false + }, + { + "Name": "Wallet3429", + "ParticipationOnly": false + }, + { + "Name": "Wallet3430", + "ParticipationOnly": false + }, + { + "Name": "Wallet3431", + "ParticipationOnly": false + }, + { + "Name": "Wallet3432", + "ParticipationOnly": false + }, + { + "Name": "Wallet3433", + "ParticipationOnly": false + }, + { + "Name": "Wallet3434", + "ParticipationOnly": false + }, + { + "Name": "Wallet3435", + "ParticipationOnly": false + }, + { + "Name": "Wallet3436", + "ParticipationOnly": false + }, + { + "Name": "Wallet3437", + "ParticipationOnly": false + }, + { + "Name": "Wallet3438", + "ParticipationOnly": false + }, + { + "Name": "Wallet3439", + "ParticipationOnly": false + }, + { + "Name": "Wallet3440", + "ParticipationOnly": false + }, + { + "Name": "Wallet3441", + "ParticipationOnly": false + }, + { + "Name": "Wallet3442", + "ParticipationOnly": false + }, + { + "Name": "Wallet3443", + "ParticipationOnly": false + }, + { + "Name": "Wallet3444", + "ParticipationOnly": false + }, + { + "Name": "Wallet3445", + "ParticipationOnly": false + }, + { + "Name": "Wallet3446", + "ParticipationOnly": false + }, + { + "Name": "Wallet3447", + "ParticipationOnly": false + }, + { + "Name": "Wallet3448", + "ParticipationOnly": false + }, + { + "Name": "Wallet3449", + "ParticipationOnly": false + }, + { + "Name": "Wallet3450", + "ParticipationOnly": false + }, + { + "Name": "Wallet3451", + "ParticipationOnly": false + }, + { + "Name": "Wallet3452", + "ParticipationOnly": false + }, + { + "Name": "Wallet3453", + "ParticipationOnly": false + }, + { + "Name": "Wallet3454", + "ParticipationOnly": false + }, + { + "Name": "Wallet3455", + "ParticipationOnly": false + }, + { + "Name": "Wallet3456", + "ParticipationOnly": false + }, + { + "Name": "Wallet3457", + "ParticipationOnly": false + }, + { + "Name": "Wallet3458", + "ParticipationOnly": false + }, + { + "Name": "Wallet3459", + "ParticipationOnly": false + }, + { + "Name": "Wallet3460", + "ParticipationOnly": false + }, + { + "Name": "Wallet3461", + "ParticipationOnly": false + }, + { + "Name": "Wallet3462", + "ParticipationOnly": false + }, + { + "Name": "Wallet3463", + "ParticipationOnly": false + }, + { + "Name": "Wallet3464", + "ParticipationOnly": false + }, + { + "Name": "Wallet3465", + "ParticipationOnly": false + }, + { + "Name": "Wallet3466", + "ParticipationOnly": false + }, + { + "Name": "Wallet3467", + "ParticipationOnly": false + }, + { + "Name": "Wallet3468", + "ParticipationOnly": false + }, + { + "Name": "Wallet3469", + "ParticipationOnly": false + }, + { + "Name": "Wallet3470", + "ParticipationOnly": false + }, + { + "Name": "Wallet3471", + "ParticipationOnly": false + }, + { + "Name": "Wallet3472", + "ParticipationOnly": false + }, + { + "Name": "Wallet3473", + "ParticipationOnly": false + }, + { + "Name": "Wallet3474", + "ParticipationOnly": false + }, + { + "Name": "Wallet3475", + "ParticipationOnly": false + }, + { + "Name": "Wallet3476", + "ParticipationOnly": false + }, + { + "Name": "Wallet3477", + "ParticipationOnly": false + }, + { + "Name": "Wallet3478", + "ParticipationOnly": false + }, + { + "Name": "Wallet3479", + "ParticipationOnly": false + }, + { + "Name": "Wallet3480", + "ParticipationOnly": false + }, + { + "Name": "Wallet3481", + "ParticipationOnly": false + }, + { + "Name": "Wallet3482", + "ParticipationOnly": false + }, + { + "Name": "Wallet3483", + "ParticipationOnly": false + }, + { + "Name": "Wallet3484", + "ParticipationOnly": false + }, + { + "Name": "Wallet3485", + "ParticipationOnly": false + }, + { + "Name": "Wallet3486", + "ParticipationOnly": false + }, + { + "Name": "Wallet3487", + "ParticipationOnly": false + }, + { + "Name": "Wallet3488", + "ParticipationOnly": false + }, + { + "Name": "Wallet3489", + "ParticipationOnly": false + }, + { + "Name": "Wallet3490", + "ParticipationOnly": false + }, + { + "Name": "Wallet3491", + "ParticipationOnly": false + }, + { + "Name": "Wallet3492", + "ParticipationOnly": false + }, + { + "Name": "Wallet3493", + "ParticipationOnly": false + }, + { + "Name": "Wallet3494", + "ParticipationOnly": false + }, + { + "Name": "Wallet3495", + "ParticipationOnly": false + }, + { + "Name": "Wallet3496", + "ParticipationOnly": false + }, + { + "Name": "Wallet3497", + "ParticipationOnly": false + }, + { + "Name": "Wallet3498", + "ParticipationOnly": false + }, + { + "Name": "Wallet3499", + "ParticipationOnly": false + }, + { + "Name": "Wallet3500", + "ParticipationOnly": false + }, + { + "Name": "Wallet3501", + "ParticipationOnly": false + }, + { + "Name": "Wallet3502", + "ParticipationOnly": false + }, + { + "Name": "Wallet3503", + "ParticipationOnly": false + }, + { + "Name": "Wallet3504", + "ParticipationOnly": false + }, + { + "Name": "Wallet3505", + "ParticipationOnly": false + }, + { + "Name": "Wallet3506", + "ParticipationOnly": false + }, + { + "Name": "Wallet3507", + "ParticipationOnly": false + }, + { + "Name": "Wallet3508", + "ParticipationOnly": false + }, + { + "Name": "Wallet3509", + "ParticipationOnly": false + }, + { + "Name": "Wallet3510", + "ParticipationOnly": false + }, + { + "Name": "Wallet3511", + "ParticipationOnly": false + }, + { + "Name": "Wallet3512", + "ParticipationOnly": false + }, + { + "Name": "Wallet3513", + "ParticipationOnly": false + }, + { + "Name": "Wallet3514", + "ParticipationOnly": false + }, + { + "Name": "Wallet3515", + "ParticipationOnly": false + }, + { + "Name": "Wallet3516", + "ParticipationOnly": false + }, + { + "Name": "Wallet3517", + "ParticipationOnly": false + }, + { + "Name": "Wallet3518", + "ParticipationOnly": false + }, + { + "Name": "Wallet3519", + "ParticipationOnly": false + }, + { + "Name": "Wallet3520", + "ParticipationOnly": false + }, + { + "Name": "Wallet3521", + "ParticipationOnly": false + }, + { + "Name": "Wallet3522", + "ParticipationOnly": false + }, + { + "Name": "Wallet3523", + "ParticipationOnly": false + }, + { + "Name": "Wallet3524", + "ParticipationOnly": false + }, + { + "Name": "Wallet3525", + "ParticipationOnly": false + }, + { + "Name": "Wallet3526", + "ParticipationOnly": false + }, + { + "Name": "Wallet3527", + "ParticipationOnly": false + }, + { + "Name": "Wallet3528", + "ParticipationOnly": false + }, + { + "Name": "Wallet3529", + "ParticipationOnly": false + }, + { + "Name": "Wallet3530", + "ParticipationOnly": false + }, + { + "Name": "Wallet3531", + "ParticipationOnly": false + }, + { + "Name": "Wallet3532", + "ParticipationOnly": false + }, + { + "Name": "Wallet3533", + "ParticipationOnly": false + }, + { + "Name": "Wallet3534", + "ParticipationOnly": false + }, + { + "Name": "Wallet3535", + "ParticipationOnly": false + }, + { + "Name": "Wallet3536", + "ParticipationOnly": false + }, + { + "Name": "Wallet3537", + "ParticipationOnly": false + }, + { + "Name": "Wallet3538", + "ParticipationOnly": false + }, + { + "Name": "Wallet3539", + "ParticipationOnly": false + }, + { + "Name": "Wallet3540", + "ParticipationOnly": false + }, + { + "Name": "Wallet3541", + "ParticipationOnly": false + }, + { + "Name": "Wallet3542", + "ParticipationOnly": false + }, + { + "Name": "Wallet3543", + "ParticipationOnly": false + }, + { + "Name": "Wallet3544", + "ParticipationOnly": false + }, + { + "Name": "Wallet3545", + "ParticipationOnly": false + }, + { + "Name": "Wallet3546", + "ParticipationOnly": false + }, + { + "Name": "Wallet3547", + "ParticipationOnly": false + }, + { + "Name": "Wallet3548", + "ParticipationOnly": false + }, + { + "Name": "Wallet3549", + "ParticipationOnly": false + }, + { + "Name": "Wallet3550", + "ParticipationOnly": false + }, + { + "Name": "Wallet3551", + "ParticipationOnly": false + }, + { + "Name": "Wallet3552", + "ParticipationOnly": false + }, + { + "Name": "Wallet3553", + "ParticipationOnly": false + }, + { + "Name": "Wallet3554", + "ParticipationOnly": false + }, + { + "Name": "Wallet3555", + "ParticipationOnly": false + }, + { + "Name": "Wallet3556", + "ParticipationOnly": false + }, + { + "Name": "Wallet3557", + "ParticipationOnly": false + }, + { + "Name": "Wallet3558", + "ParticipationOnly": false + }, + { + "Name": "Wallet3559", + "ParticipationOnly": false + }, + { + "Name": "Wallet3560", + "ParticipationOnly": false + }, + { + "Name": "Wallet3561", + "ParticipationOnly": false + }, + { + "Name": "Wallet3562", + "ParticipationOnly": false + }, + { + "Name": "Wallet3563", + "ParticipationOnly": false + }, + { + "Name": "Wallet3564", + "ParticipationOnly": false + }, + { + "Name": "Wallet3565", + "ParticipationOnly": false + }, + { + "Name": "Wallet3566", + "ParticipationOnly": false + }, + { + "Name": "Wallet3567", + "ParticipationOnly": false + }, + { + "Name": "Wallet3568", + "ParticipationOnly": false + }, + { + "Name": "Wallet3569", + "ParticipationOnly": false + }, + { + "Name": "Wallet3570", + "ParticipationOnly": false + }, + { + "Name": "Wallet3571", + "ParticipationOnly": false + }, + { + "Name": "Wallet3572", + "ParticipationOnly": false + }, + { + "Name": "Wallet3573", + "ParticipationOnly": false + }, + { + "Name": "Wallet3574", + "ParticipationOnly": false + }, + { + "Name": "Wallet3575", + "ParticipationOnly": false + }, + { + "Name": "Wallet3576", + "ParticipationOnly": false + }, + { + "Name": "Wallet3577", + "ParticipationOnly": false + }, + { + "Name": "Wallet3578", + "ParticipationOnly": false + }, + { + "Name": "Wallet3579", + "ParticipationOnly": false + }, + { + "Name": "Wallet3580", + "ParticipationOnly": false + }, + { + "Name": "Wallet3581", + "ParticipationOnly": false + }, + { + "Name": "Wallet3582", + "ParticipationOnly": false + }, + { + "Name": "Wallet3583", + "ParticipationOnly": false + }, + { + "Name": "Wallet3584", + "ParticipationOnly": false + }, + { + "Name": "Wallet3585", + "ParticipationOnly": false + }, + { + "Name": "Wallet3586", + "ParticipationOnly": false + }, + { + "Name": "Wallet3587", + "ParticipationOnly": false + }, + { + "Name": "Wallet3588", + "ParticipationOnly": false + }, + { + "Name": "Wallet3589", + "ParticipationOnly": false + }, + { + "Name": "Wallet3590", + "ParticipationOnly": false + }, + { + "Name": "Wallet3591", + "ParticipationOnly": false + }, + { + "Name": "Wallet3592", + "ParticipationOnly": false + }, + { + "Name": "Wallet3593", + "ParticipationOnly": false + }, + { + "Name": "Wallet3594", + "ParticipationOnly": false + }, + { + "Name": "Wallet3595", + "ParticipationOnly": false + }, + { + "Name": "Wallet3596", + "ParticipationOnly": false + }, + { + "Name": "Wallet3597", + "ParticipationOnly": false + }, + { + "Name": "Wallet3598", + "ParticipationOnly": false + }, + { + "Name": "Wallet3599", + "ParticipationOnly": false + }, + { + "Name": "Wallet3600", + "ParticipationOnly": false + }, + { + "Name": "Wallet3601", + "ParticipationOnly": false + }, + { + "Name": "Wallet3602", + "ParticipationOnly": false + }, + { + "Name": "Wallet3603", + "ParticipationOnly": false + }, + { + "Name": "Wallet3604", + "ParticipationOnly": false + }, + { + "Name": "Wallet3605", + "ParticipationOnly": false + }, + { + "Name": "Wallet3606", + "ParticipationOnly": false + }, + { + "Name": "Wallet3607", + "ParticipationOnly": false + }, + { + "Name": "Wallet3608", + "ParticipationOnly": false + }, + { + "Name": "Wallet3609", + "ParticipationOnly": false + }, + { + "Name": "Wallet3610", + "ParticipationOnly": false + }, + { + "Name": "Wallet3611", + "ParticipationOnly": false + }, + { + "Name": "Wallet3612", + "ParticipationOnly": false + }, + { + "Name": "Wallet3613", + "ParticipationOnly": false + }, + { + "Name": "Wallet3614", + "ParticipationOnly": false + }, + { + "Name": "Wallet3615", + "ParticipationOnly": false + }, + { + "Name": "Wallet3616", + "ParticipationOnly": false + }, + { + "Name": "Wallet3617", + "ParticipationOnly": false + }, + { + "Name": "Wallet3618", + "ParticipationOnly": false + }, + { + "Name": "Wallet3619", + "ParticipationOnly": false + }, + { + "Name": "Wallet3620", + "ParticipationOnly": false + }, + { + "Name": "Wallet3621", + "ParticipationOnly": false + }, + { + "Name": "Wallet3622", + "ParticipationOnly": false + }, + { + "Name": "Wallet3623", + "ParticipationOnly": false + }, + { + "Name": "Wallet3624", + "ParticipationOnly": false + }, + { + "Name": "Wallet3625", + "ParticipationOnly": false + }, + { + "Name": "Wallet3626", + "ParticipationOnly": false + }, + { + "Name": "Wallet3627", + "ParticipationOnly": false + }, + { + "Name": "Wallet3628", + "ParticipationOnly": false + }, + { + "Name": "Wallet3629", + "ParticipationOnly": false + }, + { + "Name": "Wallet3630", + "ParticipationOnly": false + }, + { + "Name": "Wallet3631", + "ParticipationOnly": false + }, + { + "Name": "Wallet3632", + "ParticipationOnly": false + }, + { + "Name": "Wallet3633", + "ParticipationOnly": false + }, + { + "Name": "Wallet3634", + "ParticipationOnly": false + }, + { + "Name": "Wallet3635", + "ParticipationOnly": false + }, + { + "Name": "Wallet3636", + "ParticipationOnly": false + }, + { + "Name": "Wallet3637", + "ParticipationOnly": false + }, + { + "Name": "Wallet3638", + "ParticipationOnly": false + }, + { + "Name": "Wallet3639", + "ParticipationOnly": false + }, + { + "Name": "Wallet3640", + "ParticipationOnly": false + }, + { + "Name": "Wallet3641", + "ParticipationOnly": false + }, + { + "Name": "Wallet3642", + "ParticipationOnly": false + }, + { + "Name": "Wallet3643", + "ParticipationOnly": false + }, + { + "Name": "Wallet3644", + "ParticipationOnly": false + }, + { + "Name": "Wallet3645", + "ParticipationOnly": false + }, + { + "Name": "Wallet3646", + "ParticipationOnly": false + }, + { + "Name": "Wallet3647", + "ParticipationOnly": false + }, + { + "Name": "Wallet3648", + "ParticipationOnly": false + }, + { + "Name": "Wallet3649", + "ParticipationOnly": false + }, + { + "Name": "Wallet3650", + "ParticipationOnly": false + }, + { + "Name": "Wallet3651", + "ParticipationOnly": false + }, + { + "Name": "Wallet3652", + "ParticipationOnly": false + }, + { + "Name": "Wallet3653", + "ParticipationOnly": false + }, + { + "Name": "Wallet3654", + "ParticipationOnly": false + }, + { + "Name": "Wallet3655", + "ParticipationOnly": false + }, + { + "Name": "Wallet3656", + "ParticipationOnly": false + }, + { + "Name": "Wallet3657", + "ParticipationOnly": false + }, + { + "Name": "Wallet3658", + "ParticipationOnly": false + }, + { + "Name": "Wallet3659", + "ParticipationOnly": false + }, + { + "Name": "Wallet3660", + "ParticipationOnly": false + }, + { + "Name": "Wallet3661", + "ParticipationOnly": false + }, + { + "Name": "Wallet3662", + "ParticipationOnly": false + }, + { + "Name": "Wallet3663", + "ParticipationOnly": false + }, + { + "Name": "Wallet3664", + "ParticipationOnly": false + }, + { + "Name": "Wallet3665", + "ParticipationOnly": false + }, + { + "Name": "Wallet3666", + "ParticipationOnly": false + }, + { + "Name": "Wallet3667", + "ParticipationOnly": false + }, + { + "Name": "Wallet3668", + "ParticipationOnly": false + }, + { + "Name": "Wallet3669", + "ParticipationOnly": false + }, + { + "Name": "Wallet3670", + "ParticipationOnly": false + }, + { + "Name": "Wallet3671", + "ParticipationOnly": false + }, + { + "Name": "Wallet3672", + "ParticipationOnly": false + }, + { + "Name": "Wallet3673", + "ParticipationOnly": false + }, + { + "Name": "Wallet3674", + "ParticipationOnly": false + }, + { + "Name": "Wallet3675", + "ParticipationOnly": false + }, + { + "Name": "Wallet3676", + "ParticipationOnly": false + }, + { + "Name": "Wallet3677", + "ParticipationOnly": false + }, + { + "Name": "Wallet3678", + "ParticipationOnly": false + }, + { + "Name": "Wallet3679", + "ParticipationOnly": false + }, + { + "Name": "Wallet3680", + "ParticipationOnly": false + }, + { + "Name": "Wallet3681", + "ParticipationOnly": false + }, + { + "Name": "Wallet3682", + "ParticipationOnly": false + }, + { + "Name": "Wallet3683", + "ParticipationOnly": false + }, + { + "Name": "Wallet3684", + "ParticipationOnly": false + }, + { + "Name": "Wallet3685", + "ParticipationOnly": false + }, + { + "Name": "Wallet3686", + "ParticipationOnly": false + }, + { + "Name": "Wallet3687", + "ParticipationOnly": false + }, + { + "Name": "Wallet3688", + "ParticipationOnly": false + }, + { + "Name": "Wallet3689", + "ParticipationOnly": false + }, + { + "Name": "Wallet3690", + "ParticipationOnly": false + }, + { + "Name": "Wallet3691", + "ParticipationOnly": false + }, + { + "Name": "Wallet3692", + "ParticipationOnly": false + }, + { + "Name": "Wallet3693", + "ParticipationOnly": false + }, + { + "Name": "Wallet3694", + "ParticipationOnly": false + }, + { + "Name": "Wallet3695", + "ParticipationOnly": false + }, + { + "Name": "Wallet3696", + "ParticipationOnly": false + }, + { + "Name": "Wallet3697", + "ParticipationOnly": false + }, + { + "Name": "Wallet3698", + "ParticipationOnly": false + }, + { + "Name": "Wallet3699", + "ParticipationOnly": false + }, + { + "Name": "Wallet3700", + "ParticipationOnly": false + }, + { + "Name": "Wallet3701", + "ParticipationOnly": false + }, + { + "Name": "Wallet3702", + "ParticipationOnly": false + }, + { + "Name": "Wallet3703", + "ParticipationOnly": false + }, + { + "Name": "Wallet3704", + "ParticipationOnly": false + }, + { + "Name": "Wallet3705", + "ParticipationOnly": false + }, + { + "Name": "Wallet3706", + "ParticipationOnly": false + }, + { + "Name": "Wallet3707", + "ParticipationOnly": false + }, + { + "Name": "Wallet3708", + "ParticipationOnly": false + }, + { + "Name": "Wallet3709", + "ParticipationOnly": false + }, + { + "Name": "Wallet3710", + "ParticipationOnly": false + }, + { + "Name": "Wallet3711", + "ParticipationOnly": false + }, + { + "Name": "Wallet3712", + "ParticipationOnly": false + }, + { + "Name": "Wallet3713", + "ParticipationOnly": false + }, + { + "Name": "Wallet3714", + "ParticipationOnly": false + }, + { + "Name": "Wallet3715", + "ParticipationOnly": false + }, + { + "Name": "Wallet3716", + "ParticipationOnly": false + }, + { + "Name": "Wallet3717", + "ParticipationOnly": false + }, + { + "Name": "Wallet3718", + "ParticipationOnly": false + }, + { + "Name": "Wallet3719", + "ParticipationOnly": false + }, + { + "Name": "Wallet3720", + "ParticipationOnly": false + }, + { + "Name": "Wallet3721", + "ParticipationOnly": false + }, + { + "Name": "Wallet3722", + "ParticipationOnly": false + }, + { + "Name": "Wallet3723", + "ParticipationOnly": false + }, + { + "Name": "Wallet3724", + "ParticipationOnly": false + }, + { + "Name": "Wallet3725", + "ParticipationOnly": false + }, + { + "Name": "Wallet3726", + "ParticipationOnly": false + }, + { + "Name": "Wallet3727", + "ParticipationOnly": false + }, + { + "Name": "Wallet3728", + "ParticipationOnly": false + }, + { + "Name": "Wallet3729", + "ParticipationOnly": false + }, + { + "Name": "Wallet3730", + "ParticipationOnly": false + }, + { + "Name": "Wallet3731", + "ParticipationOnly": false + }, + { + "Name": "Wallet3732", + "ParticipationOnly": false + }, + { + "Name": "Wallet3733", + "ParticipationOnly": false + }, + { + "Name": "Wallet3734", + "ParticipationOnly": false + }, + { + "Name": "Wallet3735", + "ParticipationOnly": false + }, + { + "Name": "Wallet3736", + "ParticipationOnly": false + }, + { + "Name": "Wallet3737", + "ParticipationOnly": false + }, + { + "Name": "Wallet3738", + "ParticipationOnly": false + }, + { + "Name": "Wallet3739", + "ParticipationOnly": false + }, + { + "Name": "Wallet3740", + "ParticipationOnly": false + }, + { + "Name": "Wallet3741", + "ParticipationOnly": false + }, + { + "Name": "Wallet3742", + "ParticipationOnly": false + }, + { + "Name": "Wallet3743", + "ParticipationOnly": false + }, + { + "Name": "Wallet3744", + "ParticipationOnly": false + }, + { + "Name": "Wallet3745", + "ParticipationOnly": false + }, + { + "Name": "Wallet3746", + "ParticipationOnly": false + }, + { + "Name": "Wallet3747", + "ParticipationOnly": false + }, + { + "Name": "Wallet3748", + "ParticipationOnly": false + }, + { + "Name": "Wallet3749", + "ParticipationOnly": false + }, + { + "Name": "Wallet3750", + "ParticipationOnly": false + }, + { + "Name": "Wallet3751", + "ParticipationOnly": false + }, + { + "Name": "Wallet3752", + "ParticipationOnly": false + }, + { + "Name": "Wallet3753", + "ParticipationOnly": false + }, + { + "Name": "Wallet3754", + "ParticipationOnly": false + }, + { + "Name": "Wallet3755", + "ParticipationOnly": false + }, + { + "Name": "Wallet3756", + "ParticipationOnly": false + }, + { + "Name": "Wallet3757", + "ParticipationOnly": false + }, + { + "Name": "Wallet3758", + "ParticipationOnly": false + }, + { + "Name": "Wallet3759", + "ParticipationOnly": false + }, + { + "Name": "Wallet3760", + "ParticipationOnly": false + }, + { + "Name": "Wallet3761", + "ParticipationOnly": false + }, + { + "Name": "Wallet3762", + "ParticipationOnly": false + }, + { + "Name": "Wallet3763", + "ParticipationOnly": false + }, + { + "Name": "Wallet3764", + "ParticipationOnly": false + }, + { + "Name": "Wallet3765", + "ParticipationOnly": false + }, + { + "Name": "Wallet3766", + "ParticipationOnly": false + }, + { + "Name": "Wallet3767", + "ParticipationOnly": false + }, + { + "Name": "Wallet3768", + "ParticipationOnly": false + }, + { + "Name": "Wallet3769", + "ParticipationOnly": false + }, + { + "Name": "Wallet3770", + "ParticipationOnly": false + }, + { + "Name": "Wallet3771", + "ParticipationOnly": false + }, + { + "Name": "Wallet3772", + "ParticipationOnly": false + }, + { + "Name": "Wallet3773", + "ParticipationOnly": false + }, + { + "Name": "Wallet3774", + "ParticipationOnly": false + }, + { + "Name": "Wallet3775", + "ParticipationOnly": false + }, + { + "Name": "Wallet3776", + "ParticipationOnly": false + }, + { + "Name": "Wallet3777", + "ParticipationOnly": false + }, + { + "Name": "Wallet3778", + "ParticipationOnly": false + }, + { + "Name": "Wallet3779", + "ParticipationOnly": false + }, + { + "Name": "Wallet3780", + "ParticipationOnly": false + }, + { + "Name": "Wallet3781", + "ParticipationOnly": false + }, + { + "Name": "Wallet3782", + "ParticipationOnly": false + }, + { + "Name": "Wallet3783", + "ParticipationOnly": false + }, + { + "Name": "Wallet3784", + "ParticipationOnly": false + }, + { + "Name": "Wallet3785", + "ParticipationOnly": false + }, + { + "Name": "Wallet3786", + "ParticipationOnly": false + }, + { + "Name": "Wallet3787", + "ParticipationOnly": false + }, + { + "Name": "Wallet3788", + "ParticipationOnly": false + }, + { + "Name": "Wallet3789", + "ParticipationOnly": false + }, + { + "Name": "Wallet3790", + "ParticipationOnly": false + }, + { + "Name": "Wallet3791", + "ParticipationOnly": false + }, + { + "Name": "Wallet3792", + "ParticipationOnly": false + }, + { + "Name": "Wallet3793", + "ParticipationOnly": false + }, + { + "Name": "Wallet3794", + "ParticipationOnly": false + }, + { + "Name": "Wallet3795", + "ParticipationOnly": false + }, + { + "Name": "Wallet3796", + "ParticipationOnly": false + }, + { + "Name": "Wallet3797", + "ParticipationOnly": false + }, + { + "Name": "Wallet3798", + "ParticipationOnly": false + }, + { + "Name": "Wallet3799", + "ParticipationOnly": false + }, + { + "Name": "Wallet3800", + "ParticipationOnly": false + }, + { + "Name": "Wallet3801", + "ParticipationOnly": false + }, + { + "Name": "Wallet3802", + "ParticipationOnly": false + }, + { + "Name": "Wallet3803", + "ParticipationOnly": false + }, + { + "Name": "Wallet3804", + "ParticipationOnly": false + }, + { + "Name": "Wallet3805", + "ParticipationOnly": false + }, + { + "Name": "Wallet3806", + "ParticipationOnly": false + }, + { + "Name": "Wallet3807", + "ParticipationOnly": false + }, + { + "Name": "Wallet3808", + "ParticipationOnly": false + }, + { + "Name": "Wallet3809", + "ParticipationOnly": false + }, + { + "Name": "Wallet3810", + "ParticipationOnly": false + }, + { + "Name": "Wallet3811", + "ParticipationOnly": false + }, + { + "Name": "Wallet3812", + "ParticipationOnly": false + }, + { + "Name": "Wallet3813", + "ParticipationOnly": false + }, + { + "Name": "Wallet3814", + "ParticipationOnly": false + }, + { + "Name": "Wallet3815", + "ParticipationOnly": false + }, + { + "Name": "Wallet3816", + "ParticipationOnly": false + }, + { + "Name": "Wallet3817", + "ParticipationOnly": false + }, + { + "Name": "Wallet3818", + "ParticipationOnly": false + }, + { + "Name": "Wallet3819", + "ParticipationOnly": false + }, + { + "Name": "Wallet3820", + "ParticipationOnly": false + }, + { + "Name": "Wallet3821", + "ParticipationOnly": false + }, + { + "Name": "Wallet3822", + "ParticipationOnly": false + }, + { + "Name": "Wallet3823", + "ParticipationOnly": false + }, + { + "Name": "Wallet3824", + "ParticipationOnly": false + }, + { + "Name": "Wallet3825", + "ParticipationOnly": false + }, + { + "Name": "Wallet3826", + "ParticipationOnly": false + }, + { + "Name": "Wallet3827", + "ParticipationOnly": false + }, + { + "Name": "Wallet3828", + "ParticipationOnly": false + }, + { + "Name": "Wallet3829", + "ParticipationOnly": false + }, + { + "Name": "Wallet3830", + "ParticipationOnly": false + }, + { + "Name": "Wallet3831", + "ParticipationOnly": false + }, + { + "Name": "Wallet3832", + "ParticipationOnly": false + }, + { + "Name": "Wallet3833", + "ParticipationOnly": false + }, + { + "Name": "Wallet3834", + "ParticipationOnly": false + }, + { + "Name": "Wallet3835", + "ParticipationOnly": false + }, + { + "Name": "Wallet3836", + "ParticipationOnly": false + }, + { + "Name": "Wallet3837", + "ParticipationOnly": false + }, + { + "Name": "Wallet3838", + "ParticipationOnly": false + }, + { + "Name": "Wallet3839", + "ParticipationOnly": false + }, + { + "Name": "Wallet3840", + "ParticipationOnly": false + }, + { + "Name": "Wallet3841", + "ParticipationOnly": false + }, + { + "Name": "Wallet3842", + "ParticipationOnly": false + }, + { + "Name": "Wallet3843", + "ParticipationOnly": false + }, + { + "Name": "Wallet3844", + "ParticipationOnly": false + }, + { + "Name": "Wallet3845", + "ParticipationOnly": false + }, + { + "Name": "Wallet3846", + "ParticipationOnly": false + }, + { + "Name": "Wallet3847", + "ParticipationOnly": false + }, + { + "Name": "Wallet3848", + "ParticipationOnly": false + }, + { + "Name": "Wallet3849", + "ParticipationOnly": false + }, + { + "Name": "Wallet3850", + "ParticipationOnly": false + }, + { + "Name": "Wallet3851", + "ParticipationOnly": false + }, + { + "Name": "Wallet3852", + "ParticipationOnly": false + }, + { + "Name": "Wallet3853", + "ParticipationOnly": false + }, + { + "Name": "Wallet3854", + "ParticipationOnly": false + }, + { + "Name": "Wallet3855", + "ParticipationOnly": false + }, + { + "Name": "Wallet3856", + "ParticipationOnly": false + }, + { + "Name": "Wallet3857", + "ParticipationOnly": false + }, + { + "Name": "Wallet3858", + "ParticipationOnly": false + }, + { + "Name": "Wallet3859", + "ParticipationOnly": false + }, + { + "Name": "Wallet3860", + "ParticipationOnly": false + }, + { + "Name": "Wallet3861", + "ParticipationOnly": false + }, + { + "Name": "Wallet3862", + "ParticipationOnly": false + }, + { + "Name": "Wallet3863", + "ParticipationOnly": false + }, + { + "Name": "Wallet3864", + "ParticipationOnly": false + }, + { + "Name": "Wallet3865", + "ParticipationOnly": false + }, + { + "Name": "Wallet3866", + "ParticipationOnly": false + }, + { + "Name": "Wallet3867", + "ParticipationOnly": false + }, + { + "Name": "Wallet3868", + "ParticipationOnly": false + }, + { + "Name": "Wallet3869", + "ParticipationOnly": false + }, + { + "Name": "Wallet3870", + "ParticipationOnly": false + }, + { + "Name": "Wallet3871", + "ParticipationOnly": false + }, + { + "Name": "Wallet3872", + "ParticipationOnly": false + }, + { + "Name": "Wallet3873", + "ParticipationOnly": false + }, + { + "Name": "Wallet3874", + "ParticipationOnly": false + }, + { + "Name": "Wallet3875", + "ParticipationOnly": false + }, + { + "Name": "Wallet3876", + "ParticipationOnly": false + }, + { + "Name": "Wallet3877", + "ParticipationOnly": false + }, + { + "Name": "Wallet3878", + "ParticipationOnly": false + }, + { + "Name": "Wallet3879", + "ParticipationOnly": false + }, + { + "Name": "Wallet3880", + "ParticipationOnly": false + }, + { + "Name": "Wallet3881", + "ParticipationOnly": false + }, + { + "Name": "Wallet3882", + "ParticipationOnly": false + }, + { + "Name": "Wallet3883", + "ParticipationOnly": false + }, + { + "Name": "Wallet3884", + "ParticipationOnly": false + }, + { + "Name": "Wallet3885", + "ParticipationOnly": false + }, + { + "Name": "Wallet3886", + "ParticipationOnly": false + }, + { + "Name": "Wallet3887", + "ParticipationOnly": false + }, + { + "Name": "Wallet3888", + "ParticipationOnly": false + }, + { + "Name": "Wallet3889", + "ParticipationOnly": false + }, + { + "Name": "Wallet3890", + "ParticipationOnly": false + }, + { + "Name": "Wallet3891", + "ParticipationOnly": false + }, + { + "Name": "Wallet3892", + "ParticipationOnly": false + }, + { + "Name": "Wallet3893", + "ParticipationOnly": false + }, + { + "Name": "Wallet3894", + "ParticipationOnly": false + }, + { + "Name": "Wallet3895", + "ParticipationOnly": false + }, + { + "Name": "Wallet3896", + "ParticipationOnly": false + }, + { + "Name": "Wallet3897", + "ParticipationOnly": false + }, + { + "Name": "Wallet3898", + "ParticipationOnly": false + }, + { + "Name": "Wallet3899", + "ParticipationOnly": false + }, + { + "Name": "Wallet3900", + "ParticipationOnly": false + }, + { + "Name": "Wallet3901", + "ParticipationOnly": false + }, + { + "Name": "Wallet3902", + "ParticipationOnly": false + }, + { + "Name": "Wallet3903", + "ParticipationOnly": false + }, + { + "Name": "Wallet3904", + "ParticipationOnly": false + }, + { + "Name": "Wallet3905", + "ParticipationOnly": false + }, + { + "Name": "Wallet3906", + "ParticipationOnly": false + }, + { + "Name": "Wallet3907", + "ParticipationOnly": false + }, + { + "Name": "Wallet3908", + "ParticipationOnly": false + }, + { + "Name": "Wallet3909", + "ParticipationOnly": false + }, + { + "Name": "Wallet3910", + "ParticipationOnly": false + }, + { + "Name": "Wallet3911", + "ParticipationOnly": false + }, + { + "Name": "Wallet3912", + "ParticipationOnly": false + }, + { + "Name": "Wallet3913", + "ParticipationOnly": false + }, + { + "Name": "Wallet3914", + "ParticipationOnly": false + }, + { + "Name": "Wallet3915", + "ParticipationOnly": false + }, + { + "Name": "Wallet3916", + "ParticipationOnly": false + }, + { + "Name": "Wallet3917", + "ParticipationOnly": false + }, + { + "Name": "Wallet3918", + "ParticipationOnly": false + }, + { + "Name": "Wallet3919", + "ParticipationOnly": false + }, + { + "Name": "Wallet3920", + "ParticipationOnly": false + }, + { + "Name": "Wallet3921", + "ParticipationOnly": false + }, + { + "Name": "Wallet3922", + "ParticipationOnly": false + }, + { + "Name": "Wallet3923", + "ParticipationOnly": false + }, + { + "Name": "Wallet3924", + "ParticipationOnly": false + }, + { + "Name": "Wallet3925", + "ParticipationOnly": false + }, + { + "Name": "Wallet3926", + "ParticipationOnly": false + }, + { + "Name": "Wallet3927", + "ParticipationOnly": false + }, + { + "Name": "Wallet3928", + "ParticipationOnly": false + }, + { + "Name": "Wallet3929", + "ParticipationOnly": false + }, + { + "Name": "Wallet3930", + "ParticipationOnly": false + }, + { + "Name": "Wallet3931", + "ParticipationOnly": false + }, + { + "Name": "Wallet3932", + "ParticipationOnly": false + }, + { + "Name": "Wallet3933", + "ParticipationOnly": false + }, + { + "Name": "Wallet3934", + "ParticipationOnly": false + }, + { + "Name": "Wallet3935", + "ParticipationOnly": false + }, + { + "Name": "Wallet3936", + "ParticipationOnly": false + }, + { + "Name": "Wallet3937", + "ParticipationOnly": false + }, + { + "Name": "Wallet3938", + "ParticipationOnly": false + }, + { + "Name": "Wallet3939", + "ParticipationOnly": false + }, + { + "Name": "Wallet3940", + "ParticipationOnly": false + }, + { + "Name": "Wallet3941", + "ParticipationOnly": false + }, + { + "Name": "Wallet3942", + "ParticipationOnly": false + }, + { + "Name": "Wallet3943", + "ParticipationOnly": false + }, + { + "Name": "Wallet3944", + "ParticipationOnly": false + }, + { + "Name": "Wallet3945", + "ParticipationOnly": false + }, + { + "Name": "Wallet3946", + "ParticipationOnly": false + }, + { + "Name": "Wallet3947", + "ParticipationOnly": false + }, + { + "Name": "Wallet3948", + "ParticipationOnly": false + }, + { + "Name": "Wallet3949", + "ParticipationOnly": false + }, + { + "Name": "Wallet3950", + "ParticipationOnly": false + }, + { + "Name": "Wallet3951", + "ParticipationOnly": false + }, + { + "Name": "Wallet3952", + "ParticipationOnly": false + }, + { + "Name": "Wallet3953", + "ParticipationOnly": false + }, + { + "Name": "Wallet3954", + "ParticipationOnly": false + }, + { + "Name": "Wallet3955", + "ParticipationOnly": false + }, + { + "Name": "Wallet3956", + "ParticipationOnly": false + }, + { + "Name": "Wallet3957", + "ParticipationOnly": false + }, + { + "Name": "Wallet3958", + "ParticipationOnly": false + }, + { + "Name": "Wallet3959", + "ParticipationOnly": false + }, + { + "Name": "Wallet3960", + "ParticipationOnly": false + }, + { + "Name": "Wallet3961", + "ParticipationOnly": false + }, + { + "Name": "Wallet3962", + "ParticipationOnly": false + }, + { + "Name": "Wallet3963", + "ParticipationOnly": false + }, + { + "Name": "Wallet3964", + "ParticipationOnly": false + }, + { + "Name": "Wallet3965", + "ParticipationOnly": false + }, + { + "Name": "Wallet3966", + "ParticipationOnly": false + }, + { + "Name": "Wallet3967", + "ParticipationOnly": false + }, + { + "Name": "Wallet3968", + "ParticipationOnly": false + }, + { + "Name": "Wallet3969", + "ParticipationOnly": false + }, + { + "Name": "Wallet3970", + "ParticipationOnly": false + }, + { + "Name": "Wallet3971", + "ParticipationOnly": false + }, + { + "Name": "Wallet3972", + "ParticipationOnly": false + }, + { + "Name": "Wallet3973", + "ParticipationOnly": false + }, + { + "Name": "Wallet3974", + "ParticipationOnly": false + }, + { + "Name": "Wallet3975", + "ParticipationOnly": false + }, + { + "Name": "Wallet3976", + "ParticipationOnly": false + }, + { + "Name": "Wallet3977", + "ParticipationOnly": false + }, + { + "Name": "Wallet3978", + "ParticipationOnly": false + }, + { + "Name": "Wallet3979", + "ParticipationOnly": false + }, + { + "Name": "Wallet3980", + "ParticipationOnly": false + }, + { + "Name": "Wallet3981", + "ParticipationOnly": false + }, + { + "Name": "Wallet3982", + "ParticipationOnly": false + }, + { + "Name": "Wallet3983", + "ParticipationOnly": false + }, + { + "Name": "Wallet3984", + "ParticipationOnly": false + }, + { + "Name": "Wallet3985", + "ParticipationOnly": false + }, + { + "Name": "Wallet3986", + "ParticipationOnly": false + }, + { + "Name": "Wallet3987", + "ParticipationOnly": false + }, + { + "Name": "Wallet3988", + "ParticipationOnly": false + }, + { + "Name": "Wallet3989", + "ParticipationOnly": false + }, + { + "Name": "Wallet3990", + "ParticipationOnly": false + }, + { + "Name": "Wallet3991", + "ParticipationOnly": false + }, + { + "Name": "Wallet3992", + "ParticipationOnly": false + }, + { + "Name": "Wallet3993", + "ParticipationOnly": false + }, + { + "Name": "Wallet3994", + "ParticipationOnly": false + }, + { + "Name": "Wallet3995", + "ParticipationOnly": false + }, + { + "Name": "Wallet3996", + "ParticipationOnly": false + }, + { + "Name": "Wallet3997", + "ParticipationOnly": false + }, + { + "Name": "Wallet3998", + "ParticipationOnly": false + }, + { + "Name": "Wallet3999", + "ParticipationOnly": false + }, + { + "Name": "Wallet4000", + "ParticipationOnly": false + }, + { + "Name": "Wallet4001", + "ParticipationOnly": false + }, + { + "Name": "Wallet4002", + "ParticipationOnly": false + }, + { + "Name": "Wallet4003", + "ParticipationOnly": false + }, + { + "Name": "Wallet4004", + "ParticipationOnly": false + }, + { + "Name": "Wallet4005", + "ParticipationOnly": false + }, + { + "Name": "Wallet4006", + "ParticipationOnly": false + }, + { + "Name": "Wallet4007", + "ParticipationOnly": false + }, + { + "Name": "Wallet4008", + "ParticipationOnly": false + }, + { + "Name": "Wallet4009", + "ParticipationOnly": false + }, + { + "Name": "Wallet4010", + "ParticipationOnly": false + }, + { + "Name": "Wallet4011", + "ParticipationOnly": false + }, + { + "Name": "Wallet4012", + "ParticipationOnly": false + }, + { + "Name": "Wallet4013", + "ParticipationOnly": false + }, + { + "Name": "Wallet4014", + "ParticipationOnly": false + }, + { + "Name": "Wallet4015", + "ParticipationOnly": false + }, + { + "Name": "Wallet4016", + "ParticipationOnly": false + }, + { + "Name": "Wallet4017", + "ParticipationOnly": false + }, + { + "Name": "Wallet4018", + "ParticipationOnly": false + }, + { + "Name": "Wallet4019", + "ParticipationOnly": false + }, + { + "Name": "Wallet4020", + "ParticipationOnly": false + }, + { + "Name": "Wallet4021", + "ParticipationOnly": false + }, + { + "Name": "Wallet4022", + "ParticipationOnly": false + }, + { + "Name": "Wallet4023", + "ParticipationOnly": false + }, + { + "Name": "Wallet4024", + "ParticipationOnly": false + }, + { + "Name": "Wallet4025", + "ParticipationOnly": false + }, + { + "Name": "Wallet4026", + "ParticipationOnly": false + }, + { + "Name": "Wallet4027", + "ParticipationOnly": false + }, + { + "Name": "Wallet4028", + "ParticipationOnly": false + }, + { + "Name": "Wallet4029", + "ParticipationOnly": false + }, + { + "Name": "Wallet4030", + "ParticipationOnly": false + }, + { + "Name": "Wallet4031", + "ParticipationOnly": false + }, + { + "Name": "Wallet4032", + "ParticipationOnly": false + }, + { + "Name": "Wallet4033", + "ParticipationOnly": false + }, + { + "Name": "Wallet4034", + "ParticipationOnly": false + }, + { + "Name": "Wallet4035", + "ParticipationOnly": false + }, + { + "Name": "Wallet4036", + "ParticipationOnly": false + }, + { + "Name": "Wallet4037", + "ParticipationOnly": false + }, + { + "Name": "Wallet4038", + "ParticipationOnly": false + }, + { + "Name": "Wallet4039", + "ParticipationOnly": false + }, + { + "Name": "Wallet4040", + "ParticipationOnly": false + }, + { + "Name": "Wallet4041", + "ParticipationOnly": false + }, + { + "Name": "Wallet4042", + "ParticipationOnly": false + }, + { + "Name": "Wallet4043", + "ParticipationOnly": false + }, + { + "Name": "Wallet4044", + "ParticipationOnly": false + }, + { + "Name": "Wallet4045", + "ParticipationOnly": false + }, + { + "Name": "Wallet4046", + "ParticipationOnly": false + }, + { + "Name": "Wallet4047", + "ParticipationOnly": false + }, + { + "Name": "Wallet4048", + "ParticipationOnly": false + }, + { + "Name": "Wallet4049", + "ParticipationOnly": false + }, + { + "Name": "Wallet4050", + "ParticipationOnly": false + }, + { + "Name": "Wallet4051", + "ParticipationOnly": false + }, + { + "Name": "Wallet4052", + "ParticipationOnly": false + }, + { + "Name": "Wallet4053", + "ParticipationOnly": false + }, + { + "Name": "Wallet4054", + "ParticipationOnly": false + }, + { + "Name": "Wallet4055", + "ParticipationOnly": false + }, + { + "Name": "Wallet4056", + "ParticipationOnly": false + }, + { + "Name": "Wallet4057", + "ParticipationOnly": false + }, + { + "Name": "Wallet4058", + "ParticipationOnly": false + }, + { + "Name": "Wallet4059", + "ParticipationOnly": false + }, + { + "Name": "Wallet4060", + "ParticipationOnly": false + }, + { + "Name": "Wallet4061", + "ParticipationOnly": false + }, + { + "Name": "Wallet4062", + "ParticipationOnly": false + }, + { + "Name": "Wallet4063", + "ParticipationOnly": false + }, + { + "Name": "Wallet4064", + "ParticipationOnly": false + }, + { + "Name": "Wallet4065", + "ParticipationOnly": false + }, + { + "Name": "Wallet4066", + "ParticipationOnly": false + }, + { + "Name": "Wallet4067", + "ParticipationOnly": false + }, + { + "Name": "Wallet4068", + "ParticipationOnly": false + }, + { + "Name": "Wallet4069", + "ParticipationOnly": false + }, + { + "Name": "Wallet4070", + "ParticipationOnly": false + }, + { + "Name": "Wallet4071", + "ParticipationOnly": false + }, + { + "Name": "Wallet4072", + "ParticipationOnly": false + }, + { + "Name": "Wallet4073", + "ParticipationOnly": false + }, + { + "Name": "Wallet4074", + "ParticipationOnly": false + }, + { + "Name": "Wallet4075", + "ParticipationOnly": false + }, + { + "Name": "Wallet4076", + "ParticipationOnly": false + }, + { + "Name": "Wallet4077", + "ParticipationOnly": false + }, + { + "Name": "Wallet4078", + "ParticipationOnly": false + }, + { + "Name": "Wallet4079", + "ParticipationOnly": false + }, + { + "Name": "Wallet4080", + "ParticipationOnly": false + }, + { + "Name": "Wallet4081", + "ParticipationOnly": false + }, + { + "Name": "Wallet4082", + "ParticipationOnly": false + }, + { + "Name": "Wallet4083", + "ParticipationOnly": false + }, + { + "Name": "Wallet4084", + "ParticipationOnly": false + }, + { + "Name": "Wallet4085", + "ParticipationOnly": false + }, + { + "Name": "Wallet4086", + "ParticipationOnly": false + }, + { + "Name": "Wallet4087", + "ParticipationOnly": false + }, + { + "Name": "Wallet4088", + "ParticipationOnly": false + }, + { + "Name": "Wallet4089", + "ParticipationOnly": false + }, + { + "Name": "Wallet4090", + "ParticipationOnly": false + }, + { + "Name": "Wallet4091", + "ParticipationOnly": false + }, + { + "Name": "Wallet4092", + "ParticipationOnly": false + }, + { + "Name": "Wallet4093", + "ParticipationOnly": false + }, + { + "Name": "Wallet4094", + "ParticipationOnly": false + }, + { + "Name": "Wallet4095", + "ParticipationOnly": false + }, + { + "Name": "Wallet4096", + "ParticipationOnly": false + }, + { + "Name": "Wallet4097", + "ParticipationOnly": false + }, + { + "Name": "Wallet4098", + "ParticipationOnly": false + }, + { + "Name": "Wallet4099", + "ParticipationOnly": false + }, + { + "Name": "Wallet4100", + "ParticipationOnly": false + }, + { + "Name": "Wallet4101", + "ParticipationOnly": false + }, + { + "Name": "Wallet4102", + "ParticipationOnly": false + }, + { + "Name": "Wallet4103", + "ParticipationOnly": false + }, + { + "Name": "Wallet4104", + "ParticipationOnly": false + }, + { + "Name": "Wallet4105", + "ParticipationOnly": false + }, + { + "Name": "Wallet4106", + "ParticipationOnly": false + }, + { + "Name": "Wallet4107", + "ParticipationOnly": false + }, + { + "Name": "Wallet4108", + "ParticipationOnly": false + }, + { + "Name": "Wallet4109", + "ParticipationOnly": false + }, + { + "Name": "Wallet4110", + "ParticipationOnly": false + }, + { + "Name": "Wallet4111", + "ParticipationOnly": false + }, + { + "Name": "Wallet4112", + "ParticipationOnly": false + }, + { + "Name": "Wallet4113", + "ParticipationOnly": false + }, + { + "Name": "Wallet4114", + "ParticipationOnly": false + }, + { + "Name": "Wallet4115", + "ParticipationOnly": false + }, + { + "Name": "Wallet4116", + "ParticipationOnly": false + }, + { + "Name": "Wallet4117", + "ParticipationOnly": false + }, + { + "Name": "Wallet4118", + "ParticipationOnly": false + }, + { + "Name": "Wallet4119", + "ParticipationOnly": false + }, + { + "Name": "Wallet4120", + "ParticipationOnly": false + }, + { + "Name": "Wallet4121", + "ParticipationOnly": false + }, + { + "Name": "Wallet4122", + "ParticipationOnly": false + }, + { + "Name": "Wallet4123", + "ParticipationOnly": false + }, + { + "Name": "Wallet4124", + "ParticipationOnly": false + }, + { + "Name": "Wallet4125", + "ParticipationOnly": false + }, + { + "Name": "Wallet4126", + "ParticipationOnly": false + }, + { + "Name": "Wallet4127", + "ParticipationOnly": false + }, + { + "Name": "Wallet4128", + "ParticipationOnly": false + }, + { + "Name": "Wallet4129", + "ParticipationOnly": false + }, + { + "Name": "Wallet4130", + "ParticipationOnly": false + }, + { + "Name": "Wallet4131", + "ParticipationOnly": false + }, + { + "Name": "Wallet4132", + "ParticipationOnly": false + }, + { + "Name": "Wallet4133", + "ParticipationOnly": false + }, + { + "Name": "Wallet4134", + "ParticipationOnly": false + }, + { + "Name": "Wallet4135", + "ParticipationOnly": false + }, + { + "Name": "Wallet4136", + "ParticipationOnly": false + }, + { + "Name": "Wallet4137", + "ParticipationOnly": false + }, + { + "Name": "Wallet4138", + "ParticipationOnly": false + }, + { + "Name": "Wallet4139", + "ParticipationOnly": false + }, + { + "Name": "Wallet4140", + "ParticipationOnly": false + }, + { + "Name": "Wallet4141", + "ParticipationOnly": false + }, + { + "Name": "Wallet4142", + "ParticipationOnly": false + }, + { + "Name": "Wallet4143", + "ParticipationOnly": false + }, + { + "Name": "Wallet4144", + "ParticipationOnly": false + }, + { + "Name": "Wallet4145", + "ParticipationOnly": false + }, + { + "Name": "Wallet4146", + "ParticipationOnly": false + }, + { + "Name": "Wallet4147", + "ParticipationOnly": false + }, + { + "Name": "Wallet4148", + "ParticipationOnly": false + }, + { + "Name": "Wallet4149", + "ParticipationOnly": false + }, + { + "Name": "Wallet4150", + "ParticipationOnly": false + }, + { + "Name": "Wallet4151", + "ParticipationOnly": false + }, + { + "Name": "Wallet4152", + "ParticipationOnly": false + }, + { + "Name": "Wallet4153", + "ParticipationOnly": false + }, + { + "Name": "Wallet4154", + "ParticipationOnly": false + }, + { + "Name": "Wallet4155", + "ParticipationOnly": false + }, + { + "Name": "Wallet4156", + "ParticipationOnly": false + }, + { + "Name": "Wallet4157", + "ParticipationOnly": false + }, + { + "Name": "Wallet4158", + "ParticipationOnly": false + }, + { + "Name": "Wallet4159", + "ParticipationOnly": false + }, + { + "Name": "Wallet4160", + "ParticipationOnly": false + }, + { + "Name": "Wallet4161", + "ParticipationOnly": false + }, + { + "Name": "Wallet4162", + "ParticipationOnly": false + }, + { + "Name": "Wallet4163", + "ParticipationOnly": false + }, + { + "Name": "Wallet4164", + "ParticipationOnly": false + }, + { + "Name": "Wallet4165", + "ParticipationOnly": false + }, + { + "Name": "Wallet4166", + "ParticipationOnly": false + }, + { + "Name": "Wallet4167", + "ParticipationOnly": false + }, + { + "Name": "Wallet4168", + "ParticipationOnly": false + }, + { + "Name": "Wallet4169", + "ParticipationOnly": false + }, + { + "Name": "Wallet4170", + "ParticipationOnly": false + }, + { + "Name": "Wallet4171", + "ParticipationOnly": false + }, + { + "Name": "Wallet4172", + "ParticipationOnly": false + }, + { + "Name": "Wallet4173", + "ParticipationOnly": false + }, + { + "Name": "Wallet4174", + "ParticipationOnly": false + }, + { + "Name": "Wallet4175", + "ParticipationOnly": false + }, + { + "Name": "Wallet4176", + "ParticipationOnly": false + }, + { + "Name": "Wallet4177", + "ParticipationOnly": false + }, + { + "Name": "Wallet4178", + "ParticipationOnly": false + }, + { + "Name": "Wallet4179", + "ParticipationOnly": false + }, + { + "Name": "Wallet4180", + "ParticipationOnly": false + }, + { + "Name": "Wallet4181", + "ParticipationOnly": false + }, + { + "Name": "Wallet4182", + "ParticipationOnly": false + }, + { + "Name": "Wallet4183", + "ParticipationOnly": false + }, + { + "Name": "Wallet4184", + "ParticipationOnly": false + }, + { + "Name": "Wallet4185", + "ParticipationOnly": false + }, + { + "Name": "Wallet4186", + "ParticipationOnly": false + }, + { + "Name": "Wallet4187", + "ParticipationOnly": false + }, + { + "Name": "Wallet4188", + "ParticipationOnly": false + }, + { + "Name": "Wallet4189", + "ParticipationOnly": false + }, + { + "Name": "Wallet4190", + "ParticipationOnly": false + }, + { + "Name": "Wallet4191", + "ParticipationOnly": false + }, + { + "Name": "Wallet4192", + "ParticipationOnly": false + }, + { + "Name": "Wallet4193", + "ParticipationOnly": false + }, + { + "Name": "Wallet4194", + "ParticipationOnly": false + }, + { + "Name": "Wallet4195", + "ParticipationOnly": false + }, + { + "Name": "Wallet4196", + "ParticipationOnly": false + }, + { + "Name": "Wallet4197", + "ParticipationOnly": false + }, + { + "Name": "Wallet4198", + "ParticipationOnly": false + }, + { + "Name": "Wallet4199", + "ParticipationOnly": false + }, + { + "Name": "Wallet4200", + "ParticipationOnly": false + }, + { + "Name": "Wallet4201", + "ParticipationOnly": false + }, + { + "Name": "Wallet4202", + "ParticipationOnly": false + }, + { + "Name": "Wallet4203", + "ParticipationOnly": false + }, + { + "Name": "Wallet4204", + "ParticipationOnly": false + }, + { + "Name": "Wallet4205", + "ParticipationOnly": false + }, + { + "Name": "Wallet4206", + "ParticipationOnly": false + }, + { + "Name": "Wallet4207", + "ParticipationOnly": false + }, + { + "Name": "Wallet4208", + "ParticipationOnly": false + }, + { + "Name": "Wallet4209", + "ParticipationOnly": false + }, + { + "Name": "Wallet4210", + "ParticipationOnly": false + }, + { + "Name": "Wallet4211", + "ParticipationOnly": false + }, + { + "Name": "Wallet4212", + "ParticipationOnly": false + }, + { + "Name": "Wallet4213", + "ParticipationOnly": false + }, + { + "Name": "Wallet4214", + "ParticipationOnly": false + }, + { + "Name": "Wallet4215", + "ParticipationOnly": false + }, + { + "Name": "Wallet4216", + "ParticipationOnly": false + }, + { + "Name": "Wallet4217", + "ParticipationOnly": false + }, + { + "Name": "Wallet4218", + "ParticipationOnly": false + }, + { + "Name": "Wallet4219", + "ParticipationOnly": false + }, + { + "Name": "Wallet4220", + "ParticipationOnly": false + }, + { + "Name": "Wallet4221", + "ParticipationOnly": false + }, + { + "Name": "Wallet4222", + "ParticipationOnly": false + }, + { + "Name": "Wallet4223", + "ParticipationOnly": false + }, + { + "Name": "Wallet4224", + "ParticipationOnly": false + }, + { + "Name": "Wallet4225", + "ParticipationOnly": false + }, + { + "Name": "Wallet4226", + "ParticipationOnly": false + }, + { + "Name": "Wallet4227", + "ParticipationOnly": false + }, + { + "Name": "Wallet4228", + "ParticipationOnly": false + }, + { + "Name": "Wallet4229", + "ParticipationOnly": false + }, + { + "Name": "Wallet4230", + "ParticipationOnly": false + }, + { + "Name": "Wallet4231", + "ParticipationOnly": false + }, + { + "Name": "Wallet4232", + "ParticipationOnly": false + }, + { + "Name": "Wallet4233", + "ParticipationOnly": false + }, + { + "Name": "Wallet4234", + "ParticipationOnly": false + }, + { + "Name": "Wallet4235", + "ParticipationOnly": false + }, + { + "Name": "Wallet4236", + "ParticipationOnly": false + }, + { + "Name": "Wallet4237", + "ParticipationOnly": false + }, + { + "Name": "Wallet4238", + "ParticipationOnly": false + }, + { + "Name": "Wallet4239", + "ParticipationOnly": false + }, + { + "Name": "Wallet4240", + "ParticipationOnly": false + }, + { + "Name": "Wallet4241", + "ParticipationOnly": false + }, + { + "Name": "Wallet4242", + "ParticipationOnly": false + }, + { + "Name": "Wallet4243", + "ParticipationOnly": false + }, + { + "Name": "Wallet4244", + "ParticipationOnly": false + }, + { + "Name": "Wallet4245", + "ParticipationOnly": false + }, + { + "Name": "Wallet4246", + "ParticipationOnly": false + }, + { + "Name": "Wallet4247", + "ParticipationOnly": false + }, + { + "Name": "Wallet4248", + "ParticipationOnly": false + }, + { + "Name": "Wallet4249", + "ParticipationOnly": false + }, + { + "Name": "Wallet4250", + "ParticipationOnly": false + }, + { + "Name": "Wallet4251", + "ParticipationOnly": false + }, + { + "Name": "Wallet4252", + "ParticipationOnly": false + }, + { + "Name": "Wallet4253", + "ParticipationOnly": false + }, + { + "Name": "Wallet4254", + "ParticipationOnly": false + }, + { + "Name": "Wallet4255", + "ParticipationOnly": false + }, + { + "Name": "Wallet4256", + "ParticipationOnly": false + }, + { + "Name": "Wallet4257", + "ParticipationOnly": false + }, + { + "Name": "Wallet4258", + "ParticipationOnly": false + }, + { + "Name": "Wallet4259", + "ParticipationOnly": false + }, + { + "Name": "Wallet4260", + "ParticipationOnly": false + }, + { + "Name": "Wallet4261", + "ParticipationOnly": false + }, + { + "Name": "Wallet4262", + "ParticipationOnly": false + }, + { + "Name": "Wallet4263", + "ParticipationOnly": false + }, + { + "Name": "Wallet4264", + "ParticipationOnly": false + }, + { + "Name": "Wallet4265", + "ParticipationOnly": false + }, + { + "Name": "Wallet4266", + "ParticipationOnly": false + }, + { + "Name": "Wallet4267", + "ParticipationOnly": false + }, + { + "Name": "Wallet4268", + "ParticipationOnly": false + }, + { + "Name": "Wallet4269", + "ParticipationOnly": false + }, + { + "Name": "Wallet4270", + "ParticipationOnly": false + }, + { + "Name": "Wallet4271", + "ParticipationOnly": false + }, + { + "Name": "Wallet4272", + "ParticipationOnly": false + }, + { + "Name": "Wallet4273", + "ParticipationOnly": false + }, + { + "Name": "Wallet4274", + "ParticipationOnly": false + }, + { + "Name": "Wallet4275", + "ParticipationOnly": false + }, + { + "Name": "Wallet4276", + "ParticipationOnly": false + }, + { + "Name": "Wallet4277", + "ParticipationOnly": false + }, + { + "Name": "Wallet4278", + "ParticipationOnly": false + }, + { + "Name": "Wallet4279", + "ParticipationOnly": false + }, + { + "Name": "Wallet4280", + "ParticipationOnly": false + }, + { + "Name": "Wallet4281", + "ParticipationOnly": false + }, + { + "Name": "Wallet4282", + "ParticipationOnly": false + }, + { + "Name": "Wallet4283", + "ParticipationOnly": false + }, + { + "Name": "Wallet4284", + "ParticipationOnly": false + }, + { + "Name": "Wallet4285", + "ParticipationOnly": false + }, + { + "Name": "Wallet4286", + "ParticipationOnly": false + }, + { + "Name": "Wallet4287", + "ParticipationOnly": false + }, + { + "Name": "Wallet4288", + "ParticipationOnly": false + }, + { + "Name": "Wallet4289", + "ParticipationOnly": false + }, + { + "Name": "Wallet4290", + "ParticipationOnly": false + }, + { + "Name": "Wallet4291", + "ParticipationOnly": false + }, + { + "Name": "Wallet4292", + "ParticipationOnly": false + }, + { + "Name": "Wallet4293", + "ParticipationOnly": false + }, + { + "Name": "Wallet4294", + "ParticipationOnly": false + }, + { + "Name": "Wallet4295", + "ParticipationOnly": false + }, + { + "Name": "Wallet4296", + "ParticipationOnly": false + }, + { + "Name": "Wallet4297", + "ParticipationOnly": false + }, + { + "Name": "Wallet4298", + "ParticipationOnly": false + }, + { + "Name": "Wallet4299", + "ParticipationOnly": false + }, + { + "Name": "Wallet4300", + "ParticipationOnly": false + }, + { + "Name": "Wallet4301", + "ParticipationOnly": false + }, + { + "Name": "Wallet4302", + "ParticipationOnly": false + }, + { + "Name": "Wallet4303", + "ParticipationOnly": false + }, + { + "Name": "Wallet4304", + "ParticipationOnly": false + }, + { + "Name": "Wallet4305", + "ParticipationOnly": false + }, + { + "Name": "Wallet4306", + "ParticipationOnly": false + }, + { + "Name": "Wallet4307", + "ParticipationOnly": false + }, + { + "Name": "Wallet4308", + "ParticipationOnly": false + }, + { + "Name": "Wallet4309", + "ParticipationOnly": false + }, + { + "Name": "Wallet4310", + "ParticipationOnly": false + }, + { + "Name": "Wallet4311", + "ParticipationOnly": false + }, + { + "Name": "Wallet4312", + "ParticipationOnly": false + }, + { + "Name": "Wallet4313", + "ParticipationOnly": false + }, + { + "Name": "Wallet4314", + "ParticipationOnly": false + }, + { + "Name": "Wallet4315", + "ParticipationOnly": false + }, + { + "Name": "Wallet4316", + "ParticipationOnly": false + }, + { + "Name": "Wallet4317", + "ParticipationOnly": false + }, + { + "Name": "Wallet4318", + "ParticipationOnly": false + }, + { + "Name": "Wallet4319", + "ParticipationOnly": false + }, + { + "Name": "Wallet4320", + "ParticipationOnly": false + }, + { + "Name": "Wallet4321", + "ParticipationOnly": false + }, + { + "Name": "Wallet4322", + "ParticipationOnly": false + }, + { + "Name": "Wallet4323", + "ParticipationOnly": false + }, + { + "Name": "Wallet4324", + "ParticipationOnly": false + }, + { + "Name": "Wallet4325", + "ParticipationOnly": false + }, + { + "Name": "Wallet4326", + "ParticipationOnly": false + }, + { + "Name": "Wallet4327", + "ParticipationOnly": false + }, + { + "Name": "Wallet4328", + "ParticipationOnly": false + }, + { + "Name": "Wallet4329", + "ParticipationOnly": false + }, + { + "Name": "Wallet4330", + "ParticipationOnly": false + }, + { + "Name": "Wallet4331", + "ParticipationOnly": false + }, + { + "Name": "Wallet4332", + "ParticipationOnly": false + }, + { + "Name": "Wallet4333", + "ParticipationOnly": false + }, + { + "Name": "Wallet4334", + "ParticipationOnly": false + }, + { + "Name": "Wallet4335", + "ParticipationOnly": false + }, + { + "Name": "Wallet4336", + "ParticipationOnly": false + }, + { + "Name": "Wallet4337", + "ParticipationOnly": false + }, + { + "Name": "Wallet4338", + "ParticipationOnly": false + }, + { + "Name": "Wallet4339", + "ParticipationOnly": false + }, + { + "Name": "Wallet4340", + "ParticipationOnly": false + }, + { + "Name": "Wallet4341", + "ParticipationOnly": false + }, + { + "Name": "Wallet4342", + "ParticipationOnly": false + }, + { + "Name": "Wallet4343", + "ParticipationOnly": false + }, + { + "Name": "Wallet4344", + "ParticipationOnly": false + }, + { + "Name": "Wallet4345", + "ParticipationOnly": false + }, + { + "Name": "Wallet4346", + "ParticipationOnly": false + }, + { + "Name": "Wallet4347", + "ParticipationOnly": false + }, + { + "Name": "Wallet4348", + "ParticipationOnly": false + }, + { + "Name": "Wallet4349", + "ParticipationOnly": false + }, + { + "Name": "Wallet4350", + "ParticipationOnly": false + }, + { + "Name": "Wallet4351", + "ParticipationOnly": false + }, + { + "Name": "Wallet4352", + "ParticipationOnly": false + }, + { + "Name": "Wallet4353", + "ParticipationOnly": false + }, + { + "Name": "Wallet4354", + "ParticipationOnly": false + }, + { + "Name": "Wallet4355", + "ParticipationOnly": false + }, + { + "Name": "Wallet4356", + "ParticipationOnly": false + }, + { + "Name": "Wallet4357", + "ParticipationOnly": false + }, + { + "Name": "Wallet4358", + "ParticipationOnly": false + }, + { + "Name": "Wallet4359", + "ParticipationOnly": false + }, + { + "Name": "Wallet4360", + "ParticipationOnly": false + }, + { + "Name": "Wallet4361", + "ParticipationOnly": false + }, + { + "Name": "Wallet4362", + "ParticipationOnly": false + }, + { + "Name": "Wallet4363", + "ParticipationOnly": false + }, + { + "Name": "Wallet4364", + "ParticipationOnly": false + }, + { + "Name": "Wallet4365", + "ParticipationOnly": false + }, + { + "Name": "Wallet4366", + "ParticipationOnly": false + }, + { + "Name": "Wallet4367", + "ParticipationOnly": false + }, + { + "Name": "Wallet4368", + "ParticipationOnly": false + }, + { + "Name": "Wallet4369", + "ParticipationOnly": false + }, + { + "Name": "Wallet4370", + "ParticipationOnly": false + }, + { + "Name": "Wallet4371", + "ParticipationOnly": false + }, + { + "Name": "Wallet4372", + "ParticipationOnly": false + }, + { + "Name": "Wallet4373", + "ParticipationOnly": false + }, + { + "Name": "Wallet4374", + "ParticipationOnly": false + }, + { + "Name": "Wallet4375", + "ParticipationOnly": false + }, + { + "Name": "Wallet4376", + "ParticipationOnly": false + }, + { + "Name": "Wallet4377", + "ParticipationOnly": false + }, + { + "Name": "Wallet4378", + "ParticipationOnly": false + }, + { + "Name": "Wallet4379", + "ParticipationOnly": false + }, + { + "Name": "Wallet4380", + "ParticipationOnly": false + }, + { + "Name": "Wallet4381", + "ParticipationOnly": false + }, + { + "Name": "Wallet4382", + "ParticipationOnly": false + }, + { + "Name": "Wallet4383", + "ParticipationOnly": false + }, + { + "Name": "Wallet4384", + "ParticipationOnly": false + }, + { + "Name": "Wallet4385", + "ParticipationOnly": false + }, + { + "Name": "Wallet4386", + "ParticipationOnly": false + }, + { + "Name": "Wallet4387", + "ParticipationOnly": false + }, + { + "Name": "Wallet4388", + "ParticipationOnly": false + }, + { + "Name": "Wallet4389", + "ParticipationOnly": false + }, + { + "Name": "Wallet4390", + "ParticipationOnly": false + }, + { + "Name": "Wallet4391", + "ParticipationOnly": false + }, + { + "Name": "Wallet4392", + "ParticipationOnly": false + }, + { + "Name": "Wallet4393", + "ParticipationOnly": false + }, + { + "Name": "Wallet4394", + "ParticipationOnly": false + }, + { + "Name": "Wallet4395", + "ParticipationOnly": false + }, + { + "Name": "Wallet4396", + "ParticipationOnly": false + }, + { + "Name": "Wallet4397", + "ParticipationOnly": false + }, + { + "Name": "Wallet4398", + "ParticipationOnly": false + }, + { + "Name": "Wallet4399", + "ParticipationOnly": false + }, + { + "Name": "Wallet4400", + "ParticipationOnly": false + }, + { + "Name": "Wallet4401", + "ParticipationOnly": false + }, + { + "Name": "Wallet4402", + "ParticipationOnly": false + }, + { + "Name": "Wallet4403", + "ParticipationOnly": false + }, + { + "Name": "Wallet4404", + "ParticipationOnly": false + }, + { + "Name": "Wallet4405", + "ParticipationOnly": false + }, + { + "Name": "Wallet4406", + "ParticipationOnly": false + }, + { + "Name": "Wallet4407", + "ParticipationOnly": false + }, + { + "Name": "Wallet4408", + "ParticipationOnly": false + }, + { + "Name": "Wallet4409", + "ParticipationOnly": false + }, + { + "Name": "Wallet4410", + "ParticipationOnly": false + }, + { + "Name": "Wallet4411", + "ParticipationOnly": false + }, + { + "Name": "Wallet4412", + "ParticipationOnly": false + }, + { + "Name": "Wallet4413", + "ParticipationOnly": false + }, + { + "Name": "Wallet4414", + "ParticipationOnly": false + }, + { + "Name": "Wallet4415", + "ParticipationOnly": false + }, + { + "Name": "Wallet4416", + "ParticipationOnly": false + }, + { + "Name": "Wallet4417", + "ParticipationOnly": false + }, + { + "Name": "Wallet4418", + "ParticipationOnly": false + }, + { + "Name": "Wallet4419", + "ParticipationOnly": false + }, + { + "Name": "Wallet4420", + "ParticipationOnly": false + }, + { + "Name": "Wallet4421", + "ParticipationOnly": false + }, + { + "Name": "Wallet4422", + "ParticipationOnly": false + }, + { + "Name": "Wallet4423", + "ParticipationOnly": false + }, + { + "Name": "Wallet4424", + "ParticipationOnly": false + }, + { + "Name": "Wallet4425", + "ParticipationOnly": false + }, + { + "Name": "Wallet4426", + "ParticipationOnly": false + }, + { + "Name": "Wallet4427", + "ParticipationOnly": false + }, + { + "Name": "Wallet4428", + "ParticipationOnly": false + }, + { + "Name": "Wallet4429", + "ParticipationOnly": false + }, + { + "Name": "Wallet4430", + "ParticipationOnly": false + }, + { + "Name": "Wallet4431", + "ParticipationOnly": false + }, + { + "Name": "Wallet4432", + "ParticipationOnly": false + }, + { + "Name": "Wallet4433", + "ParticipationOnly": false + }, + { + "Name": "Wallet4434", + "ParticipationOnly": false + }, + { + "Name": "Wallet4435", + "ParticipationOnly": false + }, + { + "Name": "Wallet4436", + "ParticipationOnly": false + }, + { + "Name": "Wallet4437", + "ParticipationOnly": false + }, + { + "Name": "Wallet4438", + "ParticipationOnly": false + }, + { + "Name": "Wallet4439", + "ParticipationOnly": false + }, + { + "Name": "Wallet4440", + "ParticipationOnly": false + }, + { + "Name": "Wallet4441", + "ParticipationOnly": false + }, + { + "Name": "Wallet4442", + "ParticipationOnly": false + }, + { + "Name": "Wallet4443", + "ParticipationOnly": false + }, + { + "Name": "Wallet4444", + "ParticipationOnly": false + }, + { + "Name": "Wallet4445", + "ParticipationOnly": false + }, + { + "Name": "Wallet4446", + "ParticipationOnly": false + }, + { + "Name": "Wallet4447", + "ParticipationOnly": false + }, + { + "Name": "Wallet4448", + "ParticipationOnly": false + }, + { + "Name": "Wallet4449", + "ParticipationOnly": false + }, + { + "Name": "Wallet4450", + "ParticipationOnly": false + }, + { + "Name": "Wallet4451", + "ParticipationOnly": false + }, + { + "Name": "Wallet4452", + "ParticipationOnly": false + }, + { + "Name": "Wallet4453", + "ParticipationOnly": false + }, + { + "Name": "Wallet4454", + "ParticipationOnly": false + }, + { + "Name": "Wallet4455", + "ParticipationOnly": false + }, + { + "Name": "Wallet4456", + "ParticipationOnly": false + }, + { + "Name": "Wallet4457", + "ParticipationOnly": false + }, + { + "Name": "Wallet4458", + "ParticipationOnly": false + }, + { + "Name": "Wallet4459", + "ParticipationOnly": false + }, + { + "Name": "Wallet4460", + "ParticipationOnly": false + }, + { + "Name": "Wallet4461", + "ParticipationOnly": false + }, + { + "Name": "Wallet4462", + "ParticipationOnly": false + }, + { + "Name": "Wallet4463", + "ParticipationOnly": false + }, + { + "Name": "Wallet4464", + "ParticipationOnly": false + }, + { + "Name": "Wallet4465", + "ParticipationOnly": false + }, + { + "Name": "Wallet4466", + "ParticipationOnly": false + }, + { + "Name": "Wallet4467", + "ParticipationOnly": false + }, + { + "Name": "Wallet4468", + "ParticipationOnly": false + }, + { + "Name": "Wallet4469", + "ParticipationOnly": false + }, + { + "Name": "Wallet4470", + "ParticipationOnly": false + }, + { + "Name": "Wallet4471", + "ParticipationOnly": false + }, + { + "Name": "Wallet4472", + "ParticipationOnly": false + }, + { + "Name": "Wallet4473", + "ParticipationOnly": false + }, + { + "Name": "Wallet4474", + "ParticipationOnly": false + }, + { + "Name": "Wallet4475", + "ParticipationOnly": false + }, + { + "Name": "Wallet4476", + "ParticipationOnly": false + }, + { + "Name": "Wallet4477", + "ParticipationOnly": false + }, + { + "Name": "Wallet4478", + "ParticipationOnly": false + }, + { + "Name": "Wallet4479", + "ParticipationOnly": false + }, + { + "Name": "Wallet4480", + "ParticipationOnly": false + }, + { + "Name": "Wallet4481", + "ParticipationOnly": false + }, + { + "Name": "Wallet4482", + "ParticipationOnly": false + }, + { + "Name": "Wallet4483", + "ParticipationOnly": false + }, + { + "Name": "Wallet4484", + "ParticipationOnly": false + }, + { + "Name": "Wallet4485", + "ParticipationOnly": false + }, + { + "Name": "Wallet4486", + "ParticipationOnly": false + }, + { + "Name": "Wallet4487", + "ParticipationOnly": false + }, + { + "Name": "Wallet4488", + "ParticipationOnly": false + }, + { + "Name": "Wallet4489", + "ParticipationOnly": false + }, + { + "Name": "Wallet4490", + "ParticipationOnly": false + }, + { + "Name": "Wallet4491", + "ParticipationOnly": false + }, + { + "Name": "Wallet4492", + "ParticipationOnly": false + }, + { + "Name": "Wallet4493", + "ParticipationOnly": false + }, + { + "Name": "Wallet4494", + "ParticipationOnly": false + }, + { + "Name": "Wallet4495", + "ParticipationOnly": false + }, + { + "Name": "Wallet4496", + "ParticipationOnly": false + }, + { + "Name": "Wallet4497", + "ParticipationOnly": false + }, + { + "Name": "Wallet4498", + "ParticipationOnly": false + }, + { + "Name": "Wallet4499", + "ParticipationOnly": false + }, + { + "Name": "Wallet4500", + "ParticipationOnly": false + }, + { + "Name": "Wallet4501", + "ParticipationOnly": false + }, + { + "Name": "Wallet4502", + "ParticipationOnly": false + }, + { + "Name": "Wallet4503", + "ParticipationOnly": false + }, + { + "Name": "Wallet4504", + "ParticipationOnly": false + }, + { + "Name": "Wallet4505", + "ParticipationOnly": false + }, + { + "Name": "Wallet4506", + "ParticipationOnly": false + }, + { + "Name": "Wallet4507", + "ParticipationOnly": false + }, + { + "Name": "Wallet4508", + "ParticipationOnly": false + }, + { + "Name": "Wallet4509", + "ParticipationOnly": false + }, + { + "Name": "Wallet4510", + "ParticipationOnly": false + }, + { + "Name": "Wallet4511", + "ParticipationOnly": false + }, + { + "Name": "Wallet4512", + "ParticipationOnly": false + }, + { + "Name": "Wallet4513", + "ParticipationOnly": false + }, + { + "Name": "Wallet4514", + "ParticipationOnly": false + }, + { + "Name": "Wallet4515", + "ParticipationOnly": false + }, + { + "Name": "Wallet4516", + "ParticipationOnly": false + }, + { + "Name": "Wallet4517", + "ParticipationOnly": false + }, + { + "Name": "Wallet4518", + "ParticipationOnly": false + }, + { + "Name": "Wallet4519", + "ParticipationOnly": false + }, + { + "Name": "Wallet4520", + "ParticipationOnly": false + }, + { + "Name": "Wallet4521", + "ParticipationOnly": false + }, + { + "Name": "Wallet4522", + "ParticipationOnly": false + }, + { + "Name": "Wallet4523", + "ParticipationOnly": false + }, + { + "Name": "Wallet4524", + "ParticipationOnly": false + }, + { + "Name": "Wallet4525", + "ParticipationOnly": false + }, + { + "Name": "Wallet4526", + "ParticipationOnly": false + }, + { + "Name": "Wallet4527", + "ParticipationOnly": false + }, + { + "Name": "Wallet4528", + "ParticipationOnly": false + }, + { + "Name": "Wallet4529", + "ParticipationOnly": false + }, + { + "Name": "Wallet4530", + "ParticipationOnly": false + }, + { + "Name": "Wallet4531", + "ParticipationOnly": false + }, + { + "Name": "Wallet4532", + "ParticipationOnly": false + }, + { + "Name": "Wallet4533", + "ParticipationOnly": false + }, + { + "Name": "Wallet4534", + "ParticipationOnly": false + }, + { + "Name": "Wallet4535", + "ParticipationOnly": false + }, + { + "Name": "Wallet4536", + "ParticipationOnly": false + }, + { + "Name": "Wallet4537", + "ParticipationOnly": false + }, + { + "Name": "Wallet4538", + "ParticipationOnly": false + }, + { + "Name": "Wallet4539", + "ParticipationOnly": false + }, + { + "Name": "Wallet4540", + "ParticipationOnly": false + }, + { + "Name": "Wallet4541", + "ParticipationOnly": false + }, + { + "Name": "Wallet4542", + "ParticipationOnly": false + }, + { + "Name": "Wallet4543", + "ParticipationOnly": false + }, + { + "Name": "Wallet4544", + "ParticipationOnly": false + }, + { + "Name": "Wallet4545", + "ParticipationOnly": false + }, + { + "Name": "Wallet4546", + "ParticipationOnly": false + }, + { + "Name": "Wallet4547", + "ParticipationOnly": false + }, + { + "Name": "Wallet4548", + "ParticipationOnly": false + }, + { + "Name": "Wallet4549", + "ParticipationOnly": false + }, + { + "Name": "Wallet4550", + "ParticipationOnly": false + }, + { + "Name": "Wallet4551", + "ParticipationOnly": false + }, + { + "Name": "Wallet4552", + "ParticipationOnly": false + }, + { + "Name": "Wallet4553", + "ParticipationOnly": false + }, + { + "Name": "Wallet4554", + "ParticipationOnly": false + }, + { + "Name": "Wallet4555", + "ParticipationOnly": false + }, + { + "Name": "Wallet4556", + "ParticipationOnly": false + }, + { + "Name": "Wallet4557", + "ParticipationOnly": false + }, + { + "Name": "Wallet4558", + "ParticipationOnly": false + }, + { + "Name": "Wallet4559", + "ParticipationOnly": false + }, + { + "Name": "Wallet4560", + "ParticipationOnly": false + }, + { + "Name": "Wallet4561", + "ParticipationOnly": false + }, + { + "Name": "Wallet4562", + "ParticipationOnly": false + }, + { + "Name": "Wallet4563", + "ParticipationOnly": false + }, + { + "Name": "Wallet4564", + "ParticipationOnly": false + }, + { + "Name": "Wallet4565", + "ParticipationOnly": false + }, + { + "Name": "Wallet4566", + "ParticipationOnly": false + }, + { + "Name": "Wallet4567", + "ParticipationOnly": false + }, + { + "Name": "Wallet4568", + "ParticipationOnly": false + }, + { + "Name": "Wallet4569", + "ParticipationOnly": false + }, + { + "Name": "Wallet4570", + "ParticipationOnly": false + }, + { + "Name": "Wallet4571", + "ParticipationOnly": false + }, + { + "Name": "Wallet4572", + "ParticipationOnly": false + }, + { + "Name": "Wallet4573", + "ParticipationOnly": false + }, + { + "Name": "Wallet4574", + "ParticipationOnly": false + }, + { + "Name": "Wallet4575", + "ParticipationOnly": false + }, + { + "Name": "Wallet4576", + "ParticipationOnly": false + }, + { + "Name": "Wallet4577", + "ParticipationOnly": false + }, + { + "Name": "Wallet4578", + "ParticipationOnly": false + }, + { + "Name": "Wallet4579", + "ParticipationOnly": false + }, + { + "Name": "Wallet4580", + "ParticipationOnly": false + }, + { + "Name": "Wallet4581", + "ParticipationOnly": false + }, + { + "Name": "Wallet4582", + "ParticipationOnly": false + }, + { + "Name": "Wallet4583", + "ParticipationOnly": false + }, + { + "Name": "Wallet4584", + "ParticipationOnly": false + }, + { + "Name": "Wallet4585", + "ParticipationOnly": false + }, + { + "Name": "Wallet4586", + "ParticipationOnly": false + }, + { + "Name": "Wallet4587", + "ParticipationOnly": false + }, + { + "Name": "Wallet4588", + "ParticipationOnly": false + }, + { + "Name": "Wallet4589", + "ParticipationOnly": false + }, + { + "Name": "Wallet4590", + "ParticipationOnly": false + }, + { + "Name": "Wallet4591", + "ParticipationOnly": false + }, + { + "Name": "Wallet4592", + "ParticipationOnly": false + }, + { + "Name": "Wallet4593", + "ParticipationOnly": false + }, + { + "Name": "Wallet4594", + "ParticipationOnly": false + }, + { + "Name": "Wallet4595", + "ParticipationOnly": false + }, + { + "Name": "Wallet4596", + "ParticipationOnly": false + }, + { + "Name": "Wallet4597", + "ParticipationOnly": false + }, + { + "Name": "Wallet4598", + "ParticipationOnly": false + }, + { + "Name": "Wallet4599", + "ParticipationOnly": false + }, + { + "Name": "Wallet4600", + "ParticipationOnly": false + }, + { + "Name": "Wallet4601", + "ParticipationOnly": false + }, + { + "Name": "Wallet4602", + "ParticipationOnly": false + }, + { + "Name": "Wallet4603", + "ParticipationOnly": false + }, + { + "Name": "Wallet4604", + "ParticipationOnly": false + }, + { + "Name": "Wallet4605", + "ParticipationOnly": false + }, + { + "Name": "Wallet4606", + "ParticipationOnly": false + }, + { + "Name": "Wallet4607", + "ParticipationOnly": false + }, + { + "Name": "Wallet4608", + "ParticipationOnly": false + }, + { + "Name": "Wallet4609", + "ParticipationOnly": false + }, + { + "Name": "Wallet4610", + "ParticipationOnly": false + }, + { + "Name": "Wallet4611", + "ParticipationOnly": false + }, + { + "Name": "Wallet4612", + "ParticipationOnly": false + }, + { + "Name": "Wallet4613", + "ParticipationOnly": false + }, + { + "Name": "Wallet4614", + "ParticipationOnly": false + }, + { + "Name": "Wallet4615", + "ParticipationOnly": false + }, + { + "Name": "Wallet4616", + "ParticipationOnly": false + }, + { + "Name": "Wallet4617", + "ParticipationOnly": false + }, + { + "Name": "Wallet4618", + "ParticipationOnly": false + }, + { + "Name": "Wallet4619", + "ParticipationOnly": false + }, + { + "Name": "Wallet4620", + "ParticipationOnly": false + }, + { + "Name": "Wallet4621", + "ParticipationOnly": false + }, + { + "Name": "Wallet4622", + "ParticipationOnly": false + }, + { + "Name": "Wallet4623", + "ParticipationOnly": false + }, + { + "Name": "Wallet4624", + "ParticipationOnly": false + }, + { + "Name": "Wallet4625", + "ParticipationOnly": false + }, + { + "Name": "Wallet4626", + "ParticipationOnly": false + }, + { + "Name": "Wallet4627", + "ParticipationOnly": false + }, + { + "Name": "Wallet4628", + "ParticipationOnly": false + }, + { + "Name": "Wallet4629", + "ParticipationOnly": false + }, + { + "Name": "Wallet4630", + "ParticipationOnly": false + }, + { + "Name": "Wallet4631", + "ParticipationOnly": false + }, + { + "Name": "Wallet4632", + "ParticipationOnly": false + }, + { + "Name": "Wallet4633", + "ParticipationOnly": false + }, + { + "Name": "Wallet4634", + "ParticipationOnly": false + }, + { + "Name": "Wallet4635", + "ParticipationOnly": false + }, + { + "Name": "Wallet4636", + "ParticipationOnly": false + }, + { + "Name": "Wallet4637", + "ParticipationOnly": false + }, + { + "Name": "Wallet4638", + "ParticipationOnly": false + }, + { + "Name": "Wallet4639", + "ParticipationOnly": false + }, + { + "Name": "Wallet4640", + "ParticipationOnly": false + }, + { + "Name": "Wallet4641", + "ParticipationOnly": false + }, + { + "Name": "Wallet4642", + "ParticipationOnly": false + }, + { + "Name": "Wallet4643", + "ParticipationOnly": false + }, + { + "Name": "Wallet4644", + "ParticipationOnly": false + }, + { + "Name": "Wallet4645", + "ParticipationOnly": false + }, + { + "Name": "Wallet4646", + "ParticipationOnly": false + }, + { + "Name": "Wallet4647", + "ParticipationOnly": false + }, + { + "Name": "Wallet4648", + "ParticipationOnly": false + }, + { + "Name": "Wallet4649", + "ParticipationOnly": false + }, + { + "Name": "Wallet4650", + "ParticipationOnly": false + }, + { + "Name": "Wallet4651", + "ParticipationOnly": false + }, + { + "Name": "Wallet4652", + "ParticipationOnly": false + }, + { + "Name": "Wallet4653", + "ParticipationOnly": false + }, + { + "Name": "Wallet4654", + "ParticipationOnly": false + }, + { + "Name": "Wallet4655", + "ParticipationOnly": false + }, + { + "Name": "Wallet4656", + "ParticipationOnly": false + }, + { + "Name": "Wallet4657", + "ParticipationOnly": false + }, + { + "Name": "Wallet4658", + "ParticipationOnly": false + }, + { + "Name": "Wallet4659", + "ParticipationOnly": false + }, + { + "Name": "Wallet4660", + "ParticipationOnly": false + }, + { + "Name": "Wallet4661", + "ParticipationOnly": false + }, + { + "Name": "Wallet4662", + "ParticipationOnly": false + }, + { + "Name": "Wallet4663", + "ParticipationOnly": false + }, + { + "Name": "Wallet4664", + "ParticipationOnly": false + }, + { + "Name": "Wallet4665", + "ParticipationOnly": false + }, + { + "Name": "Wallet4666", + "ParticipationOnly": false + }, + { + "Name": "Wallet4667", + "ParticipationOnly": false + }, + { + "Name": "Wallet4668", + "ParticipationOnly": false + }, + { + "Name": "Wallet4669", + "ParticipationOnly": false + }, + { + "Name": "Wallet4670", + "ParticipationOnly": false + }, + { + "Name": "Wallet4671", + "ParticipationOnly": false + }, + { + "Name": "Wallet4672", + "ParticipationOnly": false + }, + { + "Name": "Wallet4673", + "ParticipationOnly": false + }, + { + "Name": "Wallet4674", + "ParticipationOnly": false + }, + { + "Name": "Wallet4675", + "ParticipationOnly": false + }, + { + "Name": "Wallet4676", + "ParticipationOnly": false + }, + { + "Name": "Wallet4677", + "ParticipationOnly": false + }, + { + "Name": "Wallet4678", + "ParticipationOnly": false + }, + { + "Name": "Wallet4679", + "ParticipationOnly": false + }, + { + "Name": "Wallet4680", + "ParticipationOnly": false + }, + { + "Name": "Wallet4681", + "ParticipationOnly": false + }, + { + "Name": "Wallet4682", + "ParticipationOnly": false + }, + { + "Name": "Wallet4683", + "ParticipationOnly": false + }, + { + "Name": "Wallet4684", + "ParticipationOnly": false + }, + { + "Name": "Wallet4685", + "ParticipationOnly": false + }, + { + "Name": "Wallet4686", + "ParticipationOnly": false + }, + { + "Name": "Wallet4687", + "ParticipationOnly": false + }, + { + "Name": "Wallet4688", + "ParticipationOnly": false + }, + { + "Name": "Wallet4689", + "ParticipationOnly": false + }, + { + "Name": "Wallet4690", + "ParticipationOnly": false + }, + { + "Name": "Wallet4691", + "ParticipationOnly": false + }, + { + "Name": "Wallet4692", + "ParticipationOnly": false + }, + { + "Name": "Wallet4693", + "ParticipationOnly": false + }, + { + "Name": "Wallet4694", + "ParticipationOnly": false + }, + { + "Name": "Wallet4695", + "ParticipationOnly": false + }, + { + "Name": "Wallet4696", + "ParticipationOnly": false + }, + { + "Name": "Wallet4697", + "ParticipationOnly": false + }, + { + "Name": "Wallet4698", + "ParticipationOnly": false + }, + { + "Name": "Wallet4699", + "ParticipationOnly": false + }, + { + "Name": "Wallet4700", + "ParticipationOnly": false + }, + { + "Name": "Wallet4701", + "ParticipationOnly": false + }, + { + "Name": "Wallet4702", + "ParticipationOnly": false + }, + { + "Name": "Wallet4703", + "ParticipationOnly": false + }, + { + "Name": "Wallet4704", + "ParticipationOnly": false + }, + { + "Name": "Wallet4705", + "ParticipationOnly": false + }, + { + "Name": "Wallet4706", + "ParticipationOnly": false + }, + { + "Name": "Wallet4707", + "ParticipationOnly": false + }, + { + "Name": "Wallet4708", + "ParticipationOnly": false + }, + { + "Name": "Wallet4709", + "ParticipationOnly": false + }, + { + "Name": "Wallet4710", + "ParticipationOnly": false + }, + { + "Name": "Wallet4711", + "ParticipationOnly": false + }, + { + "Name": "Wallet4712", + "ParticipationOnly": false + }, + { + "Name": "Wallet4713", + "ParticipationOnly": false + }, + { + "Name": "Wallet4714", + "ParticipationOnly": false + }, + { + "Name": "Wallet4715", + "ParticipationOnly": false + }, + { + "Name": "Wallet4716", + "ParticipationOnly": false + }, + { + "Name": "Wallet4717", + "ParticipationOnly": false + }, + { + "Name": "Wallet4718", + "ParticipationOnly": false + }, + { + "Name": "Wallet4719", + "ParticipationOnly": false + }, + { + "Name": "Wallet4720", + "ParticipationOnly": false + }, + { + "Name": "Wallet4721", + "ParticipationOnly": false + }, + { + "Name": "Wallet4722", + "ParticipationOnly": false + }, + { + "Name": "Wallet4723", + "ParticipationOnly": false + }, + { + "Name": "Wallet4724", + "ParticipationOnly": false + }, + { + "Name": "Wallet4725", + "ParticipationOnly": false + }, + { + "Name": "Wallet4726", + "ParticipationOnly": false + }, + { + "Name": "Wallet4727", + "ParticipationOnly": false + }, + { + "Name": "Wallet4728", + "ParticipationOnly": false + }, + { + "Name": "Wallet4729", + "ParticipationOnly": false + }, + { + "Name": "Wallet4730", + "ParticipationOnly": false + }, + { + "Name": "Wallet4731", + "ParticipationOnly": false + }, + { + "Name": "Wallet4732", + "ParticipationOnly": false + }, + { + "Name": "Wallet4733", + "ParticipationOnly": false + }, + { + "Name": "Wallet4734", + "ParticipationOnly": false + }, + { + "Name": "Wallet4735", + "ParticipationOnly": false + }, + { + "Name": "Wallet4736", + "ParticipationOnly": false + }, + { + "Name": "Wallet4737", + "ParticipationOnly": false + }, + { + "Name": "Wallet4738", + "ParticipationOnly": false + }, + { + "Name": "Wallet4739", + "ParticipationOnly": false + }, + { + "Name": "Wallet4740", + "ParticipationOnly": false + }, + { + "Name": "Wallet4741", + "ParticipationOnly": false + }, + { + "Name": "Wallet4742", + "ParticipationOnly": false + }, + { + "Name": "Wallet4743", + "ParticipationOnly": false + }, + { + "Name": "Wallet4744", + "ParticipationOnly": false + }, + { + "Name": "Wallet4745", + "ParticipationOnly": false + }, + { + "Name": "Wallet4746", + "ParticipationOnly": false + }, + { + "Name": "Wallet4747", + "ParticipationOnly": false + }, + { + "Name": "Wallet4748", + "ParticipationOnly": false + }, + { + "Name": "Wallet4749", + "ParticipationOnly": false + }, + { + "Name": "Wallet4750", + "ParticipationOnly": false + }, + { + "Name": "Wallet4751", + "ParticipationOnly": false + }, + { + "Name": "Wallet4752", + "ParticipationOnly": false + }, + { + "Name": "Wallet4753", + "ParticipationOnly": false + }, + { + "Name": "Wallet4754", + "ParticipationOnly": false + }, + { + "Name": "Wallet4755", + "ParticipationOnly": false + }, + { + "Name": "Wallet4756", + "ParticipationOnly": false + }, + { + "Name": "Wallet4757", + "ParticipationOnly": false + }, + { + "Name": "Wallet4758", + "ParticipationOnly": false + }, + { + "Name": "Wallet4759", + "ParticipationOnly": false + }, + { + "Name": "Wallet4760", + "ParticipationOnly": false + }, + { + "Name": "Wallet4761", + "ParticipationOnly": false + }, + { + "Name": "Wallet4762", + "ParticipationOnly": false + }, + { + "Name": "Wallet4763", + "ParticipationOnly": false + }, + { + "Name": "Wallet4764", + "ParticipationOnly": false + }, + { + "Name": "Wallet4765", + "ParticipationOnly": false + }, + { + "Name": "Wallet4766", + "ParticipationOnly": false + }, + { + "Name": "Wallet4767", + "ParticipationOnly": false + }, + { + "Name": "Wallet4768", + "ParticipationOnly": false + }, + { + "Name": "Wallet4769", + "ParticipationOnly": false + }, + { + "Name": "Wallet4770", + "ParticipationOnly": false + }, + { + "Name": "Wallet4771", + "ParticipationOnly": false + }, + { + "Name": "Wallet4772", + "ParticipationOnly": false + }, + { + "Name": "Wallet4773", + "ParticipationOnly": false + }, + { + "Name": "Wallet4774", + "ParticipationOnly": false + }, + { + "Name": "Wallet4775", + "ParticipationOnly": false + }, + { + "Name": "Wallet4776", + "ParticipationOnly": false + }, + { + "Name": "Wallet4777", + "ParticipationOnly": false + }, + { + "Name": "Wallet4778", + "ParticipationOnly": false + }, + { + "Name": "Wallet4779", + "ParticipationOnly": false + }, + { + "Name": "Wallet4780", + "ParticipationOnly": false + }, + { + "Name": "Wallet4781", + "ParticipationOnly": false + }, + { + "Name": "Wallet4782", + "ParticipationOnly": false + }, + { + "Name": "Wallet4783", + "ParticipationOnly": false + }, + { + "Name": "Wallet4784", + "ParticipationOnly": false + }, + { + "Name": "Wallet4785", + "ParticipationOnly": false + }, + { + "Name": "Wallet4786", + "ParticipationOnly": false + }, + { + "Name": "Wallet4787", + "ParticipationOnly": false + }, + { + "Name": "Wallet4788", + "ParticipationOnly": false + }, + { + "Name": "Wallet4789", + "ParticipationOnly": false + }, + { + "Name": "Wallet4790", + "ParticipationOnly": false + }, + { + "Name": "Wallet4791", + "ParticipationOnly": false + }, + { + "Name": "Wallet4792", + "ParticipationOnly": false + }, + { + "Name": "Wallet4793", + "ParticipationOnly": false + }, + { + "Name": "Wallet4794", + "ParticipationOnly": false + }, + { + "Name": "Wallet4795", + "ParticipationOnly": false + }, + { + "Name": "Wallet4796", + "ParticipationOnly": false + }, + { + "Name": "Wallet4797", + "ParticipationOnly": false + }, + { + "Name": "Wallet4798", + "ParticipationOnly": false + }, + { + "Name": "Wallet4799", + "ParticipationOnly": false + }, + { + "Name": "Wallet4800", + "ParticipationOnly": false + }, + { + "Name": "Wallet4801", + "ParticipationOnly": false + }, + { + "Name": "Wallet4802", + "ParticipationOnly": false + }, + { + "Name": "Wallet4803", + "ParticipationOnly": false + }, + { + "Name": "Wallet4804", + "ParticipationOnly": false + }, + { + "Name": "Wallet4805", + "ParticipationOnly": false + }, + { + "Name": "Wallet4806", + "ParticipationOnly": false + }, + { + "Name": "Wallet4807", + "ParticipationOnly": false + }, + { + "Name": "Wallet4808", + "ParticipationOnly": false + }, + { + "Name": "Wallet4809", + "ParticipationOnly": false + }, + { + "Name": "Wallet4810", + "ParticipationOnly": false + }, + { + "Name": "Wallet4811", + "ParticipationOnly": false + }, + { + "Name": "Wallet4812", + "ParticipationOnly": false + }, + { + "Name": "Wallet4813", + "ParticipationOnly": false + }, + { + "Name": "Wallet4814", + "ParticipationOnly": false + }, + { + "Name": "Wallet4815", + "ParticipationOnly": false + }, + { + "Name": "Wallet4816", + "ParticipationOnly": false + }, + { + "Name": "Wallet4817", + "ParticipationOnly": false + }, + { + "Name": "Wallet4818", + "ParticipationOnly": false + }, + { + "Name": "Wallet4819", + "ParticipationOnly": false + }, + { + "Name": "Wallet4820", + "ParticipationOnly": false + }, + { + "Name": "Wallet4821", + "ParticipationOnly": false + }, + { + "Name": "Wallet4822", + "ParticipationOnly": false + }, + { + "Name": "Wallet4823", + "ParticipationOnly": false + }, + { + "Name": "Wallet4824", + "ParticipationOnly": false + }, + { + "Name": "Wallet4825", + "ParticipationOnly": false + }, + { + "Name": "Wallet4826", + "ParticipationOnly": false + }, + { + "Name": "Wallet4827", + "ParticipationOnly": false + }, + { + "Name": "Wallet4828", + "ParticipationOnly": false + }, + { + "Name": "Wallet4829", + "ParticipationOnly": false + }, + { + "Name": "Wallet4830", + "ParticipationOnly": false + }, + { + "Name": "Wallet4831", + "ParticipationOnly": false + }, + { + "Name": "Wallet4832", + "ParticipationOnly": false + }, + { + "Name": "Wallet4833", + "ParticipationOnly": false + }, + { + "Name": "Wallet4834", + "ParticipationOnly": false + }, + { + "Name": "Wallet4835", + "ParticipationOnly": false + }, + { + "Name": "Wallet4836", + "ParticipationOnly": false + }, + { + "Name": "Wallet4837", + "ParticipationOnly": false + }, + { + "Name": "Wallet4838", + "ParticipationOnly": false + }, + { + "Name": "Wallet4839", + "ParticipationOnly": false + }, + { + "Name": "Wallet4840", + "ParticipationOnly": false + }, + { + "Name": "Wallet4841", + "ParticipationOnly": false + }, + { + "Name": "Wallet4842", + "ParticipationOnly": false + }, + { + "Name": "Wallet4843", + "ParticipationOnly": false + }, + { + "Name": "Wallet4844", + "ParticipationOnly": false + }, + { + "Name": "Wallet4845", + "ParticipationOnly": false + }, + { + "Name": "Wallet4846", + "ParticipationOnly": false + }, + { + "Name": "Wallet4847", + "ParticipationOnly": false + }, + { + "Name": "Wallet4848", + "ParticipationOnly": false + }, + { + "Name": "Wallet4849", + "ParticipationOnly": false + }, + { + "Name": "Wallet4850", + "ParticipationOnly": false + }, + { + "Name": "Wallet4851", + "ParticipationOnly": false + }, + { + "Name": "Wallet4852", + "ParticipationOnly": false + }, + { + "Name": "Wallet4853", + "ParticipationOnly": false + }, + { + "Name": "Wallet4854", + "ParticipationOnly": false + }, + { + "Name": "Wallet4855", + "ParticipationOnly": false + }, + { + "Name": "Wallet4856", + "ParticipationOnly": false + }, + { + "Name": "Wallet4857", + "ParticipationOnly": false + }, + { + "Name": "Wallet4858", + "ParticipationOnly": false + }, + { + "Name": "Wallet4859", + "ParticipationOnly": false + }, + { + "Name": "Wallet4860", + "ParticipationOnly": false + }, + { + "Name": "Wallet4861", + "ParticipationOnly": false + }, + { + "Name": "Wallet4862", + "ParticipationOnly": false + }, + { + "Name": "Wallet4863", + "ParticipationOnly": false + }, + { + "Name": "Wallet4864", + "ParticipationOnly": false + }, + { + "Name": "Wallet4865", + "ParticipationOnly": false + }, + { + "Name": "Wallet4866", + "ParticipationOnly": false + }, + { + "Name": "Wallet4867", + "ParticipationOnly": false + }, + { + "Name": "Wallet4868", + "ParticipationOnly": false + }, + { + "Name": "Wallet4869", + "ParticipationOnly": false + }, + { + "Name": "Wallet4870", + "ParticipationOnly": false + }, + { + "Name": "Wallet4871", + "ParticipationOnly": false + }, + { + "Name": "Wallet4872", + "ParticipationOnly": false + }, + { + "Name": "Wallet4873", + "ParticipationOnly": false + }, + { + "Name": "Wallet4874", + "ParticipationOnly": false + }, + { + "Name": "Wallet4875", + "ParticipationOnly": false + }, + { + "Name": "Wallet4876", + "ParticipationOnly": false + }, + { + "Name": "Wallet4877", + "ParticipationOnly": false + }, + { + "Name": "Wallet4878", + "ParticipationOnly": false + }, + { + "Name": "Wallet4879", + "ParticipationOnly": false + }, + { + "Name": "Wallet4880", + "ParticipationOnly": false + }, + { + "Name": "Wallet4881", + "ParticipationOnly": false + }, + { + "Name": "Wallet4882", + "ParticipationOnly": false + }, + { + "Name": "Wallet4883", + "ParticipationOnly": false + }, + { + "Name": "Wallet4884", + "ParticipationOnly": false + }, + { + "Name": "Wallet4885", + "ParticipationOnly": false + }, + { + "Name": "Wallet4886", + "ParticipationOnly": false + }, + { + "Name": "Wallet4887", + "ParticipationOnly": false + }, + { + "Name": "Wallet4888", + "ParticipationOnly": false + }, + { + "Name": "Wallet4889", + "ParticipationOnly": false + }, + { + "Name": "Wallet4890", + "ParticipationOnly": false + }, + { + "Name": "Wallet4891", + "ParticipationOnly": false + }, + { + "Name": "Wallet4892", + "ParticipationOnly": false + }, + { + "Name": "Wallet4893", + "ParticipationOnly": false + }, + { + "Name": "Wallet4894", + "ParticipationOnly": false + }, + { + "Name": "Wallet4895", + "ParticipationOnly": false + }, + { + "Name": "Wallet4896", + "ParticipationOnly": false + }, + { + "Name": "Wallet4897", + "ParticipationOnly": false + }, + { + "Name": "Wallet4898", + "ParticipationOnly": false + }, + { + "Name": "Wallet4899", + "ParticipationOnly": false + }, + { + "Name": "Wallet4900", + "ParticipationOnly": false + }, + { + "Name": "Wallet4901", + "ParticipationOnly": false + }, + { + "Name": "Wallet4902", + "ParticipationOnly": false + }, + { + "Name": "Wallet4903", + "ParticipationOnly": false + }, + { + "Name": "Wallet4904", + "ParticipationOnly": false + }, + { + "Name": "Wallet4905", + "ParticipationOnly": false + }, + { + "Name": "Wallet4906", + "ParticipationOnly": false + }, + { + "Name": "Wallet4907", + "ParticipationOnly": false + }, + { + "Name": "Wallet4908", + "ParticipationOnly": false + }, + { + "Name": "Wallet4909", + "ParticipationOnly": false + }, + { + "Name": "Wallet4910", + "ParticipationOnly": false + }, + { + "Name": "Wallet4911", + "ParticipationOnly": false + }, + { + "Name": "Wallet4912", + "ParticipationOnly": false + }, + { + "Name": "Wallet4913", + "ParticipationOnly": false + }, + { + "Name": "Wallet4914", + "ParticipationOnly": false + }, + { + "Name": "Wallet4915", + "ParticipationOnly": false + }, + { + "Name": "Wallet4916", + "ParticipationOnly": false + }, + { + "Name": "Wallet4917", + "ParticipationOnly": false + }, + { + "Name": "Wallet4918", + "ParticipationOnly": false + }, + { + "Name": "Wallet4919", + "ParticipationOnly": false + }, + { + "Name": "Wallet4920", + "ParticipationOnly": false + }, + { + "Name": "Wallet4921", + "ParticipationOnly": false + }, + { + "Name": "Wallet4922", + "ParticipationOnly": false + }, + { + "Name": "Wallet4923", + "ParticipationOnly": false + }, + { + "Name": "Wallet4924", + "ParticipationOnly": false + }, + { + "Name": "Wallet4925", + "ParticipationOnly": false + }, + { + "Name": "Wallet4926", + "ParticipationOnly": false + }, + { + "Name": "Wallet4927", + "ParticipationOnly": false + }, + { + "Name": "Wallet4928", + "ParticipationOnly": false + }, + { + "Name": "Wallet4929", + "ParticipationOnly": false + }, + { + "Name": "Wallet4930", + "ParticipationOnly": false + }, + { + "Name": "Wallet4931", + "ParticipationOnly": false + }, + { + "Name": "Wallet4932", + "ParticipationOnly": false + }, + { + "Name": "Wallet4933", + "ParticipationOnly": false + }, + { + "Name": "Wallet4934", + "ParticipationOnly": false + }, + { + "Name": "Wallet4935", + "ParticipationOnly": false + }, + { + "Name": "Wallet4936", + "ParticipationOnly": false + }, + { + "Name": "Wallet4937", + "ParticipationOnly": false + }, + { + "Name": "Wallet4938", + "ParticipationOnly": false + }, + { + "Name": "Wallet4939", + "ParticipationOnly": false + }, + { + "Name": "Wallet4940", + "ParticipationOnly": false + }, + { + "Name": "Wallet4941", + "ParticipationOnly": false + }, + { + "Name": "Wallet4942", + "ParticipationOnly": false + }, + { + "Name": "Wallet4943", + "ParticipationOnly": false + }, + { + "Name": "Wallet4944", + "ParticipationOnly": false + }, + { + "Name": "Wallet4945", + "ParticipationOnly": false + }, + { + "Name": "Wallet4946", + "ParticipationOnly": false + }, + { + "Name": "Wallet4947", + "ParticipationOnly": false + }, + { + "Name": "Wallet4948", + "ParticipationOnly": false + }, + { + "Name": "Wallet4949", + "ParticipationOnly": false + }, + { + "Name": "Wallet4950", + "ParticipationOnly": false + }, + { + "Name": "Wallet4951", + "ParticipationOnly": false + }, + { + "Name": "Wallet4952", + "ParticipationOnly": false + }, + { + "Name": "Wallet4953", + "ParticipationOnly": false + }, + { + "Name": "Wallet4954", + "ParticipationOnly": false + }, + { + "Name": "Wallet4955", + "ParticipationOnly": false + }, + { + "Name": "Wallet4956", + "ParticipationOnly": false + }, + { + "Name": "Wallet4957", + "ParticipationOnly": false + }, + { + "Name": "Wallet4958", + "ParticipationOnly": false + }, + { + "Name": "Wallet4959", + "ParticipationOnly": false + }, + { + "Name": "Wallet4960", + "ParticipationOnly": false + }, + { + "Name": "Wallet4961", + "ParticipationOnly": false + }, + { + "Name": "Wallet4962", + "ParticipationOnly": false + }, + { + "Name": "Wallet4963", + "ParticipationOnly": false + }, + { + "Name": "Wallet4964", + "ParticipationOnly": false + }, + { + "Name": "Wallet4965", + "ParticipationOnly": false + }, + { + "Name": "Wallet4966", + "ParticipationOnly": false + }, + { + "Name": "Wallet4967", + "ParticipationOnly": false + }, + { + "Name": "Wallet4968", + "ParticipationOnly": false + }, + { + "Name": "Wallet4969", + "ParticipationOnly": false + }, + { + "Name": "Wallet4970", + "ParticipationOnly": false + }, + { + "Name": "Wallet4971", + "ParticipationOnly": false + }, + { + "Name": "Wallet4972", + "ParticipationOnly": false + }, + { + "Name": "Wallet4973", + "ParticipationOnly": false + }, + { + "Name": "Wallet4974", + "ParticipationOnly": false + }, + { + "Name": "Wallet4975", + "ParticipationOnly": false + }, + { + "Name": "Wallet4976", + "ParticipationOnly": false + }, + { + "Name": "Wallet4977", + "ParticipationOnly": false + }, + { + "Name": "Wallet4978", + "ParticipationOnly": false + }, + { + "Name": "Wallet4979", + "ParticipationOnly": false + }, + { + "Name": "Wallet4980", + "ParticipationOnly": false + }, + { + "Name": "Wallet4981", + "ParticipationOnly": false + }, + { + "Name": "Wallet4982", + "ParticipationOnly": false + }, + { + "Name": "Wallet4983", + "ParticipationOnly": false + }, + { + "Name": "Wallet4984", + "ParticipationOnly": false + }, + { + "Name": "Wallet4985", + "ParticipationOnly": false + }, + { + "Name": "Wallet4986", + "ParticipationOnly": false + }, + { + "Name": "Wallet4987", + "ParticipationOnly": false + }, + { + "Name": "Wallet4988", + "ParticipationOnly": false + }, + { + "Name": "Wallet4989", + "ParticipationOnly": false + }, + { + "Name": "Wallet4990", + "ParticipationOnly": false + }, + { + "Name": "Wallet4991", + "ParticipationOnly": false + }, + { + "Name": "Wallet4992", + "ParticipationOnly": false + }, + { + "Name": "Wallet4993", + "ParticipationOnly": false + }, + { + "Name": "Wallet4994", + "ParticipationOnly": false + }, + { + "Name": "Wallet4995", + "ParticipationOnly": false + }, + { + "Name": "Wallet4996", + "ParticipationOnly": false + }, + { + "Name": "Wallet4997", + "ParticipationOnly": false + }, + { + "Name": "Wallet4998", + "ParticipationOnly": false + }, + { + "Name": "Wallet4999", + "ParticipationOnly": false + }, + { + "Name": "Wallet5000", + "ParticipationOnly": false + }, + { + "Name": "Wallet5001", + "ParticipationOnly": false + }, + { + "Name": "Wallet5002", + "ParticipationOnly": false + }, + { + "Name": "Wallet5003", + "ParticipationOnly": false + }, + { + "Name": "Wallet5004", + "ParticipationOnly": false + }, + { + "Name": "Wallet5005", + "ParticipationOnly": false + }, + { + "Name": "Wallet5006", + "ParticipationOnly": false + }, + { + "Name": "Wallet5007", + "ParticipationOnly": false + }, + { + "Name": "Wallet5008", + "ParticipationOnly": false + }, + { + "Name": "Wallet5009", + "ParticipationOnly": false + }, + { + "Name": "Wallet5010", + "ParticipationOnly": false + }, + { + "Name": "Wallet5011", + "ParticipationOnly": false + }, + { + "Name": "Wallet5012", + "ParticipationOnly": false + }, + { + "Name": "Wallet5013", + "ParticipationOnly": false + }, + { + "Name": "Wallet5014", + "ParticipationOnly": false + }, + { + "Name": "Wallet5015", + "ParticipationOnly": false + }, + { + "Name": "Wallet5016", + "ParticipationOnly": false + }, + { + "Name": "Wallet5017", + "ParticipationOnly": false + }, + { + "Name": "Wallet5018", + "ParticipationOnly": false + }, + { + "Name": "Wallet5019", + "ParticipationOnly": false + }, + { + "Name": "Wallet5020", + "ParticipationOnly": false + }, + { + "Name": "Wallet5021", + "ParticipationOnly": false + }, + { + "Name": "Wallet5022", + "ParticipationOnly": false + }, + { + "Name": "Wallet5023", + "ParticipationOnly": false + }, + { + "Name": "Wallet5024", + "ParticipationOnly": false + }, + { + "Name": "Wallet5025", + "ParticipationOnly": false + }, + { + "Name": "Wallet5026", + "ParticipationOnly": false + }, + { + "Name": "Wallet5027", + "ParticipationOnly": false + }, + { + "Name": "Wallet5028", + "ParticipationOnly": false + }, + { + "Name": "Wallet5029", + "ParticipationOnly": false + }, + { + "Name": "Wallet5030", + "ParticipationOnly": false + }, + { + "Name": "Wallet5031", + "ParticipationOnly": false + }, + { + "Name": "Wallet5032", + "ParticipationOnly": false + }, + { + "Name": "Wallet5033", + "ParticipationOnly": false + }, + { + "Name": "Wallet5034", + "ParticipationOnly": false + }, + { + "Name": "Wallet5035", + "ParticipationOnly": false + }, + { + "Name": "Wallet5036", + "ParticipationOnly": false + }, + { + "Name": "Wallet5037", + "ParticipationOnly": false + }, + { + "Name": "Wallet5038", + "ParticipationOnly": false + }, + { + "Name": "Wallet5039", + "ParticipationOnly": false + }, + { + "Name": "Wallet5040", + "ParticipationOnly": false + }, + { + "Name": "Wallet5041", + "ParticipationOnly": false + }, + { + "Name": "Wallet5042", + "ParticipationOnly": false + }, + { + "Name": "Wallet5043", + "ParticipationOnly": false + }, + { + "Name": "Wallet5044", + "ParticipationOnly": false + }, + { + "Name": "Wallet5045", + "ParticipationOnly": false + }, + { + "Name": "Wallet5046", + "ParticipationOnly": false + }, + { + "Name": "Wallet5047", + "ParticipationOnly": false + }, + { + "Name": "Wallet5048", + "ParticipationOnly": false + }, + { + "Name": "Wallet5049", + "ParticipationOnly": false + }, + { + "Name": "Wallet5050", + "ParticipationOnly": false + }, + { + "Name": "Wallet5051", + "ParticipationOnly": false + }, + { + "Name": "Wallet5052", + "ParticipationOnly": false + }, + { + "Name": "Wallet5053", + "ParticipationOnly": false + }, + { + "Name": "Wallet5054", + "ParticipationOnly": false + }, + { + "Name": "Wallet5055", + "ParticipationOnly": false + }, + { + "Name": "Wallet5056", + "ParticipationOnly": false + }, + { + "Name": "Wallet5057", + "ParticipationOnly": false + }, + { + "Name": "Wallet5058", + "ParticipationOnly": false + }, + { + "Name": "Wallet5059", + "ParticipationOnly": false + }, + { + "Name": "Wallet5060", + "ParticipationOnly": false + }, + { + "Name": "Wallet5061", + "ParticipationOnly": false + }, + { + "Name": "Wallet5062", + "ParticipationOnly": false + }, + { + "Name": "Wallet5063", + "ParticipationOnly": false + }, + { + "Name": "Wallet5064", + "ParticipationOnly": false + }, + { + "Name": "Wallet5065", + "ParticipationOnly": false + }, + { + "Name": "Wallet5066", + "ParticipationOnly": false + }, + { + "Name": "Wallet5067", + "ParticipationOnly": false + }, + { + "Name": "Wallet5068", + "ParticipationOnly": false + }, + { + "Name": "Wallet5069", + "ParticipationOnly": false + }, + { + "Name": "Wallet5070", + "ParticipationOnly": false + }, + { + "Name": "Wallet5071", + "ParticipationOnly": false + }, + { + "Name": "Wallet5072", + "ParticipationOnly": false + }, + { + "Name": "Wallet5073", + "ParticipationOnly": false + }, + { + "Name": "Wallet5074", + "ParticipationOnly": false + }, + { + "Name": "Wallet5075", + "ParticipationOnly": false + }, + { + "Name": "Wallet5076", + "ParticipationOnly": false + }, + { + "Name": "Wallet5077", + "ParticipationOnly": false + }, + { + "Name": "Wallet5078", + "ParticipationOnly": false + }, + { + "Name": "Wallet5079", + "ParticipationOnly": false + }, + { + "Name": "Wallet5080", + "ParticipationOnly": false + }, + { + "Name": "Wallet5081", + "ParticipationOnly": false + }, + { + "Name": "Wallet5082", + "ParticipationOnly": false + }, + { + "Name": "Wallet5083", + "ParticipationOnly": false + }, + { + "Name": "Wallet5084", + "ParticipationOnly": false + }, + { + "Name": "Wallet5085", + "ParticipationOnly": false + }, + { + "Name": "Wallet5086", + "ParticipationOnly": false + }, + { + "Name": "Wallet5087", + "ParticipationOnly": false + }, + { + "Name": "Wallet5088", + "ParticipationOnly": false + }, + { + "Name": "Wallet5089", + "ParticipationOnly": false + }, + { + "Name": "Wallet5090", + "ParticipationOnly": false + }, + { + "Name": "Wallet5091", + "ParticipationOnly": false + }, + { + "Name": "Wallet5092", + "ParticipationOnly": false + }, + { + "Name": "Wallet5093", + "ParticipationOnly": false + }, + { + "Name": "Wallet5094", + "ParticipationOnly": false + }, + { + "Name": "Wallet5095", + "ParticipationOnly": false + }, + { + "Name": "Wallet5096", + "ParticipationOnly": false + }, + { + "Name": "Wallet5097", + "ParticipationOnly": false + }, + { + "Name": "Wallet5098", + "ParticipationOnly": false + }, + { + "Name": "Wallet5099", + "ParticipationOnly": false + }, + { + "Name": "Wallet5100", + "ParticipationOnly": false + }, + { + "Name": "Wallet5101", + "ParticipationOnly": false + }, + { + "Name": "Wallet5102", + "ParticipationOnly": false + }, + { + "Name": "Wallet5103", + "ParticipationOnly": false + }, + { + "Name": "Wallet5104", + "ParticipationOnly": false + }, + { + "Name": "Wallet5105", + "ParticipationOnly": false + }, + { + "Name": "Wallet5106", + "ParticipationOnly": false + }, + { + "Name": "Wallet5107", + "ParticipationOnly": false + }, + { + "Name": "Wallet5108", + "ParticipationOnly": false + }, + { + "Name": "Wallet5109", + "ParticipationOnly": false + }, + { + "Name": "Wallet5110", + "ParticipationOnly": false + }, + { + "Name": "Wallet5111", + "ParticipationOnly": false + }, + { + "Name": "Wallet5112", + "ParticipationOnly": false + }, + { + "Name": "Wallet5113", + "ParticipationOnly": false + }, + { + "Name": "Wallet5114", + "ParticipationOnly": false + }, + { + "Name": "Wallet5115", + "ParticipationOnly": false + }, + { + "Name": "Wallet5116", + "ParticipationOnly": false + }, + { + "Name": "Wallet5117", + "ParticipationOnly": false + }, + { + "Name": "Wallet5118", + "ParticipationOnly": false + }, + { + "Name": "Wallet5119", + "ParticipationOnly": false + }, + { + "Name": "Wallet5120", + "ParticipationOnly": false + }, + { + "Name": "Wallet5121", + "ParticipationOnly": false + }, + { + "Name": "Wallet5122", + "ParticipationOnly": false + }, + { + "Name": "Wallet5123", + "ParticipationOnly": false + }, + { + "Name": "Wallet5124", + "ParticipationOnly": false + }, + { + "Name": "Wallet5125", + "ParticipationOnly": false + }, + { + "Name": "Wallet5126", + "ParticipationOnly": false + }, + { + "Name": "Wallet5127", + "ParticipationOnly": false + }, + { + "Name": "Wallet5128", + "ParticipationOnly": false + }, + { + "Name": "Wallet5129", + "ParticipationOnly": false + }, + { + "Name": "Wallet5130", + "ParticipationOnly": false + }, + { + "Name": "Wallet5131", + "ParticipationOnly": false + }, + { + "Name": "Wallet5132", + "ParticipationOnly": false + }, + { + "Name": "Wallet5133", + "ParticipationOnly": false + }, + { + "Name": "Wallet5134", + "ParticipationOnly": false + }, + { + "Name": "Wallet5135", + "ParticipationOnly": false + }, + { + "Name": "Wallet5136", + "ParticipationOnly": false + }, + { + "Name": "Wallet5137", + "ParticipationOnly": false + }, + { + "Name": "Wallet5138", + "ParticipationOnly": false + }, + { + "Name": "Wallet5139", + "ParticipationOnly": false + }, + { + "Name": "Wallet5140", + "ParticipationOnly": false + }, + { + "Name": "Wallet5141", + "ParticipationOnly": false + }, + { + "Name": "Wallet5142", + "ParticipationOnly": false + }, + { + "Name": "Wallet5143", + "ParticipationOnly": false + }, + { + "Name": "Wallet5144", + "ParticipationOnly": false + }, + { + "Name": "Wallet5145", + "ParticipationOnly": false + }, + { + "Name": "Wallet5146", + "ParticipationOnly": false + }, + { + "Name": "Wallet5147", + "ParticipationOnly": false + }, + { + "Name": "Wallet5148", + "ParticipationOnly": false + }, + { + "Name": "Wallet5149", + "ParticipationOnly": false + }, + { + "Name": "Wallet5150", + "ParticipationOnly": false + }, + { + "Name": "Wallet5151", + "ParticipationOnly": false + }, + { + "Name": "Wallet5152", + "ParticipationOnly": false + }, + { + "Name": "Wallet5153", + "ParticipationOnly": false + }, + { + "Name": "Wallet5154", + "ParticipationOnly": false + }, + { + "Name": "Wallet5155", + "ParticipationOnly": false + }, + { + "Name": "Wallet5156", + "ParticipationOnly": false + }, + { + "Name": "Wallet5157", + "ParticipationOnly": false + }, + { + "Name": "Wallet5158", + "ParticipationOnly": false + }, + { + "Name": "Wallet5159", + "ParticipationOnly": false + }, + { + "Name": "Wallet5160", + "ParticipationOnly": false + }, + { + "Name": "Wallet5161", + "ParticipationOnly": false + }, + { + "Name": "Wallet5162", + "ParticipationOnly": false + }, + { + "Name": "Wallet5163", + "ParticipationOnly": false + }, + { + "Name": "Wallet5164", + "ParticipationOnly": false + }, + { + "Name": "Wallet5165", + "ParticipationOnly": false + }, + { + "Name": "Wallet5166", + "ParticipationOnly": false + }, + { + "Name": "Wallet5167", + "ParticipationOnly": false + }, + { + "Name": "Wallet5168", + "ParticipationOnly": false + }, + { + "Name": "Wallet5169", + "ParticipationOnly": false + }, + { + "Name": "Wallet5170", + "ParticipationOnly": false + }, + { + "Name": "Wallet5171", + "ParticipationOnly": false + }, + { + "Name": "Wallet5172", + "ParticipationOnly": false + }, + { + "Name": "Wallet5173", + "ParticipationOnly": false + }, + { + "Name": "Wallet5174", + "ParticipationOnly": false + }, + { + "Name": "Wallet5175", + "ParticipationOnly": false + }, + { + "Name": "Wallet5176", + "ParticipationOnly": false + }, + { + "Name": "Wallet5177", + "ParticipationOnly": false + }, + { + "Name": "Wallet5178", + "ParticipationOnly": false + }, + { + "Name": "Wallet5179", + "ParticipationOnly": false + }, + { + "Name": "Wallet5180", + "ParticipationOnly": false + }, + { + "Name": "Wallet5181", + "ParticipationOnly": false + }, + { + "Name": "Wallet5182", + "ParticipationOnly": false + }, + { + "Name": "Wallet5183", + "ParticipationOnly": false + }, + { + "Name": "Wallet5184", + "ParticipationOnly": false + }, + { + "Name": "Wallet5185", + "ParticipationOnly": false + }, + { + "Name": "Wallet5186", + "ParticipationOnly": false + }, + { + "Name": "Wallet5187", + "ParticipationOnly": false + }, + { + "Name": "Wallet5188", + "ParticipationOnly": false + }, + { + "Name": "Wallet5189", + "ParticipationOnly": false + }, + { + "Name": "Wallet5190", + "ParticipationOnly": false + }, + { + "Name": "Wallet5191", + "ParticipationOnly": false + }, + { + "Name": "Wallet5192", + "ParticipationOnly": false + }, + { + "Name": "Wallet5193", + "ParticipationOnly": false + }, + { + "Name": "Wallet5194", + "ParticipationOnly": false + }, + { + "Name": "Wallet5195", + "ParticipationOnly": false + }, + { + "Name": "Wallet5196", + "ParticipationOnly": false + }, + { + "Name": "Wallet5197", + "ParticipationOnly": false + }, + { + "Name": "Wallet5198", + "ParticipationOnly": false + }, + { + "Name": "Wallet5199", + "ParticipationOnly": false + }, + { + "Name": "Wallet5200", + "ParticipationOnly": false + }, + { + "Name": "Wallet5201", + "ParticipationOnly": false + }, + { + "Name": "Wallet5202", + "ParticipationOnly": false + }, + { + "Name": "Wallet5203", + "ParticipationOnly": false + }, + { + "Name": "Wallet5204", + "ParticipationOnly": false + }, + { + "Name": "Wallet5205", + "ParticipationOnly": false + }, + { + "Name": "Wallet5206", + "ParticipationOnly": false + }, + { + "Name": "Wallet5207", + "ParticipationOnly": false + }, + { + "Name": "Wallet5208", + "ParticipationOnly": false + }, + { + "Name": "Wallet5209", + "ParticipationOnly": false + }, + { + "Name": "Wallet5210", + "ParticipationOnly": false + }, + { + "Name": "Wallet5211", + "ParticipationOnly": false + }, + { + "Name": "Wallet5212", + "ParticipationOnly": false + }, + { + "Name": "Wallet5213", + "ParticipationOnly": false + }, + { + "Name": "Wallet5214", + "ParticipationOnly": false + }, + { + "Name": "Wallet5215", + "ParticipationOnly": false + }, + { + "Name": "Wallet5216", + "ParticipationOnly": false + }, + { + "Name": "Wallet5217", + "ParticipationOnly": false + }, + { + "Name": "Wallet5218", + "ParticipationOnly": false + }, + { + "Name": "Wallet5219", + "ParticipationOnly": false + }, + { + "Name": "Wallet5220", + "ParticipationOnly": false + }, + { + "Name": "Wallet5221", + "ParticipationOnly": false + }, + { + "Name": "Wallet5222", + "ParticipationOnly": false + }, + { + "Name": "Wallet5223", + "ParticipationOnly": false + }, + { + "Name": "Wallet5224", + "ParticipationOnly": false + }, + { + "Name": "Wallet5225", + "ParticipationOnly": false + }, + { + "Name": "Wallet5226", + "ParticipationOnly": false + }, + { + "Name": "Wallet5227", + "ParticipationOnly": false + }, + { + "Name": "Wallet5228", + "ParticipationOnly": false + }, + { + "Name": "Wallet5229", + "ParticipationOnly": false + }, + { + "Name": "Wallet5230", + "ParticipationOnly": false + }, + { + "Name": "Wallet5231", + "ParticipationOnly": false + }, + { + "Name": "Wallet5232", + "ParticipationOnly": false + }, + { + "Name": "Wallet5233", + "ParticipationOnly": false + }, + { + "Name": "Wallet5234", + "ParticipationOnly": false + }, + { + "Name": "Wallet5235", + "ParticipationOnly": false + }, + { + "Name": "Wallet5236", + "ParticipationOnly": false + }, + { + "Name": "Wallet5237", + "ParticipationOnly": false + }, + { + "Name": "Wallet5238", + "ParticipationOnly": false + }, + { + "Name": "Wallet5239", + "ParticipationOnly": false + }, + { + "Name": "Wallet5240", + "ParticipationOnly": false + }, + { + "Name": "Wallet5241", + "ParticipationOnly": false + }, + { + "Name": "Wallet5242", + "ParticipationOnly": false + }, + { + "Name": "Wallet5243", + "ParticipationOnly": false + }, + { + "Name": "Wallet5244", + "ParticipationOnly": false + }, + { + "Name": "Wallet5245", + "ParticipationOnly": false + }, + { + "Name": "Wallet5246", + "ParticipationOnly": false + }, + { + "Name": "Wallet5247", + "ParticipationOnly": false + }, + { + "Name": "Wallet5248", + "ParticipationOnly": false + }, + { + "Name": "Wallet5249", + "ParticipationOnly": false + }, + { + "Name": "Wallet5250", + "ParticipationOnly": false + }, + { + "Name": "Wallet5251", + "ParticipationOnly": false + }, + { + "Name": "Wallet5252", + "ParticipationOnly": false + }, + { + "Name": "Wallet5253", + "ParticipationOnly": false + }, + { + "Name": "Wallet5254", + "ParticipationOnly": false + }, + { + "Name": "Wallet5255", + "ParticipationOnly": false + }, + { + "Name": "Wallet5256", + "ParticipationOnly": false + }, + { + "Name": "Wallet5257", + "ParticipationOnly": false + }, + { + "Name": "Wallet5258", + "ParticipationOnly": false + }, + { + "Name": "Wallet5259", + "ParticipationOnly": false + }, + { + "Name": "Wallet5260", + "ParticipationOnly": false + }, + { + "Name": "Wallet5261", + "ParticipationOnly": false + }, + { + "Name": "Wallet5262", + "ParticipationOnly": false + }, + { + "Name": "Wallet5263", + "ParticipationOnly": false + }, + { + "Name": "Wallet5264", + "ParticipationOnly": false + }, + { + "Name": "Wallet5265", + "ParticipationOnly": false + }, + { + "Name": "Wallet5266", + "ParticipationOnly": false + }, + { + "Name": "Wallet5267", + "ParticipationOnly": false + }, + { + "Name": "Wallet5268", + "ParticipationOnly": false + }, + { + "Name": "Wallet5269", + "ParticipationOnly": false + }, + { + "Name": "Wallet5270", + "ParticipationOnly": false + }, + { + "Name": "Wallet5271", + "ParticipationOnly": false + }, + { + "Name": "Wallet5272", + "ParticipationOnly": false + }, + { + "Name": "Wallet5273", + "ParticipationOnly": false + }, + { + "Name": "Wallet5274", + "ParticipationOnly": false + }, + { + "Name": "Wallet5275", + "ParticipationOnly": false + }, + { + "Name": "Wallet5276", + "ParticipationOnly": false + }, + { + "Name": "Wallet5277", + "ParticipationOnly": false + }, + { + "Name": "Wallet5278", + "ParticipationOnly": false + }, + { + "Name": "Wallet5279", + "ParticipationOnly": false + }, + { + "Name": "Wallet5280", + "ParticipationOnly": false + }, + { + "Name": "Wallet5281", + "ParticipationOnly": false + }, + { + "Name": "Wallet5282", + "ParticipationOnly": false + }, + { + "Name": "Wallet5283", + "ParticipationOnly": false + }, + { + "Name": "Wallet5284", + "ParticipationOnly": false + }, + { + "Name": "Wallet5285", + "ParticipationOnly": false + }, + { + "Name": "Wallet5286", + "ParticipationOnly": false + }, + { + "Name": "Wallet5287", + "ParticipationOnly": false + }, + { + "Name": "Wallet5288", + "ParticipationOnly": false + }, + { + "Name": "Wallet5289", + "ParticipationOnly": false + }, + { + "Name": "Wallet5290", + "ParticipationOnly": false + }, + { + "Name": "Wallet5291", + "ParticipationOnly": false + }, + { + "Name": "Wallet5292", + "ParticipationOnly": false + }, + { + "Name": "Wallet5293", + "ParticipationOnly": false + }, + { + "Name": "Wallet5294", + "ParticipationOnly": false + }, + { + "Name": "Wallet5295", + "ParticipationOnly": false + }, + { + "Name": "Wallet5296", + "ParticipationOnly": false + }, + { + "Name": "Wallet5297", + "ParticipationOnly": false + }, + { + "Name": "Wallet5298", + "ParticipationOnly": false + }, + { + "Name": "Wallet5299", + "ParticipationOnly": false + }, + { + "Name": "Wallet5300", + "ParticipationOnly": false + }, + { + "Name": "Wallet5301", + "ParticipationOnly": false + }, + { + "Name": "Wallet5302", + "ParticipationOnly": false + }, + { + "Name": "Wallet5303", + "ParticipationOnly": false + }, + { + "Name": "Wallet5304", + "ParticipationOnly": false + }, + { + "Name": "Wallet5305", + "ParticipationOnly": false + }, + { + "Name": "Wallet5306", + "ParticipationOnly": false + }, + { + "Name": "Wallet5307", + "ParticipationOnly": false + }, + { + "Name": "Wallet5308", + "ParticipationOnly": false + }, + { + "Name": "Wallet5309", + "ParticipationOnly": false + }, + { + "Name": "Wallet5310", + "ParticipationOnly": false + }, + { + "Name": "Wallet5311", + "ParticipationOnly": false + }, + { + "Name": "Wallet5312", + "ParticipationOnly": false + }, + { + "Name": "Wallet5313", + "ParticipationOnly": false + }, + { + "Name": "Wallet5314", + "ParticipationOnly": false + }, + { + "Name": "Wallet5315", + "ParticipationOnly": false + }, + { + "Name": "Wallet5316", + "ParticipationOnly": false + }, + { + "Name": "Wallet5317", + "ParticipationOnly": false + }, + { + "Name": "Wallet5318", + "ParticipationOnly": false + }, + { + "Name": "Wallet5319", + "ParticipationOnly": false + }, + { + "Name": "Wallet5320", + "ParticipationOnly": false + }, + { + "Name": "Wallet5321", + "ParticipationOnly": false + }, + { + "Name": "Wallet5322", + "ParticipationOnly": false + }, + { + "Name": "Wallet5323", + "ParticipationOnly": false + }, + { + "Name": "Wallet5324", + "ParticipationOnly": false + }, + { + "Name": "Wallet5325", + "ParticipationOnly": false + }, + { + "Name": "Wallet5326", + "ParticipationOnly": false + }, + { + "Name": "Wallet5327", + "ParticipationOnly": false + }, + { + "Name": "Wallet5328", + "ParticipationOnly": false + }, + { + "Name": "Wallet5329", + "ParticipationOnly": false + }, + { + "Name": "Wallet5330", + "ParticipationOnly": false + }, + { + "Name": "Wallet5331", + "ParticipationOnly": false + }, + { + "Name": "Wallet5332", + "ParticipationOnly": false + }, + { + "Name": "Wallet5333", + "ParticipationOnly": false + }, + { + "Name": "Wallet5334", + "ParticipationOnly": false + }, + { + "Name": "Wallet5335", + "ParticipationOnly": false + }, + { + "Name": "Wallet5336", + "ParticipationOnly": false + }, + { + "Name": "Wallet5337", + "ParticipationOnly": false + }, + { + "Name": "Wallet5338", + "ParticipationOnly": false + }, + { + "Name": "Wallet5339", + "ParticipationOnly": false + }, + { + "Name": "Wallet5340", + "ParticipationOnly": false + }, + { + "Name": "Wallet5341", + "ParticipationOnly": false + }, + { + "Name": "Wallet5342", + "ParticipationOnly": false + }, + { + "Name": "Wallet5343", + "ParticipationOnly": false + }, + { + "Name": "Wallet5344", + "ParticipationOnly": false + }, + { + "Name": "Wallet5345", + "ParticipationOnly": false + }, + { + "Name": "Wallet5346", + "ParticipationOnly": false + }, + { + "Name": "Wallet5347", + "ParticipationOnly": false + }, + { + "Name": "Wallet5348", + "ParticipationOnly": false + }, + { + "Name": "Wallet5349", + "ParticipationOnly": false + }, + { + "Name": "Wallet5350", + "ParticipationOnly": false + }, + { + "Name": "Wallet5351", + "ParticipationOnly": false + }, + { + "Name": "Wallet5352", + "ParticipationOnly": false + }, + { + "Name": "Wallet5353", + "ParticipationOnly": false + }, + { + "Name": "Wallet5354", + "ParticipationOnly": false + }, + { + "Name": "Wallet5355", + "ParticipationOnly": false + }, + { + "Name": "Wallet5356", + "ParticipationOnly": false + }, + { + "Name": "Wallet5357", + "ParticipationOnly": false + }, + { + "Name": "Wallet5358", + "ParticipationOnly": false + }, + { + "Name": "Wallet5359", + "ParticipationOnly": false + }, + { + "Name": "Wallet5360", + "ParticipationOnly": false + }, + { + "Name": "Wallet5361", + "ParticipationOnly": false + }, + { + "Name": "Wallet5362", + "ParticipationOnly": false + }, + { + "Name": "Wallet5363", + "ParticipationOnly": false + }, + { + "Name": "Wallet5364", + "ParticipationOnly": false + }, + { + "Name": "Wallet5365", + "ParticipationOnly": false + }, + { + "Name": "Wallet5366", + "ParticipationOnly": false + }, + { + "Name": "Wallet5367", + "ParticipationOnly": false + }, + { + "Name": "Wallet5368", + "ParticipationOnly": false + }, + { + "Name": "Wallet5369", + "ParticipationOnly": false + }, + { + "Name": "Wallet5370", + "ParticipationOnly": false + }, + { + "Name": "Wallet5371", + "ParticipationOnly": false + }, + { + "Name": "Wallet5372", + "ParticipationOnly": false + }, + { + "Name": "Wallet5373", + "ParticipationOnly": false + }, + { + "Name": "Wallet5374", + "ParticipationOnly": false + }, + { + "Name": "Wallet5375", + "ParticipationOnly": false + }, + { + "Name": "Wallet5376", + "ParticipationOnly": false + }, + { + "Name": "Wallet5377", + "ParticipationOnly": false + }, + { + "Name": "Wallet5378", + "ParticipationOnly": false + }, + { + "Name": "Wallet5379", + "ParticipationOnly": false + }, + { + "Name": "Wallet5380", + "ParticipationOnly": false + }, + { + "Name": "Wallet5381", + "ParticipationOnly": false + }, + { + "Name": "Wallet5382", + "ParticipationOnly": false + }, + { + "Name": "Wallet5383", + "ParticipationOnly": false + }, + { + "Name": "Wallet5384", + "ParticipationOnly": false + }, + { + "Name": "Wallet5385", + "ParticipationOnly": false + }, + { + "Name": "Wallet5386", + "ParticipationOnly": false + }, + { + "Name": "Wallet5387", + "ParticipationOnly": false + }, + { + "Name": "Wallet5388", + "ParticipationOnly": false + }, + { + "Name": "Wallet5389", + "ParticipationOnly": false + }, + { + "Name": "Wallet5390", + "ParticipationOnly": false + }, + { + "Name": "Wallet5391", + "ParticipationOnly": false + }, + { + "Name": "Wallet5392", + "ParticipationOnly": false + }, + { + "Name": "Wallet5393", + "ParticipationOnly": false + }, + { + "Name": "Wallet5394", + "ParticipationOnly": false + }, + { + "Name": "Wallet5395", + "ParticipationOnly": false + }, + { + "Name": "Wallet5396", + "ParticipationOnly": false + }, + { + "Name": "Wallet5397", + "ParticipationOnly": false + }, + { + "Name": "Wallet5398", + "ParticipationOnly": false + }, + { + "Name": "Wallet5399", + "ParticipationOnly": false + }, + { + "Name": "Wallet5400", + "ParticipationOnly": false + }, + { + "Name": "Wallet5401", + "ParticipationOnly": false + }, + { + "Name": "Wallet5402", + "ParticipationOnly": false + }, + { + "Name": "Wallet5403", + "ParticipationOnly": false + }, + { + "Name": "Wallet5404", + "ParticipationOnly": false + }, + { + "Name": "Wallet5405", + "ParticipationOnly": false + }, + { + "Name": "Wallet5406", + "ParticipationOnly": false + }, + { + "Name": "Wallet5407", + "ParticipationOnly": false + }, + { + "Name": "Wallet5408", + "ParticipationOnly": false + }, + { + "Name": "Wallet5409", + "ParticipationOnly": false + }, + { + "Name": "Wallet5410", + "ParticipationOnly": false + }, + { + "Name": "Wallet5411", + "ParticipationOnly": false + }, + { + "Name": "Wallet5412", + "ParticipationOnly": false + }, + { + "Name": "Wallet5413", + "ParticipationOnly": false + }, + { + "Name": "Wallet5414", + "ParticipationOnly": false + }, + { + "Name": "Wallet5415", + "ParticipationOnly": false + }, + { + "Name": "Wallet5416", + "ParticipationOnly": false + }, + { + "Name": "Wallet5417", + "ParticipationOnly": false + }, + { + "Name": "Wallet5418", + "ParticipationOnly": false + }, + { + "Name": "Wallet5419", + "ParticipationOnly": false + }, + { + "Name": "Wallet5420", + "ParticipationOnly": false + }, + { + "Name": "Wallet5421", + "ParticipationOnly": false + }, + { + "Name": "Wallet5422", + "ParticipationOnly": false + }, + { + "Name": "Wallet5423", + "ParticipationOnly": false + }, + { + "Name": "Wallet5424", + "ParticipationOnly": false + }, + { + "Name": "Wallet5425", + "ParticipationOnly": false + }, + { + "Name": "Wallet5426", + "ParticipationOnly": false + }, + { + "Name": "Wallet5427", + "ParticipationOnly": false + }, + { + "Name": "Wallet5428", + "ParticipationOnly": false + }, + { + "Name": "Wallet5429", + "ParticipationOnly": false + }, + { + "Name": "Wallet5430", + "ParticipationOnly": false + }, + { + "Name": "Wallet5431", + "ParticipationOnly": false + }, + { + "Name": "Wallet5432", + "ParticipationOnly": false + }, + { + "Name": "Wallet5433", + "ParticipationOnly": false + }, + { + "Name": "Wallet5434", + "ParticipationOnly": false + }, + { + "Name": "Wallet5435", + "ParticipationOnly": false + }, + { + "Name": "Wallet5436", + "ParticipationOnly": false + }, + { + "Name": "Wallet5437", + "ParticipationOnly": false + }, + { + "Name": "Wallet5438", + "ParticipationOnly": false + }, + { + "Name": "Wallet5439", + "ParticipationOnly": false + }, + { + "Name": "Wallet5440", + "ParticipationOnly": false + }, + { + "Name": "Wallet5441", + "ParticipationOnly": false + }, + { + "Name": "Wallet5442", + "ParticipationOnly": false + }, + { + "Name": "Wallet5443", + "ParticipationOnly": false + }, + { + "Name": "Wallet5444", + "ParticipationOnly": false + }, + { + "Name": "Wallet5445", + "ParticipationOnly": false + }, + { + "Name": "Wallet5446", + "ParticipationOnly": false + }, + { + "Name": "Wallet5447", + "ParticipationOnly": false + }, + { + "Name": "Wallet5448", + "ParticipationOnly": false + }, + { + "Name": "Wallet5449", + "ParticipationOnly": false + }, + { + "Name": "Wallet5450", + "ParticipationOnly": false + }, + { + "Name": "Wallet5451", + "ParticipationOnly": false + }, + { + "Name": "Wallet5452", + "ParticipationOnly": false + }, + { + "Name": "Wallet5453", + "ParticipationOnly": false + }, + { + "Name": "Wallet5454", + "ParticipationOnly": false + }, + { + "Name": "Wallet5455", + "ParticipationOnly": false + }, + { + "Name": "Wallet5456", + "ParticipationOnly": false + }, + { + "Name": "Wallet5457", + "ParticipationOnly": false + }, + { + "Name": "Wallet5458", + "ParticipationOnly": false + }, + { + "Name": "Wallet5459", + "ParticipationOnly": false + }, + { + "Name": "Wallet5460", + "ParticipationOnly": false + }, + { + "Name": "Wallet5461", + "ParticipationOnly": false + }, + { + "Name": "Wallet5462", + "ParticipationOnly": false + }, + { + "Name": "Wallet5463", + "ParticipationOnly": false + }, + { + "Name": "Wallet5464", + "ParticipationOnly": false + }, + { + "Name": "Wallet5465", + "ParticipationOnly": false + }, + { + "Name": "Wallet5466", + "ParticipationOnly": false + }, + { + "Name": "Wallet5467", + "ParticipationOnly": false + }, + { + "Name": "Wallet5468", + "ParticipationOnly": false + }, + { + "Name": "Wallet5469", + "ParticipationOnly": false + }, + { + "Name": "Wallet5470", + "ParticipationOnly": false + }, + { + "Name": "Wallet5471", + "ParticipationOnly": false + }, + { + "Name": "Wallet5472", + "ParticipationOnly": false + }, + { + "Name": "Wallet5473", + "ParticipationOnly": false + }, + { + "Name": "Wallet5474", + "ParticipationOnly": false + }, + { + "Name": "Wallet5475", + "ParticipationOnly": false + }, + { + "Name": "Wallet5476", + "ParticipationOnly": false + }, + { + "Name": "Wallet5477", + "ParticipationOnly": false + }, + { + "Name": "Wallet5478", + "ParticipationOnly": false + }, + { + "Name": "Wallet5479", + "ParticipationOnly": false + }, + { + "Name": "Wallet5480", + "ParticipationOnly": false + }, + { + "Name": "Wallet5481", + "ParticipationOnly": false + }, + { + "Name": "Wallet5482", + "ParticipationOnly": false + }, + { + "Name": "Wallet5483", + "ParticipationOnly": false + }, + { + "Name": "Wallet5484", + "ParticipationOnly": false + }, + { + "Name": "Wallet5485", + "ParticipationOnly": false + }, + { + "Name": "Wallet5486", + "ParticipationOnly": false + }, + { + "Name": "Wallet5487", + "ParticipationOnly": false + }, + { + "Name": "Wallet5488", + "ParticipationOnly": false + }, + { + "Name": "Wallet5489", + "ParticipationOnly": false + }, + { + "Name": "Wallet5490", + "ParticipationOnly": false + }, + { + "Name": "Wallet5491", + "ParticipationOnly": false + }, + { + "Name": "Wallet5492", + "ParticipationOnly": false + }, + { + "Name": "Wallet5493", + "ParticipationOnly": false + }, + { + "Name": "Wallet5494", + "ParticipationOnly": false + }, + { + "Name": "Wallet5495", + "ParticipationOnly": false + }, + { + "Name": "Wallet5496", + "ParticipationOnly": false + }, + { + "Name": "Wallet5497", + "ParticipationOnly": false + }, + { + "Name": "Wallet5498", + "ParticipationOnly": false + }, + { + "Name": "Wallet5499", + "ParticipationOnly": false + }, + { + "Name": "Wallet5500", + "ParticipationOnly": false + }, + { + "Name": "Wallet5501", + "ParticipationOnly": false + }, + { + "Name": "Wallet5502", + "ParticipationOnly": false + }, + { + "Name": "Wallet5503", + "ParticipationOnly": false + }, + { + "Name": "Wallet5504", + "ParticipationOnly": false + }, + { + "Name": "Wallet5505", + "ParticipationOnly": false + }, + { + "Name": "Wallet5506", + "ParticipationOnly": false + }, + { + "Name": "Wallet5507", + "ParticipationOnly": false + }, + { + "Name": "Wallet5508", + "ParticipationOnly": false + }, + { + "Name": "Wallet5509", + "ParticipationOnly": false + }, + { + "Name": "Wallet5510", + "ParticipationOnly": false + }, + { + "Name": "Wallet5511", + "ParticipationOnly": false + }, + { + "Name": "Wallet5512", + "ParticipationOnly": false + }, + { + "Name": "Wallet5513", + "ParticipationOnly": false + }, + { + "Name": "Wallet5514", + "ParticipationOnly": false + }, + { + "Name": "Wallet5515", + "ParticipationOnly": false + }, + { + "Name": "Wallet5516", + "ParticipationOnly": false + }, + { + "Name": "Wallet5517", + "ParticipationOnly": false + }, + { + "Name": "Wallet5518", + "ParticipationOnly": false + }, + { + "Name": "Wallet5519", + "ParticipationOnly": false + }, + { + "Name": "Wallet5520", + "ParticipationOnly": false + }, + { + "Name": "Wallet5521", + "ParticipationOnly": false + }, + { + "Name": "Wallet5522", + "ParticipationOnly": false + }, + { + "Name": "Wallet5523", + "ParticipationOnly": false + }, + { + "Name": "Wallet5524", + "ParticipationOnly": false + }, + { + "Name": "Wallet5525", + "ParticipationOnly": false + }, + { + "Name": "Wallet5526", + "ParticipationOnly": false + }, + { + "Name": "Wallet5527", + "ParticipationOnly": false + }, + { + "Name": "Wallet5528", + "ParticipationOnly": false + }, + { + "Name": "Wallet5529", + "ParticipationOnly": false + }, + { + "Name": "Wallet5530", + "ParticipationOnly": false + }, + { + "Name": "Wallet5531", + "ParticipationOnly": false + }, + { + "Name": "Wallet5532", + "ParticipationOnly": false + }, + { + "Name": "Wallet5533", + "ParticipationOnly": false + }, + { + "Name": "Wallet5534", + "ParticipationOnly": false + }, + { + "Name": "Wallet5535", + "ParticipationOnly": false + }, + { + "Name": "Wallet5536", + "ParticipationOnly": false + }, + { + "Name": "Wallet5537", + "ParticipationOnly": false + }, + { + "Name": "Wallet5538", + "ParticipationOnly": false + }, + { + "Name": "Wallet5539", + "ParticipationOnly": false + }, + { + "Name": "Wallet5540", + "ParticipationOnly": false + }, + { + "Name": "Wallet5541", + "ParticipationOnly": false + }, + { + "Name": "Wallet5542", + "ParticipationOnly": false + }, + { + "Name": "Wallet5543", + "ParticipationOnly": false + }, + { + "Name": "Wallet5544", + "ParticipationOnly": false + }, + { + "Name": "Wallet5545", + "ParticipationOnly": false + }, + { + "Name": "Wallet5546", + "ParticipationOnly": false + }, + { + "Name": "Wallet5547", + "ParticipationOnly": false + }, + { + "Name": "Wallet5548", + "ParticipationOnly": false + }, + { + "Name": "Wallet5549", + "ParticipationOnly": false + }, + { + "Name": "Wallet5550", + "ParticipationOnly": false + }, + { + "Name": "Wallet5551", + "ParticipationOnly": false + }, + { + "Name": "Wallet5552", + "ParticipationOnly": false + }, + { + "Name": "Wallet5553", + "ParticipationOnly": false + }, + { + "Name": "Wallet5554", + "ParticipationOnly": false + }, + { + "Name": "Wallet5555", + "ParticipationOnly": false + }, + { + "Name": "Wallet5556", + "ParticipationOnly": false + }, + { + "Name": "Wallet5557", + "ParticipationOnly": false + }, + { + "Name": "Wallet5558", + "ParticipationOnly": false + }, + { + "Name": "Wallet5559", + "ParticipationOnly": false + }, + { + "Name": "Wallet5560", + "ParticipationOnly": false + }, + { + "Name": "Wallet5561", + "ParticipationOnly": false + }, + { + "Name": "Wallet5562", + "ParticipationOnly": false + }, + { + "Name": "Wallet5563", + "ParticipationOnly": false + }, + { + "Name": "Wallet5564", + "ParticipationOnly": false + }, + { + "Name": "Wallet5565", + "ParticipationOnly": false + }, + { + "Name": "Wallet5566", + "ParticipationOnly": false + }, + { + "Name": "Wallet5567", + "ParticipationOnly": false + }, + { + "Name": "Wallet5568", + "ParticipationOnly": false + }, + { + "Name": "Wallet5569", + "ParticipationOnly": false + }, + { + "Name": "Wallet5570", + "ParticipationOnly": false + }, + { + "Name": "Wallet5571", + "ParticipationOnly": false + }, + { + "Name": "Wallet5572", + "ParticipationOnly": false + }, + { + "Name": "Wallet5573", + "ParticipationOnly": false + }, + { + "Name": "Wallet5574", + "ParticipationOnly": false + }, + { + "Name": "Wallet5575", + "ParticipationOnly": false + }, + { + "Name": "Wallet5576", + "ParticipationOnly": false + }, + { + "Name": "Wallet5577", + "ParticipationOnly": false + }, + { + "Name": "Wallet5578", + "ParticipationOnly": false + }, + { + "Name": "Wallet5579", + "ParticipationOnly": false + }, + { + "Name": "Wallet5580", + "ParticipationOnly": false + }, + { + "Name": "Wallet5581", + "ParticipationOnly": false + }, + { + "Name": "Wallet5582", + "ParticipationOnly": false + }, + { + "Name": "Wallet5583", + "ParticipationOnly": false + }, + { + "Name": "Wallet5584", + "ParticipationOnly": false + }, + { + "Name": "Wallet5585", + "ParticipationOnly": false + }, + { + "Name": "Wallet5586", + "ParticipationOnly": false + }, + { + "Name": "Wallet5587", + "ParticipationOnly": false + }, + { + "Name": "Wallet5588", + "ParticipationOnly": false + }, + { + "Name": "Wallet5589", + "ParticipationOnly": false + }, + { + "Name": "Wallet5590", + "ParticipationOnly": false + }, + { + "Name": "Wallet5591", + "ParticipationOnly": false + }, + { + "Name": "Wallet5592", + "ParticipationOnly": false + }, + { + "Name": "Wallet5593", + "ParticipationOnly": false + }, + { + "Name": "Wallet5594", + "ParticipationOnly": false + }, + { + "Name": "Wallet5595", + "ParticipationOnly": false + }, + { + "Name": "Wallet5596", + "ParticipationOnly": false + }, + { + "Name": "Wallet5597", + "ParticipationOnly": false + }, + { + "Name": "Wallet5598", + "ParticipationOnly": false + }, + { + "Name": "Wallet5599", + "ParticipationOnly": false + }, + { + "Name": "Wallet5600", + "ParticipationOnly": false + }, + { + "Name": "Wallet5601", + "ParticipationOnly": false + }, + { + "Name": "Wallet5602", + "ParticipationOnly": false + }, + { + "Name": "Wallet5603", + "ParticipationOnly": false + }, + { + "Name": "Wallet5604", + "ParticipationOnly": false + }, + { + "Name": "Wallet5605", + "ParticipationOnly": false + }, + { + "Name": "Wallet5606", + "ParticipationOnly": false + }, + { + "Name": "Wallet5607", + "ParticipationOnly": false + }, + { + "Name": "Wallet5608", + "ParticipationOnly": false + }, + { + "Name": "Wallet5609", + "ParticipationOnly": false + }, + { + "Name": "Wallet5610", + "ParticipationOnly": false + }, + { + "Name": "Wallet5611", + "ParticipationOnly": false + }, + { + "Name": "Wallet5612", + "ParticipationOnly": false + }, + { + "Name": "Wallet5613", + "ParticipationOnly": false + }, + { + "Name": "Wallet5614", + "ParticipationOnly": false + }, + { + "Name": "Wallet5615", + "ParticipationOnly": false + }, + { + "Name": "Wallet5616", + "ParticipationOnly": false + }, + { + "Name": "Wallet5617", + "ParticipationOnly": false + }, + { + "Name": "Wallet5618", + "ParticipationOnly": false + }, + { + "Name": "Wallet5619", + "ParticipationOnly": false + }, + { + "Name": "Wallet5620", + "ParticipationOnly": false + }, + { + "Name": "Wallet5621", + "ParticipationOnly": false + }, + { + "Name": "Wallet5622", + "ParticipationOnly": false + }, + { + "Name": "Wallet5623", + "ParticipationOnly": false + }, + { + "Name": "Wallet5624", + "ParticipationOnly": false + }, + { + "Name": "Wallet5625", + "ParticipationOnly": false + }, + { + "Name": "Wallet5626", + "ParticipationOnly": false + }, + { + "Name": "Wallet5627", + "ParticipationOnly": false + }, + { + "Name": "Wallet5628", + "ParticipationOnly": false + }, + { + "Name": "Wallet5629", + "ParticipationOnly": false + }, + { + "Name": "Wallet5630", + "ParticipationOnly": false + }, + { + "Name": "Wallet5631", + "ParticipationOnly": false + }, + { + "Name": "Wallet5632", + "ParticipationOnly": false + }, + { + "Name": "Wallet5633", + "ParticipationOnly": false + }, + { + "Name": "Wallet5634", + "ParticipationOnly": false + }, + { + "Name": "Wallet5635", + "ParticipationOnly": false + }, + { + "Name": "Wallet5636", + "ParticipationOnly": false + }, + { + "Name": "Wallet5637", + "ParticipationOnly": false + }, + { + "Name": "Wallet5638", + "ParticipationOnly": false + }, + { + "Name": "Wallet5639", + "ParticipationOnly": false + }, + { + "Name": "Wallet5640", + "ParticipationOnly": false + }, + { + "Name": "Wallet5641", + "ParticipationOnly": false + }, + { + "Name": "Wallet5642", + "ParticipationOnly": false + }, + { + "Name": "Wallet5643", + "ParticipationOnly": false + }, + { + "Name": "Wallet5644", + "ParticipationOnly": false + }, + { + "Name": "Wallet5645", + "ParticipationOnly": false + }, + { + "Name": "Wallet5646", + "ParticipationOnly": false + }, + { + "Name": "Wallet5647", + "ParticipationOnly": false + }, + { + "Name": "Wallet5648", + "ParticipationOnly": false + }, + { + "Name": "Wallet5649", + "ParticipationOnly": false + }, + { + "Name": "Wallet5650", + "ParticipationOnly": false + }, + { + "Name": "Wallet5651", + "ParticipationOnly": false + }, + { + "Name": "Wallet5652", + "ParticipationOnly": false + }, + { + "Name": "Wallet5653", + "ParticipationOnly": false + }, + { + "Name": "Wallet5654", + "ParticipationOnly": false + }, + { + "Name": "Wallet5655", + "ParticipationOnly": false + }, + { + "Name": "Wallet5656", + "ParticipationOnly": false + }, + { + "Name": "Wallet5657", + "ParticipationOnly": false + }, + { + "Name": "Wallet5658", + "ParticipationOnly": false + }, + { + "Name": "Wallet5659", + "ParticipationOnly": false + }, + { + "Name": "Wallet5660", + "ParticipationOnly": false + }, + { + "Name": "Wallet5661", + "ParticipationOnly": false + }, + { + "Name": "Wallet5662", + "ParticipationOnly": false + }, + { + "Name": "Wallet5663", + "ParticipationOnly": false + }, + { + "Name": "Wallet5664", + "ParticipationOnly": false + }, + { + "Name": "Wallet5665", + "ParticipationOnly": false + }, + { + "Name": "Wallet5666", + "ParticipationOnly": false + }, + { + "Name": "Wallet5667", + "ParticipationOnly": false + }, + { + "Name": "Wallet5668", + "ParticipationOnly": false + }, + { + "Name": "Wallet5669", + "ParticipationOnly": false + }, + { + "Name": "Wallet5670", + "ParticipationOnly": false + }, + { + "Name": "Wallet5671", + "ParticipationOnly": false + }, + { + "Name": "Wallet5672", + "ParticipationOnly": false + }, + { + "Name": "Wallet5673", + "ParticipationOnly": false + }, + { + "Name": "Wallet5674", + "ParticipationOnly": false + }, + { + "Name": "Wallet5675", + "ParticipationOnly": false + }, + { + "Name": "Wallet5676", + "ParticipationOnly": false + }, + { + "Name": "Wallet5677", + "ParticipationOnly": false + }, + { + "Name": "Wallet5678", + "ParticipationOnly": false + }, + { + "Name": "Wallet5679", + "ParticipationOnly": false + }, + { + "Name": "Wallet5680", + "ParticipationOnly": false + }, + { + "Name": "Wallet5681", + "ParticipationOnly": false + }, + { + "Name": "Wallet5682", + "ParticipationOnly": false + }, + { + "Name": "Wallet5683", + "ParticipationOnly": false + }, + { + "Name": "Wallet5684", + "ParticipationOnly": false + }, + { + "Name": "Wallet5685", + "ParticipationOnly": false + }, + { + "Name": "Wallet5686", + "ParticipationOnly": false + }, + { + "Name": "Wallet5687", + "ParticipationOnly": false + }, + { + "Name": "Wallet5688", + "ParticipationOnly": false + }, + { + "Name": "Wallet5689", + "ParticipationOnly": false + }, + { + "Name": "Wallet5690", + "ParticipationOnly": false + }, + { + "Name": "Wallet5691", + "ParticipationOnly": false + }, + { + "Name": "Wallet5692", + "ParticipationOnly": false + }, + { + "Name": "Wallet5693", + "ParticipationOnly": false + }, + { + "Name": "Wallet5694", + "ParticipationOnly": false + }, + { + "Name": "Wallet5695", + "ParticipationOnly": false + }, + { + "Name": "Wallet5696", + "ParticipationOnly": false + }, + { + "Name": "Wallet5697", + "ParticipationOnly": false + }, + { + "Name": "Wallet5698", + "ParticipationOnly": false + }, + { + "Name": "Wallet5699", + "ParticipationOnly": false + }, + { + "Name": "Wallet5700", + "ParticipationOnly": false + }, + { + "Name": "Wallet5701", + "ParticipationOnly": false + }, + { + "Name": "Wallet5702", + "ParticipationOnly": false + }, + { + "Name": "Wallet5703", + "ParticipationOnly": false + }, + { + "Name": "Wallet5704", + "ParticipationOnly": false + }, + { + "Name": "Wallet5705", + "ParticipationOnly": false + }, + { + "Name": "Wallet5706", + "ParticipationOnly": false + }, + { + "Name": "Wallet5707", + "ParticipationOnly": false + }, + { + "Name": "Wallet5708", + "ParticipationOnly": false + }, + { + "Name": "Wallet5709", + "ParticipationOnly": false + }, + { + "Name": "Wallet5710", + "ParticipationOnly": false + }, + { + "Name": "Wallet5711", + "ParticipationOnly": false + }, + { + "Name": "Wallet5712", + "ParticipationOnly": false + }, + { + "Name": "Wallet5713", + "ParticipationOnly": false + }, + { + "Name": "Wallet5714", + "ParticipationOnly": false + }, + { + "Name": "Wallet5715", + "ParticipationOnly": false + }, + { + "Name": "Wallet5716", + "ParticipationOnly": false + }, + { + "Name": "Wallet5717", + "ParticipationOnly": false + }, + { + "Name": "Wallet5718", + "ParticipationOnly": false + }, + { + "Name": "Wallet5719", + "ParticipationOnly": false + }, + { + "Name": "Wallet5720", + "ParticipationOnly": false + }, + { + "Name": "Wallet5721", + "ParticipationOnly": false + }, + { + "Name": "Wallet5722", + "ParticipationOnly": false + }, + { + "Name": "Wallet5723", + "ParticipationOnly": false + }, + { + "Name": "Wallet5724", + "ParticipationOnly": false + }, + { + "Name": "Wallet5725", + "ParticipationOnly": false + }, + { + "Name": "Wallet5726", + "ParticipationOnly": false + }, + { + "Name": "Wallet5727", + "ParticipationOnly": false + }, + { + "Name": "Wallet5728", + "ParticipationOnly": false + }, + { + "Name": "Wallet5729", + "ParticipationOnly": false + }, + { + "Name": "Wallet5730", + "ParticipationOnly": false + }, + { + "Name": "Wallet5731", + "ParticipationOnly": false + }, + { + "Name": "Wallet5732", + "ParticipationOnly": false + }, + { + "Name": "Wallet5733", + "ParticipationOnly": false + }, + { + "Name": "Wallet5734", + "ParticipationOnly": false + }, + { + "Name": "Wallet5735", + "ParticipationOnly": false + }, + { + "Name": "Wallet5736", + "ParticipationOnly": false + }, + { + "Name": "Wallet5737", + "ParticipationOnly": false + }, + { + "Name": "Wallet5738", + "ParticipationOnly": false + }, + { + "Name": "Wallet5739", + "ParticipationOnly": false + }, + { + "Name": "Wallet5740", + "ParticipationOnly": false + }, + { + "Name": "Wallet5741", + "ParticipationOnly": false + }, + { + "Name": "Wallet5742", + "ParticipationOnly": false + }, + { + "Name": "Wallet5743", + "ParticipationOnly": false + }, + { + "Name": "Wallet5744", + "ParticipationOnly": false + }, + { + "Name": "Wallet5745", + "ParticipationOnly": false + }, + { + "Name": "Wallet5746", + "ParticipationOnly": false + }, + { + "Name": "Wallet5747", + "ParticipationOnly": false + }, + { + "Name": "Wallet5748", + "ParticipationOnly": false + }, + { + "Name": "Wallet5749", + "ParticipationOnly": false + }, + { + "Name": "Wallet5750", + "ParticipationOnly": false + }, + { + "Name": "Wallet5751", + "ParticipationOnly": false + }, + { + "Name": "Wallet5752", + "ParticipationOnly": false + }, + { + "Name": "Wallet5753", + "ParticipationOnly": false + }, + { + "Name": "Wallet5754", + "ParticipationOnly": false + }, + { + "Name": "Wallet5755", + "ParticipationOnly": false + }, + { + "Name": "Wallet5756", + "ParticipationOnly": false + }, + { + "Name": "Wallet5757", + "ParticipationOnly": false + }, + { + "Name": "Wallet5758", + "ParticipationOnly": false + }, + { + "Name": "Wallet5759", + "ParticipationOnly": false + }, + { + "Name": "Wallet5760", + "ParticipationOnly": false + }, + { + "Name": "Wallet5761", + "ParticipationOnly": false + }, + { + "Name": "Wallet5762", + "ParticipationOnly": false + }, + { + "Name": "Wallet5763", + "ParticipationOnly": false + }, + { + "Name": "Wallet5764", + "ParticipationOnly": false + }, + { + "Name": "Wallet5765", + "ParticipationOnly": false + }, + { + "Name": "Wallet5766", + "ParticipationOnly": false + }, + { + "Name": "Wallet5767", + "ParticipationOnly": false + }, + { + "Name": "Wallet5768", + "ParticipationOnly": false + }, + { + "Name": "Wallet5769", + "ParticipationOnly": false + }, + { + "Name": "Wallet5770", + "ParticipationOnly": false + }, + { + "Name": "Wallet5771", + "ParticipationOnly": false + }, + { + "Name": "Wallet5772", + "ParticipationOnly": false + }, + { + "Name": "Wallet5773", + "ParticipationOnly": false + }, + { + "Name": "Wallet5774", + "ParticipationOnly": false + }, + { + "Name": "Wallet5775", + "ParticipationOnly": false + }, + { + "Name": "Wallet5776", + "ParticipationOnly": false + }, + { + "Name": "Wallet5777", + "ParticipationOnly": false + }, + { + "Name": "Wallet5778", + "ParticipationOnly": false + }, + { + "Name": "Wallet5779", + "ParticipationOnly": false + }, + { + "Name": "Wallet5780", + "ParticipationOnly": false + }, + { + "Name": "Wallet5781", + "ParticipationOnly": false + }, + { + "Name": "Wallet5782", + "ParticipationOnly": false + }, + { + "Name": "Wallet5783", + "ParticipationOnly": false + }, + { + "Name": "Wallet5784", + "ParticipationOnly": false + }, + { + "Name": "Wallet5785", + "ParticipationOnly": false + }, + { + "Name": "Wallet5786", + "ParticipationOnly": false + }, + { + "Name": "Wallet5787", + "ParticipationOnly": false + }, + { + "Name": "Wallet5788", + "ParticipationOnly": false + }, + { + "Name": "Wallet5789", + "ParticipationOnly": false + }, + { + "Name": "Wallet5790", + "ParticipationOnly": false + }, + { + "Name": "Wallet5791", + "ParticipationOnly": false + }, + { + "Name": "Wallet5792", + "ParticipationOnly": false + }, + { + "Name": "Wallet5793", + "ParticipationOnly": false + }, + { + "Name": "Wallet5794", + "ParticipationOnly": false + }, + { + "Name": "Wallet5795", + "ParticipationOnly": false + }, + { + "Name": "Wallet5796", + "ParticipationOnly": false + }, + { + "Name": "Wallet5797", + "ParticipationOnly": false + }, + { + "Name": "Wallet5798", + "ParticipationOnly": false + }, + { + "Name": "Wallet5799", + "ParticipationOnly": false + }, + { + "Name": "Wallet5800", + "ParticipationOnly": false + }, + { + "Name": "Wallet5801", + "ParticipationOnly": false + }, + { + "Name": "Wallet5802", + "ParticipationOnly": false + }, + { + "Name": "Wallet5803", + "ParticipationOnly": false + }, + { + "Name": "Wallet5804", + "ParticipationOnly": false + }, + { + "Name": "Wallet5805", + "ParticipationOnly": false + }, + { + "Name": "Wallet5806", + "ParticipationOnly": false + }, + { + "Name": "Wallet5807", + "ParticipationOnly": false + }, + { + "Name": "Wallet5808", + "ParticipationOnly": false + }, + { + "Name": "Wallet5809", + "ParticipationOnly": false + }, + { + "Name": "Wallet5810", + "ParticipationOnly": false + }, + { + "Name": "Wallet5811", + "ParticipationOnly": false + }, + { + "Name": "Wallet5812", + "ParticipationOnly": false + }, + { + "Name": "Wallet5813", + "ParticipationOnly": false + }, + { + "Name": "Wallet5814", + "ParticipationOnly": false + }, + { + "Name": "Wallet5815", + "ParticipationOnly": false + }, + { + "Name": "Wallet5816", + "ParticipationOnly": false + }, + { + "Name": "Wallet5817", + "ParticipationOnly": false + }, + { + "Name": "Wallet5818", + "ParticipationOnly": false + }, + { + "Name": "Wallet5819", + "ParticipationOnly": false + }, + { + "Name": "Wallet5820", + "ParticipationOnly": false + }, + { + "Name": "Wallet5821", + "ParticipationOnly": false + }, + { + "Name": "Wallet5822", + "ParticipationOnly": false + }, + { + "Name": "Wallet5823", + "ParticipationOnly": false + }, + { + "Name": "Wallet5824", + "ParticipationOnly": false + }, + { + "Name": "Wallet5825", + "ParticipationOnly": false + }, + { + "Name": "Wallet5826", + "ParticipationOnly": false + }, + { + "Name": "Wallet5827", + "ParticipationOnly": false + }, + { + "Name": "Wallet5828", + "ParticipationOnly": false + }, + { + "Name": "Wallet5829", + "ParticipationOnly": false + }, + { + "Name": "Wallet5830", + "ParticipationOnly": false + }, + { + "Name": "Wallet5831", + "ParticipationOnly": false + }, + { + "Name": "Wallet5832", + "ParticipationOnly": false + }, + { + "Name": "Wallet5833", + "ParticipationOnly": false + }, + { + "Name": "Wallet5834", + "ParticipationOnly": false + }, + { + "Name": "Wallet5835", + "ParticipationOnly": false + }, + { + "Name": "Wallet5836", + "ParticipationOnly": false + }, + { + "Name": "Wallet5837", + "ParticipationOnly": false + }, + { + "Name": "Wallet5838", + "ParticipationOnly": false + }, + { + "Name": "Wallet5839", + "ParticipationOnly": false + }, + { + "Name": "Wallet5840", + "ParticipationOnly": false + }, + { + "Name": "Wallet5841", + "ParticipationOnly": false + }, + { + "Name": "Wallet5842", + "ParticipationOnly": false + }, + { + "Name": "Wallet5843", + "ParticipationOnly": false + }, + { + "Name": "Wallet5844", + "ParticipationOnly": false + }, + { + "Name": "Wallet5845", + "ParticipationOnly": false + }, + { + "Name": "Wallet5846", + "ParticipationOnly": false + }, + { + "Name": "Wallet5847", + "ParticipationOnly": false + }, + { + "Name": "Wallet5848", + "ParticipationOnly": false + }, + { + "Name": "Wallet5849", + "ParticipationOnly": false + }, + { + "Name": "Wallet5850", + "ParticipationOnly": false + }, + { + "Name": "Wallet5851", + "ParticipationOnly": false + }, + { + "Name": "Wallet5852", + "ParticipationOnly": false + }, + { + "Name": "Wallet5853", + "ParticipationOnly": false + }, + { + "Name": "Wallet5854", + "ParticipationOnly": false + }, + { + "Name": "Wallet5855", + "ParticipationOnly": false + }, + { + "Name": "Wallet5856", + "ParticipationOnly": false + }, + { + "Name": "Wallet5857", + "ParticipationOnly": false + }, + { + "Name": "Wallet5858", + "ParticipationOnly": false + }, + { + "Name": "Wallet5859", + "ParticipationOnly": false + }, + { + "Name": "Wallet5860", + "ParticipationOnly": false + }, + { + "Name": "Wallet5861", + "ParticipationOnly": false + }, + { + "Name": "Wallet5862", + "ParticipationOnly": false + }, + { + "Name": "Wallet5863", + "ParticipationOnly": false + }, + { + "Name": "Wallet5864", + "ParticipationOnly": false + }, + { + "Name": "Wallet5865", + "ParticipationOnly": false + }, + { + "Name": "Wallet5866", + "ParticipationOnly": false + }, + { + "Name": "Wallet5867", + "ParticipationOnly": false + }, + { + "Name": "Wallet5868", + "ParticipationOnly": false + }, + { + "Name": "Wallet5869", + "ParticipationOnly": false + }, + { + "Name": "Wallet5870", + "ParticipationOnly": false + }, + { + "Name": "Wallet5871", + "ParticipationOnly": false + }, + { + "Name": "Wallet5872", + "ParticipationOnly": false + }, + { + "Name": "Wallet5873", + "ParticipationOnly": false + }, + { + "Name": "Wallet5874", + "ParticipationOnly": false + }, + { + "Name": "Wallet5875", + "ParticipationOnly": false + }, + { + "Name": "Wallet5876", + "ParticipationOnly": false + }, + { + "Name": "Wallet5877", + "ParticipationOnly": false + }, + { + "Name": "Wallet5878", + "ParticipationOnly": false + }, + { + "Name": "Wallet5879", + "ParticipationOnly": false + }, + { + "Name": "Wallet5880", + "ParticipationOnly": false + }, + { + "Name": "Wallet5881", + "ParticipationOnly": false + }, + { + "Name": "Wallet5882", + "ParticipationOnly": false + }, + { + "Name": "Wallet5883", + "ParticipationOnly": false + }, + { + "Name": "Wallet5884", + "ParticipationOnly": false + }, + { + "Name": "Wallet5885", + "ParticipationOnly": false + }, + { + "Name": "Wallet5886", + "ParticipationOnly": false + }, + { + "Name": "Wallet5887", + "ParticipationOnly": false + }, + { + "Name": "Wallet5888", + "ParticipationOnly": false + }, + { + "Name": "Wallet5889", + "ParticipationOnly": false + }, + { + "Name": "Wallet5890", + "ParticipationOnly": false + }, + { + "Name": "Wallet5891", + "ParticipationOnly": false + }, + { + "Name": "Wallet5892", + "ParticipationOnly": false + }, + { + "Name": "Wallet5893", + "ParticipationOnly": false + }, + { + "Name": "Wallet5894", + "ParticipationOnly": false + }, + { + "Name": "Wallet5895", + "ParticipationOnly": false + }, + { + "Name": "Wallet5896", + "ParticipationOnly": false + }, + { + "Name": "Wallet5897", + "ParticipationOnly": false + }, + { + "Name": "Wallet5898", + "ParticipationOnly": false + }, + { + "Name": "Wallet5899", + "ParticipationOnly": false + }, + { + "Name": "Wallet5900", + "ParticipationOnly": false + }, + { + "Name": "Wallet5901", + "ParticipationOnly": false + }, + { + "Name": "Wallet5902", + "ParticipationOnly": false + }, + { + "Name": "Wallet5903", + "ParticipationOnly": false + }, + { + "Name": "Wallet5904", + "ParticipationOnly": false + }, + { + "Name": "Wallet5905", + "ParticipationOnly": false + }, + { + "Name": "Wallet5906", + "ParticipationOnly": false + }, + { + "Name": "Wallet5907", + "ParticipationOnly": false + }, + { + "Name": "Wallet5908", + "ParticipationOnly": false + }, + { + "Name": "Wallet5909", + "ParticipationOnly": false + }, + { + "Name": "Wallet5910", + "ParticipationOnly": false + }, + { + "Name": "Wallet5911", + "ParticipationOnly": false + }, + { + "Name": "Wallet5912", + "ParticipationOnly": false + }, + { + "Name": "Wallet5913", + "ParticipationOnly": false + }, + { + "Name": "Wallet5914", + "ParticipationOnly": false + }, + { + "Name": "Wallet5915", + "ParticipationOnly": false + }, + { + "Name": "Wallet5916", + "ParticipationOnly": false + }, + { + "Name": "Wallet5917", + "ParticipationOnly": false + }, + { + "Name": "Wallet5918", + "ParticipationOnly": false + }, + { + "Name": "Wallet5919", + "ParticipationOnly": false + }, + { + "Name": "Wallet5920", + "ParticipationOnly": false + }, + { + "Name": "Wallet5921", + "ParticipationOnly": false + }, + { + "Name": "Wallet5922", + "ParticipationOnly": false + }, + { + "Name": "Wallet5923", + "ParticipationOnly": false + }, + { + "Name": "Wallet5924", + "ParticipationOnly": false + }, + { + "Name": "Wallet5925", + "ParticipationOnly": false + }, + { + "Name": "Wallet5926", + "ParticipationOnly": false + }, + { + "Name": "Wallet5927", + "ParticipationOnly": false + }, + { + "Name": "Wallet5928", + "ParticipationOnly": false + }, + { + "Name": "Wallet5929", + "ParticipationOnly": false + }, + { + "Name": "Wallet5930", + "ParticipationOnly": false + }, + { + "Name": "Wallet5931", + "ParticipationOnly": false + }, + { + "Name": "Wallet5932", + "ParticipationOnly": false + }, + { + "Name": "Wallet5933", + "ParticipationOnly": false + }, + { + "Name": "Wallet5934", + "ParticipationOnly": false + }, + { + "Name": "Wallet5935", + "ParticipationOnly": false + }, + { + "Name": "Wallet5936", + "ParticipationOnly": false + }, + { + "Name": "Wallet5937", + "ParticipationOnly": false + }, + { + "Name": "Wallet5938", + "ParticipationOnly": false + }, + { + "Name": "Wallet5939", + "ParticipationOnly": false + }, + { + "Name": "Wallet5940", + "ParticipationOnly": false + }, + { + "Name": "Wallet5941", + "ParticipationOnly": false + }, + { + "Name": "Wallet5942", + "ParticipationOnly": false + }, + { + "Name": "Wallet5943", + "ParticipationOnly": false + }, + { + "Name": "Wallet5944", + "ParticipationOnly": false + }, + { + "Name": "Wallet5945", + "ParticipationOnly": false + }, + { + "Name": "Wallet5946", + "ParticipationOnly": false + }, + { + "Name": "Wallet5947", + "ParticipationOnly": false + }, + { + "Name": "Wallet5948", + "ParticipationOnly": false + }, + { + "Name": "Wallet5949", + "ParticipationOnly": false + }, + { + "Name": "Wallet5950", + "ParticipationOnly": false + }, + { + "Name": "Wallet5951", + "ParticipationOnly": false + }, + { + "Name": "Wallet5952", + "ParticipationOnly": false + }, + { + "Name": "Wallet5953", + "ParticipationOnly": false + }, + { + "Name": "Wallet5954", + "ParticipationOnly": false + }, + { + "Name": "Wallet5955", + "ParticipationOnly": false + }, + { + "Name": "Wallet5956", + "ParticipationOnly": false + }, + { + "Name": "Wallet5957", + "ParticipationOnly": false + }, + { + "Name": "Wallet5958", + "ParticipationOnly": false + }, + { + "Name": "Wallet5959", + "ParticipationOnly": false + }, + { + "Name": "Wallet5960", + "ParticipationOnly": false + }, + { + "Name": "Wallet5961", + "ParticipationOnly": false + }, + { + "Name": "Wallet5962", + "ParticipationOnly": false + }, + { + "Name": "Wallet5963", + "ParticipationOnly": false + }, + { + "Name": "Wallet5964", + "ParticipationOnly": false + }, + { + "Name": "Wallet5965", + "ParticipationOnly": false + }, + { + "Name": "Wallet5966", + "ParticipationOnly": false + }, + { + "Name": "Wallet5967", + "ParticipationOnly": false + }, + { + "Name": "Wallet5968", + "ParticipationOnly": false + }, + { + "Name": "Wallet5969", + "ParticipationOnly": false + }, + { + "Name": "Wallet5970", + "ParticipationOnly": false + }, + { + "Name": "Wallet5971", + "ParticipationOnly": false + }, + { + "Name": "Wallet5972", + "ParticipationOnly": false + }, + { + "Name": "Wallet5973", + "ParticipationOnly": false + }, + { + "Name": "Wallet5974", + "ParticipationOnly": false + }, + { + "Name": "Wallet5975", + "ParticipationOnly": false + }, + { + "Name": "Wallet5976", + "ParticipationOnly": false + }, + { + "Name": "Wallet5977", + "ParticipationOnly": false + }, + { + "Name": "Wallet5978", + "ParticipationOnly": false + }, + { + "Name": "Wallet5979", + "ParticipationOnly": false + }, + { + "Name": "Wallet5980", + "ParticipationOnly": false + }, + { + "Name": "Wallet5981", + "ParticipationOnly": false + }, + { + "Name": "Wallet5982", + "ParticipationOnly": false + }, + { + "Name": "Wallet5983", + "ParticipationOnly": false + }, + { + "Name": "Wallet5984", + "ParticipationOnly": false + }, + { + "Name": "Wallet5985", + "ParticipationOnly": false + }, + { + "Name": "Wallet5986", + "ParticipationOnly": false + }, + { + "Name": "Wallet5987", + "ParticipationOnly": false + }, + { + "Name": "Wallet5988", + "ParticipationOnly": false + }, + { + "Name": "Wallet5989", + "ParticipationOnly": false + }, + { + "Name": "Wallet5990", + "ParticipationOnly": false + }, + { + "Name": "Wallet5991", + "ParticipationOnly": false + }, + { + "Name": "Wallet5992", + "ParticipationOnly": false + }, + { + "Name": "Wallet5993", + "ParticipationOnly": false + }, + { + "Name": "Wallet5994", + "ParticipationOnly": false + }, + { + "Name": "Wallet5995", + "ParticipationOnly": false + }, + { + "Name": "Wallet5996", + "ParticipationOnly": false + }, + { + "Name": "Wallet5997", + "ParticipationOnly": false + }, + { + "Name": "Wallet5998", + "ParticipationOnly": false + }, + { + "Name": "Wallet5999", + "ParticipationOnly": false + }, + { + "Name": "Wallet6000", + "ParticipationOnly": false + }, + { + "Name": "Wallet6001", + "ParticipationOnly": false + }, + { + "Name": "Wallet6002", + "ParticipationOnly": false + }, + { + "Name": "Wallet6003", + "ParticipationOnly": false + }, + { + "Name": "Wallet6004", + "ParticipationOnly": false + }, + { + "Name": "Wallet6005", + "ParticipationOnly": false + }, + { + "Name": "Wallet6006", + "ParticipationOnly": false + }, + { + "Name": "Wallet6007", + "ParticipationOnly": false + }, + { + "Name": "Wallet6008", + "ParticipationOnly": false + }, + { + "Name": "Wallet6009", + "ParticipationOnly": false + }, + { + "Name": "Wallet6010", + "ParticipationOnly": false + }, + { + "Name": "Wallet6011", + "ParticipationOnly": false + }, + { + "Name": "Wallet6012", + "ParticipationOnly": false + }, + { + "Name": "Wallet6013", + "ParticipationOnly": false + }, + { + "Name": "Wallet6014", + "ParticipationOnly": false + }, + { + "Name": "Wallet6015", + "ParticipationOnly": false + }, + { + "Name": "Wallet6016", + "ParticipationOnly": false + }, + { + "Name": "Wallet6017", + "ParticipationOnly": false + }, + { + "Name": "Wallet6018", + "ParticipationOnly": false + }, + { + "Name": "Wallet6019", + "ParticipationOnly": false + }, + { + "Name": "Wallet6020", + "ParticipationOnly": false + }, + { + "Name": "Wallet6021", + "ParticipationOnly": false + }, + { + "Name": "Wallet6022", + "ParticipationOnly": false + }, + { + "Name": "Wallet6023", + "ParticipationOnly": false + }, + { + "Name": "Wallet6024", + "ParticipationOnly": false + }, + { + "Name": "Wallet6025", + "ParticipationOnly": false + }, + { + "Name": "Wallet6026", + "ParticipationOnly": false + }, + { + "Name": "Wallet6027", + "ParticipationOnly": false + }, + { + "Name": "Wallet6028", + "ParticipationOnly": false + }, + { + "Name": "Wallet6029", + "ParticipationOnly": false + }, + { + "Name": "Wallet6030", + "ParticipationOnly": false + }, + { + "Name": "Wallet6031", + "ParticipationOnly": false + }, + { + "Name": "Wallet6032", + "ParticipationOnly": false + }, + { + "Name": "Wallet6033", + "ParticipationOnly": false + }, + { + "Name": "Wallet6034", + "ParticipationOnly": false + }, + { + "Name": "Wallet6035", + "ParticipationOnly": false + }, + { + "Name": "Wallet6036", + "ParticipationOnly": false + }, + { + "Name": "Wallet6037", + "ParticipationOnly": false + }, + { + "Name": "Wallet6038", + "ParticipationOnly": false + }, + { + "Name": "Wallet6039", + "ParticipationOnly": false + }, + { + "Name": "Wallet6040", + "ParticipationOnly": false + }, + { + "Name": "Wallet6041", + "ParticipationOnly": false + }, + { + "Name": "Wallet6042", + "ParticipationOnly": false + }, + { + "Name": "Wallet6043", + "ParticipationOnly": false + }, + { + "Name": "Wallet6044", + "ParticipationOnly": false + }, + { + "Name": "Wallet6045", + "ParticipationOnly": false + }, + { + "Name": "Wallet6046", + "ParticipationOnly": false + }, + { + "Name": "Wallet6047", + "ParticipationOnly": false + }, + { + "Name": "Wallet6048", + "ParticipationOnly": false + }, + { + "Name": "Wallet6049", + "ParticipationOnly": false + }, + { + "Name": "Wallet6050", + "ParticipationOnly": false + }, + { + "Name": "Wallet6051", + "ParticipationOnly": false + }, + { + "Name": "Wallet6052", + "ParticipationOnly": false + }, + { + "Name": "Wallet6053", + "ParticipationOnly": false + }, + { + "Name": "Wallet6054", + "ParticipationOnly": false + }, + { + "Name": "Wallet6055", + "ParticipationOnly": false + }, + { + "Name": "Wallet6056", + "ParticipationOnly": false + }, + { + "Name": "Wallet6057", + "ParticipationOnly": false + }, + { + "Name": "Wallet6058", + "ParticipationOnly": false + }, + { + "Name": "Wallet6059", + "ParticipationOnly": false + }, + { + "Name": "Wallet6060", + "ParticipationOnly": false + }, + { + "Name": "Wallet6061", + "ParticipationOnly": false + }, + { + "Name": "Wallet6062", + "ParticipationOnly": false + }, + { + "Name": "Wallet6063", + "ParticipationOnly": false + }, + { + "Name": "Wallet6064", + "ParticipationOnly": false + }, + { + "Name": "Wallet6065", + "ParticipationOnly": false + }, + { + "Name": "Wallet6066", + "ParticipationOnly": false + }, + { + "Name": "Wallet6067", + "ParticipationOnly": false + }, + { + "Name": "Wallet6068", + "ParticipationOnly": false + }, + { + "Name": "Wallet6069", + "ParticipationOnly": false + }, + { + "Name": "Wallet6070", + "ParticipationOnly": false + }, + { + "Name": "Wallet6071", + "ParticipationOnly": false + }, + { + "Name": "Wallet6072", + "ParticipationOnly": false + }, + { + "Name": "Wallet6073", + "ParticipationOnly": false + }, + { + "Name": "Wallet6074", + "ParticipationOnly": false + }, + { + "Name": "Wallet6075", + "ParticipationOnly": false + }, + { + "Name": "Wallet6076", + "ParticipationOnly": false + }, + { + "Name": "Wallet6077", + "ParticipationOnly": false + }, + { + "Name": "Wallet6078", + "ParticipationOnly": false + }, + { + "Name": "Wallet6079", + "ParticipationOnly": false + }, + { + "Name": "Wallet6080", + "ParticipationOnly": false + }, + { + "Name": "Wallet6081", + "ParticipationOnly": false + }, + { + "Name": "Wallet6082", + "ParticipationOnly": false + }, + { + "Name": "Wallet6083", + "ParticipationOnly": false + }, + { + "Name": "Wallet6084", + "ParticipationOnly": false + }, + { + "Name": "Wallet6085", + "ParticipationOnly": false + }, + { + "Name": "Wallet6086", + "ParticipationOnly": false + }, + { + "Name": "Wallet6087", + "ParticipationOnly": false + }, + { + "Name": "Wallet6088", + "ParticipationOnly": false + }, + { + "Name": "Wallet6089", + "ParticipationOnly": false + }, + { + "Name": "Wallet6090", + "ParticipationOnly": false + }, + { + "Name": "Wallet6091", + "ParticipationOnly": false + }, + { + "Name": "Wallet6092", + "ParticipationOnly": false + }, + { + "Name": "Wallet6093", + "ParticipationOnly": false + }, + { + "Name": "Wallet6094", + "ParticipationOnly": false + }, + { + "Name": "Wallet6095", + "ParticipationOnly": false + }, + { + "Name": "Wallet6096", + "ParticipationOnly": false + }, + { + "Name": "Wallet6097", + "ParticipationOnly": false + }, + { + "Name": "Wallet6098", + "ParticipationOnly": false + }, + { + "Name": "Wallet6099", + "ParticipationOnly": false + }, + { + "Name": "Wallet6100", + "ParticipationOnly": false + }, + { + "Name": "Wallet6101", + "ParticipationOnly": false + }, + { + "Name": "Wallet6102", + "ParticipationOnly": false + }, + { + "Name": "Wallet6103", + "ParticipationOnly": false + }, + { + "Name": "Wallet6104", + "ParticipationOnly": false + }, + { + "Name": "Wallet6105", + "ParticipationOnly": false + }, + { + "Name": "Wallet6106", + "ParticipationOnly": false + }, + { + "Name": "Wallet6107", + "ParticipationOnly": false + }, + { + "Name": "Wallet6108", + "ParticipationOnly": false + }, + { + "Name": "Wallet6109", + "ParticipationOnly": false + }, + { + "Name": "Wallet6110", + "ParticipationOnly": false + }, + { + "Name": "Wallet6111", + "ParticipationOnly": false + }, + { + "Name": "Wallet6112", + "ParticipationOnly": false + }, + { + "Name": "Wallet6113", + "ParticipationOnly": false + }, + { + "Name": "Wallet6114", + "ParticipationOnly": false + }, + { + "Name": "Wallet6115", + "ParticipationOnly": false + }, + { + "Name": "Wallet6116", + "ParticipationOnly": false + }, + { + "Name": "Wallet6117", + "ParticipationOnly": false + }, + { + "Name": "Wallet6118", + "ParticipationOnly": false + }, + { + "Name": "Wallet6119", + "ParticipationOnly": false + }, + { + "Name": "Wallet6120", + "ParticipationOnly": false + }, + { + "Name": "Wallet6121", + "ParticipationOnly": false + }, + { + "Name": "Wallet6122", + "ParticipationOnly": false + }, + { + "Name": "Wallet6123", + "ParticipationOnly": false + }, + { + "Name": "Wallet6124", + "ParticipationOnly": false + }, + { + "Name": "Wallet6125", + "ParticipationOnly": false + }, + { + "Name": "Wallet6126", + "ParticipationOnly": false + }, + { + "Name": "Wallet6127", + "ParticipationOnly": false + }, + { + "Name": "Wallet6128", + "ParticipationOnly": false + }, + { + "Name": "Wallet6129", + "ParticipationOnly": false + }, + { + "Name": "Wallet6130", + "ParticipationOnly": false + }, + { + "Name": "Wallet6131", + "ParticipationOnly": false + }, + { + "Name": "Wallet6132", + "ParticipationOnly": false + }, + { + "Name": "Wallet6133", + "ParticipationOnly": false + }, + { + "Name": "Wallet6134", + "ParticipationOnly": false + }, + { + "Name": "Wallet6135", + "ParticipationOnly": false + }, + { + "Name": "Wallet6136", + "ParticipationOnly": false + }, + { + "Name": "Wallet6137", + "ParticipationOnly": false + }, + { + "Name": "Wallet6138", + "ParticipationOnly": false + }, + { + "Name": "Wallet6139", + "ParticipationOnly": false + }, + { + "Name": "Wallet6140", + "ParticipationOnly": false + }, + { + "Name": "Wallet6141", + "ParticipationOnly": false + }, + { + "Name": "Wallet6142", + "ParticipationOnly": false + }, + { + "Name": "Wallet6143", + "ParticipationOnly": false + }, + { + "Name": "Wallet6144", + "ParticipationOnly": false + }, + { + "Name": "Wallet6145", + "ParticipationOnly": false + }, + { + "Name": "Wallet6146", + "ParticipationOnly": false + }, + { + "Name": "Wallet6147", + "ParticipationOnly": false + }, + { + "Name": "Wallet6148", + "ParticipationOnly": false + }, + { + "Name": "Wallet6149", + "ParticipationOnly": false + }, + { + "Name": "Wallet6150", + "ParticipationOnly": false + }, + { + "Name": "Wallet6151", + "ParticipationOnly": false + }, + { + "Name": "Wallet6152", + "ParticipationOnly": false + }, + { + "Name": "Wallet6153", + "ParticipationOnly": false + }, + { + "Name": "Wallet6154", + "ParticipationOnly": false + }, + { + "Name": "Wallet6155", + "ParticipationOnly": false + }, + { + "Name": "Wallet6156", + "ParticipationOnly": false + }, + { + "Name": "Wallet6157", + "ParticipationOnly": false + }, + { + "Name": "Wallet6158", + "ParticipationOnly": false + }, + { + "Name": "Wallet6159", + "ParticipationOnly": false + }, + { + "Name": "Wallet6160", + "ParticipationOnly": false + }, + { + "Name": "Wallet6161", + "ParticipationOnly": false + }, + { + "Name": "Wallet6162", + "ParticipationOnly": false + }, + { + "Name": "Wallet6163", + "ParticipationOnly": false + }, + { + "Name": "Wallet6164", + "ParticipationOnly": false + }, + { + "Name": "Wallet6165", + "ParticipationOnly": false + }, + { + "Name": "Wallet6166", + "ParticipationOnly": false + }, + { + "Name": "Wallet6167", + "ParticipationOnly": false + }, + { + "Name": "Wallet6168", + "ParticipationOnly": false + }, + { + "Name": "Wallet6169", + "ParticipationOnly": false + }, + { + "Name": "Wallet6170", + "ParticipationOnly": false + }, + { + "Name": "Wallet6171", + "ParticipationOnly": false + }, + { + "Name": "Wallet6172", + "ParticipationOnly": false + }, + { + "Name": "Wallet6173", + "ParticipationOnly": false + }, + { + "Name": "Wallet6174", + "ParticipationOnly": false + }, + { + "Name": "Wallet6175", + "ParticipationOnly": false + }, + { + "Name": "Wallet6176", + "ParticipationOnly": false + }, + { + "Name": "Wallet6177", + "ParticipationOnly": false + }, + { + "Name": "Wallet6178", + "ParticipationOnly": false + }, + { + "Name": "Wallet6179", + "ParticipationOnly": false + }, + { + "Name": "Wallet6180", + "ParticipationOnly": false + }, + { + "Name": "Wallet6181", + "ParticipationOnly": false + }, + { + "Name": "Wallet6182", + "ParticipationOnly": false + }, + { + "Name": "Wallet6183", + "ParticipationOnly": false + }, + { + "Name": "Wallet6184", + "ParticipationOnly": false + }, + { + "Name": "Wallet6185", + "ParticipationOnly": false + }, + { + "Name": "Wallet6186", + "ParticipationOnly": false + }, + { + "Name": "Wallet6187", + "ParticipationOnly": false + }, + { + "Name": "Wallet6188", + "ParticipationOnly": false + }, + { + "Name": "Wallet6189", + "ParticipationOnly": false + }, + { + "Name": "Wallet6190", + "ParticipationOnly": false + }, + { + "Name": "Wallet6191", + "ParticipationOnly": false + }, + { + "Name": "Wallet6192", + "ParticipationOnly": false + }, + { + "Name": "Wallet6193", + "ParticipationOnly": false + }, + { + "Name": "Wallet6194", + "ParticipationOnly": false + }, + { + "Name": "Wallet6195", + "ParticipationOnly": false + }, + { + "Name": "Wallet6196", + "ParticipationOnly": false + }, + { + "Name": "Wallet6197", + "ParticipationOnly": false + }, + { + "Name": "Wallet6198", + "ParticipationOnly": false + }, + { + "Name": "Wallet6199", + "ParticipationOnly": false + }, + { + "Name": "Wallet6200", + "ParticipationOnly": false + }, + { + "Name": "Wallet6201", + "ParticipationOnly": false + }, + { + "Name": "Wallet6202", + "ParticipationOnly": false + }, + { + "Name": "Wallet6203", + "ParticipationOnly": false + }, + { + "Name": "Wallet6204", + "ParticipationOnly": false + }, + { + "Name": "Wallet6205", + "ParticipationOnly": false + }, + { + "Name": "Wallet6206", + "ParticipationOnly": false + }, + { + "Name": "Wallet6207", + "ParticipationOnly": false + }, + { + "Name": "Wallet6208", + "ParticipationOnly": false + }, + { + "Name": "Wallet6209", + "ParticipationOnly": false + }, + { + "Name": "Wallet6210", + "ParticipationOnly": false + }, + { + "Name": "Wallet6211", + "ParticipationOnly": false + }, + { + "Name": "Wallet6212", + "ParticipationOnly": false + }, + { + "Name": "Wallet6213", + "ParticipationOnly": false + }, + { + "Name": "Wallet6214", + "ParticipationOnly": false + }, + { + "Name": "Wallet6215", + "ParticipationOnly": false + }, + { + "Name": "Wallet6216", + "ParticipationOnly": false + }, + { + "Name": "Wallet6217", + "ParticipationOnly": false + }, + { + "Name": "Wallet6218", + "ParticipationOnly": false + }, + { + "Name": "Wallet6219", + "ParticipationOnly": false + }, + { + "Name": "Wallet6220", + "ParticipationOnly": false + }, + { + "Name": "Wallet6221", + "ParticipationOnly": false + }, + { + "Name": "Wallet6222", + "ParticipationOnly": false + }, + { + "Name": "Wallet6223", + "ParticipationOnly": false + }, + { + "Name": "Wallet6224", + "ParticipationOnly": false + }, + { + "Name": "Wallet6225", + "ParticipationOnly": false + }, + { + "Name": "Wallet6226", + "ParticipationOnly": false + }, + { + "Name": "Wallet6227", + "ParticipationOnly": false + }, + { + "Name": "Wallet6228", + "ParticipationOnly": false + }, + { + "Name": "Wallet6229", + "ParticipationOnly": false + }, + { + "Name": "Wallet6230", + "ParticipationOnly": false + }, + { + "Name": "Wallet6231", + "ParticipationOnly": false + }, + { + "Name": "Wallet6232", + "ParticipationOnly": false + }, + { + "Name": "Wallet6233", + "ParticipationOnly": false + }, + { + "Name": "Wallet6234", + "ParticipationOnly": false + }, + { + "Name": "Wallet6235", + "ParticipationOnly": false + }, + { + "Name": "Wallet6236", + "ParticipationOnly": false + }, + { + "Name": "Wallet6237", + "ParticipationOnly": false + }, + { + "Name": "Wallet6238", + "ParticipationOnly": false + }, + { + "Name": "Wallet6239", + "ParticipationOnly": false + }, + { + "Name": "Wallet6240", + "ParticipationOnly": false + }, + { + "Name": "Wallet6241", + "ParticipationOnly": false + }, + { + "Name": "Wallet6242", + "ParticipationOnly": false + }, + { + "Name": "Wallet6243", + "ParticipationOnly": false + }, + { + "Name": "Wallet6244", + "ParticipationOnly": false + }, + { + "Name": "Wallet6245", + "ParticipationOnly": false + }, + { + "Name": "Wallet6246", + "ParticipationOnly": false + }, + { + "Name": "Wallet6247", + "ParticipationOnly": false + }, + { + "Name": "Wallet6248", + "ParticipationOnly": false + }, + { + "Name": "Wallet6249", + "ParticipationOnly": false + }, + { + "Name": "Wallet6250", + "ParticipationOnly": false + }, + { + "Name": "Wallet6251", + "ParticipationOnly": false + }, + { + "Name": "Wallet6252", + "ParticipationOnly": false + }, + { + "Name": "Wallet6253", + "ParticipationOnly": false + }, + { + "Name": "Wallet6254", + "ParticipationOnly": false + }, + { + "Name": "Wallet6255", + "ParticipationOnly": false + }, + { + "Name": "Wallet6256", + "ParticipationOnly": false + }, + { + "Name": "Wallet6257", + "ParticipationOnly": false + }, + { + "Name": "Wallet6258", + "ParticipationOnly": false + }, + { + "Name": "Wallet6259", + "ParticipationOnly": false + }, + { + "Name": "Wallet6260", + "ParticipationOnly": false + }, + { + "Name": "Wallet6261", + "ParticipationOnly": false + }, + { + "Name": "Wallet6262", + "ParticipationOnly": false + }, + { + "Name": "Wallet6263", + "ParticipationOnly": false + }, + { + "Name": "Wallet6264", + "ParticipationOnly": false + }, + { + "Name": "Wallet6265", + "ParticipationOnly": false + }, + { + "Name": "Wallet6266", + "ParticipationOnly": false + }, + { + "Name": "Wallet6267", + "ParticipationOnly": false + }, + { + "Name": "Wallet6268", + "ParticipationOnly": false + }, + { + "Name": "Wallet6269", + "ParticipationOnly": false + }, + { + "Name": "Wallet6270", + "ParticipationOnly": false + }, + { + "Name": "Wallet6271", + "ParticipationOnly": false + }, + { + "Name": "Wallet6272", + "ParticipationOnly": false + }, + { + "Name": "Wallet6273", + "ParticipationOnly": false + }, + { + "Name": "Wallet6274", + "ParticipationOnly": false + }, + { + "Name": "Wallet6275", + "ParticipationOnly": false + }, + { + "Name": "Wallet6276", + "ParticipationOnly": false + }, + { + "Name": "Wallet6277", + "ParticipationOnly": false + }, + { + "Name": "Wallet6278", + "ParticipationOnly": false + }, + { + "Name": "Wallet6279", + "ParticipationOnly": false + }, + { + "Name": "Wallet6280", + "ParticipationOnly": false + }, + { + "Name": "Wallet6281", + "ParticipationOnly": false + }, + { + "Name": "Wallet6282", + "ParticipationOnly": false + }, + { + "Name": "Wallet6283", + "ParticipationOnly": false + }, + { + "Name": "Wallet6284", + "ParticipationOnly": false + }, + { + "Name": "Wallet6285", + "ParticipationOnly": false + }, + { + "Name": "Wallet6286", + "ParticipationOnly": false + }, + { + "Name": "Wallet6287", + "ParticipationOnly": false + }, + { + "Name": "Wallet6288", + "ParticipationOnly": false + }, + { + "Name": "Wallet6289", + "ParticipationOnly": false + }, + { + "Name": "Wallet6290", + "ParticipationOnly": false + }, + { + "Name": "Wallet6291", + "ParticipationOnly": false + }, + { + "Name": "Wallet6292", + "ParticipationOnly": false + }, + { + "Name": "Wallet6293", + "ParticipationOnly": false + }, + { + "Name": "Wallet6294", + "ParticipationOnly": false + }, + { + "Name": "Wallet6295", + "ParticipationOnly": false + }, + { + "Name": "Wallet6296", + "ParticipationOnly": false + }, + { + "Name": "Wallet6297", + "ParticipationOnly": false + }, + { + "Name": "Wallet6298", + "ParticipationOnly": false + }, + { + "Name": "Wallet6299", + "ParticipationOnly": false + }, + { + "Name": "Wallet6300", + "ParticipationOnly": false + }, + { + "Name": "Wallet6301", + "ParticipationOnly": false + }, + { + "Name": "Wallet6302", + "ParticipationOnly": false + }, + { + "Name": "Wallet6303", + "ParticipationOnly": false + }, + { + "Name": "Wallet6304", + "ParticipationOnly": false + }, + { + "Name": "Wallet6305", + "ParticipationOnly": false + }, + { + "Name": "Wallet6306", + "ParticipationOnly": false + }, + { + "Name": "Wallet6307", + "ParticipationOnly": false + }, + { + "Name": "Wallet6308", + "ParticipationOnly": false + }, + { + "Name": "Wallet6309", + "ParticipationOnly": false + }, + { + "Name": "Wallet6310", + "ParticipationOnly": false + }, + { + "Name": "Wallet6311", + "ParticipationOnly": false + }, + { + "Name": "Wallet6312", + "ParticipationOnly": false + }, + { + "Name": "Wallet6313", + "ParticipationOnly": false + }, + { + "Name": "Wallet6314", + "ParticipationOnly": false + }, + { + "Name": "Wallet6315", + "ParticipationOnly": false + }, + { + "Name": "Wallet6316", + "ParticipationOnly": false + }, + { + "Name": "Wallet6317", + "ParticipationOnly": false + }, + { + "Name": "Wallet6318", + "ParticipationOnly": false + }, + { + "Name": "Wallet6319", + "ParticipationOnly": false + }, + { + "Name": "Wallet6320", + "ParticipationOnly": false + }, + { + "Name": "Wallet6321", + "ParticipationOnly": false + }, + { + "Name": "Wallet6322", + "ParticipationOnly": false + }, + { + "Name": "Wallet6323", + "ParticipationOnly": false + }, + { + "Name": "Wallet6324", + "ParticipationOnly": false + }, + { + "Name": "Wallet6325", + "ParticipationOnly": false + }, + { + "Name": "Wallet6326", + "ParticipationOnly": false + }, + { + "Name": "Wallet6327", + "ParticipationOnly": false + }, + { + "Name": "Wallet6328", + "ParticipationOnly": false + }, + { + "Name": "Wallet6329", + "ParticipationOnly": false + }, + { + "Name": "Wallet6330", + "ParticipationOnly": false + }, + { + "Name": "Wallet6331", + "ParticipationOnly": false + }, + { + "Name": "Wallet6332", + "ParticipationOnly": false + }, + { + "Name": "Wallet6333", + "ParticipationOnly": false + }, + { + "Name": "Wallet6334", + "ParticipationOnly": false + }, + { + "Name": "Wallet6335", + "ParticipationOnly": false + }, + { + "Name": "Wallet6336", + "ParticipationOnly": false + }, + { + "Name": "Wallet6337", + "ParticipationOnly": false + }, + { + "Name": "Wallet6338", + "ParticipationOnly": false + }, + { + "Name": "Wallet6339", + "ParticipationOnly": false + }, + { + "Name": "Wallet6340", + "ParticipationOnly": false + }, + { + "Name": "Wallet6341", + "ParticipationOnly": false + }, + { + "Name": "Wallet6342", + "ParticipationOnly": false + }, + { + "Name": "Wallet6343", + "ParticipationOnly": false + }, + { + "Name": "Wallet6344", + "ParticipationOnly": false + }, + { + "Name": "Wallet6345", + "ParticipationOnly": false + }, + { + "Name": "Wallet6346", + "ParticipationOnly": false + }, + { + "Name": "Wallet6347", + "ParticipationOnly": false + }, + { + "Name": "Wallet6348", + "ParticipationOnly": false + }, + { + "Name": "Wallet6349", + "ParticipationOnly": false + }, + { + "Name": "Wallet6350", + "ParticipationOnly": false + }, + { + "Name": "Wallet6351", + "ParticipationOnly": false + }, + { + "Name": "Wallet6352", + "ParticipationOnly": false + }, + { + "Name": "Wallet6353", + "ParticipationOnly": false + }, + { + "Name": "Wallet6354", + "ParticipationOnly": false + }, + { + "Name": "Wallet6355", + "ParticipationOnly": false + }, + { + "Name": "Wallet6356", + "ParticipationOnly": false + }, + { + "Name": "Wallet6357", + "ParticipationOnly": false + }, + { + "Name": "Wallet6358", + "ParticipationOnly": false + }, + { + "Name": "Wallet6359", + "ParticipationOnly": false + }, + { + "Name": "Wallet6360", + "ParticipationOnly": false + }, + { + "Name": "Wallet6361", + "ParticipationOnly": false + }, + { + "Name": "Wallet6362", + "ParticipationOnly": false + }, + { + "Name": "Wallet6363", + "ParticipationOnly": false + }, + { + "Name": "Wallet6364", + "ParticipationOnly": false + }, + { + "Name": "Wallet6365", + "ParticipationOnly": false + }, + { + "Name": "Wallet6366", + "ParticipationOnly": false + }, + { + "Name": "Wallet6367", + "ParticipationOnly": false + }, + { + "Name": "Wallet6368", + "ParticipationOnly": false + }, + { + "Name": "Wallet6369", + "ParticipationOnly": false + }, + { + "Name": "Wallet6370", + "ParticipationOnly": false + }, + { + "Name": "Wallet6371", + "ParticipationOnly": false + }, + { + "Name": "Wallet6372", + "ParticipationOnly": false + }, + { + "Name": "Wallet6373", + "ParticipationOnly": false + }, + { + "Name": "Wallet6374", + "ParticipationOnly": false + }, + { + "Name": "Wallet6375", + "ParticipationOnly": false + }, + { + "Name": "Wallet6376", + "ParticipationOnly": false + }, + { + "Name": "Wallet6377", + "ParticipationOnly": false + }, + { + "Name": "Wallet6378", + "ParticipationOnly": false + }, + { + "Name": "Wallet6379", + "ParticipationOnly": false + }, + { + "Name": "Wallet6380", + "ParticipationOnly": false + }, + { + "Name": "Wallet6381", + "ParticipationOnly": false + }, + { + "Name": "Wallet6382", + "ParticipationOnly": false + }, + { + "Name": "Wallet6383", + "ParticipationOnly": false + }, + { + "Name": "Wallet6384", + "ParticipationOnly": false + }, + { + "Name": "Wallet6385", + "ParticipationOnly": false + }, + { + "Name": "Wallet6386", + "ParticipationOnly": false + }, + { + "Name": "Wallet6387", + "ParticipationOnly": false + }, + { + "Name": "Wallet6388", + "ParticipationOnly": false + }, + { + "Name": "Wallet6389", + "ParticipationOnly": false + }, + { + "Name": "Wallet6390", + "ParticipationOnly": false + }, + { + "Name": "Wallet6391", + "ParticipationOnly": false + }, + { + "Name": "Wallet6392", + "ParticipationOnly": false + }, + { + "Name": "Wallet6393", + "ParticipationOnly": false + }, + { + "Name": "Wallet6394", + "ParticipationOnly": false + }, + { + "Name": "Wallet6395", + "ParticipationOnly": false + }, + { + "Name": "Wallet6396", + "ParticipationOnly": false + }, + { + "Name": "Wallet6397", + "ParticipationOnly": false + }, + { + "Name": "Wallet6398", + "ParticipationOnly": false + }, + { + "Name": "Wallet6399", + "ParticipationOnly": false + }, + { + "Name": "Wallet6400", + "ParticipationOnly": false + }, + { + "Name": "Wallet6401", + "ParticipationOnly": false + }, + { + "Name": "Wallet6402", + "ParticipationOnly": false + }, + { + "Name": "Wallet6403", + "ParticipationOnly": false + }, + { + "Name": "Wallet6404", + "ParticipationOnly": false + }, + { + "Name": "Wallet6405", + "ParticipationOnly": false + }, + { + "Name": "Wallet6406", + "ParticipationOnly": false + }, + { + "Name": "Wallet6407", + "ParticipationOnly": false + }, + { + "Name": "Wallet6408", + "ParticipationOnly": false + }, + { + "Name": "Wallet6409", + "ParticipationOnly": false + }, + { + "Name": "Wallet6410", + "ParticipationOnly": false + }, + { + "Name": "Wallet6411", + "ParticipationOnly": false + }, + { + "Name": "Wallet6412", + "ParticipationOnly": false + }, + { + "Name": "Wallet6413", + "ParticipationOnly": false + }, + { + "Name": "Wallet6414", + "ParticipationOnly": false + }, + { + "Name": "Wallet6415", + "ParticipationOnly": false + }, + { + "Name": "Wallet6416", + "ParticipationOnly": false + }, + { + "Name": "Wallet6417", + "ParticipationOnly": false + }, + { + "Name": "Wallet6418", + "ParticipationOnly": false + }, + { + "Name": "Wallet6419", + "ParticipationOnly": false + }, + { + "Name": "Wallet6420", + "ParticipationOnly": false + }, + { + "Name": "Wallet6421", + "ParticipationOnly": false + }, + { + "Name": "Wallet6422", + "ParticipationOnly": false + }, + { + "Name": "Wallet6423", + "ParticipationOnly": false + }, + { + "Name": "Wallet6424", + "ParticipationOnly": false + }, + { + "Name": "Wallet6425", + "ParticipationOnly": false + }, + { + "Name": "Wallet6426", + "ParticipationOnly": false + }, + { + "Name": "Wallet6427", + "ParticipationOnly": false + }, + { + "Name": "Wallet6428", + "ParticipationOnly": false + }, + { + "Name": "Wallet6429", + "ParticipationOnly": false + }, + { + "Name": "Wallet6430", + "ParticipationOnly": false + }, + { + "Name": "Wallet6431", + "ParticipationOnly": false + }, + { + "Name": "Wallet6432", + "ParticipationOnly": false + }, + { + "Name": "Wallet6433", + "ParticipationOnly": false + }, + { + "Name": "Wallet6434", + "ParticipationOnly": false + }, + { + "Name": "Wallet6435", + "ParticipationOnly": false + }, + { + "Name": "Wallet6436", + "ParticipationOnly": false + }, + { + "Name": "Wallet6437", + "ParticipationOnly": false + }, + { + "Name": "Wallet6438", + "ParticipationOnly": false + }, + { + "Name": "Wallet6439", + "ParticipationOnly": false + }, + { + "Name": "Wallet6440", + "ParticipationOnly": false + }, + { + "Name": "Wallet6441", + "ParticipationOnly": false + }, + { + "Name": "Wallet6442", + "ParticipationOnly": false + }, + { + "Name": "Wallet6443", + "ParticipationOnly": false + }, + { + "Name": "Wallet6444", + "ParticipationOnly": false + }, + { + "Name": "Wallet6445", + "ParticipationOnly": false + }, + { + "Name": "Wallet6446", + "ParticipationOnly": false + }, + { + "Name": "Wallet6447", + "ParticipationOnly": false + }, + { + "Name": "Wallet6448", + "ParticipationOnly": false + }, + { + "Name": "Wallet6449", + "ParticipationOnly": false + }, + { + "Name": "Wallet6450", + "ParticipationOnly": false + }, + { + "Name": "Wallet6451", + "ParticipationOnly": false + }, + { + "Name": "Wallet6452", + "ParticipationOnly": false + }, + { + "Name": "Wallet6453", + "ParticipationOnly": false + }, + { + "Name": "Wallet6454", + "ParticipationOnly": false + }, + { + "Name": "Wallet6455", + "ParticipationOnly": false + }, + { + "Name": "Wallet6456", + "ParticipationOnly": false + }, + { + "Name": "Wallet6457", + "ParticipationOnly": false + }, + { + "Name": "Wallet6458", + "ParticipationOnly": false + }, + { + "Name": "Wallet6459", + "ParticipationOnly": false + }, + { + "Name": "Wallet6460", + "ParticipationOnly": false + }, + { + "Name": "Wallet6461", + "ParticipationOnly": false + }, + { + "Name": "Wallet6462", + "ParticipationOnly": false + }, + { + "Name": "Wallet6463", + "ParticipationOnly": false + }, + { + "Name": "Wallet6464", + "ParticipationOnly": false + }, + { + "Name": "Wallet6465", + "ParticipationOnly": false + }, + { + "Name": "Wallet6466", + "ParticipationOnly": false + }, + { + "Name": "Wallet6467", + "ParticipationOnly": false + }, + { + "Name": "Wallet6468", + "ParticipationOnly": false + }, + { + "Name": "Wallet6469", + "ParticipationOnly": false + }, + { + "Name": "Wallet6470", + "ParticipationOnly": false + }, + { + "Name": "Wallet6471", + "ParticipationOnly": false + }, + { + "Name": "Wallet6472", + "ParticipationOnly": false + }, + { + "Name": "Wallet6473", + "ParticipationOnly": false + }, + { + "Name": "Wallet6474", + "ParticipationOnly": false + }, + { + "Name": "Wallet6475", + "ParticipationOnly": false + }, + { + "Name": "Wallet6476", + "ParticipationOnly": false + }, + { + "Name": "Wallet6477", + "ParticipationOnly": false + }, + { + "Name": "Wallet6478", + "ParticipationOnly": false + }, + { + "Name": "Wallet6479", + "ParticipationOnly": false + }, + { + "Name": "Wallet6480", + "ParticipationOnly": false + }, + { + "Name": "Wallet6481", + "ParticipationOnly": false + }, + { + "Name": "Wallet6482", + "ParticipationOnly": false + }, + { + "Name": "Wallet6483", + "ParticipationOnly": false + }, + { + "Name": "Wallet6484", + "ParticipationOnly": false + }, + { + "Name": "Wallet6485", + "ParticipationOnly": false + }, + { + "Name": "Wallet6486", + "ParticipationOnly": false + }, + { + "Name": "Wallet6487", + "ParticipationOnly": false + }, + { + "Name": "Wallet6488", + "ParticipationOnly": false + }, + { + "Name": "Wallet6489", + "ParticipationOnly": false + }, + { + "Name": "Wallet6490", + "ParticipationOnly": false + }, + { + "Name": "Wallet6491", + "ParticipationOnly": false + }, + { + "Name": "Wallet6492", + "ParticipationOnly": false + }, + { + "Name": "Wallet6493", + "ParticipationOnly": false + }, + { + "Name": "Wallet6494", + "ParticipationOnly": false + }, + { + "Name": "Wallet6495", + "ParticipationOnly": false + }, + { + "Name": "Wallet6496", + "ParticipationOnly": false + }, + { + "Name": "Wallet6497", + "ParticipationOnly": false + }, + { + "Name": "Wallet6498", + "ParticipationOnly": false + }, + { + "Name": "Wallet6499", + "ParticipationOnly": false + }, + { + "Name": "Wallet6500", + "ParticipationOnly": false + }, + { + "Name": "Wallet6501", + "ParticipationOnly": false + }, + { + "Name": "Wallet6502", + "ParticipationOnly": false + }, + { + "Name": "Wallet6503", + "ParticipationOnly": false + }, + { + "Name": "Wallet6504", + "ParticipationOnly": false + }, + { + "Name": "Wallet6505", + "ParticipationOnly": false + }, + { + "Name": "Wallet6506", + "ParticipationOnly": false + }, + { + "Name": "Wallet6507", + "ParticipationOnly": false + }, + { + "Name": "Wallet6508", + "ParticipationOnly": false + }, + { + "Name": "Wallet6509", + "ParticipationOnly": false + }, + { + "Name": "Wallet6510", + "ParticipationOnly": false + }, + { + "Name": "Wallet6511", + "ParticipationOnly": false + }, + { + "Name": "Wallet6512", + "ParticipationOnly": false + }, + { + "Name": "Wallet6513", + "ParticipationOnly": false + }, + { + "Name": "Wallet6514", + "ParticipationOnly": false + }, + { + "Name": "Wallet6515", + "ParticipationOnly": false + }, + { + "Name": "Wallet6516", + "ParticipationOnly": false + }, + { + "Name": "Wallet6517", + "ParticipationOnly": false + }, + { + "Name": "Wallet6518", + "ParticipationOnly": false + }, + { + "Name": "Wallet6519", + "ParticipationOnly": false + }, + { + "Name": "Wallet6520", + "ParticipationOnly": false + }, + { + "Name": "Wallet6521", + "ParticipationOnly": false + }, + { + "Name": "Wallet6522", + "ParticipationOnly": false + }, + { + "Name": "Wallet6523", + "ParticipationOnly": false + }, + { + "Name": "Wallet6524", + "ParticipationOnly": false + }, + { + "Name": "Wallet6525", + "ParticipationOnly": false + }, + { + "Name": "Wallet6526", + "ParticipationOnly": false + }, + { + "Name": "Wallet6527", + "ParticipationOnly": false + }, + { + "Name": "Wallet6528", + "ParticipationOnly": false + }, + { + "Name": "Wallet6529", + "ParticipationOnly": false + }, + { + "Name": "Wallet6530", + "ParticipationOnly": false + }, + { + "Name": "Wallet6531", + "ParticipationOnly": false + }, + { + "Name": "Wallet6532", + "ParticipationOnly": false + }, + { + "Name": "Wallet6533", + "ParticipationOnly": false + }, + { + "Name": "Wallet6534", + "ParticipationOnly": false + }, + { + "Name": "Wallet6535", + "ParticipationOnly": false + }, + { + "Name": "Wallet6536", + "ParticipationOnly": false + }, + { + "Name": "Wallet6537", + "ParticipationOnly": false + }, + { + "Name": "Wallet6538", + "ParticipationOnly": false + }, + { + "Name": "Wallet6539", + "ParticipationOnly": false + }, + { + "Name": "Wallet6540", + "ParticipationOnly": false + }, + { + "Name": "Wallet6541", + "ParticipationOnly": false + }, + { + "Name": "Wallet6542", + "ParticipationOnly": false + }, + { + "Name": "Wallet6543", + "ParticipationOnly": false + }, + { + "Name": "Wallet6544", + "ParticipationOnly": false + }, + { + "Name": "Wallet6545", + "ParticipationOnly": false + }, + { + "Name": "Wallet6546", + "ParticipationOnly": false + }, + { + "Name": "Wallet6547", + "ParticipationOnly": false + }, + { + "Name": "Wallet6548", + "ParticipationOnly": false + }, + { + "Name": "Wallet6549", + "ParticipationOnly": false + }, + { + "Name": "Wallet6550", + "ParticipationOnly": false + }, + { + "Name": "Wallet6551", + "ParticipationOnly": false + }, + { + "Name": "Wallet6552", + "ParticipationOnly": false + }, + { + "Name": "Wallet6553", + "ParticipationOnly": false + }, + { + "Name": "Wallet6554", + "ParticipationOnly": false + }, + { + "Name": "Wallet6555", + "ParticipationOnly": false + }, + { + "Name": "Wallet6556", + "ParticipationOnly": false + }, + { + "Name": "Wallet6557", + "ParticipationOnly": false + }, + { + "Name": "Wallet6558", + "ParticipationOnly": false + }, + { + "Name": "Wallet6559", + "ParticipationOnly": false + }, + { + "Name": "Wallet6560", + "ParticipationOnly": false + }, + { + "Name": "Wallet6561", + "ParticipationOnly": false + }, + { + "Name": "Wallet6562", + "ParticipationOnly": false + }, + { + "Name": "Wallet6563", + "ParticipationOnly": false + }, + { + "Name": "Wallet6564", + "ParticipationOnly": false + }, + { + "Name": "Wallet6565", + "ParticipationOnly": false + }, + { + "Name": "Wallet6566", + "ParticipationOnly": false + }, + { + "Name": "Wallet6567", + "ParticipationOnly": false + }, + { + "Name": "Wallet6568", + "ParticipationOnly": false + }, + { + "Name": "Wallet6569", + "ParticipationOnly": false + }, + { + "Name": "Wallet6570", + "ParticipationOnly": false + }, + { + "Name": "Wallet6571", + "ParticipationOnly": false + }, + { + "Name": "Wallet6572", + "ParticipationOnly": false + }, + { + "Name": "Wallet6573", + "ParticipationOnly": false + }, + { + "Name": "Wallet6574", + "ParticipationOnly": false + }, + { + "Name": "Wallet6575", + "ParticipationOnly": false + }, + { + "Name": "Wallet6576", + "ParticipationOnly": false + }, + { + "Name": "Wallet6577", + "ParticipationOnly": false + }, + { + "Name": "Wallet6578", + "ParticipationOnly": false + }, + { + "Name": "Wallet6579", + "ParticipationOnly": false + }, + { + "Name": "Wallet6580", + "ParticipationOnly": false + }, + { + "Name": "Wallet6581", + "ParticipationOnly": false + }, + { + "Name": "Wallet6582", + "ParticipationOnly": false + }, + { + "Name": "Wallet6583", + "ParticipationOnly": false + }, + { + "Name": "Wallet6584", + "ParticipationOnly": false + }, + { + "Name": "Wallet6585", + "ParticipationOnly": false + }, + { + "Name": "Wallet6586", + "ParticipationOnly": false + }, + { + "Name": "Wallet6587", + "ParticipationOnly": false + }, + { + "Name": "Wallet6588", + "ParticipationOnly": false + }, + { + "Name": "Wallet6589", + "ParticipationOnly": false + }, + { + "Name": "Wallet6590", + "ParticipationOnly": false + }, + { + "Name": "Wallet6591", + "ParticipationOnly": false + }, + { + "Name": "Wallet6592", + "ParticipationOnly": false + }, + { + "Name": "Wallet6593", + "ParticipationOnly": false + }, + { + "Name": "Wallet6594", + "ParticipationOnly": false + }, + { + "Name": "Wallet6595", + "ParticipationOnly": false + }, + { + "Name": "Wallet6596", + "ParticipationOnly": false + }, + { + "Name": "Wallet6597", + "ParticipationOnly": false + }, + { + "Name": "Wallet6598", + "ParticipationOnly": false + }, + { + "Name": "Wallet6599", + "ParticipationOnly": false + }, + { + "Name": "Wallet6600", + "ParticipationOnly": false + }, + { + "Name": "Wallet6601", + "ParticipationOnly": false + }, + { + "Name": "Wallet6602", + "ParticipationOnly": false + }, + { + "Name": "Wallet6603", + "ParticipationOnly": false + }, + { + "Name": "Wallet6604", + "ParticipationOnly": false + }, + { + "Name": "Wallet6605", + "ParticipationOnly": false + }, + { + "Name": "Wallet6606", + "ParticipationOnly": false + }, + { + "Name": "Wallet6607", + "ParticipationOnly": false + }, + { + "Name": "Wallet6608", + "ParticipationOnly": false + }, + { + "Name": "Wallet6609", + "ParticipationOnly": false + }, + { + "Name": "Wallet6610", + "ParticipationOnly": false + }, + { + "Name": "Wallet6611", + "ParticipationOnly": false + }, + { + "Name": "Wallet6612", + "ParticipationOnly": false + }, + { + "Name": "Wallet6613", + "ParticipationOnly": false + }, + { + "Name": "Wallet6614", + "ParticipationOnly": false + }, + { + "Name": "Wallet6615", + "ParticipationOnly": false + }, + { + "Name": "Wallet6616", + "ParticipationOnly": false + }, + { + "Name": "Wallet6617", + "ParticipationOnly": false + }, + { + "Name": "Wallet6618", + "ParticipationOnly": false + }, + { + "Name": "Wallet6619", + "ParticipationOnly": false + }, + { + "Name": "Wallet6620", + "ParticipationOnly": false + }, + { + "Name": "Wallet6621", + "ParticipationOnly": false + }, + { + "Name": "Wallet6622", + "ParticipationOnly": false + }, + { + "Name": "Wallet6623", + "ParticipationOnly": false + }, + { + "Name": "Wallet6624", + "ParticipationOnly": false + }, + { + "Name": "Wallet6625", + "ParticipationOnly": false + }, + { + "Name": "Wallet6626", + "ParticipationOnly": false + }, + { + "Name": "Wallet6627", + "ParticipationOnly": false + }, + { + "Name": "Wallet6628", + "ParticipationOnly": false + }, + { + "Name": "Wallet6629", + "ParticipationOnly": false + }, + { + "Name": "Wallet6630", + "ParticipationOnly": false + }, + { + "Name": "Wallet6631", + "ParticipationOnly": false + }, + { + "Name": "Wallet6632", + "ParticipationOnly": false + }, + { + "Name": "Wallet6633", + "ParticipationOnly": false + }, + { + "Name": "Wallet6634", + "ParticipationOnly": false + }, + { + "Name": "Wallet6635", + "ParticipationOnly": false + }, + { + "Name": "Wallet6636", + "ParticipationOnly": false + }, + { + "Name": "Wallet6637", + "ParticipationOnly": false + }, + { + "Name": "Wallet6638", + "ParticipationOnly": false + }, + { + "Name": "Wallet6639", + "ParticipationOnly": false + }, + { + "Name": "Wallet6640", + "ParticipationOnly": false + }, + { + "Name": "Wallet6641", + "ParticipationOnly": false + }, + { + "Name": "Wallet6642", + "ParticipationOnly": false + }, + { + "Name": "Wallet6643", + "ParticipationOnly": false + }, + { + "Name": "Wallet6644", + "ParticipationOnly": false + }, + { + "Name": "Wallet6645", + "ParticipationOnly": false + }, + { + "Name": "Wallet6646", + "ParticipationOnly": false + }, + { + "Name": "Wallet6647", + "ParticipationOnly": false + }, + { + "Name": "Wallet6648", + "ParticipationOnly": false + }, + { + "Name": "Wallet6649", + "ParticipationOnly": false + }, + { + "Name": "Wallet6650", + "ParticipationOnly": false + }, + { + "Name": "Wallet6651", + "ParticipationOnly": false + }, + { + "Name": "Wallet6652", + "ParticipationOnly": false + }, + { + "Name": "Wallet6653", + "ParticipationOnly": false + }, + { + "Name": "Wallet6654", + "ParticipationOnly": false + }, + { + "Name": "Wallet6655", + "ParticipationOnly": false + }, + { + "Name": "Wallet6656", + "ParticipationOnly": false + }, + { + "Name": "Wallet6657", + "ParticipationOnly": false + }, + { + "Name": "Wallet6658", + "ParticipationOnly": false + }, + { + "Name": "Wallet6659", + "ParticipationOnly": false + }, + { + "Name": "Wallet6660", + "ParticipationOnly": false + }, + { + "Name": "Wallet6661", + "ParticipationOnly": false + }, + { + "Name": "Wallet6662", + "ParticipationOnly": false + }, + { + "Name": "Wallet6663", + "ParticipationOnly": false + }, + { + "Name": "Wallet6664", + "ParticipationOnly": false + }, + { + "Name": "Wallet6665", + "ParticipationOnly": false + }, + { + "Name": "Wallet6666", + "ParticipationOnly": false + }, + { + "Name": "Wallet6667", + "ParticipationOnly": false + }, + { + "Name": "Wallet6668", + "ParticipationOnly": false + }, + { + "Name": "Wallet6669", + "ParticipationOnly": false + }, + { + "Name": "Wallet6670", + "ParticipationOnly": false + }, + { + "Name": "Wallet6671", + "ParticipationOnly": false + }, + { + "Name": "Wallet6672", + "ParticipationOnly": false + }, + { + "Name": "Wallet6673", + "ParticipationOnly": false + }, + { + "Name": "Wallet6674", + "ParticipationOnly": false + }, + { + "Name": "Wallet6675", + "ParticipationOnly": false + }, + { + "Name": "Wallet6676", + "ParticipationOnly": false + }, + { + "Name": "Wallet6677", + "ParticipationOnly": false + }, + { + "Name": "Wallet6678", + "ParticipationOnly": false + }, + { + "Name": "Wallet6679", + "ParticipationOnly": false + }, + { + "Name": "Wallet6680", + "ParticipationOnly": false + }, + { + "Name": "Wallet6681", + "ParticipationOnly": false + }, + { + "Name": "Wallet6682", + "ParticipationOnly": false + }, + { + "Name": "Wallet6683", + "ParticipationOnly": false + }, + { + "Name": "Wallet6684", + "ParticipationOnly": false + }, + { + "Name": "Wallet6685", + "ParticipationOnly": false + }, + { + "Name": "Wallet6686", + "ParticipationOnly": false + }, + { + "Name": "Wallet6687", + "ParticipationOnly": false + }, + { + "Name": "Wallet6688", + "ParticipationOnly": false + }, + { + "Name": "Wallet6689", + "ParticipationOnly": false + }, + { + "Name": "Wallet6690", + "ParticipationOnly": false + }, + { + "Name": "Wallet6691", + "ParticipationOnly": false + }, + { + "Name": "Wallet6692", + "ParticipationOnly": false + }, + { + "Name": "Wallet6693", + "ParticipationOnly": false + }, + { + "Name": "Wallet6694", + "ParticipationOnly": false + }, + { + "Name": "Wallet6695", + "ParticipationOnly": false + }, + { + "Name": "Wallet6696", + "ParticipationOnly": false + }, + { + "Name": "Wallet6697", + "ParticipationOnly": false + }, + { + "Name": "Wallet6698", + "ParticipationOnly": false + }, + { + "Name": "Wallet6699", + "ParticipationOnly": false + }, + { + "Name": "Wallet6700", + "ParticipationOnly": false + }, + { + "Name": "Wallet6701", + "ParticipationOnly": false + }, + { + "Name": "Wallet6702", + "ParticipationOnly": false + }, + { + "Name": "Wallet6703", + "ParticipationOnly": false + }, + { + "Name": "Wallet6704", + "ParticipationOnly": false + }, + { + "Name": "Wallet6705", + "ParticipationOnly": false + }, + { + "Name": "Wallet6706", + "ParticipationOnly": false + }, + { + "Name": "Wallet6707", + "ParticipationOnly": false + }, + { + "Name": "Wallet6708", + "ParticipationOnly": false + }, + { + "Name": "Wallet6709", + "ParticipationOnly": false + }, + { + "Name": "Wallet6710", + "ParticipationOnly": false + }, + { + "Name": "Wallet6711", + "ParticipationOnly": false + }, + { + "Name": "Wallet6712", + "ParticipationOnly": false + }, + { + "Name": "Wallet6713", + "ParticipationOnly": false + }, + { + "Name": "Wallet6714", + "ParticipationOnly": false + }, + { + "Name": "Wallet6715", + "ParticipationOnly": false + }, + { + "Name": "Wallet6716", + "ParticipationOnly": false + }, + { + "Name": "Wallet6717", + "ParticipationOnly": false + }, + { + "Name": "Wallet6718", + "ParticipationOnly": false + }, + { + "Name": "Wallet6719", + "ParticipationOnly": false + }, + { + "Name": "Wallet6720", + "ParticipationOnly": false + }, + { + "Name": "Wallet6721", + "ParticipationOnly": false + }, + { + "Name": "Wallet6722", + "ParticipationOnly": false + }, + { + "Name": "Wallet6723", + "ParticipationOnly": false + }, + { + "Name": "Wallet6724", + "ParticipationOnly": false + }, + { + "Name": "Wallet6725", + "ParticipationOnly": false + }, + { + "Name": "Wallet6726", + "ParticipationOnly": false + }, + { + "Name": "Wallet6727", + "ParticipationOnly": false + }, + { + "Name": "Wallet6728", + "ParticipationOnly": false + }, + { + "Name": "Wallet6729", + "ParticipationOnly": false + }, + { + "Name": "Wallet6730", + "ParticipationOnly": false + }, + { + "Name": "Wallet6731", + "ParticipationOnly": false + }, + { + "Name": "Wallet6732", + "ParticipationOnly": false + }, + { + "Name": "Wallet6733", + "ParticipationOnly": false + }, + { + "Name": "Wallet6734", + "ParticipationOnly": false + }, + { + "Name": "Wallet6735", + "ParticipationOnly": false + }, + { + "Name": "Wallet6736", + "ParticipationOnly": false + }, + { + "Name": "Wallet6737", + "ParticipationOnly": false + }, + { + "Name": "Wallet6738", + "ParticipationOnly": false + }, + { + "Name": "Wallet6739", + "ParticipationOnly": false + }, + { + "Name": "Wallet6740", + "ParticipationOnly": false + }, + { + "Name": "Wallet6741", + "ParticipationOnly": false + }, + { + "Name": "Wallet6742", + "ParticipationOnly": false + }, + { + "Name": "Wallet6743", + "ParticipationOnly": false + }, + { + "Name": "Wallet6744", + "ParticipationOnly": false + }, + { + "Name": "Wallet6745", + "ParticipationOnly": false + }, + { + "Name": "Wallet6746", + "ParticipationOnly": false + }, + { + "Name": "Wallet6747", + "ParticipationOnly": false + }, + { + "Name": "Wallet6748", + "ParticipationOnly": false + }, + { + "Name": "Wallet6749", + "ParticipationOnly": false + }, + { + "Name": "Wallet6750", + "ParticipationOnly": false + }, + { + "Name": "Wallet6751", + "ParticipationOnly": false + }, + { + "Name": "Wallet6752", + "ParticipationOnly": false + }, + { + "Name": "Wallet6753", + "ParticipationOnly": false + }, + { + "Name": "Wallet6754", + "ParticipationOnly": false + }, + { + "Name": "Wallet6755", + "ParticipationOnly": false + }, + { + "Name": "Wallet6756", + "ParticipationOnly": false + }, + { + "Name": "Wallet6757", + "ParticipationOnly": false + }, + { + "Name": "Wallet6758", + "ParticipationOnly": false + }, + { + "Name": "Wallet6759", + "ParticipationOnly": false + }, + { + "Name": "Wallet6760", + "ParticipationOnly": false + }, + { + "Name": "Wallet6761", + "ParticipationOnly": false + }, + { + "Name": "Wallet6762", + "ParticipationOnly": false + }, + { + "Name": "Wallet6763", + "ParticipationOnly": false + }, + { + "Name": "Wallet6764", + "ParticipationOnly": false + }, + { + "Name": "Wallet6765", + "ParticipationOnly": false + }, + { + "Name": "Wallet6766", + "ParticipationOnly": false + }, + { + "Name": "Wallet6767", + "ParticipationOnly": false + }, + { + "Name": "Wallet6768", + "ParticipationOnly": false + }, + { + "Name": "Wallet6769", + "ParticipationOnly": false + }, + { + "Name": "Wallet6770", + "ParticipationOnly": false + }, + { + "Name": "Wallet6771", + "ParticipationOnly": false + }, + { + "Name": "Wallet6772", + "ParticipationOnly": false + }, + { + "Name": "Wallet6773", + "ParticipationOnly": false + }, + { + "Name": "Wallet6774", + "ParticipationOnly": false + }, + { + "Name": "Wallet6775", + "ParticipationOnly": false + }, + { + "Name": "Wallet6776", + "ParticipationOnly": false + }, + { + "Name": "Wallet6777", + "ParticipationOnly": false + }, + { + "Name": "Wallet6778", + "ParticipationOnly": false + }, + { + "Name": "Wallet6779", + "ParticipationOnly": false + }, + { + "Name": "Wallet6780", + "ParticipationOnly": false + }, + { + "Name": "Wallet6781", + "ParticipationOnly": false + }, + { + "Name": "Wallet6782", + "ParticipationOnly": false + }, + { + "Name": "Wallet6783", + "ParticipationOnly": false + }, + { + "Name": "Wallet6784", + "ParticipationOnly": false + }, + { + "Name": "Wallet6785", + "ParticipationOnly": false + }, + { + "Name": "Wallet6786", + "ParticipationOnly": false + }, + { + "Name": "Wallet6787", + "ParticipationOnly": false + }, + { + "Name": "Wallet6788", + "ParticipationOnly": false + }, + { + "Name": "Wallet6789", + "ParticipationOnly": false + }, + { + "Name": "Wallet6790", + "ParticipationOnly": false + }, + { + "Name": "Wallet6791", + "ParticipationOnly": false + }, + { + "Name": "Wallet6792", + "ParticipationOnly": false + }, + { + "Name": "Wallet6793", + "ParticipationOnly": false + }, + { + "Name": "Wallet6794", + "ParticipationOnly": false + }, + { + "Name": "Wallet6795", + "ParticipationOnly": false + }, + { + "Name": "Wallet6796", + "ParticipationOnly": false + }, + { + "Name": "Wallet6797", + "ParticipationOnly": false + }, + { + "Name": "Wallet6798", + "ParticipationOnly": false + }, + { + "Name": "Wallet6799", + "ParticipationOnly": false + }, + { + "Name": "Wallet6800", + "ParticipationOnly": false + }, + { + "Name": "Wallet6801", + "ParticipationOnly": false + }, + { + "Name": "Wallet6802", + "ParticipationOnly": false + }, + { + "Name": "Wallet6803", + "ParticipationOnly": false + }, + { + "Name": "Wallet6804", + "ParticipationOnly": false + }, + { + "Name": "Wallet6805", + "ParticipationOnly": false + }, + { + "Name": "Wallet6806", + "ParticipationOnly": false + }, + { + "Name": "Wallet6807", + "ParticipationOnly": false + }, + { + "Name": "Wallet6808", + "ParticipationOnly": false + }, + { + "Name": "Wallet6809", + "ParticipationOnly": false + }, + { + "Name": "Wallet6810", + "ParticipationOnly": false + }, + { + "Name": "Wallet6811", + "ParticipationOnly": false + }, + { + "Name": "Wallet6812", + "ParticipationOnly": false + }, + { + "Name": "Wallet6813", + "ParticipationOnly": false + }, + { + "Name": "Wallet6814", + "ParticipationOnly": false + }, + { + "Name": "Wallet6815", + "ParticipationOnly": false + }, + { + "Name": "Wallet6816", + "ParticipationOnly": false + }, + { + "Name": "Wallet6817", + "ParticipationOnly": false + }, + { + "Name": "Wallet6818", + "ParticipationOnly": false + }, + { + "Name": "Wallet6819", + "ParticipationOnly": false + }, + { + "Name": "Wallet6820", + "ParticipationOnly": false + }, + { + "Name": "Wallet6821", + "ParticipationOnly": false + }, + { + "Name": "Wallet6822", + "ParticipationOnly": false + }, + { + "Name": "Wallet6823", + "ParticipationOnly": false + }, + { + "Name": "Wallet6824", + "ParticipationOnly": false + }, + { + "Name": "Wallet6825", + "ParticipationOnly": false + }, + { + "Name": "Wallet6826", + "ParticipationOnly": false + }, + { + "Name": "Wallet6827", + "ParticipationOnly": false + }, + { + "Name": "Wallet6828", + "ParticipationOnly": false + }, + { + "Name": "Wallet6829", + "ParticipationOnly": false + }, + { + "Name": "Wallet6830", + "ParticipationOnly": false + }, + { + "Name": "Wallet6831", + "ParticipationOnly": false + }, + { + "Name": "Wallet6832", + "ParticipationOnly": false + }, + { + "Name": "Wallet6833", + "ParticipationOnly": false + }, + { + "Name": "Wallet6834", + "ParticipationOnly": false + }, + { + "Name": "Wallet6835", + "ParticipationOnly": false + }, + { + "Name": "Wallet6836", + "ParticipationOnly": false + }, + { + "Name": "Wallet6837", + "ParticipationOnly": false + }, + { + "Name": "Wallet6838", + "ParticipationOnly": false + }, + { + "Name": "Wallet6839", + "ParticipationOnly": false + }, + { + "Name": "Wallet6840", + "ParticipationOnly": false + }, + { + "Name": "Wallet6841", + "ParticipationOnly": false + }, + { + "Name": "Wallet6842", + "ParticipationOnly": false + }, + { + "Name": "Wallet6843", + "ParticipationOnly": false + }, + { + "Name": "Wallet6844", + "ParticipationOnly": false + }, + { + "Name": "Wallet6845", + "ParticipationOnly": false + }, + { + "Name": "Wallet6846", + "ParticipationOnly": false + }, + { + "Name": "Wallet6847", + "ParticipationOnly": false + }, + { + "Name": "Wallet6848", + "ParticipationOnly": false + }, + { + "Name": "Wallet6849", + "ParticipationOnly": false + }, + { + "Name": "Wallet6850", + "ParticipationOnly": false + }, + { + "Name": "Wallet6851", + "ParticipationOnly": false + }, + { + "Name": "Wallet6852", + "ParticipationOnly": false + }, + { + "Name": "Wallet6853", + "ParticipationOnly": false + }, + { + "Name": "Wallet6854", + "ParticipationOnly": false + }, + { + "Name": "Wallet6855", + "ParticipationOnly": false + }, + { + "Name": "Wallet6856", + "ParticipationOnly": false + }, + { + "Name": "Wallet6857", + "ParticipationOnly": false + }, + { + "Name": "Wallet6858", + "ParticipationOnly": false + }, + { + "Name": "Wallet6859", + "ParticipationOnly": false + }, + { + "Name": "Wallet6860", + "ParticipationOnly": false + }, + { + "Name": "Wallet6861", + "ParticipationOnly": false + }, + { + "Name": "Wallet6862", + "ParticipationOnly": false + }, + { + "Name": "Wallet6863", + "ParticipationOnly": false + }, + { + "Name": "Wallet6864", + "ParticipationOnly": false + }, + { + "Name": "Wallet6865", + "ParticipationOnly": false + }, + { + "Name": "Wallet6866", + "ParticipationOnly": false + }, + { + "Name": "Wallet6867", + "ParticipationOnly": false + }, + { + "Name": "Wallet6868", + "ParticipationOnly": false + }, + { + "Name": "Wallet6869", + "ParticipationOnly": false + }, + { + "Name": "Wallet6870", + "ParticipationOnly": false + }, + { + "Name": "Wallet6871", + "ParticipationOnly": false + }, + { + "Name": "Wallet6872", + "ParticipationOnly": false + }, + { + "Name": "Wallet6873", + "ParticipationOnly": false + }, + { + "Name": "Wallet6874", + "ParticipationOnly": false + }, + { + "Name": "Wallet6875", + "ParticipationOnly": false + }, + { + "Name": "Wallet6876", + "ParticipationOnly": false + }, + { + "Name": "Wallet6877", + "ParticipationOnly": false + }, + { + "Name": "Wallet6878", + "ParticipationOnly": false + }, + { + "Name": "Wallet6879", + "ParticipationOnly": false + }, + { + "Name": "Wallet6880", + "ParticipationOnly": false + }, + { + "Name": "Wallet6881", + "ParticipationOnly": false + }, + { + "Name": "Wallet6882", + "ParticipationOnly": false + }, + { + "Name": "Wallet6883", + "ParticipationOnly": false + }, + { + "Name": "Wallet6884", + "ParticipationOnly": false + }, + { + "Name": "Wallet6885", + "ParticipationOnly": false + }, + { + "Name": "Wallet6886", + "ParticipationOnly": false + }, + { + "Name": "Wallet6887", + "ParticipationOnly": false + }, + { + "Name": "Wallet6888", + "ParticipationOnly": false + }, + { + "Name": "Wallet6889", + "ParticipationOnly": false + }, + { + "Name": "Wallet6890", + "ParticipationOnly": false + }, + { + "Name": "Wallet6891", + "ParticipationOnly": false + }, + { + "Name": "Wallet6892", + "ParticipationOnly": false + }, + { + "Name": "Wallet6893", + "ParticipationOnly": false + }, + { + "Name": "Wallet6894", + "ParticipationOnly": false + }, + { + "Name": "Wallet6895", + "ParticipationOnly": false + }, + { + "Name": "Wallet6896", + "ParticipationOnly": false + }, + { + "Name": "Wallet6897", + "ParticipationOnly": false + }, + { + "Name": "Wallet6898", + "ParticipationOnly": false + }, + { + "Name": "Wallet6899", + "ParticipationOnly": false + }, + { + "Name": "Wallet6900", + "ParticipationOnly": false + }, + { + "Name": "Wallet6901", + "ParticipationOnly": false + }, + { + "Name": "Wallet6902", + "ParticipationOnly": false + }, + { + "Name": "Wallet6903", + "ParticipationOnly": false + }, + { + "Name": "Wallet6904", + "ParticipationOnly": false + }, + { + "Name": "Wallet6905", + "ParticipationOnly": false + }, + { + "Name": "Wallet6906", + "ParticipationOnly": false + }, + { + "Name": "Wallet6907", + "ParticipationOnly": false + }, + { + "Name": "Wallet6908", + "ParticipationOnly": false + }, + { + "Name": "Wallet6909", + "ParticipationOnly": false + }, + { + "Name": "Wallet6910", + "ParticipationOnly": false + }, + { + "Name": "Wallet6911", + "ParticipationOnly": false + }, + { + "Name": "Wallet6912", + "ParticipationOnly": false + }, + { + "Name": "Wallet6913", + "ParticipationOnly": false + }, + { + "Name": "Wallet6914", + "ParticipationOnly": false + }, + { + "Name": "Wallet6915", + "ParticipationOnly": false + }, + { + "Name": "Wallet6916", + "ParticipationOnly": false + }, + { + "Name": "Wallet6917", + "ParticipationOnly": false + }, + { + "Name": "Wallet6918", + "ParticipationOnly": false + }, + { + "Name": "Wallet6919", + "ParticipationOnly": false + }, + { + "Name": "Wallet6920", + "ParticipationOnly": false + }, + { + "Name": "Wallet6921", + "ParticipationOnly": false + }, + { + "Name": "Wallet6922", + "ParticipationOnly": false + }, + { + "Name": "Wallet6923", + "ParticipationOnly": false + }, + { + "Name": "Wallet6924", + "ParticipationOnly": false + }, + { + "Name": "Wallet6925", + "ParticipationOnly": false + }, + { + "Name": "Wallet6926", + "ParticipationOnly": false + }, + { + "Name": "Wallet6927", + "ParticipationOnly": false + }, + { + "Name": "Wallet6928", + "ParticipationOnly": false + }, + { + "Name": "Wallet6929", + "ParticipationOnly": false + }, + { + "Name": "Wallet6930", + "ParticipationOnly": false + }, + { + "Name": "Wallet6931", + "ParticipationOnly": false + }, + { + "Name": "Wallet6932", + "ParticipationOnly": false + }, + { + "Name": "Wallet6933", + "ParticipationOnly": false + }, + { + "Name": "Wallet6934", + "ParticipationOnly": false + }, + { + "Name": "Wallet6935", + "ParticipationOnly": false + }, + { + "Name": "Wallet6936", + "ParticipationOnly": false + }, + { + "Name": "Wallet6937", + "ParticipationOnly": false + }, + { + "Name": "Wallet6938", + "ParticipationOnly": false + }, + { + "Name": "Wallet6939", + "ParticipationOnly": false + }, + { + "Name": "Wallet6940", + "ParticipationOnly": false + }, + { + "Name": "Wallet6941", + "ParticipationOnly": false + }, + { + "Name": "Wallet6942", + "ParticipationOnly": false + }, + { + "Name": "Wallet6943", + "ParticipationOnly": false + }, + { + "Name": "Wallet6944", + "ParticipationOnly": false + }, + { + "Name": "Wallet6945", + "ParticipationOnly": false + }, + { + "Name": "Wallet6946", + "ParticipationOnly": false + }, + { + "Name": "Wallet6947", + "ParticipationOnly": false + }, + { + "Name": "Wallet6948", + "ParticipationOnly": false + }, + { + "Name": "Wallet6949", + "ParticipationOnly": false + }, + { + "Name": "Wallet6950", + "ParticipationOnly": false + }, + { + "Name": "Wallet6951", + "ParticipationOnly": false + }, + { + "Name": "Wallet6952", + "ParticipationOnly": false + }, + { + "Name": "Wallet6953", + "ParticipationOnly": false + }, + { + "Name": "Wallet6954", + "ParticipationOnly": false + }, + { + "Name": "Wallet6955", + "ParticipationOnly": false + }, + { + "Name": "Wallet6956", + "ParticipationOnly": false + }, + { + "Name": "Wallet6957", + "ParticipationOnly": false + }, + { + "Name": "Wallet6958", + "ParticipationOnly": false + }, + { + "Name": "Wallet6959", + "ParticipationOnly": false + }, + { + "Name": "Wallet6960", + "ParticipationOnly": false + }, + { + "Name": "Wallet6961", + "ParticipationOnly": false + }, + { + "Name": "Wallet6962", + "ParticipationOnly": false + }, + { + "Name": "Wallet6963", + "ParticipationOnly": false + }, + { + "Name": "Wallet6964", + "ParticipationOnly": false + }, + { + "Name": "Wallet6965", + "ParticipationOnly": false + }, + { + "Name": "Wallet6966", + "ParticipationOnly": false + }, + { + "Name": "Wallet6967", + "ParticipationOnly": false + }, + { + "Name": "Wallet6968", + "ParticipationOnly": false + }, + { + "Name": "Wallet6969", + "ParticipationOnly": false + }, + { + "Name": "Wallet6970", + "ParticipationOnly": false + }, + { + "Name": "Wallet6971", + "ParticipationOnly": false + }, + { + "Name": "Wallet6972", + "ParticipationOnly": false + }, + { + "Name": "Wallet6973", + "ParticipationOnly": false + }, + { + "Name": "Wallet6974", + "ParticipationOnly": false + }, + { + "Name": "Wallet6975", + "ParticipationOnly": false + }, + { + "Name": "Wallet6976", + "ParticipationOnly": false + }, + { + "Name": "Wallet6977", + "ParticipationOnly": false + }, + { + "Name": "Wallet6978", + "ParticipationOnly": false + }, + { + "Name": "Wallet6979", + "ParticipationOnly": false + }, + { + "Name": "Wallet6980", + "ParticipationOnly": false + }, + { + "Name": "Wallet6981", + "ParticipationOnly": false + }, + { + "Name": "Wallet6982", + "ParticipationOnly": false + }, + { + "Name": "Wallet6983", + "ParticipationOnly": false + }, + { + "Name": "Wallet6984", + "ParticipationOnly": false + }, + { + "Name": "Wallet6985", + "ParticipationOnly": false + }, + { + "Name": "Wallet6986", + "ParticipationOnly": false + }, + { + "Name": "Wallet6987", + "ParticipationOnly": false + }, + { + "Name": "Wallet6988", + "ParticipationOnly": false + }, + { + "Name": "Wallet6989", + "ParticipationOnly": false + }, + { + "Name": "Wallet6990", + "ParticipationOnly": false + }, + { + "Name": "Wallet6991", + "ParticipationOnly": false + }, + { + "Name": "Wallet6992", + "ParticipationOnly": false + }, + { + "Name": "Wallet6993", + "ParticipationOnly": false + }, + { + "Name": "Wallet6994", + "ParticipationOnly": false + }, + { + "Name": "Wallet6995", + "ParticipationOnly": false + }, + { + "Name": "Wallet6996", + "ParticipationOnly": false + }, + { + "Name": "Wallet6997", + "ParticipationOnly": false + }, + { + "Name": "Wallet6998", + "ParticipationOnly": false + }, + { + "Name": "Wallet6999", + "ParticipationOnly": false + }, + { + "Name": "Wallet7000", + "ParticipationOnly": false + }, + { + "Name": "Wallet7001", + "ParticipationOnly": false + }, + { + "Name": "Wallet7002", + "ParticipationOnly": false + }, + { + "Name": "Wallet7003", + "ParticipationOnly": false + }, + { + "Name": "Wallet7004", + "ParticipationOnly": false + }, + { + "Name": "Wallet7005", + "ParticipationOnly": false + }, + { + "Name": "Wallet7006", + "ParticipationOnly": false + }, + { + "Name": "Wallet7007", + "ParticipationOnly": false + }, + { + "Name": "Wallet7008", + "ParticipationOnly": false + }, + { + "Name": "Wallet7009", + "ParticipationOnly": false + }, + { + "Name": "Wallet7010", + "ParticipationOnly": false + }, + { + "Name": "Wallet7011", + "ParticipationOnly": false + }, + { + "Name": "Wallet7012", + "ParticipationOnly": false + }, + { + "Name": "Wallet7013", + "ParticipationOnly": false + }, + { + "Name": "Wallet7014", + "ParticipationOnly": false + }, + { + "Name": "Wallet7015", + "ParticipationOnly": false + }, + { + "Name": "Wallet7016", + "ParticipationOnly": false + }, + { + "Name": "Wallet7017", + "ParticipationOnly": false + }, + { + "Name": "Wallet7018", + "ParticipationOnly": false + }, + { + "Name": "Wallet7019", + "ParticipationOnly": false + }, + { + "Name": "Wallet7020", + "ParticipationOnly": false + }, + { + "Name": "Wallet7021", + "ParticipationOnly": false + }, + { + "Name": "Wallet7022", + "ParticipationOnly": false + }, + { + "Name": "Wallet7023", + "ParticipationOnly": false + }, + { + "Name": "Wallet7024", + "ParticipationOnly": false + }, + { + "Name": "Wallet7025", + "ParticipationOnly": false + }, + { + "Name": "Wallet7026", + "ParticipationOnly": false + }, + { + "Name": "Wallet7027", + "ParticipationOnly": false + }, + { + "Name": "Wallet7028", + "ParticipationOnly": false + }, + { + "Name": "Wallet7029", + "ParticipationOnly": false + }, + { + "Name": "Wallet7030", + "ParticipationOnly": false + }, + { + "Name": "Wallet7031", + "ParticipationOnly": false + }, + { + "Name": "Wallet7032", + "ParticipationOnly": false + }, + { + "Name": "Wallet7033", + "ParticipationOnly": false + }, + { + "Name": "Wallet7034", + "ParticipationOnly": false + }, + { + "Name": "Wallet7035", + "ParticipationOnly": false + }, + { + "Name": "Wallet7036", + "ParticipationOnly": false + }, + { + "Name": "Wallet7037", + "ParticipationOnly": false + }, + { + "Name": "Wallet7038", + "ParticipationOnly": false + }, + { + "Name": "Wallet7039", + "ParticipationOnly": false + }, + { + "Name": "Wallet7040", + "ParticipationOnly": false + }, + { + "Name": "Wallet7041", + "ParticipationOnly": false + }, + { + "Name": "Wallet7042", + "ParticipationOnly": false + }, + { + "Name": "Wallet7043", + "ParticipationOnly": false + }, + { + "Name": "Wallet7044", + "ParticipationOnly": false + }, + { + "Name": "Wallet7045", + "ParticipationOnly": false + }, + { + "Name": "Wallet7046", + "ParticipationOnly": false + }, + { + "Name": "Wallet7047", + "ParticipationOnly": false + }, + { + "Name": "Wallet7048", + "ParticipationOnly": false + }, + { + "Name": "Wallet7049", + "ParticipationOnly": false + }, + { + "Name": "Wallet7050", + "ParticipationOnly": false + }, + { + "Name": "Wallet7051", + "ParticipationOnly": false + }, + { + "Name": "Wallet7052", + "ParticipationOnly": false + }, + { + "Name": "Wallet7053", + "ParticipationOnly": false + }, + { + "Name": "Wallet7054", + "ParticipationOnly": false + }, + { + "Name": "Wallet7055", + "ParticipationOnly": false + }, + { + "Name": "Wallet7056", + "ParticipationOnly": false + }, + { + "Name": "Wallet7057", + "ParticipationOnly": false + }, + { + "Name": "Wallet7058", + "ParticipationOnly": false + }, + { + "Name": "Wallet7059", + "ParticipationOnly": false + }, + { + "Name": "Wallet7060", + "ParticipationOnly": false + }, + { + "Name": "Wallet7061", + "ParticipationOnly": false + }, + { + "Name": "Wallet7062", + "ParticipationOnly": false + }, + { + "Name": "Wallet7063", + "ParticipationOnly": false + }, + { + "Name": "Wallet7064", + "ParticipationOnly": false + }, + { + "Name": "Wallet7065", + "ParticipationOnly": false + }, + { + "Name": "Wallet7066", + "ParticipationOnly": false + }, + { + "Name": "Wallet7067", + "ParticipationOnly": false + }, + { + "Name": "Wallet7068", + "ParticipationOnly": false + }, + { + "Name": "Wallet7069", + "ParticipationOnly": false + }, + { + "Name": "Wallet7070", + "ParticipationOnly": false + }, + { + "Name": "Wallet7071", + "ParticipationOnly": false + }, + { + "Name": "Wallet7072", + "ParticipationOnly": false + }, + { + "Name": "Wallet7073", + "ParticipationOnly": false + }, + { + "Name": "Wallet7074", + "ParticipationOnly": false + }, + { + "Name": "Wallet7075", + "ParticipationOnly": false + }, + { + "Name": "Wallet7076", + "ParticipationOnly": false + }, + { + "Name": "Wallet7077", + "ParticipationOnly": false + }, + { + "Name": "Wallet7078", + "ParticipationOnly": false + }, + { + "Name": "Wallet7079", + "ParticipationOnly": false + }, + { + "Name": "Wallet7080", + "ParticipationOnly": false + }, + { + "Name": "Wallet7081", + "ParticipationOnly": false + }, + { + "Name": "Wallet7082", + "ParticipationOnly": false + }, + { + "Name": "Wallet7083", + "ParticipationOnly": false + }, + { + "Name": "Wallet7084", + "ParticipationOnly": false + }, + { + "Name": "Wallet7085", + "ParticipationOnly": false + }, + { + "Name": "Wallet7086", + "ParticipationOnly": false + }, + { + "Name": "Wallet7087", + "ParticipationOnly": false + }, + { + "Name": "Wallet7088", + "ParticipationOnly": false + }, + { + "Name": "Wallet7089", + "ParticipationOnly": false + }, + { + "Name": "Wallet7090", + "ParticipationOnly": false + }, + { + "Name": "Wallet7091", + "ParticipationOnly": false + }, + { + "Name": "Wallet7092", + "ParticipationOnly": false + }, + { + "Name": "Wallet7093", + "ParticipationOnly": false + }, + { + "Name": "Wallet7094", + "ParticipationOnly": false + }, + { + "Name": "Wallet7095", + "ParticipationOnly": false + }, + { + "Name": "Wallet7096", + "ParticipationOnly": false + }, + { + "Name": "Wallet7097", + "ParticipationOnly": false + }, + { + "Name": "Wallet7098", + "ParticipationOnly": false + }, + { + "Name": "Wallet7099", + "ParticipationOnly": false + }, + { + "Name": "Wallet7100", + "ParticipationOnly": false + }, + { + "Name": "Wallet7101", + "ParticipationOnly": false + }, + { + "Name": "Wallet7102", + "ParticipationOnly": false + }, + { + "Name": "Wallet7103", + "ParticipationOnly": false + }, + { + "Name": "Wallet7104", + "ParticipationOnly": false + }, + { + "Name": "Wallet7105", + "ParticipationOnly": false + }, + { + "Name": "Wallet7106", + "ParticipationOnly": false + }, + { + "Name": "Wallet7107", + "ParticipationOnly": false + }, + { + "Name": "Wallet7108", + "ParticipationOnly": false + }, + { + "Name": "Wallet7109", + "ParticipationOnly": false + }, + { + "Name": "Wallet7110", + "ParticipationOnly": false + }, + { + "Name": "Wallet7111", + "ParticipationOnly": false + }, + { + "Name": "Wallet7112", + "ParticipationOnly": false + }, + { + "Name": "Wallet7113", + "ParticipationOnly": false + }, + { + "Name": "Wallet7114", + "ParticipationOnly": false + }, + { + "Name": "Wallet7115", + "ParticipationOnly": false + }, + { + "Name": "Wallet7116", + "ParticipationOnly": false + }, + { + "Name": "Wallet7117", + "ParticipationOnly": false + }, + { + "Name": "Wallet7118", + "ParticipationOnly": false + }, + { + "Name": "Wallet7119", + "ParticipationOnly": false + }, + { + "Name": "Wallet7120", + "ParticipationOnly": false + }, + { + "Name": "Wallet7121", + "ParticipationOnly": false + }, + { + "Name": "Wallet7122", + "ParticipationOnly": false + }, + { + "Name": "Wallet7123", + "ParticipationOnly": false + }, + { + "Name": "Wallet7124", + "ParticipationOnly": false + }, + { + "Name": "Wallet7125", + "ParticipationOnly": false + }, + { + "Name": "Wallet7126", + "ParticipationOnly": false + }, + { + "Name": "Wallet7127", + "ParticipationOnly": false + }, + { + "Name": "Wallet7128", + "ParticipationOnly": false + }, + { + "Name": "Wallet7129", + "ParticipationOnly": false + }, + { + "Name": "Wallet7130", + "ParticipationOnly": false + }, + { + "Name": "Wallet7131", + "ParticipationOnly": false + }, + { + "Name": "Wallet7132", + "ParticipationOnly": false + }, + { + "Name": "Wallet7133", + "ParticipationOnly": false + }, + { + "Name": "Wallet7134", + "ParticipationOnly": false + }, + { + "Name": "Wallet7135", + "ParticipationOnly": false + }, + { + "Name": "Wallet7136", + "ParticipationOnly": false + }, + { + "Name": "Wallet7137", + "ParticipationOnly": false + }, + { + "Name": "Wallet7138", + "ParticipationOnly": false + }, + { + "Name": "Wallet7139", + "ParticipationOnly": false + }, + { + "Name": "Wallet7140", + "ParticipationOnly": false + }, + { + "Name": "Wallet7141", + "ParticipationOnly": false + }, + { + "Name": "Wallet7142", + "ParticipationOnly": false + }, + { + "Name": "Wallet7143", + "ParticipationOnly": false + }, + { + "Name": "Wallet7144", + "ParticipationOnly": false + }, + { + "Name": "Wallet7145", + "ParticipationOnly": false + }, + { + "Name": "Wallet7146", + "ParticipationOnly": false + }, + { + "Name": "Wallet7147", + "ParticipationOnly": false + }, + { + "Name": "Wallet7148", + "ParticipationOnly": false + }, + { + "Name": "Wallet7149", + "ParticipationOnly": false + }, + { + "Name": "Wallet7150", + "ParticipationOnly": false + }, + { + "Name": "Wallet7151", + "ParticipationOnly": false + }, + { + "Name": "Wallet7152", + "ParticipationOnly": false + }, + { + "Name": "Wallet7153", + "ParticipationOnly": false + }, + { + "Name": "Wallet7154", + "ParticipationOnly": false + }, + { + "Name": "Wallet7155", + "ParticipationOnly": false + }, + { + "Name": "Wallet7156", + "ParticipationOnly": false + }, + { + "Name": "Wallet7157", + "ParticipationOnly": false + }, + { + "Name": "Wallet7158", + "ParticipationOnly": false + }, + { + "Name": "Wallet7159", + "ParticipationOnly": false + }, + { + "Name": "Wallet7160", + "ParticipationOnly": false + }, + { + "Name": "Wallet7161", + "ParticipationOnly": false + }, + { + "Name": "Wallet7162", + "ParticipationOnly": false + }, + { + "Name": "Wallet7163", + "ParticipationOnly": false + }, + { + "Name": "Wallet7164", + "ParticipationOnly": false + }, + { + "Name": "Wallet7165", + "ParticipationOnly": false + }, + { + "Name": "Wallet7166", + "ParticipationOnly": false + }, + { + "Name": "Wallet7167", + "ParticipationOnly": false + }, + { + "Name": "Wallet7168", + "ParticipationOnly": false + }, + { + "Name": "Wallet7169", + "ParticipationOnly": false + }, + { + "Name": "Wallet7170", + "ParticipationOnly": false + }, + { + "Name": "Wallet7171", + "ParticipationOnly": false + }, + { + "Name": "Wallet7172", + "ParticipationOnly": false + }, + { + "Name": "Wallet7173", + "ParticipationOnly": false + }, + { + "Name": "Wallet7174", + "ParticipationOnly": false + }, + { + "Name": "Wallet7175", + "ParticipationOnly": false + }, + { + "Name": "Wallet7176", + "ParticipationOnly": false + }, + { + "Name": "Wallet7177", + "ParticipationOnly": false + }, + { + "Name": "Wallet7178", + "ParticipationOnly": false + }, + { + "Name": "Wallet7179", + "ParticipationOnly": false + }, + { + "Name": "Wallet7180", + "ParticipationOnly": false + }, + { + "Name": "Wallet7181", + "ParticipationOnly": false + }, + { + "Name": "Wallet7182", + "ParticipationOnly": false + }, + { + "Name": "Wallet7183", + "ParticipationOnly": false + }, + { + "Name": "Wallet7184", + "ParticipationOnly": false + }, + { + "Name": "Wallet7185", + "ParticipationOnly": false + }, + { + "Name": "Wallet7186", + "ParticipationOnly": false + }, + { + "Name": "Wallet7187", + "ParticipationOnly": false + }, + { + "Name": "Wallet7188", + "ParticipationOnly": false + }, + { + "Name": "Wallet7189", + "ParticipationOnly": false + }, + { + "Name": "Wallet7190", + "ParticipationOnly": false + }, + { + "Name": "Wallet7191", + "ParticipationOnly": false + }, + { + "Name": "Wallet7192", + "ParticipationOnly": false + }, + { + "Name": "Wallet7193", + "ParticipationOnly": false + }, + { + "Name": "Wallet7194", + "ParticipationOnly": false + }, + { + "Name": "Wallet7195", + "ParticipationOnly": false + }, + { + "Name": "Wallet7196", + "ParticipationOnly": false + }, + { + "Name": "Wallet7197", + "ParticipationOnly": false + }, + { + "Name": "Wallet7198", + "ParticipationOnly": false + }, + { + "Name": "Wallet7199", + "ParticipationOnly": false + }, + { + "Name": "Wallet7200", + "ParticipationOnly": false + }, + { + "Name": "Wallet7201", + "ParticipationOnly": false + }, + { + "Name": "Wallet7202", + "ParticipationOnly": false + }, + { + "Name": "Wallet7203", + "ParticipationOnly": false + }, + { + "Name": "Wallet7204", + "ParticipationOnly": false + }, + { + "Name": "Wallet7205", + "ParticipationOnly": false + }, + { + "Name": "Wallet7206", + "ParticipationOnly": false + }, + { + "Name": "Wallet7207", + "ParticipationOnly": false + }, + { + "Name": "Wallet7208", + "ParticipationOnly": false + }, + { + "Name": "Wallet7209", + "ParticipationOnly": false + }, + { + "Name": "Wallet7210", + "ParticipationOnly": false + }, + { + "Name": "Wallet7211", + "ParticipationOnly": false + }, + { + "Name": "Wallet7212", + "ParticipationOnly": false + }, + { + "Name": "Wallet7213", + "ParticipationOnly": false + }, + { + "Name": "Wallet7214", + "ParticipationOnly": false + }, + { + "Name": "Wallet7215", + "ParticipationOnly": false + }, + { + "Name": "Wallet7216", + "ParticipationOnly": false + }, + { + "Name": "Wallet7217", + "ParticipationOnly": false + }, + { + "Name": "Wallet7218", + "ParticipationOnly": false + }, + { + "Name": "Wallet7219", + "ParticipationOnly": false + }, + { + "Name": "Wallet7220", + "ParticipationOnly": false + }, + { + "Name": "Wallet7221", + "ParticipationOnly": false + }, + { + "Name": "Wallet7222", + "ParticipationOnly": false + }, + { + "Name": "Wallet7223", + "ParticipationOnly": false + }, + { + "Name": "Wallet7224", + "ParticipationOnly": false + }, + { + "Name": "Wallet7225", + "ParticipationOnly": false + }, + { + "Name": "Wallet7226", + "ParticipationOnly": false + }, + { + "Name": "Wallet7227", + "ParticipationOnly": false + }, + { + "Name": "Wallet7228", + "ParticipationOnly": false + }, + { + "Name": "Wallet7229", + "ParticipationOnly": false + }, + { + "Name": "Wallet7230", + "ParticipationOnly": false + }, + { + "Name": "Wallet7231", + "ParticipationOnly": false + }, + { + "Name": "Wallet7232", + "ParticipationOnly": false + }, + { + "Name": "Wallet7233", + "ParticipationOnly": false + }, + { + "Name": "Wallet7234", + "ParticipationOnly": false + }, + { + "Name": "Wallet7235", + "ParticipationOnly": false + }, + { + "Name": "Wallet7236", + "ParticipationOnly": false + }, + { + "Name": "Wallet7237", + "ParticipationOnly": false + }, + { + "Name": "Wallet7238", + "ParticipationOnly": false + }, + { + "Name": "Wallet7239", + "ParticipationOnly": false + }, + { + "Name": "Wallet7240", + "ParticipationOnly": false + }, + { + "Name": "Wallet7241", + "ParticipationOnly": false + }, + { + "Name": "Wallet7242", + "ParticipationOnly": false + }, + { + "Name": "Wallet7243", + "ParticipationOnly": false + }, + { + "Name": "Wallet7244", + "ParticipationOnly": false + }, + { + "Name": "Wallet7245", + "ParticipationOnly": false + }, + { + "Name": "Wallet7246", + "ParticipationOnly": false + }, + { + "Name": "Wallet7247", + "ParticipationOnly": false + }, + { + "Name": "Wallet7248", + "ParticipationOnly": false + }, + { + "Name": "Wallet7249", + "ParticipationOnly": false + }, + { + "Name": "Wallet7250", + "ParticipationOnly": false + }, + { + "Name": "Wallet7251", + "ParticipationOnly": false + }, + { + "Name": "Wallet7252", + "ParticipationOnly": false + }, + { + "Name": "Wallet7253", + "ParticipationOnly": false + }, + { + "Name": "Wallet7254", + "ParticipationOnly": false + }, + { + "Name": "Wallet7255", + "ParticipationOnly": false + }, + { + "Name": "Wallet7256", + "ParticipationOnly": false + }, + { + "Name": "Wallet7257", + "ParticipationOnly": false + }, + { + "Name": "Wallet7258", + "ParticipationOnly": false + }, + { + "Name": "Wallet7259", + "ParticipationOnly": false + }, + { + "Name": "Wallet7260", + "ParticipationOnly": false + }, + { + "Name": "Wallet7261", + "ParticipationOnly": false + }, + { + "Name": "Wallet7262", + "ParticipationOnly": false + }, + { + "Name": "Wallet7263", + "ParticipationOnly": false + }, + { + "Name": "Wallet7264", + "ParticipationOnly": false + }, + { + "Name": "Wallet7265", + "ParticipationOnly": false + }, + { + "Name": "Wallet7266", + "ParticipationOnly": false + }, + { + "Name": "Wallet7267", + "ParticipationOnly": false + }, + { + "Name": "Wallet7268", + "ParticipationOnly": false + }, + { + "Name": "Wallet7269", + "ParticipationOnly": false + }, + { + "Name": "Wallet7270", + "ParticipationOnly": false + }, + { + "Name": "Wallet7271", + "ParticipationOnly": false + }, + { + "Name": "Wallet7272", + "ParticipationOnly": false + }, + { + "Name": "Wallet7273", + "ParticipationOnly": false + }, + { + "Name": "Wallet7274", + "ParticipationOnly": false + }, + { + "Name": "Wallet7275", + "ParticipationOnly": false + }, + { + "Name": "Wallet7276", + "ParticipationOnly": false + }, + { + "Name": "Wallet7277", + "ParticipationOnly": false + }, + { + "Name": "Wallet7278", + "ParticipationOnly": false + }, + { + "Name": "Wallet7279", + "ParticipationOnly": false + }, + { + "Name": "Wallet7280", + "ParticipationOnly": false + }, + { + "Name": "Wallet7281", + "ParticipationOnly": false + }, + { + "Name": "Wallet7282", + "ParticipationOnly": false + }, + { + "Name": "Wallet7283", + "ParticipationOnly": false + }, + { + "Name": "Wallet7284", + "ParticipationOnly": false + }, + { + "Name": "Wallet7285", + "ParticipationOnly": false + }, + { + "Name": "Wallet7286", + "ParticipationOnly": false + }, + { + "Name": "Wallet7287", + "ParticipationOnly": false + }, + { + "Name": "Wallet7288", + "ParticipationOnly": false + }, + { + "Name": "Wallet7289", + "ParticipationOnly": false + }, + { + "Name": "Wallet7290", + "ParticipationOnly": false + }, + { + "Name": "Wallet7291", + "ParticipationOnly": false + }, + { + "Name": "Wallet7292", + "ParticipationOnly": false + }, + { + "Name": "Wallet7293", + "ParticipationOnly": false + }, + { + "Name": "Wallet7294", + "ParticipationOnly": false + }, + { + "Name": "Wallet7295", + "ParticipationOnly": false + }, + { + "Name": "Wallet7296", + "ParticipationOnly": false + }, + { + "Name": "Wallet7297", + "ParticipationOnly": false + }, + { + "Name": "Wallet7298", + "ParticipationOnly": false + }, + { + "Name": "Wallet7299", + "ParticipationOnly": false + }, + { + "Name": "Wallet7300", + "ParticipationOnly": false + }, + { + "Name": "Wallet7301", + "ParticipationOnly": false + }, + { + "Name": "Wallet7302", + "ParticipationOnly": false + }, + { + "Name": "Wallet7303", + "ParticipationOnly": false + }, + { + "Name": "Wallet7304", + "ParticipationOnly": false + }, + { + "Name": "Wallet7305", + "ParticipationOnly": false + }, + { + "Name": "Wallet7306", + "ParticipationOnly": false + }, + { + "Name": "Wallet7307", + "ParticipationOnly": false + }, + { + "Name": "Wallet7308", + "ParticipationOnly": false + }, + { + "Name": "Wallet7309", + "ParticipationOnly": false + }, + { + "Name": "Wallet7310", + "ParticipationOnly": false + }, + { + "Name": "Wallet7311", + "ParticipationOnly": false + }, + { + "Name": "Wallet7312", + "ParticipationOnly": false + }, + { + "Name": "Wallet7313", + "ParticipationOnly": false + }, + { + "Name": "Wallet7314", + "ParticipationOnly": false + }, + { + "Name": "Wallet7315", + "ParticipationOnly": false + }, + { + "Name": "Wallet7316", + "ParticipationOnly": false + }, + { + "Name": "Wallet7317", + "ParticipationOnly": false + }, + { + "Name": "Wallet7318", + "ParticipationOnly": false + }, + { + "Name": "Wallet7319", + "ParticipationOnly": false + }, + { + "Name": "Wallet7320", + "ParticipationOnly": false + }, + { + "Name": "Wallet7321", + "ParticipationOnly": false + }, + { + "Name": "Wallet7322", + "ParticipationOnly": false + }, + { + "Name": "Wallet7323", + "ParticipationOnly": false + }, + { + "Name": "Wallet7324", + "ParticipationOnly": false + }, + { + "Name": "Wallet7325", + "ParticipationOnly": false + }, + { + "Name": "Wallet7326", + "ParticipationOnly": false + }, + { + "Name": "Wallet7327", + "ParticipationOnly": false + }, + { + "Name": "Wallet7328", + "ParticipationOnly": false + }, + { + "Name": "Wallet7329", + "ParticipationOnly": false + }, + { + "Name": "Wallet7330", + "ParticipationOnly": false + }, + { + "Name": "Wallet7331", + "ParticipationOnly": false + }, + { + "Name": "Wallet7332", + "ParticipationOnly": false + }, + { + "Name": "Wallet7333", + "ParticipationOnly": false + }, + { + "Name": "Wallet7334", + "ParticipationOnly": false + }, + { + "Name": "Wallet7335", + "ParticipationOnly": false + }, + { + "Name": "Wallet7336", + "ParticipationOnly": false + }, + { + "Name": "Wallet7337", + "ParticipationOnly": false + }, + { + "Name": "Wallet7338", + "ParticipationOnly": false + }, + { + "Name": "Wallet7339", + "ParticipationOnly": false + }, + { + "Name": "Wallet7340", + "ParticipationOnly": false + }, + { + "Name": "Wallet7341", + "ParticipationOnly": false + }, + { + "Name": "Wallet7342", + "ParticipationOnly": false + }, + { + "Name": "Wallet7343", + "ParticipationOnly": false + }, + { + "Name": "Wallet7344", + "ParticipationOnly": false + }, + { + "Name": "Wallet7345", + "ParticipationOnly": false + }, + { + "Name": "Wallet7346", + "ParticipationOnly": false + }, + { + "Name": "Wallet7347", + "ParticipationOnly": false + }, + { + "Name": "Wallet7348", + "ParticipationOnly": false + }, + { + "Name": "Wallet7349", + "ParticipationOnly": false + }, + { + "Name": "Wallet7350", + "ParticipationOnly": false + }, + { + "Name": "Wallet7351", + "ParticipationOnly": false + }, + { + "Name": "Wallet7352", + "ParticipationOnly": false + }, + { + "Name": "Wallet7353", + "ParticipationOnly": false + }, + { + "Name": "Wallet7354", + "ParticipationOnly": false + }, + { + "Name": "Wallet7355", + "ParticipationOnly": false + }, + { + "Name": "Wallet7356", + "ParticipationOnly": false + }, + { + "Name": "Wallet7357", + "ParticipationOnly": false + }, + { + "Name": "Wallet7358", + "ParticipationOnly": false + }, + { + "Name": "Wallet7359", + "ParticipationOnly": false + }, + { + "Name": "Wallet7360", + "ParticipationOnly": false + }, + { + "Name": "Wallet7361", + "ParticipationOnly": false + }, + { + "Name": "Wallet7362", + "ParticipationOnly": false + }, + { + "Name": "Wallet7363", + "ParticipationOnly": false + }, + { + "Name": "Wallet7364", + "ParticipationOnly": false + }, + { + "Name": "Wallet7365", + "ParticipationOnly": false + }, + { + "Name": "Wallet7366", + "ParticipationOnly": false + }, + { + "Name": "Wallet7367", + "ParticipationOnly": false + }, + { + "Name": "Wallet7368", + "ParticipationOnly": false + }, + { + "Name": "Wallet7369", + "ParticipationOnly": false + }, + { + "Name": "Wallet7370", + "ParticipationOnly": false + }, + { + "Name": "Wallet7371", + "ParticipationOnly": false + }, + { + "Name": "Wallet7372", + "ParticipationOnly": false + }, + { + "Name": "Wallet7373", + "ParticipationOnly": false + }, + { + "Name": "Wallet7374", + "ParticipationOnly": false + }, + { + "Name": "Wallet7375", + "ParticipationOnly": false + }, + { + "Name": "Wallet7376", + "ParticipationOnly": false + }, + { + "Name": "Wallet7377", + "ParticipationOnly": false + }, + { + "Name": "Wallet7378", + "ParticipationOnly": false + }, + { + "Name": "Wallet7379", + "ParticipationOnly": false + }, + { + "Name": "Wallet7380", + "ParticipationOnly": false + }, + { + "Name": "Wallet7381", + "ParticipationOnly": false + }, + { + "Name": "Wallet7382", + "ParticipationOnly": false + }, + { + "Name": "Wallet7383", + "ParticipationOnly": false + }, + { + "Name": "Wallet7384", + "ParticipationOnly": false + }, + { + "Name": "Wallet7385", + "ParticipationOnly": false + }, + { + "Name": "Wallet7386", + "ParticipationOnly": false + }, + { + "Name": "Wallet7387", + "ParticipationOnly": false + }, + { + "Name": "Wallet7388", + "ParticipationOnly": false + }, + { + "Name": "Wallet7389", + "ParticipationOnly": false + }, + { + "Name": "Wallet7390", + "ParticipationOnly": false + }, + { + "Name": "Wallet7391", + "ParticipationOnly": false + }, + { + "Name": "Wallet7392", + "ParticipationOnly": false + }, + { + "Name": "Wallet7393", + "ParticipationOnly": false + }, + { + "Name": "Wallet7394", + "ParticipationOnly": false + }, + { + "Name": "Wallet7395", + "ParticipationOnly": false + }, + { + "Name": "Wallet7396", + "ParticipationOnly": false + }, + { + "Name": "Wallet7397", + "ParticipationOnly": false + }, + { + "Name": "Wallet7398", + "ParticipationOnly": false + }, + { + "Name": "Wallet7399", + "ParticipationOnly": false + }, + { + "Name": "Wallet7400", + "ParticipationOnly": false + }, + { + "Name": "Wallet7401", + "ParticipationOnly": false + }, + { + "Name": "Wallet7402", + "ParticipationOnly": false + }, + { + "Name": "Wallet7403", + "ParticipationOnly": false + }, + { + "Name": "Wallet7404", + "ParticipationOnly": false + }, + { + "Name": "Wallet7405", + "ParticipationOnly": false + }, + { + "Name": "Wallet7406", + "ParticipationOnly": false + }, + { + "Name": "Wallet7407", + "ParticipationOnly": false + }, + { + "Name": "Wallet7408", + "ParticipationOnly": false + }, + { + "Name": "Wallet7409", + "ParticipationOnly": false + }, + { + "Name": "Wallet7410", + "ParticipationOnly": false + }, + { + "Name": "Wallet7411", + "ParticipationOnly": false + }, + { + "Name": "Wallet7412", + "ParticipationOnly": false + }, + { + "Name": "Wallet7413", + "ParticipationOnly": false + }, + { + "Name": "Wallet7414", + "ParticipationOnly": false + }, + { + "Name": "Wallet7415", + "ParticipationOnly": false + }, + { + "Name": "Wallet7416", + "ParticipationOnly": false + }, + { + "Name": "Wallet7417", + "ParticipationOnly": false + }, + { + "Name": "Wallet7418", + "ParticipationOnly": false + }, + { + "Name": "Wallet7419", + "ParticipationOnly": false + }, + { + "Name": "Wallet7420", + "ParticipationOnly": false + }, + { + "Name": "Wallet7421", + "ParticipationOnly": false + }, + { + "Name": "Wallet7422", + "ParticipationOnly": false + }, + { + "Name": "Wallet7423", + "ParticipationOnly": false + }, + { + "Name": "Wallet7424", + "ParticipationOnly": false + }, + { + "Name": "Wallet7425", + "ParticipationOnly": false + }, + { + "Name": "Wallet7426", + "ParticipationOnly": false + }, + { + "Name": "Wallet7427", + "ParticipationOnly": false + }, + { + "Name": "Wallet7428", + "ParticipationOnly": false + }, + { + "Name": "Wallet7429", + "ParticipationOnly": false + }, + { + "Name": "Wallet7430", + "ParticipationOnly": false + }, + { + "Name": "Wallet7431", + "ParticipationOnly": false + }, + { + "Name": "Wallet7432", + "ParticipationOnly": false + }, + { + "Name": "Wallet7433", + "ParticipationOnly": false + }, + { + "Name": "Wallet7434", + "ParticipationOnly": false + }, + { + "Name": "Wallet7435", + "ParticipationOnly": false + }, + { + "Name": "Wallet7436", + "ParticipationOnly": false + }, + { + "Name": "Wallet7437", + "ParticipationOnly": false + }, + { + "Name": "Wallet7438", + "ParticipationOnly": false + }, + { + "Name": "Wallet7439", + "ParticipationOnly": false + }, + { + "Name": "Wallet7440", + "ParticipationOnly": false + }, + { + "Name": "Wallet7441", + "ParticipationOnly": false + }, + { + "Name": "Wallet7442", + "ParticipationOnly": false + }, + { + "Name": "Wallet7443", + "ParticipationOnly": false + }, + { + "Name": "Wallet7444", + "ParticipationOnly": false + }, + { + "Name": "Wallet7445", + "ParticipationOnly": false + }, + { + "Name": "Wallet7446", + "ParticipationOnly": false + }, + { + "Name": "Wallet7447", + "ParticipationOnly": false + }, + { + "Name": "Wallet7448", + "ParticipationOnly": false + }, + { + "Name": "Wallet7449", + "ParticipationOnly": false + }, + { + "Name": "Wallet7450", + "ParticipationOnly": false + }, + { + "Name": "Wallet7451", + "ParticipationOnly": false + }, + { + "Name": "Wallet7452", + "ParticipationOnly": false + }, + { + "Name": "Wallet7453", + "ParticipationOnly": false + }, + { + "Name": "Wallet7454", + "ParticipationOnly": false + }, + { + "Name": "Wallet7455", + "ParticipationOnly": false + }, + { + "Name": "Wallet7456", + "ParticipationOnly": false + }, + { + "Name": "Wallet7457", + "ParticipationOnly": false + }, + { + "Name": "Wallet7458", + "ParticipationOnly": false + }, + { + "Name": "Wallet7459", + "ParticipationOnly": false + }, + { + "Name": "Wallet7460", + "ParticipationOnly": false + }, + { + "Name": "Wallet7461", + "ParticipationOnly": false + }, + { + "Name": "Wallet7462", + "ParticipationOnly": false + }, + { + "Name": "Wallet7463", + "ParticipationOnly": false + }, + { + "Name": "Wallet7464", + "ParticipationOnly": false + }, + { + "Name": "Wallet7465", + "ParticipationOnly": false + }, + { + "Name": "Wallet7466", + "ParticipationOnly": false + }, + { + "Name": "Wallet7467", + "ParticipationOnly": false + }, + { + "Name": "Wallet7468", + "ParticipationOnly": false + }, + { + "Name": "Wallet7469", + "ParticipationOnly": false + }, + { + "Name": "Wallet7470", + "ParticipationOnly": false + }, + { + "Name": "Wallet7471", + "ParticipationOnly": false + }, + { + "Name": "Wallet7472", + "ParticipationOnly": false + }, + { + "Name": "Wallet7473", + "ParticipationOnly": false + }, + { + "Name": "Wallet7474", + "ParticipationOnly": false + }, + { + "Name": "Wallet7475", + "ParticipationOnly": false + }, + { + "Name": "Wallet7476", + "ParticipationOnly": false + }, + { + "Name": "Wallet7477", + "ParticipationOnly": false + }, + { + "Name": "Wallet7478", + "ParticipationOnly": false + }, + { + "Name": "Wallet7479", + "ParticipationOnly": false + }, + { + "Name": "Wallet7480", + "ParticipationOnly": false + }, + { + "Name": "Wallet7481", + "ParticipationOnly": false + }, + { + "Name": "Wallet7482", + "ParticipationOnly": false + }, + { + "Name": "Wallet7483", + "ParticipationOnly": false + }, + { + "Name": "Wallet7484", + "ParticipationOnly": false + }, + { + "Name": "Wallet7485", + "ParticipationOnly": false + }, + { + "Name": "Wallet7486", + "ParticipationOnly": false + }, + { + "Name": "Wallet7487", + "ParticipationOnly": false + }, + { + "Name": "Wallet7488", + "ParticipationOnly": false + }, + { + "Name": "Wallet7489", + "ParticipationOnly": false + }, + { + "Name": "Wallet7490", + "ParticipationOnly": false + }, + { + "Name": "Wallet7491", + "ParticipationOnly": false + }, + { + "Name": "Wallet7492", + "ParticipationOnly": false + }, + { + "Name": "Wallet7493", + "ParticipationOnly": false + }, + { + "Name": "Wallet7494", + "ParticipationOnly": false + }, + { + "Name": "Wallet7495", + "ParticipationOnly": false + }, + { + "Name": "Wallet7496", + "ParticipationOnly": false + }, + { + "Name": "Wallet7497", + "ParticipationOnly": false + }, + { + "Name": "Wallet7498", + "ParticipationOnly": false + }, + { + "Name": "Wallet7499", + "ParticipationOnly": false + }, + { + "Name": "Wallet7500", + "ParticipationOnly": false + }, + { + "Name": "Wallet7501", + "ParticipationOnly": false + }, + { + "Name": "Wallet7502", + "ParticipationOnly": false + }, + { + "Name": "Wallet7503", + "ParticipationOnly": false + }, + { + "Name": "Wallet7504", + "ParticipationOnly": false + }, + { + "Name": "Wallet7505", + "ParticipationOnly": false + }, + { + "Name": "Wallet7506", + "ParticipationOnly": false + }, + { + "Name": "Wallet7507", + "ParticipationOnly": false + }, + { + "Name": "Wallet7508", + "ParticipationOnly": false + }, + { + "Name": "Wallet7509", + "ParticipationOnly": false + }, + { + "Name": "Wallet7510", + "ParticipationOnly": false + }, + { + "Name": "Wallet7511", + "ParticipationOnly": false + }, + { + "Name": "Wallet7512", + "ParticipationOnly": false + }, + { + "Name": "Wallet7513", + "ParticipationOnly": false + }, + { + "Name": "Wallet7514", + "ParticipationOnly": false + }, + { + "Name": "Wallet7515", + "ParticipationOnly": false + }, + { + "Name": "Wallet7516", + "ParticipationOnly": false + }, + { + "Name": "Wallet7517", + "ParticipationOnly": false + }, + { + "Name": "Wallet7518", + "ParticipationOnly": false + }, + { + "Name": "Wallet7519", + "ParticipationOnly": false + }, + { + "Name": "Wallet7520", + "ParticipationOnly": false + }, + { + "Name": "Wallet7521", + "ParticipationOnly": false + }, + { + "Name": "Wallet7522", + "ParticipationOnly": false + }, + { + "Name": "Wallet7523", + "ParticipationOnly": false + }, + { + "Name": "Wallet7524", + "ParticipationOnly": false + }, + { + "Name": "Wallet7525", + "ParticipationOnly": false + }, + { + "Name": "Wallet7526", + "ParticipationOnly": false + }, + { + "Name": "Wallet7527", + "ParticipationOnly": false + }, + { + "Name": "Wallet7528", + "ParticipationOnly": false + }, + { + "Name": "Wallet7529", + "ParticipationOnly": false + }, + { + "Name": "Wallet7530", + "ParticipationOnly": false + }, + { + "Name": "Wallet7531", + "ParticipationOnly": false + }, + { + "Name": "Wallet7532", + "ParticipationOnly": false + }, + { + "Name": "Wallet7533", + "ParticipationOnly": false + }, + { + "Name": "Wallet7534", + "ParticipationOnly": false + }, + { + "Name": "Wallet7535", + "ParticipationOnly": false + }, + { + "Name": "Wallet7536", + "ParticipationOnly": false + }, + { + "Name": "Wallet7537", + "ParticipationOnly": false + }, + { + "Name": "Wallet7538", + "ParticipationOnly": false + }, + { + "Name": "Wallet7539", + "ParticipationOnly": false + }, + { + "Name": "Wallet7540", + "ParticipationOnly": false + }, + { + "Name": "Wallet7541", + "ParticipationOnly": false + }, + { + "Name": "Wallet7542", + "ParticipationOnly": false + }, + { + "Name": "Wallet7543", + "ParticipationOnly": false + }, + { + "Name": "Wallet7544", + "ParticipationOnly": false + }, + { + "Name": "Wallet7545", + "ParticipationOnly": false + }, + { + "Name": "Wallet7546", + "ParticipationOnly": false + }, + { + "Name": "Wallet7547", + "ParticipationOnly": false + }, + { + "Name": "Wallet7548", + "ParticipationOnly": false + }, + { + "Name": "Wallet7549", + "ParticipationOnly": false + }, + { + "Name": "Wallet7550", + "ParticipationOnly": false + }, + { + "Name": "Wallet7551", + "ParticipationOnly": false + }, + { + "Name": "Wallet7552", + "ParticipationOnly": false + }, + { + "Name": "Wallet7553", + "ParticipationOnly": false + }, + { + "Name": "Wallet7554", + "ParticipationOnly": false + }, + { + "Name": "Wallet7555", + "ParticipationOnly": false + }, + { + "Name": "Wallet7556", + "ParticipationOnly": false + }, + { + "Name": "Wallet7557", + "ParticipationOnly": false + }, + { + "Name": "Wallet7558", + "ParticipationOnly": false + }, + { + "Name": "Wallet7559", + "ParticipationOnly": false + }, + { + "Name": "Wallet7560", + "ParticipationOnly": false + }, + { + "Name": "Wallet7561", + "ParticipationOnly": false + }, + { + "Name": "Wallet7562", + "ParticipationOnly": false + }, + { + "Name": "Wallet7563", + "ParticipationOnly": false + }, + { + "Name": "Wallet7564", + "ParticipationOnly": false + }, + { + "Name": "Wallet7565", + "ParticipationOnly": false + }, + { + "Name": "Wallet7566", + "ParticipationOnly": false + }, + { + "Name": "Wallet7567", + "ParticipationOnly": false + }, + { + "Name": "Wallet7568", + "ParticipationOnly": false + }, + { + "Name": "Wallet7569", + "ParticipationOnly": false + }, + { + "Name": "Wallet7570", + "ParticipationOnly": false + }, + { + "Name": "Wallet7571", + "ParticipationOnly": false + }, + { + "Name": "Wallet7572", + "ParticipationOnly": false + }, + { + "Name": "Wallet7573", + "ParticipationOnly": false + }, + { + "Name": "Wallet7574", + "ParticipationOnly": false + }, + { + "Name": "Wallet7575", + "ParticipationOnly": false + }, + { + "Name": "Wallet7576", + "ParticipationOnly": false + }, + { + "Name": "Wallet7577", + "ParticipationOnly": false + }, + { + "Name": "Wallet7578", + "ParticipationOnly": false + }, + { + "Name": "Wallet7579", + "ParticipationOnly": false + }, + { + "Name": "Wallet7580", + "ParticipationOnly": false + }, + { + "Name": "Wallet7581", + "ParticipationOnly": false + }, + { + "Name": "Wallet7582", + "ParticipationOnly": false + }, + { + "Name": "Wallet7583", + "ParticipationOnly": false + }, + { + "Name": "Wallet7584", + "ParticipationOnly": false + }, + { + "Name": "Wallet7585", + "ParticipationOnly": false + }, + { + "Name": "Wallet7586", + "ParticipationOnly": false + }, + { + "Name": "Wallet7587", + "ParticipationOnly": false + }, + { + "Name": "Wallet7588", + "ParticipationOnly": false + }, + { + "Name": "Wallet7589", + "ParticipationOnly": false + }, + { + "Name": "Wallet7590", + "ParticipationOnly": false + }, + { + "Name": "Wallet7591", + "ParticipationOnly": false + }, + { + "Name": "Wallet7592", + "ParticipationOnly": false + }, + { + "Name": "Wallet7593", + "ParticipationOnly": false + }, + { + "Name": "Wallet7594", + "ParticipationOnly": false + }, + { + "Name": "Wallet7595", + "ParticipationOnly": false + }, + { + "Name": "Wallet7596", + "ParticipationOnly": false + }, + { + "Name": "Wallet7597", + "ParticipationOnly": false + }, + { + "Name": "Wallet7598", + "ParticipationOnly": false + }, + { + "Name": "Wallet7599", + "ParticipationOnly": false + }, + { + "Name": "Wallet7600", + "ParticipationOnly": false + }, + { + "Name": "Wallet7601", + "ParticipationOnly": false + }, + { + "Name": "Wallet7602", + "ParticipationOnly": false + }, + { + "Name": "Wallet7603", + "ParticipationOnly": false + }, + { + "Name": "Wallet7604", + "ParticipationOnly": false + }, + { + "Name": "Wallet7605", + "ParticipationOnly": false + }, + { + "Name": "Wallet7606", + "ParticipationOnly": false + }, + { + "Name": "Wallet7607", + "ParticipationOnly": false + }, + { + "Name": "Wallet7608", + "ParticipationOnly": false + }, + { + "Name": "Wallet7609", + "ParticipationOnly": false + }, + { + "Name": "Wallet7610", + "ParticipationOnly": false + }, + { + "Name": "Wallet7611", + "ParticipationOnly": false + }, + { + "Name": "Wallet7612", + "ParticipationOnly": false + }, + { + "Name": "Wallet7613", + "ParticipationOnly": false + }, + { + "Name": "Wallet7614", + "ParticipationOnly": false + }, + { + "Name": "Wallet7615", + "ParticipationOnly": false + }, + { + "Name": "Wallet7616", + "ParticipationOnly": false + }, + { + "Name": "Wallet7617", + "ParticipationOnly": false + }, + { + "Name": "Wallet7618", + "ParticipationOnly": false + }, + { + "Name": "Wallet7619", + "ParticipationOnly": false + }, + { + "Name": "Wallet7620", + "ParticipationOnly": false + }, + { + "Name": "Wallet7621", + "ParticipationOnly": false + }, + { + "Name": "Wallet7622", + "ParticipationOnly": false + }, + { + "Name": "Wallet7623", + "ParticipationOnly": false + }, + { + "Name": "Wallet7624", + "ParticipationOnly": false + }, + { + "Name": "Wallet7625", + "ParticipationOnly": false + }, + { + "Name": "Wallet7626", + "ParticipationOnly": false + }, + { + "Name": "Wallet7627", + "ParticipationOnly": false + }, + { + "Name": "Wallet7628", + "ParticipationOnly": false + }, + { + "Name": "Wallet7629", + "ParticipationOnly": false + }, + { + "Name": "Wallet7630", + "ParticipationOnly": false + }, + { + "Name": "Wallet7631", + "ParticipationOnly": false + }, + { + "Name": "Wallet7632", + "ParticipationOnly": false + }, + { + "Name": "Wallet7633", + "ParticipationOnly": false + }, + { + "Name": "Wallet7634", + "ParticipationOnly": false + }, + { + "Name": "Wallet7635", + "ParticipationOnly": false + }, + { + "Name": "Wallet7636", + "ParticipationOnly": false + }, + { + "Name": "Wallet7637", + "ParticipationOnly": false + }, + { + "Name": "Wallet7638", + "ParticipationOnly": false + }, + { + "Name": "Wallet7639", + "ParticipationOnly": false + }, + { + "Name": "Wallet7640", + "ParticipationOnly": false + }, + { + "Name": "Wallet7641", + "ParticipationOnly": false + }, + { + "Name": "Wallet7642", + "ParticipationOnly": false + }, + { + "Name": "Wallet7643", + "ParticipationOnly": false + }, + { + "Name": "Wallet7644", + "ParticipationOnly": false + }, + { + "Name": "Wallet7645", + "ParticipationOnly": false + }, + { + "Name": "Wallet7646", + "ParticipationOnly": false + }, + { + "Name": "Wallet7647", + "ParticipationOnly": false + }, + { + "Name": "Wallet7648", + "ParticipationOnly": false + }, + { + "Name": "Wallet7649", + "ParticipationOnly": false + }, + { + "Name": "Wallet7650", + "ParticipationOnly": false + }, + { + "Name": "Wallet7651", + "ParticipationOnly": false + }, + { + "Name": "Wallet7652", + "ParticipationOnly": false + }, + { + "Name": "Wallet7653", + "ParticipationOnly": false + }, + { + "Name": "Wallet7654", + "ParticipationOnly": false + }, + { + "Name": "Wallet7655", + "ParticipationOnly": false + }, + { + "Name": "Wallet7656", + "ParticipationOnly": false + }, + { + "Name": "Wallet7657", + "ParticipationOnly": false + }, + { + "Name": "Wallet7658", + "ParticipationOnly": false + }, + { + "Name": "Wallet7659", + "ParticipationOnly": false + }, + { + "Name": "Wallet7660", + "ParticipationOnly": false + }, + { + "Name": "Wallet7661", + "ParticipationOnly": false + }, + { + "Name": "Wallet7662", + "ParticipationOnly": false + }, + { + "Name": "Wallet7663", + "ParticipationOnly": false + }, + { + "Name": "Wallet7664", + "ParticipationOnly": false + }, + { + "Name": "Wallet7665", + "ParticipationOnly": false + }, + { + "Name": "Wallet7666", + "ParticipationOnly": false + }, + { + "Name": "Wallet7667", + "ParticipationOnly": false + }, + { + "Name": "Wallet7668", + "ParticipationOnly": false + }, + { + "Name": "Wallet7669", + "ParticipationOnly": false + }, + { + "Name": "Wallet7670", + "ParticipationOnly": false + }, + { + "Name": "Wallet7671", + "ParticipationOnly": false + }, + { + "Name": "Wallet7672", + "ParticipationOnly": false + }, + { + "Name": "Wallet7673", + "ParticipationOnly": false + }, + { + "Name": "Wallet7674", + "ParticipationOnly": false + }, + { + "Name": "Wallet7675", + "ParticipationOnly": false + }, + { + "Name": "Wallet7676", + "ParticipationOnly": false + }, + { + "Name": "Wallet7677", + "ParticipationOnly": false + }, + { + "Name": "Wallet7678", + "ParticipationOnly": false + }, + { + "Name": "Wallet7679", + "ParticipationOnly": false + }, + { + "Name": "Wallet7680", + "ParticipationOnly": false + }, + { + "Name": "Wallet7681", + "ParticipationOnly": false + }, + { + "Name": "Wallet7682", + "ParticipationOnly": false + }, + { + "Name": "Wallet7683", + "ParticipationOnly": false + }, + { + "Name": "Wallet7684", + "ParticipationOnly": false + }, + { + "Name": "Wallet7685", + "ParticipationOnly": false + }, + { + "Name": "Wallet7686", + "ParticipationOnly": false + }, + { + "Name": "Wallet7687", + "ParticipationOnly": false + }, + { + "Name": "Wallet7688", + "ParticipationOnly": false + }, + { + "Name": "Wallet7689", + "ParticipationOnly": false + }, + { + "Name": "Wallet7690", + "ParticipationOnly": false + }, + { + "Name": "Wallet7691", + "ParticipationOnly": false + }, + { + "Name": "Wallet7692", + "ParticipationOnly": false + }, + { + "Name": "Wallet7693", + "ParticipationOnly": false + }, + { + "Name": "Wallet7694", + "ParticipationOnly": false + }, + { + "Name": "Wallet7695", + "ParticipationOnly": false + }, + { + "Name": "Wallet7696", + "ParticipationOnly": false + }, + { + "Name": "Wallet7697", + "ParticipationOnly": false + }, + { + "Name": "Wallet7698", + "ParticipationOnly": false + }, + { + "Name": "Wallet7699", + "ParticipationOnly": false + }, + { + "Name": "Wallet7700", + "ParticipationOnly": false + }, + { + "Name": "Wallet7701", + "ParticipationOnly": false + }, + { + "Name": "Wallet7702", + "ParticipationOnly": false + }, + { + "Name": "Wallet7703", + "ParticipationOnly": false + }, + { + "Name": "Wallet7704", + "ParticipationOnly": false + }, + { + "Name": "Wallet7705", + "ParticipationOnly": false + }, + { + "Name": "Wallet7706", + "ParticipationOnly": false + }, + { + "Name": "Wallet7707", + "ParticipationOnly": false + }, + { + "Name": "Wallet7708", + "ParticipationOnly": false + }, + { + "Name": "Wallet7709", + "ParticipationOnly": false + }, + { + "Name": "Wallet7710", + "ParticipationOnly": false + }, + { + "Name": "Wallet7711", + "ParticipationOnly": false + }, + { + "Name": "Wallet7712", + "ParticipationOnly": false + }, + { + "Name": "Wallet7713", + "ParticipationOnly": false + }, + { + "Name": "Wallet7714", + "ParticipationOnly": false + }, + { + "Name": "Wallet7715", + "ParticipationOnly": false + }, + { + "Name": "Wallet7716", + "ParticipationOnly": false + }, + { + "Name": "Wallet7717", + "ParticipationOnly": false + }, + { + "Name": "Wallet7718", + "ParticipationOnly": false + }, + { + "Name": "Wallet7719", + "ParticipationOnly": false + }, + { + "Name": "Wallet7720", + "ParticipationOnly": false + }, + { + "Name": "Wallet7721", + "ParticipationOnly": false + }, + { + "Name": "Wallet7722", + "ParticipationOnly": false + }, + { + "Name": "Wallet7723", + "ParticipationOnly": false + }, + { + "Name": "Wallet7724", + "ParticipationOnly": false + }, + { + "Name": "Wallet7725", + "ParticipationOnly": false + }, + { + "Name": "Wallet7726", + "ParticipationOnly": false + }, + { + "Name": "Wallet7727", + "ParticipationOnly": false + }, + { + "Name": "Wallet7728", + "ParticipationOnly": false + }, + { + "Name": "Wallet7729", + "ParticipationOnly": false + }, + { + "Name": "Wallet7730", + "ParticipationOnly": false + }, + { + "Name": "Wallet7731", + "ParticipationOnly": false + }, + { + "Name": "Wallet7732", + "ParticipationOnly": false + }, + { + "Name": "Wallet7733", + "ParticipationOnly": false + }, + { + "Name": "Wallet7734", + "ParticipationOnly": false + }, + { + "Name": "Wallet7735", + "ParticipationOnly": false + }, + { + "Name": "Wallet7736", + "ParticipationOnly": false + }, + { + "Name": "Wallet7737", + "ParticipationOnly": false + }, + { + "Name": "Wallet7738", + "ParticipationOnly": false + }, + { + "Name": "Wallet7739", + "ParticipationOnly": false + }, + { + "Name": "Wallet7740", + "ParticipationOnly": false + }, + { + "Name": "Wallet7741", + "ParticipationOnly": false + }, + { + "Name": "Wallet7742", + "ParticipationOnly": false + }, + { + "Name": "Wallet7743", + "ParticipationOnly": false + }, + { + "Name": "Wallet7744", + "ParticipationOnly": false + }, + { + "Name": "Wallet7745", + "ParticipationOnly": false + }, + { + "Name": "Wallet7746", + "ParticipationOnly": false + }, + { + "Name": "Wallet7747", + "ParticipationOnly": false + }, + { + "Name": "Wallet7748", + "ParticipationOnly": false + }, + { + "Name": "Wallet7749", + "ParticipationOnly": false + }, + { + "Name": "Wallet7750", + "ParticipationOnly": false + }, + { + "Name": "Wallet7751", + "ParticipationOnly": false + }, + { + "Name": "Wallet7752", + "ParticipationOnly": false + }, + { + "Name": "Wallet7753", + "ParticipationOnly": false + }, + { + "Name": "Wallet7754", + "ParticipationOnly": false + }, + { + "Name": "Wallet7755", + "ParticipationOnly": false + }, + { + "Name": "Wallet7756", + "ParticipationOnly": false + }, + { + "Name": "Wallet7757", + "ParticipationOnly": false + }, + { + "Name": "Wallet7758", + "ParticipationOnly": false + }, + { + "Name": "Wallet7759", + "ParticipationOnly": false + }, + { + "Name": "Wallet7760", + "ParticipationOnly": false + }, + { + "Name": "Wallet7761", + "ParticipationOnly": false + }, + { + "Name": "Wallet7762", + "ParticipationOnly": false + }, + { + "Name": "Wallet7763", + "ParticipationOnly": false + }, + { + "Name": "Wallet7764", + "ParticipationOnly": false + }, + { + "Name": "Wallet7765", + "ParticipationOnly": false + }, + { + "Name": "Wallet7766", + "ParticipationOnly": false + }, + { + "Name": "Wallet7767", + "ParticipationOnly": false + }, + { + "Name": "Wallet7768", + "ParticipationOnly": false + }, + { + "Name": "Wallet7769", + "ParticipationOnly": false + }, + { + "Name": "Wallet7770", + "ParticipationOnly": false + }, + { + "Name": "Wallet7771", + "ParticipationOnly": false + }, + { + "Name": "Wallet7772", + "ParticipationOnly": false + }, + { + "Name": "Wallet7773", + "ParticipationOnly": false + }, + { + "Name": "Wallet7774", + "ParticipationOnly": false + }, + { + "Name": "Wallet7775", + "ParticipationOnly": false + }, + { + "Name": "Wallet7776", + "ParticipationOnly": false + }, + { + "Name": "Wallet7777", + "ParticipationOnly": false + }, + { + "Name": "Wallet7778", + "ParticipationOnly": false + }, + { + "Name": "Wallet7779", + "ParticipationOnly": false + }, + { + "Name": "Wallet7780", + "ParticipationOnly": false + }, + { + "Name": "Wallet7781", + "ParticipationOnly": false + }, + { + "Name": "Wallet7782", + "ParticipationOnly": false + }, + { + "Name": "Wallet7783", + "ParticipationOnly": false + }, + { + "Name": "Wallet7784", + "ParticipationOnly": false + }, + { + "Name": "Wallet7785", + "ParticipationOnly": false + }, + { + "Name": "Wallet7786", + "ParticipationOnly": false + }, + { + "Name": "Wallet7787", + "ParticipationOnly": false + }, + { + "Name": "Wallet7788", + "ParticipationOnly": false + }, + { + "Name": "Wallet7789", + "ParticipationOnly": false + }, + { + "Name": "Wallet7790", + "ParticipationOnly": false + }, + { + "Name": "Wallet7791", + "ParticipationOnly": false + }, + { + "Name": "Wallet7792", + "ParticipationOnly": false + }, + { + "Name": "Wallet7793", + "ParticipationOnly": false + }, + { + "Name": "Wallet7794", + "ParticipationOnly": false + }, + { + "Name": "Wallet7795", + "ParticipationOnly": false + }, + { + "Name": "Wallet7796", + "ParticipationOnly": false + }, + { + "Name": "Wallet7797", + "ParticipationOnly": false + }, + { + "Name": "Wallet7798", + "ParticipationOnly": false + }, + { + "Name": "Wallet7799", + "ParticipationOnly": false + }, + { + "Name": "Wallet7800", + "ParticipationOnly": false + }, + { + "Name": "Wallet7801", + "ParticipationOnly": false + }, + { + "Name": "Wallet7802", + "ParticipationOnly": false + }, + { + "Name": "Wallet7803", + "ParticipationOnly": false + }, + { + "Name": "Wallet7804", + "ParticipationOnly": false + }, + { + "Name": "Wallet7805", + "ParticipationOnly": false + }, + { + "Name": "Wallet7806", + "ParticipationOnly": false + }, + { + "Name": "Wallet7807", + "ParticipationOnly": false + }, + { + "Name": "Wallet7808", + "ParticipationOnly": false + }, + { + "Name": "Wallet7809", + "ParticipationOnly": false + }, + { + "Name": "Wallet7810", + "ParticipationOnly": false + }, + { + "Name": "Wallet7811", + "ParticipationOnly": false + }, + { + "Name": "Wallet7812", + "ParticipationOnly": false + }, + { + "Name": "Wallet7813", + "ParticipationOnly": false + }, + { + "Name": "Wallet7814", + "ParticipationOnly": false + }, + { + "Name": "Wallet7815", + "ParticipationOnly": false + }, + { + "Name": "Wallet7816", + "ParticipationOnly": false + }, + { + "Name": "Wallet7817", + "ParticipationOnly": false + }, + { + "Name": "Wallet7818", + "ParticipationOnly": false + }, + { + "Name": "Wallet7819", + "ParticipationOnly": false + }, + { + "Name": "Wallet7820", + "ParticipationOnly": false + }, + { + "Name": "Wallet7821", + "ParticipationOnly": false + }, + { + "Name": "Wallet7822", + "ParticipationOnly": false + }, + { + "Name": "Wallet7823", + "ParticipationOnly": false + }, + { + "Name": "Wallet7824", + "ParticipationOnly": false + }, + { + "Name": "Wallet7825", + "ParticipationOnly": false + }, + { + "Name": "Wallet7826", + "ParticipationOnly": false + }, + { + "Name": "Wallet7827", + "ParticipationOnly": false + }, + { + "Name": "Wallet7828", + "ParticipationOnly": false + }, + { + "Name": "Wallet7829", + "ParticipationOnly": false + }, + { + "Name": "Wallet7830", + "ParticipationOnly": false + }, + { + "Name": "Wallet7831", + "ParticipationOnly": false + }, + { + "Name": "Wallet7832", + "ParticipationOnly": false + }, + { + "Name": "Wallet7833", + "ParticipationOnly": false + }, + { + "Name": "Wallet7834", + "ParticipationOnly": false + }, + { + "Name": "Wallet7835", + "ParticipationOnly": false + }, + { + "Name": "Wallet7836", + "ParticipationOnly": false + }, + { + "Name": "Wallet7837", + "ParticipationOnly": false + }, + { + "Name": "Wallet7838", + "ParticipationOnly": false + }, + { + "Name": "Wallet7839", + "ParticipationOnly": false + }, + { + "Name": "Wallet7840", + "ParticipationOnly": false + }, + { + "Name": "Wallet7841", + "ParticipationOnly": false + }, + { + "Name": "Wallet7842", + "ParticipationOnly": false + }, + { + "Name": "Wallet7843", + "ParticipationOnly": false + }, + { + "Name": "Wallet7844", + "ParticipationOnly": false + }, + { + "Name": "Wallet7845", + "ParticipationOnly": false + }, + { + "Name": "Wallet7846", + "ParticipationOnly": false + }, + { + "Name": "Wallet7847", + "ParticipationOnly": false + }, + { + "Name": "Wallet7848", + "ParticipationOnly": false + }, + { + "Name": "Wallet7849", + "ParticipationOnly": false + }, + { + "Name": "Wallet7850", + "ParticipationOnly": false + }, + { + "Name": "Wallet7851", + "ParticipationOnly": false + }, + { + "Name": "Wallet7852", + "ParticipationOnly": false + }, + { + "Name": "Wallet7853", + "ParticipationOnly": false + }, + { + "Name": "Wallet7854", + "ParticipationOnly": false + }, + { + "Name": "Wallet7855", + "ParticipationOnly": false + }, + { + "Name": "Wallet7856", + "ParticipationOnly": false + }, + { + "Name": "Wallet7857", + "ParticipationOnly": false + }, + { + "Name": "Wallet7858", + "ParticipationOnly": false + }, + { + "Name": "Wallet7859", + "ParticipationOnly": false + }, + { + "Name": "Wallet7860", + "ParticipationOnly": false + }, + { + "Name": "Wallet7861", + "ParticipationOnly": false + }, + { + "Name": "Wallet7862", + "ParticipationOnly": false + }, + { + "Name": "Wallet7863", + "ParticipationOnly": false + }, + { + "Name": "Wallet7864", + "ParticipationOnly": false + }, + { + "Name": "Wallet7865", + "ParticipationOnly": false + }, + { + "Name": "Wallet7866", + "ParticipationOnly": false + }, + { + "Name": "Wallet7867", + "ParticipationOnly": false + }, + { + "Name": "Wallet7868", + "ParticipationOnly": false + }, + { + "Name": "Wallet7869", + "ParticipationOnly": false + }, + { + "Name": "Wallet7870", + "ParticipationOnly": false + }, + { + "Name": "Wallet7871", + "ParticipationOnly": false + }, + { + "Name": "Wallet7872", + "ParticipationOnly": false + }, + { + "Name": "Wallet7873", + "ParticipationOnly": false + }, + { + "Name": "Wallet7874", + "ParticipationOnly": false + }, + { + "Name": "Wallet7875", + "ParticipationOnly": false + }, + { + "Name": "Wallet7876", + "ParticipationOnly": false + }, + { + "Name": "Wallet7877", + "ParticipationOnly": false + }, + { + "Name": "Wallet7878", + "ParticipationOnly": false + }, + { + "Name": "Wallet7879", + "ParticipationOnly": false + }, + { + "Name": "Wallet7880", + "ParticipationOnly": false + }, + { + "Name": "Wallet7881", + "ParticipationOnly": false + }, + { + "Name": "Wallet7882", + "ParticipationOnly": false + }, + { + "Name": "Wallet7883", + "ParticipationOnly": false + }, + { + "Name": "Wallet7884", + "ParticipationOnly": false + }, + { + "Name": "Wallet7885", + "ParticipationOnly": false + }, + { + "Name": "Wallet7886", + "ParticipationOnly": false + }, + { + "Name": "Wallet7887", + "ParticipationOnly": false + }, + { + "Name": "Wallet7888", + "ParticipationOnly": false + }, + { + "Name": "Wallet7889", + "ParticipationOnly": false + }, + { + "Name": "Wallet7890", + "ParticipationOnly": false + }, + { + "Name": "Wallet7891", + "ParticipationOnly": false + }, + { + "Name": "Wallet7892", + "ParticipationOnly": false + }, + { + "Name": "Wallet7893", + "ParticipationOnly": false + }, + { + "Name": "Wallet7894", + "ParticipationOnly": false + }, + { + "Name": "Wallet7895", + "ParticipationOnly": false + }, + { + "Name": "Wallet7896", + "ParticipationOnly": false + }, + { + "Name": "Wallet7897", + "ParticipationOnly": false + }, + { + "Name": "Wallet7898", + "ParticipationOnly": false + }, + { + "Name": "Wallet7899", + "ParticipationOnly": false + }, + { + "Name": "Wallet7900", + "ParticipationOnly": false + }, + { + "Name": "Wallet7901", + "ParticipationOnly": false + }, + { + "Name": "Wallet7902", + "ParticipationOnly": false + }, + { + "Name": "Wallet7903", + "ParticipationOnly": false + }, + { + "Name": "Wallet7904", + "ParticipationOnly": false + }, + { + "Name": "Wallet7905", + "ParticipationOnly": false + }, + { + "Name": "Wallet7906", + "ParticipationOnly": false + }, + { + "Name": "Wallet7907", + "ParticipationOnly": false + }, + { + "Name": "Wallet7908", + "ParticipationOnly": false + }, + { + "Name": "Wallet7909", + "ParticipationOnly": false + }, + { + "Name": "Wallet7910", + "ParticipationOnly": false + }, + { + "Name": "Wallet7911", + "ParticipationOnly": false + }, + { + "Name": "Wallet7912", + "ParticipationOnly": false + }, + { + "Name": "Wallet7913", + "ParticipationOnly": false + }, + { + "Name": "Wallet7914", + "ParticipationOnly": false + }, + { + "Name": "Wallet7915", + "ParticipationOnly": false + }, + { + "Name": "Wallet7916", + "ParticipationOnly": false + }, + { + "Name": "Wallet7917", + "ParticipationOnly": false + }, + { + "Name": "Wallet7918", + "ParticipationOnly": false + }, + { + "Name": "Wallet7919", + "ParticipationOnly": false + }, + { + "Name": "Wallet7920", + "ParticipationOnly": false + }, + { + "Name": "Wallet7921", + "ParticipationOnly": false + }, + { + "Name": "Wallet7922", + "ParticipationOnly": false + }, + { + "Name": "Wallet7923", + "ParticipationOnly": false + }, + { + "Name": "Wallet7924", + "ParticipationOnly": false + }, + { + "Name": "Wallet7925", + "ParticipationOnly": false + }, + { + "Name": "Wallet7926", + "ParticipationOnly": false + }, + { + "Name": "Wallet7927", + "ParticipationOnly": false + }, + { + "Name": "Wallet7928", + "ParticipationOnly": false + }, + { + "Name": "Wallet7929", + "ParticipationOnly": false + }, + { + "Name": "Wallet7930", + "ParticipationOnly": false + }, + { + "Name": "Wallet7931", + "ParticipationOnly": false + }, + { + "Name": "Wallet7932", + "ParticipationOnly": false + }, + { + "Name": "Wallet7933", + "ParticipationOnly": false + }, + { + "Name": "Wallet7934", + "ParticipationOnly": false + }, + { + "Name": "Wallet7935", + "ParticipationOnly": false + }, + { + "Name": "Wallet7936", + "ParticipationOnly": false + }, + { + "Name": "Wallet7937", + "ParticipationOnly": false + }, + { + "Name": "Wallet7938", + "ParticipationOnly": false + }, + { + "Name": "Wallet7939", + "ParticipationOnly": false + }, + { + "Name": "Wallet7940", + "ParticipationOnly": false + }, + { + "Name": "Wallet7941", + "ParticipationOnly": false + }, + { + "Name": "Wallet7942", + "ParticipationOnly": false + }, + { + "Name": "Wallet7943", + "ParticipationOnly": false + }, + { + "Name": "Wallet7944", + "ParticipationOnly": false + }, + { + "Name": "Wallet7945", + "ParticipationOnly": false + }, + { + "Name": "Wallet7946", + "ParticipationOnly": false + }, + { + "Name": "Wallet7947", + "ParticipationOnly": false + }, + { + "Name": "Wallet7948", + "ParticipationOnly": false + }, + { + "Name": "Wallet7949", + "ParticipationOnly": false + }, + { + "Name": "Wallet7950", + "ParticipationOnly": false + }, + { + "Name": "Wallet7951", + "ParticipationOnly": false + }, + { + "Name": "Wallet7952", + "ParticipationOnly": false + }, + { + "Name": "Wallet7953", + "ParticipationOnly": false + }, + { + "Name": "Wallet7954", + "ParticipationOnly": false + }, + { + "Name": "Wallet7955", + "ParticipationOnly": false + }, + { + "Name": "Wallet7956", + "ParticipationOnly": false + }, + { + "Name": "Wallet7957", + "ParticipationOnly": false + }, + { + "Name": "Wallet7958", + "ParticipationOnly": false + }, + { + "Name": "Wallet7959", + "ParticipationOnly": false + }, + { + "Name": "Wallet7960", + "ParticipationOnly": false + }, + { + "Name": "Wallet7961", + "ParticipationOnly": false + }, + { + "Name": "Wallet7962", + "ParticipationOnly": false + }, + { + "Name": "Wallet7963", + "ParticipationOnly": false + }, + { + "Name": "Wallet7964", + "ParticipationOnly": false + }, + { + "Name": "Wallet7965", + "ParticipationOnly": false + }, + { + "Name": "Wallet7966", + "ParticipationOnly": false + }, + { + "Name": "Wallet7967", + "ParticipationOnly": false + }, + { + "Name": "Wallet7968", + "ParticipationOnly": false + }, + { + "Name": "Wallet7969", + "ParticipationOnly": false + }, + { + "Name": "Wallet7970", + "ParticipationOnly": false + }, + { + "Name": "Wallet7971", + "ParticipationOnly": false + }, + { + "Name": "Wallet7972", + "ParticipationOnly": false + }, + { + "Name": "Wallet7973", + "ParticipationOnly": false + }, + { + "Name": "Wallet7974", + "ParticipationOnly": false + }, + { + "Name": "Wallet7975", + "ParticipationOnly": false + }, + { + "Name": "Wallet7976", + "ParticipationOnly": false + }, + { + "Name": "Wallet7977", + "ParticipationOnly": false + }, + { + "Name": "Wallet7978", + "ParticipationOnly": false + }, + { + "Name": "Wallet7979", + "ParticipationOnly": false + }, + { + "Name": "Wallet7980", + "ParticipationOnly": false + }, + { + "Name": "Wallet7981", + "ParticipationOnly": false + }, + { + "Name": "Wallet7982", + "ParticipationOnly": false + }, + { + "Name": "Wallet7983", + "ParticipationOnly": false + }, + { + "Name": "Wallet7984", + "ParticipationOnly": false + }, + { + "Name": "Wallet7985", + "ParticipationOnly": false + }, + { + "Name": "Wallet7986", + "ParticipationOnly": false + }, + { + "Name": "Wallet7987", + "ParticipationOnly": false + }, + { + "Name": "Wallet7988", + "ParticipationOnly": false + }, + { + "Name": "Wallet7989", + "ParticipationOnly": false + }, + { + "Name": "Wallet7990", + "ParticipationOnly": false + }, + { + "Name": "Wallet7991", + "ParticipationOnly": false + }, + { + "Name": "Wallet7992", + "ParticipationOnly": false + }, + { + "Name": "Wallet7993", + "ParticipationOnly": false + }, + { + "Name": "Wallet7994", + "ParticipationOnly": false + }, + { + "Name": "Wallet7995", + "ParticipationOnly": false + }, + { + "Name": "Wallet7996", + "ParticipationOnly": false + }, + { + "Name": "Wallet7997", + "ParticipationOnly": false + }, + { + "Name": "Wallet7998", + "ParticipationOnly": false + }, + { + "Name": "Wallet7999", + "ParticipationOnly": false + }, + { + "Name": "Wallet8000", + "ParticipationOnly": false + }, + { + "Name": "Wallet8001", + "ParticipationOnly": false + }, + { + "Name": "Wallet8002", + "ParticipationOnly": false + }, + { + "Name": "Wallet8003", + "ParticipationOnly": false + }, + { + "Name": "Wallet8004", + "ParticipationOnly": false + }, + { + "Name": "Wallet8005", + "ParticipationOnly": false + }, + { + "Name": "Wallet8006", + "ParticipationOnly": false + }, + { + "Name": "Wallet8007", + "ParticipationOnly": false + }, + { + "Name": "Wallet8008", + "ParticipationOnly": false + }, + { + "Name": "Wallet8009", + "ParticipationOnly": false + }, + { + "Name": "Wallet8010", + "ParticipationOnly": false + }, + { + "Name": "Wallet8011", + "ParticipationOnly": false + }, + { + "Name": "Wallet8012", + "ParticipationOnly": false + }, + { + "Name": "Wallet8013", + "ParticipationOnly": false + }, + { + "Name": "Wallet8014", + "ParticipationOnly": false + }, + { + "Name": "Wallet8015", + "ParticipationOnly": false + }, + { + "Name": "Wallet8016", + "ParticipationOnly": false + }, + { + "Name": "Wallet8017", + "ParticipationOnly": false + }, + { + "Name": "Wallet8018", + "ParticipationOnly": false + }, + { + "Name": "Wallet8019", + "ParticipationOnly": false + }, + { + "Name": "Wallet8020", + "ParticipationOnly": false + }, + { + "Name": "Wallet8021", + "ParticipationOnly": false + }, + { + "Name": "Wallet8022", + "ParticipationOnly": false + }, + { + "Name": "Wallet8023", + "ParticipationOnly": false + }, + { + "Name": "Wallet8024", + "ParticipationOnly": false + }, + { + "Name": "Wallet8025", + "ParticipationOnly": false + }, + { + "Name": "Wallet8026", + "ParticipationOnly": false + }, + { + "Name": "Wallet8027", + "ParticipationOnly": false + }, + { + "Name": "Wallet8028", + "ParticipationOnly": false + }, + { + "Name": "Wallet8029", + "ParticipationOnly": false + }, + { + "Name": "Wallet8030", + "ParticipationOnly": false + }, + { + "Name": "Wallet8031", + "ParticipationOnly": false + }, + { + "Name": "Wallet8032", + "ParticipationOnly": false + }, + { + "Name": "Wallet8033", + "ParticipationOnly": false + }, + { + "Name": "Wallet8034", + "ParticipationOnly": false + }, + { + "Name": "Wallet8035", + "ParticipationOnly": false + }, + { + "Name": "Wallet8036", + "ParticipationOnly": false + }, + { + "Name": "Wallet8037", + "ParticipationOnly": false + }, + { + "Name": "Wallet8038", + "ParticipationOnly": false + }, + { + "Name": "Wallet8039", + "ParticipationOnly": false + }, + { + "Name": "Wallet8040", + "ParticipationOnly": false + }, + { + "Name": "Wallet8041", + "ParticipationOnly": false + }, + { + "Name": "Wallet8042", + "ParticipationOnly": false + }, + { + "Name": "Wallet8043", + "ParticipationOnly": false + }, + { + "Name": "Wallet8044", + "ParticipationOnly": false + }, + { + "Name": "Wallet8045", + "ParticipationOnly": false + }, + { + "Name": "Wallet8046", + "ParticipationOnly": false + }, + { + "Name": "Wallet8047", + "ParticipationOnly": false + }, + { + "Name": "Wallet8048", + "ParticipationOnly": false + }, + { + "Name": "Wallet8049", + "ParticipationOnly": false + }, + { + "Name": "Wallet8050", + "ParticipationOnly": false + }, + { + "Name": "Wallet8051", + "ParticipationOnly": false + }, + { + "Name": "Wallet8052", + "ParticipationOnly": false + }, + { + "Name": "Wallet8053", + "ParticipationOnly": false + }, + { + "Name": "Wallet8054", + "ParticipationOnly": false + }, + { + "Name": "Wallet8055", + "ParticipationOnly": false + }, + { + "Name": "Wallet8056", + "ParticipationOnly": false + }, + { + "Name": "Wallet8057", + "ParticipationOnly": false + }, + { + "Name": "Wallet8058", + "ParticipationOnly": false + }, + { + "Name": "Wallet8059", + "ParticipationOnly": false + }, + { + "Name": "Wallet8060", + "ParticipationOnly": false + }, + { + "Name": "Wallet8061", + "ParticipationOnly": false + }, + { + "Name": "Wallet8062", + "ParticipationOnly": false + }, + { + "Name": "Wallet8063", + "ParticipationOnly": false + }, + { + "Name": "Wallet8064", + "ParticipationOnly": false + }, + { + "Name": "Wallet8065", + "ParticipationOnly": false + }, + { + "Name": "Wallet8066", + "ParticipationOnly": false + }, + { + "Name": "Wallet8067", + "ParticipationOnly": false + }, + { + "Name": "Wallet8068", + "ParticipationOnly": false + }, + { + "Name": "Wallet8069", + "ParticipationOnly": false + }, + { + "Name": "Wallet8070", + "ParticipationOnly": false + }, + { + "Name": "Wallet8071", + "ParticipationOnly": false + }, + { + "Name": "Wallet8072", + "ParticipationOnly": false + }, + { + "Name": "Wallet8073", + "ParticipationOnly": false + }, + { + "Name": "Wallet8074", + "ParticipationOnly": false + }, + { + "Name": "Wallet8075", + "ParticipationOnly": false + }, + { + "Name": "Wallet8076", + "ParticipationOnly": false + }, + { + "Name": "Wallet8077", + "ParticipationOnly": false + }, + { + "Name": "Wallet8078", + "ParticipationOnly": false + }, + { + "Name": "Wallet8079", + "ParticipationOnly": false + }, + { + "Name": "Wallet8080", + "ParticipationOnly": false + }, + { + "Name": "Wallet8081", + "ParticipationOnly": false + }, + { + "Name": "Wallet8082", + "ParticipationOnly": false + }, + { + "Name": "Wallet8083", + "ParticipationOnly": false + }, + { + "Name": "Wallet8084", + "ParticipationOnly": false + }, + { + "Name": "Wallet8085", + "ParticipationOnly": false + }, + { + "Name": "Wallet8086", + "ParticipationOnly": false + }, + { + "Name": "Wallet8087", + "ParticipationOnly": false + }, + { + "Name": "Wallet8088", + "ParticipationOnly": false + }, + { + "Name": "Wallet8089", + "ParticipationOnly": false + }, + { + "Name": "Wallet8090", + "ParticipationOnly": false + }, + { + "Name": "Wallet8091", + "ParticipationOnly": false + }, + { + "Name": "Wallet8092", + "ParticipationOnly": false + }, + { + "Name": "Wallet8093", + "ParticipationOnly": false + }, + { + "Name": "Wallet8094", + "ParticipationOnly": false + }, + { + "Name": "Wallet8095", + "ParticipationOnly": false + }, + { + "Name": "Wallet8096", + "ParticipationOnly": false + }, + { + "Name": "Wallet8097", + "ParticipationOnly": false + }, + { + "Name": "Wallet8098", + "ParticipationOnly": false + }, + { + "Name": "Wallet8099", + "ParticipationOnly": false + }, + { + "Name": "Wallet8100", + "ParticipationOnly": false + }, + { + "Name": "Wallet8101", + "ParticipationOnly": false + }, + { + "Name": "Wallet8102", + "ParticipationOnly": false + }, + { + "Name": "Wallet8103", + "ParticipationOnly": false + }, + { + "Name": "Wallet8104", + "ParticipationOnly": false + }, + { + "Name": "Wallet8105", + "ParticipationOnly": false + }, + { + "Name": "Wallet8106", + "ParticipationOnly": false + }, + { + "Name": "Wallet8107", + "ParticipationOnly": false + }, + { + "Name": "Wallet8108", + "ParticipationOnly": false + }, + { + "Name": "Wallet8109", + "ParticipationOnly": false + }, + { + "Name": "Wallet8110", + "ParticipationOnly": false + }, + { + "Name": "Wallet8111", + "ParticipationOnly": false + }, + { + "Name": "Wallet8112", + "ParticipationOnly": false + }, + { + "Name": "Wallet8113", + "ParticipationOnly": false + }, + { + "Name": "Wallet8114", + "ParticipationOnly": false + }, + { + "Name": "Wallet8115", + "ParticipationOnly": false + }, + { + "Name": "Wallet8116", + "ParticipationOnly": false + }, + { + "Name": "Wallet8117", + "ParticipationOnly": false + }, + { + "Name": "Wallet8118", + "ParticipationOnly": false + }, + { + "Name": "Wallet8119", + "ParticipationOnly": false + }, + { + "Name": "Wallet8120", + "ParticipationOnly": false + }, + { + "Name": "Wallet8121", + "ParticipationOnly": false + }, + { + "Name": "Wallet8122", + "ParticipationOnly": false + }, + { + "Name": "Wallet8123", + "ParticipationOnly": false + }, + { + "Name": "Wallet8124", + "ParticipationOnly": false + }, + { + "Name": "Wallet8125", + "ParticipationOnly": false + }, + { + "Name": "Wallet8126", + "ParticipationOnly": false + }, + { + "Name": "Wallet8127", + "ParticipationOnly": false + }, + { + "Name": "Wallet8128", + "ParticipationOnly": false + }, + { + "Name": "Wallet8129", + "ParticipationOnly": false + }, + { + "Name": "Wallet8130", + "ParticipationOnly": false + }, + { + "Name": "Wallet8131", + "ParticipationOnly": false + }, + { + "Name": "Wallet8132", + "ParticipationOnly": false + }, + { + "Name": "Wallet8133", + "ParticipationOnly": false + }, + { + "Name": "Wallet8134", + "ParticipationOnly": false + }, + { + "Name": "Wallet8135", + "ParticipationOnly": false + }, + { + "Name": "Wallet8136", + "ParticipationOnly": false + }, + { + "Name": "Wallet8137", + "ParticipationOnly": false + }, + { + "Name": "Wallet8138", + "ParticipationOnly": false + }, + { + "Name": "Wallet8139", + "ParticipationOnly": false + }, + { + "Name": "Wallet8140", + "ParticipationOnly": false + }, + { + "Name": "Wallet8141", + "ParticipationOnly": false + }, + { + "Name": "Wallet8142", + "ParticipationOnly": false + }, + { + "Name": "Wallet8143", + "ParticipationOnly": false + }, + { + "Name": "Wallet8144", + "ParticipationOnly": false + }, + { + "Name": "Wallet8145", + "ParticipationOnly": false + }, + { + "Name": "Wallet8146", + "ParticipationOnly": false + }, + { + "Name": "Wallet8147", + "ParticipationOnly": false + }, + { + "Name": "Wallet8148", + "ParticipationOnly": false + }, + { + "Name": "Wallet8149", + "ParticipationOnly": false + }, + { + "Name": "Wallet8150", + "ParticipationOnly": false + }, + { + "Name": "Wallet8151", + "ParticipationOnly": false + }, + { + "Name": "Wallet8152", + "ParticipationOnly": false + }, + { + "Name": "Wallet8153", + "ParticipationOnly": false + }, + { + "Name": "Wallet8154", + "ParticipationOnly": false + }, + { + "Name": "Wallet8155", + "ParticipationOnly": false + }, + { + "Name": "Wallet8156", + "ParticipationOnly": false + }, + { + "Name": "Wallet8157", + "ParticipationOnly": false + }, + { + "Name": "Wallet8158", + "ParticipationOnly": false + }, + { + "Name": "Wallet8159", + "ParticipationOnly": false + }, + { + "Name": "Wallet8160", + "ParticipationOnly": false + }, + { + "Name": "Wallet8161", + "ParticipationOnly": false + }, + { + "Name": "Wallet8162", + "ParticipationOnly": false + }, + { + "Name": "Wallet8163", + "ParticipationOnly": false + }, + { + "Name": "Wallet8164", + "ParticipationOnly": false + }, + { + "Name": "Wallet8165", + "ParticipationOnly": false + }, + { + "Name": "Wallet8166", + "ParticipationOnly": false + }, + { + "Name": "Wallet8167", + "ParticipationOnly": false + }, + { + "Name": "Wallet8168", + "ParticipationOnly": false + }, + { + "Name": "Wallet8169", + "ParticipationOnly": false + }, + { + "Name": "Wallet8170", + "ParticipationOnly": false + }, + { + "Name": "Wallet8171", + "ParticipationOnly": false + }, + { + "Name": "Wallet8172", + "ParticipationOnly": false + }, + { + "Name": "Wallet8173", + "ParticipationOnly": false + }, + { + "Name": "Wallet8174", + "ParticipationOnly": false + }, + { + "Name": "Wallet8175", + "ParticipationOnly": false + }, + { + "Name": "Wallet8176", + "ParticipationOnly": false + }, + { + "Name": "Wallet8177", + "ParticipationOnly": false + }, + { + "Name": "Wallet8178", + "ParticipationOnly": false + }, + { + "Name": "Wallet8179", + "ParticipationOnly": false + }, + { + "Name": "Wallet8180", + "ParticipationOnly": false + }, + { + "Name": "Wallet8181", + "ParticipationOnly": false + }, + { + "Name": "Wallet8182", + "ParticipationOnly": false + }, + { + "Name": "Wallet8183", + "ParticipationOnly": false + }, + { + "Name": "Wallet8184", + "ParticipationOnly": false + }, + { + "Name": "Wallet8185", + "ParticipationOnly": false + }, + { + "Name": "Wallet8186", + "ParticipationOnly": false + }, + { + "Name": "Wallet8187", + "ParticipationOnly": false + }, + { + "Name": "Wallet8188", + "ParticipationOnly": false + }, + { + "Name": "Wallet8189", + "ParticipationOnly": false + }, + { + "Name": "Wallet8190", + "ParticipationOnly": false + }, + { + "Name": "Wallet8191", + "ParticipationOnly": false + }, + { + "Name": "Wallet8192", + "ParticipationOnly": false + }, + { + "Name": "Wallet8193", + "ParticipationOnly": false + }, + { + "Name": "Wallet8194", + "ParticipationOnly": false + }, + { + "Name": "Wallet8195", + "ParticipationOnly": false + }, + { + "Name": "Wallet8196", + "ParticipationOnly": false + }, + { + "Name": "Wallet8197", + "ParticipationOnly": false + }, + { + "Name": "Wallet8198", + "ParticipationOnly": false + }, + { + "Name": "Wallet8199", + "ParticipationOnly": false + }, + { + "Name": "Wallet8200", + "ParticipationOnly": false + }, + { + "Name": "Wallet8201", + "ParticipationOnly": false + }, + { + "Name": "Wallet8202", + "ParticipationOnly": false + }, + { + "Name": "Wallet8203", + "ParticipationOnly": false + }, + { + "Name": "Wallet8204", + "ParticipationOnly": false + }, + { + "Name": "Wallet8205", + "ParticipationOnly": false + }, + { + "Name": "Wallet8206", + "ParticipationOnly": false + }, + { + "Name": "Wallet8207", + "ParticipationOnly": false + }, + { + "Name": "Wallet8208", + "ParticipationOnly": false + }, + { + "Name": "Wallet8209", + "ParticipationOnly": false + }, + { + "Name": "Wallet8210", + "ParticipationOnly": false + }, + { + "Name": "Wallet8211", + "ParticipationOnly": false + }, + { + "Name": "Wallet8212", + "ParticipationOnly": false + }, + { + "Name": "Wallet8213", + "ParticipationOnly": false + }, + { + "Name": "Wallet8214", + "ParticipationOnly": false + }, + { + "Name": "Wallet8215", + "ParticipationOnly": false + }, + { + "Name": "Wallet8216", + "ParticipationOnly": false + }, + { + "Name": "Wallet8217", + "ParticipationOnly": false + }, + { + "Name": "Wallet8218", + "ParticipationOnly": false + }, + { + "Name": "Wallet8219", + "ParticipationOnly": false + }, + { + "Name": "Wallet8220", + "ParticipationOnly": false + }, + { + "Name": "Wallet8221", + "ParticipationOnly": false + }, + { + "Name": "Wallet8222", + "ParticipationOnly": false + }, + { + "Name": "Wallet8223", + "ParticipationOnly": false + }, + { + "Name": "Wallet8224", + "ParticipationOnly": false + }, + { + "Name": "Wallet8225", + "ParticipationOnly": false + }, + { + "Name": "Wallet8226", + "ParticipationOnly": false + }, + { + "Name": "Wallet8227", + "ParticipationOnly": false + }, + { + "Name": "Wallet8228", + "ParticipationOnly": false + }, + { + "Name": "Wallet8229", + "ParticipationOnly": false + }, + { + "Name": "Wallet8230", + "ParticipationOnly": false + }, + { + "Name": "Wallet8231", + "ParticipationOnly": false + }, + { + "Name": "Wallet8232", + "ParticipationOnly": false + }, + { + "Name": "Wallet8233", + "ParticipationOnly": false + }, + { + "Name": "Wallet8234", + "ParticipationOnly": false + }, + { + "Name": "Wallet8235", + "ParticipationOnly": false + }, + { + "Name": "Wallet8236", + "ParticipationOnly": false + }, + { + "Name": "Wallet8237", + "ParticipationOnly": false + }, + { + "Name": "Wallet8238", + "ParticipationOnly": false + }, + { + "Name": "Wallet8239", + "ParticipationOnly": false + }, + { + "Name": "Wallet8240", + "ParticipationOnly": false + }, + { + "Name": "Wallet8241", + "ParticipationOnly": false + }, + { + "Name": "Wallet8242", + "ParticipationOnly": false + }, + { + "Name": "Wallet8243", + "ParticipationOnly": false + }, + { + "Name": "Wallet8244", + "ParticipationOnly": false + }, + { + "Name": "Wallet8245", + "ParticipationOnly": false + }, + { + "Name": "Wallet8246", + "ParticipationOnly": false + }, + { + "Name": "Wallet8247", + "ParticipationOnly": false + }, + { + "Name": "Wallet8248", + "ParticipationOnly": false + }, + { + "Name": "Wallet8249", + "ParticipationOnly": false + }, + { + "Name": "Wallet8250", + "ParticipationOnly": false + }, + { + "Name": "Wallet8251", + "ParticipationOnly": false + }, + { + "Name": "Wallet8252", + "ParticipationOnly": false + }, + { + "Name": "Wallet8253", + "ParticipationOnly": false + }, + { + "Name": "Wallet8254", + "ParticipationOnly": false + }, + { + "Name": "Wallet8255", + "ParticipationOnly": false + }, + { + "Name": "Wallet8256", + "ParticipationOnly": false + }, + { + "Name": "Wallet8257", + "ParticipationOnly": false + }, + { + "Name": "Wallet8258", + "ParticipationOnly": false + }, + { + "Name": "Wallet8259", + "ParticipationOnly": false + }, + { + "Name": "Wallet8260", + "ParticipationOnly": false + }, + { + "Name": "Wallet8261", + "ParticipationOnly": false + }, + { + "Name": "Wallet8262", + "ParticipationOnly": false + }, + { + "Name": "Wallet8263", + "ParticipationOnly": false + }, + { + "Name": "Wallet8264", + "ParticipationOnly": false + }, + { + "Name": "Wallet8265", + "ParticipationOnly": false + }, + { + "Name": "Wallet8266", + "ParticipationOnly": false + }, + { + "Name": "Wallet8267", + "ParticipationOnly": false + }, + { + "Name": "Wallet8268", + "ParticipationOnly": false + }, + { + "Name": "Wallet8269", + "ParticipationOnly": false + }, + { + "Name": "Wallet8270", + "ParticipationOnly": false + }, + { + "Name": "Wallet8271", + "ParticipationOnly": false + }, + { + "Name": "Wallet8272", + "ParticipationOnly": false + }, + { + "Name": "Wallet8273", + "ParticipationOnly": false + }, + { + "Name": "Wallet8274", + "ParticipationOnly": false + }, + { + "Name": "Wallet8275", + "ParticipationOnly": false + }, + { + "Name": "Wallet8276", + "ParticipationOnly": false + }, + { + "Name": "Wallet8277", + "ParticipationOnly": false + }, + { + "Name": "Wallet8278", + "ParticipationOnly": false + }, + { + "Name": "Wallet8279", + "ParticipationOnly": false + }, + { + "Name": "Wallet8280", + "ParticipationOnly": false + }, + { + "Name": "Wallet8281", + "ParticipationOnly": false + }, + { + "Name": "Wallet8282", + "ParticipationOnly": false + }, + { + "Name": "Wallet8283", + "ParticipationOnly": false + }, + { + "Name": "Wallet8284", + "ParticipationOnly": false + }, + { + "Name": "Wallet8285", + "ParticipationOnly": false + }, + { + "Name": "Wallet8286", + "ParticipationOnly": false + }, + { + "Name": "Wallet8287", + "ParticipationOnly": false + }, + { + "Name": "Wallet8288", + "ParticipationOnly": false + }, + { + "Name": "Wallet8289", + "ParticipationOnly": false + }, + { + "Name": "Wallet8290", + "ParticipationOnly": false + }, + { + "Name": "Wallet8291", + "ParticipationOnly": false + }, + { + "Name": "Wallet8292", + "ParticipationOnly": false + }, + { + "Name": "Wallet8293", + "ParticipationOnly": false + }, + { + "Name": "Wallet8294", + "ParticipationOnly": false + }, + { + "Name": "Wallet8295", + "ParticipationOnly": false + }, + { + "Name": "Wallet8296", + "ParticipationOnly": false + }, + { + "Name": "Wallet8297", + "ParticipationOnly": false + }, + { + "Name": "Wallet8298", + "ParticipationOnly": false + }, + { + "Name": "Wallet8299", + "ParticipationOnly": false + }, + { + "Name": "Wallet8300", + "ParticipationOnly": false + }, + { + "Name": "Wallet8301", + "ParticipationOnly": false + }, + { + "Name": "Wallet8302", + "ParticipationOnly": false + }, + { + "Name": "Wallet8303", + "ParticipationOnly": false + }, + { + "Name": "Wallet8304", + "ParticipationOnly": false + }, + { + "Name": "Wallet8305", + "ParticipationOnly": false + }, + { + "Name": "Wallet8306", + "ParticipationOnly": false + }, + { + "Name": "Wallet8307", + "ParticipationOnly": false + }, + { + "Name": "Wallet8308", + "ParticipationOnly": false + }, + { + "Name": "Wallet8309", + "ParticipationOnly": false + }, + { + "Name": "Wallet8310", + "ParticipationOnly": false + }, + { + "Name": "Wallet8311", + "ParticipationOnly": false + }, + { + "Name": "Wallet8312", + "ParticipationOnly": false + }, + { + "Name": "Wallet8313", + "ParticipationOnly": false + }, + { + "Name": "Wallet8314", + "ParticipationOnly": false + }, + { + "Name": "Wallet8315", + "ParticipationOnly": false + }, + { + "Name": "Wallet8316", + "ParticipationOnly": false + }, + { + "Name": "Wallet8317", + "ParticipationOnly": false + }, + { + "Name": "Wallet8318", + "ParticipationOnly": false + }, + { + "Name": "Wallet8319", + "ParticipationOnly": false + }, + { + "Name": "Wallet8320", + "ParticipationOnly": false + }, + { + "Name": "Wallet8321", + "ParticipationOnly": false + }, + { + "Name": "Wallet8322", + "ParticipationOnly": false + }, + { + "Name": "Wallet8323", + "ParticipationOnly": false + }, + { + "Name": "Wallet8324", + "ParticipationOnly": false + }, + { + "Name": "Wallet8325", + "ParticipationOnly": false + }, + { + "Name": "Wallet8326", + "ParticipationOnly": false + }, + { + "Name": "Wallet8327", + "ParticipationOnly": false + }, + { + "Name": "Wallet8328", + "ParticipationOnly": false + }, + { + "Name": "Wallet8329", + "ParticipationOnly": false + }, + { + "Name": "Wallet8330", + "ParticipationOnly": false + }, + { + "Name": "Wallet8331", + "ParticipationOnly": false + }, + { + "Name": "Wallet8332", + "ParticipationOnly": false + }, + { + "Name": "Wallet8333", + "ParticipationOnly": false + }, + { + "Name": "Wallet8334", + "ParticipationOnly": false + }, + { + "Name": "Wallet8335", + "ParticipationOnly": false + }, + { + "Name": "Wallet8336", + "ParticipationOnly": false + }, + { + "Name": "Wallet8337", + "ParticipationOnly": false + }, + { + "Name": "Wallet8338", + "ParticipationOnly": false + }, + { + "Name": "Wallet8339", + "ParticipationOnly": false + }, + { + "Name": "Wallet8340", + "ParticipationOnly": false + }, + { + "Name": "Wallet8341", + "ParticipationOnly": false + }, + { + "Name": "Wallet8342", + "ParticipationOnly": false + }, + { + "Name": "Wallet8343", + "ParticipationOnly": false + }, + { + "Name": "Wallet8344", + "ParticipationOnly": false + }, + { + "Name": "Wallet8345", + "ParticipationOnly": false + }, + { + "Name": "Wallet8346", + "ParticipationOnly": false + }, + { + "Name": "Wallet8347", + "ParticipationOnly": false + }, + { + "Name": "Wallet8348", + "ParticipationOnly": false + }, + { + "Name": "Wallet8349", + "ParticipationOnly": false + }, + { + "Name": "Wallet8350", + "ParticipationOnly": false + }, + { + "Name": "Wallet8351", + "ParticipationOnly": false + }, + { + "Name": "Wallet8352", + "ParticipationOnly": false + }, + { + "Name": "Wallet8353", + "ParticipationOnly": false + }, + { + "Name": "Wallet8354", + "ParticipationOnly": false + }, + { + "Name": "Wallet8355", + "ParticipationOnly": false + }, + { + "Name": "Wallet8356", + "ParticipationOnly": false + }, + { + "Name": "Wallet8357", + "ParticipationOnly": false + }, + { + "Name": "Wallet8358", + "ParticipationOnly": false + }, + { + "Name": "Wallet8359", + "ParticipationOnly": false + }, + { + "Name": "Wallet8360", + "ParticipationOnly": false + }, + { + "Name": "Wallet8361", + "ParticipationOnly": false + }, + { + "Name": "Wallet8362", + "ParticipationOnly": false + }, + { + "Name": "Wallet8363", + "ParticipationOnly": false + }, + { + "Name": "Wallet8364", + "ParticipationOnly": false + }, + { + "Name": "Wallet8365", + "ParticipationOnly": false + }, + { + "Name": "Wallet8366", + "ParticipationOnly": false + }, + { + "Name": "Wallet8367", + "ParticipationOnly": false + }, + { + "Name": "Wallet8368", + "ParticipationOnly": false + }, + { + "Name": "Wallet8369", + "ParticipationOnly": false + }, + { + "Name": "Wallet8370", + "ParticipationOnly": false + }, + { + "Name": "Wallet8371", + "ParticipationOnly": false + }, + { + "Name": "Wallet8372", + "ParticipationOnly": false + }, + { + "Name": "Wallet8373", + "ParticipationOnly": false + }, + { + "Name": "Wallet8374", + "ParticipationOnly": false + }, + { + "Name": "Wallet8375", + "ParticipationOnly": false + }, + { + "Name": "Wallet8376", + "ParticipationOnly": false + }, + { + "Name": "Wallet8377", + "ParticipationOnly": false + }, + { + "Name": "Wallet8378", + "ParticipationOnly": false + }, + { + "Name": "Wallet8379", + "ParticipationOnly": false + }, + { + "Name": "Wallet8380", + "ParticipationOnly": false + }, + { + "Name": "Wallet8381", + "ParticipationOnly": false + }, + { + "Name": "Wallet8382", + "ParticipationOnly": false + }, + { + "Name": "Wallet8383", + "ParticipationOnly": false + }, + { + "Name": "Wallet8384", + "ParticipationOnly": false + }, + { + "Name": "Wallet8385", + "ParticipationOnly": false + }, + { + "Name": "Wallet8386", + "ParticipationOnly": false + }, + { + "Name": "Wallet8387", + "ParticipationOnly": false + }, + { + "Name": "Wallet8388", + "ParticipationOnly": false + }, + { + "Name": "Wallet8389", + "ParticipationOnly": false + }, + { + "Name": "Wallet8390", + "ParticipationOnly": false + }, + { + "Name": "Wallet8391", + "ParticipationOnly": false + }, + { + "Name": "Wallet8392", + "ParticipationOnly": false + }, + { + "Name": "Wallet8393", + "ParticipationOnly": false + }, + { + "Name": "Wallet8394", + "ParticipationOnly": false + }, + { + "Name": "Wallet8395", + "ParticipationOnly": false + }, + { + "Name": "Wallet8396", + "ParticipationOnly": false + }, + { + "Name": "Wallet8397", + "ParticipationOnly": false + }, + { + "Name": "Wallet8398", + "ParticipationOnly": false + }, + { + "Name": "Wallet8399", + "ParticipationOnly": false + }, + { + "Name": "Wallet8400", + "ParticipationOnly": false + }, + { + "Name": "Wallet8401", + "ParticipationOnly": false + }, + { + "Name": "Wallet8402", + "ParticipationOnly": false + }, + { + "Name": "Wallet8403", + "ParticipationOnly": false + }, + { + "Name": "Wallet8404", + "ParticipationOnly": false + }, + { + "Name": "Wallet8405", + "ParticipationOnly": false + }, + { + "Name": "Wallet8406", + "ParticipationOnly": false + }, + { + "Name": "Wallet8407", + "ParticipationOnly": false + }, + { + "Name": "Wallet8408", + "ParticipationOnly": false + }, + { + "Name": "Wallet8409", + "ParticipationOnly": false + }, + { + "Name": "Wallet8410", + "ParticipationOnly": false + }, + { + "Name": "Wallet8411", + "ParticipationOnly": false + }, + { + "Name": "Wallet8412", + "ParticipationOnly": false + }, + { + "Name": "Wallet8413", + "ParticipationOnly": false + }, + { + "Name": "Wallet8414", + "ParticipationOnly": false + }, + { + "Name": "Wallet8415", + "ParticipationOnly": false + }, + { + "Name": "Wallet8416", + "ParticipationOnly": false + }, + { + "Name": "Wallet8417", + "ParticipationOnly": false + }, + { + "Name": "Wallet8418", + "ParticipationOnly": false + }, + { + "Name": "Wallet8419", + "ParticipationOnly": false + }, + { + "Name": "Wallet8420", + "ParticipationOnly": false + }, + { + "Name": "Wallet8421", + "ParticipationOnly": false + }, + { + "Name": "Wallet8422", + "ParticipationOnly": false + }, + { + "Name": "Wallet8423", + "ParticipationOnly": false + }, + { + "Name": "Wallet8424", + "ParticipationOnly": false + }, + { + "Name": "Wallet8425", + "ParticipationOnly": false + }, + { + "Name": "Wallet8426", + "ParticipationOnly": false + }, + { + "Name": "Wallet8427", + "ParticipationOnly": false + }, + { + "Name": "Wallet8428", + "ParticipationOnly": false + }, + { + "Name": "Wallet8429", + "ParticipationOnly": false + }, + { + "Name": "Wallet8430", + "ParticipationOnly": false + }, + { + "Name": "Wallet8431", + "ParticipationOnly": false + }, + { + "Name": "Wallet8432", + "ParticipationOnly": false + }, + { + "Name": "Wallet8433", + "ParticipationOnly": false + }, + { + "Name": "Wallet8434", + "ParticipationOnly": false + }, + { + "Name": "Wallet8435", + "ParticipationOnly": false + }, + { + "Name": "Wallet8436", + "ParticipationOnly": false + }, + { + "Name": "Wallet8437", + "ParticipationOnly": false + }, + { + "Name": "Wallet8438", + "ParticipationOnly": false + }, + { + "Name": "Wallet8439", + "ParticipationOnly": false + }, + { + "Name": "Wallet8440", + "ParticipationOnly": false + }, + { + "Name": "Wallet8441", + "ParticipationOnly": false + }, + { + "Name": "Wallet8442", + "ParticipationOnly": false + }, + { + "Name": "Wallet8443", + "ParticipationOnly": false + }, + { + "Name": "Wallet8444", + "ParticipationOnly": false + }, + { + "Name": "Wallet8445", + "ParticipationOnly": false + }, + { + "Name": "Wallet8446", + "ParticipationOnly": false + }, + { + "Name": "Wallet8447", + "ParticipationOnly": false + }, + { + "Name": "Wallet8448", + "ParticipationOnly": false + }, + { + "Name": "Wallet8449", + "ParticipationOnly": false + }, + { + "Name": "Wallet8450", + "ParticipationOnly": false + }, + { + "Name": "Wallet8451", + "ParticipationOnly": false + }, + { + "Name": "Wallet8452", + "ParticipationOnly": false + }, + { + "Name": "Wallet8453", + "ParticipationOnly": false + }, + { + "Name": "Wallet8454", + "ParticipationOnly": false + }, + { + "Name": "Wallet8455", + "ParticipationOnly": false + }, + { + "Name": "Wallet8456", + "ParticipationOnly": false + }, + { + "Name": "Wallet8457", + "ParticipationOnly": false + }, + { + "Name": "Wallet8458", + "ParticipationOnly": false + }, + { + "Name": "Wallet8459", + "ParticipationOnly": false + }, + { + "Name": "Wallet8460", + "ParticipationOnly": false + }, + { + "Name": "Wallet8461", + "ParticipationOnly": false + }, + { + "Name": "Wallet8462", + "ParticipationOnly": false + }, + { + "Name": "Wallet8463", + "ParticipationOnly": false + }, + { + "Name": "Wallet8464", + "ParticipationOnly": false + }, + { + "Name": "Wallet8465", + "ParticipationOnly": false + }, + { + "Name": "Wallet8466", + "ParticipationOnly": false + }, + { + "Name": "Wallet8467", + "ParticipationOnly": false + }, + { + "Name": "Wallet8468", + "ParticipationOnly": false + }, + { + "Name": "Wallet8469", + "ParticipationOnly": false + }, + { + "Name": "Wallet8470", + "ParticipationOnly": false + }, + { + "Name": "Wallet8471", + "ParticipationOnly": false + }, + { + "Name": "Wallet8472", + "ParticipationOnly": false + }, + { + "Name": "Wallet8473", + "ParticipationOnly": false + }, + { + "Name": "Wallet8474", + "ParticipationOnly": false + }, + { + "Name": "Wallet8475", + "ParticipationOnly": false + }, + { + "Name": "Wallet8476", + "ParticipationOnly": false + }, + { + "Name": "Wallet8477", + "ParticipationOnly": false + }, + { + "Name": "Wallet8478", + "ParticipationOnly": false + }, + { + "Name": "Wallet8479", + "ParticipationOnly": false + }, + { + "Name": "Wallet8480", + "ParticipationOnly": false + }, + { + "Name": "Wallet8481", + "ParticipationOnly": false + }, + { + "Name": "Wallet8482", + "ParticipationOnly": false + }, + { + "Name": "Wallet8483", + "ParticipationOnly": false + }, + { + "Name": "Wallet8484", + "ParticipationOnly": false + }, + { + "Name": "Wallet8485", + "ParticipationOnly": false + }, + { + "Name": "Wallet8486", + "ParticipationOnly": false + }, + { + "Name": "Wallet8487", + "ParticipationOnly": false + }, + { + "Name": "Wallet8488", + "ParticipationOnly": false + }, + { + "Name": "Wallet8489", + "ParticipationOnly": false + }, + { + "Name": "Wallet8490", + "ParticipationOnly": false + }, + { + "Name": "Wallet8491", + "ParticipationOnly": false + }, + { + "Name": "Wallet8492", + "ParticipationOnly": false + }, + { + "Name": "Wallet8493", + "ParticipationOnly": false + }, + { + "Name": "Wallet8494", + "ParticipationOnly": false + }, + { + "Name": "Wallet8495", + "ParticipationOnly": false + }, + { + "Name": "Wallet8496", + "ParticipationOnly": false + }, + { + "Name": "Wallet8497", + "ParticipationOnly": false + }, + { + "Name": "Wallet8498", + "ParticipationOnly": false + }, + { + "Name": "Wallet8499", + "ParticipationOnly": false + }, + { + "Name": "Wallet8500", + "ParticipationOnly": false + }, + { + "Name": "Wallet8501", + "ParticipationOnly": false + }, + { + "Name": "Wallet8502", + "ParticipationOnly": false + }, + { + "Name": "Wallet8503", + "ParticipationOnly": false + }, + { + "Name": "Wallet8504", + "ParticipationOnly": false + }, + { + "Name": "Wallet8505", + "ParticipationOnly": false + }, + { + "Name": "Wallet8506", + "ParticipationOnly": false + }, + { + "Name": "Wallet8507", + "ParticipationOnly": false + }, + { + "Name": "Wallet8508", + "ParticipationOnly": false + }, + { + "Name": "Wallet8509", + "ParticipationOnly": false + }, + { + "Name": "Wallet8510", + "ParticipationOnly": false + }, + { + "Name": "Wallet8511", + "ParticipationOnly": false + }, + { + "Name": "Wallet8512", + "ParticipationOnly": false + }, + { + "Name": "Wallet8513", + "ParticipationOnly": false + }, + { + "Name": "Wallet8514", + "ParticipationOnly": false + }, + { + "Name": "Wallet8515", + "ParticipationOnly": false + }, + { + "Name": "Wallet8516", + "ParticipationOnly": false + }, + { + "Name": "Wallet8517", + "ParticipationOnly": false + }, + { + "Name": "Wallet8518", + "ParticipationOnly": false + }, + { + "Name": "Wallet8519", + "ParticipationOnly": false + }, + { + "Name": "Wallet8520", + "ParticipationOnly": false + }, + { + "Name": "Wallet8521", + "ParticipationOnly": false + }, + { + "Name": "Wallet8522", + "ParticipationOnly": false + }, + { + "Name": "Wallet8523", + "ParticipationOnly": false + }, + { + "Name": "Wallet8524", + "ParticipationOnly": false + }, + { + "Name": "Wallet8525", + "ParticipationOnly": false + }, + { + "Name": "Wallet8526", + "ParticipationOnly": false + }, + { + "Name": "Wallet8527", + "ParticipationOnly": false + }, + { + "Name": "Wallet8528", + "ParticipationOnly": false + }, + { + "Name": "Wallet8529", + "ParticipationOnly": false + }, + { + "Name": "Wallet8530", + "ParticipationOnly": false + }, + { + "Name": "Wallet8531", + "ParticipationOnly": false + }, + { + "Name": "Wallet8532", + "ParticipationOnly": false + }, + { + "Name": "Wallet8533", + "ParticipationOnly": false + }, + { + "Name": "Wallet8534", + "ParticipationOnly": false + }, + { + "Name": "Wallet8535", + "ParticipationOnly": false + }, + { + "Name": "Wallet8536", + "ParticipationOnly": false + }, + { + "Name": "Wallet8537", + "ParticipationOnly": false + }, + { + "Name": "Wallet8538", + "ParticipationOnly": false + }, + { + "Name": "Wallet8539", + "ParticipationOnly": false + }, + { + "Name": "Wallet8540", + "ParticipationOnly": false + }, + { + "Name": "Wallet8541", + "ParticipationOnly": false + }, + { + "Name": "Wallet8542", + "ParticipationOnly": false + }, + { + "Name": "Wallet8543", + "ParticipationOnly": false + }, + { + "Name": "Wallet8544", + "ParticipationOnly": false + }, + { + "Name": "Wallet8545", + "ParticipationOnly": false + }, + { + "Name": "Wallet8546", + "ParticipationOnly": false + }, + { + "Name": "Wallet8547", + "ParticipationOnly": false + }, + { + "Name": "Wallet8548", + "ParticipationOnly": false + }, + { + "Name": "Wallet8549", + "ParticipationOnly": false + }, + { + "Name": "Wallet8550", + "ParticipationOnly": false + }, + { + "Name": "Wallet8551", + "ParticipationOnly": false + }, + { + "Name": "Wallet8552", + "ParticipationOnly": false + }, + { + "Name": "Wallet8553", + "ParticipationOnly": false + }, + { + "Name": "Wallet8554", + "ParticipationOnly": false + }, + { + "Name": "Wallet8555", + "ParticipationOnly": false + }, + { + "Name": "Wallet8556", + "ParticipationOnly": false + }, + { + "Name": "Wallet8557", + "ParticipationOnly": false + }, + { + "Name": "Wallet8558", + "ParticipationOnly": false + }, + { + "Name": "Wallet8559", + "ParticipationOnly": false + }, + { + "Name": "Wallet8560", + "ParticipationOnly": false + }, + { + "Name": "Wallet8561", + "ParticipationOnly": false + }, + { + "Name": "Wallet8562", + "ParticipationOnly": false + }, + { + "Name": "Wallet8563", + "ParticipationOnly": false + }, + { + "Name": "Wallet8564", + "ParticipationOnly": false + }, + { + "Name": "Wallet8565", + "ParticipationOnly": false + }, + { + "Name": "Wallet8566", + "ParticipationOnly": false + }, + { + "Name": "Wallet8567", + "ParticipationOnly": false + }, + { + "Name": "Wallet8568", + "ParticipationOnly": false + }, + { + "Name": "Wallet8569", + "ParticipationOnly": false + }, + { + "Name": "Wallet8570", + "ParticipationOnly": false + }, + { + "Name": "Wallet8571", + "ParticipationOnly": false + }, + { + "Name": "Wallet8572", + "ParticipationOnly": false + }, + { + "Name": "Wallet8573", + "ParticipationOnly": false + }, + { + "Name": "Wallet8574", + "ParticipationOnly": false + }, + { + "Name": "Wallet8575", + "ParticipationOnly": false + }, + { + "Name": "Wallet8576", + "ParticipationOnly": false + }, + { + "Name": "Wallet8577", + "ParticipationOnly": false + }, + { + "Name": "Wallet8578", + "ParticipationOnly": false + }, + { + "Name": "Wallet8579", + "ParticipationOnly": false + }, + { + "Name": "Wallet8580", + "ParticipationOnly": false + }, + { + "Name": "Wallet8581", + "ParticipationOnly": false + }, + { + "Name": "Wallet8582", + "ParticipationOnly": false + }, + { + "Name": "Wallet8583", + "ParticipationOnly": false + }, + { + "Name": "Wallet8584", + "ParticipationOnly": false + }, + { + "Name": "Wallet8585", + "ParticipationOnly": false + }, + { + "Name": "Wallet8586", + "ParticipationOnly": false + }, + { + "Name": "Wallet8587", + "ParticipationOnly": false + }, + { + "Name": "Wallet8588", + "ParticipationOnly": false + }, + { + "Name": "Wallet8589", + "ParticipationOnly": false + }, + { + "Name": "Wallet8590", + "ParticipationOnly": false + }, + { + "Name": "Wallet8591", + "ParticipationOnly": false + }, + { + "Name": "Wallet8592", + "ParticipationOnly": false + }, + { + "Name": "Wallet8593", + "ParticipationOnly": false + }, + { + "Name": "Wallet8594", + "ParticipationOnly": false + }, + { + "Name": "Wallet8595", + "ParticipationOnly": false + }, + { + "Name": "Wallet8596", + "ParticipationOnly": false + }, + { + "Name": "Wallet8597", + "ParticipationOnly": false + }, + { + "Name": "Wallet8598", + "ParticipationOnly": false + }, + { + "Name": "Wallet8599", + "ParticipationOnly": false + }, + { + "Name": "Wallet8600", + "ParticipationOnly": false + }, + { + "Name": "Wallet8601", + "ParticipationOnly": false + }, + { + "Name": "Wallet8602", + "ParticipationOnly": false + }, + { + "Name": "Wallet8603", + "ParticipationOnly": false + }, + { + "Name": "Wallet8604", + "ParticipationOnly": false + }, + { + "Name": "Wallet8605", + "ParticipationOnly": false + }, + { + "Name": "Wallet8606", + "ParticipationOnly": false + }, + { + "Name": "Wallet8607", + "ParticipationOnly": false + }, + { + "Name": "Wallet8608", + "ParticipationOnly": false + }, + { + "Name": "Wallet8609", + "ParticipationOnly": false + }, + { + "Name": "Wallet8610", + "ParticipationOnly": false + }, + { + "Name": "Wallet8611", + "ParticipationOnly": false + }, + { + "Name": "Wallet8612", + "ParticipationOnly": false + }, + { + "Name": "Wallet8613", + "ParticipationOnly": false + }, + { + "Name": "Wallet8614", + "ParticipationOnly": false + }, + { + "Name": "Wallet8615", + "ParticipationOnly": false + }, + { + "Name": "Wallet8616", + "ParticipationOnly": false + }, + { + "Name": "Wallet8617", + "ParticipationOnly": false + }, + { + "Name": "Wallet8618", + "ParticipationOnly": false + }, + { + "Name": "Wallet8619", + "ParticipationOnly": false + }, + { + "Name": "Wallet8620", + "ParticipationOnly": false + }, + { + "Name": "Wallet8621", + "ParticipationOnly": false + }, + { + "Name": "Wallet8622", + "ParticipationOnly": false + }, + { + "Name": "Wallet8623", + "ParticipationOnly": false + }, + { + "Name": "Wallet8624", + "ParticipationOnly": false + }, + { + "Name": "Wallet8625", + "ParticipationOnly": false + }, + { + "Name": "Wallet8626", + "ParticipationOnly": false + }, + { + "Name": "Wallet8627", + "ParticipationOnly": false + }, + { + "Name": "Wallet8628", + "ParticipationOnly": false + }, + { + "Name": "Wallet8629", + "ParticipationOnly": false + }, + { + "Name": "Wallet8630", + "ParticipationOnly": false + }, + { + "Name": "Wallet8631", + "ParticipationOnly": false + }, + { + "Name": "Wallet8632", + "ParticipationOnly": false + }, + { + "Name": "Wallet8633", + "ParticipationOnly": false + }, + { + "Name": "Wallet8634", + "ParticipationOnly": false + }, + { + "Name": "Wallet8635", + "ParticipationOnly": false + }, + { + "Name": "Wallet8636", + "ParticipationOnly": false + }, + { + "Name": "Wallet8637", + "ParticipationOnly": false + }, + { + "Name": "Wallet8638", + "ParticipationOnly": false + }, + { + "Name": "Wallet8639", + "ParticipationOnly": false + }, + { + "Name": "Wallet8640", + "ParticipationOnly": false + }, + { + "Name": "Wallet8641", + "ParticipationOnly": false + }, + { + "Name": "Wallet8642", + "ParticipationOnly": false + }, + { + "Name": "Wallet8643", + "ParticipationOnly": false + }, + { + "Name": "Wallet8644", + "ParticipationOnly": false + }, + { + "Name": "Wallet8645", + "ParticipationOnly": false + }, + { + "Name": "Wallet8646", + "ParticipationOnly": false + }, + { + "Name": "Wallet8647", + "ParticipationOnly": false + }, + { + "Name": "Wallet8648", + "ParticipationOnly": false + }, + { + "Name": "Wallet8649", + "ParticipationOnly": false + }, + { + "Name": "Wallet8650", + "ParticipationOnly": false + }, + { + "Name": "Wallet8651", + "ParticipationOnly": false + }, + { + "Name": "Wallet8652", + "ParticipationOnly": false + }, + { + "Name": "Wallet8653", + "ParticipationOnly": false + }, + { + "Name": "Wallet8654", + "ParticipationOnly": false + }, + { + "Name": "Wallet8655", + "ParticipationOnly": false + }, + { + "Name": "Wallet8656", + "ParticipationOnly": false + }, + { + "Name": "Wallet8657", + "ParticipationOnly": false + }, + { + "Name": "Wallet8658", + "ParticipationOnly": false + }, + { + "Name": "Wallet8659", + "ParticipationOnly": false + }, + { + "Name": "Wallet8660", + "ParticipationOnly": false + }, + { + "Name": "Wallet8661", + "ParticipationOnly": false + }, + { + "Name": "Wallet8662", + "ParticipationOnly": false + }, + { + "Name": "Wallet8663", + "ParticipationOnly": false + }, + { + "Name": "Wallet8664", + "ParticipationOnly": false + }, + { + "Name": "Wallet8665", + "ParticipationOnly": false + }, + { + "Name": "Wallet8666", + "ParticipationOnly": false + }, + { + "Name": "Wallet8667", + "ParticipationOnly": false + }, + { + "Name": "Wallet8668", + "ParticipationOnly": false + }, + { + "Name": "Wallet8669", + "ParticipationOnly": false + }, + { + "Name": "Wallet8670", + "ParticipationOnly": false + }, + { + "Name": "Wallet8671", + "ParticipationOnly": false + }, + { + "Name": "Wallet8672", + "ParticipationOnly": false + }, + { + "Name": "Wallet8673", + "ParticipationOnly": false + }, + { + "Name": "Wallet8674", + "ParticipationOnly": false + }, + { + "Name": "Wallet8675", + "ParticipationOnly": false + }, + { + "Name": "Wallet8676", + "ParticipationOnly": false + }, + { + "Name": "Wallet8677", + "ParticipationOnly": false + }, + { + "Name": "Wallet8678", + "ParticipationOnly": false + }, + { + "Name": "Wallet8679", + "ParticipationOnly": false + }, + { + "Name": "Wallet8680", + "ParticipationOnly": false + }, + { + "Name": "Wallet8681", + "ParticipationOnly": false + }, + { + "Name": "Wallet8682", + "ParticipationOnly": false + }, + { + "Name": "Wallet8683", + "ParticipationOnly": false + }, + { + "Name": "Wallet8684", + "ParticipationOnly": false + }, + { + "Name": "Wallet8685", + "ParticipationOnly": false + }, + { + "Name": "Wallet8686", + "ParticipationOnly": false + }, + { + "Name": "Wallet8687", + "ParticipationOnly": false + }, + { + "Name": "Wallet8688", + "ParticipationOnly": false + }, + { + "Name": "Wallet8689", + "ParticipationOnly": false + }, + { + "Name": "Wallet8690", + "ParticipationOnly": false + }, + { + "Name": "Wallet8691", + "ParticipationOnly": false + }, + { + "Name": "Wallet8692", + "ParticipationOnly": false + }, + { + "Name": "Wallet8693", + "ParticipationOnly": false + }, + { + "Name": "Wallet8694", + "ParticipationOnly": false + }, + { + "Name": "Wallet8695", + "ParticipationOnly": false + }, + { + "Name": "Wallet8696", + "ParticipationOnly": false + }, + { + "Name": "Wallet8697", + "ParticipationOnly": false + }, + { + "Name": "Wallet8698", + "ParticipationOnly": false + }, + { + "Name": "Wallet8699", + "ParticipationOnly": false + }, + { + "Name": "Wallet8700", + "ParticipationOnly": false + }, + { + "Name": "Wallet8701", + "ParticipationOnly": false + }, + { + "Name": "Wallet8702", + "ParticipationOnly": false + }, + { + "Name": "Wallet8703", + "ParticipationOnly": false + }, + { + "Name": "Wallet8704", + "ParticipationOnly": false + }, + { + "Name": "Wallet8705", + "ParticipationOnly": false + }, + { + "Name": "Wallet8706", + "ParticipationOnly": false + }, + { + "Name": "Wallet8707", + "ParticipationOnly": false + }, + { + "Name": "Wallet8708", + "ParticipationOnly": false + }, + { + "Name": "Wallet8709", + "ParticipationOnly": false + }, + { + "Name": "Wallet8710", + "ParticipationOnly": false + }, + { + "Name": "Wallet8711", + "ParticipationOnly": false + }, + { + "Name": "Wallet8712", + "ParticipationOnly": false + }, + { + "Name": "Wallet8713", + "ParticipationOnly": false + }, + { + "Name": "Wallet8714", + "ParticipationOnly": false + }, + { + "Name": "Wallet8715", + "ParticipationOnly": false + }, + { + "Name": "Wallet8716", + "ParticipationOnly": false + }, + { + "Name": "Wallet8717", + "ParticipationOnly": false + }, + { + "Name": "Wallet8718", + "ParticipationOnly": false + }, + { + "Name": "Wallet8719", + "ParticipationOnly": false + }, + { + "Name": "Wallet8720", + "ParticipationOnly": false + }, + { + "Name": "Wallet8721", + "ParticipationOnly": false + }, + { + "Name": "Wallet8722", + "ParticipationOnly": false + }, + { + "Name": "Wallet8723", + "ParticipationOnly": false + }, + { + "Name": "Wallet8724", + "ParticipationOnly": false + }, + { + "Name": "Wallet8725", + "ParticipationOnly": false + }, + { + "Name": "Wallet8726", + "ParticipationOnly": false + }, + { + "Name": "Wallet8727", + "ParticipationOnly": false + }, + { + "Name": "Wallet8728", + "ParticipationOnly": false + }, + { + "Name": "Wallet8729", + "ParticipationOnly": false + }, + { + "Name": "Wallet8730", + "ParticipationOnly": false + }, + { + "Name": "Wallet8731", + "ParticipationOnly": false + }, + { + "Name": "Wallet8732", + "ParticipationOnly": false + }, + { + "Name": "Wallet8733", + "ParticipationOnly": false + }, + { + "Name": "Wallet8734", + "ParticipationOnly": false + }, + { + "Name": "Wallet8735", + "ParticipationOnly": false + }, + { + "Name": "Wallet8736", + "ParticipationOnly": false + }, + { + "Name": "Wallet8737", + "ParticipationOnly": false + }, + { + "Name": "Wallet8738", + "ParticipationOnly": false + }, + { + "Name": "Wallet8739", + "ParticipationOnly": false + }, + { + "Name": "Wallet8740", + "ParticipationOnly": false + }, + { + "Name": "Wallet8741", + "ParticipationOnly": false + }, + { + "Name": "Wallet8742", + "ParticipationOnly": false + }, + { + "Name": "Wallet8743", + "ParticipationOnly": false + }, + { + "Name": "Wallet8744", + "ParticipationOnly": false + }, + { + "Name": "Wallet8745", + "ParticipationOnly": false + }, + { + "Name": "Wallet8746", + "ParticipationOnly": false + }, + { + "Name": "Wallet8747", + "ParticipationOnly": false + }, + { + "Name": "Wallet8748", + "ParticipationOnly": false + }, + { + "Name": "Wallet8749", + "ParticipationOnly": false + }, + { + "Name": "Wallet8750", + "ParticipationOnly": false + }, + { + "Name": "Wallet8751", + "ParticipationOnly": false + }, + { + "Name": "Wallet8752", + "ParticipationOnly": false + }, + { + "Name": "Wallet8753", + "ParticipationOnly": false + }, + { + "Name": "Wallet8754", + "ParticipationOnly": false + }, + { + "Name": "Wallet8755", + "ParticipationOnly": false + }, + { + "Name": "Wallet8756", + "ParticipationOnly": false + }, + { + "Name": "Wallet8757", + "ParticipationOnly": false + }, + { + "Name": "Wallet8758", + "ParticipationOnly": false + }, + { + "Name": "Wallet8759", + "ParticipationOnly": false + }, + { + "Name": "Wallet8760", + "ParticipationOnly": false + }, + { + "Name": "Wallet8761", + "ParticipationOnly": false + }, + { + "Name": "Wallet8762", + "ParticipationOnly": false + }, + { + "Name": "Wallet8763", + "ParticipationOnly": false + }, + { + "Name": "Wallet8764", + "ParticipationOnly": false + }, + { + "Name": "Wallet8765", + "ParticipationOnly": false + }, + { + "Name": "Wallet8766", + "ParticipationOnly": false + }, + { + "Name": "Wallet8767", + "ParticipationOnly": false + }, + { + "Name": "Wallet8768", + "ParticipationOnly": false + }, + { + "Name": "Wallet8769", + "ParticipationOnly": false + }, + { + "Name": "Wallet8770", + "ParticipationOnly": false + }, + { + "Name": "Wallet8771", + "ParticipationOnly": false + }, + { + "Name": "Wallet8772", + "ParticipationOnly": false + }, + { + "Name": "Wallet8773", + "ParticipationOnly": false + }, + { + "Name": "Wallet8774", + "ParticipationOnly": false + }, + { + "Name": "Wallet8775", + "ParticipationOnly": false + }, + { + "Name": "Wallet8776", + "ParticipationOnly": false + }, + { + "Name": "Wallet8777", + "ParticipationOnly": false + }, + { + "Name": "Wallet8778", + "ParticipationOnly": false + }, + { + "Name": "Wallet8779", + "ParticipationOnly": false + }, + { + "Name": "Wallet8780", + "ParticipationOnly": false + }, + { + "Name": "Wallet8781", + "ParticipationOnly": false + }, + { + "Name": "Wallet8782", + "ParticipationOnly": false + }, + { + "Name": "Wallet8783", + "ParticipationOnly": false + }, + { + "Name": "Wallet8784", + "ParticipationOnly": false + }, + { + "Name": "Wallet8785", + "ParticipationOnly": false + }, + { + "Name": "Wallet8786", + "ParticipationOnly": false + }, + { + "Name": "Wallet8787", + "ParticipationOnly": false + }, + { + "Name": "Wallet8788", + "ParticipationOnly": false + }, + { + "Name": "Wallet8789", + "ParticipationOnly": false + }, + { + "Name": "Wallet8790", + "ParticipationOnly": false + }, + { + "Name": "Wallet8791", + "ParticipationOnly": false + }, + { + "Name": "Wallet8792", + "ParticipationOnly": false + }, + { + "Name": "Wallet8793", + "ParticipationOnly": false + }, + { + "Name": "Wallet8794", + "ParticipationOnly": false + }, + { + "Name": "Wallet8795", + "ParticipationOnly": false + }, + { + "Name": "Wallet8796", + "ParticipationOnly": false + }, + { + "Name": "Wallet8797", + "ParticipationOnly": false + }, + { + "Name": "Wallet8798", + "ParticipationOnly": false + }, + { + "Name": "Wallet8799", + "ParticipationOnly": false + }, + { + "Name": "Wallet8800", + "ParticipationOnly": false + }, + { + "Name": "Wallet8801", + "ParticipationOnly": false + }, + { + "Name": "Wallet8802", + "ParticipationOnly": false + }, + { + "Name": "Wallet8803", + "ParticipationOnly": false + }, + { + "Name": "Wallet8804", + "ParticipationOnly": false + }, + { + "Name": "Wallet8805", + "ParticipationOnly": false + }, + { + "Name": "Wallet8806", + "ParticipationOnly": false + }, + { + "Name": "Wallet8807", + "ParticipationOnly": false + }, + { + "Name": "Wallet8808", + "ParticipationOnly": false + }, + { + "Name": "Wallet8809", + "ParticipationOnly": false + }, + { + "Name": "Wallet8810", + "ParticipationOnly": false + }, + { + "Name": "Wallet8811", + "ParticipationOnly": false + }, + { + "Name": "Wallet8812", + "ParticipationOnly": false + }, + { + "Name": "Wallet8813", + "ParticipationOnly": false + }, + { + "Name": "Wallet8814", + "ParticipationOnly": false + }, + { + "Name": "Wallet8815", + "ParticipationOnly": false + }, + { + "Name": "Wallet8816", + "ParticipationOnly": false + }, + { + "Name": "Wallet8817", + "ParticipationOnly": false + }, + { + "Name": "Wallet8818", + "ParticipationOnly": false + }, + { + "Name": "Wallet8819", + "ParticipationOnly": false + }, + { + "Name": "Wallet8820", + "ParticipationOnly": false + }, + { + "Name": "Wallet8821", + "ParticipationOnly": false + }, + { + "Name": "Wallet8822", + "ParticipationOnly": false + }, + { + "Name": "Wallet8823", + "ParticipationOnly": false + }, + { + "Name": "Wallet8824", + "ParticipationOnly": false + }, + { + "Name": "Wallet8825", + "ParticipationOnly": false + }, + { + "Name": "Wallet8826", + "ParticipationOnly": false + }, + { + "Name": "Wallet8827", + "ParticipationOnly": false + }, + { + "Name": "Wallet8828", + "ParticipationOnly": false + }, + { + "Name": "Wallet8829", + "ParticipationOnly": false + }, + { + "Name": "Wallet8830", + "ParticipationOnly": false + }, + { + "Name": "Wallet8831", + "ParticipationOnly": false + }, + { + "Name": "Wallet8832", + "ParticipationOnly": false + }, + { + "Name": "Wallet8833", + "ParticipationOnly": false + }, + { + "Name": "Wallet8834", + "ParticipationOnly": false + }, + { + "Name": "Wallet8835", + "ParticipationOnly": false + }, + { + "Name": "Wallet8836", + "ParticipationOnly": false + }, + { + "Name": "Wallet8837", + "ParticipationOnly": false + }, + { + "Name": "Wallet8838", + "ParticipationOnly": false + }, + { + "Name": "Wallet8839", + "ParticipationOnly": false + }, + { + "Name": "Wallet8840", + "ParticipationOnly": false + }, + { + "Name": "Wallet8841", + "ParticipationOnly": false + }, + { + "Name": "Wallet8842", + "ParticipationOnly": false + }, + { + "Name": "Wallet8843", + "ParticipationOnly": false + }, + { + "Name": "Wallet8844", + "ParticipationOnly": false + }, + { + "Name": "Wallet8845", + "ParticipationOnly": false + }, + { + "Name": "Wallet8846", + "ParticipationOnly": false + }, + { + "Name": "Wallet8847", + "ParticipationOnly": false + }, + { + "Name": "Wallet8848", + "ParticipationOnly": false + }, + { + "Name": "Wallet8849", + "ParticipationOnly": false + }, + { + "Name": "Wallet8850", + "ParticipationOnly": false + }, + { + "Name": "Wallet8851", + "ParticipationOnly": false + }, + { + "Name": "Wallet8852", + "ParticipationOnly": false + }, + { + "Name": "Wallet8853", + "ParticipationOnly": false + }, + { + "Name": "Wallet8854", + "ParticipationOnly": false + }, + { + "Name": "Wallet8855", + "ParticipationOnly": false + }, + { + "Name": "Wallet8856", + "ParticipationOnly": false + }, + { + "Name": "Wallet8857", + "ParticipationOnly": false + }, + { + "Name": "Wallet8858", + "ParticipationOnly": false + }, + { + "Name": "Wallet8859", + "ParticipationOnly": false + }, + { + "Name": "Wallet8860", + "ParticipationOnly": false + }, + { + "Name": "Wallet8861", + "ParticipationOnly": false + }, + { + "Name": "Wallet8862", + "ParticipationOnly": false + }, + { + "Name": "Wallet8863", + "ParticipationOnly": false + }, + { + "Name": "Wallet8864", + "ParticipationOnly": false + }, + { + "Name": "Wallet8865", + "ParticipationOnly": false + }, + { + "Name": "Wallet8866", + "ParticipationOnly": false + }, + { + "Name": "Wallet8867", + "ParticipationOnly": false + }, + { + "Name": "Wallet8868", + "ParticipationOnly": false + }, + { + "Name": "Wallet8869", + "ParticipationOnly": false + }, + { + "Name": "Wallet8870", + "ParticipationOnly": false + }, + { + "Name": "Wallet8871", + "ParticipationOnly": false + }, + { + "Name": "Wallet8872", + "ParticipationOnly": false + }, + { + "Name": "Wallet8873", + "ParticipationOnly": false + }, + { + "Name": "Wallet8874", + "ParticipationOnly": false + }, + { + "Name": "Wallet8875", + "ParticipationOnly": false + }, + { + "Name": "Wallet8876", + "ParticipationOnly": false + }, + { + "Name": "Wallet8877", + "ParticipationOnly": false + }, + { + "Name": "Wallet8878", + "ParticipationOnly": false + }, + { + "Name": "Wallet8879", + "ParticipationOnly": false + }, + { + "Name": "Wallet8880", + "ParticipationOnly": false + }, + { + "Name": "Wallet8881", + "ParticipationOnly": false + }, + { + "Name": "Wallet8882", + "ParticipationOnly": false + }, + { + "Name": "Wallet8883", + "ParticipationOnly": false + }, + { + "Name": "Wallet8884", + "ParticipationOnly": false + }, + { + "Name": "Wallet8885", + "ParticipationOnly": false + }, + { + "Name": "Wallet8886", + "ParticipationOnly": false + }, + { + "Name": "Wallet8887", + "ParticipationOnly": false + }, + { + "Name": "Wallet8888", + "ParticipationOnly": false + }, + { + "Name": "Wallet8889", + "ParticipationOnly": false + }, + { + "Name": "Wallet8890", + "ParticipationOnly": false + }, + { + "Name": "Wallet8891", + "ParticipationOnly": false + }, + { + "Name": "Wallet8892", + "ParticipationOnly": false + }, + { + "Name": "Wallet8893", + "ParticipationOnly": false + }, + { + "Name": "Wallet8894", + "ParticipationOnly": false + }, + { + "Name": "Wallet8895", + "ParticipationOnly": false + }, + { + "Name": "Wallet8896", + "ParticipationOnly": false + }, + { + "Name": "Wallet8897", + "ParticipationOnly": false + }, + { + "Name": "Wallet8898", + "ParticipationOnly": false + }, + { + "Name": "Wallet8899", + "ParticipationOnly": false + }, + { + "Name": "Wallet8900", + "ParticipationOnly": false + }, + { + "Name": "Wallet8901", + "ParticipationOnly": false + }, + { + "Name": "Wallet8902", + "ParticipationOnly": false + }, + { + "Name": "Wallet8903", + "ParticipationOnly": false + }, + { + "Name": "Wallet8904", + "ParticipationOnly": false + }, + { + "Name": "Wallet8905", + "ParticipationOnly": false + }, + { + "Name": "Wallet8906", + "ParticipationOnly": false + }, + { + "Name": "Wallet8907", + "ParticipationOnly": false + }, + { + "Name": "Wallet8908", + "ParticipationOnly": false + }, + { + "Name": "Wallet8909", + "ParticipationOnly": false + }, + { + "Name": "Wallet8910", + "ParticipationOnly": false + }, + { + "Name": "Wallet8911", + "ParticipationOnly": false + }, + { + "Name": "Wallet8912", + "ParticipationOnly": false + }, + { + "Name": "Wallet8913", + "ParticipationOnly": false + }, + { + "Name": "Wallet8914", + "ParticipationOnly": false + }, + { + "Name": "Wallet8915", + "ParticipationOnly": false + }, + { + "Name": "Wallet8916", + "ParticipationOnly": false + }, + { + "Name": "Wallet8917", + "ParticipationOnly": false + }, + { + "Name": "Wallet8918", + "ParticipationOnly": false + }, + { + "Name": "Wallet8919", + "ParticipationOnly": false + }, + { + "Name": "Wallet8920", + "ParticipationOnly": false + }, + { + "Name": "Wallet8921", + "ParticipationOnly": false + }, + { + "Name": "Wallet8922", + "ParticipationOnly": false + }, + { + "Name": "Wallet8923", + "ParticipationOnly": false + }, + { + "Name": "Wallet8924", + "ParticipationOnly": false + }, + { + "Name": "Wallet8925", + "ParticipationOnly": false + }, + { + "Name": "Wallet8926", + "ParticipationOnly": false + }, + { + "Name": "Wallet8927", + "ParticipationOnly": false + }, + { + "Name": "Wallet8928", + "ParticipationOnly": false + }, + { + "Name": "Wallet8929", + "ParticipationOnly": false + }, + { + "Name": "Wallet8930", + "ParticipationOnly": false + }, + { + "Name": "Wallet8931", + "ParticipationOnly": false + }, + { + "Name": "Wallet8932", + "ParticipationOnly": false + }, + { + "Name": "Wallet8933", + "ParticipationOnly": false + }, + { + "Name": "Wallet8934", + "ParticipationOnly": false + }, + { + "Name": "Wallet8935", + "ParticipationOnly": false + }, + { + "Name": "Wallet8936", + "ParticipationOnly": false + }, + { + "Name": "Wallet8937", + "ParticipationOnly": false + }, + { + "Name": "Wallet8938", + "ParticipationOnly": false + }, + { + "Name": "Wallet8939", + "ParticipationOnly": false + }, + { + "Name": "Wallet8940", + "ParticipationOnly": false + }, + { + "Name": "Wallet8941", + "ParticipationOnly": false + }, + { + "Name": "Wallet8942", + "ParticipationOnly": false + }, + { + "Name": "Wallet8943", + "ParticipationOnly": false + }, + { + "Name": "Wallet8944", + "ParticipationOnly": false + }, + { + "Name": "Wallet8945", + "ParticipationOnly": false + }, + { + "Name": "Wallet8946", + "ParticipationOnly": false + }, + { + "Name": "Wallet8947", + "ParticipationOnly": false + }, + { + "Name": "Wallet8948", + "ParticipationOnly": false + }, + { + "Name": "Wallet8949", + "ParticipationOnly": false + }, + { + "Name": "Wallet8950", + "ParticipationOnly": false + }, + { + "Name": "Wallet8951", + "ParticipationOnly": false + }, + { + "Name": "Wallet8952", + "ParticipationOnly": false + }, + { + "Name": "Wallet8953", + "ParticipationOnly": false + }, + { + "Name": "Wallet8954", + "ParticipationOnly": false + }, + { + "Name": "Wallet8955", + "ParticipationOnly": false + }, + { + "Name": "Wallet8956", + "ParticipationOnly": false + }, + { + "Name": "Wallet8957", + "ParticipationOnly": false + }, + { + "Name": "Wallet8958", + "ParticipationOnly": false + }, + { + "Name": "Wallet8959", + "ParticipationOnly": false + }, + { + "Name": "Wallet8960", + "ParticipationOnly": false + }, + { + "Name": "Wallet8961", + "ParticipationOnly": false + }, + { + "Name": "Wallet8962", + "ParticipationOnly": false + }, + { + "Name": "Wallet8963", + "ParticipationOnly": false + }, + { + "Name": "Wallet8964", + "ParticipationOnly": false + }, + { + "Name": "Wallet8965", + "ParticipationOnly": false + }, + { + "Name": "Wallet8966", + "ParticipationOnly": false + }, + { + "Name": "Wallet8967", + "ParticipationOnly": false + }, + { + "Name": "Wallet8968", + "ParticipationOnly": false + }, + { + "Name": "Wallet8969", + "ParticipationOnly": false + }, + { + "Name": "Wallet8970", + "ParticipationOnly": false + }, + { + "Name": "Wallet8971", + "ParticipationOnly": false + }, + { + "Name": "Wallet8972", + "ParticipationOnly": false + }, + { + "Name": "Wallet8973", + "ParticipationOnly": false + }, + { + "Name": "Wallet8974", + "ParticipationOnly": false + }, + { + "Name": "Wallet8975", + "ParticipationOnly": false + }, + { + "Name": "Wallet8976", + "ParticipationOnly": false + }, + { + "Name": "Wallet8977", + "ParticipationOnly": false + }, + { + "Name": "Wallet8978", + "ParticipationOnly": false + }, + { + "Name": "Wallet8979", + "ParticipationOnly": false + }, + { + "Name": "Wallet8980", + "ParticipationOnly": false + }, + { + "Name": "Wallet8981", + "ParticipationOnly": false + }, + { + "Name": "Wallet8982", + "ParticipationOnly": false + }, + { + "Name": "Wallet8983", + "ParticipationOnly": false + }, + { + "Name": "Wallet8984", + "ParticipationOnly": false + }, + { + "Name": "Wallet8985", + "ParticipationOnly": false + }, + { + "Name": "Wallet8986", + "ParticipationOnly": false + }, + { + "Name": "Wallet8987", + "ParticipationOnly": false + }, + { + "Name": "Wallet8988", + "ParticipationOnly": false + }, + { + "Name": "Wallet8989", + "ParticipationOnly": false + }, + { + "Name": "Wallet8990", + "ParticipationOnly": false + }, + { + "Name": "Wallet8991", + "ParticipationOnly": false + }, + { + "Name": "Wallet8992", + "ParticipationOnly": false + }, + { + "Name": "Wallet8993", + "ParticipationOnly": false + }, + { + "Name": "Wallet8994", + "ParticipationOnly": false + }, + { + "Name": "Wallet8995", + "ParticipationOnly": false + }, + { + "Name": "Wallet8996", + "ParticipationOnly": false + }, + { + "Name": "Wallet8997", + "ParticipationOnly": false + }, + { + "Name": "Wallet8998", + "ParticipationOnly": false + }, + { + "Name": "Wallet8999", + "ParticipationOnly": false + }, + { + "Name": "Wallet9000", + "ParticipationOnly": false + }, + { + "Name": "Wallet9001", + "ParticipationOnly": false + }, + { + "Name": "Wallet9002", + "ParticipationOnly": false + }, + { + "Name": "Wallet9003", + "ParticipationOnly": false + }, + { + "Name": "Wallet9004", + "ParticipationOnly": false + }, + { + "Name": "Wallet9005", + "ParticipationOnly": false + }, + { + "Name": "Wallet9006", + "ParticipationOnly": false + }, + { + "Name": "Wallet9007", + "ParticipationOnly": false + }, + { + "Name": "Wallet9008", + "ParticipationOnly": false + }, + { + "Name": "Wallet9009", + "ParticipationOnly": false + }, + { + "Name": "Wallet9010", + "ParticipationOnly": false + }, + { + "Name": "Wallet9011", + "ParticipationOnly": false + }, + { + "Name": "Wallet9012", + "ParticipationOnly": false + }, + { + "Name": "Wallet9013", + "ParticipationOnly": false + }, + { + "Name": "Wallet9014", + "ParticipationOnly": false + }, + { + "Name": "Wallet9015", + "ParticipationOnly": false + }, + { + "Name": "Wallet9016", + "ParticipationOnly": false + }, + { + "Name": "Wallet9017", + "ParticipationOnly": false + }, + { + "Name": "Wallet9018", + "ParticipationOnly": false + }, + { + "Name": "Wallet9019", + "ParticipationOnly": false + }, + { + "Name": "Wallet9020", + "ParticipationOnly": false + }, + { + "Name": "Wallet9021", + "ParticipationOnly": false + }, + { + "Name": "Wallet9022", + "ParticipationOnly": false + }, + { + "Name": "Wallet9023", + "ParticipationOnly": false + }, + { + "Name": "Wallet9024", + "ParticipationOnly": false + }, + { + "Name": "Wallet9025", + "ParticipationOnly": false + }, + { + "Name": "Wallet9026", + "ParticipationOnly": false + }, + { + "Name": "Wallet9027", + "ParticipationOnly": false + }, + { + "Name": "Wallet9028", + "ParticipationOnly": false + }, + { + "Name": "Wallet9029", + "ParticipationOnly": false + }, + { + "Name": "Wallet9030", + "ParticipationOnly": false + }, + { + "Name": "Wallet9031", + "ParticipationOnly": false + }, + { + "Name": "Wallet9032", + "ParticipationOnly": false + }, + { + "Name": "Wallet9033", + "ParticipationOnly": false + }, + { + "Name": "Wallet9034", + "ParticipationOnly": false + }, + { + "Name": "Wallet9035", + "ParticipationOnly": false + }, + { + "Name": "Wallet9036", + "ParticipationOnly": false + }, + { + "Name": "Wallet9037", + "ParticipationOnly": false + }, + { + "Name": "Wallet9038", + "ParticipationOnly": false + }, + { + "Name": "Wallet9039", + "ParticipationOnly": false + }, + { + "Name": "Wallet9040", + "ParticipationOnly": false + }, + { + "Name": "Wallet9041", + "ParticipationOnly": false + }, + { + "Name": "Wallet9042", + "ParticipationOnly": false + }, + { + "Name": "Wallet9043", + "ParticipationOnly": false + }, + { + "Name": "Wallet9044", + "ParticipationOnly": false + }, + { + "Name": "Wallet9045", + "ParticipationOnly": false + }, + { + "Name": "Wallet9046", + "ParticipationOnly": false + }, + { + "Name": "Wallet9047", + "ParticipationOnly": false + }, + { + "Name": "Wallet9048", + "ParticipationOnly": false + }, + { + "Name": "Wallet9049", + "ParticipationOnly": false + }, + { + "Name": "Wallet9050", + "ParticipationOnly": false + }, + { + "Name": "Wallet9051", + "ParticipationOnly": false + }, + { + "Name": "Wallet9052", + "ParticipationOnly": false + }, + { + "Name": "Wallet9053", + "ParticipationOnly": false + }, + { + "Name": "Wallet9054", + "ParticipationOnly": false + }, + { + "Name": "Wallet9055", + "ParticipationOnly": false + }, + { + "Name": "Wallet9056", + "ParticipationOnly": false + }, + { + "Name": "Wallet9057", + "ParticipationOnly": false + }, + { + "Name": "Wallet9058", + "ParticipationOnly": false + }, + { + "Name": "Wallet9059", + "ParticipationOnly": false + }, + { + "Name": "Wallet9060", + "ParticipationOnly": false + }, + { + "Name": "Wallet9061", + "ParticipationOnly": false + }, + { + "Name": "Wallet9062", + "ParticipationOnly": false + }, + { + "Name": "Wallet9063", + "ParticipationOnly": false + }, + { + "Name": "Wallet9064", + "ParticipationOnly": false + }, + { + "Name": "Wallet9065", + "ParticipationOnly": false + }, + { + "Name": "Wallet9066", + "ParticipationOnly": false + }, + { + "Name": "Wallet9067", + "ParticipationOnly": false + }, + { + "Name": "Wallet9068", + "ParticipationOnly": false + }, + { + "Name": "Wallet9069", + "ParticipationOnly": false + }, + { + "Name": "Wallet9070", + "ParticipationOnly": false + }, + { + "Name": "Wallet9071", + "ParticipationOnly": false + }, + { + "Name": "Wallet9072", + "ParticipationOnly": false + }, + { + "Name": "Wallet9073", + "ParticipationOnly": false + }, + { + "Name": "Wallet9074", + "ParticipationOnly": false + }, + { + "Name": "Wallet9075", + "ParticipationOnly": false + }, + { + "Name": "Wallet9076", + "ParticipationOnly": false + }, + { + "Name": "Wallet9077", + "ParticipationOnly": false + }, + { + "Name": "Wallet9078", + "ParticipationOnly": false + }, + { + "Name": "Wallet9079", + "ParticipationOnly": false + }, + { + "Name": "Wallet9080", + "ParticipationOnly": false + }, + { + "Name": "Wallet9081", + "ParticipationOnly": false + }, + { + "Name": "Wallet9082", + "ParticipationOnly": false + }, + { + "Name": "Wallet9083", + "ParticipationOnly": false + }, + { + "Name": "Wallet9084", + "ParticipationOnly": false + }, + { + "Name": "Wallet9085", + "ParticipationOnly": false + }, + { + "Name": "Wallet9086", + "ParticipationOnly": false + }, + { + "Name": "Wallet9087", + "ParticipationOnly": false + }, + { + "Name": "Wallet9088", + "ParticipationOnly": false + }, + { + "Name": "Wallet9089", + "ParticipationOnly": false + }, + { + "Name": "Wallet9090", + "ParticipationOnly": false + }, + { + "Name": "Wallet9091", + "ParticipationOnly": false + }, + { + "Name": "Wallet9092", + "ParticipationOnly": false + }, + { + "Name": "Wallet9093", + "ParticipationOnly": false + }, + { + "Name": "Wallet9094", + "ParticipationOnly": false + }, + { + "Name": "Wallet9095", + "ParticipationOnly": false + }, + { + "Name": "Wallet9096", + "ParticipationOnly": false + }, + { + "Name": "Wallet9097", + "ParticipationOnly": false + }, + { + "Name": "Wallet9098", + "ParticipationOnly": false + }, + { + "Name": "Wallet9099", + "ParticipationOnly": false + }, + { + "Name": "Wallet9100", + "ParticipationOnly": false + }, + { + "Name": "Wallet9101", + "ParticipationOnly": false + }, + { + "Name": "Wallet9102", + "ParticipationOnly": false + }, + { + "Name": "Wallet9103", + "ParticipationOnly": false + }, + { + "Name": "Wallet9104", + "ParticipationOnly": false + }, + { + "Name": "Wallet9105", + "ParticipationOnly": false + }, + { + "Name": "Wallet9106", + "ParticipationOnly": false + }, + { + "Name": "Wallet9107", + "ParticipationOnly": false + }, + { + "Name": "Wallet9108", + "ParticipationOnly": false + }, + { + "Name": "Wallet9109", + "ParticipationOnly": false + }, + { + "Name": "Wallet9110", + "ParticipationOnly": false + }, + { + "Name": "Wallet9111", + "ParticipationOnly": false + }, + { + "Name": "Wallet9112", + "ParticipationOnly": false + }, + { + "Name": "Wallet9113", + "ParticipationOnly": false + }, + { + "Name": "Wallet9114", + "ParticipationOnly": false + }, + { + "Name": "Wallet9115", + "ParticipationOnly": false + }, + { + "Name": "Wallet9116", + "ParticipationOnly": false + }, + { + "Name": "Wallet9117", + "ParticipationOnly": false + }, + { + "Name": "Wallet9118", + "ParticipationOnly": false + }, + { + "Name": "Wallet9119", + "ParticipationOnly": false + }, + { + "Name": "Wallet9120", + "ParticipationOnly": false + }, + { + "Name": "Wallet9121", + "ParticipationOnly": false + }, + { + "Name": "Wallet9122", + "ParticipationOnly": false + }, + { + "Name": "Wallet9123", + "ParticipationOnly": false + }, + { + "Name": "Wallet9124", + "ParticipationOnly": false + }, + { + "Name": "Wallet9125", + "ParticipationOnly": false + }, + { + "Name": "Wallet9126", + "ParticipationOnly": false + }, + { + "Name": "Wallet9127", + "ParticipationOnly": false + }, + { + "Name": "Wallet9128", + "ParticipationOnly": false + }, + { + "Name": "Wallet9129", + "ParticipationOnly": false + }, + { + "Name": "Wallet9130", + "ParticipationOnly": false + }, + { + "Name": "Wallet9131", + "ParticipationOnly": false + }, + { + "Name": "Wallet9132", + "ParticipationOnly": false + }, + { + "Name": "Wallet9133", + "ParticipationOnly": false + }, + { + "Name": "Wallet9134", + "ParticipationOnly": false + }, + { + "Name": "Wallet9135", + "ParticipationOnly": false + }, + { + "Name": "Wallet9136", + "ParticipationOnly": false + }, + { + "Name": "Wallet9137", + "ParticipationOnly": false + }, + { + "Name": "Wallet9138", + "ParticipationOnly": false + }, + { + "Name": "Wallet9139", + "ParticipationOnly": false + }, + { + "Name": "Wallet9140", + "ParticipationOnly": false + }, + { + "Name": "Wallet9141", + "ParticipationOnly": false + }, + { + "Name": "Wallet9142", + "ParticipationOnly": false + }, + { + "Name": "Wallet9143", + "ParticipationOnly": false + }, + { + "Name": "Wallet9144", + "ParticipationOnly": false + }, + { + "Name": "Wallet9145", + "ParticipationOnly": false + }, + { + "Name": "Wallet9146", + "ParticipationOnly": false + }, + { + "Name": "Wallet9147", + "ParticipationOnly": false + }, + { + "Name": "Wallet9148", + "ParticipationOnly": false + }, + { + "Name": "Wallet9149", + "ParticipationOnly": false + }, + { + "Name": "Wallet9150", + "ParticipationOnly": false + }, + { + "Name": "Wallet9151", + "ParticipationOnly": false + }, + { + "Name": "Wallet9152", + "ParticipationOnly": false + }, + { + "Name": "Wallet9153", + "ParticipationOnly": false + }, + { + "Name": "Wallet9154", + "ParticipationOnly": false + }, + { + "Name": "Wallet9155", + "ParticipationOnly": false + }, + { + "Name": "Wallet9156", + "ParticipationOnly": false + }, + { + "Name": "Wallet9157", + "ParticipationOnly": false + }, + { + "Name": "Wallet9158", + "ParticipationOnly": false + }, + { + "Name": "Wallet9159", + "ParticipationOnly": false + }, + { + "Name": "Wallet9160", + "ParticipationOnly": false + }, + { + "Name": "Wallet9161", + "ParticipationOnly": false + }, + { + "Name": "Wallet9162", + "ParticipationOnly": false + }, + { + "Name": "Wallet9163", + "ParticipationOnly": false + }, + { + "Name": "Wallet9164", + "ParticipationOnly": false + }, + { + "Name": "Wallet9165", + "ParticipationOnly": false + }, + { + "Name": "Wallet9166", + "ParticipationOnly": false + }, + { + "Name": "Wallet9167", + "ParticipationOnly": false + }, + { + "Name": "Wallet9168", + "ParticipationOnly": false + }, + { + "Name": "Wallet9169", + "ParticipationOnly": false + }, + { + "Name": "Wallet9170", + "ParticipationOnly": false + }, + { + "Name": "Wallet9171", + "ParticipationOnly": false + }, + { + "Name": "Wallet9172", + "ParticipationOnly": false + }, + { + "Name": "Wallet9173", + "ParticipationOnly": false + }, + { + "Name": "Wallet9174", + "ParticipationOnly": false + }, + { + "Name": "Wallet9175", + "ParticipationOnly": false + }, + { + "Name": "Wallet9176", + "ParticipationOnly": false + }, + { + "Name": "Wallet9177", + "ParticipationOnly": false + }, + { + "Name": "Wallet9178", + "ParticipationOnly": false + }, + { + "Name": "Wallet9179", + "ParticipationOnly": false + }, + { + "Name": "Wallet9180", + "ParticipationOnly": false + }, + { + "Name": "Wallet9181", + "ParticipationOnly": false + }, + { + "Name": "Wallet9182", + "ParticipationOnly": false + }, + { + "Name": "Wallet9183", + "ParticipationOnly": false + }, + { + "Name": "Wallet9184", + "ParticipationOnly": false + }, + { + "Name": "Wallet9185", + "ParticipationOnly": false + }, + { + "Name": "Wallet9186", + "ParticipationOnly": false + }, + { + "Name": "Wallet9187", + "ParticipationOnly": false + }, + { + "Name": "Wallet9188", + "ParticipationOnly": false + }, + { + "Name": "Wallet9189", + "ParticipationOnly": false + }, + { + "Name": "Wallet9190", + "ParticipationOnly": false + }, + { + "Name": "Wallet9191", + "ParticipationOnly": false + }, + { + "Name": "Wallet9192", + "ParticipationOnly": false + }, + { + "Name": "Wallet9193", + "ParticipationOnly": false + }, + { + "Name": "Wallet9194", + "ParticipationOnly": false + }, + { + "Name": "Wallet9195", + "ParticipationOnly": false + }, + { + "Name": "Wallet9196", + "ParticipationOnly": false + }, + { + "Name": "Wallet9197", + "ParticipationOnly": false + }, + { + "Name": "Wallet9198", + "ParticipationOnly": false + }, + { + "Name": "Wallet9199", + "ParticipationOnly": false + }, + { + "Name": "Wallet9200", + "ParticipationOnly": false + }, + { + "Name": "Wallet9201", + "ParticipationOnly": false + }, + { + "Name": "Wallet9202", + "ParticipationOnly": false + }, + { + "Name": "Wallet9203", + "ParticipationOnly": false + }, + { + "Name": "Wallet9204", + "ParticipationOnly": false + }, + { + "Name": "Wallet9205", + "ParticipationOnly": false + }, + { + "Name": "Wallet9206", + "ParticipationOnly": false + }, + { + "Name": "Wallet9207", + "ParticipationOnly": false + }, + { + "Name": "Wallet9208", + "ParticipationOnly": false + }, + { + "Name": "Wallet9209", + "ParticipationOnly": false + }, + { + "Name": "Wallet9210", + "ParticipationOnly": false + }, + { + "Name": "Wallet9211", + "ParticipationOnly": false + }, + { + "Name": "Wallet9212", + "ParticipationOnly": false + }, + { + "Name": "Wallet9213", + "ParticipationOnly": false + }, + { + "Name": "Wallet9214", + "ParticipationOnly": false + }, + { + "Name": "Wallet9215", + "ParticipationOnly": false + }, + { + "Name": "Wallet9216", + "ParticipationOnly": false + }, + { + "Name": "Wallet9217", + "ParticipationOnly": false + }, + { + "Name": "Wallet9218", + "ParticipationOnly": false + }, + { + "Name": "Wallet9219", + "ParticipationOnly": false + }, + { + "Name": "Wallet9220", + "ParticipationOnly": false + }, + { + "Name": "Wallet9221", + "ParticipationOnly": false + }, + { + "Name": "Wallet9222", + "ParticipationOnly": false + }, + { + "Name": "Wallet9223", + "ParticipationOnly": false + }, + { + "Name": "Wallet9224", + "ParticipationOnly": false + }, + { + "Name": "Wallet9225", + "ParticipationOnly": false + }, + { + "Name": "Wallet9226", + "ParticipationOnly": false + }, + { + "Name": "Wallet9227", + "ParticipationOnly": false + }, + { + "Name": "Wallet9228", + "ParticipationOnly": false + }, + { + "Name": "Wallet9229", + "ParticipationOnly": false + }, + { + "Name": "Wallet9230", + "ParticipationOnly": false + }, + { + "Name": "Wallet9231", + "ParticipationOnly": false + }, + { + "Name": "Wallet9232", + "ParticipationOnly": false + }, + { + "Name": "Wallet9233", + "ParticipationOnly": false + }, + { + "Name": "Wallet9234", + "ParticipationOnly": false + }, + { + "Name": "Wallet9235", + "ParticipationOnly": false + }, + { + "Name": "Wallet9236", + "ParticipationOnly": false + }, + { + "Name": "Wallet9237", + "ParticipationOnly": false + }, + { + "Name": "Wallet9238", + "ParticipationOnly": false + }, + { + "Name": "Wallet9239", + "ParticipationOnly": false + }, + { + "Name": "Wallet9240", + "ParticipationOnly": false + }, + { + "Name": "Wallet9241", + "ParticipationOnly": false + }, + { + "Name": "Wallet9242", + "ParticipationOnly": false + }, + { + "Name": "Wallet9243", + "ParticipationOnly": false + }, + { + "Name": "Wallet9244", + "ParticipationOnly": false + }, + { + "Name": "Wallet9245", + "ParticipationOnly": false + }, + { + "Name": "Wallet9246", + "ParticipationOnly": false + }, + { + "Name": "Wallet9247", + "ParticipationOnly": false + }, + { + "Name": "Wallet9248", + "ParticipationOnly": false + }, + { + "Name": "Wallet9249", + "ParticipationOnly": false + }, + { + "Name": "Wallet9250", + "ParticipationOnly": false + }, + { + "Name": "Wallet9251", + "ParticipationOnly": false + }, + { + "Name": "Wallet9252", + "ParticipationOnly": false + }, + { + "Name": "Wallet9253", + "ParticipationOnly": false + }, + { + "Name": "Wallet9254", + "ParticipationOnly": false + }, + { + "Name": "Wallet9255", + "ParticipationOnly": false + }, + { + "Name": "Wallet9256", + "ParticipationOnly": false + }, + { + "Name": "Wallet9257", + "ParticipationOnly": false + }, + { + "Name": "Wallet9258", + "ParticipationOnly": false + }, + { + "Name": "Wallet9259", + "ParticipationOnly": false + }, + { + "Name": "Wallet9260", + "ParticipationOnly": false + }, + { + "Name": "Wallet9261", + "ParticipationOnly": false + }, + { + "Name": "Wallet9262", + "ParticipationOnly": false + }, + { + "Name": "Wallet9263", + "ParticipationOnly": false + }, + { + "Name": "Wallet9264", + "ParticipationOnly": false + }, + { + "Name": "Wallet9265", + "ParticipationOnly": false + }, + { + "Name": "Wallet9266", + "ParticipationOnly": false + }, + { + "Name": "Wallet9267", + "ParticipationOnly": false + }, + { + "Name": "Wallet9268", + "ParticipationOnly": false + }, + { + "Name": "Wallet9269", + "ParticipationOnly": false + }, + { + "Name": "Wallet9270", + "ParticipationOnly": false + }, + { + "Name": "Wallet9271", + "ParticipationOnly": false + }, + { + "Name": "Wallet9272", + "ParticipationOnly": false + }, + { + "Name": "Wallet9273", + "ParticipationOnly": false + }, + { + "Name": "Wallet9274", + "ParticipationOnly": false + }, + { + "Name": "Wallet9275", + "ParticipationOnly": false + }, + { + "Name": "Wallet9276", + "ParticipationOnly": false + }, + { + "Name": "Wallet9277", + "ParticipationOnly": false + }, + { + "Name": "Wallet9278", + "ParticipationOnly": false + }, + { + "Name": "Wallet9279", + "ParticipationOnly": false + }, + { + "Name": "Wallet9280", + "ParticipationOnly": false + }, + { + "Name": "Wallet9281", + "ParticipationOnly": false + }, + { + "Name": "Wallet9282", + "ParticipationOnly": false + }, + { + "Name": "Wallet9283", + "ParticipationOnly": false + }, + { + "Name": "Wallet9284", + "ParticipationOnly": false + }, + { + "Name": "Wallet9285", + "ParticipationOnly": false + }, + { + "Name": "Wallet9286", + "ParticipationOnly": false + }, + { + "Name": "Wallet9287", + "ParticipationOnly": false + }, + { + "Name": "Wallet9288", + "ParticipationOnly": false + }, + { + "Name": "Wallet9289", + "ParticipationOnly": false + }, + { + "Name": "Wallet9290", + "ParticipationOnly": false + }, + { + "Name": "Wallet9291", + "ParticipationOnly": false + }, + { + "Name": "Wallet9292", + "ParticipationOnly": false + }, + { + "Name": "Wallet9293", + "ParticipationOnly": false + }, + { + "Name": "Wallet9294", + "ParticipationOnly": false + }, + { + "Name": "Wallet9295", + "ParticipationOnly": false + }, + { + "Name": "Wallet9296", + "ParticipationOnly": false + }, + { + "Name": "Wallet9297", + "ParticipationOnly": false + }, + { + "Name": "Wallet9298", + "ParticipationOnly": false + }, + { + "Name": "Wallet9299", + "ParticipationOnly": false + }, + { + "Name": "Wallet9300", + "ParticipationOnly": false + }, + { + "Name": "Wallet9301", + "ParticipationOnly": false + }, + { + "Name": "Wallet9302", + "ParticipationOnly": false + }, + { + "Name": "Wallet9303", + "ParticipationOnly": false + }, + { + "Name": "Wallet9304", + "ParticipationOnly": false + }, + { + "Name": "Wallet9305", + "ParticipationOnly": false + }, + { + "Name": "Wallet9306", + "ParticipationOnly": false + }, + { + "Name": "Wallet9307", + "ParticipationOnly": false + }, + { + "Name": "Wallet9308", + "ParticipationOnly": false + }, + { + "Name": "Wallet9309", + "ParticipationOnly": false + }, + { + "Name": "Wallet9310", + "ParticipationOnly": false + }, + { + "Name": "Wallet9311", + "ParticipationOnly": false + }, + { + "Name": "Wallet9312", + "ParticipationOnly": false + }, + { + "Name": "Wallet9313", + "ParticipationOnly": false + }, + { + "Name": "Wallet9314", + "ParticipationOnly": false + }, + { + "Name": "Wallet9315", + "ParticipationOnly": false + }, + { + "Name": "Wallet9316", + "ParticipationOnly": false + }, + { + "Name": "Wallet9317", + "ParticipationOnly": false + }, + { + "Name": "Wallet9318", + "ParticipationOnly": false + }, + { + "Name": "Wallet9319", + "ParticipationOnly": false + }, + { + "Name": "Wallet9320", + "ParticipationOnly": false + }, + { + "Name": "Wallet9321", + "ParticipationOnly": false + }, + { + "Name": "Wallet9322", + "ParticipationOnly": false + }, + { + "Name": "Wallet9323", + "ParticipationOnly": false + }, + { + "Name": "Wallet9324", + "ParticipationOnly": false + }, + { + "Name": "Wallet9325", + "ParticipationOnly": false + }, + { + "Name": "Wallet9326", + "ParticipationOnly": false + }, + { + "Name": "Wallet9327", + "ParticipationOnly": false + }, + { + "Name": "Wallet9328", + "ParticipationOnly": false + }, + { + "Name": "Wallet9329", + "ParticipationOnly": false + }, + { + "Name": "Wallet9330", + "ParticipationOnly": false + }, + { + "Name": "Wallet9331", + "ParticipationOnly": false + }, + { + "Name": "Wallet9332", + "ParticipationOnly": false + }, + { + "Name": "Wallet9333", + "ParticipationOnly": false + }, + { + "Name": "Wallet9334", + "ParticipationOnly": false + }, + { + "Name": "Wallet9335", + "ParticipationOnly": false + }, + { + "Name": "Wallet9336", + "ParticipationOnly": false + }, + { + "Name": "Wallet9337", + "ParticipationOnly": false + }, + { + "Name": "Wallet9338", + "ParticipationOnly": false + }, + { + "Name": "Wallet9339", + "ParticipationOnly": false + }, + { + "Name": "Wallet9340", + "ParticipationOnly": false + }, + { + "Name": "Wallet9341", + "ParticipationOnly": false + }, + { + "Name": "Wallet9342", + "ParticipationOnly": false + }, + { + "Name": "Wallet9343", + "ParticipationOnly": false + }, + { + "Name": "Wallet9344", + "ParticipationOnly": false + }, + { + "Name": "Wallet9345", + "ParticipationOnly": false + }, + { + "Name": "Wallet9346", + "ParticipationOnly": false + }, + { + "Name": "Wallet9347", + "ParticipationOnly": false + }, + { + "Name": "Wallet9348", + "ParticipationOnly": false + }, + { + "Name": "Wallet9349", + "ParticipationOnly": false + }, + { + "Name": "Wallet9350", + "ParticipationOnly": false + }, + { + "Name": "Wallet9351", + "ParticipationOnly": false + }, + { + "Name": "Wallet9352", + "ParticipationOnly": false + }, + { + "Name": "Wallet9353", + "ParticipationOnly": false + }, + { + "Name": "Wallet9354", + "ParticipationOnly": false + }, + { + "Name": "Wallet9355", + "ParticipationOnly": false + }, + { + "Name": "Wallet9356", + "ParticipationOnly": false + }, + { + "Name": "Wallet9357", + "ParticipationOnly": false + }, + { + "Name": "Wallet9358", + "ParticipationOnly": false + }, + { + "Name": "Wallet9359", + "ParticipationOnly": false + }, + { + "Name": "Wallet9360", + "ParticipationOnly": false + }, + { + "Name": "Wallet9361", + "ParticipationOnly": false + }, + { + "Name": "Wallet9362", + "ParticipationOnly": false + }, + { + "Name": "Wallet9363", + "ParticipationOnly": false + }, + { + "Name": "Wallet9364", + "ParticipationOnly": false + }, + { + "Name": "Wallet9365", + "ParticipationOnly": false + }, + { + "Name": "Wallet9366", + "ParticipationOnly": false + }, + { + "Name": "Wallet9367", + "ParticipationOnly": false + }, + { + "Name": "Wallet9368", + "ParticipationOnly": false + }, + { + "Name": "Wallet9369", + "ParticipationOnly": false + }, + { + "Name": "Wallet9370", + "ParticipationOnly": false + }, + { + "Name": "Wallet9371", + "ParticipationOnly": false + }, + { + "Name": "Wallet9372", + "ParticipationOnly": false + }, + { + "Name": "Wallet9373", + "ParticipationOnly": false + }, + { + "Name": "Wallet9374", + "ParticipationOnly": false + }, + { + "Name": "Wallet9375", + "ParticipationOnly": false + }, + { + "Name": "Wallet9376", + "ParticipationOnly": false + }, + { + "Name": "Wallet9377", + "ParticipationOnly": false + }, + { + "Name": "Wallet9378", + "ParticipationOnly": false + }, + { + "Name": "Wallet9379", + "ParticipationOnly": false + }, + { + "Name": "Wallet9380", + "ParticipationOnly": false + }, + { + "Name": "Wallet9381", + "ParticipationOnly": false + }, + { + "Name": "Wallet9382", + "ParticipationOnly": false + }, + { + "Name": "Wallet9383", + "ParticipationOnly": false + }, + { + "Name": "Wallet9384", + "ParticipationOnly": false + }, + { + "Name": "Wallet9385", + "ParticipationOnly": false + }, + { + "Name": "Wallet9386", + "ParticipationOnly": false + }, + { + "Name": "Wallet9387", + "ParticipationOnly": false + }, + { + "Name": "Wallet9388", + "ParticipationOnly": false + }, + { + "Name": "Wallet9389", + "ParticipationOnly": false + }, + { + "Name": "Wallet9390", + "ParticipationOnly": false + }, + { + "Name": "Wallet9391", + "ParticipationOnly": false + }, + { + "Name": "Wallet9392", + "ParticipationOnly": false + }, + { + "Name": "Wallet9393", + "ParticipationOnly": false + }, + { + "Name": "Wallet9394", + "ParticipationOnly": false + }, + { + "Name": "Wallet9395", + "ParticipationOnly": false + }, + { + "Name": "Wallet9396", + "ParticipationOnly": false + }, + { + "Name": "Wallet9397", + "ParticipationOnly": false + }, + { + "Name": "Wallet9398", + "ParticipationOnly": false + }, + { + "Name": "Wallet9399", + "ParticipationOnly": false + }, + { + "Name": "Wallet9400", + "ParticipationOnly": false + }, + { + "Name": "Wallet9401", + "ParticipationOnly": false + }, + { + "Name": "Wallet9402", + "ParticipationOnly": false + }, + { + "Name": "Wallet9403", + "ParticipationOnly": false + }, + { + "Name": "Wallet9404", + "ParticipationOnly": false + }, + { + "Name": "Wallet9405", + "ParticipationOnly": false + }, + { + "Name": "Wallet9406", + "ParticipationOnly": false + }, + { + "Name": "Wallet9407", + "ParticipationOnly": false + }, + { + "Name": "Wallet9408", + "ParticipationOnly": false + }, + { + "Name": "Wallet9409", + "ParticipationOnly": false + }, + { + "Name": "Wallet9410", + "ParticipationOnly": false + }, + { + "Name": "Wallet9411", + "ParticipationOnly": false + }, + { + "Name": "Wallet9412", + "ParticipationOnly": false + }, + { + "Name": "Wallet9413", + "ParticipationOnly": false + }, + { + "Name": "Wallet9414", + "ParticipationOnly": false + }, + { + "Name": "Wallet9415", + "ParticipationOnly": false + }, + { + "Name": "Wallet9416", + "ParticipationOnly": false + }, + { + "Name": "Wallet9417", + "ParticipationOnly": false + }, + { + "Name": "Wallet9418", + "ParticipationOnly": false + }, + { + "Name": "Wallet9419", + "ParticipationOnly": false + }, + { + "Name": "Wallet9420", + "ParticipationOnly": false + }, + { + "Name": "Wallet9421", + "ParticipationOnly": false + }, + { + "Name": "Wallet9422", + "ParticipationOnly": false + }, + { + "Name": "Wallet9423", + "ParticipationOnly": false + }, + { + "Name": "Wallet9424", + "ParticipationOnly": false + }, + { + "Name": "Wallet9425", + "ParticipationOnly": false + }, + { + "Name": "Wallet9426", + "ParticipationOnly": false + }, + { + "Name": "Wallet9427", + "ParticipationOnly": false + }, + { + "Name": "Wallet9428", + "ParticipationOnly": false + }, + { + "Name": "Wallet9429", + "ParticipationOnly": false + }, + { + "Name": "Wallet9430", + "ParticipationOnly": false + }, + { + "Name": "Wallet9431", + "ParticipationOnly": false + }, + { + "Name": "Wallet9432", + "ParticipationOnly": false + }, + { + "Name": "Wallet9433", + "ParticipationOnly": false + }, + { + "Name": "Wallet9434", + "ParticipationOnly": false + }, + { + "Name": "Wallet9435", + "ParticipationOnly": false + }, + { + "Name": "Wallet9436", + "ParticipationOnly": false + }, + { + "Name": "Wallet9437", + "ParticipationOnly": false + }, + { + "Name": "Wallet9438", + "ParticipationOnly": false + }, + { + "Name": "Wallet9439", + "ParticipationOnly": false + }, + { + "Name": "Wallet9440", + "ParticipationOnly": false + }, + { + "Name": "Wallet9441", + "ParticipationOnly": false + }, + { + "Name": "Wallet9442", + "ParticipationOnly": false + }, + { + "Name": "Wallet9443", + "ParticipationOnly": false + }, + { + "Name": "Wallet9444", + "ParticipationOnly": false + }, + { + "Name": "Wallet9445", + "ParticipationOnly": false + }, + { + "Name": "Wallet9446", + "ParticipationOnly": false + }, + { + "Name": "Wallet9447", + "ParticipationOnly": false + }, + { + "Name": "Wallet9448", + "ParticipationOnly": false + }, + { + "Name": "Wallet9449", + "ParticipationOnly": false + }, + { + "Name": "Wallet9450", + "ParticipationOnly": false + }, + { + "Name": "Wallet9451", + "ParticipationOnly": false + }, + { + "Name": "Wallet9452", + "ParticipationOnly": false + }, + { + "Name": "Wallet9453", + "ParticipationOnly": false + }, + { + "Name": "Wallet9454", + "ParticipationOnly": false + }, + { + "Name": "Wallet9455", + "ParticipationOnly": false + }, + { + "Name": "Wallet9456", + "ParticipationOnly": false + }, + { + "Name": "Wallet9457", + "ParticipationOnly": false + }, + { + "Name": "Wallet9458", + "ParticipationOnly": false + }, + { + "Name": "Wallet9459", + "ParticipationOnly": false + }, + { + "Name": "Wallet9460", + "ParticipationOnly": false + }, + { + "Name": "Wallet9461", + "ParticipationOnly": false + }, + { + "Name": "Wallet9462", + "ParticipationOnly": false + }, + { + "Name": "Wallet9463", + "ParticipationOnly": false + }, + { + "Name": "Wallet9464", + "ParticipationOnly": false + }, + { + "Name": "Wallet9465", + "ParticipationOnly": false + }, + { + "Name": "Wallet9466", + "ParticipationOnly": false + }, + { + "Name": "Wallet9467", + "ParticipationOnly": false + }, + { + "Name": "Wallet9468", + "ParticipationOnly": false + }, + { + "Name": "Wallet9469", + "ParticipationOnly": false + }, + { + "Name": "Wallet9470", + "ParticipationOnly": false + }, + { + "Name": "Wallet9471", + "ParticipationOnly": false + }, + { + "Name": "Wallet9472", + "ParticipationOnly": false + }, + { + "Name": "Wallet9473", + "ParticipationOnly": false + }, + { + "Name": "Wallet9474", + "ParticipationOnly": false + }, + { + "Name": "Wallet9475", + "ParticipationOnly": false + }, + { + "Name": "Wallet9476", + "ParticipationOnly": false + }, + { + "Name": "Wallet9477", + "ParticipationOnly": false + }, + { + "Name": "Wallet9478", + "ParticipationOnly": false + }, + { + "Name": "Wallet9479", + "ParticipationOnly": false + }, + { + "Name": "Wallet9480", + "ParticipationOnly": false + }, + { + "Name": "Wallet9481", + "ParticipationOnly": false + }, + { + "Name": "Wallet9482", + "ParticipationOnly": false + }, + { + "Name": "Wallet9483", + "ParticipationOnly": false + }, + { + "Name": "Wallet9484", + "ParticipationOnly": false + }, + { + "Name": "Wallet9485", + "ParticipationOnly": false + }, + { + "Name": "Wallet9486", + "ParticipationOnly": false + }, + { + "Name": "Wallet9487", + "ParticipationOnly": false + }, + { + "Name": "Wallet9488", + "ParticipationOnly": false + }, + { + "Name": "Wallet9489", + "ParticipationOnly": false + }, + { + "Name": "Wallet9490", + "ParticipationOnly": false + }, + { + "Name": "Wallet9491", + "ParticipationOnly": false + }, + { + "Name": "Wallet9492", + "ParticipationOnly": false + }, + { + "Name": "Wallet9493", + "ParticipationOnly": false + }, + { + "Name": "Wallet9494", + "ParticipationOnly": false + }, + { + "Name": "Wallet9495", + "ParticipationOnly": false + }, + { + "Name": "Wallet9496", + "ParticipationOnly": false + }, + { + "Name": "Wallet9497", + "ParticipationOnly": false + }, + { + "Name": "Wallet9498", + "ParticipationOnly": false + }, + { + "Name": "Wallet9499", + "ParticipationOnly": false + }, + { + "Name": "Wallet9500", + "ParticipationOnly": false + }, + { + "Name": "Wallet9501", + "ParticipationOnly": false + }, + { + "Name": "Wallet9502", + "ParticipationOnly": false + }, + { + "Name": "Wallet9503", + "ParticipationOnly": false + }, + { + "Name": "Wallet9504", + "ParticipationOnly": false + }, + { + "Name": "Wallet9505", + "ParticipationOnly": false + }, + { + "Name": "Wallet9506", + "ParticipationOnly": false + }, + { + "Name": "Wallet9507", + "ParticipationOnly": false + }, + { + "Name": "Wallet9508", + "ParticipationOnly": false + }, + { + "Name": "Wallet9509", + "ParticipationOnly": false + }, + { + "Name": "Wallet9510", + "ParticipationOnly": false + }, + { + "Name": "Wallet9511", + "ParticipationOnly": false + }, + { + "Name": "Wallet9512", + "ParticipationOnly": false + }, + { + "Name": "Wallet9513", + "ParticipationOnly": false + }, + { + "Name": "Wallet9514", + "ParticipationOnly": false + }, + { + "Name": "Wallet9515", + "ParticipationOnly": false + }, + { + "Name": "Wallet9516", + "ParticipationOnly": false + }, + { + "Name": "Wallet9517", + "ParticipationOnly": false + }, + { + "Name": "Wallet9518", + "ParticipationOnly": false + }, + { + "Name": "Wallet9519", + "ParticipationOnly": false + }, + { + "Name": "Wallet9520", + "ParticipationOnly": false + }, + { + "Name": "Wallet9521", + "ParticipationOnly": false + }, + { + "Name": "Wallet9522", + "ParticipationOnly": false + }, + { + "Name": "Wallet9523", + "ParticipationOnly": false + }, + { + "Name": "Wallet9524", + "ParticipationOnly": false + }, + { + "Name": "Wallet9525", + "ParticipationOnly": false + }, + { + "Name": "Wallet9526", + "ParticipationOnly": false + }, + { + "Name": "Wallet9527", + "ParticipationOnly": false + }, + { + "Name": "Wallet9528", + "ParticipationOnly": false + }, + { + "Name": "Wallet9529", + "ParticipationOnly": false + }, + { + "Name": "Wallet9530", + "ParticipationOnly": false + }, + { + "Name": "Wallet9531", + "ParticipationOnly": false + }, + { + "Name": "Wallet9532", + "ParticipationOnly": false + }, + { + "Name": "Wallet9533", + "ParticipationOnly": false + }, + { + "Name": "Wallet9534", + "ParticipationOnly": false + }, + { + "Name": "Wallet9535", + "ParticipationOnly": false + }, + { + "Name": "Wallet9536", + "ParticipationOnly": false + }, + { + "Name": "Wallet9537", + "ParticipationOnly": false + }, + { + "Name": "Wallet9538", + "ParticipationOnly": false + }, + { + "Name": "Wallet9539", + "ParticipationOnly": false + }, + { + "Name": "Wallet9540", + "ParticipationOnly": false + }, + { + "Name": "Wallet9541", + "ParticipationOnly": false + }, + { + "Name": "Wallet9542", + "ParticipationOnly": false + }, + { + "Name": "Wallet9543", + "ParticipationOnly": false + }, + { + "Name": "Wallet9544", + "ParticipationOnly": false + }, + { + "Name": "Wallet9545", + "ParticipationOnly": false + }, + { + "Name": "Wallet9546", + "ParticipationOnly": false + }, + { + "Name": "Wallet9547", + "ParticipationOnly": false + }, + { + "Name": "Wallet9548", + "ParticipationOnly": false + }, + { + "Name": "Wallet9549", + "ParticipationOnly": false + }, + { + "Name": "Wallet9550", + "ParticipationOnly": false + }, + { + "Name": "Wallet9551", + "ParticipationOnly": false + }, + { + "Name": "Wallet9552", + "ParticipationOnly": false + }, + { + "Name": "Wallet9553", + "ParticipationOnly": false + }, + { + "Name": "Wallet9554", + "ParticipationOnly": false + }, + { + "Name": "Wallet9555", + "ParticipationOnly": false + }, + { + "Name": "Wallet9556", + "ParticipationOnly": false + }, + { + "Name": "Wallet9557", + "ParticipationOnly": false + }, + { + "Name": "Wallet9558", + "ParticipationOnly": false + }, + { + "Name": "Wallet9559", + "ParticipationOnly": false + }, + { + "Name": "Wallet9560", + "ParticipationOnly": false + }, + { + "Name": "Wallet9561", + "ParticipationOnly": false + }, + { + "Name": "Wallet9562", + "ParticipationOnly": false + }, + { + "Name": "Wallet9563", + "ParticipationOnly": false + }, + { + "Name": "Wallet9564", + "ParticipationOnly": false + }, + { + "Name": "Wallet9565", + "ParticipationOnly": false + }, + { + "Name": "Wallet9566", + "ParticipationOnly": false + }, + { + "Name": "Wallet9567", + "ParticipationOnly": false + }, + { + "Name": "Wallet9568", + "ParticipationOnly": false + }, + { + "Name": "Wallet9569", + "ParticipationOnly": false + }, + { + "Name": "Wallet9570", + "ParticipationOnly": false + }, + { + "Name": "Wallet9571", + "ParticipationOnly": false + }, + { + "Name": "Wallet9572", + "ParticipationOnly": false + }, + { + "Name": "Wallet9573", + "ParticipationOnly": false + }, + { + "Name": "Wallet9574", + "ParticipationOnly": false + }, + { + "Name": "Wallet9575", + "ParticipationOnly": false + }, + { + "Name": "Wallet9576", + "ParticipationOnly": false + }, + { + "Name": "Wallet9577", + "ParticipationOnly": false + }, + { + "Name": "Wallet9578", + "ParticipationOnly": false + }, + { + "Name": "Wallet9579", + "ParticipationOnly": false + }, + { + "Name": "Wallet9580", + "ParticipationOnly": false + }, + { + "Name": "Wallet9581", + "ParticipationOnly": false + }, + { + "Name": "Wallet9582", + "ParticipationOnly": false + }, + { + "Name": "Wallet9583", + "ParticipationOnly": false + }, + { + "Name": "Wallet9584", + "ParticipationOnly": false + }, + { + "Name": "Wallet9585", + "ParticipationOnly": false + }, + { + "Name": "Wallet9586", + "ParticipationOnly": false + }, + { + "Name": "Wallet9587", + "ParticipationOnly": false + }, + { + "Name": "Wallet9588", + "ParticipationOnly": false + }, + { + "Name": "Wallet9589", + "ParticipationOnly": false + }, + { + "Name": "Wallet9590", + "ParticipationOnly": false + }, + { + "Name": "Wallet9591", + "ParticipationOnly": false + }, + { + "Name": "Wallet9592", + "ParticipationOnly": false + }, + { + "Name": "Wallet9593", + "ParticipationOnly": false + }, + { + "Name": "Wallet9594", + "ParticipationOnly": false + }, + { + "Name": "Wallet9595", + "ParticipationOnly": false + }, + { + "Name": "Wallet9596", + "ParticipationOnly": false + }, + { + "Name": "Wallet9597", + "ParticipationOnly": false + }, + { + "Name": "Wallet9598", + "ParticipationOnly": false + }, + { + "Name": "Wallet9599", + "ParticipationOnly": false + }, + { + "Name": "Wallet9600", + "ParticipationOnly": false + }, + { + "Name": "Wallet9601", + "ParticipationOnly": false + }, + { + "Name": "Wallet9602", + "ParticipationOnly": false + }, + { + "Name": "Wallet9603", + "ParticipationOnly": false + }, + { + "Name": "Wallet9604", + "ParticipationOnly": false + }, + { + "Name": "Wallet9605", + "ParticipationOnly": false + }, + { + "Name": "Wallet9606", + "ParticipationOnly": false + }, + { + "Name": "Wallet9607", + "ParticipationOnly": false + }, + { + "Name": "Wallet9608", + "ParticipationOnly": false + }, + { + "Name": "Wallet9609", + "ParticipationOnly": false + }, + { + "Name": "Wallet9610", + "ParticipationOnly": false + }, + { + "Name": "Wallet9611", + "ParticipationOnly": false + }, + { + "Name": "Wallet9612", + "ParticipationOnly": false + }, + { + "Name": "Wallet9613", + "ParticipationOnly": false + }, + { + "Name": "Wallet9614", + "ParticipationOnly": false + }, + { + "Name": "Wallet9615", + "ParticipationOnly": false + }, + { + "Name": "Wallet9616", + "ParticipationOnly": false + }, + { + "Name": "Wallet9617", + "ParticipationOnly": false + }, + { + "Name": "Wallet9618", + "ParticipationOnly": false + }, + { + "Name": "Wallet9619", + "ParticipationOnly": false + }, + { + "Name": "Wallet9620", + "ParticipationOnly": false + }, + { + "Name": "Wallet9621", + "ParticipationOnly": false + }, + { + "Name": "Wallet9622", + "ParticipationOnly": false + }, + { + "Name": "Wallet9623", + "ParticipationOnly": false + }, + { + "Name": "Wallet9624", + "ParticipationOnly": false + }, + { + "Name": "Wallet9625", + "ParticipationOnly": false + }, + { + "Name": "Wallet9626", + "ParticipationOnly": false + }, + { + "Name": "Wallet9627", + "ParticipationOnly": false + }, + { + "Name": "Wallet9628", + "ParticipationOnly": false + }, + { + "Name": "Wallet9629", + "ParticipationOnly": false + }, + { + "Name": "Wallet9630", + "ParticipationOnly": false + }, + { + "Name": "Wallet9631", + "ParticipationOnly": false + }, + { + "Name": "Wallet9632", + "ParticipationOnly": false + }, + { + "Name": "Wallet9633", + "ParticipationOnly": false + }, + { + "Name": "Wallet9634", + "ParticipationOnly": false + }, + { + "Name": "Wallet9635", + "ParticipationOnly": false + }, + { + "Name": "Wallet9636", + "ParticipationOnly": false + }, + { + "Name": "Wallet9637", + "ParticipationOnly": false + }, + { + "Name": "Wallet9638", + "ParticipationOnly": false + }, + { + "Name": "Wallet9639", + "ParticipationOnly": false + }, + { + "Name": "Wallet9640", + "ParticipationOnly": false + }, + { + "Name": "Wallet9641", + "ParticipationOnly": false + }, + { + "Name": "Wallet9642", + "ParticipationOnly": false + }, + { + "Name": "Wallet9643", + "ParticipationOnly": false + }, + { + "Name": "Wallet9644", + "ParticipationOnly": false + }, + { + "Name": "Wallet9645", + "ParticipationOnly": false + }, + { + "Name": "Wallet9646", + "ParticipationOnly": false + }, + { + "Name": "Wallet9647", + "ParticipationOnly": false + }, + { + "Name": "Wallet9648", + "ParticipationOnly": false + }, + { + "Name": "Wallet9649", + "ParticipationOnly": false + }, + { + "Name": "Wallet9650", + "ParticipationOnly": false + }, + { + "Name": "Wallet9651", + "ParticipationOnly": false + }, + { + "Name": "Wallet9652", + "ParticipationOnly": false + }, + { + "Name": "Wallet9653", + "ParticipationOnly": false + }, + { + "Name": "Wallet9654", + "ParticipationOnly": false + }, + { + "Name": "Wallet9655", + "ParticipationOnly": false + }, + { + "Name": "Wallet9656", + "ParticipationOnly": false + }, + { + "Name": "Wallet9657", + "ParticipationOnly": false + }, + { + "Name": "Wallet9658", + "ParticipationOnly": false + }, + { + "Name": "Wallet9659", + "ParticipationOnly": false + }, + { + "Name": "Wallet9660", + "ParticipationOnly": false + }, + { + "Name": "Wallet9661", + "ParticipationOnly": false + }, + { + "Name": "Wallet9662", + "ParticipationOnly": false + }, + { + "Name": "Wallet9663", + "ParticipationOnly": false + }, + { + "Name": "Wallet9664", + "ParticipationOnly": false + }, + { + "Name": "Wallet9665", + "ParticipationOnly": false + }, + { + "Name": "Wallet9666", + "ParticipationOnly": false + }, + { + "Name": "Wallet9667", + "ParticipationOnly": false + }, + { + "Name": "Wallet9668", + "ParticipationOnly": false + }, + { + "Name": "Wallet9669", + "ParticipationOnly": false + }, + { + "Name": "Wallet9670", + "ParticipationOnly": false + }, + { + "Name": "Wallet9671", + "ParticipationOnly": false + }, + { + "Name": "Wallet9672", + "ParticipationOnly": false + }, + { + "Name": "Wallet9673", + "ParticipationOnly": false + }, + { + "Name": "Wallet9674", + "ParticipationOnly": false + }, + { + "Name": "Wallet9675", + "ParticipationOnly": false + }, + { + "Name": "Wallet9676", + "ParticipationOnly": false + }, + { + "Name": "Wallet9677", + "ParticipationOnly": false + }, + { + "Name": "Wallet9678", + "ParticipationOnly": false + }, + { + "Name": "Wallet9679", + "ParticipationOnly": false + }, + { + "Name": "Wallet9680", + "ParticipationOnly": false + }, + { + "Name": "Wallet9681", + "ParticipationOnly": false + }, + { + "Name": "Wallet9682", + "ParticipationOnly": false + }, + { + "Name": "Wallet9683", + "ParticipationOnly": false + }, + { + "Name": "Wallet9684", + "ParticipationOnly": false + }, + { + "Name": "Wallet9685", + "ParticipationOnly": false + }, + { + "Name": "Wallet9686", + "ParticipationOnly": false + }, + { + "Name": "Wallet9687", + "ParticipationOnly": false + }, + { + "Name": "Wallet9688", + "ParticipationOnly": false + }, + { + "Name": "Wallet9689", + "ParticipationOnly": false + }, + { + "Name": "Wallet9690", + "ParticipationOnly": false + }, + { + "Name": "Wallet9691", + "ParticipationOnly": false + }, + { + "Name": "Wallet9692", + "ParticipationOnly": false + }, + { + "Name": "Wallet9693", + "ParticipationOnly": false + }, + { + "Name": "Wallet9694", + "ParticipationOnly": false + }, + { + "Name": "Wallet9695", + "ParticipationOnly": false + }, + { + "Name": "Wallet9696", + "ParticipationOnly": false + }, + { + "Name": "Wallet9697", + "ParticipationOnly": false + }, + { + "Name": "Wallet9698", + "ParticipationOnly": false + }, + { + "Name": "Wallet9699", + "ParticipationOnly": false + }, + { + "Name": "Wallet9700", + "ParticipationOnly": false + }, + { + "Name": "Wallet9701", + "ParticipationOnly": false + }, + { + "Name": "Wallet9702", + "ParticipationOnly": false + }, + { + "Name": "Wallet9703", + "ParticipationOnly": false + }, + { + "Name": "Wallet9704", + "ParticipationOnly": false + }, + { + "Name": "Wallet9705", + "ParticipationOnly": false + }, + { + "Name": "Wallet9706", + "ParticipationOnly": false + }, + { + "Name": "Wallet9707", + "ParticipationOnly": false + }, + { + "Name": "Wallet9708", + "ParticipationOnly": false + }, + { + "Name": "Wallet9709", + "ParticipationOnly": false + }, + { + "Name": "Wallet9710", + "ParticipationOnly": false + }, + { + "Name": "Wallet9711", + "ParticipationOnly": false + }, + { + "Name": "Wallet9712", + "ParticipationOnly": false + }, + { + "Name": "Wallet9713", + "ParticipationOnly": false + }, + { + "Name": "Wallet9714", + "ParticipationOnly": false + }, + { + "Name": "Wallet9715", + "ParticipationOnly": false + }, + { + "Name": "Wallet9716", + "ParticipationOnly": false + }, + { + "Name": "Wallet9717", + "ParticipationOnly": false + }, + { + "Name": "Wallet9718", + "ParticipationOnly": false + }, + { + "Name": "Wallet9719", + "ParticipationOnly": false + }, + { + "Name": "Wallet9720", + "ParticipationOnly": false + }, + { + "Name": "Wallet9721", + "ParticipationOnly": false + }, + { + "Name": "Wallet9722", + "ParticipationOnly": false + }, + { + "Name": "Wallet9723", + "ParticipationOnly": false + }, + { + "Name": "Wallet9724", + "ParticipationOnly": false + }, + { + "Name": "Wallet9725", + "ParticipationOnly": false + }, + { + "Name": "Wallet9726", + "ParticipationOnly": false + }, + { + "Name": "Wallet9727", + "ParticipationOnly": false + }, + { + "Name": "Wallet9728", + "ParticipationOnly": false + }, + { + "Name": "Wallet9729", + "ParticipationOnly": false + }, + { + "Name": "Wallet9730", + "ParticipationOnly": false + }, + { + "Name": "Wallet9731", + "ParticipationOnly": false + }, + { + "Name": "Wallet9732", + "ParticipationOnly": false + }, + { + "Name": "Wallet9733", + "ParticipationOnly": false + }, + { + "Name": "Wallet9734", + "ParticipationOnly": false + }, + { + "Name": "Wallet9735", + "ParticipationOnly": false + }, + { + "Name": "Wallet9736", + "ParticipationOnly": false + }, + { + "Name": "Wallet9737", + "ParticipationOnly": false + }, + { + "Name": "Wallet9738", + "ParticipationOnly": false + }, + { + "Name": "Wallet9739", + "ParticipationOnly": false + }, + { + "Name": "Wallet9740", + "ParticipationOnly": false + }, + { + "Name": "Wallet9741", + "ParticipationOnly": false + }, + { + "Name": "Wallet9742", + "ParticipationOnly": false + }, + { + "Name": "Wallet9743", + "ParticipationOnly": false + }, + { + "Name": "Wallet9744", + "ParticipationOnly": false + }, + { + "Name": "Wallet9745", + "ParticipationOnly": false + }, + { + "Name": "Wallet9746", + "ParticipationOnly": false + }, + { + "Name": "Wallet9747", + "ParticipationOnly": false + }, + { + "Name": "Wallet9748", + "ParticipationOnly": false + }, + { + "Name": "Wallet9749", + "ParticipationOnly": false + }, + { + "Name": "Wallet9750", + "ParticipationOnly": false + }, + { + "Name": "Wallet9751", + "ParticipationOnly": false + }, + { + "Name": "Wallet9752", + "ParticipationOnly": false + }, + { + "Name": "Wallet9753", + "ParticipationOnly": false + }, + { + "Name": "Wallet9754", + "ParticipationOnly": false + }, + { + "Name": "Wallet9755", + "ParticipationOnly": false + }, + { + "Name": "Wallet9756", + "ParticipationOnly": false + }, + { + "Name": "Wallet9757", + "ParticipationOnly": false + }, + { + "Name": "Wallet9758", + "ParticipationOnly": false + }, + { + "Name": "Wallet9759", + "ParticipationOnly": false + }, + { + "Name": "Wallet9760", + "ParticipationOnly": false + }, + { + "Name": "Wallet9761", + "ParticipationOnly": false + }, + { + "Name": "Wallet9762", + "ParticipationOnly": false + }, + { + "Name": "Wallet9763", + "ParticipationOnly": false + }, + { + "Name": "Wallet9764", + "ParticipationOnly": false + }, + { + "Name": "Wallet9765", + "ParticipationOnly": false + }, + { + "Name": "Wallet9766", + "ParticipationOnly": false + }, + { + "Name": "Wallet9767", + "ParticipationOnly": false + }, + { + "Name": "Wallet9768", + "ParticipationOnly": false + }, + { + "Name": "Wallet9769", + "ParticipationOnly": false + }, + { + "Name": "Wallet9770", + "ParticipationOnly": false + }, + { + "Name": "Wallet9771", + "ParticipationOnly": false + }, + { + "Name": "Wallet9772", + "ParticipationOnly": false + }, + { + "Name": "Wallet9773", + "ParticipationOnly": false + }, + { + "Name": "Wallet9774", + "ParticipationOnly": false + }, + { + "Name": "Wallet9775", + "ParticipationOnly": false + }, + { + "Name": "Wallet9776", + "ParticipationOnly": false + }, + { + "Name": "Wallet9777", + "ParticipationOnly": false + }, + { + "Name": "Wallet9778", + "ParticipationOnly": false + }, + { + "Name": "Wallet9779", + "ParticipationOnly": false + }, + { + "Name": "Wallet9780", + "ParticipationOnly": false + }, + { + "Name": "Wallet9781", + "ParticipationOnly": false + }, + { + "Name": "Wallet9782", + "ParticipationOnly": false + }, + { + "Name": "Wallet9783", + "ParticipationOnly": false + }, + { + "Name": "Wallet9784", + "ParticipationOnly": false + }, + { + "Name": "Wallet9785", + "ParticipationOnly": false + }, + { + "Name": "Wallet9786", + "ParticipationOnly": false + }, + { + "Name": "Wallet9787", + "ParticipationOnly": false + }, + { + "Name": "Wallet9788", + "ParticipationOnly": false + }, + { + "Name": "Wallet9789", + "ParticipationOnly": false + }, + { + "Name": "Wallet9790", + "ParticipationOnly": false + }, + { + "Name": "Wallet9791", + "ParticipationOnly": false + }, + { + "Name": "Wallet9792", + "ParticipationOnly": false + }, + { + "Name": "Wallet9793", + "ParticipationOnly": false + }, + { + "Name": "Wallet9794", + "ParticipationOnly": false + }, + { + "Name": "Wallet9795", + "ParticipationOnly": false + }, + { + "Name": "Wallet9796", + "ParticipationOnly": false + }, + { + "Name": "Wallet9797", + "ParticipationOnly": false + }, + { + "Name": "Wallet9798", + "ParticipationOnly": false + }, + { + "Name": "Wallet9799", + "ParticipationOnly": false + }, + { + "Name": "Wallet9800", + "ParticipationOnly": false + }, + { + "Name": "Wallet9801", + "ParticipationOnly": false + }, + { + "Name": "Wallet9802", + "ParticipationOnly": false + }, + { + "Name": "Wallet9803", + "ParticipationOnly": false + }, + { + "Name": "Wallet9804", + "ParticipationOnly": false + }, + { + "Name": "Wallet9805", + "ParticipationOnly": false + }, + { + "Name": "Wallet9806", + "ParticipationOnly": false + }, + { + "Name": "Wallet9807", + "ParticipationOnly": false + }, + { + "Name": "Wallet9808", + "ParticipationOnly": false + }, + { + "Name": "Wallet9809", + "ParticipationOnly": false + }, + { + "Name": "Wallet9810", + "ParticipationOnly": false + }, + { + "Name": "Wallet9811", + "ParticipationOnly": false + }, + { + "Name": "Wallet9812", + "ParticipationOnly": false + }, + { + "Name": "Wallet9813", + "ParticipationOnly": false + }, + { + "Name": "Wallet9814", + "ParticipationOnly": false + }, + { + "Name": "Wallet9815", + "ParticipationOnly": false + }, + { + "Name": "Wallet9816", + "ParticipationOnly": false + }, + { + "Name": "Wallet9817", + "ParticipationOnly": false + }, + { + "Name": "Wallet9818", + "ParticipationOnly": false + }, + { + "Name": "Wallet9819", + "ParticipationOnly": false + }, + { + "Name": "Wallet9820", + "ParticipationOnly": false + }, + { + "Name": "Wallet9821", + "ParticipationOnly": false + }, + { + "Name": "Wallet9822", + "ParticipationOnly": false + }, + { + "Name": "Wallet9823", + "ParticipationOnly": false + }, + { + "Name": "Wallet9824", + "ParticipationOnly": false + }, + { + "Name": "Wallet9825", + "ParticipationOnly": false + }, + { + "Name": "Wallet9826", + "ParticipationOnly": false + }, + { + "Name": "Wallet9827", + "ParticipationOnly": false + }, + { + "Name": "Wallet9828", + "ParticipationOnly": false + }, + { + "Name": "Wallet9829", + "ParticipationOnly": false + }, + { + "Name": "Wallet9830", + "ParticipationOnly": false + }, + { + "Name": "Wallet9831", + "ParticipationOnly": false + }, + { + "Name": "Wallet9832", + "ParticipationOnly": false + }, + { + "Name": "Wallet9833", + "ParticipationOnly": false + }, + { + "Name": "Wallet9834", + "ParticipationOnly": false + }, + { + "Name": "Wallet9835", + "ParticipationOnly": false + }, + { + "Name": "Wallet9836", + "ParticipationOnly": false + }, + { + "Name": "Wallet9837", + "ParticipationOnly": false + }, + { + "Name": "Wallet9838", + "ParticipationOnly": false + }, + { + "Name": "Wallet9839", + "ParticipationOnly": false + }, + { + "Name": "Wallet9840", + "ParticipationOnly": false + }, + { + "Name": "Wallet9841", + "ParticipationOnly": false + }, + { + "Name": "Wallet9842", + "ParticipationOnly": false + }, + { + "Name": "Wallet9843", + "ParticipationOnly": false + }, + { + "Name": "Wallet9844", + "ParticipationOnly": false + }, + { + "Name": "Wallet9845", + "ParticipationOnly": false + }, + { + "Name": "Wallet9846", + "ParticipationOnly": false + }, + { + "Name": "Wallet9847", + "ParticipationOnly": false + }, + { + "Name": "Wallet9848", + "ParticipationOnly": false + }, + { + "Name": "Wallet9849", + "ParticipationOnly": false + }, + { + "Name": "Wallet9850", + "ParticipationOnly": false + }, + { + "Name": "Wallet9851", + "ParticipationOnly": false + }, + { + "Name": "Wallet9852", + "ParticipationOnly": false + }, + { + "Name": "Wallet9853", + "ParticipationOnly": false + }, + { + "Name": "Wallet9854", + "ParticipationOnly": false + }, + { + "Name": "Wallet9855", + "ParticipationOnly": false + }, + { + "Name": "Wallet9856", + "ParticipationOnly": false + }, + { + "Name": "Wallet9857", + "ParticipationOnly": false + }, + { + "Name": "Wallet9858", + "ParticipationOnly": false + }, + { + "Name": "Wallet9859", + "ParticipationOnly": false + }, + { + "Name": "Wallet9860", + "ParticipationOnly": false + }, + { + "Name": "Wallet9861", + "ParticipationOnly": false + }, + { + "Name": "Wallet9862", + "ParticipationOnly": false + }, + { + "Name": "Wallet9863", + "ParticipationOnly": false + }, + { + "Name": "Wallet9864", + "ParticipationOnly": false + }, + { + "Name": "Wallet9865", + "ParticipationOnly": false + }, + { + "Name": "Wallet9866", + "ParticipationOnly": false + }, + { + "Name": "Wallet9867", + "ParticipationOnly": false + }, + { + "Name": "Wallet9868", + "ParticipationOnly": false + }, + { + "Name": "Wallet9869", + "ParticipationOnly": false + }, + { + "Name": "Wallet9870", + "ParticipationOnly": false + }, + { + "Name": "Wallet9871", + "ParticipationOnly": false + }, + { + "Name": "Wallet9872", + "ParticipationOnly": false + }, + { + "Name": "Wallet9873", + "ParticipationOnly": false + }, + { + "Name": "Wallet9874", + "ParticipationOnly": false + }, + { + "Name": "Wallet9875", + "ParticipationOnly": false + }, + { + "Name": "Wallet9876", + "ParticipationOnly": false + }, + { + "Name": "Wallet9877", + "ParticipationOnly": false + }, + { + "Name": "Wallet9878", + "ParticipationOnly": false + }, + { + "Name": "Wallet9879", + "ParticipationOnly": false + }, + { + "Name": "Wallet9880", + "ParticipationOnly": false + }, + { + "Name": "Wallet9881", + "ParticipationOnly": false + }, + { + "Name": "Wallet9882", + "ParticipationOnly": false + }, + { + "Name": "Wallet9883", + "ParticipationOnly": false + }, + { + "Name": "Wallet9884", + "ParticipationOnly": false + }, + { + "Name": "Wallet9885", + "ParticipationOnly": false + }, + { + "Name": "Wallet9886", + "ParticipationOnly": false + }, + { + "Name": "Wallet9887", + "ParticipationOnly": false + }, + { + "Name": "Wallet9888", + "ParticipationOnly": false + }, + { + "Name": "Wallet9889", + "ParticipationOnly": false + }, + { + "Name": "Wallet9890", + "ParticipationOnly": false + }, + { + "Name": "Wallet9891", + "ParticipationOnly": false + }, + { + "Name": "Wallet9892", + "ParticipationOnly": false + }, + { + "Name": "Wallet9893", + "ParticipationOnly": false + }, + { + "Name": "Wallet9894", + "ParticipationOnly": false + }, + { + "Name": "Wallet9895", + "ParticipationOnly": false + }, + { + "Name": "Wallet9896", + "ParticipationOnly": false + }, + { + "Name": "Wallet9897", + "ParticipationOnly": false + }, + { + "Name": "Wallet9898", + "ParticipationOnly": false + }, + { + "Name": "Wallet9899", + "ParticipationOnly": false + }, + { + "Name": "Wallet9900", + "ParticipationOnly": false + }, + { + "Name": "Wallet9901", + "ParticipationOnly": false + }, + { + "Name": "Wallet9902", + "ParticipationOnly": false + }, + { + "Name": "Wallet9903", + "ParticipationOnly": false + }, + { + "Name": "Wallet9904", + "ParticipationOnly": false + }, + { + "Name": "Wallet9905", + "ParticipationOnly": false + }, + { + "Name": "Wallet9906", + "ParticipationOnly": false + }, + { + "Name": "Wallet9907", + "ParticipationOnly": false + }, + { + "Name": "Wallet9908", + "ParticipationOnly": false + }, + { + "Name": "Wallet9909", + "ParticipationOnly": false + }, + { + "Name": "Wallet9910", + "ParticipationOnly": false + }, + { + "Name": "Wallet9911", + "ParticipationOnly": false + }, + { + "Name": "Wallet9912", + "ParticipationOnly": false + }, + { + "Name": "Wallet9913", + "ParticipationOnly": false + }, + { + "Name": "Wallet9914", + "ParticipationOnly": false + }, + { + "Name": "Wallet9915", + "ParticipationOnly": false + }, + { + "Name": "Wallet9916", + "ParticipationOnly": false + }, + { + "Name": "Wallet9917", + "ParticipationOnly": false + }, + { + "Name": "Wallet9918", + "ParticipationOnly": false + }, + { + "Name": "Wallet9919", + "ParticipationOnly": false + }, + { + "Name": "Wallet9920", + "ParticipationOnly": false + }, + { + "Name": "Wallet9921", + "ParticipationOnly": false + }, + { + "Name": "Wallet9922", + "ParticipationOnly": false + }, + { + "Name": "Wallet9923", + "ParticipationOnly": false + }, + { + "Name": "Wallet9924", + "ParticipationOnly": false + }, + { + "Name": "Wallet9925", + "ParticipationOnly": false + }, + { + "Name": "Wallet9926", + "ParticipationOnly": false + }, + { + "Name": "Wallet9927", + "ParticipationOnly": false + }, + { + "Name": "Wallet9928", + "ParticipationOnly": false + }, + { + "Name": "Wallet9929", + "ParticipationOnly": false + }, + { + "Name": "Wallet9930", + "ParticipationOnly": false + }, + { + "Name": "Wallet9931", + "ParticipationOnly": false + }, + { + "Name": "Wallet9932", + "ParticipationOnly": false + }, + { + "Name": "Wallet9933", + "ParticipationOnly": false + }, + { + "Name": "Wallet9934", + "ParticipationOnly": false + }, + { + "Name": "Wallet9935", + "ParticipationOnly": false + }, + { + "Name": "Wallet9936", + "ParticipationOnly": false + }, + { + "Name": "Wallet9937", + "ParticipationOnly": false + }, + { + "Name": "Wallet9938", + "ParticipationOnly": false + }, + { + "Name": "Wallet9939", + "ParticipationOnly": false + }, + { + "Name": "Wallet9940", + "ParticipationOnly": false + }, + { + "Name": "Wallet9941", + "ParticipationOnly": false + }, + { + "Name": "Wallet9942", + "ParticipationOnly": false + }, + { + "Name": "Wallet9943", + "ParticipationOnly": false + }, + { + "Name": "Wallet9944", + "ParticipationOnly": false + }, + { + "Name": "Wallet9945", + "ParticipationOnly": false + }, + { + "Name": "Wallet9946", + "ParticipationOnly": false + }, + { + "Name": "Wallet9947", + "ParticipationOnly": false + }, + { + "Name": "Wallet9948", + "ParticipationOnly": false + }, + { + "Name": "Wallet9949", + "ParticipationOnly": false + }, + { + "Name": "Wallet9950", + "ParticipationOnly": false + }, + { + "Name": "Wallet9951", + "ParticipationOnly": false + }, + { + "Name": "Wallet9952", + "ParticipationOnly": false + }, + { + "Name": "Wallet9953", + "ParticipationOnly": false + }, + { + "Name": "Wallet9954", + "ParticipationOnly": false + }, + { + "Name": "Wallet9955", + "ParticipationOnly": false + }, + { + "Name": "Wallet9956", + "ParticipationOnly": false + }, + { + "Name": "Wallet9957", + "ParticipationOnly": false + }, + { + "Name": "Wallet9958", + "ParticipationOnly": false + }, + { + "Name": "Wallet9959", + "ParticipationOnly": false + }, + { + "Name": "Wallet9960", + "ParticipationOnly": false + }, + { + "Name": "Wallet9961", + "ParticipationOnly": false + }, + { + "Name": "Wallet9962", + "ParticipationOnly": false + }, + { + "Name": "Wallet9963", + "ParticipationOnly": false + }, + { + "Name": "Wallet9964", + "ParticipationOnly": false + }, + { + "Name": "Wallet9965", + "ParticipationOnly": false + }, + { + "Name": "Wallet9966", + "ParticipationOnly": false + }, + { + "Name": "Wallet9967", + "ParticipationOnly": false + }, + { + "Name": "Wallet9968", + "ParticipationOnly": false + }, + { + "Name": "Wallet9969", + "ParticipationOnly": false + }, + { + "Name": "Wallet9970", + "ParticipationOnly": false + }, + { + "Name": "Wallet9971", + "ParticipationOnly": false + }, + { + "Name": "Wallet9972", + "ParticipationOnly": false + }, + { + "Name": "Wallet9973", + "ParticipationOnly": false + }, + { + "Name": "Wallet9974", + "ParticipationOnly": false + }, + { + "Name": "Wallet9975", + "ParticipationOnly": false + }, + { + "Name": "Wallet9976", + "ParticipationOnly": false + }, + { + "Name": "Wallet9977", + "ParticipationOnly": false + }, + { + "Name": "Wallet9978", + "ParticipationOnly": false + }, + { + "Name": "Wallet9979", + "ParticipationOnly": false + }, + { + "Name": "Wallet9980", + "ParticipationOnly": false + }, + { + "Name": "Wallet9981", + "ParticipationOnly": false + }, + { + "Name": "Wallet9982", + "ParticipationOnly": false + }, + { + "Name": "Wallet9983", + "ParticipationOnly": false + }, + { + "Name": "Wallet9984", + "ParticipationOnly": false + }, + { + "Name": "Wallet9985", + "ParticipationOnly": false + }, + { + "Name": "Wallet9986", + "ParticipationOnly": false + }, + { + "Name": "Wallet9987", + "ParticipationOnly": false + }, + { + "Name": "Wallet9988", + "ParticipationOnly": false + }, + { + "Name": "Wallet9989", + "ParticipationOnly": false + }, + { + "Name": "Wallet9990", + "ParticipationOnly": false + }, + { + "Name": "Wallet9991", + "ParticipationOnly": false + }, + { + "Name": "Wallet9992", + "ParticipationOnly": false + }, + { + "Name": "Wallet9993", + "ParticipationOnly": false + }, + { + "Name": "Wallet9994", + "ParticipationOnly": false + }, + { + "Name": "Wallet9995", + "ParticipationOnly": false + }, + { + "Name": "Wallet9996", + "ParticipationOnly": false + }, + { + "Name": "Wallet9997", + "ParticipationOnly": false + }, + { + "Name": "Wallet9998", + "ParticipationOnly": false + }, + { + "Name": "Wallet9999", + "ParticipationOnly": false + }, + { + "Name": "Wallet10000", + "ParticipationOnly": false + } + ] + } + ] +} diff --git a/tools/network/bootstrap.go b/tools/network/bootstrap.go index 3433f71a33..0ca370aa35 100644 --- a/tools/network/bootstrap.go +++ b/tools/network/bootstrap.go @@ -22,10 +22,11 @@ import ( "net" "github.com/algorand/go-algorand/logging" + "github.com/algorand/go-algorand/tools/network/dnssec" ) // ReadFromSRV is a helper to collect SRV addresses for a given name. -func ReadFromSRV(service string, protocol string, name string, fallbackDNSResolverAddress string) (addrs []string, err error) { +func ReadFromSRV(service string, protocol string, name string, fallbackDNSResolverAddress string, secure bool) (addrs []string, err error) { log := logging.Base() if name == "" { log.Debug("no dns lookup due to empty name") @@ -36,25 +37,36 @@ func ReadFromSRV(service string, protocol string, name string, fallbackDNSResolv return } - _, records, sysLookupErr := net.LookupSRV(service, protocol, name) - if sysLookupErr != nil { - var resolver Resolver - // try to resolve the address. If it's an dotted-numbers format, it would return that right away. - // if it's a named address, we would attempt to parse it and might fail. - // ( failing isn't that bad; the resolver would internally try to use 8.8.8.8 instead ) - if DNSIPAddr, err2 := net.ResolveIPAddr("ip", fallbackDNSResolverAddress); err2 == nil { - resolver.DNSAddress = *DNSIPAddr - } else { - log.Infof("ReadFromBootstrap: Failed to resolve fallback DNS resolver address '%s': %v; falling back to default fallback resolver address", fallbackDNSResolverAddress, err2) + var records []*net.SRV + if secure { + var dnssecError error + _, records, dnssecError = dnssec.LookupSRV(service, protocol, name) + if dnssecError != nil { + err = fmt.Errorf("ReadFromBootstrap: Failed to obtain SRV with DNSSEC: %s", dnssecError.Error()) + return } + } else { + var sysLookupErr error + _, records, sysLookupErr = net.LookupSRV(service, protocol, name) + if sysLookupErr != nil { + var resolver Resolver + // try to resolve the address. If it's an dotted-numbers format, it would return that right away. + // if it's a named address, we would attempt to parse it and might fail. + // ( failing isn't that bad; the resolver would internally try to use 8.8.8.8 instead ) + if DNSIPAddr, err2 := net.ResolveIPAddr("ip", fallbackDNSResolverAddress); err2 == nil { + resolver.DNSAddress = *DNSIPAddr + } else { + log.Infof("ReadFromBootstrap: Failed to resolve fallback DNS resolver address '%s': %v; falling back to default fallback resolver address", fallbackDNSResolverAddress, err2) + } - _, records, err = resolver.LookupSRV(context.Background(), service, protocol, name) - if err != nil { - err = fmt.Errorf("ReadFromBootstrap: DNS LookupSRV failed when using system resolver(%v) as well as via %s due to %v", sysLookupErr, resolver.EffectiveResolverDNS(), err) - return + _, records, err = resolver.LookupSRV(context.Background(), service, protocol, name) + if err != nil { + err = fmt.Errorf("ReadFromBootstrap: DNS LookupSRV failed when using system resolver(%v) as well as via %s due to %v", sysLookupErr, resolver.EffectiveResolverDNS(), err) + return + } + // we succeeded when using the public dns. log this. + log.Infof("ReadFromBootstrap: DNS LookupSRV failed when using the system resolver(%v); using public DNS(%s) server directly instead.", sysLookupErr, resolver.EffectiveResolverDNS()) } - // we succeeded when using the public dns. log this. - log.Infof("ReadFromBootstrap: DNS LookupSRV failed when using the system resolver(%v); using public DNS(%s) server directly instead.", sysLookupErr, resolver.EffectiveResolverDNS()) } for _, srv := range records { // empty target won't take us far; skip these diff --git a/tools/network/cloudflare/cloudflare.go b/tools/network/cloudflare/cloudflare.go index 7400cf7573..3c8d20aa5b 100644 --- a/tools/network/cloudflare/cloudflare.go +++ b/tools/network/cloudflare/cloudflare.go @@ -174,7 +174,7 @@ func (d *DNS) CreateDNSRecord(ctx context.Context, recordType string, name strin request, _ := createDNSRecordRequest(d.zoneID, d.authEmail, d.authKey, recordType, name, content, ttl, priority, proxied) requestBody, _ := request.GetBody() bodyBytes, _ := ioutil.ReadAll(requestBody) - return fmt.Errorf("failed to create DNS record. Request body = %s, parsed response : %#v", string(bodyBytes), parsedResponse) + return fmt.Errorf("failed to create DNS record. Request url = '%v', body = %s, parsed response : %#v, response headers = %#v", request.URL, string(bodyBytes), parsedResponse, response.Header) } return nil } @@ -199,7 +199,7 @@ func (d *DNS) CreateSRVRecord(ctx context.Context, name string, target string, t request, _ := createSRVRecordRequest(d.zoneID, d.authEmail, d.authKey, name, service, protocol, weight, port, ttl, priority, target) requestBody, _ := request.GetBody() bodyBytes, _ := ioutil.ReadAll(requestBody) - return fmt.Errorf("failed to create SRV record. Request body = %s, parsed response : %#v", string(bodyBytes), parsedResponse) + return fmt.Errorf("failed to create SRV record. Request url = '%v', body = %s, parsedResponse = %#v, response headers = %#v", request.URL, string(bodyBytes), parsedResponse, response.Header) } return nil } @@ -224,7 +224,7 @@ func (d *DNS) DeleteDNSRecord(ctx context.Context, recordID string) error { request, _ := deleteDNSRecordRequest(d.zoneID, d.authEmail, d.authKey, recordID) requestBody, _ := request.GetBody() bodyBytes, _ := ioutil.ReadAll(requestBody) - return fmt.Errorf("failed to delete DNS record. Request body = %s, parsed response : %#v", string(bodyBytes), parsedResponse) + return fmt.Errorf("failed to delete DNS record. Request url = '%v', body = %s, parsedResponse = %#v, response headers = %#v", request.URL, string(bodyBytes), parsedResponse, response.Header) } return nil } @@ -250,7 +250,7 @@ func (d *DNS) UpdateDNSRecord(ctx context.Context, recordID string, recordType s request, _ := updateDNSRecordRequest(d.zoneID, d.authEmail, d.authKey, recordType, recordID, name, content, ttl, priority, proxied) requestBody, _ := request.GetBody() bodyBytes, _ := ioutil.ReadAll(requestBody) - return fmt.Errorf("failed to update DNS record. Request body = %s, parsedResponse = %#v", string(bodyBytes), parsedResponse) + return fmt.Errorf("failed to update DNS record. Request url = '%v', body = %s, parsedResponse = %#v, response headers = %#v", request.URL, string(bodyBytes), parsedResponse, response.Header) } return nil @@ -276,7 +276,7 @@ func (d *DNS) UpdateSRVRecord(ctx context.Context, recordID string, name string, request, _ := updateSRVRecordRequest(d.zoneID, d.authEmail, d.authKey, recordID, name, service, protocol, weight, port, ttl, priority, target) requestBody, _ := request.GetBody() bodyBytes, _ := ioutil.ReadAll(requestBody) - return fmt.Errorf("failed to update SRV record. Request body = %s, parsedResponse = %#v", string(bodyBytes), parsedResponse) + return fmt.Errorf("failed to update SRV record. Request url = '%v', body = %s, parsedResponse = %#v, response headers = %#v", request.URL, string(bodyBytes), parsedResponse, response.Header) } return nil } @@ -307,7 +307,7 @@ func (c *Cred) GetZones(ctx context.Context) (zones []Zone, err error) { request, _ := getZonesRequest(c.authEmail, c.authKey) requestBody, _ := request.GetBody() bodyBytes, _ := ioutil.ReadAll(requestBody) - return nil, fmt.Errorf("failed to retrieve zone records. Request body = %s, parsed response : %#v", string(bodyBytes), parsedResponse) + return nil, fmt.Errorf("failed to retrieve zone records. Request url = '%v', body = %s, parsedResponse = %#v, response headers = %#v", request.URL, string(bodyBytes), parsedResponse, response.Header) } for _, z := range parsedResponse.Result { diff --git a/tools/network/dnssec/dialer.go b/tools/network/dnssec/dialer.go new file mode 100644 index 0000000000..8d1789c2b0 --- /dev/null +++ b/tools/network/dnssec/dialer.go @@ -0,0 +1,96 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package dnssec + +import ( + "context" + "fmt" + "net" + "strconv" + "strings" +) + +// Dialer wraps net.Dialer and provides a custom DNSSEC-aware resolver +type Dialer struct { + InnerDialer *net.Dialer + Resolver *Resolver +} + +// DialContext connects to the address on the named network using the provided context. +// It waits if needed not to exceed connectionsRateLimitingCount. +// Idea: +// net.Dialer.DialContext calls net.Dialer.resolver().resolveAddrList +// that calls net.Resolver.internetAddrList +// that ends up in LookupIPAddr -> lookupIPAddr -> parseIPZone -> return +// So this DialContext: +// 1. Parses address to host and port +// 2. If the host is not IPv4/IPv6 address then resolves it with DNSSEC +// 3. Calls original net.DialContext knowing that the name already resolved +// and the control flow would be as described above +func (d *Dialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { + + // snipped below is from net.Resolver.internetAddrList + var ( + err error + host, port string + portnum int + ) + + switch network { + case "tcp", "tcp4", "tcp6", "udp", "udp4", "udp6": + if address != "" { + if host, port, err = net.SplitHostPort(address); err != nil { + return nil, err + } + if portnum, err = d.Resolver.LookupPort(ctx, network, port); err != nil { + return nil, err + } + } + default: + return nil, net.UnknownNetworkError(network) + } + // end snippet + + if host == "" { + return nil, fmt.Errorf("Empty host") + } + + var resolvedAddr string + + // check if address is IPv4 or IPv6 address + var zone string + if i := strings.LastIndex(host, "%"); i > 0 { + host, zone = host[:i], host[i+1:] + } + + if netIP := net.ParseIP(host); netIP != nil { + resolvedAddr = netIP.String() + if zone != "" { + resolvedAddr = fmt.Sprintf("%s%%%s", resolvedAddr, zone) + } + } else { + // not an address, lookup with DNS + var ipAddrs []net.IPAddr + if ipAddrs, err = d.Resolver.LookupIPAddr(ctx, host); err != nil { + return nil, err + } + resolvedAddr = ipAddrs[0].String() // LookupIPAddr returns non-empty list + } + + resolvedAddr = net.JoinHostPort(resolvedAddr, strconv.Itoa(portnum)) + return d.InnerDialer.DialContext(ctx, network, resolvedAddr) +} diff --git a/tools/network/dnssec/dns.go b/tools/network/dnssec/dns.go new file mode 100644 index 0000000000..967a385616 --- /dev/null +++ b/tools/network/dnssec/dns.go @@ -0,0 +1,166 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package dnssec + +import ( + "context" + "encoding/xml" + "fmt" + "time" + + "github.com/miekg/dns" +) + +type resolverImpl struct { + readTimeout time.Duration + servers []string + rootAnchor string +} + +func makeDNSClient(net string, timeout time.Duration) (client *dns.Client) { + client = new(dns.Client) + client.ReadTimeout = timeout + client.Net = net + return +} + +// IANA-provided anchor from https://data.iana.org/root-anchors/root-anchors.xml +const rootAnchorXML = ` + +. + +19036 +8 +2 +49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5 + + +20326 +8 +2 +E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D + +` + +// KeyDigest represents a digest entry in the root anchor XML +type KeyDigest struct { + XMLName xml.Name `xml:"KeyDigest"` + ID string `xml:"id,attr"` + ValidFrom string `xml:"validFrom,attr"` + ValidUntil string `xml:"validUntil,attr"` + KeyTag uint16 `xml:"KeyTag"` + Algorithm uint8 `xml:"Algorithm"` + DigestType uint8 `xml:"DigestType"` + Digest string `xml:"Digest"` +} + +// TrustAnchor is deserialized the root anchor XML +type TrustAnchor struct { + XMLName xml.Name `xml:"TrustAnchor"` + Zone string `xml:"Zone"` + Digests []KeyDigest `xml:"KeyDigest"` +} + +// queryImpl performs DNS query against provided server. It respects both context and timeout restrictions. +// if it fails then retries with TCP client +func queryImpl(ctx context.Context, server string, msg *dns.Msg, timeout time.Duration) (resp *dns.Msg, err error) { + for _, netType := range []string{"udp", "tcp"} { + if resp, _, err = (&dns.Client{Net: netType, ReadTimeout: timeout}).ExchangeContext(ctx, msg, server); err != nil { + return nil, err + } + if !resp.Truncated { + return + } + } + var name string + if len(msg.Question) > 0 { + name = msg.Question[0].Name + } + return nil, fmt.Errorf("DNS response for %s is still truncated even after retrying TCP", name) +} + +func (r *resolverImpl) serverList() []string { + return r.servers +} + +func (r *resolverImpl) query(ctx context.Context, name string, qtype uint16) (resp *dns.Msg, err error) { + name = dns.Fqdn(name) + + msg := new(dns.Msg) + msg.RecursionDesired = true + msg.SetQuestion(name, qtype) + msg.SetEdns0(4096, true) // high enough value prevents truncation and retries with TCP + + for _, server := range r.servers { + resp, err := queryImpl(ctx, server, msg, r.readTimeout) + if err != nil { + continue + } + return resp, err + } + return nil, fmt.Errorf("no answer for (%s, %d) from DNS servers %v", name, qtype, r.servers) +} + +func (r *resolverImpl) queryRRSet(ctx context.Context, name string, qtype uint16) ([]dns.RR, []dns.RRSIG, error) { + msg, err := r.query(ctx, name, qtype) + if err != nil { + return nil, nil, err + } + if msg.Rcode != dns.RcodeSuccess { + return nil, nil, fmt.Errorf("DNS error: %s", dns.RcodeToString[msg.Rcode]) + } + + rrSet := make([]dns.RR, 0, len(msg.Answer)) // answer usually contains 1-2 RRSIG so we use quite a bit more memory than needed + rrSig := make([]dns.RRSIG, 0, len(msg.Answer)) + for _, rr := range msg.Answer { + switch obj := rr.(type) { + case *dns.RRSIG: + rrSig = append(rrSig, *obj) + default: + rrSet = append(rrSet, rr) + } + } + if len(rrSig) == 0 { + return nil, nil, fmt.Errorf("no signature in DNS response for %s", name) + } + return rrSet, rrSig, nil +} + +func (r *resolverImpl) rootTrustAnchor() ([]dns.DS, error) { + return parseRootTrustAnchor(r.rootAnchor) +} + +func parseRootTrustAnchor(data string) ([]dns.DS, error) { + v := TrustAnchor{} + err := xml.Unmarshal([]byte(data), &v) + if err != nil { + return nil, err + } + + dss := make([]dns.DS, 0, len(v.Digests)) + for _, digest := range v.Digests { + ds := dns.DS{ + Hdr: dns.RR_Header{Name: v.Zone}, + KeyTag: digest.KeyTag, + Algorithm: digest.Algorithm, + DigestType: digest.DigestType, + Digest: digest.Digest, + } + dss = append(dss, ds) + } + return dss, nil +} diff --git a/tools/network/dnssec/dnssec_test.go b/tools/network/dnssec/dnssec_test.go new file mode 100644 index 0000000000..1c75a11e65 --- /dev/null +++ b/tools/network/dnssec/dnssec_test.go @@ -0,0 +1,1109 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package dnssec + +import ( + "context" + "crypto" + "net" + "testing" + "time" + + "github.com/miekg/dns" + "github.com/stretchr/testify/require" +) + +func TestResolverCreation(t *testing.T) { + a := require.New(t) + r := MakeDnssecResolver(nil, time.Second) + a.NotEmpty(r.resolver.serverList()) + a.Equal("1.1.1.1:53", r.resolver.serverList()[0]) + a.Equal("8.8.8.8:53", r.resolver.serverList()[1]) + a.Equal("77.88.8.8:53", r.resolver.serverList()[2]) + a.Equal("8.26.56.26:53", r.resolver.serverList()[3]) + a.Equal(4, len(r.resolver.serverList())) + + r = MakeDnssecResolver([]string{}, time.Second) + a.NotEmpty(r.resolver.serverList()) + a.Equal("1.1.1.1:53", r.resolver.serverList()[0]) + a.Equal("8.8.8.8:53", r.resolver.serverList()[1]) + a.Equal(4, len(r.resolver.serverList())) + + r = MakeDnssecResolver([]string{"8.8.8.8"}, time.Second) + a.NotEmpty(r.resolver.serverList()) + a.Equal("8.8.8.8", r.resolver.serverList()[0]) + a.Equal(1, len(r.resolver.serverList())) + + r = MakeDnssecResolver([]string{"8.8.8.8", "1.1.1.1"}, time.Second) + a.NotEmpty(r.resolver.serverList()) + a.Equal(2, len(r.resolver.serverList())) + a.Equal("8.8.8.8", r.resolver.serverList()[0]) + a.Equal("1.1.1.1", r.resolver.serverList()[1]) +} + +func TestQuery(t *testing.T) { + a := require.New(t) + r := MakeDnssecResolver(nil, time.Second) + _, err := r.resolver.query(context.Background(), "algorand.com", dns.TypeA) + a.NoError(err) +} + +func TestSplitZone(t *testing.T) { + a := require.New(t) + var res []string + var err error + + res, err = splitToZones("") + a.Error(err) + + res, err = splitToZones("com") + a.Error(err) + + res, err = splitToZones("example.com") + a.Error(err) + + res, err = splitToZones(".") + a.NoError(err) + a.Equal([]string{"."}, res) + + res, err = splitToZones("com.") + a.NoError(err) + a.Equal([]string{".", "com."}, res) + + res, err = splitToZones("example.com.") + a.NoError(err) + a.Equal([]string{".", "com.", "example.com."}, res) + + res, err = splitToZones("dev.example.com.") + a.NoError(err) + a.Equal([]string{".", "com.", "example.com.", "dev.example.com."}, res) +} + +func TestParentZone(t *testing.T) { + a := require.New(t) + var res string + var err error + + res, err = getParentZone("") + a.Error(err) + + res, err = getParentZone("com") + a.Error(err) + + res, err = getParentZone(".") + a.Error(err) + + res, err = getParentZone("com.") + a.NoError(err) + a.Equal(".", res) + + res, err = getParentZone("example.com.") + a.NoError(err) + a.Equal("com.", res) + + res, err = getParentZone("dev.example.com.") + a.NoError(err) + a.Equal("example.com.", res) +} + +func TestParseRootTrustAnchor(t *testing.T) { + a := require.New(t) + dss, err := parseRootTrustAnchor(rootAnchorXML) + a.NoError(err) + a.Equal(2, len(dss)) + currentDS := dss[1] + a.Equal("E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D", currentDS.Digest) + a.Equal(uint16(20326), currentDS.KeyTag) + a.Equal(uint8(8), currentDS.Algorithm) + a.Equal(uint8(2), currentDS.DigestType) + + _, err = parseRootTrustAnchor("not xml") + a.Error(err) +} + +func TestTrustedZone(t *testing.T) { + a := require.New(t) + + zsk := make(map[uint16]dns.DNSKEY) + ksk := make(map[uint16]dns.DNSKEY) + rrSig := make(map[uint16]dns.RRSIG) + + r := makeTestResolver() + zsks, ksks, rrsigs := r.queryDNSKeyRRSet("com.") + zk := zsks[0] + kk := ksks[0] + sig := rrsigs[0] + + a.Equal(uint16(56311), zk.KeyTag()) + a.Equal(uint16(30909), kk.KeyTag()) + a.Equal(uint16(30909), sig.KeyTag) + + zsk[zk.KeyTag()] = zk + ksk[kk.KeyTag()] = kk + rrSig[sig.KeyTag] = sig + + tz := trustedZone{ + name: "com.", + zsk: zsk, + ksk: ksk, + rrSig: rrSig, + } + tt, _ := time.Parse(time.RFC3339, "2020-02-12T00:00:00Z") + a.False(tz.isExpired(tt)) + tt, _ = time.Parse(time.RFC3339, "2020-02-22T00:00:00Z") + a.True(tz.isExpired(tt)) + + a.True(tz.checkKeys([]uint16{zk.KeyTag()})) + a.False(tz.checkKeys([]uint16{kk.KeyTag()})) + + zsks, ksks, rrsigs = r.queryDNSKeyRRSet(".") + zskRoot := make(map[uint16]dns.DNSKEY) + kskRoot := make(map[uint16]dns.DNSKEY) + rrSigRoot := make(map[uint16]dns.RRSIG) + zskRoot[zsks[0].KeyTag()] = zsks[0] + kskRoot[ksks[0].KeyTag()] = ksks[0] + rrSigRoot[rrsigs[0].KeyTag] = rrsigs[0] + + tzRoot := trustedZone{ + name: ".", + zsk: zskRoot, + ksk: kskRoot, + rrSig: rrSigRoot, + } + + tt, _ = time.Parse(time.RFC3339, "2020-02-12T00:00:00Z") + + rrsDS, rrsigsDS, _ := r.queryRRSet(context.Background(), "com.", dns.TypeDS) + cacheOutdated, err := tzRoot.verifyDS(rrsDS, rrsigsDS, tt) + a.NoError(err) + a.False(cacheOutdated) + + tzRoot.zsk = make(map[uint16]dns.DNSKEY) + cacheOutdated, err = tzRoot.verifyDS(rrsDS, rrsigsDS, tt) + a.NoError(err) + a.True(cacheOutdated) + + // modify copy ZSK and expect failure + tzRoot.zsk = zskRoot + zk = zsks[0] + zk.PublicKey = ksks[0].PublicKey + tzRoot.zsk[zsks[0].KeyTag()] = zk + cacheOutdated, err = tzRoot.verifyDS(rrsDS, rrsigsDS, tt) + a.Error(err) + a.False(cacheOutdated) +} + +func TestMakeTrustedZone(t *testing.T) { + a := require.New(t) + + tt, _ := time.Parse(time.RFC3339, "2020-02-12T00:00:00Z") + r := makeTestResolver() + tzRoot, cacheOutdated, err := makeTrustedZone(context.Background(), ".", nil, r, tt) + a.NoError(err) + a.False(cacheOutdated) + a.NotEmpty(tzRoot) + + tzCom, cacheOutdated, err := makeTrustedZone(context.Background(), "com.", tzRoot, r, tt) + a.NoError(err) + a.False(cacheOutdated) + a.NotEmpty(tzCom) + + // remove ZSK from root and expect cache outdated error (newer key in com. than in cached root) + backup := tzRoot.zsk + tzRoot.zsk = make(map[uint16]dns.DNSKEY) + tzCom, cacheOutdated, err = makeTrustedZone(context.Background(), "com.", tzRoot, r, tt) + a.NoError(err) + a.True(cacheOutdated) + a.Empty(tzCom) + + // remove KSK from root and expect no errors + tzRoot.zsk = backup + backup = tzRoot.ksk + tzRoot.ksk = make(map[uint16]dns.DNSKEY) + tzCom, cacheOutdated, err = makeTrustedZone(context.Background(), "com.", tzRoot, r, tt) + a.NoError(err) + a.False(cacheOutdated) + a.NotEmpty(tzCom) + + tzRoot.ksk = backup + backup = tzRoot.zsk + + var zk, ks dns.DNSKEY + for _, zk = range tzRoot.zsk { + break + } + for _, ks = range tzRoot.ksk { + break + } + tzRoot.zsk[zk.KeyTag()] = ks + tzCom, cacheOutdated, err = makeTrustedZone(context.Background(), "com.", tzRoot, r, tt) + a.Error(err) + a.Contains(err.Error(), "DS signature verification failed") + a.False(cacheOutdated) + a.Empty(tzCom) + + tzRoot.zsk = backup + + // test non-existing zone + tzOrg, cacheOutdated, err := makeTrustedZone(context.Background(), "ttt.", tzRoot, r, tt) + a.Error(err) + a.False(cacheOutdated) + a.Empty(tzOrg) + + // Test missed root anchor + re := makeEmptyTestResolver() + rootKSK, rootKSKsk := getKey(".", dns.ZONE|dns.SEP) + rootZSK, rootZSKsk := getKey(".", dns.ZONE) + + re.rootAnchorXML = "invalid" + err = re.updateKSKNoCheck(".", rootKSK, rootKSKsk, time.Time{}) + a.NoError(err) + err = re.updateDNSKeyRecord(".", rootZSK, rootZSKsk, time.Time{}) + a.NoError(err) + + tzRoot, cacheOutdated, err = makeTrustedZone(context.Background(), ".", nil, re, tt) + a.Error(err) + a.Contains(err.Error(), "EOF") + a.False(cacheOutdated) + a.Empty(tzRoot) + + // test missed DS record + testKSK, testKSKsk := getKey("test.", dns.ZONE|dns.SEP) + testZSK, testZSKsk := getKey("test.", dns.ZONE) + + re.rootAnchorXML = "invalid" + err = re.updateKSKNoCheck("test.", testKSK, testKSKsk, time.Time{}) + a.NoError(err) + err = re.updateDNSKeyRecord("test.", testZSK, testZSKsk, time.Time{}) + a.NoError(err) + + tzTest, cacheOutdated, err := makeTrustedZone(context.Background(), "test.", nil, re, tt) + a.Error(err) + a.Contains(err.Error(), "test. not found") + a.False(cacheOutdated) + a.Empty(tzTest) +} + +func TestVerifyRRSig(t *testing.T) { + a := require.New(t) + tt, _ := time.Parse(time.RFC3339, "2020-02-12T00:00:00Z") + + r := makeTestResolver() + + // check . DNSKEY RRSIG + zsks, ksks, _ := r.queryDNSKeyRRSet(".") + rrs, rrsigs, _ := r.queryRRSet(context.Background(), ".", dns.TypeDNSKEY) + + zskRoot := make(map[uint16]dns.DNSKEY) + zskRoot[zsks[0].KeyTag()] = zsks[0] + kskRoot := make(map[uint16]dns.DNSKEY) + kskRoot[ksks[0].KeyTag()] = ksks[0] + + verified := verifyRRSig(rrs, rrsigs, tt, kskRoot) + a.Greater(len(verified), 0) + + // check com. DNSKEY RRSIG + zsks, ksks, _ = r.queryDNSKeyRRSet("com.") + rrs, rrsigs, _ = r.queryRRSet(context.Background(), "com.", dns.TypeDNSKEY) + zskCom := make(map[uint16]dns.DNSKEY) + zskCom[zsks[0].KeyTag()] = zsks[0] + kskCom := make(map[uint16]dns.DNSKEY) + kskCom[ksks[0].KeyTag()] = ksks[0] + + verified = verifyRRSig(rrs, rrsigs, tt, kskCom) + a.Greater(len(verified), 0) + + // check com. DS RRSIG using . ZSK + rrsDS, rrsigsDS, _ := r.queryRRSet(context.Background(), "com.", dns.TypeDS) + verified = verifyRRSig(rrsDS, rrsigsDS, tt, zskRoot) + a.Greater(len(verified), 0) + + // check failure + verified = verifyRRSig(rrs, rrsigsDS, tt, zskRoot) + a.Equal(0, len(verified)) + +} + +func TestVerifyKSKDigest(t *testing.T) { + a := require.New(t) + + r := makeTestResolver() + + zsks, ksks, _ := r.queryDNSKeyRRSet("com.") + dss, _, _ := r.queryDSRRSet("com.") + + ksk := make(map[uint16]dns.DNSKEY) + ksk[ksks[0].KeyTag()] = ksks[0] + + matchedDS, verifiedKSK := verifyKSKDigest(dss, ksk) + a.Equal(1, len(verifiedKSK)) + a.Equal(1, len(matchedDS)) + + // add a random key and ensure matches + ksk[zsks[0].KeyTag()] = zsks[0] + matchedDS, verifiedKSK = verifyKSKDigest(dss, ksk) + a.Equal(1, len(verifiedKSK)) + a.Equal(1, len(matchedDS)) + + // add more DS records and ensure it still works + dss2, err := parseRootTrustAnchor(rootAnchorXML) + a.NoError(err) + dss = append(dss, dss2...) + + matchedDS, verifiedKSK = verifyKSKDigest(dss, ksk) + a.Equal(1, len(verifiedKSK)) + a.Equal(1, len(matchedDS)) + + // check failure + dss = dss2 + matchedDS, verifiedKSK = verifyKSKDigest(dss, ksk) + a.Equal(0, len(verifiedKSK)) + a.Equal(0, len(matchedDS)) +} + +func TestTrustChainBasic(t *testing.T) { + a := require.New(t) + + r := makeTestResolver() + tch := makeTrustChain(r) + tch.trustedZones["."] = &trustedZone{} + tch.trustedZones["org."] = &trustedZone{} + tch.trustedZones["example.org."] = &trustedZone{} + tch.trustedZones["com."] = &trustedZone{} + tch.trustedZones["example.com."] = &trustedZone{} + tch.removeSelfAndChildren("example.com.") + a.Equal(4, len(tch.trustedZones)) + tch.removeSelfAndChildren("org.") + a.Equal(2, len(tch.trustedZones)) + tch.removeSelfAndChildren(".") + a.Equal(0, len(tch.trustedZones)) + + tch.trustedZones["com."] = &trustedZone{ + zsk: make(map[uint16]dns.DNSKEY), + } + tch.trustedZones["com."].zsk[123] = dns.DNSKEY{Algorithm: 1} + key, found := tch.getDNSKey("com.", 123) + a.True(found) + a.NotEmpty(key) + + key, found = tch.getDNSKey(".", 123) + a.False(found) + a.Empty(key) +} + +func getKey(zone string, flags uint16) (*dns.DNSKEY, crypto.PrivateKey) { + rootKSK := new(dns.DNSKEY) + rootKSK.Hdr.Name = zone + rootKSK.Hdr.Rrtype = dns.TypeDNSKEY + rootKSK.Hdr.Class = dns.ClassINET + rootKSK.Hdr.Ttl = 86400 + rootKSK.Flags = flags + rootKSK.Protocol = 3 + rootKSK.Algorithm = dns.RSASHA256 + rootKSKsk, _ := rootKSK.Generate(1024) + return rootKSK, rootKSKsk +} + +func TestEnsureTrustChain(t *testing.T) { + a := require.New(t) + + var err error + r := makeEmptyTestResolver() + + rootKSK, rootKSKsk := getKey(".", dns.ZONE|dns.SEP) + rootZSK, rootZSKsk := getKey(".", dns.ZONE) + rootAnchor := rootKSK.ToDS(dns.SHA256) + + // make . zone + err = r.updateDSRecord(".", &[]dns.DS{*rootAnchor}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootKSK, rootKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootZSK, rootZSKsk, time.Time{}) + a.NoError(err) + + testKSK, testKSKsk := getKey("test.", dns.ZONE|dns.SEP) + testZSK, testZSKsk := getKey("test.", dns.ZONE) + + // make test. zone + err = r.updateDSRecord("test.", &[]dns.DS{*testKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testKSK, testKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testZSK, testZSKsk, time.Time{}) + a.NoError(err) + + tch := makeTrustChain(r) + err = tch.ensure(context.Background(), "test.", []uint16{testZSK.KeyTag()}) + a.NoError(err) + + // ensure test harness works + // update test. KSK and . ZSK + testKSK, testKSKsk = getKey("test.", dns.ZONE|dns.SEP) + err = r.updateDSRecord("test.", &[]dns.DS{*testKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testKSK, testKSKsk, time.Time{}) + a.NoError(err) + + rootZSK, rootZSKsk = getKey(".", dns.ZONE) + err = r.updateDNSKeyRecord(".", rootZSK, rootZSKsk, time.Time{}) + a.NoError(err) + + // check a brand new trust chain (no caches) + newCh := makeTrustChain(r) + err = newCh.ensure(context.Background(), "test.", []uint16{testZSK.KeyTag()}) + a.NoError(err) + + // check an old trust chain (with cached entires) + err = tch.ensure(context.Background(), "test.", []uint16{testZSK.KeyTag()}) + a.NoError(err) + + algoTestKSK, algoTestKSKsk := getKey("algo.test.", dns.ZONE|dns.SEP) + algoTestZSK, algoTestZSKsk := getKey("algo.test.", dns.ZONE) + + // make algo.test. zone + err = r.updateDSRecord("algo.test.", &[]dns.DS{*algoTestKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("algo.test.", algoTestKSK, algoTestKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("algo.test.", algoTestZSK, algoTestZSKsk, time.Time{}) + a.NoError(err) + + // check an old trust chain (with cached entires) + err = tch.ensure(context.Background(), "algo.test.", []uint16{algoTestZSK.KeyTag()}) + a.NoError(err) + + // ZSK rotation test + // 1. update test. ZSK + // 2. add new rand.test. zone => DS for rand.test. will be signed with new ZSK + // 3. build a trust chain for rand.test. => trigger cache outdated error and the chain update + + // rotate test. ZSK + testZSK, testZSKsk = getKey("test.", dns.ZONE) + err = r.updateDNSKeyRecord("test.", testZSK, testZSKsk, time.Time{}) + a.NoError(err) + + randTestKSK, randTestKSKsk := getKey("rand.test.", dns.ZONE|dns.SEP) + randTestZSK, randTestZSKsk := getKey("rand.test.", dns.ZONE) + + // make rand.test. zone + err = r.updateDSRecord("rand.test.", &[]dns.DS{*randTestKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("rand.test.", randTestKSK, randTestKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("rand.test.", randTestZSK, randTestZSKsk, time.Time{}) + a.NoError(err) + + err = tch.ensure(context.Background(), "algo.test.", []uint16{algoTestZSK.KeyTag()}) + a.NoError(err) + err = tch.ensure(context.Background(), "rand.test.", []uint16{randTestZSK.KeyTag()}) + a.NoError(err) + + // invalid signature test + // 1. update test. ZSK and set expired signature + // 2. add new cow.test. zone => DS for cow.test. will be signed with new ZSK + // 3. build a trust chain for cow.test. => trigger cache outdated error and the chain update + // 4. chain update fails because of invalid signature + + // rotate test. ZSK + testZSK, testZSKsk = getKey("test.", dns.ZONE) + tt, _ := time.Parse(time.RFC3339, "2020-01-02T00:00:00Z") + err = r.updateDNSKeyRecord("test.", testZSK, testZSKsk, tt) + a.NoError(err) + + cowTestKSK, cowTestKSKsk := getKey("cow.test.", dns.ZONE|dns.SEP) + cowTestZSK, cowTestZSKsk := getKey("cow.test.", dns.ZONE) + + // make cow.test. zone + err = r.updateDSRecord("cow.test.", &[]dns.DS{*cowTestKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("cow.test.", cowTestKSK, cowTestKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("cow.test.", cowTestZSK, cowTestZSKsk, time.Time{}) + a.NoError(err) + + // this is cached and still valid + err = tch.ensure(context.Background(), "rand.test.", []uint16{randTestZSK.KeyTag()}) + a.NoError(err) + // this was removed during last cache re-validation + // triggers the cache update and the chain is broken + err = tch.ensure(context.Background(), "algo.test.", []uint16{algoTestZSK.KeyTag()}) + a.Error(err) + // this is a new, triggers the cache update and the chain is broken + err = tch.ensure(context.Background(), "cow.test.", []uint16{cowTestZSK.KeyTag()}) + a.Error(err) + + // DNSKEY expiration test + // DNSKEY is expired when its RRSIG expired + // 1. restore test. ZSK + // 2. manually expire test. RRSIG in the cache + + // rotate test. ZSK + testZSK, testZSKsk = getKey("test.", dns.ZONE) + err = r.updateDNSKeyRecord("test.", testZSK, testZSKsk, time.Time{}) + a.NoError(err) + err = tch.ensure(context.Background(), "cow.test.", []uint16{cowTestZSK.KeyTag()}) + a.NoError(err) + + // get a new signature + rrset, _, err := r.queryRRSet(context.Background(), "test.", dns.TypeDNSKEY) + a.NoError(err) + // calc and update sig in the cache with expired one + tt, _ = time.Parse(time.RFC3339, "2020-01-02T00:00:00Z") + sig, err := r.sign(rrset, "test.", testKSK.KeyTag(), tt, testKSKsk) + tch.trustedZones["test."].rrSig[testKSK.KeyTag()] = sig + a.Equal(1, len(tch.trustedZones["test."].rrSig)) + err = tch.ensure(context.Background(), "algo.test.", []uint16{algoTestZSK.KeyTag()}) + a.NoError(err) + + // ZSK on the last zone rotation for all zones in cache + // this simulates the scenario with example.com cached + // and www.example.com requested that is signed with newer ZSK + // 1. rotate algo.test. ZSK + // 2. ensure trust and ask for newer ZSK + + // rotate algo.test. ZSK + algoTestZSK, algoTestZSKsk = getKey("algo.test.", dns.ZONE) + err = r.updateDNSKeyRecord("algo.test.", algoTestZSK, algoTestZSKsk, time.Time{}) + a.NoError(err) + // request cached algo.test. with a new ZSK + err = tch.ensure(context.Background(), "algo.test.", []uint16{algoTestZSK.KeyTag()}) + a.NoError(err) + + // KSK rotation tests + // 1. rotate all KSK and one of ZSK + // 2. update cow.test. ZSK + // 3. request new cow.test. ZSK from the chain + rootKSK, rootKSKsk = getKey(".", dns.ZONE|dns.SEP) + rootAnchor = rootKSK.ToDS(dns.SHA256) + err = r.updateDSRecord(".", &[]dns.DS{*rootAnchor}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootKSK, rootKSKsk, time.Time{}) + a.NoError(err) + testKSK, testKSKsk = getKey("test.", dns.ZONE|dns.SEP) + err = r.updateDSRecord("test.", &[]dns.DS{*testKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testKSK, testKSKsk, time.Time{}) + a.NoError(err) + cowTestKSK, cowTestKSKsk = getKey("cow.test.", dns.ZONE|dns.SEP) + err = r.updateDSRecord("cow.test.", &[]dns.DS{*cowTestKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("cow.test.", cowTestKSK, cowTestKSKsk, time.Time{}) + a.NoError(err) + + // rotate test. ZSK + testZSK, testZSKsk = getKey("test.", dns.ZONE) + err = r.updateDNSKeyRecord("test.", testZSK, testZSKsk, time.Time{}) + a.NoError(err) + // rotate cow.test. ZSK + cowTestZSK, cowTestZSKsk = getKey("cow.test.", dns.ZONE) + err = r.updateDNSKeyRecord("cow.test.", cowTestZSK, cowTestZSKsk, time.Time{}) + a.NoError(err) + + err = tch.ensure(context.Background(), "cow.test.", []uint16{cowTestZSK.KeyTag()}) + a.NoError(err) + + // Trust chain failure test + // update KSK but do not update DS + // using a new trust chain (no cache) ensure it fails + // note: using an existing cached chain would not work because once an entry is cached + // it is considered valid if it has ZSK for signature verification + testKSK, testKSKsk = getKey("test.", dns.ZONE|dns.SEP) + err = r.updateKSKNoCheck("test.", testKSK, testKSKsk, time.Time{}) + a.NoError(err) + newCh = makeTrustChain(r) + err = newCh.ensure(context.Background(), "algo.test.", []uint16{algoTestZSK.KeyTag()}) + a.Error(err) + a.Contains(err.Error(), "failed to verify test. KSK against digest in parent DS") +} + +func TestEnsureTrustChainFailures(t *testing.T) { + a := require.New(t) + + var err error + r := makeEmptyTestResolver() + + rootKSK, rootKSKsk := getKey(".", dns.ZONE|dns.SEP) + rootZSK, rootZSKsk := getKey(".", dns.ZONE) + rootAnchor := rootKSK.ToDS(dns.SHA256) + + // make . zone + err = r.updateDSRecord(".", &[]dns.DS{*rootAnchor}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootKSK, rootKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootZSK, rootZSKsk, time.Time{}) + a.NoError(err) + + // test error on empty zone + newCh := makeTrustChain(r) + err = newCh.ensure(context.Background(), "", []uint16{}) + a.Error(err) + // test non-existing ZSK + err = newCh.ensure(context.Background(), ".", []uint16{}) + a.Error(err) + a.Contains(err.Error(), "ZSK [] not found in zone .") + + testKSK, testKSKsk := getKey("test.", dns.ZONE|dns.SEP) + testZSK, testZSKsk := getKey("test.", dns.ZONE) + + // make test. zone + err = r.updateDSRecord("test.", &[]dns.DS{*testKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testKSK, testKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testZSK, testZSKsk, time.Time{}) + a.NoError(err) + + // update . ZSK so that test. DS will mismatch + rootZSK, rootZSKsk = getKey(".", dns.ZONE) + err = r.updateZSK(".", rootZSK, rootZSKsk, time.Time{}) + a.NoError(err) + + tch := makeTrustChain(r) + err = tch.ensure(context.Background(), "test.", []uint16{testZSK.KeyTag()}) + a.Error(err) + a.Contains(err.Error(), "cache outdated for already updated zone .") +} + +func TestAuthenticate(t *testing.T) { + a := require.New(t) + + var err error + r := makeEmptyTestResolver() + + rootKSK, rootKSKsk := getKey(".", dns.ZONE|dns.SEP) + rootZSK, rootZSKsk := getKey(".", dns.ZONE) + rootAnchor := rootKSK.ToDS(dns.SHA256) + + // make . zone + err = r.updateDSRecord(".", &[]dns.DS{*rootAnchor}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootKSK, rootKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootZSK, rootZSKsk, time.Time{}) + a.NoError(err) + + // check signerName validation + rrset, rrsig, err := r.queryRRSet(context.Background(), ".", dns.TypeDNSKEY) + a.NoError(err) + sig := rrsig[0] + sig.SignerName = "test" + rrsig = append(rrsig, sig) + tch := makeTrustChain(r) + err = tch.authenticate(context.Background(), rrset, rrsig) + a.Error(err) + a.Contains(err.Error(), "signer name mismatch") + + testKSK, testKSKsk := getKey("test.", dns.ZONE|dns.SEP) + testZSK, testZSKsk := getKey("test.", dns.ZONE) + + // make test. zone + err = r.updateDSRecord("test.", &[]dns.DS{*testKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testKSK, testKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testZSK, testZSKsk, time.Time{}) + a.NoError(err) + err = r.updateARecord("www.test.", net.IPv4(1, 2, 3, 4), time.Time{}) + a.NoError(err) + + rrset, rrsig, err = r.queryRRSet(context.Background(), "www.test.", dns.TypeA) + err = tch.authenticate(context.Background(), rrset, rrsig) + a.NoError(err) + + // DNSKEY is signed with KSK so authenticate will fail looking up KSK in ZSK + rrset, rrsig, err = r.queryRRSet(context.Background(), "test.", dns.TypeDNSKEY) + err = tch.authenticate(context.Background(), rrset, rrsig) + a.Error(err) + + err = tch.authenticate(context.Background(), rrset, nil) + a.Error(err) + err = tch.authenticate(context.Background(), rrset, []dns.RRSIG{}) + a.Error(err) +} + +func TestSrvSort(t *testing.T) { + a := require.New(t) + + arr := make([]*net.SRV, 0, 7) + arr = append(arr, &net.SRV{Priority: 4, Weight: 1}) + arr = append(arr, &net.SRV{Priority: 3, Weight: 1}) + arr = append(arr, &net.SRV{Priority: 1, Weight: 2}) + arr = append(arr, &net.SRV{Priority: 1, Weight: 1}) + arr = append(arr, &net.SRV{Priority: 1, Weight: 1}) + arr = append(arr, &net.SRV{Priority: 1, Weight: 1}) + arr = append(arr, &net.SRV{Priority: 1, Weight: 1}) + + srvRecArray(arr).sortAndRand() + a.Equal(net.SRV{Priority: 1, Weight: 2}, *arr[0]) + a.Equal(net.SRV{Priority: 1, Weight: 1}, *arr[1]) + a.Equal(net.SRV{Priority: 1, Weight: 1}, *arr[2]) + a.Equal(net.SRV{Priority: 1, Weight: 1}, *arr[3]) + a.Equal(net.SRV{Priority: 1, Weight: 1}, *arr[4]) + a.Equal(net.SRV{Priority: 3, Weight: 1}, *arr[5]) + a.Equal(net.SRV{Priority: 4, Weight: 1}, *arr[6]) +} +func TestLookup(t *testing.T) { + a := require.New(t) + + r := makeEmptyTestResolver() + dnssec := Resolver{ + resolver: r, + trustChain: makeTrustChain(r), + maxHops: defaultMaxHops, + } + + var err error + rootKSK, rootKSKsk := getKey(".", dns.ZONE|dns.SEP) + rootZSK, rootZSKsk := getKey(".", dns.ZONE) + rootAnchor := rootKSK.ToDS(dns.SHA256) + + // make . zone + err = r.updateDSRecord(".", &[]dns.DS{*rootAnchor}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootKSK, rootKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootZSK, rootZSKsk, time.Time{}) + a.NoError(err) + + testKSK, testKSKsk := getKey("test.", dns.ZONE|dns.SEP) + testZSK, testZSKsk := getKey("test.", dns.ZONE) + testZSK2, testZSK2sk := getKey("test.", dns.ZONE) + + // make test. zone + err = r.updateDSRecord("test.", &[]dns.DS{*testKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testKSK, testKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testZSK, testZSKsk, time.Time{}) + a.NoError(err) + err = r.updateARecord("www.test.", net.IPv4(1, 2, 3, 4), time.Time{}) + a.NoError(err) + + // create one more signature for www.test. but do not store the key + // ensure that one signature and the matched key found and validated + rrset := r.entries["www.test."][dns.TypeA] + sig, err := r.sign(rrset.rr, "test.", testZSK2.KeyTag(), time.Time{}, testZSK2sk) + old := rrset.sig + rrset.sig = []dns.RRSIG{sig} + rrset.sig = append(rrset.sig, old...) + r.entries["www.test."][dns.TypeA] = rrset + + addrs, err := dnssec.LookupIPAddr(context.Background(), "www.test.") + a.NoError(err) + a.Equal(2, len(addrs)) + a.Equal(net.IPv4(1, 2, 3, 4), addrs[0].IP) + + // check SRV + srv0 := dns.SRV{ + Hdr: dns.RR_Header{Name: "my-srv.test.", Rrtype: dns.TypeSRV, Class: dns.ClassINET, Ttl: 3600}, + Priority: 2, + Weight: 1, + Port: 80, + Target: "target0.test.", + } + srv1 := srv0 + srv1.Target = "target1.test." + srv1.Priority = 3 + srv1.Weight = 2 + srv2 := srv0 + srv2.Target = "target2.test." + srv2.Priority = 1 + srv2.Weight = 1 + srvs := []dns.RR{&srv0, &srv1, &srv2} + err = r.updateRegRecord("my-srv.test.", "test.", dns.TypeSRV, srvs, time.Time{}) + a.NoError(err) + + name, res, err := dnssec.LookupSRV(context.Background(), "", "", "my-srv.test.") + a.NoError(err) + a.Equal("my-srv.test.", name) + a.Equal(3, len(res)) + // check sorting + a.Equal("target2.test.", res[0].Target) + a.Equal("target0.test.", res[1].Target) + a.Equal("target1.test.", res[2].Target) + + name, res, err = dnssec.LookupSRV(context.Background(), "", "", "my-srv-1.test.") + a.Error(err) + + // check CNAME + cname := dns.CNAME{ + Hdr: dns.RR_Header{Name: "algo.test.", Rrtype: dns.TypeCNAME, Class: dns.ClassINET, Ttl: 3600}, + Target: "my-algo.test.", + } + err = r.updateRegRecord("algo.test.", "test.", dns.TypeCNAME, []dns.RR{&cname}, time.Time{}) + a.NoError(err) + + _, err = dnssec.LookupCNAME(context.Background(), "algo.test.") + a.Error(err) + a.Contains(err.Error(), "my-algo.test. not found") + + _, err = dnssec.LookupCNAME(context.Background(), "algo-1.test.") + a.Error(err) + + err = r.updateARecord("my-algo.test.", net.IPv4(11, 12, 13, 14), time.Time{}) + a.NoError(err) + addrs, err = dnssec.LookupIPAddr(context.Background(), "algo.test.") + a.NoError(err) + a.Equal(net.IPv4(11, 12, 13, 14), addrs[0].IP) + + addrs, err = dnssec.LookupIPAddr(context.Background(), "algo-1.test.") + a.Error(err) + a.Empty(addrs) + + // test double redirection + cname1 := dns.CNAME{ + Hdr: dns.RR_Header{Name: "main.test.", Rrtype: dns.TypeCNAME, Class: dns.ClassINET, Ttl: 3600}, + Target: "follower1.test.", + } + err = r.updateRegRecord("main.test.", "test.", dns.TypeCNAME, []dns.RR{&cname1}, time.Time{}) + a.NoError(err) + + cname2 := dns.CNAME{ + Hdr: dns.RR_Header{Name: "follower1.test.", Rrtype: dns.TypeCNAME, Class: dns.ClassINET, Ttl: 3600}, + Target: "follower2.test.", + } + err = r.updateRegRecord("follower1.test.", "test.", dns.TypeCNAME, []dns.RR{&cname2}, time.Time{}) + a.NoError(err) + + err = r.updateARecord("follower2.test.", net.IPv4(21, 22, 23, 24), time.Time{}) + a.NoError(err) + + dnssec.maxHops = 3 + addrs, err = dnssec.LookupIPAddr(context.Background(), "main.test.") + a.NoError(err) + a.Equal(net.IPv4(21, 22, 23, 24), addrs[0].IP) + + dnssec.maxHops = 2 + addrs, err = dnssec.LookupIPAddr(context.Background(), "main.test.") + a.Error(err) + a.Empty(addrs) + + // check non-existing + addrs, err = dnssec.LookupIPAddr(context.Background(), "main-12.test.") + a.Error(err) + a.Empty(addrs) + + // create a loop and expect failure + delete(r.entries["follower2.test."], dns.TypeA) + cname3 := dns.CNAME{ + Hdr: dns.RR_Header{Name: "follower2.test.", Rrtype: dns.TypeCNAME, Class: dns.ClassINET, Ttl: 3600}, + Target: "main.test.", + } + err = r.updateRegRecord("follower2.test.", "test.", dns.TypeCNAME, []dns.RR{&cname3}, time.Time{}) + a.NoError(err) + + dnssec.maxHops = defaultMaxHops + addrs, err = dnssec.LookupIPAddr(context.Background(), "main.test.") + a.Error(err) + a.Contains(err.Error(), "loop detected: main.test. already seen") + a.Empty(addrs) + + // create double CNAME entry and expect failure due to DNS RFC violation + delete(r.entries["follower2.test."], dns.TypeCNAME) + cname4 := dns.CNAME{ + Hdr: dns.RR_Header{Name: "follower2.test.", Rrtype: dns.TypeCNAME, Class: dns.ClassINET, Ttl: 3600}, + Target: "algo.test.", + } + err = r.updateRegRecord("follower2.test.", "test.", dns.TypeCNAME, []dns.RR{&cname3, &cname4}, time.Time{}) + a.NoError(err) + // err = r.updateARecord("follower2.test.", net.IPv4(21, 22, 23, 24), time.Time{}) + a.NoError(err) + + addrs, err = dnssec.LookupIPAddr(context.Background(), "follower2.test.") + a.Error(err) + a.Contains(err.Error(), "multiple CNAME RR detected") + a.Empty(addrs) + + // delete root and expect error on broken chain + delete(r.entries, ".") + + dnssec = Resolver{ + resolver: r, + trustChain: makeTrustChain(r), + maxHops: defaultMaxHops, + } + addrs, err = dnssec.LookupIPAddr(context.Background(), "www.test.") + a.Error(err) + a.Contains(err.Error(), ". not found") +} + +func TestLookupAux(t *testing.T) { + a := require.New(t) + + r := makeEmptyTestResolver() + dnssec := Resolver{ + resolver: r, + trustChain: makeTrustChain(r), + maxHops: defaultMaxHops, + } + + var err error + rootKSK, rootKSKsk := getKey(".", dns.ZONE|dns.SEP) + rootZSK, rootZSKsk := getKey(".", dns.ZONE) + rootAnchor := rootKSK.ToDS(dns.SHA256) + + // make . zone + err = r.updateDSRecord(".", &[]dns.DS{*rootAnchor}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootKSK, rootKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord(".", rootZSK, rootZSKsk, time.Time{}) + a.NoError(err) + + testKSK, testKSKsk := getKey("test.", dns.ZONE|dns.SEP) + testZSK, testZSKsk := getKey("test.", dns.ZONE) + + // make test. zone + err = r.updateDSRecord("test.", &[]dns.DS{*testKSK.ToDS(dns.SHA256)}, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testKSK, testKSKsk, time.Time{}) + a.NoError(err) + err = r.updateDNSKeyRecord("test.", testZSK, testZSKsk, time.Time{}) + a.NoError(err) + + // check MX + mxIn := []dns.RR{ + &dns.MX{ + Hdr: dns.RR_Header{Name: "test.", Rrtype: dns.TypeMX, Class: dns.ClassINET, Ttl: 3600}, + Preference: 1, + Mx: "mail.test.", + }, + } + err = r.updateRegRecord("test.", "test.", dns.TypeMX, mxIn, time.Time{}) + a.NoError(err) + mxOut, err := dnssec.LookupMX(context.Background(), "test.") + a.NoError(err) + a.Equal(1, len(mxOut)) + a.Equal("mail.test.", mxOut[0].Host) + + // check TXT + txtIn := []dns.RR{ + &dns.TXT{ + Hdr: dns.RR_Header{Name: "test.", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 3600}, + Txt: []string{"some text", "some other text"}, + }, + &dns.TXT{ + Hdr: dns.RR_Header{Name: "test.", Rrtype: dns.TypeTXT, Class: dns.ClassINET, Ttl: 3600}, + Txt: []string{"aaa"}, + }, + } + err = r.updateRegRecord("test.", "test.", dns.TypeTXT, txtIn, time.Time{}) + a.NoError(err) + txtOut, err := dnssec.LookupTXT(context.Background(), "test.") + a.NoError(err) + a.Equal(3, len(txtOut)) + a.Equal("some text", txtOut[0]) + + // check NS + nsIn := []dns.RR{ + &dns.NS{ + Hdr: dns.RR_Header{Name: "test.", Rrtype: dns.TypeNS, Class: dns.ClassINET, Ttl: 3600}, + Ns: "ns.test.", + }, + } + err = r.updateRegRecord("test.", "test.", dns.TypeNS, nsIn, time.Time{}) + a.NoError(err) + nsOut, err := dnssec.LookupNS(context.Background(), "test.") + a.NoError(err) + a.Equal(1, len(nsOut)) + a.Equal("ns.test.", nsOut[0].Host) + + // check TLSA + tlsaIn := []dns.RR{ + &dns.TLSA{ + Hdr: dns.RR_Header{Name: "test.", Rrtype: dns.TypeTLSA, Class: dns.ClassINET, Ttl: 3600}, + Usage: 1, + Selector: 2, + MatchingType: 3, + Certificate: "AABBCCDD", + }, + } + err = r.updateRegRecord("_443._tcp.test.", "test.", dns.TypeTLSA, tlsaIn, time.Time{}) + a.NoError(err) + tlsaOut, err := dnssec.LookupTLSA(context.Background(), "443", "tcp", "test.") + a.NoError(err) + a.Equal(1, len(tlsaOut)) + a.Equal(TLSARec{1, 2, 3, "AABBCCDD"}, tlsaOut[0]) +} + +func TestDeadNS(t *testing.T) { + t.Skip() // skip real network tests in autotest + a := require.New(t) + + r := MakeDnssecResolver([]string{"192.168.12.34:5678", "10.12.34.56:890"}, time.Microsecond) + addrs, err := r.LookupIPAddr(context.Background(), "example.com") + a.Error(err) + a.Contains(err.Error(), "no answer for") + a.Empty(addrs) + + // possible race :( with 100ms timeout + r = MakeDnssecResolver([]string{"192.168.12.34:5678", "1.1.1.1:53"}, 100*time.Millisecond) + addrs, err = r.LookupIPAddr(context.Background(), "example.com") + a.NoError(err) + a.Equal(1, len(addrs)) +} + +func TestRealRequests(t *testing.T) { + t.Skip() // skip real network tests in autotest + a := require.New(t) + + // A + r := MakeDnssecResolver(nil, time.Second) + addrs, err := r.LookupIPAddr(context.Background(), "example.com") + a.NoError(err) + a.Equal(1, len(addrs)) + addrs, err = r.LookupIPAddr(context.Background(), "www.example.com") + a.NoError(err) + a.Equal(1, len(addrs)) + addrs, err = r.LookupIPAddr(context.Background(), "www.algorand.com") + a.NoError(err) + a.Equal(2, len(addrs)) + _, err = r.LookupIPAddr(context.Background(), "dnssec-failed.org") + a.Error(err) + + // SRV + srvFullName := "_algobootstrap._tcp.mainnet.algorand.network." + name, entries, err := r.LookupSRV(context.Background(), "algobootstrap", "tcp", "mainnet.algorand.network") + a.NoError(err) + a.Equal(srvFullName, name) + a.Greater(len(entries), 1) + + // CNAME + cname := "r-sn.algorand-mainnet.network." + cnameResult, err := r.LookupCNAME(context.Background(), cname) + a.NoError(err) + a.NotEmpty(cnameResult) + + addrs, err = r.LookupIPAddr(context.Background(), cname) + a.NoError(err) + a.NotEmpty(addrs) + + // CNAME -> A -> IP + // fails, no DNSSEC on the second hop + // addrs, err = r.LookupIPRecursive("r-br.algorand-mainnet.network", 2) + // a.NoError(err) + // a.Equal(1, len(addrs)) + + // fails, as well, no DNSSEC on the second hop + // but it is two-level aliasing + r.maxHops = 1 + addrs, err = r.LookupIPAddr(context.Background(), "relay-montreal-mainnet-algorand.algorand-mainnet.network.") + a.Error(err) + a.Contains(err.Error(), "exceed max attempts") +} diff --git a/tools/network/dnssec/relay-check/main.go b/tools/network/dnssec/relay-check/main.go new file mode 100644 index 0000000000..a2e1b7079f --- /dev/null +++ b/tools/network/dnssec/relay-check/main.go @@ -0,0 +1,77 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package main + +import ( + "context" + "fmt" + "os" + "strings" + "time" + + "github.com/algorand/go-algorand/tools/network/dnssec" +) + +func main() { + if len(os.Args) < 4 { + fmt.Printf(`Usage: %s +Where\n + is a SRV service, for example 'algobootstrap', + is SRV protocol ('tcp', 'udp'), + is SRV name like 'mainnet.algorand.network +`, os.Args[0]) + os.Exit(1) + } + + srvService := os.Args[1] + srvProto := os.Args[2] + srvName := os.Args[3] + + success := make(map[string]bool) + errors := make(map[string]string) + nonSigned := make(map[string]string) + r := dnssec.MakeDnssecResolver(nil, time.Second) + _, entries, err := r.LookupSRV(context.Background(), srvService, srvProto, srvName) + if err != nil { + fmt.Printf("%v\n", err) + return + } + for _, entry := range entries { + _, err := r.LookupIPAddr(context.Background(), entry.Target) + if err == nil { + success[entry.Target] = true + } else { + if strings.HasPrefix(err.Error(), "no signature in DNS response for") { + nonSigned[entry.Target] = err.Error()[len("no signature in DNS response for"):] + } else { + errors[entry.Target] = err.Error() + } + } + } + fmt.Printf("Signed responses:\n") + for k := range success { + fmt.Printf("%s\n", k) + } + fmt.Printf("\nNon signed entires\n") + for k, v := range nonSigned { + fmt.Printf("%s -> %s\n", k, v) + } + fmt.Printf("\nErrors\n") + for k, v := range errors { + fmt.Printf("%s: %s\n", k, v) + } +} diff --git a/tools/network/dnssec/resolver.go b/tools/network/dnssec/resolver.go new file mode 100644 index 0000000000..f01c1d1387 --- /dev/null +++ b/tools/network/dnssec/resolver.go @@ -0,0 +1,342 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package dnssec + +import ( + "context" + "fmt" + "net" + "time" + + "github.com/miekg/dns" +) + +const defaultMaxHops = 10 + +// List of DNSSEC-aware servers +// CloudFlare: 1.1.1.1:53 1.0.0.1:53 +// Google: 8.8.8.8:53 8.8.4.4:53 +// Yandex 77.88.8.8:53 77.88.8.1:53 +// Comodo 8.26.56.26:53 8.20.247.20:53 +// +// Other - no DNSSEC +// OpenDNS 208.67.222.222:53 +// Baidu 180.76.76.76:53 +// Alibaba 223.6.6.6:53 + +var defaultDnssecAwareNSServers = []string{"1.1.1.1:53", "8.8.8.8:53", "77.88.8.8:53", "8.26.56.26:53"} + +// Resolver provides DNSSEC resolution +type Resolver struct { + resolver netResolverIf + trustChain *trustChain + maxHops int +} + +// DefaultResolver with one DNS server and 1 second timeout +var DefaultResolver = MakeDnssecResolver(defaultDnssecAwareNSServers, time.Second) + +// MakeDnssecResolver return resolver from given NS servers and timeout duration +func MakeDnssecResolver(servers []string, timeout time.Duration) (r Resolver) { + rs := &resolverImpl{readTimeout: timeout, servers: servers, rootAnchor: rootAnchorXML} + + if len(rs.servers) == 0 { + rs.servers = append(rs.servers, defaultDnssecAwareNSServers...) + } + r.resolver = rs + r.trustChain = makeTrustChain(r.resolver) + r.maxHops = defaultMaxHops + return +} + +type netResolverIf interface { + query(ctx context.Context, domain string, qtype uint16) (resp *dns.Msg, err error) + queryRRSet(ctx context.Context, domain string, qtype uint16) ([]dns.RR, []dns.RRSIG, error) + rootTrustAnchor() ([]dns.DS, error) + + // test functions + serverList() []string +} + +// TLSARec represents TLSA record content +type TLSARec struct { + Usage uint8 + Selector uint8 + MatchingType uint8 + Certificate string `dns:"hex"` +} + +// lookupImpl makes DNS request for a zone and verifies response signature +func (r *Resolver) lookupImpl(ctx context.Context, name string, qt uint16) (rrSet []dns.RR, err error) { + rrSet, rrSig, err := r.resolver.queryRRSet(ctx, name, qt) + if err != nil { + return + } + err = r.trustChain.authenticate(ctx, rrSet, rrSig) + return +} + +// lookupImplCnameAware like lookupImpl makes DNS request for a zone and verifies response signature +// but also it is aware about possible A/CNAME entries for A-requests and supposed to be used for CNAME alias resolution. +// if CNAME signature presents for requested domain name, then consider the response as CNAME +// and extract CNAME record(s) and its RRSIG +func (r *Resolver) lookupImplCnameAware(ctx context.Context, name string, qt uint16) (rrSet []dns.RR, err error) { + rrSet, rrSig, err := r.resolver.queryRRSet(ctx, name, qt) + if err != nil { + return + } + + // As https://tools.ietf.org/html/rfc1034 section 3.6.2 says + // NS can return CNAME for A request if there are no A but CNAME + // in real world such A-response can also have second-level CNAME alias and A records with signatures + // + // so that leave only CNAME RR matching to requested name to verify signature and return the filtered set + if qt == dns.TypeA || qt == dns.TypeAAAA { + newRRSig := make([]dns.RRSIG, 0, len(rrSig)) + for _, sig := range rrSig { + if sig.Hdr.Name == name { + if sig.TypeCovered == dns.TypeCNAME || sig.TypeCovered == dns.TypeA || sig.TypeCovered == dns.TypeAAAA { + if len(newRRSig) == 0 { + newRRSig = append(newRRSig, sig) + } else if sig.TypeCovered == newRRSig[len(newRRSig)-1].TypeCovered { + newRRSig = append(newRRSig, sig) + } + } + } + } + if len(newRRSig) > 0 { + newRRSet := make([]dns.RR, 0, len(rrSet)) + for _, rr := range rrSet { + if rr.Header().Name == name && rr.Header().Rrtype == newRRSig[0].TypeCovered { + newRRSet = append(newRRSet, rr) + } + } + if len(newRRSet) == 0 { + return nil, fmt.Errorf("no RR in A response mathing signature with type %d", newRRSig[0].TypeCovered) + } + if newRRSig[0].TypeCovered == dns.TypeCNAME && len(newRRSet) > 1 { + // RFC 1034 section 3.6.2 requires a single CNAME RR per name + return nil, fmt.Errorf("multiple CNAME RR detected") + } + rrSet = newRRSet + rrSig = newRRSig + } + } + err = r.trustChain.authenticate(ctx, rrSet, rrSig) + return +} + +// LookupIPAddr resolves a given hostname to ipv4 or ipv6 address following CNAME aliaces +func (r *Resolver) lookupIPAddrImpl(ctx context.Context, hostname string) (cname string, addrs []net.IPAddr, err error) { + var rrSet []dns.RR + nextName := hostname + seen := make(map[string]bool) + for hop := 0; hop < r.maxHops; hop++ { + if _, ok := seen[nextName]; ok { + err = fmt.Errorf("loop detected: %s already seen", nextName) + return + } + + if rrSet, err = r.lookupImplCnameAware(ctx, nextName, dns.TypeA); err != nil { + var err2 error + if rrSet, err2 = r.lookupImplCnameAware(ctx, nextName, dns.TypeAAAA); err2 != nil { + return // return original error + } + } + seen[nextName] = true + addrs = make([]net.IPAddr, 0, len(rrSet)) + for _, rr := range rrSet { + switch obj := rr.(type) { + case *dns.A: + addrs = append(addrs, net.IPAddr{IP: obj.A, Zone: ""}) + case *dns.AAAA: + addrs = append(addrs, net.IPAddr{IP: obj.AAAA, Zone: ""}) + case *dns.CNAME: + nextName = obj.Target + } + } + if len(addrs) > 0 { + cname = nextName + return + } + } + err = fmt.Errorf("exceed max attempts %d", r.maxHops) + return +} + +// LookupIPAddr resolves a given hostname to ipv4 or ipv6 address +func (r *Resolver) LookupIPAddr(ctx context.Context, host string) (addrs []net.IPAddr, err error) { + _, addrs, err = r.lookupIPAddrImpl(ctx, host) + return +} + +// LookupCNAME returns CNAME record content for a given name +func (r *Resolver) LookupCNAME(ctx context.Context, host string) (cname string, err error) { + cname, _, err = r.lookupIPAddrImpl(ctx, host) + return +} + +// LookupSRV returns SRV records content for a service, proto and given name +// Like net.Resolver, it orders results according to Priority and Weight +func (r *Resolver) LookupSRV(ctx context.Context, service, proto, name string) (cname string, addrs []*net.SRV, err error) { + var fullName string + if service == "" && proto == "" { + fullName = name + } else { + fullName = "_" + service + "._" + proto + "." + name + } + + var rrSet []dns.RR + if rrSet, err = r.lookupImpl(ctx, fullName, dns.TypeSRV); err != nil { + return + } + + for _, rr := range rrSet { + switch obj := rr.(type) { + case *dns.SRV: + if cname == "" && obj.Hdr.Name != "" { + cname = obj.Hdr.Name + } + addrs = append( + addrs, + &net.SRV{ + Target: obj.Target, + Port: obj.Port, + Priority: obj.Priority, + Weight: obj.Weight, + }, + ) + } + } + + srvRecArray(addrs).sortAndRand() + + return +} + +// LookupMX returns MX records content for a given name +func (r *Resolver) LookupMX(ctx context.Context, name string) (addrs []*net.MX, err error) { + var rrSet []dns.RR + if rrSet, err = r.lookupImpl(ctx, name, dns.TypeMX); err != nil { + return + } + + for _, rr := range rrSet { + switch obj := rr.(type) { + case *dns.MX: + addrs = append( + addrs, + &net.MX{ + Host: obj.Mx, + Pref: obj.Preference, + }, + ) + } + } + return +} + +// LookupNS returns NS records content for a given name +func (r *Resolver) LookupNS(ctx context.Context, name string) (addrs []*net.NS, err error) { + var rrSet []dns.RR + if rrSet, err = r.lookupImpl(ctx, name, dns.TypeNS); err != nil { + return + } + + for _, rr := range rrSet { + switch obj := rr.(type) { + case *dns.NS: + addrs = append( + addrs, + &net.NS{ + Host: obj.Ns, + }, + ) + } + } + return +} + +// LookupTXT returns TXT records content for a given name +func (r *Resolver) LookupTXT(ctx context.Context, name string) (addrs []string, err error) { + var rrSet []dns.RR + if rrSet, err = r.lookupImpl(ctx, name, dns.TypeTXT); err != nil { + return + } + + for _, rr := range rrSet { + switch obj := rr.(type) { + case *dns.TXT: + addrs = append( + addrs, + obj.Txt..., + ) + } + } + return +} + +// LookupTLSA returns TLSA records content for a service, proto and name +func (r *Resolver) LookupTLSA(ctx context.Context, service, proto, name string) (addrs []TLSARec, err error) { + var fullName string + if service == "" && proto == "" { + fullName = name + } else { + fullName = "_" + service + "._" + proto + "." + name + } + + var rrSet []dns.RR + if rrSet, err = r.lookupImpl(ctx, fullName, dns.TypeTLSA); err != nil { + return + } + + for _, rr := range rrSet { + switch obj := rr.(type) { + case *dns.TLSA: + addrs = append( + addrs, + TLSARec{ + Usage: obj.Usage, + Selector: obj.Selector, + MatchingType: obj.MatchingType, + Certificate: obj.Certificate, + }, + ) + } + } + return +} + +// LookupPort looks up the port for the given network and service. +func (r *Resolver) LookupPort(ctx context.Context, network, service string) (port int, err error) { + return net.DefaultResolver.LookupPort(ctx, network, service) +} + +// LookupAddr performs a reverse lookup for the given address, returning a list of names mapping to that address. +func (r *Resolver) LookupAddr(ctx context.Context, addr string) (names []string, err error) { + return net.DefaultResolver.LookupAddr(ctx, addr) +} + +// LookupHost looks up the given host using the local resolver. It returns a slice of that host's addresses. +func (r *Resolver) LookupHost(ctx context.Context, host string) (addrs []string, err error) { + return net.DefaultResolver.LookupHost(ctx, host) +} + +// LookupSRV is convenience function using default dnssec resolver +func LookupSRV(service, proto, name string) (cname string, addrs []*net.SRV, err error) { + return DefaultResolver.LookupSRV(context.Background(), service, proto, name) +} diff --git a/tools/network/dnssec/sort.go b/tools/network/dnssec/sort.go new file mode 100644 index 0000000000..66de7b2f38 --- /dev/null +++ b/tools/network/dnssec/sort.go @@ -0,0 +1,77 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package dnssec + +import ( + "math/rand" + "net" + "sort" +) + +type srvRecArray []*net.SRV + +func (a srvRecArray) Len() int { + return len(a) +} + +func (a srvRecArray) Less(i, j int) bool { + return a[i].Priority < a[j].Priority || a[i].Priority == a[j].Priority && a[i].Weight < a[j].Weight +} + +func (a srvRecArray) Swap(i, j int) { + a[i], a[j] = a[j], a[i] +} + +// randomize SRV records by weight within the same priority with indices [start, end) +// https://tools.ietf.org/html/rfc2782 +func (a srvRecArray) randomize(start, end int) { + // Compute the sum of the weights of those RRs + sum := 0 + for i := start; i < end; i++ { + sum += int(a[i].Weight) + } + for sum > 0 && end-start > 0 { + // Then choose a uniform random number between 0 and the sum computed (inclusive) + num := rand.Intn(sum + 1) + // And select the RR whose running sum value is the first in the selected order + // which is greater than or equal to the random number selected. + rSum := 0 + for i := start; i < end; i++ { + rSum += int(a[i].Weight) + if rSum >= num { + // Remove this SRV RR from the set of the unordered SRV RRs + a[start], a[i] = a[i], a[start] + break + } + } + // And apply the described algorithm to the unordered SRV RRs to select the next target host. + sum -= int(a[start].Weight) + start++ + } +} + +func (a srvRecArray) sortAndRand() { + sort.Sort(a) + i := 0 + for j := 1; j < len(a); j++ { + if a[i].Priority != a[j].Priority { + a.randomize(i, j) + i = j + } + } + a.randomize(i, len(a)) +} diff --git a/tools/network/dnssec/testHarness.go b/tools/network/dnssec/testHarness.go new file mode 100644 index 0000000000..0e6e1c5c8b --- /dev/null +++ b/tools/network/dnssec/testHarness.go @@ -0,0 +1,501 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package dnssec + +import ( + "context" + "crypto" + "crypto/rsa" + "fmt" + "net" + "strings" + "time" + + "github.com/miekg/dns" +) + +type rrRec struct { + rr []dns.RR + sig []dns.RRSIG + sk map[uint16]crypto.PrivateKey // DNSKEY's secret keys, for signing, rotating and etc +} + +type testResolver struct { + entries map[string]map[uint16]rrRec + anchor []dns.DS + rootAnchorXML string +} + +func makeEmptyTestResolver() *testResolver { + r := new(testResolver) + r.entries = make(map[string]map[uint16]rrRec) + return r +} + +func makeTestResolver() *testResolver { + r := new(testResolver) + r.rootAnchorXML = rootAnchorXML + r.entries = make(map[string]map[uint16]rrRec) + + // real entries for . and com. + // DNSKEY com. + zk := dns.DNSKEY{ + Hdr: dns.RR_Header{Name: "com.", Rrtype: dns.TypeDNSKEY, Class: dns.ClassINET}, + Flags: dns.ZONE, + Algorithm: dns.RSASHA256, + Protocol: 3, + PublicKey: "AwEAAcpiOic4s641IPlBcMlBWA0FFomUWuKDWN5CzId/la4aA69RFpakRxPSZM8fegOQ+nYDrUY6UZkQRsowPr18b+MqyvHBUaT6CJUBkdRwlVcD/ikpcjvfGEiH5ttpDdZdS/YKZLBedh/uMCDLNS0baJ+nfkmMZGkYGgnK9K8peU9unWbwAOrJlrK60flM84EUolIIYD6s9g/FfyVB0tE86fE=", + } + + kk := dns.DNSKEY{ + Hdr: dns.RR_Header{Name: "com.", Rrtype: dns.TypeDNSKEY, Class: dns.ClassINET}, + Flags: dns.ZONE | dns.SEP, + Algorithm: dns.RSASHA256, + Protocol: 3, + PublicKey: "AQPDzldNmMvZFX4NcNJ0uEnKDg7tmv/F3MyQR0lpBmVcNcsIszxNFxsBfKNW9JYCYqpik8366LE7VbIcNRzfp2h9OO8HRl+H+E08zauK8k7evWEmu/6od+2boggPoiEfGNyvNPaSI7FOIroDsnw/taggzHRX1Z7SOiOiPWPNIwSUyWOZ79VmcQ1GLkC6NlYvG3HwYmynQv6oFwGv/KELSw7ZSdrbTQ0HXvZbqMUI7BaMskmvgm1G7oKZ1YiF7O9ioVNc0+7ASbqmZN7Z98EGU/Qh2K/BgUe8Hs0XVcdPKrtyYnoQHd2ynKPcMMlTEih2/2HDHjRPJ2aywIpKNnv4oPo/", + } + sigdnskey := dns.RRSIG{ + Hdr: dns.RR_Header{Name: "com.", Rrtype: dns.TypeRRSIG, Class: dns.ClassINET}, + TypeCovered: dns.TypeDNSKEY, + Algorithm: dns.RSASHA256, + Labels: 1, + OrigTtl: 86400, + Expiration: 0x5e4edce5, // timestamp, 2020-02-20 + Inception: 0x5e3b1539, // timestamp, 2020-02-05 + KeyTag: 30909, + SignerName: "com.", + Signature: "gTAaqVD+GE8zcjmWd5LfbA3QM1cVPYRULlzLPhJaDL2WIiYM6E1VCqd8+kM2iLW/HwlVjktyBHP2joau+9tnZZnWNqifBGEbridQeqBdqqM+i0Q6ixGVcrCxyIJ+YcieR742YNIEIhR7um9Dj7cCdT2nVW3dp1ZeUWrm9K+YH2qlSvblp2BD//Fmaxk6tCCO3nR7T1/9tixMUvv2hAc+W4dxoQUeyAm9O6yJYn6kUmztwhWZJDiLn/aj/yQLubrr35K7kunuUxiMqs5eq6RCITVKH8vVWbCXR5RhvlFJ2CSlAx2rGPAObPzoW391DHXanUWwwezD19JDqmNYD3lcag==", + } + + rrset := rrRec{} + rrset.rr = append(rrset.rr, &zk) + rrset.rr = append(rrset.rr, &kk) + rrset.sig = append(rrset.sig, sigdnskey) + rrset.sk = make(map[uint16]crypto.PrivateKey) + + r.entries["com."] = make(map[uint16]rrRec) + r.entries["com."][dns.TypeDNSKEY] = rrset + + // DS com. + ds := dns.DS{ + Hdr: dns.RR_Header{Name: "com.", Rrtype: dns.TypeDS, Class: dns.ClassINET}, + KeyTag: 30909, + Algorithm: dns.RSASHA256, + DigestType: dns.SHA256, + Digest: "E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CFC41A5766", + } + sigds := dns.RRSIG{ + Hdr: dns.RR_Header{Name: "com.", Rrtype: dns.TypeRRSIG, Class: dns.ClassINET}, + TypeCovered: dns.TypeDS, + Algorithm: dns.RSASHA256, + Labels: 1, + OrigTtl: 86400, + Expiration: 0x5e543950, // timestamp, 2020-02-24 + Inception: 0x5e4307c0, // timestamp, 2020-02-11 + KeyTag: 33853, + SignerName: ".", + Signature: "WV8iCWKrwonYTy6bS2fiE9dFj/pkZeC6mctKZ8ICAP+Kz8RodZOjasoO/Fi+swyKCg/j4d/jjb8MV2GcXWmMl6XwHFdbaKz9KgZND/c5OfpO4kD88fbfa5cPfDOlBoYtfBiJNopiU+dys6VzD0rqUGWB7XPLlsV4Bbtw7Hf56igE/VEwRQkwJRaXXs9OvKPpaGtV9qDoFEnbVsDBetoG7xfy68iqKLwVUld3u4f6hkXcwcOfR21mtXjJnDq/JTxURT3y8jFOuLz12KtjEWNz9juOA35upj8HzzLC35AF5tMkqIRw6EkquhiI3MP0xY05JKjpEXJMT56OzFZ65B/SPA==", + } + rrset = rrRec{} + rrset.rr = append(rrset.rr, &ds) + rrset.sig = append(rrset.sig, sigds) + + r.entries["com."][dns.TypeDS] = rrset + + // DNSKEY . + zkRoot := dns.DNSKEY{ + Hdr: dns.RR_Header{Name: ".", Rrtype: dns.TypeDNSKEY, Class: dns.ClassINET}, + Flags: dns.ZONE, + Algorithm: dns.RSASHA256, + Protocol: 3, + PublicKey: "AwEAAeN+h0loXPKt7lFdW2zKIDkVHyJ1aYGUVE1dMNBlRH3kTn40JKcHiPOs+fy0OFVCBwoKa1s9qZtdyP1UC0hgKoldj3oELK1yLI5MUbTMcNkWbBMRuxRz/CgZJu3IxcmuZWZMbn4LQDMj5YeiUiuWns5vipFGWWpyPyozQXmenSWOK2GJOwcm7I/DyHVtVdztTvqiHqzy2aRoxwPhmEuAoYzzuNJJw6JNEnXaN/7l2TIciskFyPVPBFZYHnk+1ma906dfehIR190z3lh1ZESL2Yy3VIE2QGpRU6Px4ydH5sXxZ2wSMgqNNga4kjnfM1msBqk3EI48RvTTkuV0yb1eFuU=", + } + + kkRoot := dns.DNSKEY{ + Hdr: dns.RR_Header{Name: ".", Rrtype: dns.TypeDNSKEY, Class: dns.ClassINET}, + Flags: dns.ZONE | dns.SEP, + Algorithm: dns.RSASHA256, + Protocol: 3, + PublicKey: "AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTOiW1vkIbzxeF3+/4RgWOq7HrxRixHlFlExOLAJr5emLvN7SWXgnLh4+B5xQlNVz8Og8kvArMtNROxVQuCaSnIDdD5LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF0jLHwVN8efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7pr+eoZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLYA4/ilBmSVIzuDWfdRUfhHdY6+cn8HFRm+2hM8AnXGXws9555KrUB5qihylGa8subX2Nn6UwNR1AkUTV74bU=", + } + sigdnskey2 := dns.RRSIG{ + Hdr: dns.RR_Header{Name: ".", Rrtype: dns.TypeRRSIG, Class: dns.ClassINET}, + TypeCovered: dns.TypeDNSKEY, + Algorithm: dns.RSASHA256, + Labels: 0, + OrigTtl: 172800, + Expiration: 0x5e5c4c80, // timestamp, 2020-03-01 + Inception: 0x5e409d00, // timestamp, 2020-02-09 + KeyTag: 20326, + SignerName: ".", + Signature: "J1YYPv1UjlB7Gk155V4A0q2m1D/LLqAUEHsCg4nVz94lqNza8iRsKN2vR868G3kwdxwPASMDceqGRGHsFOXR1pfasInddcy7IvrVgXnNKu7GrVGh2VlzbG8uyArUREysbtB+07u7/EaNVCkwXI3EiPL4OzhEbFgpUeKs0oGtbT/IBB8uBSHPsy6ntZpyW6YK95FwCeX3comcWyIJgBtKhNHXmLrmahbRieW5xdqE+n5St5x1pRPYTDLKwCE8r2g3SbgAExb9LXCSsr2nO/QWciaATJsMlbmUq3eDmERw/dCkLSWhH+j0c/oWnuW4wIXHRJVb4hwldRSQJfqpK0ijUg==", + } + + rrset = rrRec{} + rrset.rr = append(rrset.rr, &zkRoot) + rrset.rr = append(rrset.rr, &kkRoot) + rrset.sig = append(rrset.sig, sigdnskey2) + rrset.sk = make(map[uint16]crypto.PrivateKey) + + r.entries["."] = make(map[uint16]rrRec) + r.entries["."][dns.TypeDNSKEY] = rrset + + return r +} + +func (r *testResolver) queryRRSet(ctx context.Context, domain string, qtype uint16) ([]dns.RR, []dns.RRSIG, error) { + if zone, ok := r.entries[domain]; ok { + if entry, ok := zone[qtype]; ok { + return entry.rr, entry.sig, nil + } + if qtype == dns.TypeA { + if entry, ok := zone[dns.TypeCNAME]; ok { + rr := entry.rr + sig := entry.sig + target := rr[0].(*dns.CNAME).Target + if alias, ok := r.entries[target]; ok { + // one level deeper, no recursion + if e2, ok := alias[dns.TypeA]; ok { + rr = append(rr, e2.rr...) + } else if e2, ok := alias[dns.TypeCNAME]; ok { + rr = append(rr, e2.rr...) + } + } + return rr, sig, nil + } + } + + } + return nil, nil, fmt.Errorf("%s not found", domain) +} + +func (r *testResolver) query(ctx context.Context, domain string, qtype uint16) (resp *dns.Msg, err error) { + msg := new(dns.Msg) + msg.RecursionDesired = true + msg.SetQuestion(domain, qtype) + if zone, ok := r.entries[domain]; ok { + if entry, ok := zone[qtype]; ok { + for _, rr := range entry.rr { + msg.Answer = append(msg.Answer, rr) + } + for _, rr := range entry.sig { + msg.Answer = append(msg.Answer, &rr) + } + } + } + return msg, nil +} + +func (r *testResolver) serverList() []string { + return nil +} + +func (r *testResolver) queryDNSKeyRRSet(domain string) (zsk []dns.DNSKEY, ksk []dns.DNSKEY, rrSig []dns.RRSIG) { + rrs, rrsigs, _ := r.queryRRSet(context.Background(), domain, dns.TypeDNSKEY) + for _, r := range rrs { + switch t := r.(type) { + case *dns.DNSKEY: + if t.Flags&dns.SEP != 0 { + ksk = append(ksk, *t) + } else if t.Flags&dns.ZONE != 0 { + zsk = append(zsk, *t) + } + } + } + rrSig = append(rrSig, rrsigs[0]) + return +} + +func (r *testResolver) rootTrustAnchor() ([]dns.DS, error) { + if r.anchor != nil { + return r.anchor, nil + } + return parseRootTrustAnchor(r.rootAnchorXML) +} + +func (r *testResolver) setRootAnchor(dss *[]dns.DS) { + r.anchor = *dss +} + +func (r *testResolver) sign(rrset []dns.RR, signer string, keytag uint16, expTime time.Time, sk crypto.PrivateKey) (sig dns.RRSIG, err error) { + incTime, _ := time.Parse(time.RFC3339, "2020-01-01T00:00:00Z") + if expTime.IsZero() { + expTime, _ = time.Parse(time.RFC3339, "2030-01-01T00:00:00Z") + } + sig.Inception = uint32(incTime.Unix()) + sig.Expiration = uint32(expTime.Unix()) + sig.KeyTag = keytag + sig.SignerName = signer + sig.Algorithm = dns.RSASHA256 + err = sig.Sign(sk.(*rsa.PrivateKey), rrset) + return +} + +func (r *testResolver) updateDNSKEYRRSet(zone string, key *dns.DNSKEY, sk crypto.PrivateKey) ([]dns.RR, map[uint16]crypto.PrivateKey) { + var rrset []dns.RR + var err error + if rrset, _, err = r.queryRRSet(context.Background(), zone, dns.TypeDNSKEY); err != nil { + // no entry, create a new one + rr := []dns.RR{key} + secretKeys := make(map[uint16]crypto.PrivateKey) + secretKeys[key.KeyTag()] = sk + return rr, secretKeys + } + // filter out keys of the same time as the key provided + secretKeys := r.entries[zone][dns.TypeDNSKEY].sk + rrsetNew := []dns.RR{} + for _, rr := range rrset { + k := rr.(*dns.DNSKEY) + if k.Flags != key.Flags { + rrsetNew = append(rrsetNew, rr) + } else { + delete(secretKeys, k.KeyTag()) + } + } + rrsetNew = append(rrsetNew, key) + secretKeys[key.KeyTag()] = sk + return rrsetNew, secretKeys +} + +func (r *testResolver) getKey(zone string, flags uint16) (key *dns.DNSKEY, err error) { + if _, ok := r.entries[zone]; !ok { + err = fmt.Errorf("No zone entry for %s", zone) + return + } + entry, ok := r.entries[zone][dns.TypeDNSKEY] + if !ok { + err = fmt.Errorf("No DNSKEY entry for %s", zone) + return + } + for idx, rr := range entry.rr { + k := rr.(*dns.DNSKEY) + if k.Flags == flags { + key = entry.rr[idx].(*dns.DNSKEY) + break + } + } + if key == nil { + err = fmt.Errorf("No KSK entry for %s", zone) + } + return +} + +func (r *testResolver) updateKSKNoCheck(zone string, key *dns.DNSKEY, sk crypto.PrivateKey, expTime time.Time) (err error) { + if key.Flags&dns.SEP == 0 { + err = fmt.Errorf("not a KSK") + return + } + + rrset, secretKeys := r.updateDNSKEYRRSet(zone, key, sk) + var sig dns.RRSIG + if sig, err = r.sign(rrset, zone, key.KeyTag(), expTime, sk); err != nil { + return err + } + if _, ok := r.entries[zone]; !ok { + r.entries[zone] = make(map[uint16]rrRec) + } + r.entries[zone][dns.TypeDNSKEY] = rrRec{ + rr: rrset, + sig: []dns.RRSIG{sig}, + sk: secretKeys, + } + return +} + +func (r *testResolver) updateZSK(zone string, key *dns.DNSKEY, sk crypto.PrivateKey, expTime time.Time) (err error) { + if key.Flags&dns.SEP != 0 { + err = fmt.Errorf("not a ZSK") + return + } + // ensure KSK exist + var ksk *dns.DNSKEY + if ksk, err = r.getKey(zone, dns.ZONE|dns.SEP); err != nil { + return + } + + // update ZSK and sign DNSKEY RR with KSK + rrset, secretKeys := r.updateDNSKEYRRSet(zone, key, sk) + skKSK := secretKeys[ksk.KeyTag()] + var sig dns.RRSIG + if sig, err = r.sign(rrset, zone, ksk.KeyTag(), expTime, skKSK); err != nil { + return err + } + r.entries[zone][dns.TypeDNSKEY] = rrRec{ + rr: rrset, + sig: []dns.RRSIG{sig}, + sk: secretKeys, + } + return +} + +func (r *testResolver) updateDNSKeyRecord(zone string, key *dns.DNSKEY, sk crypto.PrivateKey, expTime time.Time) (err error) { + if key.Flags&dns.SEP != 0 { + // KSK case + // ensure parent's DS updated + var dss []dns.DS + if zone == "." { + if dss, err = r.rootTrustAnchor(); err != nil { + return err + } + } else { + if dss, _, err = r.queryDSRRSet(zone); err != nil { + return err + } + } + ok := false + for _, ds := range dss { + newDS := key.ToDS(ds.DigestType) + if strings.ToLower(newDS.Digest) == strings.ToLower(ds.Digest) { + ok = true + break + } + } + if !ok { + return fmt.Errorf("parent DS does not match to this KSK") + } + + return r.updateKSKNoCheck(zone, key, sk, expTime) + } + + // ZSK case + if err = r.updateZSK(zone, key, sk, expTime); err != nil { + return + } + + var sig dns.RRSIG + // re-sign all records except DNSKEY and DS with new ZSK + for k, rec := range r.entries[zone] { + if k != dns.TypeDNSKEY && k != dns.TypeDS { + if sig, err = r.sign(rec.rr, zone, key.KeyTag(), expTime, sk); err != nil { + return err + } + r.entries[zone][k] = rrRec{ + rr: rec.rr, + sig: []dns.RRSIG{sig}, + } + } + } + // re-sign all DS records of direct children + // i.e. if com. ZSK is updated, need to update example.com. DS + for k, v := range r.entries { + if k != "." { + if z, err := getParentZone(k); err == nil && z == zone { + dsEntry := v[dns.TypeDS] + if sig, err = r.sign(dsEntry.rr, zone, key.KeyTag(), expTime, sk); err != nil { + return err + } + r.entries[k][dns.TypeDS] = rrRec{ + rr: dsEntry.rr, + sig: []dns.RRSIG{sig}, + } + } + } + } + return +} + +func (r *testResolver) updateDSRecord(zone string, dss *[]dns.DS, expTime time.Time) (err error) { + if zone == "." { + r.anchor = *dss + return nil + } + + parent, err := getParentZone(zone) + if err != nil { + return + } + + var zsk *dns.DNSKEY + if zsk, err = r.getKey(parent, dns.ZONE); err != nil { + return + } + sk := r.entries[parent][dns.TypeDNSKEY].sk[zsk.KeyTag()] + + rrset := make([]dns.RR, len(*dss)) + for i := range *dss { + rrset[i] = &(*dss)[i] + } + var sig dns.RRSIG + if sig, err = r.sign(rrset, parent, zsk.KeyTag(), expTime, sk); err != nil { + return err + } + if _, ok := r.entries[zone]; !ok { + r.entries[zone] = make(map[uint16]rrRec) + } + r.entries[zone][dns.TypeDS] = rrRec{ + rr: rrset, + sig: []dns.RRSIG{sig}, + } + return +} + +func (r *testResolver) updateARecord(domain string, value net.IP, expTime time.Time) (err error) { + parent, err := getParentZone(domain) + if err != nil { + return + } + + a := dns.A{ + Hdr: dns.RR_Header{Name: domain, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 3600}, + A: value, + } + aaaa := dns.AAAA{ + Hdr: a.Hdr, + AAAA: value, + } + + rrset := []dns.RR{&a, &aaaa} + return r.updateRegRecord(domain, parent, dns.TypeA, rrset, expTime) +} + +func (r *testResolver) updateRegRecord(domain string, signer string, tp uint16, rrset []dns.RR, expTime time.Time) (err error) { + var zsk *dns.DNSKEY + if zsk, err = r.getKey(signer, dns.ZONE); err != nil { + return + } + sk := r.entries[signer][dns.TypeDNSKEY].sk[zsk.KeyTag()] + + var sig dns.RRSIG + if sig, err = r.sign(rrset, signer, zsk.KeyTag(), expTime, sk); err != nil { + return err + } + + if _, ok := r.entries[domain]; !ok { + r.entries[domain] = make(map[uint16]rrRec) + } + + r.entries[domain][tp] = rrRec{ + rr: rrset, + sig: []dns.RRSIG{sig}, + } + return +} + +func (r *testResolver) queryDSRRSet(domain string) (dss []dns.DS, rrSig []dns.RRSIG, err error) { + rrs, rrsigs, err := r.queryRRSet(context.Background(), domain, dns.TypeDS) + if err != nil { + return + } + for _, r := range rrs { + switch t := r.(type) { + case *dns.DS: + dss = append(dss, *t) + } + } + rrSig = append(rrSig, rrsigs[0]) + return +} diff --git a/tools/network/dnssec/trustchain.go b/tools/network/dnssec/trustchain.go new file mode 100644 index 0000000000..23a8d7865f --- /dev/null +++ b/tools/network/dnssec/trustchain.go @@ -0,0 +1,364 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package dnssec + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/algorand/go-deadlock" + "github.com/miekg/dns" +) + +type trustChain struct { + resolver netResolverIf + trustedZones map[string]*trustedZone + mu deadlock.RWMutex +} + +type trustedZone struct { + name string + zsk map[uint16]dns.DNSKEY // zone signing keys + ksk map[uint16]dns.DNSKEY // key signing keys + rrSig map[uint16]dns.RRSIG // DNSKEY RR signature(s), used for validity + dss []dns.DS // DS or root anchor authenticating this zone in DS format +} + +func makeTrustChain(r netResolverIf) *trustChain { + return &trustChain{ + resolver: r, + trustedZones: make(map[string]*trustedZone), + } +} + +// verifyRRSig takes RRSET, array of RRSIG, time and ZSKs in form of map +// and returns a map of matched signatures by keytag +func verifyRRSig(rrSet []dns.RR, rrSig []dns.RRSIG, t time.Time, keys map[uint16]dns.DNSKEY) map[uint16]dns.RRSIG { + verifiedSig := make(map[uint16]dns.RRSIG) + for _, sig := range rrSig { + if !sig.ValidityPeriod(t) { + continue + } + ksk := keys[sig.KeyTag] + if err := sig.Verify(&ksk, rrSet); err == nil { + verifiedSig[sig.KeyTag] = sig + } + } + return verifiedSig +} + +// verifyKSKDigest takes array of DS and KSKs in form of map +// and returns an array of matched DS records and verified keys +func verifyKSKDigest(dss []dns.DS, ksk map[uint16]dns.DNSKEY) ([]dns.DS, map[uint16]dns.DNSKEY) { + verifiedKSK := make(map[uint16]dns.DNSKEY) + matchedDS := make([]dns.DS, 0, len(dss)) + + for _, ds := range dss { + if key, ok := ksk[ds.KeyTag]; ok { + keyDigest := strings.ToLower(key.ToDS(ds.DigestType).Digest) + if keyDigest == strings.ToLower(ds.Digest) { + verifiedKSK[ds.KeyTag] = key + matchedDS = append(matchedDS, ds) + } + } + } + return matchedDS, verifiedKSK +} + +func (tz *trustedZone) isExpired(t time.Time) bool { + for _, sig := range tz.rrSig { + if !sig.ValidityPeriod(t) { + return true + } + } + return false +} + +// ensure at least one of the keytags in ZSK of this zone +func (tz *trustedZone) checkKeys(keytags []uint16) bool { + for _, kt := range keytags { + if _, ok := tz.zsk[kt]; ok { + return true + } + } + return false +} + +// verifyDS checks DS RRSIG using this zone ZSK +// cacheOutdated indicates no ZSK in this zone to verify RRSIG provided +func (tz *trustedZone) verifyDS(rrSet []dns.RR, rrSig []dns.RRSIG, t time.Time) (cacheOutdated bool, err error) { + // parent zone's DNSKEY RRSET is cached but DS is just came from the network + // and might be signed by newer key + kt := make([]uint16, 0, len(rrSig)) + for _, sig := range rrSig { + kt = append(kt, sig.KeyTag) + } + // so if no such keys in a cache return cache outdated that must force this zone update + if !tz.checkKeys(kt) { + cacheOutdated = true + return + } + + // at least one signature must be valid + verifiedSig := verifyRRSig(rrSet, rrSig, t, tz.zsk) + if len(verifiedSig) == 0 { + requestedZone := (rrSig)[0].Hdr.Name + err = fmt.Errorf("DS signature verification failed for %s", requestedZone) + } + + return +} + +// makeTrustedZone creates a new trustedZone for **fqZoneName**. +// it uses **resolver** is for emitting DNSKEY and DS queries and +// **pz** for DS verification using cached keys. +// returns: +// 1. newly created trustedZone in case of success +// 2. cacheOutdated if cached parent **pz** does not have ZSK for DS validation +// 3. error in all other cases +// +// Note 1: the function should never return cacheOutdated for the root zone +// otherwise it might cause infinity loop in the caller. +// +// Note2: the function requests both DNSKEY (from child) and DS (from parent) +// and this allows to tolerate KSK rotation: if child zone refreshed KSK +// then its digest is propagated to parent DS and used to sign child's DNSKEY +func makeTrustedZone(ctx context.Context, fqZoneName string, pz *trustedZone, r netResolverIf, t time.Time) (tz *trustedZone, cacheOutdated bool, err error) { + rrSet, rrSig, err := r.queryRRSet(ctx, fqZoneName, dns.TypeDNSKEY) + if err != nil { + return nil, false, err + } + + zsk := make(map[uint16]dns.DNSKEY) + ksk := make(map[uint16]dns.DNSKEY) + for _, rr := range rrSet { + switch obj := rr.(type) { + case *dns.DNSKEY: + if obj.Flags&dns.ZONE != 0 { // 256 + if obj.Flags&dns.SEP != 0 { // 257 + ksk[obj.KeyTag()] = *obj + } else { + zsk[obj.KeyTag()] = *obj + } + } + default: + } + } + + // get DS record from parent + var dss []dns.DS + if fqZoneName == "." { + // for the root zone there no DS record and trust comes from trust anchors + if dss, err = r.rootTrustAnchor(); err != nil { + return + } + } else { + var rrSet []dns.RR + var rrSig []dns.RRSIG + rrSet, rrSig, err = r.queryRRSet(ctx, fqZoneName, dns.TypeDS) // stored at parent of fqZoneName + if err != nil { + return + } + // since a new zone is created that DS is always fetched from the network + // but parent zone is cached and cache outdated error possbile + cacheOutdated, err = pz.verifyDS(rrSet, rrSig, t) + if err != nil || cacheOutdated { + return + } + for _, rr := range rrSet { + switch obj := rr.(type) { + case *dns.DS: + dss = append(dss, *obj) + } + } + } + + // find DNSKEY matched to RS retrieved from parent zone or from a trust anchor + matchedDS, verifiedKSK := verifyKSKDigest(dss, ksk) + if len(verifiedKSK) == 0 { + err = fmt.Errorf("failed to verify %s KSK against digest in parent DS", fqZoneName) + return + } + + // validate DNSKEY RRSIG using matched (verified) keys + // DNSKEY RRSET is self-signed so makes sense to check this signature at the very end with authenticated via parent DS + verifiedSig := verifyRRSig(rrSet, rrSig, t, verifiedKSK) + if len(verifiedSig) == 0 { + err = fmt.Errorf("no KSK to verify DNSKEY RRSet of %s", fqZoneName) + return + } + + // zone and keys are authenticated, create a new zone + tz = &trustedZone{ + name: fqZoneName, + zsk: zsk, + ksk: verifiedKSK, + rrSig: verifiedSig, + dss: matchedDS, + } + return +} + +// must be called with the lock taken +func (t *trustChain) removeSelfAndChildren(zone string) { + for k := range t.trustedZones { + if strings.HasSuffix(k, zone) { + delete(t.trustedZones, k) + } + } +} + +// ensure checks that all zones from root till fqZoneName are valid and places them into a cache. +// It also performs cache invalidation: if child-parent authentication fails because of keys mismatch +// then parent zone is updated from the network and the process repeats. +// For example, example.com. is represented by 3 trusted zones: [".", "com.", "example.com."] +func (t *trustChain) ensure(ctx context.Context, fqZoneName string, keytags []uint16) error { + // get zones from . to fqZoneName + zones, err := splitToZones(fqZoneName) + if err != nil { + return err + } + + zoneIdx := 0 + refreshedZones := make([]bool, len(zones)) // indexes of refreshed zones during the loop iterations + // the loop goes over zones and cached trust chain and creates new entries if needed. + // cache invalidation happens in these three cases: + // 1. no ZSK in parent zone to check newly obtained DS + // Explanation: DS is stored in parent and signed with its ZSK. If no such keys in the cache then ZSK rotation happened. + // 2. DNSKEY signature (RRSIG) expired + // 3. no ZSK in the last zone in cache + // Explanation: server rotated ZSK and the cache does not have key to authenticate response. + // + // worst case: the last zone fails to find ZSK, it triggers refreshing back to root + // causing 2 * len(zones) iterations + // makeTrustedZone does not return cacheOutdated and refreshedZones has indication that the root was already updated + // and the second fallback to the root zone will fail + + // this would not survive after granular locks and concurrent underlying zones removal + t.mu.Lock() + defer t.mu.Unlock() + for { + zone := zones[zoneIdx] + tz, ok := t.trustedZones[zone] + if !ok { + if refreshedZones[zoneIdx] { + return fmt.Errorf("cache outdated for already updated zone %s", zone) + } + var cacheOutdated bool + parentZone := &trustedZone{} + if zoneIdx > 0 { + parentZone = t.trustedZones[zones[zoneIdx-1]] + } + if tz, cacheOutdated, err = makeTrustedZone(ctx, zone, parentZone, t.resolver, time.Now()); err != nil { + return err + } + if cacheOutdated { + // Failed to validate DS using cached parent's keys + // restart loop from parent + zoneIdx-- + if zoneIdx < 0 { + return fmt.Errorf("logic error: cache outdated for root zone") + } + parentZoneName := zones[zoneIdx] + t.removeSelfAndChildren(parentZoneName) + continue + } + // successfully created a new zone, record it + t.trustedZones[zone] = tz + refreshedZones[zoneIdx] = true + } + if tz.isExpired(time.Now()) { + // remove current and all child zones and restart with the same zone + t.removeSelfAndChildren(zone) + continue + } + if zoneIdx == len(zones)-1 { + // for the last zone also ensure that ZSK used to sign user-requested RR are also in place + if !tz.checkKeys(keytags) { + if refreshedZones[zoneIdx] { + return fmt.Errorf("ZSK %v not found in zone %s", keytags, fqZoneName) + } + // seems like the latest zone + t.removeSelfAndChildren(zone) + continue + } + } + + zoneIdx++ + if zoneIdx >= len(zones) { + break + } + } + return nil +} + +func (t *trustChain) getDNSKey(fqZoneName string, keyTag uint16) (key *dns.DNSKEY, found bool) { + t.mu.RLock() + trustedZone, ok := t.trustedZones[fqZoneName] + t.mu.RUnlock() + if !ok { + return + } + k, found := trustedZone.zsk[keyTag] + return &k, found +} + +func (t *trustChain) authenticate(ctx context.Context, rrSet []dns.RR, rrSig []dns.RRSIG) (err error) { + // response authentication includes the following steps + // 1. Ensure the trust chain is valid. This requires keys' signature check back to the root if not cached + // 2. Check the signature using authenticated DNSKEY + if len(rrSig) == 0 { + return fmt.Errorf("empty RRSIG") + } + + signer := rrSig[0].SignerName + // sanity check: ensure all RRSIG contain the same signer, it must be the parent zone + for i := 1; i < len(rrSig); i++ { + if signer != rrSig[i].SignerName { + return fmt.Errorf("signer name mismatch: %s vs %s", signer, rrSig[i].SignerName) + } + } + + fqdn := dns.Fqdn(signer) + + keytags := make([]uint16, 0, len(rrSig)) + for _, sig := range rrSig { + keytags = append(keytags, sig.KeyTag) + } + + // 1. ensure trust from the root to the signer + // 2. check the keys are in place + err = t.ensure(ctx, fqdn, keytags) + if err != nil { + return err + } + + for _, sig := range rrSig { + // get already authenticated ZSK + key, ok := t.getDNSKey(fqdn, sig.KeyTag) + if !ok { + // skip, trustChain.ensure checks that at least one keytag is available + continue + } + if err = sig.Verify(key, rrSet); err == nil { + return nil + } + } + return err +} diff --git a/tools/network/dnssec/util.go b/tools/network/dnssec/util.go new file mode 100644 index 0000000000..706944c879 --- /dev/null +++ b/tools/network/dnssec/util.go @@ -0,0 +1,56 @@ +// Copyright (C) 2019-2020 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package dnssec + +import ( + "fmt" + "strings" + + "github.com/miekg/dns" +) + +func splitToZones(fqZoneName string) ([]string, error) { + if fqZoneName == "" || !dns.IsFqdn(fqZoneName) { + return nil, fmt.Errorf("%s is not FQDN", fqZoneName) + } + if fqZoneName == "." { + return []string{"."}, nil + } + components := strings.Split(fqZoneName, ".") + l := len(components) // always >= 2 + result := make([]string, 0, l) + result = append(result, ".") + + var zone string + for i := l - 2; i >= 0; i-- { + zone = components[i] + "." + zone + result = append(result, zone) + } + + return result, nil +} + +func getParentZone(fqZoneName string) (string, error) { + zones, err := splitToZones(fqZoneName) + if err != nil { + return "", err + } + if len(zones) < 2 { + return "", fmt.Errorf("No parent zone for %s", fqZoneName) + } + return zones[len(zones)-2], nil +} diff --git a/tools/network/telemetryURIUpdateService.go b/tools/network/telemetryURIUpdateService.go index a494cd9905..2a619c7d7c 100644 --- a/tools/network/telemetryURIUpdateService.go +++ b/tools/network/telemetryURIUpdateService.go @@ -131,5 +131,5 @@ func (t *telemetryURIUpdater) lookupTelemetryURL() (url *url.URL) { } func (t *telemetryURIUpdater) readFromSRV(protocol string, bootstrapID string) (addrs []string, err error) { - return ReadFromSRV("telemetry", protocol, bootstrapID, t.cfg.FallbackDNSResolverAddress) + return ReadFromSRV("telemetry", protocol, bootstrapID, t.cfg.FallbackDNSResolverAddress, t.cfg.DNSSecuritySRVEnforced()) } diff --git a/tools/teal/templates/dynamic-fee.teal.tmpl b/tools/teal/templates/dynamic-fee.teal.tmpl index 8371dc5b97..170471ef0f 100644 --- a/tools/teal/templates/dynamic-fee.teal.tmpl +++ b/tools/teal/templates/dynamic-fee.teal.tmpl @@ -1,7 +1,7 @@ // Implements a payment transaction with an undetermined fee. // This is delegate logic. // -// This must be present on the first of two transactions. +// This must be present on the second of two transactions. // // The first transaction should send money to this account. // It must send an amount equal to txn.Fee. diff --git a/util/db/dbutil.go b/util/db/dbutil.go index f688d2e216..fdc1b75b85 100644 --- a/util/db/dbutil.go +++ b/util/db/dbutil.go @@ -26,6 +26,8 @@ import ( "fmt" "reflect" "runtime" + "strings" + "sync" "time" "github.com/mattn/go-sqlite3" @@ -48,39 +50,59 @@ const busy = 1000 // connection. For now, it's just an optional "PRAGMA fullfsync=true" on // MacOSX. var initStatements []string +var sqliteInitOnce sync.Once // An Accessor manages a sqlite database handle and any outstanding batching operations. type Accessor struct { Handle *sql.DB readOnly bool + log logging.Logger } // MakeAccessor creates a new Accessor. func MakeAccessor(dbfilename string, readOnly bool, inMemory bool) (Accessor, error) { - var db Accessor - db.readOnly = readOnly - - var err error - db.Handle, err = sql.Open("sqlite3", URI(dbfilename, readOnly, inMemory)+"&_journal_mode=wal") - - if err == nil { - err = db.runInitStatements() - } - - return db, err + return makeAccessorImpl(dbfilename, readOnly, inMemory, []string{"_journal_mode=wal"}) } // MakeErasableAccessor creates a new Accessor with the secure_delete pragma set; // see https://www.sqlite.org/pragma.html#pragma_secure_delete // It is not read-only and not in-memory (otherwise, erasability doesn't matter) func MakeErasableAccessor(dbfilename string) (Accessor, error) { + return makeAccessorImpl(dbfilename, false, false, []string{"_secure_delete=on"}) +} + +func makeAccessorImpl(dbfilename string, readOnly bool, inMemory bool, params []string) (Accessor, error) { var db Accessor - db.readOnly = false + db.readOnly = readOnly + // SQLite3 driver we use (mattn/go-sqlite3) does not implement driver.DriverContext interface + // that forces sql.Open calling sql.OpenDB and return a struct without any touches to the underlying driver. + // Because of that SQLite library is not initialized until the very first call of sqlite3_open_v2 that happens + // in sql.DB.conn. SQLite initialization is not thread-safe on date of writing (2/27/2020) and + // mattn/go-sqlite3 has no special code to handle this case. + // Solution is to create a connection using a safe synchronization barrier right here. + // The connection goes to a connection pool inside Go's sql package and will be re-used when needed. + // See https://github.com/algorand/go-algorand/issues/846 for more details. var err error - db.Handle, err = sql.Open("sqlite3", URI(dbfilename, false, false)+"&_secure_delete=on") + db.Handle, err = sql.Open("sqlite3", URI(dbfilename, readOnly, inMemory)+"&"+strings.Join(params, "&")) if err == nil { + // create a connection to safely initialize SQLite once + initFn := func() { + var conn *sql.Conn + if conn, err = db.Handle.Conn(context.Background()); err != nil { + db.Close() + return + } + if err = conn.Close(); err != nil { + db.Close() + } + } + sqliteInitOnce.Do(initFn) + if err != nil { + // init failed, db closed and err is set + return db, err + } err = db.runInitStatements() } @@ -88,11 +110,11 @@ func MakeErasableAccessor(dbfilename string) (Accessor, error) { } // runInitStatements executes initialization statements. -func (db Accessor) runInitStatements() error { +func (db *Accessor) runInitStatements() error { for _, stmt := range initStatements { _, err := db.Handle.Exec(stmt) if err != nil { - db.Handle.Close() + db.Close() return err } } @@ -100,36 +122,54 @@ func (db Accessor) runInitStatements() error { return nil } +// SetLogger sets the Logger, mainly for unit test quietness +func (db *Accessor) SetLogger(log logging.Logger) { + db.log = log +} + +func (db *Accessor) logger() logging.Logger { + if db.log != nil { + return db.log + } + return logging.Base() +} + // Close closes the connection. -func (db Accessor) Close() { +func (db *Accessor) Close() { db.Handle.Close() db.Handle = nil } -// Retry executes a function repeatedly as long as it returns an error +// LoggedRetry executes a function repeatedly as long as it returns an error // that indicates database contention that warrants a retry. -func Retry(fn func() error) (err error) { - for i := 0; ; i++ { - if i > 0 && i%warnTxRetries == 0 { - if i >= 1000 { - logging.Base().Errorf("db.Retry: %d retries (last err: %v)", i, err) +// Sends warnings and errors to log. +func LoggedRetry(fn func() error, log logging.Logger) (err error) { + for i := 0; (i == 0) || dbretry(err); i++ { + if i > 0 { + if i < infoTxRetries { + log.Infof("db.LoggedRetry: %d retries (last err: %v)", i, err) + } else if i >= 1000 { + log.Errorf("db.LoggedRetry: %d retries (last err: %v)", i, err) return + } else if i%warnTxRetriesInterval == 0 { + log.Warnf("db.LoggedRetry: %d retries (last err: %v)", i, err) } - logging.Base().Warnf("db.Retry: %d retries (last err: %v)", i, err) } - err = fn() - if dbretry(err) { - continue - } - - return } + return +} + +// Retry executes a function repeatedly as long as it returns an error +// that indicates database contention that warrants a retry. +// Sends warnings and errors to logging.Base() +func Retry(fn func() error) (err error) { + return LoggedRetry(fn, logging.Base()) } // getDecoratedLogger retruns a decorated logger that includes the readonly true/false, caller and extra fields. func (db *Accessor) getDecoratedLogger(fn idemFn, extras ...interface{}) logging.Logger { - log := logging.Base().With("readonly", db.readOnly) + log := db.logger().With("readonly", db.readOnly) _, file, line, ok := runtime.Caller(2) if ok { log = log.With("caller", fmt.Sprintf("%s:%d", file, line)) @@ -147,7 +187,7 @@ func (db *Accessor) getDecoratedLogger(fn idemFn, extras ...interface{}) logging // Atomic executes a piece of code with respect to the database atomically. // For transactions where readOnly is false, sync determines whether or not to wait for the result. -func (db Accessor) Atomic(fn idemFn, extras ...interface{}) (err error) { +func (db *Accessor) Atomic(fn idemFn, extras ...interface{}) (err error) { start := time.Now() // note that the sql library will drop panics inside an active transaction @@ -167,21 +207,38 @@ func (db Accessor) Atomic(fn idemFn, extras ...interface{}) (err error) { } var tx *sql.Tx - ctx := context.Background() var conn *sql.Conn - conn, err = db.Handle.Conn(ctx) + ctx := context.Background() + + for i := 0; (i == 0) || dbretry(err); i++ { + if i > 0 { + if i < infoTxRetries { + db.getDecoratedLogger(fn, extras).Infof("db.atomic: %d connection retries (last err: %v)", i, err) + } else if i >= 1000 { + db.getDecoratedLogger(fn, extras).Errorf("db.atomic: %d connection retries (last err: %v)", i, err) + break + } else if i%warnTxRetriesInterval == 0 { + db.getDecoratedLogger(fn, extras).Warnf("db.atomic: %d connection retries (last err: %v)", i, err) + } + } + conn, err = db.Handle.Conn(ctx) + } + if err != nil { return } defer conn.Close() for i := 0; ; i++ { - if i > 0 && i%warnTxRetries == 0 { - if i >= 1000 { - db.getDecoratedLogger(fn, extras).Errorf("dbatomic: %d retries (last err: %v)", i, err) + if i > 0 { + if i < infoTxRetries { + db.getDecoratedLogger(fn, extras).Infof("db.atomic: %d retries (last err: %v)", i, err) + } else if i >= 1000 { + db.getDecoratedLogger(fn, extras).Errorf("db.atomic: %d retries (last err: %v)", i, err) break + } else if i%warnTxRetriesInterval == 0 { + db.getDecoratedLogger(fn, extras).Warnf("db.atomic: %d retries (last err: %v)", i, err) } - db.getDecoratedLogger(fn, extras).Warnf("dbatomic: %d retries (last err: %v)", i, err) } tx, err = conn.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable, ReadOnly: db.readOnly}) @@ -240,4 +297,5 @@ func dbretry(obj error) bool { type idemFn func(tx *sql.Tx) error -const warnTxRetries = 1 +const infoTxRetries = 5 +const warnTxRetriesInterval = 1 diff --git a/util/execpool/backlog.go b/util/execpool/backlog.go index bdce408a7a..8353cbdee2 100644 --- a/util/execpool/backlog.go +++ b/util/execpool/backlog.go @@ -42,7 +42,6 @@ type backlogItemTask struct { // BacklogPool supports all the ExecutionPool functions plus few more that tests the pending tasks. type BacklogPool interface { ExecutionPool - IsFull() bool EnqueueBacklog(enqueueCtx context.Context, t ExecFunc, arg interface{}, out chan interface{}) error } @@ -76,11 +75,6 @@ func (b *backlog) GetParallelism() int { return b.pool.GetParallelism() } -// IsFull test to see if the input buffer is full. -func (b *backlog) IsFull() bool { - return len(b.buffer) == cap(b.buffer) -} - // Enqueue enqueues a single task into the backlog func (b *backlog) Enqueue(enqueueCtx context.Context, t ExecFunc, arg interface{}, priority Priority, out chan interface{}) error { select { @@ -95,6 +89,8 @@ func (b *backlog) Enqueue(enqueueCtx context.Context, t ExecFunc, arg interface{ return nil case <-enqueueCtx.Done(): return enqueueCtx.Err() + case <-b.ctx.Done(): + return b.ctx.Err() } } @@ -112,13 +108,15 @@ func (b *backlog) EnqueueBacklog(enqueueCtx context.Context, t ExecFunc, arg int return nil case <-enqueueCtx.Done(): return enqueueCtx.Err() + case <-b.ctx.Done(): + return b.ctx.Err() } } // Shutdown shuts down the backlog. func (b *backlog) Shutdown() { b.ctxCancel() - close(b.buffer) + // NOTE: Do not close(b.buffer) because there's no good way to ensure Enqueue*() won't write to it and panic. Just let it be garbage collected. b.wg.Wait() if b.pool.GetOwner() == b { b.pool.Shutdown() diff --git a/util/process.go b/util/process.go index 1653f1891b..d4f65ee25e 100644 --- a/util/process.go +++ b/util/process.go @@ -17,9 +17,11 @@ package util import ( - "io/ioutil" + "io" "os" "os/exec" + "sync" + "time" ) // ExecAndCaptureOutput runs the specified command and args and captures @@ -38,19 +40,36 @@ func ExecAndCaptureOutput(command string, args ...string) (string, string, error subcmd.Stdout = wStdout subcmd.Stderr = wStderr - err = subcmd.Run() + outputStdout := make([]byte, 0, 10240) + outputStderr := make([]byte, 0, 1024) - wStdout.Close() - outputStdout, errIO := ioutil.ReadAll(rStdout) - if err == nil { - err = errIO + var wg sync.WaitGroup + wg.Add(2) + + reader := func(input *os.File, output *[]byte) { + defer wg.Done() + + for { + buf := make([]byte, 1024) + read, e := input.Read(buf) + if e == io.EOF { + break + } + if read > 0 { + *output = append(*output, buf[0:read]...) + } else { + time.Sleep(time.Microsecond) + } + } } + go reader(rStdout, &outputStdout) + go reader(rStderr, &outputStderr) + err = subcmd.Run() + wStdout.Close() wStderr.Close() - outputStderr, errIO := ioutil.ReadAll(rStderr) - if err == nil { - err = errIO - } + + wg.Wait() return string(outputStdout), string(outputStderr), err } diff --git a/util/timers/monotonic.go b/util/timers/monotonic.go index bfe30dd19e..adad9a0c39 100644 --- a/util/timers/monotonic.go +++ b/util/timers/monotonic.go @@ -68,13 +68,13 @@ func (m *Monotonic) TimeoutAt(delta time.Duration) <-chan time.Time { // Encode implements Clock.Encode. func (m *Monotonic) Encode() []byte { - return protocol.Encode(m.zero) + return protocol.EncodeReflect(m.zero) } // Decode implements Clock.Decode. func (m *Monotonic) Decode(data []byte) (Clock, error) { var zero time.Time - err := protocol.Decode(data, &zero) + err := protocol.DecodeReflect(data, &zero) if err == nil { logging.Base().Debugf("Clock decoded with zero at %v", zero) } else { diff --git a/wallet/algorand.js b/wallet/algorand.js deleted file mode 100644 index 832ee8c25d..0000000000 --- a/wallet/algorand.js +++ /dev/null @@ -1,20 +0,0 @@ -function authAlgorandRequests(token, baseurl) { - $.ajaxSetup({ - beforeSend: function(xhr, settings) { - // Ensure we don't send our token anywhere unexpected - var baseOrigin = (new URL(baseurl)).origin; - var requestedOrigin = (new URL(settings.url)).origin; - if (baseOrigin === requestedOrigin) { - xhr.setRequestHeader('X-Algo-API-Token', token); - } - } - }); -} - -function localstorage_to_input(keyname) { - var v = window.localStorage.getItem(keyname); - console.log('localStorage[' + keyname + ']:', v) - if (v) { - $('#' + keyname).val(v); - } -} diff --git a/wallet/auction.html b/wallet/auction.html deleted file mode 100644 index d6f429de37..0000000000 --- a/wallet/auction.html +++ /dev/null @@ -1,537 +0,0 @@ - - - Algorand auction - - - - - - - - -

Algorand auction manager

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- algod URL: - - -
- algod port: - - -
- API Token: - - -
- Mnemonic: - - -
- Auction console URL: - - -
- Auction bank URL: - - -
- Bank username: - - -
- -
-
- -
-

algod + auction

- - - - - - - - - - - - - - - - - - - - - -
algod version:
Last round:
Current auction price:
Number of bids:
-
- -
-

bank

- -
- - - - - - - - - - - -
- -
Transfer: - - -
-
- -
-

auction params

- -
-
- -
-

accounts

- -
-
- -
- HTML loaded. -
- - - - - - - - - - \ No newline at end of file diff --git a/wallet/blockview.html b/wallet/blockview.html deleted file mode 100644 index cced60488f..0000000000 --- a/wallet/blockview.html +++ /dev/null @@ -1,202 +0,0 @@ - - - Algorand block viewer - - - - - - -

Algorand block viewer

- -
- - - - - - - - - - - - -
- algod URL: - - -
- API Token: - - -
-
-
- Block: - - - -
- -
-
- -
- HTML loaded. -
- - - - - - diff --git a/wallet/lib/algosdk.min.js b/wallet/lib/algosdk.min.js deleted file mode 100644 index 3a33821761..0000000000 --- a/wallet/lib/algosdk.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"==typeof window?"undefined"==typeof global?"undefined"==typeof self?this:self:global:window,t.algosdk=e()}})(function(){var e=Number.isSafeInteger,t=Math.floor,r=Math.pow,o=String.fromCharCode,s=Math.min,l;return function(){function r(s,e,n){function o(l,i){if(!e[l]){if(!s[l]){var d="function"==typeof require&&require;if(!i&&d)return d(l,!0);if(t)return t(l,!0);var c=new Error("Cannot find module '"+l+"'");throw c.code="MODULE_NOT_FOUND",c}var a=e[l]={exports:{}};s[l][0].call(a.exports,function(e){var t=s[l][1][e];return o(t||e)},a,a.exports,r,s,e,n)}return e[l].exports}for(var t="function"==typeof require&&require,a=0;a>16,s[l++]=255&p>>8,s[l++]=255&p;return 2===o&&(p=a[e.charCodeAt(d)]<<2|a[e.charCodeAt(d+1)]>>4,s[l++]=255&p),1===o&&(p=a[e.charCodeAt(d)]<<10|a[e.charCodeAt(d+1)]<<4|a[e.charCodeAt(d+2)]>>2,s[l++]=255&p>>8,s[l++]=255&p),s}function tripletToBase64(e){return o[63&e>>18]+o[63&e>>12]+o[63&e>>6]+o[63&e]}function encodeChunk(e,t,r){for(var o=[],a=t,n;al?l:s+n));return 1===r?(c=e[t-1],a.push(o[c>>2]+o[63&c<<4]+"==")):2===r&&(c=(e[t-2]<<8)+e[t-1],a.push(o[c>>10]+o[63&c>>4]+o[63&c<<2]+"=")),a.join("")}r.byteLength=function(e){var t=getLens(e),r=t[0],o=t[1];return 3*(r+o)/4-o},r.toByteArray=toByteArray,r.fromByteArray=fromByteArray;for(var o=[],a=[],n="undefined"==typeof Uint8Array?Array:Uint8Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l=0,c=s.length;le)throw new RangeError("The value \""+e+"\" is invalid for option \"size\"")}function alloc(e,t,r){return assertSize(e),0>=e?createBuffer(e):void 0===t?createBuffer(e):"string"==typeof r?createBuffer(e).fill(t,r):createBuffer(e).fill(t)}function allocUnsafe(e){return assertSize(e),createBuffer(0>e?0:0|checked(e))}function fromString(e,t){if(("string"!=typeof t||""===t)&&(t="utf8"),!Buffer.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var r=0|byteLength(e,t),o=createBuffer(r),a=o.write(e,t);return a!==r&&(o=o.slice(0,a)),o}function fromArrayLike(e){for(var t=0>e.length?0:0|checked(e.length),r=createBuffer(t),o=0;ot||e.byteLength=2147483647)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+2147483647 .toString(16)+" bytes");return 0|e}function byteLength(e,t){if(Buffer.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||isInstance(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError("The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type "+typeof e);var r=e.length,o=2>>1;case"base64":return base64ToBytes(e).length;default:if(a)return o?-1:utf8ToBytes(e).length;t=(""+t).toLowerCase(),a=!0;}}function slowToString(e,t,r){var o=!1;if((void 0===t||0>t)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),0>=r)return"";if(r>>>=0,t>>>=0,r<=t)return"";for(e||(e="utf8");;)switch(e){case"hex":return hexSlice(this,t,r);case"utf8":case"utf-8":return utf8Slice(this,t,r);case"ascii":return asciiSlice(this,t,r);case"latin1":case"binary":return latin1Slice(this,t,r);case"base64":return base64Slice(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,t,r);default:if(o)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),o=!0;}}function swap(e,t,r){var o=e[t];e[t]=e[r],e[r]=o}function bidirectionalIndexOf(e,t,r,o,a){if(0===e.length)return-1;if("string"==typeof r?(o=r,r=0):2147483647r&&(r=-2147483648),r=+r,numberIsNaN(r)&&(r=a?0:e.length-1),0>r&&(r=e.length+r),r>=e.length){if(a)return-1;r=e.length-1}else if(0>r)if(a)r=0;else return-1;if("string"==typeof t&&(t=Buffer.from(t,o)),Buffer.isBuffer(t))return 0===t.length?-1:arrayIndexOf(e,t,r,o,a);if("number"==typeof t)return t&=255,"function"==typeof Uint8Array.prototype.indexOf?a?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):arrayIndexOf(e,[t],r,o,a);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(e,t,r,o,a){function read(e,t){return 1===n?e[t]:e.readUInt16BE(t*n)}var n=1,s=e.length,l=t.length;if(void 0!==o&&(o=(o+"").toLowerCase(),"ucs2"===o||"ucs-2"===o||"utf16le"===o||"utf-16le"===o)){if(2>e.length||2>t.length)return-1;n=2,s/=2,l/=2,r/=2}var c;if(a){var d=-1;for(c=r;cs&&(r=s-l),c=r;0<=c;c--){for(var p=!0,u=0;ua&&(o=a)):o=a;var n=t.length;o>n/2&&(o=n/2);for(var s=0,l;sn&&(l=n):2===c?(d=e[a+1],128==(192&d)&&(h=(31&n)<<6|63&d,127h||57343h&&(l=h))):void 0}null===l?(l=65533,c=1):65535>>10),l=56320|1023&l),o.push(l),a+=c}return decodeCodePointsArray(o)}function decodeCodePointsArray(e){var t=e.length;if(t<=4096)return o.apply(String,e);for(var r="",a=0;at)&&(t=0),(!r||0>r||r>o)&&(r=o);for(var a="",n=t;ne)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function checkInt(e,t,r,o,a,n){if(!Buffer.isBuffer(e))throw new TypeError("\"buffer\" argument must be a Buffer instance");if(t>a||te.length)throw new RangeError("Index out of range")}function checkIEEE754(e,t,r,o,a,n){if(r+o>e.length)throw new RangeError("Index out of range");if(0>r)throw new RangeError("Index out of range")}function writeFloat(e,t,r,o,a){return t=+t,r>>>=0,a||checkIEEE754(e,t,r,4,34028234663852886e22,-34028234663852886e22),i.write(e,t,r,o,23,4),r+4}function writeDouble(e,t,r,o,a){return t=+t,r>>>=0,a||checkIEEE754(e,t,r,8,17976931348623157e292,-17976931348623157e292),i.write(e,t,r,o,52,8),r+8}function base64clean(e){if(e=e.split("=")[0],e=e.trim().replace(l,""),2>e.length)return"";for(;0!=e.length%4;)e+="=";return e}function toHex(e){return 16>e?"0"+e.toString(16):e.toString(16)}function utf8ToBytes(e,t){t=t||1/0;for(var r=e.length,o=null,a=[],n=0,s;ns){if(!o){if(56319s){-1<(t-=3)&&a.push(239,191,189),o=s;continue}s=(o-55296<<10|s-56320)+65536}else o&&-1<(t-=3)&&a.push(239,191,189);if(o=null,128>s){if(0>(t-=1))break;a.push(s)}else if(2048>s){if(0>(t-=2))break;a.push(192|s>>6,128|63&s)}else if(65536>s){if(0>(t-=3))break;a.push(224|s>>12,128|63&s>>6,128|63&s)}else if(1114112>s){if(0>(t-=4))break;a.push(240|s>>18,128|63&s>>12,128|63&s>>6,128|63&s)}else throw new Error("Invalid code point")}return a}function asciiToBytes(e){for(var t=[],r=0;r(t-=2));++o)a=e.charCodeAt(o),n=a>>8,s=a%256,r.push(s),r.push(n);return r}function base64ToBytes(e){return n.toByteArray(base64clean(e))}function blitBuffer(e,t,r,o){for(var a=0;a=t.length||a>=e.length);++a)t[a+r]=e[a];return a}function isInstance(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function numberIsNaN(e){return e!==e}var n=e("base64-js"),i=e("ieee754");a.Buffer=Buffer,a.SlowBuffer=function(e){return+e!=e&&(e=0),Buffer.alloc(+e)},a.INSPECT_MAX_BYTES=50;a.kMaxLength=2147483647,Buffer.TYPED_ARRAY_SUPPORT=function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()}catch(t){return!1}}(),Buffer.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(Buffer.prototype,"parent",{enumerable:!0,get:function(){return Buffer.isBuffer(this)?this.buffer:void 0}}),Object.defineProperty(Buffer.prototype,"offset",{enumerable:!0,get:function(){return Buffer.isBuffer(this)?this.byteOffset:void 0}}),"undefined"!=typeof Symbol&&null!=Symbol.species&&Buffer[Symbol.species]===Buffer&&Object.defineProperty(Buffer,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),Buffer.poolSize=8192,Buffer.from=function(e,t,r){return from(e,t,r)},Buffer.prototype.__proto__=Uint8Array.prototype,Buffer.__proto__=Uint8Array,Buffer.alloc=function(e,t,r){return alloc(e,t,r)},Buffer.allocUnsafe=function(e){return allocUnsafe(e)},Buffer.allocUnsafeSlow=function(e){return allocUnsafe(e)},Buffer.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==Buffer.prototype},Buffer.compare=function(e,t){if(isInstance(e,Uint8Array)&&(e=Buffer.from(e,e.offset,e.byteLength)),isInstance(t,Uint8Array)&&(t=Buffer.from(t,t.offset,t.byteLength)),!Buffer.isBuffer(e)||!Buffer.isBuffer(t))throw new TypeError("The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array");if(e===t)return 0;for(var r=e.length,o=t.length,n=0,l=s(r,o);nt&&(e+=" ... "),""},Buffer.prototype.compare=function(e,t,r,o,a){if(isInstance(e,Uint8Array)&&(e=Buffer.from(e,e.offset,e.byteLength)),!Buffer.isBuffer(e))throw new TypeError("The \"target\" argument must be one of type Buffer or Uint8Array. Received type "+typeof e);if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===o&&(o=0),void 0===a&&(a=this.length),0>t||r>e.length||0>o||a>this.length)throw new RangeError("out of range index");if(o>=a&&t>=r)return 0;if(o>=a)return-1;if(t>=r)return 1;if(t>>>=0,r>>>=0,o>>>=0,a>>>=0,this===e)return 0;for(var n=a-o,l=r-t,c=s(n,l),d=this.slice(o,a),p=e.slice(t,r),u=0;u>>=0,isFinite(r)?(r>>>=0,void 0===o&&(o="utf8")):(o=r,r=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");var a=this.length-t;if((void 0===r||r>a)&&(r=a),0r||0>t)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");o||(o="utf8");for(var n=!1;;)switch(o){case"hex":return hexWrite(this,e,t,r);case"utf8":case"utf-8":return utf8Write(this,e,t,r);case"ascii":return asciiWrite(this,e,t,r);case"latin1":case"binary":return latin1Write(this,e,t,r);case"base64":return base64Write(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,e,t,r);default:if(n)throw new TypeError("Unknown encoding: "+o);o=(""+o).toLowerCase(),n=!0;}},Buffer.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};Buffer.prototype.slice=function(e,t){var r=this.length;e=~~e,t=void 0===t?r:~~t,0>e?(e+=r,0>e&&(e=0)):e>r&&(e=r),0>t?(t+=r,0>t&&(t=0)):t>r&&(t=r),t>>=0,t>>>=0,r||checkOffset(e,t,this.length);for(var o=this[e],a=1,n=0;++n>>=0,t>>>=0,r||checkOffset(e,t,this.length);for(var o=this[e+--t],a=1;0>>=0,t||checkOffset(e,1,this.length),this[e]},Buffer.prototype.readUInt16LE=function(e,t){return e>>>=0,t||checkOffset(e,2,this.length),this[e]|this[e+1]<<8},Buffer.prototype.readUInt16BE=function(e,t){return e>>>=0,t||checkOffset(e,2,this.length),this[e]<<8|this[e+1]},Buffer.prototype.readUInt32LE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},Buffer.prototype.readUInt32BE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},Buffer.prototype.readIntLE=function(e,t,o){e>>>=0,t>>>=0,o||checkOffset(e,t,this.length);for(var a=this[e],n=1,s=0;++s=n&&(a-=r(2,8*t)),a},Buffer.prototype.readIntBE=function(e,t,o){e>>>=0,t>>>=0,o||checkOffset(e,t,this.length);for(var a=t,n=1,s=this[e+--a];0=n&&(s-=r(2,8*t)),s},Buffer.prototype.readInt8=function(e,t){return e>>>=0,t||checkOffset(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},Buffer.prototype.readInt16LE=function(e,t){e>>>=0,t||checkOffset(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt16BE=function(e,t){e>>>=0,t||checkOffset(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},Buffer.prototype.readInt32LE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},Buffer.prototype.readInt32BE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},Buffer.prototype.readFloatLE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),i.read(this,e,!0,23,4)},Buffer.prototype.readFloatBE=function(e,t){return e>>>=0,t||checkOffset(e,4,this.length),i.read(this,e,!1,23,4)},Buffer.prototype.readDoubleLE=function(e,t){return e>>>=0,t||checkOffset(e,8,this.length),i.read(this,e,!0,52,8)},Buffer.prototype.readDoubleBE=function(e,t){return e>>>=0,t||checkOffset(e,8,this.length),i.read(this,e,!1,52,8)},Buffer.prototype.writeUIntLE=function(e,t,o,a){if(e=+e,t>>>=0,o>>>=0,!a){var n=r(2,8*o)-1;checkInt(this,e,t,o,n,0)}var s=1,l=0;for(this[t]=255&e;++l>>=0,o>>>=0,!a){var n=r(2,8*o)-1;checkInt(this,e,t,o,n,0)}var s=o-1,l=1;for(this[t+s]=255&e;0<=--s&&(l*=256);)this[t+s]=255&e/l;return t+o},Buffer.prototype.writeUInt8=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,1,255,0),this[t]=255&e,t+1},Buffer.prototype.writeUInt16LE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},Buffer.prototype.writeUInt16BE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},Buffer.prototype.writeUInt32LE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},Buffer.prototype.writeUInt32BE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},Buffer.prototype.writeIntLE=function(e,t,o,a){if(e=+e,t>>>=0,!a){var n=r(2,8*o-1);checkInt(this,e,t,o,n-1,-n)}var s=0,l=1,c=0;for(this[t]=255&e;++se&&0===c&&0!==this[t+s-1]&&(c=1),this[t+s]=255&(e/l>>0)-c;return t+o},Buffer.prototype.writeIntBE=function(e,t,o,a){if(e=+e,t>>>=0,!a){var n=r(2,8*o-1);checkInt(this,e,t,o,n-1,-n)}var s=o-1,l=1,c=0;for(this[t+s]=255&e;0<=--s&&(l*=256);)0>e&&0===c&&0!==this[t+s+1]&&(c=1),this[t+s]=255&(e/l>>0)-c;return t+o},Buffer.prototype.writeInt8=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,1,127,-128),0>e&&(e=255+e+1),this[t]=255&e,t+1},Buffer.prototype.writeInt16LE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},Buffer.prototype.writeInt16BE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},Buffer.prototype.writeInt32LE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},Buffer.prototype.writeInt32BE=function(e,t,r){return e=+e,t>>>=0,r||checkInt(this,e,t,4,2147483647,-2147483648),0>e&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},Buffer.prototype.writeFloatLE=function(e,t,r){return writeFloat(this,e,t,!0,r)},Buffer.prototype.writeFloatBE=function(e,t,r){return writeFloat(this,e,t,!1,r)},Buffer.prototype.writeDoubleLE=function(e,t,r){return writeDouble(this,e,t,!0,r)},Buffer.prototype.writeDoubleBE=function(e,t,r){return writeDouble(this,e,t,!1,r)},Buffer.prototype.copy=function(e,t,r,o){if(!Buffer.isBuffer(e))throw new TypeError("argument should be a Buffer");if(r||(r=0),o||0===o||(o=this.length),t>=e.length&&(t=e.length),t||(t=0),0t)throw new RangeError("targetStart out of bounds");if(0>r||r>=this.length)throw new RangeError("Index out of range");if(0>o)throw new RangeError("sourceEnd out of bounds");o>this.length&&(o=this.length),e.length-ta||"latin1"===o)&&(e=a)}}else"number"==typeof e&&(e&=255);if(0>t||this.length>>=0,r=r===void 0?this.length:r>>>0,e||(e=0);var n;if("number"==typeof e)for(n=t;n=s){t+=o(s);continue}else 191=s?(l=31&s,n=1):239>=s?(l=15&s,n=2):247>=s?(l=7&s,n=3):u(a,t);for(var d=0;ds||191=l&&u(a,t),1114111=l?t+=o(l):(l-=65536,t+=o((l>>10)+55296),t+=o((1023&l)+56320))}return t},f=function(e){if(!/^[A-Z2-7=]+$/.test(e))throw new Error("Invalid base32 characters");e=e.replace(/=/g,"");for(var t=[],r=0,o=e.length,a=0,n=o>>3<<3,s,l,c,p,u,h,f,y;a>>2),t[r++]=255&(l<<6|c<<1|p>>>4),t[r++]=255&(p<<4|u>>>1),t[r++]=255&(u<<7|h<<2|f>>>3),t[r++]=255&(f<<5|y);var b=o-n;return 2==b?(s=d[e.charAt(a++)],l=d[e.charAt(a++)],t[r++]=255&(s<<3|l>>>2)):4==b?(s=d[e.charAt(a++)],l=d[e.charAt(a++)],c=d[e.charAt(a++)],p=d[e.charAt(a++)],t[r++]=255&(s<<3|l>>>2),t[r++]=255&(l<<6|c<<1|p>>>4)):5==b?(s=d[e.charAt(a++)],l=d[e.charAt(a++)],c=d[e.charAt(a++)],p=d[e.charAt(a++)],u=d[e.charAt(a++)],t[r++]=255&(s<<3|l>>>2),t[r++]=255&(l<<6|c<<1|p>>>4),t[r++]=255&(p<<4|u>>>1)):7==b&&(s=d[e.charAt(a++)],l=d[e.charAt(a++)],c=d[e.charAt(a++)],p=d[e.charAt(a++)],u=d[e.charAt(a++)],h=d[e.charAt(a++)],f=d[e.charAt(a++)],t[r++]=255&(s<<3|l>>>2),t[r++]=255&(l<<6|c<<1|p>>>4),t[r++]=255&(p<<4|u>>>1),t[r++]=255&(u<<7|h<<2|f>>>3)),t},y=function(e){for(var t="",r=e.length,o=0,a=5*parseInt(r/5),n,s,l,d,p;o>>3]+c[31&(n<<2|s>>>6)]+c[31&s>>>1]+c[31&(s<<4|l>>>4)]+c[31&(l<<1|d>>>7)]+c[31&d>>>2]+c[31&(d<<3|p>>>5)]+c[31&p];var u=r-a;return 1==u?(n=e.charCodeAt(o),t+=c[n>>>3]+c[31&n<<2]+"======"):2==u?(n=e.charCodeAt(o++),s=e.charCodeAt(o),t+=c[n>>>3]+c[31&(n<<2|s>>>6)]+c[31&s>>>1]+c[31&s<<4]+"===="):3==u?(n=e.charCodeAt(o++),s=e.charCodeAt(o++),l=e.charCodeAt(o),t+=c[n>>>3]+c[31&(n<<2|s>>>6)]+c[31&s>>>1]+c[31&(s<<4|l>>>4)]+c[31&l<<1]+"==="):4==u&&(n=e.charCodeAt(o++),s=e.charCodeAt(o++),l=e.charCodeAt(o++),d=e.charCodeAt(o),t+=c[n>>>3]+c[31&(n<<2|s>>>6)]+c[31&s>>>1]+c[31&(s<<4|l>>>4)]+c[31&(l<<1|d>>>7)]+c[31&d>>>2]+c[31&d<<3]+"="),t},b=function(e){var t=!1,r="",o=0,a=0,n=0,s=e.length,l,d,u,h,f,y,b;do{for(p[0]=p[5],p[1]=p[6],p[2]=p[7],b=a;ob;++o)y=e.charCodeAt(o),128>y?p[b++]=y:2048>y?(p[b++]=192|y>>6,p[b++]=128|63&y):55296>y||57344<=y?(p[b++]=224|y>>12,p[b++]=128|63&y>>6,p[b++]=128|63&y):(y=65536+((1023&y)<<10|1023&e.charCodeAt(++o)),p[b++]=240|y>>18,p[b++]=128|63&y>>12,p[b++]=128|63&y>>6,p[b++]=128|63&y);n+=b-a,a=b-5,o===s&&++o,o>s&&6>b&&(t=!0),l=p[0],4>>3]+c[31&(l<<2|d>>>6)]+c[31&d>>>1]+c[31&(d<<4|u>>>4)]+c[31&(u<<1|h>>>7)]+c[31&h>>>2]+c[31&(h<<3|f>>>5)]+c[31&f]):1===b?r+=c[l>>>3]+c[31&l<<2]+"======":2===b?(d=p[1],r+=c[l>>>3]+c[31&(l<<2|d>>>6)]+c[31&d>>>1]+c[31&d<<4]+"===="):3===b?(d=p[1],u=p[2],r+=c[l>>>3]+c[31&(l<<2|d>>>6)]+c[31&d>>>1]+c[31&(d<<4|u>>>4)]+c[31&u<<1]+"==="):(d=p[1],u=p[2],h=p[3],r+=c[l>>>3]+c[31&(l<<2|d>>>6)]+c[31&d>>>1]+c[31&(d<<4|u>>>4)]+c[31&(u<<1|h>>>7)]+c[31&h>>>2]+c[31&h<<3]+"=")}while(!t);return r},g=function(e){for(var t="",r=e.length,o=0,a=5*parseInt(r/5),n,s,l,d,p;o>>3]+c[31&(n<<2|s>>>6)]+c[31&s>>>1]+c[31&(s<<4|l>>>4)]+c[31&(l<<1|d>>>7)]+c[31&d>>>2]+c[31&(d<<3|p>>>5)]+c[31&p];var u=r-a;return 1==u?(n=e[o],t+=c[n>>>3]+c[31&n<<2]+"======"):2==u?(n=e[o++],s=e[o],t+=c[n>>>3]+c[31&(n<<2|s>>>6)]+c[31&s>>>1]+c[31&s<<4]+"===="):3==u?(n=e[o++],s=e[o++],l=e[o],t+=c[n>>>3]+c[31&(n<<2|s>>>6)]+c[31&s>>>1]+c[31&(s<<4|l>>>4)]+c[31&l<<1]+"==="):4==u&&(n=e[o++],s=e[o++],l=e[o++],d=e[o],t+=c[n>>>3]+c[31&(n<<2|s>>>6)]+c[31&s>>>1]+c[31&(s<<4|l>>>4)]+c[31&(l<<1|d>>>7)]+c[31&d>>>2]+c[31&d<<3]+"="),t},m=function(e,t){if(!t)return h(f(e));if(!/^[A-Z2-7=]+$/.test(e))throw new Error("Invalid base32 characters");var r="",a=e.indexOf("="),n,s,l,c,p,u,y,b;-1===a&&(a=e.length);for(var g=0,m=a>>3<<3;g>>2))+o(255&(s<<6|l<<1|c>>>4))+o(255&(c<<4|p>>>1))+o(255&(p<<7|u<<2|y>>>3))+o(255&(y<<5|b));var _=a-m;return 2==_?(n=d[e.charAt(g++)],s=d[e.charAt(g++)],r+=o(255&(n<<3|s>>>2))):4==_?(n=d[e.charAt(g++)],s=d[e.charAt(g++)],l=d[e.charAt(g++)],c=d[e.charAt(g++)],r+=o(255&(n<<3|s>>>2))+o(255&(s<<6|l<<1|c>>>4))):5==_?(n=d[e.charAt(g++)],s=d[e.charAt(g++)],l=d[e.charAt(g++)],c=d[e.charAt(g++)],p=d[e.charAt(g++)],r+=o(255&(n<<3|s>>>2))+o(255&(s<<6|l<<1|c>>>4))+o(255&(c<<4|p>>>1))):7==_&&(n=d[e.charAt(g++)],s=d[e.charAt(g++)],l=d[e.charAt(g++)],c=d[e.charAt(g++)],p=d[e.charAt(g++)],u=d[e.charAt(g++)],y=d[e.charAt(g++)],r+=o(255&(n<<3|s>>>2))+o(255&(s<<6|l<<1|c>>>4))+o(255&(c<<4|p>>>1))+o(255&(p<<7|u<<2|y>>>3))),r},_={encode:function(e,t){var r="string"!=typeof e;return r&&e.constructor===ArrayBuffer&&(e=new Uint8Array(e)),r?g(e):t?y(e):b(e)},decode:m};m.asBytes=f,i?t.exports=_:(a.base32=_,s&&l(function(){return _}))})()}).call(this,e("_process"),"undefined"==typeof global?"undefined"==typeof self?"undefined"==typeof window?{}:window:self:global)},{_process:39}],7:[function(e,o,a){a.read=function(t,o,a,n,l){var c=8*l-n-1,p=(1<>1,h=-7,f=a?l-1:0,y=a?-1:1,d=t[o+f],b,g;for(f+=y,b=d&(1<<-h)-1,d>>=-h,h+=c;0>=-h,h+=n;0>1,k=23===p?r(2,-24)-r(2,-77):0,w=l?0:u-1,x=l?1:-1,d=0>a||0===a&&0>1/a?1:0,s,v,E;for(a=y(a),isNaN(a)||a===1/0?(v=isNaN(a)?1:0,s=g):(s=t(f(a)/h),1>a*(E=r(2,-s))&&(s--,E*=2),a+=1<=s+_?k/E:k*r(2,1-_),2<=a*E&&(s++,E/=2),s+_>=g?(v=0,s=g):1<=s+_?(v=(a*E-1)*r(2,p),s+=_):(v=a*r(2,_-1)*r(2,p),s=0));8<=p;o[n+w]=255&v,w+=x,v/=256,p-=8);for(s=s<o?g(t,r,o):fromArray(t,r,d,0))}function fromString(e,r,o,a){var s=0,l=o.length,c=0,d=0;"-"===o[0]&&s++;for(var p=s,u;s>=8,e[t+f]=255&r,r>>=8,e[t+h]=255&r,r>>=8,e[t+p]=255&r}function readInt32(e,t){return 16777216*e[t+p]+(e[t+h]<<16)+(e[t+f]<<8)+e[t+y]}var n=r?0:4,i=r?4:0,p=r?0:3,h=r?1:2,f=r?2:1,y=r?3:0,b=r?fromPositiveBE:fromPositiveLE,g=r?fromNegativeBE:fromNegativeLE,m=Int64.prototype,_="is"+e,k="_"+_;return m.buffer=void 0,m.offset=0,m[k]=!0,m.toNumber=toNumber,m.toString=function(e){var r=this.buffer,o=this.offset,s=readInt32(r,o+n),l=readInt32(r,o+i),c="",d=!a&&2147483648&s;for(d&&(s=~s,l=4294967296-l),e=e||10;;){var p=4294967296*(s%e)+l;if(s=t(s/e),l=t(p/e),c=(p%e).toString(e)+c,!s&&!l)break}return d&&(c="-"+c),c},m.toJSON=toNumber,m.toArray=toArray,s&&(m.toBuffer=toBuffer),l&&(m.toArrayBuffer=toArrayBuffer),Int64[_]=function(e){return!!(e&&e[k])},o[e]=Int64,Int64}function toArray(e){var t=this.buffer,r=this.offset;return u=null,!1!==e&&0===r&&8===t.length&&p(t)?t:newArray(t,r)}function toBuffer(t){var r=this.buffer,o=this.offset;if(u=s,!1!==t&&0===o&&8===r.length&&e.isBuffer(r))return r;var a=new s(8);return fromArray(a,0,r,o),a}function toArrayBuffer(e){var t=this.buffer,r=this.offset,o=t.buffer;if(u=l,!1!==e&&0===r&&o instanceof c&&8===o.byteLength)return o;var a=new l(8);return fromArray(a,0,t,r),a.buffer}function isValidBuffer(e,t){var r=e&&e.length;return t|=0,r&&t+8<=r&&"string"!=typeof e[t]}function fromArray(e,t,r,o){t|=0,o|=0;for(var a=0;8>a;a++)e[t++]=255&r[o++]}function newArray(e,t){return Array.prototype.slice.call(e,t,t+8)}function fromPositiveBE(e,t,r){for(var o=t+8;o>t;)e[--o]=255&r,r/=256}function fromNegativeBE(e,t,r){var o=t+8;for(r++;o>t;)e[--o]=255^255&-r,r/=256}function fromPositiveLE(e,t,r){for(var o=t+8;tp?s[l++]=p:2048>p?(s[l++]=192|p>>6,s[l++]=128|63&p):55296>p||57344<=p?(s[l++]=224|p>>12,s[l++]=128|63&p>>6,s[l++]=128|63&p):(p=65536+((1023&p)<<10|1023&e.charCodeAt(++c)),s[l++]=240|p>>18,s[l++]=128|63&p>>12,s[l++]=128|63&p>>6,s[l++]=128|63&p);e=s}128c;++c)f=e[c]||0,u[c]=92^f,h[c]=54^f;Sha512.call(this,t,r),this.update(h),this.oKeyPad=u,this.inner=!0,this.sharedMemory=r}var o="object"==typeof window,a=o?window:{};a.JS_SHA512_NO_WINDOW&&(o=!1);var n=!o&&"object"==typeof self,i=!a.JS_SHA512_NO_NODE_JS&&"object"==typeof e&&e.versions&&e.versions.node;i?a=r:n&&(a=self);var s=!a.JS_SHA512_NO_COMMON_JS&&"object"==typeof t&&t.exports,c="function"==typeof l&&l.amd,d=!a.JS_SHA512_NO_ARRAY_BUFFER&&"undefined"!=typeof ArrayBuffer,p=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"],u=[-2147483648,8388608,32768,128],h=[24,16,8,0],f=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],y=["hex","array","digest","arrayBuffer"],b=[];(a.JS_SHA512_NO_NODE_JS||!Array.isArray)&&(Array.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)}),d&&(a.JS_SHA512_NO_ARRAY_BUFFER_IS_VIEW||!ArrayBuffer.isView)&&(ArrayBuffer.isView=function(e){return"object"==typeof e&&e.buffer&&e.buffer.constructor===ArrayBuffer});var g=function(e,t){return function(r){return new Sha512(t,!0).update(r)[e]()}},m=function(e){var t=g("hex",e);t.create=function(){return new Sha512(e)},t.update=function(e){return t.create().update(e)};for(var r=0,o;rl;++o)n[l>>2]|=e[o]<l;++o)s=e.charCodeAt(o),128>s?n[l>>2]|=s<s?(n[l>>2]|=(192|s>>6)<>2]|=(128|63&s)<s||57344<=s?(n[l>>2]|=(224|s>>12)<>2]|=(128|63&s>>6)<>2]|=(128|63&s)<>2]|=(240|s>>18)<>2]|=(128|63&s>>12)<>2]|=(128|63&s>>6)<>2]|=(128|63&s)<>2]|=u[3&t],this.block=e[32],112<=t&&(!this.hashed&&this.hash(),e[0]=this.block,e[1]=e[2]=e[3]=e[4]=e[5]=e[6]=e[7]=e[8]=e[9]=e[10]=e[11]=e[12]=e[13]=e[14]=e[15]=e[16]=e[17]=e[18]=e[19]=e[20]=e[21]=e[22]=e[23]=e[24]=e[25]=e[26]=e[27]=e[28]=e[29]=e[30]=e[31]=e[32]=0),e[30]=this.hBytes<<3|this.bytes>>>29,e[31]=this.bytes<<3,this.hash()}},Sha512.prototype.hash=function(){var e=this.h0h,t=this.h0l,r=this.h1h,o=this.h1l,a=this.h2h,n=this.h2l,i=this.h3h,s=this.h3l,l=this.h4h,c=this.h4l,d=this.h5h,p=this.h5l,u=this.h6h,h=this.h6l,y=this.h7h,b=this.h7l,g=this.blocks,m,_,k,w,x,v,E,A,B,T,S,U,P,R,I,L,C,O,D,z,N,K,H,q,Y;for(m=32;160>m;m+=2)z=g[m-30],N=g[m-29],_=(z>>>1|N<<31)^(z>>>8|N<<24)^z>>>7,k=(N>>>1|z<<31)^(N>>>8|z<<24)^(N>>>7|z<<25),z=g[m-4],N=g[m-3],w=(z>>>19|N<<13)^(N>>>29|z<<3)^z>>>6,x=(N>>>19|z<<13)^(z>>>29|N<<3)^(N>>>6|z<<26),z=g[m-32],N=g[m-31],K=g[m-14],H=g[m-13],v=(65535&H)+(65535&N)+(65535&k)+(65535&x),E=(H>>>16)+(N>>>16)+(k>>>16)+(x>>>16)+(v>>>16),A=(65535&K)+(65535&z)+(65535&_)+(65535&w)+(E>>>16),B=(K>>>16)+(z>>>16)+(_>>>16)+(w>>>16)+(A>>>16),g[m]=B<<16|65535&A,g[m+1]=E<<16|65535&v;var M=e,F=t,W=r,G=o,V=a,X=n,J=i,Q=s,Z=l,$=c,ee=d,te=p,re=u,oe=h,ae=y,ne=b;for(L=W&V,C=G&X,m=0;160>m;m+=8)_=(M>>>28|F<<4)^(F>>>2|M<<30)^(F>>>7|M<<25),k=(F>>>28|M<<4)^(M>>>2|F<<30)^(M>>>7|F<<25),w=(Z>>>14|$<<18)^(Z>>>18|$<<14)^($>>>9|Z<<23),x=($>>>14|Z<<18)^($>>>18|Z<<14)^(Z>>>9|$<<23),T=M&W,S=F&G,O=T^M&V^L,D=S^F&X^C,q=Z&ee^~Z&re,Y=$&te^~$&oe,z=g[m],N=g[m+1],K=f[m],H=f[m+1],v=(65535&H)+(65535&N)+(65535&Y)+(65535&x)+(65535&ne),E=(H>>>16)+(N>>>16)+(Y>>>16)+(x>>>16)+(ne>>>16)+(v>>>16),A=(65535&K)+(65535&z)+(65535&q)+(65535&w)+(65535&ae)+(E>>>16),B=(K>>>16)+(z>>>16)+(q>>>16)+(w>>>16)+(ae>>>16)+(A>>>16),z=B<<16|65535&A,N=E<<16|65535&v,v=(65535&D)+(65535&k),E=(D>>>16)+(k>>>16)+(v>>>16),A=(65535&O)+(65535&_)+(E>>>16),B=(O>>>16)+(_>>>16)+(A>>>16),K=B<<16|65535&A,H=E<<16|65535&v,v=(65535&Q)+(65535&N),E=(Q>>>16)+(N>>>16)+(v>>>16),A=(65535&J)+(65535&z)+(E>>>16),B=(J>>>16)+(z>>>16)+(A>>>16),ae=B<<16|65535&A,ne=E<<16|65535&v,v=(65535&H)+(65535&N),E=(H>>>16)+(N>>>16)+(v>>>16),A=(65535&K)+(65535&z)+(E>>>16),B=(K>>>16)+(z>>>16)+(A>>>16),J=B<<16|65535&A,Q=E<<16|65535&v,_=(J>>>28|Q<<4)^(Q>>>2|J<<30)^(Q>>>7|J<<25),k=(Q>>>28|J<<4)^(J>>>2|Q<<30)^(J>>>7|Q<<25),w=(ae>>>14|ne<<18)^(ae>>>18|ne<<14)^(ne>>>9|ae<<23),x=(ne>>>14|ae<<18)^(ne>>>18|ae<<14)^(ae>>>9|ne<<23),U=J&M,P=Q&F,O=U^J&W^T,D=P^Q&G^S,q=ae&Z^~ae&ee,Y=ne&$^~ne&te,z=g[m+2],N=g[m+3],K=f[m+2],H=f[m+3],v=(65535&H)+(65535&N)+(65535&Y)+(65535&x)+(65535&oe),E=(H>>>16)+(N>>>16)+(Y>>>16)+(x>>>16)+(oe>>>16)+(v>>>16),A=(65535&K)+(65535&z)+(65535&q)+(65535&w)+(65535&re)+(E>>>16),B=(K>>>16)+(z>>>16)+(q>>>16)+(w>>>16)+(re>>>16)+(A>>>16),z=B<<16|65535&A,N=E<<16|65535&v,v=(65535&D)+(65535&k),E=(D>>>16)+(k>>>16)+(v>>>16),A=(65535&O)+(65535&_)+(E>>>16),B=(O>>>16)+(_>>>16)+(A>>>16),K=B<<16|65535&A,H=E<<16|65535&v,v=(65535&X)+(65535&N),E=(X>>>16)+(N>>>16)+(v>>>16),A=(65535&V)+(65535&z)+(E>>>16),B=(V>>>16)+(z>>>16)+(A>>>16),re=B<<16|65535&A,oe=E<<16|65535&v,v=(65535&H)+(65535&N),E=(H>>>16)+(N>>>16)+(v>>>16),A=(65535&K)+(65535&z)+(E>>>16),B=(K>>>16)+(z>>>16)+(A>>>16),V=B<<16|65535&A,X=E<<16|65535&v,_=(V>>>28|X<<4)^(X>>>2|V<<30)^(X>>>7|V<<25),k=(X>>>28|V<<4)^(V>>>2|X<<30)^(V>>>7|X<<25),w=(re>>>14|oe<<18)^(re>>>18|oe<<14)^(oe>>>9|re<<23),x=(oe>>>14|re<<18)^(oe>>>18|re<<14)^(re>>>9|oe<<23),R=V&J,I=X&Q,O=R^V&M^U,D=I^X&F^P,q=re&ae^~re&Z,Y=oe&ne^~oe&$,z=g[m+4],N=g[m+5],K=f[m+4],H=f[m+5],v=(65535&H)+(65535&N)+(65535&Y)+(65535&x)+(65535&te),E=(H>>>16)+(N>>>16)+(Y>>>16)+(x>>>16)+(te>>>16)+(v>>>16),A=(65535&K)+(65535&z)+(65535&q)+(65535&w)+(65535&ee)+(E>>>16),B=(K>>>16)+(z>>>16)+(q>>>16)+(w>>>16)+(ee>>>16)+(A>>>16),z=B<<16|65535&A,N=E<<16|65535&v,v=(65535&D)+(65535&k),E=(D>>>16)+(k>>>16)+(v>>>16),A=(65535&O)+(65535&_)+(E>>>16),B=(O>>>16)+(_>>>16)+(A>>>16),K=B<<16|65535&A,H=E<<16|65535&v,v=(65535&G)+(65535&N),E=(G>>>16)+(N>>>16)+(v>>>16),A=(65535&W)+(65535&z)+(E>>>16),B=(W>>>16)+(z>>>16)+(A>>>16),ee=B<<16|65535&A,te=E<<16|65535&v,v=(65535&H)+(65535&N),E=(H>>>16)+(N>>>16)+(v>>>16),A=(65535&K)+(65535&z)+(E>>>16),B=(K>>>16)+(z>>>16)+(A>>>16),W=B<<16|65535&A,G=E<<16|65535&v,_=(W>>>28|G<<4)^(G>>>2|W<<30)^(G>>>7|W<<25),k=(G>>>28|W<<4)^(W>>>2|G<<30)^(W>>>7|G<<25),w=(ee>>>14|te<<18)^(ee>>>18|te<<14)^(te>>>9|ee<<23),x=(te>>>14|ee<<18)^(te>>>18|ee<<14)^(ee>>>9|te<<23),L=W&V,C=G&X,O=L^W&J^R,D=C^G&Q^I,q=ee&re^~ee&ae,Y=te&oe^~te&ne,z=g[m+6],N=g[m+7],K=f[m+6],H=f[m+7],v=(65535&H)+(65535&N)+(65535&Y)+(65535&x)+(65535&$),E=(H>>>16)+(N>>>16)+(Y>>>16)+(x>>>16)+($>>>16)+(v>>>16),A=(65535&K)+(65535&z)+(65535&q)+(65535&w)+(65535&Z)+(E>>>16),B=(K>>>16)+(z>>>16)+(q>>>16)+(w>>>16)+(Z>>>16)+(A>>>16),z=B<<16|65535&A,N=E<<16|65535&v,v=(65535&D)+(65535&k),E=(D>>>16)+(k>>>16)+(v>>>16),A=(65535&O)+(65535&_)+(E>>>16),B=(O>>>16)+(_>>>16)+(A>>>16),K=B<<16|65535&A,H=E<<16|65535&v,v=(65535&F)+(65535&N),E=(F>>>16)+(N>>>16)+(v>>>16),A=(65535&M)+(65535&z)+(E>>>16),B=(M>>>16)+(z>>>16)+(A>>>16),Z=B<<16|65535&A,$=E<<16|65535&v,v=(65535&H)+(65535&N),E=(H>>>16)+(N>>>16)+(v>>>16),A=(65535&K)+(65535&z)+(E>>>16),B=(K>>>16)+(z>>>16)+(A>>>16),M=B<<16|65535&A,F=E<<16|65535&v;v=(65535&t)+(65535&F),E=(t>>>16)+(F>>>16)+(v>>>16),A=(65535&e)+(65535&M)+(E>>>16),B=(e>>>16)+(M>>>16)+(A>>>16),this.h0h=B<<16|65535&A,this.h0l=E<<16|65535&v,v=(65535&o)+(65535&G),E=(o>>>16)+(G>>>16)+(v>>>16),A=(65535&r)+(65535&W)+(E>>>16),B=(r>>>16)+(W>>>16)+(A>>>16),this.h1h=B<<16|65535&A,this.h1l=E<<16|65535&v,v=(65535&n)+(65535&X),E=(n>>>16)+(X>>>16)+(v>>>16),A=(65535&a)+(65535&V)+(E>>>16),B=(a>>>16)+(V>>>16)+(A>>>16),this.h2h=B<<16|65535&A,this.h2l=E<<16|65535&v,v=(65535&s)+(65535&Q),E=(s>>>16)+(Q>>>16)+(v>>>16),A=(65535&i)+(65535&J)+(E>>>16),B=(i>>>16)+(J>>>16)+(A>>>16),this.h3h=B<<16|65535&A,this.h3l=E<<16|65535&v,v=(65535&c)+(65535&$),E=(c>>>16)+($>>>16)+(v>>>16),A=(65535&l)+(65535&Z)+(E>>>16),B=(l>>>16)+(Z>>>16)+(A>>>16),this.h4h=B<<16|65535&A,this.h4l=E<<16|65535&v,v=(65535&p)+(65535&te),E=(p>>>16)+(te>>>16)+(v>>>16),A=(65535&d)+(65535&ee)+(E>>>16),B=(d>>>16)+(ee>>>16)+(A>>>16),this.h5h=B<<16|65535&A,this.h5l=E<<16|65535&v,v=(65535&h)+(65535&oe),E=(h>>>16)+(oe>>>16)+(v>>>16),A=(65535&u)+(65535&re)+(E>>>16),B=(u>>>16)+(re>>>16)+(A>>>16),this.h6h=B<<16|65535&A,this.h6l=E<<16|65535&v,v=(65535&b)+(65535&ne),E=(b>>>16)+(ne>>>16)+(v>>>16),A=(65535&y)+(65535&ae)+(E>>>16),B=(y>>>16)+(ae>>>16)+(A>>>16),this.h7h=B<<16|65535&A,this.h7l=E<<16|65535&v},Sha512.prototype.hex=function(){this.finalize();var e=this.h0h,t=this.h0l,r=this.h1h,o=this.h1l,a=this.h2h,n=this.h2l,i=this.h3h,s=this.h3l,l=this.h4h,c=this.h4l,d=this.h5h,u=this.h5l,h=this.h6h,f=this.h6l,y=this.h7h,b=this.h7l,g=this.bits,m=p[15&e>>28]+p[15&e>>24]+p[15&e>>20]+p[15&e>>16]+p[15&e>>12]+p[15&e>>8]+p[15&e>>4]+p[15&e]+p[15&t>>28]+p[15&t>>24]+p[15&t>>20]+p[15&t>>16]+p[15&t>>12]+p[15&t>>8]+p[15&t>>4]+p[15&t]+p[15&r>>28]+p[15&r>>24]+p[15&r>>20]+p[15&r>>16]+p[15&r>>12]+p[15&r>>8]+p[15&r>>4]+p[15&r]+p[15&o>>28]+p[15&o>>24]+p[15&o>>20]+p[15&o>>16]+p[15&o>>12]+p[15&o>>8]+p[15&o>>4]+p[15&o]+p[15&a>>28]+p[15&a>>24]+p[15&a>>20]+p[15&a>>16]+p[15&a>>12]+p[15&a>>8]+p[15&a>>4]+p[15&a]+p[15&n>>28]+p[15&n>>24]+p[15&n>>20]+p[15&n>>16]+p[15&n>>12]+p[15&n>>8]+p[15&n>>4]+p[15&n]+p[15&i>>28]+p[15&i>>24]+p[15&i>>20]+p[15&i>>16]+p[15&i>>12]+p[15&i>>8]+p[15&i>>4]+p[15&i];return 256<=g&&(m+=p[15&s>>28]+p[15&s>>24]+p[15&s>>20]+p[15&s>>16]+p[15&s>>12]+p[15&s>>8]+p[15&s>>4]+p[15&s]),384<=g&&(m+=p[15&l>>28]+p[15&l>>24]+p[15&l>>20]+p[15&l>>16]+p[15&l>>12]+p[15&l>>8]+p[15&l>>4]+p[15&l]+p[15&c>>28]+p[15&c>>24]+p[15&c>>20]+p[15&c>>16]+p[15&c>>12]+p[15&c>>8]+p[15&c>>4]+p[15&c]+p[15&d>>28]+p[15&d>>24]+p[15&d>>20]+p[15&d>>16]+p[15&d>>12]+p[15&d>>8]+p[15&d>>4]+p[15&d]+p[15&u>>28]+p[15&u>>24]+p[15&u>>20]+p[15&u>>16]+p[15&u>>12]+p[15&u>>8]+p[15&u>>4]+p[15&u]),512==g&&(m+=p[15&h>>28]+p[15&h>>24]+p[15&h>>20]+p[15&h>>16]+p[15&h>>12]+p[15&h>>8]+p[15&h>>4]+p[15&h]+p[15&f>>28]+p[15&f>>24]+p[15&f>>20]+p[15&f>>16]+p[15&f>>12]+p[15&f>>8]+p[15&f>>4]+p[15&f]+p[15&y>>28]+p[15&y>>24]+p[15&y>>20]+p[15&y>>16]+p[15&y>>12]+p[15&y>>8]+p[15&y>>4]+p[15&y]+p[15&b>>28]+p[15&b>>24]+p[15&b>>20]+p[15&b>>16]+p[15&b>>12]+p[15&b>>8]+p[15&b>>4]+p[15&b]),m},Sha512.prototype.toString=Sha512.prototype.hex,Sha512.prototype.digest=function(){this.finalize();var e=this.h0h,t=this.h0l,r=this.h1h,o=this.h1l,a=this.h2h,n=this.h2l,i=this.h3h,s=this.h3l,l=this.h4h,c=this.h4l,d=this.h5h,p=this.h5l,u=this.h6h,h=this.h6l,f=this.h7h,y=this.h7l,b=this.bits,g=[255&e>>24,255&e>>16,255&e>>8,255&e,255&t>>24,255&t>>16,255&t>>8,255&t,255&r>>24,255&r>>16,255&r>>8,255&r,255&o>>24,255&o>>16,255&o>>8,255&o,255&a>>24,255&a>>16,255&a>>8,255&a,255&n>>24,255&n>>16,255&n>>8,255&n,255&i>>24,255&i>>16,255&i>>8,255&i];return 256<=b&&g.push(255&s>>24,255&s>>16,255&s>>8,255&s),384<=b&&g.push(255&l>>24,255&l>>16,255&l>>8,255&l,255&c>>24,255&c>>16,255&c>>8,255&c,255&d>>24,255&d>>16,255&d>>8,255&d,255&p>>24,255&p>>16,255&p>>8,255&p),512==b&&g.push(255&u>>24,255&u>>16,255&u>>8,255&u,255&h>>24,255&h>>16,255&h>>8,255&h,255&f>>24,255&f>>16,255&f>>8,255&f,255&y>>24,255&y>>16,255&y>>8,255&y),g},Sha512.prototype.array=Sha512.prototype.digest,Sha512.prototype.arrayBuffer=function(){this.finalize();var e=this.bits,t=new ArrayBuffer(e/8),r=new DataView(t);return r.setUint32(0,this.h0h),r.setUint32(4,this.h0l),r.setUint32(8,this.h1h),r.setUint32(12,this.h1l),r.setUint32(16,this.h2h),r.setUint32(20,this.h2l),r.setUint32(24,this.h3h),256<=e&&r.setUint32(28,this.h3l),384<=e&&(r.setUint32(32,this.h4h),r.setUint32(36,this.h4l),r.setUint32(40,this.h5h),r.setUint32(44,this.h5l)),512==e&&(r.setUint32(48,this.h6h),r.setUint32(52,this.h6l),r.setUint32(56,this.h7h),r.setUint32(60,this.h7l)),t},Sha512.prototype.clone=function(){var e=new Sha512(this.bits,!1);return this.copyTo(e),e},Sha512.prototype.copyTo=function(e){var t=0,r=["h0h","h0l","h1h","h1l","h2h","h2l","h3h","h3l","h4h","h4l","h5h","h5l","h6h","h6l","h7h","h7l","start","bytes","hBytes","finalized","hashed","lastByteIndex"];for(t=0;ts){i+=o(s);continue}192==(224&s)?s=(31&s)<<6|63&a[n++]:224==(240&s)?s=(15&s)<<12|(63&a[n++])<<6|63&a[n++]:240==(248&s)&&(s=(7&s)<<18|(63&a[n++])<<12|(63&a[n++])<<6|63&a[n++]),65536<=s?(s-=65536,i+=o((s>>>10)+55296,(1023&s)+56320)):i+=o(s)}return i},r.write=function(e,t){for(var r=this,o=t||(t|=0),a=e.length,n=0,s=0;sn?r[o++]=n:2048>n?(r[o++]=192|n>>>6,r[o++]=128|63&n):55296>n||57343>>12,r[o++]=128|63&n>>>6,r[o++]=128|63&n):(n=(n-55296<<10|e.charCodeAt(s++)-56320)+65536,r[o++]=240|n>>>18,r[o++]=128|63&n>>>12,r[o++]=128|63&n>>>6,r[o++]=128|63&n);return o-t}},{}],14:[function(e,t,r){function alloc(e){return Array(e)}function from(e){if(!o.isBuffer(e)&&o.isView(e))e=o.Uint8Array.from(e);else if(o.isArrayBuffer(e))e=new Uint8Array(e);else{if("string"==typeof e)return o.from.call(r,e);if("number"==typeof e)throw new TypeError("\"value\" argument must not be a number")}return Array.prototype.slice.call(e)}var o=e("./bufferish"),r=t.exports=alloc(0);r.alloc=alloc,r.concat=o.concat,r.from=from},{"./bufferish":18}],15:[function(e,t,r){function alloc(e){return new a(e)}function from(e){if(!o.isBuffer(e)&&o.isView(e))e=o.Uint8Array.from(e);else if(o.isArrayBuffer(e))e=new Uint8Array(e);else{if("string"==typeof e)return o.from.call(r,e);if("number"==typeof e)throw new TypeError("\"value\" argument must not be a number")}return a.from&&1!==a.from.length?a.from(e):new a(e)}var o=e("./bufferish"),a=o.global,r=t.exports=o.hasBuffer?alloc(0):[];r.alloc=o.hasBuffer&&a.alloc||alloc,r.concat=o.concat,r.from=from},{"./bufferish":18}],16:[function(e,t,r){function copy(e,t,r,n){var i=a.isBuffer(this),l=a.isBuffer(e);if(i&&l)return this.copy(e,t,r,n);if(!s&&!i&&!l&&a.isView(this)&&a.isView(e)){var c=r||null!=n?slice.call(this,r,n):this;return e.set(c,t),c.length}return o.copy.call(this,e,t,r,n)}function slice(e,t){var r=this.slice||!s&&this.subarray;if(r)return r.call(this,e,t);var o=a.alloc.call(this,t-e);return copy.call(this,o,0,e,t),o}var o=e("./buffer-lite");r.copy=copy,r.slice=slice,r.toString=function(e,t,r){var n=!i&&a.isBuffer(this)?this.toString:o.toString;return n.apply(this,arguments)},r.write=function(e){return function(){var t=this[e]||o[e];return t.apply(this,arguments)}}("write");var a=e("./bufferish"),n=a.global,i=a.hasBuffer&&"TYPED_ARRAY_SUPPORT"in n,s=i&&!n.TYPED_ARRAY_SUPPORT},{"./buffer-lite":13,"./bufferish":18}],17:[function(e,t,r){function alloc(e){return new Uint8Array(e)}function from(e){if(o.isView(e)){var t=e.byteOffset,a=e.byteLength;e=e.buffer,e.byteLength!==a&&(e.slice?e=e.slice(t,t+a):(e=new Uint8Array(e),e.byteLength!==a&&(e=Array.prototype.slice.call(e,t,t+a))))}else{if("string"==typeof e)return o.from.call(r,e);if("number"==typeof e)throw new TypeError("\"value\" argument must not be a number")}return new Uint8Array(e)}var o=e("./bufferish"),r=t.exports=o.hasArrayBuffer?alloc(0):[];r.alloc=alloc,r.concat=o.concat,r.from=from},{"./bufferish":18}],18:[function(e,t,r){function alloc(e){return auto(this).alloc(e)}function fromString(e){var t=3*e.length,r=alloc.call(this,t),o=u.write.call(r,e);return t!==o&&(r=u.slice.call(r,0,o)),r}function auto(e){return s(e)?d:l(e)?p:i(e)?c:a?d:n?p:c}function _false(){return!1}function _is(e,t){return e="[object "+e+"]",function(r){return null!=r&&{}.toString.call(t?r[t]:r)===e}}var o=r.global=e("./buffer-global"),a=r.hasBuffer=o&&!!o.isBuffer,n=r.hasArrayBuffer="undefined"!=typeof ArrayBuffer,i=r.isArray=e("isarray");r.isArrayBuffer=n?function(e){return e instanceof ArrayBuffer||h(e)}:_false;var s=r.isBuffer=a?o.isBuffer:_false,l=r.isView=n?ArrayBuffer.isView||_is("ArrayBuffer","buffer"):_false;r.alloc=alloc,r.concat=function(e,t){function append(e){n+=u.copy.call(e,a,n)}t||(t=0,Array.prototype.forEach.call(e,function(e){t+=e.length}));var o=this!==r&&this||e[0],a=alloc.call(o,t),n=0;return Array.prototype.forEach.call(e,append),a},r.from=function(e){return"string"==typeof e?fromString.call(this,e):auto(this).from(e)};var c=r.Array=e("./bufferish-array"),d=r.Buffer=e("./bufferish-buffer"),p=r.Uint8Array=e("./bufferish-uint8array"),u=r.prototype=e("./bufferish-proto"),h=_is("ArrayBuffer")},{"./buffer-global":12,"./bufferish-array":14,"./bufferish-buffer":15,"./bufferish-proto":16,"./bufferish-uint8array":17,isarray:9}],19:[function(e,t,r){function Codec(e){return this instanceof Codec?void(this.options=e,this.init()):new Codec(e)}function add(e,t){return e&&t?function(){return e.apply(this,arguments),t.apply(this,arguments)}:e||t}function join(e){function iterator(e,t){return t(e)}return e=e.slice(),function(t){return e.reduce(iterator,t)}}function filter(e){return o(e)?join(e):e}function createCodec(e){return new Codec(e)}var o=e("isarray");r.createCodec=createCodec,r.install=function(e){for(var t in e)Codec.prototype[t]=add(Codec.prototype[t],e[t])},r.filter=filter;var a=e("./bufferish");Codec.prototype.init=function(){var e=this.options;return e&&e.uint8array&&(this.bufferish=a.Uint8Array),this},r.preset=createCodec({preset:!0})},{"./bufferish":18,isarray:9}],20:[function(e,t,r){e("./read-core"),e("./write-core"),r.codec={preset:e("./codec-base").preset}},{"./codec-base":19,"./read-core":32,"./write-core":35}],21:[function(e,t,r){function DecodeBuffer(e){if(!(this instanceof DecodeBuffer))return new DecodeBuffer(e);if(e&&(this.options=e,e.codec)){var t=this.codec=e.codec;t.bufferish&&(this.bufferish=t.bufferish)}}r.DecodeBuffer=DecodeBuffer;var o=e("./read-core").preset,a=e("./flex-buffer").FlexDecoder;a.mixin(DecodeBuffer.prototype),DecodeBuffer.prototype.codec=o,DecodeBuffer.prototype.fetch=function(){return this.codec.decode(this)}},{"./flex-buffer":31,"./read-core":32}],22:[function(e,t,r){r.decode=function(e,t){var r=new o(t);return r.write(e),r.read()};var o=e("./decode-buffer").DecodeBuffer},{"./decode-buffer":21}],23:[function(e,t,r){function Decoder(e){return this instanceof Decoder?void a.call(this,e):new Decoder(e)}r.Decoder=Decoder;var o=e("event-lite"),a=e("./decode-buffer").DecodeBuffer;Decoder.prototype=new a,o.mixin(Decoder.prototype),Decoder.prototype.decode=function(e){arguments.length&&this.write(e),this.flush()},Decoder.prototype.push=function(e){this.emit("data",e)},Decoder.prototype.end=function(e){this.decode(e),this.emit("end")}},{"./decode-buffer":21,"event-lite":5}],24:[function(e,t,r){function EncodeBuffer(e){if(!(this instanceof EncodeBuffer))return new EncodeBuffer(e);if(e&&(this.options=e,e.codec)){var t=this.codec=e.codec;t.bufferish&&(this.bufferish=t.bufferish)}}r.EncodeBuffer=EncodeBuffer;var o=e("./write-core").preset,a=e("./flex-buffer").FlexEncoder;a.mixin(EncodeBuffer.prototype),EncodeBuffer.prototype.codec=o,EncodeBuffer.prototype.write=function(e){this.codec.encode(this,e)}},{"./flex-buffer":31,"./write-core":35}],25:[function(e,t,r){r.encode=function(e,t){var r=new o(t);return r.write(e),r.read()};var o=e("./encode-buffer").EncodeBuffer},{"./encode-buffer":24}],26:[function(e,t,r){function Encoder(e){return this instanceof Encoder?void a.call(this,e):new Encoder(e)}r.Encoder=Encoder;var o=e("event-lite"),a=e("./encode-buffer").EncodeBuffer;Encoder.prototype=new a,o.mixin(Encoder.prototype),Encoder.prototype.encode=function(e){this.write(e),this.emit("data",this.read())},Encoder.prototype.end=function(e){arguments.length&&this.encode(e),this.flush(),this.emit("end")}},{"./encode-buffer":24,"event-lite":5}],27:[function(e,t,r){function ExtBuffer(e,t){return this instanceof ExtBuffer?void(this.buffer=o.from(e),this.type=t):new ExtBuffer(e,t)}r.ExtBuffer=ExtBuffer;var o=e("./bufferish")},{"./bufferish":18}],28:[function(e,t,r){function encode(t){return s||(s=e("./encode").encode),s(t)}function packValueOf(e){return e.valueOf()}function packRegExp(e){e=RegExp.prototype.toString.call(e).split("/"),e.shift();var t=[e.pop()];return t.unshift(e.join("/")),t}function packError(e){var t={};for(var r in i)t[r]=e[r];return t}r.setExtPackers=function(e){e.addExtPacker(14,Error,[packError,encode]),e.addExtPacker(1,EvalError,[packError,encode]),e.addExtPacker(2,RangeError,[packError,encode]),e.addExtPacker(3,ReferenceError,[packError,encode]),e.addExtPacker(4,SyntaxError,[packError,encode]),e.addExtPacker(5,TypeError,[packError,encode]),e.addExtPacker(6,URIError,[packError,encode]),e.addExtPacker(10,RegExp,[packRegExp,encode]),e.addExtPacker(11,Boolean,[packValueOf,encode]),e.addExtPacker(12,String,[packValueOf,encode]),e.addExtPacker(13,Date,[Number,encode]),e.addExtPacker(15,Number,[packValueOf,encode]),"undefined"!=typeof Uint8Array&&(e.addExtPacker(17,Int8Array,n),e.addExtPacker(18,Uint8Array,n),e.addExtPacker(19,Int16Array,n),e.addExtPacker(20,Uint16Array,n),e.addExtPacker(21,Int32Array,n),e.addExtPacker(22,Uint32Array,n),e.addExtPacker(23,Float32Array,n),"undefined"!=typeof Float64Array&&e.addExtPacker(24,Float64Array,n),"undefined"!=typeof Uint8ClampedArray&&e.addExtPacker(25,Uint8ClampedArray,n),e.addExtPacker(26,ArrayBuffer,n),e.addExtPacker(29,DataView,n)),o.hasBuffer&&e.addExtPacker(27,a,o.from)};var o=e("./bufferish"),a=o.global,n=o.Uint8Array.from,i={name:1,message:1,stack:1,columnNumber:1,fileName:1,lineNumber:1},s},{"./bufferish":18,"./encode":25}],29:[function(e,t,r){function decode(t){return i||(i=e("./decode").decode),i(t)}function unpackRegExp(e){return RegExp.apply(null,e)}function unpackError(e){return function(t){var r=new e;for(var o in n)r[o]=t[o];return r}}function unpackClass(e){return function(t){return new e(t)}}function unpackArrayBuffer(e){return new Uint8Array(e).buffer}r.setExtUnpackers=function(e){e.addExtUnpacker(14,[decode,unpackError(Error)]),e.addExtUnpacker(1,[decode,unpackError(EvalError)]),e.addExtUnpacker(2,[decode,unpackError(RangeError)]),e.addExtUnpacker(3,[decode,unpackError(ReferenceError)]),e.addExtUnpacker(4,[decode,unpackError(SyntaxError)]),e.addExtUnpacker(5,[decode,unpackError(TypeError)]),e.addExtUnpacker(6,[decode,unpackError(URIError)]),e.addExtUnpacker(10,[decode,unpackRegExp]),e.addExtUnpacker(11,[decode,unpackClass(Boolean)]),e.addExtUnpacker(12,[decode,unpackClass(String)]),e.addExtUnpacker(13,[decode,unpackClass(Date)]),e.addExtUnpacker(15,[decode,unpackClass(Number)]),"undefined"!=typeof Uint8Array&&(e.addExtUnpacker(17,unpackClass(Int8Array)),e.addExtUnpacker(18,unpackClass(Uint8Array)),e.addExtUnpacker(19,[unpackArrayBuffer,unpackClass(Int16Array)]),e.addExtUnpacker(20,[unpackArrayBuffer,unpackClass(Uint16Array)]),e.addExtUnpacker(21,[unpackArrayBuffer,unpackClass(Int32Array)]),e.addExtUnpacker(22,[unpackArrayBuffer,unpackClass(Uint32Array)]),e.addExtUnpacker(23,[unpackArrayBuffer,unpackClass(Float32Array)]),"undefined"!=typeof Float64Array&&e.addExtUnpacker(24,[unpackArrayBuffer,unpackClass(Float64Array)]),"undefined"!=typeof Uint8ClampedArray&&e.addExtUnpacker(25,unpackClass(Uint8ClampedArray)),e.addExtUnpacker(26,unpackArrayBuffer),e.addExtUnpacker(29,[unpackArrayBuffer,unpackClass(DataView)])),o.hasBuffer&&e.addExtUnpacker(27,unpackClass(a))};var o=e("./bufferish"),a=o.global,n={name:1,message:1,stack:1,columnNumber:1,fileName:1,lineNumber:1},i},{"./bufferish":18,"./decode":22}],30:[function(e,t,r){e("./read-core"),e("./write-core"),r.createCodec=e("./codec-base").createCodec},{"./codec-base":19,"./read-core":32,"./write-core":35}],31:[function(e,t,r){function FlexDecoder(){if(!(this instanceof FlexDecoder))return new FlexDecoder}function FlexEncoder(){if(!(this instanceof FlexEncoder))return new FlexEncoder}function write(){throw new Error("method not implemented: write()")}function fetch(){throw new Error("method not implemented: fetch()")}function read(){var e=this.buffers&&this.buffers.length;return e?(this.flush(),this.pull()):this.fetch()}function push(e){var t=this.buffers||(this.buffers=[]);t.push(e)}function pull(){var e=this.buffers||(this.buffers=[]);return e.shift()}function mixinFactory(e){return function(t){for(var r in e)t[r]=e[r];return t}}r.FlexDecoder=FlexDecoder,r.FlexEncoder=FlexEncoder;var o=e("./bufferish");FlexDecoder.mixin=mixinFactory(function(){return{bufferish:o,write:function(e){var t=this.offset?o.prototype.slice.call(this.buffer,this.offset):this.buffer;this.buffer=t?e?this.bufferish.concat([t,e]):t:e,this.offset=0},fetch:fetch,flush:function(){for(;this.offsetthis.buffer.length)throw new Error("BUFFER_SHORTAGE");return this.offset=r,t},offset:0}}()),FlexDecoder.mixin(FlexDecoder.prototype),FlexEncoder.mixin=mixinFactory(function(){return{bufferish:o,write:write,fetch:function(){var e=this.start;if(ethis.minBufferSize)this.flush(),this.push(e);else{var r=this.reserve(t);o.prototype.copy.call(e,this.buffer,r)}},maxBufferSize:65536,minBufferSize:2048,offset:0,start:0}}()),FlexEncoder.mixin(FlexEncoder.prototype)},{"./bufferish":18}],32:[function(e,t,r){function getDecoder(e){var t=i.getReadToken(e);return function(e){var r=n(e),o=t[r];if(!o)throw new Error("Invalid type: "+(r?"0x"+r.toString(16):r));return o(e)}}function init(){var e=this.options;return this.decode=getDecoder(e),e&&e.preset&&a.setExtUnpackers(this),this}var o=e("./ext-buffer").ExtBuffer,a=e("./ext-unpacker"),n=e("./read-format").readUint8,i=e("./read-token"),s=e("./codec-base");s.install({addExtUnpacker:function(e,t){var r=this.extUnpackers||(this.extUnpackers=[]);r[e]=s.filter(t)},getExtUnpacker:function(e){var t=this.extUnpackers||(this.extUnpackers=[]);return t[e]||function(t){return new o(t,e)}},init:init}),r.preset=init.call(s.preset)},{"./codec-base":19,"./ext-buffer":27,"./ext-unpacker":29,"./read-format":33,"./read-token":34}],33:[function(e,t,r){function map_to_obj(e,t){var r={},o=Array(t),a=Array(t),n=e.codec.decode,s;for(s=0;s=r;r++)t[r]=constant(r);for(r=128;143>=r;r++)t[r]=fix(r-128,e.map);for(r=144;159>=r;r++)t[r]=fix(r-144,e.array);for(r=160;191>=r;r++)t[r]=fix(r-160,e.str);for(t[192]=constant(null),t[193]=null,t[194]=constant(!1),t[195]=constant(!0),t[196]=flex(e.uint8,e.bin),t[197]=flex(e.uint16,e.bin),t[198]=flex(e.uint32,e.bin),t[199]=flex(e.uint8,e.ext),t[200]=flex(e.uint16,e.ext),t[201]=flex(e.uint32,e.ext),t[202]=e.float32,t[203]=e.float64,t[204]=e.uint8,t[205]=e.uint16,t[206]=e.uint32,t[207]=e.uint64,t[208]=e.int8,t[209]=e.int16,t[210]=e.int32,t[211]=e.int64,t[212]=fix(1,e.ext),t[213]=fix(2,e.ext),t[214]=fix(4,e.ext),t[215]=fix(8,e.ext),t[216]=fix(16,e.ext),t[217]=flex(e.uint8,e.str),t[218]=flex(e.uint16,e.str),t[219]=flex(e.uint32,e.str),t[220]=flex(e.uint16,e.array),t[221]=flex(e.uint32,e.array),t[222]=flex(e.uint16,e.map),t[223]=flex(e.uint32,e.map),r=224;255>=r;r++)t[r]=constant(r-256);return t}function init_useraw(e){var t=init_token(e).slice(),r;for(t[217]=t[196],t[218]=t[197],t[219]=t[198],r=160;191>=r;r++)t[r]=fix(r-160,e.bin);return t}function constant(e){return function(){return e}}function flex(e,t){return function(r){var o=e(r);return t(r,o)}}function fix(e,t){return function(r){return t(r,e)}}var o=e("./read-format");r.getReadToken=function(e){var t=o.getReadFormat(e);return e&&e.useraw?init_useraw(t):init_token(t)}},{"./read-format":33}],35:[function(e,t,r){function getEncoder(e){var t=n.getWriteType(e);return function(e,r){var o=t[typeof r];if(!o)throw new Error("Unsupported type \""+typeof r+"\": "+r);o(e,r)}}function init(){var e=this.options;return this.encode=getEncoder(e),e&&e.preset&&a.setExtPackers(this),this}var o=e("./ext-buffer").ExtBuffer,a=e("./ext-packer"),n=e("./write-type"),i=e("./codec-base");i.install({addExtPacker:function(e,t,r){function extPacker(t){return r&&(t=r(t)),new o(t,e)}r=i.filter(r);var a=t.name;if(a&&"Object"!==a){var n=this.extPackers||(this.extPackers={});n[a]=extPacker}else{var s=this.extEncoderList||(this.extEncoderList=[]);s.unshift([t,extPacker])}},getExtPacker:function(t){var r=this.extPackers||(this.extPackers={}),o=t.constructor,a=o&&o.name&&r[o.name];if(a)return a;for(var e=this.extEncoderList||(this.extEncoderList=[]),n=e.length,s=0,l;s>>8,a[o]=r}}function write4(e){return function(t,r){var o=t.reserve(5),a=t.buffer;a[o++]=e,a[o++]=r>>>24,a[o++]=r>>>16,a[o++]=r>>>8,a[o]=r}}function writeN(e,t,r,o){return function(a,n){var i=a.reserve(t+1);a.buffer[i++]=e,r.call(a.buffer,n,i,o)}}function writeUInt64BE(e,t){new n(this,t,e)}function writeInt64BE(e,t){new i(this,t,e)}function writeFloatBE(e,t){o.write(this,e,t,!1,23,4)}function writeDoubleBE(e,t){o.write(this,e,t,!1,52,8)}var o=e("ieee754"),a=e("int64-buffer"),n=a.Uint64BE,i=a.Int64BE,s=e("./write-uint8").uint8,l=e("./bufferish"),c=l.global,d=l.hasBuffer&&"TYPED_ARRAY_SUPPORT"in c,p=d&&!c.TYPED_ARRAY_SUPPORT,u=l.hasBuffer&&c.prototype||{};r.getWriteToken=function(e){return e&&e.uint8array?init_uint8array():p||l.hasBuffer&&e&&e.safe?init_safe():init_token()}},{"./bufferish":18,"./write-uint8":38,ieee754:7,"int64-buffer":8}],37:[function(r,o,a){var n=r("isarray"),i=r("int64-buffer"),s=i.Uint64BE,l=i.Int64BE,c=r("./bufferish"),d=r("./bufferish-proto"),p=r("./write-token"),u=r("./write-uint8").uint8,h=r("./ext-buffer").ExtBuffer,f="undefined"!=typeof Uint8Array,y="undefined"!=typeof Map,b=[];b[1]=212,b[2]=213,b[4]=214,b[8]=215,b[16]=216,a.getWriteType=function(r){function uint64(e,t){o[207](e,t.toArray())}function int64(e,t){o[211](e,t.toArray())}function object(e,t){if(null===t)return nil(e,t);if(g(t))return m(e,t);if(n(t))return array(e,t);if(s.isUint64BE(t))return uint64(e,t);if(l.isInt64BE(t))return int64(e,t);var r=e.codec.getExtPacker(t);return r&&(t=r(t)),t instanceof h?ext(e,t):void k(e,t)}function nil(e,t){o[192](e,t)}function array(e,t){var r=t.length,a=16>r?144+r:65535>=r?220:221;o[a](e,r);for(var n=e.codec.encode,s=0;sr?196:65535>=r?197:198;o[a](e,r),e.send(t)}function ext(e,t){var r=t.buffer,a=r.length,n=b[a]||(255>a?199:65535>=a?200:201);o[n](e,a),u[t.type](e),e.send(r)}function obj_to_map(e,t){var r=w?Object.keys(t).sort():Object.keys(t),a=r.length,n=16>a?128+a:65535>=a?222:223;o[n](e,a);var i=e.codec.encode;r.forEach(function(r){i(e,r),i(e,t[r])})}function raw(e,t){var r=t.length,a=32>r?160+r:65535>=r?218:219;o[a](e,r),e.send(t)}var o=p.getWriteToken(r),a=r&&r.useraw,i=f&&r&&r.binarraybuffer,g=i?c.isArrayBuffer:c.isBuffer,m=i?function(e,t){bin_buffer(e,new Uint8Array(t))}:bin_buffer,_=y&&r&&r.usemap,k=_?function(e,t){if(!(t instanceof Map))return obj_to_map(e,t);var r=t.size,a=16>r?128+r:65535>=r?222:223;o[a](e,r);var n=e.codec.encode;t.forEach(function(t,r,o){n(e,r),n(e,t)})}:obj_to_map,w=r&&r.canonical,x={boolean:function(e,t){var r=t?195:194;o[r](e,t)},function:nil,number:function(r,a){var n;if(t(a)!==a||!e(a))return n=203,void o[n](r,a);n=-32<=a&&127>=a?255&a:0<=a?255>=a?204:65535>=a?205:4294967295>=a?206:207:-128<=a?208:-32768<=a?209:-2147483648<=a?210:211;o[n](r,a)},object:a?function(e,t){return g(t)?raw(e,t):void object(e,t)}:object,string:function(e){return function(t,r){var a=r.length,n=5+3*a;t.offset=t.reserve(n);var i=t.buffer,s=e(a),l=t.offset+s;a=d.write.call(i,r,l);var c=e(a);if(s!==c){var p=l+a;d.copy.call(i,i,l+c-s,l,p)}var u=1===c?160+a:3>=c?215+c:219;o[u](t,a),t.offset+=a}}(a?function(e){return 32>e?1:65535>=e?3:5}:function(e){return 32>e?1:255>=e?2:65535>=e?3:5}),symbol:nil,undefined:nil};return x}},{"./bufferish":18,"./bufferish-proto":16,"./ext-buffer":27,"./write-token":36,"./write-uint8":38,"int64-buffer":8,isarray:9}],38:[function(e,t,r){function write0(e){return function(t){var r=t.reserve(1);t.buffer[r]=e}}for(var o=r.uint8=Array(256),a=0;255>=a;a++)o[a]=write0(a)},{}],39:[function(e,t,r){function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(t){if(a===setTimeout)return setTimeout(t,0);if((a===defaultSetTimout||!a)&&setTimeout)return a=setTimeout,setTimeout(t,0);try{return a(t,0)}catch(r){try{return a.call(null,t,0)}catch(r){return a.call(this,t,0)}}}function runClearTimeout(t){if(n===clearTimeout)return clearTimeout(t);if((n===defaultClearTimeout||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(t);try{return n(t)}catch(r){try{return n.call(null,t)}catch(r){return n.call(this,t)}}}function cleanUpNextTick(){l&&d&&(l=!1,d.length?s=d.concat(s):c=-1,s.length&&drainQueue())}function drainQueue(){if(!l){var e=runTimeout(cleanUpNextTick);l=!0;for(var t=s.length;t;){for(d=s,s=[];++c{Agent.prototype[e]=function(...t){return this._defaults.push({fn:e,args:t}),this}}),Agent.prototype._setDefaults=function(e){this._defaults.forEach(t=>{e[t.fn].apply(e,t.args)})},t.exports=Agent},{}],41:[function(e,t,r){function noop(){}function serialize(e){if(!i(e))return e;const t=[];for(const r in e)pushEncodedKeyValuePair(t,r,e[r]);return t.join("&")}function pushEncodedKeyValuePair(e,t,r){if(!(null!=r))null===r&&e.push(encodeURIComponent(t));else if(Array.isArray(r))r.forEach(r=>{pushEncodedKeyValuePair(e,t,r)});else if(i(r))for(const o in r)pushEncodedKeyValuePair(e,`${t}[${o}]`,r[o]);else e.push(encodeURIComponent(t)+"="+encodeURIComponent(r))}function parseString(e){const t={},r=e.split("&");let o,a;for(let n=0,i=r.length;n{let t=null,o=null;try{o=new Response(r)}catch(o){return t=new Error("Parser is unable to parse the response"),t.parse=!0,t.original=o,r.xhr?(t.rawResponse="undefined"==typeof r.xhr.responseType?r.xhr.responseText:r.xhr.response,t.status=r.xhr.status?r.xhr.status:null,t.statusCode=t.status):(t.rawResponse=null,t.status=null),r.callback(t)}r.emit("response",o);let a;try{r._isResponseOK(o)||(a=new Error(o.statusText||"Unsuccessful HTTP response"))}catch(e){a=e}a?(a.original=t,a.response=o,a.status=o.status,r.callback(a,o)):r.callback(null,o)})}function del(e,t,r){const o=c("DELETE",e);return"function"==typeof t&&(r=t,t=null),t&&o.send(t),r&&o.end(r),o}let o;"undefined"==typeof window?"undefined"==typeof self?(console.warn("Using browser-only version of superagent in non-browser environment"),o=this):o=self:o=window;const a=e("component-emitter"),n=e("./request-base"),i=e("./is-object"),s=e("./response-base"),l=e("./agent-base");const c=r=t.exports=function(e,t){return"function"==typeof t?new r.Request("GET",e).end(t):1==arguments.length?new r.Request("GET",e):new r.Request(e,t)};r.Request=Request,c.getXHR=()=>{if(o.XMLHttpRequest&&(!o.location||"file:"!=o.location.protocol||!o.ActiveXObject))return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(t){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(t){}throw Error("Browser-only version of superagent could not find XHR")};const d=e=>e.trim();c.serializeObject=serialize,c.parseString=parseString,c.types={html:"text/html",json:"application/json",xml:"text/xml",urlencoded:"application/x-www-form-urlencoded",form:"application/x-www-form-urlencoded","form-data":"application/x-www-form-urlencoded"},c.serialize={"application/x-www-form-urlencoded":serialize,"application/json":JSON.stringify},c.parse={"application/x-www-form-urlencoded":parseString,"application/json":JSON.parse},s(Response.prototype),Response.prototype._parseBody=function(e){let t=c.parse[this.type];return this.req._parser?this.req._parser(this,e):(!t&&isJSON(this.type)&&(t=c.parse["application/json"]),t&&e&&(e.length||e instanceof Object)?t(e):null)},Response.prototype.toError=function(){const e=this.req,t=e.method,r=e.url,o=`cannot ${t} ${r} (${this.status})`,a=new Error(o);return a.status=this.status,a.method=t,a.url=r,a},c.Response=Response,a(Request.prototype),n(Request.prototype),Request.prototype.type=function(e){return this.set("Content-Type",c.types[e]||e),this},Request.prototype.accept=function(e){return this.set("Accept",c.types[e]||e),this},Request.prototype.auth=function(e,t,r){1===arguments.length&&(t=""),"object"==typeof t&&null!==t&&(r=t,t=""),r||(r={type:"function"==typeof btoa?"basic":"auto"});return this._auth(e,t,r,e=>{if("function"==typeof btoa)return btoa(e);throw new Error("Cannot use basic auth, btoa is not a function")})},Request.prototype.query=function(e){return"string"!=typeof e&&(e=serialize(e)),e&&this._query.push(e),this},Request.prototype.attach=function(e,t,r){if(t){if(this._data)throw Error("superagent can't mix .send() and .attach()");this._getFormData().append(e,t,r||t.name)}return this},Request.prototype._getFormData=function(){return this._formData||(this._formData=new o.FormData),this._formData},Request.prototype.callback=function(e,t){if(this._shouldRetry(e,t))return this._retry();const r=this._callback;this.clearTimeout(),e&&(this._maxRetries&&(e.retries=this._retries-1),this.emit("error",e)),r(e,t)},Request.prototype.crossDomainError=function(){const e=new Error("Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.");e.crossDomain=!0,e.status=this.status,e.method=this.method,e.url=this.url,this.callback(e)},Request.prototype.buffer=Request.prototype.ca=Request.prototype.agent=function(){return console.warn("This is not supported in browser version of superagent"),this},Request.prototype.pipe=Request.prototype.write=()=>{throw Error("Streaming is not supported in browser version of superagent")},Request.prototype._isHost=function(e){return e&&"object"==typeof e&&!Array.isArray(e)&&"[object Object]"!==Object.prototype.toString.call(e)},Request.prototype.end=function(e){this._endCalled&&console.warn("Warning: .end() was called twice. This is not supported in superagent"),this._endCalled=!0,this._callback=e||noop,this._finalizeQueryString(),this._end()},Request.prototype._end=function(){if(this._aborted)return this.callback(Error("The request has been aborted even before .end() was called"));const t=this,r=this.xhr=c.getXHR();let o=this._formData||this._data;this._setTimeouts(),r.onreadystatechange=()=>{const e=r.readyState;if(2<=e&&t._responseTimeoutTimer&&clearTimeout(t._responseTimeoutTimer),4!=e)return;let o;try{o=r.status}catch(t){o=0}return o?void t.emit("end"):t.timedout||t._aborted?void 0:t.crossDomainError()};const a=(r,o)=>{0new l,["GET","POST","OPTIONS","PATCH","PUT","DELETE"].forEach(e=>{l.prototype[e.toLowerCase()]=function(t,r){const o=new c.Request(e,t);return this._setDefaults(o),r&&o.end(r),o}}),l.prototype.del=l.prototype["delete"],c.get=(e,t,r)=>{const o=c("GET",e);return"function"==typeof t&&(r=t,t=null),t&&o.query(t),r&&o.end(r),o},c.head=(e,t,r)=>{const o=c("HEAD",e);return"function"==typeof t&&(r=t,t=null),t&&o.query(t),r&&o.end(r),o},c.options=(e,t,r)=>{const o=c("OPTIONS",e);return"function"==typeof t&&(r=t,t=null),t&&o.send(t),r&&o.end(r),o},c.del=del,c["delete"]=del,c.patch=(e,t,r)=>{const o=c("PATCH",e);return"function"==typeof t&&(r=t,t=null),t&&o.send(t),r&&o.end(r),o},c.post=(e,t,r)=>{const o=c("POST",e);return"function"==typeof t&&(r=t,t=null),t&&o.send(t),r&&o.end(r),o},c.put=(e,t,r)=>{const o=c("PUT",e);return"function"==typeof t&&(r=t,t=null),t&&o.send(t),r&&o.end(r),o}},{"./agent-base":40,"./is-object":42,"./request-base":43,"./response-base":44,"component-emitter":4}],42:[function(e,t,r){'use strict';t.exports=function(e){return null!==e&&"object"==typeof e}},{}],43:[function(e,t,r){'use strict';function RequestBase(e){if(e)return mixin(e)}function mixin(e){for(const t in RequestBase.prototype)e[t]=RequestBase.prototype[t];return e}const o=e("./is-object");t.exports=RequestBase,RequestBase.prototype.clearTimeout=function(){return clearTimeout(this._timer),clearTimeout(this._responseTimeoutTimer),delete this._timer,delete this._responseTimeoutTimer,this},RequestBase.prototype.parse=function(e){return this._parser=e,this},RequestBase.prototype.responseType=function(e){return this._responseType=e,this},RequestBase.prototype.serialize=function(e){return this._serializer=e,this},RequestBase.prototype.timeout=function(e){if(!e||"object"!=typeof e)return this._timeout=e,this._responseTimeout=0,this;for(const t in e)"deadline"==t?this._timeout=e.deadline:"response"==t?this._responseTimeout=e.response:console.warn("Unknown timeout option",t);return this},RequestBase.prototype.retry=function(e,t){return(0===arguments.length||!0===e)&&(e=1),0>=e&&(e=0),this._maxRetries=e,this._retries=0,this._retryCallback=t,this};const a=["ECONNRESET","ETIMEDOUT","EADDRINFO","ESOCKETTIMEDOUT"];RequestBase.prototype._shouldRetry=function(e,t){if(!this._maxRetries||this._retries++>=this._maxRetries)return!1;if(this._retryCallback)try{const r=this._retryCallback(e,t);if(!0===r)return!0;if(!1===r)return!1}catch(t){console.error(t)}if(t&&t.status&&500<=t.status&&501!=t.status)return!0;if(e){if(e.code&&~a.indexOf(e.code))return!0;if(e.timeout&&"ECONNABORTED"==e.code)return!0;if(e.crossDomain)return!0}return!1},RequestBase.prototype._retry=function(){return this.clearTimeout(),this.req&&(this.req=null,this.req=this.request()),this._aborted=!1,this.timedout=!1,this._end()},RequestBase.prototype.then=function(e,t){if(!this._fullfilledPromise){const e=this;this._endCalled&&console.warn("Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises"),this._fullfilledPromise=new Promise((t,r)=>{e.on("error",r),e.on("abort",()=>{const e=new Error("Aborted");e.code="ABORTED",e.status=this.status,e.method=this.method,e.url=this.url,r(e)}),e.end((e,o)=>{e?r(e):t(o)})})}return this._fullfilledPromise.then(e,t)},RequestBase.prototype["catch"]=function(e){return this.then(void 0,e)},RequestBase.prototype.use=function(e){return e(this),this},RequestBase.prototype.ok=function(e){if("function"!=typeof e)throw Error("Callback required");return this._okCallback=e,this},RequestBase.prototype._isResponseOK=function(e){return!!e&&(this._okCallback?this._okCallback(e):200<=e.status&&300>e.status)},RequestBase.prototype.get=function(e){return this._header[e.toLowerCase()]},RequestBase.prototype.getHeader=RequestBase.prototype.get,RequestBase.prototype.set=function(e,t){if(o(e)){for(const t in e)this.set(t,e[t]);return this}return this._header[e.toLowerCase()]=t,this.header[e]=t,this},RequestBase.prototype.unset=function(e){return delete this._header[e.toLowerCase()],delete this.header[e],this},RequestBase.prototype.field=function(e,t){if(null===e||void 0===e)throw new Error(".field(name, val) name can not be empty");if(this._data)throw new Error(".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()");if(o(e)){for(const t in e)this.field(t,e[t]);return this}if(Array.isArray(t)){for(const r in t)this.field(e,t[r]);return this}if(null===t||void 0===t)throw new Error(".field(name, val) val can not be empty");return"boolean"==typeof t&&(t=""+t),this._getFormData().append(e,t),this},RequestBase.prototype.abort=function(){return this._aborted?this:(this._aborted=!0,this.xhr&&this.xhr.abort(),this.req&&this.req.abort(),this.clearTimeout(),this.emit("abort"),this)},RequestBase.prototype._auth=function(e,t,r,o){switch(r.type){case"basic":this.set("Authorization",`Basic ${o(`${e}:${t}`)}`);break;case"auto":this.username=e,this.password=t;break;case"bearer":this.set("Authorization",`Bearer ${e}`);}return this},RequestBase.prototype.withCredentials=function(e){return null==e&&(e=!0),this._withCredentials=e,this},RequestBase.prototype.redirects=function(e){return this._maxRedirects=e,this},RequestBase.prototype.maxResponseSize=function(e){if("number"!=typeof e)throw TypeError("Invalid argument");return this._maxResponseSize=e,this},RequestBase.prototype.toJSON=function(){return{method:this.method,url:this.url,data:this._data,headers:this._header}},RequestBase.prototype.send=function(e){const t=o(e);let r=this._header["content-type"];if(this._formData)throw new Error(".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()");if(t&&!this._data)Array.isArray(e)?this._data=[]:!this._isHost(e)&&(this._data={});else if(e&&this._data&&this._isHost(this._data))throw Error("Can't merge these send calls");if(t&&o(this._data))for(const t in e)this._data[t]=e[t];else"string"==typeof e?(r||this.type("form"),r=this._header["content-type"],this._data="application/x-www-form-urlencoded"==r?this._data?`${this._data}&${e}`:e:(this._data||"")+e):this._data=e;return!t||this._isHost(e)?this:(r||this.type("json"),this)},RequestBase.prototype.sortQuery=function(e){return this._sort="undefined"==typeof e||e,this},RequestBase.prototype._finalizeQueryString=function(){const e=this._query.join("&");if(e&&(this.url+=(0<=this.url.indexOf("?")?"&":"?")+e),this._query.length=0,this._sort){const e=this.url.indexOf("?");if(0<=e){const t=this.url.substring(e+1).split("&");"function"==typeof this._sort?t.sort(this._sort):t.sort(),this.url=this.url.substring(0,e)+"?"+t.join("&")}}},RequestBase.prototype._appendQueryString=()=>{console.trace("Unsupported")},RequestBase.prototype._timeoutError=function(e,t,r){if(!this._aborted){const o=new Error(`${e+t}ms exceeded`);o.timeout=t,o.code="ECONNABORTED",o.errno=r,this.timedout=!0,this.abort(),this.callback(o)}},RequestBase.prototype._setTimeouts=function(){const e=this;this._timeout&&!this._timer&&(this._timer=setTimeout(()=>{e._timeoutError("Timeout of ",e._timeout,"ETIME")},this._timeout)),this._responseTimeout&&!this._responseTimeoutTimer&&(this._responseTimeoutTimer=setTimeout(()=>{e._timeoutError("Response timeout of ",e._responseTimeout,"ETIMEDOUT")},this._responseTimeout))}},{"./is-object":42}],44:[function(e,t,r){'use strict';function ResponseBase(e){if(e)return mixin(e)}function mixin(e){for(const t in ResponseBase.prototype)e[t]=ResponseBase.prototype[t];return e}const o=e("./utils");t.exports=ResponseBase,ResponseBase.prototype.get=function(e){return this.header[e.toLowerCase()]},ResponseBase.prototype._setHeaderProperties=function(e){const t=e["content-type"]||"";this.type=o.type(t);const r=o.params(t);for(const t in r)this[t]=r[t];this.links={};try{e.link&&(this.links=o.parseLinks(e.link))}catch(e){}},ResponseBase.prototype._setStatusProperties=function(e){const t=0|e/100;this.status=this.statusCode=e,this.statusType=t,this.info=1==t,this.ok=2==t,this.redirect=3==t,this.clientError=4==t,this.serverError=5==t,this.error=!(4!=t&&5!=t)&&this.toError(),this.created=201==e,this.accepted=202==e,this.noContent=204==e,this.badRequest=400==e,this.unauthorized=401==e,this.notAcceptable=406==e,this.forbidden=403==e,this.notFound=404==e,this.unprocessableEntity=422==e}},{"./utils":45}],45:[function(e,t,r){'use strict';r.type=e=>e.split(/ *; */).shift(),r.params=e=>e.split(/ *; */).reduce((e,t)=>{const r=t.split(/ *= */),o=r.shift(),a=r.shift();return o&&a&&(e[o]=a),e},{}),r.parseLinks=e=>e.split(/ *, */).reduce((e,t)=>{const r=t.split(/ *; */),o=r[0].slice(1,-1),a=r[1].split(/ *= */)[1].slice(1,-1);return e[a]=o,e},{}),r.cleanHeader=(e,t)=>(delete e["content-type"],delete e["content-length"],delete e["transfer-encoding"],delete e.host,t&&(delete e.authorization,delete e.cookie),e)},{}],46:[function(e,r,o){(function(r){'use strict';function ts64(e,t,r,o){e[t]=255&r>>24,e[t+1]=255&r>>16,e[t+2]=255&r>>8,e[t+3]=255&r,e[t+4]=255&o>>24,e[t+5]=255&o>>16,e[t+6]=255&o>>8,e[t+7]=255&o}function vn(e,t,r,o,a){var n=0,s;for(s=0;s>>8)-1}function crypto_verify_16(e,t,r,o){return vn(e,t,r,o,16)}function crypto_verify_32(e,t,r,o){return vn(e,t,r,o,32)}function core_salsa20(e,t,r,o){for(var a=255&o[0]|(255&o[1])<<8|(255&o[2])<<16|(255&o[3])<<24,n=255&r[0]|(255&r[1])<<8|(255&r[2])<<16|(255&r[3])<<24,s=255&r[4]|(255&r[5])<<8|(255&r[6])<<16|(255&r[7])<<24,l=255&r[8]|(255&r[9])<<8|(255&r[10])<<16|(255&r[11])<<24,c=255&r[12]|(255&r[13])<<8|(255&r[14])<<16|(255&r[15])<<24,d=255&o[4]|(255&o[5])<<8|(255&o[6])<<16|(255&o[7])<<24,p=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,h=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,f=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,y=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,b=255&o[8]|(255&o[9])<<8|(255&o[10])<<16|(255&o[11])<<24,g=255&r[16]|(255&r[17])<<8|(255&r[18])<<16|(255&r[19])<<24,m=255&r[20]|(255&r[21])<<8|(255&r[22])<<16|(255&r[23])<<24,_=255&r[24]|(255&r[25])<<8|(255&r[26])<<16|(255&r[27])<<24,k=255&r[28]|(255&r[29])<<8|(255&r[30])<<16|(255&r[31])<<24,w=255&o[12]|(255&o[13])<<8|(255&o[14])<<16|(255&o[15])<<24,x=a,v=n,E=s,A=l,B=c,T=d,S=p,U=h,P=f,R=y,I=b,L=g,C=m,O=_,j=k,D=w,z=0,N;20>z;z+=2)N=0|x+C,B^=N<<7|N>>>25,N=0|B+x,P^=N<<9|N>>>23,N=0|P+B,C^=N<<13|N>>>19,N=0|C+P,x^=N<<18|N>>>14,N=0|T+v,R^=N<<7|N>>>25,N=0|R+T,O^=N<<9|N>>>23,N=0|O+R,v^=N<<13|N>>>19,N=0|v+O,T^=N<<18|N>>>14,N=0|I+S,j^=N<<7|N>>>25,N=0|j+I,E^=N<<9|N>>>23,N=0|E+j,S^=N<<13|N>>>19,N=0|S+E,I^=N<<18|N>>>14,N=0|D+L,A^=N<<7|N>>>25,N=0|A+D,U^=N<<9|N>>>23,N=0|U+A,L^=N<<13|N>>>19,N=0|L+U,D^=N<<18|N>>>14,N=0|x+A,v^=N<<7|N>>>25,N=0|v+x,E^=N<<9|N>>>23,N=0|E+v,A^=N<<13|N>>>19,N=0|A+E,x^=N<<18|N>>>14,N=0|T+B,S^=N<<7|N>>>25,N=0|S+T,U^=N<<9|N>>>23,N=0|U+S,B^=N<<13|N>>>19,N=0|B+U,T^=N<<18|N>>>14,N=0|I+R,L^=N<<7|N>>>25,N=0|L+I,P^=N<<9|N>>>23,N=0|P+L,R^=N<<13|N>>>19,N=0|R+P,I^=N<<18|N>>>14,N=0|D+j,C^=N<<7|N>>>25,N=0|C+D,O^=N<<9|N>>>23,N=0|O+C,j^=N<<13|N>>>19,N=0|j+O,D^=N<<18|N>>>14;x=0|x+a,v=0|v+n,E=0|E+s,A=0|A+l,B=0|B+c,T=0|T+d,S=0|S+p,U=0|U+h,P=0|P+f,R=0|R+y,I=0|I+b,L=0|L+g,C=0|C+m,O=0|O+_,j=0|j+k,D=0|D+w,e[0]=255&x>>>0,e[1]=255&x>>>8,e[2]=255&x>>>16,e[3]=255&x>>>24,e[4]=255&v>>>0,e[5]=255&v>>>8,e[6]=255&v>>>16,e[7]=255&v>>>24,e[8]=255&E>>>0,e[9]=255&E>>>8,e[10]=255&E>>>16,e[11]=255&E>>>24,e[12]=255&A>>>0,e[13]=255&A>>>8,e[14]=255&A>>>16,e[15]=255&A>>>24,e[16]=255&B>>>0,e[17]=255&B>>>8,e[18]=255&B>>>16,e[19]=255&B>>>24,e[20]=255&T>>>0,e[21]=255&T>>>8,e[22]=255&T>>>16,e[23]=255&T>>>24,e[24]=255&S>>>0,e[25]=255&S>>>8,e[26]=255&S>>>16,e[27]=255&S>>>24,e[28]=255&U>>>0,e[29]=255&U>>>8,e[30]=255&U>>>16,e[31]=255&U>>>24,e[32]=255&P>>>0,e[33]=255&P>>>8,e[34]=255&P>>>16,e[35]=255&P>>>24,e[36]=255&R>>>0,e[37]=255&R>>>8,e[38]=255&R>>>16,e[39]=255&R>>>24,e[40]=255&I>>>0,e[41]=255&I>>>8,e[42]=255&I>>>16,e[43]=255&I>>>24,e[44]=255&L>>>0,e[45]=255&L>>>8,e[46]=255&L>>>16,e[47]=255&L>>>24,e[48]=255&C>>>0,e[49]=255&C>>>8,e[50]=255&C>>>16,e[51]=255&C>>>24,e[52]=255&O>>>0,e[53]=255&O>>>8,e[54]=255&O>>>16,e[55]=255&O>>>24,e[56]=255&j>>>0,e[57]=255&j>>>8,e[58]=255&j>>>16,e[59]=255&j>>>24,e[60]=255&D>>>0,e[61]=255&D>>>8,e[62]=255&D>>>16,e[63]=255&D>>>24}function core_hsalsa20(e,t,r,o){for(var a=255&o[0]|(255&o[1])<<8|(255&o[2])<<16|(255&o[3])<<24,n=255&r[0]|(255&r[1])<<8|(255&r[2])<<16|(255&r[3])<<24,s=255&r[4]|(255&r[5])<<8|(255&r[6])<<16|(255&r[7])<<24,l=255&r[8]|(255&r[9])<<8|(255&r[10])<<16|(255&r[11])<<24,c=255&r[12]|(255&r[13])<<8|(255&r[14])<<16|(255&r[15])<<24,d=255&o[4]|(255&o[5])<<8|(255&o[6])<<16|(255&o[7])<<24,p=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,h=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,f=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,y=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,b=255&o[8]|(255&o[9])<<8|(255&o[10])<<16|(255&o[11])<<24,g=255&r[16]|(255&r[17])<<8|(255&r[18])<<16|(255&r[19])<<24,m=255&r[20]|(255&r[21])<<8|(255&r[22])<<16|(255&r[23])<<24,_=255&r[24]|(255&r[25])<<8|(255&r[26])<<16|(255&r[27])<<24,k=255&r[28]|(255&r[29])<<8|(255&r[30])<<16|(255&r[31])<<24,w=255&o[12]|(255&o[13])<<8|(255&o[14])<<16|(255&o[15])<<24,x=a,v=n,E=s,A=l,B=c,T=d,S=p,U=h,P=f,R=y,I=b,L=g,C=m,O=_,j=k,D=w,z=0,N;20>z;z+=2)N=0|x+C,B^=N<<7|N>>>25,N=0|B+x,P^=N<<9|N>>>23,N=0|P+B,C^=N<<13|N>>>19,N=0|C+P,x^=N<<18|N>>>14,N=0|T+v,R^=N<<7|N>>>25,N=0|R+T,O^=N<<9|N>>>23,N=0|O+R,v^=N<<13|N>>>19,N=0|v+O,T^=N<<18|N>>>14,N=0|I+S,j^=N<<7|N>>>25,N=0|j+I,E^=N<<9|N>>>23,N=0|E+j,S^=N<<13|N>>>19,N=0|S+E,I^=N<<18|N>>>14,N=0|D+L,A^=N<<7|N>>>25,N=0|A+D,U^=N<<9|N>>>23,N=0|U+A,L^=N<<13|N>>>19,N=0|L+U,D^=N<<18|N>>>14,N=0|x+A,v^=N<<7|N>>>25,N=0|v+x,E^=N<<9|N>>>23,N=0|E+v,A^=N<<13|N>>>19,N=0|A+E,x^=N<<18|N>>>14,N=0|T+B,S^=N<<7|N>>>25,N=0|S+T,U^=N<<9|N>>>23,N=0|U+S,B^=N<<13|N>>>19,N=0|B+U,T^=N<<18|N>>>14,N=0|I+R,L^=N<<7|N>>>25,N=0|L+I,P^=N<<9|N>>>23,N=0|P+L,R^=N<<13|N>>>19,N=0|R+P,I^=N<<18|N>>>14,N=0|D+j,C^=N<<7|N>>>25,N=0|C+D,O^=N<<9|N>>>23,N=0|O+C,j^=N<<13|N>>>19,N=0|j+O,D^=N<<18|N>>>14;e[0]=255&x>>>0,e[1]=255&x>>>8,e[2]=255&x>>>16,e[3]=255&x>>>24,e[4]=255&T>>>0,e[5]=255&T>>>8,e[6]=255&T>>>16,e[7]=255&T>>>24,e[8]=255&I>>>0,e[9]=255&I>>>8,e[10]=255&I>>>16,e[11]=255&I>>>24,e[12]=255&D>>>0,e[13]=255&D>>>8,e[14]=255&D>>>16,e[15]=255&D>>>24,e[16]=255&S>>>0,e[17]=255&S>>>8,e[18]=255&S>>>16,e[19]=255&S>>>24,e[20]=255&U>>>0,e[21]=255&U>>>8,e[22]=255&U>>>16,e[23]=255&U>>>24,e[24]=255&P>>>0,e[25]=255&P>>>8,e[26]=255&P>>>16,e[27]=255&P>>>24,e[28]=255&R>>>0,e[29]=255&R>>>8,e[30]=255&R>>>16,e[31]=255&R>>>24}function crypto_core_salsa20(e,t,r,o){core_salsa20(e,t,r,o)}function crypto_core_hsalsa20(e,t,r,o){core_hsalsa20(e,t,r,o)}function crypto_stream_salsa20_xor(e,t,r,o,a,s,n){var l=new Uint8Array(16),c=new Uint8Array(64),d,p;for(p=0;16>p;p++)l[p]=0;for(p=0;8>p;p++)l[p]=s[p];for(;64<=a;){for(crypto_core_salsa20(c,l,n,g),p=0;64>p;p++)e[t+p]=r[o+p]^c[p];for(d=1,p=8;16>p;p++)d=0|d+(255&l[p]),l[p]=255&d,d>>>=8;a-=64,t+=64,o+=64}if(0c;c++)n[c]=0;for(c=0;8>c;c++)n[c]=o[c];for(;64<=r;){for(crypto_core_salsa20(s,n,a,g),c=0;64>c;c++)e[t+c]=s[c];for(l=1,c=8;16>c;c++)l=0|l+(255&n[c]),n[c]=255&l,l>>>=8;r-=64,t+=64}if(0l;l++)s[l]=o[l+16];return crypto_stream_salsa20(e,t,r,s,n)}function crypto_stream_xor(e,t,r,o,a,l,n){var c=new Uint8Array(32);crypto_core_hsalsa20(c,l,n,g);for(var s=new Uint8Array(8),d=0;8>d;d++)s[d]=l[d+16];return crypto_stream_salsa20_xor(e,t,r,o,a,s,c)}function crypto_onetimeauth(e,t,r,o,a,n){var i=new _(n);return i.update(r,o,a),i.finish(e,t),0}function crypto_onetimeauth_verify(e,t,r,o,a,n){var i=new Uint8Array(16);return crypto_onetimeauth(i,0,r,o,a,n),crypto_verify_16(e,t,i,0)}function crypto_secretbox(e,t,r,o,a){var n;if(32>r)return-1;for(crypto_stream_xor(e,0,t,0,r,o,a),crypto_onetimeauth(e,16,e,32,r-32,e),n=0;16>n;n++)e[n]=0;return 0}function crypto_secretbox_open(e,t,r,o,a){var n=new Uint8Array(32),s;if(32>r)return-1;if(crypto_stream(n,0,32,o,a),0!==crypto_onetimeauth_verify(t,16,t,32,r-32,n))return-1;for(crypto_stream_xor(e,0,t,0,r,o,a),s=0;32>s;s++)e[s]=0;return 0}function set25519(e,t){var r;for(r=0;16>r;r++)e[r]=0|t[r]}function car25519(e){var r=1,o,a;for(o=0;16>o;o++)a=e[o]+r+65535,r=t(a/65536),e[o]=a-65536*r;e[0]+=r-1+37*(r-1)}function sel25519(e,r,o){for(var a=0,n;16>a;a++)n=~(o-1)&(e[a]^r[a]),e[a]^=n,r[a]^=n}function pack25519(e,r){var o=l(),a=l(),t,n,s;for(t=0;16>t;t++)a[t]=r[t];for(car25519(a),car25519(a),car25519(a),n=0;2>n;n++){for(o[0]=a[0]-65517,t=1;15>t;t++)o[t]=a[t]-65535-(1&o[t-1]>>16),o[t-1]&=65535;o[15]=a[15]-32767-(1&o[14]>>16),s=1&o[15]>>16,o[14]&=65535,sel25519(a,o,1-s)}for(t=0;16>t;t++)e[2*t]=255&a[t],e[2*t+1]=a[t]>>8}function neq25519(e,t){var r=new Uint8Array(32),o=new Uint8Array(32);return pack25519(r,e),pack25519(o,t),crypto_verify_32(r,0,o,0)}function par25519(e){var t=new Uint8Array(32);return pack25519(t,e),1&t[0]}function unpack25519(e,t){var r;for(r=0;16>r;r++)e[r]=t[2*r]+(t[2*r+1]<<8);e[15]&=32767}function A(e,t,r){for(var o=0;16>o;o++)e[o]=t[o]+r[o]}function Z(e,t,r){for(var o=0;16>o;o++)e[o]=t[o]-r[o]}function M(e,r,o){var a=0,n=0,i=0,s=0,l=0,d=0,p=0,u=0,h=0,f=0,y=0,b=0,g=0,m=0,_=0,k=0,w=0,x=0,E=0,A=0,B=0,T=0,S=0,U=0,P=0,R=0,I=0,L=0,C=0,O=0,j=0,D=o[0],z=o[1],N=o[2],K=o[3],H=o[4],q=o[5],Y=o[6],M=o[7],F=o[8],W=o[9],G=o[10],V=o[11],X=o[12],J=o[13],Q=o[14],Z=o[15],$,ee;$=r[0],a+=$*D,n+=$*z,i+=$*N,s+=$*K,l+=$*H,d+=$*q,p+=$*Y,u+=$*M,h+=$*F,f+=$*W,y+=$*G,b+=$*V,g+=$*X,m+=$*J,_+=$*Q,k+=$*Z,$=r[1],n+=$*D,i+=$*z,s+=$*N,l+=$*K,d+=$*H,p+=$*q,u+=$*Y,h+=$*M,f+=$*F,y+=$*W,b+=$*G,g+=$*V,m+=$*X,_+=$*J,k+=$*Q,w+=$*Z,$=r[2],i+=$*D,s+=$*z,l+=$*N,d+=$*K,p+=$*H,u+=$*q,h+=$*Y,f+=$*M,y+=$*F,b+=$*W,g+=$*G,m+=$*V,_+=$*X,k+=$*J,w+=$*Q,x+=$*Z,$=r[3],s+=$*D,l+=$*z,d+=$*N,p+=$*K,u+=$*H,h+=$*q,f+=$*Y,y+=$*M,b+=$*F,g+=$*W,m+=$*G,_+=$*V,k+=$*X,w+=$*J,x+=$*Q,E+=$*Z,$=r[4],l+=$*D,d+=$*z,p+=$*N,u+=$*K,h+=$*H,f+=$*q,y+=$*Y,b+=$*M,g+=$*F,m+=$*W,_+=$*G,k+=$*V,w+=$*X,x+=$*J,E+=$*Q,A+=$*Z,$=r[5],d+=$*D,p+=$*z,u+=$*N,h+=$*K,f+=$*H,y+=$*q,b+=$*Y,g+=$*M,m+=$*F,_+=$*W,k+=$*G,w+=$*V,x+=$*X,E+=$*J,A+=$*Q,B+=$*Z,$=r[6],p+=$*D,u+=$*z,h+=$*N,f+=$*K,y+=$*H,b+=$*q,g+=$*Y,m+=$*M,_+=$*F,k+=$*W,w+=$*G,x+=$*V,E+=$*X,A+=$*J,B+=$*Q,T+=$*Z,$=r[7],u+=$*D,h+=$*z,f+=$*N,y+=$*K,b+=$*H,g+=$*q,m+=$*Y,_+=$*M,k+=$*F,w+=$*W,x+=$*G,E+=$*V,A+=$*X,B+=$*J,T+=$*Q,S+=$*Z,$=r[8],h+=$*D,f+=$*z,y+=$*N,b+=$*K,g+=$*H,m+=$*q,_+=$*Y,k+=$*M,w+=$*F,x+=$*W,E+=$*G,A+=$*V,B+=$*X,T+=$*J,S+=$*Q,U+=$*Z,$=r[9],f+=$*D,y+=$*z,b+=$*N,g+=$*K,m+=$*H,_+=$*q,k+=$*Y,w+=$*M,x+=$*F,E+=$*W,A+=$*G,B+=$*V,T+=$*X,S+=$*J,U+=$*Q,P+=$*Z,$=r[10],y+=$*D,b+=$*z,g+=$*N,m+=$*K,_+=$*H,k+=$*q,w+=$*Y,x+=$*M,E+=$*F,A+=$*W,B+=$*G,T+=$*V,S+=$*X,U+=$*J,P+=$*Q,R+=$*Z,$=r[11],b+=$*D,g+=$*z,m+=$*N,_+=$*K,k+=$*H,w+=$*q,x+=$*Y,E+=$*M,A+=$*F,B+=$*W,T+=$*G,S+=$*V,U+=$*X,P+=$*J,R+=$*Q,I+=$*Z,$=r[12],g+=$*D,m+=$*z,_+=$*N,k+=$*K,w+=$*H,x+=$*q,E+=$*Y,A+=$*M,B+=$*F,T+=$*W,S+=$*G,U+=$*V,P+=$*X,R+=$*J,I+=$*Q,L+=$*Z,$=r[13],m+=$*D,_+=$*z,k+=$*N,w+=$*K,x+=$*H,E+=$*q,A+=$*Y,B+=$*M,T+=$*F,S+=$*W,U+=$*G,P+=$*V,R+=$*X,I+=$*J,L+=$*Q,C+=$*Z,$=r[14],_+=$*D,k+=$*z,w+=$*N,x+=$*K,E+=$*H,A+=$*q,B+=$*Y,T+=$*M,S+=$*F,U+=$*W,P+=$*G,R+=$*V,I+=$*X,L+=$*J,C+=$*Q,O+=$*Z,$=r[15],k+=$*D,w+=$*z,x+=$*N,E+=$*K,A+=$*H,B+=$*q,T+=$*Y,S+=$*M,U+=$*F,P+=$*W,R+=$*G,I+=$*V,L+=$*X,C+=$*J,O+=$*Q,j+=$*Z,a+=38*w,n+=38*x,i+=38*E,s+=38*A,l+=38*B,d+=38*T,p+=38*S,u+=38*U,h+=38*P,f+=38*R,y+=38*I,b+=38*L,g+=38*C,m+=38*O,_+=38*j,ee=1,$=a+ee+65535,ee=t($/65536),a=$-65536*ee,$=n+ee+65535,ee=t($/65536),n=$-65536*ee,$=i+ee+65535,ee=t($/65536),i=$-65536*ee,$=s+ee+65535,ee=t($/65536),s=$-65536*ee,$=l+ee+65535,ee=t($/65536),l=$-65536*ee,$=d+ee+65535,ee=t($/65536),d=$-65536*ee,$=p+ee+65535,ee=t($/65536),p=$-65536*ee,$=u+ee+65535,ee=t($/65536),u=$-65536*ee,$=h+ee+65535,ee=t($/65536),h=$-65536*ee,$=f+ee+65535,ee=t($/65536),f=$-65536*ee,$=y+ee+65535,ee=t($/65536),y=$-65536*ee,$=b+ee+65535,ee=t($/65536),b=$-65536*ee,$=g+ee+65535,ee=t($/65536),g=$-65536*ee,$=m+ee+65535,ee=t($/65536),m=$-65536*ee,$=_+ee+65535,ee=t($/65536),_=$-65536*ee,$=k+ee+65535,ee=t($/65536),k=$-65536*ee,a+=ee-1+37*(ee-1),ee=1,$=a+ee+65535,ee=t($/65536),a=$-65536*ee,$=n+ee+65535,ee=t($/65536),n=$-65536*ee,$=i+ee+65535,ee=t($/65536),i=$-65536*ee,$=s+ee+65535,ee=t($/65536),s=$-65536*ee,$=l+ee+65535,ee=t($/65536),l=$-65536*ee,$=d+ee+65535,ee=t($/65536),d=$-65536*ee,$=p+ee+65535,ee=t($/65536),p=$-65536*ee,$=u+ee+65535,ee=t($/65536),u=$-65536*ee,$=h+ee+65535,ee=t($/65536),h=$-65536*ee,$=f+ee+65535,ee=t($/65536),f=$-65536*ee,$=y+ee+65535,ee=t($/65536),y=$-65536*ee,$=b+ee+65535,ee=t($/65536),b=$-65536*ee,$=g+ee+65535,ee=t($/65536),g=$-65536*ee,$=m+ee+65535,ee=t($/65536),m=$-65536*ee,$=_+ee+65535,ee=t($/65536),_=$-65536*ee,$=k+ee+65535,ee=t($/65536),k=$-65536*ee,a+=ee-1+37*(ee-1),e[0]=a,e[1]=n,e[2]=i,e[3]=s,e[4]=l,e[5]=d,e[6]=p,e[7]=u,e[8]=h,e[9]=f,e[10]=y,e[11]=b,e[12]=g,e[13]=m,e[14]=_,e[15]=k}function S(e,t){M(e,t,t)}function inv25519(e,t){var r=l(),o;for(o=0;16>o;o++)r[o]=t[o];for(o=253;0<=o;o--)S(r,r),2!==o&&4!==o&&M(r,r,t);for(o=0;16>o;o++)e[o]=r[o]}function pow2523(e,t){var r=l(),o;for(o=0;16>o;o++)r[o]=t[o];for(o=250;0<=o;o--)S(r,r),1!==o&&M(r,r,t);for(o=0;16>o;o++)e[o]=r[o]}function crypto_scalarmult(t,o,n){var s=new Uint8Array(32),u=new Float64Array(80),h=l(),a=l(),y=l(),c=l(),d=l(),e=l(),f,b;for(b=0;31>b;b++)s[b]=o[b];for(s[31]=64|127&o[31],s[0]&=248,unpack25519(u,n),b=0;16>b;b++)a[b]=u[b],c[b]=h[b]=y[b]=0;for(h[0]=c[0]=1,b=254;0<=b;--b)f=1&s[b>>>3]>>>(7&b),sel25519(h,a,f),sel25519(y,c,f),A(d,h,y),Z(h,h,y),A(y,a,c),Z(a,a,c),S(c,d),S(e,h),M(h,y,h),M(y,a,d),A(d,h,y),Z(h,h,y),S(a,h),Z(y,c,e),M(h,y,p),A(h,h,c),M(y,y,h),M(h,c,e),M(c,a,u),S(a,d),sel25519(h,a,f),sel25519(y,c,f);for(b=0;16>b;b++)u[b+16]=h[b],u[b+32]=y[b],u[b+48]=a[b],u[b+64]=c[b];var g=u.subarray(32),m=u.subarray(16);return inv25519(g,g),M(m,m,g),pack25519(t,m),0}function crypto_scalarmult_base(e,t){return crypto_scalarmult(e,t,i)}function crypto_box_keypair(e,t){return o(t,32),crypto_scalarmult_base(e,t)}function crypto_box_beforenm(e,t,r){var o=new Uint8Array(32);return crypto_scalarmult(o,r,t),crypto_core_hsalsa20(e,a,o,g)}function crypto_hashblocks_hl(e,t,r,o){for(var s=new Int32Array(16),p=new Int32Array(16),u=e[0],f=e[1],y=e[2],g=e[3],m=e[4],_=e[5],k=e[6],w=e[7],v=t[0],E=t[1],A=t[2],B=t[3],T=t[4],S=t[5],U=t[6],P=t[7],R=0,I,L,C,O,D,z,N,K,H,q,Y,M,F,W,G,V,X,J,Q,Z,$,ee,te,re,oe,ae;128<=o;){for(Q=0;16>Q;Q++)Z=8*Q+R,s[Q]=r[Z+0]<<24|r[Z+1]<<16|r[Z+2]<<8|r[Z+3],p[Q]=r[Z+4]<<24|r[Z+5]<<16|r[Z+6]<<8|r[Z+7];for(Q=0;80>Q;Q++)if(I=u,L=f,C=y,O=g,D=m,z=_,N=k,K=w,H=v,q=E,Y=A,M=B,F=T,W=S,G=U,V=P,$=w,ee=P,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=(m>>>14|T<<18)^(m>>>18|T<<14)^(T>>>9|m<<23),ee=(T>>>14|m<<18)^(T>>>18|m<<14)^(m>>>9|T<<23),te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,$=m&_^~m&k,ee=T&S^~T&U,te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,$=x[2*Q],ee=x[2*Q+1],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,$=s[Q%16],ee=p[Q%16],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,X=65535&oe|ae<<16,J=65535&te|re<<16,$=X,ee=J,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=(u>>>28|v<<4)^(v>>>2|u<<30)^(v>>>7|u<<25),ee=(v>>>28|u<<4)^(u>>>2|v<<30)^(u>>>7|v<<25),te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,$=u&f^u&y^f&y,ee=v&E^v&A^E&A,te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,K=65535&oe|ae<<16,V=65535&te|re<<16,$=O,ee=M,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=X,ee=J,te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,O=65535&oe|ae<<16,M=65535&te|re<<16,f=I,y=L,g=C,m=O,_=D,k=z,w=N,u=K,E=H,A=q,B=Y,T=M,S=F,U=W,P=G,v=V,15==Q%16)for(Z=0;16>Z;Z++)$=s[Z],ee=p[Z],te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=s[(Z+9)%16],ee=p[(Z+9)%16],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,X=s[(Z+1)%16],J=p[(Z+1)%16],$=(X>>>1|J<<31)^(X>>>8|J<<24)^X>>>7,ee=(J>>>1|X<<31)^(J>>>8|X<<24)^(J>>>7|X<<25),te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,X=s[(Z+14)%16],J=p[(Z+14)%16],$=(X>>>19|J<<13)^(J>>>29|X<<3)^X>>>6,ee=(J>>>19|X<<13)^(X>>>29|J<<3)^(J>>>6|X<<26),te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,s[Z]=65535&oe|ae<<16,p[Z]=65535&te|re<<16;$=u,ee=v,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=e[0],ee=t[0],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,e[0]=u=65535&oe|ae<<16,t[0]=v=65535&te|re<<16,$=f,ee=E,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=e[1],ee=t[1],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,e[1]=f=65535&oe|ae<<16,t[1]=E=65535&te|re<<16,$=y,ee=A,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=e[2],ee=t[2],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,e[2]=y=65535&oe|ae<<16,t[2]=A=65535&te|re<<16,$=g,ee=B,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=e[3],ee=t[3],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,e[3]=g=65535&oe|ae<<16,t[3]=B=65535&te|re<<16,$=m,ee=T,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=e[4],ee=t[4],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,e[4]=m=65535&oe|ae<<16,t[4]=T=65535&te|re<<16,$=_,ee=S,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=e[5],ee=t[5],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,e[5]=_=65535&oe|ae<<16,t[5]=S=65535&te|re<<16,$=k,ee=U,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=e[6],ee=t[6],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,e[6]=k=65535&oe|ae<<16,t[6]=U=65535&te|re<<16,$=w,ee=P,te=65535&ee,re=ee>>>16,oe=65535&$,ae=$>>>16,$=e[7],ee=t[7],te+=65535&ee,re+=ee>>>16,oe+=65535&$,ae+=$>>>16,re+=te>>>16,oe+=re>>>16,ae+=oe>>>16,e[7]=w=65535&oe|ae<<16,t[7]=P=65535&te|re<<16,R+=128,o-=128}return o}function crypto_hash(e,t,r){var o=new Int32Array(8),a=new Int32Array(8),s=new Uint8Array(256),l=r,c;for(o[0]=1779033703,o[1]=3144134277,o[2]=1013904242,o[3]=2773480762,o[4]=1359893119,o[5]=2600822924,o[6]=528734635,o[7]=1541459225,a[0]=4089235720,a[1]=2227873595,a[2]=4271175723,a[3]=1595750129,a[4]=2917565137,a[5]=725511199,a[6]=4215389547,a[7]=327033209,crypto_hashblocks_hl(o,a,t,r),r%=128,c=0;cr?1:0),s[r-9]=0,ts64(s,r-8,0|l/536870912,l<<3),crypto_hashblocks_hl(o,a,s,r),c=0;8>c;c++)ts64(e,8*c,o[c],a[c]);return 0}function add(r,o){var n=l(),a=l(),i=l(),s=l(),c=l(),e=l(),d=l(),p=l(),u=l();Z(n,r[1],r[0]),Z(u,o[1],o[0]),M(n,n,u),A(a,r[0],r[1]),A(u,o[0],o[1]),M(a,a,u),M(i,r[3],o[3]),M(i,i,y),M(s,r[2],o[2]),A(s,s,s),Z(c,a,n),Z(e,s,i),A(d,s,i),A(p,a,n),M(r[0],c,e),M(r[1],p,d),M(r[2],d,e),M(r[3],c,p)}function cswap(e,t,r){var o;for(o=0;4>o;o++)sel25519(e[o],t[o],r)}function pack(e,t){var r=l(),o=l(),a=l();inv25519(a,t[2]),M(r,t[0],a),M(o,t[1],a),pack25519(e,o),e[31]^=par25519(r)<<7}function scalarmult(e,t,r){var o,a;for(set25519(e[0],n),set25519(e[1],c),set25519(e[2],c),set25519(e[3],n),a=255;0<=a;--a)o=1&r[0|a/8]>>(7&a),cswap(e,t,o),add(t,e),add(e,e),cswap(e,t,o)}function scalarbase(e,t){var r=[l(),l(),l(),l()];set25519(r[0],d),set25519(r[1],h),set25519(r[2],c),M(r[3],d,h),scalarmult(e,r,t)}function crypto_sign_keypair(e,t,r){var a=new Uint8Array(64),n=[l(),l(),l(),l()],s;for(r||o(t,32),crypto_hash(a,t,32),a[0]&=248,a[31]&=127,a[31]|=64,scalarbase(n,a),pack(e,n),s=0;32>s;s++)t[s+32]=e[s];return 0}function modL(e,t){var r,o,a,n;for(o=63;32<=o;--o){for(r=0,a=o-32,n=o-12;a>8,t[a]-=256*r;t[a]+=r,t[o]=0}for(r=0,a=0;32>a;a++)t[a]+=r-(t[31]>>4)*b[a],r=t[a]>>8,t[a]&=255;for(a=0;32>a;a++)t[a]-=r*b[a];for(o=0;32>o;o++)t[o+1]+=t[o]>>8,e[o]=255&t[o]}function reduce(e){var t=new Float64Array(64),r;for(r=0;64>r;r++)t[r]=e[r];for(r=0;64>r;r++)e[r]=0;modL(e,t)}function crypto_sign(e,t,o,a){var n=new Uint8Array(64),s=new Uint8Array(64),c=new Uint8Array(64),r=new Float64Array(64),d=[l(),l(),l(),l()],p,u;crypto_hash(n,a,32),n[0]&=248,n[31]&=127,n[31]|=64;for(p=0;pp;p++)e[32+p]=n[32+p];for(crypto_hash(c,e.subarray(32),o+32),reduce(c),scalarbase(d,c),pack(e,d),p=32;64>p;p++)e[p]=a[p];for(crypto_hash(s,e,o+64),reduce(s),p=0;64>p;p++)r[p]=0;for(p=0;32>p;p++)r[p]=c[p];for(p=0;32>p;p++)for(u=0;32>u;u++)r[p+u]+=s[p]*n[u];return modL(e.subarray(32),r),o+64}function unpackneg(e,r){var o=l(),t=l(),a=l(),i=l(),s=l(),d=l(),p=l();return(set25519(e[2],c),unpack25519(e[1],r),S(a,e[1]),M(i,a,u),Z(a,a,e[2]),A(i,e[2],i),S(s,i),S(d,s),M(p,d,s),M(o,p,a),M(o,o,i),pow2523(o,o),M(o,o,a),M(o,o,i),M(o,o,i),M(e[0],o,i),S(t,e[0]),M(t,t,i),neq25519(t,a)&&M(e[0],e[0],f),S(t,e[0]),M(t,t,i),neq25519(t,a))?-1:(par25519(e[0])===r[31]>>7&&Z(e[0],n,e[0]),M(e[3],e[0],e[1]),0)}function crypto_sign_open(e,r,o,a){var s=new Uint8Array(32),t=new Uint8Array(64),c=[l(),l(),l(),l()],d=[l(),l(),l(),l()],p,u;if(u=-1,64>o)return-1;if(unpackneg(d,a))return-1;for(p=0;pp;p++)e[p+32]=a[p];if(crypto_hash(t,e,o),reduce(t),scalarmult(c,d,t),scalarbase(d,r.subarray(32)),add(c,d),pack(s,c),o-=64,crypto_verify_32(r,0,s,0)){for(p=0;p>>13|r<<3),o=255&e[4]|(255&e[5])<<8,this.r[2]=7939&(r>>>10|o<<6),a=255&e[6]|(255&e[7])<<8,this.r[3]=8191&(o>>>7|a<<9),n=255&e[8]|(255&e[9])<<8,this.r[4]=255&(a>>>4|n<<12),this.r[5]=8190&n>>>1,i=255&e[10]|(255&e[11])<<8,this.r[6]=8191&(n>>>14|i<<2),s=255&e[12]|(255&e[13])<<8,this.r[7]=8065&(i>>>11|s<<5),l=255&e[14]|(255&e[15])<<8,this.r[8]=8191&(s>>>8|l<<8),this.r[9]=127&l>>>5,this.pad[0]=255&e[16]|(255&e[17])<<8,this.pad[1]=255&e[18]|(255&e[19])<<8,this.pad[2]=255&e[20]|(255&e[21])<<8,this.pad[3]=255&e[22]|(255&e[23])<<8,this.pad[4]=255&e[24]|(255&e[25])<<8,this.pad[5]=255&e[26]|(255&e[27])<<8,this.pad[6]=255&e[28]|(255&e[29])<<8,this.pad[7]=255&e[30]|(255&e[31])<<8};_.prototype.blocks=function(e,t,r){for(var o=this.fin?0:2048,a=this.h[0],n=this.h[1],i=this.h[2],s=this.h[3],l=this.h[4],d=this.h[5],p=this.h[6],u=this.h[7],h=this.h[8],f=this.h[9],y=this.r[0],b=this.r[1],g=this.r[2],m=this.r[3],_=this.r[4],k=this.r[5],w=this.r[6],x=this.r[7],v=this.r[8],E=this.r[9],A,B,T,S,U,P,R,I,L,C,O,j,D,z,N,K,H,q,Y;16<=r;)A=255&e[t+0]|(255&e[t+1])<<8,a+=8191&A,B=255&e[t+2]|(255&e[t+3])<<8,n+=8191&(A>>>13|B<<3),T=255&e[t+4]|(255&e[t+5])<<8,i+=8191&(B>>>10|T<<6),S=255&e[t+6]|(255&e[t+7])<<8,s+=8191&(T>>>7|S<<9),U=255&e[t+8]|(255&e[t+9])<<8,l+=8191&(S>>>4|U<<12),d+=8191&U>>>1,P=255&e[t+10]|(255&e[t+11])<<8,p+=8191&(U>>>14|P<<2),R=255&e[t+12]|(255&e[t+13])<<8,u+=8191&(P>>>11|R<<5),I=255&e[t+14]|(255&e[t+15])<<8,h+=8191&(R>>>8|I<<8),f+=I>>>5|o,L=0,C=L,C+=a*y,C+=n*(5*E),C+=i*(5*v),C+=s*(5*x),C+=l*(5*w),L=C>>>13,C&=8191,C+=d*(5*k),C+=p*(5*_),C+=u*(5*m),C+=h*(5*g),C+=f*(5*b),L+=C>>>13,C&=8191,O=L,O+=a*b,O+=n*y,O+=i*(5*E),O+=s*(5*v),O+=l*(5*x),L=O>>>13,O&=8191,O+=d*(5*w),O+=p*(5*k),O+=u*(5*_),O+=h*(5*m),O+=f*(5*g),L+=O>>>13,O&=8191,j=L,j+=a*g,j+=n*b,j+=i*y,j+=s*(5*E),j+=l*(5*v),L=j>>>13,j&=8191,j+=d*(5*x),j+=p*(5*w),j+=u*(5*k),j+=h*(5*_),j+=f*(5*m),L+=j>>>13,j&=8191,D=L,D+=a*m,D+=n*g,D+=i*b,D+=s*y,D+=l*(5*E),L=D>>>13,D&=8191,D+=d*(5*v),D+=p*(5*x),D+=u*(5*w),D+=h*(5*k),D+=f*(5*_),L+=D>>>13,D&=8191,z=L,z+=a*_,z+=n*m,z+=i*g,z+=s*b,z+=l*y,L=z>>>13,z&=8191,z+=d*(5*E),z+=p*(5*v),z+=u*(5*x),z+=h*(5*w),z+=f*(5*k),L+=z>>>13,z&=8191,N=L,N+=a*k,N+=n*_,N+=i*m,N+=s*g,N+=l*b,L=N>>>13,N&=8191,N+=d*y,N+=p*(5*E),N+=u*(5*v),N+=h*(5*x),N+=f*(5*w),L+=N>>>13,N&=8191,K=L,K+=a*w,K+=n*k,K+=i*_,K+=s*m,K+=l*g,L=K>>>13,K&=8191,K+=d*b,K+=p*y,K+=u*(5*E),K+=h*(5*v),K+=f*(5*x),L+=K>>>13,K&=8191,H=L,H+=a*x,H+=n*w,H+=i*k,H+=s*_,H+=l*m,L=H>>>13,H&=8191,H+=d*g,H+=p*b,H+=u*y,H+=h*(5*E),H+=f*(5*v),L+=H>>>13,H&=8191,q=L,q+=a*v,q+=n*x,q+=i*w,q+=s*k,q+=l*_,L=q>>>13,q&=8191,q+=d*m,q+=p*g,q+=u*b,q+=h*y,q+=f*(5*E),L+=q>>>13,q&=8191,Y=L,Y+=a*E,Y+=n*v,Y+=i*x,Y+=s*w,Y+=l*k,L=Y>>>13,Y&=8191,Y+=d*_,Y+=p*m,Y+=u*g,Y+=h*b,Y+=f*y,L+=Y>>>13,Y&=8191,L=0|(L<<2)+L,L=0|L+C,C=8191&L,L>>>=13,O+=L,a=C,n=O,i=j,s=D,l=z,d=N,p=K,u=H,h=q,f=Y,t+=16,r-=16;this.h[0]=a,this.h[1]=n,this.h[2]=i,this.h[3]=s,this.h[4]=l,this.h[5]=d,this.h[6]=p,this.h[7]=u,this.h[8]=h,this.h[9]=f},_.prototype.finish=function(e,t){var r=new Uint16Array(10),o,a,n,s;if(this.leftover){for(s=this.leftover,this.buffer[s++]=1;16>s;s++)this.buffer[s]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(o=this.h[1]>>>13,this.h[1]&=8191,s=2;10>s;s++)this.h[s]+=o,o=this.h[s]>>>13,this.h[s]&=8191;for(this.h[0]+=5*o,o=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=o,o=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=o,r[0]=this.h[0]+5,o=r[0]>>>13,r[0]&=8191,s=1;10>s;s++)r[s]=this.h[s]+o,o=r[s]>>>13,r[s]&=8191;for(r[9]-=8192,a=(1^o)-1,s=0;10>s;s++)r[s]&=a;for(a=~a,s=0;10>s;s++)this.h[s]=this.h[s]&a|r[s];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),n=this.h[0]+this.pad[0],this.h[0]=65535&n,s=1;8>s;s++)n=0|(0|this.h[s]+this.pad[s])+(n>>>16),this.h[s]=65535&n;e[t+0]=255&this.h[0]>>>0,e[t+1]=255&this.h[0]>>>8,e[t+2]=255&this.h[1]>>>0,e[t+3]=255&this.h[1]>>>8,e[t+4]=255&this.h[2]>>>0,e[t+5]=255&this.h[2]>>>8,e[t+6]=255&this.h[3]>>>0,e[t+7]=255&this.h[3]>>>8,e[t+8]=255&this.h[4]>>>0,e[t+9]=255&this.h[4]>>>8,e[t+10]=255&this.h[5]>>>0,e[t+11]=255&this.h[5]>>>8,e[t+12]=255&this.h[6]>>>0,e[t+13]=255&this.h[6]>>>8,e[t+14]=255&this.h[7]>>>0,e[t+15]=255&this.h[7]>>>8},_.prototype.update=function(e,t,r){var o,a;if(this.leftover){for(a=16-this.leftover,a>r&&(a=r),o=0;othis.leftover)return;this.blocks(this.buffer,0,16),this.leftover=0}if(16<=r&&(a=r-r%16,this.blocks(e,t,a),t+=a,r-=a),r){for(o=0;oo.length?null:0===crypto_secretbox_open(a,o,o.length,t,r)?a.subarray(v):null},r.secretbox.keyLength=m,r.secretbox.nonceLength=k,r.secretbox.overheadLength=E,r.scalarMult=function(e,t){if(checkArrayTypes(e,t),e.length!==T)throw new Error("bad n size");if(t.length!==B)throw new Error("bad p size");var r=new Uint8Array(B);return crypto_scalarmult(r,e,t),r},r.scalarMult.base=function(e){if(checkArrayTypes(e),e.length!==T)throw new Error("bad n size");var t=new Uint8Array(B);return crypto_scalarmult_base(t,e),t},r.scalarMult.scalarLength=T,r.scalarMult.groupElementLength=B,r.box=function(e,t,o,a){var n=r.box.before(o,a);return r.secretbox(e,t,n)},r.box.before=function(e,t){checkArrayTypes(e,t),checkBoxLengths(e,t);var r=new Uint8Array(R);return crypto_box_beforenm(r,e,t),r},r.box.after=r.secretbox,r.box.open=function(e,t,o,a){var n=r.box.before(o,a);return r.secretbox.open(e,t,n)},r.box.open.after=r.secretbox.open,r.box.keyPair=function(){var e=new Uint8Array(U),t=new Uint8Array(P);return crypto_box_keypair(e,t),{publicKey:e,secretKey:t}},r.box.keyPair.fromSecretKey=function(e){if(checkArrayTypes(e),e.length!==P)throw new Error("bad secret key size");var t=new Uint8Array(U);return crypto_scalarmult_base(t,e),{publicKey:t,secretKey:new Uint8Array(e)}},r.box.publicKeyLength=U,r.box.secretKeyLength=P,r.box.sharedKeyLength=R,r.box.nonceLength=I,r.box.overheadLength=r.secretbox.overheadLength,r.sign=function(e,t){if(checkArrayTypes(e,t),t.length!==O)throw new Error("bad secret key size");var r=new Uint8Array(L+e.length);return crypto_sign(r,e,e.length,t),r},r.sign.open=function(e,t){if(checkArrayTypes(e,t),t.length!==C)throw new Error("bad public key size");var r=new Uint8Array(e.length),o=crypto_sign_open(r,e,e.length,t);if(0>o)return null;for(var a=new Uint8Array(o),n=0;no;o++)r[o]=e[o];return crypto_sign_keypair(t,r,!0),{publicKey:t,secretKey:r}},r.sign.publicKeyLength=C,r.sign.secretKeyLength=O,r.sign.seedLength=j,r.sign.signatureLength=L,r.hash=function(e){checkArrayTypes(e);var t=new Uint8Array(D);return crypto_hash(t,e,e.length),t},r.hash.hashLength=D,r.verify=function(e,t){return checkArrayTypes(e,t),0!==e.length&&0!==t.length&&e.length===t.length&&0===vn(e,0,t,0,e.length)},r.setPRNG=function(e){o=e},function(){var t="undefined"==typeof self?null:self.crypto||self.msCrypto;if(t&&t.getRandomValues){r.setPRNG(function(e,r){var o=new Uint8Array(r),a;for(a=0;ar)throw Error("Bid amount must be positive and 2^53-1");if(!e(i)||0>i)throw Error("BidID must be positive and 2^53-1");if(!e(l)||0>l)throw Error("auctionID must be positive");Object.assign(this,{bidderKey:t,auctionKey:s,bidAmount:r,maxPrice:n,bidID:i,auctionID:l})}get_obj_for_encoding(){return{bidder:o.from(this.bidderKey.publicKey),cur:this.bidAmount,price:this.maxPrice,id:this.bidID,auc:o.from(this.auctionKey.publicKey),aid:this.auctionID}}signBid(e){const t=n.encode(this.get_obj_for_encoding()),r=o.from(s.concatArrays(this.tag,t)),a=i.sign(r,e);let l={sig:o.from(a),bid:this.get_obj_for_encoding()};return new Uint8Array(n.encode({t:"b",b:l}))}}}}).call(this,t("buffer").Buffer)},{"./encoding/address":51,"./encoding/encoding":52,"./nacl/naclWrappers":56,"./utils/utils":58,buffer:3}],48:[function(e,t,r){(function(r){const o=e("./client");t.exports={Algod:function(e,t="http://r2.algorand.network",a=4180){var n=Number.isInteger;function noteb64ToNote(e){return void 0!==e.noteb64&&(e.note=r.from(e.noteb64,"base64")),e}let s=new o.HTTPClient("X-algo-api-token",e,t,a);this.status=async function(){let e=await s.get("/v1/status");return e.body},this.healthCheck=async function(){let e=await s.get("/health");return e.body},this.statusAfterBlock=async function(e){if(!n(e))throw Error("roundNumber should be an integer");let t=await s.get("/v1/status/wait-for-block-after/"+e);return t.body},this.pendingTransactions=async function(e){if(!n(e))throw Error("maxTxns should be an integer");let t=await s.get("/v1/transactions/pending",{max:e});if(200===t.statusCode)for(var r=0;ro[e])}function toUint11Array(e){function add(e){r=e<>=11,o-=11)}function flush(){o&&t.push(r)}let t=[],r=0,o=0;return e.forEach(add),flush(),t}function toUint8Array(e){function add(e){for(r=e<>=8,o-=8}function flush(){o&&t.push(r)}let t=[],r=0,o=0;return e.forEach(add),flush(),new Uint8Array(t)}const o=e("./wordlists/english"),a=e("../nacl/naclWrappers"),n=Error("failed to decode mnemonic"),i=Error("the mnemonic contains a word that is not in the wordlist");t.exports={mnemonicFromSeed:function(e){if(e.length!==a.SEED_BTYES_LENGTH)throw new RangeError("Seed length must be "+a.SEED_BTYES_LENGTH);const t=toUint11Array(e),r=applyWords(t),o=computeChecksum(e);return r.join(" ")+" "+o},seedFromMnemonic:function(e){const t=e.split(" "),r=t.slice(0,24);for(let t of r)if(-1===o.indexOf(t))throw i;const a=t[t.length-1],s=r.map(e=>o.indexOf(e));let l=toUint8Array(s);if(33!==l.length)throw n;if(0!==l[l.length-1])throw n;l=l.slice(0,l.length-1);const c=computeChecksum(l);if(c===a)return l;throw n},ERROR_FAIL_TO_DECODE_MNEMONIC:n,ERROR_NOT_IN_WORDS_LIST:i}},{"../nacl/naclWrappers":56,"./wordlists/english":55}],55:[function(e,t,r){t.exports=["abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse","access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act","action","actor","actress","actual","adapt","add","addict","address","adjust","admit","adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent","agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert","alien","all","alley","allow","almost","alone","alpha","already","also","alter","always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger","angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique","anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic","area","arena","argue","arm","armed","armor","army","around","arrange","arrest","arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset","assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction","audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake","aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge","bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain","barrel","base","basic","basket","battle","beach","bean","beauty","because","become","beef","before","begin","behave","behind","believe","below","belt","bench","benefit","best","betray","better","between","beyond","bicycle","bid","bike","bind","biology","bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless","blind","blood","blossom","blouse","blue","blur","blush","board","boat","body","boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss","bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread","breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze","broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb","bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy","butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call","calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas","canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry","cart","case","cash","casino","castle","casual","cat","catalog","catch","category","cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century","cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase","chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child","chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle","citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk","clever","click","client","cliff","climb","clinic","clip","clock","clog","close","cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut","code","coffee","coil","coin","collect","color","column","combine","come","comfort","comic","common","company","concert","conduct","confirm","congress","connect","consider","control","convince","cook","cool","copper","copy","coral","core","corn","correct","cost","cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle","craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek","crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial","cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup","cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad","damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal","debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense","define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny","depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk","despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond","diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur","direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance","divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain","donate","donkey","donor","door","dose","double","dove","draft","dragon","drama","drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop","drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf","dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo","ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow","elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody","embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless","endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough","enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip","era","erase","erode","erosion","error","erupt","escape","essay","essence","estate","eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange","excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit","exotic","expand","expect","expire","explain","expose","express","extend","extra","eye","eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame","family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father","fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female","fence","festival","fetch","fever","few","fiber","fiction","field","figure","file","film","filter","final","find","fine","finger","finish","fire","firm","first","fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor","flee","flight","flip","float","flock","floor","flower","fluid","flush","fly","foam","focus","fog","foil","fold","follow","food","foot","force","forest","forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile","frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen","fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy","gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp","gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture","ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance","glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue","goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown","grab","grace","grain","grant","grape","grass","gravity","great","green","grid","grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt","guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy","harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health","heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden","high","hill","hint","hip","hire","history","hobby","hockey","hold","hole","holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital","host","hotel","hour","hover","hub","huge","human","humble","humor","hundred","hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea","identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune","impact","impose","improve","impulse","inch","include","income","increase","index","indicate","indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury","inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install","intact","interest","into","invest","invite","involve","iron","island","isolate","issue","item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel","job","join","joke","journey","joy","judge","juice","jump","jungle","junior","junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney","kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife","knock","know","lab","label","labor","ladder","lady","lake","lamp","language","laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit","layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal","legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level","liar","liberty","library","license","life","lift","light","like","limb","limit","link","lion","liquid","list","little","live","lizard","load","loan","lobster","local","lock","logic","lonely","long","loop","lottery","loud","lounge","love","loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad","magic","magnet","maid","mail","main","major","make","mammal","man","manage","mandate","mango","mansion","manual","maple","marble","march","margin","marine","market","marriage","mask","mass","master","match","material","math","matrix","matter","maximum","maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt","member","memory","mention","menu","mercy","merge","merit","merry","mesh","message","metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor","minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile","model","modify","mom","moment","monitor","monkey","monster","month","moon","moral","more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie","much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual","myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature","near","neck","need","negative","neglect","neither","nephew","nerve","nest","net","network","neutral","never","news","next","nice","night","noble","noise","nominee","noodle","normal","north","nose","notable","note","nothing","notice","novel","now","nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe","obtain","obvious","occur","ocean","october","odor","off","offer","office","often","oil","okay","old","olive","olympic","omit","once","one","onion","online","only","open","opera","opinion","oppose","option","orange","orbit","orchard","order","ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output","outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact","paddle","page","pair","palace","palm","panda","panel","panic","panther","paper","parade","parent","park","parrot","party","pass","patch","path","patient","patrol","pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen","penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo","phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot","pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate","play","please","pledge","pluck","plug","plunge","poem","poet","point","polar","pole","police","pond","pony","pool","popular","portion","position","possible","post","potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare","present","pretty","prevent","price","pride","primary","print","priority","prison","private","prize","problem","process","produce","profit","program","project","promote","proof","property","prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin","punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle","pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit","raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp","ranch","random","range","rapid","rare","rate","rather","raven","raw","razor","ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle","reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release","relief","rely","remain","remember","remind","remove","render","renew","rent","reopen","repair","repeat","replace","report","require","rescue","resemble","resist","resource","response","result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib","ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot","ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket","romance","roof","rookie","room","rose","rotate","rough","round","route","royal","rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness","safe","sail","salad","salmon","salon","salt","salute","same","sample","sand","satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter","scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script","scrub","sea","search","season","seat","second","secret","section","security","seed","seek","segment","select","sell","seminar","senior","sense","sentence","series","service","session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell","sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop","short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side","siege","sight","sign","silent","silk","silly","silver","similar","simple","since","sing","siren","sister","situate","six","size","skate","sketch","ski","skill","skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight","slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth","snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda","soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry","sort","soul","sound","soup","source","south","space","spare","spatial","spawn","speak","special","speed","spell","spend","sphere","spice","spider","spike","spin","spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring","spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp","stand","start","state","stay","steak","steel","stem","step","stereo","stick","still","sting","stock","stomach","stone","stool","story","stove","strategy","street","strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway","success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny","sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey","suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim","swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag","tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi","teach","team","tell","ten","tenant","tennis","tent","term","test","text","thank","that","theme","then","theory","there","they","thing","this","thought","three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber","time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler","toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool","tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist","toward","tower","town","toy","track","trade","traffic","tragic","train","transfer","trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick","trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust","truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle","twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella","unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform","unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade","uphold","upon","upper","upset","urban","urge","usage","use","used","useful","useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van","vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue","verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory","video","view","village","vintage","violin","virtual","virus","visa","visit","visual","vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage","wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash","wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather","web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat","wheel","when","where","whip","whisper","wide","width","wife","wild","will","win","window","wine","wing","wink","winner","winter","wire","wisdom","wise","wish","witness","wolf","woman","wonder","wood","wool","word","work","world","worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year","yellow","you","young","youth","zebra","zero","zone","zoo"]},{}],56:[function(e,t,r){function randomBytes(e){return o.randomBytes(e)}function keyPairFromSeed(e){return o.sign.keyPair.fromSeed(e)}const o=e("tweetnacl"),a=e("js-sha512");t.exports={genericHash:function(e){return a.sha512_256.array(e)},randomBytes,keyPair:function(){let e=randomBytes(o.box.secretKeyLength);return keyPairFromSeed(e)},sign:function(e,t){return o.sign.detached(e,t)},keyPairFromSeed,keyPairFromSecretKey:function(e){return o.sign.keyPair.fromSecretKey(e)}},t.exports.PUBLIC_KEY_LENGTH=o.sign.publicKeyLength,t.exports.SECRET_KEY_LENGTH=o.sign.secretKeyLength,t.exports.HASH_BYTES_LENGTH=32,t.exports.SEED_BTYES_LENGTH=32},{"js-sha512":10,tweetnacl:46}],57:[function(t,r,o){(function(o){const a=t("./encoding/address"),n=t("./encoding/encoding"),i=t("./nacl/naclWrappers"),s=t("./utils/utils"),l=t("hi-base32");r.exports={Transaction:class{constructor({from:t,to:r,fee:n,amount:i,firstRound:s,lastRound:l,note:c,genesisID:d}){if(this.name="Transaction",this.tag=o.from([84,88]),t=a.decode(t),r=a.decode(r),!e(i)||0>i)throw Error("Amount must be a positive number and smaller than 2^53-1");if(!e(n)||0>n)throw Error("fee must be a positive number and smaller than 2^53-1");if(!e(s)||0>s)throw Error("firstRound must be a positive number");if(!e(l)||0>l)throw Error("lastRound must be a positive number");if(void 0!==c&&c.constructor!==Uint8Array)throw Error("note must be a Uint8Array.");Object.assign(this,{from:t,to:r,fee:n,amount:i,firstRound:s,lastRound:l,note:c,genesisID:d})}get_obj_for_encoding(){let e={amt:this.amount,fee:this.fee,fv:this.firstRound,lv:this.lastRound,note:o.from(this.note),rcv:o.from(this.to.publicKey),snd:o.from(this.from.publicKey),type:"pay",gen:this.genesisID};return e.note.length||delete e.note,e.amt||delete e.amt,e.gen||delete e.gen,e}signTxn(e){const t=n.encode(this.get_obj_for_encoding()),r=o.from(s.concatArrays(this.tag,t)),a=i.sign(r,e);let l={sig:o.from(a),txn:this.get_obj_for_encoding()};return new Uint8Array(n.encode(l))}txID(){const e=n.encode(this.get_obj_for_encoding()),t=o.from(s.concatArrays(this.tag,e));return l.encode(i.genericHash(t)).slice(0,52)}}}}).call(this,t("buffer").Buffer)},{"./encoding/address":51,"./encoding/encoding":52,"./nacl/naclWrappers":56,"./utils/utils":58,buffer:3,"hi-base32":6}],58:[function(e,t,r){t.exports={arrayEqual:function(e,t){return!(e.length!==t.length)&&e.every((e,r)=>e===t[r])},concatArrays:function(e,t){let r=new Uint8Array(e.length+t.length);return r.set(e),r.set(t,e.length),r}}},{}]},{},[53])(53)}); \ No newline at end of file diff --git a/wallet/lib/auction.html b/wallet/lib/auction.html deleted file mode 100644 index ab55dc2363..0000000000 --- a/wallet/lib/auction.html +++ /dev/null @@ -1,537 +0,0 @@ - - - Algorand auction - - - - - - - - -

Algorand auction manager

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- algod URL: - - -
- algod port: - - -
- API Token: - - -
- Mnemonic: - - -
- Auction console URL: - - -
- Auction bank URL: - - -
- Bank username: - - -
- -
-
- -
-

algod + auction

- - - - - - - - - - - - - - - - - - - - - -
algod version:
Last round:
Current auction price:
Number of bids:
-
- -
-

bank

- -
- - - - - - - - - - - -
- -
Transfer: - - -
-
- -
-

auction params

- -
-
- -
-

accounts

- -
-
- -
- HTML loaded. -
- - - - - - - - - - \ No newline at end of file diff --git a/wallet/lib/jquery-3.3.1.min.js b/wallet/lib/jquery-3.3.1.min.js deleted file mode 100644 index 4d9b3a2587..0000000000 --- a/wallet/lib/jquery-3.3.1.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" - - - - - -

Algorand wallet manager

- -
- - - - - - - - - - - - -
- algod URL: - - -
- API Token: - - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Agent version:
Last round:
Last consensus version:
Next consensus version:
Round for next version:
Next version supported:
-
- -
- HTML loaded. -
- - - - - -
- -
- -
-
- -
-

Transactions

- - Max number of transactions: - - -
-
-
- - - -