@aztec/protocol-contracts 0.0.1-commit.1bb068fb5 → 0.0.1-commit.217f559981
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/artifacts/AuthRegistry.json +1046 -277
- package/artifacts/ContractClassRegistry.json +24 -24
- package/artifacts/ContractInstanceRegistry.json +43 -47
- package/artifacts/FeeJuice.json +45 -45
- package/artifacts/MultiCallEntrypoint.json +74 -66
- package/artifacts/PublicChecks.json +66 -58
- package/dest/auth-registry/index.d.ts +1 -1
- package/dest/auth-registry/index.d.ts.map +1 -1
- package/dest/auth-registry/index.js +3 -3
- package/dest/auth-registry/lazy.js +1 -1
- package/dest/class-registry/index.d.ts +1 -1
- package/dest/class-registry/index.d.ts.map +1 -1
- package/dest/class-registry/index.js +3 -3
- package/dest/class-registry/lazy.js +1 -1
- package/dest/fee-juice/index.d.ts +1 -1
- package/dest/fee-juice/index.d.ts.map +1 -1
- package/dest/fee-juice/index.js +3 -3
- package/dest/fee-juice/lazy.js +1 -1
- package/dest/instance-registry/index.d.ts +1 -1
- package/dest/instance-registry/index.d.ts.map +1 -1
- package/dest/instance-registry/index.js +3 -3
- package/dest/instance-registry/lazy.js +1 -1
- package/dest/make_protocol_contract.d.ts +4 -4
- package/dest/make_protocol_contract.d.ts.map +1 -1
- package/dest/make_protocol_contract.js +27 -14
- package/dest/multi-call-entrypoint/index.d.ts +1 -1
- package/dest/multi-call-entrypoint/index.d.ts.map +1 -1
- package/dest/multi-call-entrypoint/index.js +3 -3
- package/dest/multi-call-entrypoint/lazy.js +1 -1
- package/dest/protocol_contract_data.d.ts +13 -1
- package/dest/protocol_contract_data.d.ts.map +1 -1
- package/dest/protocol_contract_data.js +99 -13
- package/dest/provider/bundle.js +1 -1
- package/dest/public-checks/index.d.ts +1 -1
- package/dest/public-checks/index.d.ts.map +1 -1
- package/dest/public-checks/index.js +3 -3
- package/dest/public-checks/lazy.js +1 -1
- package/dest/scripts/generate_data.js +62 -15
- package/package.json +4 -4
- package/src/auth-registry/index.ts +3 -3
- package/src/auth-registry/lazy.ts +1 -1
- package/src/class-registry/index.ts +3 -3
- package/src/class-registry/lazy.ts +1 -1
- package/src/fee-juice/index.ts +3 -3
- package/src/fee-juice/lazy.ts +1 -1
- package/src/instance-registry/index.ts +3 -3
- package/src/instance-registry/lazy.ts +1 -1
- package/src/make_protocol_contract.ts +37 -15
- package/src/multi-call-entrypoint/index.ts +3 -3
- package/src/multi-call-entrypoint/lazy.ts +1 -1
- package/src/protocol_contract_data.ts +76 -13
- package/src/provider/bundle.ts +1 -1
- package/src/public-checks/index.ts +3 -3
- package/src/public-checks/lazy.ts +1 -1
package/artifacts/FeeJuice.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"transpiled": true,
|
|
3
|
-
"noir_version": "1.0.0-beta.
|
|
3
|
+
"noir_version": "1.0.0-beta.19+a4c32f0c7e5eb6b71391f69bd1b526a8df7c98fb",
|
|
4
4
|
"name": "FeeJuice",
|
|
5
5
|
"functions": [
|
|
6
6
|
{
|
|
@@ -70,8 +70,8 @@
|
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
|
-
"bytecode": "JwACBAEoAAABBIBIJwAABEglAAAASicCAwQCJwIEBAAfCgADAAQARhwAR0cGLQhGAS0IRwIlAAAAeicCAQRIJwICBAA7DgACAAEsAABDADBkTnLhMaApuFBFtoGBWF0oM+
|
|
74
|
-
"debug_symbols": "
|
|
73
|
+
"bytecode": "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",
|
|
74
|
+
"debug_symbols": "pZnbbhs5DIbfxde5kCiJFPMqRVG4qVsYMJzATRZYBHn3JTWiZHchIZVvMp/pzD88iZLt992Pw/e3X9+O55/Pv3ePX9533y/H0+n469vp+Wn/enw+i/V95/SPB9o9hoedD7B7THql7Rr9Zo+4XZO8Jr3idsX6Gnm7UqzXvHv0TiAHAa+QKzBuAE7u9aiAFXwy4AoQDcwSzBLMEoMBVUhgYMpoz0J9BAuQM4gGuUIGA6rAZinOCwQnt4NXSBW8WXyuAOIYkIJa9K6gadS3Sl4LmEUzG4ICVkCzaHILqKshK+QKmt4NxNUIAupqlNJFFH8iKoiHUdyIGSuwKMeskDZIGk5khWjAFbxZvFnALBpXAW2bDaiCBrgBVkj2iJQMTBAliiTdkpg2QO2EJGlBcAZmCWoBhVRBy52CAlVAs2iVN9B/jgry0CT5wRwNcgUOG5B25gbifJIckvcGZimOkUKq/wxVmUI0MEs05VifRcXnAiooJSAtbmIFrqDFRaeQK3C1ZPVwA6zgzaJlKqBlQq/AFYJZggpK6nJxjBWoQnGsgFm0DzfACiWrBVRZ0ps1mSjpZQcG6pgkinVdbJAqgFnALMEswSzaPyj5YW0bJAV9RFbgCqhRiBtM8lByClQh61zyCliBzcLV4p32eiU28s0G0EhVQUn7vFKzqacUCuH2dO/U6UrJCJsNYyM2IikExULZSOcQpUJkxGbzumQrJSPfbDqENtIpRFgoG4VmK3HoxPYR6nPLsN+ojPuNmq3EsVFqpHFkpbIBbKRPYyXt40rNVqqgVLaBSs1WqrCRKGfNUNkKKjWbxpF9oVyfCyWOjcgoNVuJo1DZujaSOHIoxEYaR6Vmy82Wm43NVnaEDIXUBh8fDzvbab+9Xg4H3Wivtl7ZkF/2l8P5dfd4fjudHnb/7E9v5Z9+v+zP5fq6v8i7Eunh/EOuIvjzeDoofTz0u934VsKM9W4i3wUS3Cj4sQJGXc1FASNRU8BbH2CsEHTEF4GAsd1P4fMeMJgHKcaRB3HmQaoC0aerJKxlkUdZxJlCaALY7o/waQ9kl2kCMY08yJMsytqzLIKDURZ5rABkAtL0ozp+NouRRjHMFGR3MQUGP+zmSTPKULBEytrticy3zeDDJA/ZFmTgfFXL20T6ST+yHKurBHvqDRnY32qkST1dsJZC2Xi6xl94kW1lM1xl839e0Fgjy51VIzPyWGPSmSFBy2fviuD+oqiebcTI8MVRUWHSWin3bPaCZFpqzTActDCJgvVovpWDYOQCTBpTDirJVpgeWsbDOs5EnKcm4sJw3kK6e9gA3jltZoEwE/Q4Yh46MW3NaG0R0sSNeVHiVVF4mIww6S4vi8s02Ic+dMJig+KoQcOkQaGtsuCvx8XnXUixuUBh6EK8e3yHdO/4Dnj/+A507/j+bDLzOJk8G5uuJdMHPxo5cdaYLofYujtPTmeTA56XWEwjuzzs7rkj0lLdkatD2p+OTNdqwj4zZIgNRWaHTSTLSCCfFg5Knp3rqz0Nt8T5wGg7IgMvSXDfTDjRmgT5JpFhRUI+E5oEOIpLEtFZLuSz4ZoXMXQJdEsSybVAEuCaRHJNIvk1iRi7BCx6gU2C8t1erEq0BpcP8ksNDhihSaS1oiK2isgXi2sSbY4DZnd3IGsS8vVxO+jId3mLEv0c75aKGjj4JoHjdOJke499M4k59A73/Hkv2mFLkNYC4X7I4LUG920TEFxb7I5jl1hb7N631pLv5xYDwS5xfyCLEr5PcB9pTSJRk0BelGibwM3JcTGQVYn26Uy+Xl3biqAXFXxelHBdgu8NZFWif6AAuDpG/ymRYW3kfJVX+6fj5eY31w/Vuhz330+H+vLn2/np6t3Xf1/sHfvN9uXy/HT48XY5qFL/4Vb+fJEt5EG+m/6qPw/IS5nklPWF1/fkZxrZIL9+qCv/AQ=="
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
77
|
"name": "balance_of_public",
|
|
@@ -122,8 +122,8 @@
|
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
},
|
|
125
|
-
"bytecode": "
|
|
126
|
-
"debug_symbols": "
|
|
125
|
+
"bytecode": "JwACBAEoAAABBIBGJwAABEYlAAAARScCAgQBJwIDBAAfCgACAAMARC0IRAElAAAARi0CAUUnAgIERScCAwQBOw4AAwACJiUAAAEzHgIAAgknAgMBASQCAAIAAABiJQAAAVkpAgACAO9SU00nAgMAASsCAAQAAAAAAAAAAAMAAAAAAAAAAC0IAQUnAgYEBQAIAQYBJwMFBAEAIgUCBi0KBgctDgIHACIHAgctDgMHACIHAgctDgEHACIHAgctDgQHLQgBAScCAgQFAAgBAgEnAwEEAQAiBQICACIBAgM/DwACAAMnAgIEAQAqAQIELQsEAycCAQAACioDAQInAgEBAAoqAgEEJAIABAAAARIlAAABax4CAAEALyoAAwABAAIcCgIDBhwKAwEAHAoBAgYtCgIBJigAAAQEeEYMAAAEAyQAAAMAAAFYKgEAAQXaxfXWtEoybTwEAgEmKgEAAQXcG27r+7a8QzwEAgEmKgEAAQW6uyHXgjMYZDwEAgEm",
|
|
126
|
+
"debug_symbols": "nZbbqqswEIbfJddeJJPj9FUWpdjWLgSxxVU3bIrvvifWibogYdMb82ein3NKyEtcm/P4fWr72/1HHL5e4jy0Xdd+n7r7pX62956sLyHjw1tx0JUINDE02HlA/R6COChVCSX9IhQsQmsWvGR4ybDFssWyxSkWdhFesjAscBGBfxHYDYxAHYV7C5CKBVsUWxRbgC0Q3aCwQAMLtpj4jovCLcKyxbLFscXhIqLPAFGQBSInEBDiUnT1LWbLNFWCc396Dk0TU78pBpXoUQ9N/xSHfuy6Svypu3F+6edR9/P4rAdalZVo+iuNBLy1XRPVVK1fy/ynSippls9Jk1OMsLBjqDwDXQxqRqAzPhHc3gsoeRGSE9RXieD1p3GEXBxFBpiQGOB8jmELDDCWEYA2EYLdEVyeAIHLqXGNwsA+mb5QDpWSidTnCaFR7RAhjwgYO3hGBHSYRWAeoS2kMNZEavmrqwrlANrjCwJoc3/GWMsBEHSeUWhO45EZJmhIDIX/7YZGXIu6qepvN0qNpRC5sbR0ucZSBYQNeiE4uR4VwX+4Pzxmz4pSdxrPzekh54QKRS+s23iRPW8UliBS+QSR2mQPrUI+3NqgDiRkEYWjE3xqcTS5Y68UCFIW1zhMyDqhS1vVcGNoW3CjXBSzKQrmk1FqcTprmIFq3axGU3ccaVpf2mF3W5kibGjrc9cs09vYXzarz78PXuHbzmO4X5rrODSRtF55FD2/bKicPsYrDU2crxwep/jrfw=="
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
"name": "check_balance",
|
|
@@ -164,8 +164,8 @@
|
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
166
|
},
|
|
167
|
-
"bytecode": "JwACBAEoAAABBIBFJwAABEUlAAAARicCAgQBJwIDBAAfCgACAAMARBwAREQGLQhEASUAAABsJwIBBEUnAgIEADsOAAIAASwAAEMAMGROcuExoCm4UEW2gYFYXSgz6Eh5uXCRQ+H1k/
|
|
168
|
-
"debug_symbols": "
|
|
167
|
+
"bytecode": "JwACBAEoAAABBIBFJwAABEUlAAAARicCAgQBJwIDBAAfCgACAAMARBwAREQGLQhEASUAAABsJwIBBEUnAgIEADsOAAIAASwAAEMAMGROcuExoCm4UEW2gYFYXSgz6Eh5uXCRQ+H1k/AAAAAmJQAAAZoeAgACCScCAwEBJAIAAgAAAIglAAABwB4CAAIBCiICQwMWCgMEHAoEBQAEKgUCBCcCAgEACioDAgUkAgAFAAAAuycCBgQAPAYGASkCAAMA71JTTScCBQABKwIABgAAAAAAAAAAAwAAAAAAAAAALQgBBycCCAQFAAgBCAEnAwcEAQAiBwIILQoICS0OAwkAIgkCCS0OBQkAIgkCCS0OBAkAIgkCCS0OBgktCAEDJwIEBAUACAEEAScDAwQBACIHAgQAIgMCBT8PAAQABScCBAQBACoDBAYtCwYFJwIDAAAKKgUDBAoqBAIDJAIAAwAAAWYlAAAB0h4CAAMALyoABQADAAQcCgQFBhwKBQMAHAoDBAYMKgQBAwoqAwIBJAIAAQAAAZklAAAB5CYoAAAEBHhFDAAABAMkAAADAAABvyoBAAEF2sX11rRKMm08BAIBJioBAAEFDv4gSes3Tjw8BAIBJioBAAEFursh14IzGGQ8BAIBJioBAAEFhHKAwoQjC0Y8BAIBJg==",
|
|
168
|
+
"debug_symbols": "nZbdbuowDMffpddcxHa+zKtM08RYN1WqCurgSEcT736cEaftjhJN3JB/HPrD8Rf96t761+vHyzC9nz67/dNX9zoP4zh8vIyn4+EynCaxfnUmfQBQt6edrLHbW1mR7itBXn23D7Ja2XNa/X115m537r562QMk4bIIagkxi0gqgogogv1doIEsEFXoEekRqcWqxaoleXMXVgVn4UlFzCLoT4TsBkYBoknCZcFGRbaQMSrUAmoBcQPlXoSgQi2UvkNJuCysWqxaHKkQD1GCS8lnSo8HAVI6Cj6LqJaYLJIhYlCRLdbYJG63XacJf7nMfZ/yvaoAqYvzYe6nS7efruO46/4cxuv3lz7Ph+l7vRxmOZUr9tObrAJ8H8Y+qdtuedrUH43sfH46cogF4HBDgDqBPSqBvQ2F4Lc+YJ0AJtpMADALIdBDt4imdosGgQHUBwaqxsHVCd56JUgYqnHwdQJZzgDythaFpgeM6oGztuZBbHngMsDK/FiC8FAUV7Xws5oaiOApE0LwBWB/n0jDiwtAVRda9YglDCDjpSDiNg5AdQRG7UniuLrFNhMpWPVQlqZgRCgMmSZbhmu1BWJpC891RqsoHZabLAkl8yOcoRELiDEjUP5PHmMsKUGMVGdwnWEDl+qOhIUB/Gs3iHnJ6yqx/7nRqi5gbXMg42vVhQ2Ei9oj3ixdGsNDPeJcrUewVZ42KCFgzQV0raGPZWaLrg9M9C2IgVAghqozDxtJ9Ut9ejRYRTTmJoZS4Vyd3K2LsERxuYeNNSfItDrValmQa7jRTopdJYWrwaBWgcusUQavJrClxwo0bP/Pn2V3OA7z5l35lljzcHgd+7x9v07H1enl71lP9F37PJ+O/dt17hNp9cItn08BdsE/p7du2cgsj/h8Sz/9Dw=="
|
|
169
169
|
},
|
|
170
170
|
{
|
|
171
171
|
"name": "claim",
|
|
@@ -1145,7 +1145,7 @@
|
|
|
1145
1145
|
}
|
|
1146
1146
|
},
|
|
1147
1147
|
{
|
|
1148
|
-
"name": "
|
|
1148
|
+
"name": "expiration_timestamp",
|
|
1149
1149
|
"type": {
|
|
1150
1150
|
"kind": "integer",
|
|
1151
1151
|
"sign": "unsigned",
|
|
@@ -1321,7 +1321,7 @@
|
|
|
1321
1321
|
}
|
|
1322
1322
|
},
|
|
1323
1323
|
{
|
|
1324
|
-
"name": "
|
|
1324
|
+
"name": "key_validation_requests_and_separators",
|
|
1325
1325
|
"type": {
|
|
1326
1326
|
"kind": "struct",
|
|
1327
1327
|
"path": "aztec::protocol_types::utils::arrays::claimed_length_array::ClaimedLengthArray",
|
|
@@ -1333,7 +1333,7 @@
|
|
|
1333
1333
|
"length": 16,
|
|
1334
1334
|
"type": {
|
|
1335
1335
|
"kind": "struct",
|
|
1336
|
-
"path": "aztec::protocol_types::abis::validation_requests::
|
|
1336
|
+
"path": "aztec::protocol_types::abis::validation_requests::key_validation_request_and_separator::KeyValidationRequestAndSeparator",
|
|
1337
1337
|
"fields": [
|
|
1338
1338
|
{
|
|
1339
1339
|
"name": "request",
|
|
@@ -1378,7 +1378,7 @@
|
|
|
1378
1378
|
}
|
|
1379
1379
|
},
|
|
1380
1380
|
{
|
|
1381
|
-
"name": "
|
|
1381
|
+
"name": "key_type_domain_separator",
|
|
1382
1382
|
"type": {
|
|
1383
1383
|
"kind": "field"
|
|
1384
1384
|
}
|
|
@@ -1860,7 +1860,7 @@
|
|
|
1860
1860
|
"name": "fields",
|
|
1861
1861
|
"type": {
|
|
1862
1862
|
"kind": "array",
|
|
1863
|
-
"length":
|
|
1863
|
+
"length": 16,
|
|
1864
1864
|
"type": {
|
|
1865
1865
|
"kind": "field"
|
|
1866
1866
|
}
|
|
@@ -2015,9 +2015,9 @@
|
|
|
2015
2015
|
}
|
|
2016
2016
|
}
|
|
2017
2017
|
},
|
|
2018
|
-
"bytecode": "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",
|
|
2019
|
-
"debug_symbols": "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MVxiuMQMmkHDJYZLDJcYLjFcYrjEcMla97po7kRmEpcYLjGH5tBwieESwyWGSwyXGC4xXLLWvS5acNxwieESwyXWoXVouMRwieESwyWGSwyXGC5Z614XLTluuMRwieESS2gJDZcYLjFcYrjEcInhEsMla93rohXHDZcYLjFcYgUNlxjXJcZ1ieESG9AGtAENlxguMVxiXJesda/Hbznxte4164xODGInJrGIgzgV17rXHRvRiE4MYicmsYiDCK1Ba9AatAatQWvQGrQGrUFr0AyaQTNoBs2gGTSDZtCWS+YZ5xWXS1Y8aPU4oxGdGMROTCoUEdrpkvVvT5fsCC2gBbSAFtACWkALaMHYOmPr0Dq0Dq1D69BOl+xYxEFkbAltuWRFIzoxiNASWkJLaAmtmMlibMXYirEVtOWSFZnJYiaLmSxoA9qANqANaIOZHIxtMLbB2Aa0wXGbzORkJiczOaFNaBPahDahTWZyXmNb6153bMSLtta97hjETkxiUWEQoTVoDVozohOD2InQWhEH8ZrJte51R2gGzaAZNINmSWRsxtiMseGSte51R2bSmUlnJnHJWve6IzSHhksClwQuCVwSuGSte1204LjhksAlgUvWutdVoUPDJYFLApcELglcErgkcMla97poneOGSwKXBC5Z615XhYSGSwKXBC4JXBK4JHBJ4JK17nXRiuOGSwKXBC5Z6153BWi4JHBJ4JLAJYFLApcELlnrXhdtcNxwSeCSwCVr3euqMKHhksAlgUsClwQuCVwSuGStez1pa93rjkZ0YhA7FZJYxEGEhks6Lum4pOOSte510VonJrGIgwjNoOGSjks6Lum4pOOSjks6Lulcl3SuSzou6bik45LOdUnnuqTjko5LOi7puKTjko5LOi5Z614XLThuuKTjko5L1rrXXQEaLum4pOOSjks6Lum4pOOSte510TrHDZd0XNJxyVr3uiokNFzScUnHJR2XdFzScUnHJWvd66IVxw2XdFzSccla97orQMMlHZd0XNJxScclHZd0XLLWvS7a4Ljhko5LOi5Z615XhQkNl3Rc0nFJxyUdl3Rc0nHJWve6aPM6bolLEpckLlnrXs8Ka93rjp2YxCIO4jW2xCWJS9a610VrTgxiJyYRWoOGSxKXJC5JXJK4JHFJ4pK17nXRrIiDyEzikuQzTvIZJ3FJ4pLEJYlLEpckLklcsta9Llpw3HBJ4pLEJclnnLXudUdouCRxSeKSxCWJSxKXrHWvi9Y5brgkcUnikuQzzlr3uiM0XJK4JHFJ4pLEJYlL1rrXRUuOGy5JXJK4JPmMs9a97ggNlyQuSVySuCRxSeKSte510QbHDZckLklcknzGWeted4SGSxKXJC5JXJK4JHHJWve6aJPjhksSlxQuKT7jrHWvOzoxiJ2YxCIO4jW2te510VojGtGJQYTWoOGSwiWFSwqXFC4pXFK4ZK17XTTrxCQWcRCh4ZLiuqS4LilcUnzGWeted4SGSwqXFC4prkvWuteyM55jOyuszzgrBrETk1jEQZxXXC5Z8aCNdkYjOjGInZjEIg7ivOLpkh2hJbSEltASWkI7XXL89lxf6153ZGzF2NZnnBWZyWImi5ksZrKYyWImi5ksaAPagDagDWgD2oA2GNtgJgczOZjJyUxOZnIyk5OZnMzkZCYntAltQpsXba173bERTbO+1r2eo1jrXnfsxCQWcRCvmVzrXndsRCNCa9AatAatQWvQGjRjbMbYzIhODGInJrGIg8hMOjSH5tAcmkNzaKdL1qyfLhnjjIM4r3i6ZMdGNKITg9iJB+349dO+1r3uOIjziqdLdmxEIzoxiJ0IrUPr0Dq0hJbQDpc8bzCe0YlxxDpjJyaxiIM4r3i4RLERjehEaAWtoBW0glbQBrQBbUAb0Aa0AW1AG9AGtAFtQpvQJrQJbUKb0Ca0CW1CmxftXPeq2IhGdGIQOzGJRRxEaA1ag3a45HnX9owHzfoZg9iJSSziIM4rHi5RbEQjQjNoBs2gGTSDZtAcmkNzaA7NoTk0h+bQHJpDC2gBLaAFtIAW0AJaQAtoAa1DO1zyvKd9RiM6MYidmMQiDuK84uESRWgJLaEltISW0BJaQktoBa2gFbSCVtAKWkEraAWtoA1oA9qANqANaAPagDagDWgD2oQ2oU1oE9qENqFNaBPahDZFi3Pdq2IjGtGJQezEJBZxEKE1aA1ag9agNWgNWoPWoDVoDZpBM2gGzaAZNINm0AyaQTNoDs2hOTSH5tAcmkNzaA7NoQW0gBbQAlpAC2gBLaAFtIDWoXVoHVqH1qF1aB1ah9ahdWgJLaEltISW0BJaQktoCS2hFbSCVtAKWkEraAWtoBW0gjagDWgD2oA2oA1oA9qANqANaBPahDahTWgT2oQ2oU1oExouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGS9pySZ7xoMX6r04MYicetJhnPGjHU6XiXPeqeNDyjKdLdmxEIx607GcM4kHLccaDVuvfFvGglf/r22/+97uff/juzz9+/z/f/OGfzz/+1z9++svff/jrT/uPf/9/f9Pf/PnnH3788Yf//tPffv7rX77/z3/8/P2ffvzrX46/++Zx/N9xPv9Hy2+t/fH5j9v+7/9hvb61yj8+37ePv3/0b5+n8PNP5z83n98+J+X4Yzv+GONb64/j9abXP4/0t+G2X38M+jkCvf55Cfft8w1ar386//nHPF7vx+uPV/jxcv375/zHPP46/n2Pu17xvOb0aw/j8W3046/zesXzU4M9Gf/61x//9f8B",
|
|
2020
|
-
"verification_key": "
|
|
2018
|
+
"bytecode": "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0rVncGw5d+nanLt0bc5dujbnLl2bc5euzblL1+bcpWtz7tK1OXfp2py7dG3SL7xy7tK1OXfp2py7dG3OXbo25y5dm3OXrs25S9fm3KVrc+7StTl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt0bc5duvZKji3nLl2bc5euzblL1+bcpWtz7tK1OXfp2py7dG3OXbo25y5dm3OXrs25S9fm3KVrc+7StTl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt07QMcW85dujbnLl2bc5euzblL1+bcpWtz7tK1OXfp2ic4tpy7dG3OXbo25y5dm3OXrs25S9fm3KVrc+7StTl36dqcu3Rtzl26NucuXZtzl67NuUvXw7lL18O5S9fDuUvXw7lL18O5S9fDuUvXw7lL18O5S9fDuUvXw7lL18O5S9fDuUvXw7lL18O5S9fDuUvXk8SxzcOxzcuxzcex5dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6ynHseXcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+t5hGPLuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1lObY8u5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9aTyrHl3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+vh3H/r4dx/6+Hcf+uB7r+t3qRVm9ROVVq3aN+r1mZP09I33nTzLbfeVqZsudvvuPOuu++5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",
|
|
2019
|
+
"debug_symbols": "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eLpkx5OWZzSiE4PYiUmFIkI7XbL+7emSHaFNaBPahDahTWgT2oQ2NTY7F7QqimbnklZFJwaxE5NYxEGcV2zQTpfsaEQnBhFag9agNWgNmj2IjM0YmzE2g3a6ZMckFnEQoTk0h+bQHJozk87YnLE5Y3NoznELZjKYyWAmA1pAC2gBLaAFMxmMrTO2ztg6tM5x68xkZyY7M9mhdWgdWkJLaMlMJmNLxpaMLaElxy2ZyWQmi5ksaAWtoBW0glbMZDG2YmzF2Aa0wXEbzORgJgczOaANaAPagDagTWZyMrbJ2CZjm9Amx20yk5OZnMzkvGhr3euOjWhEJwaxE5NYxIu21r2uiEsaLmm4ZK17XRUaNFzScEnDJQ2XNFzScEnDJWvd66KZE4PYiUmEZtBwScMlDZc0XNJwScMlDZesda+L5kVkJnFJwyVr3euqENBwScMlDZc0XNJwScMlDZesda+L1jluuKThkoZL1rrXXQEaLmm4pOGShksaLmm4pOGSte510ZLjhksaLmm4ZK17XRUKGi5puKThkoZLGi5puKThklbQiuOGSxouabikDWgDGi5puKThkoZLGi5puKThkrXuddEmxw2XNFzScMla97orQMMlhksMlxguMVxiuMRwyVr3etLWutcdB/GaScMla93rqtCg4RLDJYZLDJcYLjFcYrhkrXtdNGtEIzoxiNAMGi4xXGK4xHCJ4RLDJYZL1rrXRfNOZCZxieGSte51VQhouMRwieESwyWGSwyXGC5Z614XLThuuMRwieGSte51VejQcInhEsMlhksMlxguMVyy1r0uWnLccInhEsMla93rrgANlxguMVxiuMRwieESwyVr3euiFccNlxguMVxiA9qAhksMlxguMVxiuMRwieGSte510SbHDZcYLjFcYhPahIZLDJcYLnFc4rjEcYnjkrXu9aStda87JrGIgwitQcMljksclzgucVziuMRxyVr3umjtOm6OSxyXOC5xPuOsda87QsMljksclzgucVziuGSte100dyIziUsclzifcda61x2h4RLHJY5LHJc4LnFcsta9Llpw3HCJ4xLHJc5nnLXudUdouMRxieMSxyWOSxyXrHWvi5YcN1ziuMRxifMZZ6173REaLnFc4rjEcYnjEscla93rohXHDZc4LnFc4nzGcVziXJc41yWOS5zPOGvd647QcInjEscl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SeKSxCVr3euiBccNlyQuSVySfMZZ6153hIZLEpckLklckrgkccla97poneOGSxKXJC5JPuOsda87QsMliUsSlyQuSVySuGSte1205LjhksQliUuSzzhr3euO0HBJ4pLEJYlLEpckLlnrXhdtcNxwSeKSxCXJZ5y17nVHaLgkcUniksQliUsSl6x1r4s2OW64JHFJ4ZLiM85a97qjE4PYiUks4iBeY1vrXhetNaIRnRhEaA0aLilcUrikcEnhksIlhUvWutdFs05MYhEHERouKa5LiuuSwiXFZ5y17nVHaLikcEnhkuK6ZK17LTvjObazwvqMs2IQOzGJRRzEecXlkhUP2mhnNKITg9iJSSziIM4rni7ZEVpCS2gJLaEltNMlx2/P9bXudUfGVoxtfcZZkZksZrKYyWImi5ksZrKYyYI2oA1oA9qANqANaIOxDWZyMJODmZzM5GQmJzM5mcnJTE5mckKb0Ca0edHWutcdG9E062vd6zmKte51x05MYhEH8ZrJte51x0Y0IrQGrUFr0Bq0Bq1BM8ZmjM2M6MQgdmISiziIzKRDc2gOzaE5NId2umTN+umSMc44iPOKp0t2bEQjOjGInXjQjl8/7Wvd646DOK94umTHRjSiE4PYidA6tA6tQ0toCe1wyfMG4xmdGEesM3ZiEos4iPOKh0sUG9GIToRW0ApaQStoBW1AG9AGtAFtQBvQBrQBbUAb0Ca0CW1Cm9AmtAltQpvQJrR50c51r4qNaEQnBrETk1jEQYTWoDVoh0ued23PeNCsnzGInZjEIg7ivOLhEsVGNCI0g2bQDJpBM2gGzaE5NIfm0ByaQ3NoDs2hObSAFtACWkALaAEtoAW0gBbQOrTDJc972mc0ohOD2IlJLOIgziseLlGEltASWkJLaAktoSW0hFbQClpBK2gFraAVtIJW0AragDagDWgD2oA2oA1oA9qANqBNaBPahDahTWgT2oQ2oU1oU7Q4170qNqIRnRjETkxiEQcRWoPWoDVoDVqD1qA1aA1ag9agGTSDZtAMmkEzaAbNoBk0g+bQHJpDc2gOzaE5NIfm0BxaQAtoAS2gBbSAFtACWkALaB1ah9ahdWgdWofWoXVoHVqHltASWkJLaAktoSW0hJbQElpBK2gFraAVtIJW0ApaQStoA9qANqANaAPagDagDWgD2oA2oU1oE9qENqFNaBPahDah4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabik4ZKGSxouabikLZfkGQ9arP/rxCB24kGLecaDdjxVKs51r4oHLc94umTHRjTiQct+xiAetBxnPGi1/m0RD1r5v7795n+/+/mH7/784/f/880f/vn843/946e//P2Hv/60//j3//c3/c2ff/7hxx9/+O8//e3nv/7l+//8x8/f/+nHv/7l+LtvHsd/jvP5P1p+a+2Pz3/c9v//D+v1rVX+8fm+ffz9o3/7PIWffzr/ufn89jkpxx/b8ccY31p/HK83vf55pL8Nt/36Y9DPEej1z0u4b59v0Hr90/nPP+bxej9ef7zCj5fr3z/nP+bx1/Hve9z1iuc1p197GI9vox9/ndcrnp8a7Mn417/++K//Dw==",
|
|
2020
|
+
"verification_key": "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"
|
|
2021
2021
|
},
|
|
2022
2022
|
{
|
|
2023
2023
|
"name": "claim_and_end_setup",
|
|
@@ -2997,7 +2997,7 @@
|
|
|
2997
2997
|
}
|
|
2998
2998
|
},
|
|
2999
2999
|
{
|
|
3000
|
-
"name": "
|
|
3000
|
+
"name": "expiration_timestamp",
|
|
3001
3001
|
"type": {
|
|
3002
3002
|
"kind": "integer",
|
|
3003
3003
|
"sign": "unsigned",
|
|
@@ -3173,7 +3173,7 @@
|
|
|
3173
3173
|
}
|
|
3174
3174
|
},
|
|
3175
3175
|
{
|
|
3176
|
-
"name": "
|
|
3176
|
+
"name": "key_validation_requests_and_separators",
|
|
3177
3177
|
"type": {
|
|
3178
3178
|
"kind": "struct",
|
|
3179
3179
|
"path": "aztec::protocol_types::utils::arrays::claimed_length_array::ClaimedLengthArray",
|
|
@@ -3185,7 +3185,7 @@
|
|
|
3185
3185
|
"length": 16,
|
|
3186
3186
|
"type": {
|
|
3187
3187
|
"kind": "struct",
|
|
3188
|
-
"path": "aztec::protocol_types::abis::validation_requests::
|
|
3188
|
+
"path": "aztec::protocol_types::abis::validation_requests::key_validation_request_and_separator::KeyValidationRequestAndSeparator",
|
|
3189
3189
|
"fields": [
|
|
3190
3190
|
{
|
|
3191
3191
|
"name": "request",
|
|
@@ -3230,7 +3230,7 @@
|
|
|
3230
3230
|
}
|
|
3231
3231
|
},
|
|
3232
3232
|
{
|
|
3233
|
-
"name": "
|
|
3233
|
+
"name": "key_type_domain_separator",
|
|
3234
3234
|
"type": {
|
|
3235
3235
|
"kind": "field"
|
|
3236
3236
|
}
|
|
@@ -3712,7 +3712,7 @@
|
|
|
3712
3712
|
"name": "fields",
|
|
3713
3713
|
"type": {
|
|
3714
3714
|
"kind": "array",
|
|
3715
|
-
"length":
|
|
3715
|
+
"length": 16,
|
|
3716
3716
|
"type": {
|
|
3717
3717
|
"kind": "field"
|
|
3718
3718
|
}
|
|
@@ -3867,9 +3867,9 @@
|
|
|
3867
3867
|
}
|
|
3868
3868
|
}
|
|
3869
3869
|
},
|
|
3870
|
-
"bytecode": "H4sIAAAAAAAA/+z9B5xUxdb2Dc/em+nJ3UNQQUQwgpFgVlRyTkbMgoCKEgdQMAEmMEIPmEFQgiCi5Jxz6CKoJEUFE4JIkJy/aqDZm5nprmuKuu7j8719fud9n7rnXFxVtWrV+nfv7lnjZAc/GNusVdOWrR9t2qb5oy3k/9ehRcdO7UTBO9YXXtV9VJVWTZs9XaVt5xqd2jSr2rRVq+5D7qzcoGb17O5fNG7ZsU2LDh3sUoDIsQBRQcSpcCVAdHaoG6A6B1Kdh6yqBCI6HxGVRESloJVfAKkuhFQXQaqLkcVfKq1GVMlq2apVyyfCgr4JvXv36d17XqmE2P+xun9ZuUOHFlkdH2iR1bZP72D2vFLlmjfI2lh+4GWTGlWf0L37fQ+XueavWl0mtwtW3binzw75T4TzTWzbVVf99rSO7aiotomRQR6RGNeobYcWLZu3bVOhUYus1p06Nu3Ysm2b7L6nIiOXe2p8iRsvz/8+qq9wRgtnjHDGCmfc6Svvk60OYWlAI2eAYjBeaZWQ/wWWgRY4BlrgBGCBOoc03jOe4BmP9YzHyYOaKJxJwpksnCmnxyEb2GNhaIdTFUbWHcitlT6V8r/Ci6EVTgOuNbLCaaVOrxnJfboPvatlmydatThxZVWTXALkwilDdS0qlQ+xlRDsPqRyVlbTLusTSglnunBmCGemcGYJZ7Zw5ghnrnDmCWe+cBYIZ6FwFglnsXCWCGepcELCEcJZJpzlwlkhnJXC+VY43wnne+GsEs5q4awRzlrhrBPOD8L5UTjrsUKKRHx6MiSbgclmYrJZmGw2JpuDyeZisnmYbD4mW4DJFmKyRZhsMSZbgsmWYrIQJhOYbBkmW47JVmCylZjsW0z2HSb7HpOtwmSrMdkaTLYWk63DZD9gsh8x2frk02HWNzqoep8ElXxJMT+qqm3QVS2IpprUzqNaiKAxsDu/r59ybGR8HrZy8pWnqapNyFv1rVfVsHoU1XfQRvbndyPrE0ogyIZeYExXqLYfOyY3MkOpCm93pkp1PCizYquyT4RudkzV7pMBnhNLtSFyDHNjqKqcOqx5UVSdTzvSRXmrap5+8IvzVG3KkR5L8lJVyJlES/NQlc6VaqHcqodyJ6TIpWqcR9ouy6nqlldyL8+h6pbnFVjhUU1sFO2ifO+qykyKqlp1SjXgsuiq1RFVuYExVGtOqjaUj6Vae0LVfmNM1brjqvpZsVU/hFXNGihUP0pV2eYq1XrkbV5gN6RCys9p7x1Sgvl77yCXq6wxK497tm7XqoVwfsr/04xgH2gZ0jtbXe9WhmWI38/qAqu3yp+D0Cp/zu/JpWZrnJxCtCJfb+Wy3WP+xR1uMPe26xdMtiE5/89WTlw7NSx/gcC7AYhs/pPnZzk99gjuF/61/1EZrf6ea7+Rde3l+/qNwLXvH5Yhfr9Srr1c5a9BaJW/8q/9j0pRP91r/5s7/N3ctf8Nk/2ude1/hK79b9C1+x2IbK5niWpbbPI/NO6X2lXWnF+zMWBCq/wzn++HsPv1hzQOGpv/DCvjD8qEGuupjJtYlVE+9NwEVMaxYRni9xelMspV/hWEVvmXRuZA+f2nyfzenN/3+1gJ+AtSbQES6Qzh8YNSNEYXHn+7w63m4PE3JtuqBY8fIHj8DR3eViCyGpmDTf4PpQRtlimJleVtFCz8I40584PB3waptlOCH6lsQA2EVDvyW1zyT851ytvUy0POnSxyyk8MdwLk7BWWIX7/UsgpV/lvEFrlvxRybpcpYfIW7Mrvl1ywyf+FVLv55FynFL2rS8497nCvOXLuwWR7tci5DiLnHujw9gKR1cgcbPJ9lBK0S6YkRq79FHLuk8ac+cHg74dUByjBj1Q2tRKrbAf57znXKm9TKQ85D7HIuVZ6A+QsFZYhfocp5JSrPByEVnmYQs4DMiVM3oIjHHIehlRH+eRcqxSV1CXnsVPDAgnmyHkMkhVI0CLnWoicx5DDK5AARFYjc7DJLUoJOiJTEiJXAZtBzgLyvzZnfiz4BWxI5VCCH6lsaiVU2QoU4JNzjfI2rXDJWSCRRc410hsg54qwDElDH4WccpW+ILRKH4OcBRyZEiZvQRKFnAV8kCqZT841StFyTXIWSHGHqcbIWSAFk6VqkXMNQs4CKdDhpQKR1cgcbPI0RgkqkCRTEiNXOoWcadKYMz8Y/HRIlUEJfqSyqZVYZfPzyblaeZuaesgZYJFztfQGyNk0LEPim0khp1xlZhBaZSaFnBkyJUzegoIccmZCqkJ8cq5WiprokrOwOyxijpyFMVkRLXKuhsgJ/V5egSJAZDUyB5v8LErxLihTEiPX2RRyniWNOfODwT8bUp1DCX6ksqmVWGUryifnKuVtWushZzEWOVdJb4Cca8MyJL7nUsgpV3luEFrluRRyniNTwuQtKM4h57mQ6jw+OVcpRWt0yVnCHZ5vjpwlMNn5WuRcBZGzBHR45wOR1cgcbPKSlOJdXKYkRq5SFHKWlMac+cHgl4JUF1CCH6lsaiVW2S7kk/N75W2q7SHnRSxyfi+9AXLWDsuQ+F5MIadc5cVBaJUXU8h5gUwJk7fgEg45oWYdBS7lk/N7paiWLjlLu8My5shZGpOV0SLn9xA5S0OHVwaIrEbmYJNfRinel8iUxMh1OYWcl0ljzvxg8C+HVFdQgh+pbGolVtmu5JPzO+VtGu0h51Uscn4nvQFyjg7LkPheTSGnXOXVQWiVV1PIeYVMCZO3oCyHnFdDqnJ8cn6nFI3SJWd5d1jBHDnLY7IKWuT8DiJneejwKgCR1cgcbPJrKMW7rExJjFzXUsh5jTTmzA8G/1pIdR0l+JHKplZile16Pjm/Vd6maR5y3sAi57fSGyDntLAMie+NFHLKVd4YhFZ5I4Wc18mUMHkLbuKQ80ZIdTOfnN8qRVN1yXmLO6xojpy3YLKKWuT8FiLnLdDhVQQiq5E52OS3Uor3TTIlMXLdRiHnrdKYMz8Y/Nsg1e2U4Ecqm1qJVbZKfHKuVN6muh5yVmaRc6X0BshZNyxD4luFQk65yipBaJVVKOS8XaaEyVtQlUPOKpCqGp+cK5WiOrrkrO4Oa5gjZ3VMVkOLnCshclaHDq8GEFmNzMEmr0kp3lVlSmLkqkUhZ01pzJkfDH4tSFWbEvxIZVMrscpWh0/OFcrb1M1Dzroscq6Q3gA5u4VlSHzrUcgpV1kvCK2yHoWc8gPUOiZvQX0OOetBqgZ8cq5QirrqkrOhO2xkjpwNMVkjLXKugMjZEDq8RkBkNTIHm/wOSvGuL1MSI9edFHLeIY0584PBvxNS3UUJfqSyqZVYZbubT87l+SLnPSxyLpfeGDnvgeJ7L4WccpX3YuS8l0LOu2RKmLwFjTnkvBdS3ccn53IeOe93hw+YI+f9mOwBLXIuh8h5P3R4D3DIiU3+IKV4N5YpiZHrIQo5H5TGnPnB4D8EqR6mBD9S2dRKrLI9wifnMuVtGu4h56Msci6T3gA5h4dlSHybUMgpV9kkCK2yCYWcD8uUMHkLmnLI2QRSPcYn5zKlaJguOZu5w+bmyNkMkzXXIucyiJzNoMNrDkRWI3OwyVtQindTmZIYuR6nkFNm0uOc+cHgPw6pnqAEP1LZ1Eqssj3JJ6dQ3qbBHnK2ZJFTSG+AnIPDMiS+T1HIKVf5VBBa5VMUcj4hU8LkLXiaQ86nIFUrPjmFUjRIl5yt3WEbc+RsjcnaaJFTQORsDR1eGyCyGpmDTd6WUryflimJkasdhZxtpTFnfjD47SBVe0rwI5VNrcQqWxafnCHlbVrnIWcHFjlD0hsg57qwDIlvRwo55So7BqFVdqSQs71MCZO3oBOHnB0h1TN8coaUorW65HzWHXY2R85nMVlnLXKGIHI+Cx1eZyCyGpmDTd6FUrw7yZTEyPUchZxdpDFnfjD4z0Gq5ynBj1Q2tRKrbC/wyblUeZuWecj5IoucS6U3QM5lYRkS35co5JSrfCkIrfIlCjmflylh8hZ05ZDzJUjVjU/OpUqR0CVnd3f4sjlydsdkL2uRcylEzu7Q4b0MRFYjc7DJX6EU764yJTFyvUoh5yvSmDM/GPxXIdVrlOBHKptaiVW21/nkXKK8TcU85OzBIucS6Q2Qs1hYhsS3J4WccpU9g9Aqe1LI+ZpMCZO34A0OOXtCqjf55FyiFBXVJedb7vBtc+R8C5O9rUXOJRA534IO720gshqZg03+DqV4vyFTEiPXuxRyviONOfODwX8XUvWiBD9S2dRKrLL15pNzsfI2TfaQM8gi52LpDZBzcliGxDebQk65yuwgtMpsCjl7yZQweQv6cMiJqfryyblYKZqkS8733OH75sj5HiZ7X4uciyFyvgcd3vtAZDUyB5v8A0rx7iNTEiPXhxRyfiCNOfODwf8QUn1ECX6ksqmVWGX7mE/ORcrb1NNDzk9Y5FwkvQFy9gzLkPj2o5BTrrJfEFplPwo5P5IpYfIW9OeQsx+k+pRPzkVKUQ9dcg5whwPNkXMAJhuoRc5FEDkHQIc3EIisRuZgk39GKd79ZUpi5PqcQs7PpDFnfjD4n0OqQZTgRyqbWolVtsF8ci5U3qZaHnIOYZFzofQGyFkrLEPiO5RCTrnKoUFolUMp5BwkU8LkLfiCQ86hkGoYn5wLlaKauuQc7g6/NEfO4ZjsSy1yLoTIORw6vC+ByGpkDjb5CErx/kKmJEauryjkHCGNOfODwf8KUo2kBD9S2dRKrLJ9zSfnAuVtCnrI+Q2LnAukN0DOYFiGxHcUhZxylaOC0CpHUcg5UqaEyVswmkPOUZBqDJ+cC5Si3rrkHOsOx5kj51hMNk6LnAsgco6FDm8cEFmNzMEmH08p3qNlSmLkmkAh53hpzJkfDP4ESDWREvxIZVMrsco2iU/O+crb1M5Dzskscs6X3gA524VlSHynUMgpVzklCK1yCoWcE2VKmLwFUznknAKppvHJOV8paqtLzunucIY5ck7HZDO0yDkfIud06PBmAJHVyBxs8pmU4j1VpiRGrlkUcs6Uxpz5weDPglSzKcGPVDa1Eqtsc/jknKe8TTM85JzLIuc86Q2Qc0ZYhsR3HoWccpXzgtAq51HIOVumhMlbMJ9DznmQagGfnOpTmK5LzoXucJE5ci7EZIu0yDkPIudC6PAWAZHVyBxs8sWU4i1fFi/AyLWEQs7F0pgzPxj8JZBqKSX4kcqmVmKVLcQn51zlbSrlIadgkXOu9AbIWSosQ+K7jEJOucplQWiVyyjkXCpTwuQtWM4h5zJItYJPzrlKUUldcq50h9+aI+dKTPatFjnnQuRcCR3et0BkNTIHm/w7SvFeLlMSI9f3FHJ+J40584PB/x5SraIEP1LZ1Eqssq3mk3OO8jale8i5hkXOOdIbIGd6WIbEdy2FnHKVa4PQKtdSyLlKpoTJW7COQ861kOoHPjnVz2zSdMn5oztcb46cP2Ky9VrknAOR80fo8NYDkdXIHGzynyjFe51MSYxcP1PI+ZM05swPBv9nSPULJfiRyqZWYpVtA5+cs5W3qY2HnBtZ5JTv1jcC5GwTliHx/ZVCTrnKX4PQKn+lkPMXmRImb8FvHHL+Cql+55NT/ZlMa11y/uEO/zRHzj8w2Z9a5JwNkfMP6PD+BCKrkTnY5Jsoxfs3mZIYuf6ikHOTNObMDwb/L0i1mRL8SGVTK7HKtoVPzlnK21TQQ86/WeScJb0BchYMy5D4bqWQU65yaxBa5VYKOTfLlDB5C/7hkHMrpNrGJ6f6qxSZuuTc7g53mCPndky2Q4ucsyBybocObwcQWY3MwSbfSSne/8iUxMj1L4WcO6UxZ34w+P9Cql2U4Ecqm1qJVbbdfHKqv6eW4CHnHhY5Z0pvrDvQXgoT5fx7e1Not0seo8nM3ceh3V5ItV/j8IEtSeP/g3ZZM/KV6gdYqT5DemOpfpCS6nL+gzqprnQOn+PBoKEkPuPTnq5eh+e0D7FOe7r0xm7gISgnDlNyQq7yMHZyhylFUmbOYQyc+6BVHmHkdzhKR3pzXrUcgVRHKa9aIoRSKzFCHaMUl6PSGCubR4ArclpxSe6Tv+JyKbBB/A1ZQql8vXsLdh9SOSuraZf1CaVEYoJItESiLRIdkVhAJCaKRJ9ITBKJySIxRSSmisQ0kZguEjNEol8kBkRipkgsKBILicTCIrGISDxLJJ4tEs8RiUVFYjGReK5ILC4SzxOJJUTi+SKxpLF3hIkJyZDMwmQ2JnMwWQFMlojJfJgsCZMlY7IUTJaKydIwWTomy8BkfkwWwGSZmKwgJiuEyQpjsiKY7CxMdjYmOweTFcVkxTDZuZisOCY7D5OVwGTnY7KSOZ5R9Y1OwN4n4SILcnJUVdugq0qJpprUzqNKRZib6eT3ZUmOjYzPw1ZOXuQ0VbUJeavO8qoaVo+iOhvaSFJ+N7I+oQSCbGTyxATk2WKipVSFt2urVMeD4sRWZZ8IXeyWyLtPBjgxlmpD5Bh8MVRVTh1WUhRV59OONC1vVc3TDz49T9WmHOmRkZeqQs4k8uehKp0r1QK5VQ/lTsjMXKrGeaRtwZyqbnkld6Ecqm55XoHCHtXERtEuyjmuqsykqKqip1QDLouuKhZRlRsYQ3XuSdWG8rFUxU+o2m+MqTrvuKp+VmxV+M6Wa9ZAoTpfqso2V6lKIu8KMh1IlUR/MJFYUlljVroPJhJLkR5MJJaU3sBnlSvDMsTvAsaDifAqLwhCq7wgvyeX7w/iwienEK3Q/CAu8UJ3eJG5t10XYrKLdD6IO37t1LC8EALvRUBk8588F8jpoadaiRfyr/35ymj191z7i1nXXr6vvxi49v3DMsTvEsq1l6u8JAit8hL+tT9fKeqne+0vdYelzV37SzFZaa1rfz507bHX26WByOb/YSo4eRnGZ1nhmnNJNgZMaJWXMR6mJpaRxkFj859hZSyhTKixnsp4OasyyoeelwOVcWxYhvhdQamMcpVXBKFVXsH4pCac35eZzO8rKZ+nJF4Bqa6if3krnNwK0RhdeFztDsuag8fVmKysFjxKQPC4Gjq8skBkNTIHm7wcpQRdKVMSK8vlKVgoJ40584PBLw+pKlCCH6lsQA2EVNfkt7jkn5znKW9TLw85r2WRU35ieC1Azl5hGeJ3HYWccpXXBaFVXkchZwWZEiZvwfWUL4IlXgepbuCT8zyl6F1dct7oDm8yR84bMdlNWuQ8DyLnjdDh3QREViNzsMlvppSg62VKYuS6hULOm6UxZ34w+LdAqoqU4Ecqm1qJVbZb+e85iytvk6e9U+JtLHIWl95QeycpQ/xup5BTrvJ2qL1TeH6FnQ45K8qUMHkLKnHIeTukqswnZ3GlSLe9U2IVd1jVHDmrYLKqWuQsDpGzCnR4VYHIamQONnk1SgmqJFMSI1d1CjmrSWPO/GDwq0OqGpTgRyqbWolVtpp8cp6rvE0rPOSsxSLnudIbIOeKsAzxq00hp1xl7SC0ytoUctaQKWHyFtThkLM2pKrLJ+e5StFyXXLWc4f1zZGzHiarr0XOcyFy1oMOrz4QWY3MwSZvQClBdWRKYuRqSCFnA2nMmR8MfkNI1YgS/EhlUyuxynYHn5zFlLepqYecd7LIWUx6A+RsGpYhfndRyClXeVcQWuVdFHI2kilh8hbczSHnXZDqHj45iylFTXTJea87bGyOnPdissZa5CwGkfNe6PAaA5HVyBxs8vsoJehumZIYue6nkPM+acyZHwz+/ZDqAUrwI5VNrcQq24N8chZV3qa1HnI+xCJnUekNkHNtWIb4PUwhp1zlw0FolQ9TyPmATAmTt+ARDjkfhlSP8slZVClao0vOJu6wqTlyNsFkTbXIWRQiZxPo8JoCkdXIHGzyxygl6BGZkhi5mlHI+Zg05swPBr8ZpGpOCX6ksqmVWGVrwSfnOcrbVNtDzsdZ5DxHegPkrB2WIX5PUMgpV/lEEFrlExRyNpcpYfIWPMkh5xOQqiWfnOcoRbV0yfmUO3zaHDmfwmRPa5HzHIicT0GH9zQQWY3MwSZvRSlBT8qUxMjVmkLOVtKYMz8Y/NaQqg0l+JHKplZila0tn5xnK2/TaA8527HIebb0Bsg5OixD/NpTyClX2T4IrbI9hZxtZEqYvAVZHHK2h1Qd+OQ8WykapUvOju6wkzlydsRknbTIeTZEzo7Q4XUCIquROdjkz1BKUJZMSYxcz1LI+Yw05swPBv9ZSNWZEvxIZVMrscrWhU/Os5S3aZqHnM+xyHmW9AbIOS0sQ/yep5BTrvL5ILTK5ynk7CxTwuQteIFDzuch1Yt8cp6lFE3VJedL7rCrOXK+hMm6apHzLIicL0GH1xWIrEbmYJN3o5SgF2RKYuTqTiFnN2nMmR8MfndI9TIl+JHKplZile0VPjmLKG9TXQ85X2WRs4j0BshZNyxD/F6jkFOu8rUgtMrXKOR8WaaEyVvwOoecr0GqHnxyFlGK6uiSs6c7fMMcOXtisje0yFkEImdP6PDeACKrkTnY5G9SStDrMiUxcr1FIeeb0pgzPxj8tyDV25TgRyqbWolVtnf45CysvE3dPOR8l0XOwtIbIGe3sAzx60Uhp1xlryC0yl4Ucr4tU8LkLejNIWcvSBXkk7OwUtRVl5yeYR9z5MzGZH20yFkYIid2xH2AyGpkDqbqSylBvWVKYuR6j0LOvtKYMz8Y/Pcg1fuU4Ecqm1qJVbYP+OQslC9yfsgiZyHpjZHzQ2hbH1HIKVf5EUbOjyjkfF+mhMlb8DGHnB9Bqk/45CzEI2c/d9jfHDn7YbL+WuQsBJGzH3R4/TnkxCb/lFKCPpYpiZFrAIWcn0pjzvxg8AdAqoGU4Ecqm1qJVbbP+OQsqLxNwz3k/JxFzoLSGyDn8LAM8RtEIadc5aAgtMpBFHIOlClh8hYM5pBzEKQawidnQaVomC45h7rDL8yRcygm+0KLnAUhcg6FDu8LILIamYNNPoxSggbLlMTINZxCzmHSmDM/GPzhkOpLSvAjlU2txCrbCD45M5W3abCHnF+xyJkpvQFyDg7LEL+RFHLKVY4MQqscSSHnlzIlTN6CrznkHAmpvuGTM1MpGqRLzlHucLQ5co7CZKO1yJkJkXMUdHijgchqZA42+RhKCfpapiRGrrEUco6Rxpz5weCPhVTjKMGPVDa1Eqts4/nkDChv0zoPOSewyBmQ3gA514VliN9ECjnlKicGoVVOpJBznEwJk7dgEoecEyHVZD45A0rRWl1yTnGHU82Rcwomm6pFzgBEzinQ4U0FIquROdjk0yglaJJMSYxc0ynknCaNOfODwZ8OqWZQgh+pbGolVtlm8snpV96mZR5yzmKR0y+9AXIuC8sQv9kUcspVzg5Cq5xNIecMmRImb8EcDjlnQ6q5fHL6lSKhS8557nC+OXLOw2Tztcjph8g5Dzq8+UBkNTIHm3wBpQTNkSmJkWshhZwLpDFnfjD4CyHVIkrwI5VNrcQq22I+OTOUt6mYh5xLWOTMkN4AOYuFZYjfUgo55SqXBqFVLqWQc5FMCZO3IMQh51JIJfjkzFCKiuqSc5k7XG6OnMsw2XItcmZA5FwGHd5yILIamYNNvoJSgkIyJTFyraSQc4U05swPBn8lpPqWEvxIZVMrscr2HZ+c6crbNNlDzu9Z5EyX3gA5J4dliN8qCjnlKlcFoVWuopDzW5kSJm/Bag45V0GqNXxypitFk3TJudYdrjNHzrWYbJ0WOdMhcq6FDm8dEFmNzMEm/4FSglbLlMTI9SOFnD9IY878YPB/hFTrKcGPVDa1EqtsP/HJmaa8TT095PyZRc406Q2Qs2dYhvj9QiGnXOUvQWiVv1DIuV6mhMlbsIFDzl8g1UY+OdOUoh665PzVHf5mjpy/YrLftMiZBpHzV+jwfgMiq5E52OS/U0rQBpmSGLn+oJDzd2nMmR8M/h+Q6k9K8COVTa3EKtsmPjlTlbeploecf7HImSq9AXLWCssQv80UcspVbg5Cq9xMIeefMiVM3oItHHJuhlR/88mZqhTV1CXnVnf4jzlybsVk/2iRMxUi51bo8P4BIquROdjk2yglaItMSYxc2ynk3CaNOfODwd8OqXZQgh+pbGolVtl28smZorxNQQ85/2WRM0V6A+QMhmWI3y4KOeUqdwWhVe6ikHOHTAmTt2A3h5y7INUePjlTlKLeuuTc6w73mSPnXky2T4ucKRA590KHtw+IrEbmYJPvp5Sg3TIlMXIdoJBzvzTmzA8G/wCkOkgJfqSyqZVYZTvEJ2ey8ja185DzMIucydIbIGe7sAzxO0Ihp1zlkSC0yiMUch6UKWHyFhzlkPMIpDrGJ2eyUtRWk5y+BHdoGSOnD5RZWuRMRsjpS0AOz2cBkc1/5oCT25QSdFSmJEQun8Mgp8+Wxpz5weA7kKoAJfiRyqZWQpXNl8gnZ5LyNs1wyenzsciZJL0Bcs4Iy5A0TKKQU64yKQitMolBTl8BmRImb0EyhZy+JEiVwien+hSm65Iz1R2mmSNnKiZL0yJnEkTOVOjw0oDIamQONnk6owT5kmVKYuTKoJAzXRpz5geDnwGp/JTgRyqbWolVtgCfnD7lbSrlIWcmi5w+6Q2Qs1RYhsS3IIWccpUFg9AqC1LI6ZcpYfIWFOKQsyCkKswnp08pKqlLziLu8Cxz5CyCyc7SIqcPImcR6PDOAiKrkTnY5GdTinchmZIYuc6hkPNsacyZHwz+OZCqKCX4kcqmVmKVrRifnInK25TuIee5LHImSm+AnOlhGRLf4hRyylUWD0KrLE4hZ1GZEiZvwXkcchaHVCX45FQ/s0nTJef57rCkOXKej8lKapEzESLn+dDhlQQiq5E52OSlKMX7PJmSGLkuoJBTvt6+gDM/GPwLINWFlOBHKptaiVW2i/jkLKC8TW085LyYRU75bv1igJxtwjIkvpdQyClXeUkQWuUlFHJeKFPC5C24lEPOSyBVaT451Z/JtNYlZxl3eJk5cpbBZJdpkbMARM4y0OFdBkRWI3OwyS+nFO9LZUpi5LqCQs7LpTFnfjD4V0CqKynBj1Q2tRKrbFfxyekob1NBDzmvZpHTkd4AOQuGZUh8y1LIKVdZNgitsiyFnFfKlDB5C8pxyFkWUpXnk1P9VYpMXXJWcIfXmCNnBUx2jRY5HYicFaDDuwaIrEbmYJNfSyne5WRKYuS6jkLOa6UxZ34w+NdBquspwY9UNrUSq2w38Mmp/p5agoecN7LIaUtvaMG+myhMlPPf1JtCu+vlMZrM3Js5tLsJUt2icfjAlqRxb36qW/lK9YqsVJc5XBFL9VspqR421kl1pXP4HG8NGkriMz7tBPU6PKd9G+u05WZvw27gbVBO3E7JCTn97djJ3U4pkjJzbsfAeTO0ykqM/A5HqVJvzquWSpCqMuVVS4RQaiVGqCqU4lJZGmNlsxJwRU4rLlaf7kMqZ2U17bI+oRpSB5ohot2IqDYiehIseY66vVcCavWjOasfzFmtM2e11pzVGnNWq81ZrTJn9b05q+/MWX1rzmqlOasV5qyWm7NaZs5KmLMKmbNaas5qiTmrxeasFpmzWmjOaoE5q/nmrOaZs5przmqOOavZ5qxmmbOaac5qhjmr6casEkuaszrfnFUJc1bnmbMqbs7qXHNWxcxZFTVndY45q7PNWZ1lzqqIOavC5qwKmbMqaM4q05xVwJyV35xVhjmrdHNWaeasUs1ZpZizSjZnlWTOymfOKtGcVQFzVo45K9uclWXOKkFtlY9vJyRUy49YPsGPPLjLFL6qwldN+KoLXw3hqyl8tYSvtvDVEb66wldP+OoLXwPhayh8jYTvDuG709zXHaqVgmTVMVkNTFYTk9XCZLUxWR1MVheT1cNk9TFZA0zWEJM1wmR3YLI7S53+mQD2HLtq7OfYb6dN+Oh02/eQx/POOuQLNM4PStXxx8Qq1Ynn0tB2qwGFRGO7q6Dtroa2uwba7lpou9Xzu90+0OTQn1jy1ZCq8/4pvmeMU+S9S+2t626fc+TBogWqX7mn1tAWzXuX+aZfiyfWisB+zokI6ESWQSeyHArKCigoNTnbXQxtdwm03aXQdkPQdmtxEnARNHltqbp49ZSkfV/2KjBm7Y62z+65vM+Smu/MGFExW1x1W7e7fnt/W30R2M05kdnQicyBTmQuFJR5UFDqcLY7HdruDGi7M6HtQn9b3FeXst3E85DtJpZAtpt4PrLdxJLQdutxtlsU2m4xaLvnQtstDm23PqW8JJ4DTd4A4VtmEudEMqETKQidSCEoKIWhoDTkbBf703QZ0Hb90HYD0HYbcRIwDZr8DoRvmQ7nRKBfLgN+eTsBaY5y4okQFJQ787td7Ctpd8W2bba79pM6tnfHtn0q5c8ndGzviW079YmvX9OxvTe2bcU2u7J0bBvHth3ScM/NOrb3xba9w39nVx3b+2PbfpL45Ns6tg/Eti35yroROrYPxrZ9cIMolsfThdF3Pdm0wnXXV23bul2WfLjQsm2bPvLpl+dhw13eR1Pe50/eh0zeJ0nex0XeZ0LeBz/epzveRzje5zTehzHeJy7exyreZyfeByQfev6Puz3jezzjez3jxp7xfZ7x/Z7xA57xgx8K30PC97DwPSJ8jwpfE+FrKnyPCV+z+FcBFVbxrwLGvwp4yir+VcD4VwFPWcW/Chj/KuApq/hXAeNfBTxlFf8qYPyrgKes4l8FjH8V8JRV/KuA8a8CnrKKfxUw/lXAU1bxrwLGvwp42n/y9VXASqd9FbC58LUQvseF7wnhe1L4WgrfU8L3tPC1Er7WwtdG+NoKXzvhay98WcLXwdxXAZuX0vm8RvUXxU58XmNBn9fY0Oc1DvR5TXPgPDW+19aCY/s4x/YJju2THNuWHNunOLZPc2xbcWxbc2zbcGzbcmzbcWzbc2yzOLYddGzVHwh2jG3bTdO2E2e1z6hs7VI6H18294w7esad/sPjZ7wfXz7kGT/sGT/iGT/qGTfxjJt6xo95xs3kx5fPCl9n4esifM8J3/PC94LwvSh8L53+8WVyn3y2SfI9a/Y1W4F8daKMvGbrK3xdha+b8HUXvpfNvRrrmgzJumGy7pjs5eTcLwFVu5HHAF25rsgLRV835IWirzvyQtH3MpAeZ5iBnf8jGfiK8L0qfK8J3+vmMvAVLGdexWSvYbLXtTKwM5SBr0AZ+CqUga9BGfg6PwO7/EcysIfw9RS+N4TvTXMZ2APLmZ6Y7A1M9qZWBnaBMrAHlIE9oQx8A8rAN/kZ+Nx/JAPfEr63he8d4XvXXAa+heXM25jsHUz2rlYGPgdl4FtQBr4NZeA7UAa+y8/A5/8jGdhL+HoLX1D4ss1lYC8sZ3pjsiAmy9bKwOehDOwFZWBvKAODUAZm8zPwhf9IBvYRPvn/f0/43jeXgX2wnOmLyd7DZO9rZeALUAb2gTKwL5SB70EZ+D4/A1/8j2TgB8In3+9/JHwfm8vAD7Cc+RCTfYTJPtbKwBehDPwAysAPoQz8CMrAj/kZ+NJ/JAM/Eb5+wtdf+D41l4GfYDnTD5P1x2SfamXgS1AGfgJlYD8oA/tDGfgp50nugNi2B+/4tI6O7cCotvap1eY+w3GN2nZo0bJ52zYVGrXIat2pY9OO8hlxdl/PmQ44NS4d5XnsQJnCnwnf58I3SPgGn9mlPNfslSyldSXXJ5QSviHCN1T4vhC+YcI3XPi+FL4RwveV8I0Uvq+F7xvhGyV8o4VvjPCNFb5xwjde+CYI30ThmyR8k4VvivBNFb5pwjdd+GYI30zhmyV8s4VvjvDNFb555i76EOxqDsVkX2CyYZhsOCb7EpONwGRfYbKRmOxrTPYNJhuFyUZjsjGYbCwmG4fJxmOyCZhsIiabhMkmY7IpmGwqJpuGyaZjshmYbCYmm4XJZmOyOZhsLiabl+PFQoy3L71PYk5CeWRUVdugq/o6mmpSO4/qGwSsmZfm92VAjo2Mz8NWTj75NFW1CXmrpnhVDatHUU2FNnJ5fjeyPqEEgmzo5ckQ6OXbUOjl2xfQy7dhsVXZJ0I3PKZq98kAfxlLtSFyDCNiqKqcOqyvoqg6n3ako/JW1Tz94EfnqdqUIz3G5KWqkDOJxuahKp0r1cblVj2UOyHH51I1ziNtJ+RUdcsruSfmUHXL8wpM8qgmNop2Uaa5qjKToqrcFj4DLouuOtXCp9zAGKpIC58N5WOpZp1Qtd8YU3Wik1L9rNiq452UmjVQqMKdlMo2V6mgTkqZl0Kqy/P7hj4lv3+FyjdPWWNWev4K1XzSX6HyzZPewB+mXRmWIX4L1AVWb5ULgtAqF+T35PL9V1d96t8cXKH7V1cXusNF5t52LcRki3T+6urxa6eG5UIIvIuAyOY/eRbI6bHnEgv5136uMlr9Pdd+Mevay/f1i4Fr3z8sQ/yWUK69XOWSILTKJfxrr/4t3366136pOwyZu/ZLMVlI69rPha79UujahYDIavzlPGxyoXG/1K6y5izB/nLeAmiVQG8GjfslpHHQ2PxnWBnnKBNqrKcyLmdVRvnQczlQGceGZYjfCkpllKtcEYRWuUIjc6D8XmYyv1fmc5VgCVgBqb4FEukM4aHu6zBGFx7fucPvzcHjO0z2vRY85kDw+A46vO+ByGpkDjb5KkoJkm9jvsXK8moKFlZJY878YPBXQ6o1lOBHKhtQAyHV2vwWl/yTc7byNvXykHMdi5yzpTdAzl5hGeL3A4WccpU/BKFV/kAh5xqZEiZvwY/5PEvwCv4AqdbzyaluY/SuLjl/coc/myPnT5jsZy1yQg3qfT9Bh/czEFmNzMEm/4VSgn6UKYmRawOFnL9IY878YPA3QKqNlOBHKptaiVW2X/nvOWcpb1MpDzl/Y5FzlvQGyFkqLEP8fqeQU67y9yC0yt8p5NwoU8LkLfiDQ87fIdWffHKqu/aV1CXnJnf4lzlybsJkf2mRcxZEzk3Q4f0FRFYjc7DJN1NK0B8yJTFybaGQc7M05swPBn8LpPqbEvxIZVMrscq2lU/OmcrbtMJDzn9Y5JwpvQFyrgjLEL9tFHLKVW4LQqvcRiHn3zIlTN6C7RxyboNUO/jkVDepXa5Lzp3u8F9z5NyJyf7VIudMiJw7ocP7F4isRuZgk++ilKDtMiUxcu2mkHOXNObMDwZ/N6TaQwl+pLKplVhl28sn5wzlbWrqIec+FjlnSG+AnE3DMsRvP4WccpX7g9Aq91PIuUemhMlbcIBDzv2Q6iCfnOqe7E10yXnIHR42R85DmOywFjlnQOQ8BB3eYSCyGpmDTX6EUoIOyJTEyHWUQs4j0pgzPxj8o5DqGCX4kcqmVkKVLSmBT87pytu01iVnksUi53TpDZBzbVgG+CXZFHLKVdpBaJU2hZzHZEoYvAVJDoWcSTakKsAnp/pPkKzRJGdSojv0GSNnUiIm82mRE/rL1EmJ0OH5gMhqZA42eRKjBCU5MiUhciUlM8iZlCSNOfODwU+GVCmU+h+pbGolVtlS+eScprxNtT3kTGORc5r0BshZOyxD0jCdQk65yvQgtMp0BjmTUmRKmLwFGRxypkMqP5+c05SiWrrkDLjDTHPkDGCyTC1yToPIGYAOLxOIrEbmYJMXpJAzQ6YkRq5CFHIWlMac+cHgF4JUhSnBj1Q2tRKrbEX45JyqvE2jPeQ8i0XOqdIbIOfosAyJ79kUcspVnh2EVnk2hZyFZUqYvAXncMh5NqQqyifnVKVolC45i7nDc82RsxgmO1eLnFMhchaDDu9cILIamYNNXpxSvM+RKYmR6zwKOYtLY878YPDPg1QlKMGPVDa1Eqts5/PJOUV5m6Z5yFmSRc4p0hsg57SwDIlvKQo55SpLBaFVlqKQs4RMCZO34AIOOUtBqgv55JyiFE3VJedF7vBic+S8CJNdrEXOKRA5L4IO72IgshqZg01+CaV4XyBTEiPXpRRyXiKNOfODwb8UUpWmBD9S2dRKrLKV4ZNzsvI21fWQ8zIWOSdLb4CcdcMyJL6XU8gpV3l5EFrl5RRylpYpYfIWXMEh5+WQ6ko+OScrRXV0yXmVO7zaHDmvwmRXa5FzMkTOq6DDuxqIrEbmYJOXpRTvK2RKYuQqRyFnWWnMmR8MfjlIVZ4S/EhlUyuxylaBT85JytvUzUPOa1jknCS9AXJ2C8uQ+F5LIadc5bVBaJXXUshZXqaEyVtwHYec10Kq6/nknKQUddUl5w3u8EZz5LwBk92oRc5JEDlvgA7vRiCyGpmDTX4TpXhfJ1MSI9fNFHLeJI0584PBvxlS3UIJfqSyqZVYZavIJ+fEfJHzVhY5J0pvjJy3QvG9jUJOucrbMHLeRiHnLTIlTN6C2znkvA1SVeKTcyKPnJXdYRVz5KyMyapokXMiRM7K0OFV4ZATm7wqpXjfLlMSI1c1CjmrSmPO/GDwq0Gq6pTgRyqbWolVthp8ck5Q3qbhHnLWZJFzgvQGyDk8LEPiW4tCTrnKWkFolbUo5KwuU8LkLajNIWctSFWHT84JStEwXXLWdYf1zJGzLiarp0XOCRA560KHVw+IrEbmYJPXpxTv2jIlMXI1oJCzvjTmzA8GvwGkakgJfqSyqZVYZWvEJ+d45W0a7CHnHSxyjpfeADkHh2VIfO+kkFOu8s4gtMo7KeRsKFPC5C24i0POOyHV3XxyjleKBumS8x53eK85ct6Dye7VIud4iJz3QId3LxBZjczBJm9MKd53yZTEyHUfhZyNpTFnfjD490Gq+ynBj1Q2tRKrbA/wyTlOeZvWecj5IIuc46Q3QM51YRkS34co5JSrfCgIrfIhCjnvlylh8hY8zCHnQ5DqET45xylFa3XJ+ag7bGKOnI9isiZa5BwHkfNR6PCaAJHVyBxs8qaU4v2wTEmMXI9RyNlUGnPmB4P/GKRqRgl+pLKplVhla84n51jlbVrmIWcLFjnHSm+AnMvCMiS+j1PIKVf5eBBa5eMUcjaTKWHyFjzBIefjkOpJPjnHKkVCl5wt3eFT5sjZEpM9pUXOsRA5W0KH9xQQWY3MwSZ/mlK8n5ApiZGrFYWcT0tjzvxg8FtBqtaU4Ecqm1qJVbY2fHKOUd6mYh5ytmWRc4z0BshZLCxD4tuOQk65ynZBaJXtKORsLVPC5C1ozyFnO0iVxSfnGKWoqC45O7jDjubI2QGTddQi5xiInB2gw+sIRFYjc7DJO1GKd3uZkhi5nqGQs5M05swPBv8ZSPUsJfiRyqZWYpWtM5+co5W3abKHnF1Y5BwtvQFyTg7LkPg+RyGnXOVzQWiVz1HI+axMCZO34HkOOZ+DVC/wyTlaKZqkS84X3eFL5sj5IiZ7SYucoyFyvggd3ktAZDUyB5u8K6V4Py9TEiNXNwo5u0pjzvxg8LtBqu6U4Ecqm1qJVbaX+eQcpbxNPT3kfIVFzlHSGyBnz7AMie+rFHLKVb4ahFb5KoWc3WVKmLwFr3HI+Sqkep1PzlFKUQ9dcvZwhz3NkbMHJuupRc5REDl7QIfXE4isRuZgk79BKd6vyZTEyPUmhZxvSGPO/GDw34RUb1GCH6lsaiVW2d7mk/Mb5W2q5SHnOyxyfiO9AXLWCsuQ+L5LIadc5btBaJXvUsj5lkwJk7egF4ec70Kq3nxyfqMU1dQlp+dSZJsjZxCTZWuR8xuInFjxzgYiq5E52OR9KMW7l0xJbP6+FHL2kcac+cHg94VU71GCH6lsaiVW2d7nk/Nr5W0KeorEByxyfi29AXIGwzIkvh9SyClX+WEQWuWHFHK+J1PC5C34iEPODyHVx3xyfq0U9dYl5yfusJ85cn6CyfppkfNriJyfQIfXD4isRuZgk/enFO+PZEpi5PqUQs7+0pgzPxj8TyHVAErwI5VNrcQq20A+OUcqb1M7Dzk/Y5FzpPQGyNkuLEPi+zmFnHKVnwehVX5OIecAmRImb8EgDjk/h1SD+eQcqRS11SXnEHc41Bw5h2CyoVrkHAmRcwh0eEOByGpkDjb5F5TiPUimJEauYRRyfiGNOfODwR8GqYZTgh+pbGolVtm+5JPzK+VtmuEh5wgWOb+S3gA5Z4RlSHy/opBTrvKrILTKryjkHC5TwuQtGMkh51eQ6ms+OdWnMF2XnN+4w1HmyPkNJhulRc6vIHJ+Ax3eKCCyGpmDTT6aUrzly+KvMXKNoZBztDTmzA8GfwykGksJfqSyqZVYZRvHJ+cI5W0q5SHneBY5R0hvgJylwjIkvhMo5JSrnBCEVjmBQs6xMiVM3oKJHHJOgFST+OQcoRSV1CXnZHc4xRw5J2OyKVrkHAGRczJ0eFOAyGpkDjb5VErxnihTEiPXNAo5p0pjzvxg8KdBqumU4Ecqm1qJVbYZfHJ+qbxN6R5yzmSR80vpDZAzPSxD4juLQk65yllBaJWzKOScLlPC5C2YzSHnLEg1h09O9TObNF1yznWH88yRcy4mm6dFzi8hcs6FDm8eEFmNzMEmn08p3rNlSmLkWkAh53xpzJkfDP4CSLWQEvxIZVMrscq2iE/O4crb1MZDzsUscsp364sBcrYJy5D4LqGQU65ySRBa5RIKORfKlDB5C5ZyyLkEUoX45FR/JtNal5zCHS4zR06ByZZpkXM4RE4BHd4yILIamYNNvpxSvJfKlMTItYJCzuXSmDM/GPwVkGolJfiRyqZWYpXtWz45hylvU0EPOb9jkXOY9AbIWTAsQ+L7PYWccpXfB6FVfk8h50qZEiZvwSoOOb+HVKv55FR/lSJTl5xr3OFac+Rcg8nWapFzGETONdDhrQUiq5E52OTrKMV7lUxJjFw/UMi5Thpz5geD/wOk+pES/EhlUyuxyraeT07199QSPOT8iUXOL6Q3tOCknylMlPP/3JtCux/lMZrM3F84tPsZUm3QOHxgS9K4Nz/Vh+Yr1TeyUn2o9MZS/VdKqsv5f9VJdaVz+Bx/DRpK4jM+7SHqdXhO+zfWaQ+R3tgN/A3Kid8pOSFX+Tt2cr9TiqTMnN8xcP4CrfIPRn6Ho/RHb86rlj8g1Z+UVy0RQqmVGKE2UYrLn9IYK5t/AFfktOKS3Cd/xcUCNoi/IUsola93b8HuQypnZTXtsj6hlEj6SyRtFklbRNLfImmrSPpHJG0TSdtF0g6RtFMk/SuSdomk3SJpj0jaK5L2iaT9IumASDookg6JpMMi6YhIOiqSjonkBJFsiWRbJDsiuYBIThTJPpGcZO4d4V/JkGwzJtuCyf7GZFsx2T+YbBsm247JdmCynZjsX0y2C5PtxmR7MNleTLYPk+3HZAcw2UFMdgiTHcZkRzDZUUx2DJIlJ2AyC5PZmMzBZAUwWSIm82GypBzPqGL8Tmzvk3CRBNoRVdU26Kp2RlNNaudR/YswN/O6/L4sybGR8XnYyskPn6aqNiFv1RGvqmH1KKqj0EZuyu9G1ieUQJANvXL5C3q2uFmpCm93i0p1PCh/x1Zlnwjd1piq3ScD/E8s1YbIMWyLoapy6rC2R1F1Pu1Id+Wtqnn6we/OU7UpR3rsyUtVIWcS7c1DVTpXqu3LrXood0Luz6VqnEfaHsip6pZXch/MoeqW5xU45FFNbBTtohxzVWUmRVMlJ5xSDbgsuupU3pcbGENln1RtKB9L5ZxQtd8YU1XguKp+VmxVYljVrIFC5ZOqss1VKqC5lCUrJKS6if5gIjlJWWNWug8mkpNJDyaSk6Q38FnlyrAM8UthPJgIrzIlCK0yJb8nl+8P4sInpxCt0PwgLjnVHaYZe9uVnIrJ0nQ+iDt+7ZSwTE5FwJucBkQ2/8mTIqeHnmolp/KvvU8Zrf6ea5/OuvbyfX06cO37h2WIXwbl2stVZgShVWbwr71PKeqne+397jBg7tr7MVlA69r7oGvvh65dAIhs/h+mgpNnMj7LCtecjGwMmNAqCzIepiZnSuOgsfnPsDImKhNqrKcyFmJVRvnQsxBQGceGZYhfYUpllKssHIRWWZjxSU04vwuazO8ilM9TkgtDqrPoX94KJ7dCNEYXHme7w3PMweNsTHaOFjwSIXicDR3eOUBkNTIHm7wopQQVkSmJleViFCwUlcac+cHgF4NU51KCH6lsQA2EVMXzW1zyT84CytvUy0PO81jklJ8YngeQs1dYhviVoJBTrrJEEFplCQo5z5UpYfIWnE/5IlhyCUhVkk/OAkrRu7rkLOUOLzBHzlKY7AItchaAyFkKOrwLgMhqZA42+YWUEnS+TEmMXBdRyHmhNObMDwb/Ikh1MSX4kcqmVmKV7RL+e05HeZs87Z2SL2WR05HeUHsnKUP8SlPIKVdZGmrvFJ5fYadDzotlSpi8BWU45CwNqS7jk9NRinTbOyVf7g6vMEfOyzHZFVrkdCByXg4d3hVAZDUyB5v8SkoJKiNTEiPXVRRyXimNOfODwb8KUl1NCX6ksqmVWGUryyenrbxNKzzkLMcipy29AXKuCMsQv/IUcspVlg9CqyxPIefVMiVM3oIKHHKWh1TX8MlpK0XLdcl5rTu8zhw5r8Vk12mR04bIeS10eNcBkdXIHGzy6yklqIJMSYxcN1DIeb005swPBv8GSHUjJfiRyqZWYpXt/+CLX5byNjX1kPNmFjnlf28GyNk0LEP8bqGQM2wchFZ5C4WcN8qUMHkLKnLIeQukupVPTvXvRDXRJedt7vB2c+S8DZPdrkVOCyLnbdDh3Q5EViNzsMkrUUpQRZmSGLkqU8hZSRpz5geDXxlSVaEEP1LZ1EqsslXlkzNBeZvWeshZjUVOudlqADnXhmWIX3UKOeUqqwehVVankLOKTAmTt6AGh5zVIVVNPjkTlKI1uuSs5Q5rmyNnLUxWW4ucCRA5a0GHVxuIrEbmYJPXoZSgGjIlMXLVpZCzjjTmzA8Gvy6kqkcJfqSyqZVYZatPJ2fSMeVtqu0hZwMSOcMtBhoA5KwdliHxbcggZ3iVDYPQKhtSyFlPpoTJW9CIQ86GkOoOOjnDya0Q1dIl553u8C5z5LwTk92lQ07vr43GIOed0OHdBURWI3Owye+mFO9GMiUxct1DIefd0pgzPxj8eyDVvZTgRyqbWolVtsZ8ch5V3qbRHnLexyLnUekNkHN0WIbE934KOeUq7w9Cq7yfQs57ZUqYvAUPcMh5P6R6kE/Oo0rRKF1yPuQOHzZHzocw2cNa5DwKkfMh6PAeBiKrkTnY5I9QivcDMiUxcj1KIecj0pgzPxj8RyFVE0rwI5VNrcQqW1M+OY8ob9M0DzkfY5HziPQGyDktLEPi24xCTrnKZkFolc0o5GwiU8LkLWjOIWczSNWCT84jStFUXXI+7g6fMEfOxzHZE1rkPAKR83Ho8J4AIquROdjkT1KKd3OZkhi5WlLI+aQ05swPBr8lpHqKEvxIZVMrscr2NJ+ch5W3qa6HnK1Y5DwsvQFy1g3LkPi2ppBTrrJ1EFplawo5n5IpYfIWtOGQszWkassn52GlqI4uOdu5w/bmyNkOk7XXIudhiJztoMNrD0RWI3OwybMoxbuNTEmMXB0o5MySxpz5weB3gFQdKcGPVDa1EqtsnfjkPKS8Td085HyGRc5D0hsgZ7ewDInvsxRyylU+G4RW+SyFnB1lSpi8BZ055HwWUnXhk/OQUtRVl5zPucPnzZHzOUz2vBY5D0HkfA46vOeByGpkDjb5C5Ti3VmmJEauFynkfEEac+YHg/8ipHqJEvxIZVMrscrWlU/Og/kiZzcWOQ9Kb4yc3aD4dqeQU66yO0bO7hRyviRTwuQteJlDzu6Q6hU+OQ/yyPmqO3zNHDlfxWSvaZHzIETOV6HDe41DTmzy1ynF+2WZkhi5elDI+bo05swPBr8HpOpJCX6ksqmVWGV7g0/OA8rbNNxDzjdZ5DwgvQFyDg/LkPi+RSGnXOVbQWiVb1HI2VOmhMlb8DaHnG9Bqnf45DygFA3TJee77rCXOXK+i8l6aZHzAETOd6HD6wVEViNzsMk5vxj3tkxJjFxBCjl7S2PO/GDwscmzKcGPVDa1Eqtsffjk3K+8TYM95OzLIud+6Q2Qc3BYhsT3PQo55SrfC0KrfI9CzmyZEiZvwfsccr4HqT7gk3O/UjRIl5wfusOPzJHzQ0z2kRY590Pk/BA6vI+AyGpkDjb5x5Ti/b5MSezafEIh58fSmDM/GPxPIFU/SvAjlU2txELUn0/OfcrbtM5Dzk9Z5NwnvQFyrgvLkPgOoJBTrnJAEFrlAAo5+8mUMHkLBnLIOQBSfcYn5z6laK0uOT93h4PMkfNzTDZIi5z7IHJ+Dh3eICCyGpmDTT6YUrwHypTEyvIQCjnl6+0hnPnB4A+BVEMpwY9UNrUSq2xf8Mm5V3mblnnIOYxFzr3SGyDnsrAMie9wCjnlKocHoVUOp5BzqEwJk7fgSw45h0OqEXxy7lWKhC45v3KHI82R8ytMNlKLnHshcn4FHd5IILIamYNN/jWleH8pUxIj1zcUcn4tjTnzg8H/BlKNogQ/UtnUSqyyjeaTc4/yNhXzkHMMi5x7pDdAzmJhGRLfsRRyylWODUKrHEsh5yiZEiZvwTgOOcdCqvF8cu5RiorqknOCO5xojpwTMNlELXLugcg5ATq8iUBkNTIHm3wSpXiPkymJkWsyhZyTpDFnfjD4kyHVFErwI5VNrcQq21Q+OXcrb9NkDzmnsci5W3oD5JwcliHxnU4hp1zl9CC0yukUck6RKWHyFszgkHM6pJrJJ+dupWiSLjlnucPZ5sg5C5PN1iLnboics6DDmw1EViNzsMnnUIr3DJmSGLnmUsg5Rxpz5geDPxdSzaMEP1LZ1Eqsss3nk3OX8jb19JBzAYucu6Q3QM6eYRkS34UUcspVLgxCq1xIIec8mRImb8EiDjkXQqrFfHLuUop66JJziTtcao6cSzDZUi1y7oLIuQQ6vKVAZDUyB5s8RCnei2RKYuQSFHKGpDFnfjD4AlItowQ/UtnUSqyyLeeT81/lbarlIecKFjn/ld4AOWuFZUh8V1LIKVe5MgitciWFnPID1OUmb8G3HHKuhFTf8cn5r1JUU5ec37vDVebI+T0mW6VFzn8hcn4PHd4qILIamYNNvppSvL+VKYmRaw2FnKulMWd+MPhrINVaSvAjlU2txCrbOj45dypvU9BDzh9Y5NwpvQFyBsMyJL4/UsgpV/ljEFrljxRyrpUpYfIWrOeQ80dI9ROfnDuVot665PzZHf5ijpw/Y7JftMi5EyLnz9Dh/QJEViNzsMk3UIr3epmSGLk2Usi5QRpz5geDvxFS/UoJfqSyqZVYZfuNT84dytvUzkPO31nk3CG9AXK2C8uQ+P5BIadc5R9BaJV/UMj5q0wJk7fgTw45/4BUm/jk3KEUtdUl51/ucLM5cv6FyTZrkXMHRM6/oMPbDERWI3OwybdQivefMiUxcv1NIecWacyZHwz+35BqKyX4kcqmVmKV7R8+Obcrb9MMDzm3sci5XXoD5JwRliHx3U4hp1zl9iC0yu0Ucm6VKWHyFuzgkHM7pNrJJ6f6FKbrkvNfd7jLHDn/xWS7tMi5HSLnv9Dh7QIiq5E52OS7KcVbvizeiZFrD4Wcu6UxZ34w+Hsg1V5K8COVTa3EKts+Pjm3KW9TKQ8597PIuU16A+QsFZYh8T1AIadc5YEgtMoDFHLulSlh8hYc5JDzAKQ6xCfnNqWopC45D7vDI+bIeRiTHdEi5zaInIehwzsCRFYjc7DJj1KK90GZkhi5jlHIeVQac+YHg38MUaUkUIIfqWxqJVTZUiw+Of9R3qZ0l5wpNouc/0hvgJzpYRngl+JQyClX6QShVToMcqaEU8LkLShAIWeKA6kS+eRUP7NJ0yRnis8dJhkjZ4oPkyVpkfMfhJwpPujwkoDIamQONnkyowSlFJApCZErJYVBzpRkacyZHwx+CqRKpQQ/UtmUSrCypfHJuVV5m9p4yJnOIudW6Q2Qs01YhpxEBoWccpUZQWiVGRRypsqUMHkL/BxyZkCqAJ+c6s9kWuuSM9MdFjRHzkxMVlCLnFshcmZCh1cQiKxG5mCTF6IUb79MSYxchSnkLCSNOfODwS8MqYpQgh+pbGolVtnO4pPzb+VtKugh59kscv4tvQFyFgzLkPieQyGnXOU5QWiV51DIWUSmhMlbUJRDznMgVTE+OdVfpcjUJee57rC4OXKei8mKa5Hzb4ic50KHVxyIrEbmYJOfRyneRWVKYuQqQSHnedKYMz8Y/BKQ6nxK8COVTa3EKltJPjnV31NL8JCzFIucW6Q3tOCUCyhMlPNf0JtCu/PlMZrM3As5tLsAUl2kcfjAlqRxb36qb85Xql/MSvXN0htL9UsoqS7nv0Qn1ZXO4XO8JGgoic/4tP9Sr8Nz2peyTvsv6Y3dwEuhnChNyQm5ytLYyZWmFEmZOaUxcF4IrbIMI7/DUSrTm/OqpQykuozyqiVCKLUSI9TllOJymTTGymYZ4IqcVlyS++SvuBQHNoi/IUsola93b8HuQypnZTXtsj6hlEi5QqRcKVKuEilXi5SyIqWcSCkvUiqIlGtEyrUi5TqRcr1IuUGk3ChSbhIpN4uUW0RKRZFyq0i5TaTcLlIqiZTKIqWKSKkqUqqJlOoipYZIqSlSaomU2iKljrl3hFckQ7IrMdlVmOxqTFYWk5XDZOUxWQVMdg0muxaTXYfJrsdkN2CyGzHZTZjsZkx2CyariMluxWS3YbLbMVklTFYZk1XBZFUxWTVMVh2T1cBkNTFZLUxWG5PVyfGMqm90AvY+CRdJoGuiqtoGXdW10VST2nlU1yHMzayW35clOTYyPg9bOfntp6mqTchbVcmralg9iqoytJFa+d3I+oQSCLKhVy5XQM8Wr1Sqwtu9SqU6HpSrY6uyT4SubEzV7pMBLhdLtSFyDOVjqKqcOqwKUVSdTzvS6/NW1Tz94G/IU7UpR3rcmJeqQs4kuikPVelcqXZzbtVDuRPyllyqxnmkbcWcqm55JfetOVTd8rwCt3lUExtFuyhVXFWZSVFVVU+pBlwWXVUtoio3MIaq+knVhvKxVDVOqNpvjKmqeVxVPyu2qlZY1ayBQlVbqso2V6nqIO8KMqtBqlr0BxMpdZQ1ZqXnwURd0oOJlDrSG/iscmVYhvjVYzyYCK+yXhBaZb38nly+P4gLn5xCtEL3g7j67rCBubdd9TFZA50P4o5fOzUs60PgbQBENv/JU09Ojz3Vqs+/9rWV0ervufYNWddevq9vCFz7/mEZ4teIcu3lKhsFoVU24l/72kpRP91rf4c7vNPctb8Dk92pde1rQ9f+Duja3QlEVuNhKjb5XZTPsmTNaYQ9TK0HrfJuysPUu6Rx0Nj8Z1gZaykTaqynMt7Dqozyoec9QGUcG5YhfvdSKqNc5b1BaJX3Uj6pkfl9t8n8bsz5POVeSHUf/ctbKeo3FGN04XG/O3zAHDzux2QPaMGjFgSP+6HDewCIrEbmYJM/SClBjWVKYmX5IQoWHpTGnPnB4D8EqR6mBD9S2YAaCKkeyW9xyT85aypvUy8POR9lkVN+YvgoQM5eYRni14RCTrnKJkFolU0o5HxYpoTJW9CU80WwJpDqMT45aypF7+qSs5k7bG6OnM0wWXMtctaEyNkMOrzmQGQ1MgebvAWlBDWVKYmR63EKOWUmPc6ZHwz+45DqCUrwI5VNrcQq25P895w1lLfJ094ppSWLnDWkN9TeScoQv6co5JSrfApq7xSeX2GnQ84nZEqYvAVPc8j5FKRqxSdnDaVIt71TSmt32MYcOVtjsjZa5KwBkbM1dHhtgMhqZA42eVtKCXpapiRGrnYUcraVxpz5weC3g1TtKcGPVDa1EqtsWXxyVlfephUecnZgkbO69AbIuSIsQ/w6UsgpV9kxCK2yI4Wc7WVKmLwFnTjk7AipnuGTs7pStFyXnM+6w87myPksJuusRc7qEDmfhQ6vMxBZjczBJu9CKUGdZEpi5HqOQs4u0pgzPxj85yDV85TgRyqbWolVthf45KymvE1NPeR8kUXOatIbIGfTsAzxe4lCTrnKl4LQKl+ikPN5mRImb0FXDjlfglTd+ORUfwG9iS45u7vDl82Rszsme1mLnNUgcnaHDu9lILIamYNN/gqlBHWVKYmR61UKOV+Rxpz5weC/CqleowQ/UtnUSqyyvc4nZ1XlbVrrIWcPFjmrSm+AnGvDMsSvJ4WccpU9g9Aqe1LI+ZpMCZO34A0OOXtCqjf55KyqFK3RJedb7vBtc+R8C5O9rUXOqhA534IO720gshqZg03+DqUEvSFTEiPXuxRyviONOfODwX8XUvWiBD9S2dRKrLLxe96kVFHeptoecgZZ5KwivQFy1hYp2LayKeSUq8wOQqvMppCzl0wJk7egD4ecmKovn5xVlKJauuR8zx2+b46c72Gy97XIWQUi53vQ4b0PRFYjc7DJP6CUoD4yJTFyfUgh5wfSmDM/GPwPIdVHlOBHKptaiVW2j/nkrKy8TaM95PyERc7K0hsg5+iwDPHrRyGnXGW/ILTKfhRyfiRTwuQt6M8hZz9I9SmfnJWVolG65BzgDgeaI+cATDZQi5yVIXIOgA5vIBBZjczBJv+MUoL6y5TEyPU5hZyfSWPO/GDwP4dUgyjBj1Q2tRKrbIP55KykvE3TPOQcwiJnJekNkHNaWIb4DaWQU65yaBBa5VAKOQfJlDB5C77gkHMopBrGJ2clpWiqLjmHu8MvzZFzOCb7UouclSByDocO70sgshqZg00+glKCvpApiZHrKwo5R0hjzvxg8L+CVCMpwY9UNrUSq2xf88l5u/I21fWQ8xsWOW+X3gA564ZliN8oCjnlKkcFoVWOopBzpEwJk7dgNIecoyDVGD45b1eK6uiSc6w7HGeOnGMx2Tgtct4OkXMsdHjjgMhqZA42+XhKCZJPisZg5JpAIed4acyZHwz+BEg1kRL8SGVTK7HKNolPztuUt6mbh5yTWeS8TXoD5OwWliF+UyjklKucEoRWOYVCzokyJUzegqkcck6BVNP45LxNKeqqS87p7nCGOXJOx2QztMh5G0TO6dDhzQAiq5E52OQzKSVoqkxJjFyzKOScKY0584PBnwWpZlOCH6lsaiVW2ebwyXlrvsg5l0XOW6U3Rs650LbmUcgpVzkPI+c8Cjlny5QweQvmc8g5D1It4JPzVh45F7rDRebIuRCTLdIi560QORdCh7eIQ05s8sWUEjRfpiRGriUUci6Wxpz5weAvgVRLKcGPVDa1EqtsIT45Kypv03APOQWLnBWlN0DO4WEZ4reMQk65ymVBaJXLKORcKlPC5C1YziHnMki1gk/OikrRMF1yrnSH35oj50pM9q0WOStC5FwJHd63QGQ1Mgeb/DtKCVouUxIj1/cUcn4njTnzg8H/HlKtogQ/UtnUSqyyreaT8xblbRrsIecaFjlvkd4AOQeHZYjfWgo55SrXBqFVrqWQc5VMCZO3YB2HnGsh1Q98ct6iFA3SJeeP7nC9OXL+iMnWa5HzFoicP0KHtx6IrEbmYJP/RClB62RKYuT6mULOn6QxZ34w+D9Dql8owY9UNrUSq2wb+OS8WXmb1nnIuZFFzpulN0DOdWEZ4vcrhZxylb8GoVX+SiHnLzIlTN6C3zjk/BVS/c4n581K0Vpdcv7hDv80R84/MNmfWuS8GSLnH9Dh/QlEViNzsMk3UUrQbzIlMXL9RSHnJmnMmR8M/l+QajMl+JHKplZilW0Ln5w3KW/TMg85/2aR8ybpDZBzWViG+G2lkFOucmsQWuVWCjk3y5QweQv+4ZBzK6TaxifnTUqR0CXndne4wxw5t2OyHVrkvAki53bo8HYAkdXIHGzynZQS9I9MSYxc/1LIuVMac+YHg/8vpNpFCX6ksqmVWGXbzSfnjcrbVMxDzj0sct4ovQFyFgvLEL+9FHLKVe4NQqvcSyHnLpkSJm/BPg4590Kq/Xxy3qgUFdUl5wF3eNAcOQ9gsoNa5LwRIucB6PAOApHVyBxs8kOUErRPpiRGrsMUch6Sxpz5weAfhlRHKMGPVDa1EqtsR/nkvEF5myZ7yHmMRc4bpDdAzslhGeCXmkAh5w3SOIisMjy/wk6HnEdkShi8BakWhZypCZDK5pPzBqVokiY5Ux13WMAYOVMdTFZAi5w3IORMdaDDKwBEViNzsMkTGSUoVf7XhsiV6mOQMzVRGnPmB4Pvg1RJlPofqWxqJVbZkvnkvF55m3q65ExNYZHzeukNkLNnWIakYSqFnHKVqUFolakMcqYmyZQweQvSOORMhVTpfHJerxT10CVnhjv0myNnBibza5HzeoicGdDh+YHIamQONnmAQs40mZIYuTIp5AxIY878YPAzIVVBSvAjlU2txCpbIT45r1PeploechZmkfM66Q2Qs1ZYhsS3CIWccpVFgtAqi1DIWVCmhMlbcBaHnEUg1dl8cl6nFNXUJec57rCoOXKeg8mKapHzOoic50CHVxSIrEbmYJMXoxTvs2RKYuQ6l0LOYtKYMz8Y/HMhVXFK8COVTa3EKtt5fHJeq7xNQQ85S7DIea30BsgZDMuQ+J5PIadc5flBaJXnU8hZXKaEyVtQkkPO8yFVKT45r1WKeuuS8wJ3eKE5cl6AyS7UIue1EDkvgA7vQiCyGpmDTX4RpXiXlCmJketiCjkvksac+cHgXwypLqEEP1LZ1Eqssl3KJ+c1ytvUzkPO0ixyXiO9AXK2C8uQ+JahkFOuskwQWmUZCjkvkSlh8hZcxiFnGUh1OZ+c1yhFbXXJeYU7vNIcOa/AZFdqkfMaiJxXQId3JRBZjczBJr+KUrwvkymJketqCjmvksac+cHgXw2pylKCH6lsaiVW2crxyVlBeZtmeMhZnkXOCtIbIOeMsAyJbwUKOeUqKwShVVagkLOsTAmTt+AaDjkrQKpr+eRUn8J0XXJe5w6vN0fO6zDZ9VrkrACR8zro8K4HIquROdjkN1CKt3xZfC1Grhsp5LxBGnPmB4N/I6S6iRL8SGVTK7HKdjOfnOWVt6mUh5y3sMhZXnoD5CwVliHxrUghp1xlxSC0yooUct4kU8LkLbiVQ86KkOo2PjnLK0Uldcl5uzusZI6ct2OySlrkLA+R83bo8CoBkdXIHGzyypTifatMSYxcVSjkrCyNOfODwa8CqapSgh+pbGolVtmq8clZTnmb0j3krM4iZznpDZAzPSxD4luDQk65yhpBaJU1KOSsKlPC5C2oySFnDUhVi09O9TObNF1y1naHdcyRszYmq6NFznIQOWtDh1cHiKxG5mCT16UU75oyJTFy1aOQs6405swPBr8epKpPCX6ksqmVWGVrwCdnWeVtauMhZ0MWOeW79YYAOduEZUh8G1HIKVfZKAitshGFnPVlSpi8BXdwyNkIUt3JJ6f6M5nWuuS8yx3ebY6cd2Gyu7XIWRYi513Q4d0NRFYjc7DJ76EU7ztkSmLkupdCznukMWd+MPj3QqrGlOBHKptaiVW2+/jkvFp5mwp6yHk/i5xXS2+AnAXDMiS+D1DIKVf5QBBa5QMUcjaWKWHyFjzIIecDkOohPjnVX6XI1CXnw+7wEXPkfBiTPaJFzqshcj4MHd4jQGQ1Mgeb/FFK8X5QpiRGriYUcj4qjTnzg8FvAqmaUoIfqWxqJVbZHuOTU/09tQQPOZuxyHmV9IYWnNqcwkQ5f/PeFNo1lcdoMnNbcGjXHFI9rnH4wJakcW9+ql+Zr1R/gpXqV0pvLNWfpKS6nP9JnVRXOofP8cmgoSQ+49O+Qr0Oz2m3ZJ32FdIbu4EtoZx4ipITcpVPYSf3FKVIyhN4CgNnC2iVTzPyOxylp3tzXrU8DalaUV61RAilVmKEak0pLq2kMVY2nwauyGnFJbmPW1zWJ5Q8OYkVYxbh63pCFUskVd2Oq2KKpKp7WBVbJFUvezZvRVW94qqs6F6vnlJZMWZ8LaKyYq3r9RyHYuWp6nG6ysrbq+dpKivKjG94VVa0db2ZR7JYuVRv5VZZub3ezqWy8pjxnZwqK691vRslia3TVL3yVlmne/XOU2XlmDHPa2PlXFesEmCdUsV4k265Xn2jqizPjO9FU1nedb2vuPTWcdUHsVXWCa8PY6qskzN+FEtlRdb1MVKMfP2UKkt69VeprPCMnwKFFX8QlFAqX0+Ngt2HVM7KatplfUIpkSo/VWsrUtuJ1PYiNUukyoc5HUVqJ5H6jEh9VqR2FqldROpzIvV5kfqCSH1RpL4kUruK1G4itbtIfVmkviJSXxWpr4nU10VqD5HaU6S+IVLfFKlvidS3Reo75p5EtUmGZG0xWTtM1h6TZWGyDpisIybrhMmewWTPYrLOmKwLJnsOkz2PyV7AZC9ispcwWVdM1g2TdcdkL2OyVzDZq5jsNUz2Oibrgcl6YrI3MNmbmOwtTPY2Jnsnx7PxvtFfefc++aJWvvJ9JqqqbdBVPRtNNamdR9UZea2f+XB+3w7l2Mj4PGzl5C+fpqo2IW/VK15Vw+pRVK9CG2ma342sT7gl/kbhpCr+RiGiir9RiKjibxQi6/ofvFGAntO0gT5JbatUhYtsO5XqeCluH1uVfaJgZ8VU7T5Z1jvEUm2IFP+OMVRVTiGiUxRV59NA0iVvVc3TcfNcnqpNOaD0fF6qCjnR9UIeqtK5APdibtVDuTH4Ui5V4zxg2TWnqlteSO2WQ9UtT/B296gmNoqG59dcVZlJUVWvn1INuCy6qkdEVW5gDFXPk6oN5WOp3jihar8xpurN46r6WbFVYXaUa9ZAoQqzo2xzleodpJpkPgypkBc9Z/YxTOo7yhqz0vMxzLukj2FS35HewDezVoZliF8vxscw4VX2CkKr7JXfk8v3147CJ6cQrdD92lFvdxg097CnNyYL6nzt6Pi1U8OyNwTeIBDZ/CdPLzk99hke/7P21LeV0ervufbZrGsvnyZmA9e+f1iG+PWhXHu5yj5BaJV9+Nf+baWon+617+sO3zN37ftisve0rv3b0LXvC12794DIanx0jE3+vsb9UrvKmtMHuzm9oFV+QPno+H1pHDQ2/xlWxreUCTXWUxk/ZFVG+VHLh0BlHBuWIX4fUSqjXOVHQWiVH1G+lyLz+wOT+f0x59sjH0GqT4BEOkN4vKUUjdGFRz932N8cPPphsv5a8HgLgkc/6PD6A5HVyBxs8k8pJehjmZJYWR5AwcKn0pgzPxj8AZBqICX4kcoG1EBI9Vl+i0v+yfmm8jb18pDzcxY535TeADl7hWWI3yAKOeUqBwWhVQ6ikHOgTAmTt2BwPs8SvIKDINUQPjnfVIre1SXnUHf4hTlyDsVkX2iR802InEOhw/sCiKxG5mCTD6OUoMEyJTFyDaeQc5g05swPBn84pPqSEvxIZVMrsco2gv+e8w3lbfI2s/yKRc43pDfWzPIraFsjKeSUqxyJNbMcSSHnlzIlTN6CrznkHAmpvuGT8w2lSLuZ5Sh3ONocOUdhstFa5HwDIuco6PBGA5HVyBxs8jGUEvS1TEmMXGMp5BwjjTnzg8EfC6nGUYIfqWxqJVbZxvPJ2VN5m1Z4yDmBRc6e0hsg54qwDPGbSCGnXOXEILTKiRRyjpMpYfIWTOKQcyKkmswnZ0+laLkuOae4w6nmyDkFk03VImdPiJxToMObCkRWI3OwyadRStAkmZIYuaZTyDlNGnPmB4M/HVLNoAQ/UtnUSqyyzeSTs4fyNjX1kHMWi5w9pDdAzqZhGeI3m0JOucrZQWiVsynknCFTwuQtmMMh52xINZdPzh5KURNdcs5zh/PNkXMeJpuvRc4eEDnnQYc3H4isRuZgky+glKA5MiUxci2kkHOBNObMDwZ/IaRaRAl+pLKplVhlW8wn5+vK27TWQ84lLHK+Lr0Bcq4NyxC/pRRyylUuDUKrXEoh5yKZEiZvQYhDzqWQSvDJ+bpStEaXnMvc4XJz5FyGyZZrkfN1iJzLoMNbDkRWI3OwyVdQSlBIpiRGrpUUcsonVSs584PBXwmpvqUEP1LZ1Eqssn3HJ+dryttU20PO71nkfE16A+SsHZYhfqso5JSrXBWEVrmKQs5vZUqYvAWrOeRcBanW8Mn5mlJUS5eca93hOnPkXIvJ1mmR8zWInGuhw1sHRFYjc7DJf6CUoNUyJTFy/Ugh5w/SmDM/GPwfIdV6SvAjlU2txCrbT3xyvqq8TaM95PyZRc5XpTdAztFhGeL3C4WccpW/BKFV/kIh53qZEiZvwQYOOX+BVBv55HxVKRqlS85f3eFv5sj5Kyb7TYucr0Lk/BU6vN+AyGpkDjb575QStEGmJEauPyjk/F0ac+YHg/8HpPqTEvxIZVMrscq2iU/OV5S3aZqHnH+xyPmK9AbIOS0sQ/w2U8gpV7k5CK1yM4Wcf8qUMHkLtnDIuRlS/c0n5ytK0VRdcm51h/+YI+dWTPaPFjlfgci5FTq8f4DIamQONvk2SgnaIlMSI9d2Cjm3SWPO/GDwt0OqHZTgRyqbWolVtp18cr6svE11PeT8l0XOl6U3QM66YRnit4tCTrnKXUFolbso5NwhU8LkLdjNIecuSLWHT86XlaI6uuTc6w73mSPnXky2T4ucL0Pk3Asd3j4gshqZg02+n1KCdsuUxMh1gELO/dKYMz8Y/AOQ6iAl+JHKplZile0Qn5zdlbepm4ech1nk7C69AXJ2C8sQvyMUcspVHglCqzxCIedBmRImb8FRDjmPQKpjfHJ2V4q6apIzLcEdWsbImQbKLC1ydkfImZaAHF6aBUQ2/5kDTm5TStBRmZIQudIcBjnTbGnMmR8MvgOpClCCH6lsaiVU2dIS+eTslh9ypvlY5OwmvSFyShmShkkUcsrpkyByhudX2GmQM62ATAmTtyCZQs60JEiVwidnNx45U91hmjlypmKyNC1ydoPImQodXhqHnNjk6YwSlJYsUxIjVwaFnOnSmDM/GPwMSOWnBD9S2dRKrLIF+OTsqrxNwz3kzGSRs6v0Bsg5PCxD4luQQk65yoJBaJUFKeT0y5QweQsKcchZEFIV5pOzq1I0TJecRdzhWebIWQSTnaVFzq4QOYtAh3cWEFmNzMEmP5tSvAvJlMTIdQ6FnGdLY878YPDPgVRFKcGPVDa1EqtsxfjkfEl5mwZ7yHkui5wvSW+AnIPDMiS+xSnklKssHoRWWZxCzqIyJUzegvM45CwOqUrwyfmSUjRIl5znu8OS5sh5PiYrqUXOlyByng8dXkkgshqZg01eilK8z5MpiZHrAgo5S0ljzvxg8C+AVBdSgh+pbGolVtku4pPzReVtWuch58Uscr4ovQFyrgvLkPheQiGnXOUlQWiVl1DIeaFMCZO34FIOOS+BVKX55HxRKVqrS84y7vAyc+Qsg8ku0yLnixA5y0CHdxkQWY3MwSa/nFK8L5UpiZHrCgo5L5fGnPnB4F8Bqa6kBD9S2dRKrLJdxSfnC8rbtMxDzqtZ5HxBegPkXBaWIfEtSyGnXGXZILTKshRyXilTwuQtKMchZ1lIVZ5PzheUIqFLzgru8Bpz5KyAya7RIucLEDkrQId3DRBZjczBJr+WUrzLyZTEyHUdhZzXSmPO/GDwr4NU11OCH6lsaiVW2W7gk/N55W0q5iHnjSxyPi+9AXIWC8uQ+N5EIadc5U1BaJU3Uch5vUwJk7fgZg45b4JUt/DJ+bxSVFSXnBXd4a3myFkRk92qRc7nIXJWhA7vViCyGpmDTX4bpXjfLFMSI9ftFHLeJo0584PBvx1SVaIEP1LZ1EqsslXmk/M55W2a7CFnFRY5n5PeADknh2VIfKtSyClXWTUIrbIqhZyVZEqYvAXVOOSsCqmq88n5nFI0SZecNdxhTXPkrIHJamqR8zmInDWgw6sJRFYjc7DJa1GKdzWZkhi5alPIWUsac+YHg18bUtWhBD9S2dRKrLLV5ZOzi/I29fSQsx6LnF2kN0DOnmEZEt/6FHLKVdYPQqusTyFnHZkSJm9BAw4560OqhnxydlGKeuiSs5E7vMMcORthsju0yNkFImcj6PDuACKrkTnY5HdSincDmZIYue6ikPNOacyZHwz+XZDqbkrwI5VNrcQq2z18cnZW3qZaHnLeyyJnZ+kNkLNWWIbEtzGFnHKVjYPQKhtTyHm3TAmTt+A+DjkbQ6r7+eTsrBTV1CXnA+7wQXPkfACTPahFzs4QOR+ADu9BILIamYNN/hCleN8nUxIj18MUcj4kjTnzg8F/GFI9Qgl+pLKplVhle5RPzmeVtynoIWcTFjmfld4AOYNhGRLfphRyylU2DUKrbEoh5yMyJUzegsc45GwKqZrxyfmsUtRbl5zN3WELc+RsjslaaJHzWYiczaHDawFEViNzsMkfpxTvx2RKYuR6gkLOx6UxZ34w+E9AqicpwY9UNrUSq2wt+eR8Rnmb2nnI+RSLnM9Ib4Cc7cIyJL5PU8gpV/l0EFrl0xRyPilTwuQtaMUh59OQqjWfnM8oRW11ydnGHbY1R842mKytFjmfgcjZBjq8tkBkNTIHm7wdpXi3kimJkas9hZyyarTnzA8Gvz2kyqIEP1LZ1EqssnXgk7OT8jbN8JCzI4ucnaQ3QM4ZYRkS304UcspVdgpCq+xEIWeWTAmTt+AZDjk7Qapn+eRUn8J0XXJ2doddzJGzMybrokXOThA5O0OH1wWIrEbmYJM/Ryne8mXxsxi5nqeQ8zlpzJkfDP7zkOoFSvAjlU2txCrbi3xydlTeplIecr7EImdH6Q2Qs1RYhsS3K4WccpVdg9Aqu1LI+YJMCZO3oBuHnF0hVXc+OTsqRSV1yfmyO3zFHDlfxmSvaJGzI0TOl6HDewWIrEbmYJO/Sine3WRKYuR6jULOV6UxZ34w+K9BqtcpwY9UNrUSq2w9+OTsoLxN6R5y9mSRU5aDngA508MyJL5vUMgpV/lGEFrlGxRyvi5TwuQteJNDzjcg1Vt8cqqf2aTpkvNtd/iOOXK+jcne0SJnB4icb0OH9w4QWY3MwSZ/l1K835QpiZGrF4Wc70pjzvxg8HtBKkr9P1XZ1EqssgX55MxS3qY2HnJms8gp361nA+RsE5Yh8e1DIadcZZ8gtMo+FHL2lilh8hb05ZCzD6R6j09O9WcyrXXJ+b47/MAcOd/HZB9okTMLIuf70OF9AERWI3OwyT+kFO++MiUxcn1EIeeH0pgzPxj8jyDVx5TgRyqbWolVtk/45GyvvE0FPeTsxyJne+kNkLNgWIbEtz+FnHKV/YPQKvtTyPmxTAmTt+BTDjn7Q6oBfHKqv0qRqUvOge7wM3PkHIjJPtMiZ3uInAOhw/sMiKxG5mCTf04p3p/KlMTINYhCzs+lMWd+MPiDINVgSvAjlU2txCrbED451d9TS/CQcyiLnO2kN7TgtC8oTJTzf9GbQrvB8hhNZu4wDu2+gFTDNQ4f2JI07s1P9bb5SvUvWaneVnpjqT6Ckupy/hE6qa50Dp/jiKChJD7j026jXofntL9inbZ8/vQVdgO/gnJiJCUn5CpHYic3klIkZeaMxMA5DFrl14z8Dkfp696cVy1fQ6pvKK9aIoRSKzFCjaIUl2+kMVY2vwauyGnFJblPPouL7zNgi/hbsoRS+Xr/Fuw+pHJWVtMu6xNKibTRIm2MSBsr0saJtPEibYJImyjSJom0ySJtikibKtKmibTpIm2GSJsp0maJtNkibY5ImyvS5om0+SJtgUhbKNIWibTFIm2JSFsq0kIiTYi0ZSJtuUhbYe494ehkSDYGk43FZOMw2XhMNgGTTcRkkzDZZEw2BZNNxWTTMNl0TDYDk83EZLMw2WxMNgeTzcVk8zDZfEy2AJMtxGSLMNliTLYEky3FZCFMJjDZMky2HJOtyPGUqm90BvY+iRfJoMlRVW2DrmpKNNWkdh7VVIS6mfn+hascGxmfh62cfP5pqmoT8lYt8KoaVo+iWghtJL+/XNN7fUIJDNrQq5fR0PPFMUpVeMNjVarjYRkXW5V9InjjY6p2nwzxhFiqDZGDmBhDVeXUcU2Koup82qFOy1tV8/Sjn56nalOOBJmRl6pCzjSamYeqdK5km5Vb9VDulJydS9U4j8Sdk1PVLa/0nptD1S3PSzDPo5rYKNpVWeSqykyKqlp8SjXgsuiqJRFVuYExVEtPqjaUj6UKnVC13xhTJY6r6mfFVi0Lq5o1UKiWS1XZ5irVCqQCZLaHVJ3oDyfSVihrzErPw4mVpIcTaSukN/B55cqwDPH7lvFwIrzKb4PQKr/N78nl+8O48MkpRCt0P4z7zh1+b+6N13eY7HudD+OOXzs1LL+DwPs9ENn8J8+3cnrsydZ3/Gu/XBmt/p5rv4p17eU7+1XAte8fliF+qynXXq5ydRBa5Wr+tV+uFPXTvfZr3OFac9d+DSZbq3Xtl0PXfg107dYCkdV4oIpNvo7yeZasOauxB6rfQqv8gfJAdZ00Dhqb/wwr4zJlQo31VMYfWZVRPvb8EaiMY8MyxG89pTLKVa4PQqtcT/m0Rub3Dybz+yfOZyrrIdXP9C9whZNbIRqjC49f3OEGc/D4BZNt0ILHMggev0CHtwGIrEbmYJNvpJSgn2RKYmX5VwoWNkpjzvxg8H+FVL9Rgh+pbEANhFS/57e45J+cQnmbennI+QeLnPIzwz8AcvYKyxC/PynklKv8Mwit8k8KOX+TKWHyFmzifBnsT0j1F5+cQil6V5ecm93hFnPk3IzJtmiRU0Dk3Awd3hYgshqZg03+N6UEbZIpiZFrK4Wcf0tjzvxg8LdCqn8owY9UNrUSq2zb+O85Q8rb5G3xtJ1FzpD0xlo8bYe2tYNCTrnKHViLpx0Ucv4jU8LkLdjJIecOSPUvn5whpUi7xdMud7jbHDl3YbLdWuQMQeTcBR3ebiCyGpmDTb6HUoJ2ypTEyLWXQs490pgzPxj8vZBqHyX4kcqmVmKVbT+fnEuVt2mFh5wHWORcKr0Bcq4IyxC/gxRyylUeDEKrPEgh5z6ZEiZvwSEOOQ9CqsN8ci5VipbrkvOIOzxqjpxHMNlRLXIuhch5BDq8o0BkNTIHm/wYpQQdkikJkSs9gULOY9KYMz8W/PQESGVRgh+pbGolVNnSbT45lyhvU1OXnOkOi5xLpDdAzqZhGeCXXoBCTrnKAkFolQUY5EyXG7NN3oJECjnTC0AqH5+cS5SiJprkTE9yh8nGyJmehMmStci5BCFnehJ0eMlAZDUyB5s8hVGC0hNlSmLkSmWQMz1FGnPmB4OfCqnSKMGPVDa1Eqts6XxyLlbeprUecmawyLlYegPkXBuWIfH1U8gpV+kPQqv0U8iZJlPC5C0IcMjph1SZfHIuVorW6JKzoDssZI6cBTFZIS1yLobIWRA6vEJAZDUyB5u8MKV4B2RKYuQqQiFnYWnMmR8MfhFIdRYl+JHKplZile1sPjkXKW9TbQ85z2GRc5H0BshZOyxD4luUQk65yqJBaJVFKeQ8S6aEyVtQjEPOopDqXD45FylFtXTJWdwdnmeOnMUx2Xla5FwEkbM4dHjnAZHVyBxs8hKU4l1MpiRGrvMp5CwhjTnzg8E/H1KVpAQ/UtnUSqyyleKTc6HyNo32kPMCFjkXSm+AnKPDMiS+F1LIKVd5YRBa5YUUcpaUKWHyFlzEIeeFkOpiPjkXKkWjdMl5iTu81Bw5L8Fkl2qRcyFEzkugw7sUiKxG5mCTl6YU74tkSmLkKkMhZ2lpzJkfDH4ZSHUZJfiRyqZWYpXtcj45Fyhv0zQPOa9gkXOB9AbIOS0sQ+J7JYWccpVXBqFVXkkh52UyJUzegqs45LwSUl3NJ+cCpWiqLjnLusNy5shZFpOV0yLngmyEnGWhwysHRFYjc7DJy1OK91UyJTFyVaCQs7w05swPBr8CpLqGEvxIZVMrscp2LZ+c85W3qa6HnNexyDlfegPkrBuWIfG9nkJOucrrg9Aqr6eQ8xqZEiZvwQ0ccl4PqW7kk3O+UlRHl5w3ucObzZHzJkx2sxY550PkvAk6vJuByGpkDjb5LZTifYNMSYxcFSnkvEUac+YHg18RUt1KCX6ksqmVWGW7jU/Oecrb1M1DzttZ5JwnvQFydgvLkPhWopBTrrJSEFplJQo5b5UpYfIWVOaQsxKkqsIn5zylqKsuOau6w2rmyFkVk1XTIuc8iJxVocOrBkRWI3OwyatTindlmZIYuWpQyFldGnPmB4NfA1LVpAQ/UtnUSqyy1eKTc26+yFmbRc650hsjZ20ovnUo5JSrrIORsw6FnDVlSpi8BXU55KwDqerxyTmXR8767rCBOXLWx2QNtMg5FyJnfejwGnDIiU3ekFK85ZOiehi5GlHI2VAac+YHg98IUt1BCX6ksqmVWGW7k0/OOcrbNNxDzrtY5JwjvQFyDg/LkPjeTSGnXOXdQWiVd1PIeYdMCZO34B4OOe+GVPfyyTlHKRqmS87G7vA+c+RsjMnu0yLnHIicjaHDuw+IrEbmYJPfTyne98iUxMj1AIWc90tjzvxg8B+AVA9Sgh+pbGolVtke4pNztvI2DfaQ82EWOWdLb4Ccg8MyJL6PUMgpV/lIEFrlIxRyPihTwuQteJRDzkcgVRM+OWcrRYN0ydnUHT5mjpxNMdljWuScDZGzKXR4jwGR1cgcbPJmlOL9qExJjFzNKeRsJo0584PBbw6pWlCCH6lsaiVW2R7nk3OW8jat85DzCRY5Z0lvgJzrwjIkvk9SyClX+WQQWuWTFHLKE3jc5C1oySHnk5DqKT45ZylFa3XJ+bQ7bGWOnE9jslZa5JwFkfNp6PBaAZHVyBxs8taU4t1SpiRGrjYUcraWxpz5weC3gVRtKcGPVDa1Eqts7fjknKm8Tcs85GzPIudM6Q2Qc1lYhsQ3i0JOucqsILTKLAo528qUMHkLOnDImQWpOvLJOVMpErrk7OQOnzFHzk6Y7Bktcs6EyNkJOrxngMhqZA42+bOU4i3j2hEjV2cKOZ+Vxpz5weB3hlRdKMGPVDa1Eqtsz/HJOUN5m4p5yPk8i5wzpDdAzmJhGRLfFyjklKt8IQit8gUKObvIlDB5C17kkPMFSPUSn5wzlKKiuuTs6g67mSNnV0zWTYucMyBydoUOrxsQWY3MwSbvTineL8qUxMj1MoWc3aUxZ34w+C9DqlcowY9UNrUSq2yv8sk5XXmbJnvI+RqLnNOlN0DOyWEZEt/XKeSUq3w9CK3ydQo5X5EpYfIW9OCQ83VI1ZNPzulK0SRdcr7hDt80R843MNmbWuScDpHzDejw3gQiq5E52ORvUYp3D5mSGLneppDzLWnMmR8M/tuQ6h1K8COVTa3EKtu7fHJOU96mnh5y9mKRc5r0BsjZMyxD4tubQk65yt5BaJW9KeR8R6aEyVsQ5JCzN6TK5pNzmlLUQ5ecfdxhX3Pk7IPJ+mqRcxpEzj7Q4fUFIquROdjk71GKd1CmJEau9ynkfE8ac+YHg/8+pPqAEvxIZVMrscr2IZ+cU5W3qZaHnB+xyDlVegPkrBWWIfH9mEJOucqPg9AqP6aQ8wOZEiZvwScccn4MqfrxyTlVKaqpS87+7vBTc+Tsj8k+1SLnVIic/aHD+xSIrEbmYJMPoBTvT2RKYuQaSCHnAGnMmR8M/kBI9Rkl+JHKplZile1zPjmnKG9T0EPOQSxyTpHeADmDYRkS38EUcspVDg5CqxxMIednMiVM3oIhHHIOhlRD+eScohT11iXnF+5wmDlyfoHJhmmRcwpEzi+gwxsGRFYjc7DJh1OK9xCZkhi5vqSQc7g05swPBv9LSDWCEvxIZVMrscr2FZ+ck5W3qZ2HnCNZ5JQfDY4EyNkuLEPi+zWFnHKVXwehVX5NIecImRImb8E3HHJ+DalG8ck5WSlqq0vO0e5wjDlyjsZkY7TIORki52jo8MYAkdXIHGzysZTi/Y1MSYxc4yjkHCuNOfODwR8HqcZTgh+pbGolVtkm8Mk5SXmbZnjIOZFFzknSGyDnjLAMie8kCjnlKicFoVVOopBzvEwJk7dgMoeckyDVFD451acwXZecU93hNHPknIrJpmmRcxJEzqnQ4U0DIquROdjk0ynFW74snoKRawaFnNOlMWd+MPgzINVMSvAjlU2txCrbLD45JypvUykPOWezyDlRegPkLBWWIfGdQyGnXOWcILTKORRyzpQpYfIWzOWQcw6kmscn50SlqKQuOee7wwXmyDkfky3QIudEiJzzocNbAERWI3OwyRdSivdcmZIYuRZRyLlQGnPmB4O/CFItpgQ/UtnUSqyyLeGTc4LyNqV7yLmURc4J0hsgZ3pYhsQ3RCGnXGUoCK0yRCHnYpkSJm+B4JAzBKmW8cmpfmaTpkvO5e5whTlyLsdkK7TIOQEi53Lo8FYAkdXIHGzylZTiLWRKYuT6lkLOldKYMz8Y/G8h1XeU4Ecqm1qJVbbv+eQcr7xNbTzkXMUip3y3vgogZ5uwDInvago55SpXB6FVrqaQ8zuZEiZvwRoOOVdDqrV8cqo/k2mtS8517vAHc+Rch8l+0CLneIic66DD+wGIrEbmYJP/SCnea2RKYuRaTyHnj9KYMz8Y/PWQ6idK8COVTa3EKtvPfHKOU96mgh5y/sIi5zjpDZCzYFiGxHcDhZxylRuC0Co3UMj5k0wJk7dgI4ecGyDVr/PUk58hOdVfpcjUJedv7vB3c+T8DZP9rkXOcRA5f4MO73cgshqZg03+B6V4b5QpiZHrTwo5/5DGnPnB4P8JqTZRgh+pbGolVtn+4pNT/T21BA85N7PIOVZ6QwtO30Jhopx/C6d7wSZ5jCYz928O7bZAqq0ahw9sSRr35qf6mHyl+j+sVB8jvbFU30ZJdTn/Np1UVzqHz3Fb0FASn/Fpj1avw3Pa21mnPVp6YzdwO5QTOyg5IVe5Azu5HZQiKTNnBwbOv6FV7mTkdzhKO3tzXrXshFT/Ul61RAilVmKE2kUpLv9KY6xs7gSuyGnFJblP/opLGWCD+BuyhFL5evcW7D6kclZW0y7rE0qJ9N0ifY9I3yvS94n0/SL9gEg/KNIPifTDIv2ISD8q0o+JjASRYYkMW2Q4IqOAyEgUGT6RkSQykkVGishIFRlpIiNdZGSIDL/ICIiMTJFRUGQUEhmFzb0j3J0MyfZgsr2YbB8m24/JDmCyg5jsECY7jMmOYLKjmOwYJMtIwGQWJrMxmYPJCmCyREzmw2RJmCwZk6VgslRMlobJ0jFZBibzY7IAJsvEZAUxWSFMVjjHM6q+0QnY+yRcJIEOR1W1DbqqI9FUk9p5VEcR5mZ2y+/LkhwbGZ+HraRG8mmqahPyVqV4VQ2rR1GlQht5Nb8bWZ9QAkE29MplN/RscY9SFT63vSrV8dPdF1uVfSIH9sdU7T6ZKQdiqTZE8ulgDFWVU1l3KIqqs/dI04/lrap5+sEn5KnalCM9rLxUFXImkZ2HqnSuVHNyqx7KnZAFcqka55G2iTlV3fJKbl8OVbc8r0CSRzWxUbSLkuaqykyKqko/pRpwWXRVRkRVbmAMlf+kakP5WKrACVX7jTFVmcdV9bNiqwqGVc0aKFSFpKpsc5WqMPKuILMbpOJ3bc8orKwxK90HExlFSA8mMgpLb+CzypVhGeJ3FuPBRHiVZwWhVZ6V35PL9wdx4ZNTiFZofhCXcbY7PMfY266MszHZOTofxB2/dkpYZpyNgDfjHCCy+U+es+T00FOtjLP5176QMlr9Pde+KOvay/f1RYFr3z8sQ/yKUa69XGWxILTKYvxrX0gp6qd77c91h8XNXftzMVlxrWtfCLr250LXrjgQ2fw/TAUnP4/xWVa45hTLxoAJrbIE42FqxnnSOGhs/jOsjAWVCTXWUxnPZ1VG+dDzfKAyjg3LEL+SlMooV1kyCK2yJOOTmnB+lzCZ36Uon6dklIRUF9C/vBVOboVojC48LnSHF5mDx4WY7CIteBSE4HEhdHgXAZHVyBxs8ospJaiUTEmsLF9CwcLF0pgzPxj8SyDVpZTgRyobUAMhVen8Fpf8kzNTeZt6echZhkVO+YlhGYCcvcIyxO8yCjnlKi8LQqu8jELOS2VKmLwFl1O+CJZxGaS6gk/OTKXoXV1yXukOrzJHzisx2VVa5MyEyHkldHhXAZHVyBxs8qspJehymZIYucpSyHm1NObMDwa/LKQqRwl+pLKplVhlK89/zxlQ3iZPe6eMCixyBqQ31N5JyhC/ayjklKu8BmrvFJ5fYadDznIyJUzegms55LwGUl3HJ2dAKdJt75RxvTu8wRw5r8dkN2iRMwCR83ro8G4AIquROdjkN1JK0LUyJTFy3UQh543SmDM/GPybINXNlOBHKptaiVW2W/jk9Ctv0woPOSuyyOmX3gA5V4RliN+tFHLKVd4ahFZ5K4WcN8uUMHkLbuOQ81ZIdTufnH6laLkuOSu5w8rmyFkJk1XWIqcfImcl6PAqA5HVyBxs8iqUEnSbTEmMXFUp5KwijTnzg8GvCqmqUYIfqWxqJVbZqvPJmaG8TU095KzBImeG9AbI2TQsQ/xqUsgpV1kzCK2yJoWc1WRKmLwFtTjkrAmpavPJmaEUNdElZx13WNccOetgsrpa5MyAyFkHOry6QGQ1MgebvB6lBNWSKYmRqz6FnPWkMWd+MPj1IVUDSvAjlU2txCpbQz4505W3aa2HnI1Y5EyX3gA514ZliN8dFHLKVd4RhFZ5B4WcDWRKmLwFd3LIeQekuotPznSlaI0uOe92h/eYI+fdmOweLXKmQ+S8Gzq8e4DIamQONvm9lBJ0p0xJjFyNKeS8Vxpz5geD3xhS3UcJfqSyqZVYZbufT8405W2q7SHnAyxypklvgJy1wzLE70EKOeUqHwxCq3yQQs77ZEqYvAUPccj5IKR6mE/ONKWoli45H3GHj5oj5yOY7FEtcqZB5HwEOrxHgchqZA42eRNKCXpIpiRGrqYUcjaRxpz5weA3hVSPUYIfqWxqJVbZmvHJmaq8TaM95GzOImeq9AbIOTosQ/xaUMgpV9kiCK2yBYWcj8mUMHkLHueQswWkeoJPzlSlaJQuOZ90hy3NkfNJTNZSi5ypEDmfhA6vJRBZjczBJn+KUoIelymJketpCjmfksac+cHgPw2pWlGCH6lsaiVW2VrzyZmivE3TPORswyJnivQGyDktLEP82lLIKVfZNgitsi2FnK1kSpi8Be045GwLqdrzyZmiFE3VJWeWO+xgjpxZmKyDFjlTIHJmQYfXAYisRuZgk3eklKB2MiUxcnWikLOjNObMDwa/E6R6hhL8SGVTK7HK9iyfnMnK21TXQ87OLHImS2+AnHXDMsSvC4WccpVdgtAqu1DI+YxMCZO34DkOObtAquf55ExWiurokvMFd/iiOXK+gMle1CJnMkTOF6DDexGIrEbmYJO/RClBz8mUxMjVlULOl6QxZ34w+F0hVTdK8COVTa3EKlt3PjmTlLepm4ecL7PImSS9AXJ2C8sQv1co5JSrfCUIrfIVCjmlcXeTt+BVDjlfgVSv8cmZpBR11SXn6+6whzlyvo7JemiRMwki5+vQ4fUAIquROdjkPSkl6FWZkhi53qCQs6c05swPBv8NSPUmJfiRyqZWYpXtLT45ffki59sscvqkN0bOt6FtvUMhp1zlOxg536GQ802ZEiZvwbsccr4DqXrxyenjkbO3OwyaI2dvTBbUIqcPImdv6PCCHHJik2dTStC7MiUxcvWhkDNbGnPmB4PfB1L1pQQ/UtnUSqyyvccnZ6LyNg33kPN9FjkTpTdAzuFhGeL3AYWccpUfBKFVfkAhZ1+ZEiZvwYcccn4AqT7ikzNRKRqmS86P3eEn5sj5MSb7RIuciRA5P4YO7xMgshqZg03ej1KCPpQpiZGrP4Wc/aQxZ34w+P0h1aeU4Ecqm1qJVbYBfHIWUN6mwR5yDmSRs4D0Bsg5OCxD/D6jkFOu8rMgtMrPKOT8VKaEyVvwOYecn0GqQXxyFlCKBumSc7A7HGKOnIMx2RAtchaAyDkYOrwhQGQ1MgebfCilBH0uUxIj1xcUcg6Vxpz5weB/AamGUYIfqWxqJVbZhvPJ6Shv0zoPOb9kkdOR3gA514VliN8ICjnlKkcEoVWOoJBzmEwJk7fgKw45R0CqkXxyOkrRWl1yfu0OvzFHzq8x2Tda5HQgcn4NHd43QGQ1MgebfBSlBH0lUxIj12gKOUdJY878YPBHQ6oxlOBHKptaiVW2sXxy2srbtMxDznEsctrSGyDnsrAM8RtPIadc5fggtMrxFHKOkSlh8hZM4JBzPKSayCenrRQJXXJOcoeTzZFzEiabrEVOGyLnJOjwJgOR1cgcbPIplBI0QaYkRq6pFHJOkcac+cHgT4VU0yjBj1Q2tRKrbNP55LSUt6mYh5wzWOSU/50BkLNYWIb4zaSQM2wchFY5k0LOaTIlTN6CWRxyzoRUs/nktJSiorrknOMO55oj5xxMNleLnBZEzjnQ4c0FIquROdjk8yglaJZMSYxc8ynknCeNOfODwZ8PqRZQgh+pbGolVtkW8smZoLxNkz3kXMQip9zsIoCck8MyxG8xhZxylYuD0CoXU8i5QKaEyVuwhEPOxZBqKZ+cCUrRJF1yhtyhMEfOECYTWuRMgMgZgg5PAJHVyBxs8mWUErREpiRGruUUcsonVcs584PBXw6pVlCCH6lsaiVW2VbSyZl+THmbenrI+S2JnOnHpDdAzp5hGRLf7xjkDK/yuyC0yu8o5FwhU8LkLfieQ87vINUqOjnDya0Q9dAl52p3uMYcOVdjsjU65Ew/BpFzNXR4a4DIamQONvlaSvH+XqYkRq51FHKulcac+cHgr4NUP1CCH6lsaiVW2X7kk/Oo8jbV8pBzPYucR6U3QM5aYRkS358o5JSr/CkIrfInCjl/kClh8hb8zCHnT5DqFz45jypFNXXJucEdbjRHzg2YbKMWOY9C5NwAHd5GILIamYNN/iuleP8sUxIj128Ucv4qjTnzg8H/DVL9Tgl+pLKplVhl+4NPziPK2xT0kPNPFjmPSG+AnMGwDInvJgo55So3BaFVbqKQ83eZEiZvwV8ccm6CVJv55DyiFPXWJecWd/i3OXJuwWR/a5HzCETOLdDh/Q1EViNzsMm3Uor3XzIlMXL9QyHnVmnMmR8M/j+Qahsl+JHKplZilW07n5yHlbepnYecO1jkPCy9AXK2C8uQ+O6kkFOucmcQWuVOCjm3yZQweQv+5ZBzJ6TaxSfnYaWorS45d7vDPebIuRuT7dEi52GInLuhw9sDRFYjc7DJ91KK978yJTFy7aOQc6805swPBn8fpNpPCX6ksqmVWGU7wCfnIeVtmuEh50EWOQ9Jb4CcM8IyJL6HKOSUqzwUhFZ5iELO/TIlTN6CwxxyHoJUR/jkVJ/CdF1yHnWHx8yR8ygmO6ZFzkMQOY9Ch3cMiKxG5kCT+xMoxVu+LD4CkctvMcjpDxtz5seC77cglU0JfqSyqZVQZfM7fHIeVN6mUi45/QVY5DwovQFylgrLkDRMpJBTrjIxCK0ykUFOvy1TwuQt8FHI6U+EVEl8ch5UikpqktOf7A5TjJHTn4zJUrTIeRAhpz8ZOrwUILIamYNNnsooQX6fTEmMXGkUcqZKY878YPDTIFU6JfiRyqZWYpUtg0/OA8rblO4hp59FzgPSGyBneliGxDdAIadcZSAIrTJAIac0zjB5CzI55AxAqoJ8cqqf2aTpkrOQOyxsjpyFMFlhLXIegMhZCDq8wkBkNTIHm7wIpXhnypTEyHUWhZxFpDFnfjD4Z0GqsynBj1Q2tRKrbOfwyblfeZvaeMhZlEXO/dIbIGebsAyJbzEKOeUqiwWhVRajkPNsmRImb8G5HHIWg1TF+eRUfybTWpec57nDEubIeR4mK6FFzv0QOc+DDq8EEFmNzMEmP59SvM+VKYmRqySFnOdLY878YPBLQqpSlOBHKptaiVW2C/jk3Ke8TQU95LyQRc590hsgZ8GwDInvRRRyylVeFIRWeRGFnPIx8AUmb8HFHHJeBKku4ZNT/VWKTF1yXuoOS5sj56WYrLQWOfdB5LwUOrzSQGQ1MgebvAyleF8sUxIj12UUcpaRxpz5weBfBqkupwQ/UtnUSqyyXcEnp/p7agkecl7JIude6Q0t2H8VhYly/qt6U2h3uTxGk5l7NYd2V0GqshqHD2xJGvfmp/qefKV6OVaq75HeWKqXp6S6nL+8TqorncPnWD5oKInP+LR3q9fhOe0KrNPeLb2xG1gByolrKDkhV3kNdnLXUIqkzJxrMHBeDa3yWkZ+h6N0bW/Oq5ZrIdV1lFctEUKplRihrqcUl+ukMVY2rwWuyGnFxe7TfUjlrKymXdYnbEDqQEJcFBfFRXHR/70oEXz545uHzIdZzTVnNcec1WxzVrPMWc00ZzXDnNV0c1bTzFlNNWc1xZzVZHNWk8xZTTRnNcGc1XhzVuPMWY01ZzXGnNVoc1ajzFl9Y87qa3NWI81ZfWXOaoQ5qy/NWQ03ZzXMnNUX5qyGmrMaYswqOcmclc+cVaI5qwLmrBxzVrY5K8ucVYIxq6Rj5qyOmrM6Ys7qsDmrQ+asDpqzOmDOar85q33mrPaas9pjzmq3Oatd5qz+NWe105zVDnNW281ZbTNn9Y85q63mrP42Z7XFnNVmc1Z/GbNKqWPOqrY5q1rmrGqas6phzqq6Oatq5qyqmrOqYs6qsjmrSuasbjdndZs5q1vNWVU0Z3WLOaubzVndZM7qRnNWN5izut6c1XXmrK41Z3WNOasK5qzKm7MqZ86qrDmrq81ZXWXO6kpzVlcYs0p9x5zV2+as3jJn9aY5qzfMWfU0Z9XDnNXr5qxeM2f1qjmrV8xZvWzOqrs5q27mrLqas3rJnNWL5qxeMGf1vDmr58xZdTFn1dmc1bPmrJ4xZ9XJnFVHc1YdzFllmbNqb86qnTmrtuas2hizSlthzmq5Oatl5qyEOauQOaul5qyWmLNabM5qkTmrheasFpizmm/Oytx3INPMfQcyzdx3INPMfQcyzdx3INPMfQcyzdx3INPMfQcyzdx3INPMfQcyzdx3INPMfQcyzdx3INPMfQcyzdx3INPMfQcyzdx3INPMfQcybYw5K3PfgcwobM6qkDmrguasMs1ZBcxZ+c1ZZZizSjdnlWbOKtWcVYo5q2RzVua+A5lh7juQGea+A5lh7juQGea+A5lh7juQGea+A5lh7juQ6ea+A5lu7juQ6ea+A5lu7juQ6ea+A5lu7juQ6ea+A5lu7juQ6ea+A5lu7juQ6ea+A5kOfAcyH52iEjbkR5wQPPVL1JnCf4Pw3yj8Nwn/zcJ/i/BXFP5bhf824b9d+CsJf2XhryL8VYW/mvBXF/4a5lpP3V4KklXCZJUxWRVMVhWTVcNk1TFZjVKntyOAEskPfNlDx/ZGju1NHNubOba3cGwrcmxv5djepmzidvh02/eygdYTvtnZQHM43xylKiH8a88qVXgjvnnQdm/PbxSx7U6HtjsD2u5MaLuzoO1Wyu92+0CTT4MmryxV5/1TfM8Yp8h7l9pb190+58iDRQtUv3JPraEtmvcu802/Fk+sFZmXc05kPHQiE6ATmQgFZRIUlCqc7Y6GtjsG2u5YaLvjoO1W5STgKGjyalJ18eopSfu+7FVgzNodbZ/dc3mfJTXfmTGiYra46rZud/32/rb6IvNSzokMh07kS+hERkBB+QoKSnXOdodA2x0KbfcLaLvDoO3W0MGmurWS+pcGEvN4VTj6riebVrju+qptW7fLki8KW7Zt00e+SHdfJPo6mR/7a3pflXtfentfX3tfRHtfKXtfDntf83pf2H7omfhuz/gez/hez7ixZ3yfZ3y/Z/yAZ/zgh8JfS/hrC38d4a8r/PWEv77wNxD+hvHuUXFRXBQX/T8ninePiljFu0fhVvHuUbhVvHsUbhXvHoVbxbtH4Vbx7lG4Vbx7FG4V7x6FW8W7R+FW8e5RuFW8exRuFe8ehVvFu0fhVvHuUbhVvHsUbhXvHoVbxbtH4Vbx7lG4Vbx7FG4V7x6FW8W7R+FW8e5RuFW8exRuFe8ehVvFu0fhVvHuUbhVvHsUbhXvHoVbxbtH4Vbx7lG4VZY5q3j3KNgq3j0qH1bx7lG4Vbx7FG4V7x6FW8W7R+FW8e5RuFW8exRuFe8eBVvFu0flwyrePQq3inePwq3i3aNwq3j3KNgq3j0qH1bx7lG4Vbx7FLF7VKXTukc1Ev47hP9O4b9L+O8W/nuE/17hbyz89wn//cL/gPA/KPwPCf/Dwv+I8D9qrntUI6yn0h2Y7E5MdhcmuxuT3YPJ7sVkjTHZfZjsfkz2ACZ7EJM9hMkexmSPYLJHS2k0s0gukA00s0hOzAaaWST7soFmFslJSGHwNwIKg8Z2E6DtWtB2bWi7DrTdO/K7Xah5TNIxaPI7s5HuRTdRTiRpP3IiSQeQE0k6CAXlEBSUuzjb3Q1tdw+03b3QdvdB272bk4C7oMnvyUa6F13HOZGt0In8A53INigo26Gg3MvZ7l/QdjdD290CbfdvaLuNKdtNqYlsN6UWst2U2sh2U+pA272Ps92q0HarQdutDm23BrTd+ynlJaUKNPkDEN9qcU7kFuhEKkIncisUlNugoDzI2e4N0HZvhLZ7E7Tdm6HtPsRJwOuhyR+G+FaNcyJloRMpB51IeSgoFaCgPMLZ7hXQdq+EtnsVtN2roe0+Cmw3/230/I28zwi8DwK87/a9b+m979u9b86978C9b7O976W9b5i974q9b32972+9b2K971Q9bfT8tTzj2p5xHc+4rmdczzOu7xk38Iwbfij8TYS/qfA/JvzNhL+58LcQ/seF/4l4G724KC6Ki/6fE8Xb6EWs4m30cKt4Gz3cKt5GD7eKt9HDreJt9HCreBs93CreRg+3irfRw63ibfRwq3gbPdwq3kYPt4q30cOt4m30cKt4Gz3cKt5GD7eKt9HDreJt9HCreBs93CreRg+3irfRw63ibfRwq3gbPdwq3kYPt4q30cOt4m30cKt4Gz3cKt5GD7eKt9HDreJt9HCreBs93CrLnFW8jR5sFW+jlw+reBs93CreRg+3irfRw63ibfRwq3gbPdwq3kYPt4q30YOt4m308mEVb6OHW8Xb6OFW8TZ6uFW8jR5sFW+jlw+reBs93CreRo/YRq/baW30nhT+lsL/lPA/LfythL+18LcR/rbC30742wt/lvB3EP6Owt9J+J8R/mfNtdF7EmuS1hKTPYXJnsZkrTBZa0zWBpO1xWTtMFl7TJaFyTpgso6YrBMmewaTPavTRi/1zWyg60TqW9lA14nUt7OBrhOp7yCFwf8kUBg0tvs6tN0e0HZ7Qtt9A9puy/xuF+rykvoaNPlT2UiboaacE3kJOpGu0Il0g4LSHQrK05ztPgdt93louy9A230R2m4rTgJ2gSZvnY20GXqYcyJZ0Il0gE6kIxSUTlBQ2nC22wbabltou+2g7baHttuWst00gWw3bRmy3bTlyHbTVkDbbcfZ7mJou0ug7S6FthuCttueUl7SFkGTZ0F868Q5kdnQicyBTmQuFJR5UFA6cLY7HdruDGi7M6HtzoK225GTgNOgyTtBfGvPOZHx0IlMgE5kIhSUSVBQnuFsdzS03THQdsdC2x0HbRf4MplOG70nvc8IvA8CvO/2vW/pve/bvW/Ove/AvW+zve+lvW+Yve+KvW99ve9vvW9ive9UvW30mnjGTT3jxzzjZp5xc8+4hWf8uGf8xIfC31n4uwj/c8L/vPC/IPwvCv9Lwt813kYvLoqL4qL/50TxNnoRq3gbPdwq3kYPt4q30cOt4m30cKt4Gz3cKt5GD7eKt9HDreJt9HCreBs93CreRg+3irfRw63ibfRwq3gbPdwq3kYPt4q30cOt4m30cKt4Gz3cKt5GD7eKt9HDreJt9HCreBs93CreRg+3irfRw63ibfRwq3gbPdwq3kYPt4q30cOt4m30cKt4Gz3cKt5GD7fKMmcVb6MHW8Xb6OXDKt5GD7eKt9HDreJt9HCreBs93CreRg+3irfRw63ibfRgq3gbvXxYxdvo4VbxNnq4VbyNHm4Vb6MHW8Xb6OXDKt5GD7eKt9EjttGbdVobvW7C3134Xxb+V4T/VeF/TfhfF/4ewt9T+N8Q/jeF/y3hf1v43xH+d4W/l7k2et2wJmndMdnLmOwVTPYqJnsNk72OyXrotIPLyMwGuidkFMwGuidkFMoGuidkFEYS3A98zKWz3XRouxnQdv3QdgPQdrvnd7tQt5KMNGjyl7ORdjmvck6kAHQiidCJ+KCgJEFBeYWz3QRouxa0XRvargNt91VKAqYfgyYPdy1Ut8vhlIT0/ciJpB9ATiT9IBSUQ1BQXudsdze03T3QdvdC290HbbdHfrcLvVDy9+TYvsGxfZNj+xbH9m2O7Tsc23c5tr10bJXX1K98mZyk1T2qm/elsff1r/dFrveVrPflqvc1qfeFpzv2ebpB+TqZGft7e7tHdfaMu3jGz3nGz3vGL3jGL3rGL3nGXT8U/qDwZwt/H+HvK/zvCf/7wv+B8H94eveo5D7u2yQsOYJm36YVyIfYSoi8TZM7+kj4Pxb+T4S/n7k3YB8lQ7KPMdknmKxfcm7mqXYjjwG6ch8hZPR/jJDR/wlCRn8/ID3OMAOz/yMZ2F/4PxX+AcI/0FwG9sdy5lNMNgCTDdTKwGwoA/tDGfgplIEDoAwcyM/APv+RDPxM+D8X/kHCP9hcBn6G5cznmGwQJhuslYF9oAz8DMrAz6EMHARl4GB+Bvb9j2TgEOEfKvxfCP8wcxk4BMuZoZjsC0w2TCsD+0IZOATKwKFQBn4BZeAwfga+9x/JwOHC/6XwjxD+r8xl4HAsZ77EZCMw2VdaGQg9IfEPhzLwSygDR0AZ+BU/A9//j2TgSOH/Wvi/Ef5R5jJwJJYzX2OybzDZKK0MfB/KwJFQBn4NZeA3UAaO4mfgB/+RDBwt/GOEf6zwjzOXgaOxnBmDycZisnFaGfgBlIGjoQyEmqr7oabq/nH8DPzwP5KB44V/gvBPFP5J5jJwPJYzEzDZREw2SSsDP4QyEPorBn7orxj4ob9i4J+U3wx08pmBVn7yb31CyZOWVgz9iadWClHCiadWClHCiadWCpFU9fNs1Yqq6u+qrOhen55SWTFmHBBRWbHWNTDHEVh5qj47XWXl7fX5aSoryoyDvCor2roG55EaVi7VkNwqK7fX0FwqK48Zv8ipsvJa17AoKWudphqet8o63evLPFVWjhlH5KWycq7rqxhXyTqlGhldZbleX0dVWZ4Zv4mmsrzrGqW44lZChJwKUcIJcipECSfIqRBJFfbnSCYoVVbCiUqpECVglTJflbG02jA77Ni6XasWwj/51PfPLhb+KcI/VfinCf904Z8h/DOFf5bwzxb+OcI/V/jnCf984V8g/AuFf5HwLxb+JcK/VPhDwi+Ef5nwLxf+FcK/Uvi/Ff7vhP974V8l/KuFf43wrxX+dcL/g/D/KPzrhf8nDNZn9BqljNlXKBfnR2wHvWH9Wfh/Ef4Nwr9R+H8V/t+E/3fh/0P4/xT+TcL/l/BvFv4twv+38G8V/n+Ef5vwbxf+HcK/U/j/Ff5dwr9b+PcI/17h3yf8+4X/gPAfFP5Dwn9Y+I8I/1HhPyYCCSJgmXsN9DMm+wWTbcBkGzHZr5jsN0z2Oyb7A5P9ick2YbK/MNlmTLYFk/2NybZisn8w2TZMth2T7cBkOzHZv5hsFybbjcn2YLK9mGwfJtuPyQ5gsoOY7BAmO4zJjmCyo5jsGCQLYEU1YFmnv8dbn3AJAjLoPd7P6vd4x2S9VqskUDaoVRJBG9UqCbBf1SqJxd/UKvk65He1qrus1NC73T+VqqNStUmpOixVfylV+6Vqs1K1Q6q2KFUbpOpvpWqWVG1VqrpJ1T/Q+/5tKtXRsGq7SnU4rNqhUu0Pq3aqVDvCqn9Vqg1h1S6ValZYpfw+Z7ewSvl9zuPvEVTf59x2XLVPodp6XKX6Wu1fx1Wqr9VuOK5Sfa12xXHVIYVq1HHVYYWq3XHVkdiq7B3HVUdjq4InVMdiq3odVwUUXwx/64QKeYTkLdfBPidcN0Svw9bxr4f9DH1HKnOx3vztN8ac/2N4/iX5nL933//JQzT1RjZrbeT//NmceiNbdE/k//aRn3ojf+tvJOrchCeJ6o1sPcON5LkG8w8o1Rv554w38n/y3FO9kW0mToT/OFW9ke1mNnLa3ISntOqN7DC4kVNrMP/wV72RnUY3QnumrN7Iv/ncSJ/jryzqZ8V+ZfGJfGURFjZroBD2Oyk8uc6JUYX94dcqu7V2dNy1TPSFfupd6IAYOxrgEZaLtfWB8I726O/ouGu3POf/7PTQS+H4vBf6eU5htSg7GgTvaO+Z7KhhtIgOzrWj48LSuYRD8hQ+lNtxKLyjfWd4Rt27N85jR1/ksdBueW19WN5bDws7nyYcDu9o/xnv6LhrzdMX+mW0hW7KsaMRUYQVcm79K3hHB8zs6LhrlVPzj4weeins7S7061jCtp4dfQPv6KCpHU3yRnRUzB15HlyMVgpPvmMfA+/okMEzqrpx98kdjVUsdENk6+PUWz/xDHUCvKPDRncUeSY5ETij4w/jJp0QKlZgHf9EF9zRkfy++FmfUBT7gBuZPmAjL5IyF0OqJZBqM6TaAqn+hlRbIdU/kGobpNoOqXZAqp2Q6l9ItRtS7YFUeyEV9Ivzmfsh1QFIdRBSQf0LMg9Dqnxf4U+hdyZToAvsYM88sSeT2HsC7HU29toVez2IvcbCXrdgrwUwvmLMMsaB3J91jmvUtkOLls3btqnQqEVW604dm3Zs2bZNdl/PZ5+2Z+xE+U31gX1FoIAIJIqATwSScj38TlCm6lT5CSeEu4Lp+bwrQegFxC9y/dj8Gfm9q32RuxooAN3VZMSrYDqk4mzEPxXaSAp21sZORCfxkz3jlBiJnyoCaSKQLgIZGok/TX5ojyWen5L4G+T6sfkDnMRPhfLFD6U0puJsxD8N2kgAO2tjJ6KT+H7POBAj8TNFoKAIFBKBwhqJP134N2KJl0lJ/I1y/dj8BTmJnwnlSxEopTMhFWcj/unQRs7CztrYiegkfhHP+KwYiX+2CJwjAkVFoJhG4s8Q/l+xxCtESfxf5fqx+QtzEv9sKF/OhVK6EKTibMQ/A9pIceysjZ2ITuKf6xkXj5H454lACRE4XwRKaiT+TOH/DUu8IpTE/02uH5v/LE7inwflSykopTEucDbinwlt5ALsrI2diE7il/KML4iR+BeKwEUicLEIXKKR+LOE/3cs8c6mJP7vcv3Y/OdwEv9CKF8uhVL6bEjF2Yh/FrSR0thZGzsRncS/1DMuHSPxy4jAZSJwuQhcoZH4s4X/DyzxilIS/w+5fmz+YpzEh34DIHAllNJFIRVnI/7Z0Eauws7a2InoJP6VnvFVMRL/ahEoKwLlRKC8RuLPEf4/scQ7l5L4f8r1Y/MX5yT+1VC+VIBSGnsnwNmIfw60kWuwszZ2IjqJX8EzviZG4l8rAteJwPUicING4s8V/k1Y4p1HSfxNcv3Y/CU4iX8tlC83Qil9HqTibMQ/F9rITdhZGzsRncS/0TO+KUbi3ywCt4hARRG4VSPx5wn/X1jinU9J/L/k+rH5S3IS/2YoX26DUvp8SMXZiH8etJHbsbM2diI6iX+bZ3x7jMSvJAKVRaCKCFTVSPz5wr8ZS7xSlMTfLNePzX8BJ/ErQflSDUpp7NkPZyP++dBGqmNnbexEdBK/mmdcPUbi1xCBmiJQSwRqayT+AuHfgiXehZTE3yLXj81/ESfxa0D5UgdK6QshFWcj/gXQRupiZ23sRHQSv45nXDdG4tcTgfoi0EAEGmok/kLh/xtLvIspif+3XD82/yWcxK8H5UsjKKUvhlScjfgXQhu5AztrYyeik/iNPOM7YiT+nSJwlwjcLQL3aCT+IuHfiiXepZTE3yrXj81fmpP4d0L5ci+U0tjTfs5G/IugjTTGztrYiegk/r2eceMYiX+fCNwvAg+IwIMaib9Y+P/BEq8MJfH/kevH5r+Mk/j3QfnyEJTSZSAVZyN+6GvcgYexszZ2IjqJ/5Bn/HCMxH9EBB4VgSYi0FQj8ZcI/zYs8S6nJP42uX5s/is4if8IlC+PQSl9OaTibMQP/WZCoBl21sZORCfxH/OMm8VI/OYi0EIEHheBJzQSf6nwb8cS70pK4m+X68fmv4qT+M2hfHkSSmns813ORvxLoY20xM7a2InoJP6TnnHLGIn/lAg8LQKtRKC1RuKHhH8HlnhXUxJ/h1w/Nn9ZTuI/BeVLGyilr4ZUnI34Q9BG2mJnbexEdBK/jWfcNkbitxOB9iKQJQIdNBJfCP9OLPHKURJ/p1w/Nn95TuK3g/KlI5TS5SAVZyN+AW2kE3bWxk5EJ/E9f0g30ClG4j8jAs+KQGcR6KKR+MuE/18s8SpQEv9fuX5s/ms4if8MlC/PQSmNfaOHsxH/Mmgjz2NnbexEdBLf84ecA8/HSPwXROBFEXhJBLpqJP5y4d+FJd61lMTfJdePzX8dJ/FfgPKlG5TS10Iqzkb8y6GNdMfO2tiJ6CS+50+zB7rHSPyXReAVEXhVBF7TSPwVwr8bS7zrKYm/W64fm/8GTuK/DOXL61BKXw+pOBvxr4A20gM7a2MnopP4r3vGPWIkfk8ReEME3hSBtzQSf6Xw78ES70ZK4u+R68fmv4mT+D2hfHkbSmnsO5ycjfhXQht5BztrYyeik/hve8bvxEj8d0Wglwj0FoGgRuJ/K/x7scS7mZL4e+X6sflv4ST+u1C+ZEMpfTOk4mzE/y20kT7YWRs7EZ3E9/59kT4xEl/+9z0ReF8EPtBI/O+Efx+WeBUpib9Prh+b/1ZO4kN/bz3wIZTSFSEVZyP+76CNfISdtbET0Un8Dz3jj2Ik/sci8IkI9BOB/hqJ/73w78cS7zZK4u+X68fmv52T+B9D+QI1kiuIfWufsxH/99BGBmBnbexEdBL/U894QIzEHygCn4nA5yIwSCPxVwn/ASzxKlES/4BcPzZ/ZU7iD4TyZTCU0pUgFWcj/lXQRoZgZ23sRHQSf7BnPCRG4g8VgS9EYJgIDNdI/NXCfxBLvCqUxD8o14/NX5WT+EOhfPkSSukqkIqzEf9qaCMjsLM2diI6if+lZzwiRuJ/JQIjReBrEfhGI/HXCP8hLPGqURL/kFw/Nn91TuJ/BeXLKCilsd/T4mzEvwbayGjsrI2diE7ij/KMR8dI/DEiMFYExonAeI3EXyv8h7HEq0FJ/MNy/dj8NTmJPwbKlwlQSteAVJyN+NdCG5mInbWxE9FJ/Ame8cQYiT9JBCaLwBQRmKqR+OuE/wiWeLUoiX9Erh+bvzYn8bE/TTANSulakIqzEf86aCPTsbM2diI6iT/NM54eI/FniMBMEZglArM1Ev8H4T+KJV4dSuIflevH5q/LSXys5eQcKKWx38zlbMT/A7SRudhZGzsRncSf4xnPjZH480RgvggsEIGFGon/o/AfwxKvHiXxj8n1Y/PX5yQ+1pVjEZTS9SAVZyP+H6GNLMbO2tiJ6CT+Is94cYzEXyICS0UgJAJCI/HXi0AClngNGIkfkP9dgs3fkJP42C8uLYNSugGk4mzEvx7ayHLsrI2diE7iL/OMl8dI/BUisFIEvhWB7zQS/ycRsLDEa0RJfJl6K7D57+AkPvbdru+hlMZ6MXA24v8J2sgq7KyNnYhO4n/vGa+KkfirRWCNCKwVgXWnxysbWL0PSo7V+T0qKJUDP8S2/WVx9XKn2/ZTrTYff0nvR2Tn8b9+d0pl9K/fcfJpfVRb55StzkX8wTP+8dTY08c5sF5eQ4mQn0XgFxHY0H1ElayWrVq1fCLs37dAsPvQu1q2eaJVixP7SFCFJ/CTOjy9+/TurbbKXQ9U/0I42B/W2QhMnjvUQ+6s3KBmde9XsTaW0jnoX2PPPrjHsE90bH+LbbtpR/VjOra/R7UtEBlopeWvnvFvp8aXeH76u0zLP0TgTxHYJAJ/nb72PkA2QF1jAn9AUdhMouRmz/hPz3iTZ/yXjMMWEfhbBLaKwD+nX8/E7O5DKmdlNe3SR3mlwgmA3WGg8RJmhLQ2ymd12fI/rC6BjVCubDNUXbaVOv2sfX3zFyzrfxL9/FpuNG3p/C8zZBuUIdsNZcj2Ujpr3A6tcYehNe7IkcVJ+X5BsZ13oKowJAALzHf3JWRiC5j4csbEyJ/ovoIxsQNMfKXOxCpT6A9ROBN1XvSrpr6aEcgCwMRlGRMnAhOXY0yMPAYoz5g4CZi4AmNi5G/7XsOYOAWY+FrGxKnAxNcxJk4DJr6eMTHyl5lvYEycAUx8I2Ni5E/y3sSYOABMfDNjYuRvsd7CmLggMHFFxsTIH+G8lTFxYWDi2xgTFwEmvp0x8VnAxJUYEyN/dq8yY+JzgImrMCZG/t5aVcbExYCJqzEmRv7QVnXGxMWBiWswJkb+wlJNxsQlgIlrMSZG/rRObcbEJYGJ6zAmRv6mSl3GxBcAE9djTIz8MY36jIkvAiZuoDOxyrShoUd0Gu/3GzH2cwf0/GIq4wyRP0hxJ2PPdxl6hKlxhnczTO9hmN7LMG3MML2PYXo/w/QBhumDDNOHGKYPM0wfYZg+yjBtwjBtyjB9jGHajGHanGHagmH6OMP0CYbpkwzTlgzTpximTzNMWzFMWzNM2zBM2zJM2zFM2zNMsximHRimHRmmnRimzzBMn2WYdmaYdmGYPscwfZ5h+gLD9EWG6UsM064M01A3imt3iuvLFNdXKK6vUlxfo7i+TnHtQXHtSXF9g+L6JsX1LYrr2xTXdyiu71Jce1Fce1NcgxTXbIprH4prX4rrexTX9ymuH1BcP6S4fkRx/Zji+gnFtR/FtT/F9VOK6wCK60CK62cU188proMoroMprkMorkMprl9QXIdRXIdTXL+kuI6guH5FcR1Jcf2a4voNxXUUxXU0xXUMxXUsxXUcxXU8xXUCxZXy+zGhSRTXyRTXKRTXqRTXaRTX6RTXGRTXmRTXWRTX2RTXORTXuRTXeRTX+RTXBRTXhRTXRRTXxRTXJRTXpRTXEMVVUFyXUVyXU1xXUFxXUly/pbh+R3H9nuK6iuK6muK6huK6luK6juL6A8X1R4rreorrTxTXnymuv1BcN1BcN1Jcf6W4/kZx/Z3i+gfF9U+K6yaK618U180U1y0U178prlsprv9QXLdRXCm//xWi/EZSaCfF9V+K6y6K626K6x6K616K6z6K636K6wGK60GK6yGK62GK6xGK61GK6zGGq7ASOLYWx9bm2Doc2wIc20SOrY9jm8SxTebYpnBsUzm2aRzbdI5tBsfWz7ENcGwzObYFObaFOLaFObZFOLZncWzP5tiew7EtyrEtxrE9l2NbnGN7Hse2BMf2fI5tSY5tKY7tBRzbCzm2F3FsL+bYXsKxvZRjW5pjW4ZjexnH9nKO7RUc2ys5tldxbK/m2Jbl2Jbj2Jbn2Fbg2F7Dsb2WY3sdx/Z6ju0NHNsbObY3cWxv5tjewrGtyLG9lWN7G8f2do5tJY5tZY5tFY5tVY5tNY5tdY5tDY5tTY5tLY4tpbuuBU1d5383NaXDrgNNrdVjV21bPxvpV7qFMzn0B5ADGzkZ3JBj24hjewfH9k6O7V0c27s5tvdwbO/l2Dbm2N7Hsb2fY/sAx/ZBju1DHNuHObaPcGwf5dg24dg25dg+xrFtxrFtzrFtwbF9nGP7BMf2SY5tS47tUxzbpzm2rTi2rTm2bTi2bTm27Ti27Tm2WRzbDhzbjhzbThzbZzi2z3JsO3Nsu3Bsn+PYPs+xfYFj+yLH9iWObVeObTeObXeO7csc21c4tq9ybF/j2L7Ose3Bse3JsX2DY/smx/Ytju3bHNt3OLbvcmx7cWx7c2yDHNtsjm0fjm1fju17HNv3ObYfcGw/5Nh+xLH9mGP7Cce2H8e2P8f2U47tAI7tQI7tZxzbzzm2gzi2gzm2Qzi2Qzm2X3Bsh3Fsh3Nsv+TYjuDYfsWxHcmx/Zpj+w3HdhTHdjTHdgzHdizHdhzHdjzHdgLHdiLHdhLHdjLHdgrHdirHdhrHdjrHdgbHdibHdhbHdjbHdg7Hdi7Hdh7Hdj7HdgHHdiHHdhHHdjHHdgnHdinHNsSxFRzbZRzb5RzbFRzblRzbbzm233Fsv+fYruLYrubYruHYruXYruPY/sCx/ZFju55j+xPH9meO7S8c2w0cW9IvffzKsf2NY/s7x/YPju2fHNtNHNu/OLabObZb1L8opWP7N2e1Wzm2/3Bst3Fst3Nsd3Bsd3Js/+XY7uLY7ubY7uHY7uXY7uPY7ufYHuDYHuTYHuLYHubYHuHYHuXYcvr22py+vTanb6/N6dtrc/r22py+vTanb6/N6dtrc/r22py+vTanb6/N6dtrc/r22py+vTanb6/N6dtr57tvL9QTws7MRnpCcB692AU5eyqE7MnhfAprc3oA25wewDanB7DN6QFsc3oA25wewDanB7DN6QFsc3oA25wewDanB7DN6QFsc3oA25wewDanB7DN6QFsc3oA25wewDanB7DN6QFsc3oA25wewDanB7DN6QFsc3oA25wewDanB7DN6QFsc3oA25wewDanB7BdgWPL6QFsc3oA25wewDanB7DN6QFsc3oA25wewDanB7DN6QFsc3oA25wewDanB7DN6QFsV6J8CmtzegDbnB7ANqcHsM3pAWxzegDbnB7ANqcHsM3pAWzX5tjW4djW5djW49jW59g24NhyeunanF66NqeXrn0nx5bTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob10bU4vXZvTS9fm9NK1Ob107SyOLaeXrs3ppWtzeunanF66NqeXrs3ppWtzeunanF66NqeXrs3ppWtzeunanF66NqeXrs3ppWtzeunanF66NqeXrs3ppWtzeunanF66NqeXrs3ppWtzeunanF66NqeXrs3ppWtzeunanF66NqeXrs3ppWtzeuna2RxbTi9dm9NL1+b00rU5vXRtTi9dm9NL1+b00rU5vXRtTi9dm9NL1+b00rU5vXRtTi9dm9NL1+b00rU5vXRtTi9dm9NL1+b00rU5vXRtTi9dm9NL1+b00rU5vXRtTi9dm9NL1+b00rU5vXRtTi9dm9NL1+b00rXHcGw5vXRtTi9dm9NL1+b00rU5vXRtTi9dm9NL1+b00rU5vXRt0m9xcnrp2pxeujanl67N6aVrc3rp2pxeujanl67N6aVrc3rp2pxeujanl67N6aVrc3rp2pxeujanl67N6aVrc3rp2pxeujanl67N6aVrc3rp2t9ybDm9dG1OL12b00vX5vTStTm9dG1OL12b00vX5vTStTm9dG1OL12b1NCF00vX5vTStTm9dG1OL12b00vX5vTStTm9dG1OL12b00vX5vTStTm9dG1OL117C8eW00vX5vTStTm9dG1OL12b00vX5vTStTm9dO1/ObacXro2p5euzemla3N66dqcXro2p5euzemla3N66dqcXro2p5euzemla3N66dqcXroOp5euw+ml63B66TqcXroOp5euw+ml63B66TqcXroOp5euw+ml63B66TqcXroOp5euw+ml63B66ToBjm0mx7Ygx7YQx5bT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vnQocW07/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W6cSx5bT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9a5k2PL6X/rcPrfOpz+tw6n/63D6X/rcPrfOpz+tw6n/63D6X/rcPrfOpz+tw6n/63D6X/rcPrfOpz+tw6n/63D6X/rcPrfOpz+tw6n/63D6X/rcPrfOpz+tw6n/63D6X/rcPrfOpz+tw6n/63D6X/rcPrfOpz+t04Wx5bT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vHU7/W4fT/9bh9L91OP1vnWyOLaf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86nP63Dqf/rcPpf+tw+t86UP/b+i1at83qUrtNy459Gq13Xr/s8iuuvOrqsuXKV7jm2uuuv+HGm26+peKtt91eqXKVqtWq16hZq3aduvXqN2jY6I4777r7nnsb33f/Aw8+9PAjjzZp+liz5i0ef+LJlk893ap1m7bt2md16NjpmWc7d3nu+RdefKlrqFuoe+jl0CuhV0OvhV4P9Qj1DL0RejP0Vujt0Duhd0O9Qr1DwVB2qE+ob+i90PuhD0Ifhj4KfRz6JNQv1D/0aWhAaGDos9DnoUGhwaEhoaGhL0LDQsNDX4ZGhL4KjQx9HfomNCo0OjQmNDY0LjQ+NCE0MTQpNDk0JTQ1NC00PTQjNDM0KzQ7NCc0NzQvND+0ILQwtCi0OLQktDQUConQstDy0IrQytC3oe9C34dWhVaH1oTWhtaFfgj9GFof+in0c+iX0IbQxtCvod9Cv4f+CP0Z2hT6K7Q5tCX0d2hr6J/QttD20I7QztC/oV2h3aE9ob2hfaH9oQOhg6FDocOhI6GjoWPCShCWJSxbWI6wCggrUVg+YSUJK1lYKcJKFVaasNKFlSEsv7ACwsoUVkFhFRJWYWEVEdZZwjpbWOcIq6iwignrXGEVF9Z5wiohrPOFVVJYpYR1gbAuFNZFwrpYWJcI61JhlRZWGWFdJqzLhXWFsK4U1lXCulpYZYVVTljlhVVBWNcI61phXSes64V1g7BuFNZNwrpZWLcIq6KwbhXWbcK6XViVhFVZWFWEVVVY1YRVXVg1hFVTWLWEVVtYdYRVV1j1hFVfWA2E1VBYjYR1h7DuFNZdwrpbWPcI615hNRbWfcK6X1gPCOtBYT0krIeF9YiwHhVWE2E1FdZjwmomrObCaiGsx4X1hLCeFFZLYT0lrKeF1UpYrYXVRlhthdVOWO2FlSWsDsLqKKxOwnpGWM8Kq7OwugjrOWE9L6wXhPWisF4SVldhdRNWd2G9LKxXhPWqsF4T1uvC6iGsnsJ6Q1hvCustYb0trHeE9a6wegmrt7CCwsoWVh9h9RXWe8J6X1gfCOtDYX0krI+F9Ymw+gmrv7A+FdYAYQ0U1mfC+lxYg4Q1WFhDhDVUWF8Ia5iwhgvrS2GNENZXwhoprK+F9Y2wRglrtLDGCGussMYJa7ywJghrorAmCWuysKYIa6qwpglrurBmCGumsGYJa7aw5ghrrrDmCWu+sBYIa6GwFglrsbCWCGupsELCEsJaJqzlwlohrJXC+lZY3wnre2GtEtZqYa0R1lphrRPWD8L6UVjrhfWTsH4W1i/C2iCsjcL6VVi/Cet3Yf0hrD+FtUlYfwlrs7C2COtvYW0V1j/C2ias7cLaIaydwvpXWLuEtVtYe4S1V1j7hLVfWAeEdVBYh4R1WFhHhHVUWMeEnSBsS9i2sB1hFxB2orB9wk4SdrKwU4SdKuw0YacLO0PYfmEHhJ0p7ILCLiTswsIuIuyzhH22sM8RdlFhFxP2ucIuLuzzhF1C2OcLu6SwSwn7AmFfKOyLhH2xsC8R9qXCLi3sMsK+TNiXC/sKYV8p7KuEfbWwywq7nLDLC7uCsK8R9rXCvk7Y1wv7BmHfKOybhH2zsG8RdkVh3yrs24R9u7ArCbuysKsIu6qwqwm7urBrCLumsGsJu7aw6wi7rrDrCbu+sBsIu6GwGwn7DmHfKey7hH23sO8R9r3Cbizs+4R9v7AfEPaDwn5I2A8L+xFhPyrsJsJuKuzHhN1M2M2F3ULYjwv7CWE/KeyWwn5K2E8Lu5WwWwu7jbDbCrudsNsLO0vYHYTdUdidhP2MsJ8VdmdhdxH2c8J+XtgvCPtFYb8k7K7C7ibs7sJ+WdivCPtVYb8m7NeF3UPYPYX9hrDfFPZbwn5b2O8I+11h9xJ2b2EHhZ0t7D7C7ivs94T9vrA/EPaHwv5I2B8L+xNh9xN2f2F/KuwBwh4o7M+E/bmwBwl7sLCHCHuosL8Q9jBhDxf2l8IeIeyvhD1S2F8L+xthjxL2aGGPEfZYYY8T9nhhTxD2RGFPEvZkYU8R9lRhTxP2dGHPEPZMYc8S9mxhzxH2XGHPE/Z8YS8Q9kJhLxL2YmEvEfZSYYeELYS9TNjLhb1C2CuF/a2wvxP298JeJezVwl4j7LXCXifsH4T9o7DXC/snYf8s7F+EvUHYG4X9q7B/E/bvwv5D2H8Ke5Ow/xL2ZmFvEfbfwt4q7H+EvU3Y24W9Q9g7hf2vsHcJe7ew9wh7r7D3CXu/sA8I+6CwDwn7sLCPCPuosI8JJ0E4Esm2cBzhFBBOonB8wkkSTrJwUoSTKpw04aQLJ0M4fuEEhJMpnILCKSScwsIpIpyzhHO2cM4RTlHhFBPOucIpLpzzhFNCOOcLp6RwSgnnAuFcKJyLhHOxcC4RzqXCKS2cMsK5TDiXC+cK4VwpnKuEc7VwygqnnHDKC6eCcK4RzrXCuU441wvnBuHcKJybhHOzcG4RTkXh3Cqc24Rzu3AqCaeycKoIp6pwqgmnunBqCKemcGoJp7Zw6ginrnDqCae+cBoIp6FwGgnnDuHcKZy7hHO3cO4Rzr3CaSyc+4Rzv3AeEM6DwnlIOA8L5xHhPCqcJsJpKpzHhNNMOM2F00I4jwvnCeE8KZyW8mN++ZG8/PhcftQtP5aWHyHLj3vlR7PyY1T5kaf8eFJ+lCg/9pMf0cmP0+RHX/JjKvmRkvz4R35UIz9WkR+ByI8r5EcL8mMA+chePl6Xj8LlY2v5iFk+DpaPbuVjVvlIVD6+lI8a5WNB+QhPPm6Tj8bkYyz5yEk+HpKPcuRjF/mIRD7OkI8e5GMC+ZZevv2Wb5Xl21r5FlS+XZRv7eTbMPmWSb69kW9F5NsG+RJfvhyXL53ly1z5klS+fJQv9eTLsi/vbNGxU1abak07Nl2fcFmCZTsFEn1JySmpaekZ/kBmwUKFi5x19jlFi51b/LwS55csdcGFF118yaWly/TuvT6hXHb3wZWbtcwqmr18RdLfu5cueKJ375M/Ojf3jypmL/9x7hV3rq7uKxn50a25f3Rb7h/Jop3XD4/l8UM7IY8fOr9nL/9wa5Eh6Z9kPOD+cEteP9yR1w/35vXDw3n8sICd1w+T8/qhP68fXpPH4gtcm9cPr8vjh4l78vrh3rx+uC+PHyZNzOuHk/L64eQ8fpjSJa8fPpfXD5/P44dpt+T1w4p5/TCPpBHpR/L6YV5pk55X2gRK5HEcgYvy+uFlef2wbF4/vC6vH96S1w8r5/XDmnn9sE328hFf9Wr+YrdF3U/9MPOG7OUPTk09+H6jRf3dH96W+wKKzJp5/bBOXj+s5/nhJ9nryjQ9/n7v0WZtW7dr2rHlY61aPNo2q2kz+f880yKrQ8u2bR59Nqtpu3YtstYnnN19SNW2bTp07NN9aLWWWS2adbS7f1G7TccWT7TIGnTPNRXUbxVz/nsrX/++W7Wc/z4hf/NX6z64atNWrYJpp3yG3dmildz0My3ytxL5fjaXg51fh6/Ca2kua3PVtu26nNpSNe+aPOYnVp5xxiuvZmDlg+/q2LZdMDvKSnOcUdUhNVq2aKX+ImX60BO0OrnTzO4jarTNatHyiTbh//O9dRd36tiyVcuOXU48nah6KlkbHs/Ve0+kau/ewe4jTzxoqNy8eVaLDh1OrSLYfehdLVu3a9XixHIik+VYbIF8haJzte4jqrRs0zT8WKNjw3bvRVycYfXk1Hc/2bRN2MVN1lOTDK3TqXW72o9nn/oHZ3UfWbtN8xMrjXpDro/x260/zN+zelydCq27D75b3tZgtvvvI1f15I6zJzzWqWWr5o+27vDEo4+1atvs6UefbNEqfLuts/7Ht/uTM7zdn5zMnMdzZ3j+jjWhRm6HRDO3u7p3TR5zuXLPxqu7g8isn99zYw5RDXcQXVTTHUQX1XIH0UW13UF0UR13EF1U1x1EF9VzB9FF9d1BdFEDdxBd1NAdRBc1cgfRRXe4g+iiO91BdNFd7iC66G53EF10jzuILrrXHUQXNXYH0UX3uYPoovvdQXTRA+4guuhBdxBd9JA7iC562B1EFz3iDqKLHnUH0UVN3EF0UVN3EF30mDuILmrmDqKLmruD6KIW7iC66HF3EF30hDuILnrSHUQXtXQH0UVPuYPooqfdQXRRK3cQXdTaHUQXtXEH0UVt3UF0UTt3EF3U3h1EF2W5g+iiDu4guqijO4gu6uQOoouecQfRRc+6g+iizu4guqiLO4gues4dRBc97w6ii15wB9FFL7qD6KKX3EF0UVd3EF0U6uYZxZB194xiyF72jGLIXvGMYshe9YxiyF7zjGLIXveMYsh6eEYxZD09oxiyNzwj76vLnLo3PaPTdGf6XrD6Gb/OrdZ9UP22z2R7X9WeXKuV29uX39Xl+ebKGiTf2nnfV1neGXK+jRqm+RbAyjG5O8Wp6XPv2T4ZjZP/p+M9mNP+lwLeJZ/2vyTmeFcg38+0zBljyzt1jv/N9uRUjv/J8aTRCeeO0TZp596k+0Yy98E6+YvtW2f8Bi0zaqDtqIF2oga6wKlAn+mjkbfOODaZuR+u2F6znA9X8udeKee/r5a/f18g8tgkz5uZlPNmOm6wT4t9sis47ecp7rHlOUHq0OrtOzVt1cE7xymvpFxPVVI7dB9cr23T5qd+4HP/0RAZ5awWuWf25T1zcs6tJbvXIc9/kJLzH6S4/2BweJ3BVqc/7wptN/DQIceN98Uoxkn58y6Y/2KcFL0Y+wwV46TcdcoXo04l5/cuRpk2Ofe0yd595ziGFO//FsUy9evII0NPiuflnuKmufuP5UulSELnNWtitFlTcm8kV56+lHM7Se5ZoznhHknOVSZ5Ty4ack9/nJp3YcwdFV/o45NbkCzET9Jxa2u0qMU8K8d7bLlXlRJ6J3Lj90SdQL3hvK2zIxvuHbUUVI1IPowek7s6PRYj0mcaFTvPpb8ficr+3Ev37PrU4nO97vToT4r6xRAluiKNF3rVosYuZhBOW2TuICSHBrqpcabFy4p+53Md72kRPtMC5cuzQA1xjzdqvKu1fCZKLcrjQ6uU/NbyXA6pnvdm5fPx6cYpg7Qz/uQt3fv2UOdDx4z8LSE599uF3DdiZLQT8qvLUl6H7w+NiViPirwgG5bHe5mkyAuiHGsMmORNAKBi5qD6nVrl3KLq5hfKnb6Zyn9UcGhel6lQ7FpZMDQlcpkO5YyVP4/znBZ19ijn6XfXndfsyyPGM3Odpt8b6Jz/YwB4GZSpTrG8XgBlhuZFQnI06lvDwJl92CtfAp+YQlhWzrBnum90osU6N00yo72F8ORUrn9U0BuTXNldyHsUsV5rRX1p68895WmvOqLXD7+yfhTKKwaefx/lnxWOSZ5M7+5zZ0bh0HfKl1uFoyRdodPIn4f12siWV+eMS0FvjT8p+j3q/Hm9CPWsIso/K4K+4Cqcx+KLhNYr41IoSlwKexGY27pQ6Bf3MkZbe8wHTFH+0Vm5/1ER76pyFhzP+Z0V44AKuQcUwyEQ/fTuerJV1MTJiDzMzet/LHj641y8dBQ+4/Qo7F1FXunxt+elaAyIFszHqv0xConfa3kKXGf27ZxPTH07J7T7/+zrOWc6UeSbffSJik9rseL29VvW0ydKLFD8o1LfNKlHn+j35EbV7fFvl1RPFOWpohPlsWgeTy09T6lyZluSsCIv3YSVlPOh9ampIooiURT5frFcAHyQ6bj/4LSZU6M81E2L9tro5I/T8whPquepaY7wpAurcI4DSHb/WY7HummuJO8Hyjk3l6p4rJuW8x+k5XxcJqz0aImYz8e5lvIbe6P/t9/Y637DmX1jz7rh1Ctq+4w/Evo1/p29+Hf24t/Zi39nL/6dvfh39uLf2Yt/Zy/+nb34d/Za/J98Zy8PWV5f2ctD9pZnFEP2tmcUQ/aOZxRD9q5nFEPWyzOKIevtGcWQBT2jGLJszyiGzDuKIevrGcWQvecZxZC97xnFkH3gGcWQfegZxZB95BnFkH3sGcWQfeIZxZD184xiyPp7RjFkn3pGMWQDPKMYsoGeUQzZZ55RDNnnnlEM2SDPKIZssGcUQzbEM4ohG+oZxZB94RnFkA3zjGLIhntGMWRfekYxZCM8oxiyrzyjGLKRnlEM2deeUQzZN55RDNkozyiGbLRnFEM2xjOKIRvrGcWQjfOMYsjGe0YxZBM8oxiyiZ5RDNkkzyiGbLJnFEM2xTOKIZvqGcWQTfOMYsime0YxZDM8oxiymZ5RDNkszyiGbLZnFEM2xzOKIZvrGcWQzfOMYsjme0YxZAs8oxiyhZ5RDNkizyiGbLFnFEO2xDOKIVvqGcWQhTyjGDLhGcWQLfOMYsiWe0YxZCs8oxiylZ5RDNm3nlEM2XeeUQzZ955RDNkqzyiGbLVnFEO2xjOKIVvrGcWQrfOMYsh+8IxiyH70jGLI1ntGMWQ/eUYxZD97RjFkv3hGMWQbPKMYso2eUQzZr55RDNlvnlEM2e+eUQzZH55RDNmfnlEM2SbPKIbsL88ohmyzZxRDtsUziiH72zOKIdvqGcWQ/eMZxZBt84xiyLZ7RjFkOzyjGLKdnlEM2b+eUQzZLs8ohmy3ZxRDtscziiHb6xnFkO3zjGLI9ntGMWQHPKMYsoOeUQzZIc8ohuywZxRDdsQziiE76hnFkB3zjKLLhJXgHcYSWt5hLKHtHcYSOt5hLGEB7zCWMNE7jCX0eYexhEneYSxhsncYS5jiHcYSpnqHsYRp3mEsYbp3GEuY4R3GEvq9w1jCgHcYS5jpHcYSFvQOYwkLeYexhIW9w1jCIt5hLOFZ3mEs4dneYSzhOd5hLGFR7zCWsJh3GEt4rncYS1jcO4wlPM87jCUs4R3GEp7vHcYSlvQOYwlLeYexhBd4h7GEF3qHsYQXeYexhBd7h7GEl3iHEWEev8MvrEu9w9OU//vf4t9A/C3+jfHf4j/5HadErd/jDydWtF/kD6dSxD3zf/K7/Fbp/+jv8ofDfYa/zZ/X3uK/zd/if/bb/OEXOv/h3+eXL1NP/41+Yb0V/5X+aP+J/0q/1yyP35gNv4yi/U5/+AXn/6u/1S+s60/t4pL/0O/1C+uyUxc/aPo3+4V19alNX6n83X5hXfuf+uV+YVU4FZq+wK/3h9ev/v1+Yd0I/IJ/WPXf+Q1/YVX0JMn/f/2Ov7Aqe075/6u/5b/h/43f8hdWbdO/5i+sBqfM68V/0d/AL/oL695TN+oD4Ff9hXWf2d/1F9bTp6wf/O/8tr+wmpyKy8f/B7/v3z/++/65/ze/upL8T37hX1ht1a/DdH/lX1gdT207C/ilf2F1+0/91r+wOquDo/t7/8J63nMt/x/6zf/wKcV/9d/NkR7e16j/m1/+D6PsjMp3lxtM/fa/sHrHf/0/53/iv/6f6yGksV///+zUHRik/PX/Uf/f+/X/b/7bv/4/zPSv/898okXHR1uVf7Rj20dbVXi0dYvWj7XI6vBky3aPPtuyYxtZy9YnVPgf/+WeVmf4l3taneTN2Wf8YZJD6wJQzbsmj3muz/RO6aN9olc96ud5NU7G4ZzTr1BNr30U4jp5vY6P/tg8n2GtdcZhvTjq2zQn6qd8BZQfql5wxp/Q1Tzj2FyS+zM+z+4KnP6ZUK5nt4kxPs/x5XchJj9pTzT0KDKPh6yJnip72t94u+Dk33ir2aJjvfJ3t61Xof6pYtf4RK3Lzvnn3TynNrxWi6btKmdlNe3ifbp8cfbpf/it+5ATkhx/D+7i/193V7PbNBCEYzuhbfiRggj/N4qKBFTqnVtqCAcKIg9gJc5arGSc1LGj9C2qtAc4wwkJCXFE8CCVeBjW9vpvveva7MaNe8vPrme9OzPffLNrzwnzyhLzH5n5j3JCSM37VupYQDyL9dq9fbrOe7fbYsoBmqIox1515QDPHlsTBxpHmm6DoQPGmuWaJjQgsMMyoFN7sji6+OKfKmeQoWIXfI27yoPEjToFggw5i5C0IOOroLKg6qrLguZW9/wzteEcad+Br4q9QBMPQkWkVPWMRaykrqdaw7qeZzszz41q0NLAAugISieWpg/1D1E936iO7+4Fm3Kf05T7WIvuchtikzv8K2DKyXBwFfV7S3MkFv+QuMP8ZvkYtMWOQRVBMWgr5zTI/5z2bJ17/PBeTlCnMJnhK9x7m1tL+lW583oEn4/WOfh8mIbGJyUovsRgUr8xnvr39tpSQzzoeXDglYKnciVFYTOdJYM3KauA374o+H1eIfw+w3E0sA5d4KJAeuqOTKhrhmvpGItNM8bgB5cEgzsCMIM381EAg1vJi6efzaC8lNPXr3Qr6ls59wSn/1iPYYTAcLM+wBAMuEtkeHZSgb6KTeWdbykvsaF4LY+PT8XmY9h5o9MimZq0ZpA/IkVYM8d3v0LH9wI7vhnapviI2IcN5sB24AgxjhkcAw0YBmqv6RMXCbYzZOTOJckrXK9hXiHt4vbjDyl1Py/7cKNu2YcO4ZV2U15pAJw30HofafEAKbHq63AvUOFi+YjU+NcsLXG7OvfwMxCDpsbbwLSHY7j42+iQE1F6k47of4XTZ2yUpdB0O2skOEh4Y2kbk+heihxPyXPP7YI8bCuW/j3o4KPc22n0pkTlG5a7D+eZu5JZvZreQdoM2ctpPnBHFD1lcbFmWWpFPI7ZiIdGJ3VUA9piE8rNDe4FC91VZmWWP2KLgZbnhD6Twrqc2n5LDKo04vFEFyaxPAijCohg6SNm+hRdzHi1zUwkUFA60xoaXxJmIMVjIBYven1Bd/kruXj+FGuHLoIVYDmfyOG1yy2DTPa/KngZ2/GFGfMh53kH5ixKSe8gF2hO8w4Sw6RlcjGiIzntfx8U+xvXMAsA",
|
|
3871
|
-
"debug_symbols": "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JC5JXuOsda87QsMliUsSlyQuSVySuGSte120yXHDJYlLCpcUr3HWutcdjejEQQxiEot4jW2te100EaISjehEaAINlxQuKVxSuKRwSeGSwiVr3eui6SAGMYlFhIZLiuuS4rqkcEnxGmete90RGi4pXFK4pLguWetej29k0LXu9fhiAV3rXnd04iAGMYlFnFc8XbKjEKENaAPagDagDWgD2oAW0AJaQAtoAS2gBbSAFtACWkJLaAktoSW0hJbQEtrpkuMzOHWte13xdMmOJ83OqEQjOnEQgwpJhHa6ZP3u6ZIdoU1oE9qENqFNaBPahDavsa11rztetLXudUcjOnEQg5jEIl5jW+teF+10yY5KNKIToQk0gSbQBJo+iIxNGZsyNoV2umTHICaxiNAMmkEzaAbNmEljbMbYjLEZNOO4OTPpzKQzkw7NoTk0h+bQnJl0xjYY22BsA9rguA1mcjCTg5kc0Aa0AS2gBbRgJoOxBWMLxhbQguMWzGQwk8lMJrSEltASWkJLZjIZWzK2ZGy4ZK173ZGZLGaymElcsta97gitoOGSiUsmLpm4ZOKSte510SbHDZdMXDJxyVr3elSwte51RyEq0YhOHMQgJrFptta9rni5xB6XS+xxucTWutdVQaAJNIEm0C6X2EMYmzI2ZWwKTY3oxEEMIjSFptAMmkEzZtIYmzE2Y2wGzZLITBoz6cykQ3NoDs2hOTRnJp2xOWNzxjagDY7bYCYHMzmYyQFtQBvQBrQBLZjJYGzB2IKxBbTguAUzGcxkMJMBLaEltISW0JKZTMaWjC0ZW0JLjlsxk8VMFjNZ0ApaQStoBa2YyWJsk7FNxjahTY7bZCYnMzmZyQltQsMlgksElwguEVwiuERwyVr3etLWutcdi3jNpOCSte51VRBouERwieASwSWCSwSXCC5Z614XTYWoRCM6EZpCwyWCSwSXCC4RXCK4RHDJWve6aDaIzCQuEVyy1r2uCg4NlwguEVwiuERwieASwSVr3euiOccNlwguEVyy1r2uCgMaLhFcIrhEcIngEsElgkvWutdFC44bLhFcIrhkrXvdFaDhEsElgksElwguEVwiuGSte1205LjhEsElgkukoBU0XCK4RHCJ4BLBJYJLBJesda+LNjluuERwieASmdAmNFwiuERwieISxSWKSxSXrHWvJ22te90xiEksIjSBhksU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",
|
|
3872
|
-
"verification_key": "
|
|
3870
|
+
"bytecode": "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tTl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt0bc5dujbnLl2bc5euzblL1+bcpWvP4Nhy7tK1OXfp2py7dG3OXbo25y5dm3OXrs25S9fm3KVrc+7StTl36dqkX3jl3KVrc+7StTl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt0bc5dujbnLl2bc5euzblL1+bcpWtz7tK1OXfp2py7dO2VHFvOXbo25y5dm3OXrs25S9fm3KVrc+7StTl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt0bc5dujbnLl2bc5euzblL1+bcpWtz7tK1OXfp2gc4tpy7dG3OXbo25y5dm3OXrs25S9fm3KVrc+7StU9wbDl36dqcu3Rtzl26NucuXZtzl67NuUvX5tyla3Pu0rU5d+nanLt0bc5dujbnLl2bc5euh3OXrodzl66Hc5euh3OXrodzl66Hc5euh3OXrodzl66Hc5euh3OXrodzl66Hc5euh3OXrodzl66Hc5euJ4ljm4djm5djm49jy7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1lOOY8u5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bzCMeWc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rac2x5Zz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/62Hc/+th3P/rYdz/60nlWPLuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/1sO5/9bDuf/Ww7n/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",
|
|
3871
|
+
"debug_symbols": "tZ3fjiPHkXffRde6YPzJiEi/ysIwtF7tQoAgG1p7gQ+G3v1jVWbUaY3QJap7fCP+RjOMU5lZcVhkZbP/9c1/ff+f//yfv/zw03//7X+/+dN//Oub//z5hx9//OF//vLj3/763T9++NtPz//7r28ex3/Ev/mT5i/ffiPnnyS/+VM8/yC1H+d61Md+lP2o+9H2o+/HsR9jP+56uuvprme7nu16tuvZrmfPenk8Pp9fx2Ptx7ke/bEfn8+fx+OTJ48jZIfqMHcYx7+RI2SH6jB3iGdd0SNIB+1gHbzDc7Biz5DHX/kRDsQ4wlH5GEjOHerR4ah8jK20g3XwDqPDUecY6DyedYx0agfr4B1Ghz6MmR2qw1xBH48O0kE7WAfv8KyjjyNUh7mDPDo866gc4UlXPUJ2qA5zh+N8WkE6aIcnXe0I3mF0OOr4EY46x4Ed55HGEfb8qGkH6+AdRodjfubzpNfjpNdcJ52m78exH2M/5n6s/bhOYq3HfpT9qPtx16tdr3a92vVq16tdr3a9+ThPej1Wto5H349jP8Z+zPOkt3PBHkewDt5h7CC6zmwT6+AdRodYJ7QdC7ZCdZg76KODrJPejjU4Tnqzfd7YOdFxhNEhOuQ6oe1o5BXmDkcrryAdfJ30djbzMdKzmc8wdxiPDtKhD2NYB+8wOkSH7FAddmNYPDrYOrPtaPgVRofokOukt9ynrx0n0wreYXSIDtmhOsx1ittxTq0gHXyd9HacRsdJb8d5dJz0Vj0/1fNTPT+z56fFYUscz5PezpP+WfVooLEeYj3keqj18Kw1nv/e+3XCn38Yxx+O1TwP7fnw/H9x/oNjBM8/5PmHY8J/ef6pX3D+8o+fv//++Js3r0DP16W/f/fz9z/945s//fTPH3/89pv/++7Hf57/6H///t1P5+M/vvv5+bfPif7+p/96Pj4L/vcPP35/pF++5dmP95+qEbqfral2Fch4tYLn2AXifJ38o88f2QcQ8ub59erzPzF4P7r7fLLXBD1fPnR52C7wjH5V8LCXS+hx7q0S6vahEl7ZJcZjfqzEtQgfLjH0cZXwj81FpneJnPHZEvV4fLDEtagl+qESZXKV8A8dReiwq61ifOwors58xg9NZzz0as6HfWxR57zmYs75sbl4PK65MPv8QOpjJfI6ikd9aEVCHnW5TuWDJZwS+rEScQ3keRn/wRWRa0XEP1ZC6pOLKg/pRZVH8NrxvKB9vdknvhhM5zO+raD1foma3ajTxoeOYR7XKrtDXN47Brsr8dCryX7Vpxavn96P63X84fHuUejNtYREL+nz3Qrr8cWKmr1fYj7f4vVs6psOeV6l/bqG3y3I1es1Y75fY7xf43mxvEvYZCDPNxS/rhA3FR7Xa8Azzo/VEOnZeL4Z0fdr1N3l2RzXRY5RQ+brhxHRp/jzel4+NpS3Nd7Y8w/VmEzprxb2ixqu/97pmPNxHcasdw/jVsHIT/Jd7fjdGWre1ni+Z3xTYr5eYgzWxOK9EvevA5OL//HuOG7OT326q6UxLN8tMW8aXnpJ680V9Ph1t4/bi/C6rl31zYWn/PpNyJCbmUguMNLr3RJ3R/Gcwj6KePNS8tESb+biD5XIukrMj5UYXISP/NhA6vHmOv7dFbk9K641nW/e0Xx5VtTnz4r5+bOiPn9W1OfPivr8WVGfPyvq33pWPD9I7xLPz9D1vfPivsS8Ljtd3j21Im9KPD8ivY7iUe9eosTNZARX8fn+G5q46xDnOun99zN59wGKeh+E6817orwz57yutfJx8yHKXY3kQ6Qcsz5d4+0nUX+oRl2fHWTNxwdr2Lxq5Feo8dHjeDsfj/zY+fG8xOjzw27e/N/WGFe7eYz3367W4/Pn2F2NV9f2vsZra/tyjY8ex4v98mqNu/Pj5Ro3PXdnsXldP87x/uchdWNSed7VvXT8vFP7/kdldfey8PA3H0c8dfjBY3l+2ncdy/Om1LtV5k3vVth1SRyjPlgj5lXj5tPY+9HY9anwM4/3z9Z5+4b+kdcL1c1n5Hc1Jh/Vz+d6f76GPj5a4zpd5eZjr/n5C9P5+QvT+5FcXp7PW+Pv9+7ddZBZXNdBbz6i/vI66Jy0dyWSXaMeby5B3F8vURXXojw+WmJcJT54FHl9Xl8fPYqkZz88kOtK/8MDmdc9xfnmk4k/WEKuEvnBEte1x4dLyOO68/CM9cHjuD5ivq1x+yFJXh+Lasm7H86eHxe+P5a8PieRx5zvft4jMu7egnH7AYvm44sKcWcv7krFe58Ri+TnPyQ+P2T77KfEIvOzHxOLPj7/4ep9kRc/GRX9/Eejv3Mgr302enuOxfWiUOrvnmN6U2H6dYKEv3uOaXz6NVY0P/0ie38cr33883qN9z//+Z0aL30AdF/jtU+A7mu89hHQ7dnx1DBGtvcddHeT6dXz4+4m06vnx+1xvHh+vFzj5vy4r/Ha+XFb48Xz47bGVzk/kvPjzVi+PD/u7jO9en64ff78uD2OF8+Pl2vcnB/3NV47P25rvHh+3Nb4GueHXK+2z9exx7vnx1e45SRf4Z6TfIWbTvIV7jrJV7jtJF/hvpN8hRtPv3N+cINA37yH+s35UV/h/Jhf4fyor3B+1Fc4P+ornB/1Fc6P+jefHzquTz30zb2bL8+P+ArXp/EVrk/jK1yfxle4Po2vcH0aX+H6NP7d16dj9nxIyPvXp7c1YlyvUXFzjuX4/F1KyfjsbUrJ/Ox9Ssn6/I3K80bAZ+8i3RZ59dbLy0Xu7pvcF3nxhtbvFHntjtbrRT58JC/ej7o/T168YXlf5MU7lnJ36+Tlk+2uyMtLfF/kxSV+uciHj+TV3nm1yO158nKR2wbMz965lBlf49alzPwa9y5/52hevXkpdzenXr17+TtFXrt9+TsDevX+pd7eUnnxBuZtkVfvYL5eRB8fLvLSPUx9fP4CVh+fv4D9ncG8dhvz/krpxfuYKo/P3se8LfHafczfKfHKfczfGcgr9zHvS7x0H/N+IC/dx7wt8dp9zN8p8cp9zPsSL93HvC3x6n3M++N47T7m7a2d5x3KwUcj8f4NxNu3JTSbvrkK+KKG6s1Hq3bdhPS311aPL9pV73alcJa/fXn5TYnbkVz3qZ6vnPquv+4O4805+uYHCf7QSOb1E0y/Xtg/UuP5Qfl4cx1yU+RuC9X1kqCPt3dkf30DUu9+EurV27pq8tnbunr3s1Cv3ta9L/LibV29uyPy4m3d3zmQr3Bb93lByNbrN5cNf6j3jQtM13c3IOjdT0RJxXUc09/9eFZtfn4Lwvmxw6fPVf/8uXp3T+TVH1W7L/Liz6qdyvvsuepfo/Pui2hdRd78BPdvT/g7Jx53Dy8pirz7Q1p6t/fneWbMy/BvfrbzNzXm3aeS14+bvbnfXfoHjqLkurSsN8375VHc3a96frB+aeT5GefbH5344ofW6u5kreuElzdfWPHlT+yOuxurD7t+uP7tz7ra60fB22572/+/OYoblz0vY64fl3V79zbzebPg0x4a+RU8dHdj5EUP3d2vetlDt0Ve9VDI5z10eyCveujlIjc/Nntf5NXLiBj/5il58TLitvOUweh8v//vfnTKLi37m+7/4itnbg/Cro9R7O2nQl8exN3PtTxv7Y/rNs+QfN/s+TWc+jvH8uZWz3B7/5Uq7354/+2Hf2/el73+HQR+uT38zafvv5nWm/O09HrfX/bm493fDOSuho3r44e3H+f8pkZ+lYW5PZLrlbv87hS56brn6/q1eXiMj3zF0/MmxvV1H0N//WPef37+6bu//vDzr7868fyKu+Ob9o4vwjoeaz/O9Xh8W9qx9en4srTzUfejHZ+8fXt++9b5OA7zrO/fOh+PL+DS/Q1cur+C6/h+sMd+lP2o+9H2o+/HsR9jP+56tuvZrue7nu96vuv5rue7nu96vuv5rue7nu96Y9cbu97Y9cauN3a9seuNXW/semPXG7te7Hqx68Wud3wl23iu9vGNbOfj2I9Hved5dnwd2/lY+3Gux3zsR1n//vi2tvNx1zu+q+38+7Efd73c9XLXy12vdr3a9WrXq12v9vHVPr7a9WrXq12vdr256x1f1nY+6n60/biPb+56xzcBno+5H2s/zvUoj11QHtJBO1gH7zA6RIfsUB268vF9jytIB+1gHbqydGXpytKVpSvLnoPzO0ZX6GPWPmbtyuodRofokB26snZl68rWla0rW8+G9TFbH7P1MVtXturQs+E9G96z4V3Zu7J3Ze/K3pW9Z8P7mL2PefQxj648ep5Hz8bo2Rg9G6Mrj648uvLoytGVo2cj+pijjzn6mLvDJHqeo2cjejaiZ6PbTLIrZ1fOrtytJt1r0s0m3W3S7XZ+e+pZuXqeu+OkW066585vTz2fVV25206676QbT7rzpFtPuvekm+/8htWz8ux57v6TbkDpDjy/YXU9a1fW7kHtHtTuQe0e1O5B7R7U7sHzO1ePyud3rq6wZ0O7B7V7UKUrS1fuHtTuQe0e1O5B7R7U7kHtHjy/l/WsrNrBOniH0aEra1fuHtTuQe0e1O5B7R7U7kHtHjy/qfWsbNGhZ6N7ULsH1buyd+XuQe0e1O5B7R7U7kHtHtTuQfWuPHqeuwe1e1C7B3V05dGVuwe1e1C7B7V7ULsHtXtQuwe1X+O0X+S0e1C7B7V7UPuFTvuVTrsHtXtQuwe1e1C7B7V7ULsHz++6PStnz3P3oHYPavfg+YW357OqK3cPavegdg9q96B2D2r3oHYP6uzKs+e5e1C7B7V78Pw63PWsrtw9qN2D1j1o3YPWPWjdg9Y9eH5p7lHZHtEhO1SHPRsmXVm6cvegdQ9a96B1D1r3oHUPWvfg+VW7Z2V9dJAO2sE6dGXtyt2D1j1o3YPWPWjdg9Y9aN2DZl3ZvEPPRvegdQ+eX+K7ntWVuwete9C6B6170LoHrXvQugfPL/o9K3vPc/egdQ9a9+D5Rb/ns0ZX7h607kHrHrTuQesetO5B6x606MrR89w9aN2D1j1ofalpfa1p3YPWPWjdg9Y9aN2D1j1o3YPn1wOflbPnuXvQugete9D6wvP8euAVunL3oHUPWvegdQ9a96B1D55fGHxWnj3P3YPWPWjdg9aXoTa7cvegdQ9a96B1D3r3oHcPevegP3Zlf3iH0SE6ZIfqZ3Xl7kHvHvTuQe8e9O5B7x707kGXrizVYc+Gdw9696D3tahrV+4e9O5B7x707kHvHvTuQe8edOvKph16NroHvXvQ+1rUrSt3D3r3oHcPevegdw9696B3D7p3Ze957h707kHvHvS+FvXRlbsHvXvQuwe9e9C7B7170LsHfXTl6HnuHvTuQe8e9L4W9e5B79dB79dB7x70vhb17Mr9ns+7B7170LsHvV8H/ezBPMLxHe2PI1SHucP5te9nkA7awTp4h9EhOnTl6srVlWdXnl15duXZlWdXnl15duXZlWdXnrvyeDw6SAftYB28w+gQHbJDdejK0pWlK0tXPnowzk8FvMPocFS2I2SH6jB3OH/nxBlkP+v8rRNn6Mrn7504/83o0JW1K2tX1q5sXdm6snVl68rWx2x9zNaVrStbV7au7F356MEVtIN16GP2rnz04ArZoTrMHUZXHl15dOXRlUdXHj0bo4959DGPPubRlY8eXKFnI3o2omcjunJ05ejK0ZWjK0fPRvYxZx9z9jFnV86e5+zZyJ6N7NnIrpxdubpydeXqytWzUX3M1cdcfczVlavnuXo2Zs/G7NmYXXl25dmVZ1eeXXn2bMw+5rmPOR6PDrtyPLSDdfAOo0P0s7JDdejK0pVFOmgH6+AdurJEh+xQHfZsRPdgaFfWrqxduXswugejezC6B6N7MLQr26NDz0b3YHQPhnVl68rdg9E9GN2D0T0Y3YPRPRjdg+Fd2XueuwejezC6B8O7snfl7sHoHozuwegejO7B6B6M7sEYXXn0PHcPRvdgdA9GdOXoyt2D0T0Y3YPRPRjdg9E9GN2DkV05e567B6N7MLoHI7tyduXuwegejO7B6B6M7sHoHozuwaiuXD3P3YPRPRjdgzG78uzK3YPRPRjdg9E9GN2D0T0Y3YMxd+V8PDpIB+1gHXblfIwO0SE7VIc9G9k9mN2D2T2Y/TqY/TqY3YPZPZjdg9mvg9mvg9k9mN2D2T2Y3YPZPZjdg9k9mNqVtTr0bHQPZvdgWle2rtw9mN2D2T2Y3YPZPZjdg9k9mN6Vvee5ezC7B7N7ML0re1fuHszuwewezO7B7B7M7sHsHszRlUfPc/dgdg9m92BGV46u3D2Y3YPZPZjdg9k9mN2D2T2Y0ZWz57l7MLsHs3swsytnV+4ezO7B7B7M7sHsHszuwewezOrK1fPcPZjdg9k9mNWVqyt3D2b3YHYPZvdgdg9m92B2D+bsyrPnuXuwugere7Aeu3I9rIN3GB2iQ3aoDvuYq3uwpCuLdrAO3mF06Mp9LVrdg9U9WN2D1T1Y3YPVPVjdg6VdWaNDdqgOPRt9LVrWlbsHq3uwugere7C6B6t7sLoHy7qy9zx3D1b3YHUPVl+Llnfl7sHqHqzuweoerO7B6h6s7sEaXXn0PHcPVvdgdQ9WX4vW6Mrdg9U9WN2D1T1Y3YPVPVjdgxVdOXqeuwere7C6B6uvRSu7cvdgdQ9W92B1D1b3YHUPVvdgVVeunufuweoerO7B6mvRqq7cPVjdg9U9WN2D1T1Y3YPVPVizK8+e5+7B6h6s7sHZ16LzIR20g3XwDqNDdMgO1aEry6ODdNAO1qErdw/Ofh2c/To4uwdnX4tO7cr9fnB2D87uwdk9OPt1cJ49OI7wrJzns6rD3OHowRWkg3awDt5hdIgOXdm6snVl78relb0rHz14/ED2PHpwhdEhOmSH6jB3OHpwBemgHbry6MqjK4+uPLry6MpHDx77LObRgytIB+1gHbzD6BAdskN1OH5poxx3qx8d5PgBgyNoB+vgHUaH6JAdqsPc4ejBFbpydeXqytWVqytXVz568Nj/NY8eXGHucPTgCnL+AMGR9Ep2Jb/SuFJcKa9UV5o7HT+9QhSiEo3oxEEMYhKLCE2gCTSBJtAEmkATaAJNoAk0habQFJpCU2gKTaEpNIWm0AyaQTNoBs2gGTSDZtAM2vmLC48fvpHH+asLdxTi+RtD64xGdOIgBjGJRZxXPH/l4Y5ChDagDWgD2oA2oA1oA1pAC2gBLaAFtIAW0AJaQAtoCS2hJbSEltASWkJLaOfvYbVz3c7fxLri+btYdzx/naWcUYlGdOIgBhWSCO38RYzr356/inFHaBPahDahTWgT2oQ2oc1rbOfOn44X7dz909GIThzEICaxiNfYzt1Am3a6ZEclGtGJ0ASaQBNoAk0fRMamjE0Zm0I7XbJjEJNYRGgGzaAZNINmzKQxNmNsxtgMmrFuzkw6M+nMpENzaA7NoTk0ZyadsQ3GNhjbgDZYt8FMDmZyMJMD2oA2oAW0gBbMZDC2YGzB2AJasG7BTAYzmcxkQktoCS2hJbRkJpOxJWNLxoZL1m923pGZLGaymElcIgWtoBU0XCK4RHCJ4BLBJev3Qi/aZN1wieASwSXrN0SfFdbviN5RiEo0ohMHMYhJvGj6uNZNcYniEsUlKtAEGi5RXKK4RHGJ4hLFJYpLVKGpEZ04iEGEptBwieISxSWKSxSXKC5RXLJ+Z/WiWRKZSVyiuEQdmkPDJYpLFJcoLlFcorhEcYkOaIN1wyWKSxSX6IA2oOESxSWKSxSXKC5RXKK4RANasG64RHGJ4hINaAkNlyguUVyiuERxieISxSXKdYlyXaK4RHGJ4hLlukS5LlFcorhEcYniEsUliksUl+iENlk3XKK4RHGJTmgTGi4xXGK4xHCJ4RLDJYZL7HHR7JHEIl4zabjEBJpAwyWGSwyXGC4xXGK4xHDJ+uXoi6ZCVKIRnQhNoeESwyWGSwyXGC4xXGK4ZP1K9kWzQWQmcYnhkvXL2VcFh4ZLDJcYLjFcYrjEcInhkvUr3RfNWTdcYrjEcMn65e6rwoCGSwyXGC4xXGK4xHCJ4RILaMG64RLDJYZLLKAFNFxiuMRwieESwyWGSwyXWEJL1g2XGC4xXGK8xzHe4xguMVxiuMRwieESwyWGS9avm1+0ybrhEsMlhkuM9zg2oeESwyWGSxyXOC5xXOK4xB8XzR+DGMQkFhGaQMMljksclzgucVziuMRxiQs0udbNcYnjEsclznscV2i4xHGJ4xLHJY5LHJc4LnGDZkZkJnGJ4xLnPY4bNFziuMRxieMSxyWOSxyXuENz1g2XOC5xXOK8x/EBDZc4LnFc4rjEcYnjEsclHtCCdcMljksclzjvcTyg4RLHJY5LHJc4LnFc4rjEE1qybrjEcYnjEuc9juMS57rEuS5xXOK8x/GCxucljksclzguca5LfLnEznjS4oxGdOIgBjGJRZwdx3LJikJUohGdOIhBTGIRoQk0gSbQBJpAE2gCTaAJNIGm0BSaQlNoCk2hKTSFtlxSZ5xXXC5Z8aTNMyrRiE4cxKBCEqEtl5z/drlkRWgOzaE5NIfm0ByaQ3PGNhjbgDagDWgD2oC2XLJiEovI2ALacsmKSjSiE6EFtIAW0AJaMpPJ2JKxJWNLaMslKzKTyUwmM5nQClpBK2gFrZjJYmzF2IqxFbRi3SYzOZnJyUxOaBPahDahTWiTmZzX2OLxIArxosXDiE4cxCAmFYoITaAJNFGiEZ04iNAkiUW8ZjL0QYSm0BSaQlNoGkTGpoxNGRsuCRMiM2nMpDGTuCQMmkEzaLgkcEngksAlgUvCoTnrhksClwQuCYc2oOGSwCWBSwKXBC4JXBK4JAa0wbrhksAlgUsioAU0XBK4JHBJ4JLAJYFLApdEQkvWDZcELglcEgktoeGSwCWBSwKXBC4JXBK4JApasW64JHBJ4JKY0CY0XBK4JHBJ4JLAJYFLApfk46LlQ4hKNKITBxWCmMQiQsMliUsSlyQuSYEmgxjEJBYRmkLDJYlLEpckLklckrgkcUlyXZJclyQuSVySuCS5LkmuSxKXJC5JXJK4JHFJ4pLEJenQnHXDJYlLEpekQ3NouCRxSeKSxCWJSxKXJC7JAW2wbrgkcUnikgxoAQ2XJC5JXJK4JHFJ4pLEJZnQknXDJYlLEpdkQktouCRxSeKSxCWJSxKXJC7JglasGy5JXJK4JAvahIZLEpckLklckrgkcUnikpzQ5rVuhUsKlxQuqcdFq4cTBzGISSziNbbCJYVLSqCJEZ04iEGEJtBwSeGSwiWFSwqXFC4pXFIKTZNYRGYSlxTvcYr3OIVLCpcULilcUrikcEnhknJozrrhksIlhUuK9zjl0HBJ4ZLCJYVLCpcULilcUgPaYN1wSeGSwiXFe5wKaLikcEnhksIlhUsKlxQuqYAWrBsuKVxSuKR4j1MJDZcULilcUrikcEnhksIlVdCKdcMlhUsKlxTvcaqg4ZLCJYVLCpcULilcUrikJrTJuuGSwiUTl0ze48yHEo3oxEEMYhKLeI1tCjQRohKN6ERoAg2XTFwyccnEJROXTFwycclUaDqIQUxiEaHhksl1yeS6ZOKSyXucadD4vGTikolLJi6ZXJece1Hl+NJVOXejiq/vODGiEwcxiEks4rzi6ZIdhQhtQBvQBrQBbUAb0Aa0gBbQAlpAC2gBLaAFtIAW0BJaQktoCS2hJbSEltBOlxzfCibnvtYdT5fseNLyjEo0ohMHMaiQRGinS9a/PV2yI7QJbUKb0Ca0CW1Cm9Bmj03Xvtcdm6Zr3+uORnTiIAYxiUWcVxRop0t2VKIRnQhNoAk0gSbQ9EFkbMrYlLEptNMlOwYxiUWEZtAMmkEzaMZMGmMzxmaMzaAZ6+bMpDOTzkw6NIfm0ByaQ3Nm0hnbYGyDsQ1og3UbzORgJgczOaANaANaQAtowUwGYwvGFowtoAXrFsxkMJPJTCa0hJbQElpCS2YyGVsytmRsBa1Yt2Imi5ksZrKgFbSCVtAK2mQmJ2ObjG0ytgltsm6TmZzM5GQm50Vb+153FKISjejEQQxiEi/a2ve6Ii4RXCK4ZO17XRUEGi4RXCK4RHCJ4BLBJYJL1r7XRVMjOnEQgwhNoeESwSWCSwSXCC4RXCK4ZO17XTRLIjOJSwSXrH2vq4JDwyWCSwSXCC4RXCK4RHDJ2ve6aIN1wyWCSwSXrH2vuwI0XCK4RHCJ4BLBJYJLBJesfa+LFqwbLhFcIrhk7XtdFRIaLhFcIrhEcIngEsElgkskoSXrhksElwgukYJW0HCJ4BLBJYJLBJcILhFcsva9Ltpk3XCJ4BLBJWvf664ADZcoLlFcorhEcYniEsUla9/rSVv7Xncs4jWTikvWvtdVQaDhEsUliksUlyguUVyiuGTte100FaISjehEaAoNlyguUVyiuERxieISxSVr3+ui2SAyk7hEccna97oqODRcorhEcYniEsUliksUl6x9r4vmrBsuUVyiuGTte10VBjRcorhEcYniEsUliksUl6x9r4sWrBsuUVyiuGTte90VoOESxSWKSxSXKC5RXKK4ZO17XbRk3XCJ4hLFJVrQChouUVyiuERxieISxSWKS9a+10WbrBsuUVyiuEQntAkNlyguUVxiuMRwieESwyVr3+tJW/tedwxiEosITaDhEsMlhksMlxguMVxiuGTte100udbNcInhEsMlxnucte91R2i4xHCJ4RLDJYZLDJesfa+LZkZkJnGJ4RLjPc7a97ojNFxiuMRwieESwyWGS9a+10Vz1g2XGC4xXGK8x1n7XneEhksMlxguMVxiuMRwydr3umjBuuESwyWGS4z3OGvf647QcInhEsMlhksMlxguWfteFy1ZN1xiuMRwifEex3CJcV1iXJcYLjHe46x9rztCwyWGSwyXGNcla9/r8VtqdO17Pb+/fe173dGJgxjEJBZxdlz7XncUohKN6MRBDGISiwhNoAk0gSbQBJpAE2gCTaAJNIWm0BSaQlNoCk2hKbTTJet7gk+XrHi6ZMeTNs6oRCM6cRCDCkmEdrpk/dvTJTtCc2gOzaE5NIfm0ByaM7bB2Aa0AW1AG9AGtNMlOyaxiIwtoJ0u2VGJRnQitIAW0AJaQEtmMhlbMrZkbAntdMmOzGQyk8lMJrSCVtAKWkErZrIYWzG2YmwFrVi3yUxOZnIykxPahDahTWgT2mQm5zW2te91RyFetLXvdUcnDmIQkwpFhCbQBJoo0YhOHERoksQiXjO59r3uCE2hKTSFptA0iIxNGZsyNlyy9r3uyEwaM2nMJC5Z+153hGbQcMnAJQOXDFwycMna97q/pZx1wyUDlwxcsva9rgoDGi4ZuGTgkoFLBi4ZuGTgkrXvddEG64ZLBi4ZuGTte10VAhouGbhk4JKBSwYuGbhk4JK173XRknXDJQOXDFyy9r3uCtBwycAlA5cMXDJwycAlA5esfa+LVqwbLhm4ZOCSte91VZjQcMnAJQOXDFwycMnAJQOXrH2vJ23te91RiUZ04qBCEJNYRGi4JHBJ4JLAJWvf66LJIAYxiUWEptBwSeCSwCWBSwKXBC4JXBJclwTXJYFLApcELgmuS4LrksAlgUsClwQuCVwSuCRwydr3umjOuuGSwCWBS9a+110BGi4JXBK4JHBJ4JLAJYFL1r7XRRusGy4JXBK4ZO17XRUCGi4JXBK4JHBJ4JLAJYFL1r7XRUvWDZcELglcsva97grQcEngksAlgUsClwQuCVyy9r0uWrFuuCRwSeCSte91VZjQcEngksAlgUsClwQuCVyy9r0u2rzWLXFJ4pLEJWvf61lh7XvdcRCDmMQiXmNLXJK4ZO17XTQxohMHMYjQBBouSVySuCRxSeKSxCWJS9a+10XTJBaRmcQlyXuc5D1O4pLEJYlLEpckLklckrhk7XtdNGfdcEniksQlyXucte91R2i4JHFJ4pLEJYlLEpesfa+LNlg3XJK4JHFJ8h5n7XvdERouSVySuCRxSeKSxCVr3+uiBeuGSxKXJC5J3uOsfa87QsMliUsSlyQuSVySuGTte120Yt1wSeKSxCXJe5y173VHaLgkcUniksQliUsSl6x9r4s2WTdckrikcEnxHmfte93RiE4cxCAmsYjX2Na+10UTISrRiE6EJtBwSeGSwiWFSwqXFC4pXLL2vS6aDmIQk1hEaLikuC4prksKlxTvcda+1x2h4ZLCJYVLiuuSte/1+I0Muva9Hr9YQNe+1x2dOIhBTGIR5xVPl+woRGgD2oA2oA1oA9qANqAFtIAW0AJaQAtoAS2gBbSAltASWkJLaAktoSW0hHa65PgOTl37Xlc8XbLjSbMzKtGIThzEoEISoZ0uWf/2dMmO0Ca0CW1Cm9AmtAltQpvX2Na+1x0v2tr3uqMRnTiIQUxiEa+xrX2vi3a6ZEclGtGJ0ASaQBNoAk0fRMamjE0Zm0I7XbJjEJNYRGgGzaAZNINmzKQxNmNsxtgMmrFuzkw6M+nMpENzaA7NoTk0ZyadsQ3GNhjbgDZYt8FMDmZyMJMD2oA2oAW0gBbMZDC2YGzB2AJasG7BTAYzmcxkQktoCS2hJbRkJpOxJWNLxoZL1r7XHZnJYiaLmcQla9/rjtAKGi6ZuGTikolLJi5Z+14XbbJuuGTikolL1r7Xo4Ktfa87ClGJRnTiIAYxiU2zte91xcsl9rhcYo/LJbb2va4KAk2gCTSBdrnEHsLYlLEpY1NoakQnDmIQoSk0hWbQDJoxk8bYjLEZYzNolkRm0phJZyYdmkNzaA7NoTkz6YzNGZsztgFtsG6DmRzM5GAmB7QBbUAb0Aa0YCaDsQVjC8YW0IJ1C2YymMlgJgNaQktoCS2hJTOZjC0ZWzK2hJasWzGTxUwWM1nQClpBK2gFrZjJYmyTsU3GNqFN1m0yk5OZnMzkhDah4RLBJYJLBJcILhFcIrhk7Xs9aWvf645FvGZScMna97oqCDRcIrhEcIngEsElgksEl6x9r4umQlSiEZ0ITaHhEsElgksElwguEVwiuGTte100G0RmEpcILln7XlcFh4ZLBJcILhFcIrhEcIngkrXvddGcdcMlgksEl6x9r6vCgIZLBJcILhFcIrhEcIngkrXvddGCdcMlgksEl6x9r7sCNFwiuERwieASwSWCSwSXrH2vi5asGy4RXCK4RApaQcMlgksElwguEVwiuERwydr3umiTdcMlgksEl8iENqHhEsElgksUlyguUVyiuGTtez1pa9/rjkFMYhGhCTRcorhEcYniEsUliksUl6x9r4sm17opLlFcorhEFZpCwyWKSxSXKC5RXKK4RHHJ2ve6aGZEZhKXKC5Rg2bQcIniEsUliksUlyguUVyy9r0umrNuuERxieISHdAGNFyiuERxieISxSWKSxSXrH2vixasGy5RXKK4RANaQMMliksUlyguUVyiuERxydr3umjJuuESxSWKSzSh4RLlukS5LlFcogWtoBU0XKK4RHGJcl2y9r0evxXF1r7XqDMa0YmDGMQkFnF2XPtedxSiEo3oxEEMYhKLCE2gCTSBJtAEmkATaAJNoAk0habQFJpCU2gKTaEptNMl+TjjvOLpkh0PWsoZlWhEJw5iUCGJ0E6XrH97umRHaA7NoTk0h+bQHJpDc8Y2GNuANqANaAPagHa6ZMckFpGxBbTTJTsq0YhOhBbQAlpAC2jJTCZjS8aWjC2hnS7ZkZlMZjKZyYRW0ApaQStoxUwWYyvGVoytoBXrNpnJyUxOZnJCm9AmtAltQpvM5LzGtva97ijEi7b2ve7oxEEMYlKhiNAEmkATJRrRiYMITZJYxGsm177XHaEpNIWm0BSaBpGxKWNTxoZL1r7XHZlJYyaNmcQla9/rjtAMGi5xXOK4xHGJ45K173XRnHXDJY5LHJesfa+rwoCGSxyXOC5xXOK4xHGJ45K173XRBuuGSxyXOC5Z+15XhYCGSxyXOC5xXOK4xHGJ45K173XRknXDJY5LHJesfa+7AjRc4rjEcYnjEscljkscl6x9r4tWrBsucVziuGTte10VJjRc4rjEcYnjEscljkscl6x9rydt7XvdUYlGdOKgQhCTWERouGTgkoFLBi5Z+14XTQYxiEksIjSFhksGLhm4ZOCSgUsGLhm4ZHBdMrguGbhk4JKBSwbXJYPrkoFLBi4ZuGTgkoFLBi4ZuGTte100Z91wycAlA5esfa+7AjRcMnDJwCUDlwxcMnDJwCVr3+uiDdYNlwxcMnDJ2ve6KgQ0XDJwycAlA5cMXDJwycAla9/roiXrhksGLhm4ZO173RWg4ZKBSwYuGbhk4JKBSwYuWfteF61YN1wycMnAJWvf66owoeGSgUsGLhm4ZOCSgUsGLln7XhdtXusWuCRwSeCSte/1rLD2ve44iEFMYhGvsQUuCVyy9r0umhjRiYMYRGgCDZcELglcErgkcEngksAla9/romkSi8hM4pLgPU7wHidwSeCSwCWBSwKXBC4JXLL2vS6as264JHBJ4JLgPc7a97ojNFwSuCRwSeCSwCWBS9a+10UbrBsuCVwSuCR4j7P2ve4IDZcELglcErgkcEngkrXvddGCdcMlgUsClwTvcda+1x2h4ZLAJYFLApcELglcsva9LlqxbrgkcEngkuA9ztr3uiM0XBK4JHBJ4JLAJYFL1r7XRZusGy4JXJK4JHmPs/a97mhEJw5iEJNYxGtsa9/rookQlWhEJ0ITaLgkcUniksQliUsSlyQuWfteF00HMYhJLCI0XJJclyTXJYlLkvc4a9/rjtBwSeKSxCXJdcna95p2xoNWZ4XTJTs6cRCDmMQiziueLtnxoJWeUYlGdOIgBjGJRZxXPF2yI7SAFtACWkALaKdLjt+2a2vf646MLRnb6ZIdmclkJpOZTGYymclkJpOZTGgFraAVtIJW0ApaMbZiJouZLGZyMpOTmZzM5GQmJzM5mckJbUKb0OZFW/tedxSi9qyvfa/nKNa+1x0HMYhJLOI1k2vf645CVCI0gSbQBJpAE2gCTRmbMjZVohGdOIhBTGIRmUmDZtAMmkEzaAbtdMma9dMlNc9YxHnF0yU7ClGJRnTiIB6049dV29r3umMR5xVPl+woRCUa0YmDCG1AG9AGtIAW0A6XPO8qntGIfsQ64yAGMYlFnFc8XNJRiEo0IrSEltASWkJLaAWtoBW0glbQClpBK2gFraBNaBPahDahTWgT2oQ2oU1o86Kd+147ClGJRnTiIAYxiUWEJtAE2uGS563aMx40jTM6cRCDmMQiziseLukoRCVCU2gKTaEpNIWm0AyaQTNoBs2gGTSDZtAMmkFzaA7NoTk0h+bQHJpDc2gObUA7XPK8kX1GJRrRiYMYxCQWcV7xcElHaAEtoAW0gBbQAlpAC2gJLaEltISW0BJaQktoCS2hFbSCVtAKWkEraAWtoBW0gjahTWgT2oQ2oU1oE9qENqHNpvm577WjEJVoRCcOYhCTWERoAk2gCTSBJtAEmkATaAJNoCk0habQFJpCU2gKTaEpNIVm0AyaQTNoBs2gGTSDZtAMmkNzaA7NoTk0h+bQHJpDc2gD2oA2oA1oA9qANqANaAPagBbQAlpAC2gBLaAFtIAW0AJaQktoCS2hJbSEltASWkJLaAWtoBW0glbQClpBK2gFraBNaBPahDahTWgT2oQ2oU1ouERwieASwSWCSwSXCC4RXCK4RHCJ4BLBJYJLBJcILhFcIrhEcIngEsElgksElwguEVwiuERwieASwSWCSwSXCC4RXCK4RHCJ4BLBJYJLBJcILhFcIrhEcIngEsElgksElwguEVwiuERwieASwSWyXJJnPGi+/q8RnTiIB208znjQjm+V8nPfa8eDFmc8XbKjEJV40CLO6MSDFvOMBy3Xv03iQUs/40HL82mnS3Y8aFlnVOJBq8cv337zf9/9/MN3//nj9//7zZ/+9fzjf//zp7/+44e//bT/+I//9/f+m//8+Ycff/zhf/7y95//9tfv/+ufP3//lx//9tfj7755HP852uA/JL5V+fPzH8v+//+hI799Hsmfny/3x98/xrfPM//5p/Ofq81v1f34oxx/9Pr2OZ/H87Wf/zxBvnXT/XwNeVaTfv7zyu/b5+t6P//5UvH8YxzPt+P5xzPseHr/e3/+/Tz+2n97xKOfoeNbu47QH9/6OP46rmfo8xBORlLkOUb98y+//PLnX/4/",
|
|
3872
|
+
"verification_key": "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"
|
|
3873
3873
|
},
|
|
3874
3874
|
{
|
|
3875
3875
|
"name": "public_dispatch",
|
|
@@ -3940,8 +3940,8 @@
|
|
|
3940
3940
|
}
|
|
3941
3941
|
}
|
|
3942
3942
|
},
|
|
3943
|
-
"bytecode": "JwACBAEoAAABBIBOJwAABE4lAAAAQScCAgQBJwIDBAAfCgACAAMATS0ITQElAAAAoCcCAQROJwICBAA7DgACAAEpAABDAOfwRf8pAABEAPAkOdspAABFAP95SfIsAABGADBkTnLhMaApuFBFtoGBWF0oM+
|
|
3944
|
-
"debug_symbols": "
|
|
3943
|
+
"bytecode": "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",
|
|
3944
|
+
"debug_symbols": "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"
|
|
3945
3945
|
}
|
|
3946
3946
|
],
|
|
3947
3947
|
"outputs": {
|
|
@@ -4202,63 +4202,63 @@
|
|
|
4202
4202
|
"path": "std/hash/mod.nr",
|
|
4203
4203
|
"source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3<let N: u32>(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<let N: u32>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator<let N: u32>(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash<let N: u32>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n crate::assert_constant(separator);\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars, true)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n crate::assert_constant(starting_index);\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Decompose the input 'bn254 scalar' into two 128 bits limbs.\n// It is called 'unsafe' because it does not assert the limbs are 128 bits\n// Assuming the limbs are 128 bits:\n// Assert the decomposition does not overflow the field size.\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n // Check that the decomposition does not overflow the field size\n let (a, b) = if xhi == crate::field::bn254::PHI {\n (xlo, crate::field::bn254::PLO)\n } else {\n (xhi, crate::field::bn254::PHI)\n };\n crate::field::bn254::assert_lt(a, b);\n\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn poseidon2_permutation<let N: u32>(input: [Field; N], state_len: u32) -> [Field; N] {\n assert_eq(input.len(), state_len);\n poseidon2_permutation_internal(input)\n}\n\n#[foreign(poseidon2_permutation)]\nfn poseidon2_permutation_internal<let N: u32>(input: [Field; N]) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash<H>(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n type H = H;\n\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl<H> Default for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u8 as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u16 as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u32 as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u64 as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash<H>(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl<T, let N: u32> Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<T> Hash for [T]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<A, B> Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl<A, B, C> Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl<A, B, C, D> Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl<A, B, C, D, E> Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n"
|
|
4204
4204
|
},
|
|
4205
|
-
"
|
|
4205
|
+
"234": {
|
|
4206
4206
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/oracle/version.nr",
|
|
4207
4207
|
"source": "/// The ORACLE_VERSION constant is used to check that the oracle interface is in sync between PXE and Aztec.nr. We need\n/// to version the oracle interface to ensure that developers get a reasonable error message if they use incompatible\n/// versions of Aztec.nr and PXE. The TypeScript counterpart is in `oracle_version.ts`.\n///\n/// @dev Whenever a contract function or Noir test is run, the `utilityAssertCompatibleOracleVersion` oracle is called\n/// and if the oracle version is incompatible an error is thrown.\npub global ORACLE_VERSION: Field = 12;\n\n/// Asserts that the version of the oracle is compatible with the version expected by the contract.\npub fn assert_compatible_oracle_version() {\n // Safety: This oracle call returns nothing: we only call it to check Aztec.nr and Oracle interface versions are\n // compatible. It is therefore always safe to call.\n unsafe {\n assert_compatible_oracle_version_wrapper();\n }\n}\n\nunconstrained fn assert_compatible_oracle_version_wrapper() {\n assert_compatible_oracle_version_oracle(ORACLE_VERSION);\n}\n\n#[oracle(utilityAssertCompatibleOracleVersion)]\nunconstrained fn assert_compatible_oracle_version_oracle(version: Field) {}\n\nmod test {\n use super::{assert_compatible_oracle_version_oracle, ORACLE_VERSION};\n\n #[test]\n unconstrained fn compatible_oracle_version() {\n assert_compatible_oracle_version_oracle(ORACLE_VERSION);\n }\n\n #[test(should_fail_with = \"Incompatible oracle version. TXE is using version\")]\n unconstrained fn incompatible_oracle_version() {\n let arbitrary_incorrect_version = 318183437;\n assert_compatible_oracle_version_oracle(arbitrary_incorrect_version);\n }\n}\n"
|
|
4208
4208
|
},
|
|
4209
|
-
"299": {
|
|
4210
|
-
"path": "/home/aztec-dev/nargo/github.com/noir-lang/poseidon/v0.2.3/src/poseidon2.nr",
|
|
4211
|
-
"source": "use std::default::Default;\nuse std::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n Poseidon2::hash_internal(input, message_size)\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n self.state[0] += self.cache[0];\n self.state[1] += self.cache[1];\n self.state[2] += self.cache[2];\n self.state = crate::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut state = [0; 4];\n state[RATE] = iv;\n\n if std::runtime::is_unconstrained() {\n for i in 0..(in_len / RATE) {\n state[0] += input[i * RATE];\n state[1] += input[i * RATE + 1];\n state[2] += input[i * RATE + 2];\n state = crate::poseidon2_permutation(state, 4);\n }\n\n // handle remaining elements after last full RATE-sized chunk\n let num_extra_fields = in_len % RATE;\n if num_extra_fields != 0 {\n let remainder_start = in_len - num_extra_fields;\n state[0] += input[remainder_start];\n if num_extra_fields > 1 {\n state[1] += input[remainder_start + 1]\n }\n }\n } else {\n let mut states: [[Field; 4]; N / RATE + 1] = [[0; 4]; N / RATE + 1];\n states[0] = state;\n\n // process all full RATE-sized chunks, storing state after each permutation\n for chunk_idx in 0..(N / RATE) {\n for i in 0..RATE {\n state[i] += input[chunk_idx * RATE + i];\n }\n state = crate::poseidon2_permutation(state, 4);\n states[chunk_idx + 1] = state;\n }\n\n // get state at the last full block before in_len\n let first_partially_filled_chunk = in_len / RATE;\n state = states[first_partially_filled_chunk];\n\n // handle remaining elements after last full RATE-sized chunk\n let remainder_start = (in_len / RATE) * RATE;\n for j in 0..RATE {\n let idx = remainder_start + j;\n if idx < in_len {\n state[j] += input[idx];\n }\n }\n }\n\n // always run final permutation unless we just completed a full chunk\n // still need to permute once if in_len is 0\n if (in_len == 0) | (in_len % RATE != 0) {\n state = crate::poseidon2_permutation(state, 4)\n };\n\n state[0]\n }\n}\n\npub struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n"
|
|
4212
|
-
},
|
|
4213
4209
|
"3": {
|
|
4214
4210
|
"path": "std/array/mod.nr",
|
|
4215
4211
|
"source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl<T, let N: u32> [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a vector.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let vector = array.as_vector();\n /// assert_eq(vector, [1, 2].as_vector());\n /// ```\n #[builtin(as_vector)]\n pub fn as_vector(self) -> [T] {}\n\n /// Returns this array as a vector.\n /// This method is deprecated in favor of `as_vector`.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let vector = array.as_slice();\n /// assert_eq(vector, [1, 2].as_vector());\n /// ```\n #[builtin(as_vector)]\n #[deprecated(\"This method has been renamed to `as_vector`\")]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi<U, Env>(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each<Env>(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi<Env>(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold<U, Env>(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce<Env>(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat<let M: u32>(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the [`Self::sort_via`] function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via<Env>(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl<let N: u32> [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str<N> {}\n}\n\nimpl<let N: u32> From<str<N>> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str<N>) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let mut arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let mut arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n"
|
|
4216
4212
|
},
|
|
4217
|
-
"
|
|
4218
|
-
"path": "/home/aztec-dev/
|
|
4219
|
-
"source": "mod poseidon2_chunks;\n\nuse crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, nullifier::Nullifier, private_log::PrivateLog,\n transaction::tx_request::TxRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, DOM_SEP__NOTE_HASH_NONCE,\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD, DOM_SEP__SILOED_NOTE_HASH, DOM_SEP__SILOED_NULLIFIER,\n DOM_SEP__UNIQUE_NOTE_HASH, FUNCTION_TREE_HEIGHT, NULL_MSG_SENDER_CONTRACT_ADDRESS,\n TWO_POW_64,\n },\n merkle_tree::root_from_sibling_path,\n messaging::l2_to_l1_message::L2ToL1Message,\n poseidon2::Poseidon2Sponge,\n side_effect::{Counted, Scoped},\n traits::{FromField, Hash, ToField},\n utils::field::{field_from_bytes, field_from_bytes_32_trunc},\n};\n\npub use poseidon2_chunks::poseidon2_absorb_in_chunks_existing_sponge;\nuse poseidon2_chunks::poseidon2_absorb_in_chunks;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\n// TODO: refactor these into their own files: sha256, poseidon2, some protocol-specific hash computations, some merkle computations.\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256::digest(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn compute_siloed_note_hash(contract_address: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), note_hash],\n DOM_SEP__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique, siloed note hashes from siloed note hashes.\n///\n/// The protocol injects uniqueness into every note_hash, so that every single note_hash in the\n/// tree is unique. This prevents faerie gold attacks, where a malicious sender could create\n/// two identical note_hashes for a recipient (meaning only one would be nullifiable in future).\n///\n/// Most privacy protocols will inject the note's leaf_index (its position in the Note Hashes Tree)\n/// into the note, but this requires the creator of a note to wait until their tx is included in\n/// a block to know the note's final note hash (the unique, siloed note hash), because inserting\n/// leaves into trees is the job of a block producer.\n///\n/// We took a different approach so that the creator of a note will know each note's unique, siloed\n/// note hash before broadcasting their tx to the network.\n/// (There was also a historical requirement relating to \"chained transactions\" -- a feature that\n/// Aztec Connect had to enable notes to be spent from distinct txs earlier in the same block,\n/// and hence before an archive block root had been established for that block -- but that feature\n/// was abandoned for the Aztec Network for having too many bad tradeoffs).\n///\n/// (\n/// Edit: it is no longer true that all final note_hashes will be known by the creator of a tx\n/// before they send it to the network. If a tx makes public function calls, then _revertible_\n/// note_hashes that are created in private will not be made unique in private by the Reset circuit,\n/// but will instead be made unique by the AVM, because the `note_index_in_tx` will not be known\n/// until the AVM has executed the public functions of the tx. (See an explanation in\n/// reset_output_composer.nr for why).\n/// For some such txs, the `note_index_in_tx` might still be predictable through simulation, but\n/// for txs whose public functions create a varying number of non-revertible notes (determined at\n/// runtime), the `note_index_in_tx` will not be deterministically derivable before submitting the\n/// tx to the network.\n/// )\n///\n/// We use the `first_nullifier` of a tx as a seed of uniqueness. We have a guarantee that there will\n/// always be at least one nullifier per tx, because the init circuit will create one if one isn't\n/// created naturally by any functions of the tx. (Search \"protocol_nullifier\").\n/// We combine the `first_nullifier` with the note's index (its position within this tx's new\n/// note_hashes array) (`note_index_in_tx`) to get a truly unique value to inject into a note, which\n/// we call a `note_nonce`.\npub fn compute_unique_note_hash(note_nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [note_nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, DOM_SEP__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_note_hash_nonce(first_nullifier_in_tx: Field, note_index_in_tx: u32) -> Field {\n // Hashing the first nullifier with note index in tx is guaranteed to be unique (because all nullifiers are also\n // unique).\n poseidon2_hash_with_separator(\n [first_nullifier_in_tx, note_index_in_tx as Field],\n DOM_SEP__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_note_nonce_and_unique_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n let note_nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(note_nonce, siloed_note_hash)\n}\n\npub fn compute_siloed_nullifier(contract_address: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), nullifier],\n DOM_SEP__SILOED_NULLIFIER,\n )\n}\n\npub fn create_protocol_nullifier(tx_request: TxRequest) -> Scoped<Counted<Nullifier>> {\n // The protocol nullifier is ascribed a special side-effect counter of 1. No other side-effect\n // can have counter 1 (see `validate_as_first_call` for that assertion).\n Nullifier { value: tx_request.hash(), note_hash: 0 }.count(1).scope(\n NULL_MSG_SENDER_CONTRACT_ADDRESS,\n )\n}\n\npub fn compute_siloed_private_log_first_field(\n contract_address: AztecAddress,\n field: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), field],\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD,\n )\n}\n\npub fn compute_siloed_private_log(contract_address: AztecAddress, log: PrivateLog) -> PrivateLog {\n let mut fields = log.fields;\n fields[0] = compute_siloed_private_log_first_field(contract_address, fields[0]);\n PrivateLog::new(fields, log.length)\n}\n\npub fn compute_contract_class_log_hash(log: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS]) -> Field {\n poseidon2_hash(log)\n}\n\npub fn compute_app_siloed_secret_key(\n master_secret_key: EmbeddedCurveScalar,\n app_address: AztecAddress,\n app_secret_key_domain_separator: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [master_secret_key.hi, master_secret_key.lo, app_address.to_field()],\n app_secret_key_domain_separator,\n )\n}\n\npub fn compute_l2_to_l1_message_hash(\n message: Scoped<L2ToL1Message>,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let contract_address_bytes: [u8; 32] = message.contract_address.to_field().to_be_bytes();\n let recipient_bytes: [u8; 20] = message.inner.recipient.to_be_bytes();\n let content_bytes: [u8; 32] = message.inner.content.to_be_bytes();\n let rollup_version_id_bytes: [u8; 32] = rollup_version_id.to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n\n let mut bytes: [u8; 148] = std::mem::zeroed();\n for i in 0..32 {\n bytes[i] = contract_address_bytes[i];\n bytes[i + 32] = rollup_version_id_bytes[i];\n // 64 - 84 are for recipient.\n bytes[i + 84] = chain_id_bytes[i];\n bytes[i + 116] = content_bytes[i];\n }\n\n for i in 0..20 {\n bytes[64 + i] = recipient_bytes[i];\n }\n\n sha256_to_field(bytes)\n}\n\n// TODO: consider a variant that enables domain separation with a u32 (we seem to have standardised u32s for domain separators)\n/// Computes sha256 hash of 2 input fields.\n///\n/// @returns A truncated field (i.e., the first byte is always 0).\npub fn accumulate_sha256(v0: Field, v1: Field) -> Field {\n // Concatenate two fields into 32 x 2 = 64 bytes\n let v0_as_bytes: [u8; 32] = v0.to_be_bytes();\n let v1_as_bytes: [u8; 32] = v1.to_be_bytes();\n let hash_input_flattened = v0_as_bytes.concat(v1_as_bytes);\n\n sha256_to_field(hash_input_flattened)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n poseidon::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n let inputs_with_separator = [separator.to_field()].concat(inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n/// Computes a Poseidon2 hash over a dynamic-length subarray of the given input.\n/// Only the first `in_len` fields of `input` are absorbed; any remaining fields are ignored.\n/// The caller is responsible for ensuring that the input is padded with zeros if required.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_in_chunks(input, in_len);\n sponge.squeeze()\n}\n\n// This function is unconstrained because it is intended to be used in unconstrained context only as\n// in constrained contexts it would be too inefficient.\npub unconstrained fn poseidon2_hash_with_separator_bounded_vec<let N: u32, T>(\n inputs: BoundedVec<Field, N>,\n separator: T,\n) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs.get(i));\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n let mut fields = [0; (N + 30) / 31];\n let mut field_index = 0;\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n fields[field_index] = field_from_bytes(current_field, false);\n current_field = [0; 31];\n field_index += 1;\n }\n }\n if field_index != fields.len() {\n fields[field_index] = field_from_bytes(current_field, false);\n }\n poseidon2_hash(fields)\n}\n\n#[test]\nfn subarray_hash_matches_fixed() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash the entire values_to_hash.\n let fixed_len_hash = poseidon::poseidon2::Poseidon2::hash(values_to_hash, values_to_hash.len());\n\n assert_eq(subarray_hash, fixed_len_hash);\n}\n\n#[test]\nfn subarray_hash_matches_variable() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash up to values_to_hash.len() fields of the padded array.\n let variable_len_hash = poseidon::poseidon2::Poseidon2::hash(padded, values_to_hash.len());\n\n assert_eq(subarray_hash, variable_len_hash);\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256::digest(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn unique_siloed_note_hash_matches_typescript() {\n let inner_note_hash = 1;\n let contract_address = AztecAddress::from_field(2);\n let first_nullifier = 3;\n let note_index_in_tx = 4;\n\n let siloed_note_hash = compute_siloed_note_hash(contract_address, inner_note_hash);\n let siloed_note_hash_from_ts =\n 0x1986a4bea3eddb1fff917d629a13e10f63f514f401bdd61838c6b475db949169;\n assert_eq(siloed_note_hash, siloed_note_hash_from_ts);\n\n let nonce: Field = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n let note_hash_nonce_from_ts =\n 0x28e7799791bf066a57bb51fdd0fbcaf3f0926414314c7db515ea343f44f5d58b;\n assert_eq(nonce, note_hash_nonce_from_ts);\n\n let unique_siloed_note_hash_from_nonce = compute_unique_note_hash(nonce, siloed_note_hash);\n let unique_siloed_note_hash = compute_note_nonce_and_unique_note_hash(\n siloed_note_hash,\n first_nullifier,\n note_index_in_tx,\n );\n assert_eq(unique_siloed_note_hash_from_nonce, unique_siloed_note_hash);\n\n let unique_siloed_note_hash_from_ts =\n 0x29949aef207b715303b24639737c17fbfeb375c1d965ecfa85c7e4f0febb7d16;\n assert_eq(unique_siloed_note_hash, unique_siloed_note_hash_from_ts);\n}\n\n#[test]\nfn siloed_nullifier_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let nullifier = 456;\n\n let res = compute_siloed_nullifier(contract_address, nullifier);\n\n let siloed_nullifier_from_ts =\n 0x169b50336c1f29afdb8a03d955a81e485f5ac7d5f0b8065673d1e407e5877813;\n\n assert_eq(res, siloed_nullifier_from_ts);\n}\n\n#[test]\nfn siloed_private_log_first_field_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let field = 456;\n let res = compute_siloed_private_log_first_field(contract_address, field);\n\n let siloed_private_log_first_field_from_ts =\n 0x29480984f7b9257fded523d50addbcfc8d1d33adcf2db73ef3390a8fd5cdffaa;\n\n assert_eq(res, siloed_private_log_first_field_from_ts);\n}\n\n#[test]\nfn empty_l2_to_l1_message_hash_matches_typescript() {\n // All zeroes\n let res = compute_l2_to_l1_message_hash(\n L2ToL1Message { recipient: EthAddress::zero(), content: 0 }.scope(AztecAddress::from_field(\n 0,\n )),\n 0,\n 0,\n );\n\n let empty_l2_to_l1_msg_hash_from_ts =\n 0x003b18c58c739716e76429634a61375c45b3b5cd470c22ab6d3e14cee23dd992;\n\n assert_eq(res, empty_l2_to_l1_msg_hash_from_ts);\n}\n\n#[test]\nfn l2_to_l1_message_hash_matches_typescript() {\n let message = L2ToL1Message { recipient: EthAddress::from_field(1), content: 2 }.scope(\n AztecAddress::from_field(3),\n );\n let version = 4;\n let chainId = 5;\n\n let hash = compute_l2_to_l1_message_hash(message, version, chainId);\n\n // The following value was generated by `yarn-project/stdlib/src/hash/hash.test.ts`\n let l2_to_l1_message_hash_from_ts =\n 0x0081edf209e087ad31b3fd24263698723d57190bd1d6e9fe056fc0c0a68ee661;\n\n assert_eq(hash, l2_to_l1_message_hash_from_ts);\n}\n\n#[test]\nunconstrained fn poseidon2_hash_with_separator_bounded_vec_matches_non_bounded_vec_version() {\n let inputs = BoundedVec::<Field, 4>::from_array([1, 2, 3]);\n let separator = 42;\n\n // Hash using bounded vec version\n let bounded_result = poseidon2_hash_with_separator_bounded_vec(inputs, separator);\n\n // Hash using regular version\n let regular_result = poseidon2_hash_with_separator([1, 2, 3], separator);\n\n // Results should match\n assert_eq(bounded_result, regular_result);\n}\n"
|
|
4213
|
+
"302": {
|
|
4214
|
+
"path": "/home/aztec-dev/nargo/github.com/noir-lang/poseidon/v0.2.3/src/poseidon2.nr",
|
|
4215
|
+
"source": "use std::default::Default;\nuse std::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n Poseidon2::hash_internal(input, message_size)\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n self.state[0] += self.cache[0];\n self.state[1] += self.cache[1];\n self.state[2] += self.cache[2];\n self.state = crate::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut state = [0; 4];\n state[RATE] = iv;\n\n if std::runtime::is_unconstrained() {\n for i in 0..(in_len / RATE) {\n state[0] += input[i * RATE];\n state[1] += input[i * RATE + 1];\n state[2] += input[i * RATE + 2];\n state = crate::poseidon2_permutation(state, 4);\n }\n\n // handle remaining elements after last full RATE-sized chunk\n let num_extra_fields = in_len % RATE;\n if num_extra_fields != 0 {\n let remainder_start = in_len - num_extra_fields;\n state[0] += input[remainder_start];\n if num_extra_fields > 1 {\n state[1] += input[remainder_start + 1]\n }\n }\n } else {\n let mut states: [[Field; 4]; N / RATE + 1] = [[0; 4]; N / RATE + 1];\n states[0] = state;\n\n // process all full RATE-sized chunks, storing state after each permutation\n for chunk_idx in 0..(N / RATE) {\n for i in 0..RATE {\n state[i] += input[chunk_idx * RATE + i];\n }\n state = crate::poseidon2_permutation(state, 4);\n states[chunk_idx + 1] = state;\n }\n\n // get state at the last full block before in_len\n let first_partially_filled_chunk = in_len / RATE;\n state = states[first_partially_filled_chunk];\n\n // handle remaining elements after last full RATE-sized chunk\n let remainder_start = (in_len / RATE) * RATE;\n for j in 0..RATE {\n let idx = remainder_start + j;\n if idx < in_len {\n state[j] += input[idx];\n }\n }\n }\n\n // always run final permutation unless we just completed a full chunk\n // still need to permute once if in_len is 0\n if (in_len == 0) | (in_len % RATE != 0) {\n state = crate::poseidon2_permutation(state, 4)\n };\n\n state[0]\n }\n}\n\npub struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n"
|
|
4220
4216
|
},
|
|
4221
4217
|
"39": {
|
|
4222
4218
|
"path": "std/ops/arith.nr",
|
|
4223
4219
|
"source": "use crate::convert::AsPrimitive;\n\n// docs:start:add-trait\npub trait Add {\n fn add(self, other: Self) -> Self;\n}\n// docs:end:add-trait\n\nimpl Add for Field {\n fn add(self, other: Field) -> Field {\n self + other\n }\n}\n\nimpl Add for u128 {\n fn add(self, other: u128) -> u128 {\n self + other\n }\n}\nimpl Add for u64 {\n fn add(self, other: u64) -> u64 {\n self + other\n }\n}\nimpl Add for u32 {\n fn add(self, other: u32) -> u32 {\n self + other\n }\n}\nimpl Add for u16 {\n fn add(self, other: u16) -> u16 {\n self + other\n }\n}\nimpl Add for u8 {\n fn add(self, other: u8) -> u8 {\n self + other\n }\n}\nimpl Add for u1 {\n fn add(self, other: u1) -> u1 {\n self + other\n }\n}\n\nimpl Add for i8 {\n fn add(self, other: i8) -> i8 {\n self + other\n }\n}\nimpl Add for i16 {\n fn add(self, other: i16) -> i16 {\n self + other\n }\n}\nimpl Add for i32 {\n fn add(self, other: i32) -> i32 {\n self + other\n }\n}\nimpl Add for i64 {\n fn add(self, other: i64) -> i64 {\n self + other\n }\n}\n\n// docs:start:sub-trait\npub trait Sub {\n fn sub(self, other: Self) -> Self;\n}\n// docs:end:sub-trait\n\nimpl Sub for Field {\n fn sub(self, other: Field) -> Field {\n self - other\n }\n}\n\nimpl Sub for u128 {\n fn sub(self, other: u128) -> u128 {\n self - other\n }\n}\nimpl Sub for u64 {\n fn sub(self, other: u64) -> u64 {\n self - other\n }\n}\nimpl Sub for u32 {\n fn sub(self, other: u32) -> u32 {\n self - other\n }\n}\nimpl Sub for u16 {\n fn sub(self, other: u16) -> u16 {\n self - other\n }\n}\nimpl Sub for u8 {\n fn sub(self, other: u8) -> u8 {\n self - other\n }\n}\nimpl Sub for u1 {\n fn sub(self, other: u1) -> u1 {\n self - other\n }\n}\n\nimpl Sub for i8 {\n fn sub(self, other: i8) -> i8 {\n self - other\n }\n}\nimpl Sub for i16 {\n fn sub(self, other: i16) -> i16 {\n self - other\n }\n}\nimpl Sub for i32 {\n fn sub(self, other: i32) -> i32 {\n self - other\n }\n}\nimpl Sub for i64 {\n fn sub(self, other: i64) -> i64 {\n self - other\n }\n}\n\n// docs:start:mul-trait\npub trait Mul {\n fn mul(self, other: Self) -> Self;\n}\n// docs:end:mul-trait\n\nimpl Mul for Field {\n fn mul(self, other: Field) -> Field {\n self * other\n }\n}\n\nimpl Mul for u128 {\n fn mul(self, other: u128) -> u128 {\n self * other\n }\n}\nimpl Mul for u64 {\n fn mul(self, other: u64) -> u64 {\n self * other\n }\n}\nimpl Mul for u32 {\n fn mul(self, other: u32) -> u32 {\n self * other\n }\n}\nimpl Mul for u16 {\n fn mul(self, other: u16) -> u16 {\n self * other\n }\n}\nimpl Mul for u8 {\n fn mul(self, other: u8) -> u8 {\n self * other\n }\n}\nimpl Mul for u1 {\n fn mul(self, other: u1) -> u1 {\n self * other\n }\n}\n\nimpl Mul for i8 {\n fn mul(self, other: i8) -> i8 {\n self * other\n }\n}\nimpl Mul for i16 {\n fn mul(self, other: i16) -> i16 {\n self * other\n }\n}\nimpl Mul for i32 {\n fn mul(self, other: i32) -> i32 {\n self * other\n }\n}\nimpl Mul for i64 {\n fn mul(self, other: i64) -> i64 {\n self * other\n }\n}\n\n// docs:start:div-trait\npub trait Div {\n fn div(self, other: Self) -> Self;\n}\n// docs:end:div-trait\n\nimpl Div for Field {\n fn div(self, other: Field) -> Field {\n self / other\n }\n}\n\nimpl Div for u128 {\n fn div(self, other: u128) -> u128 {\n self / other\n }\n}\nimpl Div for u64 {\n fn div(self, other: u64) -> u64 {\n self / other\n }\n}\nimpl Div for u32 {\n fn div(self, other: u32) -> u32 {\n self / other\n }\n}\nimpl Div for u16 {\n fn div(self, other: u16) -> u16 {\n self / other\n }\n}\nimpl Div for u8 {\n fn div(self, other: u8) -> u8 {\n self / other\n }\n}\nimpl Div for u1 {\n fn div(self, other: u1) -> u1 {\n self / other\n }\n}\n\nimpl Div for i8 {\n fn div(self, other: i8) -> i8 {\n self / other\n }\n}\nimpl Div for i16 {\n fn div(self, other: i16) -> i16 {\n self / other\n }\n}\nimpl Div for i32 {\n fn div(self, other: i32) -> i32 {\n self / other\n }\n}\nimpl Div for i64 {\n fn div(self, other: i64) -> i64 {\n self / other\n }\n}\n\n// docs:start:rem-trait\npub trait Rem {\n fn rem(self, other: Self) -> Self;\n}\n// docs:end:rem-trait\n\nimpl Rem for u128 {\n fn rem(self, other: u128) -> u128 {\n self % other\n }\n}\nimpl Rem for u64 {\n fn rem(self, other: u64) -> u64 {\n self % other\n }\n}\nimpl Rem for u32 {\n fn rem(self, other: u32) -> u32 {\n self % other\n }\n}\nimpl Rem for u16 {\n fn rem(self, other: u16) -> u16 {\n self % other\n }\n}\nimpl Rem for u8 {\n fn rem(self, other: u8) -> u8 {\n self % other\n }\n}\nimpl Rem for u1 {\n fn rem(self, other: u1) -> u1 {\n self % other\n }\n}\n\nimpl Rem for i8 {\n fn rem(self, other: i8) -> i8 {\n self % other\n }\n}\nimpl Rem for i16 {\n fn rem(self, other: i16) -> i16 {\n self % other\n }\n}\nimpl Rem for i32 {\n fn rem(self, other: i32) -> i32 {\n self % other\n }\n}\nimpl Rem for i64 {\n fn rem(self, other: i64) -> i64 {\n self % other\n }\n}\n\n// docs:start:neg-trait\npub trait Neg {\n fn neg(self) -> Self;\n}\n// docs:end:neg-trait\n\n// docs:start:neg-trait-impls\nimpl Neg for Field {\n fn neg(self) -> Field {\n -self\n }\n}\n\nimpl Neg for i8 {\n fn neg(self) -> i8 {\n -self\n }\n}\nimpl Neg for i16 {\n fn neg(self) -> i16 {\n -self\n }\n}\nimpl Neg for i32 {\n fn neg(self) -> i32 {\n -self\n }\n}\nimpl Neg for i64 {\n fn neg(self) -> i64 {\n -self\n }\n}\n// docs:end:neg-trait-impls\n\n// docs:start:wrapping-add-trait\npub trait WrappingAdd {\n fn wrapping_add(self, y: Self) -> Self;\n}\n// docs:end:wrapping-add-trait\n\nimpl WrappingAdd for u1 {\n fn wrapping_add(self: u1, y: u1) -> u1 {\n self ^ y\n }\n}\n\nimpl WrappingAdd for u8 {\n fn wrapping_add(self: u8, y: u8) -> u8 {\n wrapping_add_hlp(self, y)\n }\n}\n\nimpl WrappingAdd for u16 {\n fn wrapping_add(self: u16, y: u16) -> u16 {\n wrapping_add_hlp(self, y)\n }\n}\n\nimpl WrappingAdd for u32 {\n fn wrapping_add(self: u32, y: u32) -> u32 {\n wrapping_add_hlp(self, y)\n }\n}\n\nimpl WrappingAdd for u64 {\n fn wrapping_add(self: u64, y: u64) -> u64 {\n wrapping_add_hlp(self, y)\n }\n}\n\nimpl WrappingAdd for u128 {\n fn wrapping_add(self: u128, y: u128) -> u128 {\n wrapping_add_hlp(self, y)\n }\n}\n\nimpl WrappingAdd for i8 {\n fn wrapping_add(self: i8, y: i8) -> i8 {\n let x = self as u8;\n x.wrapping_add(y as u8) as i8\n }\n}\n\nimpl WrappingAdd for i16 {\n fn wrapping_add(self: i16, y: i16) -> i16 {\n let x = self as u16;\n x.wrapping_add(y as u16) as i16\n }\n}\n\nimpl WrappingAdd for i32 {\n fn wrapping_add(self: i32, y: i32) -> i32 {\n let x = self as u32;\n x.wrapping_add(y as u32) as i32\n }\n}\n\nimpl WrappingAdd for i64 {\n fn wrapping_add(self: i64, y: i64) -> i64 {\n let x = self as u64;\n x.wrapping_add(y as u64) as i64\n }\n}\nimpl WrappingAdd for Field {\n fn wrapping_add(self: Field, y: Field) -> Field {\n self + y\n }\n}\n\n// docs:start:wrapping-sub-trait\npub trait WrappingSub {\n fn wrapping_sub(self, y: Self) -> Self;\n}\n// docs:start:wrapping-sub-trait\n\nimpl WrappingSub for u1 {\n fn wrapping_sub(self: u1, y: u1) -> u1 {\n self ^ y\n }\n}\n\nimpl WrappingSub for u8 {\n fn wrapping_sub(self: u8, y: u8) -> u8 {\n wrapping_sub_hlp(self, y) as u8\n }\n}\n\nimpl WrappingSub for u16 {\n fn wrapping_sub(self: u16, y: u16) -> u16 {\n wrapping_sub_hlp(self, y) as u16\n }\n}\n\nimpl WrappingSub for u32 {\n fn wrapping_sub(self: u32, y: u32) -> u32 {\n wrapping_sub_hlp(self, y) as u32\n }\n}\nimpl WrappingSub for u64 {\n fn wrapping_sub(self: u64, y: u64) -> u64 {\n wrapping_sub_hlp(self, y) as u64\n }\n}\nimpl WrappingSub for u128 {\n fn wrapping_sub(self: u128, y: u128) -> u128 {\n wrapping_sub_hlp(self, y) as u128\n }\n}\n\nimpl WrappingSub for i8 {\n fn wrapping_sub(self: i8, y: i8) -> i8 {\n let x = self as u8;\n x.wrapping_sub(y as u8) as i8\n }\n}\n\nimpl WrappingSub for i16 {\n fn wrapping_sub(self: i16, y: i16) -> i16 {\n let x = self as u16;\n x.wrapping_sub(y as u16) as i16\n }\n}\n\nimpl WrappingSub for i32 {\n fn wrapping_sub(self: i32, y: i32) -> i32 {\n let x = self as u32;\n x.wrapping_sub(y as u32) as i32\n }\n}\nimpl WrappingSub for i64 {\n fn wrapping_sub(self: i64, y: i64) -> i64 {\n let x = self as u64;\n x.wrapping_sub(y as u64) as i64\n }\n}\nimpl WrappingSub for Field {\n fn wrapping_sub(self: Field, y: Field) -> Field {\n self - y\n }\n}\n\n// docs:start:wrapping-mul-trait\npub trait WrappingMul {\n fn wrapping_mul(self, y: Self) -> Self;\n}\n// docs:start:wrapping-mul-trait\n\nimpl WrappingMul for u1 {\n fn wrapping_mul(self: u1, y: u1) -> u1 {\n self & y\n }\n}\n\nimpl WrappingMul for u8 {\n fn wrapping_mul(self: u8, y: u8) -> u8 {\n wrapping_mul_hlp(self, y)\n }\n}\n\nimpl WrappingMul for u16 {\n fn wrapping_mul(self: u16, y: u16) -> u16 {\n wrapping_mul_hlp(self, y)\n }\n}\n\nimpl WrappingMul for u32 {\n fn wrapping_mul(self: u32, y: u32) -> u32 {\n wrapping_mul_hlp(self, y)\n }\n}\nimpl WrappingMul for u64 {\n fn wrapping_mul(self: u64, y: u64) -> u64 {\n wrapping_mul_hlp(self, y)\n }\n}\n\nimpl WrappingMul for i8 {\n fn wrapping_mul(self: i8, y: i8) -> i8 {\n let x = self as u8;\n x.wrapping_mul(y as u8) as i8\n }\n}\n\nimpl WrappingMul for i16 {\n fn wrapping_mul(self: i16, y: i16) -> i16 {\n let x = self as u16;\n x.wrapping_mul(y as u16) as i16\n }\n}\n\nimpl WrappingMul for i32 {\n fn wrapping_mul(self: i32, y: i32) -> i32 {\n let x = self as u32;\n x.wrapping_mul(y as u32) as i32\n }\n}\n\nimpl WrappingMul for i64 {\n fn wrapping_mul(self: i64, y: i64) -> i64 {\n let x = self as u64;\n x.wrapping_mul(y as u64) as i64\n }\n}\n\nimpl WrappingMul for u128 {\n fn wrapping_mul(self: u128, y: u128) -> u128 {\n wrapping_mul128_hlp(self, y)\n }\n}\nimpl WrappingMul for Field {\n fn wrapping_mul(self: Field, y: Field) -> Field {\n self * y\n }\n}\n\nfn wrapping_add_hlp<T>(x: T, y: T) -> T\nwhere\n T: AsPrimitive<Field>,\n Field: AsPrimitive<T>,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\nfn wrapping_sub_hlp<T>(x: T, y: T) -> Field\nwhere\n T: AsPrimitive<Field>,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n x.as_() + 340282366920938463463374607431768211456 - y.as_()\n}\n\nfn wrapping_mul_hlp<T>(x: T, y: T) -> T\nwhere\n T: AsPrimitive<Field>,\n Field: AsPrimitive<T>,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\nglobal two_pow_64: u128 = 0x10000000000000000;\n/// Splits a 128 bits number into two 64 bits limbs\nunconstrained fn split64(x: u128) -> (u64, u64) {\n let lo = x as u64;\n let hi = (x / two_pow_64) as u64;\n (lo, hi)\n}\n\n/// Split a 128 bits number into two 64 bits limbs\n/// It will fail if the number is more than 128 bits\nfn split_into_64_bit_limbs(x: u128) -> (u64, u64) {\n // Safety: the limbs are constrained below\n let (x_lo, x_hi) = unsafe { split64(x) };\n assert(x as Field == x_lo as Field + x_hi as Field * two_pow_64 as Field);\n (x_lo, x_hi)\n}\n\n#[field(bn254)]\nfn wrapping_mul128_hlp(x: u128, y: u128) -> u128 {\n let (x_lo, x_hi) = split_into_64_bit_limbs(x);\n let (y_lo, y_hi) = split_into_64_bit_limbs(y);\n // Multiplication using the limbs:(x_lo + 2**64*x_hi)*(y_lo + 2**64*y_hi)=x_lo*y_lo+...\n // and skipping the terms over 2**128\n // Working with u64 limbs ensures that we cannot overflow the field modulus.\n let low = x_lo as Field * y_lo as Field;\n let lo = low as u64 as Field;\n let carry = (low - lo) / two_pow_64 as Field;\n let high = x_lo as Field * y_hi as Field + x_hi as Field * y_lo as Field + carry;\n let hi = high as u64 as Field;\n (lo + two_pow_64 as Field * hi) as u128\n}\n\nmod tests {\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n crate::static_assert(1 == 2, \"custom message\");\n }\n\n mod arithmetic {\n use crate::ops::arith::{Add, Div, Mul, Neg, Rem, Sub};\n #[test]\n fn test_basic_arithmetic_traits() {\n // add\n assert_eq(5.add(3), 8);\n assert_eq(0u8.add(255u8), 255u8);\n assert_eq(42.add(58), 100);\n\n // sub\n assert_eq(10.sub(3), 7);\n assert_eq(100.sub(42), 58);\n\n // mul\n assert_eq(6.mul(7), 42);\n\n // div\n assert_eq(15.div(3), 5);\n assert_eq(10u8.div(3u8), 3u8);\n assert_eq(15.div(3), 5);\n\n // rem\n assert_eq(17.rem(5), 2);\n assert_eq(10u8.rem(3u8), 1u8);\n\n // neg\n assert_eq(42.neg(), -42);\n assert_eq((-10).neg(), 10);\n assert_eq(42.neg(), -42);\n }\n\n #[test]\n fn test_division() {\n // test division by one\n assert_eq(42.div(1), 42);\n assert_eq(0.div(1), 0);\n assert_eq(255u8.div(1u8), 255u8);\n\n // test division by self\n assert_eq(42.div(42), 1);\n assert_eq(1.div(1), 1);\n\n // test remainder\n assert_eq(42.rem(42), 0);\n assert_eq(0.rem(42), 0);\n assert_eq(1.rem(42), 1);\n }\n\n #[test(should_fail)]\n fn test_u8_sub_overflow_failure() {\n let _ = 0u8.sub(1u8);\n }\n\n #[test(should_fail)]\n fn test_u8_add_overflow_failure() {\n let _ = 255u8.add(1u8);\n }\n\n #[test(should_fail)]\n fn test_u8_mul_overflow_failure() {\n let _ = 255u8.mul(2u8);\n }\n\n #[test(should_fail)]\n fn test_u16_sub_overflow_failure() {\n let _ = 0u16.sub(1u16);\n }\n\n #[test(should_fail)]\n fn test_u16_add_overflow_failure() {\n let _ = 65535u16.add(1u16);\n }\n\n #[test(should_fail)]\n fn test_u16_mul_overflow_failure() {\n let _ = 65535u16.mul(2u16);\n }\n\n #[test(should_fail)]\n fn test_signed_sub_overflow_failure() {\n let val: i8 = -128;\n let _ = val.sub(1i8);\n }\n\n #[test(should_fail)]\n fn test_signed_overflow_failure() {\n let _ = 127i8.add(1i8);\n }\n\n #[test]\n fn test_field() {\n let zero: Field = 0;\n let one: Field = 1;\n\n // test Field basic operations\n assert_eq(zero.add(one), one);\n assert_eq(one.add(zero), one);\n assert_eq(one.sub(one), zero);\n assert_eq(one.mul(one), one);\n assert_eq(one.div(one), one);\n assert_eq(zero.neg(), zero);\n assert_eq(one.neg(), -one);\n }\n\n }\n\n mod wrapping_arithmetic {\n use crate::ops::arith::{Add, Div, Mul, Neg, Sub, WrappingAdd, WrappingMul, WrappingSub};\n #[test]\n fn test_wrapping_add() {\n assert_eq(255u8.wrapping_add(1u8), 0u8);\n assert_eq(255u8.wrapping_add(255u8), 254u8);\n assert_eq(0u8.wrapping_add(0u8), 0u8);\n assert_eq(128u8.wrapping_add(128u8), 0u8);\n\n // test u16 wrapping add\n assert_eq(65535u16.wrapping_add(1u16), 0u16);\n assert_eq(65535u16.wrapping_add(65535u16), 65534u16);\n\n // test u32 wrapping add\n assert_eq(0xffffffffu32.wrapping_add(1u32), 0u32);\n assert_eq(0xffffffffu32.wrapping_add(0xffffffffu32), 0xfffffffeu32);\n\n // test u64 wrapping add\n assert_eq(0xffffffffffffffffu64.wrapping_add(1u64), 0u64);\n assert_eq(\n 0xffffffffffffffffu64.wrapping_add(0xffffffffffffffffu64),\n 0xfffffffffffffffeu64,\n );\n\n // test u128 wrapping add\n assert_eq(0xffffffffffffffffffffffffffffffffu128.wrapping_add(1u128), 0u128);\n\n // test signed types\n assert_eq(127i8.wrapping_add(1i8), -128i8);\n let val: i8 = -128;\n assert_eq(val.wrapping_add(-1i8), 127i8);\n\n // test Field wrapping add\n let forty_two: Field = 42;\n let fifty_eight: Field = 58;\n let hundred: Field = 100;\n let neg_two: Field = -2;\n let two: Field = 2;\n let zero: Field = 0;\n let neg_two_hundred: Field = -200;\n let neg_one_ninety_eight: Field = -198;\n assert_eq(forty_two.wrapping_add(fifty_eight), hundred);\n assert_eq(neg_two.wrapping_add(two), zero);\n assert_eq(neg_two_hundred.wrapping_add(two), neg_one_ninety_eight);\n }\n\n #[test]\n fn test_wrapping_sub() {\n assert_eq(0u8.wrapping_sub(1u8), 255u8);\n assert_eq(255u8.wrapping_sub(255u8), 0u8);\n assert_eq(0u8.wrapping_sub(0u8), 0u8);\n assert_eq(1u8.wrapping_sub(2u8), 255u8);\n\n // test u16 wrapping sub\n assert_eq(0u16.wrapping_sub(1u16), 65535u16);\n assert_eq(65535u16.wrapping_sub(65535u16), 0u16);\n\n // test u32 wrapping sub\n assert_eq(0u32.wrapping_sub(1u32), 0xffffffffu32);\n assert_eq(0xffffffffu32.wrapping_sub(0xffffffffu32), 0u32);\n\n // test u64 wrapping sub\n assert_eq(0u64.wrapping_sub(1u64), 0xffffffffffffffffu64);\n assert_eq(0xffffffffffffffffu64.wrapping_sub(0xffffffffffffffffu64), 0u64);\n\n // test u128 wrapping sub\n assert_eq(0u128.wrapping_sub(1u128), 0xffffffffffffffffffffffffffffffffu128);\n\n // test signed types\n let val: i8 = -128;\n assert_eq(val.wrapping_sub(1i8), 127i8);\n assert_eq(127i8.wrapping_sub(-1i8), -128i8);\n\n // test Field wrapping sub\n let forty_two: Field = 42;\n let fifty_eight: Field = 58;\n let neg_sixteen: Field = -16;\n assert_eq(forty_two.wrapping_sub(fifty_eight), neg_sixteen);\n }\n\n #[test]\n fn test_wrapping_mul() {\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n assert_eq(zero, zero.wrapping_mul(one));\n assert_eq(zero, one.wrapping_mul(zero));\n assert_eq(one, one.wrapping_mul(one));\n assert_eq(zero, zero.wrapping_mul(two_pow_64));\n assert_eq(zero, two_pow_64.wrapping_mul(zero));\n assert_eq(two_pow_64, two_pow_64.wrapping_mul(one));\n assert_eq(two_pow_64, one.wrapping_mul(two_pow_64));\n assert_eq(zero, two_pow_64.wrapping_mul(two_pow_64));\n assert_eq(one, u128_max.wrapping_mul(u128_max));\n\n // test u8 wrapping mul\n assert_eq(255u8.wrapping_mul(2u8), 254u8);\n assert_eq(255u8.wrapping_mul(255u8), 1u8);\n assert_eq(128u8.wrapping_mul(2u8), 0u8);\n\n // test u16 wrapping mul\n assert_eq(65535u16.wrapping_mul(2u16), 65534u16);\n assert_eq(65535u16.wrapping_mul(65535u16), 1u16);\n\n // test u32 wrapping mul\n assert_eq(0xffffffffu32.wrapping_mul(2u32), 0xfffffffeu32);\n assert_eq(0xffffffffu32.wrapping_mul(0xffffffffu32), 1u32);\n\n // test u64 wrapping mul\n // 0xffffffffffffffffu64 is 2^64 - 1\n assert_eq(0xffffffffffffffffu64.wrapping_mul(2u64), 0xfffffffffffffffeu64);\n assert_eq(0xffffffffffffffffu64.wrapping_mul(0xffffffffffffffffu64), 1u64);\n\n // test signed types\n assert_eq(127i8.wrapping_mul(2i8), -2i8);\n let val: i8 = -128;\n assert_eq(val.wrapping_mul(-1i8), -128i8);\n\n // test Field wrapping mul\n let six: Field = 6;\n let seven: Field = 7;\n let forty_two: Field = 42;\n let neg_two: Field = -2;\n let two: Field = 2;\n let neg_four: Field = -4;\n assert_eq(six.wrapping_mul(seven), forty_two);\n assert_eq(neg_two.wrapping_mul(two), neg_four);\n }\n\n #[test]\n fn test_u1_behavior() {\n // u1 wrapping add is XOR\n assert_eq(0u1.wrapping_add(0u1), 0u1);\n assert_eq(0u1.wrapping_add(1u1), 1u1);\n assert_eq(1u1.wrapping_add(0u1), 1u1);\n assert_eq(1u1.wrapping_add(1u1), 0u1);\n\n // u1 wrapping sub is XOR\n assert_eq(0u1.wrapping_sub(0u1), 0u1);\n assert_eq(0u1.wrapping_sub(1u1), 1u1);\n assert_eq(1u1.wrapping_sub(0u1), 1u1);\n assert_eq(1u1.wrapping_sub(1u1), 0u1);\n\n // u1 wrapping mul is AND\n assert_eq(0u1.wrapping_mul(0u1), 0u1);\n assert_eq(0u1.wrapping_mul(1u1), 0u1);\n assert_eq(1u1.wrapping_mul(0u1), 0u1);\n assert_eq(1u1.wrapping_mul(1u1), 1u1);\n }\n\n // test wrapping operations is the same as the regular operations\n #[test]\n fn test_wrapping_vs_regular() {\n let u64_large = 0x123456789abcdef0u64;\n let u128_large = 0x123456789abcdef0123456789abcdef0u128;\n\n assert_eq(u64_large.wrapping_add(1u64), u64_large + 1u64);\n assert_eq(u64_large.wrapping_sub(1u64), u64_large - 1u64);\n assert_eq(u64_large.wrapping_mul(2u64), u64_large * 2u64);\n\n assert_eq(u128_large.wrapping_add(1u128), u128_large + 1u128);\n assert_eq(u128_large.wrapping_sub(1u128), u128_large - 1u128);\n assert_eq(u128_large.wrapping_mul(2u128), u128_large * 2u128);\n }\n\n #[test]\n fn test_field_wrapping_operations() {\n let zero: Field = 0;\n let one: Field = 1;\n let large_val = 0xffffffffffffffff;\n\n // test Field wrapping operations\n assert_eq(zero.wrapping_add(one), one);\n assert_eq(one.wrapping_add(large_val), one + large_val);\n assert_eq(zero.wrapping_sub(one), -one);\n assert_eq(one.wrapping_sub(large_val), one - large_val);\n assert_eq(zero.wrapping_mul(one), zero);\n assert_eq(one.wrapping_mul(large_val), large_val);\n\n // test Field basic operations\n assert_eq(zero.add(one), one);\n assert_eq(one.add(zero), one);\n assert_eq(one.sub(one), zero);\n assert_eq(one.mul(one), one);\n assert_eq(one.div(one), one);\n assert_eq(zero.neg(), zero);\n assert_eq(one.neg(), -one);\n }\n\n }\n\n mod split_functions {\n\n use crate::ops::arith::{split64, split_into_64_bit_limbs};\n\n // test split64 and split_into_64_bit_limbs functions\n #[test]\n fn test_split_functions() {\n let small_val = 0x123456789abcdefu128;\n let large_val = 0x123456789abcdef0123456789abcdef0u128;\n let max_val = 0xffffffffffffffffffffffffffffffffu128;\n\n // test split64 (unconstrained)\n // Safety: testing\n unsafe {\n let (lo, hi) = split64(small_val);\n assert_eq(lo, 0x123456789abcdefu64);\n assert_eq(hi, 0u64);\n\n let (lo2, hi2) = split64(large_val);\n assert_eq(lo2, 0x123456789abcdef0u64);\n assert_eq(hi2, 0x123456789abcdef0u64);\n }\n\n // test split_into_64_bit_limbs (constrained)\n let (lo3, hi3) = split_into_64_bit_limbs(small_val);\n assert_eq(lo3, 0x123456789abcdefu64);\n assert_eq(hi3, 0u64);\n\n let (lo4, hi4) = split_into_64_bit_limbs(large_val);\n assert_eq(lo4, 0x123456789abcdef0u64);\n assert_eq(hi4, 0x123456789abcdef0u64);\n\n let (lo5, hi5) = split_into_64_bit_limbs(max_val);\n assert_eq(lo5, 0xffffffffffffffffu64);\n assert_eq(hi5, 0xffffffffffffffffu64);\n }\n }\n}\n"
|
|
4224
4220
|
},
|
|
4225
|
-
"
|
|
4221
|
+
"391": {
|
|
4222
|
+
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr",
|
|
4223
|
+
"source": "mod poseidon2_chunks;\n\nuse crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, nullifier::Nullifier, private_log::PrivateLog,\n transaction::tx_request::TxRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, DOM_SEP__NOTE_HASH_NONCE,\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD, DOM_SEP__SILOED_NOTE_HASH, DOM_SEP__SILOED_NULLIFIER,\n DOM_SEP__UNIQUE_NOTE_HASH, FUNCTION_TREE_HEIGHT, NULL_MSG_SENDER_CONTRACT_ADDRESS,\n TWO_POW_64,\n },\n merkle_tree::root_from_sibling_path,\n messaging::l2_to_l1_message::L2ToL1Message,\n poseidon2::Poseidon2Sponge,\n side_effect::{Counted, Scoped},\n traits::{FromField, Hash, ToField},\n utils::field::{field_from_bytes, field_from_bytes_32_trunc},\n};\n\npub use poseidon2_chunks::poseidon2_absorb_in_chunks_existing_sponge;\nuse poseidon2_chunks::poseidon2_absorb_in_chunks;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\n// TODO: refactor these into their own files: sha256, poseidon2, some protocol-specific hash computations, some merkle computations.\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256::digest(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn compute_siloed_note_hash(contract_address: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), note_hash],\n DOM_SEP__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique, siloed note hashes from siloed note hashes.\n///\n/// The protocol injects uniqueness into every note_hash, so that every single note_hash in the\n/// tree is unique. This prevents faerie gold attacks, where a malicious sender could create\n/// two identical note_hashes for a recipient (meaning only one would be nullifiable in future).\n///\n/// Most privacy protocols will inject the note's leaf_index (its position in the Note Hashes Tree)\n/// into the note, but this requires the creator of a note to wait until their tx is included in\n/// a block to know the note's final note hash (the unique, siloed note hash), because inserting\n/// leaves into trees is the job of a block producer.\n///\n/// We took a different approach so that the creator of a note will know each note's unique, siloed\n/// note hash before broadcasting their tx to the network.\n/// (There was also a historical requirement relating to \"chained transactions\" -- a feature that\n/// Aztec Connect had to enable notes to be spent from distinct txs earlier in the same block,\n/// and hence before an archive block root had been established for that block -- but that feature\n/// was abandoned for the Aztec Network for having too many bad tradeoffs).\n///\n/// (\n/// Edit: it is no longer true that all final note_hashes will be known by the creator of a tx\n/// before they send it to the network. If a tx makes public function calls, then _revertible_\n/// note_hashes that are created in private will not be made unique in private by the Reset circuit,\n/// but will instead be made unique by the AVM, because the `note_index_in_tx` will not be known\n/// until the AVM has executed the public functions of the tx. (See an explanation in\n/// reset_output_composer.nr for why).\n/// For some such txs, the `note_index_in_tx` might still be predictable through simulation, but\n/// for txs whose public functions create a varying number of non-revertible notes (determined at\n/// runtime), the `note_index_in_tx` will not be deterministically derivable before submitting the\n/// tx to the network.\n/// )\n///\n/// We use the `first_nullifier` of a tx as a seed of uniqueness. We have a guarantee that there will\n/// always be at least one nullifier per tx, because the init circuit will create one if one isn't\n/// created naturally by any functions of the tx. (Search \"protocol_nullifier\").\n/// We combine the `first_nullifier` with the note's index (its position within this tx's new\n/// note_hashes array) (`note_index_in_tx`) to get a truly unique value to inject into a note, which\n/// we call a `note_nonce`.\npub fn compute_unique_note_hash(note_nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [note_nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, DOM_SEP__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_note_hash_nonce(first_nullifier_in_tx: Field, note_index_in_tx: u32) -> Field {\n // Hashing the first nullifier with note index in tx is guaranteed to be unique (because all nullifiers are also\n // unique).\n poseidon2_hash_with_separator(\n [first_nullifier_in_tx, note_index_in_tx as Field],\n DOM_SEP__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_note_nonce_and_unique_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n let note_nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(note_nonce, siloed_note_hash)\n}\n\npub fn compute_siloed_nullifier(contract_address: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), nullifier],\n DOM_SEP__SILOED_NULLIFIER,\n )\n}\n\npub fn create_protocol_nullifier(tx_request: TxRequest) -> Scoped<Counted<Nullifier>> {\n // The protocol nullifier is ascribed a special side-effect counter of 1. No other side-effect\n // can have counter 1 (see `validate_as_first_call` for that assertion).\n Nullifier { value: tx_request.hash(), note_hash: 0 }.count(1).scope(\n NULL_MSG_SENDER_CONTRACT_ADDRESS,\n )\n}\n\npub fn compute_siloed_private_log_first_field(\n contract_address: AztecAddress,\n field: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), field],\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD,\n )\n}\n\npub fn compute_siloed_private_log(contract_address: AztecAddress, log: PrivateLog) -> PrivateLog {\n let mut fields = log.fields;\n fields[0] = compute_siloed_private_log_first_field(contract_address, fields[0]);\n PrivateLog::new(fields, log.length)\n}\n\npub fn compute_contract_class_log_hash(log: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS]) -> Field {\n poseidon2_hash(log)\n}\n\npub fn compute_app_siloed_secret_key(\n master_secret_key: EmbeddedCurveScalar,\n app_address: AztecAddress,\n key_type_domain_separator: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [master_secret_key.hi, master_secret_key.lo, app_address.to_field()],\n key_type_domain_separator,\n )\n}\n\npub fn compute_l2_to_l1_message_hash(\n message: Scoped<L2ToL1Message>,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let contract_address_bytes: [u8; 32] = message.contract_address.to_field().to_be_bytes();\n let recipient_bytes: [u8; 20] = message.inner.recipient.to_be_bytes();\n let content_bytes: [u8; 32] = message.inner.content.to_be_bytes();\n let rollup_version_id_bytes: [u8; 32] = rollup_version_id.to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n\n let mut bytes: [u8; 148] = std::mem::zeroed();\n for i in 0..32 {\n bytes[i] = contract_address_bytes[i];\n bytes[i + 32] = rollup_version_id_bytes[i];\n // 64 - 84 are for recipient.\n bytes[i + 84] = chain_id_bytes[i];\n bytes[i + 116] = content_bytes[i];\n }\n\n for i in 0..20 {\n bytes[64 + i] = recipient_bytes[i];\n }\n\n sha256_to_field(bytes)\n}\n\n// TODO: consider a variant that enables domain separation with a u32 (we seem to have standardised u32s for domain separators)\n/// Computes sha256 hash of 2 input fields.\n///\n/// @returns A truncated field (i.e., the first byte is always 0).\npub fn accumulate_sha256(v0: Field, v1: Field) -> Field {\n // Concatenate two fields into 32 x 2 = 64 bytes\n let v0_as_bytes: [u8; 32] = v0.to_be_bytes();\n let v1_as_bytes: [u8; 32] = v1.to_be_bytes();\n let hash_input_flattened = v0_as_bytes.concat(v1_as_bytes);\n\n sha256_to_field(hash_input_flattened)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n poseidon::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n let inputs_with_separator = [separator.to_field()].concat(inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n/// Computes a Poseidon2 hash over a dynamic-length subarray of the given input.\n/// Only the first `in_len` fields of `input` are absorbed; any remaining fields are ignored.\n/// The caller is responsible for ensuring that the input is padded with zeros if required.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_in_chunks(input, in_len);\n sponge.squeeze()\n}\n\n// This function is unconstrained because it is intended to be used in unconstrained context only as\n// in constrained contexts it would be too inefficient.\npub unconstrained fn poseidon2_hash_with_separator_bounded_vec<let N: u32, T>(\n inputs: BoundedVec<Field, N>,\n separator: T,\n) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs.get(i));\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n let mut fields = [0; (N + 30) / 31];\n let mut field_index = 0;\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n fields[field_index] = field_from_bytes(current_field, false);\n current_field = [0; 31];\n field_index += 1;\n }\n }\n if field_index != fields.len() {\n fields[field_index] = field_from_bytes(current_field, false);\n }\n poseidon2_hash(fields)\n}\n\n#[test]\nfn subarray_hash_matches_fixed() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash the entire values_to_hash.\n let fixed_len_hash = poseidon::poseidon2::Poseidon2::hash(values_to_hash, values_to_hash.len());\n\n assert_eq(subarray_hash, fixed_len_hash);\n}\n\n#[test]\nfn subarray_hash_matches_variable() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash up to values_to_hash.len() fields of the padded array.\n let variable_len_hash = poseidon::poseidon2::Poseidon2::hash(padded, values_to_hash.len());\n\n assert_eq(subarray_hash, variable_len_hash);\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256::digest(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn unique_siloed_note_hash_matches_typescript() {\n let inner_note_hash = 1;\n let contract_address = AztecAddress::from_field(2);\n let first_nullifier = 3;\n let note_index_in_tx = 4;\n\n let siloed_note_hash = compute_siloed_note_hash(contract_address, inner_note_hash);\n let siloed_note_hash_from_ts =\n 0x1986a4bea3eddb1fff917d629a13e10f63f514f401bdd61838c6b475db949169;\n assert_eq(siloed_note_hash, siloed_note_hash_from_ts);\n\n let nonce: Field = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n let note_hash_nonce_from_ts =\n 0x28e7799791bf066a57bb51fdd0fbcaf3f0926414314c7db515ea343f44f5d58b;\n assert_eq(nonce, note_hash_nonce_from_ts);\n\n let unique_siloed_note_hash_from_nonce = compute_unique_note_hash(nonce, siloed_note_hash);\n let unique_siloed_note_hash = compute_note_nonce_and_unique_note_hash(\n siloed_note_hash,\n first_nullifier,\n note_index_in_tx,\n );\n assert_eq(unique_siloed_note_hash_from_nonce, unique_siloed_note_hash);\n\n let unique_siloed_note_hash_from_ts =\n 0x29949aef207b715303b24639737c17fbfeb375c1d965ecfa85c7e4f0febb7d16;\n assert_eq(unique_siloed_note_hash, unique_siloed_note_hash_from_ts);\n}\n\n#[test]\nfn siloed_nullifier_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let nullifier = 456;\n\n let res = compute_siloed_nullifier(contract_address, nullifier);\n\n let siloed_nullifier_from_ts =\n 0x169b50336c1f29afdb8a03d955a81e485f5ac7d5f0b8065673d1e407e5877813;\n\n assert_eq(res, siloed_nullifier_from_ts);\n}\n\n#[test]\nfn siloed_private_log_first_field_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let field = 456;\n let res = compute_siloed_private_log_first_field(contract_address, field);\n\n let siloed_private_log_first_field_from_ts =\n 0x29480984f7b9257fded523d50addbcfc8d1d33adcf2db73ef3390a8fd5cdffaa;\n\n assert_eq(res, siloed_private_log_first_field_from_ts);\n}\n\n#[test]\nfn empty_l2_to_l1_message_hash_matches_typescript() {\n // All zeroes\n let res = compute_l2_to_l1_message_hash(\n L2ToL1Message { recipient: EthAddress::zero(), content: 0 }.scope(AztecAddress::from_field(\n 0,\n )),\n 0,\n 0,\n );\n\n let empty_l2_to_l1_msg_hash_from_ts =\n 0x003b18c58c739716e76429634a61375c45b3b5cd470c22ab6d3e14cee23dd992;\n\n assert_eq(res, empty_l2_to_l1_msg_hash_from_ts);\n}\n\n#[test]\nfn l2_to_l1_message_hash_matches_typescript() {\n let message = L2ToL1Message { recipient: EthAddress::from_field(1), content: 2 }.scope(\n AztecAddress::from_field(3),\n );\n let version = 4;\n let chainId = 5;\n\n let hash = compute_l2_to_l1_message_hash(message, version, chainId);\n\n // The following value was generated by `yarn-project/stdlib/src/hash/hash.test.ts`\n let l2_to_l1_message_hash_from_ts =\n 0x0081edf209e087ad31b3fd24263698723d57190bd1d6e9fe056fc0c0a68ee661;\n\n assert_eq(hash, l2_to_l1_message_hash_from_ts);\n}\n\n#[test]\nunconstrained fn poseidon2_hash_with_separator_bounded_vec_matches_non_bounded_vec_version() {\n let inputs = BoundedVec::<Field, 4>::from_array([1, 2, 3]);\n let separator = 42;\n\n // Hash using bounded vec version\n let bounded_result = poseidon2_hash_with_separator_bounded_vec(inputs, separator);\n\n // Hash using regular version\n let regular_result = poseidon2_hash_with_separator([1, 2, 3], separator);\n\n // Results should match\n assert_eq(bounded_result, regular_result);\n}\n"
|
|
4224
|
+
},
|
|
4225
|
+
"399": {
|
|
4226
4226
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/merkle_tree.nr",
|
|
4227
4227
|
"source": "use crate::{\n hash::{accumulate_sha256, poseidon2_hash},\n traits::Empty,\n utils::math::is_power_of_2_u32,\n};\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n poseidon2_hash([left, right])\n}\n\npub fn sha_merkle_hash(left: Field, right: Field) -> Field {\n accumulate_sha256(left, right)\n}\n\n#[derive(Eq)]\npub struct MerkleTree<let N: u32> {\n pub leaves: [Field; N],\n pub nodes: [Field; N - 1],\n}\n\nimpl<let N: u32> Empty for MerkleTree<N> {\n fn empty() -> Self {\n MerkleTree { leaves: [0; N], nodes: [0; N - 1] }\n }\n}\n\nimpl<let N: u32> MerkleTree<N> {\n pub fn new(leaves: [Field; N]) -> Self {\n let nodes = compute_merkle_tree_nodes(leaves, merkle_hash);\n MerkleTree { leaves, nodes }\n }\n\n pub fn new_sha(leaves: [Field; N]) -> Self {\n let nodes = compute_merkle_tree_nodes(leaves, sha_merkle_hash);\n MerkleTree { leaves, nodes }\n }\n\n pub fn get_root(self) -> Field {\n self.nodes[N - 2]\n }\n\n pub fn get_sibling_path<let K: u32>(self, leaf_index: u32) -> [Field; K] {\n assert_eq(2.pow_32(K as Field), N as Field, \"Invalid path length\");\n\n let mut path = [0; K];\n let mut current_index = leaf_index;\n let mut subtree_width = N;\n\n let mut current_sibling_index = sibling_index(current_index);\n\n path[0] = self.leaves[current_sibling_index];\n\n let mut subtree_offset: u32 = 0;\n\n for i in 1..K {\n current_index = current_index / 2;\n subtree_width = subtree_width / 2;\n\n current_sibling_index = sibling_index(current_index);\n\n path[i] = self.nodes[subtree_offset + current_sibling_index];\n\n subtree_offset += subtree_width;\n }\n\n path\n }\n}\n\npub fn sibling_index(index: u32) -> u32 {\n if index % 2 == 0 {\n index + 1\n } else {\n index - 1\n }\n}\n\npub fn compute_merkle_tree_nodes<let N: u32>(\n leaves: [Field; N],\n hasher: fn(Field, Field) -> Field,\n) -> [Field; N - 1] {\n // Note: `N` must be a power of 2.\n std::static_assert(is_power_of_2_u32(N), \"N must be a power of 2\");\n std::static_assert(N != 1, \"2 must divide N\");\n\n let mut nodes = [0; N - 1];\n\n let total_nodes = N - 1;\n let half_size = N / 2;\n\n // Hash base layer.\n for i in 0..half_size {\n nodes[i] = hasher(leaves[2 * i], leaves[2 * i + 1]);\n }\n\n // Hash the other layers.\n for i in 0..(total_nodes - half_size) {\n nodes[half_size + i] = hasher(nodes[2 * i], nodes[2 * i + 1]);\n }\n\n nodes\n}\n"
|
|
4228
4228
|
},
|
|
4229
|
-
"
|
|
4229
|
+
"401": {
|
|
4230
4230
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/root.nr",
|
|
4231
4231
|
"source": "use crate::merkle_tree::merkle_tree::{compute_merkle_tree_nodes, merkle_hash, sha_merkle_hash};\n\n/// Calculate the Merkle tree root from the sibling path and leaf, using the default merkle hash.\npub fn root_from_sibling_path<let N: u32>(\n leaf: Field,\n leaf_index: Field,\n sibling_path: [Field; N],\n) -> Field {\n root_from_sibling_path_with_hasher(leaf, leaf_index, sibling_path, merkle_hash)\n}\n\n/// Calculate the Merkle tree root from the sibling path and leaf, using a custom hasher.\n///\n/// The leaf is hashed with its sibling, the result is then hashed with the next sibling in the path. and so on.\n/// The last hash is the root.\npub fn root_from_sibling_path_with_hasher<let N: u32>(\n leaf: Field,\n leaf_index: Field,\n sibling_path: [Field; N],\n hasher: fn(Field, Field) -> Field,\n) -> Field {\n let mut node = leaf;\n let indices: [u1; N] = leaf_index.to_le_bits();\n\n for i in 0..N {\n let (hash_left, hash_right) = if indices[i] == 1 {\n (sibling_path[i], node)\n } else {\n (node, sibling_path[i])\n };\n node = hasher(hash_left, hash_right);\n }\n node\n}\n\npub fn compute_tree_root<let N: u32>(leaves: [Field; N]) -> Field {\n compute_tree_root_with_hasher(leaves, merkle_hash)\n}\n\npub fn compute_sha_tree_root<let N: u32>(leaves: [Field; N]) -> Field {\n compute_tree_root_with_hasher(leaves, sha_merkle_hash)\n}\n\nfn compute_tree_root_with_hasher<let N: u32>(\n leaves: [Field; N],\n hasher: fn(Field, Field) -> Field,\n) -> Field {\n compute_merkle_tree_nodes(leaves, hasher)[N - 2]\n}\n\npub fn compute_empty_tree_root<let TreeHeight: u32>() -> Field {\n compute_empty_tree_root_with_hasher::<TreeHeight>(merkle_hash)\n}\n\npub fn compute_empty_sha_tree_root<let TreeHeight: u32>() -> Field {\n compute_empty_tree_root_with_hasher::<TreeHeight>(sha_merkle_hash)\n}\n\npub fn compute_empty_tree_root_with_hasher<let TreeHeight: u32>(\n hasher: fn(Field, Field) -> Field,\n) -> Field {\n let mut hashes = [0; TreeHeight + 1];\n for i in 1..TreeHeight + 1 {\n hashes[i] = hasher(hashes[i - 1], hashes[i - 1]);\n }\n hashes[TreeHeight]\n}\n\n#[test]\nfn test_merkle_roots_match_typescript() {\n // The following hardcoded values are generated from yarn-project/foundation/src/trees/balanced_merkle_tree_root.test.ts\n\n let root = compute_tree_root([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);\n let expected_tree_root_from_ts =\n 0x1528946361c480e8dc1e9ae3f8c31c997625fa1ddeddc7db5ad0dce3ac58fc4c;\n assert_eq(root, expected_tree_root_from_ts);\n\n let empty_root = compute_tree_root([0; 16]);\n let expected_empty_root_from_ts =\n 0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e;\n assert_eq(empty_root, expected_empty_root_from_ts);\n\n let sha_root = compute_sha_tree_root([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);\n let expected_sha_root_from_ts =\n 0x00b007869b8a5e2a9b3b580a318e702cea04b2f5438f2e26743f545e4d1ecbdb;\n assert_eq(sha_root, expected_sha_root_from_ts);\n}\n\n#[test]\nfn test_empty_tree_root() {\n assert_eq(compute_empty_tree_root::<0>(), 0);\n\n assert_eq(\n compute_empty_tree_root::<1>(),\n 0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1,\n );\n\n assert_eq(\n compute_empty_tree_root::<2>(),\n 0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290,\n );\n\n assert_eq(\n compute_empty_tree_root::<6>(),\n 0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76,\n );\n\n assert_eq(\n compute_empty_tree_root::<10>(),\n 0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686,\n );\n}\n"
|
|
4232
4232
|
},
|
|
4233
|
-
"417": {
|
|
4234
|
-
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr",
|
|
4235
|
-
"source": "use crate::{\n constants::DOM_SEP__PUBLIC_STORAGE_MAP_SLOT, hash::poseidon2_hash_with_separator,\n traits::ToField,\n};\n\n// TODO: Move this to src/public_data/storage/map.nr\npub fn derive_storage_slot_in_map<K>(storage_slot: Field, key: K) -> Field\nwhere\n K: ToField,\n{\n poseidon2_hash_with_separator(\n [storage_slot, key.to_field()],\n DOM_SEP__PUBLIC_STORAGE_MAP_SLOT,\n )\n}\n\nmod test {\n use crate::{address::AztecAddress, storage::map::derive_storage_slot_in_map, traits::FromField};\n\n #[test]\n fn test_derive_storage_slot_in_map_matches_typescript() {\n let map_slot = 0x132258fb6962c4387ba659d9556521102d227549a386d39f0b22d1890d59c2b5;\n let key = AztecAddress::from_field(\n 0x302dbc2f9b50a73283d5fb2f35bc01eae8935615817a0b4219a057b2ba8a5a3f,\n );\n\n let slot = derive_storage_slot_in_map(map_slot, key);\n\n // The following value was generated by `map_slot.test.ts`\n let slot_from_typescript =\n 0x2d225f361108379adc2da91378b9702675c5546b57e78bafc1e74ec7fec55967;\n\n assert_eq(slot, slot_from_typescript);\n }\n}\n"
|
|
4236
|
-
},
|
|
4237
4233
|
"42": {
|
|
4238
4234
|
"path": "std/option.nr",
|
|
4239
4235
|
"source": "use crate::cmp::{Eq, Ord, Ordering};\nuse crate::default::Default;\nuse crate::hash::{Hash, Hasher};\n\npub struct Option<T> {\n _is_some: bool,\n _value: T,\n}\n\nimpl<T> Option<T> {\n /// Constructs a None value\n pub fn none() -> Self {\n Self { _is_some: false, _value: crate::mem::zeroed() }\n }\n\n /// Constructs a Some wrapper around the given value\n pub fn some(_value: T) -> Self {\n Self { _is_some: true, _value }\n }\n\n /// True if this Option is None\n pub fn is_none(self) -> bool {\n !self._is_some\n }\n\n /// True if this Option is Some\n pub fn is_some(self) -> bool {\n self._is_some\n }\n\n /// Asserts `self.is_some()` and returns the wrapped value.\n pub fn unwrap(self) -> T {\n assert(self._is_some);\n self._value\n }\n\n /// Returns the inner value without asserting `self.is_some()`\n /// Note that if `self` is `None`, there is no guarantee what value will be returned,\n /// only that it will be of type `T`.\n pub fn unwrap_unchecked(self) -> T {\n self._value\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, returns the given default value.\n pub fn unwrap_or(self, default: T) -> T {\n if self._is_some {\n self._value\n } else {\n default\n }\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, calls the given function to return\n /// a default value.\n pub fn unwrap_or_else<Env>(self, default: fn[Env]() -> T) -> T {\n if self._is_some {\n self._value\n } else {\n default()\n }\n }\n\n /// Asserts `self.is_some()` with a provided custom message and returns the contained `Some` value\n pub fn expect<let N: u32, MessageTypes>(self, message: fmtstr<N, MessageTypes>) -> T {\n assert(self.is_some(), message);\n self._value\n }\n\n /// If self is `Some(x)`, this returns `Some(f(x))`. Otherwise, this returns `None`.\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> Option<U> {\n if self._is_some {\n Option::some(f(self._value))\n } else {\n Option::none()\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns the given default value.\n pub fn map_or<U, Env>(self, default: U, f: fn[Env](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns `default()`.\n pub fn map_or_else<U, Env1, Env2>(self, default: fn[Env1]() -> U, f: fn[Env2](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default()\n }\n }\n\n /// Returns None if self is None. Otherwise, this returns `other`.\n pub fn and(self, other: Self) -> Self {\n if self.is_none() {\n Option::none()\n } else {\n other\n }\n }\n\n /// If self is None, this returns None. Otherwise, this calls the given function\n /// with the Some value contained within self, and returns the result of that call.\n ///\n /// In some languages this function is called `flat_map` or `bind`.\n pub fn and_then<U, Env>(self, f: fn[Env](T) -> Option<U>) -> Option<U> {\n if self._is_some {\n f(self._value)\n } else {\n Option::none()\n }\n }\n\n /// If self is Some, return self. Otherwise, return `other`.\n pub fn or(self, other: Self) -> Self {\n if self._is_some {\n self\n } else {\n other\n }\n }\n\n /// If self is Some, return self. Otherwise, return `default()`.\n pub fn or_else<Env>(self, default: fn[Env]() -> Self) -> Self {\n if self._is_some {\n self\n } else {\n default()\n }\n }\n\n // If only one of the two Options is Some, return that option.\n // Otherwise, if both options are Some or both are None, None is returned.\n pub fn xor(self, other: Self) -> Self {\n if self._is_some {\n if other._is_some {\n Option::none()\n } else {\n self\n }\n } else if other._is_some {\n other\n } else {\n Option::none()\n }\n }\n\n /// Returns `Some(x)` if self is `Some(x)` and `predicate(x)` is true.\n /// Otherwise, this returns `None`\n pub fn filter<Env>(self, predicate: fn[Env](T) -> bool) -> Self {\n if self._is_some {\n if predicate(self._value) {\n self\n } else {\n Option::none()\n }\n } else {\n Option::none()\n }\n }\n\n /// Flattens an Option<Option<T>> into a Option<T>.\n /// This returns None if the outer Option is None. Otherwise, this returns the inner Option.\n pub fn flatten(option: Option<Option<T>>) -> Option<T> {\n if option._is_some {\n option._value\n } else {\n Option::none()\n }\n }\n}\n\nimpl<T> Default for Option<T> {\n fn default() -> Self {\n Option::none()\n }\n}\n\nimpl<T> Eq for Option<T>\nwhere\n T: Eq,\n{\n fn eq(self, other: Self) -> bool {\n if self._is_some == other._is_some {\n if self._is_some {\n self._value == other._value\n } else {\n true\n }\n } else {\n false\n }\n }\n}\n\nimpl<T> Hash for Option<T>\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self._is_some.hash(state);\n if self._is_some {\n self._value.hash(state);\n }\n }\n}\n\n// For this impl we're declaring Option::none < Option::some\nimpl<T> Ord for Option<T>\nwhere\n T: Ord,\n{\n fn cmp(self, other: Self) -> Ordering {\n if self._is_some {\n if other._is_some {\n self._value.cmp(other._value)\n } else {\n Ordering::greater()\n }\n } else if other._is_some {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n"
|
|
4240
4236
|
},
|
|
4237
|
+
"420": {
|
|
4238
|
+
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr",
|
|
4239
|
+
"source": "use crate::{\n constants::DOM_SEP__PUBLIC_STORAGE_MAP_SLOT, hash::poseidon2_hash_with_separator,\n traits::ToField,\n};\n\n// TODO: Move this to src/public_data/storage/map.nr\npub fn derive_storage_slot_in_map<K>(storage_slot: Field, key: K) -> Field\nwhere\n K: ToField,\n{\n poseidon2_hash_with_separator(\n [storage_slot, key.to_field()],\n DOM_SEP__PUBLIC_STORAGE_MAP_SLOT,\n )\n}\n\nmod test {\n use crate::{address::AztecAddress, storage::map::derive_storage_slot_in_map, traits::FromField};\n\n #[test]\n fn test_derive_storage_slot_in_map_matches_typescript() {\n let map_slot = 0x132258fb6962c4387ba659d9556521102d227549a386d39f0b22d1890d59c2b5;\n let key = AztecAddress::from_field(\n 0x302dbc2f9b50a73283d5fb2f35bc01eae8935615817a0b4219a057b2ba8a5a3f,\n );\n\n let slot = derive_storage_slot_in_map(map_slot, key);\n\n // The following value was generated by `map_slot.test.ts`\n let slot_from_typescript =\n 0x2d225f361108379adc2da91378b9702675c5546b57e78bafc1e74ec7fec55967;\n\n assert_eq(slot, slot_from_typescript);\n }\n}\n"
|
|
4240
|
+
},
|
|
4241
4241
|
"43": {
|
|
4242
4242
|
"path": "std/panic.nr",
|
|
4243
4243
|
"source": "pub fn panic<T, U>(message: T) -> U\nwhere\n T: StringLike,\n{\n assert(false, message);\n crate::mem::zeroed()\n}\n\ntrait StringLike {}\n\nimpl<let N: u32> StringLike for str<N> {}\nimpl<let N: u32, T> StringLike for fmtstr<N, T> {}\n"
|
|
4244
4244
|
},
|
|
4245
|
-
"
|
|
4245
|
+
"437": {
|
|
4246
4246
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/type_packing.nr",
|
|
4247
4247
|
"source": "use crate::traits::Packable;\n\nglobal BOOL_PACKED_LEN: u32 = 1;\nglobal U8_PACKED_LEN: u32 = 1;\nglobal U16_PACKED_LEN: u32 = 1;\nglobal U32_PACKED_LEN: u32 = 1;\nglobal U64_PACKED_LEN: u32 = 1;\nglobal U128_PACKED_LEN: u32 = 1;\nglobal FIELD_PACKED_LEN: u32 = 1;\nglobal I8_PACKED_LEN: u32 = 1;\nglobal I16_PACKED_LEN: u32 = 1;\nglobal I32_PACKED_LEN: u32 = 1;\nglobal I64_PACKED_LEN: u32 = 1;\n\nimpl Packable for bool {\n let N: u32 = BOOL_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> bool {\n (fields[0] as u1) != 0\n }\n}\n\nimpl Packable for u8 {\n let N: u32 = U8_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u8\n }\n}\n\nimpl Packable for u16 {\n let N: u32 = U16_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u16\n }\n}\n\nimpl Packable for u32 {\n let N: u32 = U32_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u32\n }\n}\n\nimpl Packable for u64 {\n let N: u32 = U64_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u64\n }\n}\n\nimpl Packable for u128 {\n let N: u32 = U128_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u128\n }\n}\n\nimpl Packable for Field {\n let N: u32 = FIELD_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0]\n }\n}\n\nimpl Packable for i8 {\n let N: u32 = I8_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u8 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u8 as i8\n }\n}\n\nimpl Packable for i16 {\n let N: u32 = I16_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u16 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u16 as i16\n }\n}\n\nimpl Packable for i32 {\n let N: u32 = I32_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u32 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u32 as i32\n }\n}\n\nimpl Packable for i64 {\n let N: u32 = I64_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u64 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u64 as i64\n }\n}\n\nimpl<T, let M: u32> Packable for [T; M]\nwhere\n T: Packable,\n{\n let N: u32 = M * <T as Packable>::N;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n let mut result: [Field; Self::N] = std::mem::zeroed();\n for i in 0..M {\n let serialized = self[i].pack();\n for j in 0..<T as Packable>::N {\n result[i * <T as Packable>::N + j] = serialized[j];\n }\n }\n result\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n let mut reader = crate::utils::reader::Reader::new(fields);\n let mut result: [T; M] = std::mem::zeroed();\n reader.read_struct_array::<T, <T as Packable>::N, M>(Packable::unpack, result)\n }\n}\n\n#[test]\nfn test_u16_packing() {\n let a: u16 = 10;\n assert_eq(a, u16::unpack(a.pack()));\n}\n\n#[test]\nfn test_i8_packing() {\n let a: i8 = -10;\n assert_eq(a, i8::unpack(a.pack()));\n}\n\n#[test]\nfn test_i16_packing() {\n let a: i16 = -10;\n assert_eq(a, i16::unpack(a.pack()));\n}\n\n#[test]\nfn test_i32_packing() {\n let a: i32 = -10;\n assert_eq(a, i32::unpack(a.pack()));\n}\n\n#[test]\nfn test_i64_packing() {\n let a: i64 = -10;\n assert_eq(a, i64::unpack(a.pack()));\n}\n"
|
|
4248
4248
|
},
|
|
4249
|
-
"
|
|
4249
|
+
"450": {
|
|
4250
4250
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/reader.nr",
|
|
4251
4251
|
"source": "pub struct Reader<let N: u32> {\n data: [Field; N],\n offset: u32,\n}\n\nimpl<let N: u32> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_u32(&mut self) -> u32 {\n self.read() as u32\n }\n\n pub fn read_u64(&mut self) -> u64 {\n self.read() as u64\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() != 0\n }\n\n pub fn read_array<let K: u32>(&mut self) -> [Field; K] {\n let mut result = [0; K];\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct<T, let K: u32>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array());\n result\n }\n\n pub fn read_struct_array<T, let K: u32, let C: u32>(\n &mut self,\n deserialise: fn([Field; K]) -> T,\n mut result: [T; C],\n ) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn peek_offset(&mut self, offset: u32) -> Field {\n self.data[self.offset + offset]\n }\n\n pub fn advance_offset(&mut self, offset: u32) {\n self.offset += offset;\n }\n\n pub fn finish(self) {\n assert_eq(self.offset, self.data.len(), \"Reader did not read all data\");\n }\n}\n"
|
|
4252
4252
|
},
|
|
4253
|
-
"
|
|
4253
|
+
"451": {
|
|
4254
4254
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/serialization.nr",
|
|
4255
4255
|
"source": "use crate::{reader::Reader, writer::Writer};\n\n// docs:start:serialize\n/// Trait for serializing Noir types into arrays of Fields.\n///\n/// An implementation of the Serialize trait has to follow Noir's intrinsic serialization (each member of a struct\n/// converted directly into one or more Fields without any packing or compression). This trait (and Deserialize) are\n/// typically used to communicate between Noir and TypeScript (via oracles and function arguments).\n///\n/// # On Following Noir's Intrinsic Serialization\n/// When calling a Noir function from TypeScript (TS), first the function arguments are serialized into an array\n/// of fields. This array is then included in the initial witness. Noir's intrinsic serialization is then used\n/// to deserialize the arguments from the witness. When the same Noir function is called from Noir this Serialize trait\n/// is used instead of the serialization in TS. For this reason we need to have a match between TS serialization,\n/// Noir's intrinsic serialization and the implementation of this trait. If there is a mismatch, the function calls\n/// fail with an arguments hash mismatch error message.\n///\n/// # Associated Constants\n/// * `N` - The length of the output Field array, known at compile time\n///\n/// # Example\n/// ```\n/// impl<let N: u32> Serialize for str<N> {\n/// let N: u32 = N;\n///\n/// fn serialize(self) -> [Field; Self::N] {\n/// let mut writer: Writer<Self::N> = Writer::new();\n/// self.stream_serialize(&mut writer);\n/// writer.finish()\n/// }\n///\n/// fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n/// let bytes = self.as_bytes();\n/// for i in 0..bytes.len() {\n/// writer.write(bytes[i] as Field);\n/// }\n/// }\n/// }\n/// ```\n#[derive_via(derive_serialize)]\npub trait Serialize {\n let N: u32;\n\n fn serialize(self) -> [Field; Self::N];\n\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>);\n}\n\n/// Generates a `Serialize` trait implementation for a struct type.\n///\n/// # Parameters\n/// - `s`: The struct type definition to generate the implementation for\n///\n/// # Returns\n/// A quoted code block containing the trait implementation\n///\n/// # Example\n/// For a struct defined as:\n/// ```\n/// struct Log<N> {\n/// fields: [Field; N],\n/// length: u32\n/// }\n/// ```\n///\n/// This function generates code equivalent to:\n/// ```\n/// impl<let N: u32> Serialize for Log<N> {\n/// let N: u32 = <[Field; N] as Serialize>::N + <u32 as Serialize>::N;\n///\n/// fn serialize(self) -> [Field; Self::N] {\n/// let mut writer: Writer<Self::N> = Writer::new();\n/// self.stream_serialize(&mut writer);\n/// writer.finish()\n/// }\n///\n/// #[inline_always]\n/// fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n/// Serialize::stream_serialize(self.fields, writer);\n/// Serialize::stream_serialize(self.length, writer);\n/// }\n/// }\n/// ```\npub comptime fn derive_serialize(s: TypeDefinition) -> Quoted {\n let typ = s.as_type();\n let nested_struct = typ.as_data_type().unwrap();\n\n // We care only about the name and type so we drop the last item of the tuple\n let params = nested_struct.0.fields(nested_struct.1).map(|(name, typ, _)| (name, typ));\n\n // Generates the generic parameter declarations (to be placed after the `impl` keyword) and the `where` clause\n // for the `Serialize` trait.\n let generics_declarations = get_generics_declarations(s);\n let where_serialize_clause = get_where_trait_clause(s, quote {Serialize});\n\n let params_len_quote = get_params_len_quote(params);\n\n let function_body = params\n .map(|(name, _typ): (Quoted, Type)| {\n quote {\n $crate::serialization::Serialize::stream_serialize(self.$name, writer);\n }\n })\n .join(quote {});\n\n quote {\n impl$generics_declarations $crate::serialization::Serialize for $typ\n $where_serialize_clause\n {\n let N: u32 = $params_len_quote;\n\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: $crate::writer::Writer<Self::N> = $crate::writer::Writer::new();\n $crate::serialization::Serialize::stream_serialize(self, &mut writer);\n writer.finish()\n }\n\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut $crate::writer::Writer<K>) {\n $function_body\n }\n }\n }\n}\n\n// docs:start:deserialize\n/// Trait for deserializing Noir types from arrays of Fields.\n///\n/// An implementation of the Deserialize trait has to follow Noir's intrinsic serialization (each member of a struct\n/// converted directly into one or more Fields without any packing or compression). This trait is typically used when\n/// deserializing return values from function calls in Noir. Since the same function could be called from TypeScript\n/// (TS), in which case the TS deserialization would get used, we need to have a match between the 2.\n///\n/// # Associated Constants\n/// * `N` - The length of the input Field array, known at compile time\n///\n/// # Example\n/// ```\n/// impl<let M: u32> Deserialize for str<M> {\n/// let N: u32 = M;\n///\n/// fn deserialize(fields: [Field; Self::N]) -> Self {\n/// let mut reader = Reader::new(fields);\n/// let result = Self::stream_deserialize(&mut reader);\n/// reader.finish();\n/// result\n/// }\n///\n/// fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n/// let mut bytes = [0 as u8; M];\n/// for i in 0..M {\n/// bytes[i] = reader.read() as u8;\n/// }\n/// str::<M>::from(bytes)\n/// }\n/// }\n/// ```\n#[derive_via(derive_deserialize)]\npub trait Deserialize {\n let N: u32;\n\n fn deserialize(fields: [Field; Self::N]) -> Self;\n\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self;\n}\n\n/// Generates a `Deserialize` trait implementation for a given struct `s`.\n///\n/// # Arguments\n/// * `s` - The struct type definition to generate the implementation for\n///\n/// # Returns\n/// A `Quoted` block containing the generated trait implementation\n///\n/// # Requirements\n/// Each struct member type must implement the `Deserialize` trait (it gets used in the generated code).\n///\n/// # Example\n/// For a struct like:\n/// ```\n/// struct MyStruct {\n/// x: AztecAddress,\n/// y: Field,\n/// }\n/// ```\n///\n/// This generates:\n/// ```\n/// impl Deserialize for MyStruct {\n/// let N: u32 = <AztecAddress as Deserialize>::N + <Field as Deserialize>::N;\n///\n/// fn deserialize(fields: [Field; Self::N]) -> Self {\n/// let mut reader = Reader::new(fields);\n/// let result = Self::stream_deserialize(&mut reader);\n/// reader.finish();\n/// result\n/// }\n///\n/// #[inline_always]\n/// fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n/// let x = <AztecAddress as Deserialize>::stream_deserialize(reader);\n/// let y = <Field as Deserialize>::stream_deserialize(reader);\n/// Self { x, y }\n/// }\n/// }\n/// ```\npub comptime fn derive_deserialize(s: TypeDefinition) -> Quoted {\n let typ = s.as_type();\n let nested_struct = typ.as_data_type().unwrap();\n let params = nested_struct.0.fields(nested_struct.1);\n\n // Generates the generic parameter declarations (to be placed after the `impl` keyword) and the `where` clause\n // for the `Deserialize` trait.\n let generics_declarations = get_generics_declarations(s);\n let where_deserialize_clause = get_where_trait_clause(s, quote {Deserialize});\n\n // The following will give us:\n // <type_of_struct_member_1 as Deserialize>::N + <type_of_struct_member_2 as Deserialize>::N + ...\n // (or 0 if the struct has no members)\n let right_hand_side_of_definition_of_n = if params.len() > 0 {\n params\n .map(|(_, param_type, _): (Quoted, Type, Quoted)| {\n quote {\n <$param_type as $crate::serialization::Deserialize>::N\n }\n })\n .join(quote {+})\n } else {\n quote {0}\n };\n\n // For structs containing a single member, we can enhance performance by directly deserializing the input array,\n // bypassing the need for loop-based array construction. While this optimization yields significant benefits in\n // Brillig where the loops are expected to not be optimized, it is not relevant in ACIR where the loops are\n // expected to be optimized away.\n let function_body = if params.len() > 1 {\n // This generates deserialization code for each struct member and concatenates them together.\n let deserialization_of_struct_members = params\n .map(|(param_name, param_type, _): (Quoted, Type, Quoted)| {\n quote {\n let $param_name = <$param_type as Deserialize>::stream_deserialize(reader);\n }\n })\n .join(quote {});\n\n // We join the struct member names with a comma to be used in the `Self { ... }` syntax\n // This will give us e.g. `a, b, c` for a struct with three fields named `a`, `b`, and `c`.\n let struct_members = params\n .map(|(param_name, _, _): (Quoted, Type, Quoted)| quote { $param_name })\n .join(quote {,});\n\n quote {\n $deserialization_of_struct_members\n\n Self { $struct_members }\n }\n } else if params.len() == 1 {\n let param_name = params[0].0;\n quote {\n Self { $param_name: $crate::serialization::Deserialize::stream_deserialize(reader) }\n }\n } else {\n quote {\n Self {}\n }\n };\n\n quote {\n impl$generics_declarations $crate::serialization::Deserialize for $typ\n $where_deserialize_clause\n {\n let N: u32 = $right_hand_side_of_definition_of_n;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = $crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut $crate::reader::Reader<K>) -> Self {\n $function_body\n }\n }\n }\n}\n\n/// Generates a quoted expression that computes the total serialized length of function parameters.\n///\n/// # Parameters\n/// * `params` - An array of tuples where each tuple contains a quoted parameter name and its Type. The type needs\n/// to implement the Serialize trait.\n///\n/// # Returns\n/// A quoted expression that evaluates to:\n/// * `0` if there are no parameters\n/// * `(<type1 as Serialize>::N + <type2 as Serialize>::N + ...)` for one or more parameters\ncomptime fn get_params_len_quote(params: [(Quoted, Type)]) -> Quoted {\n if params.len() == 0 {\n quote { 0 }\n } else {\n let params_quote_without_parentheses = params\n .map(|(_, param_type): (Quoted, Type)| {\n quote {\n <$param_type as $crate::serialization::Serialize>::N\n }\n })\n .join(quote {+});\n quote { ($params_quote_without_parentheses) }\n }\n}\n\ncomptime fn get_generics_declarations(s: TypeDefinition) -> Quoted {\n let generics = s.generics();\n\n if generics.len() > 0 {\n let generics_declarations_items = generics\n .map(|(name, maybe_integer_typ)| {\n // The second item in the generics tuple is an Option of an integer type that is Some only if\n // the generic is numeric.\n if maybe_integer_typ.is_some() {\n // The generic is numeric, so we return a quote defined as e.g. \"let N: u32\"\n let integer_type = maybe_integer_typ.unwrap();\n quote {let $name: $integer_type}\n } else {\n // The generic is not numeric, so we return a quote containing the name of the generic (e.g. \"T\")\n quote {$name}\n }\n })\n .join(quote {,});\n quote {<$generics_declarations_items>}\n } else {\n // The struct doesn't have any generics defined, so we just return an empty quote.\n quote {}\n }\n}\n\ncomptime fn get_where_trait_clause(s: TypeDefinition, trait_name: Quoted) -> Quoted {\n let generics = s.generics();\n\n // The second item in the generics tuple is an Option of an integer type that is Some only if the generic is\n // numeric.\n let non_numeric_generics =\n generics.filter(|(_, maybe_integer_typ)| maybe_integer_typ.is_none());\n\n if non_numeric_generics.len() > 0 {\n let non_numeric_generics_declarations =\n non_numeric_generics.map(|(name, _)| quote {$name: $trait_name}).join(quote {,});\n quote {where $non_numeric_generics_declarations}\n } else {\n // There are no non-numeric generics, so we return an empty quote.\n quote {}\n }\n}\n"
|
|
4256
4256
|
},
|
|
4257
|
-
"
|
|
4257
|
+
"453": {
|
|
4258
4258
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr",
|
|
4259
4259
|
"source": "use crate::{reader::Reader, serialization::{Deserialize, Serialize}, writer::Writer};\nuse std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nglobal U1_SERIALIZED_LEN: u32 = 1;\nglobal BOOL_SERIALIZED_LEN: u32 = 1;\nglobal U8_SERIALIZED_LEN: u32 = 1;\nglobal U16_SERIALIZED_LEN: u32 = 1;\nglobal U32_SERIALIZED_LEN: u32 = 1;\nglobal U64_SERIALIZED_LEN: u32 = 1;\nglobal U128_SERIALIZED_LEN: u32 = 1;\nglobal FIELD_SERIALIZED_LEN: u32 = 1;\nglobal I8_SERIALIZED_LEN: u32 = 1;\nglobal I16_SERIALIZED_LEN: u32 = 1;\nglobal I32_SERIALIZED_LEN: u32 = 1;\nglobal I64_SERIALIZED_LEN: u32 = 1;\n\nimpl Serialize for bool {\n let N: u32 = BOOL_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for bool {\n let N: u32 = BOOL_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> bool {\n reader.read() != 0\n }\n}\n\nimpl Serialize for u1 {\n let N: u32 = U1_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u1 {\n let N: u32 = U1_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u1\n }\n}\n\nimpl Serialize for u8 {\n let N: u32 = U8_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u8 {\n let N: u32 = U8_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u8\n }\n}\n\nimpl Serialize for u16 {\n let N: u32 = U16_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u16 {\n let N: u32 = U16_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u16\n }\n}\n\nimpl Serialize for u32 {\n let N: u32 = U32_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u32 {\n let N: u32 = U32_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u32\n }\n}\n\nimpl Serialize for u64 {\n let N: u32 = U64_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u64 {\n let N: u32 = U64_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u64\n }\n}\n\nimpl Serialize for u128 {\n let N: u32 = U128_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u128 {\n let N: u32 = U128_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u128\n }\n}\n\nimpl Serialize for Field {\n let N: u32 = FIELD_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self);\n }\n}\n\nimpl Deserialize for Field {\n let N: u32 = FIELD_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read()\n }\n}\n\nimpl Serialize for i8 {\n let N: u32 = I8_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u8 as Field);\n }\n}\n\nimpl Deserialize for i8 {\n let N: u32 = I8_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u8 as i8\n }\n}\n\nimpl Serialize for i16 {\n let N: u32 = I16_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u16 as Field);\n }\n}\n\nimpl Deserialize for i16 {\n let N: u32 = I16_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u16 as i16\n }\n}\n\nimpl Serialize for i32 {\n let N: u32 = I32_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u32 as Field);\n }\n}\n\nimpl Deserialize for i32 {\n let N: u32 = I32_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u32 as i32\n }\n}\n\nimpl Serialize for i64 {\n let N: u32 = I64_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u64 as Field);\n }\n}\n\nimpl Deserialize for i64 {\n let N: u32 = I64_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u64 as i64\n }\n}\n\nimpl<T, let M: u32> Serialize for [T; M]\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N * M;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n for i in 0..M {\n self[i].stream_serialize(writer);\n }\n }\n}\n\nimpl<T, let M: u32> Deserialize for [T; M]\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N * M;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let mut result: [T; M] = std::mem::zeroed();\n for i in 0..M {\n result[i] = T::stream_deserialize(reader);\n }\n result\n }\n}\n\nimpl<T> Serialize for Option<T>\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N + 1;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write_bool(self.is_some());\n if self.is_some() {\n self.unwrap_unchecked().stream_serialize(writer);\n } else {\n writer.advance_offset(<T as Serialize>::N);\n }\n }\n}\n\nimpl<T> Deserialize for Option<T>\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N + 1;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n if reader.read_bool() {\n Option::some(<T as Deserialize>::stream_deserialize(reader))\n } else {\n reader.advance_offset(<T as Deserialize>::N);\n Option::none()\n }\n }\n}\n\nglobal SCALAR_SIZE: u32 = 2;\n\nimpl Serialize for EmbeddedCurveScalar {\n\n let N: u32 = SCALAR_SIZE;\n\n fn serialize(self) -> [Field; SCALAR_SIZE] {\n [self.lo, self.hi]\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self.lo);\n writer.write(self.hi);\n }\n}\n\nimpl Deserialize for EmbeddedCurveScalar {\n let N: u32 = SCALAR_SIZE;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n Self { lo: fields[0], hi: fields[1] }\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n Self { lo: reader.read(), hi: reader.read() }\n }\n}\n\nglobal POINT_SIZE: u32 = 3;\n\nimpl Serialize for EmbeddedCurvePoint {\n let N: u32 = POINT_SIZE;\n\n fn serialize(self) -> [Field; Self::N] {\n [self.x, self.y, self.is_infinite as Field]\n }\n\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self.x);\n writer.write(self.y);\n writer.write(self.is_infinite as Field);\n }\n}\n\nimpl Deserialize for EmbeddedCurvePoint {\n let N: u32 = POINT_SIZE;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n Self { x: fields[0], y: fields[1], is_infinite: fields[2] != 0 }\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n Self { x: reader.read(), y: reader.read(), is_infinite: reader.read_bool() }\n }\n}\n\nimpl<let M: u32> Deserialize for str<M> {\n let N: u32 = M;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let u8_arr = <[u8; Self::N] as Deserialize>::stream_deserialize(reader);\n str::<Self::N>::from(u8_arr)\n }\n}\n\nimpl<let M: u32> Serialize for str<M> {\n let N: u32 = M;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.as_bytes().stream_serialize(writer);\n }\n}\n\n// Note: Not deriving this because it's not supported to call derive_serialize on a \"remote\" struct (and it will never\n// be supported).\nimpl<T, let M: u32> Deserialize for BoundedVec<T, M>\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N * M + 1;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let mut new_bounded_vec: BoundedVec<T, M> = BoundedVec::new();\n let payload_len = Self::N - 1;\n\n // Length is stored in the last field as we need to match intrinsic Noir serialization and the `len` struct\n // field is after `storage` struct field (see `bounded_vec.nr` in noir-stdlib)\n let len = reader.peek_offset(payload_len) as u32;\n\n for i in 0..M {\n if i < len {\n new_bounded_vec.push(<T as Deserialize>::stream_deserialize(reader));\n }\n }\n\n // +1 for the length of the BoundedVec\n reader.advance_offset((M - len) * <T as Deserialize>::N + 1);\n\n new_bounded_vec\n }\n}\n\n// This may cause issues if used as program input, because noir disallows empty arrays for program input.\n// I think this is okay because I don't foresee a unit type being used as input. But leaving this comment as a hint\n// if someone does run into this in the future.\nimpl Deserialize for () {\n let N: u32 = 0;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(_reader: &mut Reader<K>) -> Self {\n ()\n }\n}\n\n// Note: Not deriving this because it's not supported to call derive_serialize on a \"remote\" struct (and it will never\n// be supported).\nimpl<T, let M: u32> Serialize for BoundedVec<T, M>\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N * M + 1; // +1 for the length of the BoundedVec\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.storage().stream_serialize(writer);\n // Length is stored in the last field as we need to match intrinsic Noir serialization and the `len` struct\n // field is after `storage` struct field (see `bounded_vec.nr` in noir-stdlib)\n writer.write_u32(self.len() as u32);\n }\n}\n\n// Create a slice of the given length with each element made from `f(i)` where `i` is the current index\ncomptime fn make_slice<Env, T>(length: u32, f: fn[Env](u32) -> T) -> [T] {\n let mut slice = @[];\n for i in 0..length {\n slice = slice.push_back(f(i));\n }\n slice\n}\n\n// Implements Serialize and Deserialize for an arbitrary tuple type\ncomptime fn impl_serialize_for_tuple(_m: Module, length: u32) -> Quoted {\n // `T0`, `T1`, `T2`\n let type_names = make_slice(length, |i| f\"T{i}\".quoted_contents());\n\n // `result0`, `result1`, `result2`\n let result_names = make_slice(length, |i| f\"result{i}\".quoted_contents());\n\n // `T0, T1, T2`\n let field_generics = type_names.join(quote [,]);\n\n // `<T0 as Serialize>::N + <T1 as Serialize>::N + <T2 as Serialize>::N`\n let full_size_serialize = type_names\n .map(|type_name| quote {\n <$type_name as Serialize>::N\n })\n .join(quote [+]);\n\n // `<T0 as Deserialize>::N + <T1 as Deserialize>::N + <T2 as Deserialize>::N`\n let full_size_deserialize = type_names\n .map(|type_name| quote {\n <$type_name as Deserialize>::N\n })\n .join(quote [+]);\n\n // `T0: Serialize, T1: Serialize, T2: Serialize,`\n let serialize_constraints = type_names\n .map(|field_name| quote {\n $field_name: Serialize,\n })\n .join(quote []);\n\n // `T0: Deserialize, T1: Deserialize, T2: Deserialize,`\n let deserialize_constraints = type_names\n .map(|field_name| quote {\n $field_name: Deserialize,\n })\n .join(quote []);\n\n // Statements to serialize each field\n let serialized_fields = type_names\n .mapi(|i, _type_name| quote {\n $crate::serialization::Serialize::stream_serialize(self.$i, writer);\n })\n .join(quote []);\n\n // Statements to deserialize each field\n let deserialized_fields = type_names\n .mapi(|i, type_name| {\n let result_name = result_names[i];\n quote {\n let $result_name = <$type_name as $crate::serialization::Deserialize>::stream_deserialize(reader);\n }\n })\n .join(quote []);\n let deserialize_results = result_names.join(quote [,]);\n\n quote {\n impl<$field_generics> Serialize for ($field_generics) where $serialize_constraints {\n let N: u32 = $full_size_serialize;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: $crate::writer::Writer<Self::N> = $crate::writer::Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut $crate::writer::Writer<K>) {\n\n $serialized_fields\n }\n }\n\n impl<$field_generics> Deserialize for ($field_generics) where $deserialize_constraints {\n let N: u32 = $full_size_deserialize;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = $crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n \n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut $crate::reader::Reader<K>) -> Self {\n $deserialized_fields\n ($deserialize_results)\n }\n }\n }\n}\n\n// Keeping these manual impls. They are more efficient since they do not\n// require copying sub-arrays from any serialized arrays.\nimpl<T1> Serialize for (T1,)\nwhere\n T1: Serialize,\n{\n let N: u32 = <T1 as Serialize>::N;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: crate::writer::Writer<Self::N> = crate::writer::Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.0.stream_serialize(writer);\n }\n}\n\nimpl<T1> Deserialize for (T1,)\nwhere\n T1: Deserialize,\n{\n let N: u32 = <T1 as Deserialize>::N;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n (<T1 as Deserialize>::stream_deserialize(reader),)\n }\n}\n\n#[impl_serialize_for_tuple(2)]\n#[impl_serialize_for_tuple(3)]\n#[impl_serialize_for_tuple(4)]\n#[impl_serialize_for_tuple(5)]\n#[impl_serialize_for_tuple(6)]\nmod impls {\n use crate::serialization::{Deserialize, Serialize};\n}\n"
|
|
4260
4260
|
},
|
|
4261
|
-
"
|
|
4261
|
+
"463": {
|
|
4262
4262
|
"path": "/home/aztec-dev/nargo/github.com/noir-lang/sha256/v0.3.0/src/sha256.nr",
|
|
4263
4263
|
"source": "use std::hash::sha256_compression;\nuse std::runtime::is_unconstrained;\n\nuse constants::{\n BLOCK_BYTE_PTR, BLOCK_SIZE, HASH, INITIAL_STATE, INT_BLOCK_SIZE, INT_SIZE, INT_SIZE_PTR,\n MSG_BLOCK, MSG_SIZE_PTR, STATE, TWO_POW_16, TWO_POW_24, TWO_POW_32, TWO_POW_8,\n};\n\npub(crate) mod constants;\nmod tests;\nmod oracle_tests;\n\n// Implementation of SHA-256 mapping a byte array of variable length to\n// 32 bytes.\n\n// Deprecated in favour of `sha256_var`\n// docs:start:sha256\npub fn sha256<let N: u32>(input: [u8; N]) -> HASH\n// docs:end:sha256\n{\n digest(input)\n}\n\n// SHA-256 hash function\n#[no_predicates]\npub fn digest<let N: u32>(msg: [u8; N]) -> HASH {\n sha256_var(msg, N)\n}\n\n// Variable size SHA-256 hash\npub fn sha256_var<let N: u32>(msg: [u8; N], message_size: u32) -> HASH {\n assert(message_size <= N);\n\n let (h, msg_block) = process_full_blocks(msg, message_size, INITIAL_STATE);\n\n finalize_sha256_blocks(message_size, h, msg_block)\n}\n\n/// Returns the first partially filled message block along with the internal state prior to its compression.\npub(crate) fn process_full_blocks<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n initial_state: STATE,\n) -> (STATE, MSG_BLOCK) {\n if std::runtime::is_unconstrained() {\n let num_full_blocks = message_size / BLOCK_SIZE;\n // Intermediate hash, starting with the canonical initial value\n let mut h: STATE = initial_state;\n // Pointer into msg_block on a 64 byte scale\n for i in 0..num_full_blocks {\n let msg_block = build_msg_block(msg, message_size, BLOCK_SIZE * i);\n h = sha256_compression(msg_block, h);\n }\n\n // We now build the final un-filled block.\n let msg_byte_ptr = message_size % BLOCK_SIZE;\n let msg_block: MSG_BLOCK = if msg_byte_ptr != 0 {\n let num_full_blocks = message_size / BLOCK_SIZE;\n let msg_start = BLOCK_SIZE * num_full_blocks;\n build_msg_block(msg, message_size, msg_start)\n } else {\n // If the message size is a multiple of the block size (i.e. `msg_byte_ptr == 0`) then this block will be empty,\n // so we short-circuit in this case.\n [0; 16]\n };\n\n (h, msg_block)\n } else {\n let num_blocks = N / BLOCK_SIZE;\n\n // We store the intermediate hash states and message blocks in these two arrays which allows us to select the correct state\n // for the given message size with a lookup.\n //\n // These can be reasoned about as followed:\n // Consider a message with an unknown number of bytes, `msg_size. It can be seen that this will have `msg_size / BLOCK_SIZE` full blocks.\n // - `states[i]` should then be the state after processing the first `i` blocks.\n // - `blocks[i]` should then be the next message block after processing the first `i` blocks.\n // blocks[first_partially_filled_block_index] is the last block that is partially filled or all 0 if the message is a multiple of the block size.\n //\n // In other words:\n //\n // blocks = [block 1, block 2, ..., block N / BLOCK_SIZE, block N / BLOCK_SIZE + 1]\n // states = [INITIAL_STATE, state after block 1, state after block 2, ..., state after block N / BLOCK_SIZE]\n //\n // We place the initial state in `states[0]` as in the case where the `message_size < BLOCK_SIZE` then there are no full blocks to process and no compressions should occur.\n let mut blocks: [MSG_BLOCK; N / BLOCK_SIZE + 1] = std::mem::zeroed();\n let mut states: [STATE; N / BLOCK_SIZE + 1] = [initial_state; N / BLOCK_SIZE + 1];\n\n // Optimization for small messages. If the largest possible message is smaller than a block then we know that the first block is partially filled\n // no matter the value of `message_size`.\n //\n // Note that the condition `N >= BLOCK_SIZE` is known during monomorphization so this has no runtime cost.\n let first_partially_filled_block_index = if N >= BLOCK_SIZE {\n message_size / BLOCK_SIZE\n } else {\n 0\n };\n\n for i in 0..num_blocks {\n let msg_start = BLOCK_SIZE * i;\n let new_msg_block = build_msg_block(msg, message_size, msg_start);\n\n blocks[i] = new_msg_block;\n states[i + 1] = sha256_compression(new_msg_block, states[i]);\n }\n // If message_size/BLOCK_SIZE == N/BLOCK_SIZE, and there is a remainder, we need to process the last block.\n if N % BLOCK_SIZE != 0 {\n let new_msg_block = build_msg_block(msg, message_size, BLOCK_SIZE * num_blocks);\n\n blocks[num_blocks] = new_msg_block;\n }\n\n (states[first_partially_filled_block_index], blocks[first_partially_filled_block_index])\n }\n}\n\n// Take `BLOCK_SIZE` number of bytes from `msg` starting at `msg_start` and pack them into a `MSG_BLOCK`.\npub(crate) unconstrained fn build_msg_block_helper<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n msg_start: u32,\n) -> MSG_BLOCK {\n let mut msg_block: MSG_BLOCK = [0; INT_BLOCK_SIZE];\n\n // We insert `BLOCK_SIZE` bytes (or up to the end of the message)\n let block_input = if message_size < msg_start {\n // This function is sometimes called with `msg_start` past the end of the message.\n // In this case we return an empty block and zero pointer to signal that the result should be ignored.\n 0\n } else if message_size < msg_start + BLOCK_SIZE {\n message_size - msg_start\n } else {\n BLOCK_SIZE\n };\n\n // Figure out the number of items in the int array that we have to pack.\n // e.g. if the input is [0,1,2,3,4,5] then we need to pack it as 2 items: [0123, 4500]\n let int_input = (block_input + INT_SIZE - 1) / INT_SIZE;\n\n for i in 0..int_input {\n let mut msg_item: u32 = 0;\n // Always construct the integer as 4 bytes, even if it means going beyond the input.\n for j in 0..INT_SIZE {\n let k = i * INT_SIZE + j;\n let msg_byte = if k < block_input {\n msg[msg_start + k]\n } else {\n 0\n };\n msg_item = (msg_item << 8) + msg_byte as u32;\n }\n msg_block[i] = msg_item;\n }\n\n // Returning the index as if it was a 64 byte array.\n // We have to project it down to 16 items and bit shifting to get a byte back if we need it.\n msg_block\n}\n\n// Build a message block from the input message starting at `msg_start`.\n//\n// If `message_size` is less than `msg_start` then this is called with the old non-empty block;\n// in that case we can skip verification, ie. no need to check that everything is zero.\nfn build_msg_block<let N: u32>(msg: [u8; N], message_size: u32, msg_start: u32) -> MSG_BLOCK {\n let msg_block =\n // Safety: We constrain the block below by reconstructing each `u32` word from the input bytes.\n unsafe { build_msg_block_helper(msg, message_size, msg_start) };\n\n if !is_unconstrained() {\n let mut msg_end = msg_start + BLOCK_SIZE;\n\n let max_read_index = std::cmp::min(message_size, msg_end);\n\n // Reconstructed packed item\n let mut msg_item: Field = 0;\n\n // Inclusive at the end so that we can compare the last item.\n for k in msg_start..=msg_end {\n if (k != msg_start) & (k % INT_SIZE == 0) {\n // If we consumed some input we can compare against the block.\n let msg_block_index = (k - msg_start) / INT_SIZE - 1;\n assert_eq(msg_block[msg_block_index] as Field, msg_item);\n\n msg_item = 0;\n }\n\n // If we have input to consume, add it at the rightmost position.\n let msg_byte = if k < max_read_index { msg[k] } else { 0 };\n msg_item = msg_item * (TWO_POW_8 as Field) + msg_byte as Field;\n }\n }\n msg_block\n}\n\n// Encode `8 * message_size` into two `u32` limbs.\nunconstrained fn encode_len(message_size: u32) -> (u32, u32) {\n let len = 8 * message_size as u64;\n let lo = len & 0xFFFFFFFF;\n let hi = (len >> 32) & 0xFFFFFFFF;\n (lo as u32, hi as u32)\n}\n\n// Write the length into the last 8 bytes of the block.\nfn attach_len_to_msg_block(mut msg_block: MSG_BLOCK, message_size: u32) -> MSG_BLOCK {\n // Safety: We assert the correctness of the decomposition below.\n // 2 `u32` limbs cannot overflow the field modulus so performing the check as `Field`s is safe.\n let (lo, hi) = unsafe { encode_len(message_size) };\n assert_eq(8 * (message_size as Field), lo as Field + hi as Field * TWO_POW_32);\n\n msg_block[INT_SIZE_PTR] = hi;\n msg_block[INT_SIZE_PTR + 1] = lo;\n msg_block\n}\n\n// Perform the final compression, then transform the `STATE` into `HASH`.\nfn hash_final_block(msg_block: MSG_BLOCK, mut state: STATE) -> HASH {\n // Hash final padded block\n state = sha256_compression(msg_block, state);\n\n // Return final hash as byte array\n let mut out_h: HASH = [0; 32]; // Digest as sequence of bytes\n for j in 0..8 {\n let h_bytes: [u8; 4] = (state[j] as Field).to_be_bytes();\n for k in 0..4 {\n out_h[4 * j + k] = h_bytes[k];\n }\n }\n\n out_h\n}\n\n/// Lookup table for the position of the padding bit within one of the `u32` words in the final message block.\nglobal PADDING_BIT_TABLE: [u32; 4] =\n [(1 << 7) * TWO_POW_24, (1 << 7) * TWO_POW_16, (1 << 7) * TWO_POW_8, (1 << 7)];\n\n/// Add 1 bit padding to end of message and compress the block if there's not enough room for the 8-byte length.\n/// Returns the updated hash state and message block that will be used to write the message size.\n///\n/// # Assumptions:\n///\n/// - `msg_block[i] == 0` for all `i > msg_byte_ptr / INT_SIZE`\n/// - `msg_block[msg_byte_ptr / INT_SIZE] & ((1 << 7) * (msg_byte_ptr % INT_SIZE)) == 0`\nfn add_padding_byte_and_compress_if_needed(\n mut msg_block: MSG_BLOCK,\n msg_byte_ptr: BLOCK_BYTE_PTR,\n h: STATE,\n) -> (STATE, MSG_BLOCK) {\n // Pad the rest such that we have a [u32; 2] block at the end representing the length\n // of the message, and a block of 1 0 ... 0 following the message (i.e. [1 << 7, 0, ..., 0]).\n // Here we rely on the fact that everything beyond the available input is set to 0.\n let index = msg_byte_ptr / INT_SIZE;\n\n // Lookup the position of the padding bit and insert it into the message block.\n msg_block[index] += PADDING_BIT_TABLE[msg_byte_ptr % INT_SIZE];\n\n // If we don't have room to write the size, compress the block and reset it.\n if msg_byte_ptr >= MSG_SIZE_PTR {\n let h = sha256_compression(msg_block, h);\n\n // In this case, the final block consists of all zeros with the last 8 bytes containing the length.\n // We set msg_block to all zeros and attach_len_to_msg_block will add the length to the last 8 bytes.\n let msg_block = [0; INT_BLOCK_SIZE];\n (h, msg_block)\n } else {\n (h, msg_block)\n }\n}\n\npub(crate) fn finalize_sha256_blocks(\n message_size: u32,\n mut h: STATE,\n mut msg_block: MSG_BLOCK,\n) -> HASH {\n let msg_byte_ptr = message_size % BLOCK_SIZE;\n\n let (h, mut msg_block) = add_padding_byte_and_compress_if_needed(msg_block, msg_byte_ptr, h);\n\n msg_block = attach_len_to_msg_block(msg_block, message_size);\n\n hash_final_block(msg_block, h)\n}\n\n/**\n * Given some state of a partially computed sha256 hash and part of the preimage, continue hashing\n * @notice used for complex/ recursive offloading of post-partial hashing\n *\n * @param N - the maximum length of the message to hash\n * @param h - the intermediate hash state\n * @param msg - the preimage to hash\n * @param message_size - the actual length of the preimage to hash\n * @return the intermediate hash state after compressing in msg to h\n */\npub fn partial_sha256_var_interstitial<let N: u32>(\n mut h: [u32; 8],\n msg: [u8; N],\n message_size: u32,\n) -> [u32; 8] {\n assert(message_size % BLOCK_SIZE == 0, \"Message size must be a multiple of the block size\");\n if std::runtime::is_unconstrained() {\n // Safety: running as an unconstrained function\n unsafe {\n __sha_partial_var_interstitial(h, msg, message_size)\n }\n } else {\n let (h, _) = process_full_blocks(msg, message_size, h);\n\n h\n }\n}\n\n/**\n * Given some state of a partially computed sha256 hash and remaining preimage, complete the hash\n * @notice used for traditional partial hashing\n *\n * @param N - the maximum length of the message to hash\n * @param h - the intermediate hash state\n * @param msg - the remaining preimage to hash\n * @param message_size - the size of the current chunk\n * @param real_message_size - the total size of the original preimage\n * @return finalized sha256 hash\n */\npub fn partial_sha256_var_end<let N: u32>(\n mut h: [u32; 8],\n msg: [u8; N],\n message_size: u32,\n real_message_size: u32,\n) -> [u8; 32] {\n assert(message_size % BLOCK_SIZE == 0, \"Message size must be a multiple of the block size\");\n if std::runtime::is_unconstrained() {\n // Safety: running as an unconstrained function\n unsafe {\n h = __sha_partial_var_interstitial(h, msg, message_size);\n\n // Handle setup of the final msg block.\n // This case is only hit if the msg is less than the block size,\n // or our message cannot be evenly split into blocks.\n\n finalize_last_sha256_block(h, real_message_size, msg)\n }\n } else {\n let (h, msg_block) = process_full_blocks(msg, message_size, h);\n finalize_sha256_blocks(real_message_size, h, msg_block)\n }\n}\n\nunconstrained fn __sha_partial_var_interstitial<let N: u32>(\n mut h: [u32; 8],\n msg: [u8; N],\n message_size: u32,\n) -> [u32; 8] {\n let num_full_blocks = message_size / BLOCK_SIZE;\n // Intermediate hash, starting with the canonical initial value\n // Pointer into msg_block on a 64 byte scale\n for i in 0..num_full_blocks {\n let msg_block = build_msg_block(msg, message_size, BLOCK_SIZE * i);\n h = sha256_compression(msg_block, h);\n }\n h\n}\n\n// Helper function to finalize the message block with padding and length\nunconstrained fn finalize_last_sha256_block<let N: u32>(\n mut h: STATE,\n message_size: u32,\n msg: [u8; N],\n) -> HASH {\n let msg_byte_ptr = message_size % BLOCK_SIZE;\n\n // We now build the final un-filled block.\n let msg_block: MSG_BLOCK = if msg_byte_ptr != 0 {\n let num_full_blocks = message_size / BLOCK_SIZE;\n let msg_start = BLOCK_SIZE * num_full_blocks;\n build_msg_block(msg, message_size, msg_start)\n } else {\n // If the message size is a multiple of the block size (i.e. `msg_byte_ptr == 0`) then this block will be empty,\n // so we short-circuit in this case.\n [0; 16]\n };\n\n // Once built, we need to add the necessary padding bytes and encoded length\n let (h, mut msg_block) = add_padding_byte_and_compress_if_needed(msg_block, msg_byte_ptr, h);\n msg_block = attach_len_to_msg_block(msg_block, message_size);\n\n hash_final_block(msg_block, h)\n}\n\nmod test_process_full_blocks {\n\n /// Wrapper to force an unconstrained runtime on process_full_blocks.\n unconstrained fn unconstrained_process_full_blocks<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n h: super::STATE,\n ) -> (super::STATE, super::MSG_BLOCK) {\n super::process_full_blocks(msg, message_size, h)\n }\n\n #[test]\n fn test_implementations_agree(msg: [u8; 100], message_size: u32) {\n let message_size = message_size % 100;\n // Safety: test function\n let unconstrained_state =\n unsafe { unconstrained_process_full_blocks(msg, message_size, super::INITIAL_STATE) };\n let state = super::process_full_blocks(msg, message_size, super::INITIAL_STATE);\n assert_eq(state, unconstrained_state);\n }\n}\n\nmod test_sha256_var {\n\n /// Wrapper to force an unconstrained runtime on sha256.\n unconstrained fn unconstrained_sha256<let N: u32>(\n msg: [u8; N],\n message_size: u32,\n ) -> super::HASH {\n super::sha256_var(msg, message_size)\n }\n\n #[test]\n fn test_implementations_agree(msg: [u8; 100], message_size: u32) {\n let message_size = message_size % 100;\n // Safety: test function\n let unconstrained_sha = unsafe { unconstrained_sha256(msg, message_size) };\n let sha = super::sha256_var(msg, message_size);\n assert_eq(sha, unconstrained_sha);\n }\n\n}\n"
|
|
4264
4264
|
},
|
|
@@ -4276,7 +4276,7 @@
|
|
|
4276
4276
|
},
|
|
4277
4277
|
"59": {
|
|
4278
4278
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/aztec_sublib/src/context/private_context.nr",
|
|
4279
|
-
"source": "use crate::{\n context::{inputs::PrivateContextInputs, NullifierExistenceRequest, ReturnsHash},\n hash::hash_args,\n messaging::process_l1_to_l2_message,\n oracle::{\n call_private_function::call_private_function_internal,\n enqueue_public_function_call::{\n is_side_effect_counter_revertible_oracle_wrapper, notify_enqueued_public_function_call,\n notify_set_min_revertible_side_effect_counter,\n },\n execution_cache,\n logs::notify_created_contract_class_log,\n nullifiers::notify_created_nullifier,\n },\n};\nuse crate::protocol::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n function_selector::FunctionSelector,\n gas_settings::GasSettings,\n log_hash::LogHash,\n nullifier::Nullifier,\n private_call_request::PrivateCallRequest,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n private_log::{PrivateLog, PrivateLogData},\n public_call_request::PublicCallRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, MAX_CONTRACT_CLASS_LOGS_PER_CALL,\n MAX_ENQUEUED_CALLS_PER_CALL, MAX_INCLUDE_BY_TIMESTAMP_DURATION, MAX_L2_TO_L1_MSGS_PER_CALL,\n MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PRIVATE_LOGS_PER_CALL,\n NULL_MSG_SENDER_CONTRACT_ADDRESS, PRIVATE_LOG_SIZE_IN_FIELDS,\n },\n hash::poseidon2_hash,\n messaging::l2_to_l1_message::L2ToL1Message,\n side_effect::{Counted, scoped::Scoped},\n traits::Empty,\n utils::arrays::{ClaimedLengthArray, trimmed_array_length_hint},\n};\n\n/// Minimal PrivateContext for protocol contracts going to audit.\n/// Contains only the methods actually used by: fee_juice, auth_registry, contract_class_registry, contract_instance_registry\n#[derive(Eq)]\npub struct PrivateContext {\n pub inputs: PrivateContextInputs,\n pub side_effect_counter: u32,\n\n pub min_revertible_side_effect_counter: u32,\n pub is_fee_payer: bool,\n\n pub args_hash: Field,\n pub return_hash: Field,\n\n pub include_by_timestamp: u64,\n\n pub nullifier_read_requests: BoundedVec<Scoped<Counted<Field>>, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n\n pub nullifiers: BoundedVec<Counted<Nullifier>, MAX_NULLIFIERS_PER_CALL>,\n\n pub private_call_requests: BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n pub public_call_requests: BoundedVec<Counted<PublicCallRequest>, MAX_ENQUEUED_CALLS_PER_CALL>,\n pub public_teardown_call_request: PublicCallRequest,\n pub l2_to_l1_msgs: BoundedVec<Counted<L2ToL1Message>, MAX_L2_TO_L1_MSGS_PER_CALL>,\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n pub anchor_block_header: BlockHeader,\n\n pub private_logs: BoundedVec<Counted<PrivateLogData>, MAX_PRIVATE_LOGS_PER_CALL>,\n pub contract_class_logs_hashes: BoundedVec<Counted<LogHash>, MAX_CONTRACT_CLASS_LOGS_PER_CALL>,\n\n pub expected_non_revertible_side_effect_counter: u32,\n pub expected_revertible_side_effect_counter: u32,\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n let max_allowed_include_by_timestamp = inputs.anchor_block_header.global_variables.timestamp\n + MAX_INCLUDE_BY_TIMESTAMP_DURATION;\n PrivateContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n min_revertible_side_effect_counter: 0,\n is_fee_payer: false,\n args_hash,\n return_hash: 0,\n include_by_timestamp: max_allowed_include_by_timestamp,\n nullifier_read_requests: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n anchor_block_header: inputs.anchor_block_header,\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n expected_non_revertible_side_effect_counter: 0,\n expected_revertible_side_effect_counter: 0,\n }\n }\n\n /// Returns the contract address that initiated this function call (similar to msg.sender in Solidity).\n pub fn maybe_msg_sender(self) -> Option<AztecAddress> {\n let maybe_msg_sender = self.inputs.call_context.msg_sender;\n if maybe_msg_sender == NULL_MSG_SENDER_CONTRACT_ADDRESS {\n Option::none()\n } else {\n Option::some(maybe_msg_sender)\n }\n }\n\n /// Returns the contract address of the current function being executed.\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.contract_address\n }\n\n /// Returns the chain ID of the current network.\n pub fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n /// Returns the protocol version.\n pub fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n /// Returns the gas settings for the current transaction.\n pub fn gas_settings(self) -> GasSettings {\n self.inputs.tx_context.gas_settings\n }\n\n /// Returns the function selector of the currently executing function.\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n /// Returns the hash of the arguments passed to the current function.\n pub fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n /// Returns the anchor block header.\n pub fn get_anchor_block_header(self) -> BlockHeader {\n self.anchor_block_header\n }\n\n /// Sets the hash of the return values for this private function.\n pub fn set_return_hash<let N: u32>(&mut self, serialized_return_values: [Field; N]) {\n let return_hash = hash_args(serialized_return_values);\n self.return_hash = return_hash;\n execution_cache::store(serialized_return_values, return_hash);\n }\n\n /// Builds the PrivateCircuitPublicInputs for this private function.\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n include_by_timestamp: self.include_by_timestamp,\n note_hash_read_requests: ClaimedLengthArray::empty(), // Not used by protocol contracts\n nullifier_read_requests: ClaimedLengthArray::from_bounded_vec(\n self.nullifier_read_requests,\n ),\n key_validation_requests_and_generators: ClaimedLengthArray::empty(), // Not used by protocol contracts\n note_hashes: ClaimedLengthArray::empty(), // Not used by protocol contracts\n nullifiers: ClaimedLengthArray::from_bounded_vec(self.nullifiers),\n private_call_requests: ClaimedLengthArray::from_bounded_vec(self.private_call_requests),\n public_call_requests: ClaimedLengthArray::from_bounded_vec(self.public_call_requests),\n public_teardown_call_request: self.public_teardown_call_request,\n l2_to_l1_msgs: ClaimedLengthArray::from_bounded_vec(self.l2_to_l1_msgs),\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n private_logs: ClaimedLengthArray::from_bounded_vec(self.private_logs),\n contract_class_logs_hashes: ClaimedLengthArray::from_bounded_vec(\n self.contract_class_logs_hashes,\n ),\n anchor_block_header: self.anchor_block_header,\n tx_context: self.inputs.tx_context,\n expected_non_revertible_side_effect_counter: self\n .expected_non_revertible_side_effect_counter,\n expected_revertible_side_effect_counter: self.expected_revertible_side_effect_counter,\n }\n }\n\n /// Declares the end of the \"setup phase\" of this tx. Used by fee_juice.\n pub fn end_setup(&mut self) {\n self.side_effect_counter += 1;\n self.min_revertible_side_effect_counter = self.next_counter();\n notify_set_min_revertible_side_effect_counter(self.min_revertible_side_effect_counter);\n }\n\n pub fn in_revertible_phase(&mut self) -> bool {\n let current_counter = self.side_effect_counter;\n\n // Safety: Kernel will validate that the claim is correct by validating the expected counters.\n let is_revertible =\n unsafe { is_side_effect_counter_revertible_oracle_wrapper(current_counter) };\n\n if is_revertible {\n if (self.expected_revertible_side_effect_counter == 0)\n | (current_counter < self.expected_revertible_side_effect_counter) {\n self.expected_revertible_side_effect_counter = current_counter;\n }\n } else if current_counter > self.expected_non_revertible_side_effect_counter {\n self.expected_non_revertible_side_effect_counter = current_counter;\n }\n\n is_revertible\n }\n\n /// Sets a deadline for when this transaction must be included in a block.\n pub fn set_include_by_timestamp(&mut self, include_by_timestamp: u64) {\n self.include_by_timestamp = std::cmp::min(self.include_by_timestamp, include_by_timestamp);\n }\n\n /// Pushes a new nullifier. Used by class_registry and instance_registry.\n pub fn push_nullifier(&mut self, nullifier: Field) {\n notify_created_nullifier(nullifier);\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: 0 }.count(self.next_counter()));\n }\n\n /// Asserts that a nullifier has been emitted. Used by instance_registry.\n pub fn assert_nullifier_exists(\n &mut self,\n nullifier_existence_request: NullifierExistenceRequest,\n ) {\n let nullifier = nullifier_existence_request.nullifier();\n let contract_address =\n nullifier_existence_request.maybe_contract_address().unwrap_or(AztecAddress::zero());\n\n let request = Scoped::new(\n Counted::new(nullifier, self.next_counter()),\n contract_address,\n );\n\n self.nullifier_read_requests.push(request);\n }\n\n /// Consumes a message sent from Ethereum (L1) to Aztec (L2). Used by fee_juice.\n pub fn consume_l1_to_l2_message(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field,\n ) {\n let nullifier = process_l1_to_l2_message(\n self.anchor_block_header.state.l1_to_l2_message_tree.root,\n self.this_address(),\n sender,\n self.chain_id(),\n self.version(),\n content,\n secret,\n leaf_index,\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier)\n }\n\n /// Emits a private log. Used by instance_registry.\n pub fn emit_private_log(&mut self, log: [Field; PRIVATE_LOG_SIZE_IN_FIELDS], length: u32) {\n let counter = self.next_counter();\n let private_log = PrivateLogData { log: PrivateLog::new(log, length), note_hash_counter: 0 }\n .count(counter);\n self.private_logs.push(private_log);\n }\n\n /// Emits a contract class log. Used by class_registry.\n pub fn emit_contract_class_log<let N: u32>(&mut self, log: [Field; N]) {\n let contract_address = self.this_address();\n let counter = self.next_counter();\n\n let log_to_emit: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS] =\n log.concat([0; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS - N]);\n // Safety: The below length is constrained in the base rollup, which will make sure that all the fields beyond\n // length are zero. However, it won't be able to check that we didn't add extra padding (trailing zeroes) or\n // that we cut trailing zeroes from the end.\n let length = unsafe { trimmed_array_length_hint(log_to_emit) };\n // We hash the entire padded log to ensure a user cannot pass a shorter length and so emit incorrect shorter\n // bytecode.\n let log_hash = poseidon2_hash(log_to_emit);\n // Safety: the below only exists to broadcast the raw log, so we can provide it to the base rollup later to be\n // constrained.\n unsafe {\n notify_created_contract_class_log(contract_address, log_to_emit, length, counter);\n }\n\n self.contract_class_logs_hashes.push(LogHash { value: log_hash, length: length }.count(\n counter,\n ));\n }\n\n /// Makes a read-only call to a private function. Used by auth_registry for authwit.\n pub fn static_call_private_function<let ArgsCount: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ArgsCount],\n ) -> ReturnsHash {\n let args_hash = hash_args(args);\n execution_cache::store(args, args_hash);\n self.call_private_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\n }\n\n fn call_private_function_with_args_hash(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) -> ReturnsHash {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n\n // Safety: The oracle simulates the private call and returns the value of the side effects counter after\n // execution of the call.\n let (end_side_effect_counter, returns_hash) = unsafe {\n call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n )\n };\n\n self.private_call_requests.push(\n PrivateCallRequest {\n call_context: CallContext {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n },\n args_hash,\n returns_hash,\n start_side_effect_counter,\n end_side_effect_counter,\n },\n );\n\n self.side_effect_counter = end_side_effect_counter + 1;\n ReturnsHash::new(returns_hash)\n }\n\n /// Enqueues a call to a public function with a calldata hash. Used by fee_juice and auth_registry.\n pub fn call_public_function_with_calldata_hash(\n &mut self,\n contract_address: AztecAddress,\n calldata_hash: Field,\n is_static_call: bool,\n hide_msg_sender: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n\n notify_enqueued_public_function_call(\n contract_address,\n calldata_hash,\n counter,\n is_static_call,\n );\n\n let msg_sender = if hide_msg_sender {\n NULL_MSG_SENDER_CONTRACT_ADDRESS\n } else {\n self.this_address()\n };\n\n let call_request =\n PublicCallRequest { msg_sender, contract_address, is_static_call, calldata_hash };\n\n self.public_call_requests.push(Counted::new(call_request, counter));\n }\n\n fn next_counter(&mut self) -> u32 {\n let counter = self.side_effect_counter;\n self.side_effect_counter += 1;\n counter\n }\n}\n\nimpl Empty for PrivateContext {\n fn empty() -> Self {\n PrivateContext {\n inputs: PrivateContextInputs::empty(),\n side_effect_counter: 0 as u32,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n args_hash: 0,\n return_hash: 0,\n include_by_timestamp: 0,\n nullifier_read_requests: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n anchor_block_header: BlockHeader::empty(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n expected_non_revertible_side_effect_counter: 0,\n expected_revertible_side_effect_counter: 0,\n }\n }\n}\n"
|
|
4279
|
+
"source": "use crate::{\n context::{inputs::PrivateContextInputs, NullifierExistenceRequest, ReturnsHash},\n hash::hash_args,\n messaging::process_l1_to_l2_message,\n oracle::{\n call_private_function::call_private_function_internal,\n enqueue_public_function_call::{\n is_side_effect_counter_revertible_oracle_wrapper, notify_enqueued_public_function_call,\n notify_set_min_revertible_side_effect_counter,\n },\n execution_cache,\n logs::notify_created_contract_class_log,\n nullifiers::notify_created_nullifier,\n },\n};\nuse crate::protocol::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n function_selector::FunctionSelector,\n gas_settings::GasSettings,\n log_hash::LogHash,\n nullifier::Nullifier,\n private_call_request::PrivateCallRequest,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n private_log::{PrivateLog, PrivateLogData},\n public_call_request::PublicCallRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, MAX_CONTRACT_CLASS_LOGS_PER_CALL,\n MAX_ENQUEUED_CALLS_PER_CALL, MAX_TX_LIFETIME, MAX_L2_TO_L1_MSGS_PER_CALL,\n MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PRIVATE_LOGS_PER_CALL,\n NULL_MSG_SENDER_CONTRACT_ADDRESS, PRIVATE_LOG_SIZE_IN_FIELDS,\n },\n hash::poseidon2_hash,\n messaging::l2_to_l1_message::L2ToL1Message,\n side_effect::{Counted, scoped::Scoped},\n traits::Empty,\n utils::arrays::{ClaimedLengthArray, trimmed_array_length_hint},\n};\n\n/// Minimal PrivateContext for protocol contracts going to audit.\n/// Contains only the methods actually used by: fee_juice, auth_registry, contract_class_registry, contract_instance_registry\n#[derive(Eq)]\npub struct PrivateContext {\n pub inputs: PrivateContextInputs,\n pub side_effect_counter: u32,\n\n pub min_revertible_side_effect_counter: u32,\n pub is_fee_payer: bool,\n\n pub args_hash: Field,\n pub return_hash: Field,\n\n pub expiration_timestamp: u64,\n\n pub nullifier_read_requests: BoundedVec<Scoped<Counted<Field>>, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n\n pub nullifiers: BoundedVec<Counted<Nullifier>, MAX_NULLIFIERS_PER_CALL>,\n\n pub private_call_requests: BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n pub public_call_requests: BoundedVec<Counted<PublicCallRequest>, MAX_ENQUEUED_CALLS_PER_CALL>,\n pub public_teardown_call_request: PublicCallRequest,\n pub l2_to_l1_msgs: BoundedVec<Counted<L2ToL1Message>, MAX_L2_TO_L1_MSGS_PER_CALL>,\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n pub anchor_block_header: BlockHeader,\n\n pub private_logs: BoundedVec<Counted<PrivateLogData>, MAX_PRIVATE_LOGS_PER_CALL>,\n pub contract_class_logs_hashes: BoundedVec<Counted<LogHash>, MAX_CONTRACT_CLASS_LOGS_PER_CALL>,\n\n pub expected_non_revertible_side_effect_counter: u32,\n pub expected_revertible_side_effect_counter: u32,\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n min_revertible_side_effect_counter: 0,\n is_fee_payer: false,\n args_hash,\n return_hash: 0,\n expiration_timestamp: inputs.anchor_block_header.global_variables.timestamp\n + MAX_TX_LIFETIME,\n nullifier_read_requests: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n anchor_block_header: inputs.anchor_block_header,\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n expected_non_revertible_side_effect_counter: 0,\n expected_revertible_side_effect_counter: 0,\n }\n }\n\n /// Returns the contract address that initiated this function call (similar to msg.sender in Solidity).\n pub fn maybe_msg_sender(self) -> Option<AztecAddress> {\n let maybe_msg_sender = self.inputs.call_context.msg_sender;\n if maybe_msg_sender == NULL_MSG_SENDER_CONTRACT_ADDRESS {\n Option::none()\n } else {\n Option::some(maybe_msg_sender)\n }\n }\n\n /// Returns the contract address of the current function being executed.\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.contract_address\n }\n\n /// Returns the chain ID of the current network.\n pub fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n /// Returns the protocol version.\n pub fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n /// Returns the gas settings for the current transaction.\n pub fn gas_settings(self) -> GasSettings {\n self.inputs.tx_context.gas_settings\n }\n\n /// Returns the function selector of the currently executing function.\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n /// Returns the hash of the arguments passed to the current function.\n pub fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n /// Returns the anchor block header.\n pub fn get_anchor_block_header(self) -> BlockHeader {\n self.anchor_block_header\n }\n\n /// Sets the hash of the return values for this private function.\n pub fn set_return_hash<let N: u32>(&mut self, serialized_return_values: [Field; N]) {\n let return_hash = hash_args(serialized_return_values);\n self.return_hash = return_hash;\n execution_cache::store(serialized_return_values, return_hash);\n }\n\n /// Builds the PrivateCircuitPublicInputs for this private function.\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n expiration_timestamp: self.expiration_timestamp,\n note_hash_read_requests: ClaimedLengthArray::empty(), // Not used by protocol contracts\n nullifier_read_requests: ClaimedLengthArray::from_bounded_vec(\n self.nullifier_read_requests,\n ),\n key_validation_requests_and_separators: ClaimedLengthArray::empty(), // Not used by protocol contracts\n note_hashes: ClaimedLengthArray::empty(), // Not used by protocol contracts\n nullifiers: ClaimedLengthArray::from_bounded_vec(self.nullifiers),\n private_call_requests: ClaimedLengthArray::from_bounded_vec(self.private_call_requests),\n public_call_requests: ClaimedLengthArray::from_bounded_vec(self.public_call_requests),\n public_teardown_call_request: self.public_teardown_call_request,\n l2_to_l1_msgs: ClaimedLengthArray::from_bounded_vec(self.l2_to_l1_msgs),\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n private_logs: ClaimedLengthArray::from_bounded_vec(self.private_logs),\n contract_class_logs_hashes: ClaimedLengthArray::from_bounded_vec(\n self.contract_class_logs_hashes,\n ),\n anchor_block_header: self.anchor_block_header,\n tx_context: self.inputs.tx_context,\n expected_non_revertible_side_effect_counter: self\n .expected_non_revertible_side_effect_counter,\n expected_revertible_side_effect_counter: self.expected_revertible_side_effect_counter,\n }\n }\n\n /// Declares the end of the \"setup phase\" of this tx. Used by fee_juice.\n pub fn end_setup(&mut self) {\n self.side_effect_counter += 1;\n self.min_revertible_side_effect_counter = self.next_counter();\n notify_set_min_revertible_side_effect_counter(self.min_revertible_side_effect_counter);\n }\n\n pub fn in_revertible_phase(&mut self) -> bool {\n let current_counter = self.side_effect_counter;\n\n // Safety: Kernel will validate that the claim is correct by validating the expected counters.\n let is_revertible =\n unsafe { is_side_effect_counter_revertible_oracle_wrapper(current_counter) };\n\n if is_revertible {\n if (self.expected_revertible_side_effect_counter == 0)\n | (current_counter < self.expected_revertible_side_effect_counter) {\n self.expected_revertible_side_effect_counter = current_counter;\n }\n } else if current_counter > self.expected_non_revertible_side_effect_counter {\n self.expected_non_revertible_side_effect_counter = current_counter;\n }\n\n is_revertible\n }\n\n /// Sets a deadline for when this transaction must be included in a block.\n pub fn set_expiration_timestamp(&mut self, expiration_timestamp: u64) {\n self.expiration_timestamp = std::cmp::min(self.expiration_timestamp, expiration_timestamp);\n }\n\n /// Pushes a new nullifier. Used by class_registry and instance_registry.\n pub fn push_nullifier(&mut self, nullifier: Field) {\n notify_created_nullifier(nullifier);\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: 0 }.count(self.next_counter()));\n }\n\n /// Asserts that a nullifier has been emitted. Used by instance_registry.\n pub fn assert_nullifier_exists(\n &mut self,\n nullifier_existence_request: NullifierExistenceRequest,\n ) {\n let nullifier = nullifier_existence_request.nullifier();\n let contract_address =\n nullifier_existence_request.maybe_contract_address().unwrap_or(AztecAddress::zero());\n\n let request = Scoped::new(\n Counted::new(nullifier, self.next_counter()),\n contract_address,\n );\n\n self.nullifier_read_requests.push(request);\n }\n\n /// Consumes a message sent from Ethereum (L1) to Aztec (L2). Used by fee_juice.\n pub fn consume_l1_to_l2_message(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field,\n ) {\n let nullifier = process_l1_to_l2_message(\n self.anchor_block_header.state.l1_to_l2_message_tree.root,\n self.this_address(),\n sender,\n self.chain_id(),\n self.version(),\n content,\n secret,\n leaf_index,\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier)\n }\n\n /// Emits a private log. Used by instance_registry.\n pub fn emit_private_log(&mut self, log: [Field; PRIVATE_LOG_SIZE_IN_FIELDS], length: u32) {\n let counter = self.next_counter();\n let private_log = PrivateLogData { log: PrivateLog::new(log, length), note_hash_counter: 0 }\n .count(counter);\n self.private_logs.push(private_log);\n }\n\n /// Emits a contract class log. Used by class_registry.\n pub fn emit_contract_class_log<let N: u32>(&mut self, log: [Field; N]) {\n let contract_address = self.this_address();\n let counter = self.next_counter();\n\n let log_to_emit: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS] =\n log.concat([0; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS - N]);\n // Safety: The below length is constrained in the base rollup, which will make sure that all the fields beyond\n // length are zero. However, it won't be able to check that we didn't add extra padding (trailing zeroes) or\n // that we cut trailing zeroes from the end.\n let length = unsafe { trimmed_array_length_hint(log_to_emit) };\n // We hash the entire padded log to ensure a user cannot pass a shorter length and so emit incorrect shorter\n // bytecode.\n let log_hash = poseidon2_hash(log_to_emit);\n // Safety: the below only exists to broadcast the raw log, so we can provide it to the base rollup later to be\n // constrained.\n unsafe {\n notify_created_contract_class_log(contract_address, log_to_emit, length, counter);\n }\n\n self.contract_class_logs_hashes.push(LogHash { value: log_hash, length: length }.count(\n counter,\n ));\n }\n\n /// Makes a read-only call to a private function. Used by auth_registry for authwit.\n pub fn static_call_private_function<let ArgsCount: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ArgsCount],\n ) -> ReturnsHash {\n let args_hash = hash_args(args);\n execution_cache::store(args, args_hash);\n self.call_private_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\n }\n\n fn call_private_function_with_args_hash(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) -> ReturnsHash {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n\n // Safety: The oracle simulates the private call and returns the value of the side effects counter after\n // execution of the call.\n let (end_side_effect_counter, returns_hash) = unsafe {\n call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n )\n };\n\n self.private_call_requests.push(\n PrivateCallRequest {\n call_context: CallContext {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n },\n args_hash,\n returns_hash,\n start_side_effect_counter,\n end_side_effect_counter,\n },\n );\n\n self.side_effect_counter = end_side_effect_counter + 1;\n ReturnsHash::new(returns_hash)\n }\n\n /// Enqueues a call to a public function with a calldata hash. Used by fee_juice and auth_registry.\n pub fn call_public_function_with_calldata_hash(\n &mut self,\n contract_address: AztecAddress,\n calldata_hash: Field,\n is_static_call: bool,\n hide_msg_sender: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n\n notify_enqueued_public_function_call(\n contract_address,\n calldata_hash,\n counter,\n is_static_call,\n );\n\n let msg_sender = if hide_msg_sender {\n NULL_MSG_SENDER_CONTRACT_ADDRESS\n } else {\n self.this_address()\n };\n\n let call_request =\n PublicCallRequest { msg_sender, contract_address, is_static_call, calldata_hash };\n\n self.public_call_requests.push(Counted::new(call_request, counter));\n }\n\n fn next_counter(&mut self) -> u32 {\n let counter = self.side_effect_counter;\n self.side_effect_counter += 1;\n counter\n }\n}\n\nimpl Empty for PrivateContext {\n fn empty() -> Self {\n PrivateContext {\n inputs: PrivateContextInputs::empty(),\n side_effect_counter: 0 as u32,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n args_hash: 0,\n return_hash: 0,\n expiration_timestamp: 0,\n nullifier_read_requests: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n anchor_block_header: BlockHeader::empty(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n expected_non_revertible_side_effect_counter: 0,\n expected_revertible_side_effect_counter: 0,\n }\n }\n}\n"
|
|
4280
4280
|
},
|
|
4281
4281
|
"60": {
|
|
4282
4282
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/aztec_sublib/src/context/public_context.nr",
|