Skip to content
This repository has been archived by the owner on Jul 5, 2024. It is now read-only.

Commit

Permalink
Removed constructedLeaf; some cleaning
Browse files Browse the repository at this point in the history
  • Loading branch information
miha-stopar committed Apr 23, 2024
1 parent 641ef3d commit b7b8aa1
Show file tree
Hide file tree
Showing 28 changed files with 361 additions and 312 deletions.
6 changes: 4 additions & 2 deletions geth-utils/gethutil/mpt/witness/branch.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ func prepareBranchNode(branch1, branch2, extNode1, extNode2, extListRlpBytes []b
// getNibbles returns the nibbles of the leaf or extension node.
func getNibbles(leafKeyRow []byte) []byte {
var nibbles []byte
if leafKeyRow[0] != 248 {
if leafKeyRow[0] < 248 {
var keyLen int
if leafKeyRow[1] > 128 {
keyLen = int(leafKeyRow[1] - 128)
Expand All @@ -175,7 +175,7 @@ func getNibbles(leafKeyRow []byte) []byte {
keyLen = 1
nibbles = append(nibbles, leafKeyRow[1]-16)
}
} else {
} else if leafKeyRow[0] == 248 {
keyLen := int(leafKeyRow[2] - 128)
if (leafKeyRow[3] != 32) && (leafKeyRow[3] != 0) { // second term is for extension node
if leafKeyRow[3] < 32 { // extension node
Expand All @@ -191,6 +191,8 @@ func getNibbles(leafKeyRow []byte) []byte {
nibbles = append(nibbles, n1)
nibbles = append(nibbles, n2)
}
} else {
panic("Not supported yet.")
}

return nibbles
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2378,6 +2378,13 @@ func TestStorageWrongExtensionNode(t *testing.T) {
}

func TestStorageWrongExtensionNode1(t *testing.T) {
// This test slightly differs from TestStorageWrongExtensionNode in key3 -
// TestStorageWrongExtensionNode:
// key3 := common.HexToHash("0x1277000000000000000000000000000000000000000000000000000000000000")
// TestStorageWrongExtensionNode1:
// key3 := common.HexToHash("0x01277000000000000000000000000000000000000000000000000000000000000")
// This is to test different scenarios in the computation of the nibbles RLC in the circuit.

blockNum := 0
blockNumberParent := big.NewInt(int64(blockNum))
blockHeaderParent := oracle.PrefetchBlock(blockNumberParent, true, nil)
Expand Down
38 changes: 11 additions & 27 deletions geth-utils/gethutil/mpt/witness/leaf.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ func getStorageRootCodeHashValue(leaf []byte, storageStart int) ([]byte, []byte)
return storageRootValue, codeHashValue
}

func prepareAccountLeafNode(addr common.Address, addrh []byte, leafS, leafC, constructedLeaf, neighbourNode, addressNibbles []byte, isPlaceholder, isSModExtension, isCModExtension bool) Node {
func prepareAccountLeafNode(addr common.Address, addrh []byte, leafS, leafC, neighbourNode, addressNibbles []byte, isPlaceholder, isSModExtension, isCModExtension bool) Node {
// For non existing account proof there are two cases:
// 1. A leaf is returned that is not at the required address (wrong leaf).
// 2. A branch is returned as the last element of getProof and
Expand Down Expand Up @@ -176,10 +176,6 @@ func prepareAccountLeafNode(addr common.Address, addrh []byte, leafS, leafC, con

wrongLeaf := leafC
wrongLen := keyLenC
if constructedLeaf != nil {
wrongLeaf = constructedLeaf
wrongLen = int(constructedLeaf[2]) - 128
}

offset := 0
nibblesNum := (wrongLen - 1) * 2
Expand Down Expand Up @@ -334,7 +330,7 @@ func prepareLeafAndPlaceholderNode(addr common.Address, addrh []byte, proof1, pr

// When generating a proof that account doesn't exist, the length of both proofs is the same (doesn't reach
// this code).
return prepareAccountLeafNode(addr, addrh, leafS, leafC, nil, nil, key, false, isSModExtension, isCModExtension)
return prepareAccountLeafNode(addr, addrh, leafS, leafC, nil, key, false, isSModExtension, isCModExtension)
} else {
var leaf []byte
isSPlaceholder := false
Expand All @@ -348,7 +344,7 @@ func prepareLeafAndPlaceholderNode(addr common.Address, addrh []byte, proof1, pr
isSPlaceholder = true
}

return prepareStorageLeafNode(leaf, leaf, nil, nil, storage_key, key, false, isSPlaceholder, isCPlaceholder, isSModExtension, isCModExtension)
return prepareStorageLeafNode(leaf, leaf, nil, storage_key, key, false, isSPlaceholder, isCPlaceholder, isSModExtension, isCModExtension)
}
}

Expand Down Expand Up @@ -394,7 +390,7 @@ func prepareAccountLeafPlaceholderNode(addr common.Address, addrh, key []byte, k
leaf[4+i] = remainingNibbles[2*i+offset]*16 + remainingNibbles[2*i+1+offset]
}

node := prepareAccountLeafNode(addr, addrh, leaf, leaf, nil, nil, key, true, false, false)
node := prepareAccountLeafNode(addr, addrh, leaf, leaf, nil, key, true, false, false)

node.Account.ValueRlpBytes[0][0] = 184
node.Account.ValueRlpBytes[0][1] = 70
Expand Down Expand Up @@ -423,7 +419,7 @@ func prepareStorageLeafPlaceholderNode(storage_key common.Hash, key []byte, keyI
keyLen := getLeafKeyLen(keyIndex)
leaf[0] = 192 + 1 + byte(keyLen) + 1

return prepareStorageLeafNode(leaf, leaf, nil, nil, storage_key, key, false, true, true, false, false)
return prepareStorageLeafNode(leaf, leaf, nil, storage_key, key, false, true, true, false, false)
}

func prepareStorageLeafInfo(row []byte, valueIsZero, isPlaceholder bool) ([]byte, []byte, []byte, []byte) {
Expand Down Expand Up @@ -509,7 +505,7 @@ func prepareStorageLeafInfo(row []byte, valueIsZero, isPlaceholder bool) ([]byte
return key, value, keyRlp, valueRlp
}

func prepareStorageLeafNode(leafS, leafC, constructedLeaf, neighbourNode []byte, storage_key common.Hash, key []byte, nonExistingStorageProof, isSPlaceholder, isCPlaceholder, isSModExtension, isCModExtension bool) Node {
func prepareStorageLeafNode(leafS, leafC, neighbourNode []byte, storage_key common.Hash, key []byte, nonExistingStorageProof, isSPlaceholder, isCPlaceholder, isSModExtension, isCModExtension bool) Node {
var rows [][]byte

keyS, valueS, listRlpBytes1, valueRlpBytes1 := prepareStorageLeafInfo(leafS, false, isSPlaceholder)
Expand Down Expand Up @@ -540,11 +536,7 @@ func prepareStorageLeafNode(leafS, leafC, constructedLeaf, neighbourNode []byte,
var nonExistingStorageRow []byte
var wrongRlpBytes []byte
if nonExistingStorageProof {
if constructedLeaf != nil {
wrongRlpBytes, nonExistingStorageRow = prepareNonExistingStorageRow(constructedLeaf, key)
} else {
wrongRlpBytes, nonExistingStorageRow = prepareNonExistingStorageRow(leafC, key)
}
wrongRlpBytes, nonExistingStorageRow = prepareNonExistingStorageRow(leafC, key)
} else {
nonExistingStorageRow = prepareEmptyNonExistingStorageRow()
}
Expand Down Expand Up @@ -584,12 +576,8 @@ func equipLeafWithWrongExtension(leafNode Node, keyMiddle, keyAfter, nibblesMidd
l := len(leafNode.Values)
leafNode.Values[l-modifiedExtensionNodeRowLen] = keyMiddle
startNibblePos := 2 // we don't need any nibbles for case keyLen = 1
if len(keyMiddle) > 1 {
if len(nibblesMiddle)%2 == 0 {
startNibblePos = 1
} else {
startNibblePos = 2
}
if len(keyMiddle) > 1 && len(nibblesMiddle)%2 == 0 {
startNibblePos = 1
}
ind := 0
for j := startNibblePos; j < len(nibblesMiddle); j += 2 {
Expand All @@ -599,12 +587,8 @@ func equipLeafWithWrongExtension(leafNode Node, keyMiddle, keyAfter, nibblesMidd

leafNode.Values[l-modifiedExtensionNodeRowLen+3] = keyAfter
startNibblePos = 2 // we don't need any nibbles for case keyLen = 1
if len(keyAfter) > 1 {
if len(nibblesAfter)%2 == 0 {
startNibblePos = 1
} else {
startNibblePos = 2
}
if len(keyAfter) > 1 && len(nibblesAfter)%2 == 0 {
startNibblePos = 1
}
ind = 0
for j := startNibblePos; j < len(nibblesAfter); j += 2 {
Expand Down
12 changes: 6 additions & 6 deletions geth-utils/gethutil/mpt/witness/prepare_witness.go
Original file line number Diff line number Diff line change
Expand Up @@ -397,9 +397,9 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh []
l := len(proof1)
var node Node
if isAccountProof {
node = prepareAccountLeafNode(addr, addrh, proof1[l-1], proof2[l-1], nil, nil, key, false, false, false)
node = prepareAccountLeafNode(addr, addrh, proof1[l-1], proof2[l-1], nil, key, false, false, false)
} else {
node = prepareStorageLeafNode(proof1[l-1], proof2[l-1], nil, nil, storage_key, key, nonExistingStorageProof, false, false, false, false)
node = prepareStorageLeafNode(proof1[l-1], proof2[l-1], nil, storage_key, key, nonExistingStorageProof, false, false, false, false)
}

nodes = append(nodes, node)
Expand Down Expand Up @@ -447,7 +447,7 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh []
if isAccountProof {
// Add account leaf after branch placeholder:
if !isModifiedExtNode {
leafNode = prepareAccountLeafNode(addr, addrh, proof1[len1-1], proof2[len2-1], nil, neighbourNode, key, false, false, false)
leafNode = prepareAccountLeafNode(addr, addrh, proof1[len1-1], proof2[len2-1], neighbourNode, key, false, false, false)
} else {
isSModExtension := false
isCModExtension := false
Expand All @@ -461,7 +461,7 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh []
} else {
// Add storage leaf after branch placeholder
if !isModifiedExtNode {
leafNode = prepareStorageLeafNode(proof1[len1-1], proof2[len2-1], nil, neighbourNode, storage_key, key, nonExistingStorageProof, false, false, false, false)
leafNode = prepareStorageLeafNode(proof1[len1-1], proof2[len2-1], neighbourNode, storage_key, key, nonExistingStorageProof, false, false, false, false)
} else {
isSModExtension := false
isCModExtension := false
Expand Down Expand Up @@ -541,7 +541,7 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh []

if isAccountProof {
dummyLeaf := []byte{248, 108, 157, 52, 45, 53, 199, 120, 18, 165, 14, 109, 22, 4, 141, 198, 233, 128, 219, 44, 247, 218, 241, 231, 2, 206, 125, 246, 58, 246, 15, 3, 184, 76, 248, 74, 4, 134, 85, 156, 208, 108, 8, 0, 160, 86, 232, 31, 23, 27, 204, 85, 166, 255, 131, 69, 230, 146, 192, 248, 110, 91, 72, 224, 27, 153, 108, 173, 192, 1, 98, 47, 181, 227, 99, 180, 33, 160, 197, 210, 70, 1, 134, 247, 35, 60, 146, 126, 125, 178, 220, 199, 3, 192, 229, 0, 182, 83, 202, 130, 39, 59, 123, 250, 216, 4, 93, 133, 164, 112}
node := prepareAccountLeafNode(addr, addrh, dummyLeaf, dummyLeaf, dummyLeaf, nil, addr_nibbles, false, false, false)
node := prepareAccountLeafNode(addr, addrh, dummyLeaf, dummyLeaf, nil, addr_nibbles, false, false, false)
node = equipLeafWithWrongExtension(node, keyMiddle, keyAfter, nibblesMiddle, nibblesAfter)
nodes = append(nodes, node)
} else {
Expand All @@ -554,7 +554,7 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh []
dummyLeaf := append([]byte{rlp1, rlp2}, compact...)
// Add dummy value:
dummyLeaf = append(dummyLeaf, 0)
node := prepareStorageLeafNode(dummyLeaf, dummyLeaf, dummyLeaf, nil, storage_key, key, nonExistingStorageProof, false, false, false, false)
node := prepareStorageLeafNode(dummyLeaf, dummyLeaf, nil, storage_key, key, nonExistingStorageProof, false, false, false, false)
node = equipLeafWithWrongExtension(node, keyMiddle, keyAfter, nibblesMiddle, nibblesAfter)
nodes = append(nodes, node)
}
Expand Down
16 changes: 8 additions & 8 deletions zkevm-circuits/src/mpt_circuit/tests/AccountAfterFirstLevel.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
"storage": null,
"mod_extension": null,
"values": [
"a0468d1a8b37720df40231d2a87c72b2ba41b6083102bf9dea6376d06129d33ae900",
"a0f27607e62c4a7a95dd1d5d63a72a129b1e42d14a59421045d8c11c29c7f8f70900"
"a06515b1a21d53e95962386ef49edeeebbbeba1fcf5cc17a7924fceae0eab2042c00",
"a0fd63dc2c9955d1eb90703a120d97be9ed6a7c438241194fa0be3bca04f1e8d7700"
],
"keccak_data": []
},
Expand All @@ -34,8 +34,8 @@
"modified_index": 15,
"drifted_index": 15,
"list_rlp_bytes": [
"f90111",
"f90131"
"f90131",
"f90151"
]
}
},
Expand All @@ -44,7 +44,7 @@
"mod_extension": null,
"values": [
"a0a47179bacb2563d64a4da3bfd1a3afc4e15e58cb7671232a1393aa56e84e210700",
"80000000000000000000000000000000000000000000000000000000000000000000",
"a0b3c64a7e62c44e6d2f9abc6dfb6852bb61032d087db6d57aa3c7497493adda2a00",
"a0ab8cdb808c8303bb61fb48e276217be9770fa83ecf3f90f2234d558885f5abf100",
"80000000000000000000000000000000000000000000000000000000000000000000",
"80000000000000000000000000000000000000000000000000000000000000000000",
Expand All @@ -57,7 +57,7 @@
"a06301b39b2ea8a44df8b0356120db64b788e71f52e1d7a6309d0d2e5b86fee7cb00",
"80000000000000000000000000000000000000000000000000000000000000000000",
"80000000000000000000000000000000000000000000000000000000000000000000",
"a085880d90258c3f5cfb586bc74bcde6c0a28149e7b7fa6bf6a69c08ae0836cd1400",
"a01b7779e149cadf24d4ffb77ca7e11314b8db7097e4d70b2a173493153ca2e5a000",
"a066a7662811491b3d352e969506b420d269e8b51a224f574b3b38b3463f43f00900",
"80000000000000000000000000000000000000000000000000000000000000000000",
"00000000000000000000000000000000000000000000000000000000000000000000",
Expand All @@ -66,8 +66,8 @@
"00000000000000000000000000000000000000000000000000000000000000000000"
],
"keccak_data": [
"f9011180a0ab8cdb808c8303bb61fb48e276217be9770fa83ecf3f90f2234d558885f5abf18080a01a697e814758281972fcd13bc9707dbcd2f195986b05463d7b78426508445a04a0b5d7a91be5ee273cce27e2ad9a160d2faadd5a6ba518d384019b68728a4f62f4a0c2c799b60a0cd6acd42c1015512872e86c186bcf196e85061e76842f3b7cf86080a02e0d86c3befd177f574a20ac63804532889077e955320c9361cd10b7cc6f580980a06301b39b2ea8a44df8b0356120db64b788e71f52e1d7a6309d0d2e5b86fee7cb8080a085880d90258c3f5cfb586bc74bcde6c0a28149e7b7fa6bf6a69c08ae0836cd14a066a7662811491b3d352e969506b420d269e8b51a224f574b3b38b3463f43f0098080",
"f9013180a0ab8cdb808c8303bb61fb48e276217be9770fa83ecf3f90f2234d558885f5abf18080a01a697e814758281972fcd13bc9707dbcd2f195986b05463d7b78426508445a04a0b5d7a91be5ee273cce27e2ad9a160d2faadd5a6ba518d384019b68728a4f62f4a0c2c799b60a0cd6acd42c1015512872e86c186bcf196e85061e76842f3b7cf86080a02e0d86c3befd177f574a20ac63804532889077e955320c9361cd10b7cc6f580980a06301b39b2ea8a44df8b0356120db64b788e71f52e1d7a6309d0d2e5b86fee7cb8080a085880d90258c3f5cfb586bc74bcde6c0a28149e7b7fa6bf6a69c08ae0836cd14a066a7662811491b3d352e969506b420d269e8b51a224f574b3b38b3463f43f009a0a47179bacb2563d64a4da3bfd1a3afc4e15e58cb7671232a1393aa56e84e210780"
"f90131a0b3c64a7e62c44e6d2f9abc6dfb6852bb61032d087db6d57aa3c7497493adda2aa0ab8cdb808c8303bb61fb48e276217be9770fa83ecf3f90f2234d558885f5abf18080a01a697e814758281972fcd13bc9707dbcd2f195986b05463d7b78426508445a04a0b5d7a91be5ee273cce27e2ad9a160d2faadd5a6ba518d384019b68728a4f62f4a0c2c799b60a0cd6acd42c1015512872e86c186bcf196e85061e76842f3b7cf86080a02e0d86c3befd177f574a20ac63804532889077e955320c9361cd10b7cc6f580980a06301b39b2ea8a44df8b0356120db64b788e71f52e1d7a6309d0d2e5b86fee7cb8080a01b7779e149cadf24d4ffb77ca7e11314b8db7097e4d70b2a173493153ca2e5a0a066a7662811491b3d352e969506b420d269e8b51a224f574b3b38b3463f43f0098080",
"f90151a0b3c64a7e62c44e6d2f9abc6dfb6852bb61032d087db6d57aa3c7497493adda2aa0ab8cdb808c8303bb61fb48e276217be9770fa83ecf3f90f2234d558885f5abf18080a01a697e814758281972fcd13bc9707dbcd2f195986b05463d7b78426508445a04a0b5d7a91be5ee273cce27e2ad9a160d2faadd5a6ba518d384019b68728a4f62f4a0c2c799b60a0cd6acd42c1015512872e86c186bcf196e85061e76842f3b7cf86080a02e0d86c3befd177f574a20ac63804532889077e955320c9361cd10b7cc6f580980a06301b39b2ea8a44df8b0356120db64b788e71f52e1d7a6309d0d2e5b86fee7cb8080a01b7779e149cadf24d4ffb77ca7e11314b8db7097e4d70b2a173493153ca2e5a0a066a7662811491b3d352e969506b420d269e8b51a224f574b3b38b3463f43f009a0a47179bacb2563d64a4da3bfd1a3afc4e15e58cb7671232a1393aa56e84e210780"
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
"storage": null,
"mod_extension": null,
"values": [
"a0468d1a8b37720df40231d2a87c72b2ba41b6083102bf9dea6376d06129d33ae900",
"a0b220559455e7817aad815d51c2e1455060ddaaf60eeb300b69345eb407714c7e00"
"a06515b1a21d53e95962386ef49edeeebbbeba1fcf5cc17a7924fceae0eab2042c00",
"a002e6b21a9663cccb3f580494d587452ab4f8ba5b2ea37580e0e4e90f087fbc7e00"
],
"keccak_data": []
},
Expand All @@ -34,8 +34,8 @@
"modified_index": 14,
"drifted_index": 14,
"list_rlp_bytes": [
"f90111",
"f90111"
"f90131",
"f90131"
]
}
},
Expand All @@ -44,7 +44,7 @@
"mod_extension": null,
"values": [
"a0f5668715bad00d67745187cb0ca429735ffd25f9c22ea8a96b90752b9f11cde500",
"80000000000000000000000000000000000000000000000000000000000000000000",
"a0b3c64a7e62c44e6d2f9abc6dfb6852bb61032d087db6d57aa3c7497493adda2a00",
"a0ab8cdb808c8303bb61fb48e276217be9770fa83ecf3f90f2234d558885f5abf100",
"80000000000000000000000000000000000000000000000000000000000000000000",
"80000000000000000000000000000000000000000000000000000000000000000000",
Expand All @@ -57,7 +57,7 @@
"a06301b39b2ea8a44df8b0356120db64b788e71f52e1d7a6309d0d2e5b86fee7cb00",
"80000000000000000000000000000000000000000000000000000000000000000000",
"80000000000000000000000000000000000000000000000000000000000000000000",
"a085880d90258c3f5cfb586bc74bcde6c0a28149e7b7fa6bf6a69c08ae0836cd1400",
"a01b7779e149cadf24d4ffb77ca7e11314b8db7097e4d70b2a173493153ca2e5a000",
"a066a7662811491b3d352e969506b420d269e8b51a224f574b3b38b3463f43f00900",
"80000000000000000000000000000000000000000000000000000000000000000000",
"00000000000000000000000000000000000000000000000000000000000000000000",
Expand All @@ -66,8 +66,8 @@
"00000000000000000000000000000000000000000000000000000000000000000000"
],
"keccak_data": [
"f9011180a0ab8cdb808c8303bb61fb48e276217be9770fa83ecf3f90f2234d558885f5abf18080a01a697e814758281972fcd13bc9707dbcd2f195986b05463d7b78426508445a04a0b5d7a91be5ee273cce27e2ad9a160d2faadd5a6ba518d384019b68728a4f62f4a0c2c799b60a0cd6acd42c1015512872e86c186bcf196e85061e76842f3b7cf86080a02e0d86c3befd177f574a20ac63804532889077e955320c9361cd10b7cc6f580980a06301b39b2ea8a44df8b0356120db64b788e71f52e1d7a6309d0d2e5b86fee7cb8080a085880d90258c3f5cfb586bc74bcde6c0a28149e7b7fa6bf6a69c08ae0836cd14a066a7662811491b3d352e969506b420d269e8b51a224f574b3b38b3463f43f0098080",
"f9011180a0ab8cdb808c8303bb61fb48e276217be9770fa83ecf3f90f2234d558885f5abf18080a01a697e814758281972fcd13bc9707dbcd2f195986b05463d7b78426508445a04a0b5d7a91be5ee273cce27e2ad9a160d2faadd5a6ba518d384019b68728a4f62f4a0c2c799b60a0cd6acd42c1015512872e86c186bcf196e85061e76842f3b7cf86080a02e0d86c3befd177f574a20ac63804532889077e955320c9361cd10b7cc6f580980a06301b39b2ea8a44df8b0356120db64b788e71f52e1d7a6309d0d2e5b86fee7cb8080a085880d90258c3f5cfb586bc74bcde6c0a28149e7b7fa6bf6a69c08ae0836cd14a0f5668715bad00d67745187cb0ca429735ffd25f9c22ea8a96b90752b9f11cde58080"
"f90131a0b3c64a7e62c44e6d2f9abc6dfb6852bb61032d087db6d57aa3c7497493adda2aa0ab8cdb808c8303bb61fb48e276217be9770fa83ecf3f90f2234d558885f5abf18080a01a697e814758281972fcd13bc9707dbcd2f195986b05463d7b78426508445a04a0b5d7a91be5ee273cce27e2ad9a160d2faadd5a6ba518d384019b68728a4f62f4a0c2c799b60a0cd6acd42c1015512872e86c186bcf196e85061e76842f3b7cf86080a02e0d86c3befd177f574a20ac63804532889077e955320c9361cd10b7cc6f580980a06301b39b2ea8a44df8b0356120db64b788e71f52e1d7a6309d0d2e5b86fee7cb8080a01b7779e149cadf24d4ffb77ca7e11314b8db7097e4d70b2a173493153ca2e5a0a066a7662811491b3d352e969506b420d269e8b51a224f574b3b38b3463f43f0098080",
"f90131a0b3c64a7e62c44e6d2f9abc6dfb6852bb61032d087db6d57aa3c7497493adda2aa0ab8cdb808c8303bb61fb48e276217be9770fa83ecf3f90f2234d558885f5abf18080a01a697e814758281972fcd13bc9707dbcd2f195986b05463d7b78426508445a04a0b5d7a91be5ee273cce27e2ad9a160d2faadd5a6ba518d384019b68728a4f62f4a0c2c799b60a0cd6acd42c1015512872e86c186bcf196e85061e76842f3b7cf86080a02e0d86c3befd177f574a20ac63804532889077e955320c9361cd10b7cc6f580980a06301b39b2ea8a44df8b0356120db64b788e71f52e1d7a6309d0d2e5b86fee7cb8080a01b7779e149cadf24d4ffb77ca7e11314b8db7097e4d70b2a173493153ca2e5a0a0f5668715bad00d67745187cb0ca429735ffd25f9c22ea8a96b90752b9f11cde58080"
]
},
{
Expand Down
Loading

0 comments on commit b7b8aa1

Please sign in to comment.