diff --git a/cabal.project b/cabal.project index 8c2f8bcae3..30bdad80c5 100644 --- a/cabal.project +++ b/cabal.project @@ -177,6 +177,3 @@ allow-newer: base16-bytestring:* -- servant does not yet support aeson 2.2 constraints: aeson <2.2 --- this indicates a bug in chainweb-node or pact where code depends on ordering --- of items in hashmap -constraints: hashable <1.4.3 diff --git a/cabal.project.freeze b/cabal.project.freeze index ae905321f5..d90ee5eead 100644 --- a/cabal.project.freeze +++ b/cabal.project.freeze @@ -160,7 +160,7 @@ constraints: any.Boolean ==0.2.4, any.ghc-prim ==0.10.0, any.groups ==0.5.3, any.happy ==1.20.1.1, - any.hashable ==1.4.2.0, + any.hashable ==1.4.3.0, hashable +integer-gmp -random-initial-seed, any.hashes ==0.2.3, hashes -benchmark-cryptonite -openssl-use-pkg-config -test-cryptonite +with-openssl, @@ -321,7 +321,7 @@ constraints: any.Boolean ==0.2.4, any.strict ==0.5, any.strict-concurrency ==0.2.4.3, any.string-conversions ==0.4.0.1, - any.syb ==0.7.2.3, + any.syb ==0.7.2.4, any.tagged ==0.8.7, tagged +deepseq +transformers, any.tasty ==1.4.3, @@ -344,7 +344,7 @@ constraints: any.Boolean ==0.2.4, any.time-compat ==1.9.6.1, time-compat -old-locale, any.time-manager ==0.0.0, - any.tls ==1.7.0, + any.tls ==1.7.1, tls +compat -hans +network, any.tls-session-manager ==0.0.4, any.token-bucket ==0.1.0.1, @@ -403,4 +403,4 @@ constraints: any.Boolean ==0.2.4, yet-another-logger -tbmqueue, any.zlib ==0.6.3.0, zlib -bundled-c-zlib -non-blocking-ffi -pkg-config -index-state: hackage.haskell.org 2023-07-25T17:03:00Z +index-state: hackage.haskell.org 2023-08-01T16:48:53Z diff --git a/src/Chainweb/Version/Utils.hs b/src/Chainweb/Version/Utils.hs index 8148d40bcf..a347d6f197 100644 --- a/src/Chainweb/Version/Utils.hs +++ b/src/Chainweb/Version/Utils.hs @@ -223,9 +223,8 @@ someChainId v = someChainIdAt v maxBound -- chain ids for the chainweb at the given height. -- someChainIdAt :: HasCallStack => HasChainwebVersion v => v -> BlockHeight -> ChainId -someChainIdAt v h = head . toList $ chainIdsAt v h - -- 'head' is guaranteed to succeed because the empty graph isn't a valid chain - -- graph. +someChainIdAt v h = minimum $ chainIdsAt v h + -- guaranteed to succeed because the empty graph isn't a valid chain graph. {-# INLINE someChainIdAt #-} isGraphChange :: HasChainwebVersion v => v -> BlockHeight -> Bool diff --git a/test/Chainweb/Test/Cut/TestBlockDb.hs b/test/Chainweb/Test/Cut/TestBlockDb.hs index d32910ca55..cc8ec944e1 100644 --- a/test/Chainweb/Test/Cut/TestBlockDb.hs +++ b/test/Chainweb/Test/Cut/TestBlockDb.hs @@ -21,7 +21,6 @@ module Chainweb.Test.Cut.TestBlockDb import Control.Concurrent.MVar import Control.Monad.Catch -import Data.Bifunctor (first) import qualified Data.HashMap.Strict as HM import Chainweb.BlockHeader @@ -29,7 +28,7 @@ import Chainweb.BlockHeaderDB import Chainweb.ChainId import Chainweb.Cut import Chainweb.Test.Utils (testRocksDb) -import Chainweb.Test.Cut (GenBlockTime, testMine') +import Chainweb.Test.Cut (GenBlockTime, testMine', MineFailure(BadAdjacents)) import Chainweb.Payload import Chainweb.Payload.PayloadStore import Chainweb.Payload.PayloadStore.RocksDB @@ -64,13 +63,34 @@ mkTestBlockDb cv rdb = do return $! TestBlockDb wdb pdb initCut -- | Add a block. -addTestBlockDb :: TestBlockDb -> Nonce -> GenBlockTime -> ChainId -> PayloadWithOutputs -> IO () +-- +-- Returns False when mining fails due to BadAdjacents, which usually means that +-- the chain is blocked. Retry with another chain! +-- +addTestBlockDb + :: TestBlockDb + -> Nonce + -> GenBlockTime + -> ChainId + -> PayloadWithOutputs + -> IO Bool addTestBlockDb (TestBlockDb wdb pdb cmv) n gbt cid outs = do c <- takeMVar cmv r <- testMine' wdb n gbt (_payloadWithOutputsPayloadHash outs) cid c - (T2 _ c') <- fromEitherM $ first (userError . show) $ r - casInsert pdb outs - putMVar cmv c' + case r of + -- success + Right (T2 _ c') -> do + casInsert pdb outs + putMVar cmv c' + return True + + -- mining failed, probably because chain is blocked + Left BadAdjacents -> do + putMVar cmv c + return False + + -- something went wrong + Left e -> throwM $ userError (show e) -- | Get header for chain on current cut. getParentTestBlockDb :: TestBlockDb -> ChainId -> IO BlockHeader diff --git a/test/Chainweb/Test/Pact/ModuleCacheOnRestart.hs b/test/Chainweb/Test/Pact/ModuleCacheOnRestart.hs index b7c1996396..ff8c40b123 100644 --- a/test/Chainweb/Test/Pact/ModuleCacheOnRestart.hs +++ b/test/Chainweb/Test/Pact/ModuleCacheOnRestart.hs @@ -139,9 +139,9 @@ testCoinbase testCoinbase iobdb = (initPayloadState >> doCoinbase,snapshotCache) where doCoinbase = do - bdb <- liftIO $ iobdb + bdb <- liftIO iobdb pwo <- execNewBlock mempty (ParentHeader genblock) noMiner - liftIO $ addTestBlockDb bdb (Nonce 0) (offsetBlockTime second) testChainId pwo + void $ liftIO $ addTestBlockDb bdb (Nonce 0) (offsetBlockTime second) testChainId pwo nextH <- liftIO $ getParentTestBlockDb bdb testChainId void $ execValidateBlock mempty nextH (payloadWithOutputsToPayloadData pwo) @@ -259,7 +259,7 @@ doNextCoinbase iobdb = do bdb <- liftIO iobdb prevH <- liftIO $ getParentTestBlockDb bdb testChainId pwo <- execNewBlock mempty (ParentHeader prevH) noMiner - liftIO $ addTestBlockDb bdb (Nonce 0) (offsetBlockTime second) testChainId pwo + void $ liftIO $ addTestBlockDb bdb (Nonce 0) (offsetBlockTime second) testChainId pwo nextH <- liftIO $ getParentTestBlockDb bdb testChainId (valPWO, _g) <- execValidateBlock mempty nextH (payloadWithOutputsToPayloadData pwo) return (nextH, valPWO) diff --git a/test/Chainweb/Test/Pact/PactMultiChainTest.hs b/test/Chainweb/Test/Pact/PactMultiChainTest.hs index 3a6436bcb1..72c75549e7 100644 --- a/test/Chainweb/Test/Pact/PactMultiChainTest.hs +++ b/test/Chainweb/Test/Pact/PactMultiChainTest.hs @@ -62,7 +62,6 @@ import Chainweb.Test.TestVersions import Chainweb.Time import Chainweb.Utils import Chainweb.Version -import Chainweb.Version.Utils import Chainweb.WebPactExecutionService import Chainweb.Storage.Table (casLookupM) @@ -71,7 +70,8 @@ testVersion :: ChainwebVersion testVersion = slowForkingCpmTestVersion peterson cid :: ChainId -cid = someChainId testVersion +cid = unsafeChainId 9 + -- several tests in this file expect chain 9 data MultiEnv = MultiEnv { _menvBdb :: !TestBlockDb diff --git a/test/Chainweb/Test/Pact/Utils.hs b/test/Chainweb/Test/Pact/Utils.hs index f77911b0ce..bc9c800ae7 100644 --- a/test/Chainweb/Test/Pact/Utils.hs +++ b/test/Chainweb/Test/Pact/Utils.hs @@ -712,9 +712,11 @@ runCut v bdb pact genTime noncer miner = ph <- ParentHeader <$> getParentTestBlockDb bdb cid pout <- _webPactNewBlock pact miner ph n <- noncer cid - addTestBlockDb bdb n genTime cid pout - h <- getParentTestBlockDb bdb cid - void $ _webPactValidateBlock pact h (payloadWithOutputsToPayloadData pout) + + -- skip this chain if mining fails and retry with the next chain. + whenM (addTestBlockDb bdb n genTime cid pout) $ do + h <- getParentTestBlockDb bdb cid + void $ _webPactValidateBlock pact h (payloadWithOutputsToPayloadData pout) initializeSQLite :: IO SQLiteEnv initializeSQLite = open2 file >>= \case diff --git a/test/golden/empty-block-tests-expected.txt b/test/golden/empty-block-tests-expected.txt index a3db763fca..aec6c1bb09 100644 --- a/test/golden/empty-block-tests-expected.txt +++ b/test/golden/empty-block-tests-expected.txt @@ -1,8 +1,8 @@ results: - coinbase: eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJJa1l3UXpsdFJUVkpNM2RsTFRsR05uRmxSV3RaYldSaWVYQXdUMk5sYUhKZmIwWkpNbXB1YkRVdGQwa2kiLCJsb2dzIjoibFdaVWZjX0dKdGxUUy1LeDAtYm00aXRfSWE5bnNGZG5jZ2NwSE0td091OCIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjd9 + coinbase: eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJJbXRNTUVWWWEyc3lkMlJrVFZkeU1sRkJUVU5YUkRaelFqZHBNR3hPVTFZM2VGWm5XSGN5YWxBelNFMGkiLCJsb2dzIjoibFdaVWZjX0dKdGxUUy1LeDAtYm00aXRfSWE5bnNGZG5jZ2NwSE0td091OCIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjd9 minerData: eyJhY2NvdW50IjoiTm9NaW5lciIsInByZWRpY2F0ZSI6IjwiLCJwdWJsaWMta2V5cyI6W119 - outputsHash: CVJw7e4GM7lv0fTF6UQ_Bh9AskyHw2TWzgRLUyyKRqo - payloadHash: k_2HP1fYNLkKZQfXaijxIVlrN4hoxkG9--s060A9He4 + outputsHash: BRFFHFEHv4IbjOUrIkWgp2N0eU-6mijYqRU1pcGVHJ8 + payloadHash: h490ZOFfkwbnGOFgAtxj8v7B-u2BJiMzmySXUwB2Fq4 transactions: [] transactionsHash: lL9ztEiU-NwzrlTpBbvhT4M1l5Shsht94OwFyhBaFD0 test-group: new-block diff --git a/test/golden/new-block-0-expected.txt b/test/golden/new-block-0-expected.txt index e90059bfad..8da2011f16 100644 --- a/test/golden/new-block-0-expected.txt +++ b/test/golden/new-block-0-expected.txt @@ -1,8 +1,8 @@ results: - coinbase: eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJJa1l3UXpsdFJUVkpNM2RsTFRsR05uRmxSV3RaYldSaWVYQXdUMk5sYUhKZmIwWkpNbXB1YkRVdGQwa2kiLCJsb2dzIjoibFdaVWZjX0dKdGxUUy1LeDAtYm00aXRfSWE5bnNGZG5jZ2NwSE0td091OCIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjd9 + coinbase: eyJnYXMiOjAsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IldyaXRlIHN1Y2NlZWRlZCJ9LCJyZXFLZXkiOiJJbXRNTUVWWWEyc3lkMlJrVFZkeU1sRkJUVU5YUkRaelFqZHBNR3hPVTFZM2VGWm5XSGN5YWxBelNFMGkiLCJsb2dzIjoibFdaVWZjX0dKdGxUUy1LeDAtYm00aXRfSWE5bnNGZG5jZ2NwSE0td091OCIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjd9 minerData: eyJhY2NvdW50IjoiTm9NaW5lciIsInByZWRpY2F0ZSI6IjwiLCJwdWJsaWMta2V5cyI6W119 - outputsHash: 0xwr7re1jD50YtNtdzhIUUL-PEeyhiZ_DKRwVZS-DzE - payloadHash: MeRwZKToHy1mcewCOqHmuETKAt6CNMWntwVPtj6kO9Y + outputsHash: 9ZzMlVJFvUJP7Z--MALWu9r8EKkuvvExTJUZyidk3yM + payloadHash: G3LQ7UEnUBMQBg2-mtICF7i2AKoAp_8tJZs7a8SG0lI transactions: - - eyJoYXNoIjoiSWxGRDdhOVVZT0dXMUJHRUZjYWRwejVUVW1XLVc5ZkJ5NkZIVzYzaXEzayIsInNpZ3MiOlt7InNpZyI6ImYzZTc5Mjc4MGRmNTIwZmVkMjg5MDc3MjllMjI1NTA4NTk2MzJhMzNiMTQzMTM0MDlkOTkyZmRmMjJjNTZlZDEwMzdiZTcxNDYyNWRkMTZmYWI5MmVlNjZhZmQ1MjhiNWViZjEwYWNhZjY2ZjRlZGVmMWM2ZjZjY2Q4OTkxMjA0In1dLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1widGVzdC1hZG1pbi1rZXlzZXRcIjpbXCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJdfSxcImNvZGVcIjpcIihkZWZpbmUta2V5c2V0ICd0ZXN0LWFkbWluIChyZWFkLWtleXNldCBcXFwidGVzdC1hZG1pbi1rZXlzZXRcXFwiKSlcXG5cXG4obmFtZXNwYWNlICdmcmVlKVxcblxcbihtb2R1bGUgdGVzdDEgJ3Rlc3QtYWRtaW5cXG5cXG4gIChkZWZzY2hlbWEgYWNjb3VudFxcbiAgICBiYWxhbmNlOmRlY2ltYWxcXG4gICAgYW1vdW50OmRlY2ltYWxcXG4gICAgZGF0YSlcXG5cXG4gIChkZWZ0YWJsZSBhY2NvdW50czp7YWNjb3VudH0pXFxuXFxuICAoZGVmdW4gY3JlYXRlLWFjY291bnQgKGlkIGluaXQtYmFsKVxcbiAgICAoaW5zZXJ0IGFjY291bnRzIGlkXFxuICAgICAgICAgeyBcXFwiYmFsYW5jZVxcXCI6IGluaXQtYmFsLCBcXFwiYW1vdW50XFxcIjogaW5pdC1iYWwsIFxcXCJkYXRhXFxcIjogXFxcIkNyZWF0ZWQgYWNjb3VudFxcXCIgfSkpXFxuXFxuICAoZGVmdW4gdHJhbnNmZXIgKHNyYyBkZXN0IGFtb3VudClcXG4gICAgXFxcInRyYW5zZmVyIEFNT1VOVCBmcm9tIFNSQyB0byBERVNUIGZvciB1bmVuY3J5cHRlZCBhY2NvdW50c1xcXCJcXG4gICAgKGRlYml0IHNyYyBhbW91bnQgeyBcXFwidHJhbnNmZXItdG9cXFwiOiBkZXN0IH0pXFxuICAgIChjcmVkaXQgZGVzdCBhbW91bnQgeyBcXFwidHJhbnNmZXItZnJvbVxcXCI6IHNyYyB9KSlcXG5cXG4gIChkZWZwYWN0IHBheW1lbnQgKHNyYy1lbnRpdHkgc3JjIGRlc3QtZW50aXR5IGRlc3QgYW1vdW50KVxcbiAgICBcXFwiVHdvLXBoYXNlIGNvbmZpZGVudGlhbCBwYXltZW50LCBzZW5kaW5nIG1vbmV5IGZyb20gU1JDIGF0IFNSQy1FTlRJVFkgdG8gREVTVCBhdCBERVNULUVOVElUWS5cXFwiXFxuXFxuICAgIChzdGVwLXdpdGgtcm9sbGJhY2tcXG4gICAgIHNyYy1lbnRpdHlcXG4gICAgIChsZXQgKChyZXN1bHQgKGRlYml0IHNyYyBhbW91bnQgeyBcXFwidHJhbnNmZXItdG9cXFwiOiBkZXN0LCBcXFwibWVzc2FnZVxcXCI6IFxcXCJTdGFydGluZyBwYWN0XFxcIiB9KSkpXFxuICAgICAgICh5aWVsZCB7IFxcXCJyZXN1bHRcXFwiOiByZXN1bHQsIFxcXCJhbW91bnRcXFwiOiBhbW91bnQsIFxcXCJ0eFxcXCI6IChwYWN0LWlkKSB9KSlcXG4gICAgIChjcmVkaXQgc3JjIGFtb3VudCB7IFxcXCJyb2xsYmFja1xcXCI6IChwYWN0LWlkKSB9KSlcXG5cXG4gICAgKHN0ZXBcXG4gICAgIGRlc3QtZW50aXR5XFxuICAgICAocmVzdW1lIHsgXFxcInJlc3VsdFxcXCI6PSByZXN1bHQsIFxcXCJhbW91bnRcXFwiOj0gZGViaXQtYW1vdW50IH1cXG4gICAgICAgKGNyZWRpdCBkZXN0IGRlYml0LWFtb3VudFxcbiAgICAgICAgICAgICAgIHsgXFxcInRyYW5zZmVyLWZyb21cXFwiOiBzcmMsIFxcXCJkZWJpdC1yZXN1bHRcXFwiOiByZXN1bHQsIFxcXCJ0eFxcXCI6IChwYWN0LWlkKSB9KSkpKVxcblxcbiAgKGRlZnVuIGRlYml0IChhY2N0IGFtb3VudCBkYXRhKVxcbiAgICBcXFwiRGViaXQgQUNDVCBmb3IgQU1PVU5ULCBlbmZvcmNpbmcgcG9zaXRpdmUgYW1vdW50IGFuZCBzdWZmaWNpZW50IGZ1bmRzLCBhbm5vdGF0aW5nIHdpdGggREFUQVxcXCJcXG4gICAgKGVuZm9yY2UtcG9zaXRpdmUgYW1vdW50KVxcbiAgICAod2l0aC1yZWFkIGFjY291bnRzIGFjY3QgeyBcXFwiYmFsYW5jZVxcXCI6PSBiYWxhbmNlIH1cXG4gICAgICAoY2hlY2stYmFsYW5jZSBiYWxhbmNlIGFtb3VudClcXG4gICAgICAodXBkYXRlIGFjY291bnRzIGFjY3RcXG4gICAgICAgICAgICB7IFxcXCJiYWxhbmNlXFxcIjogKC0gYmFsYW5jZSBhbW91bnQpLCBcXFwiYW1vdW50XFxcIjogKC0gYW1vdW50KVxcbiAgICAgICAgICAgICwgXFxcImRhdGFcXFwiOiBkYXRhIH0pKSlcXG5cXG4gIChkZWZ1biBjcmVkaXQgKGFjY3QgYW1vdW50IGRhdGEpXFxuICAgIFxcXCJDcmVkaXQgQUNDVCBmb3IgQU1PVU5ULCBlbmZvcmNpbmcgcG9zaXRpdmUgYW1vdW50XFxcIlxcbiAgICAoZW5mb3JjZS1wb3NpdGl2ZSBhbW91bnQpXFxuICAgICh3aXRoLXJlYWQgYWNjb3VudHMgYWNjdCB7IFxcXCJiYWxhbmNlXFxcIjo9IGJhbGFuY2UgfVxcbiAgICAgICh1cGRhdGUgYWNjb3VudHMgYWNjdFxcbiAgICAgICAgICAgIHsgXFxcImJhbGFuY2VcXFwiOiAoKyBiYWxhbmNlIGFtb3VudCksIFxcXCJhbW91bnRcXFwiOiBhbW91bnRcXG4gICAgICAgICAgICAsIFxcXCJkYXRhXFxcIjogZGF0YSB9KSkpXFxuXFxuXFxuICAoZGVmdW4gcmVhZC1hY2NvdW50IChpZClcXG4gICAgXFxcIlJlYWQgZGF0YSBmb3IgYWNjb3VudCBJRFxcXCJcXG4gICAgKCsgeyBcXFwiYWNjb3VudFxcXCI6IGlkIH0gKHJlYWQgYWNjb3VudHMgaWQpKSlcXG5cXG4gIChkZWZ1biBjaGVjay1iYWxhbmNlIChiYWxhbmNlIGFtb3VudClcXG4gICAgKGVuZm9yY2UgKDw9IGFtb3VudCBiYWxhbmNlKSBcXFwiSW5zdWZmaWNpZW50IGZ1bmRzXFxcIikpXFxuXFxuICAoZGVmdW4gZW5mb3JjZS1wb3NpdGl2ZSAoYW1vdW50KVxcbiAgICAoZW5mb3JjZSAoPj0gYW1vdW50IDAuMCkgXFxcImFtb3VudCBtdXN0IGJlIHBvc2l0aXZlXFxcIikpXFxuXFxuIChkZWZ1biByZWFkLWFsbCAoKVxcbiAgIChtYXAgKHJlYWQtYWNjb3VudCkgKGtleXMgYWNjb3VudHMpKSlcXG5cXG4gKGRlZnVuIHJlYWQtYWxsLWdsb2JhbCAoKVxcbiAgIChtYXAgKHJlYWQtYWNjb3VudCkgW1xcXCJBY2N0MVxcXCIgXFxcIkFjY3QyXFxcIl0pKVxcblxcbiAoZGVmdW4gY3JlYXRlLWdsb2JhbC1hY2NvdW50cyAoKVxcbiAgIChjcmVhdGUtYWNjb3VudCBcXFwiQWNjdDFcXFwiIDEwMDAwMDAuMClcXG4gICAoY3JlYXRlLWFjY291bnQgXFxcIkFjY3QyXFxcIiAwLjApXFxuICAgKHJlYWQtYWxsKSlcXG5cXG4gKGRlZnBhY3QgY3JlYXRlLXByaXZhdGUtYWNjb3VudHMgKClcXG4gICAoc3RlcCBcXFwiQWxpY2VcXFwiIChjcmVhdGUtYWNjb3VudCBcXFwiQVxcXCIgMTAwMC4wKSlcXG4gICAoc3RlcCBcXFwiQm9iXFxcIiAoY3JlYXRlLWFjY291bnQgXFxcIkJcXFwiIDEwMDAuMCkpXFxuICAgKHN0ZXAgXFxcIkNhcm9sXFxcIiAoY3JlYXRlLWFjY291bnQgXFxcIkNcXFwiIDEwMDAuMCkpXFxuICAgKHN0ZXAgXFxcIkRpbmVzaFxcXCIgKGNyZWF0ZS1hY2NvdW50IFxcXCJEXFxcIiAxMDAwLjApKSlcXG5cXG4pXFxuXCJ9fSxcInNpZ25lcnNcIjpbe1wicHViS2V5XCI6XCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJ9XSxcIm1ldGFcIjp7XCJjcmVhdGlvblRpbWVcIjowLFwidHRsXCI6MTAwMDAwMCxcImdhc0xpbWl0XCI6MTAwMDAsXCJjaGFpbklkXCI6XCIwXCIsXCJnYXNQcmljZVwiOjEuMGUtMixcInNlbmRlclwiOlwic2VuZGVyMDBcIn0sXCJub25jZVwiOlwiMTBcIn0ifQ - eyJnYXMiOjY0OSwicmVzdWx0Ijp7InN0YXR1cyI6InN1Y2Nlc3MiLCJkYXRhIjoiTG9hZGVkIG1vZHVsZSBmcmVlLnRlc3QxLCBoYXNoIEI2WkpnZldENW9iUEdtWWNfaVJLaXJETVA2LVVHbTJwVVY3bXRIRC1Sc1EifSwicmVxS2V5IjoiSWxGRDdhOVVZT0dXMUJHRUZjYWRwejVUVW1XLVc5ZkJ5NkZIVzYzaXEzayIsImxvZ3MiOiJMRm51NzRDaE4wZS1IbGI3azlqZlAzcmpmcWh6WjFweUpibXpkX1lOMFdZIiwibWV0YURhdGEiOm51bGwsImNvbnRpbnVhdGlvbiI6bnVsbCwidHhJZCI6MTF9 @@ -13,7 +13,7 @@ results: - - eyJoYXNoIjoicFBrLWxFUE1jRnRDWXdXR2ZaejV2bGdzZ1ZYV3dYbXhmQVJ6bkFCbUVONCIsInNpZ3MiOlt7InNpZyI6IjM3YjI4MmY1YWQ0YWY0Yzk2YmE1NzA5YWEzOTI2NTU1YjU5MDEwYzczZmVmZTUwNzQyMGYyODVjZTI1MmQ5ZjM1YzQ5NjAxYTgwMDYxZGU2NzEzNTcxNzY2MTNmODIyODQxMDU0MjliZTVkOTEzNWMzODAxMzcyN2UyMmI3ZjA2In1dLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1widGVzdC1hZG1pbi1rZXlzZXRcIjpbXCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJdfSxcImNvZGVcIjpcIihmcmVlLnRlc3QxLnRyYW5zZmVyIFxcXCJBY2N0MVxcXCIgXFxcIkFjY3QyXFxcIiAxLjAwKVwifX0sXCJzaWduZXJzXCI6W3tcInB1YktleVwiOlwiMzY4ODIwZjgwYzMyNGJiYzdjMmIwNjEwNjg4YTdkYTQzZTM5ZjkxZDExODczMjY3MWNkOWM3NTAwZmY0M2NjYVwifV0sXCJtZXRhXCI6e1wiY3JlYXRpb25UaW1lXCI6MCxcInR0bFwiOjEwMDAwMDAsXCJnYXNMaW1pdFwiOjEwMDAwLFwiY2hhaW5JZFwiOlwiMFwiLFwiZ2FzUHJpY2VcIjoxLjBlLTIsXCJzZW5kZXJcIjpcInNlbmRlcjAwXCJ9LFwibm9uY2VcIjpcIjEzXCJ9In0 - eyJnYXMiOjQwNywicmVzdWx0Ijp7InN0YXR1cyI6InN1Y2Nlc3MiLCJkYXRhIjoiV3JpdGUgc3VjY2VlZGVkIn0sInJlcUtleSI6InBQay1sRVBNY0Z0Q1l3V0dmWno1dmxnc2dWWFd3WG14ZkFSem5BQm1FTjQiLCJsb2dzIjoib3hWd2tvU21xM2JZeVh5aHYwT0V3ZTN2c0tGbWlkRTBtTEotQ2FZWVhRayIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjIwfQ - - eyJoYXNoIjoiX2RneUxfSGtlZGJFZjl5UTY5Wkhhc2g2M01JVUw2ZktibzBqeXJJRWhPYyIsInNpZ3MiOlt7InNpZyI6IjZhODRiMWRkNGFkNDE5ZGY3YThhODA4NGYwNWEyZDM5YzExNTBmMjI5ZTM3OTFlM2UwY2E0OTkyZDkwNGNhOGVlMTk4MTljNTE3YTVjNjM5M2E3ZmYyNWI1NjdiNjJjOTYwZTFiYmI4ZTE2YjZiMWU2YmRkNDU1Njk3ODc1MDA5In1dLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1widGVzdC1hZG1pbi1rZXlzZXRcIjpbXCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJdfSxcImNvZGVcIjpcIihhdCAncHJldi1ibG9jay1oYXNoIChjaGFpbi1kYXRhKSlcIn19LFwic2lnbmVyc1wiOlt7XCJwdWJLZXlcIjpcIjM2ODgyMGY4MGMzMjRiYmM3YzJiMDYxMDY4OGE3ZGE0M2UzOWY5MWQxMTg3MzI2NzFjZDljNzUwMGZmNDNjY2FcIn1dLFwibWV0YVwiOntcImNyZWF0aW9uVGltZVwiOjAsXCJ0dGxcIjoxMDAwMDAwLFwiZ2FzTGltaXRcIjoxMDAwMCxcImNoYWluSWRcIjpcIjBcIixcImdhc1ByaWNlXCI6MS4wZS0yLFwic2VuZGVyXCI6XCJzZW5kZXIwMFwifSxcIm5vbmNlXCI6XCIxNFwifSJ9 - - eyJnYXMiOjcsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6IkRoVzNJa1VOMTJ0bXAzWGt5d3lnSk5lLTNXZDl5dUNFTHdRX2lIYnM2V2cifSwicmVxS2V5IjoiX2RneUxfSGtlZGJFZjl5UTY5Wkhhc2g2M01JVUw2ZktibzBqeXJJRWhPYyIsImxvZ3MiOiJUVVVlWFJmRFlnQlZTdjFZU0ktU3lfRVdtcHRaWXZqQlNmY1ZMc2ZzcVpVIiwibWV0YURhdGEiOm51bGwsImNvbnRpbnVhdGlvbiI6bnVsbCwidHhJZCI6MjN9 + - eyJnYXMiOjcsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6ImdqTmVmdmM3STRpblNOOUxFZkVCN0c0OUlvWC0ycGxEQmVUbFpwU1czQTQifSwicmVxS2V5IjoiX2RneUxfSGtlZGJFZjl5UTY5Wkhhc2g2M01JVUw2ZktibzBqeXJJRWhPYyIsImxvZ3MiOiJUVVVlWFJmRFlnQlZTdjFZU0ktU3lfRVdtcHRaWXZqQlNmY1ZMc2ZzcVpVIiwibWV0YURhdGEiOm51bGwsImNvbnRpbnVhdGlvbiI6bnVsbCwidHhJZCI6MjN9 - - eyJoYXNoIjoiTzhoWU1TVUhnSkNPRXFoTy0yRFRNRGJhTzBIZmx6VjM0UHRzM0dlUHBJUSIsInNpZ3MiOlt7InNpZyI6ImMxYjQ5OTQwNTQ0MjZmNzE2NWM2NmZjNjY0MzE0N2M1N2QxYTczYzM3NjEwMjU4OGU0M2QyMzA1ZjBhY2FhYTQyMDRkZGRmNGRhMWFiMzk0OTdkY2FiM2FjZWU1NmQ0NmQ3NzJkNDZkNjAyNmU5ZjQ4MGFmMWNiMWIyNWFmYzA3In1dLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1widGVzdC1hZG1pbi1rZXlzZXRcIjpbXCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJdfSxcImNvZGVcIjpcIihhdCAnYmxvY2stdGltZSAoY2hhaW4tZGF0YSkpXCJ9fSxcInNpZ25lcnNcIjpbe1wicHViS2V5XCI6XCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJ9XSxcIm1ldGFcIjp7XCJjcmVhdGlvblRpbWVcIjowLFwidHRsXCI6MTAwMDAwMCxcImdhc0xpbWl0XCI6MTAwMDAsXCJjaGFpbklkXCI6XCIwXCIsXCJnYXNQcmljZVwiOjEuMGUtMixcInNlbmRlclwiOlwic2VuZGVyMDBcIn0sXCJub25jZVwiOlwiMTVcIn0ifQ - eyJnYXMiOjcsInJlc3VsdCI6eyJzdGF0dXMiOiJzdWNjZXNzIiwiZGF0YSI6eyJ0aW1lIjoiMTk3MC0wMS0wMVQwMDowMDowMFoifX0sInJlcUtleSI6Ik84aFlNU1VIZ0pDT0VxaE8tMkRUTURiYU8wSGZselYzNFB0czNHZVBwSVEiLCJsb2dzIjoidTdKNDU3dGdzNDJ1dGhjOU1TbWtkaTkxT2tUb2FCNFpGei1QUWtSajJhdyIsIm1ldGFEYXRhIjpudWxsLCJjb250aW51YXRpb24iOm51bGwsInR4SWQiOjI2fQ - - eyJoYXNoIjoiSGFsbTJLYUV5Qm5weXJqMkxHMmJQcVZDUmZBYk8yWHZzZWlnaURaZElLOCIsInNpZ3MiOlt7InNpZyI6ImI0MDNlZWI3ODI0NzA0OWU0NjEzNGQzYWQ0MWZlMTAwNWMxM2I0NzNhNjUzZGNmNTVlN2ZmMzIzOGU5N2VkYmRmZTMyZmFmODczODViYTc0MmNmMDFmYmFkMDU2ODEwNWVjNDhhMDk1MzIyNWJmMmY0ODJjNjhiMjkyZGNmOTAzIn1dLCJjbWQiOiJ7XCJuZXR3b3JrSWRcIjpudWxsLFwicGF5bG9hZFwiOntcImV4ZWNcIjp7XCJkYXRhXCI6e1widGVzdC1hZG1pbi1rZXlzZXRcIjpbXCIzNjg4MjBmODBjMzI0YmJjN2MyYjA2MTA2ODhhN2RhNDNlMzlmOTFkMTE4NzMyNjcxY2Q5Yzc1MDBmZjQzY2NhXCJdfSxcImNvZGVcIjpcIihhdCAnYmxvY2staGVpZ2h0IChjaGFpbi1kYXRhKSlcIn19LFwic2lnbmVyc1wiOlt7XCJwdWJLZXlcIjpcIjM2ODgyMGY4MGMzMjRiYmM3YzJiMDYxMDY4OGE3ZGE0M2UzOWY5MWQxMTg3MzI2NzFjZDljNzUwMGZmNDNjY2FcIn1dLFwibWV0YVwiOntcImNyZWF0aW9uVGltZVwiOjAsXCJ0dGxcIjoxMDAwMDAwLFwiZ2FzTGltaXRcIjoxMDAwMCxcImNoYWluSWRcIjpcIjBcIixcImdhc1ByaWNlXCI6MS4wZS0yLFwic2VuZGVyXCI6XCJzZW5kZXIwMFwifSxcIm5vbmNlXCI6XCIxNlwifSJ9