From d59a4b2e178d2980d402fa49ab21549fc1e7b739 Mon Sep 17 00:00:00 2001 From: rev Date: Mon, 2 Nov 2026 16:51:49 +0100 Subject: [PATCH 1/6] Refresh shared external NuGet and tool dependencies (Refs #5254) --- .agents/skills/atlas/assets/seed/catalog.json | 2 +- ...c54069818d2ff48ce0f35019b811add042047.json | 1 + .claude/skills/atlas/assets/seed/catalog.json | 2 +- ...c54069818d2ff48ce0f35019b811add042047.json | 1 + Directory.Packages.props | 12 ++-- .../host-attempt/tests/packages.lock.json | 30 ++++---- .../host-binding/tests/packages.lock.json | 30 ++++---- dist/dotnet/.config/dotnet-tools.json | 4 +- docs/atlas/catalog.json | 2 +- ...c54069818d2ff48ce0f35019b811add042047.json | 1 + docs/build/README.md | 9 ++- registry/driver-skill-manifest.json | 9 ++- scripts/NewSddWorkspace/packages.lock.json | 20 +++--- src/FS.GG.Coord.Cli/packages.lock.json | 20 +++--- src/FS.GG.Telemetry.Host/packages.lock.json | 36 +++++----- src/FS.GG.Telemetry.Store/packages.lock.json | 18 ++--- .../packages.lock.json | 50 ++++++------- .../packages.lock.json | 42 +++++------ .../packages.lock.json | 50 ++++++------- .../FS.GG.Coord.Cli.Tests/packages.lock.json | 62 ++++++++-------- .../FS.GG.Coord.Core.Tests/packages.lock.json | 42 +++++------ .../packages.lock.json | 30 ++++---- .../FS.GG.Org.Policy.Tests/packages.lock.json | 30 ++++---- .../packages.lock.json | 30 ++++---- .../packages.lock.json | 30 ++++---- .../packages.lock.json | 50 ++++++------- .../packages.lock.json | 30 ++++---- .../FS.GG.Telemetry.Tests/packages.lock.json | 70 +++++++++---------- .../packages.lock.json | 30 ++++---- .../packages.lock.json | 50 ++++++------- .../packages.lock.json | 30 ++++---- 31 files changed, 417 insertions(+), 406 deletions(-) create mode 100644 .agents/skills/atlas/assets/seed/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json create mode 100644 .claude/skills/atlas/assets/seed/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json create mode 100644 docs/atlas/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json diff --git a/.agents/skills/atlas/assets/seed/catalog.json b/.agents/skills/atlas/assets/seed/catalog.json index b744ed564..b35cb52ab 100644 --- a/.agents/skills/atlas/assets/seed/catalog.json +++ b/.agents/skills/atlas/assets/seed/catalog.json @@ -1 +1 @@ -{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","0052dfb9eafceabaa590f4497e4d42f19020718c84b981d265edefd432ccf8dd","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04652cbc95ac4dcd21b837b38f2ca5a0ccd4d0946bc13fdb31c9c15a578d3a2d","04d17203f03279980862496517a1f0861be5f6cc8063bfbf92f8f8ac19744fdd","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","076259a45e71df780b012d29618c17739246c86321d2ff05a6c272bcca8db675","076fa091c878b19cf56a94be0966dbcd58d52c1839f9d4b85bbfdef650cbdb88","08b3dc660b9d2bbbe75b590b2b86d941bf935a254cd5f09de71ee6894f4048b6","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0b2d1557ff6df5f4d65d540a5403b07ba81b381dfc799b7884ac72dfa6ee7753","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0c7d3f36e3bb4270edbf7abd99cd2dab772df274cad1c27c7e87e302b8eb1c23","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","0f11324ad653d8d841962b0eeae9f68b80243d4ef7df4f2404ed4c3e45ba5197","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","13d0363b8d765c87a57eb42c4988320a9c2e7fa09024aa972f4b13d7699a552d","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","15d41240067e2335a0354a4e910b6610f2b8f079b8f67186f10181622b4a8999","1746f4f9d47b7dc42280dd34e664b3ec410d3cc69ac76933707499ffa34c79d4","1754adaf40732c3a8c73d2285c25a8b6c8c9d3e68370de618a0ffa8f3e60fb6d","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","19e75be8ed4dfba2a6f8034154052160a7a181b17d887b3e8724f3e3c111c31e","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b3ec24337f0252a00cfeb6df0a0f5d2b6d737dbea61b8d0b4a643f4c686df6a","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1b8cad98d53da179ab05eb47c1783f4c8b45b9f39c635e7a337285f5cd9621c1","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","20d01a387b4d0801cb588492ede88cae7bade9b7ea3591d9e954add1e67cf4ce","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","22ef13e60456fe9046dfe72f20122362aeefbbb445632231b8e364ed9b50e135","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24373b643450d9dd3b8a5b0e74a5fec2844cd8cbca7d8a57dbc8b9ad9eade9dc","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","2905a2b4a58bd9ec1c4f77fd3d1d246c02caa49d806272756dd039c79521442f","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2b4f7c8dcc95ca8182105b9b6806391666e6a2c3a5c80d3ce5a5f04fd6cf9122","2b5e739c8f9602c585e67554c457e6e53351679afd56ff324f8fecc80f0891f1","2bc251ffb58a0d03480748058eff4c44079a0f21d75743063cef50263982337a","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d46924a94c85f4275a449dd3d9eb6c602cf8a9104db19d224e3aa469b858d06","2d5048eeef90792c0a2b9aed7305598a28db2103fed3903462c6c1882733c3e8","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2df1610ac1b912232030b5507e5e944515b0f1549bf2b76ecfb12baf0f40ccea","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","2febddcced970d495778f33fff212929ac99c23adc42be0c1062f5c8676ffce0","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","31fe4b51d55cd99a4692d2cb787d362cb4c0d0998d3e001efdb5cb7ed838340f","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","3442ba5c7643c793f62d90ca841f7891b3dbf97f028bc7b62f8b4f88c1266d1c","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","3600e7356a3741ef02f8b2ffa6a6b5d822dcbb170771f2ea33312dff4470f431","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","3962789d05f324d436a363700cbb5ced5aba791d782b3c0ea73221fe0c1f0b97","3966e5e53811c43962f5d0953e5da4753eacefbea27ecba9d36af2fd8e4fd52f","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3bce154e59c5c45216bb5372a352e948d6cb365bb1bd47d4666ae0412e507ca4","3c75b650f3fa8217597b01d3aaf25427ae2a658a7c966afeecdb391d3ba547ea","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3d642ccf9ca4a0f7f5dde1b41f65c99e9c447cbb9e64883b67e4fdf76f216f52","3d9fd2c5877483382f0c7331206393e42827b5dccfd60549a6771b7a5659e524","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3dffc36586e9078f750b0a2b4cc2c70a17a81294903186dbe8cc47cf8055b9bd","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","3f5465798dbc2ad279ca4849d5d0f819bad01455e0dd2a9d98afd4b55cfbd7ee","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","4134a3936170c1fb5fa6d2e2329185a981436477a66b7d31e827c363691bad50","414259a2fda4a1a49729be6fb1aced4675ee9cbdf990aaafb8e5b3153b54d64d","41baa5d98b5bab2ee01cad50c05b83edd8cdfeeb00f30b9406b4b2ec6d13d738","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","4457ab439bc8f212d83442dc7500e9d45ffac849d0f77cb97686d9b0672fc3dc","461d34fb1d53849951a7e715e52342372d779299fbcad210794235c610dadf64","46a24cd8e385b748f40d9271b1e856dd6d68c91ab356abb11ff6b65f1ef936bf","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","471570cdf8144df0c32aba1730aba24c7e42e5ec317af771ffa169f5c842d117","47b5cb2b011c0f7012d75e88eb86a10f3f0bd48545db139669e654cac1f69650","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","48262b98c0bdbd5ee2314345726d23630ec1771735db8fe5f1a8590b662c9962","482cd15ecd9cfbd8e1943c0fcde0bbf1d875392dc2a701b698f48bfba684a062","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","48de3afdc6ee73ed121d1433bc6367a399286d5f8c2c63670a0b3b9752a36175","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","49ee4a3f2a8918bdbbafb312cfa807d9982800d13d29ee292c6c0daad8b9b8f1","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4b6ab2768e1ff3716ac8565201c031a820c208db9ea6ae1495dd782e7557a3ab","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4ef30f11bd4dd9d2eef8716d88a83010546e54594b2726de84f6d587651ee940","4f03e231c0dc5c9bb2874f6856382d5b205758af9678fffdc7552d4e4ae9866e","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","4f6fcf4dd7e73d86e06bdb9c14a1078b61c0efb2663ced9bfbc5f46fbb4c6d8e","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","521ed246c4119acd6b579b6eefa23389a1655df54aa35de7671743979ebfc68d","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","55dcc23ce52b3918a60029d9398f262216471c280bfe66421cc63240533a6087","566ddcfc45ea5edc695626826ed185930e910fd9107c5bc1844c717b714c15b2","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","581337891936ba630d34ce9f6b803b82a2130791510f15bab24a07332400417f","58901d008c36a777dc138fa6b6d198030e0e843bc889cbad3acb954c826b3608","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5be05ba74075b8f139be565c47688a4f395ce71452dce5cf7da4348c7ddb7aa0","5c0206d9d014821b52a43d7b222327a89d4ee2f5b1e21813dfa659a69f7426b5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5de00a2f5eabe86c14f360304115f4136c41df1fb664eef6da26072fe7623d44","5e3a589b627edaf7005c60382475fae7229adc4ffbaab6d6fd03e9f08a0a8e19","5e43baca07fb966bf1c4b3ac06bb819577e477a84c5d8d3a9a19c391ada2e0b5","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","600ec184ee9964881bcaeaf72ad38a72db05d5b629d301cb323fa1ee9369b572","616c4dbde10f465da822d8a788feada26e5f915c7fbbc06232287cd1899c3044","62a713311297a7145d3610ee60dd6626ee543645a1918b050c629207561efb5e","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","6312b7a9f8252f49b8ea0cbd0580b80bbb221db574ea74939823ed9d4140d73f","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65725e1cd3323fdf44ec47067fd6670b441ff5f82e99485e1a4fc7d475f14340","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","6601b2bb6c908a46ae2985d4683c8baeeec87b0688b9b33d3e8900286bf4d6ae","666e7f698fbeef24e13e91ccfa334cf781233e060fa86bcd7d4d0eb00b30f3d5","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","671168c05789fc651cd961a5a15e10adbb76656b802cb0fcbab468ab76412ca2","671d95a6c09bb7b05a5721d52cb761300a2c8f376aac20be2948b7e97bf302b7","680de944f1f5380c579003e329ed6f10702ec8ebaaa8208743775588d2424d05","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","7075f89b1271fd04fa02d4db95c0f0bd6bdec24e53a7953d7afaeba40e17e8e0","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","74b5d2ed555740db7b4b0ea9b73f8fe00965fea8e14d4f075eec26ef7a189c68","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","786b0c2856bf1f3f809e5903b0a971f1e072af5635aa50bbb9b1449f96d7b694","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7af2394d2e697f355439e841b6323ffbbf8b90b2e48bf64873791fbbfdf15b44","7b947ed0a9e6e7ba180921434b993c62ac70bbaba6af0a1618569a2d4b705201","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7c2a1c4c4c03e3d68d63e0ab58e4e34d3f2bc1a4a837a055fd13a4e9f95ce6cb","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7dd54213b65fa0a6ce5aa3c204b5209b67ec16306b776aed7dcf9e6601d74235","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7efb464c6d7b469303c43f718063d8456df6fe43534b5d8a4229f5b9ba9705cd","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","83347356a898238c013dff73246440e361a9e24cc3c4e0fe0e850467772b4938","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a06a604bbe36d72da976fcdeb88665c762b0f0de44193576ef2e0cf29aa9ad","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","85e961266b36e0f8ec2a477f1f1dfe7ad748fdde9d906f7bd3241e6924866ea9","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87789dab547842b4e0c822758e1325a3cbb046063e11e105a4779b3741e01cde","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89a96597dc9c218633adaf94bb5d6dcf4cad8f5e0b6f5522a28e3ce8d8b2865f","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cce78271b4f001606069a575a172041fbddc52de6b582c920aa3d3b5d5b67ae","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8f3827158091bbed154d21c843284ad472a4552da2eeb858748aa29676e45662","8f4a21c70e4b933eaa4f9cee119945dd2ebeac532e82d34e17511b38cf03608c","8f6debc54d2bd7abb42f581f2204fc78b27ff8c67ee4b6392b4d71c5f983ee9d","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","90aff66decaa3a0998e9a6741963713c0c82fc70da505519e3d60204bf715fa0","90dc4cac6326293bb54486d3c873b83299e9a5ec8c86a68bf1cc131f5e4e2437","918126027fabb7947dd4ae810dd561ac22167102f9f978f86906624ebe88c9ea","91b495938bc6015970bb02c844368d3eee84425b472772cdb374a5347db86de9","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","922a332aa100d622da733aea8fc74094739bb63cd480d3349a14d2418ab6b1bb","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","97edc66e594bae06bb273db84a35d84c8162a1fdf55ed46d781419a9f6a2e4f2","985638a05562bb796911ec231d306b81e36ed6b58219b3bde874559e9600b59f","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","98ecc99d3396aa9a35ce97456be66c1aac0cc05bab88aa99109649291e61bc0a","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9a8f2389b8ebc29d3769868ff8b918fdeb2236d88192fcf76ab0ea3db0857fac","9af18d8cfee466bc061271d82254d7ea638b59b8d5a3901c6610d5baed85c38b","9b01e565a1541f9e652d7afbe62e3bbff28430c1ccac2226ea434f45fc9a99d0","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d1a0da545eb6b2e16b18fdd305a2c000ff2340c19ac843914b45f6a4f936227","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9dfd29090b50334ae229e4a7e812cfb9f6204a66dde563e215d8f52e884cb103","9e77badd0923fd79ca9761a41780ee4dd4f9ca9b62512f4fb59c7f8418494da0","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","9fb8c5aa087d38dab064a2d6054826377eea3dda98229725c2523f63a87e4750","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a2aec2d2f35d7174801247141d637e77c4f34e478c575b0e0a04c6251efaf993","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a3d6708506fb5c28f45f0d610bedba11b1ec7bcdb363ffff3aa4cddfa515f56a","a476183540f2e7121e533bf2dd9125dc071c81acc880e88cb435cad7a6d35b97","a4a8cca930cdfd15285ac3a7aa757d61501fb77fc12a7c3fbd78c096b279cf63","a50654761d6812cd811df02199e1b7b25c9b0d65e591f65430f9277ec43d9c50","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a644885c31f390b5e6b7fe2fc8d086d9144699295ccb6ffa51b3f7c76c8ca71a","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a70d82083944311ccf98b6aa8da5adebc93c655759eaaf8d79624bb3d322abcb","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ad0e6d78c1e450e19bfca4a0e904644ab0ae315607811a28ac3dba20de869786","ae43a4d252290ec0e18c64dd58d51bc885020b2473e71e3ed0741184c9f006b7","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b3f50ed7eac0e9c54b74c4f4e02297dd2d2465ce4b699bcc15cfddf54c0f0f81","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b4f2140fb766faf0065a563ac3664f395b24c81dab0d0d0d01df47b22e888d29","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b5c085be21651d8579e52cd3ffe4abe6b7f45c5a9ee84d38c47b4734409918d8","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7fda8f4bf81f8213d18e3c314df5100ccb6b8db7aed6b70aaf202deb606a14f","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b83b7229045affbb98f8fc46f289ad05e6626ef52e3ed2f7e70d332a54a69e2a","b83f5334b85422ac110a24286d5af7003f2fb5b0d783efe257b38a2281656422","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b8b8c5cad182083f45ce2d05d036e6bfe91cde1fb63f2e5a97c683bb7ef7ea0f","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba5c707cf9be40fe966c08807779994e20ca3f30ea9d73e26ce31ca334c05640","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bad8f17b1d399ea125c524895571601c90b6c93418c248bd4ebcc7886bae9878","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bcbef69f1ba50e45f3faf1b4529c32cdcf1e5a6612b5bcbc6aa6790ee14b54eb","bd3bf6053f4d423ff21f7ffbed9d0e68f3ea64b7292c048e9a37ade342bb7b39","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c055d3cfd85b2ed4607b0d9d3a15ab7204c9f149599f748347dca4afe102af0c","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23a43ed460117f663cec698412729fd91b5aaceb48cc4e55a785b525661bf1a","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c24546a064b9315172ce0f951bd5fa2cd1b9884231cf1bdc1dc714771f1b3886","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c2e96d98c8ebc10237a2af1c224f626acfb9072c83078f4a8c6d9ef0a58b4a8e","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c4ebd58c4ff78c9fc0cd17d80ed563520f7908f9d1106735ca0f5a7abed202a6","c5db39bbdc8c2bd2aa7b58c28c3df9e407955cc3250ce7825c842cc4c30eaca3","c65325f807190f7084346376e2f48fc2b6bb946004a1fac1d8d117930e93d462","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c82f38f23e7ed3e1024661b7a22ff694e88d3b268240e2bfc98e630df8a062d0","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","c93cd4cb5cf38fe6221fa8ae171ff54240b5f99ba80cd740ffac69c57e5fa381","ca50b525d7aa7762c56f402696dd464841daf19b036bb932e325090004b4cd71","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfb9705939742247da0cb71fdfd8b5f7a1bef6f1c2f0979a8f42e54c4a480980","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d151ffa66d8d096e0272f0dfff6c27e978cfda570f7498a727593081888b4ebe","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d268e680ee1136a239a40ebf005b30db6f3b52a228016f3193496f86250f15c3","d2989a1607fd5303615937b8c117d127b1b1cde519662ab1e1324390220e8612","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d2e82db1f6e479001e15c9890732b5049f8c900c568d5e3d15707a95a7dc3610","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d36034e2f9cc642d0f9f24cf834fa741bac5b8b139cbd2f50e2065161c9f3cb0","d36eb7456d2a42d1cffa4b60708e2bd3116f7f6758c96bbc0fee0f1704ad8a79","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d555a0d2329caace197c1468fe6708349125762377ee3bd04b031b7eacfc26aa","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5adedc08fa25bd06734afd1db3510dbc53ba0dfdac20cf601fde0c77702a72a","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d67ec5caeb2af5f9c57533a34cbde7daba5f5b2e5e6ce34c3250893eef25f13c","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d7a44c85c25ceb7d42280f0c2576de52a3b3cc3ad2333e788ecdc7f7f7fe4b3b","d7f5db16fd3b6ddd5acdf655e090ed0e84cb89d9eafbe1ea92b273b71a38f173","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8c8b3c52c89cd715a7fdd2759a6f73c3a5f505303b110656cc35f7549a37cfb","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","daa0fc9f9dd08cb2dc48bf33c9808cfeebff77cb9fba48f98ef597bb9dd6df55","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","db66a999537b941fa6d512908894ba86e8dadd0e14b290ebc119555b7e60264c","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e519e78acf2938460c7ee053981c744dafc7642fd03b56a117d5fec78d258b90","e5db07b7fb0eed216d838fbeb9491257cf54f9bd537a68c8edae7a89fe64c8d8","e61705ac769699a40c52e332cd890187ca9301fc6e64393c8c9064144ccc2dbf","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","e981ced1bfce64a19fa8de1cd518a93f4669d01548f4819d0e1dbb50d266fe04","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eaeec7c06d1408fa6db5d7ada0a232b1633ffdf0ac815033c29c159352347c81","eb708890ac7e19bd53007ccece064f7e2a069a3751270b4fdafdd1668136dee7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","ebcf0bdb3541c8bfb7c9a53f632329b77341cba6f1a2fa0dc9704acfa3276dca","ebd87e3505f3a1adff0c86ffec6c380734df718301b216b7ee089c174130de60","ecd5e83ba8c8eba6cef9c3da1edb8a84e3dfb4ed71d9a2c1908f2c4d26b26737","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0e1db9b86e2132f004ebf06819eb55804f766bc03ea5d80f487d5d98bad8892","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1297fd9ecf981024e1544f7f048705377b53219240274bb803ac30e4a52084f","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f260b4b268e85a8f1b04b2fc69ffc0bca473d2e42de6f2f70128bedc16558201","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f4de28905adbfe6ae4bc38f8bf5f47a444aa8d0f2023faaa431d6f72f9a3edea","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f5403593ba12130c04827f88d019103e924651caa518b7c290673a02f7cb409f","f5681dfc71121ed0f88146a19479675f2fabc6ed376fd5d162e50d815c048d66","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f7993302f695430a0ee938b1b3684fdfec4055bddb378b52c81785c0319e8c98","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","facb45d3084caa490d9b0ac2bcfcee89629a4c3db5926ec9256a9d27d25559ee","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fbd74e4b8dc748b2efdd70aaab07adb80d7f15a38c1261de85bdfd9591ff106a","fc475f9c2d8bee2ffea435e86e6b39b6e3e071143a4a1fdf6765b0da13b66de6","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","fdbd44d3c55504edfa1bacb4c9b7a6c102659d4deef0ca91b9b7ac567ea9cfc5","fedf2577267d6dcd060ebc4ee8de6ccdafa60ab26b78d74c1e8c784252fecb17","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} +{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","0052dfb9eafceabaa590f4497e4d42f19020718c84b981d265edefd432ccf8dd","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04652cbc95ac4dcd21b837b38f2ca5a0ccd4d0946bc13fdb31c9c15a578d3a2d","04d17203f03279980862496517a1f0861be5f6cc8063bfbf92f8f8ac19744fdd","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","076259a45e71df780b012d29618c17739246c86321d2ff05a6c272bcca8db675","076fa091c878b19cf56a94be0966dbcd58d52c1839f9d4b85bbfdef650cbdb88","08b3dc660b9d2bbbe75b590b2b86d941bf935a254cd5f09de71ee6894f4048b6","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0b2d1557ff6df5f4d65d540a5403b07ba81b381dfc799b7884ac72dfa6ee7753","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0c7d3f36e3bb4270edbf7abd99cd2dab772df274cad1c27c7e87e302b8eb1c23","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","0f11324ad653d8d841962b0eeae9f68b80243d4ef7df4f2404ed4c3e45ba5197","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","13d0363b8d765c87a57eb42c4988320a9c2e7fa09024aa972f4b13d7699a552d","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","15d41240067e2335a0354a4e910b6610f2b8f079b8f67186f10181622b4a8999","1746f4f9d47b7dc42280dd34e664b3ec410d3cc69ac76933707499ffa34c79d4","1754adaf40732c3a8c73d2285c25a8b6c8c9d3e68370de618a0ffa8f3e60fb6d","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","19e75be8ed4dfba2a6f8034154052160a7a181b17d887b3e8724f3e3c111c31e","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b3ec24337f0252a00cfeb6df0a0f5d2b6d737dbea61b8d0b4a643f4c686df6a","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1b8cad98d53da179ab05eb47c1783f4c8b45b9f39c635e7a337285f5cd9621c1","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","20d01a387b4d0801cb588492ede88cae7bade9b7ea3591d9e954add1e67cf4ce","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","22ef13e60456fe9046dfe72f20122362aeefbbb445632231b8e364ed9b50e135","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24373b643450d9dd3b8a5b0e74a5fec2844cd8cbca7d8a57dbc8b9ad9eade9dc","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","2905a2b4a58bd9ec1c4f77fd3d1d246c02caa49d806272756dd039c79521442f","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2b4f7c8dcc95ca8182105b9b6806391666e6a2c3a5c80d3ce5a5f04fd6cf9122","2b5e739c8f9602c585e67554c457e6e53351679afd56ff324f8fecc80f0891f1","2bc251ffb58a0d03480748058eff4c44079a0f21d75743063cef50263982337a","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d46924a94c85f4275a449dd3d9eb6c602cf8a9104db19d224e3aa469b858d06","2d5048eeef90792c0a2b9aed7305598a28db2103fed3903462c6c1882733c3e8","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2df1610ac1b912232030b5507e5e944515b0f1549bf2b76ecfb12baf0f40ccea","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","2febddcced970d495778f33fff212929ac99c23adc42be0c1062f5c8676ffce0","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","31fe4b51d55cd99a4692d2cb787d362cb4c0d0998d3e001efdb5cb7ed838340f","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","3442ba5c7643c793f62d90ca841f7891b3dbf97f028bc7b62f8b4f88c1266d1c","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","3600e7356a3741ef02f8b2ffa6a6b5d822dcbb170771f2ea33312dff4470f431","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","3962789d05f324d436a363700cbb5ced5aba791d782b3c0ea73221fe0c1f0b97","3966e5e53811c43962f5d0953e5da4753eacefbea27ecba9d36af2fd8e4fd52f","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3bce154e59c5c45216bb5372a352e948d6cb365bb1bd47d4666ae0412e507ca4","3c75b650f3fa8217597b01d3aaf25427ae2a658a7c966afeecdb391d3ba547ea","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3d642ccf9ca4a0f7f5dde1b41f65c99e9c447cbb9e64883b67e4fdf76f216f52","3d9fd2c5877483382f0c7331206393e42827b5dccfd60549a6771b7a5659e524","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3dffc36586e9078f750b0a2b4cc2c70a17a81294903186dbe8cc47cf8055b9bd","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","3f5465798dbc2ad279ca4849d5d0f819bad01455e0dd2a9d98afd4b55cfbd7ee","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","4134a3936170c1fb5fa6d2e2329185a981436477a66b7d31e827c363691bad50","414259a2fda4a1a49729be6fb1aced4675ee9cbdf990aaafb8e5b3153b54d64d","41baa5d98b5bab2ee01cad50c05b83edd8cdfeeb00f30b9406b4b2ec6d13d738","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","4457ab439bc8f212d83442dc7500e9d45ffac849d0f77cb97686d9b0672fc3dc","461d34fb1d53849951a7e715e52342372d779299fbcad210794235c610dadf64","46a24cd8e385b748f40d9271b1e856dd6d68c91ab356abb11ff6b65f1ef936bf","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","471570cdf8144df0c32aba1730aba24c7e42e5ec317af771ffa169f5c842d117","47b5cb2b011c0f7012d75e88eb86a10f3f0bd48545db139669e654cac1f69650","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","48262b98c0bdbd5ee2314345726d23630ec1771735db8fe5f1a8590b662c9962","482cd15ecd9cfbd8e1943c0fcde0bbf1d875392dc2a701b698f48bfba684a062","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","48de3afdc6ee73ed121d1433bc6367a399286d5f8c2c63670a0b3b9752a36175","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","49ee4a3f2a8918bdbbafb312cfa807d9982800d13d29ee292c6c0daad8b9b8f1","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4b6ab2768e1ff3716ac8565201c031a820c208db9ea6ae1495dd782e7557a3ab","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4ef30f11bd4dd9d2eef8716d88a83010546e54594b2726de84f6d587651ee940","4f03e231c0dc5c9bb2874f6856382d5b205758af9678fffdc7552d4e4ae9866e","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","4f6fcf4dd7e73d86e06bdb9c14a1078b61c0efb2663ced9bfbc5f46fbb4c6d8e","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","521ed246c4119acd6b579b6eefa23389a1655df54aa35de7671743979ebfc68d","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","55dcc23ce52b3918a60029d9398f262216471c280bfe66421cc63240533a6087","566ddcfc45ea5edc695626826ed185930e910fd9107c5bc1844c717b714c15b2","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","581337891936ba630d34ce9f6b803b82a2130791510f15bab24a07332400417f","58901d008c36a777dc138fa6b6d198030e0e843bc889cbad3acb954c826b3608","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5be05ba74075b8f139be565c47688a4f395ce71452dce5cf7da4348c7ddb7aa0","5c0206d9d014821b52a43d7b222327a89d4ee2f5b1e21813dfa659a69f7426b5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5de00a2f5eabe86c14f360304115f4136c41df1fb664eef6da26072fe7623d44","5e3a589b627edaf7005c60382475fae7229adc4ffbaab6d6fd03e9f08a0a8e19","5e43baca07fb966bf1c4b3ac06bb819577e477a84c5d8d3a9a19c391ada2e0b5","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","600ec184ee9964881bcaeaf72ad38a72db05d5b629d301cb323fa1ee9369b572","616c4dbde10f465da822d8a788feada26e5f915c7fbbc06232287cd1899c3044","62a713311297a7145d3610ee60dd6626ee543645a1918b050c629207561efb5e","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","6312b7a9f8252f49b8ea0cbd0580b80bbb221db574ea74939823ed9d4140d73f","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65725e1cd3323fdf44ec47067fd6670b441ff5f82e99485e1a4fc7d475f14340","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","6601b2bb6c908a46ae2985d4683c8baeeec87b0688b9b33d3e8900286bf4d6ae","666e7f698fbeef24e13e91ccfa334cf781233e060fa86bcd7d4d0eb00b30f3d5","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","671168c05789fc651cd961a5a15e10adbb76656b802cb0fcbab468ab76412ca2","671d95a6c09bb7b05a5721d52cb761300a2c8f376aac20be2948b7e97bf302b7","680de944f1f5380c579003e329ed6f10702ec8ebaaa8208743775588d2424d05","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","7075f89b1271fd04fa02d4db95c0f0bd6bdec24e53a7953d7afaeba40e17e8e0","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","74b5d2ed555740db7b4b0ea9b73f8fe00965fea8e14d4f075eec26ef7a189c68","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","786b0c2856bf1f3f809e5903b0a971f1e072af5635aa50bbb9b1449f96d7b694","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7af2394d2e697f355439e841b6323ffbbf8b90b2e48bf64873791fbbfdf15b44","7b947ed0a9e6e7ba180921434b993c62ac70bbaba6af0a1618569a2d4b705201","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7c2a1c4c4c03e3d68d63e0ab58e4e34d3f2bc1a4a837a055fd13a4e9f95ce6cb","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7dd54213b65fa0a6ce5aa3c204b5209b67ec16306b776aed7dcf9e6601d74235","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7efb464c6d7b469303c43f718063d8456df6fe43534b5d8a4229f5b9ba9705cd","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","83347356a898238c013dff73246440e361a9e24cc3c4e0fe0e850467772b4938","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a06a604bbe36d72da976fcdeb88665c762b0f0de44193576ef2e0cf29aa9ad","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","85e961266b36e0f8ec2a477f1f1dfe7ad748fdde9d906f7bd3241e6924866ea9","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87789dab547842b4e0c822758e1325a3cbb046063e11e105a4779b3741e01cde","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89a96597dc9c218633adaf94bb5d6dcf4cad8f5e0b6f5522a28e3ce8d8b2865f","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cce78271b4f001606069a575a172041fbddc52de6b582c920aa3d3b5d5b67ae","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8f3827158091bbed154d21c843284ad472a4552da2eeb858748aa29676e45662","8f4a21c70e4b933eaa4f9cee119945dd2ebeac532e82d34e17511b38cf03608c","8f6debc54d2bd7abb42f581f2204fc78b27ff8c67ee4b6392b4d71c5f983ee9d","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","90aff66decaa3a0998e9a6741963713c0c82fc70da505519e3d60204bf715fa0","90dc4cac6326293bb54486d3c873b83299e9a5ec8c86a68bf1cc131f5e4e2437","918126027fabb7947dd4ae810dd561ac22167102f9f978f86906624ebe88c9ea","91b495938bc6015970bb02c844368d3eee84425b472772cdb374a5347db86de9","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","922a332aa100d622da733aea8fc74094739bb63cd480d3349a14d2418ab6b1bb","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","97edc66e594bae06bb273db84a35d84c8162a1fdf55ed46d781419a9f6a2e4f2","985638a05562bb796911ec231d306b81e36ed6b58219b3bde874559e9600b59f","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","98ecc99d3396aa9a35ce97456be66c1aac0cc05bab88aa99109649291e61bc0a","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9a8f2389b8ebc29d3769868ff8b918fdeb2236d88192fcf76ab0ea3db0857fac","9af18d8cfee466bc061271d82254d7ea638b59b8d5a3901c6610d5baed85c38b","9b01e565a1541f9e652d7afbe62e3bbff28430c1ccac2226ea434f45fc9a99d0","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d1a0da545eb6b2e16b18fdd305a2c000ff2340c19ac843914b45f6a4f936227","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9dfd29090b50334ae229e4a7e812cfb9f6204a66dde563e215d8f52e884cb103","9e77badd0923fd79ca9761a41780ee4dd4f9ca9b62512f4fb59c7f8418494da0","9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","9fb8c5aa087d38dab064a2d6054826377eea3dda98229725c2523f63a87e4750","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a2aec2d2f35d7174801247141d637e77c4f34e478c575b0e0a04c6251efaf993","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a3d6708506fb5c28f45f0d610bedba11b1ec7bcdb363ffff3aa4cddfa515f56a","a476183540f2e7121e533bf2dd9125dc071c81acc880e88cb435cad7a6d35b97","a4a8cca930cdfd15285ac3a7aa757d61501fb77fc12a7c3fbd78c096b279cf63","a50654761d6812cd811df02199e1b7b25c9b0d65e591f65430f9277ec43d9c50","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a644885c31f390b5e6b7fe2fc8d086d9144699295ccb6ffa51b3f7c76c8ca71a","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a70d82083944311ccf98b6aa8da5adebc93c655759eaaf8d79624bb3d322abcb","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ad0e6d78c1e450e19bfca4a0e904644ab0ae315607811a28ac3dba20de869786","ae43a4d252290ec0e18c64dd58d51bc885020b2473e71e3ed0741184c9f006b7","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b3f50ed7eac0e9c54b74c4f4e02297dd2d2465ce4b699bcc15cfddf54c0f0f81","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b4f2140fb766faf0065a563ac3664f395b24c81dab0d0d0d01df47b22e888d29","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b5c085be21651d8579e52cd3ffe4abe6b7f45c5a9ee84d38c47b4734409918d8","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7fda8f4bf81f8213d18e3c314df5100ccb6b8db7aed6b70aaf202deb606a14f","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b83b7229045affbb98f8fc46f289ad05e6626ef52e3ed2f7e70d332a54a69e2a","b83f5334b85422ac110a24286d5af7003f2fb5b0d783efe257b38a2281656422","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b8b8c5cad182083f45ce2d05d036e6bfe91cde1fb63f2e5a97c683bb7ef7ea0f","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba5c707cf9be40fe966c08807779994e20ca3f30ea9d73e26ce31ca334c05640","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bad8f17b1d399ea125c524895571601c90b6c93418c248bd4ebcc7886bae9878","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bcbef69f1ba50e45f3faf1b4529c32cdcf1e5a6612b5bcbc6aa6790ee14b54eb","bd3bf6053f4d423ff21f7ffbed9d0e68f3ea64b7292c048e9a37ade342bb7b39","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c055d3cfd85b2ed4607b0d9d3a15ab7204c9f149599f748347dca4afe102af0c","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23a43ed460117f663cec698412729fd91b5aaceb48cc4e55a785b525661bf1a","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c24546a064b9315172ce0f951bd5fa2cd1b9884231cf1bdc1dc714771f1b3886","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c2e96d98c8ebc10237a2af1c224f626acfb9072c83078f4a8c6d9ef0a58b4a8e","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c4ebd58c4ff78c9fc0cd17d80ed563520f7908f9d1106735ca0f5a7abed202a6","c5db39bbdc8c2bd2aa7b58c28c3df9e407955cc3250ce7825c842cc4c30eaca3","c65325f807190f7084346376e2f48fc2b6bb946004a1fac1d8d117930e93d462","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c82f38f23e7ed3e1024661b7a22ff694e88d3b268240e2bfc98e630df8a062d0","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","c93cd4cb5cf38fe6221fa8ae171ff54240b5f99ba80cd740ffac69c57e5fa381","ca50b525d7aa7762c56f402696dd464841daf19b036bb932e325090004b4cd71","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfb9705939742247da0cb71fdfd8b5f7a1bef6f1c2f0979a8f42e54c4a480980","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d151ffa66d8d096e0272f0dfff6c27e978cfda570f7498a727593081888b4ebe","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d268e680ee1136a239a40ebf005b30db6f3b52a228016f3193496f86250f15c3","d2989a1607fd5303615937b8c117d127b1b1cde519662ab1e1324390220e8612","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d2e82db1f6e479001e15c9890732b5049f8c900c568d5e3d15707a95a7dc3610","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d36034e2f9cc642d0f9f24cf834fa741bac5b8b139cbd2f50e2065161c9f3cb0","d36eb7456d2a42d1cffa4b60708e2bd3116f7f6758c96bbc0fee0f1704ad8a79","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d555a0d2329caace197c1468fe6708349125762377ee3bd04b031b7eacfc26aa","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5adedc08fa25bd06734afd1db3510dbc53ba0dfdac20cf601fde0c77702a72a","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d67ec5caeb2af5f9c57533a34cbde7daba5f5b2e5e6ce34c3250893eef25f13c","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d7a44c85c25ceb7d42280f0c2576de52a3b3cc3ad2333e788ecdc7f7f7fe4b3b","d7f5db16fd3b6ddd5acdf655e090ed0e84cb89d9eafbe1ea92b273b71a38f173","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8c8b3c52c89cd715a7fdd2759a6f73c3a5f505303b110656cc35f7549a37cfb","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","daa0fc9f9dd08cb2dc48bf33c9808cfeebff77cb9fba48f98ef597bb9dd6df55","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","db66a999537b941fa6d512908894ba86e8dadd0e14b290ebc119555b7e60264c","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e519e78acf2938460c7ee053981c744dafc7642fd03b56a117d5fec78d258b90","e5db07b7fb0eed216d838fbeb9491257cf54f9bd537a68c8edae7a89fe64c8d8","e61705ac769699a40c52e332cd890187ca9301fc6e64393c8c9064144ccc2dbf","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","e981ced1bfce64a19fa8de1cd518a93f4669d01548f4819d0e1dbb50d266fe04","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eaeec7c06d1408fa6db5d7ada0a232b1633ffdf0ac815033c29c159352347c81","eb708890ac7e19bd53007ccece064f7e2a069a3751270b4fdafdd1668136dee7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","ebcf0bdb3541c8bfb7c9a53f632329b77341cba6f1a2fa0dc9704acfa3276dca","ebd87e3505f3a1adff0c86ffec6c380734df718301b216b7ee089c174130de60","ecd5e83ba8c8eba6cef9c3da1edb8a84e3dfb4ed71d9a2c1908f2c4d26b26737","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0e1db9b86e2132f004ebf06819eb55804f766bc03ea5d80f487d5d98bad8892","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1297fd9ecf981024e1544f7f048705377b53219240274bb803ac30e4a52084f","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f260b4b268e85a8f1b04b2fc69ffc0bca473d2e42de6f2f70128bedc16558201","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f4de28905adbfe6ae4bc38f8bf5f47a444aa8d0f2023faaa431d6f72f9a3edea","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f5403593ba12130c04827f88d019103e924651caa518b7c290673a02f7cb409f","f5681dfc71121ed0f88146a19479675f2fabc6ed376fd5d162e50d815c048d66","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f7993302f695430a0ee938b1b3684fdfec4055bddb378b52c81785c0319e8c98","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","facb45d3084caa490d9b0ac2bcfcee89629a4c3db5926ec9256a9d27d25559ee","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fbd74e4b8dc748b2efdd70aaab07adb80d7f15a38c1261de85bdfd9591ff106a","fc475f9c2d8bee2ffea435e86e6b39b6e3e071143a4a1fdf6765b0da13b66de6","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","fdbd44d3c55504edfa1bacb4c9b7a6c102659d4deef0ca91b9b7ac567ea9cfc5","fedf2577267d6dcd060ebc4ee8de6ccdafa60ab26b78d74c1e8c784252fecb17","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} diff --git a/.agents/skills/atlas/assets/seed/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json b/.agents/skills/atlas/assets/seed/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json new file mode 100644 index 000000000..4768e10f9 --- /dev/null +++ b/.agents/skills/atlas/assets/seed/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json @@ -0,0 +1 @@ +{"citations":[{"path":"docs/adr/0068-the-engine-tool-manifest-leaves-kit-ownership.md","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"2882230e95cc744000cb70511b78f56fb3edb7dbb2f72b0ba351c9832f8c5bef"},{"path":"registry/repos.yml","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"1f40996af5064bc42bf17b3df1a7661c44d5829c0602f24282b6c8ac83830f5c"},{"path":"scripts/sync-build-config.sh","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"2b5547bee1e67a112a8fae85b2f5ae0db5acd7ce6e4715bda056a256d8730cad"},{"path":"src/FS.GG.Kit/stage-kit.sh","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"cdd6963c7a38ccf9dbf88b8c542fa749566a57a22f190e74f446895c9254412c"}],"conflictsWith":[],"id":"build/shared-tool-manifest-is-receiver-owned","kind":"boundary","recordedAt":"2026-11-02T15:25:44Z","repository":"FS-GG/.github","schema":"fsgg.atlas/1","status":"recorded","summary":"ADR-0068 removed dist/dotnet/.config/dotnet-tools.json from the Kit roster. The file remains .github's canonical local tool manifest, including the engine-pin-coherence subject, while each receiver owns its own manifest. The current registry has no kit config row for this file; stage-kit derives the config roster from that registry and derives build-config files from sync-build-config.sh FILES, which contains only Directory.Build.props and Directory.Packages.props. Therefore changing FAKE or Fantomas in this manifest updates the shared source baseline but does not deliver those tool versions through Kit materialization or establish installed adoption. Refresh the real receiver manifest and tool runtime when accepting each consumer. Some older build documentation and script comments still describe prior manifest delivery; the accepted ADR and derived roster define this boundary. This record grants no publication or receiver mutation.","supersedes":[],"tags":["dotnet-tools","fake","fantomas","kit","dependency","receiver"],"title":"The shared tool manifest is not distributed by the Kit package"} diff --git a/.claude/skills/atlas/assets/seed/catalog.json b/.claude/skills/atlas/assets/seed/catalog.json index b744ed564..b35cb52ab 100644 --- a/.claude/skills/atlas/assets/seed/catalog.json +++ b/.claude/skills/atlas/assets/seed/catalog.json @@ -1 +1 @@ -{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","0052dfb9eafceabaa590f4497e4d42f19020718c84b981d265edefd432ccf8dd","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04652cbc95ac4dcd21b837b38f2ca5a0ccd4d0946bc13fdb31c9c15a578d3a2d","04d17203f03279980862496517a1f0861be5f6cc8063bfbf92f8f8ac19744fdd","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","076259a45e71df780b012d29618c17739246c86321d2ff05a6c272bcca8db675","076fa091c878b19cf56a94be0966dbcd58d52c1839f9d4b85bbfdef650cbdb88","08b3dc660b9d2bbbe75b590b2b86d941bf935a254cd5f09de71ee6894f4048b6","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0b2d1557ff6df5f4d65d540a5403b07ba81b381dfc799b7884ac72dfa6ee7753","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0c7d3f36e3bb4270edbf7abd99cd2dab772df274cad1c27c7e87e302b8eb1c23","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","0f11324ad653d8d841962b0eeae9f68b80243d4ef7df4f2404ed4c3e45ba5197","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","13d0363b8d765c87a57eb42c4988320a9c2e7fa09024aa972f4b13d7699a552d","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","15d41240067e2335a0354a4e910b6610f2b8f079b8f67186f10181622b4a8999","1746f4f9d47b7dc42280dd34e664b3ec410d3cc69ac76933707499ffa34c79d4","1754adaf40732c3a8c73d2285c25a8b6c8c9d3e68370de618a0ffa8f3e60fb6d","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","19e75be8ed4dfba2a6f8034154052160a7a181b17d887b3e8724f3e3c111c31e","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b3ec24337f0252a00cfeb6df0a0f5d2b6d737dbea61b8d0b4a643f4c686df6a","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1b8cad98d53da179ab05eb47c1783f4c8b45b9f39c635e7a337285f5cd9621c1","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","20d01a387b4d0801cb588492ede88cae7bade9b7ea3591d9e954add1e67cf4ce","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","22ef13e60456fe9046dfe72f20122362aeefbbb445632231b8e364ed9b50e135","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24373b643450d9dd3b8a5b0e74a5fec2844cd8cbca7d8a57dbc8b9ad9eade9dc","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","2905a2b4a58bd9ec1c4f77fd3d1d246c02caa49d806272756dd039c79521442f","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2b4f7c8dcc95ca8182105b9b6806391666e6a2c3a5c80d3ce5a5f04fd6cf9122","2b5e739c8f9602c585e67554c457e6e53351679afd56ff324f8fecc80f0891f1","2bc251ffb58a0d03480748058eff4c44079a0f21d75743063cef50263982337a","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d46924a94c85f4275a449dd3d9eb6c602cf8a9104db19d224e3aa469b858d06","2d5048eeef90792c0a2b9aed7305598a28db2103fed3903462c6c1882733c3e8","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2df1610ac1b912232030b5507e5e944515b0f1549bf2b76ecfb12baf0f40ccea","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","2febddcced970d495778f33fff212929ac99c23adc42be0c1062f5c8676ffce0","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","31fe4b51d55cd99a4692d2cb787d362cb4c0d0998d3e001efdb5cb7ed838340f","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","3442ba5c7643c793f62d90ca841f7891b3dbf97f028bc7b62f8b4f88c1266d1c","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","3600e7356a3741ef02f8b2ffa6a6b5d822dcbb170771f2ea33312dff4470f431","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","3962789d05f324d436a363700cbb5ced5aba791d782b3c0ea73221fe0c1f0b97","3966e5e53811c43962f5d0953e5da4753eacefbea27ecba9d36af2fd8e4fd52f","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3bce154e59c5c45216bb5372a352e948d6cb365bb1bd47d4666ae0412e507ca4","3c75b650f3fa8217597b01d3aaf25427ae2a658a7c966afeecdb391d3ba547ea","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3d642ccf9ca4a0f7f5dde1b41f65c99e9c447cbb9e64883b67e4fdf76f216f52","3d9fd2c5877483382f0c7331206393e42827b5dccfd60549a6771b7a5659e524","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3dffc36586e9078f750b0a2b4cc2c70a17a81294903186dbe8cc47cf8055b9bd","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","3f5465798dbc2ad279ca4849d5d0f819bad01455e0dd2a9d98afd4b55cfbd7ee","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","4134a3936170c1fb5fa6d2e2329185a981436477a66b7d31e827c363691bad50","414259a2fda4a1a49729be6fb1aced4675ee9cbdf990aaafb8e5b3153b54d64d","41baa5d98b5bab2ee01cad50c05b83edd8cdfeeb00f30b9406b4b2ec6d13d738","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","4457ab439bc8f212d83442dc7500e9d45ffac849d0f77cb97686d9b0672fc3dc","461d34fb1d53849951a7e715e52342372d779299fbcad210794235c610dadf64","46a24cd8e385b748f40d9271b1e856dd6d68c91ab356abb11ff6b65f1ef936bf","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","471570cdf8144df0c32aba1730aba24c7e42e5ec317af771ffa169f5c842d117","47b5cb2b011c0f7012d75e88eb86a10f3f0bd48545db139669e654cac1f69650","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","48262b98c0bdbd5ee2314345726d23630ec1771735db8fe5f1a8590b662c9962","482cd15ecd9cfbd8e1943c0fcde0bbf1d875392dc2a701b698f48bfba684a062","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","48de3afdc6ee73ed121d1433bc6367a399286d5f8c2c63670a0b3b9752a36175","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","49ee4a3f2a8918bdbbafb312cfa807d9982800d13d29ee292c6c0daad8b9b8f1","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4b6ab2768e1ff3716ac8565201c031a820c208db9ea6ae1495dd782e7557a3ab","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4ef30f11bd4dd9d2eef8716d88a83010546e54594b2726de84f6d587651ee940","4f03e231c0dc5c9bb2874f6856382d5b205758af9678fffdc7552d4e4ae9866e","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","4f6fcf4dd7e73d86e06bdb9c14a1078b61c0efb2663ced9bfbc5f46fbb4c6d8e","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","521ed246c4119acd6b579b6eefa23389a1655df54aa35de7671743979ebfc68d","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","55dcc23ce52b3918a60029d9398f262216471c280bfe66421cc63240533a6087","566ddcfc45ea5edc695626826ed185930e910fd9107c5bc1844c717b714c15b2","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","581337891936ba630d34ce9f6b803b82a2130791510f15bab24a07332400417f","58901d008c36a777dc138fa6b6d198030e0e843bc889cbad3acb954c826b3608","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5be05ba74075b8f139be565c47688a4f395ce71452dce5cf7da4348c7ddb7aa0","5c0206d9d014821b52a43d7b222327a89d4ee2f5b1e21813dfa659a69f7426b5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5de00a2f5eabe86c14f360304115f4136c41df1fb664eef6da26072fe7623d44","5e3a589b627edaf7005c60382475fae7229adc4ffbaab6d6fd03e9f08a0a8e19","5e43baca07fb966bf1c4b3ac06bb819577e477a84c5d8d3a9a19c391ada2e0b5","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","600ec184ee9964881bcaeaf72ad38a72db05d5b629d301cb323fa1ee9369b572","616c4dbde10f465da822d8a788feada26e5f915c7fbbc06232287cd1899c3044","62a713311297a7145d3610ee60dd6626ee543645a1918b050c629207561efb5e","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","6312b7a9f8252f49b8ea0cbd0580b80bbb221db574ea74939823ed9d4140d73f","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65725e1cd3323fdf44ec47067fd6670b441ff5f82e99485e1a4fc7d475f14340","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","6601b2bb6c908a46ae2985d4683c8baeeec87b0688b9b33d3e8900286bf4d6ae","666e7f698fbeef24e13e91ccfa334cf781233e060fa86bcd7d4d0eb00b30f3d5","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","671168c05789fc651cd961a5a15e10adbb76656b802cb0fcbab468ab76412ca2","671d95a6c09bb7b05a5721d52cb761300a2c8f376aac20be2948b7e97bf302b7","680de944f1f5380c579003e329ed6f10702ec8ebaaa8208743775588d2424d05","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","7075f89b1271fd04fa02d4db95c0f0bd6bdec24e53a7953d7afaeba40e17e8e0","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","74b5d2ed555740db7b4b0ea9b73f8fe00965fea8e14d4f075eec26ef7a189c68","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","786b0c2856bf1f3f809e5903b0a971f1e072af5635aa50bbb9b1449f96d7b694","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7af2394d2e697f355439e841b6323ffbbf8b90b2e48bf64873791fbbfdf15b44","7b947ed0a9e6e7ba180921434b993c62ac70bbaba6af0a1618569a2d4b705201","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7c2a1c4c4c03e3d68d63e0ab58e4e34d3f2bc1a4a837a055fd13a4e9f95ce6cb","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7dd54213b65fa0a6ce5aa3c204b5209b67ec16306b776aed7dcf9e6601d74235","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7efb464c6d7b469303c43f718063d8456df6fe43534b5d8a4229f5b9ba9705cd","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","83347356a898238c013dff73246440e361a9e24cc3c4e0fe0e850467772b4938","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a06a604bbe36d72da976fcdeb88665c762b0f0de44193576ef2e0cf29aa9ad","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","85e961266b36e0f8ec2a477f1f1dfe7ad748fdde9d906f7bd3241e6924866ea9","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87789dab547842b4e0c822758e1325a3cbb046063e11e105a4779b3741e01cde","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89a96597dc9c218633adaf94bb5d6dcf4cad8f5e0b6f5522a28e3ce8d8b2865f","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cce78271b4f001606069a575a172041fbddc52de6b582c920aa3d3b5d5b67ae","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8f3827158091bbed154d21c843284ad472a4552da2eeb858748aa29676e45662","8f4a21c70e4b933eaa4f9cee119945dd2ebeac532e82d34e17511b38cf03608c","8f6debc54d2bd7abb42f581f2204fc78b27ff8c67ee4b6392b4d71c5f983ee9d","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","90aff66decaa3a0998e9a6741963713c0c82fc70da505519e3d60204bf715fa0","90dc4cac6326293bb54486d3c873b83299e9a5ec8c86a68bf1cc131f5e4e2437","918126027fabb7947dd4ae810dd561ac22167102f9f978f86906624ebe88c9ea","91b495938bc6015970bb02c844368d3eee84425b472772cdb374a5347db86de9","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","922a332aa100d622da733aea8fc74094739bb63cd480d3349a14d2418ab6b1bb","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","97edc66e594bae06bb273db84a35d84c8162a1fdf55ed46d781419a9f6a2e4f2","985638a05562bb796911ec231d306b81e36ed6b58219b3bde874559e9600b59f","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","98ecc99d3396aa9a35ce97456be66c1aac0cc05bab88aa99109649291e61bc0a","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9a8f2389b8ebc29d3769868ff8b918fdeb2236d88192fcf76ab0ea3db0857fac","9af18d8cfee466bc061271d82254d7ea638b59b8d5a3901c6610d5baed85c38b","9b01e565a1541f9e652d7afbe62e3bbff28430c1ccac2226ea434f45fc9a99d0","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d1a0da545eb6b2e16b18fdd305a2c000ff2340c19ac843914b45f6a4f936227","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9dfd29090b50334ae229e4a7e812cfb9f6204a66dde563e215d8f52e884cb103","9e77badd0923fd79ca9761a41780ee4dd4f9ca9b62512f4fb59c7f8418494da0","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","9fb8c5aa087d38dab064a2d6054826377eea3dda98229725c2523f63a87e4750","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a2aec2d2f35d7174801247141d637e77c4f34e478c575b0e0a04c6251efaf993","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a3d6708506fb5c28f45f0d610bedba11b1ec7bcdb363ffff3aa4cddfa515f56a","a476183540f2e7121e533bf2dd9125dc071c81acc880e88cb435cad7a6d35b97","a4a8cca930cdfd15285ac3a7aa757d61501fb77fc12a7c3fbd78c096b279cf63","a50654761d6812cd811df02199e1b7b25c9b0d65e591f65430f9277ec43d9c50","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a644885c31f390b5e6b7fe2fc8d086d9144699295ccb6ffa51b3f7c76c8ca71a","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a70d82083944311ccf98b6aa8da5adebc93c655759eaaf8d79624bb3d322abcb","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ad0e6d78c1e450e19bfca4a0e904644ab0ae315607811a28ac3dba20de869786","ae43a4d252290ec0e18c64dd58d51bc885020b2473e71e3ed0741184c9f006b7","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b3f50ed7eac0e9c54b74c4f4e02297dd2d2465ce4b699bcc15cfddf54c0f0f81","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b4f2140fb766faf0065a563ac3664f395b24c81dab0d0d0d01df47b22e888d29","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b5c085be21651d8579e52cd3ffe4abe6b7f45c5a9ee84d38c47b4734409918d8","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7fda8f4bf81f8213d18e3c314df5100ccb6b8db7aed6b70aaf202deb606a14f","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b83b7229045affbb98f8fc46f289ad05e6626ef52e3ed2f7e70d332a54a69e2a","b83f5334b85422ac110a24286d5af7003f2fb5b0d783efe257b38a2281656422","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b8b8c5cad182083f45ce2d05d036e6bfe91cde1fb63f2e5a97c683bb7ef7ea0f","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba5c707cf9be40fe966c08807779994e20ca3f30ea9d73e26ce31ca334c05640","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bad8f17b1d399ea125c524895571601c90b6c93418c248bd4ebcc7886bae9878","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bcbef69f1ba50e45f3faf1b4529c32cdcf1e5a6612b5bcbc6aa6790ee14b54eb","bd3bf6053f4d423ff21f7ffbed9d0e68f3ea64b7292c048e9a37ade342bb7b39","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c055d3cfd85b2ed4607b0d9d3a15ab7204c9f149599f748347dca4afe102af0c","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23a43ed460117f663cec698412729fd91b5aaceb48cc4e55a785b525661bf1a","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c24546a064b9315172ce0f951bd5fa2cd1b9884231cf1bdc1dc714771f1b3886","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c2e96d98c8ebc10237a2af1c224f626acfb9072c83078f4a8c6d9ef0a58b4a8e","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c4ebd58c4ff78c9fc0cd17d80ed563520f7908f9d1106735ca0f5a7abed202a6","c5db39bbdc8c2bd2aa7b58c28c3df9e407955cc3250ce7825c842cc4c30eaca3","c65325f807190f7084346376e2f48fc2b6bb946004a1fac1d8d117930e93d462","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c82f38f23e7ed3e1024661b7a22ff694e88d3b268240e2bfc98e630df8a062d0","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","c93cd4cb5cf38fe6221fa8ae171ff54240b5f99ba80cd740ffac69c57e5fa381","ca50b525d7aa7762c56f402696dd464841daf19b036bb932e325090004b4cd71","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfb9705939742247da0cb71fdfd8b5f7a1bef6f1c2f0979a8f42e54c4a480980","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d151ffa66d8d096e0272f0dfff6c27e978cfda570f7498a727593081888b4ebe","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d268e680ee1136a239a40ebf005b30db6f3b52a228016f3193496f86250f15c3","d2989a1607fd5303615937b8c117d127b1b1cde519662ab1e1324390220e8612","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d2e82db1f6e479001e15c9890732b5049f8c900c568d5e3d15707a95a7dc3610","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d36034e2f9cc642d0f9f24cf834fa741bac5b8b139cbd2f50e2065161c9f3cb0","d36eb7456d2a42d1cffa4b60708e2bd3116f7f6758c96bbc0fee0f1704ad8a79","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d555a0d2329caace197c1468fe6708349125762377ee3bd04b031b7eacfc26aa","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5adedc08fa25bd06734afd1db3510dbc53ba0dfdac20cf601fde0c77702a72a","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d67ec5caeb2af5f9c57533a34cbde7daba5f5b2e5e6ce34c3250893eef25f13c","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d7a44c85c25ceb7d42280f0c2576de52a3b3cc3ad2333e788ecdc7f7f7fe4b3b","d7f5db16fd3b6ddd5acdf655e090ed0e84cb89d9eafbe1ea92b273b71a38f173","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8c8b3c52c89cd715a7fdd2759a6f73c3a5f505303b110656cc35f7549a37cfb","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","daa0fc9f9dd08cb2dc48bf33c9808cfeebff77cb9fba48f98ef597bb9dd6df55","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","db66a999537b941fa6d512908894ba86e8dadd0e14b290ebc119555b7e60264c","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e519e78acf2938460c7ee053981c744dafc7642fd03b56a117d5fec78d258b90","e5db07b7fb0eed216d838fbeb9491257cf54f9bd537a68c8edae7a89fe64c8d8","e61705ac769699a40c52e332cd890187ca9301fc6e64393c8c9064144ccc2dbf","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","e981ced1bfce64a19fa8de1cd518a93f4669d01548f4819d0e1dbb50d266fe04","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eaeec7c06d1408fa6db5d7ada0a232b1633ffdf0ac815033c29c159352347c81","eb708890ac7e19bd53007ccece064f7e2a069a3751270b4fdafdd1668136dee7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","ebcf0bdb3541c8bfb7c9a53f632329b77341cba6f1a2fa0dc9704acfa3276dca","ebd87e3505f3a1adff0c86ffec6c380734df718301b216b7ee089c174130de60","ecd5e83ba8c8eba6cef9c3da1edb8a84e3dfb4ed71d9a2c1908f2c4d26b26737","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0e1db9b86e2132f004ebf06819eb55804f766bc03ea5d80f487d5d98bad8892","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1297fd9ecf981024e1544f7f048705377b53219240274bb803ac30e4a52084f","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f260b4b268e85a8f1b04b2fc69ffc0bca473d2e42de6f2f70128bedc16558201","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f4de28905adbfe6ae4bc38f8bf5f47a444aa8d0f2023faaa431d6f72f9a3edea","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f5403593ba12130c04827f88d019103e924651caa518b7c290673a02f7cb409f","f5681dfc71121ed0f88146a19479675f2fabc6ed376fd5d162e50d815c048d66","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f7993302f695430a0ee938b1b3684fdfec4055bddb378b52c81785c0319e8c98","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","facb45d3084caa490d9b0ac2bcfcee89629a4c3db5926ec9256a9d27d25559ee","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fbd74e4b8dc748b2efdd70aaab07adb80d7f15a38c1261de85bdfd9591ff106a","fc475f9c2d8bee2ffea435e86e6b39b6e3e071143a4a1fdf6765b0da13b66de6","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","fdbd44d3c55504edfa1bacb4c9b7a6c102659d4deef0ca91b9b7ac567ea9cfc5","fedf2577267d6dcd060ebc4ee8de6ccdafa60ab26b78d74c1e8c784252fecb17","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} +{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","0052dfb9eafceabaa590f4497e4d42f19020718c84b981d265edefd432ccf8dd","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04652cbc95ac4dcd21b837b38f2ca5a0ccd4d0946bc13fdb31c9c15a578d3a2d","04d17203f03279980862496517a1f0861be5f6cc8063bfbf92f8f8ac19744fdd","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","076259a45e71df780b012d29618c17739246c86321d2ff05a6c272bcca8db675","076fa091c878b19cf56a94be0966dbcd58d52c1839f9d4b85bbfdef650cbdb88","08b3dc660b9d2bbbe75b590b2b86d941bf935a254cd5f09de71ee6894f4048b6","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0b2d1557ff6df5f4d65d540a5403b07ba81b381dfc799b7884ac72dfa6ee7753","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0c7d3f36e3bb4270edbf7abd99cd2dab772df274cad1c27c7e87e302b8eb1c23","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","0f11324ad653d8d841962b0eeae9f68b80243d4ef7df4f2404ed4c3e45ba5197","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","13d0363b8d765c87a57eb42c4988320a9c2e7fa09024aa972f4b13d7699a552d","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","15d41240067e2335a0354a4e910b6610f2b8f079b8f67186f10181622b4a8999","1746f4f9d47b7dc42280dd34e664b3ec410d3cc69ac76933707499ffa34c79d4","1754adaf40732c3a8c73d2285c25a8b6c8c9d3e68370de618a0ffa8f3e60fb6d","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","19e75be8ed4dfba2a6f8034154052160a7a181b17d887b3e8724f3e3c111c31e","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b3ec24337f0252a00cfeb6df0a0f5d2b6d737dbea61b8d0b4a643f4c686df6a","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1b8cad98d53da179ab05eb47c1783f4c8b45b9f39c635e7a337285f5cd9621c1","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","20d01a387b4d0801cb588492ede88cae7bade9b7ea3591d9e954add1e67cf4ce","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","22ef13e60456fe9046dfe72f20122362aeefbbb445632231b8e364ed9b50e135","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24373b643450d9dd3b8a5b0e74a5fec2844cd8cbca7d8a57dbc8b9ad9eade9dc","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","2905a2b4a58bd9ec1c4f77fd3d1d246c02caa49d806272756dd039c79521442f","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2b4f7c8dcc95ca8182105b9b6806391666e6a2c3a5c80d3ce5a5f04fd6cf9122","2b5e739c8f9602c585e67554c457e6e53351679afd56ff324f8fecc80f0891f1","2bc251ffb58a0d03480748058eff4c44079a0f21d75743063cef50263982337a","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d46924a94c85f4275a449dd3d9eb6c602cf8a9104db19d224e3aa469b858d06","2d5048eeef90792c0a2b9aed7305598a28db2103fed3903462c6c1882733c3e8","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2df1610ac1b912232030b5507e5e944515b0f1549bf2b76ecfb12baf0f40ccea","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","2febddcced970d495778f33fff212929ac99c23adc42be0c1062f5c8676ffce0","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","31fe4b51d55cd99a4692d2cb787d362cb4c0d0998d3e001efdb5cb7ed838340f","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","3442ba5c7643c793f62d90ca841f7891b3dbf97f028bc7b62f8b4f88c1266d1c","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","3600e7356a3741ef02f8b2ffa6a6b5d822dcbb170771f2ea33312dff4470f431","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","3962789d05f324d436a363700cbb5ced5aba791d782b3c0ea73221fe0c1f0b97","3966e5e53811c43962f5d0953e5da4753eacefbea27ecba9d36af2fd8e4fd52f","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3bce154e59c5c45216bb5372a352e948d6cb365bb1bd47d4666ae0412e507ca4","3c75b650f3fa8217597b01d3aaf25427ae2a658a7c966afeecdb391d3ba547ea","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3d642ccf9ca4a0f7f5dde1b41f65c99e9c447cbb9e64883b67e4fdf76f216f52","3d9fd2c5877483382f0c7331206393e42827b5dccfd60549a6771b7a5659e524","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3dffc36586e9078f750b0a2b4cc2c70a17a81294903186dbe8cc47cf8055b9bd","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","3f5465798dbc2ad279ca4849d5d0f819bad01455e0dd2a9d98afd4b55cfbd7ee","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","4134a3936170c1fb5fa6d2e2329185a981436477a66b7d31e827c363691bad50","414259a2fda4a1a49729be6fb1aced4675ee9cbdf990aaafb8e5b3153b54d64d","41baa5d98b5bab2ee01cad50c05b83edd8cdfeeb00f30b9406b4b2ec6d13d738","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","4457ab439bc8f212d83442dc7500e9d45ffac849d0f77cb97686d9b0672fc3dc","461d34fb1d53849951a7e715e52342372d779299fbcad210794235c610dadf64","46a24cd8e385b748f40d9271b1e856dd6d68c91ab356abb11ff6b65f1ef936bf","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","471570cdf8144df0c32aba1730aba24c7e42e5ec317af771ffa169f5c842d117","47b5cb2b011c0f7012d75e88eb86a10f3f0bd48545db139669e654cac1f69650","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","48262b98c0bdbd5ee2314345726d23630ec1771735db8fe5f1a8590b662c9962","482cd15ecd9cfbd8e1943c0fcde0bbf1d875392dc2a701b698f48bfba684a062","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","48de3afdc6ee73ed121d1433bc6367a399286d5f8c2c63670a0b3b9752a36175","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","49ee4a3f2a8918bdbbafb312cfa807d9982800d13d29ee292c6c0daad8b9b8f1","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4b6ab2768e1ff3716ac8565201c031a820c208db9ea6ae1495dd782e7557a3ab","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4ef30f11bd4dd9d2eef8716d88a83010546e54594b2726de84f6d587651ee940","4f03e231c0dc5c9bb2874f6856382d5b205758af9678fffdc7552d4e4ae9866e","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","4f6fcf4dd7e73d86e06bdb9c14a1078b61c0efb2663ced9bfbc5f46fbb4c6d8e","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","521ed246c4119acd6b579b6eefa23389a1655df54aa35de7671743979ebfc68d","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","55dcc23ce52b3918a60029d9398f262216471c280bfe66421cc63240533a6087","566ddcfc45ea5edc695626826ed185930e910fd9107c5bc1844c717b714c15b2","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","581337891936ba630d34ce9f6b803b82a2130791510f15bab24a07332400417f","58901d008c36a777dc138fa6b6d198030e0e843bc889cbad3acb954c826b3608","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5be05ba74075b8f139be565c47688a4f395ce71452dce5cf7da4348c7ddb7aa0","5c0206d9d014821b52a43d7b222327a89d4ee2f5b1e21813dfa659a69f7426b5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5de00a2f5eabe86c14f360304115f4136c41df1fb664eef6da26072fe7623d44","5e3a589b627edaf7005c60382475fae7229adc4ffbaab6d6fd03e9f08a0a8e19","5e43baca07fb966bf1c4b3ac06bb819577e477a84c5d8d3a9a19c391ada2e0b5","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","600ec184ee9964881bcaeaf72ad38a72db05d5b629d301cb323fa1ee9369b572","616c4dbde10f465da822d8a788feada26e5f915c7fbbc06232287cd1899c3044","62a713311297a7145d3610ee60dd6626ee543645a1918b050c629207561efb5e","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","6312b7a9f8252f49b8ea0cbd0580b80bbb221db574ea74939823ed9d4140d73f","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65725e1cd3323fdf44ec47067fd6670b441ff5f82e99485e1a4fc7d475f14340","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","6601b2bb6c908a46ae2985d4683c8baeeec87b0688b9b33d3e8900286bf4d6ae","666e7f698fbeef24e13e91ccfa334cf781233e060fa86bcd7d4d0eb00b30f3d5","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","671168c05789fc651cd961a5a15e10adbb76656b802cb0fcbab468ab76412ca2","671d95a6c09bb7b05a5721d52cb761300a2c8f376aac20be2948b7e97bf302b7","680de944f1f5380c579003e329ed6f10702ec8ebaaa8208743775588d2424d05","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","7075f89b1271fd04fa02d4db95c0f0bd6bdec24e53a7953d7afaeba40e17e8e0","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","74b5d2ed555740db7b4b0ea9b73f8fe00965fea8e14d4f075eec26ef7a189c68","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","786b0c2856bf1f3f809e5903b0a971f1e072af5635aa50bbb9b1449f96d7b694","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7af2394d2e697f355439e841b6323ffbbf8b90b2e48bf64873791fbbfdf15b44","7b947ed0a9e6e7ba180921434b993c62ac70bbaba6af0a1618569a2d4b705201","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7c2a1c4c4c03e3d68d63e0ab58e4e34d3f2bc1a4a837a055fd13a4e9f95ce6cb","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7dd54213b65fa0a6ce5aa3c204b5209b67ec16306b776aed7dcf9e6601d74235","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7efb464c6d7b469303c43f718063d8456df6fe43534b5d8a4229f5b9ba9705cd","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","83347356a898238c013dff73246440e361a9e24cc3c4e0fe0e850467772b4938","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a06a604bbe36d72da976fcdeb88665c762b0f0de44193576ef2e0cf29aa9ad","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","85e961266b36e0f8ec2a477f1f1dfe7ad748fdde9d906f7bd3241e6924866ea9","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87789dab547842b4e0c822758e1325a3cbb046063e11e105a4779b3741e01cde","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89a96597dc9c218633adaf94bb5d6dcf4cad8f5e0b6f5522a28e3ce8d8b2865f","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cce78271b4f001606069a575a172041fbddc52de6b582c920aa3d3b5d5b67ae","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8f3827158091bbed154d21c843284ad472a4552da2eeb858748aa29676e45662","8f4a21c70e4b933eaa4f9cee119945dd2ebeac532e82d34e17511b38cf03608c","8f6debc54d2bd7abb42f581f2204fc78b27ff8c67ee4b6392b4d71c5f983ee9d","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","90aff66decaa3a0998e9a6741963713c0c82fc70da505519e3d60204bf715fa0","90dc4cac6326293bb54486d3c873b83299e9a5ec8c86a68bf1cc131f5e4e2437","918126027fabb7947dd4ae810dd561ac22167102f9f978f86906624ebe88c9ea","91b495938bc6015970bb02c844368d3eee84425b472772cdb374a5347db86de9","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","922a332aa100d622da733aea8fc74094739bb63cd480d3349a14d2418ab6b1bb","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","97edc66e594bae06bb273db84a35d84c8162a1fdf55ed46d781419a9f6a2e4f2","985638a05562bb796911ec231d306b81e36ed6b58219b3bde874559e9600b59f","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","98ecc99d3396aa9a35ce97456be66c1aac0cc05bab88aa99109649291e61bc0a","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9a8f2389b8ebc29d3769868ff8b918fdeb2236d88192fcf76ab0ea3db0857fac","9af18d8cfee466bc061271d82254d7ea638b59b8d5a3901c6610d5baed85c38b","9b01e565a1541f9e652d7afbe62e3bbff28430c1ccac2226ea434f45fc9a99d0","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d1a0da545eb6b2e16b18fdd305a2c000ff2340c19ac843914b45f6a4f936227","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9dfd29090b50334ae229e4a7e812cfb9f6204a66dde563e215d8f52e884cb103","9e77badd0923fd79ca9761a41780ee4dd4f9ca9b62512f4fb59c7f8418494da0","9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","9fb8c5aa087d38dab064a2d6054826377eea3dda98229725c2523f63a87e4750","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a2aec2d2f35d7174801247141d637e77c4f34e478c575b0e0a04c6251efaf993","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a3d6708506fb5c28f45f0d610bedba11b1ec7bcdb363ffff3aa4cddfa515f56a","a476183540f2e7121e533bf2dd9125dc071c81acc880e88cb435cad7a6d35b97","a4a8cca930cdfd15285ac3a7aa757d61501fb77fc12a7c3fbd78c096b279cf63","a50654761d6812cd811df02199e1b7b25c9b0d65e591f65430f9277ec43d9c50","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a644885c31f390b5e6b7fe2fc8d086d9144699295ccb6ffa51b3f7c76c8ca71a","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a70d82083944311ccf98b6aa8da5adebc93c655759eaaf8d79624bb3d322abcb","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ad0e6d78c1e450e19bfca4a0e904644ab0ae315607811a28ac3dba20de869786","ae43a4d252290ec0e18c64dd58d51bc885020b2473e71e3ed0741184c9f006b7","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b3f50ed7eac0e9c54b74c4f4e02297dd2d2465ce4b699bcc15cfddf54c0f0f81","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b4f2140fb766faf0065a563ac3664f395b24c81dab0d0d0d01df47b22e888d29","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b5c085be21651d8579e52cd3ffe4abe6b7f45c5a9ee84d38c47b4734409918d8","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7fda8f4bf81f8213d18e3c314df5100ccb6b8db7aed6b70aaf202deb606a14f","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b83b7229045affbb98f8fc46f289ad05e6626ef52e3ed2f7e70d332a54a69e2a","b83f5334b85422ac110a24286d5af7003f2fb5b0d783efe257b38a2281656422","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b8b8c5cad182083f45ce2d05d036e6bfe91cde1fb63f2e5a97c683bb7ef7ea0f","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba5c707cf9be40fe966c08807779994e20ca3f30ea9d73e26ce31ca334c05640","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bad8f17b1d399ea125c524895571601c90b6c93418c248bd4ebcc7886bae9878","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bcbef69f1ba50e45f3faf1b4529c32cdcf1e5a6612b5bcbc6aa6790ee14b54eb","bd3bf6053f4d423ff21f7ffbed9d0e68f3ea64b7292c048e9a37ade342bb7b39","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c055d3cfd85b2ed4607b0d9d3a15ab7204c9f149599f748347dca4afe102af0c","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23a43ed460117f663cec698412729fd91b5aaceb48cc4e55a785b525661bf1a","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c24546a064b9315172ce0f951bd5fa2cd1b9884231cf1bdc1dc714771f1b3886","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c2e96d98c8ebc10237a2af1c224f626acfb9072c83078f4a8c6d9ef0a58b4a8e","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c4ebd58c4ff78c9fc0cd17d80ed563520f7908f9d1106735ca0f5a7abed202a6","c5db39bbdc8c2bd2aa7b58c28c3df9e407955cc3250ce7825c842cc4c30eaca3","c65325f807190f7084346376e2f48fc2b6bb946004a1fac1d8d117930e93d462","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c82f38f23e7ed3e1024661b7a22ff694e88d3b268240e2bfc98e630df8a062d0","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","c93cd4cb5cf38fe6221fa8ae171ff54240b5f99ba80cd740ffac69c57e5fa381","ca50b525d7aa7762c56f402696dd464841daf19b036bb932e325090004b4cd71","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfb9705939742247da0cb71fdfd8b5f7a1bef6f1c2f0979a8f42e54c4a480980","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d151ffa66d8d096e0272f0dfff6c27e978cfda570f7498a727593081888b4ebe","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d268e680ee1136a239a40ebf005b30db6f3b52a228016f3193496f86250f15c3","d2989a1607fd5303615937b8c117d127b1b1cde519662ab1e1324390220e8612","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d2e82db1f6e479001e15c9890732b5049f8c900c568d5e3d15707a95a7dc3610","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d36034e2f9cc642d0f9f24cf834fa741bac5b8b139cbd2f50e2065161c9f3cb0","d36eb7456d2a42d1cffa4b60708e2bd3116f7f6758c96bbc0fee0f1704ad8a79","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d555a0d2329caace197c1468fe6708349125762377ee3bd04b031b7eacfc26aa","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5adedc08fa25bd06734afd1db3510dbc53ba0dfdac20cf601fde0c77702a72a","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d67ec5caeb2af5f9c57533a34cbde7daba5f5b2e5e6ce34c3250893eef25f13c","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d7a44c85c25ceb7d42280f0c2576de52a3b3cc3ad2333e788ecdc7f7f7fe4b3b","d7f5db16fd3b6ddd5acdf655e090ed0e84cb89d9eafbe1ea92b273b71a38f173","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8c8b3c52c89cd715a7fdd2759a6f73c3a5f505303b110656cc35f7549a37cfb","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","daa0fc9f9dd08cb2dc48bf33c9808cfeebff77cb9fba48f98ef597bb9dd6df55","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","db66a999537b941fa6d512908894ba86e8dadd0e14b290ebc119555b7e60264c","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e519e78acf2938460c7ee053981c744dafc7642fd03b56a117d5fec78d258b90","e5db07b7fb0eed216d838fbeb9491257cf54f9bd537a68c8edae7a89fe64c8d8","e61705ac769699a40c52e332cd890187ca9301fc6e64393c8c9064144ccc2dbf","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","e981ced1bfce64a19fa8de1cd518a93f4669d01548f4819d0e1dbb50d266fe04","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eaeec7c06d1408fa6db5d7ada0a232b1633ffdf0ac815033c29c159352347c81","eb708890ac7e19bd53007ccece064f7e2a069a3751270b4fdafdd1668136dee7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","ebcf0bdb3541c8bfb7c9a53f632329b77341cba6f1a2fa0dc9704acfa3276dca","ebd87e3505f3a1adff0c86ffec6c380734df718301b216b7ee089c174130de60","ecd5e83ba8c8eba6cef9c3da1edb8a84e3dfb4ed71d9a2c1908f2c4d26b26737","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0e1db9b86e2132f004ebf06819eb55804f766bc03ea5d80f487d5d98bad8892","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1297fd9ecf981024e1544f7f048705377b53219240274bb803ac30e4a52084f","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f260b4b268e85a8f1b04b2fc69ffc0bca473d2e42de6f2f70128bedc16558201","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f4de28905adbfe6ae4bc38f8bf5f47a444aa8d0f2023faaa431d6f72f9a3edea","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f5403593ba12130c04827f88d019103e924651caa518b7c290673a02f7cb409f","f5681dfc71121ed0f88146a19479675f2fabc6ed376fd5d162e50d815c048d66","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f7993302f695430a0ee938b1b3684fdfec4055bddb378b52c81785c0319e8c98","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","facb45d3084caa490d9b0ac2bcfcee89629a4c3db5926ec9256a9d27d25559ee","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fbd74e4b8dc748b2efdd70aaab07adb80d7f15a38c1261de85bdfd9591ff106a","fc475f9c2d8bee2ffea435e86e6b39b6e3e071143a4a1fdf6765b0da13b66de6","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","fdbd44d3c55504edfa1bacb4c9b7a6c102659d4deef0ca91b9b7ac567ea9cfc5","fedf2577267d6dcd060ebc4ee8de6ccdafa60ab26b78d74c1e8c784252fecb17","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} diff --git a/.claude/skills/atlas/assets/seed/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json b/.claude/skills/atlas/assets/seed/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json new file mode 100644 index 000000000..4768e10f9 --- /dev/null +++ b/.claude/skills/atlas/assets/seed/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json @@ -0,0 +1 @@ +{"citations":[{"path":"docs/adr/0068-the-engine-tool-manifest-leaves-kit-ownership.md","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"2882230e95cc744000cb70511b78f56fb3edb7dbb2f72b0ba351c9832f8c5bef"},{"path":"registry/repos.yml","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"1f40996af5064bc42bf17b3df1a7661c44d5829c0602f24282b6c8ac83830f5c"},{"path":"scripts/sync-build-config.sh","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"2b5547bee1e67a112a8fae85b2f5ae0db5acd7ce6e4715bda056a256d8730cad"},{"path":"src/FS.GG.Kit/stage-kit.sh","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"cdd6963c7a38ccf9dbf88b8c542fa749566a57a22f190e74f446895c9254412c"}],"conflictsWith":[],"id":"build/shared-tool-manifest-is-receiver-owned","kind":"boundary","recordedAt":"2026-11-02T15:25:44Z","repository":"FS-GG/.github","schema":"fsgg.atlas/1","status":"recorded","summary":"ADR-0068 removed dist/dotnet/.config/dotnet-tools.json from the Kit roster. The file remains .github's canonical local tool manifest, including the engine-pin-coherence subject, while each receiver owns its own manifest. The current registry has no kit config row for this file; stage-kit derives the config roster from that registry and derives build-config files from sync-build-config.sh FILES, which contains only Directory.Build.props and Directory.Packages.props. Therefore changing FAKE or Fantomas in this manifest updates the shared source baseline but does not deliver those tool versions through Kit materialization or establish installed adoption. Refresh the real receiver manifest and tool runtime when accepting each consumer. Some older build documentation and script comments still describe prior manifest delivery; the accepted ADR and derived roster define this boundary. This record grants no publication or receiver mutation.","supersedes":[],"tags":["dotnet-tools","fake","fantomas","kit","dependency","receiver"],"title":"The shared tool manifest is not distributed by the Kit package"} diff --git a/Directory.Packages.props b/Directory.Packages.props index 0984d25bb..cb8b9274f 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -18,17 +18,17 @@ - + - - + + - + - - + + diff --git a/deployment/telemetry-collector/host-attempt/tests/packages.lock.json b/deployment/telemetry-collector/host-attempt/tests/packages.lock.json index 094ad9396..9bc65bef4 100644 --- a/deployment/telemetry-collector/host-attempt/tests/packages.lock.json +++ b/deployment/telemetry-collector/host-attempt/tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,26 +31,26 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { diff --git a/deployment/telemetry-collector/host-binding/tests/packages.lock.json b/deployment/telemetry-collector/host-binding/tests/packages.lock.json index a125fcd58..74b4177e7 100644 --- a/deployment/telemetry-collector/host-binding/tests/packages.lock.json +++ b/deployment/telemetry-collector/host-binding/tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,26 +31,26 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { diff --git a/dist/dotnet/.config/dotnet-tools.json b/dist/dotnet/.config/dotnet-tools.json index 111739b1b..f42988df3 100644 --- a/dist/dotnet/.config/dotnet-tools.json +++ b/dist/dotnet/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "fake-cli": { - "version": "6.1.4", + "version": "6.2.0", "commands": [ "fake" ] @@ -22,7 +22,7 @@ "rollForward": false }, "fantomas": { - "version": "8.0.5", + "version": "8.1.0", "commands": [ "fantomas" ], diff --git a/docs/atlas/catalog.json b/docs/atlas/catalog.json index b744ed564..b35cb52ab 100644 --- a/docs/atlas/catalog.json +++ b/docs/atlas/catalog.json @@ -1 +1 @@ -{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","0052dfb9eafceabaa590f4497e4d42f19020718c84b981d265edefd432ccf8dd","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04652cbc95ac4dcd21b837b38f2ca5a0ccd4d0946bc13fdb31c9c15a578d3a2d","04d17203f03279980862496517a1f0861be5f6cc8063bfbf92f8f8ac19744fdd","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","076259a45e71df780b012d29618c17739246c86321d2ff05a6c272bcca8db675","076fa091c878b19cf56a94be0966dbcd58d52c1839f9d4b85bbfdef650cbdb88","08b3dc660b9d2bbbe75b590b2b86d941bf935a254cd5f09de71ee6894f4048b6","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0b2d1557ff6df5f4d65d540a5403b07ba81b381dfc799b7884ac72dfa6ee7753","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0c7d3f36e3bb4270edbf7abd99cd2dab772df274cad1c27c7e87e302b8eb1c23","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","0f11324ad653d8d841962b0eeae9f68b80243d4ef7df4f2404ed4c3e45ba5197","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","13d0363b8d765c87a57eb42c4988320a9c2e7fa09024aa972f4b13d7699a552d","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","15d41240067e2335a0354a4e910b6610f2b8f079b8f67186f10181622b4a8999","1746f4f9d47b7dc42280dd34e664b3ec410d3cc69ac76933707499ffa34c79d4","1754adaf40732c3a8c73d2285c25a8b6c8c9d3e68370de618a0ffa8f3e60fb6d","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","19e75be8ed4dfba2a6f8034154052160a7a181b17d887b3e8724f3e3c111c31e","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b3ec24337f0252a00cfeb6df0a0f5d2b6d737dbea61b8d0b4a643f4c686df6a","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1b8cad98d53da179ab05eb47c1783f4c8b45b9f39c635e7a337285f5cd9621c1","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","20d01a387b4d0801cb588492ede88cae7bade9b7ea3591d9e954add1e67cf4ce","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","22ef13e60456fe9046dfe72f20122362aeefbbb445632231b8e364ed9b50e135","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24373b643450d9dd3b8a5b0e74a5fec2844cd8cbca7d8a57dbc8b9ad9eade9dc","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","2905a2b4a58bd9ec1c4f77fd3d1d246c02caa49d806272756dd039c79521442f","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2b4f7c8dcc95ca8182105b9b6806391666e6a2c3a5c80d3ce5a5f04fd6cf9122","2b5e739c8f9602c585e67554c457e6e53351679afd56ff324f8fecc80f0891f1","2bc251ffb58a0d03480748058eff4c44079a0f21d75743063cef50263982337a","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d46924a94c85f4275a449dd3d9eb6c602cf8a9104db19d224e3aa469b858d06","2d5048eeef90792c0a2b9aed7305598a28db2103fed3903462c6c1882733c3e8","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2df1610ac1b912232030b5507e5e944515b0f1549bf2b76ecfb12baf0f40ccea","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","2febddcced970d495778f33fff212929ac99c23adc42be0c1062f5c8676ffce0","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","31fe4b51d55cd99a4692d2cb787d362cb4c0d0998d3e001efdb5cb7ed838340f","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","3442ba5c7643c793f62d90ca841f7891b3dbf97f028bc7b62f8b4f88c1266d1c","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","3600e7356a3741ef02f8b2ffa6a6b5d822dcbb170771f2ea33312dff4470f431","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","3962789d05f324d436a363700cbb5ced5aba791d782b3c0ea73221fe0c1f0b97","3966e5e53811c43962f5d0953e5da4753eacefbea27ecba9d36af2fd8e4fd52f","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3bce154e59c5c45216bb5372a352e948d6cb365bb1bd47d4666ae0412e507ca4","3c75b650f3fa8217597b01d3aaf25427ae2a658a7c966afeecdb391d3ba547ea","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3d642ccf9ca4a0f7f5dde1b41f65c99e9c447cbb9e64883b67e4fdf76f216f52","3d9fd2c5877483382f0c7331206393e42827b5dccfd60549a6771b7a5659e524","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3dffc36586e9078f750b0a2b4cc2c70a17a81294903186dbe8cc47cf8055b9bd","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","3f5465798dbc2ad279ca4849d5d0f819bad01455e0dd2a9d98afd4b55cfbd7ee","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","4134a3936170c1fb5fa6d2e2329185a981436477a66b7d31e827c363691bad50","414259a2fda4a1a49729be6fb1aced4675ee9cbdf990aaafb8e5b3153b54d64d","41baa5d98b5bab2ee01cad50c05b83edd8cdfeeb00f30b9406b4b2ec6d13d738","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","4457ab439bc8f212d83442dc7500e9d45ffac849d0f77cb97686d9b0672fc3dc","461d34fb1d53849951a7e715e52342372d779299fbcad210794235c610dadf64","46a24cd8e385b748f40d9271b1e856dd6d68c91ab356abb11ff6b65f1ef936bf","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","471570cdf8144df0c32aba1730aba24c7e42e5ec317af771ffa169f5c842d117","47b5cb2b011c0f7012d75e88eb86a10f3f0bd48545db139669e654cac1f69650","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","48262b98c0bdbd5ee2314345726d23630ec1771735db8fe5f1a8590b662c9962","482cd15ecd9cfbd8e1943c0fcde0bbf1d875392dc2a701b698f48bfba684a062","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","48de3afdc6ee73ed121d1433bc6367a399286d5f8c2c63670a0b3b9752a36175","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","49ee4a3f2a8918bdbbafb312cfa807d9982800d13d29ee292c6c0daad8b9b8f1","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4b6ab2768e1ff3716ac8565201c031a820c208db9ea6ae1495dd782e7557a3ab","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4ef30f11bd4dd9d2eef8716d88a83010546e54594b2726de84f6d587651ee940","4f03e231c0dc5c9bb2874f6856382d5b205758af9678fffdc7552d4e4ae9866e","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","4f6fcf4dd7e73d86e06bdb9c14a1078b61c0efb2663ced9bfbc5f46fbb4c6d8e","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","521ed246c4119acd6b579b6eefa23389a1655df54aa35de7671743979ebfc68d","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","55dcc23ce52b3918a60029d9398f262216471c280bfe66421cc63240533a6087","566ddcfc45ea5edc695626826ed185930e910fd9107c5bc1844c717b714c15b2","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","581337891936ba630d34ce9f6b803b82a2130791510f15bab24a07332400417f","58901d008c36a777dc138fa6b6d198030e0e843bc889cbad3acb954c826b3608","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5be05ba74075b8f139be565c47688a4f395ce71452dce5cf7da4348c7ddb7aa0","5c0206d9d014821b52a43d7b222327a89d4ee2f5b1e21813dfa659a69f7426b5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5de00a2f5eabe86c14f360304115f4136c41df1fb664eef6da26072fe7623d44","5e3a589b627edaf7005c60382475fae7229adc4ffbaab6d6fd03e9f08a0a8e19","5e43baca07fb966bf1c4b3ac06bb819577e477a84c5d8d3a9a19c391ada2e0b5","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","600ec184ee9964881bcaeaf72ad38a72db05d5b629d301cb323fa1ee9369b572","616c4dbde10f465da822d8a788feada26e5f915c7fbbc06232287cd1899c3044","62a713311297a7145d3610ee60dd6626ee543645a1918b050c629207561efb5e","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","6312b7a9f8252f49b8ea0cbd0580b80bbb221db574ea74939823ed9d4140d73f","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65725e1cd3323fdf44ec47067fd6670b441ff5f82e99485e1a4fc7d475f14340","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","6601b2bb6c908a46ae2985d4683c8baeeec87b0688b9b33d3e8900286bf4d6ae","666e7f698fbeef24e13e91ccfa334cf781233e060fa86bcd7d4d0eb00b30f3d5","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","671168c05789fc651cd961a5a15e10adbb76656b802cb0fcbab468ab76412ca2","671d95a6c09bb7b05a5721d52cb761300a2c8f376aac20be2948b7e97bf302b7","680de944f1f5380c579003e329ed6f10702ec8ebaaa8208743775588d2424d05","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","7075f89b1271fd04fa02d4db95c0f0bd6bdec24e53a7953d7afaeba40e17e8e0","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","74b5d2ed555740db7b4b0ea9b73f8fe00965fea8e14d4f075eec26ef7a189c68","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","786b0c2856bf1f3f809e5903b0a971f1e072af5635aa50bbb9b1449f96d7b694","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7af2394d2e697f355439e841b6323ffbbf8b90b2e48bf64873791fbbfdf15b44","7b947ed0a9e6e7ba180921434b993c62ac70bbaba6af0a1618569a2d4b705201","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7c2a1c4c4c03e3d68d63e0ab58e4e34d3f2bc1a4a837a055fd13a4e9f95ce6cb","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7dd54213b65fa0a6ce5aa3c204b5209b67ec16306b776aed7dcf9e6601d74235","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7efb464c6d7b469303c43f718063d8456df6fe43534b5d8a4229f5b9ba9705cd","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","83347356a898238c013dff73246440e361a9e24cc3c4e0fe0e850467772b4938","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a06a604bbe36d72da976fcdeb88665c762b0f0de44193576ef2e0cf29aa9ad","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","85e961266b36e0f8ec2a477f1f1dfe7ad748fdde9d906f7bd3241e6924866ea9","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87789dab547842b4e0c822758e1325a3cbb046063e11e105a4779b3741e01cde","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89a96597dc9c218633adaf94bb5d6dcf4cad8f5e0b6f5522a28e3ce8d8b2865f","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cce78271b4f001606069a575a172041fbddc52de6b582c920aa3d3b5d5b67ae","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8f3827158091bbed154d21c843284ad472a4552da2eeb858748aa29676e45662","8f4a21c70e4b933eaa4f9cee119945dd2ebeac532e82d34e17511b38cf03608c","8f6debc54d2bd7abb42f581f2204fc78b27ff8c67ee4b6392b4d71c5f983ee9d","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","90aff66decaa3a0998e9a6741963713c0c82fc70da505519e3d60204bf715fa0","90dc4cac6326293bb54486d3c873b83299e9a5ec8c86a68bf1cc131f5e4e2437","918126027fabb7947dd4ae810dd561ac22167102f9f978f86906624ebe88c9ea","91b495938bc6015970bb02c844368d3eee84425b472772cdb374a5347db86de9","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","922a332aa100d622da733aea8fc74094739bb63cd480d3349a14d2418ab6b1bb","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","97edc66e594bae06bb273db84a35d84c8162a1fdf55ed46d781419a9f6a2e4f2","985638a05562bb796911ec231d306b81e36ed6b58219b3bde874559e9600b59f","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","98ecc99d3396aa9a35ce97456be66c1aac0cc05bab88aa99109649291e61bc0a","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9a8f2389b8ebc29d3769868ff8b918fdeb2236d88192fcf76ab0ea3db0857fac","9af18d8cfee466bc061271d82254d7ea638b59b8d5a3901c6610d5baed85c38b","9b01e565a1541f9e652d7afbe62e3bbff28430c1ccac2226ea434f45fc9a99d0","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d1a0da545eb6b2e16b18fdd305a2c000ff2340c19ac843914b45f6a4f936227","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9dfd29090b50334ae229e4a7e812cfb9f6204a66dde563e215d8f52e884cb103","9e77badd0923fd79ca9761a41780ee4dd4f9ca9b62512f4fb59c7f8418494da0","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","9fb8c5aa087d38dab064a2d6054826377eea3dda98229725c2523f63a87e4750","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a2aec2d2f35d7174801247141d637e77c4f34e478c575b0e0a04c6251efaf993","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a3d6708506fb5c28f45f0d610bedba11b1ec7bcdb363ffff3aa4cddfa515f56a","a476183540f2e7121e533bf2dd9125dc071c81acc880e88cb435cad7a6d35b97","a4a8cca930cdfd15285ac3a7aa757d61501fb77fc12a7c3fbd78c096b279cf63","a50654761d6812cd811df02199e1b7b25c9b0d65e591f65430f9277ec43d9c50","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a644885c31f390b5e6b7fe2fc8d086d9144699295ccb6ffa51b3f7c76c8ca71a","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a70d82083944311ccf98b6aa8da5adebc93c655759eaaf8d79624bb3d322abcb","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ad0e6d78c1e450e19bfca4a0e904644ab0ae315607811a28ac3dba20de869786","ae43a4d252290ec0e18c64dd58d51bc885020b2473e71e3ed0741184c9f006b7","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b3f50ed7eac0e9c54b74c4f4e02297dd2d2465ce4b699bcc15cfddf54c0f0f81","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b4f2140fb766faf0065a563ac3664f395b24c81dab0d0d0d01df47b22e888d29","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b5c085be21651d8579e52cd3ffe4abe6b7f45c5a9ee84d38c47b4734409918d8","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7fda8f4bf81f8213d18e3c314df5100ccb6b8db7aed6b70aaf202deb606a14f","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b83b7229045affbb98f8fc46f289ad05e6626ef52e3ed2f7e70d332a54a69e2a","b83f5334b85422ac110a24286d5af7003f2fb5b0d783efe257b38a2281656422","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b8b8c5cad182083f45ce2d05d036e6bfe91cde1fb63f2e5a97c683bb7ef7ea0f","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba5c707cf9be40fe966c08807779994e20ca3f30ea9d73e26ce31ca334c05640","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bad8f17b1d399ea125c524895571601c90b6c93418c248bd4ebcc7886bae9878","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bcbef69f1ba50e45f3faf1b4529c32cdcf1e5a6612b5bcbc6aa6790ee14b54eb","bd3bf6053f4d423ff21f7ffbed9d0e68f3ea64b7292c048e9a37ade342bb7b39","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c055d3cfd85b2ed4607b0d9d3a15ab7204c9f149599f748347dca4afe102af0c","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23a43ed460117f663cec698412729fd91b5aaceb48cc4e55a785b525661bf1a","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c24546a064b9315172ce0f951bd5fa2cd1b9884231cf1bdc1dc714771f1b3886","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c2e96d98c8ebc10237a2af1c224f626acfb9072c83078f4a8c6d9ef0a58b4a8e","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c4ebd58c4ff78c9fc0cd17d80ed563520f7908f9d1106735ca0f5a7abed202a6","c5db39bbdc8c2bd2aa7b58c28c3df9e407955cc3250ce7825c842cc4c30eaca3","c65325f807190f7084346376e2f48fc2b6bb946004a1fac1d8d117930e93d462","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c82f38f23e7ed3e1024661b7a22ff694e88d3b268240e2bfc98e630df8a062d0","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","c93cd4cb5cf38fe6221fa8ae171ff54240b5f99ba80cd740ffac69c57e5fa381","ca50b525d7aa7762c56f402696dd464841daf19b036bb932e325090004b4cd71","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfb9705939742247da0cb71fdfd8b5f7a1bef6f1c2f0979a8f42e54c4a480980","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d151ffa66d8d096e0272f0dfff6c27e978cfda570f7498a727593081888b4ebe","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d268e680ee1136a239a40ebf005b30db6f3b52a228016f3193496f86250f15c3","d2989a1607fd5303615937b8c117d127b1b1cde519662ab1e1324390220e8612","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d2e82db1f6e479001e15c9890732b5049f8c900c568d5e3d15707a95a7dc3610","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d36034e2f9cc642d0f9f24cf834fa741bac5b8b139cbd2f50e2065161c9f3cb0","d36eb7456d2a42d1cffa4b60708e2bd3116f7f6758c96bbc0fee0f1704ad8a79","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d555a0d2329caace197c1468fe6708349125762377ee3bd04b031b7eacfc26aa","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5adedc08fa25bd06734afd1db3510dbc53ba0dfdac20cf601fde0c77702a72a","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d67ec5caeb2af5f9c57533a34cbde7daba5f5b2e5e6ce34c3250893eef25f13c","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d7a44c85c25ceb7d42280f0c2576de52a3b3cc3ad2333e788ecdc7f7f7fe4b3b","d7f5db16fd3b6ddd5acdf655e090ed0e84cb89d9eafbe1ea92b273b71a38f173","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8c8b3c52c89cd715a7fdd2759a6f73c3a5f505303b110656cc35f7549a37cfb","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","daa0fc9f9dd08cb2dc48bf33c9808cfeebff77cb9fba48f98ef597bb9dd6df55","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","db66a999537b941fa6d512908894ba86e8dadd0e14b290ebc119555b7e60264c","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e519e78acf2938460c7ee053981c744dafc7642fd03b56a117d5fec78d258b90","e5db07b7fb0eed216d838fbeb9491257cf54f9bd537a68c8edae7a89fe64c8d8","e61705ac769699a40c52e332cd890187ca9301fc6e64393c8c9064144ccc2dbf","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","e981ced1bfce64a19fa8de1cd518a93f4669d01548f4819d0e1dbb50d266fe04","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eaeec7c06d1408fa6db5d7ada0a232b1633ffdf0ac815033c29c159352347c81","eb708890ac7e19bd53007ccece064f7e2a069a3751270b4fdafdd1668136dee7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","ebcf0bdb3541c8bfb7c9a53f632329b77341cba6f1a2fa0dc9704acfa3276dca","ebd87e3505f3a1adff0c86ffec6c380734df718301b216b7ee089c174130de60","ecd5e83ba8c8eba6cef9c3da1edb8a84e3dfb4ed71d9a2c1908f2c4d26b26737","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0e1db9b86e2132f004ebf06819eb55804f766bc03ea5d80f487d5d98bad8892","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1297fd9ecf981024e1544f7f048705377b53219240274bb803ac30e4a52084f","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f260b4b268e85a8f1b04b2fc69ffc0bca473d2e42de6f2f70128bedc16558201","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f4de28905adbfe6ae4bc38f8bf5f47a444aa8d0f2023faaa431d6f72f9a3edea","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f5403593ba12130c04827f88d019103e924651caa518b7c290673a02f7cb409f","f5681dfc71121ed0f88146a19479675f2fabc6ed376fd5d162e50d815c048d66","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f7993302f695430a0ee938b1b3684fdfec4055bddb378b52c81785c0319e8c98","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","facb45d3084caa490d9b0ac2bcfcee89629a4c3db5926ec9256a9d27d25559ee","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fbd74e4b8dc748b2efdd70aaab07adb80d7f15a38c1261de85bdfd9591ff106a","fc475f9c2d8bee2ffea435e86e6b39b6e3e071143a4a1fdf6765b0da13b66de6","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","fdbd44d3c55504edfa1bacb4c9b7a6c102659d4deef0ca91b9b7ac567ea9cfc5","fedf2577267d6dcd060ebc4ee8de6ccdafa60ab26b78d74c1e8c784252fecb17","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} +{"records":["000ada42299601fba29016e5c0e0d4012876fb42670bb10fa0b1315477254ba4","003893cc49855d17a15295d7adbe57ee301ea20281dff216461baee0810853ff","0052dfb9eafceabaa590f4497e4d42f19020718c84b981d265edefd432ccf8dd","00641d046d6869fdd0023ab3df99e0e67a6ea28f0dcb701f622b1cec8b3e07c6","0066d4a624c02398f21b4d7a736a9fb5101ed8b6b13ceeab46907e9401af98ff","026a241141ee10eb829aa6ce461969242d5c1d45fe9ca19f08ef4ea880877676","026b08fb343aefe19177e95b759560d340d372def4b71acf613fefee3438ade2","0357495d23fac4fad210b6dd7ed7cc57dd33d107e1659a81f085cad78300797f","036c148f6d0e89858c9bf4cf380272ca6904bb4ca277a909fb71c47f5450cef7","04652cbc95ac4dcd21b837b38f2ca5a0ccd4d0946bc13fdb31c9c15a578d3a2d","04d17203f03279980862496517a1f0861be5f6cc8063bfbf92f8f8ac19744fdd","04e404d89dca295564813149472b1de8e6c43357e2f6d91d169ded7600ed3a02","0509e5c6fdbd2dde0c0db8558647080560714804d00e4f9268342f2e84858a3d","06ad2c8aa0ff3b862edf3ba99e0e4e8801ee163709e66333cd06c3fc61232b05","076259a45e71df780b012d29618c17739246c86321d2ff05a6c272bcca8db675","076fa091c878b19cf56a94be0966dbcd58d52c1839f9d4b85bbfdef650cbdb88","08b3dc660b9d2bbbe75b590b2b86d941bf935a254cd5f09de71ee6894f4048b6","09e90ad705af012a8c36efbf296757f35adf9c9ce3b8908791c75d72c192973f","0a6d7dc5b64970bfdadc9049ace95e8bc163fc421beea70129ff0eaa692c6d06","0a862ee40916522f8ae5f14b3e084bf5f2e6488185583346db96ced16ce7619e","0a9df276d42b56d98a7802befc2404204e0e5ee8bc7f5c032f7bb29aa4ae2091","0ad4403c8f4078dbfa543310c69bd1dfc768e305987214ffc37d7b2600c4687c","0b2d1557ff6df5f4d65d540a5403b07ba81b381dfc799b7884ac72dfa6ee7753","0c22360d4653eb0f450e4d3d34564875f1660cfcb2d546095d98b3faa3967cbc","0c7d3f36e3bb4270edbf7abd99cd2dab772df274cad1c27c7e87e302b8eb1c23","0da4d093b49c0a1f654b38008bb01195e816829279ca1989bd2448194e15361b","0e560af7d9dd2e0f2f588a74cd35512973747f20bdfe0bee0bc889105ea53dc9","0ea7107c2c8edaab3ff2bae32f63cfbef6903a51cdaff257278f757ed5ef429d","0eef4d717eb03f0906aa3be7336aa71f831726afabe8a56077b76f6e82fd08e1","0f11324ad653d8d841962b0eeae9f68b80243d4ef7df4f2404ed4c3e45ba5197","11fe30832d93706c60efd836b09f35f049c4a715ad6144cf277ca240c5780704","1244d27db0cf5075353bcc622d0fb3b5ca6a7d08526e2c5754e8b745c250bf3f","126c817ad25ca9cbac2a0f7446e76c79852459ac7b9c61e3ba5d5cbfe5d37dfb","13824d6bce0f961c89eef4bd3c8a72ae6ecf7a1339b9e06eec964dc5c12dc544","13d0363b8d765c87a57eb42c4988320a9c2e7fa09024aa972f4b13d7699a552d","14156f1c6bf0fa8dfcb5cfafac09e012db446d528dad0e4301404fd693b9bed3","155fe673b8ae12549c978e1bf1d5c43e360937fcf2135cdcd5aea6f6c771da44","15d41240067e2335a0354a4e910b6610f2b8f079b8f67186f10181622b4a8999","1746f4f9d47b7dc42280dd34e664b3ec410d3cc69ac76933707499ffa34c79d4","1754adaf40732c3a8c73d2285c25a8b6c8c9d3e68370de618a0ffa8f3e60fb6d","1945f527afc3c2930ec4d7fa57ebb2ef7dd6321c0dd3ab9233c9963e9e613165","19d657b67672257ece127f3b957674b7fb4780843148db0a36a0b329c2a418ba","19e75be8ed4dfba2a6f8034154052160a7a181b17d887b3e8724f3e3c111c31e","1a24f6ef0c08a898f309c1b925fc19b29526f913a61a1dfe4b1a4308ebdd97ac","1b3ec24337f0252a00cfeb6df0a0f5d2b6d737dbea61b8d0b4a643f4c686df6a","1b5351b2dc647aba864e387168db5128435cb80da94fc42581cd60a05fc34b9a","1b8cad98d53da179ab05eb47c1783f4c8b45b9f39c635e7a337285f5cd9621c1","1cfd18d1b12b25604d818389a34bbaa746f450e70246c7f4242fc4e215fc46a4","1da011289116fe88fe92cb8f0e83ed7ccbbca251681d4e136c5a61c40364f8d3","1ec9445b242d2a2e149fe71c67bf13d8c0e4ebe5a6ed7b022656b9941973909d","1edc36731a9c76ad07d269d8b4fd84c8c956bb43d6f56de17d6208164856ffbe","1fec5a63a7b2b212e3e5d5222e49061f3b924966c9741294f5630836be8a3925","20901b579f69cc97eb56b492938864667576e1c9bfacf13f8a529c4f6e543448","20d01a387b4d0801cb588492ede88cae7bade9b7ea3591d9e954add1e67cf4ce","21338155cb4f52c49e5072c877771be67c75590d9b238ea025fba5209fd6e018","22ef13e60456fe9046dfe72f20122362aeefbbb445632231b8e364ed9b50e135","23af79bd1e7995fc8162ddc4d830318acb054bbfcc9c7d5cb141ec306da67386","24373b643450d9dd3b8a5b0e74a5fec2844cd8cbca7d8a57dbc8b9ad9eade9dc","24d4f2730d94d1b7f149771ef0e59192f4936d142b21f4a56b1a391e4514d38d","252de742c26409c837ef491f55eb03ffcc99da13fb1a2f8ab66efbfb0c081a2f","253bb17320020b6a5ef8f0958856f6c565a239b4dc246d9e825f8b14da9ca8de","2591526ddabbea03fbdc38bf172bc54f42df9bc51eba7ad2b70d6e67215f08f1","26259abc7fe745f52e06f2aa2abb0e50f189bc7608065f04d5c669a0a99941cd","26290a0990d6dac0ce9448e05eb934210603356043dcf14a5d80585288e2aa92","26d6b31965013079d4db67a2c403e01f21e3c30ae65953400dbed92e289a0925","288daf614247c260cb673d8674e8b3874ccc4e269347836851f702d7ac8e2f7c","28abfaf6d50ca38af0b88aa50524200c17af9000da83ddbab3d8f9e06e020fa5","2905a2b4a58bd9ec1c4f77fd3d1d246c02caa49d806272756dd039c79521442f","291d3db272eae084d34c04bc1305f2abb26a7e7acbc5515208469b46719a4ed1","2a38ddebfe3380232e35d5a24f9cb9f7c38abbc9c68add4ea5952c1e65d328d2","2b4f7c8dcc95ca8182105b9b6806391666e6a2c3a5c80d3ce5a5f04fd6cf9122","2b5e739c8f9602c585e67554c457e6e53351679afd56ff324f8fecc80f0891f1","2bc251ffb58a0d03480748058eff4c44079a0f21d75743063cef50263982337a","2c76ce93500601e281a41f5985fe4e3926fc8bc9d01ee687f14052cb553ad2d2","2d46924a94c85f4275a449dd3d9eb6c602cf8a9104db19d224e3aa469b858d06","2d5048eeef90792c0a2b9aed7305598a28db2103fed3903462c6c1882733c3e8","2d599c722a08306b98f2d833fb3e4a7acb9dea92e6a58820caa2f65c09803fb8","2df1610ac1b912232030b5507e5e944515b0f1549bf2b76ecfb12baf0f40ccea","2e1bc31ff6b6fb14d0ca8703a02833db749b03e172f2e91f9423f0751e88c256","2e872e9d3ab8b553270e79673060c50c1afd68a41fcf9fdd0a13cba80be0dfaf","2ecd502add2d801eebed39411fadc9a80098ba9ce04a5f4b728a0e4e331232d6","2f7357367d921995f4c6fdaa693392adcd2df4860ef4d25c8dc47f7ddea8c755","2fb2ed7902a8e35dc36489a23245d963026d688008c92fed6fdc1f6bc27198a6","2febddcced970d495778f33fff212929ac99c23adc42be0c1062f5c8676ffce0","3018f389f6928af5830bdd081c9d03530a379f37d1c2f9196e6fb3c44eb337d5","310bfb5b2d061bb733771e5cb7b3b7d25db43af5eda9f806169b7ef9330c2fe7","31fe4b51d55cd99a4692d2cb787d362cb4c0d0998d3e001efdb5cb7ed838340f","32f69a7b8997ae98b9305ee578145d795dbcd39ca4469bf2465e57a0295cda51","335683e33b94cb86b5e426b4faed200673bf850151191a08458136ceb164fd4e","3407ec53a884d3945d86a88d6b9a883419dd426e96b1108a8e6686f30397a629","3442ba5c7643c793f62d90ca841f7891b3dbf97f028bc7b62f8b4f88c1266d1c","34463778cf2d29e3896a65613cf9e3eb3e9f2d8946d17f12b609e70eec63d128","348ba129b7b9c94e24fa8ddb81024e777c60448d1b5d49f7b2075591b23c13b1","35da3938b72cf3520e126ad595157104b69ab748904c7b4e12f563d6b103172b","3600e7356a3741ef02f8b2ffa6a6b5d822dcbb170771f2ea33312dff4470f431","37c8908ea2a349cd3034018027160ad810b28ad1fc203a9a353971e1f7396b4c","37e39faee019bb041627510f1f02746ba9a85696417a083b438eb4974b72c2bf","38a75fd804821f4836f0a7ba8d41af3d3a3a5f5d7dcea68487009297824258d9","38c6396e645750efcb2f187c36c383471b3b0b59290e3b42cfcb9668594cd0c3","3962789d05f324d436a363700cbb5ced5aba791d782b3c0ea73221fe0c1f0b97","3966e5e53811c43962f5d0953e5da4753eacefbea27ecba9d36af2fd8e4fd52f","397476cf107b48e7a662264f8fea9f880231fd3d1e0401622650f214cfaa35c7","3ad8b0398ba6c354c9e31b7438b2515579fc0b1f17de4b35a914c862a3a11e3b","3b3c6cf083b12a840565e00458e2fd4ee8a61f97cda452703a6b13d7776b6c13","3b4af144afed3d52dd2e1f64e23bc25b3475eee5f7af3bde9886761b15c33dfd","3b5d82795e9f5d1992ab67e078fcf1108247ab9b6d1baeac944d3ec0294cec5d","3bce154e59c5c45216bb5372a352e948d6cb365bb1bd47d4666ae0412e507ca4","3c75b650f3fa8217597b01d3aaf25427ae2a658a7c966afeecdb391d3ba547ea","3d0274f77576abdbdf442c8843e955e1bbc91e9f8cbfe3646b119337cdb13c96","3d642ccf9ca4a0f7f5dde1b41f65c99e9c447cbb9e64883b67e4fdf76f216f52","3d9fd2c5877483382f0c7331206393e42827b5dccfd60549a6771b7a5659e524","3dbf6d1c2c8db1a7e3988e2a84b67a4e1d7c8304661652ffa94db3b7eee08edb","3dfcea4ee3d0d0ed09b1f77bac48b33b64ab4620cbfc74fe0e4201b4cdb81ce6","3dffc36586e9078f750b0a2b4cc2c70a17a81294903186dbe8cc47cf8055b9bd","3e2f66baa16c7ea936eba34720a55897438f60b343cbe8fda4eab1e5dde044eb","3f5465798dbc2ad279ca4849d5d0f819bad01455e0dd2a9d98afd4b55cfbd7ee","40de9f41f9a9f56ef6a51d065270e875b4a85cf043b7c4a0173b2510de4979ea","4134a3936170c1fb5fa6d2e2329185a981436477a66b7d31e827c363691bad50","414259a2fda4a1a49729be6fb1aced4675ee9cbdf990aaafb8e5b3153b54d64d","41baa5d98b5bab2ee01cad50c05b83edd8cdfeeb00f30b9406b4b2ec6d13d738","41c768ea17144c6ec225e9a65d4c3c127fdd7264dcba1a89aa17b20fd5d7e3ee","42aeb46fcc3d10b95e4067bc9cda875fa933b4102873f67c7bf1f8ca6799a598","4320b92712bc14dbe10b56f1cd3d1bdc093fc4be6016732839d0be4dd4d027d3","444342c21a4743af5961beeebb88088f5d2a0649f76c71973a7706a744f5efd2","4457ab439bc8f212d83442dc7500e9d45ffac849d0f77cb97686d9b0672fc3dc","461d34fb1d53849951a7e715e52342372d779299fbcad210794235c610dadf64","46a24cd8e385b748f40d9271b1e856dd6d68c91ab356abb11ff6b65f1ef936bf","46cdf2c207f79d388001f6636dfb7a98bb2ba72b9d1c6df4938f0a27691e07a6","471570cdf8144df0c32aba1730aba24c7e42e5ec317af771ffa169f5c842d117","47b5cb2b011c0f7012d75e88eb86a10f3f0bd48545db139669e654cac1f69650","480f1ede18ae031b164d49d676feeb1090fb33932676ff52e1e2eb24e8d154cd","48262b98c0bdbd5ee2314345726d23630ec1771735db8fe5f1a8590b662c9962","482cd15ecd9cfbd8e1943c0fcde0bbf1d875392dc2a701b698f48bfba684a062","4855e1947afc954cb1b20bb45e7af10b098fa34714bd32e9bc77941cf58fdaaa","48797c44c92cb34fd9a57a08020b45c6920b2268dc8ad616c0f814a3710d5316","48d094622ada1806cb30335926007c1abc476b1f7b45a2e250c490afa25e847b","48de3afdc6ee73ed121d1433bc6367a399286d5f8c2c63670a0b3b9752a36175","49e8cf09e38acefd3a0fa62d048028286d3b47b5ceccd8f51f10022978c47820","49ee4a3f2a8918bdbbafb312cfa807d9982800d13d29ee292c6c0daad8b9b8f1","4a724a6a842a132c2185279513f341b79f9be93e42660f1255770eeae3b1323c","4aecbdfafb68feb3124c39219498241864bcf1ceaf87fbf80598b1dd87a9191d","4b364ecb35ad02b06b6b0f32b6a29202f2c835e1ac0d70b89fd0278271799dbb","4b6ab2768e1ff3716ac8565201c031a820c208db9ea6ae1495dd782e7557a3ab","4be7778c4f491d55154a028d9a9dbb35059953fbcd243e0206902a6e64645efb","4c8c327dacf345e184042092e96ad3ea02ed4cece57dac5fa68ea52fbb5a6adf","4d5a44ba07fafeab823b54a21846269330ce35b4c190f3ddd5434bc8530d9b41","4d86a2764c55b5c5f675fddad8850ce4ceab160ac5c164a299fc098899d31aa9","4da0a5be70e8af9c39623deac83822749482187f6a0fc3d186dcfddaa7111576","4ece7844e2b35705ac39fa25913f6909aad5b4b7446bd637ced46b47c0db135c","4ef30f11bd4dd9d2eef8716d88a83010546e54594b2726de84f6d587651ee940","4f03e231c0dc5c9bb2874f6856382d5b205758af9678fffdc7552d4e4ae9866e","4f1e58fc658a4ceda181e2a7fa249305b09b573ffd68c2489f204f4957224957","4f2750b974c1404acb721ffc84cbd1d0756a24211dd6f6503c10ea74dbc45676","4f6fcf4dd7e73d86e06bdb9c14a1078b61c0efb2663ced9bfbc5f46fbb4c6d8e","5029c7b222158ab3f325168fa543d84fd2332d2e3e38db1ce7b83899cef201d1","509ec9c08864b9dd0029f32ffeac85fbac863e2dad459994c65b7cb5264faffa","50fd7e982eb2d2813634b7c44e102788a1a1cd4910a27acbcf219f76314fa322","52049cc9cee43bb27229e6b3e983e02c6aa20dd7d153b13e3c74bc6d2b47cf92","521ed246c4119acd6b579b6eefa23389a1655df54aa35de7671743979ebfc68d","5382c901d160ca2d79888d8acd7a690a5349826b5da486274b0800c9d7513f11","540879695d41205515aaabe5466971014cb43b960a26b8e5958e37fed63df762","548d237f42167af5cf5caa0ba20f0e7a6387deb6f27765637f078325172396a7","55267f058e9f085117765e4ca72ce875b622ceaceed964f6c396073214835c28","5560616d1e72f0a539f9ebbfea3b7d195c1ef5622f97994af1963748d4f97533","556ee783d8e2e4ca50f656c095758be613983f904d998a6534fb155510114f21","55a4711e799294d06988ab4acf77eacd7d424123082bba3ec987dff0ae13999c","55ae095961d78a1514c4dd1e63d477c60179a8662571ab5a90abd3eb2b83eb10","55dcc23ce52b3918a60029d9398f262216471c280bfe66421cc63240533a6087","566ddcfc45ea5edc695626826ed185930e910fd9107c5bc1844c717b714c15b2","56e7158313357bb145bd98c5f790e569be2203fb2601565a30091a597a7e7ff5","581337891936ba630d34ce9f6b803b82a2130791510f15bab24a07332400417f","58901d008c36a777dc138fa6b6d198030e0e843bc889cbad3acb954c826b3608","5962dd14d3923433cf723d698d1af19ac37a270b6e88445643fc56a646faab5b","5a2064cdf51026eed65457c05f34bec919b31d96d35c29498d298685965f0b5a","5b77bd6dfa81cc339e729e4195e258facbfeb64b9c680512f742e3fb1961fdd5","5be05ba74075b8f139be565c47688a4f395ce71452dce5cf7da4348c7ddb7aa0","5c0206d9d014821b52a43d7b222327a89d4ee2f5b1e21813dfa659a69f7426b5","5c3527e43fe24c5aa171c6fa4a3de7fe5e78f2527aed0dd19cb21d154d43da21","5c79c77f00167ca140127b00f1a79e1ffac621e46fc461089594206a7df8d7cc","5ca67643d5111fffd21deb18569162733e846965bf05fe6eb33ccd37c964025a","5d015880319af666943e68169ca906bf2f0c813d8bf2c5c0262aeb5a40366350","5de00a2f5eabe86c14f360304115f4136c41df1fb664eef6da26072fe7623d44","5e3a589b627edaf7005c60382475fae7229adc4ffbaab6d6fd03e9f08a0a8e19","5e43baca07fb966bf1c4b3ac06bb819577e477a84c5d8d3a9a19c391ada2e0b5","5f2a75b89983d1005a38afa2cabccc3a39f31989807120281d8505ffd564e0c6","5f43c837f39d207c35a58e9b36fe3144017b2012ac7da334714247606f1906d2","5f4fa6dde5930fe1b42f805895f0f5fb135c2b3ff9830f2bd30ae7526a3295a1","600ec184ee9964881bcaeaf72ad38a72db05d5b629d301cb323fa1ee9369b572","616c4dbde10f465da822d8a788feada26e5f915c7fbbc06232287cd1899c3044","62a713311297a7145d3610ee60dd6626ee543645a1918b050c629207561efb5e","630fdcff1f227b5baf5d10bd78ef0fde68791ac0cd8a15f65065f5cc4501b17b","63113617f2e4ee6b827a69bce6afb3949190a282f5feaaa9e2c9f82372623bb8","6312b7a9f8252f49b8ea0cbd0580b80bbb221db574ea74939823ed9d4140d73f","63544fa69b09916d52b305700eb9816305ff22b77162a44edd13897acea3a655","6385459222fba2c3302d3f2e38c57fcfe0f1829679fead6cffa1964248767d5e","63a4394e689acf4a4762cfb4df691d05f923fdf592fd2f8ea41e6a54f98d1136","65725e1cd3323fdf44ec47067fd6670b441ff5f82e99485e1a4fc7d475f14340","65d5b7eff9d03761c8206218159bb34883c09052d6a1959d040f711a881b4d4f","6601b2bb6c908a46ae2985d4683c8baeeec87b0688b9b33d3e8900286bf4d6ae","666e7f698fbeef24e13e91ccfa334cf781233e060fa86bcd7d4d0eb00b30f3d5","66d414618d4283838bddb6b9fd4b5221c280a7f6a715b622143d3bea76bfe1f6","671168c05789fc651cd961a5a15e10adbb76656b802cb0fcbab468ab76412ca2","671d95a6c09bb7b05a5721d52cb761300a2c8f376aac20be2948b7e97bf302b7","680de944f1f5380c579003e329ed6f10702ec8ebaaa8208743775588d2424d05","6989ec486a05550633170d2aa79188ad9b03aeea6c7859dbf18790ba78c5427a","69ebfc7eb8427db3c5c59bdde652d0cb269426126f8540b1b58caa29ccf130e2","69edc4285578313d1dd2f914d69add075a7b354f7fba717606d1abe15292576b","6a34d9279cae58765d6ee4a980192c0e15f3ca217b9f1815861d472a281b3cf8","6b00dccaa7deabc750679ab085b237a2bd025bd971ee1eb7bdc333b393b19084","6c3c592efe9c684ada5661b8cc88a5c3f6e57c841db06b9e070687504cbf6236","6ce6d164c3e31463fb9e144fdf91413e55d077cfc4f25092bb02923fb538a84f","6e08a638e1e28020923effd4c65fc517dbe7b06100ff76cde74e427191503b84","6f3a7020233cd77cfe59eefec0a277f6dda323743c8d80e4e54a95cd3cbc23cf","6fccc6f0c5fa71c43211785dced8abd0f3295040eab56063f4e8d77f1c09b8ef","700cd21af9ed7e81900fad9d52de2fb11db48e64b038e4293168f85e5dd0e043","702d1dfa75e92a916a446429f474d4c296e6ea4e8c487995852d0525e8440659","704cf778db6086c3e282c81249fb0ef09c1d7c2043335ef74c7ecb69bb3e84ad","7075f89b1271fd04fa02d4db95c0f0bd6bdec24e53a7953d7afaeba40e17e8e0","71ef1ed2d5e4bc7eebe7a73bb3e9423e5bc2f8319186380fe8b38334952d3b01","7256ba00af1cf759b95b7bf8ae3b9943f31349bd10a7652a26bb419b368d73a3","7369b339daca0fcf46ac7fe82d65ae95c75d7dbcaaae51209e6d90b6587a014e","73ec844fb3e2b9febd00ba37508b284fad141630f03cb9f74e36a195180f5054","7410de003c7b582e30470d1209eefc796a70c76fe8d61dd9ccfe01ecfa41310c","741c27b54c49167abef1d8633e3743b0e98f82a73731e744b6671e119a1c6310","74b5d2ed555740db7b4b0ea9b73f8fe00965fea8e14d4f075eec26ef7a189c68","75aaecf53db10459d768a6873f6783e7d7110aa510c2894378df027c1b03584c","76bf5a9c126db6eb466287a7c0d823327ee9882a70eaaa6efb03d169b5dba808","781a64598efb2a11156f07271ba1c14c4f6b3d73aa2943b26eae02063df7af70","786b0c2856bf1f3f809e5903b0a971f1e072af5635aa50bbb9b1449f96d7b694","799abc1e8d381b8d97349479139985e383bb49179b5a80f39807cb35a3ee78ce","79faec494bdd6d098c9d2a9d8559f822938c6b2104188db95321d89e7a732979","79fb2e6e6a91117b6aefbdaabda23ccfa596620f548ee5075993a8dc7a8b872f","7a032dbf0351aa32c77c8d187f7eb697500ff186c88c5946ecc15adc972246a6","7a134e7f1822183ed1c0ded720971539350feaaf92612761210cfc3ccdc55870","7aa52373f2721dd76fc8eeb3d6061794f27ea8d11e96bcb1ff25a97994a77d5c","7ad4ef4b8d3221758a9e7f9577750ee03f6cba11c8eae8bf25f74a3131bd21a2","7af2394d2e697f355439e841b6323ffbbf8b90b2e48bf64873791fbbfdf15b44","7b947ed0a9e6e7ba180921434b993c62ac70bbaba6af0a1618569a2d4b705201","7baa35131ece7ed9860607157d2531d4d70a061bdc9bb9876e20328f127cec53","7c2a1c4c4c03e3d68d63e0ab58e4e34d3f2bc1a4a837a055fd13a4e9f95ce6cb","7cbf970a11bdb91a40e248eee97ef789205910ebc913349698fc75ed35e82fdf","7d6133667f81aa66a98755d253ea43301b45ada338225df034d2ffdfc79829e7","7dd54213b65fa0a6ce5aa3c204b5209b67ec16306b776aed7dcf9e6601d74235","7e89b59b456dde4bbbdbf8079665bd82c51d8e500018472981c15618b3893959","7ead0c68ffa0ced241af74dde58b3831343dff3f7eaab64bddb9954545b7ba12","7efb464c6d7b469303c43f718063d8456df6fe43534b5d8a4229f5b9ba9705cd","7f8188b57ad3b0c28210c95954e5623376a4262dd5e75f002700c6094b8d6b6c","7f91dfc2ea1a3131c4090375db0f489c2a572e245ade6cda4ebd440446d6d60e","7fcb8cba3ed0ee9c342947aa88f0f699bb4f5c23244d21c6c739c9b66d7c6101","800060d7b4934508d0277f90a464e3112fd2fc99af4ef23825d09b0ff53f91c3","800a802a4ce9e597a102f0a566535c1f9f7adfc60c41af6bd2db4fb7fe3c0d0e","820c12fcbded9048a363b9e0ebbc48b24f85fd4a68131b5dfc1b19057bf09ddb","824bff7541ec2a4b0be126f0b0791314d568a0eb4e29073de4f9dbe0ee4918b8","82c419e5de083e423330432c9d45c744043d1bccd8eeccb41e3014ce9ae3c32f","83347356a898238c013dff73246440e361a9e24cc3c4e0fe0e850467772b4938","8343a4211a4d0ffdb320d5a4305174d85bb707d15dad978f6436297d022daa11","83a06a604bbe36d72da976fcdeb88665c762b0f0de44193576ef2e0cf29aa9ad","83a97b9ebb29f5cd014ef5e178970a601ee92c44678f05d1860b383c5f63b79d","85a962a7c23c14dff8d683e738b53f422221697b213cafeb616d3a172a6c4223","85e961266b36e0f8ec2a477f1f1dfe7ad748fdde9d906f7bd3241e6924866ea9","8629fddeb4f273b35df69d4d28923adc14eff59d919b1a495d1a68818137c561","872ab2b2d65fe685b91e355f5af051c85b79569ece16448160d01fef38039624","87789dab547842b4e0c822758e1325a3cbb046063e11e105a4779b3741e01cde","87f2b3634baa504f2ed9508c6cf6a47bbfb36214a177eb13d70d6a987706818c","88b615ef6a31bd9958e98b8ea522f49f0360ccac5d9fa8deb9e3ef3fe3147d9d","89a96597dc9c218633adaf94bb5d6dcf4cad8f5e0b6f5522a28e3ce8d8b2865f","89cafbb20d6029656266d8cb0f85103fa519c8032598282fea58c94cc59c4125","89f2105745b3a7cfd30e7d7c598d6c8fdde0a599f30fd0db7382cba50412445e","8b3eec010d1eae43a28c88434f2410a751f790a9d6ec4a08e75e68c171629ab2","8cce78271b4f001606069a575a172041fbddc52de6b582c920aa3d3b5d5b67ae","8cecfa09651c40be4d7c11c117c80e1911dc75bf6f1cc34be64706823cc024c3","8d250acd40c8a24ba0d51cc73e65bba6856509b5fbf4c7d7a435897a01c6e764","8df1420c27503370db9382f68a0af8d2b4d56f9dbc94b24ffae450a905083a79","8e7371228a726f381fb811d1d812c39917788a3df7e53dba1a3c364e755a0c03","8f3827158091bbed154d21c843284ad472a4552da2eeb858748aa29676e45662","8f4a21c70e4b933eaa4f9cee119945dd2ebeac532e82d34e17511b38cf03608c","8f6debc54d2bd7abb42f581f2204fc78b27ff8c67ee4b6392b4d71c5f983ee9d","8fae27ba5117e202afbd523b249fc454912571900fc909f5419b8ac96c773c44","902b958b4db7d8d8bf73a82a8aa86e5485b39477047c8ad60175d118fe31d987","9056c360e59fc78edde932b54124df317f2f04a90c0c6eb7825a87b89edf1ca0","90aff66decaa3a0998e9a6741963713c0c82fc70da505519e3d60204bf715fa0","90dc4cac6326293bb54486d3c873b83299e9a5ec8c86a68bf1cc131f5e4e2437","918126027fabb7947dd4ae810dd561ac22167102f9f978f86906624ebe88c9ea","91b495938bc6015970bb02c844368d3eee84425b472772cdb374a5347db86de9","91c9ced5e9ab8da897b7f69166a7d0bade5c58d511b42d60d5430d536da45d09","922a332aa100d622da733aea8fc74094739bb63cd480d3349a14d2418ab6b1bb","941f70c384905ab77cb9a88e2671301117e4df553da6fc7a09210710deb9b6ca","9442788fa51227044803f1d3efdfc1c2b2da372871a85f0f7a6bb3596a5c003f","9460f427df72c238c4b55f39c8864f1fa3685b0716a53227ea6f7b591d955c82","947a1cdd43831936480167169d30334f818bb5d882650a3547827c05204af111","95f0c5f3b9071db39fd72b88ec9fb2079ce7553fd5884fa527bc9216777d7c10","96c4c83df72e9d860e2ee51f1a74bc867c4a45efc8bf11bf88aa82e368b89aa4","971f59cc197732d0c0b6b8aabbbefca4550fb8fb04f8522bdb4257c05a28848a","97edc66e594bae06bb273db84a35d84c8162a1fdf55ed46d781419a9f6a2e4f2","985638a05562bb796911ec231d306b81e36ed6b58219b3bde874559e9600b59f","98a097d6ebb754334250dfd3ccc5f3dfaf5966524758cbfc9e10adf4a0229693","98c7e4bc2f05e9b4ca703db4a02347db7355a44f04e3a4003e26c46a56bded2c","98ecc99d3396aa9a35ce97456be66c1aac0cc05bab88aa99109649291e61bc0a","9944d1a9674e555a41d31d069d136461eb06dd4052d40f2e4ea4368dd978e01b","9a8f2389b8ebc29d3769868ff8b918fdeb2236d88192fcf76ab0ea3db0857fac","9af18d8cfee466bc061271d82254d7ea638b59b8d5a3901c6610d5baed85c38b","9b01e565a1541f9e652d7afbe62e3bbff28430c1ccac2226ea434f45fc9a99d0","9b466e8fcabe551bb6292d23a359be3ea15b7627a6ad9c9e6a4ff11444c20860","9bac7daf255467f47b83723095f93fa4b574d5fc08593f48825a2b2ebb8e2dd8","9bbd03293bf53e9db51401d157b3eb2aa51e9c70449350e98b9a0a3fc9a684ce","9c3b318c461b56a8d277133a6b947ef5618690ec281c42e9de6c27f22458d4d4","9cef1feab6841836dc20527fcc8ad9979671fe811ff80a5a33bae113fcbebb97","9cf90b3aa59f3ca0e40fd9e1fec9703428752d63bded6b091d28f614c9ba99ae","9d1a0da545eb6b2e16b18fdd305a2c000ff2340c19ac843914b45f6a4f936227","9d8637e5adebaca208f21af0a254e80712988867411be560031f4b7a23cc04f6","9dfd29090b50334ae229e4a7e812cfb9f6204a66dde563e215d8f52e884cb103","9e77badd0923fd79ca9761a41780ee4dd4f9ca9b62512f4fb59c7f8418494da0","9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047","9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab","9ed400941ed49b2d90ebe3cc111d90d8bc966608ca61fe9bc315a3c1dbe8bc1b","9fb8c5aa087d38dab064a2d6054826377eea3dda98229725c2523f63a87e4750","a0ff0d0bb3a3c801b637d091293f2eeaac68e934274e4116d298ba60ec3461cc","a1baa1f699fd4ce19e8ef6cdfe346e1b0be63e16d5c5cd5feddcccb16a62f269","a2aec2d2f35d7174801247141d637e77c4f34e478c575b0e0a04c6251efaf993","a3c84d76be9d891812e795dd46470c2978dceeff928d729c0d5dd6def599923b","a3d6708506fb5c28f45f0d610bedba11b1ec7bcdb363ffff3aa4cddfa515f56a","a476183540f2e7121e533bf2dd9125dc071c81acc880e88cb435cad7a6d35b97","a4a8cca930cdfd15285ac3a7aa757d61501fb77fc12a7c3fbd78c096b279cf63","a50654761d6812cd811df02199e1b7b25c9b0d65e591f65430f9277ec43d9c50","a514a8c0898b6697696ca6f0ed9a43bf8993085b2db4299e3e9f8e3419c4a5ee","a644885c31f390b5e6b7fe2fc8d086d9144699295ccb6ffa51b3f7c76c8ca71a","a64e8aee389ae696d0d4b045c0153092113fa522ed5a0fd9b5658b8418db4ded","a6c531ed9bbafabfdd649f3030daf2f24461163aaf99dc73bb24dddb77bbcb90","a70d82083944311ccf98b6aa8da5adebc93c655759eaaf8d79624bb3d322abcb","a7ff7302e668dcea1cd1db2241ff95c0d73534539bd03fdefebbfb57f60d3849","a8b4a33078335d2811bffb78eee49aab5fcb31597dae366d43e20c7f7800994b","a91a47fb4fa5c1b1a834fa602030e435ad641240e6ceeb99eeeab7341ca09dec","a91c8a1431a4120667cd523cf56bac004794fc5b8b24275ad2f9c8a15c75fba1","a986593807953215f834ba73e7d2565659b32aa849986013f8614bb1c61ea8cf","aa131e74e695292adab9f57b3ccc5a503a836dd4b95a3b2b107c69f35dba3637","aa4103342641899dc00c22207c13ac31c0c73afd97771b0a9b249187d979625d","aa70263d079788757f176da269e554fef9240845706f87a93101591f8114e807","acae1db4aeb323f3b637fa11b087c3827a2fb6d69718362f54e3bc48f70ef7d8","acd7884bca46ea9422503cead985691da05cca25bd5ed52a199783cae7b8b01f","ad0e6d78c1e450e19bfca4a0e904644ab0ae315607811a28ac3dba20de869786","ae43a4d252290ec0e18c64dd58d51bc885020b2473e71e3ed0741184c9f006b7","ae69fe306bf5db346ddfa4367cda24c95e44213baca27b0ee7d7167bcdd85af6","ae8c200dbcea29f43b29974cc247d70647c80d5d76385396f1c82ee9f669e2f1","aec13a075b84253397fb97e1c93a23e1aaee6d6bff2a9161bfd00a5b1d7611de","af12215a96963c1e7e5d766ed994695e423e4780ed0b3007aed87b150d090c05","af6b60ae365a6cbeb140430b030bdb667f53a2a97508ae92dfc9ed91ca73b54a","b09355a97e3aef396f681943b37a404a98fccc6bcb97781eddb2fc000d1d985d","b0ecfca0d114bae34ffa62ac3ea05159a4415fc6eb73ab1fcc4d79f657268f19","b25c41f19ba40e646fd9b6f82051ee4c38985539e445b26bd628eae98537df53","b262187aa66e8a97083bf7f79b91595bf7a4077abe7f8be5b00b4998f4579d20","b3f50ed7eac0e9c54b74c4f4e02297dd2d2465ce4b699bcc15cfddf54c0f0f81","b4091f93c3d96e36b0708f5dcd46e0e7a0a48f098036ccef6164e4a6429ed94c","b4093c67a9195ee7d28d2575e967ac80057b92339489c244243c7c504c669ff0","b44352445272089cf90967d4d413cf7009bed0ac19f3fa95cb831d5ebad081c3","b4ce73bea5219f1b27bffb36c6a9dee14447a710a8938db807770083db4552ac","b4f2140fb766faf0065a563ac3664f395b24c81dab0d0d0d01df47b22e888d29","b5102ef50e7d4ed1925af5a8b45192e737df02fafb75d7065995a2bb93d2e8e1","b5428b5775526a00645566822530fb969b82247ba83f2c80c06d34151e1f9061","b5c085be21651d8579e52cd3ffe4abe6b7f45c5a9ee84d38c47b4734409918d8","b6cf3b02f36e0efa93b04667cdc5701340033a09e41a7196277cf6756999a666","b77c6669bcd54e0fa949faf2f7205f2631acfbc1ccf79f93f8dab5c5717f0e93","b7fda8f4bf81f8213d18e3c314df5100ccb6b8db7aed6b70aaf202deb606a14f","b7ffd6cddb12384224772e8de79aec89d8f4bca966a3c2a05763889f92a6db5c","b83b7229045affbb98f8fc46f289ad05e6626ef52e3ed2f7e70d332a54a69e2a","b83f5334b85422ac110a24286d5af7003f2fb5b0d783efe257b38a2281656422","b8abe10a2a92bf537a49e8dee92baf8de3ed591848a1b25151dab0d7ab3134e5","b8b8c5cad182083f45ce2d05d036e6bfe91cde1fb63f2e5a97c683bb7ef7ea0f","b96cea09313d481dfff1ed1a2c552ea29e8fe68f52139458996a4e36157748d2","b96f9beb6d6d8fbf88c4b8b2b807a362f2640479cab6173cf64c7710817785a0","b9ad2510d8249ec4c8e7fd8b2471727aa1bd0ce8f3dde78e545fb2f8f2985a1d","ba5c707cf9be40fe966c08807779994e20ca3f30ea9d73e26ce31ca334c05640","ba7d7464da8e13722232c8f86273774054693681becc450a68aea21a5a0e9b91","ba87e5d43ddb10937bb17941f055f80a223d0981fbba44107aeec8530e3a7774","bac3431138e986d6426c1e81bdfe0a968394896c0751cbbcc8f36002fd0ed069","bad8f17b1d399ea125c524895571601c90b6c93418c248bd4ebcc7886bae9878","bb230236c4ab6353afb4147014c93204d3d1eb8a6d18558075df5fe79ed7f392","bb7fa81e41820d63d58313460f5a3999a1f9fc2cd2fb10cbb5b41a931d8be6a2","bcbef69f1ba50e45f3faf1b4529c32cdcf1e5a6612b5bcbc6aa6790ee14b54eb","bd3bf6053f4d423ff21f7ffbed9d0e68f3ea64b7292c048e9a37ade342bb7b39","bd714f38c881208f1190ad714bf8fa5aa63adf302bdaa8ad8810ff279e43459e","be75cc1ee935f783be39978de91ae196c16141d4096e16eb6d07f59583296b4b","be8c3cb2d8d67e63c8b069920b74c6272922febbc6a0a2c4a0072a7a213681d2","beed0f36d9b1b9a20bfbf89c96862482b8d5b9d4284bc89539efe9c9b11f000d","bfd21b5c8eb26e9d475868bb30d66ee08f20876e9df5cd06aa8fec01ffe666df","bfe97e65f2cbe6bcd0f14ff57ea4dc1dedb2e5f0db92d04d0982cf1932ac1c3e","c055d3cfd85b2ed4607b0d9d3a15ab7204c9f149599f748347dca4afe102af0c","c112d36ba38c362da1c022945db5b6bbdc3014685ca9bb7d940f5086f00a675c","c23a43ed460117f663cec698412729fd91b5aaceb48cc4e55a785b525661bf1a","c23cf45c1dcb748145d87f5c173dd3c8becaf9e3f6fdcb3e2ca91d6726b0842a","c24546a064b9315172ce0f951bd5fa2cd1b9884231cf1bdc1dc714771f1b3886","c29b8d250a7b5e73f4ef675329da2251b8de032501e4836445b6aafd90c645fa","c2e96d98c8ebc10237a2af1c224f626acfb9072c83078f4a8c6d9ef0a58b4a8e","c329c9df0dae8a036da9be440432d045be3ee13cf5664cfa6ccf11576ed11acb","c4600cd5358b5798a075beb54539d952f200def1c9a573bd237c795fd33ba36f","c4ebd58c4ff78c9fc0cd17d80ed563520f7908f9d1106735ca0f5a7abed202a6","c5db39bbdc8c2bd2aa7b58c28c3df9e407955cc3250ce7825c842cc4c30eaca3","c65325f807190f7084346376e2f48fc2b6bb946004a1fac1d8d117930e93d462","c6752cc3c7ad06d1e9f127365f078919ac46b77f8a8fe413650094d914838ec3","c6867ec30530fd3feca89a4e968522f783b636b165ef74f288c42dd50bd51a3d","c6bfbb004af355e96ed5b4c8c9b8b7a96d1c08d24bcde7c666728eb9497d6d71","c77c4d3f536cda10a71fe6a9cd17ea7c1408200e2f7aa7c5325d6915ff250c85","c82f38f23e7ed3e1024661b7a22ff694e88d3b268240e2bfc98e630df8a062d0","c8bd340e6fc7fa3e97415f7ad4c22c51d88c6e77f782c12923e841c04d3f882b","c93cd4cb5cf38fe6221fa8ae171ff54240b5f99ba80cd740ffac69c57e5fa381","ca50b525d7aa7762c56f402696dd464841daf19b036bb932e325090004b4cd71","cad13b6653fd9f811e67d13c5f01f9dec047f8c384097cee01dd2e2db39e539f","cc24c3770587f2421514fa399d2617201752bdca145ac39058de91d45d3d19c1","cd2da00f6f1bad8fb7c1b87cff80e122eb017e44a471cdea769efc67db369038","cdbb7338988f2fd35fd92f21909b7801d9954d1c7ca78401f52c9313f21fb6dc","ce887fb65b6977a2046e7583d704863624e55909ebcc9c3ed065b3d13079a410","cf9223c369b6fb7baa52f301f904352ba8e8d5e4c2a06f70de6ef1cf76fe1b84","cfb9705939742247da0cb71fdfd8b5f7a1bef6f1c2f0979a8f42e54c4a480980","cfc3b5044af37ae7485fba8067dcb22b2438bdaa6e3a30c22ce0f9e2c00aa597","d0481d9b6111ab4afba0462e88970b863284807ff44ca97364c84952e3f88583","d0973a1aca6a118375b466d6e91821f8450110fdf042ac848ee16912012d2b0f","d0df3068db679e24d9487ee09a6462ac5cf3df30f46ee466b66feb6dd5ff71e2","d151ffa66d8d096e0272f0dfff6c27e978cfda570f7498a727593081888b4ebe","d227e0a73e3c5452bc5ab41ea2c695dfc0ff9b0c1c81e59ab3173f796a4157cf","d268e680ee1136a239a40ebf005b30db6f3b52a228016f3193496f86250f15c3","d2989a1607fd5303615937b8c117d127b1b1cde519662ab1e1324390220e8612","d2cba4dbbfe3d026f825a8b470a2f6011f9b8e245cf042ae8889afbb17dac6b2","d2e4c515093f8a2aa824c8b542a016e5c321065f4525931b2fac4f8af2fe52c6","d2e82db1f6e479001e15c9890732b5049f8c900c568d5e3d15707a95a7dc3610","d31e8aa21d1498f2d4a07c4cc89ea6f5a6d3ce54d334dbff230e0f55db35c85e","d36034e2f9cc642d0f9f24cf834fa741bac5b8b139cbd2f50e2065161c9f3cb0","d36eb7456d2a42d1cffa4b60708e2bd3116f7f6758c96bbc0fee0f1704ad8a79","d37de74aadd5916eeae243decf347821c4e946356b9f70471658638ac3092f91","d3cf9b1433fd9a083c60baf6ade1df7f2a33e0cc7d519f491f9d6a93139a41e4","d49d02cad8bbfeac607457b08aac6068916ef45d8f6c980279d6e654407cc7be","d4f51c31a454d9abac29457cbbc21e1b5767c0eac1b37c41ee787a3efb05c80f","d52ca358246f638d0e11a061e97863697df44f43b093d6e8b84ba67b5838f2fb","d555a0d2329caace197c1468fe6708349125762377ee3bd04b031b7eacfc26aa","d581443d0b6b42c76b816edc6946ce01a639ae42653ddc8cc2d6a89ce14fe947","d5adedc08fa25bd06734afd1db3510dbc53ba0dfdac20cf601fde0c77702a72a","d5c084e12da4a5111487c166b879042a21a056f761ee22d9237cb4f65f366341","d6077d547aa21ea10a9bdf6c752b8d1a0a6382b4b43a0fdf790f245e66a609fc","d67e8c1aaab1ce6ec1755599ecde153c47c6b90dd4c301663abe9057bc31af57","d67ec5caeb2af5f9c57533a34cbde7daba5f5b2e5e6ce34c3250893eef25f13c","d6abcc1484c3df45bde915abf48324af1e995c3266a3c6c069e98e94c8d9a4d7","d7a44c85c25ceb7d42280f0c2576de52a3b3cc3ad2333e788ecdc7f7f7fe4b3b","d7f5db16fd3b6ddd5acdf655e090ed0e84cb89d9eafbe1ea92b273b71a38f173","d84489933b19a8b073c65a0386e39e5067830facdc365ced6efe1948c7201771","d8c8b3c52c89cd715a7fdd2759a6f73c3a5f505303b110656cc35f7549a37cfb","d8ca8e025e226ad6bdd32a6a9fceae2982b0413a0ad09314558b54bdc724bf99","d8d03142030c11a0aa1012102fce2b202baf88e424a1236832937e87450dc579","d9823dfddf6c507ec030fce4bd2d98fbda18e595c2ebc563574d9196cc7a5e33","d9b0972f3406075b860ba7cd2e71d4492c826960319b10389c2c2820e2981254","da37a61fab07ec8856b725854e4064f55a59149aa69cad1bcbf89ec478b9f578","daa0fc9f9dd08cb2dc48bf33c9808cfeebff77cb9fba48f98ef597bb9dd6df55","dad01e5bfb13a6c4419f4d24fa8dbb424e93a1c4be656b0e5dd48ac546e0a0d9","db049e7abb7c75b608ae25cc8a9f95959f7aedaa53e22390290319cc2eed3977","db21a75b4fa6165f75268963474f3262124795d816ba80f685bab2c6eaedb028","db66a999537b941fa6d512908894ba86e8dadd0e14b290ebc119555b7e60264c","dc8c31e3075adeb63113852569b83dcd432485621eb77fef62cf3cce5c84a214","dd97ab52fd89f42352c595ce137684cc519c473fa17969e8a6adcde7322a4748","dda0a34d6704887eb36bbc0173334b49d755cac8cea3bbd17bfa972f04183dd4","ddbda9408727a19a4a55d516bed99331edf67d8301de9c78564716465c949619","de0f295bd0e46f29db1167d6c21bda624887c8543545d0c37d662e5b1b312341","de9a46da1f4605525b484a228f8bf356a9d900ecd16473faf77944b22575c141","e0288c94ca9c16a6de217e6baeed720fcf83e401bec45bd15ca47ba8fc9b44dd","e1667469384ec775a3df665679cb3fef057dc84dcb18ed8db8b9c5723835968a","e16c328504278cfe520d6d99990f2a4370cc48159aba86694d0f7598fd4b0611","e24df071f5325bb3a5b20f355143556bc7712535ee8b6ce4c426598f06fd2448","e28d8e6b71264d0bfab853e63178f2c151367cce0dbd16125596ff3604b6658d","e2c734504d211580b4e6674eb1c7d31fb6fb730c037210c34c980a96f9098269","e39ee882667ef28feb4971b73f9a01d3d72c557e1e56d59487af8e0f1b21edbd","e3f19c383354cdf45311f92f00b90fed25dfba7e9892ab2f5f3aa4885876b75f","e409fbfe439455330c0fe003de860e30f7093cc3cc83a32f886c9b539a29f60b","e519e78acf2938460c7ee053981c744dafc7642fd03b56a117d5fec78d258b90","e5db07b7fb0eed216d838fbeb9491257cf54f9bd537a68c8edae7a89fe64c8d8","e61705ac769699a40c52e332cd890187ca9301fc6e64393c8c9064144ccc2dbf","e6300ee8e6c2c4ce6d7ab02b7b06fd1cabe3c5c52b99a6ea3ea8b5acd5092e0b","e65e28b172b77d093f5425112bdae7ab93756487226fd7363057f85bb2a2556d","e734d068446591aba283d136c21b4fb0209f91352cb4fc6589bd651cdbfec163","e7556cd0bdd06760602ef78c5e3b30b4dbe175f96b7147b56ee2ec181a4c5ea3","e7a333109a7aaec2b71048868500c15e721900628eb48790dfeaa1fd4c2dabc3","e7c9175fbfd9fd84bed95d552bc0a439b07a233c3e91fb39ae2f23197ee53f1b","e7ed299ecf44d4a96c228e9aa30312f405df34d6bea99d4b0f7074c79705a671","e8bc1b4f162c4066d74e5d1b3dcbe344742279b6856736c2e1690dbaa7bcf932","e981ced1bfce64a19fa8de1cd518a93f4669d01548f4819d0e1dbb50d266fe04","ea1b8a251ecc1fd96697d0c602d3e14ec46383d27bb9485a0326cea5576ffacb","ea311dca2ef14e02b9aae563bb28dc737b04b7f01c1ceb2be3d92007d2c74ac6","ea8e5b79bbe5329ae8437677c8316f2f9fd75bb1d40c88308c269140a7e564c7","eaeec7c06d1408fa6db5d7ada0a232b1633ffdf0ac815033c29c159352347c81","eb708890ac7e19bd53007ccece064f7e2a069a3751270b4fdafdd1668136dee7","eb996138bc91c0ee63bafe1ba10b130ff5a2fc82aa4918296222e0a831a569fe","eba6e8e5a12a86f17fade41bef365aa95491c469e18aa91aef64908a4263c905","ebcf0bdb3541c8bfb7c9a53f632329b77341cba6f1a2fa0dc9704acfa3276dca","ebd87e3505f3a1adff0c86ffec6c380734df718301b216b7ee089c174130de60","ecd5e83ba8c8eba6cef9c3da1edb8a84e3dfb4ed71d9a2c1908f2c4d26b26737","edc160a11c07dda8072748b66db7f27b6cd8efbd1faa3f6c826a0fe445859c17","edfcbe4773eac1fe2964179a4ad21294efede89568f2efd8e283ac18bc5693b1","f0e1db9b86e2132f004ebf06819eb55804f766bc03ea5d80f487d5d98bad8892","f0f90dee84db760cc1bb0f6e6983d4de0e3d5d9f4adf7b2b52f0d3dbe6d585a4","f1297fd9ecf981024e1544f7f048705377b53219240274bb803ac30e4a52084f","f1d4a6e98f41ab3f6cfd67cddeab9d0ed287b92cb3dbe575e3ce61925510a792","f21c3a9267110e469f224ac7eb76ca5bb084fc90df014f1ca6791d5770483944","f260b4b268e85a8f1b04b2fc69ffc0bca473d2e42de6f2f70128bedc16558201","f379a1b9e29aa7fc25c4c0c897eaa3c0e90d66a201a0ade8cbf523a5cdc8cf50","f3e04891c79b604f9235f438adfa49ee27db43d25c7be0d1cc06ae53b8f6d2d8","f46904e701174fe2850798d9e1b077bdac42fcac01dbc385298da01118c82aa6","f4de28905adbfe6ae4bc38f8bf5f47a444aa8d0f2023faaa431d6f72f9a3edea","f53265f53af0b0856911ab08b373736964d0c443e8ba61d7f1d45f5e5b04edf3","f5403593ba12130c04827f88d019103e924651caa518b7c290673a02f7cb409f","f5681dfc71121ed0f88146a19479675f2fabc6ed376fd5d162e50d815c048d66","f686173d310f41e26e3fe8a7c1dbf4313e4d793323335348badbcf4633f5d699","f6f5046c1263095a69e774716b0cd0907f6795af8ad683c5f41846d4c54a3449","f700bd87d4a758bb71f47731121a9b2259a9ffbd50b584b82f4e6a1f205c276a","f704c9c9e2cab1ed44578f48d161320b5fb4384ecdd8b40a5e22c4078a8594da","f7993302f695430a0ee938b1b3684fdfec4055bddb378b52c81785c0319e8c98","f89156489d35f9992d5971a52a6e03a7d7f095e15c2c782e85efb1408a2bd6be","f99ef6fa3c9c6bf572ec69eb6eeea9f88ce6590d3a5565bec62b001b6f2a376a","fa2dfc22b4fdbcf402a822e8dd376925655d997a0f96284a60f10665ba3581ba","fa3df5f8349aec4805bbcd279b88697def63f2462d8ada0b5fe1d9983d9a6daa","fa6b97cbca1d4f09662e706293b0aec1eb76b8e2277441f54ab6c548b5423236","faac0c3fa7cdf67b452d407e9a1db5cbe1e9140ecfe300200b0b0a6279c97c66","facb45d3084caa490d9b0ac2bcfcee89629a4c3db5926ec9256a9d27d25559ee","fbc8b53b5c6f3727c084e5e0429e410a3fed5a17e1a0144692fd196d9836a4bb","fbd74e4b8dc748b2efdd70aaab07adb80d7f15a38c1261de85bdfd9591ff106a","fc475f9c2d8bee2ffea435e86e6b39b6e3e071143a4a1fdf6765b0da13b66de6","fd04d7588bb9e6ca0a8b65ed0c9635082a9ee5f46b2d1b5b25866a072236c1fc","fd60f2a432086c6fc4a4c39d8d2d6edf5794c763c05a6401db2bb5fa2c601775","fd618761103380d690cb98804e8f116b6c66ef049fbf67c1a059ce49188658b3","fdbd44d3c55504edfa1bacb4c9b7a6c102659d4deef0ca91b9b7ac567ea9cfc5","fedf2577267d6dcd060ebc4ee8de6ccdafa60ab26b78d74c1e8c784252fecb17","ff532716738e2fc716c10797d9717f324cca3a1234320a84a73a0b89569f11ab","ffd0fe3449e449c7b9fcdcc7e2c1ffb677e57ad935a252de88a0122d437efa67","ffde5c700732beac27a9b5162213d387422ce199400e56d9cefe550005b6a542"],"schema":"fsgg.atlas/1"} diff --git a/docs/atlas/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json b/docs/atlas/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json new file mode 100644 index 000000000..4768e10f9 --- /dev/null +++ b/docs/atlas/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json @@ -0,0 +1 @@ +{"citations":[{"path":"docs/adr/0068-the-engine-tool-manifest-leaves-kit-ownership.md","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"2882230e95cc744000cb70511b78f56fb3edb7dbb2f72b0ba351c9832f8c5bef"},{"path":"registry/repos.yml","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"1f40996af5064bc42bf17b3df1a7661c44d5829c0602f24282b6c8ac83830f5c"},{"path":"scripts/sync-build-config.sh","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"2b5547bee1e67a112a8fae85b2f5ae0db5acd7ce6e4715bda056a256d8730cad"},{"path":"src/FS.GG.Kit/stage-kit.sh","repository":"FS-GG/.github","revision":"5f490e02f1784055d9b50b0ada93105594be8b55","sha256":"cdd6963c7a38ccf9dbf88b8c542fa749566a57a22f190e74f446895c9254412c"}],"conflictsWith":[],"id":"build/shared-tool-manifest-is-receiver-owned","kind":"boundary","recordedAt":"2026-11-02T15:25:44Z","repository":"FS-GG/.github","schema":"fsgg.atlas/1","status":"recorded","summary":"ADR-0068 removed dist/dotnet/.config/dotnet-tools.json from the Kit roster. The file remains .github's canonical local tool manifest, including the engine-pin-coherence subject, while each receiver owns its own manifest. The current registry has no kit config row for this file; stage-kit derives the config roster from that registry and derives build-config files from sync-build-config.sh FILES, which contains only Directory.Build.props and Directory.Packages.props. Therefore changing FAKE or Fantomas in this manifest updates the shared source baseline but does not deliver those tool versions through Kit materialization or establish installed adoption. Refresh the real receiver manifest and tool runtime when accepting each consumer. Some older build documentation and script comments still describe prior manifest delivery; the accepted ADR and derived roster define this boundary. This record grants no publication or receiver mutation.","supersedes":[],"tags":["dotnet-tools","fake","fantomas","kit","dependency","receiver"],"title":"The shared tool manifest is not distributed by the Kit package"} diff --git a/docs/build/README.md b/docs/build/README.md index 0e866d8b3..c75a2da7c 100644 --- a/docs/build/README.md +++ b/docs/build/README.md @@ -1,7 +1,7 @@ # Org-shared .NET build configuration -The canonical MSBuild / CPM / tool-manifest baseline for every FS-GG .NET repo. The source of -truth is [`dist/dotnet/`](../../dist/dotnet/) in this repo; consumer repos **materialize** the files +The canonical MSBuild / CPM baseline for FS-GG .NET build-config receivers. The source of +truth is [`dist/dotnet/`](../../dist/dotnet/) in this repo; consumer repos **materialize** the two `.props` files from the versioned **FS.GG.Kit** package ([ADR-0062](../adr/0062-versioned-kit-package-replaces-byte-copy-sync.md), #1262) rather than hand-copying or the retired byte-copy sync. Decision record: [ADR-0006](../adr/0006-org-shared-dotnet-build-config-and-unified-restore-locked-mode-gate.md). Contracts: `shared-build-config` + `lockfile-restore-enforcement` @@ -13,9 +13,12 @@ Contracts: `shared-build-config` + `lockfile-restore-enforcement` |---|---| | `Directory.Build.props` | Deterministic builds; Central Package Management (CPM) + transitive pinning; the `lockfile-restore-enforcement` gate; `NU1603`/`NU1608`→error; the opt-in `api-breaking-change-gate`. | | `Directory.Packages.props` | CPM enablement + the org-wide `FSharp.Core` pin + the centrally pinned `PublicApiAnalyzers` for the gate. Read the [canonical declarations](../../dist/dotnet/Directory.Packages.props) for current versions. | -| `.config/dotnet-tools.json` | Pinned local tool manifest (`fake-cli` `6.1.4`, matching the `Fake.Core.*` library pin). | | ~~`.config/fsgg-build-config.sha`~~ | **RETIRED** (ADR-0062, #1262). The ADR-0036 provenance pin was the baseline the *byte-copy* drift check judged against; under package delivery the pin is unmanaged, so it was deleted from every receiver and the check now measures against the pinned `FS.GG.Kit` instead — see below. | +The [local tool manifest](../../dist/dotnet/.config/dotnet-tools.json) remains this repository's +canonical tool baseline. It is excluded from the Kit package; each receiver owns and updates its +own manifest ([ADR-0068](../adr/0068-the-engine-tool-manifest-leaves-kit-ownership.md)). + ## The unified `RestoreLockedMode` gate ```xml diff --git a/registry/driver-skill-manifest.json b/registry/driver-skill-manifest.json index 38063ae6e..de9cec731 100644 --- a/registry/driver-skill-manifest.json +++ b/registry/driver-skill-manifest.json @@ -5,7 +5,7 @@ "id": "atlas", "scope": "driver", "sha256": "a1383a9a8029f91930798e7624f5de87db68b0b6f575ea4d899761449e9fa423", - "tree-sha256": "08a7d1340197fff859824007138a159f1c1c27bece814a46f6e1d2504242bd1a", + "tree-sha256": "680fc52d22878322dbc5d9c9ea8595b4519c8c97eda82926b9cc9372b6d5bbac", "files": [ { "path": "SKILL.md", @@ -24,7 +24,7 @@ }, { "path": "assets/seed/catalog.json", - "sha256": "aa91242856da94a8022182c3ceab998190b3f9ec31ad1b9e2c03dbf8be3f68b5", + "sha256": "d89e085b2c53bb01597b1cb1e409ede0df5ba4b6aa8942f218e81c849ce3ef39", "executable": false }, { @@ -1587,6 +1587,11 @@ "sha256": "9e77badd0923fd79ca9761a41780ee4dd4f9ca9b62512f4fb59c7f8418494da0", "executable": false }, + { + "path": "assets/seed/records/9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047.json", + "sha256": "9e9edbe6c5c90ef3aa89a71fd1ec54069818d2ff48ce0f35019b811add042047", + "executable": false + }, { "path": "assets/seed/records/9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab.json", "sha256": "9eb67ea41c5bcb9557ba51bbbd1b321a78f16335cadebbed848d8e6c1fc68bab", diff --git a/scripts/NewSddWorkspace/packages.lock.json b/scripts/NewSddWorkspace/packages.lock.json index 8ba839c5d..1ec4d35af 100644 --- a/scripts/NewSddWorkspace/packages.lock.json +++ b/scripts/NewSddWorkspace/packages.lock.json @@ -19,10 +19,10 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "2aL9eL5HQr0V4b8V909SD+jQAx6qnTTl7sT/v3D8dIvmr2UGdpZIQxqm1pj2Js3e4EYTvpw0oMH7DjapJJuPPw==", + "resolved": "10.0.14", + "contentHash": "1p9rO3Q2X/L/9YrYog3vaDzi8u+WZfJCOkDYoHqmofqYP0DLPLPyZcS2Rnh/79JXAodgbs1AgsaNwLpIvC3Xew==", "dependencies": { - "SQLitePCLRaw.core": "2.1.12" + "SQLitePCLRaw.core": "2.1.13" } }, "Spectre.Console.Ansi": { @@ -136,19 +136,19 @@ "dependencies": { "FS.GG.Coord.Core": "[1.0.0, )", "FSharp.Core": "[10.1.403, )", - "Microsoft.Data.Sqlite": "[10.0.12, )", + "Microsoft.Data.Sqlite": "[10.0.14, )", "SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )" } }, "Microsoft.Data.Sqlite": { "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.12", - "contentHash": "xUq9xUc653ue7ac2rMfCaf8UQN+U3zS8poWYlugycpvJllplMM0Mk7v/+MM0CTlu9zGvbGML4BPH8YWhrUOfGw==", + "requested": "[10.0.14, )", + "resolved": "10.0.14", + "contentHash": "muyroan6rKrf0omZL8UF7Kw5uOGp/yBg1L/XWvkFN3WhKaNtK2IWqRZw93nIwVqjhTVDO0l4CEGhHIh+mb+sKg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "10.0.12", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12", - "SQLitePCLRaw.core": "2.1.12" + "Microsoft.Data.Sqlite.Core": "10.0.14", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.13", + "SQLitePCLRaw.core": "2.1.13" } }, "SQLitePCLRaw.bundle_e_sqlite3": { diff --git a/src/FS.GG.Coord.Cli/packages.lock.json b/src/FS.GG.Coord.Cli/packages.lock.json index 1fa23cf16..4671f2b84 100644 --- a/src/FS.GG.Coord.Cli/packages.lock.json +++ b/src/FS.GG.Coord.Cli/packages.lock.json @@ -16,10 +16,10 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "2aL9eL5HQr0V4b8V909SD+jQAx6qnTTl7sT/v3D8dIvmr2UGdpZIQxqm1pj2Js3e4EYTvpw0oMH7DjapJJuPPw==", + "resolved": "10.0.14", + "contentHash": "1p9rO3Q2X/L/9YrYog3vaDzi8u+WZfJCOkDYoHqmofqYP0DLPLPyZcS2Rnh/79JXAodgbs1AgsaNwLpIvC3Xew==", "dependencies": { - "SQLitePCLRaw.core": "2.1.12" + "SQLitePCLRaw.core": "2.1.13" } }, "SQLite": { @@ -113,19 +113,19 @@ "dependencies": { "FS.GG.Coord.Core": "[1.0.0, )", "FSharp.Core": "[10.1.403, )", - "Microsoft.Data.Sqlite": "[10.0.12, )", + "Microsoft.Data.Sqlite": "[10.0.14, )", "SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )" } }, "Microsoft.Data.Sqlite": { "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.12", - "contentHash": "xUq9xUc653ue7ac2rMfCaf8UQN+U3zS8poWYlugycpvJllplMM0Mk7v/+MM0CTlu9zGvbGML4BPH8YWhrUOfGw==", + "requested": "[10.0.14, )", + "resolved": "10.0.14", + "contentHash": "muyroan6rKrf0omZL8UF7Kw5uOGp/yBg1L/XWvkFN3WhKaNtK2IWqRZw93nIwVqjhTVDO0l4CEGhHIh+mb+sKg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "10.0.12", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12", - "SQLitePCLRaw.core": "2.1.12" + "Microsoft.Data.Sqlite.Core": "10.0.14", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.13", + "SQLitePCLRaw.core": "2.1.13" } }, "SQLitePCLRaw.bundle_e_sqlite3": { diff --git a/src/FS.GG.Telemetry.Host/packages.lock.json b/src/FS.GG.Telemetry.Host/packages.lock.json index c786783dd..4e3aaee6d 100644 --- a/src/FS.GG.Telemetry.Host/packages.lock.json +++ b/src/FS.GG.Telemetry.Host/packages.lock.json @@ -4,9 +4,9 @@ "net10.0": { "Akka": { "type": "Direct", - "requested": "[1.5.71, )", - "resolved": "1.5.71", - "contentHash": "HMeKCZeOYzv5sqRq0mNPFqaV3QAn3XbiwCMJbkFbqjT4TouuKPX6OPfv6TG55M8mXic8u330S9zwCtIaeJFzqQ==", + "requested": "[1.5.73, )", + "resolved": "1.5.73", + "contentHash": "llceOuVtuaVF11csQAVkAvJ9SLzDDgTrnqxt6sLQ4GMrzbVPl3VtwjMZt3swHJdHq+pNLUZ+TK6M5E28XFSrrw==", "dependencies": { "Akka.Analyzers": "0.3.3", "Newtonsoft.Json": "13.0.1", @@ -15,12 +15,12 @@ }, "Akka.FSharp": { "type": "Direct", - "requested": "[1.5.71, )", - "resolved": "1.5.71", - "contentHash": "/X4H8BBLvedRJ+VODRzJOUhgRE99eNs6CVlM2az60zXEnqXe6+8louJZuVYsmmJyXs4+4IvmTEwpvnTJCUE+AA==", + "requested": "[1.5.73, )", + "resolved": "1.5.73", + "contentHash": "xRWT+8ycXWB2qrrwMb7QLaviA19fBhDtmBl2rlCUUfj+JcwshHykT1uUO3V+nLf22sCGhtX9BmQgrrgWVYc3AQ==", "dependencies": { - "Akka": "1.5.71", - "FSharp.Core": "10.0.111", + "Akka": "1.5.73", + "FSharp.Core": "10.0.112", "FSharp.Quotations.Evaluator": "2.1.0", "FsPickler": "5.3.2" } @@ -54,10 +54,10 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "2aL9eL5HQr0V4b8V909SD+jQAx6qnTTl7sT/v3D8dIvmr2UGdpZIQxqm1pj2Js3e4EYTvpw0oMH7DjapJJuPPw==", + "resolved": "10.0.14", + "contentHash": "1p9rO3Q2X/L/9YrYog3vaDzi8u+WZfJCOkDYoHqmofqYP0DLPLPyZcS2Rnh/79JXAodgbs1AgsaNwLpIvC3Xew==", "dependencies": { - "SQLitePCLRaw.core": "2.1.12" + "SQLitePCLRaw.core": "2.1.13" } }, "Microsoft.Win32.SystemEvents": { @@ -172,19 +172,19 @@ "dependencies": { "FS.GG.Coord.Core": "[1.0.0, )", "FSharp.Core": "[10.1.403, )", - "Microsoft.Data.Sqlite": "[10.0.12, )", + "Microsoft.Data.Sqlite": "[10.0.14, )", "SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )" } }, "Microsoft.Data.Sqlite": { "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.12", - "contentHash": "xUq9xUc653ue7ac2rMfCaf8UQN+U3zS8poWYlugycpvJllplMM0Mk7v/+MM0CTlu9zGvbGML4BPH8YWhrUOfGw==", + "requested": "[10.0.14, )", + "resolved": "10.0.14", + "contentHash": "muyroan6rKrf0omZL8UF7Kw5uOGp/yBg1L/XWvkFN3WhKaNtK2IWqRZw93nIwVqjhTVDO0l4CEGhHIh+mb+sKg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "10.0.12", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12", - "SQLitePCLRaw.core": "2.1.12" + "Microsoft.Data.Sqlite.Core": "10.0.14", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.13", + "SQLitePCLRaw.core": "2.1.13" } }, "SQLitePCLRaw.bundle_e_sqlite3": { diff --git a/src/FS.GG.Telemetry.Store/packages.lock.json b/src/FS.GG.Telemetry.Store/packages.lock.json index 5400a98cc..8509a17db 100644 --- a/src/FS.GG.Telemetry.Store/packages.lock.json +++ b/src/FS.GG.Telemetry.Store/packages.lock.json @@ -10,13 +10,13 @@ }, "Microsoft.Data.Sqlite": { "type": "Direct", - "requested": "[10.0.12, )", - "resolved": "10.0.12", - "contentHash": "xUq9xUc653ue7ac2rMfCaf8UQN+U3zS8poWYlugycpvJllplMM0Mk7v/+MM0CTlu9zGvbGML4BPH8YWhrUOfGw==", + "requested": "[10.0.14, )", + "resolved": "10.0.14", + "contentHash": "muyroan6rKrf0omZL8UF7Kw5uOGp/yBg1L/XWvkFN3WhKaNtK2IWqRZw93nIwVqjhTVDO0l4CEGhHIh+mb+sKg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "10.0.12", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12", - "SQLitePCLRaw.core": "2.1.12" + "Microsoft.Data.Sqlite.Core": "10.0.14", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.13", + "SQLitePCLRaw.core": "2.1.13" } }, "SQLitePCLRaw.bundle_e_sqlite3": { @@ -31,10 +31,10 @@ }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "2aL9eL5HQr0V4b8V909SD+jQAx6qnTTl7sT/v3D8dIvmr2UGdpZIQxqm1pj2Js3e4EYTvpw0oMH7DjapJJuPPw==", + "resolved": "10.0.14", + "contentHash": "1p9rO3Q2X/L/9YrYog3vaDzi8u+WZfJCOkDYoHqmofqYP0DLPLPyZcS2Rnh/79JXAodgbs1AgsaNwLpIvC3Xew==", "dependencies": { - "SQLitePCLRaw.core": "2.1.12" + "SQLitePCLRaw.core": "2.1.13" } }, "SQLite": { diff --git a/tests/FS.GG.Coord.Cli.BoardOps.Tests/packages.lock.json b/tests/FS.GG.Coord.Cli.BoardOps.Tests/packages.lock.json index dd3e59e50..5e5e97909 100644 --- a/tests/FS.GG.Coord.Cli.BoardOps.Tests/packages.lock.json +++ b/tests/FS.GG.Coord.Cli.BoardOps.Tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,34 +31,34 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "2aL9eL5HQr0V4b8V909SD+jQAx6qnTTl7sT/v3D8dIvmr2UGdpZIQxqm1pj2Js3e4EYTvpw0oMH7DjapJJuPPw==", + "resolved": "10.0.14", + "contentHash": "1p9rO3Q2X/L/9YrYog3vaDzi8u+WZfJCOkDYoHqmofqYP0DLPLPyZcS2Rnh/79JXAodgbs1AgsaNwLpIvC3Xew==", "dependencies": { - "SQLitePCLRaw.core": "2.1.12" + "SQLitePCLRaw.core": "2.1.13" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "SQLite": { @@ -207,19 +207,19 @@ "dependencies": { "FS.GG.Coord.Core": "[1.0.0, )", "FSharp.Core": "[10.1.403, )", - "Microsoft.Data.Sqlite": "[10.0.12, )", + "Microsoft.Data.Sqlite": "[10.0.14, )", "SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )" } }, "Microsoft.Data.Sqlite": { "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.12", - "contentHash": "xUq9xUc653ue7ac2rMfCaf8UQN+U3zS8poWYlugycpvJllplMM0Mk7v/+MM0CTlu9zGvbGML4BPH8YWhrUOfGw==", + "requested": "[10.0.14, )", + "resolved": "10.0.14", + "contentHash": "muyroan6rKrf0omZL8UF7Kw5uOGp/yBg1L/XWvkFN3WhKaNtK2IWqRZw93nIwVqjhTVDO0l4CEGhHIh+mb+sKg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "10.0.12", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12", - "SQLitePCLRaw.core": "2.1.12" + "Microsoft.Data.Sqlite.Core": "10.0.14", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.13", + "SQLitePCLRaw.core": "2.1.13" } }, "SQLitePCLRaw.bundle_e_sqlite3": { diff --git a/tests/FS.GG.Coord.Cli.Kernel.Tests/packages.lock.json b/tests/FS.GG.Coord.Cli.Kernel.Tests/packages.lock.json index a7229ae42..9fc6e2fc9 100644 --- a/tests/FS.GG.Coord.Cli.Kernel.Tests/packages.lock.json +++ b/tests/FS.GG.Coord.Cli.Kernel.Tests/packages.lock.json @@ -4,12 +4,12 @@ "net10.0": { "FsCheck.Xunit": { "type": "Direct", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "AkrVSuLzu1KqTFPAJHMOzZf68MgnvGNFIblytfiZpRSAY+SFS7n0GdrhL005gLnUzeWdWs85rO1nx1uzmRSmSQ==", + "requested": "[3.6.0, )", + "resolved": "3.6.0", + "contentHash": "+J9ukJ8v79Fc8RyNWhduzHlSCA85pc8EKZqewru9nE6E3ytaDVdkx9FbjFwDsERNLj4VkQ0zfMTLAAo915FhtQ==", "dependencies": { "FSharp.Core": "5.0.2", - "FsCheck": "[3.4.0]", + "FsCheck": "[3.6.0]", "xunit.extensibility.execution": "[2.4.1, 3.0.0)" } }, @@ -21,12 +21,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -42,34 +42,34 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "FsCheck": { "type": "Transitive", - "resolved": "3.4.0", - "contentHash": "wkWR1DORrKd46W6MEhmS4muo/0kgrtUV/AGW1ohMWemy7WukcRH8T3JjkDpn/daOHk0yVqf0CBvScU17Ab//PA==", + "resolved": "3.6.0", + "contentHash": "XjZ5sWf/QKLqB9aMKG7FvrT/8Ak2fPo0ygRstindBWZWU8P3EcmvYJ5UkX0daIL4+bZeaiD9ThkftGlIx3ZewQ==", "dependencies": { "FSharp.Core": "5.0.2" } }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { diff --git a/tests/FS.GG.Coord.Cli.Lifecycle.Tests/packages.lock.json b/tests/FS.GG.Coord.Cli.Lifecycle.Tests/packages.lock.json index dd3e59e50..5e5e97909 100644 --- a/tests/FS.GG.Coord.Cli.Lifecycle.Tests/packages.lock.json +++ b/tests/FS.GG.Coord.Cli.Lifecycle.Tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,34 +31,34 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "2aL9eL5HQr0V4b8V909SD+jQAx6qnTTl7sT/v3D8dIvmr2UGdpZIQxqm1pj2Js3e4EYTvpw0oMH7DjapJJuPPw==", + "resolved": "10.0.14", + "contentHash": "1p9rO3Q2X/L/9YrYog3vaDzi8u+WZfJCOkDYoHqmofqYP0DLPLPyZcS2Rnh/79JXAodgbs1AgsaNwLpIvC3Xew==", "dependencies": { - "SQLitePCLRaw.core": "2.1.12" + "SQLitePCLRaw.core": "2.1.13" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "SQLite": { @@ -207,19 +207,19 @@ "dependencies": { "FS.GG.Coord.Core": "[1.0.0, )", "FSharp.Core": "[10.1.403, )", - "Microsoft.Data.Sqlite": "[10.0.12, )", + "Microsoft.Data.Sqlite": "[10.0.14, )", "SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )" } }, "Microsoft.Data.Sqlite": { "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.12", - "contentHash": "xUq9xUc653ue7ac2rMfCaf8UQN+U3zS8poWYlugycpvJllplMM0Mk7v/+MM0CTlu9zGvbGML4BPH8YWhrUOfGw==", + "requested": "[10.0.14, )", + "resolved": "10.0.14", + "contentHash": "muyroan6rKrf0omZL8UF7Kw5uOGp/yBg1L/XWvkFN3WhKaNtK2IWqRZw93nIwVqjhTVDO0l4CEGhHIh+mb+sKg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "10.0.12", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12", - "SQLitePCLRaw.core": "2.1.12" + "Microsoft.Data.Sqlite.Core": "10.0.14", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.13", + "SQLitePCLRaw.core": "2.1.13" } }, "SQLitePCLRaw.bundle_e_sqlite3": { diff --git a/tests/FS.GG.Coord.Cli.Tests/packages.lock.json b/tests/FS.GG.Coord.Cli.Tests/packages.lock.json index aa2ead45b..2c8dbcf29 100644 --- a/tests/FS.GG.Coord.Cli.Tests/packages.lock.json +++ b/tests/FS.GG.Coord.Cli.Tests/packages.lock.json @@ -4,12 +4,12 @@ "net10.0": { "FsCheck.Xunit": { "type": "Direct", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "AkrVSuLzu1KqTFPAJHMOzZf68MgnvGNFIblytfiZpRSAY+SFS7n0GdrhL005gLnUzeWdWs85rO1nx1uzmRSmSQ==", + "requested": "[3.6.0, )", + "resolved": "3.6.0", + "contentHash": "+J9ukJ8v79Fc8RyNWhduzHlSCA85pc8EKZqewru9nE6E3ytaDVdkx9FbjFwDsERNLj4VkQ0zfMTLAAo915FhtQ==", "dependencies": { "FSharp.Core": "5.0.2", - "FsCheck": "[3.4.0]", + "FsCheck": "[3.6.0]", "xunit.extensibility.execution": "[2.4.1, 3.0.0)" } }, @@ -21,12 +21,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -42,42 +42,42 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "FsCheck": { "type": "Transitive", - "resolved": "3.4.0", - "contentHash": "wkWR1DORrKd46W6MEhmS4muo/0kgrtUV/AGW1ohMWemy7WukcRH8T3JjkDpn/daOHk0yVqf0CBvScU17Ab//PA==", + "resolved": "3.6.0", + "contentHash": "XjZ5sWf/QKLqB9aMKG7FvrT/8Ak2fPo0ygRstindBWZWU8P3EcmvYJ5UkX0daIL4+bZeaiD9ThkftGlIx3ZewQ==", "dependencies": { "FSharp.Core": "5.0.2" } }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "2aL9eL5HQr0V4b8V909SD+jQAx6qnTTl7sT/v3D8dIvmr2UGdpZIQxqm1pj2Js3e4EYTvpw0oMH7DjapJJuPPw==", + "resolved": "10.0.14", + "contentHash": "1p9rO3Q2X/L/9YrYog3vaDzi8u+WZfJCOkDYoHqmofqYP0DLPLPyZcS2Rnh/79JXAodgbs1AgsaNwLpIvC3Xew==", "dependencies": { - "SQLitePCLRaw.core": "2.1.12" + "SQLitePCLRaw.core": "2.1.13" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "SQLite": { @@ -226,19 +226,19 @@ "dependencies": { "FS.GG.Coord.Core": "[1.0.0, )", "FSharp.Core": "[10.1.403, )", - "Microsoft.Data.Sqlite": "[10.0.12, )", + "Microsoft.Data.Sqlite": "[10.0.14, )", "SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )" } }, "Microsoft.Data.Sqlite": { "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.12", - "contentHash": "xUq9xUc653ue7ac2rMfCaf8UQN+U3zS8poWYlugycpvJllplMM0Mk7v/+MM0CTlu9zGvbGML4BPH8YWhrUOfGw==", + "requested": "[10.0.14, )", + "resolved": "10.0.14", + "contentHash": "muyroan6rKrf0omZL8UF7Kw5uOGp/yBg1L/XWvkFN3WhKaNtK2IWqRZw93nIwVqjhTVDO0l4CEGhHIh+mb+sKg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "10.0.12", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12", - "SQLitePCLRaw.core": "2.1.12" + "Microsoft.Data.Sqlite.Core": "10.0.14", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.13", + "SQLitePCLRaw.core": "2.1.13" } }, "SQLitePCLRaw.bundle_e_sqlite3": { diff --git a/tests/FS.GG.Coord.Core.Tests/packages.lock.json b/tests/FS.GG.Coord.Core.Tests/packages.lock.json index 2a1d86050..1737daf96 100644 --- a/tests/FS.GG.Coord.Core.Tests/packages.lock.json +++ b/tests/FS.GG.Coord.Core.Tests/packages.lock.json @@ -4,12 +4,12 @@ "net10.0": { "FsCheck.Xunit": { "type": "Direct", - "requested": "[3.4.0, )", - "resolved": "3.4.0", - "contentHash": "AkrVSuLzu1KqTFPAJHMOzZf68MgnvGNFIblytfiZpRSAY+SFS7n0GdrhL005gLnUzeWdWs85rO1nx1uzmRSmSQ==", + "requested": "[3.6.0, )", + "resolved": "3.6.0", + "contentHash": "+J9ukJ8v79Fc8RyNWhduzHlSCA85pc8EKZqewru9nE6E3ytaDVdkx9FbjFwDsERNLj4VkQ0zfMTLAAo915FhtQ==", "dependencies": { "FSharp.Core": "5.0.2", - "FsCheck": "[3.4.0]", + "FsCheck": "[3.6.0]", "xunit.extensibility.execution": "[2.4.1, 3.0.0)" } }, @@ -21,12 +21,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -42,34 +42,34 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "FsCheck": { "type": "Transitive", - "resolved": "3.4.0", - "contentHash": "wkWR1DORrKd46W6MEhmS4muo/0kgrtUV/AGW1ohMWemy7WukcRH8T3JjkDpn/daOHk0yVqf0CBvScU17Ab//PA==", + "resolved": "3.6.0", + "contentHash": "XjZ5sWf/QKLqB9aMKG7FvrT/8Ak2fPo0ygRstindBWZWU8P3EcmvYJ5UkX0daIL4+bZeaiD9ThkftGlIx3ZewQ==", "dependencies": { "FSharp.Core": "5.0.2" } }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { diff --git a/tests/FS.GG.Coord.GitHub.Tests/packages.lock.json b/tests/FS.GG.Coord.GitHub.Tests/packages.lock.json index 151c3cffa..d96290ccf 100644 --- a/tests/FS.GG.Coord.GitHub.Tests/packages.lock.json +++ b/tests/FS.GG.Coord.GitHub.Tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,26 +31,26 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { diff --git a/tests/FS.GG.Org.Policy.Tests/packages.lock.json b/tests/FS.GG.Org.Policy.Tests/packages.lock.json index faf926af3..2d07a8a1b 100644 --- a/tests/FS.GG.Org.Policy.Tests/packages.lock.json +++ b/tests/FS.GG.Org.Policy.Tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,26 +31,26 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { diff --git a/tests/FS.GG.Org.SkillRegistry.Tests/packages.lock.json b/tests/FS.GG.Org.SkillRegistry.Tests/packages.lock.json index b34b3f186..7419605ba 100644 --- a/tests/FS.GG.Org.SkillRegistry.Tests/packages.lock.json +++ b/tests/FS.GG.Org.SkillRegistry.Tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,26 +31,26 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { diff --git a/tests/FS.GG.Telemetry.Browser.Tests/packages.lock.json b/tests/FS.GG.Telemetry.Browser.Tests/packages.lock.json index b219e2293..9fc0b8bc5 100644 --- a/tests/FS.GG.Telemetry.Browser.Tests/packages.lock.json +++ b/tests/FS.GG.Telemetry.Browser.Tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,26 +31,26 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { diff --git a/tests/FS.GG.Telemetry.Dashboard.Tests/packages.lock.json b/tests/FS.GG.Telemetry.Dashboard.Tests/packages.lock.json index dd3e59e50..5e5e97909 100644 --- a/tests/FS.GG.Telemetry.Dashboard.Tests/packages.lock.json +++ b/tests/FS.GG.Telemetry.Dashboard.Tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,34 +31,34 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "2aL9eL5HQr0V4b8V909SD+jQAx6qnTTl7sT/v3D8dIvmr2UGdpZIQxqm1pj2Js3e4EYTvpw0oMH7DjapJJuPPw==", + "resolved": "10.0.14", + "contentHash": "1p9rO3Q2X/L/9YrYog3vaDzi8u+WZfJCOkDYoHqmofqYP0DLPLPyZcS2Rnh/79JXAodgbs1AgsaNwLpIvC3Xew==", "dependencies": { - "SQLitePCLRaw.core": "2.1.12" + "SQLitePCLRaw.core": "2.1.13" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "SQLite": { @@ -207,19 +207,19 @@ "dependencies": { "FS.GG.Coord.Core": "[1.0.0, )", "FSharp.Core": "[10.1.403, )", - "Microsoft.Data.Sqlite": "[10.0.12, )", + "Microsoft.Data.Sqlite": "[10.0.14, )", "SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )" } }, "Microsoft.Data.Sqlite": { "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.12", - "contentHash": "xUq9xUc653ue7ac2rMfCaf8UQN+U3zS8poWYlugycpvJllplMM0Mk7v/+MM0CTlu9zGvbGML4BPH8YWhrUOfGw==", + "requested": "[10.0.14, )", + "resolved": "10.0.14", + "contentHash": "muyroan6rKrf0omZL8UF7Kw5uOGp/yBg1L/XWvkFN3WhKaNtK2IWqRZw93nIwVqjhTVDO0l4CEGhHIh+mb+sKg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "10.0.12", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12", - "SQLitePCLRaw.core": "2.1.12" + "Microsoft.Data.Sqlite.Core": "10.0.14", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.13", + "SQLitePCLRaw.core": "2.1.13" } }, "SQLitePCLRaw.bundle_e_sqlite3": { diff --git a/tests/FS.GG.Telemetry.LocalDashboard.Tests/packages.lock.json b/tests/FS.GG.Telemetry.LocalDashboard.Tests/packages.lock.json index 12638dadf..cb0aea78d 100644 --- a/tests/FS.GG.Telemetry.LocalDashboard.Tests/packages.lock.json +++ b/tests/FS.GG.Telemetry.LocalDashboard.Tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,26 +31,26 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { diff --git a/tests/FS.GG.Telemetry.Tests/packages.lock.json b/tests/FS.GG.Telemetry.Tests/packages.lock.json index 0c25541d6..588244ae6 100644 --- a/tests/FS.GG.Telemetry.Tests/packages.lock.json +++ b/tests/FS.GG.Telemetry.Tests/packages.lock.json @@ -10,23 +10,23 @@ }, "Microsoft.Data.Sqlite": { "type": "Direct", - "requested": "[10.0.12, )", - "resolved": "10.0.12", - "contentHash": "xUq9xUc653ue7ac2rMfCaf8UQN+U3zS8poWYlugycpvJllplMM0Mk7v/+MM0CTlu9zGvbGML4BPH8YWhrUOfGw==", + "requested": "[10.0.14, )", + "resolved": "10.0.14", + "contentHash": "muyroan6rKrf0omZL8UF7Kw5uOGp/yBg1L/XWvkFN3WhKaNtK2IWqRZw93nIwVqjhTVDO0l4CEGhHIh+mb+sKg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "10.0.12", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12", - "SQLitePCLRaw.core": "2.1.12" + "Microsoft.Data.Sqlite.Core": "10.0.14", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.13", + "SQLitePCLRaw.core": "2.1.13" } }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -42,9 +42,9 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Akka.Analyzers": { "type": "Transitive", @@ -69,15 +69,15 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "2aL9eL5HQr0V4b8V909SD+jQAx6qnTTl7sT/v3D8dIvmr2UGdpZIQxqm1pj2Js3e4EYTvpw0oMH7DjapJJuPPw==", + "resolved": "10.0.14", + "contentHash": "1p9rO3Q2X/L/9YrYog3vaDzi8u+WZfJCOkDYoHqmofqYP0DLPLPyZcS2Rnh/79JXAodgbs1AgsaNwLpIvC3Xew==", "dependencies": { - "SQLitePCLRaw.core": "2.1.12" + "SQLitePCLRaw.core": "2.1.13" } }, "Microsoft.Extensions.ObjectPool": { @@ -87,15 +87,15 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "Microsoft.Win32.SystemEvents": { @@ -248,8 +248,8 @@ "fs.gg.telemetry.host": { "type": "Project", "dependencies": { - "Akka": "[1.5.71, )", - "Akka.FSharp": "[1.5.71, )", + "Akka": "[1.5.73, )", + "Akka.FSharp": "[1.5.73, )", "FS.GG.Coord.GitHub": "[1.0.0, )", "FS.GG.Telemetry.Client": "[1.0.0, )", "FS.GG.Telemetry.Contracts": "[1.0.0, )", @@ -263,15 +263,15 @@ "dependencies": { "FS.GG.Coord.Core": "[1.0.0, )", "FSharp.Core": "[10.1.403, )", - "Microsoft.Data.Sqlite": "[10.0.12, )", + "Microsoft.Data.Sqlite": "[10.0.14, )", "SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )" } }, "Akka": { "type": "CentralTransitive", - "requested": "[1.5.71, )", - "resolved": "1.5.71", - "contentHash": "HMeKCZeOYzv5sqRq0mNPFqaV3QAn3XbiwCMJbkFbqjT4TouuKPX6OPfv6TG55M8mXic8u330S9zwCtIaeJFzqQ==", + "requested": "[1.5.73, )", + "resolved": "1.5.73", + "contentHash": "llceOuVtuaVF11csQAVkAvJ9SLzDDgTrnqxt6sLQ4GMrzbVPl3VtwjMZt3swHJdHq+pNLUZ+TK6M5E28XFSrrw==", "dependencies": { "Akka.Analyzers": "0.3.3", "Microsoft.Extensions.ObjectPool": "6.0.36", @@ -281,12 +281,12 @@ }, "Akka.FSharp": { "type": "CentralTransitive", - "requested": "[1.5.71, )", - "resolved": "1.5.71", - "contentHash": "/X4H8BBLvedRJ+VODRzJOUhgRE99eNs6CVlM2az60zXEnqXe6+8louJZuVYsmmJyXs4+4IvmTEwpvnTJCUE+AA==", + "requested": "[1.5.73, )", + "resolved": "1.5.73", + "contentHash": "xRWT+8ycXWB2qrrwMb7QLaviA19fBhDtmBl2rlCUUfj+JcwshHykT1uUO3V+nLf22sCGhtX9BmQgrrgWVYc3AQ==", "dependencies": { - "Akka": "1.5.71", - "FSharp.Core": "10.0.111", + "Akka": "1.5.73", + "FSharp.Core": "10.0.112", "FSharp.Quotations.Evaluator": "2.1.0", "FsPickler": "5.3.2" } diff --git a/tests/FS.GG.V2.Progress.Tests/packages.lock.json b/tests/FS.GG.V2.Progress.Tests/packages.lock.json index 6fec740a8..5bea33bde 100644 --- a/tests/FS.GG.V2.Progress.Tests/packages.lock.json +++ b/tests/FS.GG.V2.Progress.Tests/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,26 +31,26 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { diff --git a/tests/coord-board-v2-cli-join/packages.lock.json b/tests/coord-board-v2-cli-join/packages.lock.json index dd3e59e50..5e5e97909 100644 --- a/tests/coord-board-v2-cli-join/packages.lock.json +++ b/tests/coord-board-v2-cli-join/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,34 +31,34 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "10.0.12", - "contentHash": "2aL9eL5HQr0V4b8V909SD+jQAx6qnTTl7sT/v3D8dIvmr2UGdpZIQxqm1pj2Js3e4EYTvpw0oMH7DjapJJuPPw==", + "resolved": "10.0.14", + "contentHash": "1p9rO3Q2X/L/9YrYog3vaDzi8u+WZfJCOkDYoHqmofqYP0DLPLPyZcS2Rnh/79JXAodgbs1AgsaNwLpIvC3Xew==", "dependencies": { - "SQLitePCLRaw.core": "2.1.12" + "SQLitePCLRaw.core": "2.1.13" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "SQLite": { @@ -207,19 +207,19 @@ "dependencies": { "FS.GG.Coord.Core": "[1.0.0, )", "FSharp.Core": "[10.1.403, )", - "Microsoft.Data.Sqlite": "[10.0.12, )", + "Microsoft.Data.Sqlite": "[10.0.14, )", "SQLitePCLRaw.bundle_e_sqlite3": "[3.0.5, )" } }, "Microsoft.Data.Sqlite": { "type": "CentralTransitive", - "requested": "[10.0.12, )", - "resolved": "10.0.12", - "contentHash": "xUq9xUc653ue7ac2rMfCaf8UQN+U3zS8poWYlugycpvJllplMM0Mk7v/+MM0CTlu9zGvbGML4BPH8YWhrUOfGw==", + "requested": "[10.0.14, )", + "resolved": "10.0.14", + "contentHash": "muyroan6rKrf0omZL8UF7Kw5uOGp/yBg1L/XWvkFN3WhKaNtK2IWqRZw93nIwVqjhTVDO0l4CEGhHIh+mb+sKg==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "10.0.12", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.12", - "SQLitePCLRaw.core": "2.1.12" + "Microsoft.Data.Sqlite.Core": "10.0.14", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.13", + "SQLitePCLRaw.core": "2.1.13" } }, "SQLitePCLRaw.bundle_e_sqlite3": { diff --git a/tests/coord-board-v2-projection/packages.lock.json b/tests/coord-board-v2-projection/packages.lock.json index 151c3cffa..d96290ccf 100644 --- a/tests/coord-board-v2-projection/packages.lock.json +++ b/tests/coord-board-v2-projection/packages.lock.json @@ -10,12 +10,12 @@ }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.10.1, )", - "resolved": "18.10.1", - "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", + "requested": "[18.11.0, )", + "resolved": "18.11.0", + "contentHash": "xf/bR0LNkhK0SnadDRlZIQmC4sac5Wk0e1WAdiQjRN3MSo6gQ9M2c4c1XRNnVGjfOvckh704W5CJ19AL0/Xsdg==", "dependencies": { - "Microsoft.CodeCoverage": "18.10.1", - "Microsoft.TestPlatform.TestHost": "18.10.1" + "Microsoft.CodeCoverage": "18.11.0", + "Microsoft.TestPlatform.TestHost": "18.11.0" } }, "xunit": { @@ -31,26 +31,26 @@ }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "kzLFyBYUnoidpGOXvpNOfIo8C92gVgVR6X8ncHwhcrDYugiOut5rrhDkr0L3cWHd7J2pKXf6LgaeXoBBDlx1ag==" + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "8CoAaZkniVekR1ycJyxn+hOz+6ZQCDPcoIsIs6ujd4WyFcBMlxGNU15Qb8Uxd4iO4UmOuETb0M6vzBbwX/mfLA==" }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" + "resolved": "18.11.0", + "contentHash": "MhN9wpvL1Es4hfIYslrsVgIsUdDFxuOBTbAl9mGIMvFo8PP5CLf4DrGdNrfwWSyn0lqi6sssm+I/qkkLL3MU+g==" }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" + "resolved": "18.11.0", + "contentHash": "BXBHYnwSOljKute8UYCMXOLAdB7awxEMppPSpqOF1ZxLD/W/OH+vTBgFaXA7q0aditJTVXSMVenel+wOkEIyNg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.10.1", - "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", + "resolved": "18.11.0", + "contentHash": "AKjwKpyRBwoQFQmpcchtoYlfJEBlaY/40uxBRi+qXP4NR7xT8t+XTJtOyEyumfvfJcH5pASs75LwNdXYRr4XNA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.10.1" + "Microsoft.TestPlatform.ObjectModel": "18.11.0" } }, "xunit.abstractions": { From b395db22510b84a3f67bcbeb4acf7d862d19e171 Mon Sep 17 00:00:00 2001 From: rev Date: Mon, 2 Nov 2026 16:10:23 +0100 Subject: [PATCH 2/6] fix: harden fdev board-tend activation and marker recovery (Refs #5206) --- .../fsgg-board-tend-daily.service.in | 5 +- .../fdev-board-tend/fsgg-board-tend-run.py | 132 +++++++++++++---- .../fsgg-board-tend.service.in | 6 +- deployment/fdev-board-tend/install.py | 25 +++- docs/coordination/board-tend-fdev-units.md | 134 +++++++++--------- tests/fdev-board-tend/test_fdev_board_tend.py | 124 ++++++++++++++-- 6 files changed, 313 insertions(+), 113 deletions(-) diff --git a/deployment/fdev-board-tend/fsgg-board-tend-daily.service.in b/deployment/fdev-board-tend/fsgg-board-tend-daily.service.in index 54b94a644..c8337c5c8 100644 --- a/deployment/fdev-board-tend/fsgg-board-tend-daily.service.in +++ b/deployment/fdev-board-tend/fsgg-board-tend-daily.service.in @@ -6,8 +6,9 @@ Description=FS-GG board-v2 tend daily observation record (Refs FS-GG/.github#513 [Service] Type=oneshot WorkingDirectory=@WORKDIR@ -Environment=XDG_STATE_HOME=%h/.local/state +Environment=XDG_CONFIG_HOME=@CONFIG_HOME@ +Environment=XDG_STATE_HOME=@STATE_HOME@ UMask=0077 NoNewPrivileges=yes TimeoutStartSec=120 -ExecStart=/usr/bin/python3 -I @LIBEXEC@/fsgg-board-tend-run.py summarize --date yesterday +ExecStart=/usr/bin/python3 -I @LIBEXEC@/fsgg-board-tend-run.py summarize --date yesterday --config-home @CONFIG_HOME@ --state-home @STATE_HOME@ diff --git a/deployment/fdev-board-tend/fsgg-board-tend-run.py b/deployment/fdev-board-tend/fsgg-board-tend-run.py index 994c8f80a..a6bf14f9c 100644 --- a/deployment/fdev-board-tend/fsgg-board-tend-run.py +++ b/deployment/fdev-board-tend/fsgg-board-tend-run.py @@ -13,8 +13,8 @@ * keep every output in a private directory (0700, one directory per run); * honour the post-merge marker: a `pending-post-merge` file in the reconciler's state directory means a merge happened since the last run, so the run goes ahead regardless of the 5-minute timer minimum, and the marker - is cleared only by a run that started after it was written (a run that finds the marker newer than its own - start runs once more, up to --max-passes). + is claimed by rename before work and only that claim is deleted after success. New pending markers + cause another pass, up to --max-passes; failed or interrupted claims survive recovery. The Project 3 writer lock is the engine's own flock(2) on $XDG_RUNTIME_DIR/fsgg/board-writer-.lock, taken with LOCK_NB and only under --apply; this wrapper never takes it. It only checks the path is satisfiable. @@ -24,6 +24,7 @@ import argparse import datetime as dt import fcntl +import hashlib import json import os import pathlib @@ -39,6 +40,7 @@ RUN_SCHEMA = "fsgg.board-tend-run/1" DAILY_SCHEMA = "fsgg.board-tend-daily/1" MARKER = "pending-post-merge" +CLAIMED_MARKER = MARKER + ".claimed" PROJECT_ID = "PVT_kwDOEYAWY84Bldpa" WRITER_LOCK_NAME = f"board-writer-{PROJECT_ID}.lock" CONTRACT_MIRRORS = ( @@ -80,6 +82,8 @@ def private_directory(path: pathlib.Path) -> pathlib.Path: raise Refusal(f"{path} is not a directory owned by this user") if stat.S_IMODE(info.st_mode) & 0o077: raise Refusal(f"{path} must be private to its owner (mode 0700); it is {stat.S_IMODE(info.st_mode):o}") + for directory in (path, *path.parents): + sync_directory(directory) return path @@ -91,6 +95,7 @@ def atomic_write(path: pathlib.Path, text: str) -> None: handle.flush() os.fsync(handle.fileno()) os.replace(tmp, path) + sync_directory(path.parent) except BaseException: try: os.unlink(tmp) @@ -116,17 +121,39 @@ def read_token(credentials: pathlib.Path) -> str: return token.strip() -def check_pin(env: dict[str, str], workdir: pathlib.Path | None, cwd: pathlib.Path) -> pathlib.Path: - """The environment pin: FSGG_KIT_ROOT absolute, existing and carrying a contract mirror; cwd the fixed path.""" +def sync_directory(path: pathlib.Path) -> None: + fd = os.open(path, os.O_RDONLY | os.O_DIRECTORY) + try: + os.fsync(fd) + finally: + os.close(fd) + + +def check_homes(args: argparse.Namespace, env: dict[str, str]) -> None: + for field, key in (("config_home", "XDG_CONFIG_HOME"), ("state_home", "XDG_STATE_HOME")): + expected = getattr(args, field) + if not os.path.isabs(expected) or env.get(key) != expected: + raise Refusal(f"{key} must match its explicit installed home pin") + + +def check_pin(env: dict[str, str], workdir: pathlib.Path, cwd: pathlib.Path, expected: str) -> pathlib.Path: + """Validate both installed contract bytes and the fixed non-checkout working directory at every run.""" root = env.get("FSGG_KIT_ROOT", "") if not root or not os.path.isabs(root): raise Refusal("FSGG_KIT_ROOT must be set to the absolute installed kit root") kit = pathlib.Path(root) if not kit.is_dir(): raise Refusal("FSGG_KIT_ROOT is not a directory") - if not any((kit / mirror).is_file() for mirror in CONTRACT_MIRRORS): - raise Refusal("FSGG_KIT_ROOT carries no lifecycle-contract.md mirror; it is not an installed kit root") - if workdir is not None and cwd.resolve() != workdir.resolve(): + if not re.fullmatch(r"[0-9a-f]{64}", expected): + raise Refusal("the release contract sha256 is required") + for directory in (kit.resolve(), workdir.resolve()): + if any((parent / ".git").exists() for parent in (directory, *directory.parents)): + raise Refusal("the kit root and workdir must not be in git checkouts") + for mirror in CONTRACT_MIRRORS: + path = kit / mirror + if path.is_symlink() or not path.is_file() or hashlib.sha256(path.read_bytes()).hexdigest() != expected: + raise Refusal("both installed contract mirrors must match the pinned release sha256") + if not workdir.is_absolute() or cwd.resolve() != workdir.resolve(): raise Refusal("the working directory differs from the pinned WorkingDirectory") runtime = env.get("XDG_RUNTIME_DIR", "") if not runtime or not os.path.isabs(runtime): @@ -142,6 +169,19 @@ def marker_identity(state: pathlib.Path) -> tuple[int, int, int] | None: return (info.st_ino, info.st_mtime_ns, info.st_size) +def claim_marker(state: pathlib.Path) -> bool: + """Only the run-lock owner claims. A crash/failed run retains its existing claim for recovery.""" + claimed = state / CLAIMED_MARKER + if claimed.exists(): + return True + try: + os.rename(state / MARKER, claimed) + except FileNotFoundError: + return False + sync_directory(state) + return True + + def child_environment(env: dict[str, str], token: str, kit: pathlib.Path) -> dict[str, str]: child = {key: env[key] for key in CHILD_ENV_KEEP if key in env} child["FSGG_KIT_ROOT"] = str(kit) @@ -204,15 +244,23 @@ def command_run(args: argparse.Namespace, env: dict[str, str] | None = None, cwd state = pathlib.Path(args.state_dir) if args.state_dir else state_home / "fsgg" / "board-tend" out = pathlib.Path(args.out_dir) if args.out_dir else state_home / "fsgg" / "board-tend-out" try: - kit = check_pin(env, pathlib.Path(args.workdir) if args.workdir else None, cwd) + check_homes(args, env) + kit = check_pin(env, pathlib.Path(args.workdir), cwd, args.expect_kit_sha256) token = read_token(pathlib.Path(args.credentials)) private_directory(out) runs = private_directory(out / "runs") private_directory(state) - except Refusal as error: + except (Refusal, OSError) as error: print(f"fsgg-board-tend-run: refused: {error}", file=sys.stderr) return 2 child = child_environment(env, token, kit) + version = engine_version(args.engine, child) + release = re.fullmatch(r"coord-(\d+\.\d+\.\d+)", pathlib.Path(args.engine).parent.name) + if (not pathlib.Path(args.engine).is_absolute() or release is None or pathlib.Path(args.engine).name != "fsgg-coord-engine" + or kit.name != "kit-" + release[1] + or version not in (release[1], release[1] + ".0")): + print("fsgg-board-tend-run: refused: real engine version does not match the pinned engine/kit release", file=sys.stderr) + return 2 lock = os.open(out / "run.lock", os.O_RDWR | os.O_CREAT | os.O_NOFOLLOW | os.O_CLOEXEC, 0o600) try: fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) @@ -224,8 +272,8 @@ def command_run(args: argparse.Namespace, env: dict[str, str] | None = None, cwd last = out / "last-run.json" passes, code = 0, 0 while True: - seen = marker_identity(state) - if passes == 0 and seen is None: + seen = claim_marker(state) + if passes == 0 and not seen: try: started_epoch = json.loads(last.read_text(encoding="utf-8")).get("startedEpoch", 0) except (OSError, ValueError, AttributeError): @@ -238,27 +286,22 @@ def command_run(args: argparse.Namespace, env: dict[str, str] | None = None, cwd return 0 started = now_utc() run_dir = new_run_directory(runs, started, passes) - trigger = "post-merge" if seen is not None else "timer" + trigger = "post-merge" if seen else "timer" code, summary = run_once(args.engine, run_dir, args.mode, child, args.engine_timeout) after = marker_identity(state) - if after is None: - disposition = "none" - elif seen is not None and after == seen and code == 0: - try: - os.unlink(state / MARKER) - disposition = "cleared" - except FileNotFoundError: - disposition = "cleared" - elif after != seen: - disposition = "newer" + if code != 0: + disposition = "kept-failed" if seen or after is not None else "none" else: - disposition = "kept-failed" + if seen: + os.unlink(state / CLAIMED_MARKER) # never unlink the concurrently replaceable pending name + sync_directory(state) + disposition = "newer" if after is not None else "cleared" if seen else "none" record: dict[str, Any] = { "schema": RUN_SCHEMA, "event": "run", "mode": args.mode, "trigger": trigger, "startedAt": iso(started), "startedEpoch": started.timestamp(), "finishedAt": iso(now_utc()), "exit": code, "runDir": str(run_dir), "plan": str(run_dir / "plan.json"), "summary": summary, "marker": disposition, "pass": passes, - "kitRoot": str(kit), "engine": args.engine, "engineVersion": engine_version(args.engine, child), + "kitRoot": str(kit), "engine": args.engine, "engineVersion": version, "writerLock": str(pathlib.Path(env["XDG_RUNTIME_DIR"]) / "fsgg" / WRITER_LOCK_NAME), } atomic_write(run_dir / "meta.json", json.dumps(record, indent=2, sort_keys=True) + "\n") @@ -271,7 +314,7 @@ def command_run(args: argparse.Namespace, env: dict[str, str] | None = None, cwd if summary: print(summary) passes += 1 - if disposition != "newer" or passes >= args.max_passes: + if code != 0 or disposition != "newer" or passes >= args.max_passes: break prune(runs, args.keep) return code @@ -285,6 +328,36 @@ def rate(pairs: int, disagreements: int) -> float | None: return round(disagreements / pairs, 4) if pairs else None +def valid_daily_plan(plan: object) -> bool: + """Validate the shapes the daily reducer reads; malformed plans are Unknown, never empty observations.""" + if not isinstance(plan, dict) or plan.get("schema") != "fsgg.board-tend-plan/1": + return False + for name in ("apply", "close", "deferred", "wouldApply", "wouldClose", "propose", "refuse"): + rows = plan.get(name, []) + if not isinstance(rows, list) or any(not isinstance(row, dict) for row in rows): + return False + if name in ("wouldApply", "wouldClose", "propose", "refuse"): + ids = [row.get("id") for row in rows] + if any(not isinstance(value, str) or not value for value in ids) or len(set(ids)) != len(ids): + return False + for row in rows: + if name in ("wouldApply", "wouldClose", "refuse") and not isinstance(row.get("ref"), str): + return False + if name == "wouldApply" and (not isinstance(row.get("rules"), list) + or any(not isinstance(rule, str) for rule in row["rules"])): + return False + if name == "refuse" and any(not isinstance(row.get(key), str) for key in ("rule", "reason")): + return False + comparison = plan.get("t1iComparison") + if comparison is not None: + if not isinstance(comparison, dict): + return False + pairs, disagreements = comparison.get("pairs"), comparison.get("disagreements") + if type(pairs) is not int or type(disagreements) is not int or not 0 <= disagreements <= pairs: + return False + return True + + def summarize(out: pathlib.Path, date: str) -> dict[str, Any]: entries: list[dict[str, Any]] = [] try: @@ -302,7 +375,7 @@ def summarize(out: pathlib.Path, date: str) -> dict[str, Any]: for entry in runs: try: plan = json.loads((pathlib.Path(entry["runDir"]) / "plan.json").read_text(encoding="utf-8")) - if plan.get("schema") != "fsgg.board-tend-plan/1": + if not valid_daily_plan(plan): raise ValueError plans.append((entry, plan)) except (OSError, ValueError, KeyError, AttributeError): @@ -398,6 +471,7 @@ def refs(items: list[str]) -> str: def command_summarize(args: argparse.Namespace, env: dict[str, str] | None = None) -> int: env = dict(os.environ) if env is None else env + check_homes(args, env) state_home = pathlib.Path(env.get("XDG_STATE_HOME") or os.path.join(env.get("HOME", "~"), ".local", "state")) out = pathlib.Path(args.out_dir) if args.out_dir else state_home / "fsgg" / "board-tend-out" today = now_utc().date() @@ -425,7 +499,8 @@ def parser() -> argparse.ArgumentParser: run.add_argument("--mode", choices=("plan-only", "apply"), default="plan-only") run.add_argument("--engine-path", dest="engine", required=True, help="absolute path of fsgg-coord-engine") run.add_argument("--credentials", required=True, help="0600 JSON file with GH_TOKEN") - run.add_argument("--workdir", help="the fixed WorkingDirectory the process must have been started in") + run.add_argument("--workdir", required=True, help="the fixed WorkingDirectory the process must have been started in") + run.add_argument("--expect-kit-sha256", required=True, help="sha256 of both accepted release contract mirrors") run.add_argument("--out-dir", help="private output directory (default $XDG_STATE_HOME/fsgg/board-tend-out)") run.add_argument("--state-dir", help="reconciler state directory holding the marker (default $XDG_STATE_HOME/fsgg/board-tend)") run.add_argument("--min-interval", type=int, default=DEFAULT_MIN_INTERVAL, help="seconds; applies to timer runs only") @@ -435,6 +510,9 @@ def parser() -> argparse.ArgumentParser: daily = sub.add_parser("summarize") daily.add_argument("--date", default="yesterday", help="YYYY-MM-DD (UTC), today or yesterday") daily.add_argument("--out-dir") + for command in (run, daily): + command.add_argument("--config-home", required=True) + command.add_argument("--state-home", required=True) return root diff --git a/deployment/fdev-board-tend/fsgg-board-tend.service.in b/deployment/fdev-board-tend/fsgg-board-tend.service.in index f778c126d..743b2a409 100644 --- a/deployment/fdev-board-tend/fsgg-board-tend.service.in +++ b/deployment/fdev-board-tend/fsgg-board-tend.service.in @@ -16,8 +16,8 @@ Environment=FSGG_KIT_ROOT=@KIT_ROOT@ # The shared Project 3 writer lock is flock(2) on %t/fsgg/board-writer-PVT_kwDOEYAWY84Bldpa.lock (LOCK_NB, taken by # the engine only under --apply). Pin where %t points and keep the directory across runs. Environment=XDG_RUNTIME_DIR=%t -Environment=XDG_CONFIG_HOME=%h/.config -Environment=XDG_STATE_HOME=%h/.local/state +Environment=XDG_CONFIG_HOME=@CONFIG_HOME@ +Environment=XDG_STATE_HOME=@STATE_HOME@ Environment=DOTNET_CLI_TELEMETRY_OPTOUT=1 Environment=DOTNET_NOLOGO=1 RuntimeDirectory=fsgg @@ -28,4 +28,4 @@ UMask=0077 NoNewPrivileges=yes # Deliberately no PrivateTmp: during the transition the writers also take the legacy lock at the literal /tmp path. RuntimeMaxSec=@RUNTIME_MAX@ -ExecStart=/usr/bin/python3 -I @LIBEXEC@/fsgg-board-tend-run.py run --mode @MODE@ --engine-path @ENGINE@ --credentials @CREDENTIALS@ --workdir @WORKDIR@ +ExecStart=/usr/bin/python3 -I @LIBEXEC@/fsgg-board-tend-run.py run --mode @MODE@ --engine-path @ENGINE@ --credentials @CREDENTIALS@ --workdir @WORKDIR@ --expect-kit-sha256 @KIT_SHA256@ --config-home @CONFIG_HOME@ --state-home @STATE_HOME@ diff --git a/deployment/fdev-board-tend/install.py b/deployment/fdev-board-tend/install.py index 1d56b1135..60005cf33 100644 --- a/deployment/fdev-board-tend/install.py +++ b/deployment/fdev-board-tend/install.py @@ -152,6 +152,11 @@ def command_units(args: argparse.Namespace) -> int: credentials = user_path(args.credentials, "--credentials") unit_dir = user_path(args.unit_dir, "--unit-dir") libexec = user_path(args.libexec_dir, "--libexec-dir") + config_home = user_path(args.config_home, "--config-home") + state_home = user_path(args.state_home, "--state-home") + enable_file = user_path(args.enable_file, "--enable-file") if args.enable_file else config_home / "fsgg/board-tend.json" + if enable_file != config_home / "fsgg/board-tend.json": + raise Refusal("--enable-file must be the engine's file under --config-home") engine_release, kit_release = version_of(engine.parent.name, "coord-"), version_of(kit.name, "kit-") if engine.name != "fsgg-coord-engine" or engine_release is None: raise Refusal("--engine-path must be .../coord-/fsgg-coord-engine, the versioned path, not the moving link") @@ -159,16 +164,21 @@ def command_units(args: argparse.Namespace) -> int: raise Refusal(f"--kit-root must be named kit-{engine_release} to match the engine release") if not engine.is_file() or not os.access(engine, os.X_OK): raise Refusal("--engine-path is not an executable file") - if not any((kit / mirror).is_file() for mirror in MIRRORS): - raise Refusal("--kit-root carries no lifecycle-contract.md mirror; run the kit-root subcommand first") + if not re.fullmatch(r"[0-9a-f]{64}", args.expect_kit_sha256): + raise Refusal("--expect-kit-sha256 must be 64 lowercase hex digits") + for mirror in MIRRORS: + path = kit / mirror + if path.is_symlink() or not path.is_file() or digest(path.read_bytes()) != args.expect_kit_sha256: + raise Refusal("both --kit-root mirrors must match --expect-kit-sha256") if workdir == kit: raise Refusal("--workdir must not be the kit root") - if (workdir / ".git").exists() or (kit / ".git").exists(): + if any((parent / ".git").exists() for directory in (workdir, kit) for parent in (directory, *directory.parents)): raise Refusal("--workdir and --kit-root must not be git checkouts") - if args.mode == "apply" and not enable_file_names_a_rule(user_path(args.enable_file, "--enable-file")): + if args.mode == "apply" and not enable_file_names_a_rule(enable_file): raise Refusal("--mode apply needs a 0600 enable file that names at least one rule; the installer never writes rules") values = {"MODE": args.mode, "WORKDIR": str(workdir), "KIT_ROOT": str(kit), "ENGINE": str(engine), "CREDENTIALS": str(credentials), - "LIBEXEC": str(libexec), "RUNTIME_MAX": str(RUNTIME_MAX_SECONDS)} + "LIBEXEC": str(libexec), "RUNTIME_MAX": str(RUNTIME_MAX_SECONDS), + "KIT_SHA256": args.expect_kit_sha256, "CONFIG_HOME": str(config_home), "STATE_HOME": str(state_home)} plan = Plan(args.dry_run) for name in UNIT_TEMPLATES: text = render((HERE / f"{name}.in").read_text(encoding="utf-8"), values) @@ -283,12 +293,15 @@ def parser() -> argparse.ArgumentParser: units = sub.add_parser("units") units.add_argument("--kit-root", required=True) units.add_argument("--engine-path", dest="engine", required=True) + units.add_argument("--expect-kit-sha256", required=True) + units.add_argument("--config-home", default=str(pathlib.Path(os.environ.get("XDG_CONFIG_HOME") or h / ".config"))) + units.add_argument("--state-home", default=str(pathlib.Path(os.environ.get("XDG_STATE_HOME") or h / ".local/state"))) units.add_argument("--mode", choices=("plan-only", "apply"), default="plan-only") units.add_argument("--workdir", default=str(h / ".local/share/fs-gg/board-tend")) units.add_argument("--credentials", default=str(h / ".config/fdev/credentials.json")) units.add_argument("--unit-dir", default=str(pathlib.Path(os.environ.get("XDG_CONFIG_HOME") or h / ".config") / "systemd/user")) units.add_argument("--libexec-dir", default=str(h / ".local/libexec")) - units.add_argument("--enable-file", default=str(pathlib.Path(os.environ.get("XDG_CONFIG_HOME") or h / ".config") / "fsgg/board-tend.json")) + units.add_argument("--enable-file", help="must name fsgg/board-tend.json under --config-home") units.add_argument("--enable", action="store_true", help="daemon-reload and enable --now both timers") units.add_argument("--force", action="store_true", help="replace installed files that differ") units.add_argument("--dry-run", action="store_true") diff --git a/docs/coordination/board-tend-fdev-units.md b/docs/coordination/board-tend-fdev-units.md index d9b9edf85..dea83a3d5 100644 --- a/docs/coordination/board-tend-fdev-units.md +++ b/docs/coordination/board-tend-fdev-units.md @@ -1,8 +1,8 @@ -# `board-v2 tend` on fdev: units, enable file and the 7-day observation +# `board-v2 tend` on fdev: pinned units, guarded activation and ongoing observation Refs #5136. This is the operating note for [board-reconciler design](2026-10-31-board-reconciler-design.md) §8 and §12 PR 8. The design decides what the reconciler does; this note says how it is run on fdev, what is pinned, what -an install changes and how the 7 plan-only days are recorded and judged. The source is +an install changes and how current qualification and continuing observations are judged. The source is `deployment/fdev-board-tend/`; `tests/fdev-board-tend/` renders and exercises all of it offline. ## What runs @@ -10,7 +10,7 @@ an install changes and how the 7 plan-only days are recorded and judged. The sou | Unit | When | What | |---|---|---| | `fsgg-board-tend.timer` | hourly at minute 07, `Persistent=true`, up to 120 s random delay | starts `fsgg-board-tend.service` | -| `fsgg-board-tend.service` | the timer, and the post-merge trigger below | `fsgg-board-tend-run.py run --mode plan-only`, which runs `fsgg-coord-engine board-v2 tend` | +| `fsgg-board-tend.service` | the timer, and the post-merge trigger below | `fsgg-board-tend-run.py run --mode `, which runs `fsgg-coord-engine board-v2 tend` | | `fsgg-board-tend-daily.timer` | 00:30 UTC | starts the daily record service | | `fsgg-board-tend-daily.service` | the daily timer | `fsgg-board-tend-run.py summarize --date yesterday`: reads the private run index, writes the daily record. Local and read-only; it posts nothing | @@ -19,8 +19,8 @@ Minute 07 is away from the drift observer's :23 cron, its :53 fdev dispatch and ### What is pinned - **`Environment=FSGG_KIT_ROOT=`.** `board-v2 tend` reads the contract marker `fsgg:board-tend-contract/v1` - from `lifecycle-contract.md` under `FSGG_KIT_ROOT`, else the process's git toplevel. A timer started inside - another checkout could therefore enable gated rules from a stale or edited contract (#5188 F1). The kit root is + from `lifecycle-contract.md` under `FSGG_KIT_ROOT`, else the process's git toplevel. The hardened wrapper requires `--workdir` and `--expect-kit-sha256`, checks both mirror hashes at every run, + and rejects a kit root or workdir inside a checkout (#5206). The kit root is `~/.local/share/fs-gg/board-tend/kit-/`: exactly the two contract mirrors of the released tag, written read-only and verified against the released contract's sha256 (`install.py kit-root`). It is never a checkout. - **`WorkingDirectory=~/.local/share/fs-gg/board-tend`.** A fixed directory that is not a git checkout. The wrapper @@ -29,7 +29,8 @@ Minute 07 is away from the drift observer's :23 cron, its :53 fdev dispatch and - **The engine path is the versioned one** (`~/.local/share/fs-gg/tools/coord-/fsgg-coord-engine`), not the moving `~/.local/bin/fsgg-coord-engine` link, and the kit root must carry the same ``. An engine update (`update-fsgg-coord-cli`) therefore changes nothing under the timer until Root re-runs the installer for the new - release. + release. The wrapper probes the real executable with `--version` before any board command; its three release + components must match `coord-` and `kit-` (an assembly revision of zero is accepted). - **`RuntimeMaxSec=900`** and `Type=exec` (the cap does not apply to a oneshot service). A killed run leaves the post-merge marker in place. - **The writer lock** is the engine's own `flock(2)` `LOCK_EX|LOCK_NB` on @@ -40,9 +41,15 @@ Minute 07 is away from the drift observer's :23 cron, its :53 fdev dispatch and - **The child environment is scrubbed.** The wrapper passes the engine `HOME`, `PATH`, `LANG`, the `XDG_*` directories, `DOTNET_ROOT`, the pinned `FSGG_KIT_ROOT` and `GH_TOKEN` read from the 0600 credentials file (the file the board-drift dispatcher already uses). Nothing else is inherited, in particular not `GITHUB_TOKEN` and not `TMPDIR`. -- **Plan-only is the unit's mode.** `--apply` is never on the command line. Moving to apply is a separate Root +- **Config/state homes are explicit.** The installer captures its `XDG_CONFIG_HOME` and `XDG_STATE_HOME` + (or HOME defaults), with optional absolute `--config-home`/`--state-home` overrides. Both units render the same + paths into their environment and wrapper arguments; the wrapper refuses disagreement. The engine enable file + must be `fsgg/board-tend.json` under that config home. The merge gate uses the same XDG state home for its marker: + Root must launch the gate with the installed home pins, including when custom paths are used. A wrong-mode + state directory refuses loudly in the journal; the wrapper does not silently repair or bypass it. +- **Plan-only is the installer default.** Only explicit `--mode apply` adds the engine's `--apply`. Moving to apply is a separate Root effect: re-run `install.py units --mode apply --force`, which refuses unless the enable file already exists with - mode 0600 and names at least one rule. Deleting the enable file, or `"apply": []`, is still the kill switch. + mode 0600 and names at least one qualified rule. Deleting the enable file, or `"apply": []`, is still the kill switch. ### Private output @@ -70,12 +77,13 @@ reported on stderr only; a failure never changes the merge result or its schema. The wrapper never lets a post-merge run be swallowed: 1. A timer run inside the 5-minute minimum interval is skipped, **unless the marker exists**, which always runs. -2. The marker is cleared only by a run that **started after it was written and exited 0**. The wrapper compares the - marker's identity (inode, mtime, size) before and after the run; a marker rewritten during the run, or one that - appeared during a timer run, is not cleared, and the wrapper runs once more (up to 3 passes, then leaves the - marker for the next run). -3. A failed run keeps the marker. If the unit is already active, `systemctl start` is a no-op, and the active run's - own end-of-run check covers the new marker. +2. Under the wrapper run lock, the pending marker is atomically renamed to `pending-post-merge.claimed` and + its directory fsynced before work. Only that claimed name is deleted after a successful run; a concurrent + trigger writes a fresh pending name that is never unlinked by the completed run. A crash or failed run keeps + the claim, which bypasses the minimum interval on recovery. +3. A new pending marker observed at the end causes another pass (up to three); one arriving during final claim + deletion remains pending for the next activation. If the unit is active, `systemctl start` is a no-op, but it + cannot erase the durable pending marker. Failed runs keep both existing claim and any concurrent pending marker. 4. A second wrapper started by hand while one runs holds nothing, exits 0 and keeps the marker. ## The enable file @@ -101,7 +109,7 @@ Nameable rule ids: `W1h`, `W1d`, `T1d`, `T1i`, `T1f`, `RM1`, `S1`, `S3`, `S3b`, gate replay `GR`. Of these, S1, S3, S3b, S4, S9, S9r, O1, C1, W1d and T1d are contract-gated: the engine drops them unless every installed `lifecycle-contract.md` under the pinned kit root declares `fsgg:board-tend-contract/v1`. The 0.114.2 contract (sha256 `819a6cb22859455265ed2223f9ea6dbb85dfe82a98277a420c2a58539355a901`) does, so the gate is -satisfied; each rule is still enabled by Root alone, one at a time, after the observation below. The ungated rules +satisfied; each rule is still enabled by Root alone, one at a time, after the current qualification below. The ungated rules are W1h, T1i, T1f and `GR`; the recommended first unattended set is `{"apply": ["W1h","T1f"], "propose": true, "maxItemsPerRun": 100}`. RM1 stays out until the engine is given its enrollment input (it is inert today). @@ -121,7 +129,8 @@ python3 -I deployment/fdev-board-tend/install.py enable-file # 3. The four user units and the wrapper; --enable also runs daemon-reload and enables both timers. python3 -I deployment/fdev-board-tend/install.py units \ --kit-root ~/.local/share/fs-gg/board-tend/kit-0.114.2 \ - --engine-path ~/.local/share/fs-gg/tools/coord-0.114.2/fsgg-coord-engine --enable + --engine-path ~/.local/share/fs-gg/tools/coord-0.114.2/fsgg-coord-engine \ + --expect-kit-sha256 819a6cb22859455265ed2223f9ea6dbb85dfe82a98277a420c2a58539355a901 --enable ``` `units` writes exactly `~/.config/systemd/user/fsgg-board-tend{,-daily}.{service,timer}` and @@ -134,59 +143,56 @@ root and engine stay for rollback, as `update-fsgg-coord-cli` already retains ol Rollback is `systemctl --user disable --now fsgg-board-tend.timer fsgg-board-tend-daily.timer`, then deleting the five files; nothing else was written. -## The 7-day plan-only observation +## Current qualification and continuing observation -Day 0 is the first timer run. Seven full UTC days are recorded before any rule is enabled; the earliest enable is -the end of day 7. The enable file stays empty throughout and the unit stays plan-only, so no day can write to the -board. +On 2026-11-02 the user explicitly requested permanent automatic board reconciliation. That instruction replaces +this note's previous elapsed seven-day plan-only/advisory waits with **current qualification before activation**. +It does not waive native guards, unresolved effects, rule-specific prerequisites, exact-source review or installed +readback. #5206 supplies the wrapper/installer hardening required before applying gated rules. Root owns the live +configuration and activation; a source candidate or installer default is not evidence that automation is enabled. -**Recorded every day, automatically, in the private directory:** +Before activation Root checks the exact installed wrapper/engine/kit identities, the offline refusal and marker +race/recovery controls, a complete current native plan and the chosen rule subset against its native preconditions. +The published engine and a separately reviewed/tested local wrapper candidate retain distinct identities until +normal source PR/CI integration completes. A failed population read stays failed/Unknown and grants no write. +Elapsed days or a successful read alone do not qualify an unsafe rule. -- every run's `plan.json` (the full would-apply and would-close lists, the T1i comparison, deferrals, proposals and - refusals) and engine summary line, under `runs/`; -- `daily/.json` at 00:30 UTC: runs, post-merge runs, exit codes, skipped runs, plans unreadable, apply-mode - runs and plans that applied or closed anything (both must be 0), the distinct would-apply effects by rule with how - many were present in every run of the day, the would-close items with the same stability count, the T1i - disagreement rate (last, minimum, maximum), distinct proposals and refusals; -- `daily/.md`: the same as a comment body that names only `FS-GG/.github` references (any other repository may - be private; its count is given and the references stay in the private JSON). +The current authorization permits Root to enable the qualified subset together and keep its timers permanently +active. It does not require enabling every nameable rule. Keep any rule with an unsatisfied input, unsafe adjacent +read or unresolved effect disabled; do not broaden the set as a side effect of changing the wrapper. Root's native +acceptance records the chosen set and its qualification. The enable file still controls allowed rules and the bound; +missing/invalid/empty activation keeps the engine plan-only. Disabling the timers and clearing apply rules is the +kill switch, preserving original custody and pending markers. -**Posted daily by the owner of this Delivery**, as a fresh comment on #5136 headed by the -`fsgg:board-tend-observation/v1` marker line the `.md` already carries. A comment is created, never edited by -recency; a correction is a new comment. Proposals to #4985 are the engine's own, only once `propose` is enabled. - -**Health criteria for the week** (any failure restarts the count for the affected day, and a pattern goes to Root): - -1. Every day has at least 20 successful scheduled runs plus every post-merge run; no exit code 3; no unreadable plan; - apply-mode runs 0 and plans that applied or closed anything 0. -2. Each run costs at most 20 requests and 60 seconds (day-0 reference: 12 requests, about 22 seconds, 279 cards). -3. The post-merge marker never survives two consecutive successful runs. - -**Criteria for enabling each rule** (Root decides; each is a separate edit of the enable file, one rule at a time, -with the next rule's observation starting after the previous one has run a clean day): - -| Rule | Enable when | +| Rule | Technical qualification before enable | |---|---| -| W1h, T1f | The 7 days' would-apply fills show an empty `preimage` in every entry (absent-only), and Root has checked the distinct entries against the native hierarchy. Start with `"propose": true` only after the HMAC key file is in place. | -| T1i | The T1i disagreement rate is at most 5% on each of the 7 days. Day 0 reads 73 of 222 (32.9%), so it stays plan-only until that changes. | -| GR | The merge gate has run in enforce mode and its custody directory holds no uncertain or malformed record. It cannot be observed in plan-only, so it joins after the first rules. | -| S3, S3b | Every distinct would-apply was checked as a strictly linked, non-Blocked, non-Done card; no entry would undo a merge-gate write; no flapping (an effect present in one run and absent in the next without a native change). | -| S4 | No would-apply names a card with any linked PR (open, draft, merged, loose); every entry is In review past `reviewSettleHours`. | -| O1 | Every distinct roll-up matches Root's manual roll-up (day 0 shows 4); none starts from Blocked, In review or Done. | -| S9, S9r | Every Backlog fill is an open card with an empty Status; every S9r Ready is a Root-authored intended-fields line. | -| W1d, T1d | Every declaration-branch fill equals the card's own declared line. | -| S1 | Every would-apply is a closed card, Status not Done, past the settle window, which the built-in workflow did not write. | -| RM1 | Not in this window: needs the enrollment input first. | -| C1 | **Its own gates, all three.** (a) A 7-day would-close observation (below). (b) The merge gate's delivery-marker check (#5161) is required, not advisory (`--delivery-marker required`), which is Root's switch after its 7 advisory days, no earlier than 2026-11-08. (c) The contract marker is read as Amended by the pinned kit root (it is, for 0.114.2). | - -**C1's would-close review.** During the 7 days Root's manual sweep applies the same conditions, and the daily -would-close list is compared with it: every would-close item is one the sweep would also close (a Delivery, -populated Work level, In review, all strictly linked PRs merged, none open, last merge at least 48 hours old, -declaring `fsgg:delivery-completes/v1`, no remaining release, install or readback step in its `## Done when`); any -item the sweep would not close is a defect to repair before C1; any swept item the reconciler lacks is explained. No -Outcome and no Blocked card may appear. Day 0 shows 0 would-close, because the declaration did not exist for earlier -merges, so the week may legitimately end with few or no items. If fewer than 3 distinct would-close items have been -compared by day 7, Root either extends the observation or waives the count; this note does not assume which. +| W1h, T1f | Current fills have empty preimages and match the native hierarchy; proposal posting separately needs the HMAC key and its admission. | +| S1 | Closed native content, non-Done current Status and the settle window/adjacent re-read all qualify. | +| S3, S3b | Strict linked-PR evidence and current non-Blocked/non-Done preimages qualify; preserve merge-gate writes. | +| S9, S9r | Open card with empty Status for the Backlog fill; S9r additionally needs Root-authored intended-fields evidence. | +| T1i | Current Roadmap parity and disagreement evidence qualify; it remains held while this is unknown or outside the accepted threshold. | +| S4 | No linked PR of any state and settled In review qualify. | +| O1 | Adjacent child and parent state must qualify the roll-up; absent required child re-reads are a hold. | +| W1d, T1d | Current native declarations qualify every proposed fill. | +| RM1 | Requires its authoritative enrollment input; no removal without it. | +| GR | Enforced gate and complete resolved gate custody qualify replay. | +| C1 | Required delivery-marker enforcement, amended installed contract and current would-close review must all qualify; no remaining release/install/readback promise may close. | + +C1's current review retains the actual closure guards: populated Delivery/Work level, In review, strictly linked +PRs all merged with none open, last merge beyond the existing 48-hour settle, `fsgg:delivery-completes/v1`, and +no remaining Done-when obligations. No Outcome or Blocked card may close. A missing comparison or unmet native +gate remains a hold; the user authorization replaces elapsed waiting rather than making those assertions true. + +Every run and the 00:30UTC daily record remain private: complete plan, engine summary, exit code, apply-mode +and applied/closed counts, distinct/stable effects, refused inputs and T1i comparison. The daily summarizer counts +malformed plans as unreadable and excludes them from aggregates instead of crashing or treating them as empty. +Both daily units are verified with the main units by the offline fixture. The generated comment body names only +FS-GG/.github references; other references stay in private JSON. The observer itself posts nothing. + +Root monitors scheduled/post-merge outcomes, request/runtime costs and pending markers continuously. No +unresolved send, incomplete plan or unreadable custody can become success through a retry. Failed reads and +safeguard refusals are retained and investigated; hold the affected rule or activation when its safety is Unknown. +This source change performs no installation, timer activation or board write. ## Related user units diff --git a/tests/fdev-board-tend/test_fdev_board_tend.py b/tests/fdev-board-tend/test_fdev_board_tend.py index ef302a988..af8653ea8 100644 --- a/tests/fdev-board-tend/test_fdev_board_tend.py +++ b/tests/fdev-board-tend/test_fdev_board_tend.py @@ -8,6 +8,7 @@ from __future__ import annotations import contextlib +import ast import importlib.util import io import json @@ -109,7 +110,7 @@ def tree(self) -> set[str]: class UnitInstallTests(FakeHome): def install(self, *extra, expect=0): - argv = ["units", "--kit-root", str(self.kit), "--engine-path", str(self.engine), *extra] + argv = ["units", "--kit-root", str(self.kit), "--engine-path", str(self.engine), "--expect-kit-sha256", INSTALL.digest(CONTRACT.encode()), *extra] out, err = io.StringIO(), io.StringIO() with contextlib.redirect_stdout(out), contextlib.redirect_stderr(err): code = INSTALL.main(argv) @@ -208,7 +209,7 @@ def test_refusals(self): moving = self.home / ".local/bin/fsgg-coord-engine" moving.parent.mkdir(parents=True) moving.symlink_to(self.engine) - base = {"--kit-root": str(self.kit), "--engine-path": str(self.engine)} + base = {"--kit-root": str(self.kit), "--engine-path": str(self.engine), "--expect-kit-sha256": INSTALL.digest(CONTRACT.encode())} cases = { "the moving link, not a versioned engine": {"--engine-path": str(moving)}, "a kit root of another release": {"--kit-root": str(self.kit.parent / "kit-0.114.1")}, @@ -230,10 +231,10 @@ def test_refuses_a_kit_root_without_a_contract_and_a_git_workdir(self): for mirror in INSTALL.MIRRORS: (empty / mirror).unlink() with contextlib.redirect_stderr(io.StringIO()) as err: - self.assertEqual(INSTALL.main(["units", "--kit-root", str(empty), "--engine-path", str(self.engine)]), 2) + self.assertEqual(INSTALL.main(["units", "--kit-root", str(empty), "--engine-path", str(self.engine), "--expect-kit-sha256", INSTALL.digest(CONTRACT.encode())]), 2) (self.workdir / ".git").mkdir(parents=True) with contextlib.redirect_stderr(io.StringIO()) as err: - self.assertEqual(INSTALL.main(["units", "--kit-root", str(self.kit), "--engine-path", str(self.engine)]), 2) + self.assertEqual(INSTALL.main(["units", "--kit-root", str(self.kit), "--engine-path", str(self.engine), "--expect-kit-sha256", INSTALL.digest(CONTRACT.encode())]), 2) self.assertIn("git checkouts", err.getvalue()) def test_apply_mode_needs_an_enable_file_that_names_a_rule_and_renders_apply(self): @@ -241,23 +242,39 @@ def test_apply_mode_needs_an_enable_file_that_names_a_rule_and_renders_apply(sel self.enable.write_text('{"apply": ["W1h"]}', encoding="utf-8") self.enable.chmod(0o644) with contextlib.redirect_stderr(io.StringIO()): - self.assertEqual(INSTALL.main(["units", "--kit-root", str(self.kit), "--engine-path", str(self.engine), "--mode", "apply"]), 2) + self.assertEqual(INSTALL.main(["units", "--kit-root", str(self.kit), "--engine-path", str(self.engine), "--expect-kit-sha256", INSTALL.digest(CONTRACT.encode()), "--mode", "apply"]), 2) self.enable.chmod(0o600) self.install("--mode", "apply") self.assertIn(" run --mode apply ", self.directives("fsgg-board-tend.service")) def test_refuses_to_run_as_root(self): with mock.patch.object(INSTALL.os, "geteuid", return_value=0), contextlib.redirect_stderr(io.StringIO()): - self.assertEqual(INSTALL.main(["units", "--kit-root", str(self.kit), "--engine-path", str(self.engine)]), 2) + self.assertEqual(INSTALL.main(["units", "--kit-root", str(self.kit), "--engine-path", str(self.engine), "--expect-kit-sha256", INSTALL.digest(CONTRACT.encode())]), 2) @unittest.skipUnless(shutil.which("systemd-analyze"), "systemd-analyze is not available") def test_systemd_accepts_the_rendered_units(self): self.install() - files = [str(self.unit_dir / n) for n in ("fsgg-board-tend.service", "fsgg-board-tend.timer")] + files = [str(self.unit_dir / n) for n in INSTALL.UNIT_TEMPLATES] done = subprocess.run(["systemd-analyze", "--user", "verify", *files], capture_output=True, text=True, timeout=60, check=False) problems = [l for l in (done.stdout + done.stderr).splitlines() if "fsgg-board-tend" in l and not l.startswith("Could not")] self.assertEqual(problems, [], done.stderr) + def test_custom_xdg_homes_are_identical_in_installer_units_wrapper_and_gate(self): + config, state = self.home / "config-custom", self.home / "state-custom" + self.install("--config-home", str(config), "--state-home", str(state)) + for name in ("fsgg-board-tend.service", "fsgg-board-tend-daily.service"): + text = self.directives(name) + self.assertIn(f"Environment=XDG_CONFIG_HOME={config}\n", text) + self.assertIn(f"Environment=XDG_STATE_HOME={state}\n", text) + self.assertIn(f"--config-home {config} --state-home {state}", text) + # Execute the actual gate's path resolver against the same explicitly pinned environment. + tree = ast.parse((ROOT / "tools/routine-delivery.py").read_text()) + function = next(n for n in tree.body if isinstance(n, ast.FunctionDef) and n.name == "default_board_tend_state_root") + ns = {"os": os, "pathlib": pathlib} + exec(compile(ast.Module(body=[function], type_ignores=[]), "", "exec"), ns) + with mock.patch.dict(os.environ, {"XDG_STATE_HOME": str(state), "XDG_CONFIG_HOME": str(config)}): + self.assertEqual(ns["default_board_tend_state_root"](), state / "fsgg/board-tend") + class TmpCleanupInstallTests(FakeHome): """The hourly dead-run /tmp cleanup timer and the chromium wrapper, installed by their own effects (#5240).""" @@ -464,8 +481,9 @@ def write_config(self): (self.tools / "config.json").write_text(json.dumps(self.config), encoding="utf-8") def args(self, *extra): - return RUN.parser().parse_args(["run", "--engine-path", str(self.engine), "--credentials", str(self.credentials), - "--workdir", str(self.workdir), "--min-interval", "0", *extra]) + return RUN.parser().parse_args(["run", "--engine-path", str(self.engine), "--expect-kit-sha256", INSTALL.digest(CONTRACT.encode()), "--credentials", str(self.credentials), + "--workdir", str(self.workdir), "--config-home", self.env["XDG_CONFIG_HOME"], + "--state-home", self.env["XDG_STATE_HOME"], "--min-interval", "0", *extra]) def go(self, *extra, env=None, cwd=None): out = io.StringIO() @@ -612,7 +630,8 @@ def test_a_failed_run_keeps_the_marker_and_propagates_its_exit_code(self): self.config["exit"] = 3 self.write_config() self.assertEqual(self.go()[0], 3) - self.assertTrue((self.state / RUN.MARKER).exists()) + self.assertTrue((self.state / RUN.CLAIMED_MARKER).exists()) + self.assertFalse((self.state / RUN.MARKER).exists()) self.assertEqual(self.index()[-1]["marker"], "kept-failed") def test_a_second_wrapper_while_one_holds_the_run_lock_does_nothing_and_keeps_the_marker(self): @@ -655,7 +674,7 @@ def test_daily_record_summarises_would_apply_would_close_and_t1i_privately(self) code = io.StringIO() today = RUN.now_utc().date().isoformat() with contextlib.redirect_stdout(code): - self.assertEqual(RUN.command_summarize(RUN.parser().parse_args(["summarize", "--date", today, "--out-dir", str(self.out)]), env=self.env), 0) + self.assertEqual(RUN.command_summarize(RUN.parser().parse_args(["summarize", "--date", today, "--out-dir", str(self.out), "--config-home", self.env["XDG_CONFIG_HOME"], "--state-home", self.env["XDG_STATE_HOME"]]), env=self.env), 0) daily = json.loads((self.out / "daily" / f"{today}.json").read_text()) self.assertEqual((daily["runs"], daily["plansRead"], daily["applyModeRuns"], daily["plansWithApply"]), (2, 2, 0, 0)) self.assertEqual(daily["wouldApplyByRule"]["O1"]["stableAllDay"], 1) @@ -677,6 +696,89 @@ def test_a_day_without_runs_is_recorded_as_zero(self): self.assertEqual((daily["runs"], daily["plansRead"]), (0, 0)) self.assertIn("Runs: 0", RUN.render_comment(daily)) + def test_runtime_rejects_changed_missing_or_checkout_kit_mirrors(self): + mirror = self.kit / INSTALL.MIRRORS[1] + original = mirror.read_text() + mirror.write_text(original + "changed") + self.assertEqual(self.go()[0], 2) + mirror.unlink() + self.assertEqual(self.go()[0], 2) + mirror.write_text(original) + (self.kit / ".git").write_text("gitdir: elsewhere") + self.assertEqual(self.go()[0], 2) + self.assertEqual(self.calls(), []) + + def test_runtime_rejects_wrong_real_engine_version_before_board_call(self): + self.engine.write_text(FAKE_ENGINE.replace('print("0.114.2.0")', 'print("0.114.1.0")')) + self.assertEqual(self.go()[0], 2) + self.assertEqual(self.calls(), []) + + def test_marker_is_claimed_before_work_and_concurrent_pending_is_never_unlinked(self): + self.write_marker() + run_once = RUN.run_once + def work(*args): + self.assertFalse((self.state / RUN.MARKER).exists(), "pending must have been renamed before work") + self.assertTrue((self.state / (RUN.MARKER + ".claimed")).exists()) + return run_once(*args) + with mock.patch.object(RUN, "run_once", side_effect=work): + self.assertEqual(self.go()[0], 0) + + def test_trigger_arriving_at_claim_deletion_survives_and_runs_next_time(self): + self.write_marker() + unlink = RUN.os.unlink + def concurrent(path, *args, **kwargs): + if pathlib.Path(path).name == RUN.CLAIMED_MARKER: + self.write_marker() + return unlink(path, *args, **kwargs) + with mock.patch.object(RUN.os, "unlink", side_effect=concurrent): + self.assertEqual(self.go()[0], 0) + self.assertTrue((self.state / RUN.MARKER).exists()) + self.assertFalse((self.state / RUN.CLAIMED_MARKER).exists()) + self.assertEqual(len(self.calls()), 1) + self.assertEqual(self.go()[0], 0) + self.assertEqual(len(self.calls()), 2) + self.assertFalse((self.state / RUN.MARKER).exists()) + + def test_abandoned_claim_survives_failed_run_and_is_recovered(self): + self.state.mkdir(parents=True, mode=0o700) + (self.state / RUN.CLAIMED_MARKER).write_text("interrupted prior wrapper") + self.config["exit"] = 3; self.write_config() + self.assertEqual(self.go()[0], 3) + self.assertTrue((self.state / RUN.CLAIMED_MARKER).exists()) + self.config["exit"] = 0; self.write_config() + self.assertEqual(self.go("--min-interval", "300")[0], 0) + self.assertEqual(len(self.calls()), 2) + self.assertFalse((self.state / RUN.CLAIMED_MARKER).exists()) + + def test_missing_workdir_and_changed_xdg_homes_refuse_before_board_work(self): + args = ["run", "--engine-path", str(self.engine), "--credentials", str(self.credentials), + "--expect-kit-sha256", INSTALL.digest(CONTRACT.encode()), + "--config-home", self.env["XDG_CONFIG_HOME"], "--state-home", self.env["XDG_STATE_HOME"]] + with contextlib.redirect_stderr(io.StringIO()), self.assertRaises(SystemExit) as error: + RUN.parser().parse_args(args) + self.assertEqual(error.exception.code, 2) + for key in ("XDG_CONFIG_HOME", "XDG_STATE_HOME"): + with self.subTest(key=key): + self.assertEqual(self.go(env=dict(self.env, **{key: str(self.home / "other")}))[0], 2) + self.assertEqual(self.calls(), []) + + def test_wrong_mode_state_directory_is_loud_and_never_runs_engine(self): + self.state.mkdir(parents=True, mode=0o755) + self.state.chmod(0o755) + self.assertEqual(self.go()[0], 2) + self.assertIn("private", self.err) + self.assertEqual(self.calls(), []) + + def test_daily_summary_counts_json_valid_malformed_plans_as_unreadable(self): + self.go() + latest = pathlib.Path(json.loads((self.out / "last-run.json").read_text())["plan"]) + for broken in [{"wouldApply": [None]}, {"wouldClose": [{}]}, {"propose": 42}, + {"refuse": ["bad"]}, {"t1iComparison": {"pairs": "bad", "disagreements": 1}}]: + with self.subTest(broken=broken): + latest.write_text(json.dumps(dict(plan_with(), **broken))) + daily = RUN.summarize(self.out, RUN.now_utc().date().isoformat()) + self.assertEqual((daily["plansRead"], daily["plansUnreadable"]), (0, 1)) + if __name__ == "__main__": unittest.main() From 818ccd34e7c1041eeda5b89c4e914b8703944406 Mon Sep 17 00:00:00 2001 From: rev Date: Mon, 2 Nov 2026 16:36:08 +0100 Subject: [PATCH 3/6] fix: match project option scalar and retain field response custody --- src/FS.GG.Coord.GitHub/V2TendWrite.fs | 35 ++++++++- src/FS.GG.Coord.GitHub/V2TendWrite.fsi | 1 + .../TendFakeGitHub.fs | 20 ++++- .../V2TendWriteTests.fs | 77 +++++++++++++++++++ 4 files changed, 130 insertions(+), 3 deletions(-) diff --git a/src/FS.GG.Coord.GitHub/V2TendWrite.fs b/src/FS.GG.Coord.GitHub/V2TendWrite.fs index 6fcd900c2..a2c4bd387 100644 --- a/src/FS.GG.Coord.GitHub/V2TendWrite.fs +++ b/src/FS.GG.Coord.GitHub/V2TendWrite.fs @@ -58,7 +58,7 @@ module V2TendWrite = |> List.iteri (fun index (fieldId, value) -> let kind, argument = match value with - | OptionValue option -> "ID!", ("v" + string index, VId option) + | OptionValue option -> "String!", ("v" + string index, VString option) | TextValue text -> "String!", ("v" + string index, VString text) declared.Append(sprintf ", $f%d: ID!, $v%d: %s, $c%d: String!" index index kind index) |> ignore let valueShape = match value with OptionValue _ -> sprintf "{singleSelectOptionId: $v%d}" index | TextValue _ -> sprintf "{text: $v%d}" index @@ -351,6 +351,35 @@ module V2TendWrite = record["run"] <- run record["key"] <- key atomicWrite syncDirectory (this.Path key) (record.ToJsonString()) + member internal _.RecordFieldResponse(key: string, request: Request, response: IoResult) = + let record = JsonObject() + record["schema"] <- "fsgg.board-tend-field-response/1" + record["run"] <- run + record["key"] <- key + record["requestSha256"] <- SHA256.HashData(canonicalMutationBytes request) |> Convert.ToHexString |> fun s -> s.ToLowerInvariant() + match response with + | Ok received -> + record["status"] <- received.Status + let bytes = Encoding.UTF8.GetBytes received.Body + record["bodyByteCount"] <- bytes.Length + record["bodyTruncated"] <- bytes.Length > 65536 + record["bodyPrefixBase64"] <- Convert.ToBase64String(bytes, 0, min 65536 bytes.Length) + record["bodySha256"] <- SHA256.HashData(bytes) |> Convert.ToHexString |> fun s -> s.ToLowerInvariant() + let headers = JsonObject() + for name in [ "X-GitHub-Request-Id"; "Retry-After"; "X-RateLimit-Remaining"; "X-RateLimit-Resource" ] do + match received.Headers |> Map.tryPick (fun key value -> if key.Equals(name, StringComparison.OrdinalIgnoreCase) then Some value else None) with + | Some value -> headers[name] <- value.Substring(0, min 256 value.Length) + | None -> () + record["headers"] <- headers + | Error error -> + let detail = Errors.explain error + record["transportError"] <- detail.Substring(0, min 4096 detail.Length) + let directory = Path.Combine(root, run, "responses") + privateDirectory directory + syncDirectory (Path.GetDirectoryName directory) + let path = Path.Combine(directory, keyName key + ".json") + if File.Exists path then invalidOp "field response custody already exists; never replace" + atomicWrite syncDirectory path (record.ToJsonString()) // Every readable record in every run, with its path; malformed files are counted, never trusted. member _.Records() : (string * JsonObject) list * int = if not (Directory.Exists root) then [], 0 @@ -603,7 +632,11 @@ module V2TendWrite = context.Pacer.Before() let sent = context.Send request context.Pacer.After() + let retained = + try context.Custody.RecordFieldResponse(card.ItemId, request, sent); true + with _ -> false match sent with + | _ when not retained -> outcome "uncertain" "response-custody-unavailable" | Error error -> outcome "uncertain" ("send: " + Errors.explain error) | Ok response when not (echoed response card.ItemId (mutationIds request)) -> outcome "uncertain" "send-unconfirmed" | Ok _ -> diff --git a/src/FS.GG.Coord.GitHub/V2TendWrite.fsi b/src/FS.GG.Coord.GitHub/V2TendWrite.fsi index 68b869a5a..90337a862 100644 --- a/src/FS.GG.Coord.GitHub/V2TendWrite.fsi +++ b/src/FS.GG.Coord.GitHub/V2TendWrite.fsi @@ -93,6 +93,7 @@ module V2TendWrite = /// item id for field sends, the issue node id for a close). Written atomically, private, synced. type Custody = new: root: string * run: string * syncDirectory: (string -> unit) -> Custody + member internal RecordFieldResponse: key: string * request: Request * response: IoResult -> unit member Root: string member Run: string member Path: key: string -> string diff --git a/tests/coord-board-v2-projection/TendFakeGitHub.fs b/tests/coord-board-v2-projection/TendFakeGitHub.fs index 0d0f069b1..e98430ddd 100644 --- a/tests/coord-board-v2-projection/TendFakeGitHub.fs +++ b/tests/coord-board-v2-projection/TendFakeGitHub.fs @@ -3,6 +3,7 @@ module FS.GG.Coord.GitHub.Tests.TendFakeGitHub open System open System.Text.Json.Nodes +open System.Text.RegularExpressions open FS.GG.Coord.GitHub open FS.GG.Coord.GitHub.Transport @@ -50,6 +51,14 @@ let fieldDefinitions = let fieldId (name: string) = "F_" + name.Replace(" ", "_") let optionId (field: string) (value: string) = "O_" + field.Replace(" ", "_") + "_" + value.Replace(" ", "_") +/// GitHub ProjectV2FieldValue.singleSelectOptionId is String (not the Node scalar ID). +/// Provider contract, independent of the renderer: https://docs.github.com/en/graphql/reference/projects#projectv2fieldvalue +let validSingleSelectVariables (document: string) (variables: (string * Var) list) = + [ for m in Regex.Matches(document, @"singleSelectOptionId\s*:\s*\$(\w+)") -> m.Groups.[1].Value ] + |> List.forall (fun name -> + Regex.IsMatch(document, @"\$" + Regex.Escape name + @"\s*:\s*String!?(?=\s*[,\)])") + && (variables |> List.exists (function n, VString _ when n = name -> true | _ -> false))) + type Call = { Kind: string; Subject: string; Document: string } type Board(clock: FakeClock) = @@ -222,9 +231,16 @@ type Board(clock: FakeClock) = | _ -> let document, variables = match request.Body with Query(d, v) -> d, v | _ -> failwith "query expected" calls.Add { Kind = "mutation"; Subject = request.Subject; Document = document } - this.BeforeMutation request - if this.FailMutation then Error(Errors.Malformed(request.Subject, "network failure after send")) + if not (validSingleSelectVariables document variables) then + Ok { Status = 200; ETag = None; NextLink = None; Headers = Map.empty + Body = "{\"errors\":[{\"message\":\"Variable type mismatch: singleSelectOptionId requires String\"}]}" } else + this.BeforeMutation request + if this.FailMutation then Error(Errors.Malformed(request.Subject, "network failure after send")) + else + this.MutateValidated(request, document, variables) + + member private this.MutateValidated(request: Request, document: string, variables: (string * Var) list) = let data = JsonObject() if document.Contains "updateProjectV2ItemFieldValue" then let item = items.[this.Text(variables, "item")] diff --git a/tests/coord-board-v2-projection/V2TendWriteTests.fs b/tests/coord-board-v2-projection/V2TendWriteTests.fs index 9ffd1f11e..59b167a00 100644 --- a/tests/coord-board-v2-projection/V2TendWriteTests.fs +++ b/tests/coord-board-v2-projection/V2TendWriteTests.fs @@ -72,6 +72,83 @@ let private request document variables subject : Request = // --------------------------------------------------------------------------------------------------- +[] +let provider_contract_rejects_ID_option_variables_without_effect () = + let board = Board() + board.AddItem("PVTI_a", item "FS-GG/x#10" "I_a" [ "Status", "In progress" ]) + let change = V2TendWrite.SetFieldValue(projectId, "PVTI_a", [ fieldId "Status", V2TendWrite.OptionValue(optionId "Status" "In review") ]) + let rendered = V2TendWrite.render "contract" change |> List.head + let legacy = + match rendered.Body with + | Query(document, variables) -> + { rendered with Body = Query(document.Replace("$v0: String!", "$v0: ID!"), + variables |> List.map (function "v0", VString value -> "v0", VId value | pair -> pair)) } + | _ -> failwith "GraphQL expected" + match legacy.Body with + | Query(d, v) -> Assert.False(validSingleSelectVariables d v) + | _ -> failwith "GraphQL expected" + match board.Mutate legacy with + | Ok response -> Assert.Equal(200, response.Status); Assert.Contains("errors", response.Body) + | Error error -> failwithf "%A" error + Assert.Equal(Some "In progress", board.Items.["PVTI_a"].Values.TryFind "Status") + match rendered.Body with + | Query(d, v) -> Assert.True(validSingleSelectVariables d v, "rendered option variable must match the independent provider input contract") + | _ -> failwith "GraphQL expected" + match board.Mutate rendered with + | Ok response -> Assert.DoesNotContain("errors", response.Body) + | Error error -> failwithf "%A" error + Assert.Equal(Some "In review", board.Items.["PVTI_a"].Values.TryFind "Status") + +[] +let field_error_response_is_retained_privately_and_does_not_clear_uncertainty () = + let root = temporary () + try + let board = Board() + board.AddItem("PVTI_a", item "FS-GG/x#10" "I_a" [ "Status", "Ready" ]) + let h = harness "response-errors" root board + let body = "{\"errors\":[{\"message\":\"validation rejected\"}]}" + String(' ', 70000) + let reply = { Status = 200; ETag = None; NextLink = None; Headers = Map.ofList [ "X-GitHub-Request-Id", "fixture-request"; "Set-Cookie", "never retain" ]; Body = body } + let bad = { h with Context = { h.Context with Send = fun _ -> Ok reply } } + let outcomes = run bad (plan [ effect "T1f:a" "PVTI_a" "FS-GG/x#10" V2Tend.TrackField None "Follow-up" [ "T1f" ] [] ] []) (snapshotOf board []) + Assert.Equal("uncertain", outcomes.Head.Result) + Assert.Equal("send-unconfirmed", outcomes.Head.Detail) + let files = Directory.GetFiles(Path.Combine(root, "tend", "response-errors", "responses"), "*.json") + Assert.Single files |> ignore + let evidence = JsonNode.Parse(File.ReadAllText files.[0]) + Assert.Equal(200, evidence["status"].GetValue()) + Assert.True(evidence["bodyTruncated"].GetValue()) + let prefix = Convert.FromBase64String(string evidence["bodyPrefixBase64"]) + Assert.Equal(65536, prefix.Length) + Assert.Contains("validation rejected", Text.Encoding.UTF8.GetString prefix) + Assert.Equal("fixture-request", string (evidence["headers"]["X-GitHub-Request-Id"])) + Assert.Null(evidence["headers"]["Set-Cookie"]) + Assert.Equal(UnixFileMode.UserRead ||| UnixFileMode.UserWrite, File.GetUnixFileMode files.[0]) + let before = File.ReadAllBytes(h.Context.Custody.Path "PVTI_a") + let held, _ = V2TendWrite.sweepOwn h.Context + Assert.Contains("PVTI_a", held) + Assert.Equal(before, File.ReadAllBytes(h.Context.Custody.Path "PVTI_a")) + Assert.Empty(board.Mutations) + Assert.Equal(0, snd (h.Context.Custody.Records())) + finally Directory.Delete(root, true) + +[] +let field_response_retention_failure_stays_uncertain_after_one_send () = + let root = temporary () + try + let board = Board() + board.AddItem("PVTI_a", item "FS-GG/x#10" "I_a" [ "Status", "Ready" ]) + let h = harness "blocked-response" root board + let runDirectory = Path.Combine(root, "tend", "blocked-response") + Directory.CreateDirectory runDirectory |> ignore + File.WriteAllText(Path.Combine(runDirectory, "responses"), "fixture blocks private response directory") + let outcomes = run h (plan [ effect "T1f:a" "PVTI_a" "FS-GG/x#10" V2Tend.TrackField None "Follow-up" [ "T1f" ] [] ] []) (snapshotOf board []) + Assert.Equal("uncertain", outcomes.Head.Result) + Assert.Equal("response-custody-unavailable", outcomes.Head.Detail) + Assert.Single board.Mutations |> ignore + let record = JsonNode.Parse(File.ReadAllText(h.Context.Custody.Path "PVTI_a")) + Assert.Equal("possible-send", string record["state"]) + finally Directory.Delete(root, true) + [] let ``the allowlist refuses hand-written issue and foreign mutations before dispatch`` () = let board = Board() From 2772aad4c7fe88a2bb8bef61134cdd3a85237607 Mon Sep 17 00:00:00 2001 From: rev Date: Mon, 2 Nov 2026 16:59:30 +0100 Subject: [PATCH 4/6] fix: admit only proven no-effect tend incident settlements --- docs/coordination/board-tend-fdev-units.md | 43 +++++ .../FS.GG.Coord.GitHub.fsproj | 4 + src/FS.GG.Coord.GitHub/V2TendFieldRecovery.fs | 78 ++++++++ .../V2TendFieldRecovery.fsi | 11 ++ src/FS.GG.Coord.GitHub/V2TendNoEffect.fs | 167 ++++++++++++++++++ src/FS.GG.Coord.GitHub/V2TendNoEffect.fsi | 34 ++++ src/FS.GG.Coord.GitHub/V2TendWrite.fs | 11 +- src/FS.GG.Coord.GitHub/V2TendWrite.fsi | 2 + .../V2TendNoEffectTests.fs | 163 +++++++++++++++++ .../coord-board-v2-projection.fsproj | 1 + .../test_tend_field_recovery_controller.py | 71 ++++++++ tools/tend-field-validation-settle.fsx.in | 39 ++++ tools/tend-field-validation-settle.py | 93 ++++++++++ 13 files changed, 715 insertions(+), 2 deletions(-) create mode 100644 src/FS.GG.Coord.GitHub/V2TendFieldRecovery.fs create mode 100644 src/FS.GG.Coord.GitHub/V2TendFieldRecovery.fsi create mode 100644 src/FS.GG.Coord.GitHub/V2TendNoEffect.fs create mode 100644 src/FS.GG.Coord.GitHub/V2TendNoEffect.fsi create mode 100644 tests/coord-board-v2-projection/V2TendNoEffectTests.fs create mode 100644 tests/fdev-board-tend/test_tend_field_recovery_controller.py create mode 100644 tools/tend-field-validation-settle.fsx.in create mode 100644 tools/tend-field-validation-settle.py diff --git a/docs/coordination/board-tend-fdev-units.md b/docs/coordination/board-tend-fdev-units.md index dea83a3d5..90f3f957e 100644 --- a/docs/coordination/board-tend-fdev-units.md +++ b/docs/coordination/board-tend-fdev-units.md @@ -194,6 +194,49 @@ unresolved send, incomplete plan or unreadable custody can become success throug safeguard refusals are retained and investigated; hold the affected rule or activation when its safety is Unknown. This source change performs no installation, timer activation or board write. +## The 2026-11-02 option-scalar incident (#5206) + +The first apply with the published0.114.3 engine returned three `send-unconfirmed` field outcomes. The original +provider bodies were not retained and remain Unknown. An offline reconstruction using the authenticated installed +assemblies reproduced all three complete requests; their `singleSelectOptionId` variables were declared `ID!`, +while the live read-only GitHub input schema reports `String`. Independent native readback found the original +Status preimages unchanged. The repaired renderer uses `String!`/`VString`. Selected field sends now retain +private response status, request/body hashes, a bounded64KiB body prefix and bounded allowlisted headers before +echo classification. Retention failure leaves the send uncertain. This does not change GR, C1 or O1. + +Keep **the installed service in plan-only mode** until the corrected engine is qualified; stopping only its timer +cannot prevent a post-merge trigger from starting it. Preserve the original possible-send records. An unchanged +Status alone does not prove no effect, and no operator may delete or rewrite custody merely to unblock a retry. + +The incident-specific `V2TendFieldRecovery.admit` API and checked `tools/tend-field-validation-settle.py` controller +provide a separate local no-effect settlement. This is restricted by source-pinned hashes to the three original +records, incident run, authenticated old runtime and independently reconstructed canonical requests. No private +card identities, paths, body contents or credentials are embedded in the source allowlist. Production admission +takes the actual Project3 writer lock, refreshes native schema and item/project/content/ref/field/preimage evidence, +reconstructs the entire known-invalid request and requires byte equality with the authenticated installed-renderer +proof. Arbitrary request JSON, a supplied readback or a Root string cannot admit another original. + +The controller previews by default: exact qualified runtime/SDK hashes and private input modes are checked, with +no child process, provider read or certificate. Root supplies the reviewed qualified engine runtime directory, +original runtime directory, original custody and reconstructed-request artifacts, exact hashes, existing private +credentials, a fresh private output directory and the native #5206 admission-comment URL. Only explicit `--admit` +launches the typed read-only admission. Run it under the admitted one-CPU/2GiB bound. Its child is capped120seconds; +stdout/stderr/config stay0700/0600 private, and no mutation transport is ever invoked. + +Success appends0600 evidence and a final certificate with O_EXCL and file/directory fsync beneath the private +custody root's `no-effect-settlements//`. The bundle joins exact original/request/runtime/schema/ +fresh-readback hashes and Root's admission reference. A conflict, partial write, stale artifact or missing proof +keeps the original fenced. The original file is never replaced, renamed or marked target-verified. A valid +certificate is terminal for that original: subsequent `sweepOwn` neither re-reads nor rewrites it, including after +a later valid write changes the preimage. Missing/tampered evidence instead fences without rewriting the incident +original, even if its former target is now observed. + +After settlement a corrected, separately admitted engine run derives a fresh plan and uses new run/request/custody +identities, adjacent reads, one send, retained response and native readback. It never resubmits the invalid original. +The normal coherent successor release and qualified published-engine adoption remain prerequisites; the checked +controller does not install an unpublished hotfix or replace published0.114.3 bytes. Root owns settlement and +activation/readback, separately from source integration. A local certificate establishes no native Status change. + ## Related user units `fsgg-tmp-cleanup.{service,timer}` (hourly dead-run `/tmp` cleanup, #5240) are templated here and installed by their own diff --git a/src/FS.GG.Coord.GitHub/FS.GG.Coord.GitHub.fsproj b/src/FS.GG.Coord.GitHub/FS.GG.Coord.GitHub.fsproj index 01fd8cccc..3fa5f7907 100644 --- a/src/FS.GG.Coord.GitHub/FS.GG.Coord.GitHub.fsproj +++ b/src/FS.GG.Coord.GitHub/FS.GG.Coord.GitHub.fsproj @@ -101,12 +101,16 @@ + + + + diff --git a/src/FS.GG.Coord.GitHub/V2TendFieldRecovery.fs b/src/FS.GG.Coord.GitHub/V2TendFieldRecovery.fs new file mode 100644 index 000000000..879837773 --- /dev/null +++ b/src/FS.GG.Coord.GitHub/V2TendFieldRecovery.fs @@ -0,0 +1,78 @@ +namespace FS.GG.Coord.GitHub + +open System +open System.Security.Cryptography +open System.Text +open System.Text.Json.Nodes +open Transport + +module V2TendFieldRecovery = + let private project = "PVT_kwDOEYAWY84Bldpa" + let private text (node: JsonNode) (name: string) = node[name].GetValue() + + let internal reconstruct (record: JsonObject) = + let item = text record "itemId" + let key = SHA256.HashData(Encoding.UTF8.GetBytes(item.ToLowerInvariant())) |> Convert.ToHexString |> fun s -> s.Substring(0, 32).ToLowerInvariant() + let fields = record["fields"].AsArray() + if fields.Count <> 1 || text (fields[0]) "field" <> "Status" then invalidOp "not this incident field shape" + let change = V2TendWrite.SetFieldValue(project, item, [ text (fields[0]) "fieldId", V2TendWrite.OptionValue(text (fields[0]) "value") ]) + let request = V2TendWrite.render ("tend-" + text record "run" + "-" + key) change |> List.head + let legacy = + match request.Body with + | Query(document, variables) -> + { request with Body = Query(document.Replace("$v0: String!", "$v0: ID!"), + variables |> List.map (function "v0", VString s -> "v0", VId s | pair -> pair)) } + | _ -> invalidOp "not GraphQL" + // Must equal the independently authenticated installed-assembly reconstruction hash in the incident policy. + canonicalMutationBytes legacy + + let internal readCurrent reads (record: JsonObject) = + match V2TendWrite.readItem reads (text record "itemId") [] with + | Error error -> Error error + | Ok item -> + let matches = + item.ItemId = text record "itemId" && item.ProjectId = project && item.Ref = text record "ref" && not item.Archived && item.ContentId <> "" + && (record["fields"].AsArray() |> Seq.forall (fun field -> + item.Named.TryFind(text field "field") = Some(text field "preimage") + && (item.Fields |> List.exists (fun schema -> + schema.Id = text field "fieldId" && schema.Name = text field "field" && schema.DataType = "SINGLE_SELECT" + && (schema.Options |> List.contains (text field "value", text field "target")) + && (match item.Values.TryFind(text field "fieldId") with + | Some raw -> + let value = JsonNode.Parse raw + text value "name" = text field "preimage" + && (schema.Options |> List.contains (text value "optionId", text field "preimage")) + | None -> false))))) + if not matches then Error "current identity, field schema or preimage differs" + else + let current = JsonObject() + current["projectId"] <- item.ProjectId + current["itemId"] <- item.ItemId + current["contentId"] <- item.ContentId + current["ref"] <- item.Ref + current["archived"] <- item.Archived + current["fields"] <- record["fields"].DeepClone() + let values = JsonObject() + for field in record["fields"].AsArray() do + let id = text field "fieldId" + values[id] <- JsonNode.Parse(item.Values[id]) + current["fieldValues"] <- values + Ok(current.ToJsonString()) + + let admit reads syncDirectory input = + let dependencies : V2TendNoEffect.Admission = + { Acquire = fun () -> + V2WriterLock.production project V2WriterLock.migrationLegacyName + |> Result.defaultWith invalidOp |> V2WriterLock.acquire + ReadCurrent = readCurrent reads + ReadSchema = fun () -> + let request = + { Method = "POST"; Path = "graphql"; Query = []; Budget = GraphQl; IfNoneMatch = None; Subject = "tend option schema" + Body = Query("query { __type(name: \"ProjectV2FieldValue\") { name kind inputFields { name type { kind name } } } }", []) } + match reads.Send request with + | Ok response when response.Status = 200 -> Ok response.Body + | _ -> Error "provider schema unreadable" + Reconstruct = reconstruct + SyncDirectory = syncDirectory + Clock = TimeProvider.System } + V2TendNoEffect.admitWith V2TendNoEffect.policy dependencies input diff --git a/src/FS.GG.Coord.GitHub/V2TendFieldRecovery.fsi b/src/FS.GG.Coord.GitHub/V2TendFieldRecovery.fsi new file mode 100644 index 000000000..27c6c5c47 --- /dev/null +++ b/src/FS.GG.Coord.GitHub/V2TendFieldRecovery.fsi @@ -0,0 +1,11 @@ +namespace FS.GG.Coord.GitHub + +/// One incident-specific, read-only provider qualification followed by a private append-only no-effect certificate. +/// The caller supplies a read transport; this API never has or calls a mutation sender. +module V2TendFieldRecovery = + val internal reconstruct: record: System.Text.Json.Nodes.JsonObject -> byte array + val internal readCurrent: + reads: Transport.IGitHubTransport -> record: System.Text.Json.Nodes.JsonObject -> Result + val admit: + reads: Transport.IGitHubTransport -> syncDirectory: (string -> unit) -> + input: V2TendNoEffect.Input -> Result diff --git a/src/FS.GG.Coord.GitHub/V2TendNoEffect.fs b/src/FS.GG.Coord.GitHub/V2TendNoEffect.fs new file mode 100644 index 000000000..104065693 --- /dev/null +++ b/src/FS.GG.Coord.GitHub/V2TendNoEffect.fs @@ -0,0 +1,167 @@ +namespace FS.GG.Coord.GitHub + +open System +open System.IO +open System.Security.Cryptography +open System.Text.Json.Nodes +open System.Text.RegularExpressions + +module V2TendNoEffect = + type Input = + { CustodyRoot: string; OriginalPath: string; RequestPath: string + OriginalRuntimeDirectory: string; RootAdmissionReference: string } + + type internal Policy = + { Run: string; Attempts: Map; Assemblies: Map } + + type internal Admission = + { Acquire: unit -> IDisposable + ReadCurrent: JsonObject -> Result + ReadSchema: unit -> Result + Reconstruct: JsonObject -> byte array + SyncDirectory: string -> unit + Clock: TimeProvider } + + // Hashes only: no native card identities, private paths, credentials or provider bodies. + // Independently checked against the exact installed renderer/serializer, not a submitted invalid mutation. + let internal policy = + { Run = "20261102T151514Z-a8647ab2" + Attempts = Map.ofList [ + "8b34745184192a2b19f514a5094e71958f3ab12aa559bbeb3ecbb0d4d4dea1be", "ec8943ab2051b67fda77e63fa3d126ddd3852fb6bc96c6a24e69f4906ea08321" + "b58a289c8371b5b4b017fdc95879ada31fd52244995fd810732d19855000aef6", "0b4e095820f6a8f2e520582f88bd9196bc253750d790a46e0f5d3bff0a0af976" + "dd0f01e00075f0cb253123a8e7954611564761c7c424b6d3f4446d13f3a42c29", "dd009cf06175cc0e573070a1d5c5755045c836ccf38b3b8825d0e77297e54f05" ] + Assemblies = Map.ofList [ + "FS.GG.Coord.GitHub.dll", "b919d9cab57ba576f7c74ff3a8fa8c14c7b211d8c9c5287a11ed74e29afb6e7a" + "FS.GG.Coord.Core.dll", "2085393d3dd625ecc2aef0c5e0fb7a477cffb7f19589bbad4470bf33ce2ee9e3" + "fsgg-coord-engine.dll", "6afa1c615234b59a70cf140e1079af1d386621181803033349944138b0800cae" ] } + + let private project = "PVT_kwDOEYAWY84Bldpa" + let internal digest (bytes: byte array) = SHA256.HashData bytes |> Convert.ToHexString |> _.ToLowerInvariant() + let private read (path: string) = + let info = FileInfo path + if info.LinkTarget <> null || info.Length > 16L * 1024L * 1024L then invalidOp "invalid evidence file" + File.ReadAllBytes path + let private json (bytes: byte array) = JsonNode.Parse(Text.Encoding.UTF8.GetString bytes).AsObject() + let private text (node: JsonNode) (name: string) = node[name].GetValue() + let private privateFile (path: string) = + if not (OperatingSystem.IsWindows()) && File.GetUnixFileMode path <> (UnixFileMode.UserRead ||| UnixFileMode.UserWrite) then invalidOp "private evidence required" + read path + let private directory (path: string) = + if DirectoryInfo(path).LinkTarget <> null then invalidOp "symlink directory" + Directory.CreateDirectory(path, UnixFileMode.UserRead ||| UnixFileMode.UserWrite ||| UnixFileMode.UserExecute) |> ignore + if File.GetUnixFileMode path <> (UnixFileMode.UserRead ||| UnixFileMode.UserWrite ||| UnixFileMode.UserExecute) then invalidOp "private directory required" + let private append (sync: string -> unit) (path: string) (bytes: byte array) = + let options = FileStreamOptions(Mode = FileMode.CreateNew, Access = FileAccess.Write, Share = FileShare.None, + Options = FileOptions.WriteThrough, UnixCreateMode = Nullable(UnixFileMode.UserRead ||| UnixFileMode.UserWrite)) + use stream = new FileStream(path, options) + stream.Write(bytes, 0, bytes.Length) + stream.Flush true + sync (Path.GetDirectoryName path) + let private bytes (value: JsonNode) = Text.Encoding.UTF8.GetBytes(value.ToJsonString()) + let private schemaValid (value: JsonObject) = + try + let root = value["data"]["__type"] + root["kind"].GetValue() = "INPUT_OBJECT" + && root["name"].GetValue() = "ProjectV2FieldValue" + && (root["inputFields"].AsArray() |> Seq.exists (fun f -> + text f "name" = "singleSelectOptionId" && text (f["type"]) "kind" = "SCALAR" && text (f["type"]) "name" = "String")) + && value["errors"] = null + with _ -> false + let private expectedPath (root: string) (p: Policy) (original: string) = + Path.GetDirectoryName(Path.GetFullPath original) = Path.Combine(Path.GetFullPath root, p.Run) + let private proofDirectory (root: string) (sha: string) = Path.Combine(root, "no-effect-settlements", sha) + let internal isIncident (path: string) = Path.GetFileName(Path.GetDirectoryName path) = policy.Run + + let private readbackValid (original: JsonObject) (current: JsonObject) = + try + text current "projectId" = project && text current "itemId" = text original "itemId" + && text current "ref" = text original "ref" && not (String.IsNullOrWhiteSpace(text current "contentId")) + && current["archived"].GetValue() = false + && current["fields"].ToJsonString() = original["fields"].ToJsonString() + && (original["fields"].AsArray() |> Seq.forall (fun field -> + let value = current["fieldValues"][text field "fieldId"] + text value "__typename" = "ProjectV2ItemFieldSingleSelectValue" + && text (value["field"]) "id" = text field "fieldId" + && text value "name" = text field "preimage" && not (String.IsNullOrWhiteSpace(text value "optionId")))) + with _ -> false + + let internal settledWith (p: Policy) root path = + try + let originalBytes = privateFile path + let originalSha = digest originalBytes + match p.Attempts.TryFind originalSha with + | None -> false + | Some requestSha -> + let original = json originalBytes + let folder = proofDirectory root originalSha + let certificate = json (privateFile (Path.Combine(folder, "certificate.json"))) + let expectedAssets = set ([ "original.json"; "request.json"; "schema.json"; "readback.json" ] @ (p.Assemblies |> Map.keys |> List.ofSeq)) + let assets = certificate["assets"].AsObject() + expectedPath root p path && text original "run" = p.Run && text original "kind" = "fields" + && text original "state" = "possible-send" + && text certificate "schema" = "fsgg.tend-no-effect-certificate/1" + && text certificate "incidentRun" = p.Run && text certificate "originalSha256" = originalSha + && text certificate "disposition" = "not-executed-invalid-option-scalar" + && Regex.IsMatch(text certificate "rootAdmissionReference", @"^https://github\.com/FS-GG/\.github/issues/5206#issuecomment-\d+$") + && (assets |> Seq.map _.Key |> Set.ofSeq) = expectedAssets + && (assets |> Seq.forall (fun property -> digest (privateFile (Path.Combine(folder, property.Key))) = property.Value.GetValue())) + && text assets "original.json" = originalSha && text assets "request.json" = requestSha + && (p.Assemblies |> Map.forall (fun name sha -> text assets name = sha)) + && schemaValid (json (privateFile (Path.Combine(folder, "schema.json")))) + && readbackValid original (json (privateFile (Path.Combine(folder, "readback.json")))) + with _ -> false + + let internal settled root path = settledWith policy root path + + let internal admitWith (p: Policy) (deps: Admission) (input: Input) = + try + // All deciding provider reads occur inside the actual writer exclusion selected by the controller. + use lease = deps.Acquire() + let originalBytes = privateFile input.OriginalPath + let originalSha = digest originalBytes + let requestSha = p.Attempts.TryFind originalSha |> Option.defaultWith (fun () -> invalidOp "not an admitted incident attempt") + if not (expectedPath input.CustodyRoot p input.OriginalPath) then invalidOp "wrong custody run" + let original = json originalBytes + if text original "schema" <> "fsgg.board-tend-custody/1" || text original "run" <> p.Run + || text original "kind" <> "fields" || text original "state" <> "possible-send" then invalidOp "wrong original custody kind" + if not (Regex.IsMatch(input.RootAdmissionReference, @"^https://github\.com/FS-GG/\.github/issues/5206#issuecomment-\d+$")) then invalidOp "Root admission reference required" + let request = read input.RequestPath + if digest request <> requestSha || digest (deps.Reconstruct original) <> requestSha then invalidOp "original request reconstruction differs" + let assemblyBytes = p.Assemblies |> Map.map (fun name expected -> + let value = read (Path.Combine(input.OriginalRuntimeDirectory, name)) + if digest value <> expected then invalidOp "original runtime identity differs" + value) + let providerSchema = deps.ReadSchema() |> Result.defaultWith invalidOp + if not (schemaValid (JsonNode.Parse(providerSchema).AsObject())) then invalidOp "provider input scalar is not String" + let current = deps.ReadCurrent original |> Result.defaultWith invalidOp + if not (readbackValid original (JsonNode.Parse(current).AsObject())) then invalidOp "current identity or preimage differs" + let parent = Path.Combine(input.CustodyRoot, "no-effect-settlements") + directory parent + deps.SyncDirectory input.CustodyRoot + let folder = proofDirectory input.CustodyRoot originalSha + if Directory.Exists folder || File.Exists folder then invalidOp "existing settlement evidence; no replacement" + directory folder + deps.SyncDirectory parent + let artifacts = Map.ofList [ "original.json", originalBytes; "request.json", request + "schema.json", Text.Encoding.UTF8.GetBytes providerSchema + "readback.json", Text.Encoding.UTF8.GetBytes current ] + |> Map.fold (fun (values: Map) key value -> values.Add(key, value)) assemblyBytes + let assets = JsonObject() + for KeyValue(name, value) in artifacts do + append deps.SyncDirectory (Path.Combine(folder, name)) value + assets[name] <- digest value + let certificate = JsonObject() + certificate["schema"] <- "fsgg.tend-no-effect-certificate/1" + certificate["incidentRun"] <- p.Run + certificate["originalSha256"] <- originalSha + certificate["disposition"] <- "not-executed-invalid-option-scalar" + certificate["rootAdmissionReference"] <- input.RootAdmissionReference + certificate["admittedAt"] <- deps.Clock.GetUtcNow().ToString("o") + certificate["originalResponse"] <- "Unknown; no provider body or wire capture retained" + certificate["assets"] <- assets + let destination = Path.Combine(folder, "certificate.json") + append deps.SyncDirectory destination (bytes certificate) + Ok destination + with error -> + let detail = error.Message.Substring(0, min 2048 error.Message.Length) + Error("no-effect settlement refused; preserve originals: " + detail) diff --git a/src/FS.GG.Coord.GitHub/V2TendNoEffect.fsi b/src/FS.GG.Coord.GitHub/V2TendNoEffect.fsi new file mode 100644 index 000000000..b9a8f1411 --- /dev/null +++ b/src/FS.GG.Coord.GitHub/V2TendNoEffect.fsi @@ -0,0 +1,34 @@ +namespace FS.GG.Coord.GitHub + +/// Closed recovery for the three invalid option-scalar requests in the 2026-11-02 incident (#5206). +/// Certificates acknowledge no execution; they never assert a target was written or authorize a resend. +module V2TendNoEffect = + open System + open System.Text.Json.Nodes + + type Input = + { CustodyRoot: string + OriginalPath: string + RequestPath: string + OriginalRuntimeDirectory: string + RootAdmissionReference: string } + + type internal Policy = + { Run: string + Attempts: Map + Assemblies: Map } + + type internal Admission = + { Acquire: unit -> IDisposable + ReadCurrent: JsonObject -> Result + ReadSchema: unit -> Result + Reconstruct: JsonObject -> byte array + SyncDirectory: string -> unit + Clock: TimeProvider } + + val internal policy: Policy + val internal digest: bytes: byte array -> string + val internal isIncident: path: string -> bool + val internal settled: root: string -> path: string -> bool + val internal settledWith: p: Policy -> root: string -> path: string -> bool + val internal admitWith: p: Policy -> deps: Admission -> input: Input -> Result diff --git a/src/FS.GG.Coord.GitHub/V2TendWrite.fs b/src/FS.GG.Coord.GitHub/V2TendWrite.fs index a2c4bd387..afd6c7eec 100644 --- a/src/FS.GG.Coord.GitHub/V2TendWrite.fs +++ b/src/FS.GG.Coord.GitHub/V2TendWrite.fs @@ -858,7 +858,7 @@ module V2TendWrite = // Read back every `possible-send` record of the reconciler's own custody; a proven target rewrites it to // `verified`. Never sends. Returns the keys still uncertain. - let sweepOwn (context: Context) : Set * Outcome list = + let internal sweepOwnUsing isIncident isSettled (context: Context) : Set * Outcome list = let records, malformed = context.Custody.Records() let outcomes = [ for path, record in records do @@ -869,8 +869,11 @@ module V2TendWrite = // reported by item, so an uncertain close also blocks the item's field writes and its next close. let held = record["itemId"] |> Option.ofObj |> Option.map string |> Option.defaultValue key let reference = record["ref"] |> Option.ofObj |> Option.map string |> Option.defaultValue "" + let incident = isIncident path + let acceptedNoEffect = incident && isSettled context.Custody.Root path let proven = match kind with + | _ when incident -> false // incident originals are immutable, even if evidence later disappears | "fields" -> match readItem context.Reads (string record["itemId"]) [] with | Ok item -> @@ -885,7 +888,9 @@ module V2TendWrite = && (obj data "comment" |> Option.bind (fun c -> str c "body") |> Option.exists (fun b -> b.Contains tendClosedMarker)))) |> Result.defaultValue false | _ -> false - if proven then + if acceptedNoEffect then + yield held, { Subject = key; Ref = reference; Kind = "sweep"; Result = "root-settled-no-effect"; Detail = kind } + elif proven then record["state"] <- "verified" record["verifiedAt"] <- context.Clock.GetUtcNow().ToString("o") (try context.Custody.Rewrite(path, record) with _ -> ()) @@ -895,6 +900,8 @@ module V2TendWrite = let malformedOutcome = if malformed > 0 then [ { Subject = "custody"; Ref = ""; Kind = "sweep"; Result = "malformed"; Detail = string malformed } ] else [] uncertain, (outcomes |> List.map snd) @ malformedOutcome + let sweepOwn context = sweepOwnUsing V2TendNoEffect.isIncident V2TendNoEffect.settled context + // ---- GR: replay of the merge gate's deferred records (design §6) ---- let private gateOrder (record: GateRecord) = match record.MergedAt with Some m -> 1, m | None -> 0, "" diff --git a/src/FS.GG.Coord.GitHub/V2TendWrite.fsi b/src/FS.GG.Coord.GitHub/V2TendWrite.fsi index 90337a862..78c8cdaed 100644 --- a/src/FS.GG.Coord.GitHub/V2TendWrite.fsi +++ b/src/FS.GG.Coord.GitHub/V2TendWrite.fsi @@ -197,6 +197,8 @@ module V2TendWrite = /// item as well as its issue, so an uncertain close blocks every later write to that item), and one outcome /// per record. val sweepOwn: context: Context -> Set * Outcome list + val internal sweepOwnUsing: + isIncident: (string -> bool) -> isSettled: (string -> string -> bool) -> context: Context -> Set * Outcome list /// The merge gate's custody pass (GR), under the writer lock: a read-only sweep of `possible-send` records, /// then, when `replay`, supersession per Delivery by `mergedAt` and one guarded send for each Delivery's diff --git a/tests/coord-board-v2-projection/V2TendNoEffectTests.fs b/tests/coord-board-v2-projection/V2TendNoEffectTests.fs new file mode 100644 index 000000000..f2b7dc185 --- /dev/null +++ b/tests/coord-board-v2-projection/V2TendNoEffectTests.fs @@ -0,0 +1,163 @@ +/// Synthetic incident policy and native-read ports; no original private incident artifacts are included. +module FS.GG.Coord.GitHub.Tests.V2TendNoEffectTests + +open System +open System.IO +open System.Text +open System.Text.Json.Nodes +open Xunit +open FS.GG.Coord.GitHub +open FS.GG.Coord.GitHub.Tests.TendFakeGitHub + +type private Fixture() = + let root = Path.Combine(Path.GetTempPath(), "tend-settlement-" + Guid.NewGuid().ToString("N")) + let mode = UnixFileMode.UserRead ||| UnixFileMode.UserWrite + let run = "synthetic-incident" + let board = Board() + let custody = V2TendWrite.Custody(Path.Combine(root, "tend"), run, ignore) + let original = JsonObject() + let field = JsonObject() + let mutable held = false + let mutable schemas = 0 + let mutable schema = "{\"data\":{\"__type\":{\"name\":\"ProjectV2FieldValue\",\"kind\":\"INPUT_OBJECT\",\"inputFields\":[{\"name\":\"singleSelectOptionId\",\"type\":{\"kind\":\"SCALAR\",\"name\":\"String\"}}]}}}" + do + Directory.CreateDirectory(root, mode ||| UnixFileMode.UserExecute) |> ignore + board.AddItem("PVTI_fixture", { ContentId = "I_fixture"; Ref = "FS-GG/fixture#1"; Open = true; StateReason = None; + Parent = None; Values = Map.ofList [ "Status", "In progress" ]; Archived = false }) + original["kind"] <- "fields"; original["state"] <- "possible-send" + original["itemId"] <- "PVTI_fixture"; original["ref"] <- "FS-GG/fixture#1" + field["field"] <- "Status"; field["fieldId"] <- fieldId "Status" + field["preimage"] <- "In progress"; field["target"] <- "In review"; field["value"] <- optionId "Status" "In review" + original["fields"] <- JsonArray(field) + custody.Write("PVTI_fixture", original) + let path = custody.Path "PVTI_fixture" + let originalBytes = File.ReadAllBytes path + let request = V2TendFieldRecovery.reconstruct original + let requestPath = Path.Combine(root, "request.json") + let runtime = Path.Combine(root, "runtime") + let assemblies = Map.ofList [ "original.dll", Encoding.UTF8.GetBytes "synthetic qualified original assembly" ] + let policy : V2TendNoEffect.Policy = + { Run = run; Attempts = Map.ofList [ V2TendNoEffect.digest originalBytes, V2TendNoEffect.digest request ] + Assemblies = assemblies |> Map.map (fun _ value -> V2TendNoEffect.digest value) } + let location = V2WriterLock.inDirectory (Path.Combine(root, "test-locks")) projectId V2WriterLock.migrationLegacyName + do + Directory.CreateDirectory runtime |> ignore + File.WriteAllBytes(requestPath, request) + for KeyValue(name, value) in assemblies do File.WriteAllBytes(Path.Combine(runtime, name), value) + member _.Root = root + member _.Run = run + member _.Board = board + member _.Path = path + member _.OriginalBytes = originalBytes + member _.Custody = custody + member _.Policy = policy + member _.Location = location + member _.SchemaCalls = schemas + member _.Schema with get() = schema and set value = schema <- value + member _.Input : V2TendNoEffect.Input = + { CustodyRoot = custody.Root; OriginalPath = path; RequestPath = requestPath; OriginalRuntimeDirectory = runtime + RootAdmissionReference = "https://github.com/FS-GG/.github/issues/5206#issuecomment-1" } + member _.Dependencies : V2TendNoEffect.Admission = + { Acquire = fun () -> + let lease = V2WriterLock.acquire location + held <- true + { new IDisposable with member _.Dispose() = held <- false; lease.Dispose() } + ReadCurrent = fun record -> Assert.True held; V2TendFieldRecovery.readCurrent board.Transport record + ReadSchema = fun () -> Assert.True held; schemas <- schemas + 1; Ok schema + Reconstruct = V2TendFieldRecovery.reconstruct + SyncDirectory = ignore + Clock = board.Clock } + member this.Admit() = V2TendNoEffect.admitWith policy this.Dependencies this.Input + member _.Context : V2TendWrite.Context = + { Reads = board.Transport; Send = board.Mutate; Custody = V2TendWrite.Custody(custody.Root, "fresh-run", ignore) + Gate = V2TendWrite.GateCustody(Path.Combine(root, "gate"), ignore); Clock = board.Clock + Pacer = V2TendWrite.Pacer(board.Clock, ignore, TimeSpan.Zero); Closable = Collections.Generic.HashSet() + Settings = V2TendWrite.defaultSettings projectId Set.empty } + member _.Incident path = Path.GetFileName(Path.GetDirectoryName(path: string)) = run + interface IDisposable with member _.Dispose() = Directory.Delete(root, true) + +[] +let certificate_is_append_only_private_and_never_rewrites_the_original () = + use f = new Fixture() + let certificate = f.Admit() |> Result.defaultWith failwith + Assert.True(V2TendNoEffect.settledWith f.Policy f.Custody.Root f.Path) + Assert.Equal(f.OriginalBytes, File.ReadAllBytes f.Path) + Assert.True(f.Admit() |> Result.isError) + for path in Directory.GetFiles(Path.GetDirectoryName certificate) do + Assert.Equal(UnixFileMode.UserRead ||| UnixFileMode.UserWrite, File.GetUnixFileMode path) + Assert.Equal(0, snd (f.Custody.Records())) + Assert.Empty f.Board.Mutations + +[] +let later_valid_writes_do_not_resurrect_the_original_and_sweeps_do_not_touch_it () = + use f = new Fixture() + f.Admit() |> Result.defaultWith failwith |> ignore + f.Board.Items.["PVTI_fixture"].Values <- Map.ofList [ "Status", "In review" ] + let calls = f.Board.Calls.Length + let held, outcomes = V2TendWrite.sweepOwnUsing f.Incident (V2TendNoEffect.settledWith f.Policy) f.Context + Assert.Empty held + Assert.Equal("root-settled-no-effect", outcomes.Head.Result) + Assert.Equal(calls, f.Board.Calls.Length) + Assert.Equal(f.OriginalBytes, File.ReadAllBytes f.Path) + +[] +let missing_or_tampered_proof_fences_without_rewriting_even_an_observed_target () = + use f = new Fixture() + let certificate = f.Admit() |> Result.defaultWith failwith + let folder = Path.GetDirectoryName certificate + f.Board.Items.["PVTI_fixture"].Values <- Map.ofList [ "Status", "In review" ] + for name in [ "request.json"; "schema.json"; "readback.json"; "original.dll"; "certificate.json" ] do + let path = Path.Combine(folder, name) + let saved = File.ReadAllBytes path + File.WriteAllText(path, "tampered") + Assert.False(V2TendNoEffect.settledWith f.Policy f.Custody.Root f.Path) + let held, _ = V2TendWrite.sweepOwnUsing f.Incident (V2TendNoEffect.settledWith f.Policy) f.Context + Assert.Contains("PVTI_fixture", held) + Assert.Equal(f.OriginalBytes, File.ReadAllBytes f.Path) + File.WriteAllBytes(path, saved) + File.Delete certificate + let held, _ = V2TendWrite.sweepOwnUsing f.Incident (V2TendNoEffect.settledWith f.Policy) f.Context + Assert.Contains("PVTI_fixture", held) + Assert.Equal(f.OriginalBytes, File.ReadAllBytes f.Path) + +[] +let writer_exclusion_prevents_every_deciding_read_and_certificate () = + use f = new Fixture() + use lease = V2WriterLock.acquire f.Location + Assert.True(f.Admit() |> Result.isError) + Assert.Equal(0, f.SchemaCalls) + Assert.Empty f.Board.Calls + Assert.Empty f.Board.Mutations + +[] +let admission_refuses_changed_native_identity_preimage_and_wrong_provider_scalar () = + for wrong in [ "preimage"; "identity"; "scalar" ] do + use f = new Fixture() + match wrong with + | "preimage" -> f.Board.Items.["PVTI_fixture"].Values <- Map.ofList [ "Status", "Ready" ] + | "identity" -> f.Board.AddItem("PVTI_fixture", { f.Board.Items.["PVTI_fixture"] with Ref = "FS-GG/fixture#2" }) + | _ -> f.Schema <- f.Schema.Replace("\"String\"", "\"ID\"") + Assert.True(f.Admit() |> Result.isError) + Assert.False(V2TendNoEffect.settledWith f.Policy f.Custody.Root f.Path) + Assert.Equal(f.OriginalBytes, File.ReadAllBytes f.Path) + Assert.Empty f.Board.Mutations + +[] +let production_policy_refuses_foreign_records_and_bad_artifacts_or_reconstruction () = + use f = new Fixture() + Assert.True(V2TendNoEffect.admitWith V2TendNoEffect.policy f.Dependencies f.Input |> Result.isError) + Assert.Equal(0, f.SchemaCalls) + let wrong = { f.Dependencies with Reconstruct = fun _ -> [| 0uy |] } + Assert.True(V2TendNoEffect.admitWith f.Policy wrong f.Input |> Result.isError) + File.WriteAllText(f.Input.RequestPath, "tampered") + Assert.True(f.Admit() |> Result.isError) + Assert.Empty f.Board.Mutations + +[] +let partial_certificate_write_never_settles_or_allows_replacement () = + use f = new Fixture() + let failed = { f.Dependencies with SyncDirectory = fun path -> if Path.GetFileName path = V2TendNoEffect.digest f.OriginalBytes then raise (IOException "fixture fsync") } + Assert.True(V2TendNoEffect.admitWith f.Policy failed f.Input |> Result.isError) + Assert.False(V2TendNoEffect.settledWith f.Policy f.Custody.Root f.Path) + Assert.True(f.Admit() |> Result.isError) + Assert.Equal(f.OriginalBytes, File.ReadAllBytes f.Path) diff --git a/tests/coord-board-v2-projection/coord-board-v2-projection.fsproj b/tests/coord-board-v2-projection/coord-board-v2-projection.fsproj index dc10186f8..1440c2310 100644 --- a/tests/coord-board-v2-projection/coord-board-v2-projection.fsproj +++ b/tests/coord-board-v2-projection/coord-board-v2-projection.fsproj @@ -28,6 +28,7 @@ + diff --git a/tests/fdev-board-tend/test_tend_field_recovery_controller.py b/tests/fdev-board-tend/test_tend_field_recovery_controller.py new file mode 100644 index 000000000..721a93b57 --- /dev/null +++ b/tests/fdev-board-tend/test_tend_field_recovery_controller.py @@ -0,0 +1,71 @@ +"""Controller sandbox only: fake runtime/executable, no production locks, credential or provider calls.""" +import contextlib +import hashlib +import importlib.util +import io +import json +import os +from pathlib import Path +import tempfile +import unittest +from unittest import mock + +ROOT = Path(__file__).resolve().parents[2] +SPEC = importlib.util.spec_from_file_location("field_recovery_controller", ROOT / "tools/tend-field-validation-settle.py") +C = importlib.util.module_from_spec(SPEC); SPEC.loader.exec_module(C) + + +class Controller(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory(); self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name) + def write(name, content): + p = self.root / name; p.write_text(content); p.chmod(0o600); return p + self.core = write("FS.GG.Coord.Core.dll", "synthetic core") + self.github = write("FS.GG.Coord.GitHub.dll", "synthetic adapter") + self.credentials = write("credentials", '{"GH_TOKEN":"FIXTURE-PRIVATE"}') + self.original = write("original", "synthetic original") + self.request = write("request", "synthetic reconstructed request") + self.dotnet = write("dotnet", "#!/usr/bin/python3\nimport json,os,pathlib,sys\np=pathlib.Path(sys.argv[-1]).parent\n(p/'invoked').write_text(json.dumps({'args':sys.argv,'env':dict(os.environ)}))\n") + self.dotnet.chmod(0o700) + self.out = self.root / "output" + sha = lambda p: hashlib.sha256(p.read_bytes()).hexdigest() + self.args = ["--runtime-directory", str(self.root), "--expect-core-sha256", sha(self.core), + "--expect-github-sha256", sha(self.github), "--dotnet", str(self.dotnet), "--expect-dotnet-sha256", sha(self.dotnet), + "--credentials", str(self.credentials), "--custody-root", str(self.root / "custody"), + "--original-path", str(self.original), "--request-path", str(self.request), + "--original-runtime-directory", str(self.root), "--output-directory", str(self.out), + "--root-admission-reference", "https://github.com/FS-GG/.github/issues/5206#issuecomment-1"] + + def go(self, *extra): + output = io.StringIO() + with contextlib.redirect_stdout(output): result = C.main(self.args + list(extra)) + self.assertNotIn("FIXTURE-PRIVATE", output.getvalue()) + return result + + def test_preview_never_launches_or_creates_output(self): + with mock.patch.object(C.subprocess, "Popen", side_effect=AssertionError("must not launch")): + self.assertEqual(self.go(), 0) + self.assertFalse(self.out.exists()) + + def test_changed_runtime_or_public_credentials_refuse_before_launch(self): + self.github.write_text("changed") + self.assertEqual(self.go("--admit"), 2) + self.assertFalse(self.out.exists()) + self.github.write_text("synthetic adapter"); self.credentials.chmod(0o644) + self.assertEqual(self.go("--admit"), 2) + + def test_explicit_admission_pins_process_and_private_output_and_never_replaces(self): + with mock.patch.dict(os.environ, {"XDG_RUNTIME_DIR": str(self.root), "GH_TOKEN": "wrong", "GITHUB_TOKEN": "wrong"}): + self.assertEqual(self.go("--admit"), 0) + self.assertEqual(self.go("--admit"), 2) + call = json.loads((self.out / "invoked").read_text()) + self.assertNotIn("GH_TOKEN", call["env"]); self.assertNotIn("GITHUB_TOKEN", call["env"]) + self.assertNotIn("FIXTURE-PRIVATE", json.dumps(call)) + self.assertEqual(call["args"][1:3], ["fsi", "--exec"]) + for path in self.out.iterdir(): self.assertEqual(path.stat().st_mode & 0o777, 0o600) + self.assertEqual(self.out.stat().st_mode & 0o777, 0o700) + + def test_missing_shared_runtime_refuses_before_process_or_output(self): + with mock.patch.dict(os.environ, {"XDG_RUNTIME_DIR": "relative"}): self.assertEqual(self.go("--admit"), 2) + self.assertFalse(self.out.exists()) diff --git a/tools/tend-field-validation-settle.fsx.in b/tools/tend-field-validation-settle.fsx.in new file mode 100644 index 000000000..cd369ce8d --- /dev/null +++ b/tools/tend-field-validation-settle.fsx.in @@ -0,0 +1,39 @@ +// Loaded only by the checked controller after exact runtime-file verification. No mutation sender is used. +open System +open System.IO +open System.Runtime.InteropServices +open System.Text.Json.Nodes +open FS.GG.Coord.GitHub + +module Native = + [] + extern int openDirectory(string path, int flags) + [] + extern int fsync(int descriptor) + [] + extern int close(int descriptor) + +let syncDirectory path = + let fd = Native.openDirectory(path, 65536) + if fd < 0 then raise (IOException "directory open refused") + try + if Native.fsync fd <> 0 then raise (IOException "directory fsync refused") + finally Native.close fd |> ignore + +let execute () = + let config = JsonNode.Parse(File.ReadAllText(Array.last fsi.CommandLineArgs)) + let text (name: string) = config[name].GetValue() + let credentials = JsonNode.Parse(File.ReadAllText(text "credentials")) + let token = credentials["GH_TOKEN"].GetValue() + let input : V2TendNoEffect.Input = + { CustodyRoot = text "custodyRoot"; OriginalPath = text "originalPath" + RequestPath = text "requestPath"; OriginalRuntimeDirectory = text "originalRuntimeDirectory" + RootAdmissionReference = text "rootAdmissionReference" } + use transport = new Transport.HttpTransport("https://api.github.com", token) + match V2TendFieldRecovery.admit (transport :> Transport.IGitHubTransport) syncDirectory input with + | Ok _ -> printfn "tend field recovery: certificate appended; no provider send" + | Error reason -> eprintfn "%s" reason; exit 3 + +if Array.contains "--typecheck-only" fsi.CommandLineArgs then + printfn "tend field recovery controller: offline typecheck only" +else execute () diff --git a/tools/tend-field-validation-settle.py b/tools/tend-field-validation-settle.py new file mode 100644 index 000000000..386db4144 --- /dev/null +++ b/tools/tend-field-validation-settle.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +"""Checked controller for #5206's three-request incident. Preview by default; --admit appends local evidence only. + +Use the separately qualified released engine's runtime directory and exact artifact hashes. This is not an +unpublished-engine installer, a generic custody override, or a provider mutation/retry command. +""" +from __future__ import annotations + +import argparse +import hashlib +import json +import os +from pathlib import Path +import re +import signal +import stat +import subprocess + + +def checked(path: Path, sha: str | None = None, private: bool = False) -> bytes: + info = path.lstat() + if not path.is_absolute() or not stat.S_ISREG(info.st_mode) or info.st_uid not in ((os.getuid(),) if private else (0, os.getuid())): + raise ValueError("regular absolute owner-owned file required") + if private and stat.S_IMODE(info.st_mode) != 0o600: + raise ValueError("private input mode must be 0600") + data = path.read_bytes() + if sha is not None and hashlib.sha256(data).hexdigest() != sha: + raise ValueError("runtime identity changed") + return data + + +def main(argv=None) -> int: + p = argparse.ArgumentParser(description=__doc__) + p.add_argument("--runtime-directory", type=Path, required=True) + p.add_argument("--expect-github-sha256", required=True) + p.add_argument("--expect-core-sha256", required=True) + p.add_argument("--dotnet", type=Path, required=True) + p.add_argument("--expect-dotnet-sha256", required=True) + for flag in ("credentials", "custody-root", "original-path", "request-path", "original-runtime-directory", "output-directory"): + p.add_argument("--" + flag, type=Path, required=True) + p.add_argument("--root-admission-reference", required=True) + p.add_argument("--admit", action="store_true") + a = p.parse_args(argv) + try: + for value in (a.expect_github_sha256, a.expect_core_sha256, a.expect_dotnet_sha256): + if not re.fullmatch(r"[0-9a-f]{64}", value): + raise ValueError("exact runtime hashes required") + core = a.runtime_directory / "FS.GG.Coord.Core.dll" + github = a.runtime_directory / "FS.GG.Coord.GitHub.dll" + checked(core, a.expect_core_sha256); checked(github, a.expect_github_sha256) + checked(a.dotnet, a.expect_dotnet_sha256) + checked(a.credentials, private=True); checked(a.original_path, private=True); checked(a.request_path) + if not all(getattr(a, name).is_absolute() for name in ("custody_root", "original_runtime_directory", "output_directory")): + raise ValueError("absolute paths required") + if not re.fullmatch(r"https://github\.com/FS-GG/\.github/issues/5206#issuecomment-\d+", a.root_admission_reference): + raise ValueError("Root admission reference required") + if not a.admit: + print("tend field recovery: preview only; no process, provider read or certificate") + return 0 + runtime = os.environ.get("XDG_RUNTIME_DIR", "") + if not runtime or not Path(runtime).is_absolute() or not a.output_directory.is_absolute(): + raise ValueError("explicit runtime and output paths required") + a.output_directory.mkdir(mode=0o700) # exclusive run; never overwrite/retry an earlier controller + config = {key: str(getattr(a, name)) for key, name in ( + ("credentials", "credentials"), ("custodyRoot", "custody_root"), ("originalPath", "original_path"), + ("requestPath", "request_path"), ("originalRuntimeDirectory", "original_runtime_directory"))} + config["rootAdmissionReference"] = a.root_admission_reference + source = Path(__file__).with_suffix(".fsx.in").read_text() + # F# verbatim strings escape quotes by doubling them; no shell or interpolated F# expressions. + references = "\n".join('#r @"' + str(path).replace('"', '""') + '"' for path in (core, github)) + for name, data in (("input.json", json.dumps(config)), ("controller.fsx", references + "\n" + source)): + with (a.output_directory / name).open("x") as handle: + os.chmod(handle.name, 0o600); handle.write(data) + env = {key: os.environ[key] for key in ("HOME", "PATH", "LANG", "DOTNET_ROOT", "XDG_RUNTIME_DIR") if key in os.environ} + env["DOTNET_CLI_TELEMETRY_OPTOUT"] = "1" + with (a.output_directory / "stdout").open("x") as out, (a.output_directory / "stderr").open("x") as err: + os.chmod(out.name, 0o600); os.chmod(err.name, 0o600) + child = subprocess.Popen([str(a.dotnet), "fsi", "--exec", str(a.output_directory / "controller.fsx"), + str(a.output_directory / "input.json")], env=env, stdout=out, stderr=err, + start_new_session=True, umask=0o077) + try: + code = child.wait(timeout=120) + except subprocess.TimeoutExpired: + os.killpg(child.pid, signal.SIGKILL); child.wait(); code = 124 + print("tend field recovery: finished; inspect private evidence; no provider mutation") + return 0 if code == 0 else 3 + except (OSError, ValueError): + print("tend field recovery: refused; inputs/evidence preserved") + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) From cee4a5ae1857bbd3643407d9f7ecc2439002b300 Mon Sep 17 00:00:00 2001 From: rev Date: Mon, 2 Nov 2026 17:10:06 +0100 Subject: [PATCH 5/6] docs: describe shared dependencies and tend repair in 0.114.4 notes --- src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj b/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj index e59f6d600..891603ef4 100644 --- a/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj +++ b/src/FS.GG.Coord.Cli/FS.GG.Coord.Cli.fsproj @@ -140,6 +140,8 @@ closed sources. 0.114.4 — Patch release of the coherent set: Kit, Drivers and CLI advance together; existing verbs keep their contracts. The CLI rebuilds against FSharp.Core 10.1.403; command and exit-code contracts are unchanged. Packaged `pnext-item` gains an owner self-check before review (range, partial failure, planted bugs, all reviewer probes re-run on the new head, invariant first for cross-cutting defects) with no new gate, critic or report, keeps the PR draft until its required gates pass, and `intra-repo-parallel-work` has dispatch briefs name the one owner of a surface shared by parallel Deliveries (#5239, #5185). The canonical shared build configuration and the producer use listed stable FSharp.Core 10.1.403, restored from NuGet.org with the SDK library-packs source excluded (#5253). Managed receivers adopt these bytes through the actually published Kit; source preparation does not establish receiver or installed adoption. The packaged Atlas also carries the reviewed LEARN routing/classification records (#5249) and the source-exclusion qualification boundary. +The shared source baseline advances Microsoft.NET.Test.Sdk 18.11.0, xunit.runner.visualstudio 4.0.1, FsCheck.Xunit 3.6.0, Microsoft.Data.Sqlite 10.0.14, Akka/Akka.FSharp 1.5.73, fake-cli 6.2.0 and Fantomas 8.1.0 (#5254). The CLI carries the updated SQLite closure; test dependencies, the independently released Host's Akka closure and receiver-owned tool manifests retain their own delivery boundaries. +Board tend uses the provider's String scalar for single-select option IDs and retains field-response rejection evidence. The fdev wrapper hardens activation and marker recovery, and the checked incident controller admits only proven no-effect settlements without retrying a provider mutation (#5206). Publication, qualified deployment, fresh settlement admission and scheduled native readback remain separate; these source changes do not establish any of them. Carried forward from 0.114.3: the first-line `fsgg-dispatch:` marker and telemetry attribution of Claude Code subagent dispatches, the guarded `board-v2 tend --apply` writer, item-scoped `board-v2 migration-apply`, content-based ConstructorIdentity, `enrollment rebind-reader` and the routine-PR delivery-continues/completes declaration. VALIDATOR: qualify 0.114.4 inspections with `scripts/board_v2_native_results.py` from main at or after #5132. Source, installed adoption and native acceptance remain distinct. See STANDING ADVISORIES for the rollback limits. From 88f0d9399ca82e99857f2452cf0b9e8164e676cd Mon Sep 17 00:00:00 2001 From: rev Date: Mon, 2 Nov 2026 17:34:39 +0100 Subject: [PATCH 6/6] fix: refresh build-only package census identity --- docs/coordination/v1-writer-census.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/coordination/v1-writer-census.json b/docs/coordination/v1-writer-census.json index e36ea1adf..29cb462c0 100644 --- a/docs/coordination/v1-writer-census.json +++ b/docs/coordination/v1-writer-census.json @@ -74,7 +74,7 @@ {"path":".github/workflows/release-saga-prepare.yml","disposition":"publish-writer","sinkKinds":["gh-release-write"],"sha256":"704301a1ed74e863d638d016d835be956c95d68af579213cb5c4b21686877664"}, {"path":".github/workflows/release-saga-start.yml","disposition":"publish-writer","sinkKinds":["gh-api-write","git-push","rest-write","workflow-dispatch"],"sha256":"316e019d8cec6c60cd78059e5b98abb85b925fa1564f6df9f86345cd00b6d912"}, {"path":"Directory.Build.props","disposition":"build-only","sinkKinds":[],"sha256":"ab08e7745b8dad43530a4a663417d3b113bbb3eaa46c27094ae75fca0c8cd5c4"}, - {"path":"Directory.Packages.props","disposition":"build-only","sinkKinds":[],"sha256":"f855a9b7b71affa9eee3f40caf1f25af91b3813bf90e9e8266ff6eaeb15b93aa"}, + {"path":"Directory.Packages.props","disposition":"build-only","sinkKinds":[],"sha256":"863dd06c8414b7ff6248208fe14e91cb59d0f46dabccf396a42ab3ebbe489926"}, {"path":"dist/dotnet/Directory.Build.props","disposition":"build-only","sinkKinds":[],"sha256":"f29e3b29afed4f93258003519c5af5676b0a9bfea7623350491f2d60ee082d0c"}, {"path":"dist/skill-union-assert.sh","disposition":"build-only","sinkKinds":[],"sha256":"e94e25406eda585a770fd29498798067dc1c0bc78c924f581a2b6db23141ce50"}, {"path":"global.json","disposition":"build-only","sinkKinds":[],"sha256":"884c3d68b436980197e5c5871b6be07dc75b894b2a9e210f70a73468e9f9bd8e"},