From 3cd34ab981ebed34bce66c19bb9144e40c6e9204 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 3 Feb 2025 17:34:12 +0000 Subject: [PATCH 01/15] Rework [76c8435a] to eliminate automatic JS-to-WASM function conversions of sqlite3_set_auxdata() destructors because it can leads to leaks on every call of a UDF. This feature never worked before [76c8435a] but fixing it was ill-conceived because of the memory leakage it introduces. WASM function pointers can still be used as destructors in this context. FossilOrigin-Name: 3fb993af0caf041da934cea29c039b27c468be0b75bce1537a6425767cf9bf8d --- ext/wasm/api/sqlite3-api-glue.c-pp.js | 37 +++++++++++++++++---------- ext/wasm/tester1.c-pp.js | 6 ++--- manifest | 14 +++++----- manifest.uuid | 2 +- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/ext/wasm/api/sqlite3-api-glue.c-pp.js b/ext/wasm/api/sqlite3-api-glue.c-pp.js index bcaff7243d..a40b832824 100644 --- a/ext/wasm/api/sqlite3-api-glue.c-pp.js +++ b/ext/wasm/api/sqlite3-api-glue.c-pp.js @@ -229,14 +229,15 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ '*' ]], /** - 2025-02-03: We do not have a way to automatically clean up - destructors which are automatically converted from JS functions - via the final argument to sqlite3_set_auxdata(). Because of - that, it is strongly recommended that clients use - wasm.installFunction() to create such callbacks, then pass that - pointer to sqlite3_set_auxdata(). Relying on automated - conversions here will lead to leaks of JS/WASM proxy functions - because sqlite3_set_auxdata() is frequently called in UDFs. + We do not have a way to automatically clean up destructors + which are automatically converted from JS functions via the + final argument to sqlite3_set_auxdata(). Because of that, + automatic function conversion is not supported for this + function. Clients should use wasm.installFunction() to create + such callbacks, then pass that pointer to + sqlite3_set_auxdata(). Relying on automated conversions here + would lead to leaks of JS/WASM proxy functions because + sqlite3_set_auxdata() is frequently called in UDFs. The sqlite3.oo1.DB class's onclose handlers can be used for this purpose. For example: @@ -252,14 +253,24 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ Then pass pAuxDtor as the final argument to appropriate sqlite3_set_auxdata() calls. + + Note that versions prior to 3.49.0 ostensibly had automatic + function conversion here but a typo prevented it from + working. Rather than fix it, it was removed because testing the + fix brought the huge potential for memory leaks to the + forefront. */ ["sqlite3_set_auxdata", undefined, [ "sqlite3_context*", "int", "*", - new wasm.xWrap.FuncPtrAdapter({ - name: 'xDestroyAuxData', - signature: 'v(p)', - contextKey: (argv, argIndex)=>argv[0/* sqlite3_context* */] - }) + true + ? "*" + : new wasm.xWrap.FuncPtrAdapter({ + /* If we can find a way to automate their cleanup, JS functions can + be auto-converted with this. */ + name: 'xDestroyAuxData', + signature: 'v(p)', + contextKey: (argv, argIndex)=>argv[0/* sqlite3_context* */] + }) ]], ["sqlite3_shutdown", undefined], ["sqlite3_sourceid", "string"], diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index 880edcec1d..9038d68328 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -3469,9 +3469,9 @@ globalThis.sqlite3InitModule = sqlite3InitModule; We do not currently an automated way to clean up auxdata finalizer functions (the 4th argument to sqlite3_set_auxdata()) which get automatically - converted from JS to WASM. Because of that, relying - on automated conversions for those is not - recommended. Instead, follow the pattern show in + converted from JS to WASM. Because of that, enabling + automated conversions here would lead to leaks more + often than not. Instead, follow the pattern show in this function: use wasm.installFunction() to create the function, then pass the resulting function pointer this function, and cleanup (at some point) diff --git a/manifest b/manifest index 54fc8aa8ae..a55702d8dd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\smore\scomplete\stest\sfor\s[76c8435a]\sand\sadd\ssome\scommentary\sabout\s(A)\sthe\sinability\sto\sautomatically\sclean\sup\sautomatically-generated\sWASM\sproxy\sfunctions\sfor\ssqlite3_set_auxdata()\sdestructors\sand\s(B)\show\sto\sdeal\swith\s(A)\sto\savoid\sleaking\sWASM\sproxy\sfunctions. -D 2025-02-03T14:55:56.185 +C Rework\s[76c8435a]\sto\seliminate\sautomatic\sJS-to-WASM\sfunction\sconversions\sof\ssqlite3_set_auxdata()\sdestructors\sbecause\sit\scan\sleads\sto\sleaks\son\severy\scall\sof\sa\sUDF.\sThis\sfeature\snever\sworked\sbefore\s[76c8435a]\sbut\sfixing\sit\swas\sill-conceived\sbecause\sof\sthe\smemory\sleakage\sit\sintroduces.\sWASM\sfunction\spointers\scan\sstill\sbe\sused\sas\sdestructors\sin\sthis\scontext. +D 2025-02-03T17:34:12.962 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -638,7 +638,7 @@ F ext/wasm/api/post-js-footer.js 365405929f41ca0e6d389ed8a8da3f3c93e11d3ef43a90a F ext/wasm/api/post-js-header.js 54b2b4294501b3866245cc94315a16f5424c0e87729d0fb610fba151593c6d26 F ext/wasm/api/pre-js.c-pp.js a614a2c82b12c4d96d8e3ba77330329efc53c4d56a8a7e60ade900f341866cfb F ext/wasm/api/sqlite3-api-cleanup.js 3ac1786e461ada63033143be8c3b00b26b939540661f3e839515bb92f2e35359 -F ext/wasm/api/sqlite3-api-glue.c-pp.js 6e2f2eaf681e342fcb047fcdd01d6e3c1b466fb9b45c1acc38676164a8b60f45 +F ext/wasm/api/sqlite3-api-glue.c-pp.js 5c0209e6a28164b4c2c1a34b0bb4aee3b7b1a264988d7e71fac08b8ede5b7ae3 F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f F ext/wasm/api/sqlite3-api-prologue.js 5ff913355b3144f1c9719d0406667fa6e13eb813c71ed7ce29440e2e65363e82 F ext/wasm/api/sqlite3-api-worker1.c-pp.js 5cc22a3c0d52828cb32aad8691488719f47d27567e63e8bc8b832d74371c352d @@ -696,7 +696,7 @@ F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555 F ext/wasm/test-opfs-vfs.js 1618670e466f424aa289859fe0ec8ded223e42e9e69b5c851f809baaaca1a00c F ext/wasm/tester1-worker.html ebc4b820a128963afce328ecf63ab200bd923309eb939f4110510ab449e9814c F ext/wasm/tester1.c-pp.html 1c1bc78b858af2019e663b1a31e76657b73dc24bede28ca92fbe917c3a972af2 -F ext/wasm/tester1.c-pp.js fb8d0761daaa69bd40c8253cc2d6c8c37ada97e1751b7f07af7369842ba2aeae +F ext/wasm/tester1.c-pp.js 45000532cf83f23a52b31581c1db44bfb82e383b1b68703ae4d3d838de3a833e F ext/wasm/tests/opfs/concurrency/index.html 657578a6e9ce1e9b8be951549ed93a6a471f4520a99e5b545928668f4285fb5e F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65ad09f510589c779b7cc6a803a88 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 91ef45fc2902e46813366ec6b8317209f39f10e4a23c3808e33aceedab9da6c7 -R f2c90877762eddda2efda339cfb2ee34 +P d693c2dddbd10a2e0b77893b04b11502e30b768f1b06814105f7f35172845fb9 +R bdcc5096cc30e3d83fdf5d66602909e7 U stephan -Z 6cfffa02c18a4e52a298c977368cc8d7 +Z fd720e9f1383b7c5da4643ab36634ed7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c7225ebda1..01d5aa1d3c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d693c2dddbd10a2e0b77893b04b11502e30b768f1b06814105f7f35172845fb9 +3fb993af0caf041da934cea29c039b27c468be0b75bce1537a6425767cf9bf8d From c6281e48933587fe9dcc6e023babea4b7d4bf13c Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 17:45:41 +0000 Subject: [PATCH 02/15] New test case for test/fuzzdata8.db FossilOrigin-Name: 8a882f976e22100b91c7ca4119123f16ad5f03311f0a6dc17449bcdcff29618c --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 4239360 -> 4241408 bytes 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 809b43bc20..4d31836afa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.48.0 -D 2025-01-14T11:05:00.186 +C New\stest\scase\sfor\stest/fuzzdata8.db +D 2025-02-03T17:45:41.279 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1283,7 +1283,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db b8725a5f5cf7a3b7241a9038e57ca7e7cc8c3f4d86b44bd770617bda245ab2b0 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 4a53b6d077c6a5c23b609d8d3ac66996fa55ba3f8d02f9b6efdd0214a767a35a +F test/fuzzdata8.db deb6533e6dfdb5841eb6a56607bdb74986a57f5739f3975ea542a1f7e7e24d97 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -2205,11 +2205,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 315079b150b47e013e2cde4985bc39d24e0f6f6c6e60f9383fb8ea4ea897c67a -R 0ed0cfcc7f2bc831da5d62a3490571ed -T +sym-major-relase * -T +sym-relase * -T +sym-version-3.48.0 * +P d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 +R 02fce09966e6e21a0a59cdeb994f84e8 +T *branch * fuzz-data +T *sym-fuzz-data * +T -sym-trunk * U drh -Z cc77aac977f98c5521d75f4212754ff8 +Z b5d75fe3951f12b9fb4038728f5d0116 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 582262f689..8024622a5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 +8a882f976e22100b91c7ca4119123f16ad5f03311f0a6dc17449bcdcff29618c diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 3e34180071ede5e023878d8528fe65a8fd9d24b9..f03f3f27191ee07a1014d1babeca93242543de8f 100644 GIT binary patch delta 63340 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 S!o|JP9 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

vX^Pl|nvH{K=>1TOBe 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 From 9e639d249062d99788b6b10e022d79acc066c78a Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 3 Feb 2025 17:54:55 +0000 Subject: [PATCH 03/15] Fix a use-after-free case in fts5 provoked by fuzzdata8.db. Tcl test case pending. FossilOrigin-Name: a4962df665084e423e020be9a2834b6886a8e3feb461cff5358b61398a2a20d2 --- ext/fts5/fts5_index.c | 16 +++++++++++----- manifest | 17 +++++++---------- manifest.uuid | 2 +- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index a8ac98b699..0b2d399f82 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5466,8 +5466,11 @@ static void fts5DoSecureDelete( ** This is called as part of flushing a delete to disk in 'secure-delete' ** mode. It edits the segments within the database described by argument ** pStruct to remove the entries for term zTerm, rowid iRowid. +** +** Return SQLITE_OK if successful, or an SQLite error code if an error +** has occurred. Any error code is also stored in the Fts5Index handle. */ -static void fts5FlushSecureDelete( +static int fts5FlushSecureDelete( Fts5Index *p, Fts5Structure *pStruct, const char *zTerm, @@ -5512,6 +5515,7 @@ static void fts5FlushSecureDelete( } fts5MultiIterFree(pIter); + return p->rc; } @@ -5595,8 +5599,9 @@ static void fts5FlushOneHash(Fts5Index *p){ ** using fts5FlushSecureDelete(). */ if( bSecureDelete ){ if( eDetail==FTS5_DETAIL_NONE ){ - if( iOffrc!=SQLITE_OK || pDoclist[iOff]==0x01 ){ iOff++; continue; diff --git a/manifest b/manifest index 4d31836afa..427775cda2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scase\sfor\stest/fuzzdata8.db -D 2025-02-03T17:45:41.279 +C Fix\sa\suse-after-free\scase\sin\sfts5\sprovoked\sby\sfuzzdata8.db.\sTcl\stest\scase\spending. +D 2025-02-03T17:54:55.366 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -112,7 +112,7 @@ F ext/fts5/fts5_buffer.c 0eec58bff585f1a44ea9147eae5da2447292080ea435957f7488c70 F ext/fts5/fts5_config.c e7d8dd062b44a66cd77e5a0f74f23a2354cd1f3f8575afb967b2773c3384f7f8 F ext/fts5/fts5_expr.c 69b8d976058512c07dfe86e229521b7a871768157bd1607cedf1a5038dfd72c9 F ext/fts5/fts5_hash.c adda4272be401566a6e0ba1acbe70ee5cb97fce944bc2e04dc707152a0ec91b1 -F ext/fts5/fts5_index.c f1f6da5938af616e0a5e54f0423a3134df95b9f17ac1c6ebf2e2e8132bbc75b9 +F ext/fts5/fts5_index.c 3f04b9bbcb211ad52c466396eb8de4a76506d08db31eb017df1eb69c02b6c5b3 F ext/fts5/fts5_main.c 9a1daef7247f9b8a50b4159323e340efa6b0e4bea4fcd83580480f94d4f2c888 F ext/fts5/fts5_storage.c 1ad05dab4830a4e2eaf2900bb143477f93bc17437093582f36f4b818809e88d8 F ext/fts5/fts5_tcl.c 7fb5a3d3404099075aaa2457307cb459bbc257c0de3dbd52b1e80a5b503e0329 @@ -2205,11 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 -R 02fce09966e6e21a0a59cdeb994f84e8 -T *branch * fuzz-data -T *sym-fuzz-data * -T -sym-trunk * -U drh -Z b5d75fe3951f12b9fb4038728f5d0116 +P 8a882f976e22100b91c7ca4119123f16ad5f03311f0a6dc17449bcdcff29618c +R 31351815235c0913d39613cb0514c8c6 +U dan +Z cc507b6dc0a3473a2a3bc1fa7ec940f9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8024622a5d..a6434c556d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8a882f976e22100b91c7ca4119123f16ad5f03311f0a6dc17449bcdcff29618c +a4962df665084e423e020be9a2834b6886a8e3feb461cff5358b61398a2a20d2 From 6e5802fc744d3345b03fa4bbce98c1889c8bcc54 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 3 Feb 2025 18:01:42 +0000 Subject: [PATCH 04/15] Improve the JS-side sqlite3_set_auxdata() test to also trigger the case that the aux data actually gets reused. Test changes only, no library code. FossilOrigin-Name: 9f27379d860518e6e097a2c999da04176812260a61bf11fe495c3efd76971806 --- ext/wasm/tester1.c-pp.js | 18 ++++++++---------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index 9038d68328..28d61de071 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -3445,7 +3445,6 @@ globalThis.sqlite3InitModule = sqlite3InitModule; const stack = wasm.pstack.pointer; const pAux = wasm.pstack.alloc(4); let pAuxDestructed = 0; - const args = []; const pAuxDtor = wasm.installFunction('v(p)', function(ptr){ //log("freeing auxdata"); ++pAuxDestructed; @@ -3457,10 +3456,11 @@ globalThis.sqlite3InitModule = sqlite3InitModule; wasm.uninstallFunction(pAuxDtor); } }; + let nAuxSet = 0 /* how many times we set aux data */; + let nAuxReused = 0 /* how many times we reused aux data */; try{ db.createFunction("auxtest",{ xFunc: function(pCx, x, y){ - args.push(x); T.assert(wasm.isPtr(pCx)); const localAux = capi.sqlite3_get_auxdata(pCx, 0); if( !localAux ){ @@ -3477,15 +3477,12 @@ globalThis.sqlite3InitModule = sqlite3InitModule; pointer this function, and cleanup (at some point) using wasm.uninstallFunction(). */ + ++nAuxSet; capi.sqlite3_set_auxdata(pCx, 0, pAux, pAuxDtor); }else{ - /* This is never actually hit in this example and it's - not entirely clear how to cause it to. The point of - this test, however, is to demonstrate that the - finalizer impl gets triggered, so we're not going to - fret over this at the moment. */ - //log("seen auxdata",localAux); + //log("reusing auxdata",localAux); T.assert(pAux===localAux); + ++nAuxReused; } return x; } @@ -3493,13 +3490,14 @@ globalThis.sqlite3InitModule = sqlite3InitModule; db.exec([ "create table t(a);", "insert into t(a) values(1),(2),(3);", - "select auxtest(a,a), auxtest(a,a) from t order by a" + "select auxtest(1,a), auxtest(1,a) from t order by a" ]); }finally{ db.close(); wasm.pstack.restore(stack); } - T.assert(6===args.length); + T.assert(nAuxSet>0).assert(nAuxReused>0) + .assert(6===nAuxReused+nAuxSet); T.assert(pAuxDestructed>0); T.assert(pAuxDtorDestructed); } diff --git a/manifest b/manifest index a55702d8dd..112bf1a5df 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Rework\s[76c8435a]\sto\seliminate\sautomatic\sJS-to-WASM\sfunction\sconversions\sof\ssqlite3_set_auxdata()\sdestructors\sbecause\sit\scan\sleads\sto\sleaks\son\severy\scall\sof\sa\sUDF.\sThis\sfeature\snever\sworked\sbefore\s[76c8435a]\sbut\sfixing\sit\swas\sill-conceived\sbecause\sof\sthe\smemory\sleakage\sit\sintroduces.\sWASM\sfunction\spointers\scan\sstill\sbe\sused\sas\sdestructors\sin\sthis\scontext. -D 2025-02-03T17:34:12.962 +C Improve\sthe\sJS-side\ssqlite3_set_auxdata()\stest\sto\salso\strigger\sthe\scase\sthat\sthe\saux\sdata\sactually\sgets\sreused.\sTest\schanges\sonly,\sno\slibrary\scode. +D 2025-02-03T18:01:42.876 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -696,7 +696,7 @@ F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555 F ext/wasm/test-opfs-vfs.js 1618670e466f424aa289859fe0ec8ded223e42e9e69b5c851f809baaaca1a00c F ext/wasm/tester1-worker.html ebc4b820a128963afce328ecf63ab200bd923309eb939f4110510ab449e9814c F ext/wasm/tester1.c-pp.html 1c1bc78b858af2019e663b1a31e76657b73dc24bede28ca92fbe917c3a972af2 -F ext/wasm/tester1.c-pp.js 45000532cf83f23a52b31581c1db44bfb82e383b1b68703ae4d3d838de3a833e +F ext/wasm/tester1.c-pp.js 05a0143c44a4114aad0ed40ce73c528febc3e0d6b69f48a51c895d7030015b74 F ext/wasm/tests/opfs/concurrency/index.html 657578a6e9ce1e9b8be951549ed93a6a471f4520a99e5b545928668f4285fb5e F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65ad09f510589c779b7cc6a803a88 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d693c2dddbd10a2e0b77893b04b11502e30b768f1b06814105f7f35172845fb9 -R bdcc5096cc30e3d83fdf5d66602909e7 +P 3fb993af0caf041da934cea29c039b27c468be0b75bce1537a6425767cf9bf8d +R b579198e5351884de756285222a8e6ad U stephan -Z fd720e9f1383b7c5da4643ab36634ed7 +Z a4679fe65a08b67080b3faca6c413001 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 01d5aa1d3c..9f939bf3fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3fb993af0caf041da934cea29c039b27c468be0b75bce1537a6425767cf9bf8d +9f27379d860518e6e097a2c999da04176812260a61bf11fe495c3efd76971806 From dbe48d3c8d5b8278b289d2f76066dacb29e2efd6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 18:36:05 +0000 Subject: [PATCH 05/15] Enhance fuzzcheck so that the --sqlid and --dbid options can specify a range of tests to be run. FossilOrigin-Name: cdd0af6f86e49ade1339ad5a3cc444400a9722a9efdf84a30b3ff9428b7ac36d --- manifest | 13 +++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 57 +++++++++++++++++++++++++++++++++++------------- 3 files changed, 49 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 6bc22b6c72..747c094a70 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sfor\sa\spotential\sUAF\sin\sFTS5. -D 2025-02-03T18:05:54.347 +C Enhance\sfuzzcheck\sso\sthat\sthe\s--sqlid\sand\s--dbid\soptions\scan\sspecify\sa\nrange\sof\stests\sto\sbe\srun. +D 2025-02-03T18:36:05.574 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1277,7 +1277,7 @@ F test/fuzz3.test 70ba57260364b83e964707b9d4b5625284239768ab907dd387c740c0370ce3 F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 1671559091b3e134ec807490f624d306b24bd9a8f03b12aa97e292f4b31e5d96 +F test/fuzzcheck.c 5445da3b9b509759dc91c7a3c8d660f4056e25ae85274d6fe40c372263ad0bd7 F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9f27379d860518e6e097a2c999da04176812260a61bf11fe495c3efd76971806 a4962df665084e423e020be9a2834b6886a8e3feb461cff5358b61398a2a20d2 -R 0c55f60057cb31a548300850eb056c7d -T +closed a4962df665084e423e020be9a2834b6886a8e3feb461cff5358b61398a2a20d2 +P e33f2fedda17b4f3678fc23c438093c256b0c125da5f1ac42ecaf3d604d54b6a +R bf3f5a9cd383f24f2f19fa2e86a993c0 U drh -Z ecbc0f1712cef7fa05faf26775dcb9fc +Z ca078f36d189947e36e0ecf82c334d57 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2be9591865..7e3b1689f6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e33f2fedda17b4f3678fc23c438093c256b0c125da5f1ac42ecaf3d604d54b6a +cdd0af6f86e49ade1339ad5a3cc444400a9722a9efdf84a30b3ff9428b7ac36d diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 390d804df1..e6b9ed3bb7 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -507,7 +507,8 @@ static void writefileFunc( static void blobListLoadFromDb( sqlite3 *db, /* Read from this database */ const char *zSql, /* Query used to extract the blobs */ - int onlyId, /* Only load where id is this value */ + int firstId, /* First sqlid to load */ + int lastId, /* Last sqlid to load */ int *pN, /* OUT: Write number of blobs loaded here */ Blob **ppList /* OUT: Write the head of the blob list here */ ){ @@ -518,8 +519,9 @@ static void blobListLoadFromDb( int rc; char *z2; - if( onlyId>0 ){ - z2 = sqlite3_mprintf("%s WHERE rowid=%d", zSql, onlyId); + if( firstId>0 ){ + z2 = sqlite3_mprintf("%s WHERE rowid BETWEEN %d AND %d", zSql, + firstId, lastId); }else{ z2 = sqlite3_mprintf("%s", zSql); } @@ -1883,8 +1885,10 @@ int main(int argc, char **argv){ Blob *pDb; /* For looping over template databases */ int i; /* Loop index for the argv[] loop */ int dbSqlOnly = 0; /* Only use scripts that are dbsqlfuzz */ - int onlySqlid = -1; /* --sqlid */ - int onlyDbid = -1; /* --dbid */ + int firstSqlid = -1; /* First --sqlid range */ + int lastSqlid = 0x7fffffff; /* Last --sqlid range */ + int firstDbid = -1; /* --dbid */ + int lastDbid = 0x7fffffff; /* --dbid end */ int nativeFlag = 0; /* --native-vfs */ int rebuildFlag = 0; /* --rebuild */ int vdbeLimitFlag = 0; /* --limit-vdbe */ @@ -1942,8 +1946,18 @@ int main(int argc, char **argv){ cellSzCkFlag = 1; }else if( strcmp(z,"dbid")==0 ){ + const char *zDotDot; if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); - onlyDbid = integerValue(argv[++i]); + i++; + zDotDot = strstr(argv[i], ".."); + if( zDotDot ){ + firstDbid = atoi(argv[i]); + if( zDotDot[2] ){ + lastDbid = atoi(&zDotDot[2]); + } + }else{ + lastDbid = firstDbid = integerValue(argv[++i]); + } }else if( strcmp(z,"export-db")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); @@ -2043,8 +2057,19 @@ int main(int argc, char **argv){ bTimer = 1; }else if( strcmp(z,"sqlid")==0 ){ + const char *zDotDot; if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); - onlySqlid = integerValue(argv[++i]); + i++; + zDotDot = strstr(argv[i], ".."); + if( zDotDot ){ + firstSqlid = atoi(argv[i]); + if( zDotDot[2] ){ + lastSqlid = atoi(&zDotDot[2]); + } + }else{ + firstSqlid = integerValue(argv[++i]); + lastSqlid = firstSqlid; + } }else if( strcmp(z,"timeout")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); @@ -2292,13 +2317,14 @@ int main(int argc, char **argv){ const char *zExDb = "SELECT writefile(printf('%s/db%06d.db',?1,dbid),dbcontent)," " dbid, printf('%s/db%06d.db',?1,dbid), length(dbcontent)" - " FROM db WHERE ?2<0 OR dbid=?2;"; + " FROM db WHERE dbid BETWEEN ?2 AND ?3;"; rc = sqlite3_prepare_v2(db, zExDb, -1, &pStmt, 0); if( rc ) fatalError("cannot prepare statement [%s]: %s", zExDb, sqlite3_errmsg(db)); sqlite3_bind_text64(pStmt, 1, zExpDb, strlen(zExpDb), SQLITE_STATIC, SQLITE_UTF8); - sqlite3_bind_int(pStmt, 2, onlyDbid); + sqlite3_bind_int(pStmt, 2, firstDbid); + sqlite3_bind_int(pStmt, 3, lastDbid); while( sqlite3_step(pStmt)==SQLITE_ROW ){ printf("write db-%d (%d bytes) into %s\n", sqlite3_column_int(pStmt,1), @@ -2311,13 +2337,14 @@ int main(int argc, char **argv){ const char *zExSql = "SELECT writefile(printf('%s/sql%06d.txt',?1,sqlid),sqltext)," " sqlid, printf('%s/sql%06d.txt',?1,sqlid), length(sqltext)" - " FROM xsql WHERE ?2<0 OR sqlid=?2;"; + " FROM xsql WHERE sqlid BETWEEN ?2 AND ?3;"; rc = sqlite3_prepare_v2(db, zExSql, -1, &pStmt, 0); if( rc ) fatalError("cannot prepare statement [%s]: %s", zExSql, sqlite3_errmsg(db)); sqlite3_bind_text64(pStmt, 1, zExpSql, strlen(zExpSql), SQLITE_STATIC, SQLITE_UTF8); - sqlite3_bind_int(pStmt, 2, onlySqlid); + sqlite3_bind_int(pStmt, 2, firstSqlid); + sqlite3_bind_int(pStmt, 3, lastSqlid); while( sqlite3_step(pStmt)==SQLITE_ROW ){ printf("write sql-%d (%d bytes) into %s\n", sqlite3_column_int(pStmt,1), @@ -2333,11 +2360,11 @@ int main(int argc, char **argv){ /* Load all SQL script content and all initial database images from the ** source db */ - blobListLoadFromDb(db, "SELECT sqlid, sqltext FROM xsql", onlySqlid, - &g.nSql, &g.pFirstSql); + blobListLoadFromDb(db, "SELECT sqlid, sqltext FROM xsql", firstSqlid, + lastSqlid, &g.nSql, &g.pFirstSql); if( g.nSql==0 ) fatalError("need at least one SQL script"); - blobListLoadFromDb(db, "SELECT dbid, dbcontent FROM db", onlyDbid, - &g.nDb, &g.pFirstDb); + blobListLoadFromDb(db, "SELECT dbid, dbcontent FROM db", firstDbid, + lastDbid, &g.nDb, &g.pFirstDb); if( g.nDb==0 ){ g.pFirstDb = safe_realloc(0, sizeof(Blob)); memset(g.pFirstDb, 0, sizeof(Blob)); From 589796cd890c8be02a92dcbb3e2a0bcb248b6a75 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 18:49:06 +0000 Subject: [PATCH 06/15] Fixes and improved documentation to the new --sqlid and --dbid range options in fuzzcheck. FossilOrigin-Name: 59e26632449163a36b803cc7027ed99c1f6b675dda6f0b2b12bbe55884923f08 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 10 ++++++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 747c094a70..5abab47021 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sfuzzcheck\sso\sthat\sthe\s--sqlid\sand\s--dbid\soptions\scan\sspecify\sa\nrange\sof\stests\sto\sbe\srun. -D 2025-02-03T18:36:05.574 +C Fixes\sand\simproved\sdocumentation\sto\sthe\snew\s--sqlid\sand\s--dbid\srange\noptions\sin\sfuzzcheck. +D 2025-02-03T18:49:06.094 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1277,7 +1277,7 @@ F test/fuzz3.test 70ba57260364b83e964707b9d4b5625284239768ab907dd387c740c0370ce3 F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 5445da3b9b509759dc91c7a3c8d660f4056e25ae85274d6fe40c372263ad0bd7 +F test/fuzzcheck.c 6fc952750a69168dd5fea38b9d35cb38475bfda15c8acfd156ac09cd03ddbd3e F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e33f2fedda17b4f3678fc23c438093c256b0c125da5f1ac42ecaf3d604d54b6a -R bf3f5a9cd383f24f2f19fa2e86a993c0 +P cdd0af6f86e49ade1339ad5a3cc444400a9722a9efdf84a30b3ff9428b7ac36d +R 97da3e589df10edb12f045b63fd334d3 U drh -Z ca078f36d189947e36e0ecf82c334d57 +Z 5f22e1474f8086565da475538650b809 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7e3b1689f6..a080a639ab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cdd0af6f86e49ade1339ad5a3cc444400a9722a9efdf84a30b3ff9428b7ac36d +59e26632449163a36b803cc7027ed99c1f6b675dda6f0b2b12bbe55884923f08 diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index e6b9ed3bb7..84e3f32895 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1838,7 +1838,8 @@ static void showHelp(void){ "each database, checking for crashes and memory leaks.\n" "Options:\n" " --cell-size-check Set the PRAGMA cell_size_check=ON\n" -" --dbid N Use only the database where dbid=N\n" +" --dbid M..N Use only the databases where dbid between M and N\n" +" \"M..\" for M and afterwards. Just \"M\" for M only\n" " --export-db DIR Write databases to files(s) in DIR. Works with --dbid\n" " --export-sql DIR Write SQL to file(s) in DIR. Also works with --sqlid\n" " --help Show this help text\n" @@ -1863,7 +1864,8 @@ static void showHelp(void){ " --script Output CLI script instead of running tests\n" " --skip N Skip the first N test cases\n" " --spinner Use a spinner to show progress\n" -" --sqlid N Use only SQL where sqlid=N\n" +" --sqlid M..N Use only SQL where sqlid between M..N\n" +" \"M..\" for M and afterwards. Just \"M\" for M only\n" " --timeout N Maximum time for any one test in N millseconds\n" " -v|--verbose Increased output. Repeat for more output.\n" " --vdbe-debug Activate VDBE debugging.\n" @@ -1956,7 +1958,7 @@ int main(int argc, char **argv){ lastDbid = atoi(&zDotDot[2]); } }else{ - lastDbid = firstDbid = integerValue(argv[++i]); + lastDbid = firstDbid = integerValue(argv[i]); } }else if( strcmp(z,"export-db")==0 ){ @@ -2067,7 +2069,7 @@ int main(int argc, char **argv){ lastSqlid = atoi(&zDotDot[2]); } }else{ - firstSqlid = integerValue(argv[++i]); + firstSqlid = integerValue(argv[i]); lastSqlid = firstSqlid; } }else From 0d9f2a15f236dd87b05d33c8c1e09df1f4612b75 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 21:04:21 +0000 Subject: [PATCH 07/15] The Parse.addrExplain field is never even if SQLITE_OMIT_EXPLAIN is defined. FossilOrigin-Name: 5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/sqliteInt.h | 2 -- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6b13e86cc7..678cea2b49 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sfuzzcheck\sso\sthat\sthe\s--sqlid\sand\s--dbid\soptions\scan\stake\sa\srange\nof\sIDs\sto\srun. -D 2025-02-03T18:53:02.874 +C The\sParse.addrExplain\sfield\sis\snever\seven\sif\sSQLITE_OMIT_EXPLAIN\sis\sdefined. +D 2025-02-03T21:04:21.029 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -785,7 +785,7 @@ F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf323 F src/sqlite.h.in cc9a2d5a719b7434e2699ff7c28a56209b8aa459b7f80ff1d4d7d8ac6ebfd96e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 7f1b070ea3b4ab3c192be553810684f686fdb03f62f90afa2da64d4d61d91ec3 +F src/sqliteInt.h 9d7052c71f46ca3a1a4880ba4a62590da334651139a38327d488894d9c883f3b F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e33f2fedda17b4f3678fc23c438093c256b0c125da5f1ac42ecaf3d604d54b6a 59e26632449163a36b803cc7027ed99c1f6b675dda6f0b2b12bbe55884923f08 -R 97da3e589df10edb12f045b63fd334d3 -T +closed 59e26632449163a36b803cc7027ed99c1f6b675dda6f0b2b12bbe55884923f08 +P 408fa57f048e05a261fb62b45ae44b8a97c97fc01e3776124cbef6595df579d4 +R 19f75289781fc56c637c4500001f3f36 U drh -Z c70a3622de374067746199fda23d1690 +Z 6ac8bc953e7e25c0d28f52d6abec8109 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 486d200235..3958477534 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -408fa57f048e05a261fb62b45ae44b8a97c97fc01e3776124cbef6595df579d4 +5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 diff --git a/src/sqliteInt.h b/src/sqliteInt.h index a37e0523ad..f47009c158 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3914,9 +3914,7 @@ struct Parse { int nVtabLock; /* Number of virtual tables to lock */ #endif int nHeight; /* Expression tree height of current sub-select */ -#ifndef SQLITE_OMIT_EXPLAIN int addrExplain; /* Address of current OP_Explain opcode */ -#endif VList *pVList; /* Mapping between variable names and numbers */ Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ const char *zTail; /* All SQL text past the last semicolon parsed */ From 31615637f39f2f31492aa3a0ccd658609b43409b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 21:24:40 +0000 Subject: [PATCH 08/15] New dbsqlfuzz case added to fuzzdata8.db. FossilOrigin-Name: 7ee20cfc237229dbea7116149c0c35883f7b8087b9ccdce6dca16b6da1c6caf8 --- manifest | 15 +++++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 4241408 -> 4248576 bytes 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 678cea2b49..068fb48754 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sParse.addrExplain\sfield\sis\snever\seven\sif\sSQLITE_OMIT_EXPLAIN\sis\sdefined. -D 2025-02-03T21:04:21.029 +C New\sdbsqlfuzz\scase\sadded\sto\sfuzzdata8.db. +D 2025-02-03T21:24:40.271 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1285,7 +1285,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db b8725a5f5cf7a3b7241a9038e57ca7e7cc8c3f4d86b44bd770617bda245ab2b0 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db deb6533e6dfdb5841eb6a56607bdb74986a57f5739f3975ea542a1f7e7e24d97 +F test/fuzzdata8.db c6f9cb7d2b808fb10894afe53ef00f51e73e43baa7aabdba7e9af4713fc5b186 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -2209,8 +2209,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 408fa57f048e05a261fb62b45ae44b8a97c97fc01e3776124cbef6595df579d4 -R 19f75289781fc56c637c4500001f3f36 +P 5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 +R e9d4a9b352c2eeead9d5e811b3c4d6de +T *branch * fuzzer-20250203 +T *sym-fuzzer-20250203 * +T -sym-trunk * U drh -Z 6ac8bc953e7e25c0d28f52d6abec8109 +Z 0c1224a47cf0d41d32dbe16a001a72b0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3958477534..a93fba674f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 +7ee20cfc237229dbea7116149c0c35883f7b8087b9ccdce6dca16b6da1c6caf8 diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index f03f3f27191ee07a1014d1babeca93242543de8f..469df2c681a13064074d0a6e2fac0cf5939dbbcc 100644 GIT binary patch delta 40899 zcma%j2Y6If^LNgcWH-B{Kqvu1w)brA-Q6H1z%ETX8$gMB6D{7M{L`5ZJME&)zX|cK|CxMjF$VRCnWTn&qn^(7L=~addQBkU2LV8M%g;FW~IMjyH%1|<;+d{1< zeI?YA(xsv1l!il1;rG?8E+)?jwWn4d4bhO*GebT~XN0_zPI>D33$5r$rl&PMZRlxB zPYONl=t-qVhu2@wNBg0e8GnJej?EKMSZT~-5Z~Jx50&p5C$qbt)T6o^N*C*cY!Zlb z43pvFX?+s~aWEGeCK?yQ{4@H6kh?_xsBF?iVBHO~n1~Iv`sNI>(u~$-854aO86A8c zUq|0WpP1pv=qN(fY2&>t1H_PV9B=4xXn4@L77H#IRx;Ke%a-ZKGpMwxTR?4=(FsSs z)th;-dC)M;xQ)d^VS{N86M>cJ1^QFBO+N_|elq;PIzU01;W{rmAF@0K7xes5|2|YN z&Mtz@zCNCRU4?S)*Go>R1{==YG@7hhxO0GuFLxF zQ2m7d*I41!Kgg+53sC!~Nu#}u8Vi@E7<4QL>XsSvG_h%Eu|seTtxnX_h2oTwYrD=)J>e8GhymPgSB&PU{GMdsL{PT$MzgDIH;TD z?Hnu6|9cJSHLRDe_mIH@btC%p8q!ObqZ=3))}xQEM__0#-7Jw)2kB<(hVefg#f~~p zM^WH17e!sKK|MRi4uuijJI8~|z%(HItdEDRyAzY)aL%9$3Wjo)~1QQb8Hh5 z0b|pm*tB;NkKM;qTOJN2Dx$uh0>xX54@2eAW-2&#I>`*>n^di^=t2D745N@1O$){fq3~6!fTc_Hdl?D?jcx|1Q;fM#Z!t{f^Y#Q3 zma45#-peoz{P~7TEVmiF40MZ({g9S{o3Vvhkz*LiFqmsR&-euIW+AAUXy^&KIW z^W0RWY^sR5xZp3Qk(jnIto~N*Vj$EdRY*&nvz|}SQrAju#KTRO^)ihDlycI$WPqQM>iMB>*Ce$Lw9333~Os>%}4Yk zJw;Hpq+?4cvS-FhnMj#$$yqVv9aMh+Hx?M@!y1pOBUaBggk+qLWhizxOhygwh`j zsZw97p<;({CR;TkbVh&!PqnF7rd%bapRO3Y~_M5Zl9J|Zd z0KzOyCi*)V+cSK3u%W+#t=-ySjHe0iV{8Jt5r%VY9n|F;Q?dSpF@gAgP<0O!%r%_F zDWeUm7%Rn^)5dfLrERqe^j|dT83gkU%kYPBhGfRdpysUcI#lj6q@$Q)_*}+b!o+G? zsZc&vH5cEUXc!@5FGJ#CJ>UzI4YO3NB_!k-ep0W0Z&av-BI>vHd?sJREi(=MnQ{$D zb^|7UtNxL;M_p2)B)V52@jKHZ$eyp#+?qG9oNa`1lVJ}8HR@*g)jWeu&R&DW%cjdv zJwn|IYR?*7(v$&B*){04Lf;x!JYks5*z1tcRdpX!_RTB>UA2A+j!!f`Cw24&`hPVn zroH7clryN!QQ4s2s6HJ^78|CqH=%)!H+rAI*H8aDZOKjtcN?AONKg?WcUu`&{WEEJrT-8(tAUj8|!3Ccg z!i??2;wGHr&oo{E;kT4{_;f(iB*-Vzf#;K!|>6lpA_OD@S_=u364=}MVX%b06VH^QVMi?HxCHHjB`iD?aKzrfx zNWC5P&ep$sbXj6*qbFIGHj zG_$`;9Y6ieFj2wUpm^1wW$Jxf4WZVGs2}?L#ik_vM>wxl^n8Lj*~WEpNI0b*%bVQ~ zIrke2Z|wp>4z-6=blOL$KE<5L#$D`|$bXPHK7ct>jkIC;*>&eec!=?BAXPmGfqD7> zKgC)zz8PMTvClB?qJE$Z{TGZ=89$$UvqPW@=>w1uqcB5!7usB}J!_Z;7rjklFge-y zgN#)}-KEyOaB-1AWZ=KvVljNLYVkdk#BkA>h?iV~m1*4poPf z+hKWTQN- zIp5{K^5RD!H!gG2Ef6xvIq}O|2VpCfGL=rANnGk`8JG2U+v7v+V0w4sW@YWW!B7h5 zdl+Y^j=$SG)K(GI0A;Z){ZPHdXyRpS=s5uuOXSIaW8EmR{uR`m)W3q+SM?*MZcjqs z9{mx>y=LqH**y%UP(Mwb2>vmK7jF$>kTi%>7#OAB`M0_HALslu)STDX0Zq^l)V)i) z394gEDNwXZ|2oe;12q@)-TCHuf==n4W&whtAp^5L29oQ|Q%tjMj8U#&by%_8&|ikt zi}V#zuVKrMFxLf}%?>`2ph#>>M_HZ=myqAq8m$I!Wz*gAENltNMP!NvyqMNR+7GV#6x{7#^3@j4k83>D>y2I+`xyeO^n>AIj42+v-DQj^38=Kt@==w5>o*$5$=MYQ ztkKg-CS||}@qZf1Vaz3?2QxPt>y%6n?Y0=FD1Y5GG^E2NTZ}X1%1gw|Z_uFBHOG5@ zF_y`e4Q>iWzv=GkE~W5AU#?{g3aWHSpax#%1u4(sUKm_Zts0c9rj=mbgh} z8Y+kBhm0%OHOPsRx4`U+#!?yX_}ti6$!=i7`-Y$lOaCyw$!A_21%ZcD$yjjS&`lEd z1}393v|*3I2s3UNi*K@#Gce}%q?!Mc6MJ)hW-qc{}!#r(o@E4nWO*#$?P4bhMGU4+if+N>f~gO1-hEM zfZvh%lO!r6QFWEYXhgvy2qNw}Z|pATt8fb+k`@BJ%?m+Sr|xoV_7hOm#AJw3k_C2s zI?$1n`+WT*)jwzYZaRF_(e%V)AXnRzEC*42FC?7FtVf~Lx=vy`0Rzu!TM;%5H~j#@ zK+DH?u$`$rV~G$b(h?p&*DV@Lbtclvn?lZM%Mqw7u}#79XRRG&Q1FsE#CdE64dJc} zK=?7~1MF!x^^Q@R$ed^oRjmypA^vGo@;1?QL#B+QqAf6xpyf8qElx^DYm*t2++~`^ zT4Lcbt4fC2PNv@&YXyZTt#0&Wnrh@M87jU_+JLY7O{3(jHCFtPG??^tSKIw|QP8B!klHju z;27N_6g=io;Psg{86AkttmTm4wCBT_HR|S|d(3o>Sy4P~ zQIaQs<_KtxZs3A`+r-d*Xh`KuN z7OV9#rIGk_LD?ehj@xF8*!)duGYyJoX)A9nogG*|(?sS#kMuL6r;2$qAoppig=Q z56f74TFkU~9^YbGBqxte%`2ML;Qz>)&3OsSp{BjHFC;ij8XWPyX=bc~H0djlvsHd; zc^&0Ecw8W4Bt@e z81H<6RJtoxjWHFr3N^n#4_hJ2NGJo8zUS_J`dT z^HDsZGTY^B0I<1yB3@U;fcp*A99*k4Pn5HPP<1(>8`LLu)Plch$6?s%YC;!=wTWh< zj19Wg8R?z1Cld|0-C(9|rTsM_00l}jw=UF!VY4i8{jIJqF#NH#xfNqU&?gdK(=R71 zyRG>tDdtr&mIcrCZrTkFP3hPg$Lh=*;SPTjKQ-j=C+JUP?^As5y4rPBB+o8c{CR`W+;#5^@ zY}dj3jhu~yhIU%A7ccK5{k=#2Qlw7Y#E%E@$IGJYwpPgGZXT$XPas$4zr_!5DKmhE0IM zubCgg{MqK;$W(d2{A09IP(-bp2W1uVKJc0@E)LecXl|mRaZD=i6e6SNC14qeeyFXG zt8e8`)>8icMdLzlMO2xe*X<7VanUMR^`beMZR50G|${2nmqvJ zee7)@c-5T4=?i1ngBV9Vn9e# zM7`0Lch?^ud)mB6rkqR}Qz3D-c{;Xx#(bKr^QC68YNtWsJaZCEFEb}Xx4jl6x{J)s zv`VicYHe<$I<@*VoyYy`8^J$4DFJ4@VO|2`*O^O|)2YcksF-Aa4|kWEQ&r4|XEvI3 z@|ax8m?g$SnKr#G*e{t2@TE7+Idb+0R6W-@6^-TQC)J7!Mb!3)ML+^ehU#HDC2Dq< zuQ27qRDCwqtu?n{n7Y%fQYqWt9L-2xt|ip3jhCcv1J7PdQ#|*PxvebvF{<|XU67@+ zkhkD7a{{!pTF&B$Sc`?>!2RZJjLpMS4vUfDi8zV&8K=!BuU|6{#HU*t@I+II{yC>F zz*8P73nyAwnqj9S=1*iS9|nD4wxR2o`Aaz~z#lqUTF_zkD)F6q%KWvA6~Yf)EjLhJ zXBJ`<9TZWO(&5P0LoyVdH^;>;+}km97unO#&f=mSx$S#1DFAbc?T}=`fj?TO!Zth1 zbqqC^%)c`hhWZBcN|>?P+yvG&n3M5?dUHU|okl7R{+AT_3QH0FM0E@CS#b=JUmUo-11$y3p#Fz|EpeUSa7nT#mWG6%j& zwm2}Yx#g&gJ%@=Imdi3|ecZec+(*nYaALAtL#nk=1t&XL;^FHymQ+>*DJRVDAhxv( zh+)g{foMLV4zuOBjGT}ODoZQy+bnS#G?66{;nczyc_CNpQt-Dpi<;KTXEcO6_`AYZ zz;2(VH|UyKYX9O9iN~QbR>Iea4oyDG894(e`b5_iM;KDA#-Dzr4|?Ww#??fNc|t049MPUnGC5b)JfzB(GCIKe$zfY z)YsyZu@|9gsjVKm9J7#f>TrixOc-eSS;p4Dq7z|q8k+Zc>(N;^Y%3+odV^}HO zZ&=LWPqo`|$QVn7oLr5fTwRFaY|8>UdkMrC^+bH|e#>e(dzlU}?O{AN+2WM5S1@m$ z^*PeHZ?tO%<(I94Ib^Jdy!)&Za8j;iO$>V#ijDHlSg*3aNBaM})@gUL{2i38p=qF6 z8$Gci=IyXPM;i5rxDA-O!16I8H)CM8b~n_!tPgWNE)%>hJGX({<)$>;QE2HaBM)QN zQ1v}HDr9+Gu6#rEdD=rDPo0Tpn%F(0Q0cU(xZ-KcbQ$>+b1JOmxaC>P-WX*!MbuA( z6ME}dIJw+1S-p8@%TQNE)Sn)ShOe)%+#^$NAg=q?Lo*#ONb$s&9jh+E$K=L zVe4^7>2JLY;@`7eVedj&fn^8|f8Vl6PQJs!=GIqX@axtLtgW;d(Ia(tYbT##2IJLPIWb65m>azAnZIVASB%*9|ITMHS#27L+ITdfD#7ZBKCoegLDtJ~sAoAn_%I}BC# zS<)fJ^ zT=tRA`Y zIQ3gc7af)(bkMA`lBpG?J_|K@+5q|!ZKSgoJ*>^;_U8vI{w{(00z86O;1|{Bpl%S^ z*xCDSZ{gm_)-H1PHRL^|Cbe;@mDI*>pkYear*Ltu^~D%vADWr$X!J8L%Vku^!dwacv& zV^}@ZRj7wRk(+F1U5#ZgP0Kp#hpYi}V!Mz%mD|TUR$}TW$m(PY@(KJBE1$Ib8Q(!G zB&L4GoTgM361JJ%L^?^fFm?qRJ~Fh%V0Y6)jYk@v$X;w)xs}|XzefDFwbj;*bQPJd zHe>E;Qik~K{f5kLBVf(GV)=leElK+nr~Zz4FY)8Qp!^ONfLMs;`F~*E2Fgd>a$A2H zKg?~nKf62MQ)pi4>mRmiU(OvLG1wR!?5W$>rn9T&0K`(r>$QwSuBG(1D&o+xsfJ;@&1Ri7|5zINgU8k(&f3@g;@Ki z)yS9%vW}RR-{Rs)a>XoB7vaV0))tJZF;B-km+M+U@O$fsZ3^4F(TV|zsQQS0PLeW_ zT@kC<-XYYV&~?_G0_I!7LXwP?)1!^pVF^#!E?~lZD|t)qB5D)JTCV;KNT@%+q5CQJ zq3Dw8b2zk6BVxfki{#Uejl;6GCKp}QwXl7`SUi;JOmo2PwstL9VVVc0-PTXGwYJG+ zECCDevE|FKvYnPJ=%Q9#y6~Au#KKXWTE5>Jq-C)|?ZO*In?k{wL7CU&!SpFMez!Kn zw23p&3_o_*G8s$4Kp!jlHc6PLv39>rM=RE49nKqU4p~2|nt?w^=aIiu;{>77+6RfB z<-t%1H?+YZ(Oil0{B{VykUHhFQ{X;<==T4M1M^<8wX7Fp{tzIB%nv3@=16y)yzQvyN`Gk=|#9A?biITPEO9wV~P zEObNG?m^o(GG>ChJgtbN;ntFb>d5(9ZMUw4qOsb0d2eQ@dqhh*^~|hVt!Wo(r}rbaoie(!WDj-S&Q-9_B|sbmfC5UtMGy zBWEtc0@Em@GlRS$X;8IF{Q>0utWt02Y+_h2z)H@g%ja!o>ELi<;Z*Cdw31F+_98hZ zdoXhT<;}LWlfx#o4TZ|jG8c2^1*lqMYKARev|Wf{9&FIs+>Cek89&lvy-+NweYmsE z)3PAp2JvU7XE|Q*3+R_G+{;i?q9cITbc= zIf?Xiq5u^~JFJeg2~0ZUNYl&0%8!U|))~ZX%P{mGvu>1^oVUe8=KYp5y!@awk&vvJ zwemK1ZoR=Yo)4i5vTu`akQTm&jyxFkh3$3L71<9-y&3j9Vk5vGLRaw%{yDj88EovV zPXhmD%~sA@M|uLt=2#}t;P={wa!K}jU-8?U~rSg`KIC!^q(G-6ie#Au zNiDTk$do~9U?ddWFc*MuQI!If2kfy>{{Xpebn{}gFuu&(6pv@x9o*N~z?!y%%x?B~ zA(u5BiOzt%Rg98O>Rn^FJEIpa>0_rWz7f>o7&x@lJ|Byw+2=4EFvcD&?Uk{p2-=s% zDn=-xwt{|((T_(*+wDwwFV)C~s_FJVye!ID4l1(kc`5}NZRHW2`LiYVL@1w=pn}Vz z?W#DRK*5-?_pQ~0Mk=D-k62hmZ4%<)Rym|{O&AWEVy|Gz@l^Q!2rBCCwVUwnsrL8f zY$7xavUkRAx%NFV>;Y8Fwim0EqZLt`{LfcR>h@PtP;`RafD|$phiwY&U(1w}sJSU1 z4zz!Q2SfIqDkYthuMOvwkop&8$_J^yG%UYnr)$H?jHEZE18us`BT(ez{m<7JTA+Tp zJx$HV;NUg(a+z`}mCvJyA3H_-l-u{fV5_47Zzz*iN(*QvB%ZTh#_BD0fuV7OJtJC4 z5fr;T5|`;2O4SM>Ne7pvlRs|v343cOKW;Z*+$MX2Oi5nA*hjExs-uYE@(TM58G96~ zavj~|a4j~eE$C)BmVoXzdlFwpk3rQeM>e#IaReZHf=X7moZ)=+qO#_p97WUz?%RhonjaCNvKFCis5@bQO<7PnHZ&fd z`^ui%WUf+fhLDG)fW zHteMIOqjxf<4%Vu95^ojc-TgN_JysK?h2bJ-5MsGiYpK6D19|d;lOb(gi|Oj2~$vT zTv3=1Ic{;7LWAQLgef#Q?vXIv494Y#n^F2;m~@c1iQz;_$A%Lq9UP9Qv`3iirns(Q zLdv*|a4eX+H>26sUGahBFJ1l+Fl^q4c2;-}aM3qbZ#b z8b#^25I;IbhlW!+JaiAGgG0k8y*o6N(r%$4ly(SZQECqbDbTg4RC_NMEMd`5+tp;^Ul%5M#IFvMB;ubBlO*Dc!X$(E#bJ^`{8M2X zef+{OjXpjty$drO`DAXYtSvzolT-^j8Abg0O)2wfrNurKsSi|Nz#hNaE0yf&NU!`@ zo5zbhg9Y`(1^Df4r1!;8tVnV~<;=DT*iGS}gLny46x*9)aHFFq86wjiFH48WQml?n zA`6T6hY5L(4<$f(4yt35`toDUj*lieR;$>3n3&?YBvU?1eJ#VlUOTx({Wh%~gQfOX zQl00axF)3~7B$$(ilj635w^|cs8cHMS46$5yLI+#6_TWg=-6Uvs06EeJGwC(Jk3!- zmhp1CmJbE6svl8HMm70`v+iVYaD%-i#5GAW!T3Rr3EMIqlNHKIbO+J%R-O!e}{^w0x}sA{O0 zNxns%Aq|s9z{b9UqSkSUf|{a}(zwvpL)H%}9YjCj$i`5vBVW!oK+Y=1Yq)8aV|WY& z!WL|@@5TM|936QKY)*yUdux?W!+Q!Ho5>}OIa}>vhEInbb7GWJ$kW;HmK+HQFGA;~ zjwe-bzGMkK$YG}VSW1K`%KK48EWAq3CaBs+i!A-3y@nLQM#v?NH7a&9lvy3)Ir#GE z(#F;HytD@2f-)!1QYW>hh1dw4wU8U*SPIqI4j1Haw-1A0jzh&8qF~D=N%Zl95Ogen z89&FU@rN~zWbVVxnajFSh>AW2iWX+5A=orlgX2ma>tonEnAO|y76V#nb@0tdMFA(-catvkkRs~DU(1q2^BLysa;#;_w~6)bxczfS4`RIo-K!0#a$qz? zyWU;pn7m?q8#TOJ<(P;k_Bk{v<#ZD8qf!rFU2)J?2&9_9?tnFhDbc0pUkNymo_R?PU7tVR2GqfY12Bt;(qK3jmitz>E!I_ zm*CtkkN!;h{sgk7`7I!{N>-vT$w@co)u?F8YuBJc=Nu5rW3jE$!;20(zln7TF3CA(9CXK9?)b7r&86!9J5h+{YjWqZbCLSjOq^i6d;D3&E z+U`-YCo%C<+GZIhxznYv&)8FtSeHh(`avh%>QkgAlEe<(>l5+0Iw6k^^8&#sZ6u2F ze2-_1_tCw`Qo)YGezBUBJR!6JVT>~l>pP~;l?v8E;F#DOb1$Y9QIyRjXLG3hzdwGa@DL*3WvAjVbeOxGN zs`&zKh|AI;pSJ<{^SGu8fp$vPB6#W4#zL?4rh41M4R6X$MYgL2 z`d12VBnH2M(#L$+Q15o8;rUepUF8J77DJHsu=6PU7T81?-OA2#(yc6A#O3pX?VatQ zv^q_TOJ_SDk+btqy3m)6@2wYlk@uip93i#(J(QI=Tf(9Ld75DUYeE*oIfc$=WE4Q! za5$|Qlz)*%%zY|o;nHGXQ>gFGJKsc|WAOLJ7Jh`%=X`cdTjV^-qf4u{2*h*>jS){Q zbGMJNT{?{=wQg(uSQB`AG?m|QSP)&fh-?rbVu!b@L<(se|CuS!UO6OW}^pwjN9 zV5r&Y@zUz5htijMV;@P4B{VkHK-cn|`iby6MQXm}e3h}EfK>^taCdW0K!#&CI5#kg zFD-qGnywbzO>ke0(1F}*o!ugyc%Aoq1xnxHO&pOL)-^W#3zQ<~=D5%i*OWUa$;lO7 zI7iS!!6_jfhi!4v_c6bLc(2cf*FO>|!dMvL)WGh1A%MYs;**kuf5*Ta?{11I+3V{f z5&poyd?G;Ze&12J^ngrVa#0w^*TSC|D3nTm)>!g?7zj&*&l?F>G4Qlhb+Sx>!shgj zQiInh7*{HGqOsU@3c>YKJken%#S`6tvI{~Il&++)E?wcBNt~SZ_2LyZQ7BGxA0od? z8<`TjszjSaWgzCcx1hZ;y$_eUMuy@eR0`X^;!TqZ$Wfdl5jHjw6e!M@+PUm(g0=0_ zjEpH!Eaar3Ax<4RpCWr(6OCe+Q`>IwCg8bWojS&1P<)z`4)yieuw0g*l)6x%xP(*7 z2c;#EYs8x@QPn6GOO3k381%bDi$sk@afL)RimBLnk2g-DYCv4&K7;2}E}fidQCves zuvExx;QB(&;!s@gPL^Rx3m1JK6ps~8d(Kh#SWoKYQnIT#_d!=I@eGzh z{#))sDB9$1gQZ0t$&F3db;WPHo8#D1-j_+Rj*OmC=S{I+ zVil(+obejb;mLSLDxCxsYdlZjlP=eMIep4iQ6^RWkg5iMaZ+EeH1^d3D%N`@;-&`g zR`RE|cYVX?tDwZ!NNx*$@jgM*=oi}KxYj~jsnu4XFA@E4W0U6$u4yZr;uc*^Zk6V^ zG#H%jdPhm#?_~9IvU&d^Af}6(vH*nK9{swLu=S^^X#zo-f`Wv{> zo%=t*P2>I>xM|WG!EL3Bz)kp1aMOtYpWvqP{2$={o~{{e2Vy9nIKXZU}C8^y2u z2e@h4|NnxUhQ1g6S8#jJb(Fr(jey(xeCc%j2e?(b2;4f|25vy$b`3Us>>5kX=6|5u zCoV#_%>Q3>({yP>w`v!mTh}|#?Wl`zqualso5uf7bUV#U2mViV(@^-rKhaIo;|_HD z!A0oS^A2>o)eKJzq<(C`rM9gS6zf|egAKC)Aairx@r3V z2fAqn{0-eS1A)+O8r^%QEt9iB|AuUu!GA+GO|TK!+NKe*W&Jm@4f$7O8~Qh78}@f( zyXWu7HvFH+HsW8AZR9_ZZPdRa+vtBqwtN2-*~a`UvQc#FU&uyY(mRoD{O!n=eFw7T z{1e$G{5P`Q_piuy|9>Fc#D7J$Nw*{01OJU|lmCfq5B@i@P5C!ud*~m?HuYbTZQ6e$ z8+}Ide)wnzVoY}?W(+V?TsUFT^o z!{i-lKPcH8OugW#lS6JNUmLCq%;iQLfA1Q3e;iYvW2eC~e(T z3Dv)f8r*#_t*4C5$JDD*;eL_A3$~_ud0T@bulbm&klu$x-U}cwLDmdPQ`{=Zb)+wb z^6S)8waP0{o#Bx(g_x@Ku4cHlE^VTWJ%NRL#C-W*8a0qcO<~SanuS=nk8*C=a8NMV zO?O*Snh+Kq;8oloIJu8d6UM@7UT}mv8FELs$?F!Sc@kKb+Y7;Sz8IYGtWYe6;IT-v zPtk`rymmoKQ!P|JFZdyNGLo|h0^`X%TX#|%%J7kEX-j3~Yb>ngg~!f}boC4te$C$p zC#5IBSNEioJ19!C7z@vf6h=2d?M4{|%NAacinL8va=VNIlNLD1Hxi{;f`#=`jxOB@ z1y4BXUMNbl6bi41N!TjM{iB?sVGDnkO4!nqN_L1^nE#BE?q#AhMOb)M%5bH7;JKwv zir0wJ6mKo`aNd?hcw2^r3hBKh^8P#)s-*YTk@w{k;wHVXjl8eG!UX<)?KPhy#u6w@ z@;r|DK6i*>WU#Q6RQUBs;gwj}R(jtYd0&NvI{scePEf(2;`B#2L#wgS#EHTlQEKr8 z%$X;wBhl{@rBS>HIRyfJ=sv(bSHTEny$mWIbke7X*V7DGe^MMRgLXYUXJPc`5msNq!k!+v3}Ys_ zuQCdTEk5ofTVuJmnwI2QAAQ~(rFjL!v*c44xYGL$5x@1dq6-hrdWuW~@d0-RR(|WF zn3VF}-sbq)8gDa(ugr9hXXIwAIpZ`!y-aM0yN7uK^dk|ExkD5`n>X7{D)4MK=`kCj zaEQ~5{Wf~Hkz5i)sk_&(?VH}Osi!|9-MI_8 z3#yiTCFAKM>ZoakL@cK-;JqDj*E|n>idVVRZ3b71j4`~;3J8>V17sbfH^bZm-Xb}a z%OefHElClCYHtm;>mr^dC&eNUh5kor-hrB@JPv$oktd7f@dn9b3p6CVTI0HBJvl^q zizr(mr?pEmuCj^OlisF~?8xBJp_*;bw$^($g;j_Jv}{&Jnnb7^DUuQQuA7XwccJD5 zPb>P_nT)*=)9w5B-K{BJ7TaFnBh`tn7`XhQJBjTeFLkb#*zgzN;&N;qD5_{^;ORLqfld z*__#3keKQ6tQh3`4uXHWlW`F9y-nu+kcfzOqu)Y3Q4ou6~W6=W8V~rKHWWach=E|vRlQqyur`0VVYFz-Ns^HU_%}eAo#v`9?2c4V(c(BJi^N~ zbEnrcir+14psjc5l+aX$!aSi$;^Qbb%$M5P*VxXN*ia}D4m1*uVMACVR5uciW5d(J zHO5_v4-()$M2;u!OC*=0(44b&0vnb{6^=Dl_zD|}CBn%@!bxmcL4-S;htl`znp4=Y zis#&P8GZq!k8{V?8iBsGiPD_LhBZ=4=Nnr(gAHX8;X)&!78}+}g!)E89X7ls5w0{6 z&eDyXMEG4SU_kCba>Yk!==1jqiF&oM7=8S{l?Ypdp2&pJ7w_Ap0*XcgeeAwdBB(qc z)Au-!rQ6A)*-#}&Ucimqk6E=xNWwv{@J&K4KWPBpW5Xv>rKHAIe!zx<5}{Qi;YX-x z=AmlkQne$IY8SBKh*V0~Sn47+947(;ZFQ6>$`Ad;@Kt1Z8kO&7F2@R-!QX*7~sqCif?-wqnpHTmd zlykVT=+CHMDiMw~60V?r84xT+97*_QwiD8Vmws8m+occs~p5j)c)>_hov*z zGjF*DQEK525Wh}0bJySrIU{%FaH*rm+=bjZ_`X!+e^A#hDHqINZdgqa?$JJMBiV5Vmv!&>Ij$>{#XEtWj( zRKS8NFIT#>G7LN_H4mJrMt|ZO&XiV;fw@x4AA6f%_4nx>nT&qeC$NCiI5;AK<6#o$ zSa&p3w`S3cB518kQ;10*!iL2fIT ziC2liz%w5Dxf;m@Iqr}2^)jZyz*32`+g*@l5@%`*EaO=mFp&WBJCd`>#pSMz#XyNv z>y{rf7%h-tpuxauPQU4gJW5quuJ({UP*lR9@4aeXS&M?~n-Mb#EKYe%n(@*PVo=NLWfzsk};ES56b@YqThBQxIjo6nt<%22eBGBh55} z#4MMdL+JCQbdoy~$Q?-^Uq)$@@TA&jl5xjm5e;v2h7xwB3%yx$s2WWA(}Iy1PtXE2 zksq??8@G?wXaPBkJ?(JHn2Ztv#}O_)+;IEiptev<=GiTw(BSKe&tzxZCHX2DP2i^< z0WKf(3@5!%+e+|wLBC4ui2h9BL;ksbp@RdrUm)Oa4S9Z-7xSlP6jIy232Lal;BF7~ z6w%4sZUc4qx>6xG#V3H%;`^O@E#H-~wm4u`#un1(2tJ`a&F9({6n=`1ew4s-odW7! z6!UnjSR&|L&L=ozeo9THVujl|nBlrIF-HbVE_*1lJ4&m=3XeoxM0K*re59!aix ztY|M~y(VR?C+&9EZys(UY7JP?iL#(tPc}>S20?|{6NQ&$%!n0Tr79Itl}&;H-n!wT z@3W({CamZ#Wo?zZmwTn|%~;V}qHdQe+~tgc(up!H{mhM5;=uwH{hahcRHId><`)lI zE7UzkeAa5b(U>w@An&XVgL}ks(pwv^S$Z-%WKAZued!M8O!l9*eB44b@)jLXH$i5D z(%;kCVdX9-DJDf@oyp*TNKjyKjB^w}wzW>FI|U17QWn%+O>2(TD+I5Mr9+^-NFVF1 zJ(A7fMk~_J+wnopb&mlbdd9bc+G)JKYa^pyQOuEfspsFNo^P`%UA$I%`a<7H zA7O71zL8T%a89h3zF{lzJxN_{=UsKcpu$64jV*CXv)d7aD(QW7IHwbJ|A$a`lD zCh+$q<0Gpf6N5=o{)R|?7Yw$N-d~Trca7Z4&3#+y@(Ay;8&n(>n&Y@_J_;+L`#2)` zkx-giC96{6BEYq;YRRgUM$sMg-=^8|&<>~ge=iLR{f^T10R1TPb`(wU1NGya$0YdPc2SVa$@QApC%wb%K82!-X%Y*)`4uo{ z>7*#V-wlD*G9&jSyz!SYDly*&@;;}#)q)dzy%bDzKLu@;c@IGFZcjN!a;Z#T2}y2Z z`a9Ad=|{ih!-a4YvAgiG^rsILW%S*=O8k!ho=+8UpEd0-L3gm-bSg(;TW99o0M$O_doSod6Od`Q7@z4-02`5=06m`F_uf_ zmgz|!8;pX$E8Ohx^Oi?L!w|YoZ{1V;UQRzBP<)&Wvy?tu3}Z03TpBP&20RvWR(q`I z42s9-*8?#4BG0@Df|7j6$NHh$1KE#>3QW1+-79gK4aItw5iWh`ZhGt9jx0=q#P*V0 zbFjF*YX*G-@Q2rm^MCP9lBg4~xD%%eD@D4R+T@|DsroK16|DQ8S3>anu=vTe8F!eO zr8gqtzaR8pxSL@+gK(Bw{fS%)wMX1PO6znY7WbxBarbs^oaTQO85sR?S3llYaF8nn ziyjdlmQg5j@gPpBJtL}cToYedVrnuL50R>W#H%NKMuzH(-?`Jd*dN5=;k?3~rslR5 zzH?H?^qZffUDNNhH1Ctd^AHw~liIA|Z3?~VO8SjdpLEzw#o`IP&4MYeCRngUTqtAH zuy_(Dm8J@2Sa-LOgD1_t7>T**SUiPiRSzfVo-v+oasRr}1G>=*Y+EUQrBFUb7zt3b zB-M|)HR2hWvK?`s2j%NT`fj>Zd`HeG#AS`($1a_GA2OKgbN1RcPS_%i;$ghj#V04h z{V1m3(;b{ACF(5tppkx>$lcxdIcX*>+@z#z7Jp{!5xmw*D*dw<2bVXJ->Wt?U59Vg zqoE{2I17U~3y0njlvtT3T#>S7LseT@GfWu5 z)!+OZVv5u>);=N}mh$Jo5{>s^(r&m-JT>TSi{(wcr=+a8kab2#fzoqn6z%YhGa3s< zO8`|T{2}E(j_w^!8p9nyF=S871M!MLLFxy@J#zY?god&1Ui77oul82BOcK^!6eL?h zy8y(?0{xWR`t%_EO5rbQQrMa{AH<&p4`%Ook{)+6+NGs5Z3W=|%t`v*Ns;uuLdfYY zCXt-TQm7x8o**NUxFgbf0tP3f2e9j0ANdN%K8>)v5U+`ADxTGw+dfLb)Sa8pZU(xXV-zi|UF-vWGfx}(83hj=P0!-BGAhHPS|ZFZ!E5U!!Y7S{rSw%BZS{oL ziDi86U?cT8NchE*jJ4r(9SN{wqX3IwEWs!S+j?k?7eiqMd6BrK8|-?(-Tfv6J|LYeFGBu9WUf^&bEjkfmEHjoaSi0p zAmYu)mPaMxTF8Hxh_xC~2mU$=T_EplPdUY>2DUoMk2uovg`DD3^B?E->_+e7Qk^o$ z`PP{VYxCU`z%RwOT%xcQ7{4#win*J-R*AQl=(`)I7d!pw+e=7##VMDlFGK!Qys0gX zO_4X*D5HL+@_r~fb%v)Uwu{c7)0^9eAq^A@R=ICT*&8AM1#Yog$@n0DZ7(UHRqnE2T8oS?8jaF|PrM#HaM1gy zRO59nO+V~@*&Vn8HcKSV-+=sAIp>EPIj3J-=q=jm8`_LPNJeQ`lFX(%<6-XOKk1rS z>urXu9U0$}8^q*_h~X{BJL~O$-P{>fM9oc$P|G3FBx?>!pZCP^NSNC#P$UaSbx(0H1fwA3yidQ-=W;^sXcz7A+r73eCCTpuv4blM6S@j? zg58XUSw%{O-_?YJ^e+058|tXd6k;CyPm2~f-GfZD`m!`H#v6Q#q&{{-h1Dko&2X8S z8`-Udy8E0-5T7G@anQ_+w`uUF_~5H>_dq`Q(jy)h*0b~}44!*IG;jObV^u0=6V`6{ z>&qw(xJ5j~T$@YJ9;nlhzn$(L=|uPl>GqKW7QyX?arB!4!HuG%&g})g%AEw+vz-Ra zZNYCGgX4v0tp3GAM$^Zb+nv|C3A!}u+@om<_%tP*-wtT^(a#`=r08Acr|Bn{+m9E% ziL^arY(E7yanenM^-JztsoziOr|+cFw<9dMhJuw5z7G5iVTZ~n)K-iWnqk*@!UvME zA+_@vmhEtk{~M;>7HG;%Q2JUuihfM5Y!@&1m*H8E>?Mt-8p=L!{w~Fv=04yng6!6^ zXdYu4Q4?#hY_HV(?GdK^rM>z&mhIItZRlApmny>vEyg}KY5a*Y6M zm8}SRq+%yAw?yifN0S0sp%V2J{T=}?e-mUQfN>gg*Ggrpq_Wyb*)y2?l0@Ypq(FA5 z)Iu%hZjh*-NYtbVwGMM%m#7CNYO4tKEL3$MFz#B-=bu7Ir3TJn?%PsP9zY5~U8LyO zn7d7)9+#-52=yDx-NC8L^Stzx+_#YUu}D6Mq0U4ylfC71^E1w8;7jE@)PF6UApS1%>D?};AA;4Zq|9NF zOmcB+rT3AMcXDheNbh4J@8s7`lHRi;@8s5Q#or75UtL!M7gg21y?17q8DxeT!8L&y zL{L$g0q)#o76vtQ!GyH3asju@B_WrrPZLtU)Lg)2UMov*DJ@f|^i*nMX_>iTUz=ND zSznup?e&@cpK~E2>+kR9Pv_iw&w0=Go^#&wzRy#TuGi@Y=I*RNpVajHN9K0vzo%v< za3kAK9yOB+)?@{_uV_9N+so-w^=SYw*KYhpoGv??5Tq6ZA9J?$MfF~xu=5)YclyFV6y-z zs8>5G?u!%B->xcgh8zbx*8Lx*w`IX(c#JYh$UY_t(ac?}=e(yW=hns4_PoEUhK^WrOmO($%jh$(7iYp>rPGLMoCEz{xZDuf6yuYSQ{>qtev=q7_~tR$Ui z{zb3&GIMn9d{Oebjs`atNrS*_=lcY1?%mK3wn^mQqRMB#wpyv1t-=^o&sE9 zRy3z}rLw*0*u9_f;skKjD~7?A)znt0RP;P11MHeu$6LlL{7cU?twpE;!z$DCQMaZA zhGBteO2Ddg)x6oeH2YnH(4*;Wl(aDWyup+{PVr{Z{ysQq;Q-eKRsFvC!=6{qZcWh$ zP1*HgyKA9qS^nkb*IyZ?#o#e(2v zh(zGo#o!|hEnB8%q6eUZ4e4=_^xj66v=n4Ir6T+SgOpdI|>bCPn zX{SLL#A>_hFBCVwFqqYLM}oela06wfo=+aD?WMmqr}?!Ztk$b1%xzA%k=06iLTPit zP*$tz2@9JO@>y+APgvBPP{3+)kwE!NGt;T2o2NBjSMJrzy9u->`nwg)?+ydsiJq{! zIbk>zrNSYlcTWk^=Vn%0pg&#L{PY%9d$XQU)tqoEnTV_5BddT9rmODklx^Yny6%?a>YE#p~YN$Ej_ za9N=tny2Sqk45o%F=MH0d#@Zont0c+55`OB288I=F4i-9r#UmYuP)=6<(GM7mY9+~ zTmKNwtCjj|XPRG|2rpMXp#cfI=12>SQFBeLmY&H&WMPQjm@Cb*PF{7x!hacCJ=KOM zv4`j3k}+yh`HHxO_mg|R^r5LOhWTBz{Y?Bq%D6-8MZxnOHd2pqS{$2FCasMUrT`2~ zf}_e*W?ahuoyHD7E%|W9c|uxFRa*FFn2=@_vwj9(JXwo50_6jZbGv~UXbLb z#QaUty&`+@QE9Ls6jQiD0$I*FX`?|Xp@IsjH|1AIK{mZgS`B;WPOp62Kp7FKSLA?X zVx}$96$9e`YFA2kQsdLoZM?)N#N4crl9(qVwb$Eb7L`S$wjk&6)eEfRkfdAlY_oZ4 z7Jq9n=y4vE2H@^@x#Zx*NM$0eu84!3g8Rva(-&^Knj#NDf}ae!w`*@onQTmICQk-ol@xu=+Dn7VMeK zdxjU}TIlP=-*}LVo5nwT0w8Bsqy{}7U4{bwd;#;GmjKbCXHoZsgfr?waxV1sML+nW zS;Yk(_V85$eN|L+QQ9DsGh-tkBmbs?*AaDtuae;p=6l%?iTA;T)ZqJAucJBA!6)$n z@|9lbCj#75(E#H_=J-;2MDNWdlw0r1A=e3CD$gdGw@Ugog?`Q@e37W?N^L63*Xz=IYvTV=v-7JtH-7A_qSMz^-x zh~*xV_Wd~=vVLBYl97vdE<^`i*zwJ$m~gUOpmy#oH5WOhrWM z@Mi;3V^`lhypoTRa6y72Z6H>kF&~m zeAD6c__c(HN7RD89OmmNJi)?^Qk{YF+WG>KnHU)IA?eLOdt3mS)QSFRLUfOd_uMjp>j{b1AesLUF~AW?2c5UoFy|5J zqTZsm$Q~aI@_&p2Q>4zP@=t<%u-bRdljj;D2YfN~(rT%epdvb4?fykvd^>ypu&+D( z-k^*aCUKkq|JLm$OtZRezURqhmj_b*!@eQ()p5vKf6V8>p1O_PfgRZH%K_UIE(d+M zuya-Tmg&{swX;OVM8R0lt2WHYRBtA${9YPrxTZE-$R3donmV`>ufb_Un zP&HMkbG;9@&On%5BV}_L4(WZhk5zkp07-J5^nHsl^RurL<-aZ6&nIVr-u@jTmwoXq zH8_NRYPFonliovs-xcZSh*37NJ~6&Q`pBt`Smf61(3g^O?M&qQbA~7!r2XGWRTLiN z+sSUbj+h!l$QOYnqW{9I+~>ID6lkqujxaB zIh^u$oIk24&$nJzm!o*b$9cwZN7;k{&jswqO0Sa_7=;sbBrH#+DZjrAZkIW-nT<}7HydCOtnDkOl5MtZqfwcte$7ldja>cE zsx!OED>yi9?G182D$eW}LrYWTF7(kHWYaNEhL2PqIROB$_^6^6GCb2$PUFzE)i=uR z*>xWIbA#|6HQXS#r@AqK!|$!gZJC-aA2tA@cG56;Eme$$EWN7GW6vt`Ee7EOIQ&4C z<+sZB&~G=(ov5%-Ho|*bj$(BIxvxPu$&6w7cZ2B^>NSyS^5g{8wV(VUjDu9&SB5=# zfQ*wDXrf+lz#x++!yt1Om|yq=Z~*HR8DOx(ZuBXvfQ+8mymWkIM$XMkX8r?vy<&FiCy`=(Nl@mCN!eIeW^ftVgkY(g0JRV<4KS zu&>;k4V)>z%wzSPE}qdGWCYLF5ep#GZ%fe1g%z@oEto5p8iX&Hv6N@^CGD$_lc{Ph zx^Kl2*~$V7QIh2=$u~jH&d#Qi$K(vAEt22lVfckBWyIt!l@Yagf%dJFy)=7)+>Q;d z;KTD9s-Gx#S~Y!$i8AJ+_q(l@0U>dbD(4}8j2bgFEJ3@-Yvm)b@R2|=%v|ea_)1)& zFP6%10IibY0QxN=#EkG|+9bbbX#Jg5G`r}osYRe9CD-$4$I@DH5qo-z46d5*Y5z8P z7Q1hoyu={0R=_wEsa@3U9zMcem^Pr*YJeH*<~{zXJ!{kfBfm~Q`~ z{Ix;&8D77*4sXAQ|A1-lb@^d|t=KQm6op^O_PV^Btvn!?aQ3C@w_p}&*eh2H?BzG* zj#kq=Q>*g*9H%k|o9o!t)cMC4OQgVn-PnKRkY8zl~%$& zT6_$3SbtW&ap!KuVKri&edYc<5Z6 zDszU>D0V}H)X8F1f6_lF6dgcDbNe;>?~H(E(j6H zrcr*DvctqN%i59Seig0^*~$R}g5G#qU_~Xzp{L#KQ$~SUhTfNUURy;~sA(}WAo15H6 zHJLmE{T&Ep1*qXZbv*m7P;nr(ohoN3fZ$lA3}7gFvBhKpkW(8j=^R296IroWxgKlt zbmgLn1HN@-&P?%C3r?HB0cJMwC3OflJ6#gl3=c0Nbd|MJ1xn`(14 zSRz&{Nfwg@K!bU_cJmno@fb`!@dhHT)`q}QP^I8Fp9#7IImGgv3asXHj;Sf^_038U zu8(y0GwMnz{S4eV>lbP5=y<6*lErUTE{d(Q@408f-809`yldJ7s(fB;%erh+Mq7=D z9??Oh^qO~tWzX(==H7BEf)fL;q+1L@>nqCL$7K+Hod#LT7;is z^;!9KD$UR)P+foZ33jxX>J!DAy>w|$`;IKpqhblag@j9v-dE)>q|*Lvd<=qLFR<`g zC)k;ar>SnL`_P%POHl!>K7!okW;a`rtd_tG67FE3j6uqS%oS2`e7_A0EPiYr!YVco zx5L?3OQZZ=+7VV4t%i}+quL@Y3((a|9%%=xpBQyAH9iJ7)zLSoo8jYlVtNv+10MBb zgSqc;t{_J0t;^854huj{!o$^l29BX>A4BdR`ED#(jb-Wx72CE#D%+`6Zv3Ov zDI!(=-UiU5^CUABPr^zNepk7f9{3fDMDKL1 zE_DD~I$H&h7hnwScanDk7v{7QVB23(+6t`rJ{6{dNwohVB`5MR*2m5D+GysSr*^Y) zUhiG{U^z`tZlCaR57#C86e_VRudz24sR5YbsQMo5WA@onH37Cba`#XV!|`7Y5!Q%8 z@)Th5CiaWZQ6xpIA12|h9NzidO@DHt2I3?Ohr9ISq+P)P}J?)i6to~W` zyC@@q$3XVG)6k^qVo?6<&1!kPvDM+(T(X0@A^_5+{a#(;0TN4t)ujI4i8!J{#Amox zn?olygaARiNA($m`^X!obYW?A>KU`}FRI<8y}u@`o&c4vavNXD#<1~+)%Dz;@LY!jEgO79#qM(+)veLMiBPY8Z{{q@2m5g`rgGp~`+};R^7h77`#Fu_pYqP% zpq97e_;38h>-jy5{eJu{y+&TEK)pXw-xbQZuwaI0P|q0z;7@kf!1i%otu@2QRx(sW z@VQI<@v5|m?D7Q_v~=ZgUeX?54>qc02J62kHvggghqMB;rdG)Iey{d7TNmlDYMx9l z75rCz=Gy(zKP+_Ib=$s}%DQO;r|8fQsu-!>&Nd0!7*SY4wew)!t@=zYXzE4BR>ep) zKd3idonyn9&!ho-4k0K<^rf0%U)dmXGA8>nDk@QM&t_9BEX$$Q8-(TL+@iwEGG2q1 zU!j}S3 zaCA{E?ARKur$Aq%Yn?#8KhSW_x`$sz{<3*rJ{W8M+S|47?ZAxid(He6evM~Ci8}Wgq%jDI~`9^0qNgT zat9lFRP8RTsnG!aRgpOO8i@%Kuj3g!N|oKPrM|dd9nIx$PgibK`b4@YHeQ1-^lsuJ zo5WoMwA+nF+|U20Z~wWdBlV%WZsU~l&P=#byCRqfIX+I#U>l8v^0kAUys5HL1*_d~ z?KpQtELqVmo`$~ME(y_R?V_k~w054kZ__>&g{oE6?Qs4Xsp0%nO(mO^b~wRmH-pTw zgM-a4)E07br^b=?fo#ZlZI@ZtM3+u!`E2-94Ja;~$y=#__O4ii$H$XY_K7y1R*X`u zyk9QEyJrjbvd<8*41cD5LWS*>vAgDI9Zj6?`Hen=VR4fEG*4?Qn6^~kQJzT7`Pw(8 zji}02@;;$};jL6_Fo3@a$`@Oir_@4Ly-*u#5T3yuhxWVK{4Ad{xUr}l=wC{%SjEBE zX3dD9bVcn+9rkLoslhBnk)uTG!Cu*`Ez~zs+gbIm@))ez%P@XC?X+pw>AtG%q`GC; za~1YgRocBxy2Bk#-V0seakRUB1JtkY)g3lU(M-d8ji^zpCq z2sU@C_K*nc-u_t{E?c%~Yb_=Wwc`_cA>+7u-L=_R?uL4e`G;cb1XC?uVOKYo;H~?+ zShLwvFJtuZp!N+RY}WT^A93oZ%C;I-)H)3->dRC+Noh;Rp4Cd&k^|a(X4va;A5=2f z(9fE8=CSO~quM$VX1No`l?=LaPQ8a=QCwvC$-C_eUBBEcVUiG+C{;%8&ZSeZm9OyU)ARY3Wv1QSC7qD@LJjTv)n7{J~*~) z!N%aTaxIqfS1Ss6qSQl8-B(wqj^Ho8N(J%CF{)XvUSaj0YFSYL+{CUMuoquzUm2_i zJszKj^8r((Qwy`aMva+;H>ltNds_+>*zaR2f7Tu_3u!x@{?&rz&DDd-Q-O}oVK+nU zE5RQxnqEgChbg$$^(uSa=m%@iTP(QFwLoMKMf>M+DyY(oRG434{Mfr4rHofxPp}OR ze-WpGO3dY)Y;^y)|j;;eZeji``d9tTG-kVkR&txP<#KS zu&pDGw{!eB-hNJDXGb?%Kgd>u{q*XTRhzW;)eo6az$u<5_A}nVWD}pcpt@S5F3m#Um!M|NFT|jldrCfi#Xf|b{@1ElTvpzcZ zyFZ$iz36|!^wYCSxtDof@*fvXmr&HtYp&Q2vtxVw61R`#nC$ySdhAudlfG$ZZw)#| zdotBDBKWoY1sE2JzYu#<=}u=EJ$=rP{Z=bGh+LjCR_5mRyv3 z3NRFj0RRR%S@kh17QOr*qi&|#>aFoy4q1e4ELTWAc}>BDf>Vd-NXY(Y|RN zXoG`6GVBjAff9Iwu+6X+QG@`R5&PbGh5g*FrULr3ehRpFgqS}FXGaa2rMcq z5HyRmE`bfa?YdHZ*W?$t*gwFV?k_F25i5JMpp*FokG+o79d)k~C>R?6N%AS{ z%?#ph6c7V_yjQ@B>+r|iiEP-7f$S*G4|_qEkszam9=jJDi@y#Jm<*=&$S8>kZBvHA zICD73#d(GwWwzS`;4yU3xm%KbS8D*co>8L$Pl|$@T}lqb3V)TiMgQ_<=5FS($#f|- zP)vc=0jyHZvM&|+lP+|rN1%X8bGo|zDu30Vz28}{WeU60n-_-K6w-0E%Mq4ycR-6W zYMg%#Q#^~+%nX1;v3upva$K2jx-9H**ypXtSP5`Q^8&#GVa8)ulaNaERV6JKYegYd%9@s6mPFFk%RE;N79S3;9 zP6!l>>e!3wzUmyN`C(fz8@xF1qG;|ZE8ySDBF`-Uf7zv_fi|4!s6OjD4{-N8ccWMA z9s9EN6@l>vp*PjbJo)9$L+Gh_em~o@I`Hq-rXVPkCqiB?&8Z4VmdvHMl;fWH5xx** zvCpdlX`&z zpOt(bcmu@EZw3^OBCZ06H+pyvf~Q`K>PnpJwZ~1EBN`(fr5NYMPrATu6og zjcQGAek!)3^@W&#W8MvHiV{F*{&HX@b8Ss&z)kiA%ac(aE^02IkW!vywGDxrxP7lE zF$LTA^8sw%`?8{B&YbRv59&;RvHe(4YRU|OMIQ|;)<@&@RMaD7C5to$rWwTkY2>~M zhSs+df-x-T`@jKi(5rsIIA%?qXkk-+4y@&{kLxL|2;l*CBh|kb@Uu;q19PoHn7N~Z z9||TI31bH{uOlV|VrZ}R4!}kP8kwgmZH7Li^Pu?BF7L7h4LrWM1#OWd7{`GfOB&J+ z3z36qRqXC|!8L+7G#f6~-IgO#JvwF@Z}og!PNW^uTaD0aZK&dGhv95WLa?t{$YncH zg87D+L3nSN?91|IVj~%TC8{g)bPMi?7Wz^{W^l6U=E|<+eQ0P_u*Ss6D{i4$$q9A% zvlF^FI|yBTD>Ev=-?_V+F~I-54cCi7jIBH98M7mwo{n?0VG{=gYb~aJxS!$5#l!Ln zg3pU4PL(m5_74drAPi14)0lG6%rb@tVP)+P|F60Ft8b1B{zotst{hellBm(a(Six= zBe6yF@bKVlc7I`TMvQO+`(|p;X%NQlDh>{d;v|(3KIA=Y(d^*8u!QZJ6NDSvKx3h&E# z97op%aU3nClGm+ns)__-$N@1J_D6$X1D=rfznE0d-l-4nvvInz^)r!E3hntY*vDGBcvd;+ z;8xxJM^b0H;iKS-rU#IB8CCDIwx#2fqVHs-4Z+`93pcR`z7CcdOb_B|IeI1`6NhA1 zH#WL4xVed%J2=~78fI*@w<*60cc>F99^zh#Kru1&JZx353-Na`s~X}S36~!+gf(pm zyVMwbUtp(Ap`B6i*sP2R9TzQ2A8B1a+}H|1Zl7Da5;Dr6Be9_@(;|GojCsY-acHW7 zPVLBZ(pAbHHHLD9NYH)DuJ{m?<%-DZgv+}+hVHa*nyjZg^U5*gF(&M zQd2??T1>YYTW#X4?P5oJhT?E*_=vR}=dtJ7@iamjZvT3Rrdd|6yr=wDW2?=4Vd~1B z?j5>Wu)**WyJo_;Dc#a$dedOQPmE(pp3r#%c(LbJ+Mo%uLu3}#QmJ16#Qqmb`=@+? zPz>j~S|5e%JF?*eLeCgXk06_Mlsl(u4)q$?z3wT)kdVRp__%S>D8-kBd->|FooVnd z9b%~S%&wi-jrk$?=RQH_tRY;8^^P^O#NnZ^1)=+6MuvV8EmhUd@;fkuIG|WO-7_Y% z%=8!vsHV!HDX@5DrC?TMr~F%>9`}UGVNeakuqW>i-Hv7Wq6K$ztztJ&+3=JRtZ;4! zq;XZVVjRr=KQ2Zq?9yTUK%>Z#@`iMFM>4tTxNHyAC4=QSJ=5} zp=1%JmXh|?hpF)GRGH>GVj8b%%#I9&pEPk8z^s&q|4E)v0$>3Po=AmNVQvUUWss7T zrY>P94_6aUvyy|HQ_xW!S_*P3dVFbUvT571Bg;pzm}Q~wbdKxTXMqW0?@o1}g=PSv zJT#7nWEPAy4`a8k4sA0CJ6QE073*KdBcXRV`*qoyaR?M%7kb_-JV%cHaW}BRn?kVA zK2OE>8roA#_xQP#w6fiYY}VEgKrdgQq9@wo{JJglxk20sW=KP@{i@N4?O0|_=!Bv5 zE*X?#+0r;{D=4?0u?KCfGE9k#O*i=a!M!mswG@!X1SUhQ1ZS1yYi$0q^cm2*+MnIF5(*QR%Y8iBxS*y`+L>3960l25H(w&R0PzQOboihvnIOz6ct zmlFY=)p#}(hww%qu^1+?>6V;IgL$k^#apjZ5p{yjUy`$f)t?W+%k#BWCx(I_HZ!RU z8{)`$-eC4+`tag`HBRGrHtFjSPId?BTwXjF%o;;)8Q^Z@S{1?#!h%Eu?S3D^+6~)9 zY8Mv>6_PfwLqCTWT7)7tM96tgH0?u1hgX%wk7i?yIn}UJ0Cdv@x}o=i$y_SzJC3mZ z&n4yH8tK!}UVWKAx+=Fz>Q!-eaht`Ztx5kP)Mx;$s|r8D3NM5GRnnd<*0(}|Wc zxpKa>M2*FsYHfh+FUawW*6|SRP5gy#P^!iAXQSD4832BFjhOEd#5~E)X6K~B`R7^@ zKlq!7!5oNqvZaWpT8h{&2hDc6rHBJ^zT@0WdkS*;il+ZSvJamxi(d#xucbNdg;VQ%bNv{B)ZmcMf3%E ze@{G4`*tSX$@~3vy_LTNhG%dvmA1|)rSOuR<9s}h)t`Jtjv3)b>Xn(4!pG$2dg9mQ z{wn0A9_z#JktaTfs46vS0{dxMPK*d=Am`xt4646kfDwO~Gleiz;fOZe0Mv#`-X`Br z?s`@Q7l`v|D(~9Fs@htpH=s9uMx*V)Mm;P~VeEYYt z@!hpU`1@-+;D>+ifFE0Sz)x2@z`_Q-n1dVYpIdgo`5d{msS!>2zkihK^53NT?OLg> zTr1V@f0IfGqp4aoOJxjWvg17Q=VZ5pF>1w@QtiR0WxLyk`-!GsLEmQjC)pfPEoJ+j zPkQq;vN$Zd2WYv9si=XbHh;Eo&Kh_9oMx~+XKQ-+nxVW zZ95X0)OLOtYCEx|TuCkE(tFa?Qm&EVMoZLWKB>b^Dzf!>87DRe=oB5mMQcnrs4prG z1ev57cxe}nM3*w*pQdbD9pxC$OF6Pw?|wPYz|nSVc(@3j3Fo=^PV|R(dj%$L4;#%l)EiA z7ZtXW5ZZ(*6*ftCWUDArwn8XueUKFX*Xwmgl)nF;$K(B)_w~BFUf1j9d0p4*dY}At zv!(pH=cJ-mvB_a!G48Ox|HT%&e5&Ly_j7^rQEx`D7v9mSe^#)x*%!6XU(_;sBzhF| zDCtqr6HZSAJ!*P1^hDCb%j)QfqNfo((e%X76H8BHdYaG^M^96Fn$go7FKXjqq0ti- zrWqPcp|nrXMQQt>olg+lPIkYwx+Zq*pkv6 z!FWpF4mPKBWw05g&j;h+%FFTRT09%Phgz8!Or>-}&`;@;K_8`Kp1=M|JUuPwX-Q8j zdJ^bKq^C7KZRknD>#yj;16W(B&t(uj(i#mF-x^ng{kT3GGsdPv!G~5E zOBU$&F_fP$x*4>YW6XiNE`~8mV&+*WDA8D6(CAFM&qwo5rfCm1*?kV`jiuqJX>unxVYq z0?h1Yd|Lq}lk^Yp_vbLPr!kzt^$rHmnf<*x6%`AOyuWA@xe`pvf5}3oE>gVfr0G| zE%}J@=y?Gu*SBvDMcvaPMJ7__+Y0s~Mpoyh~Y8DUc&OnjB17f zmH7~*;l?(iufAmf^ck8hR@kV10rynr3*EF$$6<8Gd5Rq4pJH8?3u*j3LIK zP(KLy%M3r_*r|pUjIF@xtHu-tB?&qu1~g_pgN#=UFX7qgh8B#y4As|-*P-HsAq71% z4PQ#^6^yOY(}FJ>rk;))3k(lQ>{W>US`YY2&@frennBD0!*7~Z?>`)Dsto(REuYHu zxOJhSH&ZPm(XPhWQ<`6B+tkLz3fYxFtin7OvSzBawZnx7=V; zu-70~YrX(g4{73|=DN`(<_u`gu0iLe`j)tKm0>(%uR}~H^`lVnSXv1rRq4m#h-Bj; z(a{Dax@uuH+#LHftBk3gW}o|mBNMh6*cs+buLo@eWpR!Gq>;%nwY`*y=o72ALX zOVo`e81Yk_hEGEcWL(v+gscJjQGA8Hg_ZO5Z%BWi9(GRMh?Pb90b&Nq{ysGJ@vKc) zxkMi=fqY+Dd9b0JZ>IJ1lw)yY!w`m5mHOxDfLd>A1Qp$keIflj!ydK;JelfxOj%~A zrunAXSQcTN%6WMQJP)du0i6^BG2>IdHtT*gG+}HjNyo4o@^>5au**q9rNp*jvDq*| zf~;)47H6F`6f(9Qi|w2g7;L-<^6!b!@Ohucagbwb-UyaoFg(c+Ju8%z3_q$jbduP+ zkbOupK}jC7g8Ys(5yxFL4A+Fm(>bv`;qPH-`H0Hsc^_kI<3^Jdl8g_*f=Px+x8$C} zS^ogaU!}cpVY1;_60^}*h9zT+Tg0~7iFKdoM@pEJWYCDix|mnkh2?9EY6Vo47)qgH zfpGvQ?#A+UMl<`T)baBs#>bSbC3@nGI;N@IW(c-WhMn#CH=9EGQ#h~h(X$7$XBby2 zAm$JKFy8EkkezQVxU~yp1=Ji=H|9BeF*|77#cqlGtl;<~%${qc4a*O&J2%3UjBf)` zbswb9(5LfbtR>@{VU5H-#$1iz0SNTTt=pO77NDAuHAtpj;hUkZBbFE)zm;vW} zQ4!c8)p%B7pF-{VmfdmQMuUez;Ci!pa7Nwi43tDPi-WFj8+Jn0Tbd}yXw*!`zd9Hr zlGlVPnF2Br+AA}r7+NN75WKwWq)vc2-Uae|PC(mdub&bSjU9%%Pm}T|R1?3AAE&jo}QLz3sRA14r!K`@0 zVA1U%NPkd&2y$AO+CkO`LkZM9rHO^WG{dX62GLgx;xMK^tl#;Mx%!iH{tZ+s4YfcM z)E|@HrQHO?N+J}k&~M<`-$J$8(1mZF=jfEqGRu(hfFTvL`Wi^CH%~F`_Gw0ik{!kJ zLx$cGk{VDhdi@USnXw9zI+~17HpvhUB}qm%l+4p-L13xj0uUCRhcUB_udriSuQJm4 zLh_%1i{=<7Gxj~!YXoV(ei@V)42eiHaIa|h2dt0cSylOlV^|Yoj1|=5SRZRVO8cs> zVG#OXG9Fa1+Qqd`G{>Yw`V?P1`(SEFY)kvrOPmno0Z3pfwG4@cf6OcJF zEdfbQ`boh~Lg`R-7G{hwjG@h^jPP?=oPyFUH9{8X30Wgd84x(6Uyd6$86OH)oNoIl zdN$}^VL+491h;M@3}$CAeStn)!l74SwEr=S_wZh(@XG?-t-ryoHBmR z*d@M?n&T#uX@CO8|6*LqE<<)BMKjFOm`Wsk@4WGT6}y7<-x@L`ENN=mC}#c-NPkk@ z0`rx|&O+F0nWVl7^)&_~OlV~)zQu-+?L4uQ{)GAyhD;1B)fX{XeZsf|N=gg_mGA1W zL%zcFoTUB>%7>{vFwSu;2Zf}*hV{Q1){zoK0!9+>bKy*n$74)M z3f1qV?uTLV27L#y7M{6Na2q(obinId8ID8Q@8KFO`NNnc2?Yp9X74Zws;`E(Mni(B zR>2gIKE&J+0zJ}x6S6{*RVOJz>5;v%?7>}1Qx^qahFf{7Do7t`o()O0nvS=oKL*uy zlOaN7P=;L}4|FEwEUp`^{`XYh$4{Rd)QB3>b99Z#r0{4SftWwj>QMf`x>|6p!SwmM zcmk)1rn4YFVfh#j+-qvfSR|wu=?IYD>Ku+GX(rOkwUB+)atJE6*v4YnI%|6g@?X;g zIgdK1FYPo7ofwA((Fzsx=%9>19Nq) zLR?_Zc++CWnuBMO?jYu$u-zj;Pb>*NS1l?g<_KtxZs4r1O$$YndZ;Yzw3&10!AIUTg)=;}!qie?2BYhEI`3iKLKE2oMcwRk`LeJ= z@ibkh&=RUDGLi0)(@NJ9D&8@5Wi~7?>_kRlMUAzFGue!9V2vF-3pEdM{tiZ{tje(S zQ*SYIjx@fWng~dmt1IBMYNE%5wdoyO5oGi;xiBfiv`ui8jIncV7Zf1()kK9;DYsX~ z@)#S5h1e^^q64N$5=)`QOpE8)D$`sAlc9Qzwj~5=ty!FxLIv|cwqzTC4}EKz7^$== z!!APhHpQ*Ab(k~Yq{olh^E-V?N4d^+8mkUjdkY3qv3$8@9$~{gTbAGg|2kuekTCbO zEl=WI&JxA$!OCf-0*UwdtRS?5%GWf%@zF;rwqG%Qq*Rdx|7+lu2#$)S!#xijprA*1 zcPN^r-3fsvhPSw~J&Qq#!u&N$!`dWcny?8!lvqcoH5qG#DTrhW>KMkoqz~=e09}9Gug>B@Rn7uT`+#(9dTszq6^5aOQ%{p60Qt0bATbCsy<{-_ODy zC|GO`IxxByNkMflG0+#QFYBFjsxDEF#T5^j$4aaplr}XH1Z0>A0y4lePTdk)4>X@t zuuQ0Lts~oTu$gSb{-nO>W%Lg3N{!#^`_p~Z?bu-f;|kLOQz{KYnr(*f;|HLJ~B_i zyd~z}$t;;|{v}*RM$GCNP+G3&3G0&@HGiiQW1m0_g;UbhR>H40b5ig(Q|_~sZw&u}P;x9Bl{iFqx<&li~6g|jRu8)a_= z8S$2EPM;ltY@xXsgWVsP-@*MW&Bwx(9%WcLWKL@=denjYBeRWnHfm{~psWmgD}i^` z8=ro|JXca>Q^sQuyTm*mTdy_$Kz8^BGuf}BA$GYr4#w{^$3o{HEh=I-!6j<&CZ!1%ZrnDDWA0gQOxT%vlMnj8z|&zavxVycar`SAE&bCM$B3CeiN z6A7iZlmxIxTJrI=Pt4g0HXbV9>d*#_`^|GSO42BIgmixrR|}{bn507OVe>_%8b{T0 zvGzT4D~4^3nAK`k>dny%=H;40-KuCIdmDIvv^2(_YRw5!cn(#Yd=F%rEaVqBYmR}| zT`fQ2QH#aG@PSk2?Tk&q?|WE`439bl?JTEFh4ROmcpGe-rC1(No#y;eqq!M*{nwT9M2h*b+?ZJs>H? zQu8;HNK6ip*do44lF*c4Ij&$uQ1oe1CmejqyiVe4gxq+=c1fNimuA<)5Y z$NtkS+!)oHZ&t+J)lh6EHsI0KuP_T_qJEzkT%-Cvskln@|5O?G}+h~25i*6GH`r5lg zj<%x*r+;F3A%eXP>A#RY*?E?A8G~8p)Tg1WvF-rmePs!dH=*A?Ybw?pvltcZ9aPp>mZ+7TxuTzYnvA%t zWprV3?X*Qws5TQP+p#js@)^UdC~Ld~r!H6$8A9n+Z8Cc5EMF?f>sQ>~)E;S#?NhKF zpx0|EaYDScC&Q?#mdlL22k8+Vmx3dgj-)MrSuz#ueMr}KoVabOb%I)zt_(Xhl*@V? z4$@d3V(Ojmxq|_r7@lep0J)Pj84OzM_o{8g$}Y@aVO>rBNWRGA4{cRYaWriL7uRmg zUTJMD;lkf66G;pz(&P>{vHDpBW|vY8ZfOk@3Q{GMrdUTn)=G_zbGbyp_CWDI}gATjcuTWZ&|E^8T$wd9<%ht{x&OZj(t$@gvE<( zUDg8%_A!(`qcdXu5L0)C<2+W7*e6(Evy)9x7p_~3D^jfk)XFZ(u%97zeM|spYzLX@ zL*o8(h#hH}jv1qD%_M%8^%}J8YCXXAL;7LsG&tT{lYq;+S)Wv}15lY~Nue`OoroDd zt+ac;fKL5vdm!+vt}X1Ir;UZItCqvJ?39^UGSSvn4E!M0ZndS8ZMn$O4rlha&S9(y z*a7R~@b*KtOvrlQ^b+=c(5h1_yVCLpeNuD)VxFoCF8FOWHie0DT}-(baS)&S!>XsKZ8SIl-( zS%~@4v=Qkb*~%Ds2x<*2F=M!it^~w+%O|os+rHmQp3Vy)7j4b2)^&94n4&Rb&UVs< z`0Ujo>uw`p&5E(^A!LiwJ<}x{; zdvXVKSAGuJ`O-g6&+ou~QHw#4YErdC(+`t=q&qJdw$5e*_y4Si*cB)qZ5e_^JFPhq z7WJ}u#bEz{;<1+Rp=Jyr*rq170TB2xZ7!xar$-Z zT*~+p*gZOOgRHR(!z^ZdEnL!E!(5wfkz(1lHi;Z+`%9YZnCr6jrqys&+d}Yx^P+4| zOOoaWWS%iS1mk;H)%eN%ww4kunrxC8?|%>rgUoX#!2w+wU6`($jWx||M#dOq)|-~x z;$jXtT^4AH@LWq`lA1w=%J$IqB-^{;%HGPbx{!iSk}{ED5vknKE=caq z-zMKFV7?_RT#|oL8CA#(i+SDlE5@v_l3#=Z0wTj9bBX2)AfcXxgQGMu6rERp2?u9u zJ($1TBHY)J5m?&JX{GYlB1Tr)~LZC$J1o@b?ClV`PQW=9r3-|Z4y~m=V z_yx^O4rwZ4HU&8o79@x?5L4(J8fQPl8d-2BNt!p5?gBpZ2F4M zkczWu^LRNsRPHb}!RGJUevM#Gthd?RjCc11Kh7gvQ0yV6+RkgXt`cT^W-1hICu6;A z+e+^An;uZuJjK)tsPC6~B{~|vWoOfzYFj4;*Qn)e-?kwM(o zcgeI$Fd#vULlFVn-?#OGtj2b_ADi4rx&2$)o8hVq((LYXBCO?da?suQmhrXd2Q=DnMUw3ZIPXd zyFnUwjdc)%hcDPRuzP4(#r0s=tKLRvpGjBlv;IB1s~D{7ppS#VX6-i4o0pz@ku9~1 z7Kg(CF3KJf>wu-BtS>QK#_Uf?WKh@cvP{DnO8fH)))CXcG~LUvlg9p$#5!SVj@3)& zZo{0dLTe-YF~&M$tijrZVe?pfiwM@AZlmpAC{*pKw=S4lXMLG`u!pQm;l=_>0%Xn8 zl|a=6bu1rPS17PsUxJ=9En`sr)=C(fv(eU1OlvpDy<+_dGG5h?f6-)bqF~)IJ4%zs z;Lk$KN=$Ote`2f$Ru9v(qDYk`mReEkKFHpxwQwj~&Uk-4q0VDZ!yaBcQ>*AE{j&c~ zDe>jqiyMl&Rq4b}FDRbxa6*1_(p7t>+27?}zJhtWJj}XiohhcP4-_oYb;F+B?C&es z15mkB>xZOPy5(5a(@ximeL=rUO*Taz`zLDEK$;a{m1U4lYA=^m_fr>{kl)IZPmxyY zM5s7zkA%9}m1 zs_`&XzG&~s%c6n}LFEj4u39-*8CDijn7>$WkA<>lV$^V9s$Jd4FUwSC=qhdSA!XPH zA?vEBRZKM8Du+}qiecY5_Hw2gOofMqATjA_y9w``YyUvOhC}^Wdk5@1-@Z43WubD3 zy;!Xx8*x)$arx-Ze>Vk1m&pZ4QD%*>)k^ybNi~9+dlWoR*gwSsCH9?a)evRa`a!%B zQvV)FHIfR9#~HTMwYb{Q4E1I9WDR=+`|YroNvg-F{8)&M zc2H!`e*0eN*VR#uH&k)U#R7Vgf`c3vu&T-~Gc@k8r-rL2jBS@!aG8>-QZJR`lHmM! z^2Y7HY;Or=m+S^?^r^jGQjrfZay(YfbrdmNa=<=8ViPFl#?e^;*COK*AgRc)0Fs(J z;`qYPfyyFB7Q|Z}>5w(cp~bSV?E@4n7m5!%{MhbW`;`bb3_Ue`A3a6oClm5Ei@&YQ z!6)o*DcBUq&2Z>Z9_6S~EPFUg%bT8xvF+oIOHkI#aSV4~u=iFevz1|F1Fr07hpfx? zXE@J!n*7qH!7OFi9{24d8^TYC8KupFBcS%OeZ6X0$*|yXSoFI+M@3G%$Y-GZlKolC z*E#YPDvETBoDS9d?H>ve0*P=XHkBOb8G9D%KXpV)c>GH{p+K7m#|b5y$-AAw>&{lN zSy+(i$Rj=4WNi*f5pgw;BvI5-z?3+X4^JU7I;7RIDJ>E1$9%yvTEyA46O~ zz}`x{&xT@UoD(W0Cd6Q8lY|{f?K_Y$V2Zbexx>f+~d}YziY?kb+ua*YbEj1g_Y(=S2@L>>d^t z{a|5NN*^ffax>iZ-}LBSg#jwlrLZ%lDTSRVwHKyQ+PaWV$mnK;6gV0kT}a}L4lAVV zn?@H3DQLCPnL-L$ZFHiLB550aSLmYjNFiZMqi+lCl;(X?Xrn)07FsE-EVNLHg(gZj z7wRcpU)YAyl0ph#ZM3A2uIU;rDr`yV3xzEx4Hi-`Yon(NDVVj<_`*0!pD1ih>Bz!Z zN{1K5P&%kEn$n(ybUoTAt&oP_=$^tzO5KGTN^NS8k|Y#rQi%ovx3i38Wp5yQQiB&rzss1oJwi4;FPd1?T5k1 zG`*h(`Fh(GBoBAwwjkdDWx*#YT@&QH?3G~Nkz4f1o~>0mac6NAGj z9Tyx*>6qXnl#UA0l|y89@L@_H3Gx%_q2M4&2LvCav|n%_r9FcKC=CSrQ`#<=NvS8u zk5@ymAEhmW4^Y}T*oRU@uy-Em{+ELHQ+hmjAEn<0yHQ#lq}8DLG)SvK^FfdRMYACs+{AajukkDE4Xz(8a%Q2?Hv9$DB7Sgz5VhYDl8eaH#SYBB4UxlM- z$^2GGGKfB2IEvCkg(QRM&kIQg(UpZ+lw#osO3Mp}Q@W;*q!PWnkmM1)xR4|fJ-?77 z5&c3T$sjsdNHU1dFQm~&&nTqPM^7uH(ML}#>`UqRLK=7U*uvhFW*7Df3yX^$QP`7S zh8NQ4qlXsuAhFED^dIfy6%E*QcFg#|9xt}md?>C?Y>q{-4zeQYSe?SQ_jJ^%RF5jd z-c7o7_H2{m4sx$d4JbiF=K_ z0u$-zp^#W=j|`K^4l+zu@Md=5o@oxc+922T>kb>ZJH|Z=ZQ42>#J^@ZrbQ?pSBC9} z*j*YA2(0DMgB3wXm85=kT}p7YGOP-!Cz5ZGXNY0)VAsf%=y5p?Qv6bQ99_PJMXrL( zv+5)WU**Wc;Cx4(f~_Vc-?1Jy6*&e)uu{nX)V>ctTkdGj!(Fov*nPJS^QZ8^m5$Bi zk;d$5dm+OYN*&KcsGcBCXRljwBrrS&9X2@TsNZAY@0&l6CP%Wqu=Qg{Keh=oM>|vuHJ>`JN)-8; zIo&~;@qPzs#&1LM8;&|i`o^Kgzp5MTLv^={MhDs>j&_>zO-VrtZ9n?=vLw-b zf!RkLtC;F7VtotlIPd66thb|!wLafFFq{Hg@B7{{X6cAl8hH16$76W(ghQ)VJw*bZ zDth=X#@Rw>XRv#iHG=CSYIyjZVybtjGlZOZ&6;A1 zI>%Y=^-fnfDTwBxgMw&wpz?}??%3YnrgV~r?gLbczdI?=#_=RhP&?N~D07ry)uAaS z4w^$wjMJ$8@HKCc+}C>{Jt3+iejDRdG4<{>k-_oGuunqn#M`+2)oOqt=Nu#Pv&PO; zrh1P!s=#`a^Ab6s#_O74bTcP8VJo5D=1hU2jR|e>iFhYn)9k@|m-8~itBFnxd9+b! z;yiu?6&p##wAq~BaW{6kR_%kV6bj((<#O&&gnumae~|e?zyfl73l;ihC*7NWipqAp z_GhR}bM}d3lOVH)b8L9)!UYMziBL)ZSM6UB2BM(FDwPd=}ALpby zeTwP)iX?XMX}<>-U6XT3<#|?l+pr-sU++)fDm2;=Mdiy_D5^^jH?ndGMFz}4Kf&$Cq-B!1=vKDKNw=~!Q1S{d*WcM1N`6h&;ld@(DGF8#C9C~e_uHweNmYAk(|l!nU&5LB?=X-uS;$MWfzi(xu0bnoPX2b80v=ezCWeDF(a;_ zg%eQnmfw!aYn+F99BE~hOgy)zG2+n;PP*hh1tstBeh-O$lNxH#T_F;avqnqJuq54` zMWwg!(x;*1eWJhry&MBa7pGXDqPv@-o|dFUi`7LT(7SnKwW2XsLt|&5w9DPN(O z%w5hm8T$p;_i{Y$_IT4J9Ja@~mQf^W$>-E`)dTJ*{N$Y6jy!A+xjlGvAMf`ZlpN$u z)Qg7G8X7(iC0}uFF3Ih2<$mXA1$n{?mdbj_|3gl}fmKfW6sC@1;ruqdUhAP)VtJBN z3%g&D(=p?OXO56?J*F@9?WTy5AN?H#;WtcQK?KM-eUpzui0Yhn1$nYd)t)#g z*-B$wSniuhoLu*J7Zv|N&kOE@&S;=WdH_%hcsR>oS82qWR zD~Yi%^t{1I2Osm=u&i~eiua*q=vmLHWn+`$$UEX|A*d31Hi<@idLl5;(_;}-1$xQ_ zwX>%UcBt_+5>zF4wz-evPbOEAf~nB6gNk6n=@84>a7eegTqwI-Uny7wdMe#5Buwh$o=`*6EZ|aMpbQF~D@IHrgdb(yR zSR*XoDXJc)su{5^>Z_umuV^T*^gf20qWs&)r`q3jlCcxh zCx}*KLBGWlfE%BBkK@XA^7mXL)i#Fu`R;hg8SYYI(oh#27fqn}y!&1(O7xSCnlm=F zzo;As#oN8Dpyryp8P*;0#z?rkyZpY$Y6`_>e`~0jkeUQF4u4DBZ1(r3suLTkHpAWD z)2@U3@vb;*H8u53QL8zWPf4XCDu?$O57|>(ajy-M*C+*Rg}du{XGt?$ZakMQFA$w2K=q?C zNhRI?2E*Qu$thy&iBNFL9l#rZcuCzVnd#DE#*40ZRODd}0bG%b04|9G+-`;+E_DSY zroR*2w1$768{MhiiEdicO>|r9B6KtV1Kr3y_iuF5TK|D=T3Z9UZFLd4+5Z#Ww2uEr zbfY_s|3c(M_B3|BP;0`R?fUjq5N)oQBZtTfTI> z|3bH8EB#oz|rn* z@TP75Z+N@POW*r{!kf0k-QZ1|b_cwLClkDNyaV1MlL_8B{Rg}?N~V50-wochf!pCN zE}7sh{dRbZPbPTl@_)mdw(CFOP2251;7!~8AMmE_0R(SP(YUHn|BYLN@ZR z-v!ym-5uGUx+}7czbmp$_&2hBnM~onIk@|px2c3J4kw>gv5DA5?W-8Y44XJWx=Ud8=`ll#)OG&x`SgtqubrRRSO*nv%K^x^63Qun z^k>OHTYbedfZ>!D?u8P24h#O`g@-K+bv1iiftOzU$tiL0U2Y1wio&!(EKqtWims2@ zjS@x67N|v$b}1@um{DNT%TDr}glXqsfllP4r5GW9m6L9H!nDsrL5w#J<7M|R3N{xD z;zWsVDRIjVdvq{!t#cSJ^#T^ei;SKrURboj*_#tz#DWA)9JV>c+dM2t67O3=@AI+1 zB;L1&-WO1en|OaO^u7=aT>SmoM}8s3MNlAnpT)ckcaQ>JvA{11?+Xf zOIVP`-)pAJYB;zlWeVqLF%|?kQLgcb7MEc5a(Ok0{)9&iV<}|6D$_^pW87mDY#C;k zh|FI@nSccuymG*joC@-zk`e-E{oQ!8%Q1VMD0wkdas_5@6z^9;?=M4np;HeTE!_sJ zyW$xlLF*CTA7RM(5Ua0XL6%n`VZ?LpzZeC>7GH9bu~Fu$q9u9VAJ2PO37+fZRd`^l z?;Rpasqy6c*RG<_H1N!Jr(%Va8ldo#?|e;h{SIFfhHDnOM=ZZ_W3Row?IahMM|AfZCVb*MK|M7~74NS@_Loj! zKkX%A%Mfu5WIvSZ#lBU(EegnbGFg;-0}7hE?6`TZw?9ehgs&+i7*fd@7N+I?M_(5l z{;lsdD(-ZN;%{QYG2W5fGW5OgO;%hvRHHW@O8Tbm3)yaGzIC^xcv(zP`)Q;}54a-W!f|&T zdj~4(QiNGGm4dVfr#>mHgRL0w$`!O(ho+_p!ZxTMnVN{h+RCp}xXPT=#yC7H)giLB zL+%il1M7ykVi@i|APkU!E)B$tPMyY?MTi~j@evr!mIf*GYh?(T7gP5hMWFrkA8|kK5B`zZPw@`!R_7L+B$)NQnGPv^nev)I+ z><~k{KtIc4#jG`+5)y7*NVvP9vZtTcO`4z9P5$6e$qEdN6jGYsAf-x3pYLjo!$-@n zQB2YnPZJzblxi1a*#o6PS39hDiSLoX=U%?@Q}-|&(kA6Tm1?po?8SAVi`k?}@-bLd z982->5BL*EPW}C@$a}8MrRO84-Qj7-K*}H}%DdrlL50Q_$wj>n>!--k5@u9*&I#M^ zV^qp1t~9LPZ}~l#rgt4*xx|-4C@Q!nRG`x+*wN>#a4S(@diJ~`WHm8uN#W( z$NB|CfQ)ZFr;!|zYQ_#=eK9Z7q*qEEqX6E5DB61G|BxF?C@+^Q1s?~oeuZe~L_<4O zSie#bPB##$vA$Fger+IpiS=*D*C;l7mh%Zh+~>*l#J!2+bo4aktbK*`>qUi&4Hdq| z`b~mxrGan=>&uC7r~6QRoUT2L_1h@xrql2%C;{%;+99{)O@D*+J48!LZ%B;aV*O4* zP&W{cV11<^=o$z|vHl}Lh-n~vM>p4k5a-QjKn_82*@tQAQ}+Xc8sAWiK6I}ZgoFkH zecpaZ5Rw`Q^kw@IK`?ngrcZJfr`XAjjj>Ence3OvZPmJJ4tUoC# z$qlXig!N|x!QVhQ0o5slsD1Z~YW1ONC$YX>luBzTbqeb*5dks+-qD~v=)43)y;DLS zKiKtlN_X}%>X*sKDI)xcUyUh8{S_eKMI>XkLkm`95 z@`&kDUnhM??Gln9&*gMpG^5&?h&5+Y=yOGKTh0=-SCgabrkn6p(ZuhV{v6M$I_RT7 zg_fyxbWIf(YUm24&k?oWq*^z9h8dI}AIkp&(_iHI90HLb@B|IT>}mor3%x>jyo%`y zy$>*~NpvMibc5pdEPKPLgjwJFgx2*ZroSYbe}^;G;80vCnEDITmx-2tB42rxO7=>U z_8O+Y%xN4Pk-+h5lIJt-aHwkCxEVa@a?$s(VcP3ZX>p}O(T$YmJ&{AHm}FfzrtcE%-tMKGO3`sqekZRQf$4j^OBgQq$WKZX-CGc!(hpx5 zn)(=Nm7jWh@*)~I*3`d(yCz2~Ap1$V6^{7ATS~W`grrDFN;0X4PoWKil5hrhU_=Jt#RzM)MW&XlU#bZ(aYZmYF2t$@az~U z=;ZH&FV0B4N4P2(P2bO687`dh4kE2k7b|;xpx@?ckAcDRhy1(zf*u^ThsuQ7O(1uu z%ZGV$Qwyl=CLRscs8iZP-6oHabR5(^?P>!#?fo)1yZEngr{%j6Yl?k}Qn!*mN8kx% z_xoMj$H~8ihfg8sT&;xKcRjg0S}YcldODxufVr30h{y6?&VCG6@APC#ut4kU!i0hEB9!%go+vNM9g1ESx^&CmjhMhvQJ_*Nbm2V zuk^O^#bJl+NMB%EkvHdWo3S15&OyKb;cJ3JU-qvdh`Id^Pbi2wClu5rH^;11{u0J7 z^Lk43BUt3{B+>M1Fdyx_on**v=`-MyYyC^9orZh6RuXeVc57b%i{eDjx0#bJUMmIk zuRH1E>niyq>E9Ng7pHIW&!LVE@s2#0k;FS1w#6wHl@~Ki;(fcb4+TK!u%FFaPTB8; zvi+Fh;@JzH4K0FH%#cO#J)!)znBf=i`$F&cgf8T!e<6CTryij^CYg}rOaJS{!X?f^ zdn8<@Hp!3_EZoZ#t}0U*LWoT5b02hm1$PWgNRjnJxl6Zld@* zVs~_isFkK%=Z$U@1d^M$t;P^?Y<+4}2Ntn{ZL%)0T0MsY( z3+tX9Ive{!@r%xTA?rH zD>}z{zNH@wz>If!=1tra@+H6Oakm$;7JHPKsP^v@1AiEbJGzW;{`m@AuHaMqu%1-dDz0 zS0WY_dnQQ~fm}S6lWP9-sByU6Unq&qTQuI4L$zyp?U=JN#Rl-iNzCn`8$ov z?Oy*+qTffMc&cmsowntpLOP?cc)H-|9B)$|DaXNE9sJ^$dkl+b@iz14(3Nride3Z$ z(NBmy$4Mm}WHYRORL;g@>HY{Iu*b1@4$rEZNN_#jS-QCW`w|c65-)xGR?l}z)l|Yo zfa(Qp0+_VJb6iqUkf&}el)dkvFQq^5yrW=Gg1kcxV8=oJ4;hThaCYB5UEV52F%GXi z>{pQ7BD{(C!a(OSL468j!b5Zq_kT&+h}TVu$!DJbF*Y8rWsB0$-bQd?FL}CZI;14w z+vk!$6!j*6OrVHuM*GRK%xmIxVMU_vfXK=L`2c5OEN9{1L0N?r3*?I;D;Fvgq$U_M z-cPzuUMp{+Xc}vZ<*!BlL|9<;O(KnkTfyVTITNtV?)zS3Q5eskaw3%6NTvt}<_gFB zsREg<$$yCa$>=`pq%qtP2tx+M6!64&C^Y@FXRm^O9HIUhcX#?g$6s?RL?#YvG#+6* z=$;0T)#UPByel5MTAB{o zBPkA{rUTgqbx)+kP{4YkJ0z`Vp`R-y9Xl=alXrkD(h$ot@Y)J4<2yj`pcu_e=;u%I zV#+EqzBmYmD$K%brJ}-XWV-Ah?rehJe9g9b*0&7ZBl1P9LHVE(q7)BV18ST8Z#$SYj1D-hiZheZGiVSNgG7qmE z^8d;3M!HwYe;lEpS*jH?ruxfBeYqx^#e6M*`a{m<7?@6~&fTJ=A|ibhcB@;6@@Y?% z@UjblTLhIHMcZU}Pw?ME(C4~I1-_{+Eo0mc(!uJ7yrbxs5#)=!rtq-WJmNL7muSg1 zCZHPXC7@ayvSX3#*g=A!C6KD5m198UIr#Y0l_fLpM8eb0(IFVjyP zkv6{S757L8G{m$dF&J?o#fmwf`mBPtS0KB}>BD=QrS2mjjd3Xi^;O7woi|n0&=mQP zjS}@Um-j;fsq?(ev9%$U4sULiB3Y$$nyd!>G;S7O6O&r*-Ypgv{Zwn``ncu!3@nmNgCY#GrrG7jn}y} z1F(CyJDp4O7HTdNoUehr4>{*`4V=?&ER6Kn>9g6?zDQpitSd-Kg7QXFm#DiaMw>gn)&QAoF8zApH z&WG9`nvAy~_Y1clI}A$wh)`^Katmy>hg>!E8w|OdJrwidk()?(EY>fAQ*@gkcZ;Vd z_8U&}Lb5c&DRLEex0eZj@}DJNGntrc7<(IccjTm-04jd_5LEs$%Zkgt@9spR{)X<2r~WA+9n-ho(`U&OwgB*z4qm`En( z1yOY?6n{nlb1YLfQTG)3LNE#S==7wSRvO#qqX? z2bJq6RA09fYOUm8r`tw45OyKmH*&lpv|T%$enlW-uSY0zyFqVq$3fN-rvY=k{Eji> zSvef5Vtr&RRbb9=Uh5|2(x7vGOIE_??Nj)5fUc5$_`pMIUc8SE(><6oniswawDhIn zhZM@hNjCvDApEzY-@Wv+cB1s{08750jAJ3bKKcj14v;9i*5iZve#j|drZ7+ruU3^^`{oF+H5vPrt8g!x3H`ZkbLR!JY0mx3E zpsB!Cxk5oMU@?F%FlQMFf+KEs8on|_J%~9kbMgEQySp-d-6d9qIjclz9ze=NY(yK? znDd$_eLLnFDL*EZ|0U+E75TR!M}ZNS1@XZh%8{2FsMi*gP4YNaL;Lgfx& z&KA)zk01rIKt=7t^b-WU!cCA30me6&^PVXCy(nu7mHifTb_psE8wD~-MGHqTXOEzs z6jV7xJ&HN|1oe!d`a{(3pmHFAai?GT0-&%_(ZDgx`9c)sL8Fk77ApEZ=6orrmjpEs zqW*w6hdFi00v~-FcN}7W@{sdkf-{zEWM3Iw^-T90_*$viruQ5t^R`4ze;%d(qV`J>M#z((;b`te*qS35S zqo*+EGVvxXP$UcVG~+(*1W{y6sK{wDetbQ!*H+&S1tX`nNo3}PGRdcH6YrBl@8rpL ziT7!tcXDLQ;(bQwo&4B-{+|DoQw-`n>f4F@U?~3r{Q|3apX*KJj+oxhZ|ocTyqg{y_aGQLiji zkA8DyjAsNs`j>At<^GBKaU%EKQ0`w8m?O(b_mf$4)ZKKpa^UkxlI|MnCyUY*q0-k; zKaIba40H)0-9Y^ek^hOvj|xM5K7WrH;EI8){ay|NQH*{YD7hKrj35i?Uzd|)LO#kQ zsJ!ZIiXA&qkSL}m`oEBv0`>Dn%io4tR-(R0ydMj_t5Cm0yw`-@!%@GSzn2Xc3yglV zTK_744}>_4Qlq|vzaNbClhaU}!dGRK2K8%1rLmz(k*HtC-y4P(rA7Tl{+@9q)Cu`@ zTc=Pk>)+Rk7rOgD3Rg`d+*uCwdm9TA?-*^n4?I?mJ0DOd(NKN4T^#23bkf}>`9JBK zoUo`EabJk?KtCNbvA1A|zK!&V8;z*OklobBJqCV)k|vO+^>(-w=#oyKDa8AxaPW+Z zgWA1vvs;Ebef_ zsEV%5y}O(2hGer#LN#R*LTEyEfxT^OXo3VtD2j-X&_v2dB1KS?AVdKX2xSilN}_-u zElV4e7Cr$Hk>V!`0vZ$*1R=4Yd>`un&P~LK{5(${lDYTJywlFioH^&bE}Q`F*ugNU zvZ~uEnet9xGC-k;h5THm?8t6c{ZUHw3d69%R3~6ta!0Y*c4ddt2BB&7 z*(kXLH}$5pVTub;1P0@zg#%nuRMl4VVY54Dw`vcB>g>|l?hherS$3nE*PwD;6@dwUiZTs)zqCZPihn~=cQjUWFU1l1c1!UiLO4@QJywdmih!#7X>#r);8Qk|*H z!gl^b_MmpvFK|V83M+Y*dus%bXH3(JR#~_)tfDACMQqISZ*^EK!pK!3#)N%Zvd+%Bd~tb7FRurvP4ss+*1VeqP7^($tR|r+<#mJ|O51L3 z%%NT^JWhYQtLABM7B0{e_S7U~Q|5)Xh-lf*jfj>xEId_zda&kcACTkd2}f!Y`m*p0 zBF!xE!kgU0kjcw(NKeY#COmgsk`(6RPs;W>KhWVeyUc66@SQy=1{kvQFtb>npZ zFbfyE;86NafjdzY2C(o_y|jv&(jH;q<$A)Ungm#@zRI)2y3&erVW~nrA9CLR_p?#F zUd*F3<7k@zRhGJzvNMJ5)&^k^EM4`?Dr+)>+3I?pS@x?gnI#1~Ox8af%)*=W*M6;e zZ3wJe^@Q6<*tx_#(-`rLsm{FfS@0H zvZIIH5>7hrxaU*JAzV%Vcaz&93Xju_t?pzNoGanpsaHALj8B+RtaO*OU1Ym~wd-4ewiS8!se_ zQ0!+s+k85;-JL<_54%&VAD|YE*p0W{c99+Z#H|WK0ke0I%Ak}uhS70-pSzv_of#_4 zzkZTceJqX8A&h0GKXyjIlUAWa9!Qbaw^q9$nf)CMyX>uBWkihf&MQ_NbnEj|5Zbq?H?w=6rmCa}% zPsb5$tJ}tlIDo)SOQemV^KOloaM%#4aK|w1SNCBUl9fnpLYLgF`FpP+gjo}*LjO=N z6~Sog#7x`ak`RIgnWeFElhjEh!!>tf4yrX8U5a80Ei!iOB_pH~%Bw5Aj*t+>XbBxN zopQc}R}DT)<;A|ESFEtQHSl+ZUc1Q9ZFdaK-Rf?|YjZ_M@RcAu&+9)-WVQ%tx!$ld zDf5~XAjkJoI?plcUgclraA#3g7ij<+lqS8&6_Xcjaxyk9;cCSC#^nW;lO`u(jQ%9$ zuqWF{#i&ud1P#(wcLhU3Sqz~@lAA;Rzz|B1%&h-qH)KDWW*IMFF6B6+o*aaOL-u3W z8X@T|^%51_!bnU`mM)UbBEbwwx;@RI zpd|6CJXxzR8UI^vMtI0?bzkMpisc1`Hu|d_sWMagm{)KK2^Og-6{bqbY+s7hQRFQ; zj{Q7RvI0_;q*oj9CxL#B5XzRCSEC2c0S3KM>AUd~LjAK~v{Y`OESKaB4Zt{&FS+0U z3wQI-AgKk%eMTP_ukaCEarXe^wooxE?o1%;F@gNFUXzt9=+Lw8B6;~+uTpTm}1Ex{>PXH4IIZqUg=Ay9wonC7e!*CD?Krrby5aHUWdm-z>!aIONnZ(Xa0t!*>h9&d#ML}8xmI`EEb6b& zR5ZFX0%r4CSlOrFNG)OO2BE|-v*QHVv~EtpgeyNHZ6il3xjSXQiJ^b>DsZ0sPI6*b z-BxbI4jz>PV3We_poAMc$42R82wKU;i>w|Ide!|6irrgJ!C_S_#)ATs|YVY}nnQW>}oTuvphqiV)!VCjEe3Jud}ykh}&D z@=2PbcSxg91xom{GG7_Ua7jY=2VOaJ>QQ+3HIaS|U6vwQ=N3{oU4n%9klM=*M4&DC zo3&;pm#`B=VILicf{YE0lya9iq~o-7nu$ zSTG0+J&I(^VJbT!y{nH7W@{t=$SI=oMoFs-m}Q%Y@yto9J#2^#Ln^p9+WmbOzsRq!N$=vucO?QzF2~68jq4;95q-@ zMBrC^w6HreJl{=j&O_Fgj+Ps;`?BQA2H^x%43isD`4B|GZ`)6<&(v)Br~#pAM~#=4 z(ZZ*JrOh6>F5A>ke#ju4g1HZ{%%31XNxv1ykS^0?BaF7?2v$Bo?qm=?V#Y!89|qHZ zP_L0xHcC!p&2r_>p(3QxAu_be!)2Vlzy!732Cd8}8Csc75bg_~AP&IFelmi<=F3wI z!WptZja46+j-e)ff{7j;%UZ|xvK&XT56kr!O_RqO;OJlZwu}vJq5QSMa=yc`4sJxKg;Bsv*~z@KpzpJdKojK-k=wHF3*~pXlfK={Gg^X-V9z>W6)^p_7OkAS zQI^=uWpbfG_>vh{@~pn1{Tt;}Dp`i^Td-EPFmDM;GGB5_BjgSpI#2oRwFE#%H?+rb+2i8lk=V! zn>Tdq2y&c2I~In;+3c-@GT3OorvpdiNo?v7d9FdYPC4((A@<5K`3dev@7g0G{MBBu z4Q<{lz6rxn^lj8B`IZQe`io~lWYh3t`Iu`$XbF(T%Fc;gSm_gB!*btq+?2EMTU{)SX>TlMT*s}6?jE>>nyaJf2# z7M@e{DVVBmg^0kuV#Zn}mkn>EtTI5WSGWl}(){mGg;lrYUTk-QVuN8J4@|-Xf``(T z?@Y$^Q)f+QH`0|@AtL5?WMQI|U$k?~Au8u_rF2CrrONS1kz`YqPPDeQ@>oQKb7UT@ z0S}zf8qtZ{YS!NYO=1VzDghxf(&g;X-sz-^=T#YzIAbH&15Ra6q+p@&1hofcXBko{ z|5K$cTcs$&4PZ|y>8s?@cMTLbTkcgxbM~Zyjq3kc*#PBfgrDfB%oR-0j)ImgX=TUO zX4Y#|l)4B5&- z1DxYs=ai1DYd>W#SN+Wxt8}G`^-2WG9-vf3ny?riAHcJl#CGQ@oelixWp^%5M=yY#+{1-kkb+r)w;Ksd#i5uclyXIr$vMK)h)|Z7Dwe9l*^ko{ z8+_WSxL85#jV($yhN9<~O-2N8s>hK|A!IR<<@Z#&U}1hqxnbfl&61eC7kYwDUe>zM zv|p7+*;g+s4iS#+r{-yM*vku*$#86^%s&*c7A#SmW+Q?y@8aYSI<8DQu}kU0TD_`t z7tE=zPb@MS>m0g+I>2td27VG#A_{8CQtV1Ifxh@ed5yhSs(3{q4X)}MoOo9&iy{#T zH7CoEqW3nTx3|-cN_h!YrkSj4;lI^pgW56^a@R3|4Cm z=)_8O5Q{&g+z{)wdGg5-|C%^t;uGWG2YN!S&zc@l23w4n6?*U}z2?pMkjdEaRFN4z z35r!Tw#45o=ca5+yL}MdjxR!OiksNOB>X_9sdT=GU$2Y#tW`i3(rVCh$BaSd4ID*+nUi zSRGF%+{7pg1Rh?{s?wGxG z!->2B=aS2!`YgWHQ;X^v>%2dir_E&d^;ATDH)~b!<7Y9&>U5Yc*Hv4v4KeBfPHkkL zq~dbNrs8rZh#k#3UZl{G%{Z;%YGGVZW9&$x>JgzZD-EhRBfnfv#lGO2 z8pq~#REOevIIJ|I{HE$+p);L&Kue@8@v4<&q^U61>q7QKMP{BB>JgYEvQxv=3 zs@Iw_MyVaCBtsnr<3yng4Ck{yvpZ<_3+h&O&8Z%WG+7aHHov-lK~;Uv+NdTqbc|vBxl3t)N2B$ zlJdS2#U&Z;yLQ}2$K!8e9E1k z1mW-)Z6lR=)oyIwA{9Zp9tQ4Qa*e2mFsQ#MUbgwPQXg?~m#R<-A836W8)k_fPKY>Il}%~hf_f-8e!@DCOU`F8__uCSbGXhe@8{Isw4k)UX=!p2tli60DAq<%Rg?j7b>C5;=*i!v zj%AZ~s=t{`^}x3=oMDR971_*v>NLSL3?;+K`^BUiRFY*lL|ZE5)s+8;+J?)(NG<~> z2xzyeK1w8J;BwWhPaZ& zhE8?SdhO_=g(HP$sbGu-zjCj7^A6Y~cH5#wieOf<-`1XE&qr%B43_C5YyMI88(I!p zQ_E$0ZCckz%M3kcnzNmYatz9byZ1!*Sj@PIw)J_M(ODxHKl``P!YS%NwmMN8A__Ap zyd3(35)ozSy=Xh67^%#z^`ZP(*ii+mlzvP~(GXb3c2&pxeN<<$TuIvd(*D4Rw^?pi!%02CkfJuvLX2-+Y{Q_NiKx+bGrIZb7Z@QkQcA&x|nujV6 zDrtY!nL(ay6G5(YDqF*)W|r2;Vr*ipb5`GM@Va-^5h4zzwV3k8YBw1K_)$!{fQs9z zKjkGsUZ(PfUqp6?(vnUDRmAMCjoik1Us0i#DNE3PqLPJ4J??@`fV`6Du$YQFW8-|| zf;yO2pdtM}TIm=HC^5VWSM+}3m`&o&;o3l>5f^7S^*uhvI!GU?OWzn%bRQE&YrhMo zg~%~Pc3(Y>`NwL939Ib(|E?+yrO%4kdfWEo+I}MU)VbcZ?l>4-HiKR@^z7&P! zi%T2ekTXTYA?Fn;IG{AZF;(jiPRd3$Hhr2lixW3h4zhMlXsXhw{sCffbf=&UxGDk6ml5Y=m~*uJycEPdbf zCM#{A48bbB9s|hPP8)~q?C07JaDHQpl{-XLY4;J0>oTqDSk)0N8w<-1+Ow2gfohaL ztERJ7t7&_o!f{`zNf)?9ERwdbq>-K0kKkXS6Rkty8f}!;*Sl z!;-p|m-(8K!Fr1|+wWNR_!VuX2*ul}t4ap_{+s$F!>YJA z(ggp(EfU8zD9(kB(F2%U_q?86)D*%vO|J&U{;b_L?OKsrl*(*3wHtzIJ5aw3Cp>M% z-{t4`6db6XyK^?ix>Cpb4$Ew!?S~1=LG>g0rc{fi>@r0mXR3Ony8Ft{s{{CpyD7)1 z9H+9k)Zf`j!P7oM*vlIRF)hrVs|L$Hr&DrrT3;$|qXk)3w1-6s<&^WBwLbZCtW(*d zc+Yb-$d6#_49RFsA9UgE39b~?hj+r8R zG2Jtb6Fn97NQaW8g$J881O?dVc#XY&zbB6qJtg(_d`Z^zjvMT>%hMJ-PZWN@lR-oJ zdP>>H9XuHZJyNCzAwfUDLYLlwvOaZ`(eV_|X!_T7$1jx8)N=|40*9IWI~||%>K>!g zR~=A_b@o6h_94ya>uJgSr4Hz`N4N5rK?(B)s0`<{_B_Rbe8ayuPS!OJnG)N0;%LZz zM=86J<%#DCHI9pbOJi+vJRrk6Ne4301FTa&Pr1Qxs>=W>xDgjml_Ts?ENy@%*J5f8 zLZdl+AK+t$^E|3(I*RN+W_eGlpcMP_1U`r*j`SeF-Dz@tYUslyye=m}1~&5vPoW4- zr$DauC>t`?GuvW<=jxGYTybhFeX{2);&g_lcsg^|)%i~&Rbexxc&-~^Dv|%JXJw=j zcHk8}B(Flnmz-f3zT;#Aw-UcW6tl4GUG~dO{q7a z%Y)C!`PO|`*!S~14Y;~2XlaaiBMUu{dleLnX^cbc5)Tfs7b$3OoWfQ;7?Xz$beVS$ z1mt}uT5_Zl`Tqku~Fro6$S*F%y~5ls+ofxsAj&W()eWT>W_HN8Z6f_ z+A-*d!klen@;mJCG0*dnCKvi{D~}&5(eeAdQS|c1p4Uv3o0K9abDs8`5KZ5qsH&yE zTaU8iXFP7M1q+z02Si%&xyMe|8(8a-!)#5ZvP$SHT7D0|$owl}TPoaPpFwZ^=D{AU zj`c^fZ#6DtODa6$xvFgN|3rivyyQW+!Jlb;T`L^xFMHM*IQjUu9&G-udCnVP_*PNR zI*N_0^bj|Et7u>ilGeu`Px;-gF>J(7o>vVP>#Z)1JV(FY4ywu*;#u;qp05lB>wgE( zj3(A5Ecv$Qt4Ps$o9(`3e@tL`CU2=IT7M&3d(lV1oO*lN?`E&jAXBp{4)nsE@R-lrL8Nm{y)6VI6;!5y zC}c|NN-FG_Y9#9raMR>}Y*`PTC^*m`OZOtanu!X2N{b`E$J~+yTX=EYk6;5w;t7?X zN{L`)ZM=O&M3NNNq>jaj#pPWb0S%a|r#X`s{28K5XkG*ajAEt7Em-%mZ$|W|M^0Me zIS^Td4lFY<_3T|G6H5Mq@;Z567ow^36VRVsZ|<#!!$B%E4lTR|FdO~M!o6-|5kd0t z)YggJt}Fp?CGF~F)V%iA={1o!5fUfw9Y!JZemrYzRJwqYuERvS_VaB^fD z8~cctL^v%MY)-)q^hrxUaCM{>>YVLV_FB_LG&taWoi|uBI+>ZeokRT@=5l{)rZ=#l z*MJ+%r*&*REB`QMu|U4oUXUGsX6erW@eKiv%_q8hUAO{Yk&?vvj`ntl;H0nL>lg_b z&9q{%*Tw#u?==}rHe}R@39hu>P{ABcc93&G>MJZ}vKQ2Zjp^c(snVSq#DUmxs&}m@ zG+|YKZ>;clytO)&H!U|LkG+qoI(qZT+uVEb4)%Hcnk+Vfs=9i?Sn_By$KUan{MF?N zdMy)K)q}h+)Fzis^ly5M1?GCS2qWC9zvdIWJu6%2eHgm6;@(AyvCbQOtM8`Hi@dK} z94`(pg16)XZeZf3G*sH0{B}eUc0NB)&dq4)PGbxg8tz=;g@8(-;sOJ%L6&(hMG8%s zV~(e@z`B)scZ+q?6sH0K<7}r615s@gc!EVVZbRi)6M{577?aO>tnuy=Bb&(zIQ80- zv)J=3t6Jx+#~F-Hw!hCwU+he1LHn$YJF!(8y~7Pcb2=&W83X5CKo%^E3GvyQM1z~LKI9$ty#?sYGCdS#mawpvQlJib|!`)x#BdjD&&0jtdHe& zOq(FEs4Lz%`k?evURTgOhN6Ar3}T=;rS!43g;RttngwjWgIs-Ay4^TrX}M@-W8!_w z3_>QY+SWXeDtlUubn*wUhplepn`QxPQA(=sbHN0aU~FgRvPJuaI{+&gXzVBGBfATP zUh~^KTlx&#jkp#m(fz(S9<#CFcJre`=wkB{_OEunrGnV415Bw~%!e;}RP;FB_}!_% z*y4!Zc!b8QM++}B>c_^YzD|)skZlS2vJKIl@LrZIwRg3{HZr&`q8W2`_HBt0I#NY1 z-)K{>;$}se)VsH@%)}`edQ;eKha~*f4mq6dgB;Fg#(us(xJ8?B0RO)aZV-JKV*O}C zq%E7?inG;YBZvFKW>Y8J!EhPlWLe{U+eA}eEWwPWJv3-+u(tBa8YLb!Mec`vwc9hw#}zdMV#GnLRztHz6A8%HiFb{pnRMZ`x@FlGk zD|yW~L@;pzi(#S0_0O>LB|hA^4yWP|eGuoXeP2aFg|+{X50{@CeYpI5oG!lSOQy#= z*<(oH8+(3-C;5ho^Qy=UKkNB2aOwe)c8id+3XE#pyY+}S1K+AVi=F>58RJqX5 znvFZ?3qrwtGd_kbJnfqx!rTjAjsk<~S>LEgQ!i+z`Ss-5+V_hH71Mzq6Frn&<(s{@yiqo5c*S=Okq7C(uH=*K z<7>YCF`SKT)kNf!MtlD2>u8xeXHpS7`xpP~&!hx;;D5edCJ?Q}K24?jE%oWdsHn$T z;ceezrb8c{u2;bIZa@Ga@JAEUUB#{g^(}hp`A`YWajM9xy0K$ z-TueToCNEw1YS9YJjRQr7xDc|R2qm(W$8ix^JWuHUaNU)JJ^Ta{BeS1;c`pS!zj1` zPa~w^g6~29IP=Sko-BIESZ57ipPI3^9`yGYVxV`4oj+pOm=?_^g8SAkB*n4hEdM0~ z7_X-l!}M@$wx1$}Vk-3Dj>>6L8@?$G@JDkdt5p%mzA@`J+`qwKT7+ztQs$Co0cta% zW%-+iC;SFWXxK3KV~W%sSMPh9B~XuBjiM=GVY4Qz*H}MHaEUH9^W)B|ZEPe<%J&D& zpsX4)#s7~LJ<9#i&u*mrrwk1#x@G({N?z39b2jOaAK@%FQQm9yadTa;T)@t=*JIO(65v2Da=t z8EB6{dW%o>2J>sX3jq0$94Cxaio_LD?T9uVzQ$1GCIRF6)^X*eaTKA)|K}&xjw)hB^YJ&{5Eg zcnA2le(|I~(<%bV@v+7O2ae&pn1d&UJiiKb&f_UX16 z@v{)CYh9qBurtY#r|(J5P(dhokgb{>JOUf#$pKucfV^XE;P}#$f%z?)JZa@Akh@yZu2ZR5Pi}?7@!%xQwo<-Tr6z=onEmIlsWvJ;qu6dsu(N3T4eV*=dttL#{(&v(Zfte$ z#uj~VY%#U5S!-j<3IbbfZEP)qXfgPA+Teg!OJ+Y7gv^fnhs?Ic|0T28$>Bi=?fUl= z+O`JOLVIiwLc3vYJdJAO(c7wVZ9G$gmF9>i_?!+_3&^^|Wf)@E?D#>zv&zIn`if$M z6G^&(dl%ReN%+B+$!Bw_$R3{?Tqy`3F>all9QrJ|7k%+|P{n*En4|3ox^TS^W%N_o zf?!`mGU6)ad|*zkUTf&29a`jIRWkSUv^i)-Mlvq`oq>LA`jX%*L_ULGN8kcGR~}5} z*2uP0mQxlOC$KSxf(y78(= Date: Mon, 3 Feb 2025 23:19:42 +0000 Subject: [PATCH 09/15] Fix a potential UAF in FTS3. FossilOrigin-Name: 75f3d87448793fc7fd68d817874d561842e029a2d6c1ea4abcec39764cd38469 --- ext/fts3/fts3.c | 18 ++++++++++++++++++ ext/fts3/fts3Int.h | 1 + ext/fts3/fts3_snippet.c | 21 +++++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 49 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index e58f256a48..2b2c3b8d26 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -5787,6 +5787,24 @@ static void fts3EvalRestart( } } +/* +** Expression node pExpr is an MSR phrase. This function restarts pExpr +** so that it is a regular phrase query, not an MSR. SQLITE_OK is returned +** if successful, or an SQLite error code otherwise. +*/ +int sqlite3Fts3MsrCancel(Fts3Cursor *pCsr, Fts3Expr *pExpr){ + int rc = SQLITE_OK; + if( pExpr->bEof==0 ){ + i64 iDocid = pExpr->iDocid; + fts3EvalRestart(pCsr, pExpr, &rc); + while( rc==SQLITE_OK && pExpr->iDocid!=iDocid ){ + fts3EvalNextRow(pCsr, pExpr, &rc); + if( pExpr->bEof ) rc = FTS_CORRUPT_VTAB; + } + } + return rc; +} + /* ** After allocating the Fts3Expr.aMI[] array for each phrase in the ** expression rooted at pExpr, the cursor iterates through all rows matched diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 3b236faf49..77e6737af4 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -640,6 +640,7 @@ int sqlite3Fts3MsrIncrNext( int sqlite3Fts3EvalPhrasePoslist(Fts3Cursor *, Fts3Expr *, int iCol, char **); int sqlite3Fts3MsrOvfl(Fts3Cursor *, Fts3MultiSegReader *, int *); int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr); +int sqlite3Fts3MsrCancel(Fts3Cursor*, Fts3Expr*); /* fts3_tokenize_vtab.c */ int sqlite3Fts3InitTok(sqlite3*, Fts3Hash *, void(*xDestroy)(void*)); diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 80f62eb3bb..c79cca4a6d 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -1586,6 +1586,21 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ return rc; } +/* +** If expression pExpr is a phrase expression that uses an MSR query, +** restart it as a regular, non-incremental query. Return SQLITE_OK +** if successful, or an SQLite error code otherwise. +*/ +static int fts3ExprRestartIfCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ + TermOffsetCtx *p = (TermOffsetCtx*)ctx; + int rc = SQLITE_OK; + if( pExpr->pPhrase && pExpr->pPhrase->bIncr ){ + rc = sqlite3Fts3MsrCancel(p->pCsr, pExpr); + pExpr->pPhrase->bIncr = 0; + } + return rc; +} + /* ** Implementation of offsets() function. */ @@ -1622,6 +1637,12 @@ void sqlite3Fts3Offsets( sCtx.iDocid = pCsr->iPrevId; sCtx.pCsr = pCsr; + /* If a query restart will be required, do it here, rather than later of + ** after pointers to poslist buffers that may be invalidated by a restart + ** have been saved. */ + rc = sqlite3Fts3ExprIterate(pCsr->pExpr, fts3ExprRestartIfCb, (void*)&sCtx); + if( rc!=SQLITE_OK ) goto offsets_out; + /* Loop through the table columns, appending offset information to ** string-buffer res for each column. */ diff --git a/manifest b/manifest index 678cea2b49..abc313c536 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sParse.addrExplain\sfield\sis\snever\seven\sif\sSQLITE_OMIT_EXPLAIN\sis\sdefined. -D 2025-02-03T21:04:21.029 +C Fix\sa\spotential\sUAF\sin\sFTS3. +D 2025-02-03T23:19:42.890 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -78,16 +78,16 @@ F ext/fts3/README.content b9078d0843a094d86af0d48dffbff13c906702b4c3558012e67b9c F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 9f8ce82bbf4ec0636e6170e58f17b04817fa4c39b2d5126ac06f005d485f6d5e +F ext/fts3/fts3.c b840ee915a6fb36571e3fe3c096e8a481a4a9cd8a35199a1b976b132b9f84ad3 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 968f7d7cae541a6926146e9fd3fb2b2ccbd3845b7890a8ed03de0c06ac776682 +F ext/fts3/fts3Int.h 2fe7c76dfd7d46dff964d17d3f4c53bca2116cf5d6252552ebbc22e38afdf4e0 F ext/fts3/fts3_aux.c 7eab82a9cf0830f6551ba3abfdbe73ed39e322a4d3940ee82fbf723674ecd9f3 F ext/fts3/fts3_expr.c 365849a2a1185e19028a9db2d9f1ea63efe909a3a6aca7ec86fc26a13a60bd58 F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c e19807ce0ae31c1c6e9898e89ecc93183d7ec224ea101af039722a4f49e5f2b8 -F ext/fts3/fts3_snippet.c c38117a2e4dcc9485a170a57a6134423955247b230fef7073c46fa9c51239540 +F ext/fts3/fts3_snippet.c 92196bd5941be0455f2c7e51c2f8280df49c7feb0615a0d1d4d045f2dcf60713 F ext/fts3/fts3_term.c 6a96027ad364001432545fe43322b6af04ed28bb5619ec51af1f59d0710d6d69 F ext/fts3/fts3_test.c 7a9cb3d61774134211bf4bfdf1adcb581a1a0377f2d050a121ae7ab44baef0e3 F ext/fts3/fts3_tokenize_vtab.c 7fd9ef364f257b97218b9c331f2378e307375c592f70fd541f714e747d944962 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 408fa57f048e05a261fb62b45ae44b8a97c97fc01e3776124cbef6595df579d4 -R 19f75289781fc56c637c4500001f3f36 +P 5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 +R f1017abf167769f99bdff3069bfe9e53 U drh -Z 6ac8bc953e7e25c0d28f52d6abec8109 +Z dd1d75c4a0f7bb799c129e975f1e95da # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3958477534..f7f780615a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 +75f3d87448793fc7fd68d817874d561842e029a2d6c1ea4abcec39764cd38469 From 802b042f6ef89285bc0e72abc6866750757ce1b1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 4 Feb 2025 02:38:23 +0000 Subject: [PATCH 10/15] Detect and report signed integer overflow in the sumInverse() routine, used by window functions. FossilOrigin-Name: 317e9a470fba2a4b717b9cb66488b8fccb44810a80f3a7deaf1ea81906e2b8d2 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/func.c | 5 ++++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 19b66ba7a9..172ff7b118 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Test\scase\sfor\sthe\sFTS3\sfix\sin\sthe\sprevious\scheck-in. -D 2025-02-03T23:27:27.194 +C Detect\sand\sreport\ssigned\sinteger\soverflow\sin\sthe\ssumInverse()\sroutine,\nused\sby\swindow\sfunctions. +D 2025-02-04T02:38:23.009 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -733,7 +733,7 @@ F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 F src/expr.c 8705be31ee713aaa43c97d91399db09f16ee41b88250406eb99de6b47f550a98 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f -F src/func.c f5b31c805679930cc5afcdfb1e657f9dd273053f52ff51133df5a448c519e5d9 +F src/func.c 0712a5b03fdfc8af0cda6d076bfe231b66388d3d5a28b46dc1a94b90d41cac6a F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 75f3d87448793fc7fd68d817874d561842e029a2d6c1ea4abcec39764cd38469 7ee20cfc237229dbea7116149c0c35883f7b8087b9ccdce6dca16b6da1c6caf8 -R b61fd031db99a855bc246d2ed8051e3b -T +closed 7ee20cfc237229dbea7116149c0c35883f7b8087b9ccdce6dca16b6da1c6caf8 +P 459d8f695ef868d0ec09920ab2035eebd36a66051f9905e2605f4600623faa47 +R 8b24f7285c9d92ca8cf04f526f040713 U drh -Z 68ed204a1a39b8731f0970e5a1459325 +Z fc7af611ca9f7a31dcf33650d3dd0378 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8030ef34fe..f9f95d23cb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -459d8f695ef868d0ec09920ab2035eebd36a66051f9905e2605f4600623faa47 +317e9a470fba2a4b717b9cb66488b8fccb44810a80f3a7deaf1ea81906e2b8d2 diff --git a/src/func.c b/src/func.c index bd25a44d4a..e8cd174e42 100644 --- a/src/func.c +++ b/src/func.c @@ -1869,7 +1869,10 @@ static void sumInverse(sqlite3_context *context, int argc, sqlite3_value**argv){ assert( p->cnt>0 ); p->cnt--; if( !p->approx ){ - p->iSum -= sqlite3_value_int64(argv[0]); + if( sqlite3SubInt64(&p->iSum, sqlite3_value_int64(argv[0])) ){ + p->ovrfl = 1; + p->approx = 1; + } }else if( type==SQLITE_INTEGER ){ i64 iVal = sqlite3_value_int64(argv[0]); if( iVal!=SMALLEST_INT64 ){ From b6859b6f2c3eedab12fb46b7295194c818420460 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 5 Feb 2025 12:02:43 +0000 Subject: [PATCH 11/15] Attempted improvements to the SQLITE_DBCONFIG_... documentation. FossilOrigin-Name: baac853871ad307b67b4d624b9ee47fc1313f1aa62c9f8072fb49e97aa33db94 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 44 +++++++++++++++++++++++++++++--------------- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 172ff7b118..f5d136df4a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Detect\sand\sreport\ssigned\sinteger\soverflow\sin\sthe\ssumInverse()\sroutine,\nused\sby\swindow\sfunctions. -D 2025-02-04T02:38:23.009 +C Attempted\simprovements\sto\sthe\sSQLITE_DBCONFIG_...\sdocumentation. +D 2025-02-05T12:02:43.871 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -782,7 +782,7 @@ F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237 -F src/sqlite.h.in cc9a2d5a719b7434e2699ff7c28a56209b8aa459b7f80ff1d4d7d8ac6ebfd96e +F src/sqlite.h.in d2902f13ace94d3d3609646bd6d12a2d7a4f6cbdf6a5a4097580ac305f54c3f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 F src/sqliteInt.h 9d7052c71f46ca3a1a4880ba4a62590da334651139a38327d488894d9c883f3b @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 459d8f695ef868d0ec09920ab2035eebd36a66051f9905e2605f4600623faa47 -R 8b24f7285c9d92ca8cf04f526f040713 +P 317e9a470fba2a4b717b9cb66488b8fccb44810a80f3a7deaf1ea81906e2b8d2 +R 70f9a2f7e68a73caf1fe72ecdb3d41d3 U drh -Z fc7af611ca9f7a31dcf33650d3dd0378 +Z 5ee06f9c240d54c68e35a361db8f0493 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f9f95d23cb..af4c4d49c4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -317e9a470fba2a4b717b9cb66488b8fccb44810a80f3a7deaf1ea81906e2b8d2 +baac853871ad307b67b4d624b9ee47fc1313f1aa62c9f8072fb49e97aa33db94 diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 885f187a43..a9eb5fed72 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2211,7 +2211,15 @@ struct sqlite3_mem_methods { ** CAPI3REF: Database Connection Configuration Options ** ** These constants are the available integer configuration options that -** can be passed as the second argument to the [sqlite3_db_config()] interface. +** can be passed as the second parameter to the [sqlite3_db_config()] interface. +** +** The [sqlite3_db_config()] interface is a var-args functions. It takes a +** variable number of parameters, though always at least two. The number of +** parameters passed into sqlite3_db_config() depends on which of these +** constants is given as the second parameter. This documentation page +** refers to parameters beyond the second as "arguments". Thus, when this +** page says "the N-th argument" it means "the N-th parameter past the +** configuration option" or "the (N+2)-th parameter to sqlite3_db_config()". ** ** New configuration options may be added in future releases of SQLite. ** Existing configuration options might be discontinued. Applications @@ -2228,7 +2236,9 @@ struct sqlite3_mem_methods { ** connection. ** The arguments to the SQLITE_DBCONFIG_LOOKASIDE option are not ** in the [DBCONFIG arguments|usual format]. -** The SQLITE_DBCONFIG_LOOKASIDE option takes three arguments, not two. +** The SQLITE_DBCONFIG_LOOKASIDE option takes three arguments, not two, +** so that a call to [sqlite3_db_config()] that uses SQLITE_DBCONFIG_LOOKASIDE +** should have a total of five parameters. ** ^The first argument (the third parameter to [sqlite3_db_config()] is a ** pointer to a memory buffer to use for lookaside memory. ** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb @@ -2330,12 +2340,13 @@ struct sqlite3_mem_methods { **

^This option is used to change the name of the "main" database ** schema. This option does not follow the ** [DBCONFIG arguments|usual SQLITE_DBCONFIG argument format]. -** This option takes exactly one argument, which ust be a pointer -** to a constant UTF8 string which will become the new schema name -** in place of "main". ^SQLite does not make a copy of the new main -** schema name string, so the application must ensure that the argument -** passed into SQLITE_DBCONFIG MAINDBNAME is unchanged -** until after the database connection closes. +** This option takes exactly one additional argument so that the +** [sqlite3_db_config()] call has a total of three parameters. The +** extra argument must be a pointer to a constant UTF8 string which +** will become the new schema name in place of "main". ^SQLite does +** not make a copy of the new main schema name string, so the application +** must ensure that the argument passed into SQLITE_DBCONFIG MAINDBNAME +** is unchanged until after the database connection closes. **
** ** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]] @@ -2346,10 +2357,11 @@ struct sqlite3_mem_methods { ** connection being closed is the last open connection to the database), ** then SQLite performs a [checkpoint] before closing the connection and ** deletes the WAL file. The SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE option can -** be used to override that behavior. The first parameter passed to this -** operation is an integer - positive to disable checkpoints-on-close, or -** zero (the default) to enable them, and negative to leave the setting unchanged. -** The second parameter is a pointer to an integer +** be used to override that behavior. The first argument passed to this +** operation (the third parameter to [sqlite3_db_config()]) is an integer +** which is positive to disable checkpoints-on-close, or zero (the default) +** to enable them, and negative to leave the setting unchanged. +** The second argument (the fourth parameter) is a pointer to an integer ** into which is written 0 or 1 to indicate whether checkpoints-on-close ** have been disabled - 0 if they are not disabled, 1 if they are. ** @@ -2587,9 +2599,11 @@ struct sqlite3_mem_methods { ** ** [[DBCONFIG arguments]]

Arguments To SQLITE_DBCONFIG Options

** -**

Most of the SQLITE_DBCONFIG options take two arguments: an integer -** and a pointer to an integer. If the first integer argument is 1, then -** the option becomes enabled. If the first integer argument is 0, then the +**

Most of the SQLITE_DBCONFIG options take two arguments, so that the +** overall call to [sqlite3_db_config()] has a total of four parameters. +** The first argument (the third parameter to sqlite3_db_config()) is a integer. +** The second argument is a pointer to an integer. If the first argument is 1, +** then the option becomes enabled. If the first integer argument is 0, then the ** option is disabled. If the first argument is -1, then the option setting ** is unchanged. The second argument, the pointer to an integer, may be NULL. ** If the second argument is not NULL, then a value of 0 or 1 is written into From 97af1346f05ec5164751cbe69628636b1655bca3 Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 5 Feb 2025 12:49:15 +0000 Subject: [PATCH 12/15] Upstream JimTCL patch and minor tcl script tweaks to support (fconfigure -translation binary) for better cross-platform build portability. FossilOrigin-Name: 0974a17c4565f202777fc6203df20dca19acc1e8740ede15334783f41e3e5054 --- autosetup/jimsh0.c | 43 ++++++++++++++++++++++++++++++++++++++- manifest | 23 +++++++++++---------- manifest.uuid | 2 +- tool/mksqlite3c-noext.tcl | 2 +- tool/mksqlite3c.tcl | 2 +- tool/mksqlite3h.tcl | 2 +- tool/split-sqlite3c.tcl | 2 +- 7 files changed, 59 insertions(+), 17 deletions(-) diff --git a/autosetup/jimsh0.c b/autosetup/jimsh0.c index 84db85a207..4b9cf3eebf 100644 --- a/autosetup/jimsh0.c +++ b/autosetup/jimsh0.c @@ -75,6 +75,9 @@ extern "C" { #if defined(_WIN32) || defined(WIN32) +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif #define HAVE_DLOPEN void *dlopen(const char *path, int mode); int dlclose(void *handle); @@ -1864,7 +1867,7 @@ int Jim_tclcompatInit(Jim_Interp *interp) " $f buffering $v\n" " }\n" " -tr* {\n" -"\n" +" $f translation $v\n" " }\n" " default {\n" " return -code error \"fconfigure: unknown option $n\"\n" @@ -2936,6 +2939,28 @@ static int aio_cmd_buffering(Jim_Interp *interp, int argc, Jim_Obj *const *argv) return JIM_OK; } +static int aio_cmd_translation(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + enum {OPT_BINARY, OPT_TEXT}; + static const char * const options[] = { + "binary", + "text", + NULL + }; + int opt; + + if (Jim_GetEnum(interp, argv[0], options, &opt, NULL, JIM_ERRMSG) != JIM_OK) { + return JIM_ERR; + } +#if defined(_setmode) && defined(O_BINARY) + else { + AioFile *af = Jim_CmdPrivData(interp); + _setmode(af->fh, opt == OPT_BINARY ? O_BINARY : O_TEXT); + } +#endif + return JIM_OK; +} + static int aio_cmd_readsize(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { AioFile *af = Jim_CmdPrivData(interp); @@ -3145,6 +3170,13 @@ static const jim_subcmd_type aio_command_table[] = { 0, 2, + }, + { "translation", + "binary|text", + aio_cmd_translation, + 1, + 1, + }, { "readsize", "?size?", @@ -24342,6 +24374,10 @@ int Jim_InteractivePrompt(Jim_Interp *interp) #include +#ifdef HAVE_UNISTD_H +#include +#endif + extern int Jim_initjimshInit(Jim_Interp *interp); @@ -24425,6 +24461,10 @@ int main(int argc, char *const argv[]) } if (retcode != JIM_EXIT) { JimSetArgv(interp, 0, NULL); + if (!isatty(STDIN_FILENO)) { + + goto eval_stdin; + } retcode = Jim_InteractivePrompt(interp); } } @@ -24447,6 +24487,7 @@ int main(int argc, char *const argv[]) Jim_SetVariableStr(interp, "argv0", Jim_NewStringObj(interp, argv[1], -1)); JimSetArgv(interp, argc - 2, argv + 2); if (strcmp(argv[1], "-") == 0) { +eval_stdin: retcode = Jim_Eval(interp, "eval [info source [stdin read] stdin 1]"); } else { retcode = Jim_EvalFile(interp, argv[1]); diff --git a/manifest b/manifest index f5d136df4a..0f78ec938a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Attempted\simprovements\sto\sthe\sSQLITE_DBCONFIG_...\sdocumentation. -D 2025-02-05T12:02:43.871 +C Upstream\sJimTCL\spatch\sand\sminor\stcl\sscript\stweaks\sto\ssupport\s(fconfigure\s-translation\sbinary)\sfor\sbetter\scross-platform\sbuild\sportability. +D 2025-02-05T12:49:15.023 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -47,7 +47,7 @@ F autosetup/cc-db.tcl 6e0ed90146197a5a05b245e649975c07c548e30926b218ca3e1d4dc034 F autosetup/cc-lib.tcl 493c5935b5dd3bf9bd4eca89b07c8b1b1a9356d61783035144e21795facf7360 F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1de1e5460d78 F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f -F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 +F autosetup/jimsh0.c 5a74bdbf43c52289e3f482f3b9578db4bd657e88e8fe04b16c564d9fb710540a F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 9adf1539673cef15bff862d9360b479e6920cc2c0d85de707b0ba31c04ce4531 F autosetup/sqlite-config.tcl 00af5b9d94d580367bf01984b86397e8d35b74090427def9591a54ded0e1a287 @@ -2156,9 +2156,9 @@ F tool/mkpragmatab.tcl 32e359ccb21011958a821955254bd7a5fa7915d01a8c16fed91ffc8b4 F tool/mkshellc.tcl 9ce74de0fa904a2c56a96f8d8b5261246bacb0eaa8d7e184f9e18ff94145ebbc F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 -F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 1b24a4388f544a7f42fc2d03f34422182d3b2263453f65f642890259566369c1 -F tool/mksqlite3h.tcl 3cc8f3fbb3eca38c899549385622637667254067d865a70ad16e0996c2fd3214 +F tool/mksqlite3c-noext.tcl 351c55256213154cabb051a3c870ef9f4487de905015141ae50dc7578a901b84 +F tool/mksqlite3c.tcl ba13086555b3cb835eba5e47a9250300ab85304d23fd1081abd3f29d8ab71a2b +F tool/mksqlite3h.tcl b05b85c32295bad3fe64807729693d1f19faed3c464c5faac6c53bb6b972ac2f F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mksrczip.tcl 81efd9974dbb36005383f2cd655520057a2ae5aa85ac2441a80c7c28f803ac52 F tool/mktoolzip.tcl 34b4e92be544f820e2cc26f143f7d5aec511e826ec394cc82969a5dcf7c7a27c @@ -2187,7 +2187,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd F tool/spellsift.tcl 52b4b04dc4333c7ab024f09d9d66ed6b6f7c6eb00b38497a09f338fa55d40618 x -F tool/split-sqlite3c.tcl 5aa60643afca558bc732b1444ae81a522326f91e1dc5665b369c54f09e20de60 +F tool/split-sqlite3c.tcl 07e18a1d8cc3f6b3a4a1f3528e63c9b29a5c8a7bca0b8d394b231da464ce1247 F tool/sqldiff.c 2a0987d183027c795ced13d6749061c1d2f38e24eddb428f56fa64c3a8f51e4b F tool/sqlite3_analyzer.c.in fc7735c499d226a49d843d8209b2543e4e5229eeb71a674c331323a2217b65b4 F tool/sqlite3_rsync.c 9a1cca2ab1271c59b37a6493c15dc1bcd0ab9149197a9125926bc08dd26b83fb @@ -2209,8 +2209,9 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 317e9a470fba2a4b717b9cb66488b8fccb44810a80f3a7deaf1ea81906e2b8d2 -R 70f9a2f7e68a73caf1fe72ecdb3d41d3 -U drh -Z 5ee06f9c240d54c68e35a361db8f0493 +P baac853871ad307b67b4d624b9ee47fc1313f1aa62c9f8072fb49e97aa33db94 +Q +fddcfbcafd1b343ee95960564bb57785b8af18aaae16969d83f1550d6868737e +R a7b74c08eab9f96c10b2c2a2b89f2fbf +U stephan +Z c6d765f25f632bd465da0fecb9f4261f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index af4c4d49c4..f1bcc15a21 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -baac853871ad307b67b4d624b9ee47fc1313f1aa62c9f8072fb49e97aa33db94 +0974a17c4565f202777fc6203df20dca19acc1e8740ede15334783f41e3e5054 diff --git a/tool/mksqlite3c-noext.tcl b/tool/mksqlite3c-noext.tcl index 8452072564..1148b1c0d5 100644 --- a/tool/mksqlite3c-noext.tcl +++ b/tool/mksqlite3c-noext.tcl @@ -57,7 +57,7 @@ close $in # set out [open sqlite3.c w] # Force the output to use unix line endings, even on Windows. -fconfigure $out -translation lf +fconfigure $out -translation binary set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1] puts $out [subst \ {/****************************************************************************** diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index ddc1e58776..1d0f892363 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -88,7 +88,7 @@ set fname sqlite3.c if {$enable_recover} { set fname sqlite3r.c } set out [open $fname wb] # Force the output to use unix line endings, even on Windows. -fconfigure $out -translation lf +fconfigure $out -translation binary set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1] puts $out [subst \ {/****************************************************************************** diff --git a/tool/mksqlite3h.tcl b/tool/mksqlite3h.tcl index 8ef123bc72..b1d5ecdcd3 100644 --- a/tool/mksqlite3h.tcl +++ b/tool/mksqlite3h.tcl @@ -107,7 +107,7 @@ set declpattern5 \ {^ *([a-zA-Z][a-zA-Z_0-9 ]+ \**)(sqlite3rebaser_[_a-zA-Z0-9]+)(\(.*)$} # Force the output to use unix line endings, even on Windows. -fconfigure stdout -translation lf +fconfigure stdout -translation binary set filelist [subst { $TOP/src/sqlite.h.in diff --git a/tool/split-sqlite3c.tcl b/tool/split-sqlite3c.tcl index 0308431dab..de4db55a1b 100644 --- a/tool/split-sqlite3c.tcl +++ b/tool/split-sqlite3c.tcl @@ -15,7 +15,7 @@ set END {^/\*+ End of %s \*+/} set in [open sqlite3.c] set out1 [open sqlite3-all.c w] -fconfigure $out1 -translation lf +fconfigure $out1 -translation binary # Copy the header from sqlite3.c into sqlite3-all.c # From 6c074e5dc40e7375ea5cf985ca2ea508dacddf4e Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 5 Feb 2025 12:56:55 +0000 Subject: [PATCH 13/15] Summarize known incompatibilities/gotches between JimTCL and canonical TCL, and their workarounds. Doc changes only. FossilOrigin-Name: 60c932e67b886d4c050698f36e1d3fc04eb99473d62bb3b1585a97d90e27227e --- autosetup/README.md | 24 ++++++++++++++++++++++++ manifest | 13 ++++++------- manifest.uuid | 2 +- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/autosetup/README.md b/autosetup/README.md index 19a16c943a..2d6cf723c0 100644 --- a/autosetup/README.md +++ b/autosetup/README.md @@ -196,6 +196,30 @@ APIs must not use `[file normalize]`, but autosetup provides a TCL-only implementation of `[file-normalize]` (note the dash) for portable use in the configure script. +Known TCL Incompatibilities +------------------------------------------------------------------------ + +A summary of known incompatibilities in JimTCL + +- **CRNL line endings**: prior to 2025-02-05 `fconfigure -translation ...` + was a no-op in JimTCL, and it emits CRNL line endings by default on + Windows. Since then, it supports `-translation binary`, which is + close enough to `-translation lf` for our purposes. When working + with files using the `open` command, it is important to use mode + `"rb"` or `"wb"`, as appropriate, so that the output does not get + CRNL-mangled on Windows. + +- **`file copy`** does not support multiple source files. See + [](/info/61f18c96183867fe) for a workaround. + +- **Regular expressions**: + + - Patterns treat `\nnn` octal values as back-references (which it + does not support). Those can be reformulated as demonstrated in + [](/info/aeac23359bb681c0). + + - `regsub` does not support the `\y` flag. A workaround is demonstrated + in [](/info/c2e5dd791cce3ec4). Design Conventions diff --git a/manifest b/manifest index 0f78ec938a..da809967ae 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Upstream\sJimTCL\spatch\sand\sminor\stcl\sscript\stweaks\sto\ssupport\s(fconfigure\s-translation\sbinary)\sfor\sbetter\scross-platform\sbuild\sportability. -D 2025-02-05T12:49:15.023 +C Summarize\sknown\sincompatibilities/gotches\sbetween\sJimTCL\sand\scanonical\sTCL,\sand\stheir\sworkarounds.\sDoc\schanges\sonly. +D 2025-02-05T12:56:55.992 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -37,7 +37,7 @@ F autoconf/tea/win/rules.vc 94a18c3e453535459b4a643983acca52fb8756e79055bd2ad4b0 F autoconf/tea/win/targets.vc 96a25a1fa6e9e9cfb348fd3760a5395b4ce8acafc8ed10f0412937ec200d5dbd F autosetup/LICENSE 41a26aebdd2cd185d1e2b210f71b7ce234496979f6b35aef2cbf6b80cbed4ce4 F autosetup/README.autosetup a78ff8c4a3d2636a4268736672a74bf14a82f42687fcf0631a70c516075c031e -F autosetup/README.md 2737c4eb44b022a694b1f93fb01c3b6c3a45b4f663e18490c2106643a77b39da +F autosetup/README.md b306314e8a87ccf873cb5b2a360c4a27bbf841df5b76f3acbd65322cff165476 F autosetup/autosetup df8b53928b1fe3c67db5bc77c8e1eb8160c1b6a26c370e9a06c68748f803b7e4 x F autosetup/autosetup-config.guess dfa101c5e8220e864d5e9c72a85e87110df60260d36cb951ad0a85d6d9eaa463 x F autosetup/autosetup-config.sub a38fb074d0dece01cf919e9fb534a26011608aa8fa606490864295328526cd73 x @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P baac853871ad307b67b4d624b9ee47fc1313f1aa62c9f8072fb49e97aa33db94 -Q +fddcfbcafd1b343ee95960564bb57785b8af18aaae16969d83f1550d6868737e -R a7b74c08eab9f96c10b2c2a2b89f2fbf +P 0974a17c4565f202777fc6203df20dca19acc1e8740ede15334783f41e3e5054 +R ac84e39b3790b8114a07b99fae22b35b U stephan -Z c6d765f25f632bd465da0fecb9f4261f +Z 5ac40daff7d720f4fde033e3e4223e0e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f1bcc15a21..46ead94eed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0974a17c4565f202777fc6203df20dca19acc1e8740ede15334783f41e3e5054 +60c932e67b886d4c050698f36e1d3fc04eb99473d62bb3b1585a97d90e27227e From 31c3599ed01897693912f92d36f3285e1f2471b4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 5 Feb 2025 16:08:11 +0000 Subject: [PATCH 14/15] Fix a harmless unused-parameter compiler warning introduced by [75f3d8744879]. FossilOrigin-Name: 9f28f6694f97d5ee0345b45f9bf81e3fdce0990ce32fb9bdbbaac079126a67c9 --- ext/fts3/fts3_snippet.c | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index c79cca4a6d..8a6ab8ea62 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -1594,6 +1594,7 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ static int fts3ExprRestartIfCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ TermOffsetCtx *p = (TermOffsetCtx*)ctx; int rc = SQLITE_OK; + UNUSED_PARAMETER(iPhrase); if( pExpr->pPhrase && pExpr->pPhrase->bIncr ){ rc = sqlite3Fts3MsrCancel(p->pCsr, pExpr); pExpr->pPhrase->bIncr = 0; diff --git a/manifest b/manifest index da809967ae..d0ed9ae692 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Summarize\sknown\sincompatibilities/gotches\sbetween\sJimTCL\sand\scanonical\sTCL,\sand\stheir\sworkarounds.\sDoc\schanges\sonly. -D 2025-02-05T12:56:55.992 +C Fix\sa\sharmless\sunused-parameter\scompiler\swarning\sintroduced\sby\s[75f3d8744879]. +D 2025-02-05T16:08:11.074 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -87,7 +87,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c e19807ce0ae31c1c6e9898e89ecc93183d7ec224ea101af039722a4f49e5f2b8 -F ext/fts3/fts3_snippet.c 92196bd5941be0455f2c7e51c2f8280df49c7feb0615a0d1d4d045f2dcf60713 +F ext/fts3/fts3_snippet.c 7a3d5e2cefbb1cb51fb9c65458670cc269647ede18e1ffd57b513f9b4ec10c3e F ext/fts3/fts3_term.c 6a96027ad364001432545fe43322b6af04ed28bb5619ec51af1f59d0710d6d69 F ext/fts3/fts3_test.c 7a9cb3d61774134211bf4bfdf1adcb581a1a0377f2d050a121ae7ab44baef0e3 F ext/fts3/fts3_tokenize_vtab.c 7fd9ef364f257b97218b9c331f2378e307375c592f70fd541f714e747d944962 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0974a17c4565f202777fc6203df20dca19acc1e8740ede15334783f41e3e5054 -R ac84e39b3790b8114a07b99fae22b35b -U stephan -Z 5ac40daff7d720f4fde033e3e4223e0e +P 60c932e67b886d4c050698f36e1d3fc04eb99473d62bb3b1585a97d90e27227e +R 84a73aa92675a2727074c491235ee053 +U drh +Z 84a578fb1294f91eaec33c542173ac0d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 46ead94eed..0704181ca7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -60c932e67b886d4c050698f36e1d3fc04eb99473d62bb3b1585a97d90e27227e +9f28f6694f97d5ee0345b45f9bf81e3fdce0990ce32fb9bdbbaac079126a67c9 From 659bafd05dee789298074283ce857e27e65ef675 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 6 Feb 2025 11:55:18 +0000 Subject: [PATCH 15/15] Version 3.49.0 FossilOrigin-Name: 4a7dd425dc2a0e5082a9049c9b4a9d4f199a71583d014c24b4cfe276c5a77cde --- manifest | 11 +++++++---- manifest.uuid | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/manifest b/manifest index d0ed9ae692..d38d362fbb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\sunused-parameter\scompiler\swarning\sintroduced\sby\s[75f3d8744879]. -D 2025-02-05T16:08:11.074 +C Version\s3.49.0 +D 2025-02-06T11:55:18.769 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -2209,8 +2209,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 60c932e67b886d4c050698f36e1d3fc04eb99473d62bb3b1585a97d90e27227e +P 9f28f6694f97d5ee0345b45f9bf81e3fdce0990ce32fb9bdbbaac079126a67c9 R 84a73aa92675a2727074c491235ee053 +T +sym-major-release * +T +sym-release * +T +sym-version-3.49.0 * U drh -Z 84a578fb1294f91eaec33c542173ac0d +Z 345e0ae7aa6443f7f8d274ba6f526736 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0704181ca7..71c984af80 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9f28f6694f97d5ee0345b45f9bf81e3fdce0990ce32fb9bdbbaac079126a67c9 +4a7dd425dc2a0e5082a9049c9b4a9d4f199a71583d014c24b4cfe276c5a77cde