diff --git a/evidence/burst11-bs-ingest-harness-local/plan-miniarkit.json b/evidence/burst11-bs-ingest-harness-local/plan-miniarkit.json new file mode 100644 index 000000000..6553de1d0 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/plan-miniarkit.json @@ -0,0 +1,125 @@ +{ + "format": "hunter-local-ingest-plan", + "format_version": 2, + "generator": { + "name": "gen_miniarkit_packet", + "sha256_of_plan": "d7af5c2ebda638a9815463fdf3c71e7b9db9dfb84ddba22eaab9dc7da0e251a6" + }, + "plan": { + "create_request": { + "device": { + "appVersion": "0.4 (57)", + "model": "iPhone15,4", + "systemVersion": "26.0" + }, + "flow": "guided", + "formatVersion": "0.4", + "packetId": "mini-arkit", + "tier": "arkit" + }, + "files": [ + { + "bytes": 4240, + "contentType": "application/octet-stream", + "content_hex": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf", + "md5": "L0m6xucj2l/A/rdiJBz3HA==", + "path": "keyframes/k00001.features.bin", + "role": "features", + "sha256": "7710dcbc1ad6d99132a3cdf2c45f49cbae908eff3398c8edd779955e37962bf8" + }, + { + "bytes": 714, + "contentType": "image/jpeg", + "content_hex": "ffd8ffe000104a46494600010100000100010000ffdb0043000302020302020303030304030304050805050404050a070706080c0a0c0c0b0a0b0b0d0e12100d0e110e0b0b1016101113141515150c0f171816141812141514ffdb00430103040405040509050509140d0b0d1414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414ffc00011080030004003011100021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00f24afcbcfef00a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a00fffd9", + "md5": "tUZjulo+LXiIkWB1q1TpdQ==", + "path": "keyframes/k00001.jpg", + "role": "keyframe", + "sha256": "753a386b150b92e235357144459d2109ed480bed805fbb0ac4ca989c42bc6d79" + }, + { + "bytes": 3740, + "contentType": "application/octet-stream", + "content_hex": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1", + "md5": "730mx6MhON/1zHN+NVey/A==", + "path": "keyframes/k00002.features.bin", + "role": "features", + "sha256": "ee6e18a01b94f594c8f17cc92e6f3e3bcef5347190b02a6a67fce8b10dc1f8b9" + }, + { + "bytes": 713, + "contentType": "image/jpeg", + "content_hex": "ffd8ffe000104a46494600010100000100010000ffdb0043000302020302020303030304030304050805050404050a070706080c0a0c0c0b0a0b0b0d0e12100d0e110e0b0b1016101113141515150c0f171816141812141514ffdb00430103040405040509050509140d0b0d1414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414ffc00011080030004003011100021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00a95f8f9fcbe140050014005001400500140050014005001400500140050014005001400500140050014005001400500140050014005001400500140050014005001400500140050014005001400500140050014005001401ffd9", + "md5": "4aa04g8wTswgOZ2ldL5xkw==", + "path": "keyframes/k00002.jpg", + "role": "keyframe", + "sha256": "80beae7b3ea40a8951f3001ea9e87a5bb342e9d4a402037bda815f953c3a3c8e" + }, + { + "bytes": 714, + "contentType": "image/jpeg", + "content_hex": "ffd8ffe000104a46494600010100000100010000ffdb0043000302020302020303030304030304050805050404050a070706080c0a0c0c0b0a0b0b0d0e12100d0e110e0b0b1016101113141515150c0f171816141812141514ffdb00430103040405040509050509140d0b0d1414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414ffc00011080030004003011100021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00f04afeb33f2f0a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a00fffd9", + "md5": "MSq/wXMgK/QcBdMqGs2TZA==", + "path": "keyframes/k00003.jpg", + "role": "keyframe", + "sha256": "a53e442431e7041303f024d5432e133dac2e3dc5726cbed37653b3d656a8b143" + }, + { + "bytes": 714, + "contentType": "image/jpeg", + "content_hex": "ffd8ffe000104a46494600010100000100010000ffdb0043000302020302020303030304030304050805050404050a070706080c0a0c0c0b0a0b0b0d0e12100d0e110e0b0b1016101113141515150c0f171816141812141514ffdb00430103040405040509050509140d0b0d1414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414ffc00011080030004003011100021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00fa82bf888fbd0a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a002800a00fffd9", + "md5": "BvVp7SSkoTFiCEXFYWDHCw==", + "path": "keyframes/k00004.jpg", + "role": "keyframe", + "sha256": "98a40bb14e16042551263230a3474a2fa2ea688f2262ca2b84b6becc7dc67f65" + }, + { + "bytes": 73, + "contentType": "application/gzip", + "content_hex": "1f8b08000000000002ff2bd1492dc84fced029294a4ccececc4bd729a9d029a9d429a9d229acd029acd4290432ca75d22a74d22a75922b74922bb90c7470422e000ca6899d4e000000", + "md5": "tYdf4AMhf0qxpz0L3APo8w==", + "path": "streams/arkit_poses.csv.gz", + "role": "stream", + "sha256": "8b95dff9754f3567bd2b8d03906aa24c97c7d97d0e881970a8ddb0dd55d3dc3e" + }, + { + "bytes": 76, + "contentType": "application/gzip", + "content_hex": "1f8b08000000000002ff2bd129c9cc4d2d2e49cc2dd0c94d4ccf4b2dc94cf6484d4cc9cc4bd729292a4d85b13320b463727269516272a54e854ea54e1597810e0ae40200fd9332be4e000000", + "md5": "x/NW9ZSh2Oqs/aV+MkTA5w==", + "path": "streams/heading.csv.gz", + "role": "stream", + "sha256": "4a9c16d18e22eeeb85c024b6fa0db32b9a22dd89c48e10bb14c989f183696a58" + }, + { + "bytes": 44, + "contentType": "application/gzip", + "content_hex": "1f8b08000000000002ff2bd149acd049acd449acd249afd049afd449afe232d041825c00f52418b522000000", + "md5": "6o0XSGSowC9u+9bZq9o1Sg==", + "path": "streams/imu_raw.csv.gz", + "role": "stream", + "sha256": "564ece90c04a9c78f7690ccae56c032dd4f1fb904e64b847697f66125bfd4b60" + }, + { + "bytes": 107, + "contentType": "application/gzip", + "content_hex": "1f8b08000000000002ff6dc8410a80300c04c0bb6fc9c12ff89490060d4453d254d0d72bb48a0759d85d262064e512b866500c899a18d4b6b93dd44eac2ab99824d4e9b1c55c4edbe226a2ea4807ecec21f401b2ea85fbbc5a32736afdd830c26f860b7ecc8378a2000000", + "md5": "d1IS8GC6yugI/lRq4GuHnA==", + "path": "streams/location.csv.gz", + "role": "stream", + "sha256": "fc12d4b107cc3e7f7a903375c90310bcb2565fd3b50785b6bf3696282f83cc30" + }, + { + "bytes": 95, + "contentType": "application/gzip", + "content_hex": "1f8b08000000000002ff8dc74b0a80300c45d179d7f2066ec15d249d8528d1814a4afdd4d54bba02b970e056f8036ff0177ea31c95020e32acc8455dee66882a051c646c621470d077543d8b68c332cbb4ee9606fc287dcaf0d8ed87000000", + "md5": "RgYAzRxsi39plxaSkuv5YQ==", + "path": "streams/motion.csv.gz", + "role": "stream", + "sha256": "d21ce4423410a0b1c5178c268dbbe615090e1dd9521affd4c31a34f830b4ec54" + } + ], + "packet_hex": "7b0a202022666f726d6174223a2022686f7573652d636170747572652d7061636b6574222c0a202022666f726d617456657273696f6e223a2022302e34222c0a2020227061636b65744964223a20226d696e692d61726b6974222c0a202022637265617465644174223a2022323032362d30392d32375431363a30353a31325a222c0a202022756e697473223a207b0a20202020226c656e677468223a20226d6574657273222c0a2020202022616e676c65223a202264656772656573222c0a202020202274696d65223a20227365636f6e6473206f662064657669636520757074696d652c2074686520636c6f636b206f662041524672616d652e74696d657374616d7020616e6420434d4465766963654d6f74696f6e2e74696d657374616d70222c0a2020202022696d616765223a2022706978656c73206f6620746865207361766564204a504547222c0a2020202022726f746174696f6e52617465223a202272616469616e7320706572207365636f6e64222c0a2020202022616363656c65726174696f6e223a2022672028392e3830363635206d2f735e3229222c0a20202020226d61676e657469634669656c64223a20226d6963726f7465736c61220a20207d2c0a202022636f6e76656e74696f6e73223a207b0a2020202022776f726c64223a202241524b697420776f726c64206672616d65207769746820776f726c64416c69676e6d656e74202e677261766974793a2072696768742d68616e6465642c20792075702028617761792066726f6d2067726176697479292c206f726967696e2061742074686520646576696365277320706f736974696f6e207768656e207468652073657373696f6e202865706f63682920737461727465642c202d7a207468652063616d657261277320696e697469616c20666163696e672070726f6a6563746564206f6e746f2074686520686f72697a6f6e74616c222c0a202020202263616d657261223a202241524b69742063616d657261206672616d653a202b7820726967687420616e64202b7920757020696e2074686520756e726f7461746564206c616e6473636170652073656e736f7220696d6167652c207468652063616d657261206c6f6f6b7320616c6f6e67202d7a222c0a2020202022646576696365223a2022436f7265204d6f74696f6e20646576696365206672616d653a202b7820726967687420616e64202b7920746f776172642074686520746f702077697468207468652070686f6e65207570726967687420696e20706f7274726169742c202b7a206f7574206f66207468652073637265656e222c0a2020202022706f7365223a202263616d6572612d746f2d776f726c6420347834206d61747269782c203136206e756d6265727320636f6c756d6e20627920636f6c756d6e202873696d645f666c6f6174347834206c61796f7574292c206d6574657273222c0a2020202022696e7472696e73696373223a20225b66782c2066792c2063782c2063795d20696e20706978656c73206f66207468652073617665642c20756e726f7461746564206c616e64736361706520696d616765222c0a2020202022706978656c223a20225b752c20765d20636f6e74696e756f757320696d61676520636f6f7264696e617465733a2028302c2030292069732074686520746f702d6c65667420636f726e6572206f662074686520746f702d6c65667420706978656c2c20762067726f777320646f776e222c0a2020202022726179223a20226f726967696e206973207468652063616d65726120706f736974696f6e3b20646972656374696f6e206973206120756e697420766563746f723b2063616d6572612d737061636520646972656374696f6e20282875202d206378292f66782c202d2876202d206379292f66792c202d3129222c0a202020202267656f6465746963223a2022574753383420646567726565733b20616c7469747564652061626f7665206d65616e20736561206c6576656c2c20656c6c6970736f6964616c416c7469747564652061626f76652074686520574753383420656c6c6970736f69642c206d6574657273222c0a202020202268656164696e67223a20226465677265657320636c6f636b776973652066726f6d206e6f7274682c203020746f20333630220a20207d2c0a202022736f75726365223a207b0a20202020226b696e64223a202273796e746865746963222c0a20202020226170704275696c64223a2022486f7573655363616e20302e342028353729220a20207d2c0a20202273657373696f6e223a207b0a20202020226964223a202233463243394131302d354437422d344530412d394236312d304338453244344637413133222c0a2020202022737461727465644174223a2022323032362d30392d32375431353a35383a34302e3132305a222c0a2020202022737461727465644174557074696d65223a2038343230352e31333230303030303030312c0a2020202022656e6465644174557074696d65223a2038343435332e33333230303030303030312c0a202020202274696d655a6f6e65223a2022416d65726963612f4368696361676f222c0a202020202261707056657273696f6e223a2022302e342028353729222c0a20202020226465766963654d6f64656c223a20226950686f6e6531352c34222c0a202020202273797374656d56657273696f6e223a202232362e30222c0a202020202274696572223a202261726b6974222c0a20202020226c69646172417661696c61626c65223a2066616c73652c0a20202020226d6573685265636f6e737472756374696f6e537570706f72746564223a2066616c73652c0a20202020227363656e654465707468456e61626c6564223a2066616c73652c0a20202020227363656e655265636f6e737472756374696f6e223a20226e6f6e65222c0a2020202022776f726c64416c69676e6d656e74223a202267726176697479222c0a2020202022706c616e65446574656374696f6e223a205b0a20202020202022686f72697a6f6e74616c222c0a20202020202022766572746963616c220a202020205d2c0a2020202022766964656f466f726d6174223a207b0a20202020202022696d6167655265736f6c7574696f6e223a205b0a2020202020202020313932302c0a2020202020202020313434300a2020202020205d2c0a202020202020226672616d65735065725365636f6e64223a2036300a202020207d2c0a20202020226c6f636174696f6e417574686f72697a6174696f6e223a202266756c6c4163637572616379222c0a20202020226d6f74696f6e5265666572656e63654672616d65223a202278547275654e6f7274685a566572746963616c222c0a2020202022746865726d616c53746174654d6178223a202266616972222c0a20202020226761746573223a207b0a202020202020226b65796672616d6553706163696e674d6574657273223a20302e352c0a202020202020226b65796672616d6553706163696e6744656772656573223a2031352e302c0a20202020202022747261636b696e67537461626c655365636f6e6473223a20312e300a202020207d0a20207d2c0a20202265706f636873223a205b0a202020207b0a202020202020226964223a20226531222c0a20202020202022737461727454696d65223a2038343230352e31333230303030303030312c0a20202020202022726561736f6e223a202273657373696f6e5374617274220a202020207d0a20205d2c0a2020226b65796672616d6573223a205b0a202020207b0a202020202020226964223a20226b3030303031222c0a20202020202022696d67223a20226b65796672616d65732f6b30303030312e6a7067222c0a2020202020202277223a2036342c0a2020202020202268223a2034382c0a20202020202022696e7472696e73696373223a205b0a202020202020202034382e30372c0a202020202020202034382e30372c0a202020202020202033312e393836372c0a202020202020202032332e39380a2020202020205d2c0a20202020202022706f7365223a205b0a2020202020202020302c0a20202020202020202d312c0a2020202020202020302c0a2020202020202020302c0a2020202020202020312c0a2020202020202020302c0a2020202020202020302c0a2020202020202020302c0a2020202020202020302c0a2020202020202020302c0a2020202020202020312c0a2020202020202020302c0a2020202020202020302e30322c0a20202020202020202d302e30312c0a20202020202020202d302e30352c0a2020202020202020310a2020202020205d2c0a2020202020202274696d657374616d70223a2038343231312e3533322c0a20202020202022747261636b696e67223a20226e6f726d616c222c0a2020202020202265706f6368223a20226531222c0a20202020202022726561736f6e223a20226d6f74696f6e222c0a202020202020226578706f73757265223a207b0a2020202020202020226475726174696f6e223a20302e30303039382c0a2020202020202020226f6666736574223a20302e302c0a20202020202020202269736f223a2035302c0a202020202020202022664e756d626572223a20312e360a2020202020207d2c0a2020202020202265786966223a207b0a2020202020202020224d616b65223a20224170706c65222c0a2020202020202020224d6f64656c223a20226950686f6e65203135222c0a2020202020202020224c656e734d6f64656c223a20226950686f6e65203135206261636b206475616c20776964652063616d65726120362e32346d6d20662f312e36222c0a2020202020202020224578706f7375726554696d65223a20302e30303039382c0a20202020202020202249534f5370656564526174696e6773223a205b0a2020202020202020202035300a20202020202020205d2c0a202020202020202022464e756d626572223a20312e362c0a202020202020202022466f63616c4c656e677468223a20362e32342c0a202020202020202022466f63616c4c656e496e33356d6d46696c6d223a2032362c0a2020202020202020224272696768746e65737356616c7565223a20392e32310a2020202020207d2c0a202020202020226c69676874457374696d617465223a207b0a202020202020202022616d6269656e74496e74656e73697479223a20313338302e302c0a202020202020202022616d6269656e74436f6c6f7254656d7065726174757265223a20353930302e300a2020202020207d2c0a202020202020226465707468223a206e756c6c2c0a202020202020226665617475726573223a207b0a20202020202020202266696c65223a20226b65796672616d65732f6b30303030312e66656174757265732e62696e222c0a202020202020202022636f756e74223a203231320a2020202020207d0a202020207d2c0a202020207b0a202020202020226964223a20226b3030303032222c0a20202020202022696d67223a20226b65796672616d65732f6b30303030322e6a7067222c0a2020202020202277223a2036342c0a2020202020202268223a2034382c0a20202020202022696e7472696e73696373223a205b0a202020202020202034382e30372c0a202020202020202034382e30372c0a202020202020202033312e393836372c0a202020202020202032332e39380a2020202020205d2c0a20202020202022706f7365223a205b0a2020202020202020302c0a20202020202020202d312c0a2020202020202020302c0a2020202020202020302c0a2020202020202020302e393635392c0a2020202020202020302c0a2020202020202020302e323538382c0a2020202020202020302c0a20202020202020202d302e323538382c0a2020202020202020302c0a2020202020202020302e393635392c0a2020202020202020302c0a2020202020202020302e33352c0a20202020202020202d302e30382c0a20202020202020202d312e32352c0a2020202020202020310a2020202020205d2c0a2020202020202274696d657374616d70223a2038343231332e3430322c0a20202020202022747261636b696e67223a20226e6f726d616c222c0a2020202020202265706f6368223a20226531222c0a20202020202022726561736f6e223a2022746170222c0a202020202020226578706f73757265223a207b0a2020202020202020226475726174696f6e223a20302e30303131322c0a2020202020202020226f6666736574223a20302e302c0a20202020202020202269736f223a2035302c0a202020202020202022664e756d626572223a20312e360a2020202020207d2c0a202020202020226465707468223a206e756c6c2c0a202020202020226665617475726573223a207b0a20202020202020202266696c65223a20226b65796672616d65732f6b30303030322e66656174757265732e62696e222c0a202020202020202022636f756e74223a203138370a2020202020207d0a202020207d2c0a202020207b0a202020202020226964223a20226b3030303033222c0a20202020202022696d67223a20226b65796672616d65732f6b30303030332e6a7067222c0a2020202020202277223a2036342c0a2020202020202268223a2034382c0a20202020202022696e7472696e73696373223a205b0a202020202020202034382e303639382c0a202020202020202034382e303639382c0a202020202020202033312e393837332c0a202020202020202032332e393739340a2020202020205d2c0a20202020202022706f7365223a205b0a2020202020202020302c0a20202020202020202d312c0a2020202020202020302c0a2020202020202020302c0a2020202020202020302e393635392c0a2020202020202020302c0a2020202020202020302e323538382c0a2020202020202020302c0a20202020202020202d302e323538382c0a2020202020202020302c0a2020202020202020302e393635392c0a2020202020202020302c0a2020202020202020302e38352c0a20202020202020202d302e31352c0a20202020202020202d322e37352c0a2020202020202020310a2020202020205d2c0a2020202020202274696d657374616d70223a2038343232302e3935322c0a20202020202022747261636b696e67223a20226e6f726d616c222c0a2020202020202265706f6368223a20226531222c0a20202020202022726561736f6e223a20227374696c6c222c0a20202020202022686967685265736f6c7574696f6e223a20747275652c0a20202020202022707572706f7365223a20226d657465725f636c6f7365222c0a202020202020226578706f73757265223a207b0a2020202020202020226475726174696f6e223a20302e303032312c0a2020202020202020226f6666736574223a20302e302c0a20202020202020202269736f223a2036342c0a202020202020202022664e756d626572223a20312e360a2020202020207d2c0a202020202020226465707468223a206e756c6c2c0a202020202020226665617475726573223a206e756c6c0a202020207d2c0a202020207b0a202020202020226964223a20226b3030303034222c0a20202020202022696d67223a20226b65796672616d65732f6b30303030342e6a7067222c0a2020202020202277223a2036342c0a2020202020202268223a2034382c0a20202020202022696e7472696e73696373223a205b0a202020202020202034382e303639382c0a202020202020202034382e303639382c0a202020202020202033312e393837332c0a202020202020202032332e393739340a2020202020205d2c0a20202020202022706f7365223a205b0a2020202020202020302e302c0a20202020202020202d312e302c0a2020202020202020302e302c0a2020202020202020302e302c0a2020202020202020302e3730373039342c0a2020202020202020302e302c0a2020202020202020302e3730373037372c0a2020202020202020302e302c0a20202020202020202d302e3730373037372c0a2020202020202020302e302c0a2020202020202020302e3730373039342c0a2020202020202020302e302c0a2020202020202020302e3631373333322c0a20202020202020202d302e31352c0a20202020202020202d322e3838333637312c0a2020202020202020312e300a2020202020205d2c0a2020202020202274696d657374616d70223a2038343232352e3535322c0a20202020202022747261636b696e67223a20226e6f726d616c222c0a2020202020202265706f6368223a20226531222c0a20202020202022726561736f6e223a20227374696c6c222c0a20202020202022686967685265736f6c7574696f6e223a20747275652c0a202020202020226578706f73757265223a207b0a2020202020202020226475726174696f6e223a20302e303032312c0a2020202020202020226f6666736574223a20302e302c0a20202020202020202269736f223a2036342c0a202020202020202022664e756d626572223a20312e360a2020202020207d2c0a202020202020226465707468223a206e756c6c2c0a20202020202022707572706f7365223a20226d657465725f6f626c69717565220a202020207d0a20205d2c0a2020227374696c6c73223a205b0a202020207b0a202020202020226964223a20227331222c0a20202020202022707572706f7365223a20226d657465725f636c6f7365222c0a20202020202022696d67223a20226b65796672616d65732f6b30303030332e6a7067222c0a2020202020202277223a2036342c0a2020202020202268223a2034382c0a2020202020202274696d657374616d70223a2038343232302e3935322c0a202020202020226f7269656e746174696f6e223a20362c0a202020202020226b65796672616d65223a20226b3030303033222c0a20202020202022696e7472696e73696373536f75726365223a202261726b6974222c0a2020202020202267726176697479223a205b0a2020202020202020302e3031322c0a20202020202020202d302e3938392c0a20202020202020202d302e3134360a2020202020205d0a202020207d2c0a202020207b0a202020202020226964223a20227332222c0a20202020202022707572706f7365223a20226d657465725f6f626c69717565222c0a20202020202022696d67223a20226b65796672616d65732f6b30303030342e6a7067222c0a2020202020202277223a2036342c0a2020202020202268223a2034382c0a2020202020202274696d657374616d70223a2038343232352e3535322c0a202020202020226f7269656e746174696f6e223a20362c0a202020202020226b65796672616d65223a20226b3030303034222c0a20202020202022696e7472696e73696373536f75726365223a202261726b6974222c0a2020202020202267726176697479223a205b0a2020202020202020302e3031382c0a20202020202020202d302e3939312c0a20202020202020202d302e3133310a2020202020205d0a202020207d0a20205d2c0a20202274617073223a205b0a202020207b0a202020202020226964223a20227431222c0a2020202020202274696d65223a2038343231332e3430322c0a202020202020226c6162656c223a20226d65746572222c0a20202020202022746f6f6c223a20226d65746572222c0a2020202020202273746570223a2022616e63686f72222c0a202020202020226b65796672616d65223a20226b3030303032222c0a2020202020202266726f7a656e223a2066616c73652c0a20202020202022706978656c223a205b0a202020202020202033332e363636372c0a202020202020202032312e383333330a2020202020205d2c0a202020202020227261794f726967696e223a205b0a2020202020202020302e33352c0a20202020202020202d302e30382c0a20202020202020202d312e32350a2020202020205d2c0a20202020202022726179446972656374696f6e223a205b0a2020202020202020302e33303134372c0a20202020202020202d302e303334392c0a20202020202020202d302e39353238340a2020202020205d2c0a20202020202022686974223a207b0a202020202020202022706f736974696f6e223a205b0a20202020202020202020302e393833312c0a202020202020202020202d302e313533332c0a202020202020202020202d332e3235310a20202020202020205d2c0a202020202020202022746172676574223a20226578697374696e67506c616e6547656f6d65747279222c0a202020202020202022616c69676e6d656e74223a2022766572746963616c222c0a202020202020202022706c616e654964223a202238443345364231432d324634412d344337452d413142392d364530443543324638413737222c0a20202020202020202264697374616e6365223a20322e310a2020202020207d2c0a20202020202022646973706c61794d617070696e67436865636b223a20302e362c0a20202020202022636f6e6669726d6564427955736572223a20747275652c0a2020202020202265706f6368223a20226531220a202020207d0a20205d2c0a202022747261636b696e67223a205b0a202020207b0a2020202020202274696d65223a2038343230352e31333230303030303030312c0a202020202020227374617465223a20226c696d697465642e696e697469616c697a696e67222c0a2020202020202265706f6368223a20226531220a202020207d2c0a202020207b0a2020202020202274696d65223a2038343230362e3433322c0a202020202020227374617465223a20226e6f726d616c222c0a2020202020202265706f6368223a20226531220a202020207d0a20205d2c0a202022706c616e6573223a205b0a202020207b0a202020202020226964223a202238443345364231432d324634412d344337452d413142392d364530443543324638413737222c0a2020202020202265706f6368223a20226531222c0a20202020202022616c69676e6d656e74223a2022766572746963616c222c0a20202020202022636c617373696669636174696f6e223a202277616c6c222c0a202020202020227472616e73666f726d223a205b0a2020202020202020312c0a2020202020202020302c0a2020202020202020302c0a2020202020202020302c0a2020202020202020302c0a2020202020202020302c0a2020202020202020312c0a2020202020202020302c0a2020202020202020302c0a20202020202020202d312c0a2020202020202020302c0a2020202020202020302c0a2020202020202020302e382c0a20202020202020202d302e362c0a20202020202020202d332e32352c0a2020202020202020310a2020202020205d2c0a2020202020202263656e746572223a205b0a2020202020202020302c0a2020202020202020302c0a2020202020202020300a2020202020205d2c0a20202020202022706c616e65457874656e74223a207b0a2020202020202020227769647468223a20342e322c0a202020202020202022686569676874223a20322e362c0a202020202020202022726f746174696f6e4f6e5941786973223a20302e300a2020202020207d2c0a20202020202022626f756e64617279223a205b0a20202020202020205b0a202020202020202020202d322e312c0a202020202020202020202d312e330a20202020202020205d2c0a20202020202020205b0a20202020202020202020322e312c0a202020202020202020202d312e330a20202020202020205d2c0a20202020202020205b0a20202020202020202020322e312c0a20202020202020202020312e330a20202020202020205d2c0a20202020202020205b0a202020202020202020202d322e312c0a20202020202020202020312e330a20202020202020205d0a2020202020205d2c0a2020202020202266697273745365656e223a2038343231322e3433322c0a202020202020226c61737455706461746564223a2038343434392e3733320a202020207d0a20205d2c0a20202273747265616d73223a207b0a20202020226d6f74696f6e223a207b0a2020202020202266696c65223a202273747265616d732f6d6f74696f6e2e6373762e677a222c0a2020202020202272617465487a223a203130302c0a202020202020227265666572656e63654672616d65223a202278547275654e6f7274685a566572746963616c222c0a20202020202022636f6c756d6e73223a205b0a20202020202020202274222c0a2020202020202020227178222c0a2020202020202020227179222c0a202020202020202022717a222c0a2020202020202020227177222c0a202020202020202022726f7458222c0a202020202020202022726f7459222c0a202020202020202022726f745a222c0a2020202020202020226772617658222c0a2020202020202020226772617659222c0a202020202020202022677261765a222c0a20202020202020202261636358222c0a20202020202020202261636359222c0a2020202020202020226163635a222c0a2020202020202020226d616758222c0a2020202020202020226d616759222c0a2020202020202020226d61675a222c0a2020202020202020226d61674163637572616379222c0a20202020202020202268656164696e67220a2020202020205d0a202020207d2c0a202020202268656164696e67223a207b0a2020202020202266696c65223a202273747265616d732f68656164696e672e6373762e677a222c0a2020202020202268656164696e674f7269656e746174696f6e223a2022706f727472616974222c0a2020202020202268656164696e6746696c746572223a20312e302c0a20202020202022636f6c756d6e73223a205b0a20202020202020202274222c0a20202020202020202274696d657374616d70222c0a2020202020202020226d61676e6574696348656164696e67222c0a2020202020202020227472756548656164696e67222c0a20202020202020202268656164696e674163637572616379222c0a20202020202020202278222c0a20202020202020202279222c0a2020202020202020227a220a2020202020205d0a202020207d2c0a20202020226c6f636174696f6e223a207b0a2020202020202266696c65223a202273747265616d732f6c6f636174696f6e2e6373762e677a222c0a20202020202022646573697265644163637572616379223a202262657374222c0a20202020202022636f6c756d6e73223a205b0a20202020202020202274222c0a20202020202020202274696d657374616d70222c0a2020202020202020226c61746974756465222c0a2020202020202020226c6f6e676974756465222c0a202020202020202022616c746974756465222c0a202020202020202022656c6c6970736f6964616c416c746974756465222c0a202020202020202022686f72697a6f6e74616c4163637572616379222c0a202020202020202022766572746963616c4163637572616379222c0a202020202020202022636f75727365222c0a202020202020202022636f757273654163637572616379222c0a2020202020202020227370656564222c0a20202020202020202273706565644163637572616379220a2020202020205d0a202020207d2c0a2020202022696d75526177223a207b0a2020202020202266696c65223a202273747265616d732f696d755f7261772e6373762e677a222c0a2020202020202272617465487a223a203130302c0a20202020202022636f6c756d6e73223a205b0a20202020202020202274222c0a2020202020202020226178222c0a2020202020202020226179222c0a202020202020202022617a222c0a2020202020202020226778222c0a2020202020202020226779222c0a202020202020202022677a220a2020202020205d0a202020207d2c0a202020202261726b6974506f736573223a207b0a2020202020202266696c65223a202273747265616d732f61726b69745f706f7365732e6373762e677a222c0a2020202020202272617465487a223a2033302c0a20202020202022636f6c756d6e73223a205b0a20202020202020202274222c0a20202020202020202265706f6368222c0a202020202020202022747261636b696e67222c0a2020202020202020227478222c0a2020202020202020227479222c0a202020202020202022747a222c0a2020202020202020227178222c0a2020202020202020227179222c0a202020202020202022717a222c0a2020202020202020227177222c0a2020202020202020226678222c0a2020202020202020226679222c0a2020202020202020226378222c0a2020202020202020226379220a2020202020205d0a202020207d0a20207d2c0a2020227363616c655265666572656e6365223a207b0a20202020226d65746572436c6f73655570223a207b0a202020202020226361707475726564223a20747275652c0a202020202020227374696c6c223a20227331222c0a2020202020202261726b697444697374616e63654d223a20302e39342c0a2020202020202276696577416e676c65446567223a20362e352c0a202020202020226e616d65706c61746556697369626c65223a20747275650a202020207d2c0a20202020226d657465724964656e74697479223a207b0a202020202020226d616b65223a20224974726f6e222c0a202020202020226d6f64656c223a202243454e54524f4e222c0a2020202020202272617754657874223a20224974726f6e2043454e54524f4e20434c323030203234305620335720464d32532054413330222c0a20202020202022736f75726365223a20226f6e5f6465766963655f74657874220a202020207d2c0a2020202022657874223a207b0a202020202020226d6574686f64223a202261392d6d657465722d6d6f64656c222c0a202020202020226f626c69717565436c6f73655570223a207b0a2020202020202020226361707475726564223a20747275652c0a2020202020202020227374696c6c223a20227332222c0a20202020202020202261726b697444697374616e63654d223a20302e39372c0a20202020202020202276696577416e676c65446567223a2033312e302c0a2020202020202020226e616d65706c61746556697369626c65223a20747275652c0a20202020202020202273696465223a20226c656674220a2020202020207d2c0a20202020202022646f6f725669657773223a205b0a20202020202020207b0a20202020202020202020226672616d65223a20226b3030303031222c0a20202020202020202020226b696e64223a2022656e7472795f646f6f72222c0a2020202020202020202022626f78223a205b0a20202020202020202020202034302e342c0a20202020202020202020202031332e342c0a20202020202020202020202034392e393333332c0a20202020202020202020202033362e383333330a202020202020202020205d2c0a202020202020202020202276696577416e676c65446567223a20382e300a20202020202020207d0a2020202020205d2c0a20202020202022646f6f724f6e4d6574657253696465223a20747275652c0a202020202020227365727669636541646472657373223a207b0a2020202020202020226c696e6531223a202231323334204578616d706c65204c6e222c0a2020202020202020226c696e6532223a206e756c6c2c0a20202020202020202263697479223a202241757374696e222c0a2020202020202020227374617465223a20225458222c0a202020202020202022706f7374616c436f6465223a20223738373031222c0a202020202020202022636f756e747279223a20225553222c0a202020202020202022736f75726365223a20226163636f756e74220a2020202020207d2c0a202020202020227472756544657074685363616e223a207b0a2020202020202020226361707475726564223a2066616c73652c0a20202020202020202270726f6d7074223a20227368616465222c0a2020202020202020226661696c757265223a20226465636c696e6564220a2020202020207d0a202020207d0a20207d2c0a20202266696c6573223a205b0a202020207b0a2020202020202270617468223a20226b65796672616d65732f6b30303030312e66656174757265732e62696e222c0a202020202020226279746573223a20343234302c0a20202020202022736861323536223a202237373130646362633161643664393931333261336364663263343566343963626165393038656666333339386338656464373739393535653337393632626638222c0a20202020202022726f6c65223a20226665617475726573220a202020207d2c0a202020207b0a2020202020202270617468223a20226b65796672616d65732f6b30303030312e6a7067222c0a202020202020226279746573223a203731342c0a20202020202022736861323536223a202237353361333836623135306239326532333533353731343434353964323130396564343830626564383035666262306163346361393839633432626336643739222c0a20202020202022726f6c65223a20226b65796672616d65220a202020207d2c0a202020207b0a2020202020202270617468223a20226b65796672616d65732f6b30303030322e66656174757265732e62696e222c0a202020202020226279746573223a20333734302c0a20202020202022736861323536223a202265653665313861303162393466353934633866313763633932653666336533626365663533343731393062303261366136376663653862313064633166386239222c0a20202020202022726f6c65223a20226665617475726573220a202020207d2c0a202020207b0a2020202020202270617468223a20226b65796672616d65732f6b30303030322e6a7067222c0a202020202020226279746573223a203731332c0a20202020202022736861323536223a202238306265616537623365613430613839353166333030316561396538376135626233343265396434613430323033376264613831356639353363336133633865222c0a20202020202022726f6c65223a20226b65796672616d65220a202020207d2c0a202020207b0a2020202020202270617468223a20226b65796672616d65732f6b30303030332e6a7067222c0a202020202020226279746573223a203731342c0a20202020202022736861323536223a202261353365343432343331653730343133303366303234643534333265313333646163326533646335373236636265643337363533623364363536613862313433222c0a20202020202022726f6c65223a20226b65796672616d65220a202020207d2c0a202020207b0a2020202020202270617468223a20226b65796672616d65732f6b30303030342e6a7067222c0a202020202020226279746573223a203731342c0a20202020202022736861323536223a202239386134306262313465313630343235353132363332333061333437346132666132656136383866323236326361326238346236626563633764633637663635222c0a20202020202022726f6c65223a20226b65796672616d65220a202020207d2c0a202020207b0a2020202020202270617468223a202273747265616d732f61726b69745f706f7365732e6373762e677a222c0a202020202020226279746573223a2037332c0a20202020202022736861323536223a202238623935646666393735346633353637626432623864303339303661613234633937633764393764306538383139373061386464623064643535643364633365222c0a20202020202022726f6c65223a202273747265616d220a202020207d2c0a202020207b0a2020202020202270617468223a202273747265616d732f68656164696e672e6373762e677a222c0a202020202020226279746573223a2037362c0a20202020202022736861323536223a202234613963313664313865323265656562383563303234623666613064623332623961323264643839633438653130626231346339383966313833363936613538222c0a20202020202022726f6c65223a202273747265616d220a202020207d2c0a202020207b0a2020202020202270617468223a202273747265616d732f696d755f7261772e6373762e677a222c0a202020202020226279746573223a2034342c0a20202020202022736861323536223a202235363465636539306330346139633738663736393063636165353663303332646434663166623930346536346238343736393766363631323562666434623630222c0a20202020202022726f6c65223a202273747265616d220a202020207d2c0a202020207b0a2020202020202270617468223a202273747265616d732f6c6f636174696f6e2e6373762e677a222c0a202020202020226279746573223a203130372c0a20202020202022736861323536223a202266633132643462313037636333653766376139303333373563393033313062636232353635666433623530373835623662663336393632383266383363633330222c0a20202020202022726f6c65223a202273747265616d220a202020207d2c0a202020207b0a2020202020202270617468223a202273747265616d732f6d6f74696f6e2e6373762e677a222c0a202020202020226279746573223a2039352c0a20202020202022736861323536223a202264323163653434323334313061306231633531373863323638646262653631353039306531646439353231616666643463333161333466383330623465633534222c0a20202020202022726f6c65223a202273747265616d220a202020207d0a20205d0a7d0a", + "packet_id": "mini-arkit", + "packet_sha256": "9f59f921eddbdaed8bcda904db5c14dce364950c02d5d2902668ca756391fd0e" + } +} diff --git a/evidence/burst11-bs-ingest-harness-local/plan-seed1.json b/evidence/burst11-bs-ingest-harness-local/plan-seed1.json new file mode 100644 index 000000000..31ad796d2 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/plan-seed1.json @@ -0,0 +1,101 @@ +{ + "format": "hunter-local-ingest-plan", + "format_version": 2, + "generator": { + "mesh_count": 3, + "mesh_kb": 64, + "name": "gen_synthetic_packet", + "seed": 1, + "sha256_of_plan": "8c9e543fd3dd3fee1e73edafe2bf07cdb6fe611f0fd46c529ea79636812a71b2" + }, + "plan": { + "create_request": { + "device": { + "appVersion": "0.0 (synthetic)", + "model": "synthetic-device", + "systemVersion": "0.0" + }, + "flow": "guided", + "formatVersion": "0.4", + "packetId": "synthetic-000001", + "tier": "arkit" + }, + "files": [ + { + "bytes": 65536, + "contentType": "application/octet-stream", + "content_hex": "561ed4f3930f07934ec882bc0377b07e0bf6b2a8ac3184fc05023a4736f16f6dade91ad74a065eeebf8924699644db29737adc3c605edeb6fe7d56be19195cb1d74400414b982a8f410154a76dc42bc1c3b0b02d0a94e5d277bddf975aff1d60596d5f84ac6aaba3cc27d620ee44726df018fe51df3f2d1d8feba4ab0e7fd41b579509ae3de5010b6fa2e129339387618e808db6bdbb062d77f900a0d1450c8b6efb0d8f3e26ba318838d2cb824ac7857c53d31faccc8fa5534b02cbbcf65a284f8c0deada0dd031d9ea1f3319455f0e41dda10a68648a8480f2b7e1ddc50c132385a372528ac969551763a502ab8ed59b31f3b90229350e0f6e53e0a2e7560134d42266cabbde491c2b9bfec01b98cfb13d790703393d002ff574f53f0215a5cd282b5ff671bdf2433a6764a1a8927c03a3bb1eac274bed8098fda952902ba3cf3f14f6daa8e5172a1c25d02751677882fb1435089755599d20de4917319c9aa069b6965f9812d5ab38bad270637de16fc5fbbe0816e377a65e32157e7e13c8ff347627718152362f00c9d85524e997bbc083be618441995dee383cd176e07cf9c4363ca4d15da4e4cd6740da467b1c7f7d3084824173a1db4130a91d91cae65f8b1f6fc7d9750d252d2af372a49dcd856ed667cb68777c33cb5ab4c46178a3a913af1a9fc107526fbd81cea19538abd0a6e65b909bd6e4f59b0adba6f1cd5b615ac9f559c7ce355c773faa8a110863c51113d26b069ec4db7f8bbc282018b96836c46f4cf8a10bec0b9d4d26f26fe7b3d6fc760f9710037938d5e0cfc4432d66b59895594bd24f9ab99e204301cfd8446324443e89dbe469b7958f9792e7ddbf869697bf16834a28aedfe92f749e8f270ae46a9dcdf6a9588d7de9fecd8dd81fd0261c65b9aeee712d794d3e2ec1f9f6d07af72eaab97a0e88eea7173a518c591ee239f20b823e28def40a755171db7e1359f63ade73dce6d979aea1db2e320d1e6caa8a25ad563abb7fbe484f6800ccb3ad4a8b4b80f0f293542f3cf289117a03aec5e596b0aeae80f7cd7e81c536b2ef3b45b4b7c019e9f2e16179ce7be45207deb24e2b3cc18548858294fa0cbc243ccfac1b96427a17ad55e01d0964fbb9c93441957529e8082d8f701715e3e7a80d9298ab47f4d8a48cf03e7d216dd1e7c54eaf9269f9ead49207b039c85aa917a6e06e066e1a52b3121dee1d5e99279738de08f9e98f77f67e465e6535dbf20e363c2e2586b5375ef71bc749229186645f32d365602de9471a499fc821e3b1ef3725776f67bc42c07b093587b2fceb456274943733890ab2e76b7712e6ca6cc94a9ab3a2d0dae48c903e6e7cb7c70d06f5dceb660c41cc3178b4f420713c2dc6e012c3d7a9356bbd070320d21969937fb6bb1d8fd6c4b975b6a2ee95de8aa325fcde9eedcb34d1a9b6022fbe004b311c5cf65c82c7c5ae814cf20c2c048d0d5879510d09b5ffa5334554289609f14232fcc6c2e0093305e720a161a2b2f2ea9d4b4f25f1ad3d347ce02f07611206010d48eb952c1ee5b5fb8b3aa146b49427f513e769c8e9cb7fa6a93a95c7bc963fec44b2340927a52b9e81a804bc5b9b53b6807801c56758b09146f3c156592410dc57bb27a30f2fab4075ea4c83f869240289c0e3b5fd3d35b6897d000e1871987106b72d48cfe4488519518a658c8379bd4c43f6d479965ae38717ec348d26f4abe7d4b64a39f241996c078132194d5bbf9e834f9c70422bcd571714a00b864ade937e126bfde53cc8028b0ff9839fdf6a7245ade01a62a1e967fac12fcbf2b4f353008757b95f7210185af3e1837efcb8e741baef0148f3ad5c21aec8e0d3cd63355981d1f9477568cf625ff94f710d5b323803fb7e4762961f62e3fb37c4528473fd222b21b9acc404724322317d7badfce2a08061a5e0dbebf7ef8185af666eed53cb825787aea106159e5c7e6d7240866d748e1c06165d45640fcb8f93d473024cc9ec29aa4a0bf00b2e686c43d63e37b4ce0fed9debbcf1f74f5b6252cf587fe8d04f12a71361b544b9d8f2cfd5b1669663d7133b1d20a05934fe421c260326669616e4a0b17b45c8960edf56f0f1bbfb6626a0c67140deebec9d57f1a103028aa4b4e3ea3d29cb4b0d9123cfae0e42f9cd65ae3951752e486167ac78b04510bc64909fbc57e9ccf5743cd17e345963e0bce66931cb7495e15a67c2e97ec0d266256d0545dca7c1005c56b1ad1c2e5f240a629def603af817a347088b01373d372a862e838e701e8b12afc6b29e979f427261caea8f63f78c64b0e56d9c561f7d9525cc163a8bb6487aa06710738641d37a0426b81e49e8c1fab38e6d0d5aee38114d13e29bba54c8d2f3d8a378fd16c3468ebff69648b331c25bf03536a4b9eb0d42eea304caaefef1b81145314c2cff4eb4cd34dbb7724cd15c5707bca8299929c1579c4668c1c7bbcc7f2f8d4b0ee3b4e2a815a544bc16b98f4a728ecdc0e76413df594755b97b7f1108a24fd4bda63b3b77200a3fe24fc3064b148f8a1531ca0d2e158621dff3d764b6f4e137956cb5c11da7ca3902f326d93f0305c5a32495d593a0257c0faa1dfacd7c2eee451ef6e013474b58b9e69dcd65df9a40a623564895bd0e81dc39d2d52c22d94a1841d703210a74e2c64fac9cf2092f207cd82e9991e470c9cd70c952204f8352cc8f4fcc3ff1ec53b741902db256ca623cfe063a516c75d936e0e0668ce8a7f77da190e7cf9b086519fc6afadf11819ec6f51c8352bb381054cb7e5a8295ec7cd565182364cc02aec57b258cd13b32e411d39c0577208648e498d27dae626859e2872d168c14fa8b787a4563371313e8e5bf1b0825097adc88a542e39b6b8fb00d5702f574a64a2cc1349f1838c7c940523aec43c2964de4a1d3c044a7374cfcb3daa725e07f710b685baa8539e9167c984ff2bdd666fd5739b872489cd31fcbf2c0be3ca6c9885352717df95bba8d0761c13efbdd4a35e8e16670ffb739de6c821bc131031d8da64d65a419485e74c7b742813aec8644f20f69558f8dc3ae9db68a5f80af206978a544443c138b978c9312765355c11bc115a6207d2c670e7a7041d06ccc18365a90e85591160186a8e71ace418659d7a3ba34c2ae7bae71c8b8ceba6f5ccbc50ba045988ef0d551a452f15140c245e7c234f7934788e22d9a061b292e59a028247e30bb87cd3a398d8ef2849123e2c03b7056cc67ce8aa18b1633030bbf138219286658fb69b69138f96d4bf69521d2e3b626381f5d50b74955ef11140f608804de93a7b3706d315931899c628e5c6b17caaae53a2146d71eb11f7c7f630ea3d3a0a522785092878eda36ee763168080d4a075e880cc73859fbcf4b0b845c79769bf803943c9d7f24ea3868ee02114fd20f0c8073da98b5399992993297baffe63f7a8fa2b8255682c70feabc42be24d7ec6d21114de1c0f98fe722289061dde774defbb7ccba9c71238003057442226c0c07f4d14566c1191a5d55aa976c0d039df236b831d2817e2374671d72d336dd911382966cabc3c5cf43442040de2b193154ed7356999e3204336ee78b77eb3b529cec5b87925b55bd5897f2408e1d459934ef3a1d2115f5b1b29a331f0b7b1487e2196e5960a8a34e6228f17daa2116d206f1fa20b168f3d2ba7c2f4e470ce12d27ed8bd8b69caf2d81706e5b346de1d2817f58a03ed69db9d0c17a54898a91cf3d538807351acfc6b6b590ff0a17492a1313154a988337b4c8b104a74d0872741d423d91ab3006527415f7e7617a70cb86b7bf1ba2fa55036b7ff4082f8e6b049550d62b0b3cfe68975ce48a02dccb4209cf970b4f32164a69ef655ef5904f5ee6ece6d3e3c17a96b41625d03691647204c78549934bb4d1513f3b3af38255bbea72b8b204cb98894a2925c30920a07bd2983f4896d89b8c7fb32b042bdbaa045c53a92f8c65c94aab8b4e2efb4a2580d4579b02ce067bd21abd78a746a347a737b69972f81742f848b21664d1a65758c98ad34ec31e76ebd75178cb8c0d1a8784c59d7751391a76d7365a789ec5e1685a03d3b978ecc90052b08fa372b892ece0672d3f5ef478b0c3024f7077146bc2fad36433ff709ad7b865107c3d3975c00ea90019096eb1586d07aa5981bbea9b79e7e3450a2de7e111ebcb5874cd7d5444fe664a74bb10d8884660d038b0930ca10877268e54bb1e91796b21139b96986e3d01f37154e514841a6bc41c7c16efbe05bb78806f8496adecdba9855af01becedc219f66df9ad64a6b368b4ca74ad0dfad153986d175bf61eb3471b21d523c3b5b78fade1e7d86fba32a86b439d7baf8c7c4c59400c3e3e6de332577a85ed50f0c51c3f3467ab8a2f345e79b6919a0c7fbe38a23acbbf397ce3b3e4fd23c2c2db97b76f825deee438e938dec1f27bf3d0786f5a37491cae70e23dfff993f278c8490c9267c10c0c34c274ca06855ff2309869de6f053320844ece58df4cd807b6529a1edca8e2a46f6e0a297814585bab585d44fc92f51c0331755dbab4bb5b1eab100ea7494b4957612d85eb956ae956a7105d4e31340179ee1aeff818d3d1ddcacace6e433a2c68a0969304b4b9d2c36b9da10c0a28c057e6235ef3dc5098b075b830efb87fc49be14bb2d9d6cc36c7f847a46ee4ae0b9642cb98b622f821555e71af5d57b86e46dd333abb543935d42cfad3a3863d1312a58a8a20c8b8103d03e7f445265187ffb71957c060452702de01a3861b95a5a8c8c922c5d83c5527ab938e783d197d972befb810308cf61da18e27a71ee99edca7f3774b1d543d3c5f864966a2edd6468074fb63340f468a475ae0d3875c5d96bc7b1d279d59714ef7b3de753d13d6fc6b0a1cf6480787acf8183b3eb309e5338e6e9dad9b67951e9c2e99a957bd8e8d7d0fbee5b396af71996dd8acd43dbb14b48fe6b5a0a79af1f0eddb47a62115fb846391dd5dfc1e9dc7ddbe4fdde8bc9272402a6687cd5caf7ca8f16a475871e1c90625be035b7271176059d97b0776684ebc5dca9bde5ccc34359a049627364c9e904608cd1966be5547a79c25229551e990ab2136b6878ec60ee1299815c8beb35003eb8c08c4a7dfad42a2a9314319e16d3815adb7b40b923551676d8052e9332eaac6fb7b0c53321f9957be719e40d034821b6fec37d704e16151e3ea93deec7265b74a05ab92b2e58e0d3550a7fc1b157b7cccbd611515cae3f8c04c2ab02a321e7b4c0d8adff85d2c69cb8c505ae6b0d35a5fc1afb810ab4366f45e16aaae3f11003ea9a3df4bda958248ee7f96696602fb195e1c89966980e8a370e6f8726409c8ceac0a082fd8cc6035d2545ed0f72f609794d5c278920c1281e02e57f5c08876dd9651628ac1ddb4286908c8ecbebba9e28b49c386cc497d3f209aaef4ca083e3c095d0ba30ec6170ade9519d11a10997c0f151c9d9123d88f282aece7c1d3c083b7064de13fd800856306f83716b91f1c3c5f01c12e4a4c6d531a22cde1f406a9bce443d008d9ddf7d71a22bf54cce40ebdca518d77efda68a98cfed1c7091147bd34c44e95ad007f217b47a840cb3368f64389bc45e6b11701edd2edec6170672a559982df31a19d82619eb98479c29629bf63f7a81680ed076ca6a78d2181d663414757ec18b6be379064bb4cb73735a3bfd6d296d00cc62d234f7e24cbadc821fa8cee2e32d7f250460a5ce2e44360cfff9ad4fdd9ae568a35ebf559476c9726b8a4cc5f88a93fb06a06e28283c4834dfae795df8f2e9f7ae2225ef49d30d1c8c1c19d01b2a078d02621623645355d012d75c0f3e683ce2edb594c0a4d765aae37460bc3bd878f61634779eba4c8915ff3abafaf7ed5f5cae2e792c0bdfb54a3423052e73708fbaa8d8d3808a7bd0e4134e9a879eef4328e3fc0f8c6425777b3cf6af1628b8bc77f6bbef6288330ced9a2be4e3ffc17f703a9ea63cff5f3f31b35d0f4899cf0f0ed8c3e25be11548896d89c958876c5fb50649dd6727d43e89b016aad442d8b5878109ece0abb2ded5ebd2e3b38062e7a3b24f7422de9b73b094930863563424f290ef2aac85b0afef45019b6cc3a0479d5bb6306bd3e92e1ca73cc1efc0ba6e036e13f43fa8b9cd17f373030d55a281a5ff3f2b18e1e0a2dea6748aa462316752a93d2ec0f5c1c3d25cc666d3b3e31de60d5f97819eedda8d3e6310dab54e5d984abb49bc0ebccbaade1a74edb93959fe022988dc03c642db17b4f914724aa564969fb7359bdd9557aa73d5c4795543d844f5012dc8716f38a40921a480493792374ca02557e90f8621eaba2d94cb3b9b7d85852446dd90a27678d80f23bf3d57241ab6eb3133c034f77b9a0f0b7c209adf8557c468aa00e5de387e5d7543bf92e850fbff3c78445b335e0ee7d56aa4d49ae2c47fee4f0dfb07a162493bc5d6d9867cf853b0fc73ad6dab18c6e6868381c3a74913094af284dd4f44dc9e83790acf77e68afbcad6e34e4ce4e5df5b615f15da44b53e3afffdeea1bfe0ddc8be044205508ea4182d32dd2b31ae8e40e1196b59e7a8be2eb32d3873cf676a3ed68b6df704836af7e7bb07588017565ed63babc25f5d55e2352061edac40cd97bb39033def0ddfabfdfa140e20241543037edca5ac4939c5375be226479deb15cf223bfe31f4ab114d4b1b0de57c1e3199072852e25d08349931baa5fb658131ae5dced49fa57bbd22b0c54165ba305632289d9983b6ebfcff5890c1355fad0c2617043f5f2c164d3347361d7edd7751c82fd967a6f64fce639b8f7e1877da179a33002aa1d9a29bc6f640a9bd6c412780d3be66ac808c44c1441d60b2eb21d3f5afe72b107a351f7a6b421dc01d6467697ebceb79ac951bc6363bc4a1a602bbccb9e5cdd9ae5841068bd3681e37f8d5ee1931eb548c11a4a1fbc6422624ab38a3bcaf57803811abc479bdf3b06db441414b698994787785907192b4d2b8765a1921984e66a26c7a4c84555dcda02432d2546e6513927751da071d2c37841f9c26c15412093df4c61a6904aa2bff5c3cd6c176e0a93fa69e7f20f129350dcce851da823db41b0ebf7e30176333b9ddd216e2b6192ccc75267851a853cbbcf0d43fd2ad191a774ba919f33c525cf90aa03171f11fc7e8217441aa97669c2a8846043ac4990cdee21f6c6b95bd30e4abbff2df35e87b35d353b0a6c80a4a4bcb910bcbd95619905d71d8a27beabb75f0a05ed2d0571f71ae86bf7512ba058d0ee1d551711a696d2461bfa0fe8dfd5bc167ddcfe1cdd345cc6e6e9011daccf82d443d7e535fde74222d003fc85e47203f8845fa82626dc05ce0f73a9234e7f428a7ed6ddb74320468f05184967ca809d9f0d33942f052ac1913a8a4b7c725c3c938389c5225d85787ad9e492ebea3ff0b2e7defbe44e7ee5fc4d4bd79f01e2f1481c6640bd945579391f25ec13605dc284af3232603e4ca806575091fa277b91d85ec58f39681272686f817a0a550e4f3424095b385b5776e576fa3e77543a56b1ef0e11010335aef5f6b49e65d570a4a2526c97a2a89dfe8c233a56eb7171fb545bd0c0a0a8e011f9568be3d2d8a9540708264c39047f6ccde6bf67d0c9056a0e0e730ebe9552d42730d60f0ca940a1cdc120660dfbcae5e87348c0f324be549ebd8f265e2ebd61701816646e77e2a5d5de3cf9106b46eab8c667a6eeb82c699330368697fb9387ad6ae432cb8216e0e540b38cc11e4184f4b8cf3e2aabc7f98c6fe3733fc9e61ca80354b7ee3d4d941ae8ef361372fae966b98e9ee9cfbd7e01daeb265c0715da9300a733e6e83dea3abf0ec541cfe9dd5657e2d261c721c498c43537d5a044d7275f1aef8bba8471ed700c1e9754ce20af04790d4354071a9d0e2fa6ae9767cfdc58b4919adffe681854a6970bdb74c8ed25889540c35326fe400e36d2306005b316e61999fffbec14d5c52919008c2c54a53ab0a4f388246572cdb8e75fdcd6bde477711fded3b2af9d24ee5443d3e1a81565be97ec68a3a51030488a55d4249d77766791b1fbfeb3e885f764d83e84f04de4b14b62abb94686b1d00f725e03712ffe318c012637d67a2fad9d4d64d5fd53a381539bc6244f3e78c30ecd67bbb79dd41e440518dac7a985f43d162c6be3dfba649ee472692a5a7e7acb5d388d46923a1fa2ce066aabda3ffd5541694984350a6aeba5e9c264dfd7dd338cf03b75e50b3750b1c0a7366e43aed1d0c77e92a2040fedf777da3a2ac6cf0bc5ad3cedf2113e99941522eb337b9b7d27163e65faa0d3355781de1c2d20fcd12e2ea73b1703c31101e1c32ffc5635403f3beaa64113d7dff86f2bb28e379e0f678153f344c8a64393adf381fe450f52cabe008dc5563119a3b207344e0bf2953449c614cabbf86799b33c6cd1d8cdc5d5ac2263fbbfe584550a1d497adece4cf925336f9c9afbb34c87b96a88a1b9c5ddc5f8f5387ae6ac9660fb224b115058b985edc5928c5d4163c1fb6a5006875f4bd95c554adde67e282c71ee3350070b909a4aabc51074844d50ef869dbd3aa0f322952da237fdf01dab8acf399177f868a7be6d6f62dcb46a7fb3ad26072b8cb42b3dbfce8dc70c6e1eb22e254f2645b1a0980f82e555f8770bd3fac9f09a2dadb8fc0d78cdbe97007b04d38e0e5b25f1ee21776ef5b6412dd6d09fa276d155cb9fbd07bb8434fe91c90077976a7c491ea51a422a99e40da517de87f3f6795040e0fcf8aad02a79c95b81736b27c52e48bf1ea6679e13c0cecc721709bb275f6ec3e2bc1f27b572d4e3e98f9b51ea0df90f8529bf528e2d0b909e82d569bbc4e14fedac8b13fd0ab9936e19e9e2e141daa85dfab80985753fd4cc85d85653e9e482df2aa088559d44d4c95e614fb1cff05dca1516a9d555a6893227054291464b7bec6a128c276d3433faa154e3f196d5a2e005b13693bcb8d87837f1814edcb5feff121df9a1c860fc5d9d4c5c679b530bb8c59b0c942ade171176466b55292b10927dee8aa2e16762653f7a2ac7f64bbe68353ba0267c6a7af3bcd710f139f66cfbc31454061eacbc71497fd5efa486e016c5548565be2e4b961c4bf397412848b3f94d5dcaa17141a2385deb51b12c89964bbf42d98682a1d98e9fc77b906a42769b369df94ce25a3e41d79a0047f1c5ba540b2e9641e502e0f5df5cbeb4ebc4fbfb756f3895c362a0bb42596532f9a43759162c07b3d7499e912abf6ec4219651be4e72030b65d4075bcb6a446e0b1b34aebd5a3693c2b4c14089371a62b1db88e53e691bf178454adfbfe41b4512614c42f570e3f6be3e020022967db8b170b6e2c230a36d09375821f81518d4ab8b1ec9f1613e99c7130ad019bb8769959f292a625d7dfbf5ed4fda97bc9cdd8d2a51e8ec25ac4f0773dce6bf7c499ad0d919daa6c71b764ec57f05d7e8ba9e858748607a47aa2243d1edab241477fee5387b8cbd861bde4c1e273ac6782af140e88845a0d973207a0af5246f97c7b1cde0a89a242171bc3b156fa70626349780068b6fb300766d09e90e69766a939720a7fe82b698d7dc9cfe17dac835166077baa4fbd843a4f2b206800acc90f6539d07f15d79c3c69b23e9e049a961065d80e30554b2c2d8ac98c83ebe9badc1c7772cf11773c56ff33e062249beb1231051a46bd13c3fab7d391e49e882d9e58d38334b466d4ad0fa1310c4c1642fb9be95bd5d2fc86e0ffe614c48dbf98571bee340f3ec954ba8144fdf04b2c539a125c5881780d8502337b972ed6f1af30acaa8567fd61e6a0988576fd93457f8d1e30c9950376435c5fa0a589da4b52490274d7b0f49808587f18735224b969137d1178ce0a5610e39b0fa16607d7c1cdc7fcfc2ae145eb690188f6363d151bb4e0fbf0b0db42cdb8e65c169d97a267ded9338629970e993060bdffca734bc70bd05877623be8716f4218d33ed2d09a9dd121974b6b0f5ef93d73c8eb35f6d9c5266a020660bb165b21869a627ba5a2a1d234a45bd8378b6058955fe9ed0ac2e8ab761cb653b46538a2abee47e61c4c4c0fd3db9f80f58113973519732d3e397a2b5d79100ff616a09b3956b02d4ad6251e2aaff30a3e886b808f9eb02e66c545c6daa826bba38d5fe9044bb6d8ed6e49d3cbe4cb8a31d97cf094eb860e11efa9b4c6eba5eb04b2363bf6f7af34b4576ceca81096b2696373e343e4122f634c63ca701cf2192d91d4a309bf3c1df2cb29b73c0bbc0c0aaecc0fb6a4dfeea58c53f73bf06f7ba0aaa5f32cad15bca9a0d2c95706c1754764904f59e317a521451d0c4d40632a20a0bb0b0b41f928d2edd55a5293cb8f03036d983300fe5e9c9507e1288c5c860ba196fc8c9cbc7aa4b92421b1a8496bed077715b9cfb8daf3ea8b27bcf15e0ec4322a44423996578c7d7a903db4ea9be81d86e8ddbc6f466d79f30bf0a258a24704f642145fb7768250d3226c0290bf9306823469537b04ae410959bde0ea009079c53a1196493fcd02231da421bac6e41bcce28269f5e55a2a917c1ac1134a5b42cfe525f2ebd1bd6cb2160485d56620bb84839caefe0adc50a9b5af96fd362f81a866af7443ca0b548d7eb07fc3acfab40108f70e2f418bb923a11ba18adf2fd0dddcbb934caf1c2c2eb3a1cb199a18e9803341463a0c1bba39f57ef4b5ccc892602bc0cdb8827a8f48852a60be2f1bb17623223e01fd1bc4b4eefb1bbaaa771b5f43c6b698f6acd4e6ad5f2a6297eaa92f2fbebeeefc26efead5817014e57bd12dd1f523a1e5d868836f411712a3634383ec91909c76cabff4a632cf7ff5d19e3710af6d9344ad9af3899a843b09e568c28a5552035247bb50d3974e06e9b93ef49572eea43b3c06257acd86b5b0cd8864824b0718dc9a6521294d6a5df162595e28c5bbab771ff20de359967af8f04d8ae9878c92beaac3ccf2a21d5f4eed8940a893ab91a53bdd8acbced3c6b735687fd41f941391d3de7d6641446141c8be37184a4a399c9f1c3d2130cba07f4899fefa14334666bc9440b275439210d86b5ce1cd290c60b8d4c3affead0b95f16e6608c4b5f0725f47aa3946e3ff6e9c41c9ae0b619a9ef672f859d2e71115e1c493a8b346706329b14f1c2471eb8fb8b29551a55cf7fd466a1c78653665311b305d5e1ecd0a0d5961500f722f8384ca52c4bde54811b78ba4ed433e1bc1e14adc6a41199c73dd56c6c67ab0415f752299a2515e2e7ee3bf12bd46d0108abd4b3ae0e678872186317414986a72ee3ea7de67ba0309cfec5b9c9bf6234a74397ed0b3e3c0ac99a6496668a60e5fbb1ca8cf46d6fa8762f24916cdc9fb428d63a11e693d49cd02e9da5c883f04c67fb2dffd2329ef342f7be2745ea8d4a43ed7e9cda109f0616e52cc0773eb506f018abef43e97c926682fca72e6bb50bbe3ce1888174a712d6ef45235cefc6eeafa7d322689ce1069b6d4eefda7af0e2227970dfc8f4c5a2ebb7bd652c3797612eddf2e1e81aeef91240ba1ba6fe3a45f62355f865f4ba10e5d1625330f9798e2a8b3e0a12ce81dd4ebbe3128265ba070c19655e6349769c2b408a9fbce04bc0cac20ae1ba928204fe0c981468baae850731e795d2c2bf769e7442b15ba4e73d35257a63f4688104f13ccf9e0783625d417f050bc799381096dda2c8a74b06eb48462792916321d6e957902347bad01262d1566a55b1e3546b161bf27490b87183a0783a818bd534aca639a63989901236422abba2f4abf20d17bee37955c7785d5112184056f4fb81ce09ccdb0e753a2310d3396564b054e920785324636045d3839ae6260de004c8f788b9660e532322d69a5ab1994d8e6758572b4964f451a090cdaaaf9e7bc6638fcf90f71d56d28c77251da5fece4336141ba4ee1d901a670bfcb7d0e94f590e137ce7b2d96ba2bc9c63ac7e1bba4f43c5b09ad5ab9bd6c58ee986d27519371b326c13905c873254a28ca7e602198fa4566817b7577a70a59ee7e8c8a8dd54b07173d23e83bf4646484053ee230cb7b470e37499a95c7fdcdb2e4e957f4709174342b5570ecd025c8c4bd5e94adaeade9dab2c413f6a16313f6742674df89b20af21e4c0376c2f4ed1363c65ae945741a1bb6ccfd8e63cd648aa4b5d7f95cba72a54561560afabd04188be06d7c7ac32f882a63d2775d32cb26213e740708b1cff7c42efe10c7adfbce799107098d7ed63375a14c325e6d7e1f6f1cee7691148729d3cb088c7e39c6281951de9ad8eba2e907b04e7cba36af7905479cf3542381e3ac1cc1e67edeb6896fed519e364af6fc057b47cf8feea999c554b46888c090005a81cf75983db24879fcac71f96e11897b458dc9678d5e30ca1c68fbb07d74a64c0657f2b12d6f39bce13900d019baf67232fa6263183b8c9333fcd14164b8646c90e7d2c8b5fe7617b81aa36550adf0233b6fbe850ff0316b3bbcf4b8f1e2b6f1d647c89a23916be5b1e1ef36aefc9746d6abcbb7092bc3cae4abcb51605de967789725c9bb36a370efdb3c4bbd44079f1305eee70a6f56a5e25586e586ffe70043e1763ef8551b754d05c891f8258ff4b0683eab8fe74a55d4b52490c2d9f93e322a4fbb39a6cb29538d7276a25675b93cb3ab33ea462650a16232f323aaa57b9a555df07995565eacb18fc0f5ee823c36dbfc0cf8595e047f25e89c3c6507f30245862a6c0941d10deae28401b42f93f0e2bb8ceb5815b87f078c5c803146f0483c4003447b879719719a2a1eaacfe92e6317a9a73020a10ebec4c0f2103f8e929a295b47c3e8316166169cc0291534912993e9185966cb2b6ac14c8fe147a791b01d5749d0821e8c3cc7f5c7299121def71bcb0006308b6f3a8972283f6fa9adbb5dd573284eb557e8efd85bd948e6fb0b480bfdda8a57ad88ac04a413477ac4c3953fecf90ec60fbb31b07e4e1fe54c9a876fed72c705a8a99a5a6ce29f883bed968d6697f05649cfcb52c87b5b024ac4069a1cd6a0c9d6346303d9641caa3856ee486c7278edaa0326d4593de62c0bfaa3f11b082cb734728a79bf622637792cbcb555585ed45b12eaa5b4d1d8c913248b7064d9159dd41a83721f47e148a0d9331ff46c261db0ef4f1788fee001589335e856ac7a0e1f8ffb972a1bc8a4f83362d2e298273ca4c642e2488e5c6ac1f8a182684395e77089d5d60750515d6b666e62b12ebe940e5df44c9dba9e7001e5dc9974165e3da35cea5e26166579a2a2e6856eea8fde7939b3a2fe0507c6b23fffa5aad2817084523230d8f391fd36a1319ff4f223720e857aa9dca455d76a1fa40c141ee027789052b2f1fad5651a09e19c69dec8867d820d976af4d1249f8abae8699154926df6d8e6149a0cd8b2380b7771d0eb939efc091dfa3fb0de6cb6b78d569d427b351717c51b0df5e3d2bf093524f4fe16afe899fa14bf4a48778ea375dc4ea39b3c11091c3728c506cfd7335f655ab4aa9a5de383d4cb81ea6fa4b2b56e7a383afb3eb34bd8cc20f34370a1fb15c9e2ae602afe4b6da35c1ba4701cc762fe5b22d748f3ad127a80e052779ead990bb021672359b7f96e4fa1c101e0358ae7ac162f049e08db6b7aef0ee2eb3966365cde4b85cf42a01c2300be22a8df68b79a8bd239169ccd255a81a608c48edab864fb89dec19734bff727f8de897c42e45f60ca721116d3a9121b90b1d1059878bf36ed95fc3987056175e486f7e93b22bba4887e94f9bf4f97380e8ea81cbc76ba393998e3e70fce2e3762d33456290ec6f93823d511709944ac7fd06b6c9c326f197e4a3c2b91811a5f8c9fcff1a20dde8425f819a6f1b97f623ea6be269fdaba2d179485f349e89fb3aaf7a3bc68d7b4d565c4d907f2328e408164bc6f9079f3758f46105707e3eea54d6c26f6326d39084683168dcbee060715ce18764ea8e2021b92db07458e8287ca27d7e6040aa852edb574c353072ffbc8e2898933df11f210a6a87a3d3e19a480f6bf8bc7d6455c4b90ef1c747461cbfa6a56bad8e2ec86cbcba22c8198c8998d881de8df19109f6bfd865396119e513ebb794896c4c507270ef3cdd90d9809bad18ace8e978210aa9ac6585ec0ebeebc037c510a6ce640ebf2bd297483d70ececa3f434c881aeb5dde06f693905242dc8a59ffe94eb781fa0b7c0b8f191d0d668d9993053ce9845e21709436ab8f253122c451b1d36927a5c2d38051949fb98bf89d5b479bb05f43405d01a4a43c4a358e8195961dfe7b2e6cf6896ba428c5c9c6f6bee448b910bfef6753735ad6a584b8dd094b8fa3d45c5d8a1a491853b76b29c220336297366379e83fc108c3f51e580d05a25bf22b60c378df278a2863959f9384842fd6f3e5be2197e262737ea73e019513211c74d7fbba86cb5649781d8c1ad46047acf4e2e60e8009cc9ea0567a10750baf04f65d15fdfb3dbdc94ccf09c162efcefdc79fc212983cfc3f3ba75d48e6b3830f7487e99fd33fe16850e95cb3d2c7fd1b63a85984f20dd0b6415c0dc0479fbd0715fa54c23a8c4ad5d71be71a80b7bebdfcc5cd182261da514a91da35ccea5c69f5112cacac1c96e5d896a0b954674ee3a81711d6d2c5c0c7cda35a2f2590ab4ab8f3313041e5cfabecf8ffb1e14939ae53bb765b79ae6b7d652df38036b3b3b765e993b48614731ad46daaee44bdcbad23e82927ef8c70b1e88f448d4032ef1948272b68c6d75bbcbe2b12008ba28566aaf48c1826afea5326f1f77a3ee265805625c0e533262561ef9f2b6d25c9f43beb5f9c6a4db538f0d29007c992f163d1f09e1cf26f459636b0d728b2fbeda3dcef535f16cea4905f0b123dc00a10139c0730e590b5eb5dd9eae458cf64c91bb22591002dad76cab619e2dd783ece9acfe24b6d6b219fff67e94c33b9679c69996a63b924292a36d56c764e71aa26ef01ddd5cc066c542d0d2e41505d14d736b0af30d1dbbf79783c232c3e9595e8a482343d4f4de8e1dd72d84fdf5f906bcefdb84f8767297bedb4d79ce1117641ef92e466e46464af6f9f944a746f888ad98a18742304b60e1460b02f84d2732ed670429cc481cbbeeea04b53f3940d225c90662110d24492eecb0851c73707b377d867fd56eaf15f1f29b662360dfade2213b43276e9a5fa0aba2358d560b19bc16ef23129060f5ab34b8fa181f71a1404288d817624cd6ecefe5b40d817fe9a56bfcc8fffe84d9cfc387c786eeccea5d94cd2f30c660838356067613507f399419244625674b2af89617f1ccd4d9fbfeb66e34649cf205b8a7f7f3b0a24d57cfe7137596e2ec6190329fb5abd23e5e8cb1e3b920e951084c0eb5ab2fd2b9f365a3a58f0707a317081327f1b1df9e130c274d8eba654579894c8581be7b2b4877bc33478644c6f07746b7b00378e407d54a7c6f9a0cfca2e0b1a4575661f4886917323a93774245b565116997cc738525c3013193050e9676a70871be6730b2ef3a77baf2c24118700b78307d76ab2ddc1cbbb965e9523ab8d5a298e969ea9c697a591e1a554fc5ec07afc5b95e1c92b4907f77cd3f1071bb57934d95861f687324467b2b5fb3df3cf4917057890c19b2074246d5550d2ae395c03dcbb169d9cd76e7c6720a839d74d7a5ce52b1c0821b59273c2b7e5f7206e53fbe4dad6a71e6e71ebed8a90051a1f550ca071dcac0995c9020dfdd987b769699cf4a2a377331035afa35b5a053c5dbf8305711dc59b63215249caf8e7f9fc2c045e14e22a4284d306b564200d56dec8e0d7b3c8d7a11505332c2134ca5e6ef816c3ce38b5e0b2264abefa30f7f352db2d4ab73ae421ccc3afc752be7f76522a269e6049d74b1a3f5341c2e2b7e60ec88ec8cd45fc27e81a084e4ad4685d68761f168758b8b5604e1fc639f7e92ef6e039a6b34b1e3fd98f34e1c339aa659bab3d067aa19a16804c6dd11dc3778a3433ead3ad0caf142b222833d94e3fc2235b918a0bbabcd75464291dae9c8e6af78b75ae525235fc6aff43c99b7874957c9c7666e65315ff82a7671a59412a37899dc6e8238e49636d24422029fea59468704dad5e1903f6b6c6f0db5a4221e206a50d5b291c750899d7c10f78a6a70e6fda307f6814d3e8de881e5a57b32afd774c87758f667082b39e383acf9532e948bd655998050702f802b5eabaa2b6ef654b45c2aa7e6e8c4b52cb97bb67dfd9adfe8e0d935fd43f07b09338d78f7101ee57151640f1fd56ce34847c9c92752d7e7bb369ffaa947bfac8f90086be0765cbec34f9596e6f208b866ed3b882a9ea06482f990d5118b695e7b0e407fef9b09986a9d4487a0f03b688b7ebf8152c148aa534d1e9d6cb6c064ac704c6867d874f6120d66fce335738abc7b960b2d1b23de710e6092cf3941f16c3a9cc9b783d120e579c4c96a5cb517b18f720e14c174e7398f3cf1a300c578431bb0a3bc6796484f0ba21aed248cc41a90cfdef575827ca48d3724d46c7d5960eba0c21fbafc05c39ce81991c6035550526a17bbbee56227bbab147b2ac58e94e32c94888a5928bb2d2cb65259c8c1203acf8176ddc96efb015aaa87cada4629294cc1b1fd1e5585c9a296c11d36592c2f24c025c6733f08ad9793e85afe04c213fadeb27307884df36b9387c3a15835cadaf115ed0d3cc914d2c9a8c70b008fe2335b3d0749d7e7c2e16bd906970975ea1bdcc700a523f005a15c1a427ab78e6d217125eaec9de2140a1ede81a8ed1196fd8ab24054fd54efa62a56fb16b39b822d9c7f57536c97b273a5818b3e2ef74a9bf472d7cefb47a9cbee768f401e82d4e23cf5d7ce17e4931631b05a348959723fc4f884a399c94eef8a104e6f770ca15bfca331368fce374c569d0ceb19ed3d73445142fa0189a3e02688009a945af59816150c618f6aca41bf32f3c6f00f4781715c7f407352d00bd549639792ef6058c734e5553539a34772c2f0150d23b30b677774ab8c82d18f60bd3e357a90d152407835ae9b29850e9532fcaafe52aa4202a8b8076e70b2d7dea784afb9e454cef2fe6a36c892bf3c4cfeaf3ac46784062cccd1ea55fcf98ccad65deeb355a8b7ee773dba830441b265f08a102233426d523aec71f7adebef0cad2e33d8447cf6ee897bf40a3db321304ec2b1fae5f4cc29f76848cb377d101c801c8a03a833a209a66b820f3372ea593eb6b302b8bd9276c94a9c0d2b4fe1d4aa3862d613b94bce5f4df1cd9ee3b7747f8eddf95a05e7c45e9911db8cb1418b72a909a96aa6538a16138e706739fcd1825ccc41f92addfe24fe9becf19a6c4eaa454d8d9a2d813e1f70c1a80f27522f11262e77e0b839135ee01e61120371f8a6f9191511b981178d095021f43b7f46764fe956663132e509970ace015932da3a222c22d443ec094eb4030205c0ac7a1add1b3e40261586d965db7a389913458dace4f45a67b97270b68fab002cb7e1ad2e8404b594ced027c69acc875acbbcea7792be71ae682c5490661c1140790a5803af6a179c69eeb7999f344b70248ef00ac72207902f4126075f2de480486dca3c2f0d15e93befa33bce4cdc972fa1f7666484eac910a7a8287dc2943e8f79711e8b19383b77444ed905c17ae745bd6738d638c1288c76b0bb0cbd9d1172438ead15856ca3640e15aea5264585761cd5c8721b5518bd5a5cb16610c76600ff5263b0692df8299a6838028049ec2feea59095bbd2c22a2ee9abf257af82fe2e08252ef4919f7b3eedb011f01f80e3431a427b45cc3ca0f148f05236906cf652d5b86e86a9cd7859567cda8178daa2198c86548515caa92a444fb236028645c6a50f0b268359a195ac3398bbb15ae61abcc3d90a56003eb4fd03be9b9481f71f5c6f3e85dac3d172cfc594e2142728f9e8605287335af90e35964063ab538d71e8193bd96209dd4c552f3c457f6d7246f7fdba3ff00cecf4620fd63d1d27d812bfaca3bdb6e04dbcc3daa5f0634bbe162a96151c172222c4844d4b8439573d5b6f40abc246a70aa52a93587a2ad755029ee0eef2097c006f6ef1ad672e5f69177dc66a2cf0575238df8905c187e59a9b150d895494619f27b2a006f1679ffcaf63a3fb228c9fc49c6ad1094b4f91d3838e355f2c6227c01fa67dac1d7763be4d4acae5d444bb1662132bd1f8b1956d06db3ff99a563d96d6dd5d540af2dbc638ae84a0ce82d572d5a2e6a365364ef113f5233e81732fd8edcf9cef329d441388383b1511ceaba09a2ef472870b533e98d7aa638163d10cc9b6e10be3cd0bf1e51c07141c66dd97b6095005cf90012f731d272c8557aee7d07fbde06f420872a1c3e9b2818302422cfaec660837c25fa6ebff19c5fcc9f2bb5c798e1c02658cd36e0f4dcd345bfb1b39d24aa6529796c69b361022a72e441222a206da7a0980235d38c766f0a3439ce3d996ae76a09b1753f252ecfbe99a5fd7993a4d1a63e928145446dc27f624bce0aeece183d5171bed620e33c09f3daed7352adf468e8a96e5ed262ae30326a6b4178a58f8a2d459d335afc142e317562f308fd113b785370c75d2363e28b784d71449eb727a31a5811f26819296aab9443b068fd145f9db1d506050888dd045294aa73a6b6176ab324a4ab2f2a5b2190cc71c00f861678e45e00f97d910bbc66da3431e45bc6c39f83cde948d1b33bf31dcd20e89ae161b0a702b5f422633375e4fc280ea4e791ba4b464672f6ccfde464559b71a74e09a840add61088e851fe826d40fb69241dbf45941916bc82a083f882277765c79effbc27fc4fce3b82b2b35f8b96b7d701831f09bfd1af29b610205989900f137b98b907e93850ed0b03db5a494cc84103fd8f1fbb44bade15c6f592b7404f2807410226401987022a7b350bf0dbcd2a50a47ec02e59b30cfccf6e8545963ef7587d1b9740afb91b539e66355041c51795f6dd1d90c9bc621372522812a2fdb7a6cafc4af73b107522c2ffe1e2b1bf41791bb6b1a46f48b4eed082bb08848b1bffa2d66fb46ee8916ff14ad1a4c8b04106247205600b95f37de434f0baa0e5a3e457c6ad574f4c81bb54d7121edc019d4bc9953855d782ccec1849f8a11a3ed742741e0e2e5df9c4d03cae10f6ee5522e8860677e1c2bd5373e4a29bbb49ca5409ac7987e493ddf59df295983a76b5f729981fe233ae59b1d006bd818ba4fb41b395d7130273f678434cd7c1caa782e4e8f2a4f12c8ee142ad8b3b729d29a6a80967b4a731755fffd6d8def67b5bb743cbbbade55207c6daafd4bac16ad6ca6e60eda5e8f9fdad0a203a09eb8e8bb8bd652dbc0c08fac73fa0114a7c15fb53b41ff9000bd189fb11be404d45b589ec02a58d13a223eba53c58f937f3ac5c42e3def060ff5086a123ce3ff615eb8944a0fba42729af4d34f1289df2e12db8a47b3e21ea57d4404119eefcddb89393ad621384bb216666a3ea4b0c2040a6ea542f32a2ee221e806fb3cda03a0b57cefe6eec043767939ed9b6c007159c870a809ce470158281b811c38f3fe4754347ac271d90e049d61ed96a41f94bc28738909012c53b30fc3d6222d36bbdd557752af3784d1dbfd38a68c7d42505b71c8652792483a13e9c6e74a51244b9f266aef90f944e546d1b499eac802dc75dd485610696964d1dbb323dbae9eebe8c0e55c34683b713009614a8c7ab6c0d90227f8c66b0ba630177cabce66b5c87a7daef25ac1c7ac758c1f2379133d59c3e7641d53108394d7dec5786d80e71a0fe5c2225fba8f7f6711b81af683aeed17576c5583757db516c5f75184cbc7afb3a42986451ece0a95198cfcb7d7ccc79f4a6fcba3ea5860eb6ff6751b170884b5f942a09a33c5e3603c3f8929ed2c0fbd387d23db55021017853ddf79587dcfd494f4398d65f12010dc3acc1d63a67e5eda46458f7797a4993302034b7d7bee1d26a0781b46c03b84271de45758d68267adad8cd4d1b6bb284fc111bb22879794a4377df95fb2cf3464df974d510e08a3bdab5a6d3b1d908466f12a06d87c9973c42e692f640c0d1ae653bd6af2aa27c9a530a99b78c2f494f8a3b401357cbe71e82d7edcfecbe9269171ec9f3f38de07a7af08663de4f41a59011403029fed84dcf69b1be6a94ccb9917004a6f4ba8c16977f9087b41e4580f0633433a1583a7c4d23985a884369e2d6b9b9df049babf6fea3f1651210d6d6d342e6df4b1ed74c7edc8a17ffe98a2827ec9e615b1c93711eb8b1d97b488a9681bd8567ffbd11f050019a721824e6263584032de04028379a8bf3aea1310e021e510512312ab0cafefae58393f921faa01b3ead62e706a8324f5f23413ea98cf87f6b74626fd26283e22ce512f76dd751c26a40cc43e8ba56d89087df7f8887e84338fd5e38a492fa0bacc5c3594d5422ee93179f52c44af2252e6eff216c37c34aac6dc2f676611bc1b51305e416eb40027b76b9b5de77c361699d599755f84081488e2f70e96a48b7343394fd490c26ca80dd83aaaea88f21981212681341c2bf9826cfefc90949900f69dc02315f074d9c7befef2beda33749b010741fa75ca2b1d8ccd006c4797b1d85b0470e61f833db9236a7a222e5767fbea5287e5b06612417f6730a911656007d3086cb0c355ac177945d13c9012f6b6c392c52c99f804dcff0f6c019ce81b06c4edc67ad59efefe984b546cad13f56453b3d75b7a73cf25893ec01991ce1ffb2552515cb27963d5ce671e9906ab737be4e37e21bcd8d682810eb838908a07f47b74450168fe90aa9f579ee4fd75ff24727f298ac1af545c3de3b7e0d632c77e510fac40451ad788cba29931bb580bd1082ab06106b71e1f44b50bf3dd86c3a5e13c4d184ef3b815eef18231d5bfd3b4022e31fe1ec1824eb44f3e8f8904e258cfd3151370486d67d64d6da1b88af704b317c0c9c37081bd24916c49dfff3ef709d22d941b86824e26c3cc7c3059615c7d76addcf0b941e7f954ce7c568330c3158a52e69377c0cefa6cc9de576e54dfa9444b9dd339053c212e072432cdf70e8f975e7fd611a2760d51da5b8c71193e20d20fd923a801ff94c066d98d50b0e1039f077a67bc926de4dc481b350e1dad11d5d248d7af0f140910068f834ba21469f66f11eca39ecd4db528410539773795392708c94cfcf4e6f535b913fbbbac9ab2f4a14c5390c609911772f1e671e8305f1f7e91e881eb32303ae96753c79c679ffbbb411242448914ed77f71315e23f02706e61eabf3055608987bfce083afa55864dc4df077fdabff172fb53a109373befaa3ab38c5ffc123420848be05bc94c0cca65fac25d17e47f28d96febe62ab40a0bda6fc554071bfb0801c36befd9fc2b020d4e8f87356e1a3b2dedec20cdd591abd05e7f313c6551baf76812598a4f246eccf8547fbc1b825b044124b7061471cd0b40a3171b2d345d914e45fa9e783345f21f83a42b8d57c1d779400bd6e42d324da8c6dcea11231e6afae64fcd8c95bffc0dddfb4b7183e6946daf3d4c8951b296b4006c58c06deef8cee56c03f2a5722198edfac54d11a6a470192e171393be11e240db17b44ca121acee23aa301d8a3c28c6386680053053b28261891cc60d87158fd7289837e027369c68167634df4b362c97bb05cee9210040101620fd7e4fffe2327e03306886f7e3343e3566b87ef9d955c70f301ce300987f871bedadcef143744deee1e7ed24a3e285c5e7c603601101faa261417c4c1006308cc6af887b27b0eb1099aefb17131aa391aee710229790b0d9bd8f5d0590f0bdfb18775737d3fdde614429aa00d27fb1e43d436570c5072fbacfc0ce1933db853fecc3a0d865aaba70fda8dea1a6d7cae8480bdcd6bc77e8e707b93b9e32b5bb1d70c1fafa0242734bb5492da5bb7d40dc7a2914e6eb2e10933f3996f0af8b2e528c60ffc8da367220f9345e1bb54b39d1a94afdccb0346e89670fd078814b59eda175b31b424fe70abdf6a24462a75eef150a0b6a5c10608b59932a708534b51ee2385e795cdbe4a8fdabf31a0b9b708351bb1c7d6d93ade1c726386668c338a9be32c216871864d7362e3aa46e86ab3ffd913337116bb56ab7778c031eb542e707efd9175ad6b0d323bb54a8a946e601d765d72333c779ffc745b7e279ed19ed3779b6cbeedcd5e6f6a2dec3a9e74351fcc63991093589ee26a463c65e7e1d8e6306d754a4e73e5a4218b1211d0c9264a5fc529e98722cfd3eca7adf9bdf30b1ef9e71aa223d0e36c6dd1a5904de7a5acc16163e7806d541cafb9002ad13426aa5ff366bdcf96e8bd9237c8f2f12ad29d9da55a5600c9de42a24443a426d0b7b3c877e3ef213fd4e72b0782a4c0479d58aea9d8bcd7fd1456b0b6d8542fef8b45d9216709a82dfce62ed8915662769251355c9413c8e17aeed6e6da8a01b9e8a230e21ec522f3d586cb841dc9333316b298edab33e88edb78a52a5d29b4f94f776d863e7192d8250c4fa71e0f35c83f35fb5cf5b6875ca5ff9036aaeacbe344f3e11383608178493a566a642381287c6815473509d99b3d05f695af110efe246b8e6dc770ba126b167a560b9512bc581179ccd93c6f0cd07bb0094c325099fae1ce1118f204e03e05f0baf2e84cfcc0c22fe080702679028a58ca7db5894a1cfe03e3601340bfb654efb9419dd7f9e335035ee6036808b99ba9612d788c4336592de992fef7bb35e771d4eb6ba64c1d92680f53f507b2dc619c04b868579574efed5d6e9386985f3ce9dea07c1737f1ba5f00bf80607d6a49f4df06b2d4fb72b4b2bc161d27e7201613b8964ab505c55532ced269ec882b18b2bfe8d440cf31dad63f48a198e951084f304414f427343b32521940636e1b6ed058d66b98982888ea33a1f4f0742ace3662c23a8213851f6dff496120df0c175f5debbf0becce09784be47bc72a26eec294c1c4132cf02ea8e667ccddb1a57b68aa7422cff1e45a6e5023bc530fca11f063c9bf4936084764910cc09a34f95c4f003291a93ec2a8a6f23ab2c7fd6c765e9b5fdbfcf5db9b476ea2ea8131b02e2dc45e1e865e17766194f7745fe2b591574fdd2964b3dbf3b6dcdbbc08faf0ef45ad50da23a4ab7ffd4eef162b21b2172f60aec6d6aa64bbee3631d37a80c6885eb465f9b8e828989e5daf75ae9db59d20d49a97de37dc8a94530791337bc190228f03a2ba4eca772fca8eaaeb959895c39efdce9f0524be84262352229be0203c686a2a523c542e65af48b5a46f6ffc6040f7bbc15dc154a4126789c0b7107af593339dc4eaacfcf240b7c6d9fcc950868e54060fc5557c6b6c7200193b3b074f29a8edc985923e5bce63aa705ca80d8710096bd45200a9bb975fd327126473f3e03413389ecbf254e56b6db6bd31f7566c2b03a7ff88d2c941435ffafd1923dcc7284edf5a5997f3e533d99bf77a09ad53537a1eb4125fdfb5d39d67b06bbb75ce518c346b90e4f5201825e1028e3052d5444e2c2199c0a9453abfc6659182f1b8314a9fa849f7771821a7af18ebd168f9318d80e6b64d54f779bb7981f657ff97d00620251f32b7ff9b49af905b1c0ab5f2061fa93d1337f342f62a15ae063cb7d7cf773bbefa1dcecf6c9bd7eae182e22cb4fa0422fa8a202441273f47cfeddc691bfab130f28479618e86b977dbd238de4a0b786096ed3c5012b440cd8292b474826b7e789863878cd796eb919f6c830dbd5603523dc79fa4a7c80d2b3cc74e4024716452b2355b29e861834cd353e821e917f5044b5a4ecb841dfd289a14ae65605539d36cbdd78ea29c58b7fcbebbe10d9ef474d8e8e8a9e6b934c8d3d2d0d37cf7d87f23da4edcf3a426d0b62c4f4ecba72fba408a596fd65a62842643e4a27521bd2dac329824b008f6ce36fe330adb9903f04c52fcac7c6d4387b14d2ec4da3edb732418280d04ddbe592c4b48a0a22058da601f13b5493f841f6a610175711d5dc28134a3d6c15998952e81e335d2d9609221c1047be5fdccc38f848dba3de53648e645d77f031d6449a043aae87b1b5c96d96e36e8513c26f44d591121e60b1d6072b62e013c82528aa6d28657b5b421cae489cf397efa1ea3400d84331bbbf886bef0aeea922bc475b844465ac08d8e6c166191f9c9d479adafb83f621c4adabc9be477e40f4dc2f76933fc3c802cadfc2342bfe3a7569e0d4eb219b3c8852d4d04204d165fd466a410ae96190a648595252b70ad5e4cd258b4755f19b6ac2fb1143b9b8c21045cd9e738899d4fa6ce0fb2c8898880b5c432bea52bfb0edac40a081a69a9bce9421b6c6b7f85fc8293be5ef5c974b9c0a73c906d1b12f8cbafccd958623f3d149d2a65fc6e6b7666c2584f92c21146844e83013a38b1e25a1833aca4fbc957089eb42ce4cf3a75398133d046e7f523529769ec4b83139ee1b6a3fe70e6507c9d518a7947573683747a88b390037937612750232df5c8a133d91942a8b2ca107142bd63878aa4248a376f70cf33af19caebd035c4e204b7c410b25d703c3b318481632530259bdd99f32d51ea79e32917a2560eab90e0c6ed5509a5c3952a3ee81fe8d33ad11090dd181d10803bf91e016f55ecfed980cd0e57d1715343792560698d7ca8aba6e75db9b14681951fba48c5d7de53e7dd92152bd0fa401361e012c03169b6f2a9ce0eb5939ed64ee09cb581117cd46f394ec6c3caf75388e9dbb694c54d0c468680143ef35c7ef2fed65dfb3034cc4b225a3df3ed2eef1536966b405534c64832119f048083ecdeff3353f0b2ebb8440c14cd7aa8a29368bcb4b71056fbfa4b907393fd26be610607974f3ba8be83305485f5284cecf74285a9790639b0b3f8bf1da064adccc388145126bf7ff8b887a260d1d8eaa0dbe2cfd3ade5cd5c9591bd9a4083a4e092febda9044d81e836ad018c3efab1ff9b4da0b7b6bf00f82ba3f172b94add955fdd67fae4d7f8efa3f8cc4a16a9ac0976b76ee514c3d26794cbc282c7711fdf0a9c194839eab963ed93867f5a7abb342c5c2b39c25adde78ce6693b66c65fdf787e989604e32502c3b31549ccf5b8b24808dd27d21554b7919c1c5cea3654cd9b1ee490f5777251a5ed0c724f8b442bc05902b43b5f189380162094c0184bec37fc4e63325469d6a6ee5458e7002c2192255d04551175bae3e9271cfafcf265e7dfc7add21e4049808908ef0bbc13c3bd4155aa1aa8f04129757fc8aec215e2337b6f960fb8d36ead8b1073724833c164df0a8eec6223ca91b5c7910af2d165488946a03fe3d4d220f70dd5e0eb7bf2711f90e6a341a10cac31d584110b89ab5f1a2afd1c32fecdc8170a419f4ef15cc47c5bf373ffc9a7461fd8342379b2a8cc142713f15e1971fe28bc5f0bed223672d4a54473f438b858e61019ee271ab980fbcbaa1711c138e06f33f3294522fe0c90c6344633c7a6837415db91d7a6c4f9da030e30ffc70dabdf93493ec70d57caa05a429b4161c1ca117d3e7cc9fef8cf045787630a13dbcd4cc9671c1afafff288d6de349e8f9a1a45f6fdaaa992a89715060ccd15f0963e77bd527d3083f1a0668d61ea7fae86373d59496df1daa2dd3a42ed593aaf41d76c9a1d19ec44cdff7073985d793e8c950f2cb7451dc4f11c4e50b12e32573f0f5538e7fde8432a85611e2936344a767f664765b941ab2d2eb49842815a41a1447362b47b03d42e0ab84bafea6d3599e3e9e475ba6437d3d8ab43e2e45e33f1458c9102b15db2e1b6ea40d277f404b902e7cb288d5e27e0eef363ef17d8e1108283e2e0aba1abd1443236f4b2c1bfb6b9536461f93a4e4a407af8a3295f7acae18171a16f9a8bda75bfdc7ded0f6eacf5a4022bc27a83ae490387d63fad568c924264d23893fd64710e25b58a90a0243852b9ac7056dc908d7bd94f67f87cd1819e7b8ff57199245f021201889f1b579d4c5657771d03493deb16054bdcb383c03a3a84e0dd29d24b554fc3566be21f51dfa461ad433b526b0fed1be723524879f30db29aaacd6a89bee2393cf909abad97bade06a6875c1f3ea5b3952b4d5df52d1005daef028514b015f09a9a15dfec0d30aef6eb6319e9a22d4788d028f75adaf9ed66c800abd735e12109f033f77d2f13d08b14f2a110076f6423e8055f3a0396c3a96df6455a7f1c9cf9bc2766b41efb2a93048f14f59538a7d85bf9fa664f4f6568c33130bf36ec2e9324496f72f568cc5e56d6da39b66fdd7117cdab6c7d193b10ff3e7c042cb15c93476548f8c277e46ee7fc16348709ac5a8a9c12ab891e688c2f00c2b5b7fa735d4187af471f538e02f4dd5bdbe34c4b105def01412e2d980ea1fc9e197991dc2486b93e172cd3cfb7801df6208a32d36701e080fd16c60f6e87c469ca63e4f21754eed43c91d7db635f5deba0cd0ee5880e73ea07d0730a47d06eefbe5a88befbf8efd774f490e33e0a154de595365f1ba024053db848c2fffa228c8921e0d9be5433ff38f802f1ec9040470d69c8ad865b904c1e5c8fee5f46207f81bc4fdd3c3fa4fedcd157955550469a873bdf3e4dd4c93c7520506e846b337a74520730dcd49a0050c5a72661d3b6a49a5003efa59071831e10938312ac94cbd91f139ec93156ac10bac74880453ff51675b5661015c20dfd9fd506e4f686c03fa25d202b73aea4ee9da9ab3fadf6d446f45dff4e69253a74d6597087f4698659e028cf55f6489eea6e6d58336d1bfe64da45c04bf43bbb94a74c064f3c36b0e7082e827dd6594ca52b4919a1262646b67a417b6d87ea34afc18959fd85b08ff92b7eeda5297bc1771b26e55ce06f2a543f40bb10e1d49f6eaf31fe8f982697151516d55052a016f8d67de1c2ef6c12ae6efd62f193bbd17002260528e1f71bc1222e4a4f57f2551a01b2a89bf7206af737b31f180c1b55a72617f006c44d83abc2d0d5c849f51b9b533040762a8bf990ba3962efa17a4fa044e6d8859f4b033d54354c83a0911b6ce4fa921879fe934dac95abc4585fd4cf98e0d3a1d36353a9f4c4f8c94b16717c43a8fbecf362a88a185b0745698963ad999225533b2416df202697f0056410784201c2b5d5c359bb08c6fd25f996a5b8ef36eb8c1e47cf4354bb338d7f6b6ed959324fa8e99d1fe324fedb972a0908379c5c0be923d823a93bbae2842d1de0e1495781aad70643af3a19c53cbc7d31f3ad0c62f05665332ba091d73320a0f45f87b8fcb167e06f8fd666d3347b5fac8c23147d33867d4050bbf820e6e2a995bfef009f338d3ee039063eb8ddbbbf1845f75bdccf9bbc5f601a753120e486ceafab82dd58acde79e90da75a931a0b35d342a85179414412ac450d67af05f8c1be605e4a1d1f83829f6e85dca62c484b0f86d077669c2f188179b1c754fefa855d6c8dbd3a85292d32a36ca26b67cd1ac3bde3d9d9a98ec268f35bd76e531ad13745158dad581506180a9e89c33597534370e6ce8d80d68af3c3023080c12a48b1f716cc08cf739a9d79b60a501b917d1145176a16d6f32ad143d75e46be0a756388758e6f6360aadcbf87e7e004c2b9cd550fe169671a62bd7cce4dbfc6446258c9540985e4d1004c8cc5f021c03434882832964086e896ff8ded2f54839b5ad25c49ce14126dc6b93bb57d34586c4d796ed5e452c9739cf335b87e96e5f167ea011ad77a788eaf0c7f5a2f1d83c85015738e6b1968ab4d7105f882a13e234edc1f6165dabe8eb085250afad896a2aae70f292b32a4758e7e45f0cb233db9a43f975547867add9c027d987970e889502b839d95107e85a25e9502bf572f5e011c9ece1fed715a4665fe6f739986f1b51f95347156ddd40ac24bccd4af212f2d30bfa8d365e86d270384898e848fc3d869d337509bcf8a6b2e854b08152c3242bedcf3c1d9ac27b124733f37e53110a09ef0695fe83b3c201b478a9bb234ef73200c723264e8dfe54195624e2664687f174843cdd691c6775564b90bd973b0dc26be0e98889ef96cc26bc630434e8288b7236230b066c4f8e5fe938dfc852a503ba2515b4eade6e0caef122c2bb82f8200384e7c7cc082df1e3f033aff558502475b71037a56eb3a94375a8dcbb37f1adbc8a8d025fc3a63544f45679d50cdeb270b3cc9f4b3fa14b623bd844eda72b6372b9ac880ac28b61d8a5515ab38a961327534c0a15488fd62125e4bfd27198c7fa88f3e56367254bb2a602dc4c238247fa9d01fc7cc3b5610a172049136dc709344841529f5083b88f43ae622042413e68404e2cf2c2da51c8589d9eead757f34649437d1d86b905100f5b841473bf3468649d3d1b0fb49fc439214190cdad1842058e035f3e0c592d00f5e6e6483d7a3a5d3f91365c62c833b9d4225f80398a06aa3de5f6d85c8d68197d0369b96a63861f8a4e2bb47d633fad58573149567352c454cdc9bcf4a8dd177fe2bf8e2eba87c83f3ef941375ff050977adcc4e2fc944c8881770a59905f980e386cc08a62689b8cd895c7613e4c97ba453bb30aaf599327493ada86284026c8e034d00b7c9c2bf52b25e65446db7737aacb60df02398b7e47d4142ea13788ed140d4dae103914f13e6ee9723bc57da25ea7b75a46654dfca9b31e02586cd07529fb073f9ee2e113343b844800d85f25c2e58f325c30632bf9067b18e277128821c298052dd678399d15a84856c41e4d09a78398cdbbc3a62424fc1e8ffa01c1de71b4acad621c7277b2a4b8927a9c0fe3137ad51b6af6ca464521f3ffa271bc79fed506e12debee4b376f6885ff4c2b8da5774aea96982c9b8308d1529ea92198755caaceec57bd7443d7d79929fa7a36561abc3646fa61e79e5ad6e663d6ac7fd6c23d68b21ee44c9d63d81cbb3a1ec235baa8105ea093d8f472c8e647b1c01ec87630f5a0ce613bbbc78d13bc34dc8c1f4b80f054ca95d4b8fd0243f8e7263cecacc04a7d05b2c7c2255d530ae213c8570ed5756d9bcf3cbd0268ba18d08a00386d281eb3bd9414d18f962f5802ee403badb717347478ff3a29aaf6187025b83b749cbf87a9213327549c13dead57dc81c4bdcb660736696b1d2af4d5670f2b180ac05f9fc604c15771df786d4074773ed0b138fbdb1b1aa949251d406302aab2d1303b13f6c0e0b8d4f1a3b992502c693e52b14f8a30aad618713bda6ef42d91223da7fe79e3156112580088814f4516663e30c9179b3ee07e09e796af86ae2f19bff77472d0532cbbde7facf32a64b59a8fb557d5f4f4c9028118f013b8ef71e68593167831dd9b5f85d7ef196b165244ede686b6da56f91806fc85fb3d1eedf3400a9fb2dbb84e0a876d83f87bc0bb40983aec266480e8d1fd76e14dfb1c17b4ab54eb7163a6c1f43cf0c04f6417cdb8a47972b90cabb8e7acfd1ef4f463d9efb32326fa4710afce8349bcb51787b93eae216b7c1e3674a0e1a0f59bdd1b2518e8fdc411e9ced7d31919b7670f2d14dda426eabcb535ef4000ddaaf5f456fff769252675e5101685c8dd81cea847b557d037e20c36f20c966c768601169de40a4906aa2ac0b88809295bb8d7c3bc5428e07eb57d2f4ab2dd9297f2eb7e743aec7d3a1789e3d7d4b26195977155fdafef10c57d9608b3a782a432aed6af0efbe9e40f3d1d23e3e532075449aea8ceb9e9281acd448b043622e2721a92843a624be9116840ac1853696a33cb5b3ce1acf410747d7375dfd0d7999196b5d70c2e01fdaa068f70b141b9a90335ebe2e2a6c233bdc7a0f3696e96afcffedd755499380fd8804b383355d24d4843bca258609027cc68d9902aa4d143ad9cb439b649c1082df1c2d0b19229cd20fbbc661bcad4b1e72e76eafb6bf50e6a023d952a98f06b708c5a8e32133d832ff3678302f861fea9c01eacbc698d19bdb3d8ac213e5a57324289d6a948e06b7aedd54729859a8ec32359e1acb157397f7bdd3d68039edd743f772a0c1aa34a42997f0188262000ada3c6a4be3576c4664dd172d7dc6e7d386750bea9194582e3610c38ee5c0d34e943f4f3a631072a72e79b5cb3b8cfcbb4a509ac3bbde896a82963aa57262d426399c4fa29ebd8514faeea426a6ffe2917864975432c2c1f7313e2fa0bc647f32e64eb42e6b1ac8690b8bf7a3f6801da3f437fae1eb40e2a6f4d169a1bf1331f8532b746b09da95d95c8fccc71855170d900c7db01cb28b4be2f5a5b752c795f127bd9b9c8a5dc41da2a62d2f4ea003c2a54cf176913bcbe36b42839190fec2a96c6652d438730e1852a9b8f0acaff4dd2044d18d74dd4963587c357101f9f599f198d8e7ed81bd1a01fa946675258a1e823624a05cbf984d8a3f2b14d87e06dc7eaf45c4a8a51788bad62023f4f64c97a36a9cf1ac074e178c7eb4e201afcca350fc4264f321f46a8bcd4edc4390c9464097ff0d98ef6b2b65273f20d92f1cb7344d45804df3c084886086a0510c4441858e1a10ca91fb4da7233603264a7dd646e24b4cbfde22f2804f92c9f3c213db66892e303947ae3870a4727695dec9f41674f53b3612ab989e6132dc8fa0d7d7deb2b7f42a7db04436c7765f8b2a85ff78ee418863f2122f147092ae57deb909c98a115fde5d704f1c0f2f8bff9b9734b6aa7dcf15c8fd89dabc877319dbed42d35e1fce6a1fd9f163a0c45b2c9f73857ff60987f3a217826a4420b6714bd71a230ba7894560c1aab528cbeb1361d679ed4bf2d642008c85d12b2a5b90cc105bb921708e0243266d467bd43020ed03f24f1403a672950a75b017a078fc522986db7b4d8ab9f7b50055a34ec6e0caa05e4f9cbd8398365554a826c3bdac21be39a691ea6658490f5ff469fd25d64b7429c7a523f3f1a4a223f22286d50a6072d45a18af93ae51e18276bd53b8c1dad805f9978d40548ba4b1d8493cb3c9b8c7ba3a994bc1a93643058479c6cd4345e1a99a30af09ee7ea12216ece0d5f336564edb705838be5a267fe55258e3ddd2198386121df1560343fc5fc37d6219007d145c0ea29b87dd72b628035c7291fb9603b5c30a37b3b9926fa4fff4f355b4848e9d19e897c070f764638dc704e863a7a96a71f22d22e18d73ee0934dda9c5b69d74c0a0486f6174cafe4dd8c83bc693312a43e1ae609622467a16e6477d4b25a3cdf07e7fd7cd12bb3e90cb211d5d1abd06ed7dffdf07998e3c4d57bef5cf004051dc6fdf55bbf1af99290fe5e8f1bf99032596735e082a734d377a74936ce0d6cd04b3e2c29524729e4ae9049d4d10095096c2876a28111636eeb5e67c7b6f49b2b0ac89e4728f98199c8a1b3397d09b5eeed8fb23a05c045d747f9caedbe62321c4241b1a13377a87e1078523f52d8d49b6b9ffdd3dc2126dd83ec0774f6a6cc29144b349c65e46e26e552c5a8bad4d94a1aec3f8f10e1fe83567231d5a697ed72bfea4bcc666630a4e38b7467e977a98d48831699d5e40c1ebb5dd9ba200e0f76775c4ca78b9bfede78535db78c4b8e9cf5efd752dcdbcc99dcb28d697d5b3e596c687a78db61bca66859e3b15b4a0abbb1056315bbbbe9d2dae049afd2e0de85478f33a38c2b8aff256c6a40c4a2159360a255c24c0372f224a05c1e5d05d825092a513ca96d1adfe62f9990b6ccd52d50106ee4a08bb22c77d5db9a322892ab17394cd8c1b02268b66fc920ea85f7a6a8961605a3cc810b3408b2cad6880cd82f9786d116bd91cb132943678f0d27b9dcaed659b5e723ac351d57dab1262c738c5a660a85096a17381be5e8a65c51ea867370f2c47a2804017c43661e1f9f65eee852f98ae785229db356aeb0b18b23e25b578cd2df0a0e2192cfe27b738048e886c497872b7571bda6e6de0cc740987600f1759c93901fb95818ad3aade1e42a59741e0ea339c446baec184c88d08fd95a95bdcf94069cecc991a11f20d5e4972976725be5b9537dd04fd357197a2ba29e6119becf2375ca95fd678cd3ce3eaff6307e7267b13d39012143135df0e2f629e6775dd71eee2613306cb913260c7a5920d52bed8d110c1de58c407d20b8ce0da31ff8f79135e4d5387df14c7c675af76b3dc83a4fff71401088835a6ce4c12d650587f4f8f7a2e0bf001bd1206814f9ac5b4eabe91b3b0e75b386dc0e891f4fa32253bc697319311cec0879c7a3b6f770cbce76462f711232e2762471d9dc3a5cec301fe46578a21e128bbd7b18a403e6d91ac525c4fce34b42c7a36f8d01ee6ae6a2f740add81cfa59de43868f534e7efc5cc15ecf1ddd9e5f35139a2a92cd47b6f131a4ce4685e13c57b4fd94d10dde6130b3a165a0e160a8d8208415547c9853a89b59eed415239ded1d3ee170bd6dd541b9b23843bd31eba666ba80339dd96d427d38baa687359740677b0e688d1a3f33c0e70d39c4ba96e55941a87b1201f91ce3fc1d3e3fa235d4e5b13ac29f8f5720bb8c5c5ac26e4be56a6614a39f4d6fdac32ef052a6f00cb0e82b1ecec86b2d1edaaa2620038fa9a49d41171012371745a3dbd8cb418412fe5d56ce29d59710708760b9829366f3e6ac80a9fe024cfb5e59551c9fa974437d4969a5c073ecaf128e9e7c1bfdeb4bac69a89e376b680aab1e7d326cb97875fc0dc198cbfc46dc3b6377a17807fa128fbf0e3312d8f27bdb43eed54734296ffd7fb2b351e9013712e784b4847dec46216344bdf0ed02bb7390b1fbc964bfa3491ed89d93c1188467b62694460690ad096d0b79ec64fa5706fb7777a648f7c2f4933e158cbbb41c2bd706ac6ed8ef577af05c769ec5949aa04fce7d322a3466e07a4bdccabcf04c94537b972b20006b66d070a3ab75a4ef562608ef040fb0e44e5fc7f8aa633cc9c5c0c9c2f2597b04b162de2706842cddee16ba579a83a66a825e7bb31c9f761399f6e6fdaabf515ed06a94d0eb8716abb74b02ab62fa4ad98c0b77cf9b3bf3a52842da978a31f09bac560c5ed95128b3e78082c01b37d817632d31053dddbdac2989b0e33ef908071a729de180c5fc4be2dacdec191106e3c4c0f5708598415e55d7af1e654fa24681366a2f0e06f1e00f184f0e6b870f072effedce58852d09ef9b059021f849cef568677199b8a66471bb4806dbaa3bd3cb50a7c6a47ea989e4efe1413484e886d61afc376a31961d05043a1438129e6ca43682720589f5705480db5625b9c7e4e4a38a3238911736dd94cab670e663920ba4d765a1cfe8a13d40d8d00e56dcd04d462daa01d148010e03414ff2da34bba02df47b3f533b583056a94672c1e24c8e68a47e06a4a8fd3a2f92b2b112a8684ba9ba0950caa9a71b9c523545fd89f93c56855069486b2dd035286577c7160dc3bdc5e5b91fab2cc69b3870273ab0680f3c494377d7b1e8150ad54c0f7955a1a3f3d07dbe74e2ce15ffda22250026179e716b36551f0d8bc3c7f1942cc2a7691f83ee0a88cb3de8d9ad39d7ca33fba46341ad9e1617acc53ebe78145f0b29f03a4677fdff4f1860e399541145bf64f6178d34402dd995eb01af4ba3db3a00e9b977d8ebd290cda1ea41251a3c02d328fb09fcdbf0f7d9dc5217d6d378232c62569759c3fda88e9b4e2db3216569679d0c2fafec899e6ed50c71eb58c151add63e4e64369e4e59572e482d9ed95570f7baa7f39d5847f49a1b165540ef6d054e00e5fb771fd8d90103a7b4074541af28c50a213c5c6ed79f63b52b1bc1485d3f909fbd23396dc628f9436895f19165fbb12da6505eb69e2f99e7a37e2b55d50201355eec37792ce9ca3535573dcba7f20e3a591dc53ef7a966f146a4266e486b3dcaa1d38c37612d43ae1f9f8dd17303a5cea7b33b33dc3a47dde84d75e3a7d633eed8b9a9a15a0ad50ff0211074ffa95095c02a437698dceee91aa57a4051cbdb5e6eb62bd3a08cc036b6d852fe61cbd2f4f76bd2cd42e18ec359d946d5712d47dd1f13d59ac23a7fb8d4cbd17cb4c75d5ca0a8d72e62aad24cdcf73364311f8831dce013a05586a10e4f04d4d8c7b90956280d4577695d8fd7aa784174459bf2e43044104cf418cc4fbee651aa89f56f2ba3de86872415a36e5c5f90ef2f8876ce23d12d668641a73b796753737435ad8d16bca38ee558c3e4b0b8bbb6d515c2bc63ad7796d631d1695389303928ee9c15766cfea9cc07d238dcf05f3c82230c07d592948fe7b27831fd0e92bd1bda3f22ec2aa22847daa6baafe9055c9c85f97c994540e627c7ccaf50134545f4015f32cc9a125b13a1af0b48c266829b71d8ae0c532db5c46cbc1381aa9c121a308638414d57b371ea26556e0a6101dcb767952aaf387e719bf5005615db3031115e336c35c68678bb488d5d4c07114603e6a3250b642b6a1461312cc38edf93d37e3d6061e2b1b6f7136b571b2d3d05619e9023c5006da01c00ac261089ada71ab10ffee77e3d3b42eeb22fd9d10c11464123b6d36bee38a9020b3fa5bd0dac3d608a0f73198248bcb7de6224083c10e04a5d49069ebf5179941d1ba7de34b6ed5af9bb122bf6b11a9cc245c64f876a97d262ac3671d6b5381b3552e9b1e18f4b2f5a991b7c9a9ce13fae008950cae2629a5c4855dda0f02356883210f9ed47e744d2b342b43ab43d215e48f52955a0a2b24ee367a062de232c0d6e3578430928e0cd8b1120db1411cf258f72d80128d9a6db071f63644e80aae0ee11b299d213c824173615028c7ad2cdc00cb6aa5aa14ca53563385f0b57795e0a6309ab87170dd34b03775b788ce96c55510c2c9a76d3434d7dad953d555e7efeae5b87d146aacefc906af296500400ca6d54fca7eb0dc683c341a7d16dd9df77f37ee0c7fb8114880269764be9be582233aa59debbfd5cef4c5aabdccd8c321b9a3efeeb66f6e31fd0f67524098a809bfef29b558d2cdc1776e17736dca226d36f145d3217b1a5dac192f0425601dd65552e25b0185c1f9aa083162253b69892a19b832d3cf97554e599ad9cdb6401c14068508d95be260b81631bf195b940594cb5f792ef61e7e157667005ec3866d16251771309095e568d8c3929255fa51731b53be55645754f3a1a84f0365e5bed2411948d7597df99a7ae74cc8711f0dc2c91d101872fb9a12f689fea8ef65c1e9207b84eb55bc2503ae982b8e3a652cf6ad14ece498660d252928b9bf1200a425b615caa2bf6f738d7df0d21046cb4d9eb5d8a07b3d97716f0276c66707e55307e38fbc593b7f0f17200a967afd932a9c5d8171f4289c294858093dd086c72a35b3a5a0b673822c385fccd15f471291a30977c8c28f77444fd06d0a4014416dff2391e3e451e803b883beac226c316d0547d1c58af8e4687f495db87aae4ef4b147603a167a42b1307fe136ae44fdbac86e192352eb00b3afa81f802a40529cd688005aa75ac46d4c43fe30171ec45ca671d714e30ef5d65d18a644e109b6140236138984f719a5e531ab2bca9b27fcea1033408315713c7b79557950812b1ee8a1bd0b7a5d9b1637fdaacf6e4d7f70cc4797510406ec4a1eebd1924956eb0d575a81691344266875ab538438f9e03e98165bc76a5d17dda27cb117770c40ca49b89ad4bd2ccca4d86e7bfaaa0c4a98b4f459617493e2314b4f4a15fe616ca96751b95edacd17586a4800fae2ba80bcbb7c74a1f99ff1abc1bd114e6a7b7458a4a44edf567d572c2c296f29fa80fffe2f020c2ae53aa10cadea8f60d9933e1b203ddd894dab1b0ff62a517fa95d0decdba958056c57446dd85c1125deb62b8c52a59175c3c45425c13cace8283d18ec220a26a5779c42f917d8380759a43009f4683d5793ea21eb2585c775d308168a4d2a40032acf12f6bfc56cf9a2866770c78b79f70b21f28bb53b41f8a4f218061b7e135f185c1e344784722c31c557318f010551af3889dd680e3aaf1f5d25fe362fbbe463def804df19f936e2bc51bbb5ae9c530f229e9428afffde76d168bd4fcc33b73ea7fcbe691e61a3bd8aa1b3798741fd317a4664c29bd2ab0bbe435026fa643681e0a4377d76969707805b7eb74997a0176f89b6280aa513fb61bf2808364f0286df35fa6fe3061b128da1dac25ea4e093a879b7d3bff479c6a979871035fbc93afa1a0bda2914d9b578b7caf7a22cffb6be466cb6e2ff16134904f00145091c7e9a6e84e30d69c4d68768fa59929318f1dee28ad74aeb4dca20229404a9b3cfa987c245064663486aba388ac6776c324ef2b65db72ace409f0906482d10404d85423be5a8e85eca01dd02b7b9db5a3b379ccbfa740f4c30c58e337abbdd40b01b3ef8bb23a3e1bc1802e818edb622efa288e48b55578fa7f7fe6df013cd7363fe3f90160cc1f069ae0a0435730a5f60f1974377262eaac75eb3c4770ee403474d44ec26a0aa687b3e486b5ef84cd5ecafa0f66a53dc7f62d2e2bf45e653a290e2a6f18f6738dcaaff750153018e9be349cb09b5e3c682e5723959bae03ac8a21498382607d3bc703c66b2f79bbeb38243bf71a6fb4fc3be59256daa576e01d5c5eb6f436aeea87148492d21b56eac1455fd1f1fcba1ccfca18c9202e044a3823730e75372a6c30a92780c56e2e2860c77e7802572695b71906dcf4cb724239d40c14d6b1b3431437a294584e99f37f660172b605249b53f7370b102a1ff0fc6335fafb86c8dfb74306468536a0e420af196eacdb2b17207d90f2e3f49a793e71c0f07553a765591be477bd91ec72b817ba37d432c0a50745f974c6fe7e6c5a8d6de48dc0d937342f7977efb5890c6f14018cd7928a6c14f7d919504c08c94b594c6776da0c146f3fb73294d31f8aa6a260a71270e8a5379a835226bd2c9029c3353c22cbdcac4dd17b77734c7ab0b901a6d5e6a8f489e93729433c6049a5e7a280bf0303e013ff9129052b0abc441f468deb6d35ccded4dc3dfce3feaa15d0023500b2503e248ea682948cd84f6385e5aac8ef1c85161bc4a4fde8e80b2bebf0a5ef6176edf3e16cbbde8a4f2e3941398fc220409528989ebd9be90cf01c277814474be4786928154792bf2f6621519ea8cd8691ea489d0581f448f2b990c3d3b6b311d38a0ee518dfb8260e92036c9f0639e553a90c143f276c84167ccd6cb7d185b5b9759d06f61c2956bff5fcdd50cd1dee38a23ed8c909d4cfa715732f6581f32a05cf8152ee9daa545b96b1bc44b6e89d21bfc20895ef7a44f34be9a3e1539fdabbecdaee98ea4151be53eae5e3baefb163677ef3c8ca8c0313dee6811954b37f1cfa3e7b4f1fe10e9e8e5ef688789d71b4e1ba66f6ed7a7cb60f8660fc152c9273281c29dd74ddc74556b958fc20f2897afbfb13d8e67b061ec7c2a0e61d94549454b3c52aab59dd3366eb6444fef8504854f4155675ca933a823f4ad3f6af1658cc88c17444be08382ae42366f5c7d014e6fd5d4be275828c5f17dc11903ed7145edcafa3f77b4ebd71a9c7cf04533e7620d5647d2a1a8597816b9ba35734cc06ca2c73c5613a5c2b5c2d7eb4df917b95a496c5c4616c831f003a13960b1ac19f5322b2ff420ac9b96a31aa2d34e6c005e84f271912977e895061f1613c405b160c003cc61dd37bee94f4375c99e3763fdcd2b72d96ed783c88194ed71d9d471b708e8e88b8f84a40d334b8188b16d484828b804a8a7587f4cf86b81a4d14f209a540c080062c9203c4e0c2294300d9eaeda6f83295ccbef22b7515e0ac8eb79de50d6ecbc5557262e1b39cb350dda5368d799e66d3b6e21fcff83718774d406168a8915478333133ca358f2a537150008c3ec3183960ff74ed55fd9ca8b8559957fc38bc008bef869503df99a69282905f9a3a56e94009d221a553976479f57024aba1806e7bca4c2a853e91bb4ade155f60716563927254c91759f45c9337dd0da41bdf1c65f93c84f2fb9bc5e59c46bb3fc69c7f5f14eaf56eb0c0c3dfbffdd29f2b0af98b7ff02fdecd54c49fdc9200c157335129cb660fd47eac61ecdacf230eb297d7257a11f65f3f5d19286349d219400ea3456a27ef51f0def3a9e3e1a51225f7b0dd61b2151107a055238982e6f22b55885d77e2db2d733901960cb852fe9d71d50e7aa5bfc8ab7a1ac32ce9048c21e37545da32d4a79c87b63ff426c630b87a3639a19c0c34b5a4338f6c5ffc91132cd2c83850a8be2bf364647a3fe26855967b9e268365762a2de349edd7cabbc5af7ab32a8a1f58e93d8a0b2ff5c5c4e39e18c36a6e75884b314c2c1dd82ca5c69b75bcbc8ce40bb9841f555a91c4fd7aa5fcf9126b780dbc466f7b6ed4994001b9393feb978ccd94c1c01253d4ac05a5645e41cc50499784cc60dbd10491e31eb9630e7198460d3dd610e66e602f82dce2cc0228d11de5f975eef6c54b3bc45b6d82dffcbc7f38c5c52e7b7d05fbb932581504b20537b062c9d3d2aedbfec3caca81dd7f00f205a725cb2aeab1fce76a4e45ce4052d9655e3b7fe14324a440333a710c45c0996e564f5a19311d36cf7391adc5f52f306bbd1520a4e4204b34ae0c771b52178e8f5b642a73394d2b7f408752883b568d8e6fe4017f44bf1cdd87a94862d007df089cb878269dac1b1a20f4ac35c2b28d62300b08e9e20a14c4bfe4cdfc77b81cdc547aacc1a1d340f666ba4b54b3d5b71efa6920ffcbfb6f7ff71375c707fec3b67e3193bed6f549f2660ce75da43dc4a09f486dafd6e3cf0ea368abb750df5b1bbae87a2e4622526ecfda1b49ad2fb5c5cfe0448485abd370bfd5f5902344e7ece90c63269e6ae97c0ea0af9d99861098e5b480b7ab8c19120f0f22dc6d7878eca03650832b2887c8e1d9904cd345a686f84e5beff452372110dfc42bffe071daa45b4cc136b7a9623350dcfc34306418950aec197f673dcf318e40fafa6a0919ec4467d016c29b5472560885b78fda9d933282c9a19f9ecd8c3eb7e28cb7502d3b93992a89fc283fb0c8caae6724789fa1c78e8e22048266ca0bc15dc3e0ae1ca07c19f5aa31fd76cc80b2edc58c0ab05de1f6bb3fb2ed93226eb042e75998454b8efa2e12c3552ded68fa2a6e67df74e3ec93173e4cec7ce2ff7e2699d98ffbd08f842974903ab719c1fbbe8e5a4827e38d4d9713f93abad1b58701dab02bfa63a10e3fdc7f1812f7a68f781cf3479125f52daf21ed3b58adcb70a8966feb829a78417322ddb8a7c20d9d32f0a0ffd103127ade9028deae7fc3b0112921fe3ea11ffbca5976750da0e394fa527f831ca62c433ec899164731f42ce9f414a7d921837562c083ddfbf704421fbb12131434fd6d6f13ce588ff760000f40528a656d80a9c9ebdf6c7022ef30c2725ebdd0dd346fb2de42c99342fd70b2408abf2e52ebbe89da52e03676dabfb13ec643b57cbba727bcb055a9593e8b023aba1af021aa94488bdc65b6e2b5c8324f34b9fef32a2d7c432da25108141fa18ab2457db5568e41b67978abb8f449dc33391057972f90e8661a76fa92fc288db8af9742a38d9550730015d5d754f93e5d18c55a5ec35eeefbc81cc60f07c525e83e82efb343af3054fe7787d6ace13f5521244472beca8caff8dbe9245b413914b1a29042be4becb8b70ad9e5d6d561510a26bd511d25400d9287587e3174ffbf0839241c20110026fbe5d16412ce0f7c64c5c070f6e2868ad94f63031d23491130726b902128be46509232d8ff55aa011972cc623ff10508c4f4e8f0015b570b44b9fb79c2a7e31fe88f133b11cc0a34149c68fe77e0b036a1a9bf5f2a9a583cb75433341e1605e8ff3133a3dc8026d244d98ab37fe3955fc841773c04b1fc9944a9ee8bdfc1dad34b15911d7998f745cf33ba91de12374831762c59ed84b4b0dca2859277d042d16e5614ea7c61785fe88a7c5a40dbbbae8c4942dde427d1d7980ab3c52e78fdd52b6e81b017ab82bab0e8abbfc24496f558606bb3a0a8e80e8f481f20d257b9cb39710919ff790a2878a73bf4b7886410debbd7a167b9fc9247df622a84c74a499a7763639d1c641904cd685c75a00da25dbbf514b18730cb1449d28736ea794bc0c863ce2678d0e7b17f7a2ac46e4d40899bbab4d30c74be84e5713e037d915e0d6c875963c3fbfdd672efe4abee161b00ae3b38c636db2a7c180850242d080984ffbfde6b37781d0418e350509ad6d4d18f6ce1b8070c33be2e8afb4a994cf3af3c0791fdecd8cfcaf01649b5c32a081bd576576246b2f5bc72ab482735cc03bce69f3868f35e3573b72f72325d9ac828f7c03433f7dbb0bcd76d809c22c8670bfc643354d401184f435c5e322e917e9a7d3e8d69676aec7264eab712a7b37466fa8f9d88c34a9dd2800ee5a39d1c967873a379ea50a301a59267afdb5e9a5bb4b36524b637b24da365f663f47e9653812eaeb0e0d88b825ff30e2c9eb116b0e13f2ea12af7fba15fe717359ce124abd7a8a16b94cb99a4569adb05dd5cbe5bd76df0b5248f42caf10a8eb2e4dae7ca2c5493947aa77e66e8ad80d519539f63c8e266eb84032a9d09cfb953266c6de25b957e3fcc170b5376b16c91d6dbe3edb579d9e2823aa2abee67efcbddef8bed488ba6e9b2d8b4b62c3254c6bf2b772f292b85af5419a8e09428aa67bb13dad66d81a2b5daa4d0dc58f4cb9a2bf633ba1490d2866205f43457e17aa3a2442ce6e422411320d43daf5bdcd7ddd2ebfbc721900b561e306cda604d714cdab39e9e86c9de47580f15c17354a175fc2df5c65b11ca73e8f69c9fa962f64a8fe0ddd136d9c36138af52c487910f96eb515c5dcd81425e88fd4d8bee87ffda64df2adaf2f295f327986049069f48de2abd95a4e28bb3d31340e82032699adf6864b4575c9df6cd679ff49f414ec5f14dee76672187ce5d10374bdeebd64ab9ea3dee1e3e655036d7fb7c25cbad20cce4264e66d3dadbd8741d9da80f8a15a5e43c33507fc0ae936a8ad5c1d8976a0664f4f3d75cdb1cd25913d13035f7f575571b43d68840efd91c677707bb1bfc2e33549941ca60c7532002b90cfaf6b3952cb99d71ef3d71f2488298016166e7e4c87f3bfaa749de7bf59167fd7afc5d6a6c5532d1481461de1b64e3894685426501e091a22aa7108a99c93edc329e1dd724ce5a62c72cadef64008749159e4400652f2765002ad3c3debafc6b9a4575279812672b2bdd3b95b78b0fde2a6f8c127ffeee843b595dfc794a8d36d581fb582f10b7abeb24e7d3ce6f97ccb4517da38650aa1ed77c88a115d812b0f9eb63ad11578210f511563602f763944c3f36684c24ff1519342b985f9650680e4ccea13d1dbc10dc0d8d41a6c0808825db65896297421eda8d74e57eb77a325f1656ebdd63f4c263d9ee1d7ece3062bce534697a178e829f2840ba07227f59ec0daa760bdede03c53f390fe69af04dedc6530711ec7d5634dbdc17d147583a5102816f74897a0b0b323defb4c0803267b38400f1020ce5aea3392feea7540a972ffbb12ada625bcbcef5fd96b0ca4658e7c880eb67aba8a229dc05235c0d50bc41e1a6ca9e1cd11d8297a6c954dfba2a9832aa04eb841943f61751d1c3b27f2db55cfcb63811d715f5f90754727c452a739d6f9bb1ddb6d5e7718399c393553cdaac43f497015a2d1de066f03010fdf3bcdf934ba34b21ea1e56322d71bd0f04230effcf7694e47d261d8d1b8f82e04dac1783c988e9a804a891ebd7638cbcdf4ef1fe1ed2c08ce8a8554211aed0909594014ff6bc27f70247749567f436ec7f6794e0cc65cd91cad1f4d3bfcacc6c6c2cb34cbd49d6870afe3dcc45d5d78e44d9f9a6b3d92ff402a51992f08b1cdcf8050436cbb73579afb699237f222e9acd1784bb47d1334641cfd24dba75f43f43ad14e37df382a87225fe1ec32ee0fd7d22ffb9f0e32e297614aed36af5f03d3fd6a900973795bae161b64cf85e257497b68d51adaa485d86606f64d728c01d8e877b2ce41bd9b8902a720ba5b98417b232e815f44f946cf3d6e6e4261484cd37623d21f165c00769a8f9e5e055e3d6e6631a271bf18a967f31770b93804e6a0aeee4cd6df0256cd8db804aace80121a71c069f4975d751ff8b0e861348819285237c67f1140a9cd440f5fb0a52e943e4b778994e9bb5eeade6f2b8f7a34427f20e4cee98223bd7bf7acdbf3fcdd6d6fb2c5117971bfc0ae0420ec18435283c6209c39b1a58a0c988097b43ecaaa563d16320575e3036c9af1d6e1e64d59b301cb2a7be5aa2d512aa6ace1b5f8fba7f4c205dc2ad9af26b9412fe08121cc944ec12ecaa2b16a393f5b8b8fd4cf5bf89791a74421bb6ef183611bef026e71e41523338d6b81ba0037075cd50bd5f2ec046c61155131c81e8f28634671b05cd8243a2ae70624832de91628226c2e2edcee9a24cfb031d1a2ef2c1e3c4f059f0ad70b050357737719577f8aeafdbd5cee2fbf32fb2c793324745ebefa81a3efcbcc84584fb082940e4e006965a687fbfd8e81a119222fdd22b7c6d8e5b84726dfbd3b54c6e5a0d51cd898f7a99da34c6f7cdaa8d8f94a3044655b7c702b6ceb146f6dccde52a7481930bd0905c89c17a7e11b16c3b98a6e7277483fe865315991ef169b4704b3cf142d59ccd537d34f87bab955475d64b4518710f4b8c155d2633b61687978e2a627aed1de2aad78ad56d538e6506a7bcfbc3b8d56ecfed2c8c3c11f8d2e529a7c9b07434a15b92c83c570266c4a0f500d9bf8851fbbeb613856d942775329cc71acb76d1c4a2b7c083659b20ef4e7ec8bde64ed4bdc1926425c0367e645d87a914ae5287fa863ed8cb6a4b609d38f75a2013805d45431309fd9bda4400559848f3c8f1e2109df3b106a38c8be6ad6b88229d450b29a7c32ecd4f2165b206e03d3f62bac3ddbb162cd98c7380dc7bb7cf1d5c04d036fc19920186626b16f1e9fdf84762b8a4fe6ce94715c56087acfc012eb0f4068ae595bf805cfffcb8b44165b5ffe7ea33e76eacfe704e78b6c5e9f2a32b51fdb1020a0bf12613fc49b4fdb5d4353122a25a5367cf5682141b949887a30cda8895232f26bcd42420077ff99901cc5286be6afb047f5ea2d99b10ed1ba0193010b5622c28cdae1b74eeefd674f7152e6d5efe9ff5319722f73b546dd896062e4a33e0a185d1992875363da568e1ce890797c85fcd822baa02e68b94975029dd7632b6c896e6ba45923ba333905fabc3ceb728891ca244d4bf24982ae81058a3516a2b6e5e1cbd7d4331528eddb164c1dba7b876ade686e44e3c4de9d214e1138c901bed660bd712fa40e86e0061f1be75d232ed48861b9cb8b4cd1fe1e989576a47e3dc7f209382e63cd4e96bf917ae71ca7c9da3d684557570cb2989eacfbc72222b9d5631a8d7af320bce22fb8703393e292a236d246eb0cf84b3acda4504de8157cad416ec0e0b697366cc707cbc4f9d9b5ef769c265872e0522f8f645b34dc04d0d8c200b85f4352cdf388e9443bd02816b5409a5336acda8ca5b2f953cb23165260ca50314f73790d4a903c8c5e57e4b4acd7cdd6711040336535976289b840f3cdfec28a832e38fb4e9d6655081cc703573e983a16452c660cf8742bc43c653ea55022770e4fcfb18c7b7e3d1e652e1b011542e8bc99b8aff733d7cf4733c904807e75db798673f7d72807733d72890b78bdcbab5583db75c665eb6cf85b4aa43daf7d75ac85bd9b765c50413b995d13ed0ad7da44c1042e8ccf2c3fb3300248a5df4dd56e116e1d0a1aee4b76dce644d6d22e24b80c5c9d133feb789ddc9c902e8573c363637183c42fbdebc6b3a1c105898886e643f7a2038719b0226b35d4b666e5f4a81e3bade1e1fb86a0c2e4a15e83fef85cb69540d8adf7b261f49840d711f865daa74bf87e0cfd3ff3f735a7d9afe9351636012e85c9b671eb1914bebbc2bea14d8ebd3c00dfdc9916a2a97f25b3d4bb4f562189ee5f7d6942ca51375866e885da2c7770193c22b5916b8d113ccbf333b8b08e422a24b9832738de09bb56acf606a9bda5557f31673c60cf5abee5b64378549fc58d87c5f11dee9af6f2e98b27b063adb09e51c984d40a4993504d625e54535d2bfaabd6304e4d4de7b41aa921cceb408486a64fb7193d7ee67dd6be30dd8cb37dde153fb140945c3b82752e10a8cde29e3da4902ac2c6d51850a5f51e40cf2ad973ef60463fd6da84c4737a665a18441c69506e7fe1ecc8a03c700e3842894e0cc6a73a8f2ded4f6f114fbbe871771f5be30becd76dc9b02f0b47d25c2dce38a2d3990ff1a55c72e361e86e9a812942fc107e7aaf479f0b742dcd8d2f8e3f03b10308fe3fb369d56a04f5f391d8aabec07242c58dc0eb15a134d9d85c9f9c0a1712141920579defe87c15b3c3db8a2b1b205c974cedb5442bbc9d692b4c272351a822f29e2daf0e414ceb67e3744456825334cb7ec60733e2bb1401363ca18cb78233ca6831cab36985776952f651994610b41238e5d2978465bd5e0e89ee7e3ece0c9cdb6d4fec943058540fd63bdc392a27066948d9c29a43fbc90deed0983e8c6fd04c1a2492fe1cc497a6f44b8b5b0323659ea36d1c6625e7b6074d7be91fac3bd9ca1694992a0fe2b079d11a773262453706b2414c196abf54d602be36dab6ffd2e7635d692aaf0a9cd3fe747cca7220822264b2860b226716d8b6de63cd53447918856907e44b6917566b1e1da3098fd0c4b92bbb0e44aa67a730fe5aa2f90957779382fc178d7e815e1ce8669bfb0d7b2cde05f50a644f8616b9e74c3210079f18d44f22ac0492b746762e9fbf52b5e0b76f4230d3e793514dbb70c04f60a948517d60b180230fe8d163821850a524fa59629fcf2101a86e0a7ef009a51ca4d7f83e5c08072df950d126f13bbcdfef8e9dadf2c98432115474da6ad06612318c2483ffff795c4754545c08e68ee7a007b32e7c8fdaa7c12faa5b4388d77feb5954e8412d0e5ddce1d42358162723f7c3919fafe7b099a541690d8d85e461956ba0bd00014d39778c931d6bb089db0efa74bc54c1d386669d63b35080aeba1b015bce1a71805fe60a04152be411f80225e8d30321ed4a65ff5d341e3ee19cfdb6e6eec2042ccbff0a8ea4bd7b673e3dd40880ee1a56d5a7be3caba03bf2233362b452bb037721be02ff3bee9e6bf89124015710734c0fcaa1735ad0e2400e35b94cdf4f3a916c8145964682ebb249f856f32e1cc5e1569e9b942b1155783d7144ae9141ccdffc61006d82e37b67e914e71d3a2e66a7007b0f4bb89ad8a95cffdb5cae9747f9cc8b5d20356096dda9e3993b371cae91cf9138c9b6ad10c4028ffd37ff13e0af8f9e0c9abf4ec3237d4dc241d7328192a4f23b05935b824928d0a209647ea31c6616d4a3ae3a639e1e408375e3a9e78ce36873cceee8ddd95714c656d2e95932c207ecfca1b43aa8e4cde8cf7073545b0ed0c7886aa153f5e2f7633b9bcd4e5cb33936350f8ed0db665426840df12be01c3ecbaa482cf17dda60a16dde105c5c3548c6c85c343b57c581f44108f9dd78256932e9ef66a468b3733db0acef65cb7098014b06233338d3f70c0178d3c78057b50730111856b98b5870a7dabfbe5168c7fbdf8690099af31f9ce6e28df0d5cdd6459dde5f82bb2210667b5fa8297f16d89f329d1ad67f99711da5dc0702953a0a0c02da3c7dd76b33e5a2bc8255fae439cf9ef8db6a374c87e57736a47871c874508b9f1f4d625bd7736a67b256762dc0f35acedb0ce9164115137ffdd03519854e4ab66678967e47b9acd56544fd836a0c2e406eae9a2753ff3a70f83ae2cdf8d558e8d7d1378d32b784533cc44f6ea45cbab72f339cc2037ce3bfe473efdb40ebf9d6c2599da4cf61a2928c04a6f3b52c223a63dbb6d66d668b7a65d748f057c7c4ddfdc917bf253030ae3af9aed6559a79a13b8d18f623a8d26210a41a9218e8b4aef3e36c7d56f4770d78c91342e37b63cac20f40f4996b63aac0d7ca57c2e1c014d7bd0ae36f3d60dc933ba12587edfff4b2d5326166e1dd4fc9d2a640a6131586021992c0de7ff6179c1a7d7b2cff0d982754c82390673dd1ed15e07ec2de8707d62078f1dc35fae72a75e3e1010b70d22cfbb7bcb51b226dbc8767a84e9f71fa119552a0517c2f160b21dc86c49a41163542ea76998b0ccba73b9a0ac6b44f581ba819bac3b0bd77028e8d8b99af28a7cda8c82b125da0cd24d060a88bac8d1173225b07cae6ddfbcddc7989f30ef69593b1e095d7cd9c6febf7e4a63673d7f27d503ee9ab6d18c2345275f2efa374bed3e95ac84671d375a3b5594f656440d1ed0da6fbae833300374b4a3be84662c39cacd2d67f5cd4867729e7aceadf393f43f2b5b837d109d98a9decea3d2f6e1bb254d651e2cc3160f7e6d08913f70bc84e974c3f36048dc7545b56b71458902ea4da795eb2a41bad39d19649fbe2d74a3b74b68ccad820afa66ff7db0134abb585a0d01267eedcd0b1b0653a504c7c9de3edeafb8acdd7abdfaadb22c6239b05f1dd58b58dc8aebfcf5681e2fd8e68b769575c01e6fd33c36777e4eb67ce2ca900977468211c06989766803bee32d3efceabbd65e5c13e8c9c4d3037eba8e463d619fe0e5576dd5bd15d248ade1d0fe3badcd1e208e375514a91f26b853f012740da73cf674d1ea836db7991471b97706e1cae5b08df23993e7dc5dd56da866ff051a477d6ea997ec27d9fab868bbbf11796894ce06e2d77b2fc2381c8fee3901d6ed2f712d61e6200e71c3bc372466d48a40123ea5f1da6ab962dbf2e3d8829e388951383e3fc5985cdc3a0218e152ce6f344c3851e0744d5b83d9d8e58c671669b6589527a2b916a9de4eb2032593478f989a6a897d88d541228a691f24a3c0b616ebcb072b974d89838bf6fc5771c23fa8fc86cadd6bb641acc92997225fcb831193806f83263f4c5b0824c93a50e570a065c120c12d6b42d5866ec4549a5b503a16763eba688ff97f00320f1f147c3ec4ae546243f8e54be606e7811e401707bfdd34b5c9d980f6a4891ef9041ab598a5fca7713baf0bbfb499bc8a9fef26591f9e0d6d14d9005be79261e63c3e96fdeec4f01a8c9c1f25f927da3e9621793a7c10cb076b9ac587abfa600aac7792d52dd8487b2e63ca17b0cc964206de72492f1e80444e7050334553a7ee669ad8f1a7e7ff361b6050f8b529334f34710bda04c0ea79c26b3eef82fa77ee21d3afc71ba2e7baeae7911f747a2a80335eb43d4a647e6d7d8f879132dadb4e2fdfe2f5483c2106ac4debfef9f8263ea4e507281e9f0db9620a7972aeb27e7c640a672c8a2eeb171e9366548e3403e7373ce66b1b48d802286eab10fe489a2b51ae7cb5a91227755550b32674cad08555afb42739dce90450aa0822fee63ad729f4bb64f09a28ec003bad64d07c6ed51a9a2a758af9c3df34b5e0a687d1685a658d5ac489c6261b233bf175eb569088e83628e8e435620b94d1f1a4b22fbf4abcb8ef1dbeac09507ba544db5f2eca4f9456ad8b889763f294259cb70641f229b8b7ff36103adc4edd10589ea3658ef575cfb3a691b402eddbfca3016f7f2e18c3201c7d7d01a4e1962eeff6c607c30ff672e73fde120969b4206c1554b41487ff37aae434a450fa9a64da1b06db8f8783aa56cef383011f106979409cd9429c7c071515cbaa52ff8f2417226a1c11c618504c42c57ea03f5419323f2ac9110cb5a9036f4a38f0d47a7be7b94a75a1f8403bdd2014d3d83464ceea789c19552c944d03ac8ec9139956dc4c0077bce2bb6cbf4a837aafe0abda9338229a76db3468be31212b776bfc585e9b9b06600c0e0d6a35479177c710a3b8db28ee402edd4e1b3e3509712121258692a6c4c298169268ff9ed5e5c91cb0ecd24129503198cb62950aa257a0f48151b9a0eab4f4300b31baad5c9845dd8b1ce0ef624b35f996a346791e0c69952093e3cb06058641fc0108ba3faf12fab2690c37c36251e3a87beef2db9a723f3d5502aeb522388fca7869bc7c51502798c04b1639879e9d28c76d65ae56b54db02df164d3d4b48e85f2f6a46027b6301fe55cd1d236497fef320c77330119b4a67a7c9c141b24ada5660723e99aea630a2c606beb608b389aaac401a6ba639e4f5c14b2f951124871dd2ce8e0c833e474b24010984b3a2ab90502ae4f72a5fa57a8851341dc6887b6914c4573802d938e8b911c5431a37d41caac50955a8e1803375cb5e18d78a316077e6b2324afa99e5559ea4de99a8013316f1165fca259b0673ecaf2f27d1ce8f5511c9e4196208fa77d025af2f8337af1c691bfa12408499791bf0151f8b66834bb3db15c2035f89098838d62f5a34fab449f39f6c8ee31c9bc0afec180a4f33e7acc4670f9941b60facb3c138604cb6cdcac471a4818cda1675ca2d93df3c50429aa54b2295408e9c8d54bba526aff643a7bfab1db9090bc58db406b0952842ca58d2f47d7606875fa2f841a05373c4285194a36165b9b3756119e34c1b8dc9d184d526337c028473fd982d39af50646ee7dbeb5d122afc4185971ed81b7e567c6c103623cd4fa261ac99f6ffb112861cac9f839a8995dc426a3dd2519174d1c0090eacce779448fd7c1564a70b8ad3519e5168cb5e2d308cf983640e7155934c4b472a19ed5b4a0ad0e914447c78aee0544c9177526a4d5a8cbc608e205beb1588d2c3755fb4b0981639b3a07b065a794d84a4a5e225dc905c4412a9a4a247ab803f8a07faf856bb9343feaa0f48c674576b8d2464907f198736f3b9bf7699fbf0d9f6960050f57b2e4d8e91da6bde56281caef6161efa3f5031f74832621edb5993b792f1dbc32f31e58122648425b0daec2b0a385bc09ddf4dbdd81376029f64692da856f5841761885748f3e686a644dc9a627b411ca4f6f595dfb77efd7b5f196b569608087e00768d5ca259838966eb977e3bab6a9137a18d73ce1c8a92e2de12cca7e545dde45c3014eaec08d4e3f177d71b6ccfd90cd2a548f36d8cb8a58f436a3bc19301dcc779f529b1b76b4b82dbf111ae892f633e16b517fbc7fbd7727c6f93f554204dce643e15bcfac518c7d5711bc885fa0d9e06e315e3e8c89bc0596d6e8115818b77c78461fef75b3c823ecb98b947f4f3dfb53419717ac2297e1cb278769359f668f0720b97b743eccd7a19fa381901f39ff66d934661484b832d6a9fc8a02605bfa161fdd32973f1fc6c9a30e7a8136dbfec8dd12b8208cfe95fe8e308c0fc0691d9b85d3b2eb53368d5e01504fc71dc6a1b4f0853b12e1180454e62508d9786795921e5fd70789e939fed6e3aeba9b978f6957cc4e8080bacac15446f33cb4c836bd254e3ee5180131733e1a2a610c8cfa8e05438acdbea0f9dacb89d3507f1c4fa064ec602802e20eb2216a920569db9361e96ae7ef85065c08c8a677bfd4677b3674a99819848558f83be31a3dd62609390e6fe0294d94106e30b742bcc060c975f07cf6aceffcb2dbdbe7d27445573e21063263f9df2eeef491399e078d12c368e4e904dd15455b61870d75cb6565c91fd8721810164e26f4a3ede06bcb8330434a2edc552d4050c8ad58e4a816ffd898190fa7067cb0fda57db9c9766e4be11a439b11a1aee44c75083df40e060c52670133bd23be0484abd7948407a30e9d0b649bc8db89a95376e04266a93d0211581a89ad3cca020556e3191aab1791a17d1004c43540f11bca829ea0a4c86fd8ab9a64a2e0f62b4bd8668384d2e838889da7f5d7e1d11f7bc91466e3b9f23a259e04f9eda336ab03d315bf5626dee56bf6049d5b657ffb7c63b8c1e897d1683cf945062daf83d635a8d69b896c3bf8a465764b5f74963d7a2b46f6d3904d3a373f810c11d2b8d6879d5f2b23de5e6d49e7cc86e186f6cd4d8b7db1bff21f533ca0acc840f85a708083ae2ce995c9b3b15f1b89945e4c3733271a24f1fa43791937347d2ae08abf8e2bddbe5bf71204f583272c8da89b7a43d16c5c796b90a5b0ba9970696b934ad2770465291d1d32a6215562985f23a000a659a1b49410d658da7f36e558dbf2f3c09f3fd88f3bd0a6e2a9218e7bdd4de507981c401e506d66b3b1d055622addf735a0995b1d8e23dfe3ffe4b37fd57fa4ab0470862e9e95415fec4e1cb72247b86908f103d71bd1b70c6b8078bb86f0293aa34b158bb7249130e32b6ab49330b8b2f80e7ea7a3f0902115f22d9f4207e3b138db9053f704a86bb66b5ba7f0c5d891327d33e3e3e4ef689a0c49bebbe681a521da03e939dd6920d8e807a45f144b5f500dbae0b829bb2e295d07c8338f3ef6b964bf4f475ec0ceeda1d97a4fb6edff6d93cec52e3e622fc2157ab8ada7a2827419e3bb43754b8b3bfbeabc5b565b62715a21b432b76400e9989f0c035fc59406fac47ace8f908b58689d1debf9f5aba55402e35932b607ace21f96586265428431f494ddb6e62b20bd850285826add3299d9e4842cf7a8bfb4d8f2cfcbd2ddbddc126c32daec626629f23d6058a655e9c67442cbc810767e4cfe5db32e834edb8bfe8721c2c8f79c887203659ca208646e4cf2420ba8209f69c88001a2a1481273223b29bc7843068a1cd6787f07b14e3d6f8693522dd7c0e82c40ada479708089894b3cde9d1ef31b3d741b25eff9d048e4d20c0ca85efae34131bf2e8ef686f771b82def222712b7e34f0902b7c90d6a9f2be19b4475360a1be67f9d0e2f15183f78943d39ce5f598d90e6aae2dd3b849bb5fc59584b5a2075d617a24eeb942b64b1e9682e0d4c075e8a367b0a8268532e068c35654e064a6bd9c784ac20fd8df0e3ad749f5f92bacc67cb4a5528f326c1dfd28fc6bddf58df160184ce15f5af0740db82949fb0f3165a1bbb1997e3211fc96765565d633f474e9a31aeb1a7bbb12f1476e30222e6c59ae765c6c4e5c23a8c3d219504c45ee78d34f4cb8e96290765268030d150d4377abf4b761c149d4149244521ad4e294e3bba455c9055778e9924a6ee2c98764579f69b9c220a4a7491cadc9f47cd072a0753fc5a5ac7fb2c2bfd30eab18533f3ac41b5b847f43d9a4b80c7aa889e5c9860096d8d2bad57e1a25830f19dc8012951f7d0569541ad2d8c880323c5bb9ec7d6c418c1c8fde32c9c22182b8f40e95a64a0527ca95c93e5c61b348f9c0fc30ea244356a858dcfd9f86b0dece4e2b11d5a4aceda805c4a6a48b83099be37b93c3b96797ac5d4510d2da1ea0a81fe8025c43ae0f08b96722a4700841e88054587618b218c857f71d3bd7cd1ecfabd18e40c3206d1ee1da2183acbc9a4a1768309b3b270dcc7c087bfc80976e3ddbd281b7aece8608dfbbdb8827f38107b6b7626daa58a6856014b9f21def1942ffb26f82cc470607dff156446797c20631dada3d33e4c0f2abd6fa6a89e3c4811acf263c3050454b646d254c840dca2f6ab636f1818126decc240dcb2014a3e1179be8131e46bb77aa3a0de98115f1cb1a37a81521e8cdb86113ba509c1827636d4979e61f23a59dbd65e7d698c8b74087984ca6349bca8a1c36912461c3580f069cacc2aca2451286ee9969cd952d6d811ffc7034055756a24d46c737ed31b7da03399763595f6dc484542fe40cfb7b13357c3ed52d60014796761974500f01571e29227ea3b0b4725eac60024cb7759fd3b65107adce50a96aea47b05bc42fd5a8b2be830722bd3ba4786994fd662bd4ff90fc7e3e99a373116bdb87e7a625c1c68ddd395393bf3867bc3b5db003d3cd73804a8354dafa9d3d38f7d81ddde461e3453f4e2419eef6b7e7aee918c850d9a6494a40b9f6519836e13dce0d48c5f52a806dcdd6a561a515575b3071c97000d5585fb5ef43c53ef3126a7b8e0fa0204a6ece1048d440f2e4ee684e9a74637c9d76e2b375ccc2ad2344a53259fab1acb4296161cfb2d3ce7e9bd0976f648969aec013a992a1fdb91824efe71a7145f4d1e4c40f769fc01da1c71487543989799066168635b5ce3b5ca0be29c1fac1c11c6d7854577d99165b2345d29d34b0dff860577c697fdf3893f7aa0f27fb79d559d8470e278097154cca020d8c2133311e98d4b911b7a4ac8d39f28c04d90294547a0fda0c1b58012f5c7006ca9863945fb102ef2a7b7b5cca4dc2883249351ce03d8c21b1b1634091ce201b96f008e4496680714f96737dfeb3cbc46be8b50d2b6ff05887684fd9182aadc45707647953ab2c7c7f14f5360cc07e3b3430d3d5edb70c85e411b5f792bb4e6f86c9bec22a8ebdbaf934517cce7682624e7be5df1da6e713b68caf44d07eecf40ccfebc7529ff3ca9a2958b513d9ec4e1ae32923d3272f84ba2a23fed042f5d060a106dcd2b3541708ee7acc7e5222929589c332a4fe9c464f06d7d1770abae4a7212fe225db2f703ee8015932694624bc92119f7dda6b2c5e6d9d95a1b0cff633d0d18e14e2b73c232ecce873829171f2c2fa16fddb48308019306c74759e0deb730c42e5e2ef76be7a52274a9586938228b2bd9ab0d2c581b9321f19fd8fb2cb73c614212a33be41dba8f1e897c9b5ebd6939d583a38f40717512f9c8df48ab1a7a5da300c7ca0dd6797764dcb1cfd9e403191269ecb4cc05542428fedbee33b6e4f1986239d37f6171335a74f533468ad14ef20e94a83dc33708f1666aafaf167ee907e566fbe92eda810c27fda30836dd9e14e0a9f25c79d1a3039a79ba9800daeaeff48db5f38340ca14ca9eb9f413867acb7a8c706dad1a9659a9b197e0482bf43a84526e2d7d8a4f37bad2bdd119bb1cc5950663c8d4a258e50e2f8047290b52c0b08455500a62a4f2b36aa877be9a7d2ed28a29d7fb2aa87b23d9f2d0b63d72ad9eabe7168e0ef54f45fdb5bf2faf22503683073df6aee668c8f2fd156e1f1f413876aa162e75e67f8153beda7c787216a8e4020be040218d500ce622c9af3259cf6016d360d5346b778872422d39edf50b3fd49d20ebd630ddc8a5ad7a6d3fcb1aace1e42f9525be7288f3bf930906be1650ed69d0b9c1f738281d0335c0d914cf15071896174350103c90b889972d1909b85faa31e2013cda605740a0a12b82ef1deadb29d91c9b7201333ebbdbdd1734e29fe1cc8d2284647e18140428dab7cdc399e38ef7058d7219f4e33d9cb605bb5271997071e935829765875969042d8539642ca6a459a728b1404efc52f7c985847f83ef2436642ebf8eaa5acb16290abfb7330819e07b06665c82c2bba5782d40b708124303fc4f2be66e9c09336215cda7cb0387039882ff65c8c96ae299f2b9a1c64400bbb4332bbb998897b750684457e7b5fbbe0c97a934359b2a1aef8659d5157a0389685f5308e3720eb8ee6f3b046cb330223357e02f8e6c061845d77676a93a9be642606204966dd83c0165c82946427a3e2479d8f4f9869ab14d04e762ad85da62cea383b982c8666d624edaaee0b44fa9742024dd59b840e91f1c596b74a724282184ba15ae2315e8fe03bd09dd414e0f724e0276ae1721fb99078a64df94eede52fc386aa985bd410d6274114684822fe8cd20e91715f52c71d17e9b8bac51874bf810c895201612534c9e20d800783e8484a450b9a79d45806f9ed8f98ca56470975b2da4adb5960916aa5ae259beebb07adac5edd17f76450f7fdc45b2a8af374738978a3d5db75e13a3a08290ccb662e1183b9527597589c3ba30e826b46c5d1a5091773a0c7568efb0d61ed2a6eb02a313bc803b615dc962fc5de01c1ba3807429b8f8a95e9ceb1b6c9e3bc371bc0baca19ff8dc5b3293489a6486451351b6ca5e7db6f70a28ad4ed19212b4352834125756deebf22eec7c05f7d04569fd096fc7f8a93c928742925f212831795696f97cafb2f66b08536933d4e9b53cbd976350f8510851ec25096e2855da09b2ebb3c8cbd6ca66a84128a046652c4a4f7271775b51b3e17e5a73cb3a94ce9684564b715142883629edb04ef19a62ca24a3354414fa7158468f27887f006de0406d21dace913b675cf9678d52d3028ab9abe48831334936dc53f3acf7ca4b09c7543d639f27adab3639bf7258603de3fbdda85c98bc516ef5a29580e096cade96c75294a2f67f6772ea9c42c40d13aa6bf0efb66e461d70aa40628b136c8373394613f971ef916e7c750a848af73ede41a9ca2fec0fa1eb2c145b9eb2561a4d6ce4236f1ee4a78308cacd0ea26db588aa40b6b888de8e9f3b3074f444ddd9f3ac192edd6b85388a50a7e2abfeb988409b374c5712567a01fa61a867c5fe2c7695302ed214eef20fbbf0ba31021f884a058b85c6659cdd1343fa95994f4d73294abee762952da6f0bd8124f434cd8d62ea5b62cb100e90d3e89ce3cd0fd1afeb4610e979247c4ce77c2e19dc139d33940579e094eee3941d4d931905f309d87cd434cfe93d26f9e2fef58de73ce6a13c87953b44511e678f7b5ebcec51cccd2e58ecd523fc3c61dbf7aeb93e50e302dc95e500392077d53a8f32bb844c1907595c4078411d3605333ab4b37ab0fd3782832deb7d1ade10741ebda66f4d55a075040a82d792b0b153e8a536080ef2bf3aa817873c2a3673235357275f69e3fdf4a79070e618f639c7443f76e6a70e69bf3dfa7c51761c6663b7bf9b7079e45deb80bc65aa9f7120417c871b1d1f504e465ab2745e20f71b44cf5dc21e806cbc1481549f48284fdeafa6ff50ba539435718c2f86111bc107379aa461cb7df53d0956a79a03e46bab4228ddcaf9b76901bb5da48b467657a502cc0d0ae86b226acbe2c0aa1dcf85af471bd2b8f6787197395f963abcb6a70ae6a6dd2c296fd41e00d605d2115be322889a19e2e8d186e3c812317eb7994d5b2002bfeeb31ffda3c495c11c40ccb86e9dd4ce35a59a9e1a967db5aac300000fdbe8c245a19aa9c933d08106f2470ca983733c16fdc9f289697e39a62685deff6e7124ecb21c96d83a91dbceaa1ed70e5f652766b92643c4ec6aa90bfbd39b0be1ae9921103388d811cf8fc48998fbe06403edcc65a05032f69f2109765b1e78cf861734702518d6be3fe385a26970885f74ef6b5c71beef963cdd3649b92253f7c4650df35bacbbcaddad39ee5b6d89e84f9ac8887ff45d06b8440d9367db5599e5ad8051ddedeee90e4be71590cdba7b7496c9a1678d83972658cdba58dd3f41894e35a7ba54ef882bf5c1969893a286ba830a7aeb90962451e17bbc370bbd0d77d58227f1a24b01e6d3be373b6e72881af3f161dae8dbe51655290cc0d5a27126a28564553d0ac6faee294e40afd61d5ae6209d18bc932a7cd23e66dd60a4d9fe5200df8829bc84d6b08bd38b35f19667a783a97d77e3fd9aa7cd32115d098318ea987d186cca51a374de5b3747745f687ad4c98fa1d338f08e59eb586b674ddcaa3588b1a0c96dc90705ab4cc42ccd392605b11b6ae3e6e407d9928d1cffc4e6e966a4917f984ee3984445a097180d0c953eec317548ec4b46f8ab5a0f8d5b294c8032cac5231564d9ebadc1433431a005307cf348999aa93f568b5c13c0782d3102bb50ebce9b6501a9181d53fa0ca520ba5249fef9f6b178f4f5f17a8f41cbd8e14ce6851c96bf6597fa78648e2da1a6d7fb976e19db27a365cc21b47e61b44897f04ef7bc9db6988cb62ed34d5e227dc68954f1a81b9c701d963e12c5000d1d5ddae504240db77cd17af8068f31f3328b562b4053cfc78831bcbb577f9d851a34d4d13ac7fa35104ebd07e6a7c1f892931cb8fc63b4d18c32ede9accfa133fe942747c4cd37a2cec341a4776106e9c25e7aec8681a1be59d9ff5d576e25e69fbcc6743cfdefe0840c287af9d80a64e8e63a7a11065569263548411e3f41ab552fc8b2da4d6c630b693e6e49a5332be22bd1e65566ad2b337fd821728816e40e9ddf17b68aa4c28066005aebf3d4790e8df67c5caeaa6ee37b93e19a2c4afa34468a78ba2e803943fe533010fd382fb92f6006c825b78aa4122cc422180d4280c885e44fc38711466ed4331b28d0afb42fe66bef1ee9639288cf7a15796add3801547df7dafe8e54c9ccd32028f3a404af63a9e3d266051d5ca213774912bec94576bf56826f0731ba18103cf9f9f06bd7d5037dfca84370f8612a5a5dc89a2d21969fa1976b3453e1c2c147160d93c5fa0ad5c4f682c8ec78d8f2a1f172a1f4bdc84856202bb907018418417b8f31d7770dcbaa1be06347536ff21b7df49366d0bda5817d16670f520538f4c1776158382366fa60dd2ad2f6bfcbf48fe305f47d87c736c40f531e035ca629635f2083c20833d53255481985709df592679442610dfd4d28ca8bf54cfc745d071e64c757b708914381baba386a713a33dbc9feda74ab32676e8dbef7931b17d21fcdd8d039bfe2a613e9f152084ecf7c4240a0bb554f58441194ffdb2f9216ba102d68307740f7f04b41e4f7897c77bde7749080c9d25ef573de9799a9f9109ee0409c2651623cfb4136e0921f3f9df5c2ab1474bd5b79c9bea0c3f8d84ba0ef9b2a4be7c6f7e68b816a005613cc1c34f889369b94c6c703101460331cf48fbd54e63a943ae554c49c1d1c2d904339f48ec1b9d88933cd90d85031fe9df215066d285997e4d9263c4f3a8175a0e4f1f31f9ee840e8557708ae11823b145f62bb10200a67a87997356d0e047aa7c270e259b1570f5540373ee57bc200b485e79a304a6ded051e8dfa4e2281479f5864a8bc45ae30013d5b7f77bf79edada6e614451219bda75d3837faa58311ca221c7d4e84aa939e6143042c4ab9575eef623bcfd67fa6cb93190bb0368912bf6d56bbd9cff39f4f07b89698195ff5cdacd2219c87829fc2b89933cd5ae4284d32873e0ce456d31a5de28096536c17e9be5806096036ab1c0e90078f2e906b11e4f1b459de01340af5a7b9ce6d168ae385e28d4898588108412651c5255c97bdc5212fbef07d7392a450424cb5df9f6796a957baa74f82ab9bef5aeb0a048e3aa40b93ce2f091ef3565a4d9a71fa006bcf1b09923b818e467c0c5c2fd63acb9b51dff2b843f96bb564f9478b81f51b5bae3509dc6918e05665dce785bd1301ab63f0c00f78133024473c258fd9e8aef69331c5f261657b64c250f1011bd985c9e8871008e6bd4052eac2a5013c3f081d50f7df954b6725169e49f2cfaa4b83ff194a784a13a10de8f31687e3a0fda9308f87d53b1bba7cfa9df97ab8a568710bd504d78969d1581237b3a93f9a0b44aa3838dafbfdebd069c6508ab73c75d4424f47c4390853ba5adaefce6946231eaaddf3b9c8bc25a03a021235eec2712e13819f019ebc1ac9151cb0c3b958f05d0fc77de4a3da1d6c1b23ee129fcbd5595398a2de5d0430d079ac2f72bb12f9863c8b7aa18acde530a3231f8a2df5fe9040e3135e8d966730b11b62145bfb8e61f71b4c3fbca9b75cd5d7f9f96f8b76f54c5c4e2ee612428bcb967db674db86190d32098ad043c7bb92412fd0abc27658525402fc6d7319a6746e55b9d824a56e49c1c32ec925bc15194a0c1f3b106cca44affbf7b58db9cbe5a64f24d988c674ebef262edb6c7579d944055cd859ce30ebddd08fbd3d276d153a85cdd2930b0b1a4f2cabd71d63b02823d9a2b46ca5a87efbbebba8e59865534b211a2811ac6e10f283b0995d5247e2cec1cab4e751bd4e4f4c71027509a887fb38fc61e3a842b3bebec386251b2f905f03ddde5960a73c7c84e4f4f40a85ad5c41350e761fb7887b0d4bf87f0398717b4bbdc693e48364191956dc48fe83707888572fc319413461510f51254c07aae8b4aedc52a21dd4a149dc00da51af2eaef875109aef62d0ad3b78ff3ca4aa70299752c94f05b2c2e4e3958518bdd180a6bc0a7ca6b27987509898a6f2188023c2808bdb9fcd2d4d626e6ed326cbeee535bbf56ba5f5028fc3f3c2c69b35987049b94a710562e464ac48073d4dff52ce33e321266d8f33f35938b06d48854dea58574b525c8375a1d104688eba87bc2d9884cbd5f17a3cdd9b384fc9b1ce77142d22b20d8abda1eea1a99eadcf52b6cdb012cd420000e5a2cfbd9660af8c5295b3199399f8899f49ada7c0adea68a5778407b7625187e71384ad393173c4da377d530ea420ba7e133935c28964e6ca43601b8f2abe1396b25bcce096b84178fc17b8f8cce18945b6787af1c4685cf312e4fe700a407defafa4ab7b86796e8c29d41e41e616156ba0c33c8620499ba94f29fd5329b7df17927fbf2a1c1e11ddc85421765f0f32fdc43f62643fa4a1638d1f18a99cf2681f4e3eab74ef6f707f43cd1b65c7008aff03df48ced8b6b21ccd3c0669a7792dd08ec7ace750e7301545ea3330d08f9c5fa6ada01481b3d2dbb9047a4dedca49c2d05693114391bdf95ca6235d3e1f86fbc32c22c485a5289d2c9dfb072ce5eaa5817cfd0333511d1dee200d7291499b1e7e075ec21ee0a82b7c79da9ee1db097bfe7f6ce0a05e6239ccdb8e7347b265bdc54c662ec340ede8b9d40c4f47f1161f886e2a2be31d8cc9caec5f32a50521703ff3d80daa7c796da4756d37bc10b2ac27d11406b6afbb2c1e197d89d1421e323b9c03b0f0668012e2e44eca5a035b885232a5c03c1b6c6ea8928a37f31c334f0e6d7f2d33000051d711fe2721f56517be5369567bfb4ea6e7258d1fb4c854f56b1ac44fd3c2d4288fb8611a3653cd6c07c5b28b936e8b37943c96be56f633c4ab3ce46db7013f41ee8c9b134ba16ec49381766d53ae4ec298bea44033df4db4671d212631067e504bbe180208309e20020f3d8117aa90a694601f5f8b3799d064c4ce21a2d6fc64c62e13852f961353140ac9abf320c13a7c8b7fec83fd6db4253e18a0c2c666de61aafe7ff5165dfc42ae89a816dcaaa5f07735e51892f941738e426e0dd7926d332b9980a54547f13dda6f6025aef9565ffd66739dca95cd1d4fc579aa77ea4798a16ac13c8b8ac5382609481c8ba22c2363407f580214194534607e52e7689450246a9274c137066f33829da19645381d68f886a6455a24721666597f2b9243e6a3b91f4b226a9707c03b9af48952ebc414b3e1212d3c5019b5d54f770dca88c8d7b5b588e71c701fefb35ffe1f5c657518748491f6f2084a18e080a4d7b49c54e6366cb3c4106ef5c6accaa20a1ca5f8f0f260a5575572c6bf82843ba72403d12d3335b36be24dbece9e18f489ebbc7cb226f2b8caf1935bb6b437d2209c190f1801f88d40815f9b960e6776e8dd24fb5914b3f5fc74f44070026faa437ed4126c62c2459f8b037bc19712495d1bbf3918010f3e278d2db1e3529893fb42ffeafbf26f984f13a694d968a1962ce48ecfd1140745f5c8ff1fbc39c6d34cf260ff4cd17d520d19b4e466f4cdf809b91b476ab44ccb5bf0b17f60b92177f77d2ed83a1aaa46b55626cdcc13b6d730e60ff2bde5b3ee2737d7a78a95746a6ab22435368d7cb19160c82d021176a653d44ae6df66b597df3697bcb27e8413226fc4ea66113a363528c91b12261cb455c369c26b7a0380ccb6f33d0eff4173882f6400b6e41d8462df6cdd20f056a5388657ad65afdd9062a6da926534b9f3b729abd16ab1ecc1740dd862ee1dba050e2e8cfcfccc0bfb9af3e6a1970a97b1c2b384fc4cd1902185b828ef14c0e4935a897782fa422743c38152a3c2437d46e3be1958c52dcef829672f080deca634f5dda18a04e23cfc17e738d48e0d1ed91276c5b7d5ad6d5fec1763d856de845af302749e0c284bb5c43816e669a355c73ba0579b5345eee0a0474a891adcb8be4d0dda7a821d461d95abeaf6670c1bdf1c2361c4b8b120e045cd3918eab57f441631113db010c1610cc63416f036069e0fa5c1f057cdf60596a301fc57e07e7036f8d976efcbed127169711d49ae247b44a8a0bcaa5a33a4f9e357824ba0277356f2b9857453318bb240d561cec259860c4975a7b50fe8dac1ed6413ab87b6d5d51c7c51c74eab3cc934f1c63bb82b80dad979a7359cca4a78845cec5fe407dcee361164dbe70fe450b073a248ee408f805903d0032784ccd9cef155fe35f41ae2fde79e1ffd5646390d21e2ee475565183717662aa1f0439495e4be656caf69a1708d80f313178165671d686bad6925096ca03b29fdc275ea22042034a1d68a882899d090b228579b0a76658dca1e9b5006fc4fef6c27095a2170a4fa72ac7e6232a88d18fc1cede837fe41ca7bd5b9b5575142a204d7d1ff3c626b690a1b929c823accec5c6df23b03511d5bac8e7e9029d3f49b367f8fcdf913a0166d4f03db8680bfa6eeaa1c7c6eb879fc2f623b21f0765ef88dd61fb76726e140d160e1486826dd710ca411c2cd0e74bd84c7b0ce3d5d413b098208bfacd5185f474777abffecb73ca6a8f4336c03a3b06ce3c152cdb71f824f9df6255ef655d4d75862170064f51054bb5be7b4ab1f463211d0dd8fd8e9f572d97768b46ff0d7c0f69447f97da63411fc6bc766632be516ffacf6fcef297f5294c73884361781ad8da2b51d30769f703c882c7771f8a2a89185321b772deb7b1f98cc889edf82778a4a7c5e0a95fb806f143e720b973e9f2ba3216b5c639dde710bb103bcac3d1f06b8089ec314a223cfa2c1512cce44dbc4093df4facd8ee5e697e1387621e51aebb4308f48aadd3c3fbfd33e6fa63fffc047ea4aef6bf6158002d6ebee65afa163787806d01d7744dbce9fe5f5fcab655c74420105044eff23d30778b11b3d20628a40164bbb0458d3d10722b6742882aaf2bc58aa34244a8e2e66407426b73a0e7537f0af519f6130292026fd735a9a22486e9abb56fa713e09d2968767e351a2ade75400a90ab71db4b77286ee46a308ec34f79deb268ab81dd6c72f7fc8fd43db7114eafb3e1f777d562018e345e4092714360cb6e3bf67ecbaceebb25db1711e50f3735c551af4e2cdd132700db8f007beaa0b03903a18e677cad5ad11d7374b708034027f4b33b94ea3960ff438fa7c7122742d945ff2e67d4329dfefe4525909af4c7b84adb27c8c5e243ef61e14492bbe15eb4db521af4ee7b107d7a8e15b813cdf3ff44418792383acd276bd9af802e29dc36e8c15bfce796252257e41259b519a69eeba51c6e4173a77d66aa8f097d9c5dc07048ef7319991809ca829ded0333df2974d95c244447e960cfb24cc06e2a7f981b2022766668d0913e66276d69943cf9a6763346909df1193f32a33f405c2afee6b8bb48dbcced0d11bbb44bf5cf47ba71d425ffefb9b93d35f246a09e19cd17f6b4974a4f4f980584ad5e5b08a462241e903ea4d1909e261844d9d089de65e2cc584413cf2d515b0a7a8ce0da2f0186dce07d511a97ccfbfdc2dbfdff6e07e56b37a6df51b4e8d61500e4589ec59a5ff2c8e8d9dbdb5262e63155c2060685ca5674a5c2208da8da4a75b3607518d32505f84b1d1881efe2e7599cb217ccd64c3462f856e97c4e5d607861201dc9d679032527d395b10c3e2560d8c5d848bc8fe1e526d727f2edcee51e4c69283ba2f4a034c3f5146414683f7af0e2e0051eca6b90facbc9fa3ab1e7680c94e2fb6aaa4d69d944351fb5d1a52821141b3c9a8c208df2fb37429e8a0c81a19503b52ee39ac39e0229c43e6affccf73cec875029870a9caf7802f64b00d714b65419c0d2ee8f61bc95061eb462630ab56af82a5a7db841e445da648077a9fb72d0b051eadfd411b6ea3651ecdfb518178383e8a459c705f46a1e885a499b31283cb00d86fc8982f717f262dc0cf3e25a90fda07c6addfdc11d699f32d5b3567bd5b3815ec741f80e6c86bd7cd5e485c4c9546b7ce0ab166d7b70d68a8e50d5be09896c2c3355a5a60b7d7a6dfea0bad8a8929a9349923b7a45589fbfbd09f48086aa4b2d7c179cdd910e65d56bf0db0a0a98e8d87800f3fd0732dd7777f3f8ec85f76dd93b49ec528ca707be0cfac3cec99eba8af14dfd8ab170ad4fff95b2d53136800457bd65954264b0b4a4787e26210746351bedb5a9db677fd7f95a5ba643fc8c47394f658bcfb30b4e445d73f8f8844cb6a85080427ec56a724b954375e2e11b7c417f85c3edbaa5a901abd2bd3af426d344cd69d09743260872b72b341213f5a953af96cc0dfe2615eca2618a3ff6b3ed0130d02260b0b3c550ba2f589fd03ce9ad5f4932dbce0ec9ac332dfdb9d48a67d8dd8d9ed14ebc8f7469b7c01d6fae4f5085983933d4c30060661f118fe52b6fd13c3f2c3b9230669ef2ed3706935bd17f116641bbba0a5df773b4ba778cac2db3729d2aa30c7426532f64ea8bcda34ece19f8d7d1fa37627c30baa56e7278c7ad3eb42e756c311d8c1f32fdd4e144a9dfd5237927800146d1d5abdf86d0699e7bfc74dfcf77d410d788beb1e711a3100ce8fd008b22f2df7356bca4c0518bb3185778ae01a187c4b6354af404fbfd5d16bf831e5353a16b7b8cac8ad75f5626e96e239ee5899c7344c08271a33bbdd2a7f9042b703d48544a054cdf57b88e2c944dfdce61de662779cf7f67d33f11fc04a1759fa000896f97a7bc045438d261ced517f8ad57a8761f729307f240a1033e78d590c8dc1d66ab08182c7822defec45206885d53371cdd3281e330a1fea1f4b14ab39843b2c82511dc7067dd9c9037121405caea7990a6804e21c99e42250b39e4ed6e9f16a623263e32bd4fdf76539c8939b35e481eeccbcdc44420254b726435deaa1da4c78470ca1043c5d429778ee5bac62e962f8dc16e77e0c6e41eced7601c15d9d8d0e475b9196e6072a2dc2a14e978c5dd7ae14baccdd72f288a5411a5b615e2dc704ea4c24d604032b68c1fc3e3977d574f6e86ce50bd18571b8ad455600b110ba774d6c143baf12a5890510782caf5fbca17d8c12710cfe6c4774f5113a98c0adce18b00a8cdfb99314f9c30943834dc4c2d706e5a68da4cddf573d873aec64e0b26a2ae74d64fc9133617f8a35dfd85d729e878870b66b3f376f2ab0abbbd937ea76af750225454851db842a91354079fb99800729713f18c457970dbfa1067dab058992e7c7f6e8999f542de76345105ae662d735f21eab396bf9c3a07742098a140c7f3bdd0c821ea8618536c551fe71c7442c985d1ae73e713f83648249e6807aa01237ec2ca1e88472c64c7a4dc01ecb6e73063df86c00524d44b6fb4166c467e443e91527c11584b48aaa27bff351ae6345ba38df3fbd4a4aad4a7486e4160b83726ae68664b282bc3a5e7c54655418100aece402e27abf007fdba71c2b4ec2796cdb3ecb54b43c4c2d1a0afaa0a7b0cd1029cf9fbd54bab9aa0b6f327f5e6c488abe66b5ae91a16271ac7ae6c19f49b41abf45bf5951fc5f7e643f69d426c06d39542ff24f5f2a4d9fe0d6d5a4140c742ed148a9133def094723dfc998e2f4dfb806f9fd5df4bdcbc8cf96f84bb62da5bc904a94372e65b75b1184fb3f75585e83bcab14d221b312be61659fd01ec0701c04f3dc11d993076e598b349e7c9404ff17bc8146a43ac22900e647dde00b48638c7ba7c905ead45d53d0b1bb339610e8efeee95990d4eacf46a042d490efe4720186654549846e3926790f6b7e2977da23c1744b46fa54fee68f624229530485ac50a052931b351a1ab3659a053058f4c496b32f2a027edbe4fb5574bd6a39dc60ac3595bd229382d68cda9bfedec9754c91d1176310f7432c85bf4d58f098a08ecd632bfd51860f829d4606badaa4bc65c2a7982501644d0866d8df0ae56a1a4e24b7caed9881886a55bd1e3a868755e07c5f6d73a50b9d38aa19460ed8d330392be967cf9ef231300655c55c645a64233969ee01aadb02cee9d2ad083c0f58f7913fe1c2ab0914f7c8907b519d93d042100df822c0858d8d1936407c806c9c2040ab96a68f5ac96cd58758ae837901f0f26b9e2ecb587cf254a736920bc82350e34609d72a7ded6bbf99b178bb099803c002d421eead774b083af3d33e015a4bed6bce3d25d18c3df527b682931ec1ab63c17f48f56d2e89b91b988229360fe0865a235744768efdce81bb41b2287a067874b6d82cfaac6e67c39f1f71964b67e9de833c51d022856c756fa15a18b76a40ea0c4aede11e871613839502827b75e94ad944bc0ae028ad53549be826de8f942dacc03123c33180f6d667d4e350e8743db762b128c82c18d65d023d89ce48609944e2c31a10f461b3349babe5d8647411afd01ef2cfe95a17fd12c9497bd6e2a767184031405155a9eb490a53e12c06136bcaf25335e127a7519faaf08f3fb3a2de7c137ef5067b60ebd836d966f5a17b54f8ef5bc8231ce5bc2b87ae51cefc9d38c02347a1490fedae44b9978b002de052b06746051fca138deb1b3ad81493793e04a812e0a9df99c655521a92e154a25fd7ea300a54947527bb3d6d7bc97b377a9c2c3958b34cb09a1c0970bde8f17b3e7d184c918a9fcca809fb67a2a1ba6c2076eb488c586e1fa877a5b1230b01c7bddfe4e63c2e29e7b5123afe47237a443688229ea192d24b0d03f97cd898d82a3902d95063687a811ec86473a39da7fd4314e9dbdab0243a8737d91bfd5a7696d7b2306b1b2d67ad90878844e95ca2fc987b95e314b5df3ec33a54ac022242ebca2775b4778d099fe308dc0819150ad7bb51f5c6f000ffa1889134e23d5e96b59273f5dd3926c975bc078a716faacca16b482356379edb8aceeefe2cd199fc722054bcbbb50d2a44449d0e693c7a62ab8f9001f84fb6677ee2da57494fa5bff34070e353c44512141b5dc708cecb3933a8f2b536e719c43daf3c865c2a7466b7ac96fa1684682874b4a856d661a524dbb6d63ffe7dbb7e1b5010922e7b2eabba7f7ecb892f761236bdf2070a39b5cda7e0849fa718c9a2ff8e9a9861875e4412b1bdf9bf8a8183cecd1b1969668fb8cdef49ce18761f70cacb1414634136109a39d6d0448909c72640c7c9431a4058a553f9687b02187e2a4a27014bc87ff25a053834c71837212a3b9cfe2f91f25511439e644e211934c0da15a80709a9439df3a1b67161c39004754dfc2fbbec8ada60236d5454ddb16244686f64da76e05c3649bc0bea7d9ba1eff546c8959c0f1688ebceda8ff660eaf94580801fac4d9dc251cda2da34ec41d146c481d69b93ca3b51343ca6054c2f4617650ec56e5750c26a2fb482a98c88d078d22227d2a5657fbdd1f508891dc08c6cba0a7b383309a2fe948c787c4feff9319dc578f93af41373df315c64a19df9ae32cade3253a3f82226589c61a80af60a90f14d86346532958c8858ce572cabef26aaaeb4ec4d516c95ede37e16645b59e28b206f7451d567568a3375762ce1f7239870ea688343fb971bfd86015f15191bf0007e1b66d8def831f2ce9ded94d7c71dbde201aab99ffa2059166c78210c6cdd48420f5a13649ef8f65c90fb0096b542b7f7b759f5dd08a43054714a87319a657829669b0f574c6ce35eaae30fb02c11cd9f181475011f8e32e61af30d7b37b01d0a77d15fe16db659e8b45c8e5c0efa03d81743b20ded9fd1f44f614ba970acf9c30cbf015fedb061c050898cdace0066cc83a6ab41156528e812b775d3fd5004b69bd04babe658d3d8ac74b44161e92ee42cab7779ae73cc95e6247308ec256fa6c9250bfe6c4515ba070d948e8007dcdf618d6ec3bf701e39d6f2e4a4b3b3839fdd68513be81c468201405ed6249f8afcecce003ffa404fff2d10732e27526cdde888ffe5f6c25ef92577bcfc280fe2cd4ad17a54d20d1227449cd79f05df594a8975e1084d8ade7577ed5c5544538ab57421fba13c4d75a3509c61028b44da6ff8266bacc519a1e5e8ae66d6c543e2923cb3205e3022692cf534ac63ab225faaf7aa25ae641614618c4d631834749c8078f86c5ce87a8177950913b691dfb214ab14e0bcb8ee5b9a09266abef9be2075259623e334087cd6ea21b92c349601c5e9b50088d926690b70dad62187519957b5218cb60f19af3ad83973228fb0ba88573124cafba9d36bf0b6161462b559c13edbc9c809bedd0508eb37b13ccae595d49a11145484357f1151558b62949e2dbb6ebb8a9313a081b674ca6343e7dc53ef327c2ad760449c89e5406ad45e92d6353874cee4d1088e1a0e4566403be41a63d899a08221edbe8d99b10b1f44fee25cc46e5f2defd13be968c75f65403e2ac3f56a369ab36d1a6fc3d98e5b4745a0599d4f6e8a3c81b5b709264fb627dc38408bd35f3267d4ee8f396d6bb98a2ee2df0494e3e9198cc5f680d62637a536583a578d23395e0f8775c8698e0ccd89c3acf9b97991bc99b7c7aa2c677fed2a94aff912d4b11db5ac1f9ca5b76e04c057a9cf4abe344814e02eccc3ae76a83efb8131ffabf6363268d3471f8c3c3e3033cc3e9869ec13f0477228bfb4d8ffa849bf450db1da4e72dd42318d4fc08894fdd271d071592f139b20ef6402b4038ae7b6998c8693e591812fd7cc8596378ab01400cc8d6dd043e121a8b41108d8dfca5e5109a3af86ff0832b4601f61350265175108e65d336b7532cd3621f244f41a6159af9d5048428fe0b2fb1aaf2a2bf3bdff86c5d404381c507da3a92c49b5eff93a0ea527dd270ab7d53b22283d6c38770dad73461726dc592949bdd7a121f74a75296049a35b9da6048bff2e86aa9a39e5b02ae14c3bd80e40d4b333188c4d08aa342f3795d6eceaa860af1b356e5074232ceac7c01b33e164f3e28b70bbcf810247272a611c82f9f3482ce5047871534204b3e3f92dc75116c4bd9c42c5b3cafff77237921fa6b8c05503dbb81a1f94997abfc520927ca0b69d630412666e5813ce47e3dabe1fc67dc5afaaf0b0cf64c4d45e3132c8748e567e6817dd843c6f9b14ccd81636f283935456d835e736fc774a778807646c68062f2bb878c986e7a1f49e2c6153da7e7a6049e316320122b5875a1e06f99e28673ec9c82cb4b5677b8b99f9ca584f7fc6b892e4c935b921928ed1f0df32e5f53588a3fb7c0c70705c4ee48651479b6113968465b41ff98e231951ef5fbf2f16cff7ac87e8cd6ec7e9aa2d2bb06f99639242d48d9781157885332de838c77980106f7ba420c818aace68a595778727237f7cd42c0f23bc307bc62a8b80ba710b845ab3bc137db2730f8eebf0c254e09bdec06fe738b81eeee6eb6c72557aa2079183d458b3adad8dba0a5e425338c45dda26ee5b8767a07ae0c8e91758e54f36fe8c41fcc858b218e5b5a3dedcc2d5b4ba11087537302ee495e165b3894a79514903c8184bb2f593a58993234a508d0e38c6f6b6cfb99730de755ba39ac9fdb270c1bad59b6ee9e5489c9431e2101193860839bf145a9fab5c4b91e7028e0e3997966268231500bc8b437bda7cbefda210029047d1b3b6056a9ada4b4b9042aeffed19682c8b4c8957ea383f75e3834a40bc05c53be5d8dbed2bcb0a679bd1c1b01fc85c86919e87300a9861b4e1e2012f7cf0f43da09149cb8670dd49983d0ae6e48a996ea277b15307813bad1c05affba4772f853e31d03f8577813a68385c734cfd4d5d168b05ef5d509557a7cd7750dc8d189a12a9bb00b81fe98a54189f92c205bb7fbd23609fd9fa1cb0543316edf5212abb61085670503e10564c6f88b12ef8c7fcc983dccc520479dc90ae34e5a490daef17410a922fc9ba49748b9b87f5562fb3a6cb6a77947e93da6544d1330ac555a661af64efa44bdd9e5b26b53f728505a685362bedc5d4da1e756b7dc31f9ce0523cdc9c5516ba387ba081bc57b50edc5994d9d8710a8f9c41b1e31566ce46ad7fa4b9ff51c688e05ee51d52807985305a657f72e9969cc289bafa72604c4738188e92a927f2579cd5faf6ebd3da72deb5822cd6bcf77daabb8f472dd14e5c299a678b1e4d34f70c9850c4fbbe7d071f92b4555e052dfcea36244d1f953a89cf2b73583d9c36e7e3ac2fed8ffe7d39dec05c68259d2c9bb6b8452aa42b66269b658c67a044abd78365a2bf10963c3c6c2e98e794c6a95c441de50c26f57347fef311da6e629bf5d5c73e5afc8b2767074dd864f75ae4ce0dbb27552210222466332b134d9069f769f47f22c79b3abda904f203bbf050db95b2f4e681618f61dcb35cdd60b66b9dfc2465ef8b428fde70f695dbff962fd12f8c390af23b06fbb3c14afbacf392dc398ba76c1c1a11053dc8055908762e6b5d6b36073558731ef42ce5f05d44e7fa97ed212cda1174886cf2bdbce3a6e0b8cd6385a916358c53c841f9e2ba0fc9efae213f7445715b042b01c318487c6c852bb8657e4f616c7153fb0105a7584937854c70212c47a07e9c82153f21e6ffe890e7d14121193e5d0efa3fef61d77a5323c0361fec799e66decc9b944d21c948cfd9fb535f7a030fcd5cc9937303eb2d484227719a80fbd534af03faf7241fc91f7dc6ec74d97b4c2788b1743cba380bd73568c5a8b8af0528cb0be7a095bc34181e7f77bc159e8229eac7700e7e1c6aef5febfa0febb45f8dc9f69e23084b8fe387f78749d17a391d6f4185fabe6ddadc555be5c98e09568a5f172c8533c7a76519654ddd05032aa8a3ba4553fd9f60c07d0f227463de5432db296d93fc32235ead28f03cecfd16d45b4e739764180ea023fca953e17ff55173e8ff8530027a6a34d087b289ee1a50e30d1ab17a7add310068bd14881d1be1713a971deb94f1750413118076cfbd09faae43f4b56977142a09adc0c5c23ca1ff76a4aa984f3b8ec5675b639979e344571f9469074cdb7daacff88d747a44153a9d0da26049769d53fc116ce093b5f81f4bd4955075a9aaf3459dd7d75e41a9cc586968193f45185ec42ed93131f4bebcddbee5bdcc8e2488262f253e46c39b2d665b1d7a287d974b690365a65b94440d513a641a034684ba6b3cab50353d40fa21f91e71802d3d05da088c67c1bf48d2ba74dfc1941a500bf216703040fa8ea67b34e7935074406dd290e8c0c52179cd1ecccecde5752a2b507f575d97ce58d33455a38e097889a55059c90c056ff296338b2d71fa1edaa34be3964c9c790730a5e7663c679a9f28bc74ab1231944ff20e43d49cf45b1fd2ba38b4350e07aab6ccf807b8c9273e67d2e7fd030165259a4de0899bcd011ecceae2ac2727334c69eed85ea024d84182c78d4b9d33a270b5c3df3af917658dd76aa8216780cb64eb4fe89be104446371a577f3ea32b7d17a2f399c47505241e736bf4b600848c69c218391067422d8b19e0d201e40e2d8ad93a4eb5eec6f1ecc8dcd1f9884999d76ac42d66e013d540b61242db3a886f3d7ebf6b6ac4f655fba369e67df63aeba8e7138ba45551ae9361202906d5cf68c70f6b5fe7d997892de5122703e11dee88e3d5544c29d26b4a809ddd1c58995921e837e9e8f89c7a9d74ab5f80148c8d4b9104ef6506b142038e19bed4538448ff180d4cb938bb3d6d48b9ab20b8980e6a0288413b8f17316319318d2bc6b6cb5048bb69293d9f9ceb3a4e53e2afe42b313c8554cfe722c4e7f6f91bb8893241eb59f735dab007d8f04bb0778643bfc54813cee6a7ec7e60106312ffe8434300dd56826292061d4cb045d555494d9c09212780e10df7357fd237ff641aec86e8b2044d678f47ade4c4487d3f4f72f591eb6c2ecd106a312ef5b72917ae2f9aac882586422cc23b7e0a09f864bb6b751c0a86ff674a8d4dd86d06fe12fae745fdbb22b5f9c63106c75e634b2b47de847727c1e7487221cb4c54b477b5aebd05f3865ab62ab8863a721148f2c804909f7e48f0241443f587ea63692e87296c1a80ecba74e8db63c3e5a87339086352721e0bb3bb6d272b16609c9b4321118b6b5cbbbf4ee9a3b286e50e002e2d27318c705ec2445c53e05035373ac603a2ee118a50df5e85346b595aadb06699bae97afe6835ceb242130d9816a0c6a8dcc7d79d0aafd6775b457eb27d0810c4fadb39385fcf24f37600a4d3df5208f878c1b03f8fb540da610f79891dc1e76c383024d628d02fb33bd32f00f8762f6e27c9d0b2ed5449da91f7d1684e3486740415faa758e9483b1f9877c509b21a9be8778a0a3f553227694e0b0fe59e10d738e97e642a021445287be0fda85307420626f6fed5f5a3f1639f29fce110c92bce0ef0b7c9bb7293986a6db7b66dee2b247c9dc770c7855aaf1f5114606b1788f661be98bf684d267f961d3010b0e3e53f7d40d4b6b8f46428827fd3b327d7696456443b0a9e51f5dff68f99810a850e003f1c8dc05f5009a46a207f09d629678a614bed8e95b3ea64935aa586316b0b0154a2cac53603718d55044279e65370485a964763f667edd3bb4e26b7271b6cb68c1c79f0bcf2d39368c752a2a4cb7c803daf64ac4d8d0363651970a9510110413cf588a50262c80be10b8c5297aa0a0de062d97e175e1daf6eb78d56b9f9aafd2f6867339a1db1404689671cd642300af08bdcc459cd29575db0f7b0c3dd6cfbfdf4a54c4a826db812a531070bafea68f58f42a21c1c137dc732335ac17deaf86e16817381d28cb51744d80bc030fc356238892fa08addd78537bd69ab01e929805e1ca17efb6aef584b4865c7eba93461d05e3d7c5368755dd4530f3aa19d85e400048f3edd440a4a2e283be07b4ba0a32cd7935de514f812b859d7525254b4e1c92147b025e310daca21afd61ba89dcf0cc9efd774f72a4e1dd8d94bf4380a1c1f8fc868f0b10374d2da59df9e7953b766ae352219231d8589b05a309fd97ad396b5d48402f14a64fe55b9dbbe46432e4ebe96b6f9ac8f44e566861f94b78b20ef61b8b2c6ef6c3074a5966021be7ce06ab318477580ac695f1e8327dd0b2b9e9e194accb4ebeed5bb1082301627d865f9f86e440e6a32bd84af7ea7269815757e997494f091778e6c493c399d932c1b0cb00df9e06acb1f4d3ef0dc7af9804bf10c8269ca789201f575ef50df8bcd84eac7d3ade9c7212036837f7979840ab45e5be00f99d4fd64b80439075a113415200f7be89249f990b6f5a336152f63549b0b5e4df8d0062873c84df9010b637a0d230c08a43bd33bbbf67ce2b9441c56f3fcd9f0aab1ba9749c3efcb3123a954f7e1c6a4384357ba9f76de911f03f032a8cb2f45bae9686f3b83fa438b777b0b0a9d7e3ea5b6a2eeb0d1c77eaa3a8ed8bb309d26a447918c1f04d3c1006b9b128880df83f088b228a1e27f163c6c29108a1c00dc4e61e93c78cff8c22e9c846d86c4961b0c7baf87725f23c49b275576545b1a17498821a8034cbda5824a4c18880e99f332f6c08744cd8261b06b169f62de64a3bc2351a81d8d12f01651e821bb840e6daaf51b94dff9980dad88709a466adf329ae59d6d5a071e98c3a3b30e1f3c64ba817957629ab81a903b3092997379f15e224c9cec1453770b7ab267d6ac0d89e455d2ea265ada16f57d2547147bac7ca28d5b916818b0ef91d855d8bd50b7f7242c7af2fc986b478d246bd59a3e23b0e62a649600ad25f0dbec1e1889509050dd2ff22def85eedbb8b8ec75198c79e79d1ce647a0645824865f685e47f9e333bbd343b20f606ca4a32fa882ea2ef05d26a31a9f7c0c08e8e4ea845ba7d9a2bfccb6ec7962ff786e3e7f757cb11d887f7f0519083aeb942272697fff9ed97e1a8d72d51d71bd98fefbbe5ae65d5e71591d56e3441e9c28faed5570f4318506a8127e0341280fb4d6490cb20b4b7907ab12c6ecb7eb61a7aaa116f58444a9dda9dd31397a6b0a39bcf7f107b3304dff12eeb94eb06c946a5f44ae84020c8fd0eda696b606ae32afeeb72a62c2c6260fe0d8c7e8b36e7345e4c2e92f799350db9103946a265964172f3914f0a64ee27924cdc32a37b5e23376a24d0ab0528f613d49b12276c525c0f52dfeb7ec11570b698b148f28fe39c56200cca7aa18769d6ccd85ef2325b9f163ab5485a3ce54bc6a2a9436ad2e338fde6cd8ccf08a3353397619a38a6faf347108db99ef07faa9be36336cd88448b0780305a10d97402d37dfbce1f023923adf01501c1e8a3acdd155fdf991f79ca92b4774ce723f818e563c8b3127ee4ac899f93afbf258ed20f9328cebd0e0d1256c07a909af69edc5849b51697264be28bd0b60bc64181895f8c9fc8514239abdf2b27c4bc354daf294e845dd53508180ab1326ccc7803cb9def7dcb39e01b3d4de2dd05d87ec0ac97969c63409cde2c6dc6b473969048c56e0d3ffae0e95d977d1a77501cda2bc81efa0af605b1cabfd4b62c12a28b02f1c0408bc00b0231b1efad858970733a2acdce8c185670f8ee033af7458a85c627421852eba17503c2230cae176d2f33236bc443bab57d3dd093e8fa5cbe3e9ec42018372574a8b645445dafb44df1109abef306cb3e388856c5a7ebdb944b32b8dfaa1d17a66bc9e09601ea9f550d7747c473560462770078cf799a78a04b4a3459b2a34d8bbacea32e4ed1aad033b20728b5a942fdf8cfcbf1018ed6f0d27c8e9bafe6048ea987a168717d5ee7d22f1f43f9242ff6b1f85101ae2a56342e933f8dd7b8bf77735493c471a9a50ca270c69fbafe48ec70d172664bb5417463a6deb8559595ffbf18681826b476babeb2626c274e082f8ff791d709fc57248cef264da80ea1e35b3edd62c15b7fea7f3a625c1b700c1ffea66358471b29d977b5be0c81c6688ad53148ec649aec961d137dc1a930f9731e0ec2f38898d67b7b2e18286027b000c5965ef30d72f77ce8d51b9f7a8573cb2b1e4ad3ec00e4b58f42fa30103c9cb11123c958edc5bf69a4a45321de19aaea67701a2ef7ab80e7cca352611d58ef546e911363dd84e053ba832e38327d2e6aa456366c21ea729829cf6834887a0cc1d45c161f07bb72504fb43fe957e6895ee7fa47537d01e313e0a586528def23f757b154dccf43e840835260515ae110528f8510fc7658d6751fde1fc4ccb426912cf80f310b05a9997a7c8ec255d5d9f9b1ddac5126824b8487c87de45a4b24431c23ddf4f01fa183f8f95556c74b301aaf0f679e18c7ab9f60ce5c2da51286fef82e180c9b375a63fe245d8e9d2cc7346d6fa1c202735c14f7e4d0d728d761275e6e5728b03fd63305b7515f0164d44acaf572073964756eab11ffb56591b427f787c3e82e01e648feaa49e855e5bca0c4f364b6f7dbd887a2ba01d57fbd1df58cdadcfe267ca57e356d0f0c8f9b09df5718ac5b098d0b6136001c524d8b0a3fd7d7e2557bfe4d0082341588d77175411243ae7662d977c44bb3cd7d8418271d3c6ae9df69060496bbe04c2337cb28ad31135dfc003e2628cefc3b9fcc782e107d41c628d392e4b6675ae021d5c68e477b332849040af197c3f033118e5c1efbb800401415e293567c32d1e580bf87f99a2898acb87e59cefab0be5eeda3d065592dea81cbc2a921eecd1e12ebdbcdfb8063155a2c9ceeca379210af0a593b57a9ff3e1e21bad9b408299190234ffd6ab939345165ee8bc5b249e8c93aa0622ebd57a9e6e780ee7101511da58c7d3eb02768afd99d474bf545489a6edc43b902e486ac9bb3c1a6e777455d28f653d8378d9b8b442679da47d98ac33f53a2db138e7fb989a2bd7d106d842156a7216e61d353bc4ca3890dd9a13a2913969ecb1a965ea7379aff987bc97c2ad44dad65e6e8d727298b660474e6f00b4fc1e22b1487706ede3217a5d68856387155e38be606f8b838e4a6a4b7d6493dab91cd182e35c58297890395a3d4577f83ce96b83dd68efcce9eb3d88205e39965442229fc96c704407929ed603b869bf233717efb79f14da8bd5f0627591efb8c5210decf788b353612cc00fa38b1c7a45441072c83576167eec0c1490b33480cde087518cf66acd338edc8d20dd8788d7b6aebd1a282b11c00d4f44864521441f0f8dd6a6fc68d586cefe2ae11e7a060e08a25216b2e5aeb8515582dae92a7078a7289a92937356f05eceb26ed77fd95bdaee634a553143fd4b022fd262e9beb9f32cb22775b95cd900000be1e08abff468715cd8a2e372b57f298e8b3d44eac9d3d24d22cb24c6bee827e0e3364da4bba077ee191f946e3d5486ed03298692a8e4314f19bd39425d18d46d16e8181ac639ef1820a7a26ad03c0d78d1be69c2def642777726635d3f0d7c17071c6ddb288676e488d87efaca33f12cbc63241dd54b64a9b2b93833c153a7e38f23b10185683be2c0f737a6554112c8168b750c47c53f36cb3c7ed2f560bceaba05ba7a0bd073cac85969c4738cc30a7fde4676b51d620db19f15dddf85a0070bf52267f0ab1b9be26374287185c5e5914b75d4438ad756de6d6dfe58da80d98c975153b18a6b78ab445efb16b4fbbba9ce84c6151bb1cf0503e67ade47bb3ef57f32f800dd98070d1e5db1a0145e1a6f62e235deadff3c5fe3cdbeca7e77f5cd945e27dbd6fb0f77c771388ae189d36f853ff912c3f998eaa9e53d64c27c2df0b41c731a31719b050c88321f7336e5e7592fcb77891c66062eb87370ee3a285aaf057f22cf8531212ab5b0b3ec9f7cfab6a763043ac09e2e78ef822f3ecc1053a420dd449762598cb6aca9c7df6486401c627d8618b6bb1128078a89a789df8b8165cd772c340a1ba4c89fa3f1d28e422790853a173e1a86d72283b8a56b21094e5db25a9b9793a5dd3b3a9fca78507e29a2059405bf27404e406d31841045dd4eeaf378a2b469a7f0d31bcfb013be16d01fec44661a540a416e9b18d47f6323ba71d7dfb95980936548197eb724e66e74d10e7107ec5a39cf2ed022efbf77628ddcbeb6765d5c5cc1bf0725539b33054ea66d0cbfe3f04288f5acaae1a11b9f4396e1d7181e47e3e109bdf05634f2547340275692b654c9b7942348236ee005a64965bc0eb80220b10fe2c2abf601a5381a581161dbce5275024065731f5d9a971bd91693bf95bfc7f2bdd6fbebc055ac02345f6a77739f54ec8fdaf54e43612673ba65a776d2190777064313a321b795166f8ba95ff54bd57f32b4841b880d5020c66c84d535654e41eb0f906e21f213a8c290bdd2579fdeaf7c77b10e0ae8fcb8cad235188e8a64e674d1b5273003033c961b98b3ba9b3a77c5e9d7bb83de8fa6df47e83e86f2bad8987a105d0f659f5c2e36533af3985c49d05d020481a5e48b0ef7f9533b016d9d0eb8e7b6a151a9f5b1be9f11e1aa9ee0f4465e23f2417e45900173565648618eafeae5fcc3e294428a3a7ff0be849227b909953bbae97c2e6ced828ca9901d07070e4f471313341f9ef66d5da18b38b96fb5b3569202d5a47d6c1a300e9a03a232f4932f6a7358e26ad992db70048767e9feb775b3e5119f3824c039fb62c32d4d277c6c965a69f224027b5ab4616ba2da8b4651973e36535fd4fd91ee19f414bbf08729c000c0ed3b3aeffba645b021dedf29f92a44725e50aaee8a69587ca9fec3b9f30be64e980d66a89d44bd84f46449e215cf601313d0ba58af25ad535c143e9684f304dad3adb9e40fbed89d9ef6ab480c33a2f4b0d9ffe98820b3315f0f04ce06a83942590cc9bfc0c8a2c15bbe8b4471d735998bbab46b962a2af349adde21ffdcfacc15a05beb6fec1dccbfc8a8456f8b8a1a4a1a035f6813291fc01d35e7e186d8d5b410d4858c62c3cec13cb432cdbab55d6f0e244243b32ab1c35c66250b80cb9eafb59e26a959e1a38583926d9e10ba33a048ee4ccbef5f0da494fa6bd49068aeb9e7ea92caa6f96da1041c092e3d765b99b49c391463b09f523f7bc98c9a5b16685ab80ea69506ed955a5b21e8006159f2de41fc06b700f4168e3f5a0d10fa456e75cc1402d3ce88262615d19fd6abd4820f62cd757b73b54b6a64e0ebb6ab87e211727990d9c74fa9028b471ff8aecdd40fdf32432bd56a8fa4a7505b56e25921ad131c5022730ae841018dec9177b118c3da5a0794de93c12f34def8dda6602583d7459458fce11f205c9889af9e1cd7289f0e5a737294027c3e469b82883d0258402aa99f1d83e27512106823c6349fe754aa6ce15969e8dbac491f75c7e7845fae56227f7cb0c4163d3c90ceb6d2e2dc85efeb138e6ff36dd334f5a318d9f7e1156a7fb78ff1473767bd31262ae163975716a9332ccb189b9359d64d9d66ed5be983d067e8f517946683ab83e2b9a33e717f8f437940581776faf7b9275407a58ec63cf5350e839bda10df2efadd2fbf8607a2ca0957e713a0edeb3cac253249619b3086dd2de4f038b05e82c3222c7b5f875e568487ab9045dd159169a33628919fabf17f0e106b552e2f7a360d2b3fba222d2bd9d1bebdb75871f6a046c59bfd9256a2fe298b9ca2bb5b15abb374bc50c1512a2b8a3e8c6464533d2e433c291bca172286ccb87106ae77c7a77721166865a06931d0fb65e34a5035c89a774b9a5074fbd095cdddc2b060795c2206c25837932611e5e80e34e8f810e99a5c7550551d6fe641b97e3c9efe0ede8e53bb61e849a48e7fdcf0a57414cf640c4ffb34d4f340326673e1aaa5bf6452a38a607019c56ac0386a05aba7fceb1bba73b438c48e41c6cf717e5e58b61ee80eaeb905e7aa5240fa39bd4f473da532d1b9c15bd600ba34eb3f6bab4a1caa6159e10c7c9852286193b8e77001f0a035692c2760195c1fea1ee287f36d56409b8931c28cb2189ddb6b1448a535d795122bdc7dd049fadf16f1c54d8935ee24aa5153946e5332ad9b0fb5847329b963b444cbe4e1915d91a4215cf3cac9201e8409ab1e6d057a202e36a414cd14c221f23239e2382abdb17afee0b95caf383f1070bb70f894461e5ceb8538388057c22feffeb2b953b838ba71306db5d3ed714984f57511c82add66e94738270f61f75fda60b2e08107859ba0abcbeac705883609cd7e7d237ec6748021ed007ec47aaca636db134313e0760b6585578c6f2b89c84ca6f510c1d95608cf06e554cba889456043341418d0561ed18cf0cd201913e880b4996699fdaf49536342240e1066ef83879eae4c8c8a10e2ea02e3155391b94789879d563741277a79a1568398332e99a49a870133140b98a61b02ae9cea31e89e97e862388188d47994d73e5fa60397fa32ef29143cb07ced5609b636de980ae0e59ef70f9b524ea874073ccc552921f6c5ade096e24fa2c04f7285c713ae4cc93c4e06ea3d47e7d6b3d6a1caf7c31e7f3972b48a5672e5a81cde7218f4fc54d3d4a1d5906122709291056d6062f12db420c0543966a9fcdd58f5a9db05f1e2c2f5c080b29f51984ad7ddd111378890acedb35715d55d9764d5740fd1aa64807255276d7374fb8e9349e337837210cd63780fc887b9d9b3784adac694e2ebc2f005fc6220995530c4198c53aa269e44c9ec5ad05f15b2bb25801b5d38416ac1ef9ea70ea9151a90889d53bbf482372f821f5f52ca9694cac76c04209827bfd8d8629223f0130c5d052cf03be51a1a55e24fd725a98502076d84695af58efceee0fd404b94a277afa26db1ee9081d2f2fc15a69a53d887f304d086a7867f19cadff89f4ac127526d361f8cce65a618057a93a979289e8b37aec3d18b559c028f1a9d8ad638cbaeb33ca78f0f4ef2e4a8a3193087088beb96ae58bbd8fd6aa7803d7864dd963206a32430854aab0926eca71d28e0fec5be83e5d162f9d81570fe338fc41b718ccff7abf8b06c40ffdc52885c83d2834a7187b87b7320056c2beec9b7d0e0bb7a62a5d0a4124555be57aeeb4665556a05db1f9fcb0b05600e8389d3813e0693cd4ae3ae62da37a35ced3bdcb82e0e1b4ee8c707f8e875f33529513cbec96e9766ef28187bd4cab9875823e5d2637456d6ffc1f36e61c3c249570896c60dd300b5dab36108656840d959b7c3a734194fa7546642208633e14fb476f111b2fbcc5066b4334e16c03f473ff8f7273bc7b2a8d149b519adc57547858244b816e1c0bd94b2c5caba9a9d781c6c2892ba9742d179cc449aed280b5eedde9e6dc5351e353adddd7affd13f13ac467f2df02246533e5d378a0909db4758d5b4396da53aa027450f813602ec025502a16c5dcb201eeb093f8a6d2b9447580fcc8c95d4a7fb94e003766df239508843648d290fc146bef9764f28c450ca1ea671fb73ae4e952103ddfdf62af1a69b6277b70049de867258cf9e70b8b83e8228a7fb93db10de76402a30c81bd7e6a5473c75d986315aacdd825741f87ef4a2f4852709936525a7df64ca4f90fe67a872ba03c03f02ff6a62f04363b354580e446cad83fd31407bee0508715340243c8974c771275baded67182c7dfcffcda7fabbbd97901789e9fd2da16f75811a760183fda2cf2c6db32c5d9fc78d4ade6e24e94077562f646e9b616fccd81ef482b7057104f1547609839f5a87b1fa15cd552cf0cf8be52a76ae1805ae17f8015529949cb680c628b16dae382521fdd39754f6a0234c050f71363f11edc38ee6cba70b222dba95cf99cb3629149eb514861f1ddb4c33526029b8f35c8dbbb2ec47dc1c9ab5e223aa2a28882f63f3d5510491044ea4b59151971cad7f22b7dd1ff301d98a8a78f474b62d3ffa3b729f5a7ba00c0e1908ddaf652891f30437da2128aa52e7092318fbe47e616325463956a2daf215c59bf6a319f580badb915ba017ea642b3e1a7343a95c163c21159e89c3487afa96fce3406cfd6acf363d489a5a4acb9f9acdd334a2a5de4113b7ed936812a86f7b9f8ad758a03bbf13bfa818fa4dd3345ea0dd461b43801effb283ac9b39c79ee2aeeeaaec3459db40b76fccb571ed47eb5d2c4868f59dc985408f9be15cf52442db116f0334c319d4afbc1a3d3b6014600bd23c6e5ec095227f0611ce3427a42d3914faa0b14f846c09f29b9ed56dfe6f87d3ed28fae5de0c13788f091aab5a743f553de156f59ddef9d086e0678a29ed2000f13118b9339201eae3e946598f603d2780ed996bbf0b45a5bc0fb825c3435086fbb1aa759ec332b80e30f1336e8f74a5684da220b98af2d5dbe120dfa43270d340162c715378de9f824aadf1f859a24d8b39416ff6f0efd87769ea7a6d8348ddfc04b8d36a76022e15d02b425ac4f260a86e42f4dc8506f47e0d15ec64c1272d12cffcdb33de6db61f64ee3c556df0df591b080a12d65942ea5d3bf88e730dc8924f9dc511d4b3d9d43c444e2d477f31b23594203612093f95ad20ae2a019fd0add8e28fe51302d9f869bd409f6e8cbfe7e7e04acba0d0900106d86649e68bb4ce043f4f96108b77f67632d1678a0028f350f81d02602ca2aa0e1e4e060dd739136806b8e3e6a3bd640fd52acd9adde2baae670ef9fc757bd6b8b6e98b9aff930c60f1f97614cf2f7eeb6909a12a17a2d50ab1cda37814e838371ccda171727bc3159b813f992f876b8ac17acf04e449ee83b764692a5edc18ec1d66d608614eaf631daf839fc14f17825acd8938517b2c2f031e563de9c379773a0e19a2af17b6a8bee9f20f0255ba53e87fe0dba3262fafc9d13f3012ba072c07ef11b02da492b5aa31108ac2ba2435bf35d6502654fcea57df2f483f14a0b1746ad4958f166c16ad82434263796d382f73eacded4e92f057780171858e867c80bebb70ad1434d22503a4be4c60b84c4d335b3580c25813e51f95bab005dd019880bf6c77b43d89997ab0460f27a75016d654ca058c3e3eac6e184b13ffc7482e99216031ad1b8f527d03e8af49b1c4a05be2fd4b6e2509dac6f3459cc69c0f971e95715317911afcb054fdeedbf35150513873a471e9625ded9de9507955bd16fa78b7518067bbb281a66d9fa400c36fe7bbf886393bee7fd1f210bef469e2fc7c806de4f038418cb9d1335a6e5bfdefa2c54f1d68ee326c7776b0604c66b64f3e743c8b03ae375b75ef2602091befe1750939564fb84751a6345f1abec2646f52b9a5eef34e34f294a77290e6e746afa75fec50b6f4a0abe6efeb66d0aa1c70d1317463e40c678ea8482622c19b0ae6f2c894af114dfd8832a31184781e38387e91d07f6afa04386503c66d5d88f11b9c69e9d5a1e77bbb40110369679b4a3894ef924faabafd6c2f19e481b49945a5b5b69bf52f839cab80ec6d739b38a025888108718f0899f785f928040c7ed1d3d776830d9099be3cf2d17068da83a80aa0db87b2827a5bf808e03c920f041d559fa456e41c43217d3427a43733be60915f78f4bc106df94a353835669c4669fc335945d6f55924c7e970239599e840d9aff501623c5bba82f41a540664afeec2b895f332cfd4613abee9e0e0ef65b8cf29f4a08bb6fea42685a30e35438fddfeef5cf35a4cd86aaa18864d702dfeb4ad2ea80be725dbd0083ed1ddeceb852c7736ef7b2b797d61491351fc3f5387d70baf27b74f321d0907f1df0706a86b282bd9d5b133c8643970e5282c904e96f407f65a38c6df778efede665e4e9df2ea87f2cdac8024d5f7591d9cff513597270d4f2ffdef9b200446ea99340ff78f3197f9f125fff3bd77a748e404beb339479d3a52329c056c83543da117272bf40b34c30dc33b4c987ace473c3d5fd5a0c9db646fe355913b76578f248353d488f663ad4590d29edb3538a5a22049ca38673fdbcd8d70107cf8495ca9d562f1ad059fe8baff637ca8c812d0924bc1ca2b2cbb8df2256c4ebb0477d9176c77b482996303ed6b4f3c4b87f3538f751e375b025bbf941d661c4f890f5e3a1781623dcfdb43b2664b74817711e153d3c0cddeca970306313f424005a008ec84df8963967be3ded1452301d0103166481ab8f66d4ccca8107f0eb4a0e12cc765a46f55b02544b218254f0629f96ba968e3e80beaf347f2d17c9c718e6f49858d0bb7d73110af5112b3c0998bc74d3a51e7d8499f07d2bc0bdbf04dd4351d84533ff806d48b83dbfff4683c63a48cde1327b906d75fdd1c197bb5cf4de9b2fa6a50f6ad7c6f1816dde2930864614ea754cba79faf0c0d51741f8db3e1a0a26cbf271a3fe4236c43a93bfd13a627e46e6b15724c553799298d1d7406b4516c474948be2ab23ff644a98bad3d070c4c79109c197b48d1a6c30c580a31be299c13965d974b117f9e86299cfab238e9c5f7ce372b533ca7ed034b63b78e5a1d274274dc0a584c03821c065e6afe11133c71b2c0022a2da3840cb4191134d5c4de3ae44a022eb85831eca44f7791f9841f75ccbf9dde29efc94e7bd86636fccf76642cd9f85b56518fc67d95796ab81d693c82a2482cc2e53c5041544311acc5879eeaf67799b051bc9e34f8af3fb178634322739d685f48badc6d4bcd6c422c3780b5024f0b60e59e16a5f25f01d1120982b98ae8f9eb7c28a1f3ce4f9f1e64f28015e76a02eaefe2e454d0913667567cd8b73aed4927b8711e8c0c2a151ca6d7ac159d64451f18599af40decd4f5e9b0bb8d058f4e524c4b9694a00eb5316caeea963bbf5792034eeacee2fe3970f466c4b0b5b69698076e196c13d10509f0f1c63ceaa62098afad58fee6b55d2a2a625fdba2a3ff7a94d90b907f55b6a654e0e3d0fed5fdcb19c92d0040e4cf3917b4fa2e66a49f719584611a3b569056bfe02e69152d7d2342ccb068ede94359b0cec2305c1edadb5e7ebc53d37141ec702853584f4296a692f6c343a9e89388ff940963da8bb2f17728ea90cfadc5b57e0df83fec85ca303dca32ed3940e9800424a78284418e8afd2047026ffa66369a5a24fca91b95ebf660c704550bbce32947c41af1384cdb353081eacbb85af489c68b8ad64ffd394e3cd8b0163fa44bd563abb96c4b62ab3445c5999d0bd08e98d0aead9049e72e54081f8cddb691ac1c9f36fb5385e89c270fcad1d55f4229217dc9828429c0ce48c4cfac616b6f0e8a2ef490c0059ef1774e6dc14b7236d3de82b9f6d0ca2c752719af5be200693a84355d1a169d80a93cf72dafc1e4c307aa15f85ad3895dbe33c3d35b2d9ddc8f883b9340bbf4da565a127891c2ef7e5316968369db1c0d62f6c987f950c5b45992f09b29cc705c0b837bbd1adad609ed028827005c5e460c7d9f19c5d86c40400c10010404630061c496fdfc71601caac8adea91c1362d75c317701cd4063d93ac06ba1c8e847e8296fad975647e4c9a11dfced4d17b0df389d52a3934040df10e6e0db9362316a3f3d745b73526ec0b34b6b1a7d3cffc40cda644105ba41288b84ad23b353b23a1e482061314b4a078f39b43d756e3c13e4d2daa2c1f5a7b6444cb9d3074c82c33209c16f5f8395c98037d3ac806e52e5bbd10123fccb66cf70e7a74a489552af874967b795bbbe477e06bc405fc00973e67676ab688d0ad94cf32eca06f052982086987370df8864fc0cfca97a0f2d2029b0a1a8e80407eb59d0d09307df222e8865d918d73f5fd51623b1c11ebe1789aff364b3634658732e33d8d1c7e3241a1b020b320da2d2c6912d5b04bfcd2edd17306a84d3ac6459484bfbad9079187522d255e67048fc10e3ededed0cdc05e19e4d63d8e06e8b8905bf69c7b9a60cc80d6f7b35b58a1b8dc90c32fd22f97dbcf1c4b49642121c7db4ad5d40e8f38d9241a90022c472363a8d03892f163e8f3a9920473e66a3bed081fd09a275f6daff539050c9de9925920fa4fea00ac9bfa607dec83ce5426592f0a6e738600fea4d13dd44e4d6be9c565bb3c3e4695f7b0c0fa2a1ed66c450ced3ca731613733816bdac06f8c7cee79ff7bb22ff5c1ac7f54e3dfc2dd6d7c65de0780074a66c2de7cf1cf14e03424e1781566d2693dd076db95bb6b6e5fdc9670a0313664933ae9f52182af94a334875629a472b1bd3f000f7297e7974656f3e75c16055018dc9280b52f2505080b838a3a510009107724ba0479ebc6110188afec90c967bec84967a764ea80ab256c99a3ada05b7e8f54e39f2b012c5d5c9078cc36faafddfae73a38ac2f8af4b3696bd68b5c28346d439f05cd001cffce45527fdd3aae25397ce65477d7b7948aac95312b77fe684f13408c1c4b08401e6f22cf0fc2183ab34c931bcf9036541189a5ca0e60e0fd57fdb249af1f7f7c09745cc9b1edfa192bfdeedb8b682315515a007b9fa3c66754df7c891a0d227bfcfab01ba6c9b060a6e9489257a7971beb054eb1a8082ba4d97bafee9806a433a58e61b44f3972a1ca02322b0d5629e0aead39069e3366118ae8f995249d03f3b53408ed6f7d8851d5a35ef6fc62e196927e7c81d2f40ee75a38dcd7acf67c028ef198e1ea0611f6045fd0b0744367d5869908b6a0daadd6079982d58452495feee2e202bb21949ff35e82863c5684e9acf037c477cbe4242909a72c09198e0ccb244de22ad9c778914ea809200493bcf566d84ce5ce3a95632b5e42770936375554f58ed8be0ec2922a083b5f6add15ed5c82797fa94af40de55b447167f95be70c666af03d0a7f3a7fb4627ec471bca3804a4345bb6fa9490536b83ce2983f951e04aabc7ff30296687ea9053a0578577eda73ec895916fbd622dfedd71fc4fdd6ffe333165692e2b3c29783132e9a6a1daa73786393c037906c4374fbbc4fb51baccb0e9dcb86e95dacc2eb6792e87a6549820befd2a896fbf80732f267906e2b4bfdedd5e29a768d28039a487d5fc04bff53414bc86fb3e3a772279ddf5c88b480a43aaf7feab9dd9680c8ac740327015f8803a7226e47e508fe0d8e548fd96876804ed9050c6c917c2ccaa602356141e1b0109066dd39077636589e314114f4a796c1eed887e75e96ee3a60f93f942999b8b7f49f3da980f389b76ae91d1fec2ad565d487b2016eceba4a0d842b5fecb889514cfa736a9f9f7c194b8d5d3e5725e3f17cf7492c028fe607b4137544f00fffe4d822681c2a60201bb71c52838517ef743618e52c84eb5bfebf7533b25faf9e9e9d9898fdec03690692240c5dce85fef1d5925e0f8bd45249cf276ed32fa19a1848234a1f78439096116b56375717c782b998161d7d1ada84b02a1e73ef329d36040d97d8057d9546084179ac679732ec56f7d9c2ab126066ab41ed43815cd591ab7144f33175bd7c62f5d835917227b6906d377af7ceb84fac6d32a6962cfad36a44af30ae049e57e894f66c017d838bc2ced84a5c4b339f4d8eb9c713b5d9725f7c3bdd4c0cb029d6ed5cb3f8667665d9cafd83bf0f2c88976261ea5b9e5e2f37d0e47f508237f3fa43f217fd47bcdc778ccd8460da63e1d7b3f283e0edd32cc7762bcb6025fa6e9bf9b2228781401131def451f77e759b623efbd94dc4413bf6786d265547f7f3f12c869b5cb4f007c8d50324b0b1cc0393d836109b17fd580a052a07aff3eeb57fead295ade0c497aff2c9926fd8ee3f0f9f5f6334a5a83a64045e8f5d2821e055c5917641cafe724b3ca1e609005d816f810c394e790b13a35cd46f2369e4b6a7ae85e91867580c91eddfb900e4d8c26b8b216a359be57090fa0355cdcaa89154d420b8099df4b0475f40c56a87038ca02643524c3ec7394cd686b355ac81bb1a7231121103502175050179c466c34cce6d9780a85d3d3296f5cddf304e2ba202a87dd7c9953d280f73ea92db5bcc6da9d37bd5781a49e0f51d7ad5933a8e93f8f3cbe8b3b3bbe8334639f419c8e47da94718bc83c099693b6e178888be3841dcb56d843de46057b06bc62c1e433bde4fd27e87e6c158c778d677ffe6f5bcd523f787bfaacae15abb36777c5dcc158670e3ed7c94f20c9aadd5c51273e7e14bf14b51188f4938c451f281fe41b4cbd3f4e2fe6dbe8fb8b0426aeb8c60e79d2d81403e9234f39395c4aeb46333f6e5b022a3d512eaf57e4f3b8597a4d4ab485d5ab0ffa4b42311e54c40076f2683711efbbfeaae27073492e4654eabe312696f9ef071258014b04990bb4b878f55f460dedb5618c90be6697b1a035c384d81813e550bf43ccf7529a405a43959d58ca4841dcae2627ba2d6a75822f65ad476d1fedaedca08ae96c67e50222556ba268fa420c7f5db5d1315301a9738f4b41e858c881f362ecc9bab8cad9c8c973e399cbc39e845b81c87950a76f6d4fa649c4fc9295689788217d38fe319f278dd3fa16443f542d360d00db22afa6829e44c2727fc67810742d9a699abdb9edc39fc4e0290ee2dca53522fd26d238847077adc7d37c94d74b5ea5ee81f2f30bb9b83911e7ba768b9fac784ee487c7cc01db8464be10ee12f527b33f73bfc1b9de3918d12b688a965b44e623e8061416e8b9f6775f4421acb74c4268795ba7114c40c5fc21fccac35b2b16d493dcbb6a4fb3839f070d785ca5b1e0e569e02a7dd689df8a95b139295655b38871c516252cda521bd27bd0db8338e98dd8164eb85b39fe6eb96222acb6e30d0d89d0d91058c3ed557b716856d3498e40f06c7e69680859feb27c38f94bbfcbb37530dfc35378164634df94fbb58394ba285c9c019c6209c52303e262a42cbd9316672f64d1532ea80ce48c9ec6cae5f1e113a631cec69a1ebd5ebf5bf54c3da85d6729a3a0e0719ddb7fce806fcf9118a927dca1a5ed51dca1f544f4164b6714b00a08502fec431592c80ead20263576da343314e7cc3cf96202540d736e59c56883321bd2795e6d1c3449a67ae03774f2c94d3eec665fe91cb9e88080bc5b45fb1e7319732aa53c7b33bcccab0fc3d481f123cf226370d40acb42bcd59e870c9d4a3a364d177f4167f563b77d39a7f48c8cd63467427074cf7180da9b0d843bf75f30ef86034358a0b27347e713b350af1e77865a46e4d4d10748729bca91ab2f1f8421031780f4345ce05875d829a93d108a678698c5bc861a899a0b073a50f5161344982123e2d56f0fada9db84103336ca829be2a5ad2cee1bd225b2916dabf67cc690f86189329eb5b24d500534bf3c41181acafc69f4c47ad43f8e54426f9657b6a976755f53b81366a86ec4cfd83c00096102c7079c256fb86cabe10b8262a260390fdefe04a12f7fbd55a9bef4ce183d39e686edfa30dcf92786fa2b1af686a625be911f666914c33d7e37a7cb536717d5810ed41436b804f45d8e920e4059dabb596205789469f88e42ae30da6f376b27b5c81d36f6bb27ccf71fa441574ab6df9b4600d074ff7808dc2edbb6ebfe01a71053fc92ca8e8d0139db112b47323b3616158da8d0505b162fa2974142bd7687a66cf014877b19bb6220a555535d42883956831e71251fd76b103b731e457d6621e252513f3d2a6d32a6f8f9f957afe83e3ce0a7e5b51d7c5f931962f1fa54b80b09e7e9baad1f5c2a00158b83f7278ecb3575e95b7983ba2c9edaa173892d1560bae9b0a2b8ddc25bfaa0d75d079ac774992f4d55620cafd3cc8e0924e6ce0f01c10d685e13605e1978c5d926137f95702142efc5d2a809c9619076185f8ec895d5f95a4b6e53cd4fbb53c973b49056dbd211d710953dadec016c76805330994d392a049c0e7cb69038b0cdf58bbc6bdd09d5aa4127c3640ee9835c506c4214cf98728d904eb0f460cc0c810c6d9dcdcf566517e9374473b142cbff0d5658c0551d99eedffd6e8266c065806305f86b2ea522940d308bd7befcd642c31e80cb1ad1fe78ad79a0be3c79f157fe5324ee7e6bca66fdf188afead15e1f07134a6573e104493a9416eb854eef089b595d60259aaa9665a82ce53ff0a5f5017190ef042d67d4b83f93284c0fa895a29d707711918047f702f4c218a7f3299759d70060c05cbc4935d67fcb6ddca9d527f2f8d6424d938d64ade5d94c793bfb10177074eb4c0b9a48ef63a38f460656487be038dac6c370b206c00b04e29296c1669ee08c50530ceccc3d7b97703c7d0a23f4a0f07797e266022c6a75ee109f4d3a533ee34c3c1ca08f6454678c37868b7be60915bb0343b5ca8d7b8340371dada978391a90b148686a7eb71ee4e7bd83876ddd5d0077ff2686a93d4cb7bd83a7bf4f782198d742af94e0ab833a1742e10b9869094fba296752127519ed9afcb0cb2ee8aedaf8653d7cfaeaf5645980590911a67e9bd1fd57a4f99d781ddc4de36d17d8740400641e6752af1e6dfc8e90514676202307c3c711d08fd907c146eae86731dd92eed95713b84d517f0be6d4085dba92f6639f065e51e9157a6ab7021300a865f01a3be173c5f03b1e2043dd4266ae886852b7c8670f590d4f5b5e6641ea8328a81e439389a05e1e51dd04955ba8eeccd74b118ca128002a6a515e1ce2dadea24e2ed7739ea292aebb1d27e3122169c21704cb7f34d60afe92a345fc8e9f07ff6039fa58c3947b20db79db6e8d4105ad1d264e3ed599d0dcc42f5ef777de38160b981eb3083adfd7f6ce12f00c2b8eecb4214e35bbef6d86292030d0d8aeb5095dfc22c80014b628402c200153253a1ebeacc5c0e1c214233bc7770529e8532eaf151f4a1bd4c692b4b98c2d0490f5215486a4253c925f5351691f20bcee585b83accd21f791d375d1124dee79b083e4ccb6e9b4898c90d7682052eb52c31253d9567ca3727314042dfb70acb60c5bc8fbafb88b4ffe25ff5a6b8af7a36106811e622c508b2b06576d0a95002e016b65bd68284effdcb7027ae401fbde111ba895989b02e0118f69cd45cb7b785d17d34837b08c4d5ce2236b85fab6292dbadd8247777e317be1f75729b6c70156b1bd269913b3b30551f32e50fa228615af318007ba58ce195da7d9ce3633aa2253156b5f18ce647072608406acf02b6141e428af7b647f9fd6dfa0e1e3e1020596852a9fc670a0a73add677f1fb6f6c14ca6693e4994a3acd90669df7670459d92210ef7a5c4b8d85d304788c71ef5953e4e3eaeb452f2e7f10cf80bdbaa9984e54939f89407880e71a61815a0b39e352d9f71d476d01729d12b2c7af15333f19eee92b78d0572b416aa2302497cba03e83b7a2b078002275163dad0da436e304ece4dccd14b12ee9624af7069111dceb823a1c1ccafb1ddd771a541bba3d110245d2d147b2cc4b31e2c5b289dc1df00e2d6423a797c05c2a31ab435d6e0a829bd58b76f4632835c6a34a7915c9fc26eeebf098bc9975a95042404649db9d0f1527a16e2676d2ad3f70969bfbefb269149d8494f207f1d3d090ee6e23e883ff8f56b9758944f32855dbc9632592cb94d9cfd3b19876277010f3d649b41e156eb0b0d5aeb7663ab044ffa16899e8daad644768f87fb29089538dc8cb9d22cc72451a966ffdfced7ab76f40beeeb506c82ca80ff7eacc119de0904c47ecd65a47b3a65ca042474628a71668b4d1e208ccf5c239efc7eda047b4b05fbd65fbfd45402a51bba1041db3d17b89ee31c5d1711773a079eb7cae207104449d2186e89a11b044876f8c40ddb374eaf21378cb1a6cc39637fd4434f7992df95661d5ddb2a4e66b2a6b3ce61cd6e75830abc282b1ba2d122025c12946f515a0e774c56aad66f74b23483f0240ef7fcd13d7c22d5743dd4c55ce0dada4683cf02dcd0e1159926dc53cc1d075e4505414c22b0092f7605a35123c971473e85955ad16831a12a80406947d11b57fdefbe28b7bb90f4a7e221d87452612bc950cdb97b9ca556469c966d74f92d73f28f6eae22e11462bc7cd7c94a9759a3d256d62d6664be56b0508f74c0f2ffec2cc36b6a715d065319eb98099ef3bf740b411f1f5767adfc2bb5d7208e8c786cee640bd0176721e526e7187dc34ebe1a0a1af5e0c5a5c80dfcd70b738b957392523667f467b5ec4260f6794fb93f43bd1fae637d97e586aadb1a34df280e0ea0c11b73d6ba6c55999242ca0ae719a156cc0967fe62f28b02c15d1a17b0718586377b5a4a2646a4fa5602f881f18916d8dd323a45a1f0e80d2feeb8ef0e99d84866149759f56abcdd250974bda725bddef0511b1d3857808e0b0ce713c24459dea7591102ffa4032bdae5b673a270c43ae0ba650141054024247eac9c0f906c5800ad57454b44279af66fbc778b40ffb5815fd127709c9ae7274dea301980a1fc892b42db9fc025cee3ea683b381d4758125a9f42fa22dd6e4565ed02afda5e42393422ac71de3e8a0066754b5fe4ee829d1546b2f084eec56de220a5a7529484d3d924fc9ad7193ebb1e130add93087b203205a0b7ffa4ad5cff85191c531ec83613c3a9706eada1b0ce73769b928328803901fa924617ad1e8d1b9510411fa9c3dbad3a5ee1b089eac679a79c0cd55aa5ea7604dc39ea39ba56460a3e70d115866952893c0110e4270d87b56157f3996455976169bc439c9314bb8c6bc822e14c68612fffb543e01322e5c690e0eac13d6f9572022955d65f5f02e8367b85bd2bace656d39e1c03edb46c5172b4d0aadffe2d8a17c3ba2c7123a55e57fdd40de60aeb71b6936f4d562fed513b0c3ba730730f29804901abc26059ed2eca1b58653c1dcbc53aa75ee2d8775b87c92391dd67a0bfe654c5259905e342b9872c69d247dd201ebfacd1cab7df7e30ece4146e24a10e820c8ce5ae5f6e2fb961fc448d0bcd00d774aeb0fd6695287890631c8cd2165b0ae60384edc81c692b5285a05a15a76a8259ba26cd9599b094606f75570cbae1a3117e28f606e5d29869262b276983ecabd72981e654fe495f5f1dd752bde23ccb46b546cbc130d0f35c1acdf396d24bb8fb06d20578e2a7b135c6c3ba44bdf0102727ecf15fc0965613ef9d0d47ccbc6e94ae42e5f334d13cf52d261f3757d09d2a6a56316cd7d94eedb168a5c1f5b35f744b1757fe9929768c116fb83ea7fe8b7c9c27a2a0b832738bfda5a04a4db890fe69dfa560cbe6240b5fdeb8614bcc0690a573a4b1983151b8b83876213310dfd734f78d7bdd3fc0dd0a1cc1c0dedacdfe010fb71f6a7dc9c9200526f0e77cac19d921184e7498d4c801747b56a048d074280bf34451c7cdeb7f46d57db5efa53b7da1d6c407cfc7016b4c92ea061902e219679019c475e3edcf2dd79f909a271c09c7fb6ca4b419da4e59d2a9b8591e780409870f41e922b1529fd7cfe5fd80bc9e49a6b61bd03795f092aea162f6d5cd38444b4546857a7e6094cf32f3d3cb7718661be113863071a74215e548e32dbc01853c7b57e118ac4f1de09e2b4b30457ccddd1b1cedee03ee2fd524e80605d0cb4221e8af5fbe9b787382fe4908992f01b3707c2fe45190e819f26d4e3e6d9fa618dbf036c0e63c8453f12397fd52d6ae0d8c98470c7b6a1e0aebb4cd0502038c2c46ad5154bbd3622dbc7e9643d26c5ca32b6e1f0237ed95e33e2c61ac29f1e8fa049ebcf6a09f2b6b86a198f444d33258ff143a3f760de89eb13e4bb1c0e346f5221647400662ed36eebeb40c8b77a52b384c8ff020be07ba2334ef1685977d9ea021724833d99453839ab7078a0e3c8aeed78e7a5d99ec34821402678bc45118d1b4858a5f26bcf4f8c54717bd3f5b82abcacca17b0910e03eb3c977a676857c09e2bee99c4b73db59b59a29ab1d551219f92bcaeef34f40bdda92366447392a199149e64ed04797521c14dc9feda86efecdef1a2475d93d3c7aa2bfe7494c3ada7d0860ef5dea39105d7ad6350ece7b7f361a9a745bf2c4198d140ee0244179bc62c6a2a06f2042ce245fc7d054f9a6a155db27fbade89edde3befc29ef0eba64c612892c4651046b14a488cf4c227826fdd57ade7d0dd105337c039f28d50bd2c81006373fecbe18c3082c1a4f68bcd8321958f12750412d7fa51a05769d11cef7eabf30b4cd0c238c82cf5e358e91d9c6d62dc8bdb2795141224fe2fb3de8282d8b9c712cbe24a03115ad8d8e9dd451f52084e149024dafd608cfbe188a52ca344c6cb8670e4e15c3c159399f35ebf949c6f1242433733cf1b926909512953811c6c071342da6cdad272d2dc77e50c1f285c5392d8f7b6d09359c5ff788dd30b09bc6061fde5a83ccf9dd828a089ed7af7460e2708150d046e7145a4b12e2db3c376b1f1cbab6216dcb37b659202a29c28641eea6aee241fffe62d483c2efe23ca4ac00800f5ec0c38cf06aa9e7c56f94b051cf602d3353392819329929dc208bea083a08a17124a527bf77739399a8f15fc2bdb7e0c4db5547011654c3ab1f9e5630f5f258b267fbf2b8fca93d6217105a8c1dbf6c53ccc6344d875adc8845653fdfd80dfcd56544c905824815900b47224f78dbca226fa6fcbfbb16ff9387ca37da6c3e363684502cbb4d7d28e715e840951ead354717bf53fdf86226fa6e523790d02372847cd9508c2b7c4505f3f5352bc07d07e88afc2f23c9ff975b474696643a2851343acb4e7b68cbe7d300dc3fabf4de11f93517ae7dfbdc723c8c952cede473b298097ac90fb210f911411b9ee332edca3f7d5948de5b9d9ec6b65722ee55cf66cda5893339657545d9bdc376541118358e43e178e62c721fa9db5119f133678ba6f9714e02081e1733c3bc10859cfbe15d75324a21f7b0a7a4c1b7dc9c63eb9b5b2c77f434cf325cf5829ca418b931cdcbf774f5ef668d34246b6de5b23b0ffcc25ab352dcd0d682093167bac376870f569314cfd4cf59babd3ab6868bd70db2d8d82af8c57ad23652aaa55287bcab5dd759a63b5aa5475d341c81778fedda5be97774a7ed95d2e25ef49c30e0e2e344ac35a5529ad67d764475af061050b7223ee41a890e5162170f4465dc63ef0f9473b56f1c960a30435b22e0f59c71200230e3893c9a458ee9122fd29337dfe079ffa2517d2bdab7ded53326369bcdd95cdd2514755def157c624118b5d6c49fc4b4b70c4e7f9d61a41d3e0a5249d0baf161ab3477f5ca14077cd888817303772ded377383c59679ca9b3b0d66e6ee38ae122a908ada7ca534d1927f4928f17eca169be92d6c1694b85214527787ddbbd86e814b6ff8563c8c8ee6f6f4af91e26d32ec0bfe212e28485b900de98b96c71d37ee33666354d8b67f6de2536717989efea09ccdc743774394209799fedc324173b6ae3d7da4aeed19c75ad9019efd246ff042bb48ae1572cfd5106049000d8275ac525c0f05f961e015f8d5b0038bc6791be912ead896ce0cdfa5ec4e626c213bb209449e671facca8826bf560e9e48ee486fa77cc086383251628a1880282dfbdc7680af3a118fd8ff968560d1cd00f6230fbcaeb6ed66f8326360c015cefeb8a0eebc3363e1673d63f97dac115db54ffd82d99cfe79cd299fab8419944f290e5ccd6f693a7759533c3404c06af0f9bdac992114834d7df72d7d153f7872da795f0fd30028cf27ddefebeccd471bd62974f7e0d0d2ec5a713433247e0df38529a5c9dc0c370242847ab806b7af3dbc341e7d54e9b9d9ebf4024501c1356d539060f9b9bb50967356a858c44cf4532a47e903ee6f7ed60dd08d8486a28142def6aa8413abbfe59bc6697f268c376bef6db30596f51071869d27c08f2834fa9351f735bfe04c389d20c12e5fdeda1fd801f0e7c932aa1ed09f250864fd67fe8f43c31309bb68a3d09c54f662c19c8256254f273233715145af2861c0b0ea3e4989bb0d8954e8448c17d3d9ff1f41addd19c05d9b2581cd2866e49f6e813671afc1b052f6c87af04d588b6429c7837293d9dc535baaf69bf89473bacddaa664e2ef1ac0167526da149f8d122573e6155f045ab977eefcfe2dd7e883f57a995c5aa947e9fda96715ee5ab5b3cadf2ddadb770694c8815a8c4a583e6044260bf30e2b68d129e8f0996ee1eaa90eb90c31f1177e18230214bf4d2c4a12c6d691800f2c838648c3b3a3b9c4f9b8cbbb7d4f29c924e025dc9ce25514aaa7be7a0d4edaccdecfbc5681e35d8f8c4906c78dff6081067df3b3270e1558ce2838e650485239cd8f99522977df5150de96d5da275b0fbe24ec35c66df5d87d9855e9d33bebe688e8b3734c456721cab0f1d54000f097d27d6eff5bf19000ffdaef414dc1b2401cc898a5e71eb40bda9ed220667b533c606ff18ba603de25458806eab8eba7efbe7f5b65464dc371530232874ffe355e838289c281bacf22cc6302c6dbf3a910f7f25af8d7825a4d49ee7212d50f4574181b4b2012f2496c69350d0a0ac2cbf4cc09bbb2741d8073281587d9fb31d0e62bd1955767577f787ee0a9ef1da81dba70b8a5878ee161444ac9de09e5c28865243098c2f5ff9ae1fac64dc60cdb2ddb3fdc5c7194d8caedb5771242632923ebd007b782cf382c863f057382879c6b3452404026af70a4b9f5066aa74d5c7f93803f6d629d5411a51b376c906460851067da54dad122ad009e4c66c6ac25874e74dc2b8c208ee170ab7a950ac73b5402730619717837820df8f37dd05bf779efc2b0188f29c7e638c81fb5146f0a3f1d", + "md5": "ZHAolo+CsYKpYpfAl8rqQw==", + "path": "synthetic/scan00.bin", + "role": "other", + "sha256": "a1ca0aa5e471b98beddf42738d706871542520398ced6f3ed81008e8c9812d85" + }, + { + "bytes": 65536, + "contentType": "application/octet-stream", + "content_hex": "7f670a0aeee1117522f8cfda01d5d351519c815250a6cec0959df42b00ea1dd6f98e04022837728b3ce5b49f79f786608023c11346dfaa94c0f2d0fd3cf28c8c21a789ad6c68f808ff6738982e19edcb4b3666ac5b66968f3257635698f8e3e85b1dbb81154413617bcaa4a0160e0a365901ebc46e416b1fb009a3ada95ed41c6d4878e8fb1e51b30a540569eb9d77734566ff5f98a8dac1778ae492cc65ec56a1b2b4a4adeaec62dca560e17b60e80c427c554296eb3a1ae10f45659018125504f1ae5e49ccd4338d062bf0a7008bb3448b8df8552beaffe8311a4a634755f13b67ca3d24d5622801f2c0086b8afa54df427a43b03de96ba22dff4012f1238bbcab8cab3b1dde4a653401891cadc91c4e8e34bd40184d4338b0a047d370b9bbfcc7d39ea894206f309339c2e7b7448a576214680723be5bb8eadc569bdc739a2cad14a8661e2371efd65b76a955de706003a96c46745ed409cb17167618755e67a4eb0277e0073fab1262046f57976bd214daca222a78f63e3d7c2aa36827fbedab7d2799f92d5c0b6808e0ece74c8dc71891ac42551146d52a230c5df61982431f16662085764134d4ad0c432fff73581f7e6c35d769b0de168bd281c34ebf96caa8d39bd99774e1206a0540c62e4c262171c26d59d819d35df0cb8eb3f535b70a1e9c847e4ff5019d5878ed4298e4f767670a66bcaa627739805efc766bfe987964dc3727e1af671db3e96ced286b797e29249c97b80536c0356f3264903eb02b935375b7385d4a0a8204836cf4babeeb458ca294db3060542d03bfab2b05cfa8caacc3d90a2528fffb1b5b4ce26188a88e2aca8f13c73c7dda8bb26936f2ff0ce9eae2a09c5df4701524fa03f526174563ebd782de480d7f12f55e0e767dd5b11987fe777032e84eb465eb9bfe9aa18626f8b9b422a0e04a6719226512d93380e95cbf9d6d4c78cb0dd3b69fddeb2ce67de82e527d0dfe9a9b3e67d0d94b19a1734832aa126062459cdf4ff9b1d9da5a7a85b0eefa4f0a2563dbd5fe3c369004efcfbb8ddd37160a3a26b3a89d43d26e3a9c9e35265d34c168545052ef5f1fbbcb7246a4b38ec023fd04d6d5a41bcf07d3aa9371a238830878604b67f22b4f86933e1f7917a85be61a7960c12bdeb6ad8f44d54cdc4a0d9e8b817ab8b00762cf162c8a2eb8e8bf3665b047d783c520bc3218f7ac442f96a25f8b275df77adc733ee3ccaaa22f99e8b4a308ecbf910d0bd9cbd2ab2f100beca81d9dacb38cbacde94c64a849678f41632abc1930b9eba4bc025ec9ca1373e93f87979256f4190597a14a0acd4b8b90a43ef1ad2597e5b6a65ba0f84b1ac50819ba1913713a1bf716817434e07cdee652331247707cdcfc52f9d6281aa37f090eb01e34d1929a767ba688e257e0896d16831237f929d11f79126bbbf0300343c851d1a3356b924e894fc8250fcf43d584c4a887ccfc0842f28b1d9cefbfb32f0aa9319919f0630a30298948ece7d879ae97ab778839bb0f58945ddc30a8d7609ae51c3941066b84b5b938fff6cd3353291a39e4b60231dafbd12171216017816bae66506f019572188a38341ee99024e713f86267deb53ab3494d836df348c2bb5710d0aebad7d7c8a257db094bd0b8a1dcbc8d4b3dfd9948009acec162ff84a553e07d09e0ca5b1c1aa341e6c2898e90887079413a21116045dc8345f47dc180235919434664f68e7aed5caf24c592fb0207ea1f6f2b2c503f78215cd95c8b4b22e27d4d22d161cc3b122fcc6a72fd5e54dc53e5896eb345224555c4a1b924d04671188028211c13b7bbb4944bf70498ed14de5c72177c27e07cfd339276767698956250c14fd849a9ae72f7fe549e937cfb7d54a68ce154adde6eab832460fd26d8829e91d25890cce544c05be3731c3d96826de833554084e6885f6b30835433cf89b5b30d57ec919d083a087eac62b5521671296837b93746d1a1c01a84864b22ff2db8ae5e111653871a022279ab3ec6d66c433b8361a8e5b38a3c98b1aef1f64e9d1587867a892c27f3f560f3915cca1a9b6161556386fb9f4b3649df85f17e7984c4f10ecaa78e953b31a40b854a29353dae884719f8c275f1f7df699d5cb50428fdc42873cfc02e5fbef3db6b2b0ba5c15629ae778f73f514a15e312bbdda9a85d2bd253337b82f0091f782d2f1827593a3633e88b1afce3a067c82b73d62c249ecbdb0880b4450c7cfdf31b17cfeafcb1ae648e7092f6406260b317593c7ee0362980ec2172471c4ce1ccec8a4b9b8b99c965d662d6330343ec193dae25c60c2182d7e4614a4b86def2831c6a54c24a87554ae1451d03a93b19eb8790e54bdc7717f17328477a7986e11fade0fbb56c3d8a9be075b3aba1646e6042b818743482ff85d976d5c7e808a78f518a81780877ff85ed4061a0b9971b52d7e9239f302f75f88d2a86635f3d055d43e7a23fdd639f89080432e29c865cfed55bb7e3e2e0961ce0f535017f4fedcdd32d853119bf45721930554217204f44347488bf378a1d5192c7ff8315e0f1c314244b869056a76a76883d10e0b6d9745c4b7331c249a6eed6e2cf8707d6722ac4e4c6e2be6c52f49f916174fe3ca6520fc9cd0c7bf10c0a40a6fdb3beab7812377edbfd5d679492c234b20f781199ef44fe1a11335ccfe599c0af195762007b26b9f38ada1e6d21ad283e2e284fcb55a9a14e673387df7a7195529ce27a1c34c45f79caad2df13495190b31cae23347d9c2f16b5dc774ec4e5d5e0d0853dc1366d233d290a8896dd6bbac003e11f165450147ba2b9e58cfff1c7e9228a960fbef5702f7f429f8f023a5072d97ac81bdbba4296c50fb94d7b1a450b573f90b0a4fab7c671d17358ed321e6f67f6876a7c7131bf7f1789e8f8197eceb800aa24129ea17eb1a91446f47d59f7c9aa8c6202c5efe40cfe0e88dcf64ba2412d943bcc13992b0bd87e88c6069b9763d9bc9cd3baf623ae858dab3eb061806a469215d84788c07f05e356fb7a5edfaa865f22476166746b148914d913390917b9f1f782199ba3bccff47dbb402a61c90d950af73e9882e98a8bf2cd6b1b83735f83263d889afa6de13e62dbe37b0d98e3246e5211d09a48e6cdd8f4511f1d52f299c3be4c66dbca45e845ecac86623315f30447af0dfd9a5dd787da004e6e8b0bfdaa3a1be986e3523c9545114f92d2077733eaeaa3cdca73aa7444c96e94b5e245a835ece07a0a1e2850de0fb4b8027c3ad96ca5dc493d0dd7edfe1eca77d77e37436013836a4cb7725f21b4c9a27f3ce8e6689e088b6851f1fe500521e3dd311134fbe2334ffe5372a825f31223af1fb94a9076915fb8e04774d1ada8b34557d063a20e0d7edb890313dbcbcea50a6a300ef6034051f637c066b8009de89e4728f8770943adff5beddb0e5063eb7bd35d5ff841626258f5514a30b6b23813b18875c942b081d0b9422fb6523be03982e6927093b4978131f0d27dc99bba5a6c3a484b2d642f1c04e66ba44e82ccff4b22187faa30d97da001e63088bdc4287d95e686b4fb06ca590171211ce825398752563331cf81b9f2b66910360d5216693f6c2a79f7774c1e13ad6a2f7cc4929302d6b1ee5cdd8a47ab28aa5f8b9d4dcb921863cbe15758acb1f365b6a1d0b694f42a72350167aeeea8050b4d7ab18c92c6c840c4500119ad226d765bc01d3f8fac80bc269f1aa4fdf4d99ba4d8d95c0204bfc52475bbbfb32fa8183cae1dfcb4720855e0b5ad3f890efa5b52e22e6c37373a155b64d2f7b399a57eb1c56ecb6c03c37ec4d9fb7b8d588bb22e595425e7f9133cde8ef635c93d4916ca8bd09f9a5c822098ca3abac4b2df1b12e7ebab095f3491302409073dc27b4456751d8efbc16371f19d8c2f802101585d941c6ac772db38d92e8126f2fa97ecfbff725499da45e677b5d22824192d5e2cd36fd49a5ce7e260bfb2efb22ddd87ec5d8930e6792460bc8ce7df43690f5365c51468816db7ab452069396473643ca462a3fa90593bb511fc346940ccf15ab29e248b1ddbece5043d14858d289db07c754cb8b31c853345370d385d3f7ab7de19115b57a6112a0f49d38440b883c58f68a3e010bb06e80410033eb532bd48611010c533a85c5ee52c6e868b9c0c35b6101c6285197df159b16f47f7ba95bc7d90b8fc335c90d98120bdbbf44d290b063b144bdcf278b9849af6c4832527865ec907257d3b1dea1eb61129f74b663e1188b21911f699f5a1b42bc4667663dbfcbb5e57ddd7277332f8bb5e5cf9f3b6d74dc572cb997590768102f9164d061e4b6424ee39a7286dc6917a53b624be45db3c26e31088cc6cbf6d7b57125b88a7d0b0b319d0619c7e1a90dccfe16b240b144df0f3739e943dd1da3b4b1e24ed249d43fb34b34a526e99b9ea967c0bff294117543207fec12e0c0abea1b627eaeceeb1bf184f998200f6aba5a3ff8beea6f831304a244434f4b32e463910861674c4644a2ace41d2213210f71e6400a2c7cfd47fcf9de8a42dc99ca30f86d20a8e24fa302231235d922d2439ceb074c74ac055c48f2e23708fb8cca7822dcb823854a8eff6fa3c2fc95bc791c9f4d7a6f938449fcd6ad5f45b817c05ff66fe1eeec43db8183e4db49b9833702ebaaabc76c78c1a9eb87274d5669d4582303ff38448fbb0e5681eec27601327acbf848e7a0c2128d9257b33788a89f060e5766891a769baa300a163e0095bf4eaac481301c948efffbcb7c4106b3684b96ad21c45a76c8e2a6475a1b7e1864950dfa8f1a49f4efc0f7db24baaf819c9f516a44d6f15216001b58c55fb82560c4b1c4b7a08a671a72685905360ed150f84cd0069d586ca099e970eddd5288a047923a09c7b7953f3798e77fa86119b6c55896c09358a7cad74f9d5c040322306a7b552cda12d7f3cd86299e94ef3abedd41008e4004cee060dfe0faca2d3c508f30daeba47995f7d812f2da2cc7ecb1c878e7375a421133056712f5bac4a326525edf67e3a2046990d39b87312926dba487a9f21d69924d23c7e269007d588219ae19d10c02d64b2aac3a26ccf915d16e97fb64b420c6326bd498f6e113aa553710f78f93f864092b1a0d89a0b4242cdb97127f163ed1cb72e7ce92712ff7eecccfb832650ed1ddadea66686a5ffce95d4a79716c1940b62598c6237f8f7778c0667ce9db33e6682b8081028f3c9d1ce3eb15eaf4d73d092c9fc9bf885adb24b2c81228a66dff22e0532aa068cd8617e0bd757a84c512fafe1ae3efcd8cc1146443daa83b7d00f6bf80485980efaf307550a8f4a28874c996f620fc80c7f92b5096bcabffb0e81b436039982c20a49147c3d7f69ed2d9c7f1191aba90d0a4dee54015e5b72b2de17119de0f18c143ed8ef7e99f43c6006e3621e0384fde2cf519c62e70686866a00266122b574d3e1a75ef77295906f6c4b7106d6f6c937ddf49ccc8053fdd7ed89c5cdbfb778c34adabed0c9a7ea41970ca0a8c81b4620e299d4923b578f36241be1066c14ea28a9cfca4d6abfe4200b41a16ee1e5899f04a5275296f6b398572ba2d1f2f010215fda724cd9843d80d478ac39e7e24775682e577b867365c085e5a699ed44b3aaa00243fcd396b6fbab6faba2983d5b416378ebe3ec10d5e262c803a98367553da8f0f00beb1ff9843c041be9b38a1af1fa6f9ccea2fd16df080e22bdc20f3936cd904da0396197686d307f896a2009976126cb84d01d70bdbba3daafa05983152c8f840d8373d43ecd7d543a465adbda861682811eea9ce6c1435429ac93e7d74f6bf93b1d007ba34f35cd6483a1d5dc886775ea52ac32967a5a004bbb56d1dd33bfac76ed6ac4123996bd98b361f71101c58f7cf4ec81aabb06fc17a034adb4f35794ac9f1a0f5b4300ceef0b85e2866c62547b97e32efbd66090ce647451ce94a7be29389dc8ba8927e68f98228a10bb94eb4e8211419db550a5b1dfe7233e12525944b01a2d19b7a6aa305b61231c80011547287648245fdb18895ea789927b148bc74eabc518fe1aed4b1984c9f7e533c35c5019d3d306461e85b6115dfb53191d27be8e81e0acda2589ca5736374eb72ef0b910feb0f11b7845cfeb27c5ff141a13aeb7ef8f920ca735ed6addcdc7067d8badffa8e446e91f026056e08f21fd07458f501d361c24820b4313943dbd41ca08631e962c36a35ac60ed0db56f9bac4c273d7ac848f7e0cbac3cf9236efe32f1771ab352cc8a128fd6ff40db170c719b6999ca6c7c1a1b540c21a46a97510a860969fdb9b6e068af52f6df57f9bfb07333814de966736209300188e6922a7155416ebd0853aa7f2f269ae649adce8760ca186a67561a815bd067517e1f11b9f6f60e025dc54a1c730574058ff8757ab7f452dd8a46a179b12dcae67f5f525486aeee6546cb85989819219725387636a7e591cf984130111ee21058044fc99a88f9d3dabe20f37e8c001df5e4e4598f29e6d401d467aef0940f9055a6c7543a9b245face906d6082c23ca644c819f4a50831da0e2904b91e206d7486ab442c7222a0bf0f152577c6738a5932174f83456fba2e6431eefb5dcfc778fd15d7b69bf84b257c1c66fb851ef6e1bb982efd726020805495aa4cdfc188c3bf30ffdd93310e58caa99ead659c0ca2a52900b735151e2254622fb073b70d4db5fd5768bc8edc9b34d488a52df3cc631990bd69a23209f818063ca8b5d2dace5136879939d1b87f75627591e888d2f425c1fe5641b2cf94d9d632bd9ebaa3a38fd3e6fe544b59daeaaf2e28936b845988d89dbbba62ae6a1f879810d2dbe543334981fc1d3ffbde7d87d888cbd7ef46eeffb65e59cef6a400bd7837ddd3dd4caabdd84c017c9e79326373c6a45eb7fe12ad3c6f7e4cb86da572de9a69c6ca3e31be72ece6fb6ec071bc1a6c663f99ba30b9e7bf2f4daf03e4f0b6ce562c0569299823112b26d4ce31b3a54fa1b346db015b538a77bb29403b5076c8937706e5e51be9792531fc1499b3a285334131feb29091ec212c85c0b5740b87f574ad74b4874509c482c552de2ff65ddd7e916e25b966b69c04a8d2891e502af6ca1d52359fb805da1ef8ec82e4dd754b44f4d8e89cf376999ab118ab853451016aa4dc87e365e94702f719cd3443e3bfc044b1d26a081e0fa925eec6fab49144557c3d1b8a8828b43759c15185a03d3881046252f4ea262a69c574ea1d5b84730da46e7d667df458964c29f34971ffc3cf72578197ea5a9e2aeb07d1ebcd9c59e310aa07c4eef36022c3d3cf733a9231918aed476ec1a4fe5864bb18ed178e8d1532e35e1870649c70b2bbf18d2d61a2e6d7c1b6e8dfe85111579f1d810a3b506d030a07766fa159eb569a517d956e88899685824c0c64373c044e4349c331da7f13898534cfe6ab0232e10485d6835e9b82c074bf445db2657497bb76ba9e6fb020299c96382ecacbfd53b739b1e59fdd8753f86724e87bc7f75f880d72ebacfb69528c0e6e592d87976595b487c649c41ec5f341faea374398b106bdb482d14f2305431437b0fecc48a0e286e2a6c24239916efd0f18533c62f70ad804ec9a8b9cea42434194aa568e0977e78f5ccea2a048c2a3fb4e29c154fcf297ab1b218433d2448354c34cf8f03efbd76e116b8af001054be47efaaa3a9df3f72de72a870942ba198a5e976028c7b45763e145ebecbf70e93a9d9b69a3800d8e247986e2624a66cdbf4a92d437e7a22bd52352de85c9b429c9c475993166ece5314efaac96b9189e5a331c21ebade61d33f85b6d653283c9ca583d671d209f3b946d235fd26160ad1c1e5ac8bd4a5af353703528e3f9838348b8b0b09b9772ed5a0e1acc16e002b52d6b05cd32ad7dd7a0b20d9551b7acd07f0ff34150fd5e9d78b33f471d0f5880cb37d904ad8492a5da96f43ad5454c80037896cf3fd103b0db825a8af79b4cc9ec80f532c4f482335a35d7b79a221b136f5cf97d674153a9cf0a237c0f778e31a34944d23ea40ea1166f91f46c8ed434639ddcd09b9207d06c83b347a953b21a27ec2d296806ccde50de033aaab567be5da8b2aedda30fd92b04f0aace8efbb66f101f9674e1f75d493321ae1b236437f927713187e9805a79af04045814d1cf3c98989b5f2d22678126023ac338edf28fb988ea47ebd8bebb081fd6c528818a522f8bf3a3f138382c51d6e6d399e1963832af9a194a7df30e5aa7fe0a6c683048ab07a000e8ef3c810dc7e3921a9d193510455dabaa2270ef2eff28099c84ce240bd10356bcfb82339dbc00bdf841e8dd4bb22d0bb463f6dcc48ad7e54ff8006a28d50a8668c88c4115bfa0bd4363e4aee223b62ae35f485f8bb780c610b27287afec0531654cffc9b65c6541870f354076085b7c6f940a06eaf5d62dd87bd2cbb96bf2eab5cca6cf0afbbdfe032dd3434967d86f2b59929702d5d377883ac3c85401e092caa927d8ca80b63547bac0809ec5611976c5555081d6a1b70b3b3c9d59d6549ba2965dda0a065fdb4fd730c00e9955a3db75dc3c78dd04fa4f742862186dbe5ceaa305a6d3e55fc0cf21c7de136e00571efa5e9db78aeedc65fa08b1b5962caab565d42cf61d9c338ea9b938531b85e53cc7beb1fb17eeb1cb95ec01d96fa41dc8159720072d4d559380449e26c7fae4a313ef20d7fa95721e1049e65bbf347152834f0f2029c5f6d6b477624176a07d66974a6e199d628a9cfb5ef1fac8039f14239a3015f3cf8ad6bf7ba94ad94cf20a6c0f3a545143f136d72b92203a189a90380470bfc51889942613434f1087d606abce245335ddb930691a19af897ba46594cbfff03c14c2090e3c5768b1a232629b2ddee90d4c29804aa1b03ba9b40896be7a07be3ddea514558c9deecb45a5552b0d5ad5ac962f123ce184ee2a244331248f8963021facabe2c175e95aa2bb4511fedccac020a8a9d92978e12b04c03a29a1ce14a7acc5c5a8bfac6437ddc9f6da587771269a56664d9127c54079c884bd472a260049a4e99030ee436cfe428048f234f7bf6b0a323201aae22bb011950f3d465deade29a1ec304aa2893a91dbbf6bef61d348d101c419a88ceaeccfae78e0fdfaf97a83918bf2d6a5c8ee528d7527be93cee0d6132dd665c56d0f8ee5dbbb8a372f27da625c3686a0b3c7a8217fda58a2e1e296ec863a8e9ec0e0bc0891ad5e25380fc86d256779c45449f6b033031a1a8b2e5f8564e984fdff2ca15a8798a763efe22daa1a057fcf13d5f1c6dcd8c1f5f4174212fa0e162f88ecfe2f617f4db909d70695560b9569fe76a2546957fa540a949a43c576e1bd5ed4332b1a230ded43c914fa2dc915e15d8698fa933edd112002a3ed8af983280338bf74b21f89f48b3c061c60752b1dcdf50139e866d928fb174710569ed82c5e8c8477cd9d0c3ec5f6a2a4f22c66ba88b1c107efd5825bce68bc8911fbf822919beae209414840a652e0c725471732cc8a61ea4d6f6bfd09d2f2cacb5bf7cb4d9ba7c4b0703195bb84f799d678614aa04b4c82f66eeb94014bbb62ac0b80beef3e1967fe05e75d92177f2ce3e1c1922bc745b1b756b5625344f4be5f7185db9ef90c704f59a403e1b3395e477a523421b09abceb237132a84da8e33d025c9eb6c00444ca46378ccdc1e16a539fc19d9edb37025f4f0ee45defbe6a134cedfc4c1a47a5565bb4e00118f0781b25eba46d02d37c85a8e7fb8512f09d01adf0be3310fe95c29e4957826d3bfd7c478ba3a058f6a56f88cee10f6a140d0d3ab17abf2fdc781c45e7c41c54b3c64bfeea5b44b081015d13437b8defa57ed71b98aa5b55695697ce5bcef6744b27d03eae92a2960cb381353c00c15e8bfdaca7a8d3df98dac78dff7ceb04a8c97e1eb11faac8d2f07367222c171a5c501d3a9044f2db2292567ffba4de2cea168e7cefc1dbf7d2815fe6af35715130c701eb2f14482c4c026f7c56dc0cd2c86c713b25032e6489a625be69bfbcf29724cb1041e68d9353ad2dd249fd4b2826cc981bada9b6ba6b1e086965f8733b7132f59ca53b3f2081416c83322f62ab3bb5b8c83011a8ded65d3d7b2563a489d922f0556ad7769418985d085cf2f720457fa9ffeaaf720f370aff510121b42257088e57909b3c56a26c3c13e405662949ac9b59cbc1356f465e5df67d97ae1a85c1319720e40209326af6d30372cc3c22d0c22718790630a7dc3d4ff034ed2252882cd27d794bb63b681e1b7f0bd50e300d17a19696a5a3c5feb907988b713db87553e9f520396f3bb0b6aad8b26943a677f477caaf3f191098f215ebad988f200ecd48a266691b428233ea65a57ac311c3de07b6be82563b2efe3696c51c14c08c1879066c3b6038093791de12959928c56c23fe45d7b15e6b257744c73202d67f13cb220759ecc8572d8077676c7487a15685ca57e536c29e9b20f69494a55a299a342231ba319b5a0c9c216479f25fc239ac66c6aa132344f71910442da4dcb10349cbca08724f23eb9c0b4c74f70e4d10f3016bb60e4c8020b7706001f3b8e130b6c7b11b65f5aac8cf19aef23759dc0315147c349895329df86ee666526163151c515aa4918154e606f76c1c3c664a616e4dccee0422e2d6c0fce0238039135753e658122996eda45bdaf43f0bbf593e79d2976b92088b3aa6b9f5cc21839c716e7d8a457d95bcc14bceb231b8db920514aa9d195334936b0de9fcb1712ece0aaf1b25577b84481d8ff61847d538e551c1feeadbb17df6cb6f951c548f5ee5ae8ab69b7713f91a58b1f0b86bb46b9b390abd9db9253842e9f596342b315456b71e8f4572e6d847a21a44fbb5b21ac0de706472a4dcdb817281013e36b8c705f49576046634f6610bc873619def52499edf977a35b1c0b8a6a9ad80ecbe7a78cdbbaca568dd1cc8fec17159356f2082b46b634946c6fec74976a76e6c5aec2c22be2708897a5c94d28976731d93439a2611e3b61cfaa6493ce4a7c245f95e819f6f59e6802c4592b7ec08020eeb867e4ddf55077335b209b2ca74505afa0db620b849e4b24ac83e6b11df5013ab026f0ddc0fe8ba1fb9438de2912fd8bc5e8a7022076229f89c8d4199338f863265f132f460daeec81ebf6c7585c43cb96275344cc4729942884322894f77020e5a9071e43afec0bb74743a1b6f6291b1cfde74e9954b3f66a5fb3728041aec273c85877ea8025247f3dc98466036831e754bd03c1be45f3213c0f58c2ccccf56a06fe401b991cf0e2577d60e37c2616bb07fdf4fcd9ba32ccf60f71140cd7b5ec58049329ab4eaa677e53de6a4759aa5cff1e32517bae81da9fb6bff38323f324232be28df26b928055cfad2d55371bf739208df5336e6f04d3d8dd3c80989b763f8052fa9c5b9bbc422bb11f9144dccad37a3df94cce71695378f1784d749420b5bef1b8c396f715a81fcda81cf56fa3da71ceaffb54cf04b209299e613808d27ee3db2fcd5b35a4f28b4b97048bb0756bdda1867988708da763d1af7b9fb32c3532802b350b681546b9c61b5ae88a0090393718ad1698247bf53d17f2dd5af5f431c7d59e8b4ccaf381391329ab18084a8173044cc88ca00ee9f5c5e55b5845a30afedd4e0b0a32ceb68eb729985c44f46080b4f8f2083df3ee97c73d3454ef727fefbb49b53c4c5844acafde95d8e8aa52fdfe36edb7663de411fd0613024a06083148861b6c1b097bcea911895f7a5893bf545f2850191be1dc9da7c08819aa60e7ce6ca44e4131e9636ba904568a2ce1df38beeaa6e4648c5d21c1a3691a9640bda0910c252ccecc9adc92301239dff8a7352c0ca34596dec8e5b29b2af80f50bc1259c3821b2c123d7bb042a57771a4f06c5bf7653e7c383a6aaebbf1a22377dfbf2f3cfde5ef9d53cf6e3ebb64379e38bd2631f9dacfdecbec5535f3f6edd5c4f217e5fa93674bf0ebd96a22a79c8c7131f0af6dc9fc50d5b6942338b7ded40c1b8b108df6b369692feba33d7041f9b7db819bbad4bff541a0964514195a6af11bdd2af38984959fd336e134540e1579368082a027fbbb05f36ccce60aa0832eed936f48c33bce39eabc864efa178c5253cc7e063449c8dfa08700536bed72d9e936892257e6cfab73ad260a139133a71ff469c6d4ea15ceca4e03a6b1957dcdcca2a85d3055531045d29e8b170021b49563d206324cd2db3a14fd73e563da8bef8553eced656ad11db2cc0bc5567a08d3a480ff49ecb47ca77dc050c4bf14d0d4340ac9f9c640ed3212921a3e0716d20b0f80986f31f130be6b84109eabe8aab74a34d8f889dc7b428a51261f62eeb3515763c88fa54d5352d871b5ab6c6b36d7f0860bcceb7325eb86e1f452d6a791be7ea9d3e3005dd247b4985e9d5256ed796648852ae415361bdf4f6bff308e3cf35bb911a83462e7a17605b75a14d1be967ceada2467fa10f18ede910ec52d00562ae5a5d164004630409179bc9689ab6865cf0e642789f581ef87ee97c5e2d2f300ed763d260e4884bbcae6b884e699728459b76ab47d5c75f11c5af7e0bbca110c0743680466a9bea30238259e21d106a8bc48249dd11cc75ad70cbccbfeaa00e773804dc3bbde6eb099804dcc39ffe66b6358a337954fe992cdd64e50a6d16b43d43cd05427d0187ab2156205a26310c0cc4b8b25b97bc50f330c8641d7832601c2e3cc3f30fa41e2d4d193f5c687baee14a36c8acff8bb1cf73cd438e6057b7bef30d52bc791f5dc7f5b4a6a9493bf2fd4a37e850a331df6e9933c9073c7180200bfe35b11bf9be082e6118b4b8384b4633f9cb2174865bbaef22a2d9d4a212647bd5ba5254824368d46eb18dea97379928ea296291a4b1d25e06cd9d7946627709ad8261b4653d1289616358113829e1124833e97c420ab2c0fefe6eae875e3f1b4ffbf549ab785afc52b9e6b4faf6036246bb1842dcc1b643ee103f8bf70944f3826327af0be9268bbf2ec098e4152306cdc3aeaca751f13d07fc6145e17c425585de2fa742d8b9e5fafb570ef3eeda0f3dce4ffb7a587a19d776e32416b1dab5dac5e3367ecc3d80bb7616429fae98d872187e6db9c1dae50df075580cdb785fbba6ac718dbd4d8d1cd1ad3cac09e6c836ba0b6a3a34ab87b4d0ebcb29f27ab486ff3c2cd4fd98e30e04ca5b897d4c03905efb6bb844df6d0bc5edab4642a0cafd8add7de145e13ba2e3f24a7bdebdbbb92cc8191f7a62baf849f8e8484615d1124efd9eab812318e0726f2d17d3e39682733fa330c6108f0585615f8d7b1694bafb6e0b3f1f1ea303570aa1ad64442d303385650e709d08a4d795ae679977ed181f521445b8dbb87a5881fbbe115e74370037555895e707e5de6a84e3b9aed13696663b224c31637ee402d2cd2707908af7cdd4a0c31c16875c426138ecca9256e57914d5742e28d303cb8d8616e8e7e249ab60279609575fdde6c90e6e4f069edc8a74dae489c882fcdb38114bbf8fd0643aeb63af5a8fcfdfb7d3601199795c8c4c567a46f96cb73278a3fc3ae189a7d737b5c233689c142931e8f0155e7b09d6dadf7e21e8bc96c91b94635aa5e90347ca942f77629eed10c9594cfc43e19e68631af935040b0718879e7d5443dc1c8e9ae44ba02f9719aae00701f7776be5feacc55f61e817e6ca8dcc7809bead592524bcc3b63c87fc2c5cd13571c74e4be0c072b32aad16e3b70052271f927645cccd42e94b0cc7382c5508b63b33789305efe5d4c3dcccbf0bf8253d3be1831cc42c04d7d2a6c0207756faa11ead6ba95cbc85cdd885ee6ac6620cca06726508505e976e1cad959a204e86f027da02730c723d46c5e3e6268a2682176a8149087d5a99b4821ee127ced3abaf724bd02960c6ebd9434e9e544e8dea9d0ccd3227c9233b9c19eed160fa472b02ef9736fecb1cd6b1be950eebe8e84b4f14200af17d268f1bd5d731445e8fceb74a2802daba1a231a0d81fc039e4be28c537208ffaa045eed686aa1ec12aed0aea074a43538ef76c83b1dff45c7abdab79610f72009a459f95c6fff36a216c31d779adfb5d344fcde00f6faaffb698579a6e469518c510025b888dad480e067a5fc31c633604501fa64180a6a914888e842334e40b4c50e4a0fae3a7d57734c64b9afa3441592245bac6fbe66cd40b95e102be28b9819f6ff737a50c70ac5be3ff139e3efae32a6c01dfcb9d928669270ba86ef7374fa491c9acd2f6f57edb5a96af44d7f952cc5e9b98280be091f4d7b74c2cbeb98151dd136afd1ead626c58bcac911aba2fffab47d565d6ec70883e356c0d506ae86faa866350b66dd606aac81da74146b0b91215a403173b42e2c744e1d60b9ae14c759241ea220f5e2f43be8814ec0a2faf166430222775628a52b8d400a6b9ada52490b977d7aec1e0c66786ddf7ef1a83019595d04ab4b75967cadc28d4ed4db15b3535ca1abfa15e0e1c5f9558e602749b3904361b16671b1acf53c405ae79485489425a185912957711a87bdf698cbabf095889fde4771d9ab91815da38f138034e6833241b047c2cf271a62131a61826ad19c25c290878f272c3be23679bc6134a5eb3195abdab5176259e9a4238b3a5f6bab3a5c779831cee1958dbcf0400cfc28e4f0591fa1f8557c126f915b6aec8565c919feca7b904dd365164ea3830682484b9b3e15d76be3728872cf228d4bfae3b60b7b0189e92d39ae9b4a3d8dd53abed0411833b099b31ace3b9025786add7284a23f677b8bec2bf409900b7725aa107d814836cc0ca0045e80fe3323523789cf1bff57a4521bbe755a4026a310d38dbf9bddf701618c8bed9579052d3f2645e13635a6fa65672fa151c0eb58c555c40e6c14af70bffd622944cb8c21386308caea7f3ee03c6641189a67d2dc81db444cea200c710a1cb72cc0a7927b961f6bdf553dc2debca4c39c41aca7a339c46287495321a1faf41e492a0cf3502a8374fff544411a06e24dc3d1c5db8e963deab1d3f33f9df225af1c0627cbd324e9610a40f12d3904ab54061d02c7be217ac025619cea0f4e4b8e3bbddef89e463fdab1caa02ddd7384a0b049fb19ca5a072469fc16bfe5c66f0587d0b66acb049727cf4dfabf9326ec6e753493f4eec1b365b9f73d1f8d12f36230369cde6b97a9b9b61290cf9575b2de86afd00be7c2b0a606e0962372e7fed552e5cfad4252f799e9da4b35f5e6657b3211c502242424669476b63b460fc80c751547d1deb3f0ea5e2827980c14930ffbc2567b5cb910e8417277a4286aed6eb7bd1617a8dada89f14d86455a390c6d4c7f9ec35be2226c4eab1aa7a83c9b4e89a14c81cd33faad64ccc4a9398289760deba9702f06d731e0a62dc45047227678c2330e713d40cbb10e7fe8cd1eecb83d1e5df906bef9c01b6c172d2e8150dea11498286a72f3196e8b22b39dd45267243f17902d74542ab32a9b733aef8365f30b2dcc9e7c12417d10894ec07c6b40d8bd717da65b8c5b54892be645e0cec802089e3835f1d00501cd4471cf5aa17a7520b48e597703b3f771879f25b25b30c64ffb7a35b03e6af711f5e24480eda1b1c9cf4a265b99bc62f4e136d0388a3eae3cce3168033048e38549920836992fa3b35671713eb481814d3b17088c2b7102613e8178e90ceb38b8867debe49200cb1be4f931d431062550071f1ecdd8778b59747b034265e08ae324b5d1afc4e1f5c16447f50ed8811114e12b4728cea18a885533a54dc8377e69c6422533304630557f36dbba889ee1f93ef08cea57bd18db72728c908fab211614558cad02bd08d4412f4eb9ff3ab94c246ec0807d790e6af3c39ff107f6ff2b83ab3fa79585ab3d927abd0201e9d8b006d6bbec2913d1f3b7f9284b5cfd3bbe5635e715c8b11121358d234bab702da257152aeac3a0e68e4c4852104954975d01ddf6748b315faeef171ebefe87a18f22605b39e86c4a7826c548f599f3d92d03bb5aabea0e33bebf2a37b8f82bd463b37be4703f2ab6d1c711a12fe1297bbcd723d6df721e41afdf69a792e6f7739daafd158ccae663f2b5a2c39523fbcf18efc930ab39ea8576cbe5bf21ba1cb6bfcc427cadcbc8c5f41591a101d0a4677d251e9370110a4c020cfa1e8eddee58bea3f7ecbfd54a89fa2edb05bfa36da6d740742df97cbc00f3607d247c80816b660a43850d1aaf17bda8345abc28df9e5b5ef724102e0bf90097242a08dfe5ca19d4d256ba7ba66d904168cbef30c821ac6398a49f4e00f40a5f7c5f92cc60274c00c7cd60d9c2ea317307af80323f812a13953ac31464e009ad19b89ad68fc99f346e8dca5f46da4102a31f850d84b4ecca671bc5766f498092a2bcd66c2e8ece5edcb19ecb4b6651adef4ccdd8a60004d6af2ff351afaf88738c6f2160df3fd8c4dd5f53d4205c8fb76abfe91dd89d19a0cd9b74ea38d802ca1af526f62dc5d0fac4dd02fb1427337e3366e21f5386e37ddc9abb24f42218c2d0a580186a5af8fbe7f3ca4a38761dafb26ebc04794bd311b2d12d6db8a8abfcf45e3873ead4a7d2f4fb90a7bb45b7e97e6d54d4118ac799dfba3ca155a3d54496ddaeccfac1b663c57e0a9cb0bd326486614525ccdcc293e983b7df379724266192dcc160e9fcbbe5f217458b3f66592a8a63a7a108f117a1dc8166d7bdcacbaa6578518c76d5b8876658b9f0e0e14a31c5b107e14ae8e9f7b1f997fcaf7fc0e20172cc48dce17d63497496d27442562b64e412ed96e32c42293ee1ac4961d2deb8955c77704ea4a07c997aae2e947ff686ecc42bb8c6f25f8ac5062da41794ebe12cce5576231c406cf9a1aff020aeda0882e4bb184abcbc5a1e47b89ae8924e856ca87073280da82d447f23d5804013ea04368d82d0cf3ef7c30a0f9bb299239fb7db63c7b78d4d3b6a64831ed37df20cecf579f3854dae298deada630791f2bf718304db9cd32ae8bc74ae1263a1267130b91316fbfad11e38638c67ec053070c46d216a981d4e3f976ebd37f04204893b52d0dce0b42ae2c7f104d96b804929e8c616107db63fb6ca67afa6cac8fa956ee739a7f0f190512a9c510a828c2110213141465b9be8b8ed328ed70f9417d13809cbb8da9da109ec63fff3a640f24c711eec0bfc6c9a98fcd2e448770bc183c8bab94e65be0f00bc79a257a564917abbf76ec5b22934631f6e8981a9c48b6eba02c0d0be0bd2cabfc6f5cdaa59fd987025aa24c5323f12ad05451d097750317aad6e853159f24a9f0a58290beaae6553837d689278b511c62a24beea21a8f71f3eff898e0635e5757dd77de7dc7674b0fa39183dec4a0c47fe420662f1403371cee4fd6f32533548e6c5b1f09ae2935507ac241a43702389f7afb47d53fe77bd534531391c95b1946ea86d53e0e3a438bd95c46f9103202368d1ccc4ec6b110b5acece43d35bf0f9feeb23e37d789d59cef73b605e7002f14da212321068aea94852e0af0f44f06d18113ecfb3a1f61fa09cd73c0244c89046fb4764a183b4d3b53ae1b3a6e39ec9936d521722bd772a3b91d5b3a574b65aac9d84b16c9ef788504682488db8617675a4d3610c39c70201cd788ee0066ed5c549cf1606d92e7a48fe2b54429bc4a9a10063f269e6b872c02acb3fb2e03ed89f47309d71a745e363e9e619b5cfdd6829edf34e0ab43f301da7ebc5ac8547b0caf591f0a262f7b36c769becfd00229f988e34f07621df9deafcddfffc90089fa1216b167beaecd8237e481447b6a1456dbdaa31ac8886b7e5f0bcc37385aaac3db6039a11c6effdc5a7f9755a587fd4df01c8c5e2db560ce3fc8eca8c6d8abc2d27a4c3ea70e75159c36e19c4dbd06c656a05d4be4eca53c9ee996fa02b811f5acb1f038b04beab1859db0bfe917506876d04151513cdae4379a5f136c64acf635a6632ea440d59757d47b9c077214bea4ba0d2ab2791cf6e50bcfbd7eddbdd4f28b920796000418828e71c64541794156e4762f30bb4377e62212fc3f40960d7a4082e1bb509108ae941ae3d4a118ca8cc43f4251d43d5c5af8b3210adacad0b377337a6b75a878fe1ba8e29fe2c98b01d8ff197303c0ffb8f7736807fdf8fcde299bd9b35bc78266c4e035a144c46b15eb9b755b9832ca63cdaff01cb6a2fabebf47765233344e22c5832ac89b344bddd1305ff8f1e6a70519d19fa1a421a58a42e6a49e47c8ac281f4c7b50022a77d27d5cc1718a4c40b086496d9d40bae9cb86de9642cebd384b752dc9a3725e5bd2ece0a5ba2c365dc005410adf4203efa6df85d85f1908a6fbda95cd504a4b6b14a0462a55c9810fa5265f8a437cfde5ed14da5b0435bb436780bff60fcf501851403c9e0eb49079d25efd1014ea8e715c42eeff8ea7387c1a9ccd4e968c4a670be49e38d5e615848977c7f01c27662745a73720062c4dd1930e64bc5b91e3c895e484aaf89aff7095c7cd87e53caf572ffe1dd21372ebbc4ba81813ea28e84d78222216849a144ddf17c077209a1ac66467d635f138ee802e302cbb44251e8070b98fcec3adddc058b5e29676f877a75491ff59931bc4216da7557c7c9027c3f6ee57976b6a689a44a37192ef2f47ec286f705edc14d81afbc44f1372f1e3cda842da9fa4be2b7ea4f2f34c00973bd16f446b7a2743aae03444e32e1b859711ddb61e99d4c42179831397eb8f662e78385df7930a21a5d0a2c7a231cd00cc9a4a3eec82451067137c689128e802d53fe1a4a6f2587bcae955743dec2759de82cf9f1d609466561487c346c9766ee882f58a40003283638b0032fa35cd04c7e713415e01fee9a691675f101052853faea86a675279fdeec111b6ed3ba3a3887f464e6155350be20601ed2ea636dded82b16ee74d4a009924a85ccf2059984a444b1e2745035b45bb08cd526634ca08d8fcb7c41697b5778027034039062330d02dc8efd69d893579340cae961223dad0c47996887000a8cc842b6717d4283110e921dfcb89d0d940f66514e4365ec0ef8a1079d83508bd54630ab06d406a0373e4193f335d6788ebe70e20a0e11970295bc4c5ddc29b29e18f35b4c3ad68cbffdc2855e1709a606ce913a42b7a033ecaf4608b4a34692dade42b6d04ca887ac551abb948f5171d8920f081efd698232ecef49787f83ccbf43c353bd59d3e0bf833ab334ea4899810960be9e4f01fa5aeda6980ff2411ba969bd5285a02c3064459bcb5fb8a56f7caa96c85848b4c20a978066b87fb748a23b6f5eba9d2d9def7417b8367d198687f2ce8acb55c7d1db49776ef04e00938a1d32c1d79dc9d77cf2601d99eb210997637151a97be1e6517c324f1a559c36942cc958eb04063c0696afab2fd78d35cedfa55ea32eab796b1cda300ca6595bdfd2c517a17b0049aeb5ad4a9a0dc48bcec2b49426799ffc7b5cc6dd2a801237776049b25b89e8664fbbd8c163c944c05e88c54f8ab19efd800efadc954bbafebb8e64427b96c7983ba94a0082bc7d9168053a11044f9622e24e41acd7291f3f1f41f30309d8096670e6ebb03a816d61d609aa7aba49efb390bff73556f7a6001f9a7f10f7da78d1e0db39010583cc06ae2c80c6903557544a41d2fed805c88572887299ee4df0c96df7c767167b8f72474188559fa0bd9fdb62500e7c3169523519705a63607ae52abf4ed3e0b22488ba6824babdc767cb13b0777f8a092ce0303cd8171d3b14c91aa6b455e49695ba39b7659f81941c60c138353a3eb940a2bb41dc476b1442bee774be4fc48603759be3dd08ee3eb96500066045f3c910219c9bd7100443cf771c67c0926186edcd2d0d4912e8f7c594cd4096c6ec4bcc0e5a44713669374a1a7b64a58ce6838ddac95b785730d4e2e220c739fbab4e5711e18a777763f66e5d625259181db9d7a93c162db63aef31bd8289616b3dd54604819907aaa6d0f2d50c1862dc73132242d570be36b88647cc38ec795596baa4497b95c7107ba0e772590c44ba5e3b23dabf93a3c6f5d61fee11630f185210849232be974d2aacf75a341f8cf379e007ac4b973049457ab9fb698bf43a05edc28efb44838c70e881cd28dd6c92023420d329ce436c337f7fd3354d87dc66c4aec720ef40ad258494f64c094d39abc540f7389e36aa01c7e297300034074b0352965f06615f4fe2e386be0cca22b48becfdfe3aa123ba64f749402ae08d2637c1494c65fbfd6a24912de19a9112e3b7ceccaee38c8c3eb7ccbd4702653ba395f61f7930a7705778359c376e24caf6f147ec045bbb396a4ac43783a3e7e2536cf47fe0ca5baaa2fbe7f0bdb37b197cb1db0ebede5f89639ce3134bde7c0d336cca93f5c90f625baf042ea65a405681043ff6183f544babeff778c7b194a2b94524f74f7ae4144f013c047ae39e5c6a0d887ee7a1dc7b906e72a5e3d6433e9aa75dc3fe9a502ae5e802c1949e9ac30b11cfc3c7f26d43f407c278dfdac93347d4f627cb2586ea33b95066d2b5bfe1f50f9e4cf3c3e1593e429cbab79ffe07dc62339d415a15baa03a91a47aa30a414c546b442cd7a54b0bd8d99103140878687254d127fba587876ad132f719a835ffd3c0bc78483bcc52c8edcd243b05d1cf1e2b41fbf299dc85397c25d3d0cacf1e31f40264ec48cd9557b6c741a5ac0afa94982bfd93c46bea47b65b67549c589909c8edaea092f1776a1db9fb3dc3afd11b5cf064f29f85fa9c291a6bf19dab265f5f12b343b1443b0eab3ce7587d9cbc27de8b365bae9a57028b5443c4c71aa771d2a469d8456f048eb0155a5d0e485f23617f65ff889c0f6e6909b87db203eb6551da099f9418333a5de7d504d58f2ca4084dc060e6a8e583038b385088acd000edf135416c321c5fd9736acf73c89de3d29857dde983fcd7b0386a52549a8079853c252a90ff997e803a2b942779f96c16cad01084d56d5fbcf332897c431cffdc2b68107cd2372c9ad7b735017371ac5d33e6bbb6f829a89c4f7bd5522ed3721fe05d1f2bbd1a5f51d2950f813772de4216a56f572539112a6229574907960dddb6cb9e7dbab6bfa123bc8db7b1766da59c07f7eb4bf009ae6d8cec413325036050793b0b16de224d63d05c4ef03c6749e4b3097ea1964666cfeb0b8c8b7ed927e321d396689478533dc151c14f4d1e8433020cd8a57106a78313557ce9388cd91ade12d6543fdf2160875d4e7416c7510399b9238c83bac66eecb6eace938379792ce0b5742a0fa82c5cd83f6955c148a3b869843d03377abcd6c7b24c0eac329989d9003f65fae7a280a1c7e73d9527cdc1d241386035e4c4b615f362d28f4f67ad736e4209af8e83c958be40be185cbc745c9fb23a1ef65df19796c799c352b7a2d5a0af6148d0a79261980df19bf356e7c45c24d38b678ab8c714460978731fe74da44ff9a3fd59177be64d6980dec8475df98bd40de50c7e169b5afb00fa16bb9c7e7abfb42e9e3594c7fd5eebadc393f8c26d0e349478ff3e5156e0bf69a542867b27870318f3a087e3d93f99a79f335ed40c0f5c07cd0d2a2062b7c939e8c0f82ebfe414d84737803ce4aff51e33a4d14f5e7c58b4706b371aab93ddeef8506400fe3c0de805938671a05237431a31a7cb47c45c86c4a05272b0fb135f1289f4bf5b8d77f61c62150f5372554e5af9584431df39c66ced3a5e8bdea7ed9ed9aaf458726724ced8f7e9b986a6f88f573715192028523ed4b959e18a6422df977bad42019107c7fa9384cff416c66d2a510cd19e8370c12555a7c744e35503ef33f386b0c782a884b9afa5f55141c286ff4bbe3dbe89afc3e1f149d890f6a6e0dcc22b3acb6278c14c21fbaa5042459ea01e04c620497d9160d49f176d211d19eb7e29d3dda2e5972027163afc720f161dc7cd86ff2242230a33f34ed63887ffd61bb2aced3a60b5b0fc47fc45cb1d8ac8f4ce13799c887e5aefbe8e82cb1a10368faedca1948806566b9744d983327d36be3cc309d800d5149886335d5d25c36ac9f1189c52dace7d019029d89dfad8c816d37eb3801dec6fa27b9e500a5a1dbfa7d5f195f9c3c833784fe4e300bc3e00364ab9d8bb50f21e4d328f45ae89f1a3b37cd338b652b7231ec904d14afdf40c901a845a8603d2e155a9219cb122f5110488859da2748b024f083447dae7d0a6db25f4870ddf7209618579aef8e20dd5e15fb6ee3e6bdc33e197468cfdd9988f0d6eada3d8754ea95c6463663cf4683ee584c977b25379ebb45a26a9cd9adc0d4695568c63671d0111e8eeab0e0578420add5e019010d8732e4f5ffc89e3db76f0a3df30087d7719e1fbf2f3bf940b5dca5fe75c152c2ecb45bd0f510613a78b51767a319f34a7ed76a347ff12f1bbd95faab7e9d1334ff9f5128e1ae2c0364aeeab554561b33261082c9c4e0c93cf0b9ace07377dee5418edc687d3781d85364f788861c825e2864d63ac79d47fb0011f5f34d1b9e1debdd63199a5e82ee2da362d912f1d72efcf58512aa4772aa27f0102306e150d2c6c5a7e0ee15d6e99e19b49d5d0e419b5838464939351bb5d148b4e90e5a651317836b74c37234963e4229040f25e42958997ab502e5da92d2740d49815f52dc899bf6f35f22610adfcb0ae0658809793cfcd9420adb09cb857003a553dfa4d93b255e765f4486c6606d4947520f7593aac1763c74304f0efbb04eee073c9bc31d4656b2ff558a7dcdc1ff397983ac189fc4edc2eddf5895902f517b833522953ecef9d97e13b22ab84775a3a95c06fc3bfa0714bdfcb848159e1672800384cf389f84927ce161aa01356d01453eb5a159f625ce9ada8dc308cbd15b4258f852afac4d7f27491826f804dd1a54f4a2edf3e9b7c16766130c2f966d4aca9b54cbefac5eb4d210099bb18565c241bfc001d32d1bff70d6e63fa9844e15da701c52b4db390f18e0c8f9ca44687074cf53fd0d998aa4d0d03f637cdb95f44b3a1303b0151879c9baffedc97dddec1f34dad63657f73b0515cbdaba59dd814df2980c785320b92873a64c1bc2e758a54d2973a1fa41078a65b63508c40fc1dc452ca5dca4e3fab4dd858febb74bbdfee69e5aad03ff110707990a7a48b7f51ddbd652b6ca8a82a9f5b7ee207ba585bbe34468769e1bb44677be442785d205d60c3ae50a4e3a413a14bd106e66767a794eebd418eb5d6367dbb43f0a37e4686b8c398579f9c2afe25f398a72cb469eba682966dbd5e80eb61b58c7995efdd26196f8415f3e7afeda0421789102b5bf0c16ca174b16fd99c085cb42247624272cba6df19362765ff5532539b53b6a46104a5b6959299d57df1caa7eac3b301023826d28ed3bf3c0ac8d711de53d6ccc451b31664e3a5a2045de32c15a1b12ee8207cec84518bd1ea6737d43b9e53ede4eb6aefaa571cd23f9022fc8274cfd42159e58d912080badb9e684c524edbc091439239b043f24bef0eef8ce66fe5af5e55913d63f4220530917fa9e1d561e1c444e3b1586c0eb9c73ec7beaf0c2db698cddab48a71bff251f00246cefb1153e218646f5ec677bc3c785a7fbbce901bb12aea43ac09aa62998498e89dbc75aab60c5c62734c5354fd800569c26d0b13d88733663ddb3ce76daea412bdd7636c5f25ed2a83ac156c504ce6e22b596bcf11f2f50ac5f824df9021d36454b3674a803246402a3a7220cf973c359350f46cc9f92c3f96f326bcceb396034f11f252e65b520e379004182f839880fdff7c90767b703bfc266bfd5b6bc238a67a63f0e1815f60955199ed223ba5559db8990054c7150a4a1293bd61e80963e93cb3139af1b03311dab0f37cacc26ffaa29ce8f56a50456b38de516c3503d61f306e0778e278daaf5174fa0279d398287352b044689d542dd2d397b4f727e44d44a170949f9f94b6e6da15970929193509e5fd245ca1c7f42e905d89ae99187b514c26b7c8ac61000793032b450ba1d64c1e370e76692a7c2c839dd115e5fc1573618fbf5baf7d0a31cf96611f4af4f76084a21d4ab907c7ca8939f34885d95059e6389cb9a5e69ed0d510bbd9eb7b016f503863265b7a167bb6107e539248a8218787384587ee89c4193ca7688e0050c6b3baa217f57b1f642620364627754b3c89c611c4d5c8336ea9e7b9bacf1e902c749f3e3b1ba0edb2c277f9aa591966540984992f31a5eb201890b151ea9ee9436b690d1a0a67e0f10dd2ba5aa59690f65fed563ca6739126be215d4320da5c1d342c951a9d6e715f544b90819961710493ed54bdc39602a6bc1b5a6f0a1297cd8788d7406667fb82d8bf91764cf68644b1e1f3e21df84a8d9b8ab164b8fa5f58ca388762eee7f584e22c54cde78629e53840c9b3296b2ed3c2cf3f0d466a0f7d1f6fd7a293adc0e0927d35d11ec161906c65c255374ae34f763b52491561e6fd7e0b1d3c3905d931fd56de50510577bd74cdd6b51163d32a227e7257be15593e993f1b7cb1345fb806b6d82c0dfecca17e754d7e8d51d970da0ce8af370559476958e65e3d7d7216f1d1a4d51b3acd99eb54c2a42d7b03ca972824a45f76d3a412650c1d7476a87b61c7f29d4b36e03ce022cf1ae54f0489ae6e287b35bf42254574cfa4a7ac4e9a1ea2e92733d3c30796e3fd0b0e132741c6ca83c54a4c3cdab5b6e003c94a6ee11b22af80514fa9d98e7ab95bcfac737c7d42a5fcd23c6e7dcb261429347f5092984cb25b46d2e0d38efe2184f2b2b8994248de076e6a8a4dca8710c68e467615ed4463aaddff5d89facd240e2fb01e32dfe1cc14b88fff4b6cfb95bdf6ad69787bf22fe8bd28fc16d65ed0edcc80f3143935a73ba32441e9fe1b5ee5d080203db17ea87063b0d63c74a3f6f48c297cd267c52a8865b03ba2df8b4d7cbcdbe188db0bf928cd87bb20781bd4735ac30d8dbcbe7ad3761eb4dc0a6f725fde01ee7bb7349a72dd837c719b03169adaa50b8fc94849148010e2ab88424cd6cf94202837b2687af3f8f6d13e76da8a3a0cb183c190d4de1471b0acd717f83feff7be290f80b55fbec469ad4e4b9d0a39aeeb0766f287bd6f5733dece5df2a72b154168ddb5b5edf7eab01b40c9d883afe5debe63545a12260ca7ddc60b093b2292546e9942c6ded2c4ae05e84befa3b05fb2ad9b9870d12b20d7e197f7fb7bdaa270252467c430da32a600b644b589c07bb7ccaa6b833210bac73e33fcc96d16e5258dd08ed5f6e0e01544d8f6430129c3815b9ffaec0020a23e6672977c0edbbc76d72f392053f7326f94382cb1ab21c9959c37491fb192254b5fd61c1efd16e6d076221a58628b4864f19105d9369c82e8248b5ce789ed6ffbac50b180316e0502f480d8a37e5ffcf1c74b01eff6d5d6e0aedd65432ab1abf7f68079f3384df83bec710577419f54c8199d42a4a9967717da5e7e1b3a7d972ae0afb440c01aea4b9dae4a765ffc3a34dd5e1db203254c88744293ec760d5b258af4505178f673d4744a9b4aa0a0132ad2da087db439bbf370810e326fc7fc45c3efd608c94e2e9da20538427067ad9f18b808f0a3e45c838dbbaa3b5f89b5c2771628a01160e26487528bd7deb8903459b34e1187ab7b17b1df11b25a4d6b930f241e3440cfb0059abd186406f3bfafda4fc036669dce800ec6bca8f500b536288efd342ff0398b51681d788d2a73d0f6a4c8debab1b391d37925e4c7a5e23f823b2f5b33d6464d39f69f89895f2de49ca29f3c08b61e748af2a01958c2d35b77488f905ea69b803b7e21505e0caf871ce6dca5aa7c20968b6f0e6e9d782005482890a0597fb6a61f6deabef8b8845958657873c3d6888e6cb9bd559876721a44f286cebdb25069d5ed73f8e2f9449c5df9c8dc3c6955a047662094f3fd80f272d045680f0f3eec846479aac2a27c80ef9c5d3e06c920b05e4a0be8275c4d5838d5171efa8232c841114ac92177a43b4e84e127e6041050d52a7d9744a7a173c55e1b2a9bea01e556081cfcbadd2f14174d775cbd6c976f3307898e42ccd3e76088d68ed42bc0d42002833c46123eb06c5f7108463a99256fc75a616cfb53d9e91a46a3adbc91ce6c972595f4cd54d6320684139930b21aca8526d768dca58fde840cb440afabbda74410d58ac77bc0a2e1848aace591ef5fcd58004f0174cbf7dfa4b0135d5f4f066115c6b40e4a52aeb42278b0fa35ae497c30c8bbb1aac0f025c6081340779fb0bb172779073d7ec7b853694e5893b0f2ab99b41d8c44c205ee2a01d048d623aacb8660a67130b8e6c2fb44c2b45c3dd4bfbac9b247b3f4f4de8158aade55818c96161d6cb666d9749d2166440eba5a6fdcfb737a06c50bca066f5714ae04c8a39c29fd4ffc0b65b6378dd01718d4ebeae8b36228d6878984ca77da9bc063afa63e8da475fa1c21e5b2e06fd47c30d80d9fb3d77d63e95e6e5f56f757e9c538db9e65c588d30e1be148792de7892ee42101102a9e4b647420b2d7f8fae04dd18200641a6793cc150cedd85487f89792d76a7aee0881dbe46468208aba589a0d6bb3c621706f226ccfd923460d4e2ebcdc75454f215c6d1a6f2c21b268cd375e7dffc7227f53ca45fc8c1c393e8d6dc729cb0ea1de9918a8155fd06e241011070b9ff82517cec0358021d51bc327a8a910a5734eb9c3fdc05f090fbd3fa0f8dcb4987e998c33ea8b95a0278acaf469e949f050068be8e2a5a81ab441b286f753dd8e9c2e3a53d20f4ac8f993ab749ab82fac98a453ea53f92578bcfa3ce6ad830152f6f1a580150acd67e47f8df4bbefbe4e02d11c9725bd1be0f52a1e2877eabe7af1b78cb67de7d5d3c70e2fb0da4157e0795679ae936d3f35d846d82dd82b44b802cf1bff7c14256cd513037c2296cc2f733f57d22f2c8c1a039c06fb33365d88b0b98ed8b98ed9fafb6e693213f3d35f0d607baa19b2e1241ce0d060658b0a5a92f37eea82d6e78df498dc6e07b277ae286636acc7a997220d0b6a3f28ac7eedc78e85d1401e958c404d97404da45b783f661458ad401f3f47696e558aeb3e99abf3917f25f62ba4fe2c1d31870052350d879285ae9914ebcdbaaf836d62f1761fd84b00af78020244b03f05532f32871b69b5f691e033ee77aebbab1994f01d9f546193a7f9048143d91a163af0962f68955a5b1de7bec76521a241ce9fe6ad02dfb5bb94b82089d5595ee4db112023dd8cd8d49f102dbaac23d3d374fece003fd6c4dff00c35a5f72ecab7405a3b4c8a5da951340e6613193d0eb2b1bd6fccb1dccc6f06a7f27df16a2f6c647b28ae9d3f7652c690ed20e93aff0e88189250cc6ce52f06eb4a7677daa4eb33d02b4e793ad1ffccdbf99cc757e4a02ab8e965e9f9ddc1a4bd97f7007f35c84d989fa53184e858c86f782e12c99f90773eba7682f02a4ba046d54251dbfbb1d9dee52df440e6c28ea0a29536d93f75389108836a2262798be23bd74f68e5af06dd1410f5b9e636b621a11185971cb06ba355c629784086d5f315f40a5153c56bf7ae6353c673cfa0c2d4d3d73c47b13ab664e3560d826523aae8be7c8d3dddecc7a464971311bfb2e6e6a44fe9b68f991a9f085619b1300fd4b3a510a80f06ae679524de1368c8823613e861b13f04f0779f03586e5a5be6651bc62d6cfa6cd10b17a858b03175f1fad14b4a46a0fcb0958daf17038c3922025d5199881ffa66bc1ee51e4241df36680089e3dc3ef7a77fb0c9812982f9621d3f99273699a32f899f49f7ddbf0317a466040a29198277b9bb3c53979a23b0884da48f70f81aa78a0026957b999087552cb682151e3d33f5e85d9f509ed97b9f87e2250b0320bc6a02b831b4b9a4580f47acdc8c28b4f74e6989ba5a0d3120e17baa64c0420318ce0d28112b43d3daae6b63786218a3536fb13ee9bd9264ef2137dc36226db523f5ec814b3fccfdf73453e8c749fa3d21a9db091d0dbecbc92adb6eb1d04cd8e7471d0efe446b30d03e7c72e8ae7431c3797a196c53285b4164dda6c0cc09df205b36da49c818614365d14ecef7dffb199ceaabe0f8cb9c290e1227ce579a21747333b3305fe01a2817bcaa4811457ed03506bf1034fcb2db7dac566437419d6a7a2a265be3711c4d3e0bcd1a939c770b120acd80c7dc7e7b394934eb3fc45a1d56d1a1b669289c96ac172b0c160fc8c37d6caba76281d6ea6f7a8de8017777f6627346a5e922446e4b8bec7666ec597f3afd8b3b27dcec038015aabdd56560b8761750416903f04d378736ca2e9599e06a340f9efe421f6ea39899249259713c1ea4e981771dea249370bb00a0ffdc28eac6c6714dd2b6f00b1001854b9998648378501b3ad6ca2e3911eb8e25711a82528f816320f9afb4513db2a7661c7195ebc20f5b877d84be1c85ec90ceb641b432a40349adad996b9d3959131e5e5f5f1b25f1b8e7604d12899b6283b71c48a3dedf78891a9a818c4cdf0f529adfc513964a8a06561082ca78effff39f5c19b5a80b50b41f6bff71335aed224624e90827940f97a7a4aa44fc5c7cc6154d4d58cd4e814008590694c242fbc771103cc12d7c3e5d6c0e11e9c9ceabf5cc02b02ac72e7ac180580dbafa6a4a179d2134773359d71f1a9ce10c6f31a2d7e6893926ec81ce3ab7ed444ef259e5db2078fa949ea3e320f9c2e53ca4a90ea349077e2425b24df4dbe6d49d127ec2a2b5d48ed51aa6764d065fe824add7213a1f8f6a0e93380099b4ff44fe278e4303e8ae1bf6ed660bfc2bdb591c7d36c360898b6d0df1fee5a447fa67c247d7d34b4a4e988afff881a71de87c027a97677b122dfcb5535a79c61f3301561448ad142d1bedfd2aaf09ac8d5cc81e8ee26a613108e06c1e092cbb8c5426e6448091fdce39d4eec18ca58ff43ff64db37b46152080ba14f72372132774e5ccb43d83fadc1255548325ea303578b2a7de98c0bd32ec4caac001311832291461ed23c9c210e5daacb87a1183de3affc73aa051d7813634df60e3d7b8ba334cf1cf678b93b9eb7d5cadd1da5c65a27417175ad58f4bc876fd68e70100470d77ae494bd199917d31b24ef2014c4f1d966dc147ce40b42bc77ddd3259d4e9bba74729d6d07703991c191cd00c39e9c94f7891a2a2e9995534823f9aac22413ca09ca9c88a2b16637ee740a80baeaab2f35d92b8722d6890fe16e1255e022aa57a81a2617c5c03676bddbf8184beef49f74f45870f73a554614a3010926553af2c4e92c59ecf578f1daf8811174fea420b21864b899647259c44f6b3bd2ce408419b0c427e44c4886dd63b8ac46c084ecfac64aa61e695f8e6688ea1bc8dab5f56b74be10a98d3c65ae9d3117fcf7d53dc14e25a2e00de6a98c99e6d65539e81b18a2ebfc6b994a31bd94520db46f5487a6f74f49e70e083ba3ab7c1a0647188b15028c9ee69d87c10cee39479f266e3160e592ffe84a82899c5dee215dfbbd8bf93f565cbb02c6813c702988b4d40add9335beb61760116840f7ed90595c99fe6cb88d5eecb66c581d856490f67b07f5e0c5c92d2810016b0f2085d9f1afd3ac541711a4daada44f398dc9f428484e88972b8214cd3353e2fa70c73256329e5589f4f132593bc0970b634a40e657cc2b7811b35e8cee92709bda72ef61128d0b953f567c422b5b31ab6bd3d10553f8b917ecbced25e1315b132c863eb411a817e276be1c58f70638610b7f1c7c167c3f79f7ba1c833f97908da46db4635a22049518b0cef497c414fc52df8c5d38dd4cb2ab3a87d3f54918460e5a8469e54cf843a1af1855c86770493514ead079f1eb0ed86481f6c15f9817545374bd9cf2996aa564636a94a91362a4e4f1a0f73cce62a8bee331b12293b6ad6f800571f2e015f42f619e572bbbd18c2218532224abeb9f2ba77cd34d66fc0dd0bf8859d2ce5c09ab5f09b35b380309a6f035ab855f44989dffd8feeeaeb7c0af1a913b57e41d857dd66489cc185c224fa28d3399e2bc16558d66a0017b340804c7e1723c549aa87f135dd684fc85d08a3ea44d1eb7c51b60620f20dcb7d1093f13db0ad269f77b9564c87670d6bc58596ddec5dc23ec92d1c3afe3cd4a801a103623a8269fc16ea25236eb5ea6ee736cc6da38a1588578c348dfbe16ad59ae4b0b040bf36f2c59b29df043c09983b27b993ff76b34e224b8b8aa26c7ec369914730c89d4c5738c035705ea2261d659be91992a2e38e0921220f89ea40b1605fbfd341fe2c3a10e10d4c247e871117bb410e2d00292a59a7cdf9cb9a5da818a010395356bd47a30baff783d11e81b3b2ac952d0d71ec6c85a2ed7c7d3de647f36612959c018376115b2b4d5037933f74733206d07662246201cc1736f268a874ad1f9c3d4410f82bde2ba7c5a94e8780d227a2901b7f965c62d1042eaf11d64ba610bd9e63426e00a63bcda14daa81e8273395adcea7661ccf3f059d73e17fe20e83d9d5cebf8a435c794c37e0c18aab3e612c2b1dad47faef41f2790dab934ab544870c8d5b8ea9627d2414a5d339ae1d1f097311ea62efeb2fed5e75298666ace8ece621234d058510f53bcc1b15c5022dc6eaca9d0b97c325c7dfb5abb2fb7cdc1de6458587c6f002282eb07ecf00b51f4c19c10bffc5740afbc9102783ff22ecd0b91af4a9079dba2aefc7739268f74137afbc3dafb699bb256982e7d3de876e8b780f303a68df1d13710668c16e09e1a84f755379056b60b2bfcf63b7c80477f2b26d2e7d9ce7cdb806ebcf59f61cec5ed241163a90304b64daac8914039b560e9da5be962ac6b6a7a210a8db63f193b9f7b7fbc9b48a15606e6ff01cd0468fa06295778e309b4bf478b0ff66fa2c3c1befd555b9b7fdad540dd9e0cf4884b91aede18ee3d9de26063dfa9ec256299727a8c4fec7bc36ee3e04e6c44f0a95f5b8eff658f0d91a43f135f18c7ea2f8bda6122d581a03d068a4f157e7443f80cb3f89cd8c427cf267e1ba15cb2dcf8eb671cd0a6e22bdf6202cd3110cd00e2320e978d39d751892952ebba3d57febeccc50476045133c3f9119d8e41684213cf67dbc6a436834b17f68485fd48e138c1b8116f02eb3667da2208cc4aba860e2b7f77686797c8b8621a6210c20a48e16251a6eac55ad2a6019d155c4a74304f33093c453d946d07f31561a4d14cef9603708afac54f44b3a6cb7f2a140dd4377569f4e9659c33e47dfc7b456693808fbfe38e6d430e340660702567c73fa3f75756b9fa58b0e038c08722022043d8f866dac13cffff733b6af844c77a73d0ea87f4b61a6ec6e96cfe646904c810875df04d8993e043a8ab57928ca47b8415879542d627f484c955165b7febc94f0a0efe1e9faf02669b03f529f92f315f42eda9b42c9fe6ed284dfd1fd5abc3023d79415bf18fe3f7cf110ecc56026e129e21fc9dcb9f3d3813beaf2c291bd7407fbca537a30142ead65ba21478fae246da810a0808eee8262c5b27dadc514c4e2a4e1ce7b8523a38ca11ae9c6403406371c8972f3e52d1045ddd23d5315787107bd3c00d1f842a75d0e9eced0a7b7265c02dbcaa4655e17426ef2ed95d15c148ac4f3c9c781d12e074481edf97d3a333f8b574ee813a582cd1d04d40341cc5c29f28dba596cea14bf92b0534f164bcefd453820ca27a17f5f3860325c8d13273e8113f80a8d61ec6c034b47112fbffd909a12522d9f0efce290d2e3baaea417b957e541e09bc03750a56ad0fbd5080952811688e77def079d63a425abed27b3c48403577e9a06fd47332260a053e5a484020f48da6b2350aa881f86f51e439a72df2adb412530b4dd741945af3700b457e4fcbb4986cce66ae584334686bd648b76f4265897d79cea18377f5f5eb9e70a922b147f715a3e4c8581a57e49936fe793d4f8bd82232b09ac2be58e5f3ec6620d9d06d3ceb6c61851e143bcf18f1d0918b7a4a71c28525e1b8ae8bacd724fd15f606cd7713743e23697055777a66dc2f9a01b7b280d4c66c9220b2fccd4f9f65f151ec991c643673e1196a111f56d8830d79a9a1dbddc644fafc8f1693279f7f73c2c1337235417fd0246989db8d7865187117c410564d66145aa2150902d03e0457f9cc8bd52f5e37ebdb9389fc7a58ed57f5515e9459bfcc7827c7104502be2c27292e6363fe6bcfd8484c2b2766390d5979af6105030d55861d1b01dce2f024db4a0ac465c6ab462cc978dff8125cbd85c5076343f65a70c9c099423449e6f0ca16cad7ab1ffa960ec7046d42f162c8deea31ef0d1b8f6b0d015fdd5099bf6bf6d4724848e3062427445e4c56fe2a0e185be6b6984a67cf3433039243be50d3a1f67d6094bd5941c561ace8ddbe3ecdbab65515695b15bc3017d8332ccfb708c2ab7ec22d5872a59eb21b68e6e4ca21297bdfc8ead261806350d662438928cd1c8c18a6be63aa81c043376adb655063a33d461443e3fff829b1180b0a9f428c3aebe211f0571589d3012fa84a900c801b3753e9b7cb45c2e92654102ccdd897a69e2d2c559acbb64964638368933cffa1d1c4b6cbe1f90c3b8aa1286d5e448f34e2e2d0c7b0de5e6ac86401b8d8ce78a77c541e03a9fb5d55f8bf99e1d4bfa371c66a976c18f4eddd6d3f549f03d86cb2311d47b9957d8e64444c905faba6d3ed4b7b4492385e96282fba5e8ccb99f75a3e8f226fe9d818b9f622f00a5313c4a6bd05d1404a10ef3c2739d29335727a35dc3bc1393b37dbca02eea2282aa094cd66b4f6cf95743c79e88102eba6d8240d91ac984f49cf955304d63360162a4c6c162625e41215de8dfbdd67bf4ead52cfd1235beb8124f30ed70e5f9627d96abd873ff8a3498b84bcd7cb8ecaa504499e725cf8a298491b2dfe28c4ea7532d8866ceb67acf873604b4ce009b2b337f804ca6786421d1cc9c2585f3e5823bbc6ead405717e69597a1b5ee5946d93788e6df0b62e9f8de398c03fbab18365fdb62897ba158a9b3a93ea639c2b7e073777e6e2f935435086ba177c0536b30359c2add5c28c4dd04a1b42749d1e26547520121a41084ce864ecca2aaa702584c8d0fa5b0799e90525e64430e96e9cc1a2306477d1a88e4efd2a283fe3a43bfc238a77e9d20feef81331fb7fd50a5105700cbc2f99cc869fa7e113f833fb226ad349a2fdaddb3d59ef641b8ee4364bf749c6312691c5f8107eb47b87965b14abfc012684d0e0a0cbecc1260a8b934b4393802818d222209da049a035e8ab9984d2ea02cc636e72f899cdb607cac0f029507dc812e20a1faaedd9bbea1d1c86900235dc811675c136d3b50d1d3df0bc31abf72808d0e66bd475c57c2d6af12ee4f2036074d349c34c1e7e6e35664374bc2cf664abb5b4bfc4d67be0c003c16a1669d297e647bdf30e69da53fc2c06a5e669ea89aa2fcdb2ac6f0d9c08817de296728cb3a46e736afbb2a4eda7454498f7e7369c2585d4aa2f52e943882882611e1c1746532315d1eeccb4f5d73d93df37a01393f09c0cf7c4c4b28743f19605948a1e77b11b960ad867b252d2ab087fc32e5706e034be992086765b6987652c6977f985d1e57b586cf51104ee3120e8b7cf050df3cf596cd2281e439b49e99b6148c3bcf3d7f2758943c867ee778c1a942de40f0f470d83cf0c3a941791f39ff71a9bc058ef3e876a29eb8010977d2a5d1e1b9533bbdfc287a36daa5b964b24b4a0771b274828ad77809c5fbe5284784de5c64781391ae99cca20020ef59c9021398928d5c713baef7580b508f38f76541a419d9587128beb660f54d3dc156c642b0be4d0c5042238341ac0f43ec36b714ad6d3d9f838cb2eac8919c34e0408c823b2886f987e07f97206a25786990cdf7ef9df4471f55a081b46c8a5485b70ad4c043c8e9103b8f00d63270d841f5ff23785d636ac8c1cd6579c1bcb4472a16510f01f8eff6c05599ca7cb57a8e75485fb06166228b6e06cc9f47be4fa26fbf7ec6b0e148ee3404ec1721a2335677e2ef77e9202c647518552c1ca1716b64bf610734f37adb46b0bbcc35141250a2c0c24641dbc3923c1e58b6dcd4acf82650a0d4ad9663f137684024597f89f919662fbf55ded3da77de9595054192bf7b33297a39827c5e30d28fb227a4395cd786a7494576a5f4b2e4e87fdab81a6bd271b26952e302d6a7e93e7d544dc18588e50bbe383a083fa71a8503b7e9d86555ccb14de3ff7de5b6224a8455ded66bcfb13d92c30fee7a72da4b4c5f80827d2e627056c8820bd4b4dc14188048c1965817a0302db85620be0b88d497bb78c8c3faa90b03aa3e0039f830baf947165421ac210bd08851cac1edb7510cfc83967bfaccb43efa24b81882097e56235511bb81332ffacb62b1929e0213dcdf926907254773253b3e52c2dd6b27c962431e655cb08337605692f20c6bf64af8f835bc25147ccaba3f4fb0b58cf4ccf198ebb7f0aabf4d8a5d55974498b7d1eeabd9cf64ea169a163b70c0009199e797b8c198eca9d6383f6b8164b4907a47870294036e379a6141560354e52f9771b9964a4f543e2620c3d17314a61c1d34e9839cf19808e4690351af1a55b485b840628415fe3fbfc9cdf04068f1dba396ecf0a1daad547772d5c19709cfd7c5f365d7841cfc801e8ae3f0730d5e7adbbc36cc2ed53e958b998c31e1d3012c179dd059b30f3f6ddd0518ca98dc1db5235d67fb8650fbd6f7ee9e3e1f7a818602236ea5ead9ffc73121e7d6d0be19cbbb02e80a9d83536923f01cbdfb05d10f75b7dc150789f8eeec6bd54ba5ba559bbcf9d3d5ab45754b86d0e8e09a08186e09c7c87ec4c7ffbb9ddd8652fcc1fe1f861e2795eefb853e90ef7b83e54f0f49653d235e76007baa4817a6e74cece0a445f56ec7f743db2696c0320fd2626ad2111610ce4930c66689639dbddefb43fd27a87b82150fb4d628f2afa4272ff3b46129e21f77dd8dd637dc8a342d970d7d0651e0dbfa9d69671b2e8e857fe2e346c056ad6b9a6599a83258b37ea60bdbc70a0518972b3cd8b89c9e221ce0f40bc3d3d26cddf7c3134ff5cc79fdbf8c197972de09dbfdcae4f0132f776c0db464f1fc6dc7b8cee8d779555ecd2faecf19d824a746dd3065a1c5a4fea05a3ec3c41c9c9855bda6b436e41cd369159ecff3d67ae9d71feebc64a400c368a73ea6d0a780382073ce4cf6fcf49f4fbd176ba286ec2e7af09e2b23784d5d13ee8697b4b68a7f0ed78307d7a5a9bd9d02e4f1ef072e1b58a656120a1de257f9533af3f6091e9f82faba992dda63ca8ab5df2f04f528c0a4932baf81c9b601026337aedd24812dbba44c8f9e479575514f9476a198427efbfa82e9e37067184df6608b1cd4c74add47c66f2573488724dbd8fb568be1c6d1196cb5d9c0c6618111112b41de7049b061b77ede477f631185fcbac1fe166cc7060a024c88c02bb9889e682ddcba31ab041af258718cf36ec4d4974af032d858f7aecb6bae831ad1c4891441944843d4f5f605f19f33f3e230bbe9c60f3b0b6d30d5db862b8b2028a2d03d5bf6b07b207fe9f6a90459f7db4c71b62a63269adf9fe527796636487cc46f7beff2aad37f5701beaee6bda2d7f1301f80381af9a4bb57752ab02c75ef69ce75555f41d94e46db01e1e4aabfe43db5327f9cc92c1d1d05e832d6783111fc8bc52e13059a77c09415c6ebcbde0a5bc91194800ccf9f1f932f84f840f80eae83e1e5320fbd73dbe07dae3fb2b03a07156f9f10cfbdcf60b689b20864fd18c3fbc8a995d5ef3cb58e8d7e69b3cb72e865e79a28e152f370d548363ed1a31a9a74d8aeae7a6e93901e95d6191b075c48a4cdfcf342b1ac71504204711ef969296eef6eb578ec649fa966868c67a72daf38e1f5fd21158a157c5d70e348ae35510d61a26ca5b35f0dbf8ab2fc8792cbb4bb85f696af49b19584a8a76dfa2bdeae5e6ab9e12fc32ca6b9cac08694a94c07a92191d3d80673693d4ca72b0822eef7bb9e329c9b906f56c9cfec0ed758ab425060f4d2a58951febb39bc3f3be4ed55b4d5ee911a2ddbbf88edf565eee5c9ad3031a66c29f2393e9ec374c2ebcf252dba5d9fabb215c7da7d7e533e007b469a1bb68a71cc78c0ddafcd91d95566723987b85650f352e1a9ec77acd83c3cfa1bade033380bb5d6666b264577783a7dba0b0e64a256444757619f69183b72a647da31c0144ecf0979166c76007dd57fcf5deeab0bd20ea7848bd860c8fafa66718fbdc80fdb652bd9b57ae67825276ede76868691556c1f1c61caae822bab8d3f962896ee39e2682741a0a2777b88b2ea3697167651681310e3f7c3c44db1211b4577727171cce1ce1689c13247dac6a7c7edd4b34bbf224a89b4f0df261af8a7a8d06cd81e563cad853d50048ef823d2517ed1d6f139ea7e1dddc965e434a387ca0b3342aa50c628f369967db58a1f10625a7dc122a1fc23cc528de3acc020d445ee743161d1b0ed5e9cfe240c0dd880cfa8f0afe9528432db9d87bd87b57ddb9c635af5acfc332226b0452bfeaeb1b0f074dced3621ef6f110c1026e05a2e5476faddd68f2850cc599338d1368db442c8efe454b911a002483bba81d96f94476969b23252101210bf7bdc48c6fdce50e1edcf350621d0bfa6606f9e2ef7ecb3f73dd9acc8aedea1af4e88b0d38b9b57f2495bd200538c84c4b67abcf8da400caffb252bcfee36649c32a1b7b265f659ea22fa00cb7a44ac808b8ec0a4582b58701bc12526e4bd41b95dc858b399d2a7c2dd7721c444ed5a2883d4d46aa7d1989db52743dc0c33ca699b5474ad1cc853e23b79e5b1166f55c87b1a6798856dd831255221782c253071efd37bcf282813b6e084b101ba563a64fa0caac9e4f5068577129063d1bb320da2ed88c72b85d5f270c4c179dddb4af2d8db8df0c515862a5afd806540083b233ecd86a7f5794438413d2967f9bddf5e50c5ad4f7aa48dd76e27211e144e5d2108a376e4ebd49d7ad41b459568e1edddb8cee989374ff648ea798028bc8de76bb3b231ed14c8316caae2077833fea6cbe3c298399dc278f5c6ce6078deffd791bca9e4c6b71752cd90705889fd1918c20f48f9d4cd47688af5c75529197967e5de15843858c707b695feee8583cec67549ca56d2a8157078b1b4557f8d9e9e370f425f455742c52a680663eff15cbf8eaee87f25ade6cd8cbac7cfd603174937c8a84be2c81b0cf9377c15073af13cd1f4ff1f07a49c7a144d2f45d20c460bdb5ff6ae4ee3d214fa2f7b4c9c37d629b9a769c3ea9fdbde38908d0cbba3d902db7a66782bc8a3e342b1214f3769dd6e435b963f0128882edf4e3c013f220cacd3b4e95ee38ca26e1695c4aeb1dd6bd59c03c7cdcb6a852b90de109311602e729c9003db595b63a3e763de96af66d99a7ac7134edac3b014df094f518168886bf301f05bffcdb945492d6227dde6a8c1f4d33cf1d6a52cb4853ad24c9876fe9439442826633eb7c523bcf8775dd36241dd5f60b26d2b15318b361c3050aaf1908c9a730b2af66163a14ba5c0bb730796bebad62cbe95a656e7d17833a486d48a68779b814b40e9a6a7c898837187387dc70aff8d57a856ee9e86a8e91af632e7c42ad3a214f4562b418958fad0d95cac3493e3fea7f454c3542472c76f6252835ba75b6b5e0ece47636c52246045ec8a61d3a68e324046a68b5c732d8f6d8c883a2ed972fbf01d02c20d92b2a68df69d245a85ee4c6a86e50cd85d3178bcaf84998567ed52e80a60afad32f557500fb2728fb1aea75df331e5d63cf982b3754f12c77327d7b133af82de77e5ddf5fa5148d2ea2d471cc73a58b47cd593559e0fe1e8f56d28b83b8fc20b50d70ebec92b35b82b727308e5e81d9704ab2736305262495017fc65233d6bc7495a0ffbc6777c75db1e5ab8cc7fd7467dd2c456ded88a8193823c6277c16cbf35c989f31e33bcf18e3a8ea6ee66b78d08795cd962fe4457eab524d0525476ea579dd0d96e2a3ca8efbdcb338c24998abf5b5b11866ebf1b16737d9e8bee5a01131f84a0855222c81d30038584d515d86b86fff6ed79c2b2003b264c6a6899bb7387794983979db2483b0b1fbdcf42b9baec3d4db407771c59b269f81be3523d418a7708dd7ccd4d2fde578f4bf5a34847920b5092c203168c36e3590e43fc9c46ae660bc492c2e53a107a618d09c0142c448f7f96fa1ac2a10be6154dd27cb30f11675e7326bcf1ce7ffd9d218e29531b5ff2de359ae703840a4ac7f8fc2db8fa7a492c1624f3776bb95d5a34a763ea387a2665dc4579c389ef6689f654831bae243ff997305acb6d422cab3563f3f5c04497a1584852789b890917828230ccef3ce81b9f351db840f90110148bf132f76787ba3d282ecbd29db2260ca8f5c35440a730eaa049116d7c28ce12438c4b7c7cfd992523b68c8764bd426d1d179ca1d12d1c22d8aaefd0af42e6754bb7ca690d630ea2df91e617612ec0b75af693d524cdd6b5d4535fdf65963474faae9c429e327670c1e59dd953ea7c44b7f1d940f2ac519731a8181117fd6aadb961f0d32a6b53fdce18c1be4babaa077b7651aea97b6f918f946a8a532517931cf02709494e50852b6522c6560c2f78c31c16b1e940bd05dea8fc68f98add5ea97c35163567f646a14666555ca0589da93caadf024c547cce7f3502a0db5a259ae413be8d81434642981c737be9694b9b23f710236bc40793a50bf928f655bf830fb239cb093e74950298b702df48ffdb1883c23c5cd160444c122df064582ce85e47e9eb3a6f30025666b51d76a1b24faeff0ba4bfc1aa5f0f36ed0fe847775b1f60340f361664fa447c66812e6d72de87e1ee534648813bd26afdbab60823bb991804f811ef54c6091e40676a3c2037809ac674df46483004f3196d265336bea170c075340e4d96ecda379e3a05e03fcfc89febc4bd57b14fc5f886cf148d757dc5b381f069e24f27029a12e6cdb2ce96264a8544297c77f6720f358a36696468ba04709cace8a9cba5b8ae322e088266c41d5c6b0dd1d822c7f217ed9da37bbce97277996ea3fcbae7596a4076f64a57c833b4a11214cd9feaf7720c41ddb96505a7bf47ec1e7e065078d1f8a17268e83619d03281dafbf691f7c91a14a7d953f6249b6a808d126fdf200b1c6edc8cbfaa7b431635b9d69e93eebb1722fe305d5723d4c19c5c11d14690566ab746d7c97811a80a66a43b5552ec0cc914eff5292b0cf048d336c9ce97b52ba9ee9a235cb87ca74ec4d643162bdc84bde4ebbb03adf31d016400edf7176221b76d36b5860888a7f4f51d4a4cd19d1b75ac992569e3f2af2cdead74c0a3bf33e15053e130649a05e7a8e86bca4ddc49e9f305608d800f3e68b1e31f813b5d6c7fdf6cd147877c431e183d4e112b30368b35041a564955ae1e766e8f75b75785064cec4808f9a2c6bb1c8b2c4bdaf41745b8f1d3aa19bd99be1f8a712080b71c36bb79582a8970b126fd106eeb80e99b723022e6d3feb7766b18236348a6443ca8c9dcd723e3760428bfe3571c0f9576675b00f55b71286734f883ad77351d9ed55ed7c839eb790f479e55eedd6c8b9480d7f52a6cc895f8011cebac3ffce5d8cf9ec38f2c1a0260bcbb4424ca2dd22b47416bdf10f351fc8817301f176c93153a9d93462b40135f29dc8d1c1e294b3bef2255ae8e444d8fcbef1f4c80a77c16b34f0ba4c4cddf158444864d66069b911d09a27c756bbbbc0cdd0b1e60d565be559aef90a909e34c6d7f2a475020a3825ec19820cdd99bbc4847bd1c7841bca27ebac4466c02009fad799052cd2a46e87609a49dbc8829ca51e7726cd799158726943dcea717f074c73f9e61dc4b435db6d971284c228f61ba162243e4ba3f158e32c276013c9b1943e8be86b3c5a8fc556468259e27d9fa720fb14bba38a189cdd3e5eb214ccc1c8dbacdd8422d11832071c48b57c387d9a52844b3eb5b2205f65afa77fe6c93abfdcbd282e560e2c01553481c1322a8b0cc15aca479dc76d368031a107a367d298c10061027b3bdf563df4f4a3d5c3c5a3aa60b2567b661e9810f694f33cded8978c236512a498104ec460f2a07911deb7cd69ea28db9bc95709176ecd6eb02a82bd1b148a80c4921074bf0307b4e886fe54c3ee4ca126af557c86da77fc3fee11cec6e315d7d58aad6b80dcff57a4508ac132b48eb7610fe586ce36759e4eb52b5b7d4bbe61c99d6f795417d744d5164c2718432c0e79698251332d3fc33e0768c4f825c499138963e39cac1692654a59de9b95f1b8e599dae90f5c53854ed444154f0a3c97d5c7c4edd2c674340fb74556719e67d7324a78d70140ffd0902d3abc4e38b9209622e8faa524e4e29ca0f2c471d230c7e073b184ebde5bb00edcb8ea9f8dcc5bd2acab91d2cc80c59fd02f69548319756225bb9d5cd8099770bf7752ae6e6ac60a904b6d4c3521ead65955694a72219d932332dfaf86a818baf94f72887d0a9013c9747217418133376cc5fd06a2b668116fa5f482daf106b3931ae98b5884d211211d994224b7238925e7a50968875eab3ecf06b96dad48db7a666df59d0e0080f17f74e5bf8318dc6ba76da157da47fe5fb830800da00c77616c3c0751301dc169e3bcc43d69872a57074f70e854cd35cd00aef63224192f3d00c9f5d2de3ff39a8b28919ad1a2a059bafdcebe1c02074cac16e3f3a87458013684362a163959d5bea85f545cfd22439c053ddd61a98832198d1d1e2f66b41ffee3728167722eb9a9c3a877d37eceadffc511f0b00e7b16e93d8fd1d61deaba8a785f0b38eb16f230ad817bafea3a1fc8779e867ba4fb7ae1ae67f05c37e720d7cdfabb3a9bf6c0595f2aecae87c3944dd34b53d5a8bf1a8f26a378ef3691c08aadc79dcbb656dccd72d3d4400e09984546f142a53e467afdbf4016fc017474542fbe5875e05eb502b17ba68dbd097ddb9ce977311cb34ed153f4835eff5359eee9072f06e304bf40c82822f8f9bace5b7116e92b91b8c21502c969065fd48c5aee7013ca97cd5132773a271df8e7cf681423b304805cd345567d29f0e63d6110a13a59b939d120c4196b242df544fb89bab0fb31b49c6e130d466f2e5709a9cbdf918bf40e04b070abbcf8007fb27227d7b024c9e4964850a5429d84e2768cbd64f3ee65871f46041bdf8691318b524622410ed13dc7b96a1c607c8d25416fbb9d6a108e58fc2773aca3d5259f027816d0a1ebd05b6638df07f666325168b51a984722aa3165d5c73abcbe06be43a4bb70deb0059da3d9eda66d5550e06b2a3714af335dc186bf07a04e88ee80ed345be4457d5b497478e0a41968a9b3440b16cd7b06f2ca45eb1be9c685c930c9df5be1694b034470c177bdab57d64069054bcdabcb415b0f03ce0a2399f5ef8757cdc22bb6e1e13b7217cdcf6f192da34d710035c8a209ef085dbc76be4f7c5ffa454606396c6bf0615ffd4998b5851cfff8c34ce7bda952ed67a0c4a93da8a779fbeea85f94929e61d6d531270b2cf9cb956d6488c976979a404e6fda248bdfb39ef97d0268223d255b75ea44376212ee48c3c49378872dfd9f4c5b493062b638c72625aac97796364761ed80dd4d69e19434030d9c8b3a25696b40d470121678050aa55d97ba62108ce621ee411254ca38abd80ab2c6cec04e605b8bfba04c4eaa3547f9357ff66434d10bb7e9a2c354813fa6d93caa7751fbf6950803b9c22988baca4c5a733a713ab897309f5520d90930c59276497937b0b1362168e7e9357e57ea8ab9c776d45d496d6589ae4afd648d4333da5788c44cff7463bf89bc87bb56c043e1eab84ed884132cf200c2b3ef85f0f0369825009705786297cc6a96e298c6ee1d2fe3010f9239ede786e6e435b696150000cfe5e49c2076a80836f1498d105abff3c30474703a1889bcd2c0ab763113267583c1d9dafd634180fdc5e6f7fbf6b30ed8ad713ec27eee696db4d0ae1882762229543e9aae40cf177950d63f7a6d9b434811e6b9fec3b50fe48b47e40aa40ea545076a8cb3953d98e6899deac28bf44ba8ea24dd15577c2f93b42a52ebf4a8fd0635d016a7334e46f57f0ed9510677c0b8b72c60057c629281bd3846f7f22aeb4314b5905ab530050a265ca37d399f01395f1e411bf9835c6095760a5a4d2f60e2559902aaf91aba777f4e456544398904eace6b7ad2ca82f5242f04d38c37670a9faf5e9171365a20af907f6429f50bce2d94931c410924ed29e6ceb2c40d4362842d477ab9c8deb74109a89847b7e8281c7526ac07e14dd8561a5a8c5cdf527fdfd2672ec630c09cecea530be48f92edf9b6429476b6b9db30a9f3eb187937ca69fd5fef2cfb74fd29a4e31b89800f494d1f3630633f7aa99c13dfc6435327f2dac9f8cf2239f40d81ff9b89c5c7913d07024021f8e227c34518df6fdf568f4db234deec84242e35d63d1963949d05b7d1714b0602f6d3d4a936f3814d425f9601f8497c456b3cb163b200410190e1653f30104cc409d71063f6ee13b3b4b365dacf050cb9fbd5bc28b70c9fc5b01d9ff3a7630dfb44a322b5b1339b2df5d6e367b379b990c1501f37be68905b29fcf1ebdc2c5479045ea11f92b22969b859f488fa0dacb30b560aad42749bac5c5f3997254551aac7fc97dee6d9695b9a742ebe5fda0dc2c9d1ab6bad07c471924868f0cbd114fd471bab233bd90345dd40d134181e94404cc3a4cdba4784c6a4e400f3ff9c6c62898efc4c501f7974a1a849ef7e1bca0fe2b11c7c4bf0ec3b48ba5f6be86cc20abe1a1c9834b3bd8af5834696052a34afe25efd52214cb1b576079c1045fe49876751a0a24d2c82fc7482081b9bff5d9d3b4149ba956a3d378b8494a7e017e43e351aa2d4f39b4bee3da9832086d2edd09837aec3131731f6d3133fb1babcc489a665d7c23207a5c555d1714d77334e0634d9477ce68e942e1f2df775b32b2adbdcd4fe8f2afac15ccb04e0702adc3b071e8f92f4fc235f58cd605cb3ec44360061749cdba89e25a799fa668fef81bed2aa86452570023462110aaf0cc99b3d72aa675a228781d4d97a57f0bdee23aabbf64b3ce8ffd18d5d3beedf4a21095392a25de79e59b25a6029948d6bc71d416a2b568fdcc6b8ca7e25bd13bc9af71560caf82c5d6ec4d39570366f63d82fde8a268bcd93e419a43946acb99b8edfdbe2a4c6a06e153ab2413317d35681a92ea7669a39f6f68d7eac36794795e6be7a86528d5469ac7c05f32d0f1fe9c9c3e1470f89104787165fa3ce34a18c332c9c6f64853ea295e4eb58090a78bd89eada402de42c4c59f2cd1d3193511038f979c230cfe16f829747159d0e17d5c8cf0ee8cc51f092cee0266c0fa7ede0ba7f7e95c11b33c70d86b3ff78fcf29ce4b94611283432dc5326be29160c1ce1435549ee2c96426750b2a9faee87983e4b4b6b0aa5dfae4ea3419fe1f4a34462a7777078be238daaebdf8bf33ae03d262daddce710d0c5667790f5c301fe23d6ad2b0f8028b586b74f6bc5ac6c59f11d3684ea745be87b3b1998e691ec24bb0590b94170ed975ff55c384b71f5d30323a480b45fa2297696eb8446824a028d1f98fa40bffca42c82c59e7e0159e5a1807ae2bea106669548b1f59a8e5d5a257c90967e177334e937a9268d0e99cf63751233ef1fef14befbcaa635b513f86bf7192be01c2985c596f0c79cc79832c0e4300c95d2b778897e8fcc07a6d0430ba589ea4c1a469eccdffe5957c2e86442d5ab9a6331fb4a85f963dfb4fa5e73965055521eca376bf652ab89e4fd14f7282cfcaedc75d0a40e4ef2462a6df7eb0f0b988ba65b88a8eb5e970e3ae3176d810ee2f61bca1829f2ef6bf4e3d22760e8fbeba7601f243016894145a389e4d2b761e136acfb9cbf60f7308805dd395b6559d3b7f252d5f290d7543c4b40dca033bd0e916ff898dbf4f7473ffc93b136ef05c771f4e50aa6cf8c8b4a960d80e168b042488e91d64ab65cbb12418e9060343f224563161b1c72da46a8a22f6d935690573b68e878a77de8d67b8a995ad5cff583f834e8a1b25ccdbc72e3986a42798d61e92fa66c1cab0faf3cb6e0cff2a662e2db55c4a012d807aa138358ac87bbbd0c1359201a582f9f74b6539ee89034605ceeab59fe5207d6fb2d6ff0cc09fd773c5485aca52f5c50aa3d45c48d104e541f53dd5cc3e58fca7bf866ac9b42f8004b4468b80d16ea8795c60261e37a064f167106a3060b03b441d454dd08829e6e1c6a009ff9203da8c0b94b4c94a05b1233d461e00f8031dcf1fef6948c8792d73a8bcd108336a8119a7c039e342ed86fd149badd6f5b76be12ff84bc7ff18f5b9fc81834e54794f137be407d3f60a940ef289834bcd92acb67f9d4d306a0920287bac28fff6e629da8865513378c973c4900cc23e9e8f7698d0fdad81a5ab365237634e603e984ee763d6dc87a4ec54efc3646afe661d4af2754b2af20bfddcdf7ba54f09b443d088f6b5002cede8d6ea8fa3621236998d6199308605932aae011a0fe4222fbe7a7fcaf06c954be1e811fb5bdb10c4c3ca9f56da49adea6f52c0be9c5b0abc6581ce853bb72c2458b48bc139fd417c3529c664551ca70363823907c32d156b38fdeed5779d3af51ef936d65ca3601a7173076371f15833b766098bfe48832849dd545b3a19629ebd13dd911edb1f60ae17484770732772a0c1679d67397ab3ed2d62510ece6bb2a278f99758b3a3acd8d5c8768fa952333e9104603f8de3ef03ae42585ab3f7ec9d92c8d7b704d5177c904db43242e71ccddf37efdb5e266871cd78c3ce63c6796870606dbdc75913c678715940b47610078027fd9d27d7a5cfb3264550ad405d7b5593e8ddd8f489789125ea103e1861a8ca264a9d2aa4896dba5a29fb4f8c5df70d33006cfea55be180b496f808d6e09e538d8643c61e2f38e67ed4ad48cc8a8fc97ff663e2f6b840fe324b30cef31e72d0753a8aac2556c2bae7713c2b63e3a91e8f57fc7133866c47fa43ac865ccac252c60af35773cf2a0c22099b6c28d7bbbbd34a5c953bd2d803111ef159240492441d19310352d5dff9ca9722787d52e6c00b82e7efe26857d61d311b95aaf0d2d9b02b4d64330c971cc0644727ca2836d42313eeb59ed160b9c7478501ceacb75bcb428bb89c70cc2ada460d4197b9923d3f485c77831a11bd71e31c7245ef13b803131e4de3e651f0dde49f3bbf54eb03f02d261b941a2f2223648a7b8c089a6d490783b4283e9e30a6c5912018c4faadc81808eee4f4999756a6a09e6a0548c6699e63e1bf209598261cd1746b77240f45005e132be470f13ab3e6c1da64439091f28c3b3a495624b3161f4e6194c3fa2087a123cf3557769aa1ad4263aa0346d133e6c435c85bb019c49b0b57ac8277b20ac87d1b7b3851c1dfafaba77a66a0b68e9a763e83b5099a1fb03b048037b4946a335d98c75b98509e6130a2e651f21b554ddaedb1a865bd0eddd7fc2d6db5e26c0d1c162864fa8db370e2121805f9be9a99df8425756143324f71b205094f40d05446b7af733a8b38ad66d9c2f1babb21179d57d7160abce71c651aaba9259e0ab3629bca6dea5056293fc12b91feee5a897e41c11334b9f90af4c808ee182eb844049d7b715b0a4e7af30c5d07587c8707e9ca0f6673d735c4cf0777756c803af4421e5bb2adfb733894f97a3639403e811b86fccf5b5e0cf58440fc271e6033c38964882b8b7a72ccf54fe74de1ea9ea7f4d4af1da54c05878ff5849f5b7c5e7d79754c0b519f4e272e79f5e81820946927a6b2628562cbbc6a00f65af4c952c2e8b90f40e704810a9ada1a3a943566f6a55471b2218e0308bf5a914c7cfa5d8ea33661de510b6bc3ff4481bf24e97f37da8e0e3a09e363251379882e9dcac8cd61f4559d4e3d6756af09253362e84f818420522aea3cec1ef9f4af1c4f6d780886bec09e1fcd110cdec93da736e93dc974ef9840b3ac464cad114fa340146b5edc8b3b0429ceed09d6510aeae6c988df661b1dfc3455eef7c36bf9baeeb8331f7937be1f75df655f09af2b3011cd774ae34202e64d6029a21cf53263dbddf4bbb9b4d95fad1c800bfb2a5e1201e2d4dfabdca8c8df7a831f09f2c3e48bed6b8dd2fc74196c5123d59432778c1ebf0b0805a4af08c122d2fcb2242bbc277edba1b2dff4133272cc1a00884772076ec06a32f6ab86851e74211a4706e0e5affd6bdef0d04e2d8af19e72f729fbdfe64b38dbe8dbefc171ba8a08e0cd1f10737014a67cd06cacc9579d90df8f1a761bde4f2842e32985c29ef4e8f5387d84bbdc1e7d761ce99c489a06850b6c0a2dbfd72c2a5de39eb66e488d101752c77be0cea69b0991dc5a55c8289a687786b27eff19f1365816df8528233f3af10986a91e3111c5c13fa8dbd10f8d5f0e2c7d32ea6955cf7ee59313f7d27aeccdbb373d559d44a3c8f54a4d51c7fa107964f224230520f41385346d11ca77a6c751322c87b62e8317d83d390fddf1c987ca898b3744ec95b9167ab15b224727794eb6020f5538b7123426cb255a4178af1d5f70b5b8524e8fa6b7ae9f0fc8616d6e96c756f2ab271a8d918823d9f633b6ed737c0021e0dca7c4f2918742847b2f2f3e3fd09af11b19a76fbe8c9b4cf898452f841ae3970bc7dee8b92d2c60404c77471c930936d1b1a6c40fde2af37693b3b8ff55b322882ec9a47219fdbe09f0e3f71e7120e679c13e5ad8d42416e417943bd2f25315303d099d4b44b9e34ac0ba240eb58de20e9061f9bbde159a2dd880c8d03edf3c5ecbe0f786014dc96c347d4c835b911b423a6f6077748df3f9f5287d392a14e5d75c3231b072f14fba53b42b1b2999b2a54333d967654e44667419d1578608c95515c8238e55b5c145579f7cf60d9eb7fadd7084dacd763f81739e7d320decd68ab13b0c526319324297b93f6475e05ecd2dc772bad756b4848828bbc792e04fcc83da0603915bee6746d489d96eb55772fe4ac1c0f046856f1c19d35044131e1b5107ca27f8c684fda603f2b624f857e989b5c5a7b85502c52884368f39e1d066261c59edd1d7fc0037550142fc6343a59cb532b7a2b94068a9c7ab6d3d22beb00d215e6015ad0c0bce46eca52eed656936026c04f6e024da56ea8e30cea837f8b94b2ca4aa66a7c6afcd9c315e4d8ba2c17b074285a66cf2fac4333a5f992aa1f969b9096d13acd73c49e8cead0562620038d6cfaac47f2ea550810390fbfd38a626bd88d50334ec522a2768138384cbc03b64cc32f6ee0e2b44eff32af9bf5b68f654ec91ca8a530af54949d9d6e05c32702222a9ae8e306bbb6a7a660524e830ac4ed2d61c9963a0f1824d3fad6fc858a45cadf7eb8950059040f00079ce6b10c92146c4fc8227eb59f77f8e0b801394e355292890998eafdffc1319df196cb59bde3df2dc2f509915179177efa1868dc5407a724939568fb47b615ce756eb622875a61233ef32a74d5eafc6044242ff4b31fac43f7721d7565e03b27ed3bb40a4fe7a44e5eb7ff29cfa6530e794647218024d9d7d4ca6268d68e9856dc9467cfbab41ceb33b342bfab40f2530f6d6344a38da899c0d21996daf4696b59318b50827cc7c572e82f4a366dd0ae50497473fbc05c05b6aa25ac37bae38a4601ea18e53893d10e97ee2621460290266ec7f0d7286d4f695cf986116613ad1a52fb6d521934122be28a2bbe3c36f8b2b93615ebedd547857f8d75bcf3b68f43017121e86262e634ea8948696117472c7a522176bd899adba1f72942b0dc63003b7a4ebbead05ca9bbf55fb31391924eeca0bde7bfaf639072bc54f9dbb38ad907976352dfd3ec327c029ebfe07a7ddd2db0efa74826467e96611e1d9b5338300932ecb1071e7bad1873c3787d4bbecc0f6f57d70c2a3abdf62e0840601b91d58347d48044dd3c8c80ae35e53ffb7600229666d39645481cc64784148f4b0ffb584d6cace16b9c30c230b1130213f22388433ac5d12c33be613b15f6aa59cbae1eb978f37dbca28e54957368d1b99c2fd3a77783f7eeab80df6081530975176849c3790111d86aa7965858ef9a6fc5e212a997fb831a85b0c72a511477feafae13ab60ff946b2e38b6bde9b7f2723405a8811621fe4c42a2efb78e07aafc21272af8e9af90976646dd8b7dacc9b4cb99861165e00384407c6bbbc8151de97e17076a27e751fbbee3b6fb2d6781ff0db5d5b32f41b2c7b35135044d3e711fde9602cf2381774ccea21e97ffce4ca5f9ba13d7c2592f5933addb6f8b13c3f6889a0fa63e4f1548b32d9825a52b9e74691ac97cc3532a8d615f2930cff8ca4478115d4e918146096b8178c4fd2f4959c3a73f833bee36753d92fb3ea1d40873774c02d6b3c0e401c06b2844d72c7674aa37a678d53b3b02d2bbaa14f734014b5b49a07c2b92dfc1e7869e43da720e19408ca38ddf2c9b96b369a124941911d8419a3545bcef4926e7233b242e895389eb83d4f24503a7dc199a5f29892476c482e93c0f8155c0acd6678e973697155976b966182d6fc35e7ea9d815dd00fbdcfbfa739eca15cd7373313a9c87ef8d02aa254c215408c35ceb991ac606d7bdf15dd7048d45701bfad38b4945e8ecdfb2f1df3a8b0dfea2542904059ba9ff3675bcbddd31f7c2ea51b2f846755f8636417a14de13b7567cbcdecd49edc0c7b4bb9210adf1848c90dd41ececf5ccb084ffee753f61b111e1f35a2da3afbb9330ba8f851106603b30b8f64c4a796361a7748ecb73638a8fd7a64b45a24454e6b1e9efb816fb54f84a3df7b0ed293b67aeb1a2048a4903470a14d8a9c41295e261763c0d79d05179981c2286cd84eda2f2755b70ffeb7a66033feea915440b727ac4ab7a546e760113ff29ba4fe9bdfaacf9029c0aaabf850cbc898b5b13f176f6b5c28ee870b2a305e77d25e586f7f3cbddc5d31c0e3730e0f88f2c886ac773b61764ffa3fb93913ae63ae1ac6c1dc8a4dca01040891dcdc5a95b194a0366ba062acf73ba9e214b4ba3d4d8964e0aadb3950a9104682d044e83a4bad8d2852c2d6aca04c7dd8ab0ea7048c1a4200b867426d43e56857ea304446e8ed3a23dee5c567c085d669dfa77d09ec51d537fef2f1b7376aa0d3e1b5ad7b15658cbcfcc9cb375780936a8f636bf695ac2c4a504332d729f7e197630dd7a4575e56a60785336450e4942b538d47a7eb7a0cf6025406d22fc37eb8c4471d379ca651c93eaaa2a122c1c94a52e11871a163bff4e21b44daafe6ecd6f43a7faedbe032356a27b2c0fb86c406c3da5d6046fc141a17384dec3cfe16933cf1e2f11f1ee6153f719071c6d8975cb3d45e803647763c4f299ad1ad7d172916a26e428359bd2d34bd94fac23d5164bdb28ee724cf76ef439032bb5d16112d01f70353732acd317e36fc9a5bbb75f14f6e1348ac8eea89ac295e346c73a8ce8c51c0610bfaaf56a9f9d0565926e24fee3ab0fd7cc9d9cb3e25e8b5155528d6e9d246a916d6171b276a6864b6c1dfa3b67c943ce9da7f036365fdd346b577d4d84b0eb89032983e95df214aa519b26e56c201a2cb89f7cc5ea5af6ee92bb72f3b330a073edbb8df221fed996944ed87ed050d363e6a925016737a2b17912b68f23307ec031394d9a77ea359822afe88fd01e4e7619aecebc0a283baba10141154db5aa7b828a155696b38a261214222d9ce053f54e6c57c334df96bde284ed264409f511ba7827a4da56311d9b749e063a157379e529960ccace75c04fc0eca0ea0a88ca70f35ee28b77474dee296cb2903c7242972f476769e82b68cdecc57bb108798bf4208c7633d83beb0da841ad6e2fea65954f328625e0f2a16397ccb61702e9b9b675b652391946c6d2b12664f95ec77ab60638ceff90a5226e06df0f416b4fee02a2a99c55e441f9818efe48a8f89b816cb263d816e5d0c95690d416ad4e55f52107a965ec2d16371fb9aab48e9fcd1a26b4e2427262f1ad2bd03b575c1df9909a237d6ed1fe00c3352acb6f2f07fadb762937e117b359ed6661d32299e397406582b4aeb536a2d67a2be3f87654407584e527f357055d8a0e8be377bc73d33f6f263185b5a3373b28dfc84f6e726bd6bac5ded5a8cd3912a2c2d7c1a091010a9d0d7c607a7e85ccb4e265b6e06e4b7f72b1e1d247c844a94c83f48382adcea65ff34d713c551ba366a5483761a3567cec8052d62c56b773ebb09d6198ab826851c1a252e3196efc2dc51b24e387e66aee6de292adc19f5ab967c1344fbd52a28543a933ad56dee15dc4a4a941071f45d83cad9110ef9b339f57daa891b69ec1e96ac3c9c46246c1736e4ece533b61539ba7a8dc5945c627b41d79f322bb922cb2b6ec10a4d6f830b6b844a4d2e65f801c1fe5ec1a2702f969b999e143516445001a1991f7aed1675328b1f666ac49e0f3e13c3be1dfea9e7f976e6d6ff3cd2d3f79fe8c27b50a18c91fd03a34d9c9419e7d97e5fa25b8cd3b4fbfa67735043fc96e46a231c93b9bac03f79bbd9facb376d2f1afc6f32735fd4d6e306fc7afd9ad2047c349471106f98883b6a25a2196a20d6233e712c017ea692c633ca8370aa3de79ef7098943b845f9da4720ed1c7c99bf0cdc882d7d8f231de107850576dbccb7234531f1409bf2ef5aaec5751ad7f545f0567a71a3657c297de58342800a882c9440026454f1f82c4a193b1b809fb152ebd1cef2c0de1b1039f854b11d35e2438cf7d65518d2d0e12b0b8a9a74fd2cba928ca19f5bf31140c62e816633caa11b8ae486e8a7eee47637171126704b556ae83b0ddde881f71fa63e0cc17c19fae51a162e3d5d9d907c5f9aca0082e870215906e6cacbde0cf916738e8e793915a8ce9c3423773387aae607563debfc28a5af846f7b57b44f422e1d00dc8d73fc5eb1b1bd489a91b80e13adb36a91d582450ce3324fd616187f01f54dc5c52e5be9d4670424d23d218cac02e451adec55fd377ffed6e998e0fae56bf9144d7d85658143c8058aee8e0f8bc727369f0dac2ccc0752e82e703c5e17742c7b8691071b728b5cb644569dc13f82f47537162956467d8218bf456f684f487d885154b8acc7defbce1a9954835a89fb23de58cecf2d7d9d326cd47ad40cf0e8dbef8b42005fc57664c84788f4fbf484e22ae2a8e6aa51f22199bab335905d9c9ea050b9d375d0e840397f15ce421734b8f1ed7cda87fdb064334daaf16ede838d041a8dcbc9c7a12d85fab0bac7ec72c62630a37862a1352b12311d9c4bc4ed28421d95f024650442ed0e9c98195088ffbffec1a79eaeb6f92aeedd54a2dfcf07cdbbfd0eeeaa758522e8844e67d9d269371ba8db1ec38e7d4e9f7e7c269165850411fc8b10db3d7057203eebfbda4aa462fa79e0438c12f49f9d61c287ec46121f47b9c5a6c204185a1210c725a06994f07d2c2c1b12a1e5979bed7f0dbeb809b9a8f0cd2c4f05bb42bb2065d660418aa2e997362408a9311d46c2010d631b4ddcbfbd8f40c928b408ffa9f7411bab287fac9130e19a97da6628684c0df498c2df6a43c2e19977935db0e15d182981ae56af0afd79d2ab00e20cc076745b125400ef0937becab6ea75b98b1edd6dd86b792f9baea8d26c10fca320060c1f5ac23e97e143c23e8aebd7de5c2a8dec0f5e2a08f05789e7eb3eb0e9d33e63f4238e7a2c493bd9d6ffbc28a5159b174340985d3dafc90899eb15d2b22489001df97870fc492eb09bb24101702c18b1c1f771542c1dd6df228d0fba75aa2e0a49995b0068faa14eed059a1d100dc7e814e260634b0974569a703cfb5761864e550f00e4363bcdf6b782b933a031e0360fa9b16ccfae3fa7fcda58461b2f55b95ee984ce669b13310cc4d90b62dad787e39c5e25a74f986b324f1aaa822174dd2f6cc0e0a23792cf8a2a4abf73ac02b681108e0d622176f25f9a8f2e7afe8eba516a7b477099652b7a90085e29a7791c549232afdf4fb159ef301689d6981f148818a0abb86523fa161bb3570f8ad1d9cc95fe388bd8a00c29af90cdcae19c528078292be5ddf87f2f552d605a7566a03da37506df9c9456b375b4f1b8c9791943fcbeedae54f5d48257306ad98d9d70fe7de09bd0f68ea8c4baba6fed96e08d32e8ea0dc2ad13486590b47ef26e3ee8ff4bec6369eb3ea424310b7d6e902223e7d2b26cbdc77d24371e5ce79e8d11abd65e5d089eb4ed16f27b707635d5464a89d48f8dd39b8e3ad397db8947d74d8ab01aabc38a516cb6d12dfe208eca3d2329381f74ba37f8e6813121b53d1fbed30e187c86e4aaefd617e510309e9173d04313d88e1bb8e71b4e94df421fa141401668d5526c6ca789b3fc9764c74dfb1ab6861d8319410d1758eec0fd1f5c8f35a3254c20b6084c0084cf65d484a452200e71fa0bb04c0d31f75f490d4a6c1c16b980a038bdaad2e2af2e97e9f54ce64fd773102b57c191e53d986fdfa14b216ffe8f0d2a8e255eb45ade28944ec170cdf96c16e0b7362c926d8b594dfd810009c30f5def8afb4462194b2f3c0e6dcb331000df77340afa540680398bcd9ee2c6e8d5ed9698e7a6746b444d230f4975a8d5e2b6b462391897f4898cc9a576465fb77750ce1ef1ac37c939f6f7b3273ac695cb23f72d22d6fd85dfa87b732f88f64cfb69d2dc749b25207a3c473dbf371ef2e509af082b8230c05607141a4abe55c4c9d256ed573b3ed66ec8a8e95d8be2f3421f6f3004fc53388acc8d6fffb5dfd407e251bc9ed1fed5332529143cda7eb31a9808252522ad1867357c7fbf2efc316e34a64a0d29041c412498fab29c8d64ba346a74a0dbdc37cf75062eea251b884d7648c1e2ece6c978df539f848900bf1166724e004f941cf7c79b35cb513fa0c609481f99a9d3e099f7777598dcabdc3fa7774032e862dfcc01b6934f7b8c0e1cb1fa3c9a3922b36895ec2ed12e06c1da364537d7e9545ed6fd74a2bb1284dbe40dc260be15b2ded6203dbc88ad093eb8565813c0071175b69029930cd37a8979b14261edf42bdbd6bc895dedd9140b63c89c443f947b7441b18e5b0997ccae8844d49a125c4a2038f089f2ecf3cc84c914008f04fb537be4fdad7f92706ac450096dced02cae9f417ebfc9df4bc81fbae9035530dd289a6b4609ea141a860e234c17c09a4ccb92396df9853d73ed18c081fc35a10c9a048bc4fe3be6d1ab9861aca14d1f75efba2168eb37ab78c3249d149aa8cd33113d3198fc4025c27c71ca0c2ba358c06fcfbb16266881dc9a0cc0ef1f3907825e0110a5ab1cdc9af5909bc293a2093d50e3f95cc41f98a9cd3fb880f0a38642ea89233492387537795d64cbdc4f1563409d6e50ba5e43ad3eef40219b230e93594b2e90e3d4a292d5a1d9be62a0d474bc5c707e2d86bcb3aacd283e02c497783ae4c4019974004ef74d4b12479bb384c19863692c6c86cdd653fab2b55eb3040eb5b9650f7d23672c6d1a898a2fcf261aa0f9e5e3e06c405f5fa9b280dd3eb1d82752e4ea079f3f5b4428d1c5c8d8e879c6338a7d216e57b4fccde1b86347e9cdf0d95e82edb1f25c01feefbd468a97bc69e2148f968f4b27820b85ec40d1ff32675433e661b6ae54af439ff07c5c70a0940c71feb81351b87eeeb48ff73350064e62dfcbe178920fb3f8d6ae7625056c1be3654063288d2303ec9a68bf6c6362b44aa6f098b20b562bc59d307c5f098215676bb6686b69cff1d958afd10429f4e997dcb420f4f3614c2f35372f4216b8472da6a680c0cfeeecc4d0a120169b0e9f3a6d532371fc1dbc857379231e8744dce62244501750b6f68d3deb14980b49cc8620e2113b64275d5e56b735cf97df30542fd3f67b1230afabf25b5f10d10714237fcd3ce27289960ca48d410f0bf89031c7f0a748b92ab0e48332670626b51e273cc54e34c3ff6f750fd6a4de261f47ce64bad1bc078b0b21dd75fc691adb93d151c4d012fe15c4bab0f02f806bc90c51278067b40ab210ab0ef7853de36321d00f50adf2babc0c2cf1d3f00fe2d320096e3ee0798b4820a378bf2fcf31a269151d4b25465c92f3f1012c5f1ab1f911a551fb0bd3722e499e369644b03d64c0d0c9a1cdeda01e70c8628ca118aad209283a9fa6f3f846f56f475cc5848bf821e195167a35a945e8bef07c71d6cd2cafaaff889380bf4896f62af94c4f16576224d111fff73944f3224d0f31e41344814e56c56b3219c223dc7505793e72d9596bbda201d0510cdd05b414142378ce3158222e49c8560d533eab28b522c54b396b2dd7f32ffb98a00234daf6328a347c599e18b0130e511d550926c707928f82e0ec6767cb709895f7f749b941b0716c0fa63585c63b230f1ac28aa08fd26047a87bf845bb6b9e32614fe3a0d7029942c201f121ad5d30591ebddeadd85dc654047e3e97c18ef9a6932ac306b3f641aa3243849994aa31e36e7de6b1aa7c18b899e13fd7de99e71398fcec8e0fd7e8d8a0ff0abf4a7f6a245d413818af59c6289166680a711cb7769f0bc147e2011cec9249d78c7bdd3dcdcd6a1fc9b7b927521ac05d8913cbff7acdba42725e749c3c1a1189e5f34e385f060b941932cc118c08001ff99e8da588f69ebbd8a03d24cf1dfcaac3f09a293dbca4ce1b4cae6d47dc57bc58189e38642a58796ab89f88f040a5fe8b6a88d406ab5b5d0317b7e094bc3b08aad3974873cc9554fc9265715e7ddcf7e041fabf14663aafa124549e3b8c04368dbdb1e4addcb567af4357c8431505f395639fde82f1eaddc5761148f677f1a6d62c119b5604c7d163567e0cb5dce87ebf4ea37e9ea830f421467b761bbfccb11e0e9dbf0d7f06a67b572b52c75bd09417a343c4a75bde1a76c3fcd064bc5cd2b65ab514f5f80e5c81e2ac99bf05b781f0349cde592d23e179455507098dcf1020eb7f8b8443d71df9896c1a7f39c4939aca7fd8b2a0d9420f9ec1bcafd03ca1ebef999b02e078f70e94331a26802f775350f313619cf04e88b2f8bb757be03d30d4a760dd14794b2a77b6d0f69015e73156ff89545da0e19e45c2a493af03a64c1097183220598fb241e4194eadfa14fe79d5908b24d1ce01937672748b30a3f2c41a0ee165c3dab31746527bd6bac3e26b0285a5c14032d4737ee0bd690cdf6290f05578e6a81398dcb8861094999659e9252e660907ce15e706cd7ba78110a5f84495071d131f14234e3cb73d8a8763cc6f374fbbb6c04d357835d128186df984a30c6521c161f671fee8b66b7db85f4908b503d01680518b2e41712667f9464962e6cbffde0784e2c60f222e94d549b03730c9544c89dd2a39ee924f3a84f2971b4c38ddae73f212ff3eac5ff0f9db16e3c67ba1ff583f9cc310f3f9a63e88cffe1a7220cdde626e9c8be41248c64b0815062afb9fe614aa16f56d9799a4de51780fa7a98e67210da38bd206e127b23bd0f2a2067c63b2ac17e203f2fe2cd677dfed880eef37050299a1d962264f6f46746cc5df795845c0f642a9b2eed3ec23b3a007ce1b879b2cdd358dee5733385eae86397a35c5064d21761ebcf3b251faa3e7d88b65e2a76c071f874a51dd4fe61c33d63a517edcf8111b87ba30dd0c3a351583eff3b9a4da2bc46165be55a88636176fff3f2965e55b5437e56488b348991bbe789b33231f20b8a2ff49edb38fdb28c2d40ab4a5536536bff7b2675761fa394d0941b62a4c84fbaca66052c8e70746606e9f348d13e64e9d14dac8b8faf915c2d7140547f24ffd683d0448e7bd1b9182fad6d6b93e80803dad1f182853261cf517e9d2dbb52ef5a26d59ce44ff39632144fb216b71e69fb6e0fd938ed10cad3433276a58b0c76556ff61bbfab8f495a965b5e50d337609ef2b840ab75aa0eee212e6666838ec3f2f8b439b91bf176a4f4fd65ae0c0e39057f60ebd51fc45f8fead0c38f3ff9b5b83c5c55a908d3fd3bcec8242660854aafa6e12e38c91252cfcefe05f1e661f7975cc288e489446049c03e06c3c04d64a45c746aaf27c1ab71a29b96c5d913e279277196847658a9f0cdd902fd1b3574131b81f6f8ca84bfe9985f1cc8f725e082e79862871ecaf7b4fe0b6dbbcb2aaca39248f5a139a18f6ae4c25d848531cee2336af4b3e9da1e5c39b0d4799761fe7a59d65957a98a1735b6c8d72b3b86476139dd71d8d06cecc520d8021c10d1d7338220ca11587f20751f631a0033879a391463707297f7e07ee7c0f6ee4c4ab6829daf8e44e30b9a51ad9c164a2bce9e8b8933046b8e3571924a73f6d24d7e0354112ae6df3f46c435868c1f75d1b02d5409384bc06c5f34e2d71992c1c3361e031fad51db4a7d741640150c5f78e20997e056aef9e446bda76407e80340bd6d1682417d7ecc424cbec12f104e8f2c17f0d383d6fce7a88e2842ba17cb28a6f3a6e9ebc224992067a900bfa07ae2134b67b5d87621ddc1bf441ca194b9675bef8bf00db1e54fb2488c448679ba65dae85ef5221dc78ef9e756638a7dd16888baa17aa80d7bfcbe92211df7a5d025525228d56e67ded9556831b9faeab41402ff6e3cb133b55f7401fb63649b5d947a353c2ba5e91ae80d8fff5e48963607f20c033db6919da8af019588d90dd0a530477ee048dce9b0e6a29f4344ec49ebfec4147457f44fff5604f049139fffe9fd08b32a183a46cf9623ee37ed4b6b021db7548066ac7c6f02462e106ad5133914973574e0f26662f0eed5cf894d9b87526058203ee83c5c8904cc8b264416d9b47757a80c43a58b4b93909a29d69413aaee8c24b6749ac1266c87ea9aac4f31ef8d07a91500bda3929ba5de743fa90830c6d1b3304354df10161c3936aa390d574f88f53b4284d2a2a82c9c724e08fe0859d52e9c109b902b2af0965b7f85a72b3a048ad87f9c265712a049cef38d4a644f70875f4add8fc967ad5ec05f2173feed5d707631abd00b44cfb04c704745725f0d8dee90e5d0fbb4993277674e34dd71a5de092e406e2231d482d753d078a1fee60e14de6a156915ca697c01ffda025b7e33ba053339b4b725879f83a9ddd5ced976a829e0aa990dd44f3bdb1ea9bd302070a39e2a5924f6d4176b1d7d74feb28ce1a739aa38f7d23588ac109a872788d21172022b818876f82fdf541cfafa91b19e296e7adc9eb564598bd64f3858f9b304edd41f4cb3f1d63e8bad5c158f26ac292744aa856f281d240c99188c0323c06bb60eed7aaf2c3c56b5c1765d0c2a4fc5a286642afba18b4b8e71cd0bb325d1409e557806475a61e37a03ef101c1bf05b7d748b3a3543c7e1af3e25b55328e2db024f90eda36a2c24039992d42615d13d93b201bf91376c0622bd504e65589558bccb573b407fe8ac6009a1858598be9618085b25ea861bc2036568f7ac684f14dcb412a83331d5c57ad2680f46f3a44c37be7eef23fdb7b344e98af76542b7794628a2309fd6d23707b395a46f9e653cace4d9252f3ec26e77ece05c15d51b237b087f43ed8d9023087d58aa69cda9309f337b704fb7dc4f193c611d29114d7e15c6efd46537c7d058b551489e9084f4e40cebae2aeb8b1bd7a21a38cb4c8a39617752cd90c62e1d5587a0a8dd024c79ef6b9faf84e40f699e55b98ca516bd0dff0f058186fb18bcb0281199b0df2b68dea69459649f0e9e93aeaf8ac87e21115eb0cc824679ef33459195e877a24c5148595a5de96316b11e04c2e5025e9b7d112aefb781981b6a04cf798b156c09af5b1e433a346de3e254879fdcb183be67ee5d569b9cb283d124a49fff78c918a972baa06791fcd915617615e7b34cb1c12e427e0d84133302fedc5e41befbc7a4f169358b52a5e0bf34c384950d0d01e42ef9374c4fc74e6f1b6f01dbe1595b40f707dbe17dc44b4e88c240758b83aaffe7b437d7a153ab048f8b1aa0024101a90f9ef92d2a51315fd1893b9649baf9e4351d05e037df6b0dd3b12f92b759286e08e5c6b54e6550ed65d595c5fa6f7661d38a736a0c92d7c9f482d6860db556b90343e0eae12d7c5370c430e142aa0318ed131bd0d51650995df2fa7acac6f9b9f5ce174155c857d5c460c09202f5b75819a554f398a132b5779ff3521f4b611504aa5b54bbbec2ec68d3f283729a38abd0a9c025ee09c199012972c38e3d69e55598309110777f187211e9cb19c9061e0b99337f76546fe65b353d92265246dc6cc878c82428ef684a88e4040ec02e58b519adf2fa2e35a0a3b95eb1dfff1fa73d42e9c44264ebf167b0f724aa1428405c36dd7871ce5390f0e525463957dfeea155558346fe322cf53795da6e79a527688febac7222012e42a536a560bf75d8045383c9b2066813b394b5592d45436377e2c41a661012fa15cddea3dbf88f804cc757b3c552c90416618c751bdf4420171e9bd6f2e16ba2ea4f1fa4c21cbdf53857f6e607f5cafff44d7fb440537d2e033f370b3bee390e70c6f56b1c7c8bad496e02cb32ed812571acb0704d89f79507ea55d48a4c2fc9d68b9d1b7df54a3327ee257efcb91e2088910f62687cfd0619533963968095e220405ecebab76e9c06605fb64254787556e4b938861d4de169ba1b71cb5c248307eb6a054bb559203d46265203342c184a1effbc4e74f50b82d03504ce20e6e5ca2673386a7a15a5c4d7f3bcb0869bd799af51451bfb1f5128cfa00b7d24d543d210168e95dd2e147b74363b7b638d277aada0ab6265dfa671e560ff6a3de10a4f7cc5bcac3b9eb6a6f85bb1b84fac0c109034c3fca0fd8095070ab7701b0d84fc1a8f6dfd0a8951e045768c0361f88e1c2ca4ba77c85b33cfc44d61d7372863e77e9491d8f1ce5f488fad1858c9e7331785cb85c26903405dedd7e4a82f37cd6b57e40f24aa842f8bb5a2501ee3759b3d027c5eac0e4d364c526812833c33095de09bc610fb3cbf3c781311483572b1c00602f2803a31a95345a07517471c685d9ea9aac0111ffb61edce4778a859401751ddadcbe6e77194d80748df1c3d7048cdf20a3eacc32a14d1f740100f851827b190f31c3a19d6bc6c058c8ee8d1d0e2e25552e6306718e7818d55778f8849dacdbdd2c35018eeff3688f32df9c7544d829dc4ea24576c966ff92337a7f0a2ba3a86fd3ac2adf56c469ffb7d17852334e8df0411e47065f6fdd86ed2e0a14b1399a9bf7efa29db5b56c6adb7f7d4beab962e5309fbd016296f9c807adbab35cea08a1b367b337eda5af2359ec9111f715828f78e065fa99558fb5c5f1ed0d78c6c624a436afaf87421f389a79ee1e8b8599ec1f075ebb79da74a79848e24c1cfe90d81e6dd19be23fbb00a5742ccd667fe432f293bd78d154d5b9467d3364539d6c376d66805108aaff30f9e5311c55163815e1ad8aae4655a8b6e5d3fd2ce6cca8f2e77d7c833e811dd1d1b6bef07c1fdb6884456c8a101ff2b15f7107943a9a567be023d1a28b87e45cc29e8432d758ebefcfd62ef9421b08a6fde714f5809f596bb8ec5be934dd14035524f70bb13b57be9117c355e5e8aaf42dbdc8a22889623247ca3ddac56a2d45d9351dd4011bc419c744d233b488eb6bfe738b495c3983b324fc787ad445e4330c59e73ba0520d59a21045004cfe6e3c71f80ee739e1a253590b773ebd81dd9ab821fdd9f715a732f6732774dca87c42aad3cc2ec920c7222e4a35edf12f2f6ae3eb5e0716a3f4df393958b90188944955ff178e705f54136445203b2408d174176be0567ca582942aa413e6da2813d59f85eaa68f58b4a3e80cc1d547f5c299c70474ee58f7f7ff8da3310fa45d947588a031090ec7257cd87db8db0216316caedb151d93826fc2dc26dfc35b8d4f8f39a0da11b32a588e3aa0fffddbe7477c29ceb54552152f9fc2b73a6ffa74d1064e5f5ea63eda3319265fcba10b95b893850200b3826289aa3f5381d309687a5309b7117a21e6474e675fb94f431d2279261f7a7f2d549f0b9da0a43cc055ce0e358276d19c6a4706965c8d86309064a816cafeaa0d7c6bbae7a43910ba31b84a0371ace0d7b73fe614d31923e7485a246d4b1f115a6b2deee9226ef385aafcb90fffa3c4b8a1c617c6484acc89ff24801d0352b53519c0c049556264511b7d5b40c048a2e6c901ae88e404034ce170ca0584e0afaf1c1d62945b9cfddbc0a785717bf7ead3989691d7b1c253ec6dc57fd550e45edfe2bb51c2880f99d67b745f1c2d99731b34dc27848c25d2387909bd25e19c820620cc181a8502bd387e1fd456dc7b09d39d01241ca8da81e11574672144274634270d6c22f1da657ba91a16a799e2b31cc760b238a4619d6c00809a6956891cb6c243aca54c05d07ac054c59babcb53412b9b4ec38c0b28ea547c90ef4d6c97d8bd9515b6085e7194f89249f103d92b966c5704755bfc70244dd37969ccae50d8cb1ba9ee1e37922455ff7ff3ccd4d4d2928e0223605bee031b1a9308b878b4fad58c6684ba6f2d00487e161e3357ce5f6bae823f248fd82e48b5ce26b4ede90e17e150e7a7742f44897ed97ac0935834c0150c90ffa4593cafa72a9c92020d448ee85986328246e332829402fbb419abf941f746b89218d0bf0ce9876bf0c77cb00a0168d36723b33b1663c8312e5879a002b7525e0f59a7fc62c35619440f904c5ea8cac5ec72cab234c46f0cb44fa8867a917d2811d08c072e5b1ec2d9fb3b27d960c42aed071c9f329a478d20561bc0fdbff8b67fdc6630af98cc02769475a8128432bb37f37e0113b8051db34254196d753921da1e14e6b06e0a0ed4b5f18c54493166cf37989aaba7c26c45df31711d646d4b445c50653681dcdb94c0a3e00d4b9a3a310e958e21e4a7d5cc573b3198ee4f3e30104bf009995097d308725199708f7d43a407e47913bd6ae5ff8aec8bc55bfbb1fa7997b0999482089754eb8dc71e9e274e6a97d3a9014b33dac7cb5add8b0294a2cc2b6a2639c410c60280d39071da9645449ae63ea0c736f05dd8f8ac8637b4e6138a771136f5bbe9afbd0fa93e83134c1ed4babc3787b64c5cc1d7d80153e738ef521c2996866166bb3965bb67bb868b7d26499bda41217e6a441b72b6131d932daf6e931424508211f6f8722d0a134cbea93a5d4c4b3cb9dceadb6ee0e6d47b9e727a75e6dc40966494479a09ab4736c6a8bbf84ca213f216bbe4f75241c729d1f702bb1823e988b6475ec012dfde6d21e2e08b8a1a33a67021df2e17712db8a50004bd8056ef98cfc4e39f31fbe153ed0fe85ee4db949ccee6e8a714fb73311742fd84d607f818db95703487a37524f4e24d66201fb6e9912042a0bf3a77261ad26abba1978c0ccf641335becc61e2d34739504f062c4ea112ac2f4ca603344d51b9af5108ccb39af694563c79082867c9f30006903defe150ed6cd1c99c6b2c1f4c2f211ddc9309cb0401fdbecb908fd5a9d2b301914c674c3bb86d982550709e7ceaaa03648618472b7b9bd60982d1ba1787205834082050c01ccd3bae49cbf54fa65abc33e34ce06792e23adfc22509dcb3a720c5d9bc395c0b882ece0acbcc5e3d971fa112226109bc2c6e5d14f37d45e185777ee7c5dc346e3e84c57dcf3f6615afb6fc09e774fc28acc0c1225371db749319f2c000679634380fc30c0aa85b899a4de1aacda3634517050a553f25ec8595ffa32158d6d4a9d88990a9da0069f29af0286c01b5c211dd7548cd6f5a34f2ebafeb54b82349a30aaa76eebfcd9ca1732f1dff56c0625afe53fed2673d1bf617482eb5860423450e12b7311c34c8ce9f25fbaf47aba20f6945f94b125fd039f82ed31a09941afd9b71c498267eac22d67ccf2f882f1c2719494e4f8d5f4df33fb5f8625c6c717814a73410f5ee7142d025055846a64ed85b0856931ee95081c9a3e92e5504f190d5691a9050cb1b4b01f7695e89dcfc1a2639cb9d63fc8bc2ba36fefaf7ec76a7d90902b47af24ddb7aa93417ec71a81eb665ac1cd172842fb81ab9b4302917b3077cf4059b69b1042f9fcadbfb33be3e4c5fa9ed88f174bae8348c5658b33b63dcc90fb7c3c94dee37caf5a9b21fb5f8fa5bc5dcdbc776d9c42a17497e1d0b1a2862b90ec321f0669c36384c0c0cee7a91b346944ff51d8f7eb5e04344d33aef77d981f7e97a23d3191266c07f8973247f9b2f84a171f072542b24583a9efc2500ff9e42284a3008350d2cf87dc58f9235118dabc973832dafaee96c08f332cb467a6d50e4d54cc0a6c8253c3cb1a51d4a174488270ce26fb60a7fd1e17a72352e4d7b71c0ce6b7ee30ac059cdd46d0322ce992c975ff99f1b74003c7cf2a45076c0035ae8e457ea066b6f965c097773505b67c92f87532497eab419c132b0cdaad260a4c31987d3aeb9387cb9c3271738e6d9441a9eebe330acb653cf6556b8f36221e90fbd7d953d0c04002639f024ac1e35807cd12872ae2aef9ba466abe4514dda27e7afed77ed4909c32448f9027e7ed801ee926a502c98c12078df28b7915d3a973fed5a6872e761baf08df3d2cd39de6be6d21e9d1b94aeeec37e9ce5fb3e24d4e7f7114a6c35152afd1442588f980528f60a278393a8a35655148860326d55c1f2669de87ad4b84b52ba8f03e81e329648ccb3c2dc89ac1f3052d3d08b5700f88849f8cbf34c2001af1105c767eb92f1eb17d536bbefe526e495a3aa4407875fc823348d7a3311d63f51830bc65ac5d90193e80f08f02dfcb37c7a706380457d6b0013ae1fe8df46dc7b13fb4a1edd5ac710791ea1930e170e93f5a202dee657eb7b3beba35e91a3e91b5ccccf4c9fb57454187dfb6ab58859fc91f16bede326cb909526d4bf2116ada8754f8d944c1ae341db2d2c9ccda2029dbcd70fd76e5c6a9938953ea1008e4b82796acc867dfd6604fb0102a67fbfa30c0b579f5bc0731f51e7a191aaf6cd5345f8c279136ecc5c2d9a30855880f1e5f81bba0a8f9642621bc3171af936c1183c8f8f6ffc505e56b1daafc2afe66a72017053d2f24ee1eeebdccc07aa15f7424f389a095afa17607f0c361ff0fff74328788dcf32c3b5fc6748e749e50338a095ce37119cb8cdcc6e85297c0123562e8d01c2bb62c246b14136089f5c4b2806bd9d1fbdc0c437ef10b2d5e05ba8efcfef9f9a3ca14d7dafb787b2c1f15964451c927f94bdbc1cfd6a6d9aa7f80b6156b80d110967dbe47ce0680c2bff01af80ccc7615d32b9c37da5874dfba35279a38992f6f8e6749a806031031bf212f8611884d384beafdcca400179ec98a0284e7523683f897a451493edc658c87ed14e821ef150ca406d1eea616382dd1d8c00adca3ad1c89ae22f864c10154c1dbff506361210594f8608d20e2109706ff53f0588eaf992f1511bf793277219f7a25a54401059b9e75e7c3b91c0351802db8b81147fb01a32c72c0a5efe85f6ddc6d4272fbb9073c4acd70772f00170b069fcc9d6a18b88c293e30cc3775848e9d656097e09da96eae224f2bba3122acd42745fc852d0db2ae26f81d334a3f28c46f62f17981a8e83b262576ae267e38049945b5cd3e7e2cf23b00ba2a03750c11de82b9a66fe930377c385c300ebf3a629dce248ff28660a3d8b6ab9337d2233a68e4db1156189a2115b4060c6ab3073ec10cf3a848631262112533acfa5c42a7efedb03e1ad1d15f4a007053dd1e82d0b9adbc6efb8c5fe4bc8c2960393571386801791dff862593d79df44aee3e57e4f5dd3c875623ae19758e813a034d806a4f2dcd04f40c4d88b6afa4366b6dd392e0707482e8a1ca038c2f42c99a51b3bef9a37c7b1adad74ed9c4997f3212830fcc109b880d2cb2ff76cc1690b941dbffdb55188a4d437b9d289322f2ff11de3bcf127dfe3c8e4f3b9e68b58f6001480886e9b40969f074d4467a97c6adcd8befd678a5921b61f43075b23bdd5e85aeff82fd4d053830f6c0fbed57bbf7b8553f5a19a72cb79de165faff6bb902428606fd5418af73c5d381e876389a86dba64283b1e2d294d50d72c943808b73e5890b4c7efd11a946dfaeb530a64539c98913ff96a106c6d94af34f6914f4deeef85e735dc372ea0d970141161a894eceeb0c1e27bec71185881b58bf3edd06fef6b2bd67235df65c206ebdd96e4eb1f67f6bdbefe1b60e6a353834c55d452a89c56170a767975365de3f76a3bab8c197a0e24fdf9a7a5eb61124fb14c41b28f1b2dc4c8992e2c621c2c20b2f2467bedf2fbaa7553f599455c2dfb1e9fc0f13189228b245410e84d4347de280c70ec89e41bf66540edb4ffba9cb0ad31cac1c892878d508731face52739a03f390ef143e22179233de7ab8abfde8341a241ba89138a57de80fc60328484073facf2e4f413bbd59d4eece6e96f2796a4e641d90a2efbdfea74e415f72226df5f48f681ff3646957c1599ed56d4c32c5af74244e38c6f05c0718e878a500bc5f0e8039251d782a334bb44694e14f7c6cba204a602073bdd80bbe6ad27a7c93752e663073c073601be47bf8b95d412ab0cfbfc9c99a4e1f21d99edd6a2386afe7e3c461fd8c0ca52eec2b461eeb65e5740b0da49fc79306870840a2e265a99a8aa638628ed97b3e7402adc7c8e1275d71b84647aa5151cc000492fe3dc72a7c585fbf4889cb7025192945c2209af630eeec6c52ce40867cd4cb5716ece7387ad551454940b3615daccdff55f25cbe4b1a43d1104a08e85005e521f304ef39405447b43fc560e561d45d6b5532c6867697df16c7ef12b2640b449a34f14383ebd18a7ef2f6fb260d514c2d1a6f621d1bd8fe1c1fae8ee2228fc61a8f7422980f2a142122c189ee20f42973ddb13b14b4cdbb19c00c89eb83d485052d5865f4249cfa53d6f043bbac69d15d95795b60db9c73cfd519a04aaedb6e82aeafb9d63b412781b3fd8e4909ccb14eff36cc9174a119eb81a8f6fb6a698ebf46cb8f124abc6bb884ac9261c7220195e927c729fcefbda42c33fbda9b2eea47632680cf122228b7d63a9aeb0b9dbf067fb780ad49b91842d9b20a72b00bf8715a656ac7ff370e58031e8c84dcca519be0c6dd0a8f1048505cfee54e438c2cbb730865e03470f12f9eecc2c0c6ec81580d55e69536947f5e29f6c569579319a311f00c2eb21afcdeab71a1c5d53a73991f4c98138a87a32148a24910a5b7c3e51baad41c46ddf979503df33b9c68196e1b80ad4c46f491b063bbff6b825c8211a9157766ced693e441366ebfc2cb6e4a863d96631007f38c99596d35f449fdccf8c216f89a17354ba83d6e3b334ca2d10bf275b043b97f2200b6413b6c369f42e35ea9bccafec2a52130b160d6b0d62ec079fe40c070cf9e676c6cd72f1e9724e192fd4c568744735e2e48467a7736f2797db344ea6074ea4c572b9785e6c8e38f50dc776ad83b9b937fea2d4c010f3c5c4ffd36dfd26b5112544951345dfe0ff7b4054ce30bfc9cf2a7f71a9f3aea6a3a07341ab6d937f6669c7b7339c3450e20b416904196d5d7f5896bab29ef33b236137613e858349438dea4ebdfd41321be3f17a0d1b468ed0fab31691c01844bd570c6e25d026791b491a29672ea2da4a65c2dad766a2cca2c732d1b86cfa42652ac7476a661ce5c2952c2afe271d9131baf57d3dc3f4c4282884a654dcc7bcde5b13b5aa61a28f8ba7ad909d3d572deafb8e7a09a4dbc374d2a1df88e33eaf26216ad5b0f6586ba5ad2850aacedbc96c2e769f5c1cd51e245dad2a9c3d13c60ad78a53e24a80be087c99dd58d9c8daab70675cc23de2ce3e53fb93fe780d9ae9bfad76e98b043d218856f84d51262c895300e2fb1971f877b0a417d6bfc8b7c8fe102c44f80db4443234e03bd2e527949bc07342e74e6149a7ba68b24565e1eb1a559248a46e15914b1b18da1e3dc07e8141194f4c209fbc68e354bd21d284798aded5671065bbfec5e8f6e5e353b52d23db764784177b13f9c2a046fe6abcaea738eccb513dd9a7ba030359ed862c644a4f994849fdb159766b3aececd416435b553ece750002f92ef8f156c6d9739553173ebc1ab9d3c73e9e74f0c23539d372e511c2973ecee3150bab4825ff613111ddfc3c41090d626ca9daab413d00908a59cc958bafdbe7b75997345b84cd81693555c826f3d2b370fdfebf4d66069dbc8130cd6e321eb067d9ddd11ce764d9ebd69e0e30eef23788f7afb8f65795dc2c7248443a7616370cac5f5cdd744d2047f7761140544254ab55114c8cb7077d9634cd84f99a5e4cd0e0ff405a13ae54e11c0048b6b40d8bf72219905997eb77b22fc1597160dd5385f84cd271c8aa347dfae06d49b6b4b6d52fc9c93a4f1bf11d82b95d88f8e4fe7dd7df70c207d2a1f1fd36836625e3eec3a80e9f191452194b3b99a0a2f84f20c0e8a12d1d2c05af6123f0bde69e3267aa6375ee80c727416c02c9b0d2e6acf7eb979135a3993ad956c4887b84cd56c54e709b8d674319348d91de4de401c4b67b6d7f5fb328d684101368d784116189e43a7e6bcf33928db4bdbf3c75f5f0c131980b421c47183c6f7c9e5adad805c056aa966e84d4a91d20ce8b945a14ea23caaf56aa04e945547c1656bb51e62d5a402a06db84f5d5b1f11c9662a7bd019328b5fab8440622bf6d4bccccaf15197b61090e52e58b8135ebfc5724f97f3db627cce2d53a169f52da258f34e39dfe29afa68db7b535093727cdd3bad6d2e579c75700e16f017453d834ccbe69ffd2976b94a53548b1f4a8e429174b6bedcab830288b4b28b5b688f95d17ef2dbaad511cbf27ca6f8deb5c681b9ef2dec63a09a0d6694cc00f12f6c9231ce84a9d53360339bf5285af823663b59b7530c698d631f361ca9d48b525f382c96c56c741cca3262ede7bbc6575be2b322d9b48277cf045dc49473718d2006bdeea588d2097f5eddf2d9a59f7140aadab49b04a976a37a32d2865c39e8cc25ae44af5f95df1a5b4c010079a8ac75b9d2703e2a9a0b3aa62048d731841aa1793726feff53737ffef4f878cd66adc4e1cfe5d8831789537942e8a67353d825831ab9fa6e77cb9f5915807eedc017a9773a04486b2b78e3e6ea7a1913bf00928efc9ee654bc1cb85c3dd304ef2267396166fd5b67e0d8c5983e7c540924f1072407f4816632e64797dba2414463d7609b3df8e0c07af07253f7deec677cf6691d4aad6cef835302bc75cb5508be2b364cad6b8aae043411e89db61b836642f74d0c8918e34f16714eb38b3f08243da10bfd856148e60af22c59b0d877247d34ae427d2ba6853c2736bd325dd2b520f711c9a120f602ab5e91bc6a045790cef945b23f4ad88771e0e123d0578a4f4dd85762b0533659414de33c6389715b81566c73763a36b7af4dcc05041499fcecfe05181b008f60f8fdaf807d1b81f687556ec2ea2410699417398663ccf7dda014907d0f9aa855b7ff5b15fcf615adecc8bf8d022e59e85cc8f8d8c8618e1692382286f3a60bdc216887054b2d8ca379b58800e122ccd48bda7381eca9852f41ef919d3c58670a3921ef309a7312b060408ec8b71428bdf6230faf59003051cac9ca290562ecca77dafee7fd43b2524ef24ba9db15de06d891bf831e6a57e28f53c6f7ba5a3751e1f271e36d80932a54c1e9be52ada57f977b5c4ed4e44ae8519eaadf5c146936fdf68f980b29fc485787aeb4026d962751662efe93575b8331efbf39bfd9aedb5567a36487edc83ffa5be26955cc9d3bd3bfe286d1d6f7775c3c80fdc2db4561d5b338e030086437cde2f5e2f43eba8586779fa0f5adac337d0f61b0475e84b37515c0364fbe712ec47ef382b6ad76eca4514479717d6f1774ec180a794e69923e08c8535c174968baadd10bf0c0890702942dc20d0a61f02b2c741cdb78d41071cb74225d7ca9bec19068de5ffdc544e815b66351bdbe051ef5dcc3b35c08070d9cd13c9ab6925ce53114a86eb8009e724b73f6e0dcea8306d7abb2421b1fdad54dc006f5a129f11543d4200d2989c185849e6b6aab0c4ae72f23c20c05e7817e46f8674aae0de2805f616c29d6d08d4a52b3ba32a859c0427e010cf483276183328cc53101669b813bff967b2cf97547dffd8310522d0252d671bc7ffe0e0ab25a687542179b04d5a7d2c613d349cb15986ef2dd7c071d563439e53b4d4f9e147762aaf4ab4455f597726554edbbfbff5325565738083645cde303066375560ed83e7afb847002b9d7e603dcdd69fc1dfc57fb8556fba9febd810a157a28fba77db44978728689e73fea423f5b8771db82bbab752db6334fd61362fb46a681c7729eb8666b9ffa6433fdf6b333580f1eaa23a5661c096e7186a149be0af2fad9b99ab5fd2e1c025704b8f168ad32c57814865014ea99f049961f1e91151ca0b505f0a536133cc949345c0f45cad7eed966bfc9cbbf51b78034e15593deb250695a03fb510443fff7956fbb4a537bddb8a9d2545e7f3cfd3792132853f79479a10b3a8162785ee1628d7977713f4fb3da47324c4d8007bedef5e1f357404e694e3e3087c0c857cdc15aeb8440263ed8c290091d37b4b9c7d3c0a0704924753eecf12e070655c05941d0d6a624ac644720e298ec3609e1a4f99c9634281ea2ec1b631e21cdec3174e0a2c38b43b039755ece3700646588fc0cea45990dc3c564821b4af8bf51e2929f46fb1a7bf4899bd512803b2164517382a2cbd4803c728a8a003afdec4e56c1c09e43d339732d5ea7fc3d3a4f2243c216d7369aab4b85ab233093db0fdc87b7fd047587f463a71aa0a20ee2219353948b839f825f6f57f165a3bef906fb194a1dcff6abb925621414ebb2347ea2d3b0b3b91e795420db5e3d5d9e5b4141407e53e25370d7884146408b6366a7968b6e7ccf8297871d62057f3d4a7d825a4bb78dd7a052984b3b7c1b875138646a1e0d9733c4fccd6a6c3b022e5a958b2f420f3e06935fc92e8455a04cfa146bdbc2568c88ca3f43a9337f8adf575ca7e64cb66f3de9e6e88208514254211c806f164495d62ef3a7c1e62603bcd648598737ae0a2fc72bdaa72903620ecd9e387dd09e05b76fd660bfd64ebdbb6abac07c68e22accc1373575fbf27c9228dfc00d9de2dbdce05f352987aad429c678807e7a43bdeccde159b32c2a64bc3729df6dccb12bb082b11bc09a7731b3e442ec25b53f4525870dad2ae4d7910255d4e5f2850c5df79b0afc0bcf7f08e1f0d3ad3ad9bf7ddd41e386c6c5bcffb8bd90db35a35462b533c3c2e68ffc9542024f0f1c95d203b5fe7dd84c9ae29fd50019e0ccd8523d6613bd464bcf4a29888290f7c10b8ad87b17705a4403bfb7b94475a14855bc3bc17e3ed5d31eeece3c7f3338ff3f07126f0522aebaf419b18e2db4d8836f3f3df615e6d5ecaa38f08f4aeeb0cbd3652828c23f161a5a1fc88d8adb1db0a46567966827a2e763ce5fad63162339288e8230862cfb7f6c406c2fd99b39e8cc3aff65ab3a91f8a2258f6f1996cb2a2baec2400f1249555c93a30c6e0fe6615758895b1ce13100db7182f58ad68e9b58ba95a69ecbece996c39288fd4abbb56eb7d9a20d7b57b0c264a2ede16b2c1dd8550d91179af52766c3283438ed1bb040257517304bf6deeab5c25ff7d54887e6a4c116b97c10991a2fcd4ca70ea239af9f218e9a692d36f3895ca70f4524df92209a5a1316c3358bc7782ac8f7f9eb222e45c4a2694c9564bb669dc8fb7e09b50ed44d4b3c7c062419e9c5e145656780536440c030c3b8e489ddb28cb2d4d959288d98b2115f2a9059d222bb3fa520f73b21d7a25575d42dcd6446484e1be16c9ec220063996b51cbf4fb818b9efe8681437f0086851806a9247bafa938ae9af948558c98c436c30a9ac20daa88cbbd61550993e2e9ea52b1b3da58bf358b2ecba1def558f0e446931e871b471ea030d58464e790fc06ecd1a654a1aa015ec69e4df726a2b9357eb2022403d2d481575d282f46ba97cb47fdd148f6d63922ae458265d8a9422b59c74db0960767b9eeb94fdc99fc78c63e8d74a39e6be196618eb8702fc7778da612a5ec0d67b88ff64de2df728b2cb36bafb19ee88923a07ab118dfc7687d5a01dfa0e9e1a707d1f362950105c491006510e0d7059eac9ed5c0201772ed8441951f2530df80a936f350bf371affb02fc1549643e291c9ba3f8cd7735fb6b5846ac0415e7f47e6cb3dbdd1d8babe06152271001f83364b732b50887b2c0b8750e3505d92faa27231672ef22409174126277cf6e45e1a5c30652f016492a5e0bb626416bda71b2f6dd3b4c1e8091458062cbed217e4ae5447b3f6ec8a04b6a8c464dace1ec979ee2ae1c175e718a3f267a8b15567c4b2cd14d8d51cfb91e3ff31ddbee10e4e283a30a0a230c0a9ccd9947df54689ed86e5c801a075e2866f8843dee90d9c89e385e4b269caf1fbdba92b48696d6264e597e408585ffdeea25a70700676c2098c2b7859cd87c54c76af96570d1b33b0b579e1c0173caf7f6eefefdaef40865a626ed43a87a83b136ccc7171a631dc2d85725ffa2303363a9d0a304d509a0d84532e7fa2fe0d9d1384951491d94d66266fff49d71e2b37cf1e8eeb5b56c7a0c61dccebf5c354ace7e83b82674277b401ee6f5c8d7bc4e7b5edd0e7c5cb0a7b8131fd1cdcd6c4679855d14439e6d0305401a799c51daebb3af3b58372bd84311f7c66e24ba253d345415c9d7a2eadb4728282baf16922ca77888389f25bfed5adbece16aebdece9992265d7e969efa007a825ab72f1a3dc07199d97aa3fdf966db196419c149e52ae42cbc3c2980bf46982e2aa9f706699ff1cbb853844fa5109abbc7004240bdf5bb6c5ece1e5b413efbfc3072d824ec8876f32a0559ab58cefb699c95b7e73957f987a54e0b124e98c0d2f480b059993c146f570feae9ab186f7dffd3c0a58c1feb9bcb21013880a7c94b76499f33b0f9a48dac536cd1f1eb771f27a51af4a648f44f7f15096faab3693ce1396218981018675d6379ec8a721ee7bdab24420006f0c75c2c3e1994c6d491e3c56215be874ce0e4150f39ae747ed25c9322b046df28dbd48aedfd517069e2c2e49f737e7f8f3104181dde6970ba83beaef4af976ab4a8df4d2a2a658ef7cbb23532630a559a70bc1116c2d10300d34ce9f9f08c0757469059042624b5c1f67851670949a60d4a389bdd102338a27b950a9e8ea0177235a5621061b1c083ce031bd2d2f2ab1d54d1e6e412d8df9295d8d4171215fa209fe583ec466ee9b1de4b957bc2d6510a8901f024b21c8d00042947415258ff23cef6cecc5a96dc07ecc0618ae8208e8f653e108d3128f450298e0db7871e95c0ceba1a8c5cd85da4ca6746238d4d177cca556b050ff71291aece5d45a7c66da00e0e42115e09e61148b606581ba70c2700f90716688e587a713295f4325c65db364916757d2c6b8dcc18ceefea9c8de24e441b0d1e4fa8e37e99209ceddbf89d0acfe2548c5560fabcc4209bb46051ee9d96d78f3e3f235de525e8941f73c8e4e54dd8cb49ef9dcddfccbdec4f9a5f84108480bd7b8b79aa67267649e80cd0a16c51b92fe432588b5a2f9cb92efec7138e6a1540edbbe8258d644f9dabf2d781c382f50bba80dfc572c870474728abf3c1c4fea1c678d214c22c3a037096006949bb6326cb9e4d6cef6beba178df2ac2650326fd220d467677fa77f6e53ad1ee437cafba92ec9bb30bcfdef27aac92fba020ad9614c85cb04e3f43f7f4b33408b7a74bffcdbade667d27703d2c1a204d076a0c08d2b7d3417e67536e364e205292d3d65beba6d733a5995898fac959fef4c5bdf82ecf2407d7e787f2ffc1c3b698f8cc91d9237d422a595e2bfb63e3760e6e4698131e7e6fb8f9446f0ad7fa855c3cb612f22fdda50097f5d079d087459169749cfc68a3200785c60975e97523b935d17771419e65cfce0e1dd84d173375a49fd92239907e2388948c875cbd82db559a681cf4ff8373796529b79ec17dce3583b8639bbd961fc757ec3690c29d3dd42fd7679ad25a91c3e041aea7c7565bb5f8c8f829d6f1d1dda5e437f8726a146c5b18d19f878261cc90ac9732910a329ce7d6ab65dad25c56752cd75243a088a4b4d5a4b9683c5e5025da40b0a202ac339490eb00e434e2daa2f379d5766a6bde049619c2b3e9359e5c2c9e6867bac9f4024547a628f2bd357d1679bce87dc27c7654e6705b4cd001b5ad4913c1d1680e37df8a44cc89ba5074055a9fb0f7d31b2138762f053fe6013c19c4eb52147ff3a0404f452fc94d47fe4b61cc0cf90f375dd4b829f6ae4d133e55193ac835ca054424d92cab4dc97cab509eb285b13c28294f7c610377adb552b7cc8a8ad89b1229689b18243729673be37e6b0736ae2b555c8e976a69085bbd2b5537a1a0443c3f730ab516428b9ff3f343342da5f7555b01e7094557260592eb30f8b05c1601bf21e5b194768bab88b9b5fbe4c47be88e36315279e706465857d46cbe506d3bc2a57d602e200829152c3b53684abd6df2bfb667ffd49ed1b30297f1a7845f055effc9d3b2822919168b86a7340771a3f99d4a4cd3553e9beccd751c7c15062b20a868159548175af96ddf9e4dd13d329f2f9575b3057bb3a6640cabb4002be7e8c6743c1f37d5f86af056b004e34b7961d36e57ec44a7caec9bc479e9fcb7cecadaf08c92013fe225e24320fc35d04b88337aef061941daeb8d44fa59a876dbbd29de5babd588c9c38f633888011c3f47367abc9862f728462245bbecb50911596347f7f71409c21ca6068cebe70a12895d0211db7d992d91c86f1d2105df3d88671a76d8b5717ee24a736f8ca138c94b5814c1b977bd7baddb587c5b72d321fe3af11a18956fe4f2a4c015f3177069e4ae13add4458c956ac3b1f60d39181827389d75028e8b58e63b0628a9b7c1da0665a4f80c6f498c9728d48a7e92a86cc22597e084fd660e4e2bf0a1940409d0ac3197bdef964a1d2131690559497891f0006222cbe368cfce26cb8cda67b38a8cd0b1186711f50da3026976683b0adfc32301a5685511b655575385e6a53b0a9afcb1916bc1e875adcafaed06388ea7eb63ed18a718ae5d4518a8655c1e78ed4f00314914980c21e9f531806ae6835390bf8991acff6122111e4d9d7c720e95e2bf7750fd38aecd8150f83f7684d5d5305a6a92ea062a3889ff8b8f7a3d5a5d0f2b687040cdb513b22b754d1c3572ecaed56460512a24c24590b81167e4dac600639f9ec159f20694b74c06b0640378d49466c12ae4c7f8c58f6448bc9eb6972f5b33dc75cf3d1a32124ac598f8f538d5fb41e0d89784af11744db3f9aaaa9ead72c5f32e0ad69a5ec53093a63cada6410f73b83ea09b02189c25bceddfb3c533f5509616f5ba8953cadbb16560f30dc147b1ff09e194df7bf78fe96bd85f828812e9b5d442b61fb9604fb18982f35651ffcc01ea51e060889f939adb29cc693ac08631da9e211166980022881cc4553cc9785f0833657363dc13cf9265d6e7569fb9b9e1f8f9fe3b4b4b2b104371c4c334628494a1c4884d55d1b7253067bde675a343ed60cd7feadbc87e570f7f893edb7facc0ea34ed8316488e4e6d23141c45f00096c0a2f4cad7ba01f8325ea7a09f47d560fc93265cc83504f5f8c6fc87e46b3b736b26a73e9c6d93a2ed0cca9065aab60b338d65bcec1eafd641e4a2802acf36797f4e41946cf94535b376dc0a8311840802a2ac03dac42e3b81b1066c02b75c859aad723f72617487c035098b796b0fccab1e179a61608527e2e72edf5754df7f8b8909ebc7bbf6ff3375808934e5c7b45f7fc16709d0be2b003da638b1eaa31640598a6c1368e2b64919c7d85ac064d9b0ab58d7b1d66efb15c28b8585243f327e77c83200d8b1f7c78d30f809f68815ad8f90ae13719d82a4998f90591c63129cc66bd05de685d60f291b173bc4c5ec146a7cfb172c97da86cc0f73dd85ea0b44cc8f20dabeb13933fd31faf60ea75bb48ecaffd3eba1cb0122d78408a6b63caf7d7d640c4c731093fae36e208fb0a2919e39d5a8470255ae61f48785456084328fe433ae32bdfd062f1973ba2907e049c954bbaecfcdceeb9d17c483b90d3dcf7a3e8e503fbcd188ce9dfe79938c6effa9298286a77c87b5596a81f8eb8659b30fd1ac56cdcd735e5b82af545ffff099c826f70bdf4d5cb00a370427e7384bac0554fb6d41a1c55e2b36aa9c45232b6c1919858773942267c68e68d5e46efc9850534dd3d6fae49bdb3d674c144ec36e5528b2fa18bc90a16dcd3758d5479d180b3cd3475881083da144505fbdcf17942446ddc7aa986016b7a785e20995d2edbfef8a463f0a42c5bb2156dce68d2b66a02c45f7531bac8880e1491a2d05e64628ffcfcc7ab4ba87d9178bbc6efdb25b31ea2db16ee419b2297ff5b6f3c9542d0983d27c0ed472650d19cde090cd1cf1216a881b7f43a9e717d7c725e36a31b2f8afe5b4c36677d825a54788da8765d052ad65eac09f4e6973c856784acdf9e2ba8815cbb102f32eeb2f49839bec3531ed0a545c20e015d9f16f02fb21e71785d312aaf6d57357f1a8123fd0a97030bdea0727b906171e29560b8e5b22ebf5b316805a672a552d9dbfa17b31b35bd49d61b7da6889575d1685856cc47bb060d59770c64ebf978f2043b6e699f6736456936df04d8a80033b77843e75fbbeff94e83f5fc55302f2dee6a7fb7cd65aa8298845047dbbc675f475edcd469005e93069188f48d25c212141e11c13ae64fbd6430768226a3f8a098d725a24d503bf33a2417dced59f46a7a0ed913fb8fe9d515d52038aae12015c6277b9294aa569ad71be7441632dec47d93b5b5761f05c00e22f6cbcc455ff865773fc0278c08a6b49f2dce18d1e49e02a78e66588f96db5a9239dc0ecb9883f50b90eedf2be4fa89f96250c2336faa05feeb0e37469ab84f0efd9c2e41826436c6d6b24e9661db4b7146a5f8b5735f7475ee55a95dbba2efa0aae901901dbedaadb591d6d9a47b365b9d007a6d8e32019a6a9ff166f313f141e61b4ec8c92718f832f70398ef28c0d082d3d6336b53210b643108a86b330fcfd858c84e4d3027bc5c7e32dd794214a3d34001b31fdc642da0044b283224b744f5a1b8cd8485f09e26a3b955f0c7f7287a98406db1dc1ae6e1289ed1e1615f3fd7277b80ffbca405ec955ac746b92b9365e7b717610f9e90194467af6b0527c9e69c8b172519e2a597ef292fde7a0e99ec7f4b4074383b956edf57e0698f8aa5f1fb5e13525681631dc8da9b73c23419da306f47aaae8b34726c173fb1df983d9ca77347f69f37d1ef3732e7370d0559cc65f204ce90621196436bce37b28b02461efbac7e0bc59a2c3b516275cdf18ebcc7ebbdf83945de34365abd18aa53710796a9687bfb257f646a9ea264e65df0dbe0d6b8c1dd679ac7eea62835cd5056e59d8ba0d39b20fe9e1823d6486a38ce510094aab469e1dad2c2f1c28170bca2566a8bd9adad5298fb1ea9ac6cb5ba9781809f62b44638394ca6993227c13d45f0aa58a4fc2241e7061b988f5ac7850d641a62179f99bcf736dc4cacc54b10d12218679c04fd6fed188b09d2e23c3c9e027f875a37e50f67815c00129fdbb803a98f4bb76796020fbfb7eea36d75d95af756b6788130b34f2773d2ee870b338f81534a98534074b0ccaa92053ef2cd0432ce3ff40d35e30e225f3b7a2156a3eb9e971d062120034c62859a3b01a6e43d58a626a811de5e4bf55774814c9593e70f809d8e585434bbf5843724ed32f5126008089639fbaaac37ea7a0f59228af4ff040bd522496c4ddf1357c7741643ae64fc4658245e104cb7ceace669c32c3e6663069599aa90f659285280d025633bac45ad656e53ec7b00ea4cb848d60284d3a7da43470f360cf11c38fa18a7dfa114a4fbb93e7c6fd75e3704aac64a22fc8c303feb71ede5a3549979b225ce78cce11b1fdf84da285bc1543bd053bf7898eee0513e0d0bde153ca8f18bba6d9ec9cde67c6c53eadd47a3a03d5b58c51041ec0e5b9f8a996e39359061f87890da6d91b17d27e153a141961059cf4a17306d98356483173c5fce76dc738431b5de741bf64e8bd879a3f19533ea06e13fe0b3ea9ce559fa8a572630b564c99a5d5d0ca441ea6ef0898bcf87b898cd6cd4b6df8a910817eaeae36977481bc91dfcf5130a5d557bbc8862c913a731fdcef8f014b91763f0f116459e7a51d92daccf19ded72ec22a5190d405952001faca24beaff4d5ebe405393ddb1f092985ee6c61850734a38d1672babd7f5a57eb7017f26e9672de100caf54e290640fd4d72ca3be1eef8579b5bece3ea2ae459824b4c7e31d522cc37245df90ab4be6b706545f7cb1f50462d3eefaa97d9004be009066e328fee104f878778ea385e5ed2c623fdc83723576ad94b06716d19fd3c0c15ef13c2c9246501d0171e9758650ae9c102f6bbe9cd23bf540b6e686f574ff30ce6f7b7b06590dd67279ef35eb44470ae2ff4fd04d1a25a82ee3330b64ce2d77cdde77f1f80dc719d95235e208483908dceffcecbc29cf158cd148168262620f374568b17b53cdb050ea90058c2d474594f0b8fcd28c62441461b8e7e2798dac0889700c51043fed968976e6ebc1ac784181ec59d1b52ef3c5d3b891bdf5ef70cdcf15c6cac30d57f46f630489bd093f4768504cae7ea0b11306bef71ced2c78c24cce27ecc4a726d761af7dff970f8264bcde2f960e5647248668081b78c4bc7039d228e4d282e21ce66261cd0de935e450e3e94807dfea324478b266ada7634838d8a0e31c75ab96da2706bff44b1f69d75c2df7d02422d2581e6b415af97819a389bf20e18cf493b5c04248e44f6bb65f1b73cd689d922628a7fcbb0c5ddfeb7de27c143c1ac871e9ab5247efa849e51f16dfb9a98901e9dd1bee224314912f703074362bceabb75419475af8d9dfc51ac72b404016de977608d9674dd0a23846ae76c3803487d3e0d34f2e2eb140e63e1e027ca570279a3b1d94bc5e7164e43893f8aa062f9a7380d9b97c9576487494c23f3af40bb6c8ae28feac998aa11b895db9e6ea05451254a4b11ec4754e639f8b54ed7c1e45e1d08022103e01ac505c65bcea8f1cc6b32e0a2b4f2c14d2562a6cb8f65f8a3f90c08e60279aeb6436377c8d1110aa4d65983ee326c1ac9b2035693c69976dc6e1d6841577e2c9d8a3ccb76a414b7b8fd7895c4b34cb946776638abc67dfe3e2abec34cb6560199f9588c556a781a594fee03c4e8134f4ffbe8d11a60b276b4be1ec2df0d0d63c7364bc10b20fcd6f60634a815eb979a7b4719d226d3f0e837146f7f10199a1358a3b89f08c771140fabb0ace250b0e967359440ecfae115a2edda39b844e6ddcfa532759b4bac8cdfa7d8173e429a7e5f0bde16944579c61de9ee91d7b275fff033d744e46fc446a93ca978034f0ea56ba5c9a5ab5d8d6ee431968dd4fee9518be77574d43ff1795d89c77926a347ca01cb7b0d0f1f0a47c268322119afaa0d3c43cf05fda23af4aaf68fe77b03a9b7f39e70493e6960b71b58e6e75cb92cba66eb056c93a74998a49a8934c6e8a0dd4d8cf17355ac3b6be1bf9ee5a1c90c70379cd47295d94ccb1290c60074baa7d02a02b42b5b75712372df3c06319b727b6cc7a99a937aa6963717f09d7307ee54c66bbb29bdbac06e246bd7e42d6e9cae697f87d4a6126505554ea410cfb9ff5114e935c2a5bbed39c3634e31b1baa6e9bae1204a3cab246901355f02e38817ebc22fd624970167632add4654381ebff1ad88ac2fe5c53ec69b21c2665132318d2e79f75e8a342325c168aa497f587669137f497417b0fa36639b35f459652455ef482fc446e7ba15702a8a96cba90b573c9e273f3bcf07bb2ed7a0124919ed9cacbcd15932d2fe6fb399b9ef687b8da44f56112036cd522028f9a26464cff2ae09599052d967c9eb9f1b6933c3c0e33ef1af6b3b6eef5b7bc365e0a84cf23669a6da48051e71ae87e0d82778bf014da9d979fff4f85d361199db894cdae3d432de396f23b7280da086a10a00b0ea2cd8fc16079081fa6274d8206267d47babf16d5d47a155571e2182cd54307c52c3b0e56e4a6f758339f08f421b0297494023c912d19b42aacf19acb15da522ba76f984c8dea4bde435c574c376bc4e1100dfe0e28ddf77031c191a182ffe89dcb8bdd25a8bc50f081e46b4af672d109489ddb1b736de8f45057dab75f8232915478834719a3e394e58f4f5a9a80c6f9dd4901a579f4809a5d100e6c3f94a893960da98d3dbbf920f5e80b5fb1465a8eadeac406ca46ce8b029c6749c8b3ec27a04e1c69a0369fba3427013fc28099bf574f92017e86d58f54bc105d13b5ebf2c79abee80d42bca204bbfc0575929d7e3e6b7579bfb85b3df054380196c30235724bb5abe84bec1235d9c8c6296595ccb7b6f8b6b05fd30bd277518f6d7fc9423acd6b15af6fb4c8e1e5076d9cf1163eb81ea1659d918ad41f47a96fff0fe6d5aa6ab09aa88cfb24501809cd774468b8b240d479525fc05b92b36af8106cea910ef67cc1a71827518a3cf117e27e68be9ca5b94d72f9180bbff15ed00bc56de4790c8a7fee7176f5888d6cd9ebcb6c14816ae0371368a05fa3ed9669c4f2dffa5571a4a823cc83101725496c9c036ede7a7267fd937e2fce0fea0cb5f62ae68136401e18e783190997e6219bd4fd733ef868b535b54e199d4de17a497bfa824e7857aaef0efcd5051bc07b5b4c3ba554501cbbbc7ede902954b359864c4f1e25bb19d8c469be76aecb7b279be3ba393be51078f4c6bdf0f59b9d43d53ac27900aa9b1474b0246fd2a62a58ccfc8a57f3ad900e33819dba134aada3cfaaa4bee62e204a11a203d4fff839c5cf20a492772b815dde7acc62f7058309e5cec68b26ebeba21eaf0825ff277ab58bfa82a3af255bee1b6b51228f193512c67546865cee9acb8ff16d038203821f78775071afac2cff1d3df177ca9d66ca24b1c7e3c49ec4b760c1da390e58936bbfba307ed2a84b79d1461a496216144eef897bd2e1355c4b10e1eb3d9fd752440a2007ba516b1ea30b4322c22f0742c180b031e321a292eb62a78f2ec7f18790517463573bd73b788d44bf82f8f26321355035e74a7c97ea4ad1be5c168e4ded19c839f38efcda87430430d72ff9cf4e14d52351871e8658455bbd542c299493af28434952e25e288ae25f7b2bad22f2bbb9c5ead5614f63cc3ffe4d965eab5386d7741cb224d47573df55983d5a58711399ca4a2681439bf622b8dd3a3a51e114dc043839f145f1993212f26a3ad972e6780e3d5a00baf25db49692654f5f40765bc3624538410cbf7d3f1f13ef1f66900a969cdc7edd5002652872f849ab9aabe07a95ac1dbe80451d27167475b83148cdf341bbe0f21b0c02a235100f22c79d7aa53f7c8e7e179d96e3b6048532998d475e419b841095f84a5395502bf5a3838467bcdca88006bce9a0f8efbd614214ddc0827c460e791f55b6655e3ea4e0c470073a2876cfd7d0618ed6baa558bd048d2be599c1842e226ac2f635c5b7d2cab7a0294e3126958840eafa2a8de12558ad4e5b8c3dcf419eb54953905268f640d1eb5489c84b5ad66c4ca16061ee8719a024c959963f0e30657b65064eb92886ba15a7af2df78e0f7a663cdb67c757026ae19b7ded46cf1fa03f8673948623a868935eb54ed07eb1e772cb8e30864dc75ad0a4ab02db261dcddcb731432098ec7f78d17f7592893158dc5654b1fb804f2a40563cc41e820d1bffb846e7442c301bc4d2a1baaf906ce1040f2114ef257c100af372babfd82bfea0208d8a61e52c99a971d2b1a7d445530fd32953b170a4ad8b7d6c5060e90530b5af392883671c76a5b2d6f74e7045bc76c544142b0a0fb187442973234732c4d49bf6613c6c4fa92dc06d0d1130b303ec0152c4a638a9eaa8fc2582dc0ebf4a401ba7cc0a7a5207826a2be11091b9030eb09a64c24ed52056e9e9ced9c0ce434e29782a02b615ad3922f2f4ddea0dc424756f2fc5d0e8e7dc2e07e6349385eed67544b0f978542a6e4e366eca7fab126225c32e45c45dc44472d39465cd07af05594be708db75a8d250c1121ca7832b12ba521b2c07a9467f5f86018e0f14c390e60228391d8c74065fa4e0dd8aa16a61a09db3c627f04bcc173ba3ded2eabf94a962542221997578d388a6b3d3fb9bddf0ceee5d4dab77826896bb208f32f422a5692dddc5443c0fc54cd46b2c0f32b62ddb9768e5b1c7edde38d5b9bbccf6d32f5638f57f3c18ea7021a95acc7bb50066cc393d8efc5447a2380ace53873ee8a3c2df35959e04661e8273522ac2b3ccb5a81afdb60878b82817212e5d496dfa01cde2e49f39e1c70605ed7e84c540b6bba1a89bfe3df6c2f5a1b85838dba77a0f1356e3aca94d5c61adbf72028e6be1ad283dcc5d9d0a4080f59a298603ad908ff64536dafc1446f281e38ce3ec5aac1314a886bdccd3e9a940ee54a8e976a18dc98179997ccc34c660d1d10b8b015f472f8049d8c7da6f8da954629601c47ef275a41582a0633cb65a1f8e6d18aa7f29bea73ee46c8043616eea5ac30c7913a2add029b8422db1e2ed55befb476c1ca8d5fbcad7ab77bede574a0233ebf0a2af5a5ea8945ef4f5f9fcef4c3dd8c970acc27f4c7369aa2c82e6e10205bbf7d8b8f860f539115dcbf06103abc8ac673596cc1ae11efdd27db37b31028e070d825d8b640990fbeac930d3f743d24dfd78d3d1c710553671dfb58468ccc0d4879da523716313af88f9ba1ba449b63a157ce506d18c5a9fb2d4272ff193259da506b26b0e23035f6ed5c233b420a27882d743f48679065fb0d816da25476835453a2cfbcafa51d3fead8920ed0d849a1f7155a0e59e50522ff2596ea514f132aff108a2a5c29608b63911eb05bf52c9fe694df88bda6a78dd0eed1118aba84c52a2cf5a0a973bacdc70d6ec0c606abeb3635dbf2d8983c8321a9b5705f1eb8437760b98c845e03e1a0c54a182fc0aaa37c0b949705a85151df785f9e1e7246f2dec3e008c52fc8a1dfed0fe1f4d4bddd11bb4061650991f2e2b49521c9d2738a1b764814b7623e4912627d68f1a9b0ef09f0f09cbd2fb14fbc2206c158087c51b85aa43e345a4eaef5e93fbba62139afda110099489078bce483955875091999573e7a942a8088b404c11d0b7212e7058c15ef077238b1cca293306c7144c6344a2a4ce13e7611cb6cc8fbd45ac1fb7fca84c36a4d1414568c2ba74fac1c6fed4350f5751e3b0a4ca3fa5bbb4fff9e582502e589796db61c949a1acf4b12f66dcfa45e0590c1f922181e084edaab3aa60f8c4fc95a693f31fa00f497e29fc9d3425568daa86d90e3244f343a81f20f72c0c36e132efa5c96876c63853caabafebde1a19bce83d55092f735e1f6006999bc6c8a071c88e964fed1ac021a864e952ddd7a412653adb4b04783040f1771a483734f49a7893b6a7b93953c67e1f19b6889ea5fb8f03cd0a337655587bc2e4e94e6d18301de349e6d56a79a0820098bb77c110927dd462e73d5c5d5765ceedb8aed80540724ffa5bd2b70fe0c318c9b71d759a2d20faf4e32032703a53d7abf8e9bad5df219ea824105396ea454fa28589253c3492d646fa2cf283c775d971a637dcc008aab2f2037e244d7848f37405bd8acc266a358d8d6ef67c78da9529e01be74c0606232c2248d8cdcdfad494018fc94006be1c508bad412f662ec342d51671f9d1c58c8800218532ef27588b1159fa1d4d4e4a46b09dd2e231d7c1d9b5a1c2773c7c245d356e1e8c68dfcc1c4a740d3935e0814c76a7311bcefb5b4996f12ee38f0636f646b752ef4b55154b12154731a6726fc275a67ef55d2afd53b3cbdaca4f39cb8685ddc38664599ca7c490983cfd6116ba095ef9564973e455e09670a4adaaf0798bf6f567b3ce9c81cc9e09a678779fddf4fb74884a086d0eb409d6963e5a3188564d61cee843edc155901697f27451e4e48b860923d5c2ffaa68cc475b68b967077819d0f9831fcbd6603f56951a669bb70cf7f5c1eab95b889f9feb692624a8378794dacaba50f26e6d2799eebb94fb05d6ea6843d329e9f5f088c72ed75bbb87d1ab12c2b06e9d6dd4b1b03d2a9a87f039817b6094f4e15418cc7eef89c4f0048a7345e9c81234c851005003e945c5346b6975f667a6f730ef282a6085463177c3dcbd207ada3fa48e019bfcff973011fac561b9dd591f540c3bca45e42bba5af38178a670b1f4d2cbc535ab23256636d45eaa9ca9ae3c643c91560ae3e7e0d7af5c20cb18dbd56ffd191b90e976443c5ec1a1f199f873baeebb44526add88ffa88a426ba65384a65f334a7160eeb17bdeb3c0860bcfed1e55e9a86c95f970f414233da5ef656818aebdafc81eecd46a4a8ea34657501c5395e0ecc9ff57b0ac3ec5ebb10c4307add8becbf874d712ba8a487f5c058d2e28a0884c833c797ea276c13db4d5445d745ca0b591359f93102c8f6e36e9ac8b63dc8ba34c123b34b625957d3812cb032bc9fd02440aeecc40f2f285432762a5f62781622c3c165a058cc99666353167fa61d3840c686d538b67bdda2d0b258a0e217aceaeccda60db84863a7d77bf44c60646067313d46bda5ef95584619fefb8a2416c7b60f35365c4f0856ab0f5b9f256ba5713a6d8b4ed10d9b2b6624689192c18c042c0121758387d36f6e2594825220419047b3af606a21ec40fbc88097ee086363f83f40148d6d1dffbd9a182c1c11d4bf2a0b5cf98d6e73a213627262875cf0fde1ab819679d961ea4c79c4afeb0764f4861cda27471926b8f295e0487d829254cc69767a7cdfbf16be8ae52c9d3f665faf8cfc6986e1b1d9b5763a08360081494135e57e7526268f31c52c29b799ad883ccea7ad2e3874ffa2d00a8a372390c2cd342bba8f661962f03ed6eba3aed69a9dd9afbff70c3f48a417b8266acd7ca398b1e7f343eab1b7b416bb7bb91f22c35e05c6dec4f14ccb64868b079a942b49dd025d37f1430423c284d94191ebc74801bf05c9a8571917bb5bdd30af84a8d73013aa0e40660006588d46c86572765186fe61e1e0a2c68f47df4466df2c4368029e52b76065a6d2a61fdb4176ad77391a302d9ac03938b00c9fa73e1f5834ab6437b824f516991b59a9a54d2b9339db884f0438cd60caebdda30ff9b9812b77f967d5d92c2e6c1e2aa582ebff2baa99f5d483a4692e154b2297efba5aa4dc5842fc98fcf7d1553102b966120cbd936eedce70b6c5c1eae62418a5212029e427f578d64f3ffd93f6e7b5b70b16c58e4c6fb22919d775e09194d86d4a59b4e484d0812e06b7703ecbcba56a32dd3a612ee837255e21ffb55ba8131fbb86b899b9a152c28305db8bd4f0275a07c444cee312c7a0765e00775f750abfddbf2040075a61332d98362d49d9d982bccdcd01ad2e72a2c7a08f5db27f462387e00ffc46fead5ca5e3fd798c4b39f3069fb9c69c5ada93898a28dc719ad36774320d89c93745872e309eda2ccfc1969b88353f2e8b95bc5efe201ac0508f066e35ab8d90eb742a0c5e990f7cf3b6abff4f659006ae5cda1800b9549b2f7d9b829c6d687ba1932c2f816f96f155e116595306c1d738fd0abbe5f6abde79754b5db7c4cb72e4ddf424d720d4daab8c96c3d8c05e04fd70c5f4c84e9abd7786ef30686454c466c27678b37e85dfa2c52777fd4b41655193e51f268d0bf3a0727548cce408b5396a44bec045d2332ea07f70d55c494b237442cd3f2967954a6a9ceeca3b4a008b0322f9de1af183a71659982f04e5c2b192a6e035d7e5e291fb0211ac791a75481c051ea12dc874189106de1afec330545ecbaf0ece5a5135bee108b11d5248b36847d8bf0c6514b35620ade9cbed0c87a6c6fb115337482d150f262dc8414566d853f163a33444a64db38efb5bb535d5e8dfe0ab29c94721e94cf9161e53127223f29446f63d0712f3944b65dbd4e0f9c4de0cce0e0a5cac293f3ad890780f3cb7ad9def2ff17e21f7158ddbf1c467eec58165aa7dd70815068c3f4f0291704e2ea82874ed15487c019f873fe493baa9dda0c9d874b9d7d2ec34b0f4d55e67367f56ba0ec865620943b58a1ff00a62e4258e83a86f51b4768b7ffa7bef28105b35f1eb3ec198abe491853b4e4c50baddf6a9e68c386223712f382fb7b37adcad53b02e35b4ad578f4454bb0ad5f0a515144ca5057c899ea140e24db519d8e8e2a397936dd2bd5ee31cc88c410fc5ba938c8b8fb47e6d42fad96f06a6f9667f24c8d8b50b7505a7624a5eaa35e9c1f9829ce1148372e9bc6077d68d436061027791e89b4006d755b17f5a477190f801db3765cdfd2e1b0a482795af9daaac1e5bf500cf1dfec0016264d9b95936341e80af93110a9df2070b85010eba3f208714cf89594697af77772918c49d497947efe396b49bb19395b54567b06f25be3177e3677e3ecb96209a9ec29cde126df88bac8cb712cb6a51942a8c7141b2d8cd321a3ae3cd2d58e2147593d8e1dbf15109038d9763e188b7e5175c90bda95072044923c72c20f120516dd6c39796fbe3b72da42b5a06a317e0af5665fd6cf5e4c246d3b04dce9b09d1ee8baff63dad234f2cbef54042f71821f73776b90d9240226104f4f1022d21ad3f6c4df5e8fb299c2e5de548c194ca1e8c2baf9aad207280c7580033c447a282cca101d78db8a99c6f927f7afaab08b9dcfee7bb08ad7e335cab4a1fdebb1313187df41dd38997896177bb0a91d47b168b0052f8daca263489cd7e37798d0e845a7ec6de574b1af5281df2502c1cdaf1af091dbd0f07a52fa8f91a0dd0cb4480dc6b06ac6a283ff55080ac0f37eb05f7e50ad1d055dd2fb2437fef0cc81d2e26a1e0e895637573a8bd5855f34c68a06d58b794ad97852c52d31763e5cf04c9aca24e766a557a03a96126fc3b4acd6a4875d53d6c68dd7c3c917ba3148ebe0769e284f8a1f04a9d7e263e1fa080ac60c5976320550e67c7e6ce5326ef0033a71645f53f61c8b1f0b6933cb2202434dc7affd93c9d104efeccb7aee1093f53c64c69c243ea5b85f1a8a91b308c1fbb9ccdd8a55023d837af7c2d80b0575d287c12a7b14d5a466258d527bc574e5633e5851c78e10f449b9771d61777ff781b527c535995bcc3cd546bcccf7385056bf6dbb8274759d9474321ae6db22fe6a3c7981d247328747f3db6e20030b9230d6f385b7e32d9a56597c8ee98deb428dc8ccfc7871daf4762198d0350a95a225bb2815a46c8040640b994eb3a10325e83e691c169b0e9d9b2da78da152cc204825c87c91f140ba9f7955167d811fa5df1689ba78bdfa1eb86d4cfa1a4f2a0763256d7f63f766719f4a4318d155c16298bea7928e105c41fc7d72b21b5e642612f986b3eec6acd64b3741a186704f28e16c45c550650f685205b8c8ccfd37896dc22984e025d40ac8698a7eba0ebca83a97502e2797921efb3cb6e89ed2c807971be1e7b0d66f6794f58b10c9bb94c21e450e3e5fa8f9e5780e8e54c87adce90504751b5c71876f8511520eba3cdcc216fdfd97c297fa4dc2dfdde3dcdd83dc5ae3c182b5acdb01da8e23fca41e5137799a0def372c3d762e346ba4e428b3850d92a91740f2c44310711d39e924582a6d6f42da9c2ed8b0a6b5d182c39d3a76c56553066d4199c318f1dce8981e7ac87ffe1501d3cc18f0a177ec9770d1f1d73a37dd0b572cc87f3523968c39b03e1964df684b13cf20ea2ee4601cbd0eaa2eab78ff4588b785e2e82d1af3a48a9bd051bbeb70f628cdc04980dd2e94ca1c43d2ded6d8ffa2bdd26df2e10012cd2546f8b06b8ad12661a75c2823ed454c09d8c873a898949174dcac45accf5c887bd59511c09ca6687fbdcb83a27855bffcc917facf3742069267b18329749c1efe98a050d499df1815569dc1c11234a296cf7412db00a8656192882a24e8f2ab8490c79a527d1449f0f40c18b4be2052ad906735c77d37e54a07ce174d2a141310985a66f78c167d5adfcb49659c678e2226a2d86140006d5151740c9a85db8e0aa39e647c4c01dafe1d1d917454d47286844334b5cecd0e94b33ccef35a449136bc7baa74e4a083dcdc6a811cb7ffbd1f8fa2e318638c400f9fc3654e955152c6fb8456894bd3583a994598c762f2ef42decee91a3a3c2144fce91d6dc632f5a59a3e9ddde74f4767878657d833bc74654da9d04cfa47605081424cd89ffc635ead2755e3169155901731c6b07117ca83caa3f1f984b6ae1b545170f521a7c72f29a6ef79fc9ce2e0cb6637710a94178b5d45649666da72ca7ea377914ef21218cea1f0d6e1a3df07557ef2c83400c674e13c64f59e57bf5f50309bb2b2842863cf8f151d8f5b7a762184a84b3c85f165f3f0a81f2e3e19bef9727557d98b973c9b05b39830a58b892e6bfad3fc9083b67095fac8a2bcaae9f5a72aa9e0eb7ed80a4bf20a27dad8e4473cc38c64cffc1eaf501770a0902e463219ba428add4e57230b1db061299b8a85481faad1152e968d5c55e49b8dbc2124c7bf8a775d3038b94e02824568dc91d1aefd1533b4efb7e817ccf356ca1dc8cc6ead2c8954a44b0aaabb2fffd27c778a446be44fa38b425023aef40a708841bf562c0a5a18d2479c9c7263f79c694e6d55d488c17727d50d62df5a50bb7188a8dddc45f3be09b4c44256a392fb8f1747127f7c7bf2da5edc79dca81340784c89eab8f6dad80c4784547a7e4407a60607c3da5682dd658c2f1ade1cf6aac44798f776febe81812f7845de242e682c34b14cd82b8a28934df051c002c11ebe8d9547255d82f1224b0075a7a936a24b2e59ac9304c0e90b2bf88f629827001a6628970d43f07a87ff3c82e49eca8002bd46b112dbb8cc3061c32612c2d2c494ce6a7f2c2d1aca6ce1b66e089f004465b72bb2b0d90b79c72d0b1c764d81b8f01923cf2489d24a84c5fc0d7423de46efe82739883f5dc06f55fc398f6873f0e8d951a1d59a38d4d32fe6965960bf2793e5a5ad28d3bb7bc5bc0b550db8222557f458cbd8516eb9e2ab056c85c2faf44f8a6c22d798420935d15fa39580ebe7028d4fe0ba2d43fcdb7033e7365292d2168c0d78602b6f321baa4494e8e18fd66626204cc906e5d6bf5b173b7356dc4a6436f7f1da13576b778005ea2f6f02266451fe2592aa57c1e80b0242f647d5a82ee244bbbd79ffb747366708ba0d3a0740466c53c73564ffa37ddb012e8ada2944f04cc876b77af58b45bde5bdf00d11f549c3a6f49c2341f0d2b46f4d5c9521150d7523ce35b5a906d672ade0362680dea9ccdc895ff5adc5be78341db9fa417abea3312fc25d2c2aca2c0fcd106ab899668d3f6842879082e419961b1b0ef7cffb7ba601b0569c90d325f93054599dfd9be7cb37c2939474a7f02300cfe8c740998a31c4589580bb2a7dbd2fa7668962f2c0892731e104e0c539dfad2e61c18fcff826e05c15be8769a5d9cf1b572986f0f97c1529ad69f545868235020bea02eb02071ffd1cbc40b282a5d3d69da5f46d8e3e25ebf1b2590558ff80c2e7e63c78d07df85589bb60947c165f9f2bd78f7f59d6717c33c2a7572546b6e6b3e009b981a87c08276909c43a223af87fff66e263303481e07dcaabdc3154da5ac88c50b311987c53769919f6e6755e1c7c8db4971e4c0384e33ee18eb31ccc8b543645419e034cf1aa7864c42e79624e01bfa2daab0b48ba209841ea66bf8eca247fe2242b53805a251a9950f484a800669372cdf350f596f98d2e772285800188f05b84c68aee458d4913557ae2b5f4b7c27e727ebd14b80e88b038969ef104a75345657995a8fbc57b722a350927b21e75284a46bd0e25a8f97386edcdb2e1968da47f20b5f300364b17ba04b5d2381ee78e313dfcf170c147088e2a655c3022af404100cd4e3e02491430273fabe88cf340e5274c9f8ec32e8d59f15aceb28d1256bbd3bab41b6a746eba091b708c6234f0a780155ecd653a964869ac8d7da779c76cf6acdca04e9578e5c833ffe3fce08962c83e40c0b439cc5d19a47caa087b291bb4860901cedaebd3214302b374f060e1de0d4380e5bb3f96b8ff3ab3e76e13a5899cfcb656bfe1c6fdb485cd3fe1cd84caba2a96a782f0354904b03c0bca5e2adbf6c6dc3cfb3ff5401a306390624e8771161e97bd591775f3132e7ab5301af6ce3055de602f27e96648de27b5127dddfba0d2fc0c38e1147488a8c3d930dcbcc0e170c0b8489f159451a30a916d113175759f004c08337b5bdbe39ce9307f1c881e3fac36bfb3007e14abbe97efac6fc7410511bca422ad0c09c50ce7281658935c489013326b00a18d1267103d091a131692441ea79dcdc039b95a8879b26efc2c25ece6d963a477bac06a01b48eb9f78a429eff70b9bfe1093bf7dcfea7701559df8e53ccfad36378a04bb659557d7a8f1833d585972b8b6368e33bdad17e679da15751c6b9f61ffb0db79586c7e7b8a0c61c839610dc9352fcf5d5d6af5e86a5fab8f7de80078c185863a423b8649af0646d40aafbc4dbf25b950ddacec111551a43c4f10d355deba56479f3565fdd83e5f9adb1916c2c66846ee0c46dd490c155feec41943f44dbbc48eea3137d20bf8e9abf7304c6a7e5809c7b2f1244c279f197b60c3ff2f29845491759563ab9cbb075fd839d1e99553bb78069b73db361294919473cba8e4f753a0c6d6a06e6a586c444a981cee6dde8b53da633d991e149b1815e67c2acd80dccddf962d0b7ef9890b4631b200015a56cba723f9a1dbcc5f2179f375f516065260eee4e58f7c508bd6f991139512185564a34a58d5b87545bd6bcd9e828b2d46d0a319b4780b076e203757a4ea6665af628857f0b8184df6c5dc1466223b8b14727109cccc534c94b25f5e103286d5f11b60e4fc4901f5a099684570f9417b339a56d2f4b6172412276daa797b823dfde83705df4d9e5957b330f9c4534a5db538e2ea942448e972d338a387ce5d082470c762d8e795b2b0259ae2a3af57ce6903a01f6433dd44ae11b2badde826169d1c3f2c8f15026e71d0ec151590e74cdc47d9cc0b7aef944e978c610833b7f9bb789bfa86e233e6529351f1fb3438530f2e54c49c96b716b2a6b22122d87e1751cc32076b285d1eb29c606de5171701ca131309b8480c549792cab22c76e0c3662157108a69974338e25867826a087a6ea870d381a59899724ac43d3d9a31f609fca7766c7fb566542b436d4319706dc6faa4eea0a8d68fcea5c7ffe0bb56c0b4b09f3831f4eb61757eeaa8cedcb229c46d2984d50a64aed612fd61eafc07722c96a33ba6cd1879eb7d1dbf700fc22650ff23514ace55668796e64029b1385a5fa75fa6bb4002a336eed26691299eabe89c272ba4448b0e9b1e484d647cd7b506df4d3ecacbdb1c00dfbdf6d2943afd0d92f7a38a1ab3a4d5f6d88a75e1cd736d5b75a8f87bd0a0d1cc69771e3457c78c7103f8a5df6e08b372ed9634b7cd2406af1ef6caa5fc753358caa57d87b1a0a9d99e47e5460137d6e80ff59020cd11ec8033e80075827da82b7700217d4523f3bec751e0675124724fb29a50fee662e720b703888c7370f1b15631d52013884853889ac0ebb868a99b175f9d0263b687c8a51453bbd841f6445e7367f035f630077131a3e84f03aca4a884c13868d8dc3dbe9428537a714dc9af046bde324a2f0222daa77e541a34ac75db57db7ffaf00c69ec3a7b3af24327a131208a3e39c4f415e34c160aeaeb4d6f07cde3b06751ec1aec3f2ad83ce795bd141e63c5dc1ecab0cfc413f4ce3130ba8e5158dd7b7d56fb2deb2c8ce46f0d35d58ee6199b3c7cd7156774a8b54b73ae76e7835c478d561490409d937a24d4ac4a47eebf342a80c47bb907b627a5b8e531c98d7e5fc30c4528c8956aac0afb4bccd222c349eb75095e8f1bf21014dd75dcfed0d157b1ea89b96d5a100a5d4b448382787a9952bcbb92ef63d7ecec648a66c2f2fbef4ca069fcf0c8404ca76593eef868a2ea5c44aea6ce3bb91a8693a6e92b2e81ba2b860eecb645dc1d8ac467815a298a8b78440a4afa793d3ace5a798b45d54eb3e1a743a97250fb791e4454d5319f898120fc2a1daabadd690950f3b01b68907679aae667b14da66537ccb43d7202b2d6951776a0f2635fba917eb3301e2997b0d9d4d10fcb99a2ec07b1f961bfc4f3ee23f84ef645644d310856692f8f07f7753ddbcb40c21c04ed4add0fccef913bd1ef5c020b4c7d1bde18df32bec5f866ed131ab566947c05c289b8c392104a4f4d3ea7ec7420bcfaeedf97282a7bda7d6663a52c14c16a3343d6883c164aa3f669d47b90ff5b86ec30c0b393fe52eb18982ed871f1d567880fd3dbe26e6cf7f1215cbbb7438e0dc9873639ff89dadceb95fa45e6e139a79333a7ce787ad3e7bb279f6be26216fbd5260d690282a76501b858e551e6791ebecc11fae777937779b85451f2f940a3e785e6f72ae17033fe62cc4113543bce0c513719b875b5e621fafd35500a981e3c01acfc34b349e6ea127131091ba401087fd6ec97eb1870556cbed68a88b94f6672fcf7ef5a643f9ccb407d8919ff272ea0d422ceb98a2126ffb66a0682eb24b2f5f3b087d33e95cf9e013389925db77e8c7eabf2228062c2ad944e463f2942fd9c3ce788d98c119f9926cc18bc66145b25643b712492b28ab0fae041a1328cf5f1357f7156bb0dcdb35fe54749c8d78eeae2a60d3e084aef71864ae87c3ca362a02f978a02634478706a999a3c7d2fbcb9cb837abd1aeb1d03b1d0821d0528a64eacc4ccbc19252046f7e89eb67f40be3869afb2cdee1197401e4354fc37d4da993b9b53ced4a1e4019ffbc266d0b04b9c1fdababf7674d35c5262b0fc6de3170f16c6e2971f7dd0a1c7beeb35a253c64cee9290feb3b9340d12f9a21f386bb11350be8ab4be570b682bcdc368de353da116b22c1155f162ef4e4e8d0f13cbe618bd09eb927ef24d7f2789ba02acfd08b013baf03f1dda1eb146eed50dd1367011524787cc1833da18513ddd0cdda14cd8ac1603479d8d75fe1049044fbc61fd502ab81367de271d8cfa8ce10aea6a5123c15f20c2c544a8d9ec48bd613385ba571fe1d06d5a3c703d2e8b6c83dd553d24453509789c5ce82712f5723f4b9e10caa90c3bc4adf9558078244da29bee90ab8f5e3c31c7550c54bbf888c7e4d97289c5f6a8f20b65aa9f84b9858f1829d2cde572a74c21d4a1727da8c86f7f36ea9527829e84474388133d40470ee4de22118b47a10d477cdea44fdb49de5b9a6e0773599a2e6e2250fd05ec22eff6700fd3838c4bcc0a8f90262ef9336935cd701945d5a2780f08df67bee8fdb02befa9e292b0eba8de2ac661de2bf94df92579dfef795301aab731e12c905d8bb62762fcbf850de8f3031f9a0e6de822e62dfb36105b2a0e096870a1e8bc455fce093feec519d949d52b853e8a7d9a714e5991ce48ed8d7f4a0799430248e4ac0d895a5f4833b20bfc1763e81a626dab7f48417e958c90efb181c738eb921c6cc8ada04126f630bcf6a3c0cdf0d28dfce0efb11d523843fc354482a5f22e3496628707b643b7f6b7276a57b8f8a1291ab0237d7abd2499df41a28cefc56ecb63da8f13061ede1a1cc0b20d7594e6a0c3e637fbb89691e0f547b5508d9702580b83d15a78fda3bee104c3d28b8b629f60863c6f0fe76dd56ac8fc64f245d0de8dda5a4dc10b50672b339f2f4601d46dfd44055e7d2870a55f2f156d95307e2ededa7787569da9e873ee744c3fc02992aba9d2c681aa1f6df27038076055049eff918cfd8a8d650a1891948940d1c8b3c390b9588f59465d6c17724af719865380b313fbc11d76610c79b01e59cae6f7cb40698504dc5c2335c91e0310aff6972db4170df438bf2ce7ef5afa781232b058f1bd7fc5719cd4f9717c49f6e58878a99186bdbd044c0d3c2ba018baad23904a3fb5010643a26c5c1bb810337f0ea1ec546eed45f4f3d43832c6688ff2fade4ab25bf46811a6b55eaaac9fcdab0ab82e0eaf4c23f036b4089495cf87b7614c8a7d15c646fe319421775a2a3c7648088a5acd6859631f67c31f374b987b257204490bee94206af7ae9438fef8b93ae5a70b1ea915b3a56e6ff5ca2a43fbeeb1655f31f833912b9356b14362892f411c5a8f7c7701151f17a93cc48b0aba7f84a76405c4ff965a1690d5ee370340e05ecd3310049a35be582f3b808806d21b224b8d7f532451a5aa581c1c8ba67be91e223a611bac2a8dd8ac8225cc8dea4725941ee6aa91a1c72b3f13c17cf78add5082f546178af92138262c73f251aa44486e1a700b2211ef1f9336aab9553a38a2800c2356599d3ff6083fc4c44781e9a085b9f35a135959b54babdd6c84da5a4fb3efe5ce79a5cf5096e7f2a49ec6bd052e80729da62c16595abe268b2ead398b03b6d93b270fcfb7fe5408cea785f63f2f098d1d7d4e31386182513e2a23570e190e6dc25a9f7c4190b54363edf00f202a6cf761193808924bb3140e0eb24e5a1bdded58c68c2800b44171d67952e6f81060c72522e3c410e80bde2d2c9191f61a6ebe94aad62c073c61bfece51130497b8398bb635a5612d3b454d3deab971137cb51403c8cacc9335ecae95e45ec8b7b12ea62660243976c91ed50bb5785c25b62b4030bc2c155bca7c6a716709e181f0596dfde7559a6949f89a4736a1fa72a7f2e9994a77589ed80efa282efa41dc7ef3a8925f0d12b86b1b29ce64345fa8db0cef872520e48b65ecbe9451823747a36e2e356a409fdfd4987aecfb365d10f4078e4f738e6afe22e56a7c136b83346080e28513b06863f893501bd6ead6d6d72e7b3b4f43e777cd691c5f79817d3573eca4f414c99cca6cae90c2e25b46f81203744506dea0e49249e07b1544f67eebd4227d994f3451943c00c56d275e3ea23ebd1c69dd005bb1175596093315b802d12633b780496f45f3e2df6baa5208011532bd6ca6e4e59817700c88ff574c467009e072c9b75dbc26a438ec630e17f408c40c8df", + "md5": "V3owDneloytbpNM78yIHtA==", + "path": "synthetic/scan01.bin", + "role": "other", + "sha256": "ef4380c88a7e0a2df7506640f6b435b153122e01070d7570870ebd2d3367d4be" + }, + { + "bytes": 65536, + "contentType": "application/octet-stream", + "content_hex": "983eeb5ee2cfe94b56e6be5a210110843ba684d10306d1c22ccc0d89e9f685a952ccfccfb183b6e00c8f4e19c99a28f68b47e4f647d4aa8ed8bb13eafad4e764a4c36ee80944f219957c9f82803939649729a2913d75945828b00d9c296827434e9d200c24fdd2fca69ab06d9a0c3d19c0fa9104de9263665ca10979a614555b92b7e312cad9f6949729bec2db44e75673ad7779ff8e9edf73d99e7a50987ee61d5837fbce57797bffef6fd14ce56040b416145bceb0bc2538d4027f848ba9aa8356066abf98509f5ea441e5f08b51ba5fc213762f22da95e2deba472de600303383709eb5e35c0516b6c8d792640f5548b75310a0e105e48c420d6938bad99e893764364e21f642b1fae56c052b6388e9ab87af7a1085f7596908b53bb2d5f3e92b17e978393800dd5e4cacf7c44097a24d59e4b1bb83fe90f585e50b099ce14fa9d4befe5bdf5c3812b278dd9ab4cca68878b47a06f9a10fa7ddbc9657ef8fe4e7f8eeb5250dbc7e3db8545d3cf249a3312f73f1523fc2c330fd656387ddeed7f9058773a7c1d9f5a6a53e0c6218889c19dd2b6a6b1c6bf84b2a8baf44726a5695c9e88c0ba78ecd807c8a8cc845c4f05519b87f6f7f162abe9fc988ada95f12274f2a1fef652487769d9bea550f070177eb7d4b85528cdac0f21263614387fca67020d57000d735c0efcc52aa9196994d701ed2ec50e5cdbfeafb95c4e47cdad2c8cabad309bbde40244c240ba1a9f6ce6c00688c6e881de27c9bd6e024d7555830126a19b6b17ef9cd52817c1d33e9648e3553a64046127d64ae1650dd93a32b886db6fcbd7553a1ecff409e20702f6c1f9717fdaece19b86a049c93f3a6d61add5035cf08db630a29d7598ad433817b3cec72438acecafac619fe462c8a1395144904d98faf1b217705c2466160a6d44181c6e3c344b7d462717169aa6313e56337e76f72f017864fe9d15f392019aabb33984e3c9252852d1a3853a2f1b1b580be1005ee2b7a54afb785e200a1b1cfc5169053b85d56d0236bb9f425692a8c5adcfe5fbe68fd697d99f5a780b55ede257adab7096364cbf43ff10769fc556344e50cedb7ca7b47d6553d6d6abd3ab2b48d75af4e8587472d371800ce3f40582d267f26b748fa65e9007038544ee40c8ab4851026eee5aad4cc034bb3549398af4b78525714830320d485b3f8f04f1325e2f8bb65f58a4e01f72f08090258efb8dcf71b026be6bc6975ec04ca77ddee1b37bf1e34df680e2ba6eaaa4a2ac97151f85e3ab54f7d5da6d2aa53768088171e07c2a001841077b060f807e1999531a35744461832005e3f329a318f8f87cc0f60f20309166526512f13aa0659f04e63783289786a5fa0311fe799d607053dc9bf2254676bbb65417095c8cf4267e4649742b1bc00e491ac27d30b9e2dc54e7c4cd3cdaa3bd9f89ce4067afaf9c374b7cf8acc1cf309716275b528e2a7de23ffeb551cacbb2ebf809fb03e590ea197f4628c711a9f16367ff0de98c5b4e03bc8901d6f7b8ef45af1e57f1168901ee3e46b79f4f285de6c926ee0118f8850534dd7cfcec13d7da60b7877c0c875aef75e33da41d35ff8139e2771d9f32fcebc6f261f3739bbe830f83abee98b581cbd6ce25101f6f2a05810e48dba008dfca0845ea5833922dc70a4b973c53f562e8b86694add0ac0358c7c7d0db44d7c66fcc1b1617246d7c06fd772808f48d86fa7144d62160c43fa3981115be84092a06f1cd248521b2a6c2c3b30c80d2e935aba567f3fdbe3f2773ca12e78677b4bb417ef58292a5d267ec80b3e676e971c116a108e01ee768418bdccc01a2ebcdb95241c9f66b3460763794ea35e495650d0d837af0a4f06d4b6a83e84add0c77ee66f1e9eb98a30648965b52c677b31a846c6b0b61a24dcf1f0f59fa2753205cf88f99c9788ce3556d476d992cc9bd46fa8831c02efb9f2a921fcd5b4a8578f07854fb2a4a5654bc541f33eb6a53f79e7760f4b747378d8792b1df248fb2241f200bb4b9766646d6fd27fdb3886e799d906d28d77a8c00c83f3d42229f191de166e6506dec1e9dec5a635710da51afcf5d87a8e051f48b5e15a8c21e48c5f4995a915c5920c83c1523ae6eb5e1556ae5074be9cf96884d72c1e95dad2ff99d3034173049b0a870401419178a8170bf1151770d531e914a638c352518b049a5b469f2af7114331a10d7e643e54d0fe77636eb92a55913191df1c554ccd0b2aa2c20b89356b0f2b43b786e3ff839c4b528fa79f9cfe4a864ec31f9e1400eefa05db5a23bb4603802af204d549b59c6fb06d15655628251bee53347974dc9b23e870110a7dd03dc768ae907c17a070238a8e3bc47bf9cf85881bd076b3fe0119533de191d3da26a3ba16b3db774390cdfe5a799c0692548098c06310b58a6e27b308f0a83fa24ff11795078ca9e749615e231638c646f0321e94b6d84bbedce6e3a386b1762eb2a0da80e23ac8fd0bcb75f5d09ff6ad9edd9b3e50b6e36a0f175af13986af702e7f881cecc6820bcf43da255cdcb1aa6bf99ed0ea1c4415c21ff5c07046a6f9983b529c1054430e6d15781bbcea7ea143b33c3088b04e67bbb846ac50c068597056483eba0a24e18216e69bba1b7833cc9fca4bd368aa56911adafe398c59b0d18c2f751f81de5c6a354ffe0fa5470bb2ff8e620f6b723c1ff5e218fa89aebc66fd7a8c2910a6b9344b22cc90b3fa92e8cd87e6cee77aff989730969bd0894996f4371da5ae098f9f6b2fd863a9ea4c758221ef3bd83258bdf2c852e5ef24d5e8d923b6c314a298fbd57f73324f860823d034225969760f1d6cbf1550997c8096ccc86e0ccc915009f31831902aa4fecc3d92810fb0230364f52220c771002b46d927891147a1dfdffef322b3643c500481c6fd0c6bd80d6208cd2cc67fe351004a097a1695261da6da01c9d0228b545574a281a7bbdaf0d1ac1525dc0c3bf16c9826342ecff7b8fedf0769960347326797ed8c9712303f7284af380a3ce33ce428d13b9ef3694d651cb6d2b17e3f8a0c2d62c9bca34068817eb02e00e7808bbb53323fb1f017d147eca44c6baf475e74a9bc70f316a20659510b90fa4220869e0b1d64d07b75928bde0ff471e5035aa54dc8d788041bcf4f5b3b62c87aaa00179d9343dce5133a592d185d15fef6f6afc6fdda7ecae3fffa39c65e6483cc04d54b7d5c76758629916afb7d1264401fb6adf5468c1665d65b6bf9979f9d9cc6c57c66255e048797bfe8269bbbd6091bba068b69523f72d2a249f9ea0b4f535d92dc8023efac2c4b01c487900853df216cb231ce3e5e68dea84521db99ac07ca39c19d2ba8684f406869d30c79b450b01b77a3e8665ef67720c8b33dffc693e1eaf502585bc23da96b85e072bfb1fc86eb58520e4f0e5bb15663fe72d55edc025e331b13f8de4682ee811cc5f6af0ac680558201ad3b8f47ab91207780d7c7fefff1b47a4ce3e51ffb98deccc215b3a3dfac8d9083775eef4a75d7aa0d63071b22f9c8ac8792d0810de41dca78f8c907b611da44504a932663fd27d9f2b0c5bba966abe21340bfdbf9c57a641c19410a60f84c14a0349c416d887201d2f5af89815a069c1d7bc180bc202f8ba9420d73784a910d81e3ad221e6bf2b28e841697ae97365c3df9e6a5c9c8c9e9dcb871398bfd080e5c018f1475022c37997800d22a93a37fc02562b65c17c2be2542da81bb1b5a6e9bdeb720ec313d4955702566f478663fa5a2f3b71d795fd9ca6dd7e85d3082cef2821acec0a6b1fa088fa3816af15f39a2fcd0d13bcb7ba00f00d1b8c86e7cfd14fb93b8e6fb0927f5297180d75b9c5252eaf70256c4fe9e2dc60fcd9d7f8842e1a2c0632c3f1087137d876f76a6d3727f6802fec60130ed0aa33abcdb492eaf7df6915378329998252290d466b64b3f6ea2e506c0b75c861ba1d07168e285a0a8bb52ee796bf6f2f4937d7dfc1238a19eb2ba6adcd9f50991f3b733b232564898d8a127e20d10bc9faa773b41ecdf2b8fa29ec07e2628af603a3bb6d9251a6924d417c55f34b362b334809e23ead04506ef6b78dbbdb133a254c89ccf21a5690cd7f29f4e609a1d6b2aa8d5dd156ba013115a8c45c5b651ba7dc3c27ff6b624174df8401bdc1ccf8a71cb5a2c71b1d280a1400b650342f06f88d0616f3712a5b497774c31425a146dc49879961e68a789292ce532c6f99b70cf5237de2764718b928650ca4f2645b2e2643d7d017b25851d1c0a3c6b90f3d59e648ee1f01966cb0d1856fd21704c61bce0a03fdea6a62bf917233579f1e7322ae9fbda2880dfcae23dbdedcaaff48ee080abc7f003c264e6691b917c43fed5871c173097ef7bba1f09e9250f9afc451d594e4335bd353d4944bcc6773c2bdbaca48d79d856a3428a3aa21fae333e06d1b2b7960ce3d61d9b2578fbfc6d38dff97763a1175b9266a073125756e406f4caef38f370e1c594664712c99b233207f0f0f8959fb65c3395c2c7a29fc4a838b1b0d24ec2832de31a9cb95e3d37f41fb6141bc78bd384557d794c504e6e164449704bcbb1c75b256cfc1a47b763e156a91a7b4cdc562c35581b0252154be74a43eb7b4f505e07c984e3aad74074a1dd834ea82c0d306ef716bbc6536e8edc0c466233d9c5cf309adc1dfbfa66ec7183e7039dc1800be7ff0bc50105f271789b34768d142e3ee38bb4d82f340a1803c793c1cdc77b03e1b8071c582701c6640f2a3eb3d028ef17afc23fc4ad083826d88636bd0917a72c530013eed5941b3f71849f0de5684f13fc6de734cad03886e1813107c165e6860aef4ec506ac96e5f25b4f486e6b1fc2fb49f974191afbfda6de5838f5c311f526fe97f193f4fca63545973c66f030582b18c9855b861577e190163a9b1bda76aaa33822ef7fca4bcb7fafd16e9784f9dabf65d73a6e5cac5ff98783e0592457266f059f2de7fb785afb1723a9284eba0015b78e08a02be80ef5ca118aec8228604a729ba95c230d0f7dbbd5789bab8acb97b820a19faf79bb23966676b1937e7d9dcd469d5f4dcf24c0a34efed00888e9b4e43a2e718587e589f8163dc7e22533a5d8fb08c75d006526c3f4dc7a6c24a07f8af2a9c363b5ccc6026cbf57302f9df3c4466dabb6c0f585e1b28e688e2ae4ae102b2ac855e6fcf6b5469887563b2563cfbfa6b802cc81ded380e808406c52be80cf1d76a18ac27241911c33e21a24ced48aaa4c6ab88bacb5bf3ff67487b0cf011f5d816c5e4fb04eaea7834cebef1f627ee34229a4fa5aab8d4d5f26da0220ae34a152a9624cd93d4ba3e83bea5db233f8740416f95b8940c29894ed5b9e46cb1006865c69376b508f4e2595b1f162b8903dfad740b21e3841a5f2b05bbd12db99bedc8da16c7ccb5368e7aba1fcfca67daecb81dccd04319f9094cba9760d6f36454613d96df6adf3785ff4c0d3b21d0a0cba73d8e50e229bac047ccf11349de8cf3b9ebf6c43641d71c7bc819218773909010063d5457e4f1713ae730e3d6ffc11ed5eb9eee0df92ce214e0dfb64ca75281d75e423caf98f58aab6b788de011a55e987f0e573b24cec1c0bd8a5121d2d25cea92961201a9e46acdba18386cd7a81d7e8f74f95c3861e36d9c79a891cc5c831c8e456087d77bcef5b8cc88b0b1d34b517c1c007fc710ed8f74b4f3f39e3572c521b4f1f653875c84f8bb1efe88fc7afc2f0b2d44d8b675b0c6cddca80232e91b77f8d043201f18e68535b844c08c10d7822fb614198b5c1b9f8fc9338ffdef41c4e73973a6ad3a57c2e8dec2a25170caa153117e13ac68ff5dfc43269aef8b9e0fe5d7cf20230f6e7d342f87e7cbc3c3935e91ab8e31c49d06a662f789529639534a3e0a1ee8ec350889963be9ab02abf8a5ffe70d080a7af45fe6c7bffcd2459f1c4018eb08704086d09dfcd1bb9f46773442810a1caf5a28c50d707c4989700eb3736d15bd089612b7083bd1735869aa221adc76495947d1a5e8a8456549854732b66582ba54ea558aa5062f0758a7a49e1d7d58781f447c107425a77b407a44c19c4091ffe0277004557b5fa007bbce4e4b88f65abab598e7adef3ebc9cefdc062f97e36b27ba447a3419c9eef6712af6ae5cfbe341ce20da39acd453c51f67340d7a898cd3e5c6ea9f2c3ff574d664b80de95c12a150c331dbe315bc47408c8d31a9c78d32f27d32daa9fbdd14a4808391d2e61ed249d5c7c8993e374f6a254ab0821580d57f88d9b6b76eac5d06a313907359749047470f1d67fd530ec2e91afe204df82606537f1914bb3b4e8f0e15d7290901fbf6deb65b406d80fd59ca37cf4a7d6952c9fc241fbc162ced981932739572432280b3adead02168c56291d5c71897882bfca7ee0e1d41a0807c3b1b33d424fe683845cbe3b115db17b4e5b863ec4567de438095b5f51d8e91263e620f9c13ec390174006a0c096b5ced72b60d08b674da50c1da3b8abb5617a656ba7bcaba6db51f9d2a9583e30381f6e8e5bb3f65535863be7aabdb004ac052bca8437346718daa2b8d2e2144ae4274272b0cd71675cd3ef8afc3cb901786a7a91af465cac0b333e13b1fd1135cb2c878a65c60d756e85676a4fdc678cf3189d945f573dee500607ac745d5dec91fbe542b1b10c370941aa2d842686a65b9f09156f1f4b336c792a4499117b10a1affab24dd5b8d311fc1778dad1ca17be65a6d516b40171632e2afbe4e17de50c0e5379e7b41922999234ca0ff70d301cb364b29ffdf0cba2344e02f5902e3682947ffe2433c650cb951d53394a1a621bb91d58bbe3ae3490d000f432501dd4b4e724d23a216549da4d05924c816c236ed7f7f5fce2effd13ad688a1e0968ef3f7cfe43d70ea7f2991d87df5598ef669bb455c08568f4291a30b23810df3cb3a909abcc764a6c852ade942a253e375201135047096dee2a94f6a89f1269cd15bddd8bcb86126a0a81ff1db0d39ecd6d4c0df66e333bf40766637f8a62aa081ea26387a4808fb12e367f1d98d15a16a45c4447dff0b61a04d59d35e59b48908bfb4853542f12a94c5623c8a50e06ab31461dc6e263050eed57d6e959c5d7f959e5a641dcc2c65bebb9e927b31caf158edfefe1a0380b185bc9e79cc9ecd7bc936e3eeba38a441089217cbba627737629c4c307435c38913c7ba8537b39528b85dc5466a5f777741023198faa78ce003e260c41e5e79a7a62f53330fec52181f8edbfa6fffd29df989fffba822812ba649def1e5ad34f47d008eefcd9c1e6a4a092f00358c860ebd3ba78c20e47e619e7cd555fc2764ec2d6b2162ad9d803f992f3d334c22bf2424e6c9d8d4858214c6ecc3002d6d8d8d3a6d627cb5dfdacced04892edf6e0042ae66b013a50a1cd3ec94ac43e0d65f6f9de6c07f0f110c6905223558884019e4a5f48b502f54b07ecf2043529418660c9c54825ffd4da7850159d3830bfcdc99cb36124d501d7021b169fa50bb9ed3a8de93f8b1768cf5083db0a8f328dfe20719a01602108ff72770f06b8325c55f4d14cfe4887ce2114103f909a7455c9d3c2a74e2f7844cfeebb12290580fc853dbdece9c15d2c59a43c67f8ef869cea4c7c9115d4963decc0f5cd0019ab7a64234ede078cc01bc2d1c3df94085a92a0d0e304f256578352b7814ad68ea3724a9a4bc2d2f122d67de6ec91c169e26c8e45f399eab3b049a9a78940c4ff6568b1408c5f05ed4f423a7900bffa85bfe0d0b37f1c312a55a5b655286781f2b9f1a3da231e4a291d97d2acf023ada5b696876581bec3181b5204e0a3e5f56b064fc54c3557a3e6fd6b44553bc30db9585d560533113313b0e76d765171c531f42450b5d7359c8a1594f6251eae7826e5e79552cad5d344e7f2649f57f39f3fb1c3f27e2396bec1870d304ae50105f211f2c3214388481dc357a0c8a299195d11cb23ad79118627deb864d0e938c02a714cc45994655b0c0216ba70f1ddc8af3178d49647653b9331fe92bfec8caced2613d666111f3e72ff180e0bb21c4601d0f3e00f99b149d478c4a30bddb85f43e0ee23b2aaaed6723afa65c6f6e7937888ad42bfcb882caa4c76d49097dc54f232565be8d8ba8f24d56fc8adecfcbc3b3ca2f78a7bd206e0df2fc8c145d0e96cf9ab3e66bffe1e2163f7beeb8bf9e5ead1ffaae7f69b41fe075a72ce644b72d051f1885b0400a178f49d62964398892cf7e0eec5c91a45882adb6042fb34dcaf4821741e632f02d91d2e23fb8284c7a09b1311054768e85404d5a7f00a0ca90941ed0e4dc55f41f75ac58a1cbb22f0cf137237e1c22dee5e6c1a83ac458a4cd2f4cdd59c2b925bfa179883d1089753fb35ab8026c65f2dc9992e5531e13665e39ab980e56ee55f4c991a9acb76d13570083543749b640728da7f7aed2e723115295b54e65254754cf99935accebe087722d942d44250057276cc339f9e7786c278dd30f9fa8df3f8d16778031f4f2ca41c9bebbee801aaa49e0b49d412a1c3b03e9da42276e82e6fa1a72208ce19e600d362491988329b4d5898f29030cc32f87811505f2034644b955e67bb098172a2ce1e0407f2e82073f7d23abcc33d558b5f2206d192c8b855a79057e0a528ff8c9e379858e06cef42072e6d42d0c7d044ea441e6edc773f0eaeb9936361d49b66488402bc3ba04e9f6ff29270c89e0cb1e6d6b9e15ed26bf6f6a50f037fdf0c3492bca54336b9323a5338e81314c71ab40990b020984325dd96f1ec256c2fb82a65287db88d7f90722d1c0b7732575818e2fede7aec2755c069b8ff6586b7d7f5fbc0e55740666bfcbd3f1223721ef520c1993b7a275ce4848e5f6462650fc8a70cf0b0d50ade75e0b531822d2f16ec2ef18e606971b08d6813559057f3a22297a19b326a615e9656ceaeb06bcf842694853c776ebdfe34f42f5d0d35a0daa0ef4b734c2653d5e177e088cf40670135a1c4e5449291d7290400f598137a531a8ea7a3fb1c73194931bc542b82e8a7f1e45d7d649b1cd3d3e31e964f07cebc7af391c42d1299b3eb3435d0fe92713d2579036d0978ed4e614d843380b0c4b13343947e375779e52b6da5f7127e788e11ecf3cc12b9b3d10bd9cecc9124d502624de6f0539fc0cf98e25fc511747bf05d2c4eb282f1b63fe4f052763ccc9142b15301af60fa30cfeadd7efa449d158a0d65e5cd783bcc769ca1ec64f5ddad24d964391698237397b5157a0316784761692c221a4e66c563d5224e68cfc3e76546a474168335b74fcea5a8b212ed5ca060aaf7f6b32ffdd7a5371ca9ac137d3823671f2c85e9aed8e054ea53af4da48a73c5e5f41b4258737db64d2146c7b920dd7f5ac8680cb10ff3f6a5cfa38fb3d7f7791cf04b4b5fb74202d991ab23f6ea767bc78d18f271b29199c997ad6e633598c6310aff997b98b380d266279c3dee59a6bf822f96ec3c4faa9866c56a0ed1c00175cfe1ca3f498657e9a05d8339bed040d49069d63bcd75ef3398ee86f503054e2d53cfcee67a8c7326e22ec42fe1668f0cfedffc21a84c6e1ec9ffaf8aeda8c046166389be8231640f15b5315836779a3ffcb92f6e57f30e533770a26953a8970a0f8287a86fa8d2fa9cc211a51a06e97cdf9514736b130055aa15ce98e8954d774847c8972515ee501f10860c0cc17761c3850692fd61d60daaa611586879d0f2fa40cd98e6f930f5fce63bae9107e47226c1869e639f995b0eec4b1249dfb44035760072dad5c70e01e4dd24f795cb5d0ccbf7e9edae2809e8f0f85e35789df04dc954487b41de18fc24049dd18c9971ea84697e90376df140c7851db4f86a20ef399d6ca2f00eea987dfe7e4c204b84685d3870e32b550b8cb320e52512e2a6df9df3d758aa46287112806184dd86b1cc602ffa32975fb5b1be17c6576597d8b6a14d6d60ef7fc2448eb0c23020fe7971261f13b16dfd9515c581485ab0b8c46fbb58f4712678a9266ad6e6e4a5b33110764757804777712a459340d009602c8884a8ad76a427be5cf6279d074205aea41c867a6ff9c3a6c1721b2d0d158a02f370dcfc5482491ad3d0490723a4366eb42248a60ddba25e650d7b7171dd8189d992a2e7533e3ac3fdd4b36959bdcfcab46a8285ea90087931e20e9c197e307dcbefe740f040c539dc372557809b53ea45a56c558bdaf6cd029bd58a95a3a1ae1b5915e6eaf750eddbe90069aa8509a9d003b148ed96c2b3fe0f45708dcf6ae5d6d67e012a3c5493562136d7a65918af6036e798ee6d997bf2bb27eb79e7187bd9932c33ea25ed75ccce3f4fe09162886e799e17ce3f78197871e2b381673e72232a8939930c1d380ca8fee9472c90af0b44ff54bc9b3ed4c60a51dd95b7025366a6627667931ef90dbaf1857488d4717eeb981f05281ce57bd5fd94f3d30bd6eeb4fd3136f5dd271f8eb79059a84362f24c9dc83b49ebf429f766fbad8825df66ad0488e5e42e1c36509065dd9c514b20df4f467d81a47ec64023ebef47dca62e1409c7a1d3d8eb22e83ef1d52ecabe4df399fb4440592207b6a3c91533d2aa4e85dc9e740b0754809f311febadfec7cc1c760e5982a410f3ac95ca8a96cc2a15b79f66a0d4a7421f1dab7f22bce4865a5e14b1bfc31c726ead1f578dabefcc266168f134a98028ce83bc0a1d2f8a17f8b05e4e2675c380f1811fd3ae964cd8d68a8c62727813e1fc277528b86d572190d0b8c9f45f191044ebeeecba410e38d97923d03c5c5ee0f1594a7108b5f1e046ee26d16517ccc9fe1f1b25db9430d4ba30d6b877af79f78eac683aa44c144992795c00368e068d8d50f70074762671142889b014181c78f4a285898323bf1071472830251e7514a61cadfc9d10a13102c1537c290603917db3b9a7d0e507fa8d6493ccfabe1715d6c0dad876cc752171a5a9e126979dcfde17e76d8140ba14b67a9520d49704f62154ce4b2d656b36fcadcdbc4735c89242a39ba0a408f5931e89f7cec057d6343752e93dbbfce4fc928635968e3f7b2925ae7e271c493dd8536bc3258d7ce3c2d6f45df92befb14a58d6e7f7b02eac07acefe0445215a5701778f7135f32a9a295a11e4e103d2578d11baab09a798e9ba6c790b50712f33baba8267bd7e8ade7ce35dbfc9c665607164608bde008eaddbd634cf594aaad54fa88abd1b54387e451936bd76aa0e88668b0d4f2ac691b8cc2448e58a9266b0ee3e30121b10153a28d2ad726681d6c9d3619c1bd5bb673b3a7a25754ca614207f2144f6d9a39bb26ba727542f50c9430b51430778cfa23ef6ac083df7fe4ef31a212d36680cf9962a5d5799a6b059fb943bab116e2e9ab17747fa7176795b34c03dc43e0f4fa009450e6a2d8daf396c038da7726439a742dcc2192695b4aa7828d3ec9fc74c1b5d2766cc8715650d7c24eeed3895dabd7e2cab015221f1087b8272ea5018c1654d4406c56d05f6185645e1d548d626465ac8133e2f9cfa3458945654cc2455d5958bf104918a27045e5d593571acfffa8511499a566ac774324bdd37d4656662744d4cb80d409867a4f8a373c6b0002cec745e54603366ba4b0120c0bdd689248a54ed694a36f492ebb44791110b1da19baaa44998cc58dde863636fbf3d566d10fd12ef2f3f5933c9b888d131297d869181b1691c590e3ea80ba325b67059d5ca98e866a37cc2ca02b76be339d63bc0dc2ea69f6ead386b7d22c8c4f6946db40a38526224ffdf8210b80335157fee5d54536bd17a7dbfd2b26f1eff914d00944ddd0776dc954c27d9fa632ace3f838d8efc1a2236448159fc82d819ae9b07ac087061c02c93e4614e65f387bbe2af8e746ee59e3c69723c47bad05fcc506ba1c247d40419464d01f2ed76a3f955f866342ad0f928196d5a693dbc862eba287dd561e6bd9fca227b1de258134f777a4ea68a24ee4045c1e9bb4cfdb22306ba082339a2e5b15860be3465fcfc41442ef368cfa4c1024bd12bc05013a8db624782e897a680557a6acb6b0be21787e909207f0327f326d1edeaaf40277a6066742245432015070aebc2b11d32081c81148e38715f7ba2da393be953512c1148ac1388b182a717dad34a3d695d25d1de68d7cc1e8d0f11514bd80b25f93a3d4a24b4d9547784ddb1193447ce48799aef0e32441b27db3273ee3762674e36fb95febe4b717dde841ea74496ca0989ae152a38d44bab57aa02c698f1893190c056d46c8732c45f55b350a95ba5e7a6e7c1fece0f8b285f809fb515be565ddd9a8160e75326e22285c38b9d6c57031b62db5353c14de128474feb4abea366678bda6d26648bd1af112fa1a1a0e097c1d42063e90fcf1fc3188e6cdc99df1c79cf553dda1c8760e93b27ce6366ac3b209952f03e433fcd19cc5be37c8b6384c6d7d80e872fac7f9140bc7c71f7295c264a89cf3c411ce178d36f915fb01740cf84df329d43033a77559bbc939e9e4fc89874ec704d7691f4cc13e43da381532db62d229d2a47a8aee4defc77a497402346bce6359d1c5da6cf73350c2089bd27c1901f431f28a909763ef6439683691aa25a18baf409ddcb35fd7e34f04e4266917b4f132a7c9a856a40c67cd027c9fd28257a0c5f118f187a06bc120229cc92a7fe9e975c8b6fa0bf3fdd75c9808bfabb8bfa8595175e9123b4de220d617c2fea3b0fa7b0456cd5b3b7a5b5467b7835a753b78e458029e4e5efad3362e4cad408ff65d0be0e04181d3d9123b5eeec47a8a86843a6a7740db348e30323cc62ba0736f76bcc788f2aab31fcba2cab14886472cbac660aebf09a4999301a94ba29bdc4fc59e58a64429ce2507074885e95a944f822da4310709aca5a5beebf914a247477788341600cbf3a92f282750ab230673a4bc09b1ac26fce00fcd5c5c674f2e538ca1f306ef3578aba18bc59632405b7edd7b1f35bab537905095d99296faba04497dea67c9e8e469c8e2ea542bbe205a5b9a023e8c3e378025d5dda2e6e189de1d3fa467a5a27e1b3aeeb43fdd14da120e2d035f221325615468b4de384de04262b753c1eec9850eb2c781ac1d4bafc892692b2480bd5f43378997e4a932548525768b3d8a9adb4cae6c33e57022a02fc3d0fdbee718009cb992944d2cc4ba6e4cd545361946f07658677ccd2ddefc9f268c5e76e6f3d72e726188f276202e8fd9268dc48382abc34137c7b38dd94a92eb5fa5d26c074ee2ecdd01fdc7c36fef673e69cbedf6dbf2c8c974428b12eb49864568d485b0173d66551d06d20d9ae2b054ccf78ae282eda1e84b4f3f1d9d7228001518de2e6cf068efd483d47145fd39b52cc7ee9c86ad4a567b5d982a7621e07c920c7b44e02abb79f822fd520a5087fffb0857fbdace14157c94f9fa2bbe6a07032ba01675c7177be9b3f183c4dbde953940677abcac0b34ae7cb08ae1118bef2900f5c244e8f194779ecab395145270032b4527dc14f912ef717f25e57b4b695fad5b25c021586cde7e2948506c112677cfa28919b5ae8b0822ee5270056732565870fc9f1441874d30b67910e9d668ab9e42ed49ba01e50c49dbb073ffbddb73e2a48c4ebc5cd3bc57ef1be0483c3e89da5b5d2ce5f6d619f5c73c7392de6ba09a32d0888b7735f1ea8e9f8380eb3ce6e0487b10ccb4d1af3f85a3bf051b0501731bb69830c01d73d356bfc3a411a222312493b69765a572e37a0aa6d74e6e0df673cb261e7c8f5a192699afa9dc95f82788bf0a98f8d1995660786ac40f0d55197289b96b046e96d046c386ef93971c1c91020c51f879643d641c651782448505a1016fd8e0e867552e8ca5a01aa68c64e968126fa2ff1c5b4aac72799e73be074090f7c6ad4ed9d290b2b4a6756cc6c24a6e32a83eb3d02baebe27dc26dbdac8e6185696297e33fe79fa66bdfed04c81a59440f5caadec88fd4c10fd1aa4dd8e063f66078bb178c136bb283a6bff3df472a8f326e234fb5bc40f356cb0d576bf5e0580903d1d087f2b96f7811a3f58c3c890c45bb0c5029f4a8f3e5ea8f7ca044bf948d69f8838f5050d4d54b523b030a67406a6639a1c6bab3a0f93da586080a8353969341bc5bd4a887058860a6bb2cdec1f9f14275fe5a903c774682d2406cd16d09e4fff6b4069ed68b4886155779b038476faeef84fa4c108a5d2b9221d8145ab92069bdd3d3bff938eb58c78b25950b6761cfe2ef7afb0054c28cb51e74f0c4b2ff4f85f3d22b9bfdec120797b8d61e791346ab11c8f8e5152df6e3985b80f38e85aef1cbade00c001250d398c2a26808868a73d56bcf15159baeca75400c10b6cc75f7ba212816727293813cc30a74ea7df23e85da11f95d4cd81758aa261281c3b206030d586379e741bc45a1c15ffb45a2ea203a5c58e5532dd483db28d9a6a612036e2bd0f9c1b0f84ab12c1d159efed97b84b066ecf8a7ad27db803484d15055d6ce92cb1102b5b1098c777a4311f456e36f02fa89d67ba2d0806c983c14b209ad6be01dec61705c96daa2ab0e9c069c8406ffa6ba5db51fd16ca29d8082ec691372b990662fff18856b2135120daca93ce8ab08f419de2f6d0939fb0e7ff75a52530052a0612e5de6cd0e5ce4eaff51f303af6edc9dce79eef7a78a1cb63291eb8c302fe761ecb9a2933f26ba4e08170595310d85826131a8eb1e3aa2afd8a6cff0914004841675081a496dc0d51db3c2c5a0d438a73d4ee314e3f2007a1cbe09d867738acd00d0943509999b2cc1b0b4c9741673c14070ed0b91399810a3123a102c0ffe787560d26d25aa29f7915afe7240620b657d2d42e581ba323a795ff79ee1605c63041dc236fa075d55e35a0193f8f92486cf12dd97044298bc33c313597eb7ff536e1f4e2ccd94c8d3d81bbfa4ac7f0ecabd5eefd9d0c91c51690af9ada695c069638112a59eab8d8fbbc7a0fc48345275c736a3380b8eb26d13064b6623cc1badc61a5a75a8c3248dee460efdfc16d30346bbab90399518ba6210401d4379b6c96dee4c6568242f2ef397da6840fb370efea07a8a8a5dcf7777c9efaf5a0834b7636654071561ffeef22b1be1b921d35a1304ae984f5db79c0fc182c3e8b17af9692c1f8daaec0e05634b4c97429cd315d8c63333edb67283c3605586ea7f78a8880c7850dc7b69865e7c3d4199be17853fc2af2436215d2aeed2f6d3d6b1673446acc8b1a1ed996bf48b76c723eac5cad45f72d0dab3b509b001023a2f5a95db552f095b06cfb2b9ef45ff0ab950e97c7504a69d18c26671dded25c3e52b63e0bcb719a1185f6bf9836a8f177f5781fc95095237b8a1d1db731882fa5c1cf517409c11898752a137d3fdf0f4da6f774eec6cd47dc886cb85b6c645ccf23f9333c52dc3d367f09fd18d052f9d889382dc9d44fd51b233cedb55ca3a04503e8c816edb29c1240bec77367c3b07ed239949d22cea3d11a231a697f5a40b3eeb7e9e481f39c5ce02c619f2fe174d465f921beabde5fd65234e150a4beed9575d4b6ed76065363d8601ed85f765f73ae0e0f2d4fff022131dbf5238529615c3ba902335e92e7fe4afd1afe55f9fa0e1bd18aa95be42728d886d8f5dec2b1095206aa75dd5d3a1ef4233bc7c00e621b8089f6cf1370148cb4b09320a019496f9802e2eebed5294cf1b97e5eb0e858cde9472b51ed4d2b2daa09d99bff3891794791246ea2e364c1e7e52b9eb40e2112e5d64438286ec944fc8d90c422050c9f414e9d66e29742e5ee668e6108b180d44c41365d4614ad948d57a974de9a7546b237e3c0ec0a1a5f96b4361e4c2e4657c70862ffa36286bdce42bd9f1ccd8dae18f95c72fd9daea306b8c5cb6ac8d9f71c8a3b0caa8ecc1c1bc84b34c3f43c1f83646bf4d5f6b62d35f986c5ca0c73155b385f267acdd4c7603d8cb072990d9ca737f74276fd694121e607e33599e70eccde1cc04152d2416c6a2522fb12b2d4a1097fc4decf8bfc0ef5eb43db6c3a25b35a0f9f734c14c51ef5cc4d95649b9dd7c387bf7d8e4b9950e80d1eba02348e741803dcd066c66b83a03dcb7c0fa9f189ac257f0791fe09076addfc4dc611f032d9e595cef37bbce49376161595aa299b1983fcc10f9eaff2a50e55927487967710d1b0c7896aca3e618404ea0f4a82f8fe213f33b8132756bd2a22c60fbcf68effc985bb808a5ee7fc3690147bd72b2bb5d5dd37e8766ebd8b39434e4e3d67eef0baad81f217badda79095d2b4bb6262361fa59b55848fe5c8e652656c2f4db97081f1ed6548dd1ef43f6c1f27e2d508bfab5474cc96fea86ff5ac1404a89802f27081f2de59237b7b283c3dbd9d23dac4fb7764a5ec6ac428f77cb96408c097548bcd39be083dfedd06ff2ae806aa58d59ed0a0354cbae720a01f346b40b9ec5129e699dfbf90c8542e591593d72f5b5913f939f891561ae949e30b1ee0116a5c13a2e93b88fcefbac50af835ca9ecb11d27f5a694cd09e0793f4b61a87dbab2c4d566164d27225c68cf53307f3aa8128d9b71d8fc3d3021bf57cd7d848952198d11e974a24283f9dbaeffdfbd07e597c978672550da04bdde545df928307fb56308f6df22b26bdcb40ff84ffb9010ebff3d5287bdc1223f67251f67c6297ab65b7b9aff25bac28074946111c8806b28698475c081a324747cfb416aebbbad7e7cbd1f40953554381264492cd05e7de98a9902d3ec497bdaa5089f9f53f4fe913622df49a90c23cb53d7e39c190765b78a599f79455a6722f17ced7c2504eb97b1a38393b25744a10eab6a7f6b47b969692014fc98b30a52ca3eefcbf7d68b8d2c1422f42de33733550dcb4f7b7d7fbf825724115d8cfcd9c2b8d1f1209fbb40bc4d346a5da9a7fa27997164b78c7c3238680cee99bec935c628213bf7b615deadded7afe6389cf255e4bb3fea1644eca35d47303b9ff457b7d7eb94113115ac149a59e70b5d35680abb16afaca192deb2372c34d6033d98eb0667bc45bd900e834aefce25cb40c93b83106e171bd4171181d7e7485819449e528eb89cbc1aa88e949932b677a27c4a5dcabc3349d8354072d17bc357cedea90551b078b2aec764f7df22c226f0e1d4d4b75c810a6d8258351444f3521fde8e92e56a7072a043d161228a9f73d3941cce99edd75df5678dfd664c844d323371665ec90ea80a40300493996f8d33081737257a933a1bf1cf528ae0c85bf7f0e0242917ab7f79cefa7cfce9734a68e4efd20bce29e5406652b477a481ffa63decbb7c3b43bf58acd8eb63449739e69d84991687f752d6b9099d3d0ef60d1a87f2c7b8f7f26fb5ae89e09ca10713183346ed1719ef1f95babdecda353917883eebbfb70e8ae64d790051f131112f12956d5df7a539187e783af39a8bde5b7e243110f4fdd28695c0db8e04663d5515c7a95eaeaef9fcbd3fdaeb93d211256acc321216e3022c5a32874dadf52fdbdbf8515cca0ea2fdc809a661bd82ef7f99a8fc4c7ade8dea9f07ab506e4be5b2b8496123d521fee09e362838a08d0fe48e29a6837d140427e6655a0518be61e0f023923e6953722c148365143c8588860b3b2914f1d623b2057622be09b0684b6f457eca49b5f23514f9657fddc32f95fdadc93ccb0ad4d2904113924d55c7c811c16802527f204f94d0800f7f7090c33b7f65121f92cf21b58c3b2e8a8e3147a59872ffc1980c3afd65b3d913fcae1015177f7dbf34b421b6d31308693e69661c9eee4240df9707d417ac1b04a4f327c5d1ead395b686fea4591d86a60910454f1c13f630cab00ba5b9706b514a7c48a81bc79ab9f9f8e9e665c69423da29ee009b39b259cb51ef979dcff147210edff32ecccb1d80fccbce7efb036e5d4f9886f91afaea0bf3fb5bd772444fcc43b3b5291127a522992ff21a1c2c44ca135c4bb1dc68a5ccdfafdc060fef0030e09f82c72222a54f6f14304f652c792ea9264218c22112261a61d8650585323c8bd88e74cfea18025b5f9930d0e4469ea9274691333538274a3ffbd21e10d2ddacaaf1c465b441e7d9840260c9dcaeb3cd0d7418ce1fd81338c1ccbfe3184b24168e85d3150887045a9685e5e8f39d8ba5fc816b1223a8215da70fef4bec0de69e48dfead6dc2e67ef5cacd3a19521cb8adbfe3d55b51a6bbe4fb7d1c39ba59bae84ce79624833a2d322561e31e355e3ff0bfb118cfac92bd334a428f3341db671ffb893a8e0ffa844c2c4bf3e3fab71958fbed9f459b04f16765d847a9f2d72e2ba37870ac4164985a02bc4e8cd11b7e92e481426b096c99ed44cdc0b6a65c5975718f33aea0244986a588fc0073a4d6eb3507bcbc9b4ca8b1ffca3d0e7848619c77676a6f527968031617c436f069785ce964e168be618d5dc20ba77ed997f6b556f8e95d08d55f8462415916d4240c92ee0330e6bba64e0c3e9494f101ff3786a46341a7123b009fc2486a7f08272fdf8b93b82752653e9b7da0f41a6b9d9785b086ea69edc4bc63e32b3853acb9b10be860197f087bad13c240f72a0b0386dce756dbf093d0630bca069b784145cdb624bfafacdd025ac5739c6d3453b0715535a6cd0a934530f1e1cbdd33d16e997367aad8fffa2cfa959bc10c09f004e09aa7ec647180127ba0bf01c2ae6ac77eb7376bca55120fbdce6194fb925fc10361c2aca472a5d7905fd6062a84bcd2a177a3eed2e86c02114c6d79d80ecb2284f1e7ebe568dcfd0005053ecfa76566106f97bd24547249fc599b14a4a14f81894ce36f514e4f16ad26fb16e990fb8c5da229166306f85c7ab660fcc5f766e44b7b09ca41c49693d3daf04a9848c3a7f0e7b608f79fc8cdbd332b2ba3527a9d08bdd294009f9b4f8137dc35c1f8bd416a407c742af07e90d7d63765b09e12f1bcf4a92b41fbb7f963603c4038019c917035a7fc00ebfa51edd24a41ea82e03b26408f0613fbb6511fb876847252c05377bdf32c1af6ae31440cf3b035ffd3947e7fcb7d9172f2ebf196f4681626468dba1411d980d484e762ba29c4e53e20a0d2877e98761afe16da96b0ac1ef4d76cb056471faeb33c5e07513b4a2a49e9984be21a7319fb336e203f98f4bde57198bb1a5d8e1de328ebecebbba70ba66b5ba06807bc9b068e280b26feab5011130c60effb9e3fdb37fb87f8f7dcb4b52da4412c59b1c1b51939218d764ac0b41815517432474df7bf3a5c6bd58dde9802064b02120213725c3b68dd1d17353aeef45281dce9c8f76e91e7f7709bfe9a946ee4f65d43f31ed99c29c872911abbdcea167571588b26213cb2842fdf04084d9575f408b9da0dad2e8715cad40809be2aea85b14148648545044f16e16dabccbc8c3b119177c1f5ac9c0cd428caa3a81543637e99f8aa84c313b2babbee6f5cb6d34cf6d6b183d9899d1e37aed15264db4a83c150697c600dfa84898678e328a67629d54a5800bfa6b1d38b3c96fbbff7683f5c8ae3caf39e45f83c5e0ab179cc0d730751ba8b6fadad14b67f6ddfdd65260e20ac1936f7c85b441b31fd55f05d8a7206249200934e3ec82c76fe73efd1b5b5a2e92bd6213f2d6303d9f8429ec02da3a9ffc83dc6f27ad0e8cff2cf89d2a2c2882f5148747f85a84a3b2d09345645863a852e2ef4c88bee33c453fc3fee17a0bfdc97249528af254ff757d7fed73a91a1dd9b59422f78c2a09c65252e0ad1499d2a526817686a20e8bfa5ea1452da096b4433e52152f419b5569e143ce7448e202dac8dacf1395d0c2b49da41a76eea2e384f8de6a6b88d4fb40ee8451d8ccc6c77e52dcd225a2947cdfd1cfb0bf6cf4895094b985a21a03262440a0ac200376295c6e0aeb42daec16fa9a3a50ec8a978804613e819bf5848058698e14ad34afad6da15a374a6883be04512d36ccbfae53c589de8d52ab11d4600cc59894e05d4dd0db1504a06d03625a82bb9302470f8e5e5361752460e4822ad40a07209d93be9e4c2af2ee99851a866f9c1bc23b631db5a2f5bdc8006eb98fc302cd38ec4cc3d25064ec69a656f36405e760462291da1f6a4cf87b84edc73eb7e7bcb36a94adce95a3287a809fd0d28b37d8d0d39badeede8d704b0521e93bb8d242e6d86132e2103340818c6df7fbaca3587be0e120647dfebe30bc684f0148211ee3656372d857136fe969de95d113c9c5a0e84f8f99c97e9dbd186dd7447a963fd115392087806c39991882f4c476fcedea3156ab20b2248b00111b62bf8bb5763443743928bee4300f2308459d77dbd2df84eb62c97931c95453d6b2e21d6d102abcbe99cb1ba27d51493cad1913b128f87f7edaa0bf09b878e8fa078acbc530eb96f6305c85a26f7d69249a03835b364a7b9e0c7e70c72bc742d80462a0d901f3e021cef11ab46d17efa061b7b6c006242d52d909de97c35eb8149e9ca2adb0a7667cf9f7b30bf1c8ebd0350d85e78543ec93b32ce6d19c8910c0858f49c2ca79b7181fb4a05d7335099dd730f6e810839dcc5cefcee4a00998706a01484df1b3eb8cae4a3bbb88acaa13956cbb1d7e63e7a4bc5c388f1389ef7ae507788cd7b14a4cf1b540c34a0d52638079b619b1c4a15a872e910bcd5575004d630150eda07290049928da792b7d7070cbab5f073cf35b0737871fe7c64088f9eb064aa3c0d9b97d6f379bf47a2d6b7bfe5fbba247688e900675eb527aa0b3dfeca9ceda15fd80e3b8acd195cba60098d5ddd860fbb0f97d3577542d028a3cf1dabfdebd0e4bd72f336e210b5a58f11421cb86ec9f80cbe3d4902fe0298d155316b4a62435c6d30de3350fc367fa0e224b89e2a26abb354040b75f3c9c9123f1674165a2526185da0ab842d760e90e593b98c104159925ef88e5ae1d5cd5b82de0abd8ef83b9868429ff050e884dfe506a72c4f5dad9996b252361cf02498a182e7d1d9c34de9dfe6f8c9f5014efcb86ed3edd963b6170ff3677541ab5906dd9c86b837746b6b9674d21674f16dcb8525e2d86ed44004a4832206c559409b85371d6f6389b5a07aac63ef2765bcdafe8a58f834ac70f00fed8fc4c7a9244ab4db21921a0d8750a532eac298fac489a7b9c8d04d816dc08c454e4984589dc9d56a667868af62a6c25938678ec55625405fe6fa9dd0ac4dd6c7f231986058fd6bc5f16368f55db234b4a8b8b33956dd72746b59c5ffe643744af16c2b7b1ee4bb1a13b9b63feb9a96f457dbbb43029ba68f453fecc3a74b9467bbd280016f597905af08b4758d2f9ab84cacfe4bf3f3d31ead1500a7bb11450f7fa9b3ac47d6ac2da30ba3d07a1def19307b12da68b6ce12e204f9a4595c5450c51bcbc1ddfb8e0a0348e42f7ff0a5c1196c614a658ba6850ad4d22f50b7fe8793921e06f9154971a5f70f0711350b3576ab55df806cd6b8fbe4994bd4c46002b5293b66d566460a663599865c9b1135ecac021a135873879ff451f7d84b2666a49b059ad9b0cb43d5f7b187f108f4f3729b4db62fe62b58ba3ad0659b5325b1074bd9fd33d1d5986d3703e009d8c607335ba93df65a20370c4688626558c2621d8baa6d62ceb52e49442dabfa636a5e29333c29ab580d5d5e60aebfc3946d5f3db24de2127a492c2748106d37beb6a97fc3d9e81ce1dfba084b4e99005235fd59815449f9fe89067c5f1245faf2d66471c5e4858ee7cb60c72b31610377e821dfeb36d02d5506ab8ca52c6d7b6c3e922593930c28d105950279a89c91a295cd18b67360556f3374774c89212c3eeea5050e71935dce16412c5290dcd60474adbdbecf21258591c49202ba6e9acc7333350ba2d42a259dcca04983a457aa9bdcf1f5494100e59eb4c4723d8b6e16535cd5b876a9188e6b9f1be9c4e42214d2e711c54996ccf8cc97cf15a3ff660f5932410cd3d82e1ddb18a7629741386836698de1207c76ed87ab64bf08a3150a7228ae8fed56a9d4213bea7e38b26d989f3e7757b98508be8c28368c10f39a8965a7803bfd8b26fceafaf297ec5ea73315447f464513b68668f151356140e3786c43427a4704f92f1ea7dbd3661c473ee485ef0f693bc48ff298cfd6f697676e07209b8315053b0aaa8293583055460dbcec5814af8482cda2fd1c71d1ef59ea7605d1a7bf84a260f7dd47bf199f5c63fc5c44bbe94f9eb795db45d637520b259f190e3eff2b9f0d4ca13a3564193ba0e8b16d6e57e2a77fdbf19100967743242339362aab6015df727d243f0c0d34bc780c33c57f01dd85f76dce8b945e4e1f09f8801abf0f4eeea75fa8d11f7426db66ea0123a31dd838dfbafab818f107301d6b018a372d1d5443cbd5db3b8640dd272b4255f2608761ead62220ba09f7a20f020f68822730cefa494a80fdf6ba3fa9042a46c99faf80e205f8cea70496ec0466e2ae4513888fefcbd05b4ffc8bfb02b1eeb23eb5f5984f1b41df9764fa8f0bda8b034da74ce4f43267b95c0cc43e29cce949035ae18d85b5f15c8d2f44c52e721d9127291708615b0162902ee0ec59ca3e377650718b7a9024424feadd60600a121bcf53cebf2bc17d166c3c385d53da43b1dd1e32134ae844631e3681b69405f8e36435dc0cd2528f78f5fcd15b7739657048b605de23e50707300235ed90030e832ab87443ac3c7584e18574e42d8834740dc51a6ac8b10e8b8cbfc00eaf8a460e739ae89a0f5d9fdd0e184b92a63ad76bc83909b96c1c29dc54464190f55085b0889fe17707bd9f392dd2669df4da72a05ce9d98e5f12825e746871a7d20be152e217b520417e6afc3900c1c5bfdbb70f56629440a790d17c3edc591dc0b18920f639f99b57b40caa590522c33a2bfb4d2a4a77914e369bc716b44b3da914b5b06695524e9101f1bbf31ce6151d7b8350ece28952e38dbcc0409548a1811c1bf48263ff7d6af2a25df8f5730e3915cf4f3bf79c3682df1aa249aab94bfb70c49f3ef02d735d62aa9f4c17e18b5f659da89d7bd7c18db0d1917f2dff6a25dc8910fc11492eb474e19fb1e25b3a2413839f671913e52958d4f429181b3f32b1460910d681a52e4e42b116fba469665362c49b256e5a41d38389ff11c006aa011c966052eee67b802eb1bf02f89e24c9553d782f9e55ae14f08a2fe6eb3571d063f496b1c47e403e1b5455016a2ed7feda6627a56aeea2ab6dc96c2cab43d40509b7de9f46d4ed1fd137f1d980bb97f89a4e8c32597dc4a9b5094e09bb86e59606378956886e2acd940d67b0af46a02bec970132050f3546aa745a0548247c69781f33131d5a268d27ce6ab871562f3920a443616b19899847457a0cf01b95f44d4606d352ec76e9789fda5981b8987a4670dd8099088865fa721b55899ce61b58ef2ea0266f762f327809afb3ae5fa5b47a298660cce20921e34cad4535234618e64e9f126eca06d392e801fe16a68365baeec0dd2ff2ee54689e7e16d77f31f6a11bf67e0d7b87c6f6a80b2d44687e70a06f84c4721949aa310c45d371a0c94e6b748f1ee22570a103cc5494f080e6f2bf89c59ec29c9b304941c0dc610339d2b26b84ff0b3f93c1d91b5660abb4f40258ddfb99a3c00a72ee92c6fe7ee893201393c4e1fe804f72a14c0fd4455d51c9065b53502e0cbc0dcdc457f3accd271e14250ee99f5f169cada64ee42cb360ca5aadf6005223b76a599ff930ff18064dc940229aa25f47a1e7914e94eb6a2dc9c4a727d9f1c7c1d1014651019948d30456b0917119d6c2608a67370bb76d06a6544aee5d4af34b305905b62de7f23b009ef9ce3cdc18e5df506409e994605b8b0018717d8d5c1fd85c1eef2aeb21ccb167ea1cf674cddecae02ee869a8c58e33e8ea59a87b47671f251db17e7e32bfa22f270c187e3d3c3263df63a5b9940bb070a3edc20cc4f8637e12b54a22c1c85c1cda4e55b0f2a82354d9375a03e940439986eb5671ab94798c661ac93dbdf2a6ff6f03648d0f596968feb91eb7c5d070e8de97b6751d868b8eed609f7c4f9cfa28bf5f3c8aa441143ebd70145dd5c1f05ec2ec2bf15552a549a74949e1e7fbff5987679d6415567fc05814831a2b04677bf23013bd86be0745802c21a04223e09d9bf8ebf44fcc666f8ab3454cc77e63557c2518cab0330af13ecead24ffc546b0accb3a0c992f0a45849a6f99931ce36984ee0f3bf21b1ff0996323238d90aa70e417668e988675fc8f54cd759a9f1b0ca1db20b7b096a292b8291a3838279eab71b1e915a7bae905978c660d7d99aea23a8e42eedb9c4b9953cd91e0db54e247be1ac080490c877dfd3a0d0a1deee00249b670a1eb3ef7810bfd9dd2a59100c763a60bf8019550e1cdbd58a255829842842d9fa45cf144c0bf7f8f24cfab13f313788c2068ff595b520888eae58f878eb7cd36d7190bda96905ab7d836c842a5bc986fdbfcdce3ef136d1b0357b0fff4987ce1dd6311b6c5b09cb7ad7e8b5cd29d1c17b08bd49007f3b0906d928ff120040b4c43dda542c7d3402b29d0f60db1c85541318bb858a9585422422dce07189f838fa093da01994370fb3c11c74ab2d2d410d038237136689a400c90a46b37d59514fa25912351d2e6f0369e1d784d2f56dcf3f2943780e1563d753f564edcdbb60a21aa012fe2995bc7b4debaf23d02cd818e636b880782c439d44ee4763102a4a6ddf048a2db1cfcbe27f2fe5721dd58ff9b1b32a11d9b196156fe51ac03fc5b067dd4ceb4b16b8420d51b42328df3618065e6d1501d806b127174d16e627716d6b6e1be8c4e858aafe34f71f574933a1a719da2d12d56451a3da1233f1210acc5c4002b0dd0068db9c0e53b6364b85dcdbb4c7e830a60b675351cdd086d1a8476f3d7fc94ea39a3cabfe1fff87a084c00ea17c10beeb13f30156d5e8440bfba862f887d407d5a0fee4a6cece8f43964cb86476b112cd2f9cde42da7e9d70a0429af60dfeb586a13abaa92c0cc4e229132875afa4fab207c365a2b2e9fa820fbcb9cdc8d240f50e0791d281c13425d3b5b45ba534de85724d6f1ead63fed9d0cf703436e9c05a240a9ea77154778dbcc3bac4b0630575b609910ef71876ffca348bdb4f42e3d3e54eba8280267212271418f1290a7ffcd5ff50e3c77a30a886d4b246ca6dbfb13a868a1b30332c45d4b60020052c775bed2ac2a1249e785a5d379f9d9059d1b7d688f90db05584ae8b0b8128004481dead0825264b94f32b1a11600a8097d64dfc3f038983c94c3fcdb6d7fac934d84ed22a1e990388fd2a04ed0055f832896518704e580f6d0b2ba3878de77bf322e8b4d91925a35cb11b7f187c740141c300f670cde8fce6d845a75bf83abb517248ea52fee90d4a9de2947f6d5460ddb1665ce9c8c7a19ecf4c2e57dfed76b10bad6412453e3240d96396e7a4650170824b7c7e2f58d7d097826ffba03b127e12f0ab5e829d94d4de2e59486c4275b1146ce8b9e466c980f5a1964f380289fbb3f988a35ead9340894fe53deb1e36aa48aeded7d3cb00572a534f886178c3d27dbde713eddd0192bba87d432468e5324cb5337cd05ccdd2588c6c5d92ab5c39298f64d68e38d6fdfb3538acdcce94af9fe1c47e0fe8402cc0dc727ebd80dbf040934c73af4d8918590c8c73b85c401e8ecfc40c41692d8e68c6e8420e1cf0935d1a87cbe2e098e53a54c1dd81150c4a8244e8c3d291c330f2f59f33a22c7fa383056b70ee64e81322013a89365e097ab40ebdff2f814ad646f4daab64d8f463248c00de28c4ea48966063d08940616747e43d0fba07d36a949f98462196a67052d270a1ce8db4ffe10b3f7eab2a9258adeea8dd7c17e97cc08e1b840e135386da66ffda5ec18f8a57c5790c2bedee4d3017178b7cc294fef6a21ff209945e387ff4a1f05a891450a0898f1430b2da4a0b7ba2d4d27113631846aeca1494e66c31b61827832ac77e1d93c25fa7940787e716f211750b0df8a9cdcde137596bb42a93673f02f828bb603604e2fbdc261b7a5ac47295c9b1590915db1fb781d0a6372d1243402426d5ab9f3eef04aeb002400434911ff4a199ef651249dce93da213b0becb3027ce3e27dba6de01c1e44d7ed1a286a6409f4aa1d8fc3d1c5ed641655063671f22f35788c292bcddf53fd819ce4c54a2ed5dddabf1563923d09f0d20f386b0da9ba86e0994762d54195dc4c421e7a094bfb90b81f472569719f7d8f19ca659b735b4e99e5150dab581f2709a9fa1fb98cdf4bb4aaaecccad229376a44df6573d27591d1ec65c0afc80e7bafe14d9c3e2ee43ac79c1e22a1deda66fedbfbf881e2c290f449bb51c2e24c6c15ddd1c452dab722b6d2bceab05f196d38c6f8e1fab7587e106c27dec33f7425da700cc5e814eb9e0924b56687250c3819003559950050ecc2c67620bac82577243121b01c822fdd184743dce23d0d7b01ddf6cf043f7539105e84aa50245d8039f63f3e1c533fe038b34d95c79cd7e72dff0b375360b7a406a18f72ff9b5e98b3018f2178bf0534195111bc9d0553087a66551c1b927ccf5c003090ea033046d0f16098a49015d1c021060692fc25003c4b92bfbbc84f3f1e5590fb3db82f54ae654b189375d43cfbcb93817aeca80383e43d6ee4896dd1c5a765a47f9e9ee88422339d07441e1614d91cbbadd4cceae0fdb93d8c25beb9877b2769d4d80aef0a54072c09275d7e6124ec2b0b46e470ca74749e8bfc4142337ae62347686cec0244d6cd90940420d9c7f6bb5d16ab145cf23318f8ef3298e33799e422c31a78d7457c580fce6ff82c502345287f073c35d1e1458963df7c95a2daff16dcd467367d45e3cddc0ce43b4a163408c4595edfea86bb6103644917cc4d361d9281c2c9fb062f789bded31300fe6c59da57e638c44a81a2f4760ab872f71a8e804c4249aa2ffcb073fae8740a91496463d34c62725ba1033713ad8b84c4e02deb239cf1defc85d44a76038b63bdcdcae1701ac9ddaa504da6c0af904580357e5b072360b125dd77797ae33eb80be6c7de26c4321cf1669072ee0fa6338e50f1372704cb012fddfd8e2a34e8c346d2872d26147b448bf384214a8476aacff700dcff2b14fab839050e7735f5463ea85df7a7fc58d618313cb724950c60c17421ccc063e7bbf60b2aa2d6f365a475bb3b03572576af3f1e5673cbc40c15d371658be9a0e7d6a3275695cf665d0a813fd574bfab6bde80ca7aadaa130c21a41b414ae5884b43824d83799140288238a9472cb55dbce485cac6dc8ebf4742aa7109082b70feb0ac59d9559bd9d068b491f0c2054a728c190d00260bb62fc78e1c8912f7a23b1905ff2936ae487f55703022c20c024f09242879201d94fc8e064360f04a8618fa3f01b613025a1f998123ba4ee6d384395d8a74330bee26298ae093ddd954ee0817cf737289267043789c567c70153eb72b6adcb4da4cc58907147eb53d9b0f2258fef7c9da5fa3199d139183c63d7d3182f3ad0f317404586bf6f1e0190cc274650c631c6fa4ed049d8e6332e8a0e3fc4532f3398e08fa08533a92d1894217d0a4bbee121c7a25b94c2e44b320547758e897b952555852402661187d9636955154efa1bf5c13358a538cfb0d6a5f115af09e7a1dde465e08baf959328fb4ad9d6144c89ea2414fded0f7c55e418f913b114425fed9bc7d49d3b85593c15fd246f405e09f47a908f1f9b3e54c1ef5e127d7b13aa345c99e2c75826b8e9e5ae9b2430f00ca4f1b78aec02610238a273dedc7e43315b7cbffd759df25f4bad82ec9d2d68b49735839277aa45688327a56128a034d88fcef43b3888e0fe2ea6db12773b9f01cb8cc02993142b3dd71bb55f3ac52195d4b0fb348060a56260f74d97c88a79187bd51db757b5dca452664e318fb1d9b783c03b237d8ffe1c2df75c1ffeba13ee7a7e728b9499608cbb76dc627d144709859e6403ae708cf02b65d5fb786f15f42a47cb8295808f96037cf297688bbe1d3c190626ebe873eae1c434e6167dc8cf3de33fba9ec3708386c68dde50bde4bb035f315283ffc14962efd2e0a05815c9319f59a40cd65c2c15755b503376c1f75c397df34503780b06c27ddea3323f23be4ffb2013c9bc08d0139a259535a1768fc357b7964225741a8c91375b60acb9e8c41ea3348523979eaeb0463007a54786b9b0138addc0d45fe2e3d3c2242425f5e529b6fac05735d8aa6461dd4005469c52972e16d5e79118fcc87a02afcd3a6925a9800f8e288e4cfad738fc160d1ed38aae7a2d3d89c265ea277aa0f6f5cdbd0b6aab6975ace7181588dbbea2657a8e00f896d8c733b34e5330ff368ba75480759c100c2123af131fdaf021dbcf31bb4b4a8a918175fb75af46ca05e448973d9b86c3a747627dcdd4ba34e39bbdfa7607063760dc5009dad09ad44ec574253b73322848f3d5b90facfc2dce43206186abbf5a723ca8121807121caa6fc8c8f8b817998ee28ebc41079f944dd898bbb898127f101ca7d40b44ee6386bb09ad8394b7aa4dc40ac833f015c31603cb59a642d5d89392b7576a35f5efa18298acc7e3be2d50d14e15fd240a545d390ba04cabe2bd009397e38d3a1d4a6f207502b3bb117c8058bc7bed86ad25e68e364f2795677939ba392e441d246b4233b8c6de6ad9cb4bfb697e7d1910f93e2fed239ebfec3a940bc589edf0e475ef6ed896dc4a7e7d9f70d2358bb1eb5b346b961b430eca47d1d8ab0bc6aa1b2186f764877792e4753e4f2e036d4a621817c99360fe6dd9e28f13c7d005bc479567546ef8eb18d273b58a1c0aac3915e8d02756d799d84406f05d77ef7cb58409c134a06614d74768b804bbb3a7a775da0ee5ec3474f95e5da73f01466ef800a2b91250865c2aeea25f85fe00bfa872742cd486db7051aa74f68014c09e4b006fa0d4caf08236799627d3c74dc8325bd4cdba3e97873e0a2d598070d5a7c09ad799b066cf5c73bb5a8d885475e0ac9606c37e1297b946fc912a379d045c00edf6ffbea03f9c2884f9a7c5dda9c4621b32337eadfe06ea23d45cdf9d6f76602e7898b30e54fdfeb720f9e8e07ddf3288d6ab43d8f2a004824392abdc82967c05199a56fbc650c11f681935727b94dd37c1fe3893bd5cb4176ec98154756a62267c955f077b706ba50e10a9f5ff2ace8e71efc264b2f4495d20301ae97978ea80578f035443afcf8d6614bb2dce559b9b4a675d217786782e3763b5812c4376d434ba397eb9fefd6808995fafcbd3c09a08b2d41b04507a035a36601f213e23869195d78b4a96f29e89c651ab27a80b5b522a4d2768f234c6944dafa9e16eed741352be345733a3d2299781de657cd87d7a9f9c9d24c0201f28dea6a2970eb7553e2858fc6f978d38256cae293d36a43707d6e0aaee14f21ec41f0d3dfd8b639f433b543d3f64a3c1712f0981d5f73f4c96ed7c5eb7e6e77a2d8f365242a8dd826a87a09cecddf1bd4f5e26556d9bf15e758936befab82ff7029aeef75557d5e096e83a73ff9398aba690ab56d1c2511d4a893ed57f5bb0b03869b39d70c144a54fc53d162fe8e275943067a5968ec4498ffaf2a3d6cbd3ef16b58792ab9e1a0299a3379f7009af63d24b32d4f320a0497da3cee7528e969d8e6a0cc6a0275b096e63adee7fa172c8ab8bbc604d46c13379b8fd9950bba1edca91ee12525bba8c102156df4149d8bf23ab585e9b7fdb600524be93a1c1a53703c9780f3d710159072a49951849a3ae9f6cbd8ff34c623bdc2bda74e4af78e48ccfaa019cf479abe059f5b875c90a02ae4bc0d2b978eff8291efbfbb027a0aa0554367bff0e72f0cb992314a81ad4a47de6c2ed89426a6ff25279c033ab4040576cc33e65550e4ba0902858df551ee3a156b5568ce059e4298369cf791577ee85c4271ae538934fa8eec4fb55b142c71395e5f4896798e8c7f226a4f215669eeb0c39d8083f1c825c70da19efeff12839cae1ef53346492413881a26451ed2615a65606a19d910426f5ba516f12188ff553787ed67408f61d427f0abf7fe73abc6bc7158cbf058af1dc0cb7ff24cc4d78768bc8305fe900f09a5541cd38cbb6cc19d7ef9dc461b4dffd1c4f6c93766f3fdb1dbeb3797680d5f337a49acf95ce5c4fd670362146bf9c1a6591294dc4647d7401d5c37bca51770782c80d3166333686c5f48b95c1dd5024bfc9f5e879b1b55db60d0968ddfcf0445ae552e996228892d2876d15b8d8cc16937987ea76b648c249076c4feb7628779f8025383098b13cc61ad34ed5c1925b017a8c926c103771e90c8f7a75df75a432407842eba504b122f70deaab1c51e91ae2cf9b140605c335cd8e338fc62435158a4ed7734260c3f6b8d81792fded6ae2ad3770dd88046e8c52f91d5dbcefebcbbc457edcac3d7e1765bec38284a07317c2618780b0a280b446a15ae680f8cf93bcd8cf6fe42f3f33fce03658c07979e73ca9b39360057a9e28bc4ca9b0cf538641eef37c9d39c2d6f4d215d9f224c31ea28d9809a15eb4e04f51669a0bff086a35380de62f80e5158aefbc624a90d53452dff45667b79c455d75eda941522e1af1e9d143a84433bd5f94fc58ac7ee361ae09b087ad54724bee77f87b29ed6170d2a19e3bd18b2721209fc10fa0212291d5fd8ae512c60354f2fa9555138dbe01192a07cd48e2f2aa1f864ca3c68770991222e6225474042a54ab2aa143f38fded4635085dd36050237dbc115534a25f4eefb8aa07a53cc055eb37729e8b8171917d8c4abe6e3d2bcf460bfe1c4c61e6dcf4d136ff9b4f33eaf44a5ef2dbaeda12d3ae24e93e885a7474abd2e995fcab2e10e65cd8e4ba0f37a2819d2136bf91690dc91681d3911315dcbed3423456f0a042730f4001063308de1b8b9cd0a77e165175c994ca833b64f6a9f1b6f16bd480ea7911efac935a9d09dda5cfac82e46960b157846199b199e63810879c2d908ce16fc8218028ed84e449267b1887458c0acc254953280df8d8545fe971e416a8e4eba0cc7a48bed1cf63bad0f60f570bff83170b00696a8c0cb8df9e6f99468955d822c7862b50dfd37f0e04503f9256e8f5d30b7f22606a61cb9ddeac4531c2a19887519d16adcbea4f2212f0237bbd0fa9f30e71e52ccbf9b910bad213896333d74c6b57128d62a6dcbdc20003463c111d37edb5b1075434dfba43daddec8575b817c63a7c130c44e5510a04479cd8d5a7c027663530496c12f24e0d411222eb70f9b1183d2443bd3249d51e9d5d91e7bfec10aa4b760e35d0c2649afe80bfbf3a3cf6b015b1767edca9f48c804871925d3f685f267ea910db14dc751c0b203c1127875d0a3dca086b5b9ebb2dfccd8218b74d8a869be1f9cc54e7f57a276a32588335eae49347a9f8326c02858d05b9b59f9e129824b1d309a5af47e789ba3cc9600c734268cad930a7211fe930e7680a7e9bf8e6298d9b05d848bfe6944a55f560e1edced807be0d0dfab16570744a4677d0f579ca7202ee54c1837f8e0d0d45b016a776720809659b3e7c2dae7d82768150d644140b478b90bd8057ea6215eec86d0b6ad9ba2e0cc4aed5989bf0e86fe0f0b29ba00468de43e8c1cd67dc008fc2599fab659e3a94c62bcfe8c2ffe561ad54cac18536110ebfa74c7d844bd3757c87fae2b83b753855448174766f46179a87dbb454a9c8c224a0b57965419893ef7f3bd4bd40286c1ea22695fdb245074ef91fdb3c9ddd51d2d92dc51da9a49124c0a1f459bda7077cad6c541c1b03d2a723bae92f7b729ad8d80065194d9d3c9a63db1b6a62159638b9b965d99821a5f32d44a265afbfdcaf7e3cce7ee22866bd990f7cca77a7edc5581c7ed1f71bd950c894f4275d61858844b2e7a246aec79420f293a4ed4db1c14d4e429e3c26eae455716ce8b85e9a211fd38d21c18cf07ddd587adc0455c7f0d331fe75ce0a777494a707e0583f0a4f2940eda015755e7c56ab2a65e152c10679342cfda1342f0f1cf65525ff29631033575a89fcb44dda502c7d2d8c5a8b77646e735d1134bacede07193288069886a495a0df7cba42a7cad3ef6942fddca899b0eb3e3218675cbf101b8a514696f4421da471c68da5157876d0f44c03a5ec0e4a2c7ddefeda85a648d6be363ed14d6d800cdf654f96aa244c633ed0bb52f960fd873f8df45b00adaef4f8823457d3b1110b6bba6c4deb52254f20803c4578b86280c091894174649ca7fadfb76f2eb320dbb3abd291b06136ef5a3bc1c7cc1ef1765afaea99498586106c121db2569e8e1a7285560b4a2a855dfb2e1fb3a244f664e00abf6706fbbc7422b7749df762cfadf210c65495d15a43ec7be2c34e1321909b7941361c111cad8c0474ba78a255f59ab6f1f501a130c2016f6a2d3ca07d73f0f31d15936006fce5bef47b99b78d03df02edbf3704b6a51ec6216a69fa3acdec79d75379da74f77b9779c95248b9161830dbd33ca17104819ace0ac18669939a9e7ec061a480212d632b2dc5d9796226f6460ce22299a153637588626bdd7bdaacf650c5306467d96c84f058461afd201d90ea239dd67bdca16e98489a4b0f76c7c94cabf5a3a494aa48ed88268862546d60c945ea2931362099cb0b52a856c4697ff0a27ac4906965c1cb700ae7ca64b845ee02e7dbc548123d75fbe6081c91692f316a867fbe6e8df171db95f6c81bd02e7473322d0823f544593f582f3c2d00a3c3566b873c3485ba38e2adbe84a103d8f001091ce9bf98423145f2ffc5874847d07aa0cd6a334c87d25cf5c5412284f77103af829dee9f07726f677c2f6d6ae2df809a149bb615e7aa8b47cecd3940cfde0472fc7668e8bce3269265d2db7308d1081f826dfe72fc85606fc79d656554a2b777ab54f3f5fe212537d5a277639ce65b257955aa9318f38e46225695beb6ed0b77e919af491c175b99d8869e34f124c79497c36a8e219f5ca951ebfdd2c62183f70bdbfc1e2c524bf585fbb31608572c427ee5c835ee153150aa1a4b0e2a47b01ba5bcec7f805b43eb5144265651b8e491d9f88f21179b5ba7698d89dd827f7404e06d2eb181b6c969f351ec01402b26fde1051d6e1e63dc669c36478395694a3c361629cc4831026aa7fb2369f5ffc9326ed4b08a4ab7d761c88ff02203d5c4da0d848c14d36af70a25a263a888e094714071560436dfac4f90c0cffd841d561dbe706ac78d6a35ed7634518affd6b7209f5392317b0372db3a8dd991fc153a81d4883bc46023d7b64da5889afc5866302fc3d06ed772eeae725a5a71e51cbc5cabe9eaac4ff3043f0ee1dd5cac84c3f1dfcb4b821639a16015373d0db84b78245886ffcda87a2b86aaccf79df9025490d50d96895e2ffdb0e9161df1782b4bdaaf7a085b718414311be349679db0234a17c3b7da6a7700a824fe61ef9030b8009a72a13d19aa584773cbfa4b528326a3472316c4200bb8c7415b725fa5bbe92a5b6a11cbc614b6d594e161192141a05359845a9557189468b1b503179abbd69cfe41a1b145d35a10b730b4301efc0b824c2259580b3a9ed58b2896c1a7388f882f8f59c2fcea8c825a67a3c89f7345ef36a3a769353339d582c7077a1e9fe5d3ddfd4846305d57a185b338f179c708b481b33ed84e0e0729a7dce9e4ad834cab6d3a0ec4eea5e5cfd30434d5bbb0aac36ba1f5edd902cd0cbfc309b7c0c21c43a828d3e4a5b3043f82e502ef4958cdf79d5f0bd9769c3db19a407a54c1ff188770a3eebb0c490df7e1e41a3297a7fb94ea7c565dda7354ad79cc40b89d1ee6753c8d9c03dd7d739d16e1542af40a6b4be0ba9197d3ac593663666c0d0e1d1191689026c72c8ef9ebd42267ae38fd81b3f998e662befbc25ad385a0ffaec2fbacb9be05d6813ea9bd1ba73df1ed7a387a863face69b746c13270e80e3c2e1637a0d5136cee6f70c8ac83a298aa4b01000c81aa5922efb2c8245b157d2a8aada4e4c65c16531a517c373483806c3ef4820d45a3501dbbfb980f3bdf3c446f76930e524bb26a5a9bd019c2f613e0f94abb0cdefe8f2d05552ac6fba0d36ff5be3b3b36acd6d7c73fa3d002995f2cd8bda8a0df765ac35e0911fe27a8f41dfd8a7d3f553c1af3e71d947e2b807fe54311dd91e6b0089b4273b690fce49b92f786a07b4859b29a40ed4b849d83807b5d1e9a57d261b767c002f01442cbfb7a704cb1aa2866309fc3322902e28a96bde18a5eddb011a3114f5d6b13da34c04d61cfb7103fdfb037c2c5f8b710f026ca75eca52eeb001a39c6eafc31655f547a9004dcab33494c91ac1ae01d709eaaf2a48475d5fa5cbff6431deed45c091a89c19faabac3ab10dd5c1581e5335f9dde3a3dca8b14e1ad55985c650a8af131ad67fc10ac01a916a90c9aaa09efb6366609e183b655d37d94168f5088f8b61cac6bba2d4feff74b3517f458e5c4112078fe9c3cd0c080f7254d0a292797217cda35419bbb34da572ad13400a961eb8cd44690928298e0553ed868e93bdad2e80ae53e1cd8e7328dd4e7be14b1cbe3e14421326a7f4ad16b536131105a6e40925b086250395aa505673be8008468ae940747ca55d1ea1ec233b550afba2afc5981d92893e8758543dc4f07a87c8b69512be6f0f1863bf2dc02fffe2400c6de615ede5397d8f29fc3e3349d17ec1b7de15c33703bb46f5f3f391dd9521aa3cfaca98d1a9ec815dfa5bd408f4bd7a8aa1e3492d13ea164548f6eb2437cecd7796022f31234a75e335370e79e467fcac0021caa76b3d7c6ebab69358a6b007ae60c30f7e0b33d17b4218f62ee4449b05931e4b384d81331bf774e5fbd2d9d008eb3b466d2041bc32957126c0161b3cebf5afdd840b3fa1392d36891464729da9624bb6c2ffed79421dec274e8e100c15b0de49e4115bae2fc1c43100dfc84166e85267054ff0af17d7f76b0c2bd51b24e1804fced11519ae01409c704a67de5e2430e3a20c372ce06b9fad9fc5ff9cc253ec2ac33e0c7ac9f7c3d9a2bc009de073528d5ba92b8f36f53c1cf354ef4c913594219d0fb26cf58e5350e8a058eed0f65e5bf254313afa7b5133d64ed2606b2ff51bcd0dd626a7cd2f4d533aed581c045aa9cb8693b281df8704ce8116fcf7a8b0494bf955b7d73238e8e6423f551052cc6cf174bda72e00a6da9930b0f0db8f08deeaed8aa64a6d895fa1db7a8f0e8fd0bbe669abbdebca19bafbe4da9d39e6a23d671ad5e48b94bbc743835f8827c9429ad9204a9c3b9b808a937461870ddc560b5ce54d8d76635a32106d22f3271a6d08b8129b244adcfa79ce7d0fddb2ee76f183906c27b4204b767a831aa9a129b9a17eb615d26b40f9da5714e0602c797923a9bd09c2da72542fb7dbec4b9982cd69bf873b8cbad1ee8e53e725e8af20a714f3f1bd878790d68183099c36cfc5799b48e4ec965a6d7cff3ea5e580c5f197d497a2c467f9e8445f8d35481b99d6f94d0de40d3fc20a5a79b263a3d5cd1a44fb4900c170fd033748d212e32040f5c068a92924b545127f1e111cbeebb1a54abb59cc53e182a8faf1be7cb03309d3beb1f4e63fa421370e2d62e8c93228bd031b81809ad6b7604e750b756a3cce31f8867af62fa0a010490d60b8822416550a393e052249a53ef0ff03a01a2d76f40ea596c6e0b6b90c87116c3f52095f9f08414098c965e6982d33f5bea09632df09899010fba15f38a492b1e0071f7978db2aee5b5c540ca89cd0049b8fdf4715849b45cbe92e351f25cdaaa50586ad8c902b39c355e4464a6c1aba39543b1771ee477a5596a4feb90d0bbeb661d212bce4d3f564ccbf2f31ae3a24e8b025754c49576094cb5758de77a8393e0637a2bdb734431be2c0337a43feca5faf3683229706c75c2c446062dc27b7f206a2a91689d3c10058ce897128717ab02cf169503e4529dcae6c6298d9fdbf48b783a293be767a682550cbc6a637cab17de237b05f0c50e201500b262c878391e6c459fedaa8cfec0dd7468a4954c99a0cdfdeadc8b2ab2ceffd40ef91e81a65318da6f26c55f6973e06f9558fa271197b345873c5a28b70b891d64bae965a66fb9abe55d46238b24f38ba4a387226e438e7af214f64f4c76af0040b50c489aea619ed96ea940a5adbea803712666c36b6776185b1427d4de5ef869a7aa90bf532065580ba6c87bb850f110c9e142efa44f9f15f32d7aa696e5e3a65e2cf293b9ff90b70f62c7d6d853658bb53aeb8b7be233b0c1badc2d63d2a3545b1714fece7a67c8ff941975cdb22943b8457f537a408ece8cea1157c0156255ae624447aa9f3e33c27eadf17efe9294f2af5f28994a5152fecae4d93e33d2edb318eeb10f8fe74764c876a8a61f41a5fe9729b294fdbe8ea64b9481aba913eb3efc2b254cae0f1150844d727f7f1b905e49c9c56f4b31fab7bbc7aee36b385c26e0896ec8f7710d683bc51d8f53752a3f4802ff3b934519749ff4a3b4cff499c755635e054d26c5c21f72464d30f97980df087de0d5ffb0d01aaad8fb2b0a5fabae9393a1434674de22ee10a8cd26aba5948b76e33326d598645a1c27100e04f6cc42dc6f5f9fbc62698bf8b9ebc3775f553269906e90697d1037e6bc5e67e2c50b9705b5d198a86375f7708f9ee77fa8e9377361b879f3e4c04045d9594072caa34dd3184a611d0f072f362d5773e71491b06cee95988b8fae1d1411d8f65cba22f52c59316404736a56c954483382ec36c3f111a34699fead0a997f44ef9a37762603339b6c1abc0c5655baeafbc1b9f60ee6beff2d9da4a868e68600271f1992851aadbef82c20009d14ed7de4454051efc01abe6c170f7a58dee95ad433441c4129f646cf2508eac97345e34c78120b7db6f9fbe01fbf34d3804b438584ac51291a4c074c849fdd5505e584c30cc02465991030caa59b970a92438d01c380450c5cb67a916dd5f651ec187fd07b9572162cd8830a8916da1af56aa1064957ac6c98877d051ce7e6368e8d066a689765af220be8a904c7dd69e0fa8b0aea23fb034445335fb860135ef198fa65fb634312d45ccbfe19701248aabb50e5dbd7e738dad07e92f27cc9f59ee0203e2e1fa55276eb6ad1ba634c15d73798f5f819d6022dd3c3a0843a24a5d58a4ad490517645e67703d7506b0e5732ab6b7e49350c081a2d478495ad9d4b8b8dee4841c0b5d8ca805018f14d8d8db273bfc59c26793f62c0f0576dcdebcb8d73035419e891a9507e1fa22624e5f7e9dd1ebc68f0846b999ad38be4331e76d59d46d01d34bce45c9cfa7d960bfd6c886cf75897ed2eaa11d6945a11f43f23e76853f7d504350085a4c570f098ae9b342ec792d4eefbd4cfb9b3e25b08bbaeae3df3a850ed3a8e76ee664e9f1e6fa179a4760a95165e2b227b86dc65002f9f297e1a82560f8f4c25b21fdfde127545f6ed2bbefcc7ca64e053367ee0330898dea2194689b9c96b2495acb58aeb40f5f1e4d812139346e3677d270f4b738b40d80dea534aaad247489cb2913faa17abd3f69fa5a6eb738960d876464e56c501ec55585e934f3150905521767256aaa3b2bc44d61786f5915ba03234fe5b82c3a349a6f4fc9a5f4c074b7190c68d51752b8e4e37aff52359e3b6b5aafbd5b4761fae46ba4d4a142bf7a8591e9f07619a004855c3ff64969c31566bd2e780ee0185bbb50b4f4bd9204d41b065cb86659df3d5449a6ef30c092ffcaadc00a52f14ff5fa08a3731e6f35a4e64139d93446663dee83b2dda30ad485b41c99e3d3d9db25e5ff354b39fe4f55df5e5230e4dd8d64d8ba6800e2839b5f10da58512a817cf042ff489665ff61b54304430ccadb9a70e9132c950988962d532ef7bf4629c49792e6d593f4ee83382a4eb7f42064bde023e514e25bd7322061c66cf114909fc020b9a6532f843d5e616079208c9077d92f4490717c83be529e4160603bcd05cff4941c25dbe5e97cef37d83c6a967527f081317c03822d660dd4e66c71a218d69fcde9ce26fe8bbfc40df287249f64eeaeb31d3e97270fa7efd017a6d5d16231e870d700ebd68f00e4777e39737bcc0ce9f3fbed43fb45e2d622eaf5189dd939abc47bf436d5502035fd614c15cd19f735162e061780bd0200c9ffbd05a1a1f784c14cc16f657f30c93a2d6b3d87a2c7097be3d13ed71c01d7dbb4d13d04103759f3737efe28a206831581782ab3ce4b9676d15fe4030ccdada1eb5d12b57d3b4b1ec5480191353158b468b49eff59313e8d1a4960dbf91b3eefc5e9c2828125ec937da1e1148f0d9cd9e7e993fbf089c2bff99d22fe1ecf51d712c9841d6a447e3fde70fd58b5fcbc0350ef08fa25eed3ea58dc08bc72a55c3788748d23502207e2df9791f5df8ee641a3211ef0511df0ac5d8a377758387d4963113ad9fbb7752186a26f495c5c99e38cc03e1a6b59b0f9f329f80fe10daa31417594736b1fe46939fee8f0908a756b2adbdbb48ef4bcf56e54d4725c33b3f2a760c685ef993c299b279dbaf8130aca51ea0445d081f1063345d871f81ec6f58745f32e13bde59f7b8b237a7af3992f39a1d955d51357b5ec9720b15ed31d03f976bb00ed56a79d39a114e0802ecb98b93bd16c17d395017f0f004ae0c56048f36c70d29da23f8d5bbc431e8102928a02996d35c2df1f09169963b27678426fb4df52b06cb2fc4da8618ce3c8af7a6acaf7d076cc6fe1bb6417d98dffe77e72991b6e11974a99208dd94c917ddd5382262b96a4ef61e26301792a9ebaeadea89eb383207b4824edcd04c23ad421df3e3d9879770c21bc02e5b2549190042f12be842bddf8b6d2f7b8ad75e421c12363cb9c8d6e92b1ef14925e8531974ca28f7fbfa0176487d359d6ba75d0eebd4894cd3a350cf568d0e68b4e7d9f0f2888eabbc4cdfe35db6374fd358aa6590769c1dc36461c5d2ecbe8d5ac0bdf97f39898cb49dae110be9b4bd3d75fb880c457a57c9695ec6c2340ea43756d61d358f21a3cb1b6cc63c7fd0b68744008b201edd84d87463ce87b97ea5a2c4d555d5374a06c41166d363d125366362825204ac309cbdeb809cba1ec9b9586860b8500a73426524a0a0b8b97b1e13220d755d72e6b16118f942b9b50834ad1e21d06c76e9f52d4e4e0561295330990b6abe0ba9cb1abfcce24e121715f616db06e52dc3aec1e7a1f0a73c61e4613861ec5da4a8c92ac7d5dd45ccbbdca526f183c4b850493d453083431909d45fdb3d3e9877402cb95472c6ee297af7d67ddb236eabfcc45be8f57eaf4171ef99ebaf7887a96397ed19af4ef0303cf485583123bc34a44ca3d2e9f590f19a8be681966ab0b784b8ac48e63e673d6f6e81a1203a929f414079eeeac0481979e22322e4d87cb3302e99059626b0187bfd8977167604fc03a69e1c80f97c2b1dddb452e27308c4bc27c7605f45772cbe50fc3c43612dcb7d76006f24a1cea4d5e2dde5b634147726c7c6f15aafa2a76f1754d09340e4775f297aad9ffd3bf104dcd438d00def54b1d8809603a3381da60a51c79ca91229ba79ab2ef33a2ccbe75389dc2a94f7aec1c1542b0dfdbc2fc7f9fd634ad2e960145e4ac3d5f32beed4e0ba993536cbb30aa3198437a2eea09da57841c150f979bd5834748ed6a69b3089f2598bc3d5fadf8285374ff29a71d6602e034d0a734c8bf55abecbecc01be8b0a1969cce99b0dda302adf7bd21f1e8259159e36562436587daf69b1a28766fc52f7cb53d5714cc8eda97b57675d1cdfa4dff2e2a2035df3c640097554bea5bc664739fcc3c57092233bb0a84850a156f46dd0e812335113e25b173ce1c34ebefe03f176ffc5c7958535e969b0d734071223b16078b19abd9c82838556eda5bd93fce9307d1c972ff53798792831de8932efd3874844f28cf73b1f294b21961f1b265ef653f6f06f556cc216bc446eaa749b873a03c819ff9607e6da3088acc288f0eee69cf7c3166fdc838d3ceb66fb655777e7ef0036ddefe719b22885147404b57f438aa606f153dcf92c2ee60b2879d2cada2d26b2ddc139d6da974674013475a0f814e18032cc04cb662f7ee5e2b0af853d3c3315f9378de488d261ccc21219b7392eb58254c2eb3c5dc1979188e5dfe0c1d752de3cd1cb90b05eb52e33b6aa86a18ad231572f85730c4a842ddaca2386d03d3cb80258437f752682b3a17f3d892cb1a1587c6f10b3213af61f40296472b06654cc4ee1f87e24a1a6c24fe7070d67933840c9a83fa7c708888fe912b07aca7d1ec9acd7dc7a4cd63350590db27668f6c5be8c5b5d192bba27dfce4ab010e227521f9304e0209b70f2ed2bc2efad9a93fa321e45a89c4f00f3a2cce271f44586c689a629d46b108f78443023011db8fc3b3ec306d8298e10ab509d49ac4e043ec3f7d79277f5f1876679385ee6dec0ba362f5e5b1863c491fef77237e75447ba6390e6fcfb890779089205508f1aade730477cead93aac63b25a36b178c1c8e8771ebbb15444f846479822e21faccd735bbe83f142ae28fd7755ef6615ea27c7a9e046697118e20618deb2e71bf6492057240c8aa5f889207daeaabc771c393eb1c8b41a64c068acffbb9be3976c5ff763d45d078f9ec5b6dc4c16596dd12869aaf6d47c3680d312bc12cd1435de1682ea5cd20a37040bb9b738501086e0ba0d183059547e86d56daf6c27b4cdccf85a3add17009877ef94daca3ed84fb927f9c6f85f44d1464efa668e20a9cb77603ce5d5d1b2d51d84e70da697df14b86a1a20959910d11332464d22ba38673475aac155d64cf58c88375fd26190e258df4b7263ce5183c853458740b6840a0998ffa13e9d00056f29f9d053a37a203270c2d2ef90932a069afe56dbac9e3e4a0161f5850c78e9499b7e3fa2860ceee17d7adb142f4b70325b542ae957cca5d8bf9429492510c70b99639449783fe9f43bac7ab165e09d17450264f0bec949b428fa1b044db96b5b6714c26105063edffc89dc6aeffe80eba95eaa63409f39722809068e41ca23625ce1398209829bf1bc34a327c3517feb9ad0fa3d343b84e5159f97274cd0302d5e61800312f3caf40c00fc0c59a3fae67a8675b944c8385c6535e5bc24060dbcdb9aa95a4102eaff68aeeba1d6ebc24b93d0b812878ee77d30f7c2dab41ab852d24a2dfb8adb0be0e3789845c3f7ef5f9d3b6da909e11e54607bcf76c205b80227e5a5a2f97c1b5c13cb6f4c1f063d3890b6f3ea817c5833ac67796ae8a5f67a4d960800c3d0190450b536cbb7652f3ec74e12d03939c951d66621b8bc3114dde16c357dfa8291a24be7846a8e3a70086bd8eb65c1956bbbcab4c4a25fe259404bfa00440393e0bf56940bdec33bfbfe90f40f24d6dd0239adb33a30ffbdaeeb971494764ad56e2545b9ed833270ba051f42932e9ffddb960ecff08446e79d4c414f2518dea37e190d1fe6fe86df175a56fe1766c948abda837dc7feff63537b5e34a9eb473b06249d4004e363f2a2cefa90d5db90cbd671a2b40209d11d19bfbd37e2628756f284ff3926d03c3f0a5bb2e2dc28d5f5f03343416fc308241218f8214cff832e4f2f5c3ca1e06dbe3427da360849622aede90e5754ccfd831be9bdbd8d64be777a17e26bf0e1c12fecf2d2ef22d875f8bf985ab8b3af27f509caea328351157c2b0b393dcc542b68cb1a1ae6d7461c9e594f6b5532277403ec1aa3a003d741e93f015b0793d98334b460b331b97b0f49628003cac2058f8b17f656e9873d2104b05af44aa917d6112b57a78669ea190d27bba2c7e30e141aacf6afef4aff1022b7ff5c5b5fea365140482120e03ffdb5ea371428266d6d456e88b036bc69dbaaef59bb12210b308beeb83d74c75b32828b69e0eeed079fd5828a99f694eeb830542b1efa7eb452ed883f2a77c30a24c81a4b71cbff91c045aca7a15d5232d5944dd65bc1c47824abd2d26e22f34c984d5e3943f437cc6ad2c58586e27f7ee280d331365bb40a28d63735a6cd57d0c214932af662271adf00423049bb0a4a12e8b6274d310142a6b4300b4dd85f91fdb3cc99b7ca8527d9a137343f3b434c07e888877b423d422dfc6743f9936587a3c35a671bf8b034da64961ee05d538342a12af34b0961a0bdc0fc31e3164786739fc5dd8789f3df67d818a892173ec93f70b1a96780c9f5d547b1b4a812dbe1567453302d1d9d49d53a0650f44d83a2797a48edfbffe340c752f123a3b8322aad4bcb2ef098442a9495f4b8acf302a715f808c4f33864d9b47a70edeec2d77ad951023235294e2c03fee87892712a951b5d3f80f7f57afd0d38423ac174cea81704f6e71825e201c6687c617c3dc34674f545e697204aaf1d2aa858718dc7f8d70266225d6b93632cbd395e53a349ed96c58e9a9c8a11ea2b131863bf8de30676e55c8b20ec46be51d8f99c49f334596a2fe0dde86cc0c3b147aa31b1e05925f81ec746d11c10a78f76600ba33fcf680a92557d881ebc81ff04a273deeb3eb8146755729f77ddff0123eeac024a37132b149f53115cc0618b454ea92b4b6a259c49c7bf5f67b3d02ac6a50592ff08944440dc8f327124109bf7512a925b65e8da2ea0e8ecbe1685d3e8e5a270a1775c58f7ec82730611acc2e35d1922213dd8f09333ff7cc01b5e004e5cd01ce0fc7ac0c2b3df35168f8c797f4eef333417c2aacc44d2ca82aa5a7b5d2764a5583028c8bf285ca66107a772ef88f310f4f24f17bd117529af1937ee4ca4d52e2be9358052fa529fe7cbe9343ba6e591cb097e2b4f5ae5442d237a823bf8a986adf1d86f8b88f7013d31b77bf0c6a0365adb22993969177ff5672f1fdf4136dd214b094d9f16a4d5a77af3b9caf62fa39aba95d92f8ab080874889f03d886e977f83af098a7862940328b90f9aaf6ecc54b1b957df14926b929fa174546d373572c29c52d70b771ce16e074b8e6c77de6be6843d9bb5fc020416e3123aae37e53dd0de6ebe860b25dc277ab6e0868c54e4d6bdfea2f5a223823ab56909a04873f28e8018313c06f6f45656d79255eb2b9f1e107c6a5bf89068274e834816c839acf3b5cbc67579009b9e63b796ae802365baa9c9b0d10ff1f5f43a7536f6651419d60bf3f990d4a3f0773787b25dc07faa08b053f7f83f6ecbbb2c62ca8b03b41e3503bfd6d991fe3726f93c0201d651efd47b78230210b03debee6c2576d9b9ea7d3e4336f8e238a9423c5ea8d9c9cac2e58e6e297921444a11b0ee9805a0c47e9f3b8acadffd4c01dc3114ed3fe4bbb14ab6b4102cc3d80e2dd20ef1e02b34c749e95f86cc79bed6d86a0d44bbec2c4dc9733544eb5f7e29518a14b0be0aa87bf83d3e959bf7f258857a4e7fa4733a7a26d344cab6792d7899adea55398e10f545167502949f27a129df0b114c16b54fc9415710e06bfb63141c6225e08fc895e5c560369a3082ff412e125dd2512abd02aca7d2f2384b619da889bfc8120b565a88412ca270dc8453dd64ebf474d5ed537a244286dc3db4fc80d266b577940fcb4be7ee081659fcc4cebe9e1c27c88c8c82ddf12044a054c2f63f3d724a1b663ec1ea235e2cc961a97a00f43f19dda89dbae045c95cb43a13f960aef8d7faa03fa48041826c20e0805374d39cfc4369324e1e4260cff675e50ea0652ce4e54588bf62070d3ee21d29a65060cc663e274fe74ac6eed90559c05534ae59180d8026e69e7a00b578e4bc33b3346421480e196ee35d38cf8b5cbbffa31063280dfddd8f336b2cb3ec72f09c054abd511dcce0c2dbe36e431e5b12ad9a502d1fa5225a483e4c6bd6ab5f5fd7bbf16dd31834759877541a75f251e79cb38d1005807bf57bf31acb8a8c5dfdaa7a393d55e3febe935fa3b13ebb3188b10e9bbaed36589fed2346459753862698c3629135bfec73f8f47b20e23fa02e4d8c9309449ba053b50df68b59019d13bef96afb85af2c4ad73d9f8a36cbcd281d48a2d9ed7f2bcfc6cae79f434fc45c256565eacc31ac44a3707ee17d05a91fd678307378661443145750a814aed15df393b1cfea816ea9888fca81e3de500bdfc8601ae8eabd8bdd0cfe8191eef9ae2bdafa68348f7f0ca47a2ab2c80ec8860f7d17f73e4638bc3844f3be3607a23472099999fcb0badd6ff1e524e2f07b25ca53085942555ea24cfbef5df8fce80343d23beff34dc060be96621926edb1d340abe76a1e30e6a29187fd4c6d310373a23e19abc4cbcaa2a82a30e8e6b13687e4e32b9affeff762d5204b355ba9ef83050579e39dcf032b3ec68a60c8e32444847086c077c924725ae738731ca1f998a2c2fce399db8a688093b06c9a2ba3a85c9ca29f4a3446ffbf24ac68b44ea102a4ce5d3aed416ea8c4f983c8f80d1bdc152ef2572f45006d8ab1ca43052a54744f3ecfbcdb12148ac5c04d7b746fe3ee92466ff306f1d59fc775b2cb8e090018975a2372ec18026e9073e4a069145206b6ebfd6aa90cbdf363a964b5833e32f002c2f138819e5f05287473c1533de94a00584fa344239e9961925b856d662304af8973aaa69993099314e537296b15f3e4f93bb59794d7ca31cc92bfb345dea52629c3eef2731b84c60fdb072ee0c27e9c50f2f476774e2e2b271a4f2a73bc7500d3ce1d21db9269aa545a1c05d368b258c4d5ee152d2a0717292fb5e1b64859ad4748fa01b65dc50afa257a87838158622ad3a890654d5cdb176252fd0b489f3e12678fca7222b504a6d74a2b696c6d47161f1c1f2665b5a928f9d89afbce851b8747fe0a857b7ccc5876861447fc15b2bbddaf911ceaccd222e9f01ec2a4baec631eb3091a5923dc8adf24b17ec4470ea06a35fb27c8765dafc3d5cd244abe4ae15aa862622914bba823776f9c443112125f6330897fa6ffd98ed870749da12168adf56914d987539e61e32d4f238fd52af947eb5d4f9595b5b1662dbcaa109b871f7f0618d553529cccb475e68dba06e3628d8f61dc97260e52a8a77e7949a29cabf140e3b1f156e678e883eccd49322b89d65b6b0e0906b246acc74359c25047e21946e009cf076148afe2266b2695a0d0d717135099fa137db6824b8bccfb4c9da915750fbc4030d570febd252a1990580de373f7d8e73c2dd448795e9ae2a060b775007459b73347567d83c82bddfdddc051b0411103a81f1c28b125cfbbe1153678766dae55f686e55315bbb51c3a1d369feacab122803491a7f0dcc4185e9859c62c16b7640aaea3c10c1a210413ef42cdb6e30487d55aa9e5597fa77ac88149881ff4b9279e8e35ff8ddadb94e55aa481d54fc84e2c3141c208f5314a2bf17b76d50f5fafba5c42ba5a3ba2f288718fc3a69a6bd5d7da2b32d21bc6ec63a99552503a14df14f0289a189cc9b334b9d86fa18b04d6ca604c11abfcd945dd0367514ac59d204368cf786d9ac1d7ce619e10142195480d7e917a0076ffb63251d0c40e88977a63bdcff0727d8d7779f010d4d4a4b68985f9c355a267c9f7b6b3986207f97207b4a211c93424097c774368abcfebde8d8e9ddc536c5b1709fd37b323c17abbaf36254d8c7a8c901f234097b2af7c816a1595f09ab5b05ed8c8e37fd482232f1746a6ebc69c048e19af4e4e14dce9bc7b11aef870efc9279c7114ec3607aad2c4dd614aee9e8c016a799c7137088826bd305ecc953a4348a7977f53df0bbd3554c8c4addd4fd0c4ace76a6bb60a42300dda4447621d952806ce5f2c80a5af7dc70008ba42d612277c77f20a9a7406f4e74e25e90fbe8e89f6cc24839357410d2d98a4a838100473ced73a69e7f09f6ea4f70e03361699a2f94dd266aa2e90b10a4ee1db5b3f74c8cb0aaf3b198ff59e9f6175c108cfbea35ae96821c6938cf19e3e2ec98f2563b2ea936b18c60363e13cb335151ab0375344d7784dfc608f4e92d574cb043ccdd5bd895668e20a62606c86293b36f3ba63b9c83e4e392073254c034b4805e84f227a78359c3210b9f53a5533a7bd5e08b5f774d348afa0fa0a94d86c32ed5a7602d7ea8d7a19212aba54fea7a0d28682737ad517e036d2ded767d6f5125aa8ead68bd6476bc9a5264201665fd6036dc7b8bc63c832e752640bd53ed588c44213e06cd8043fd457f3937e0eaa390abcd6a82b33b8e1dd52cb8d5ff8cd3144eb2679c315865aa498d71ee28ba25f9f5b168d7a3dde1572d49292af73d0049808a2f4fc4f40be1a2ad0ddeeca4f8bc0b97f96e703248a9b3637796015d48007fdf0bad7fc59ff07cec0251c33dab3ef1673badf81dd93d5efd2d758680cb34fa118b9eea183b8bfcdecaa9c0db3a7aa04ab938989efce55d62b91ed6386c6d0ae19693d16bb4a4be95c2824b3cc3bfc6b396780a515fd9651995ebdc9e0cd23f8e8518c7884d3cb387337835135b6af74a2fa8c1b00ea38259ab8b3ba6a12f98f907fb3272bf8b9fbe61d01989c50daab009a5b65198e381593256ea6fb47f747070931f8157c8d9dcdaeba76371187ac2c60b0bcb58a23065d47e533c5a02eacb4466cdfe39734ffe2beb1eb4eac0162d534fcee18f06a0551a143a04fc30a7d9cb06a9284691a18b7acbb84dae0df0d47c5d43e23b114ac050811d7d2930d14e5ced66c700df4447e2a33b56732aea8ca781f49ea1876f557ec4b47401b005fa611fae9c7fc33275cc4675e07857097519c130176993db7481fe8adf6283cf933ff9797e4ae6663a7c53169a45d9c531e369ef7ecd5c691a16ab33ae60314d5a5bc31ef7f73156c479e8ba48af30abe755db336ed2f9b0e322dea410cd04f40b5dfc7ec5a429197a5992b8c16eaeccb71fde86c0d73290650d893029142a0f855bacfdd532fb04ea5938a7f4251364db2e18106a128dee2ef9f6915479f1464b44257147d6c74cd1690c52ce5afd6c5e950d70c930f4816b308aea585fd8df4acdb613a6c38e7567b90c91736c79ff5c0f688fc32ddfdaa69818e070b06e65ad2f97a6d976c256d43142c6552b79e6d0a8831ecb7111ebbbb935661ca6e560de7f55dc23c60d87eb5694de9e57dd542259282d0c0b9519122b1c03c7da8b136cba51a1543a2136952eb63f9175cd0141b5273b06a745a62baf5b8a938143c70d3262b2332629a713d83ee218f7a3578faf3bef650862b1a8cbf42a2493bc7c06907ac2146dd531b34ae46d720500f85ea9d052520798382ffe7fc79e6cff63c29e7c08dacdd0100b8eef55f9ed08a801801da266cd63baa054cafc1d676ea314cd0c6e5daef0ee3612d5d770ca4d45659502955d1fedca4c244b249d663fa8593f53ffafc6e7a8d8544665e3d0f41763ad95f10f1b7f9d22c9fe72c3bd437b257fbedd332826ba2088846d9acc8f181996b5bccf5b6454567565622688bdd8ce6eb8b67f5387524fce00c2665d3b24855ff49284aa7b8dc9a846ee848567bf26573280cb6fbaac1bbc9bbc8b086fe0dc43a6a0fac8f8085a07f3e32ea14a1a082f533c3acc010cd9b1cd4c0c982b7f00a84da088b2994d494a9cbe13f94452709afac2b205b575140b7e13b971918e8f3fbb82b197f7323755cb772a372580310be64cf991c4e27e580f1cb4ec33b8ed5b33d43457b3094d6aa7dcdcc2863e8fa6e08fde1a4e8028a79a8eafb608c401d1fa6c47b258d50435c87613f4f25ef8b2811467f961981596161c3c73a124fad5469368e6a2a710bedc9675d4cc6e2c3220fc1da30fb63141fdf31d1fe86eb42335ee4121e5e140d1dd6937ea6fce31b093c5a183124b1c511e057e3b57b92e8bb601c650438eb120b0077d9e40b1552936e2a6a79ebdeb6409787e5f6a0c38c516b02b1909a994defdcd962752188371a7adb435f5fc976d09c145c07d8de372e040276662dc6aab492f5247c6eda478a8fcc2fb7589993765cbc38496766bedd8356bef7f1574cc7f2705c975d30376d08f83b423f9f566d11b71a4b325e55275aefbfbf411006cee50318cc60a014f0317ab86ad9d3fe675185e2fc15afbab6b04c94890b01026d6e8eb941d90ac2f8d1b52e9e6b822b72e97b41c572a79970707ec03152ce8af5a6168813812f7965bc8b4e3372712691d74ff106c979ad2c219d234993578523dea9e64c41b76f3c32f6cbab5a7dc9c948f2b7c6ea42d8b46582d08ec3613edb94774888024fb4db95ee7f4e6e94c4ba9c5331b001d18754910700abcfaeb40877dbb1904f86686a5d53ec9538e5642be94e58ae23209d2a90dc2e4fcfa32b759e5a1b9f20ea32f4f43a8c5b514ebdd77251eccf1285ac2b6bbe7bba9b2e87234602a514a68cd86d03f5c86e220dd87e901eb6b65367e204608d367430dee188241939645f8c200c49af6fde07c3ce2f7fb6a41e30b62801b76a51bd88e57df72d473b241ba03d1db3f3307da8687862112c9d298252159e56182d5dd8f0fe21d61c7e2edfc72f27a653edc8c6cde22a242b03393253067fe96f53516b339135614c1514219afd8b51d6537c6725ebb900d401e6359c9e3d3aa84194b9a106879300efe111c363a732d6cd20b4f201632627daaaba3d83c1ab3c37cc1eace3adbe9e79067ec47a110e5c6b561694ced9e86c664756987f76b1946fa719d07c42e52d0c41fea835eddb52aedf07bac34682c779c29e1db86b886f09c42123bf978da36abfe3fce08622e89cfe60eb9274ac81fb032f562ad4bc4141654d96af4fed8f247599336717e523b4a941093cfe1dada46510a49c7e027a50a33060b654f06aea9c2811ac43e4bcfaf99081a0f582eaa7a80194ff932282c3676151d6d99b1d431055c4c650331f2f5686776cb936b90a8da107f91d1c52dfdd8efbdd6ae85aa002d91287c0dd84a37a68feaae149fcb39a280d30c2bab04f97d7434334707f84d16951b0349f4a156027392221072389c77eb7ffd20ef6c2bc86426c483e18faf8f0bab8be59a78c09f0c474e6888a1026c0e9a489ab5d535520e1dec3b1e588fb81e6bf558b91252d11bcbcec9225affbe4e4fed77a2746807ba0f040e1deffd3c64ffb4dc2a6754bc5b8d62fcbe184718407662e34e7bdfb0bbf5fd7b02881f9868db4126710336417835d7ad875bfd0e2775075daed00bddc66927d1a7f0aeca21928e11465f07f74483ab14f976da620b9c274479ea1f2b8c66037df812976104930ad0775a5e16751032a7dfc7ec8daaa1b63740b0ab284f37f06180e441a817bf76b32de588b0acb59e0b3e255f424e2b0969311a82fb8a212d1cd96a66fa23e1c1943bdecc7a8fe0695e5f2a2e8be6cba9842cb09467723f60e062d83faf80de5e560f186b3f3ebe7435f5cf053ec5d84beba92c351c24ecd3cfa7cb21c04dec15b0cf1f94c431c089a279aa96a716e1cf192245a2956feb0ea75eb497901d0921c5d7e9ce8f96aafd1444ed6c9a6df2e95cea4ddf911f61eec849d8a19ae731baff3b5bb583f8b6f9bbd238867c7c6160118478f177c221c84a7a23e4bc3eb6461e79c35037412b3c61605c7f8a67f8625eba76c70f9206e75a5edc9b27a65b7c2f3e38e76486f6c4a02d8cfcf6a37a4833030005c34918ef184d202efdfa42f00ecbb1c1566c9a67d48c4882b6d3bc58557fdfc94269183b031c3bccc09471f6d139b4616c23e5129fbcb570f52a82c0a7203b953f53a61042920297a53ad4d515e588e6a8b88d7fa1e433234f33abbecbf37cdab71d4ae6ede4225e062ada804ebe42d510832f401ce3022796fbab6eec76364fada2721c4bcdc85492eb6dddd67cc49bb69f806b37129d21e1763cc2f0085493f2481ad49feab549869cb52271a0f6d6a80816fe2d703385f7264930b2e5967bdf3cce32c14ac277b7794e2604dee543977b35651c68a39fed3a05ca49fef1f2971a76ccf9fe011b1da0822369c2c21588f4922fdd08f914e6ed295d9811d13167620a3e10e9b0dd41e4088c68cf4282f5d858faa751ac004b8c39d24ca40dd700df26eccb761c200e1c578a13ff499d7d64640cc61193ff5b2a884391e8e8cf57603ca1b1e28515ebae989ee06f928a3dd68bf74a1ccfe3d46f17931971b3b7d9ba17369958b0e6fc0192ae8bf88c40925223625e41c97a3b7ee105b174a1d28ec273ab6e3131b4ee5c6ba15f8a17cf65a0991059eb7684a5ed766335ec903850f9849b3e2c47eb5aa21f2dd53f5f3cb107544185139f5b1761fc02f8d421ff007c1e4d013156fe6653d322f75b8ea8e04e9e860de43ef53dc5509d617638f683f91a37c52eb0f742f750b9baea5dfc1cd466a33d172df31e005abbfaa13499f04690e4e52b5776727a5dfce599e3fbe8903e34caa1f059d867bf030ac42aa3170ef43ba15a3b754740873bcde2f9b744bea1bce2589a97556078d5419466a9432c991ba2b9d09716a51bb80119e137c923845df6e8ced239f45d3c74e563fcb7dca818da522fbef6afbd6d797ddf6ab05f055cac0cb8fc6c0aeb1938b75b328ad0dfbf00d12081a15fbb6ad042798b453094ff70ced964bd33b476c1d60ab7862ac19ea1be00560519ca528d8548bcc85c8615e9678feaf858cff40415c327e08124de22eca833b6cfb5ce263f48d14f9281de84e9241fc37adfc7afd52e799f51b382d9c534470f431b49ee1e5316fd4f0a78ab2aae8244f0f3f921a736a88969caa1e523eaab223d3dc371bf27b1c9f8a06be671955a47b6168d3517e37572df965ec3485e2521ccef830f37aa18fdc9bae3975c8d9ea3d919ac0adcea102268f212401cbeedeb4837565c2f2b0d5387623d10473410b732deb6235b67e5d5a1f447fdd8dbe5294566c68d17a8050ed3537d8fbbae32bdf7bc33a359e1d523f82caeb99db4aa32c05584e57336eab1cc89e15e4d9d33adfde88fb68fefc8321a6d232354dda24308216deeb0bb74e2877df5e9f4fecbfd9f29905d7a8a412ab6a0151da929d65988d59b6efec18ea48b933872605d6cc9b0c383e21c4aac17f19e0e2b3633d8e7d40be2ef56e86702d3a3405784abd4e53eda470318b3d3cd154076769e3c20f009a975687ba0a0a0886c999311560b464e73f3ab36baaeb74f729fc1d1ee85fe5004363f2449aba0dd1032c89c77bc56d190ccb6f581ad667d8f4f4524cd2b9278afde14c5ba4d56e9196e5fe9b51a10b30d312caad6e5382b50340fc08c81ccad92f6c5fa762bc6de2b1962b590c4d18458e8ef9295b5afc27b572b5eb94e8e2dd4e641e80ec3626845b6f9448a8d7e581288b50b0e32fac731901f2804a2f5c2b4ba761eb3c3c2626988ad54a28fc9a8a034caa58830f4e651913bc99d7cd891c1f0512a9186b9caeaa3ad930826807cb2c5ef28d0d7773043af73397878377d180e1df58c5e78381fe6a21096df359c69a1864ad0d524c9122021c519c4d806a6548035aa0960aa2e0dc07540d53ded1e93a7f2ec6a8a9eff0c2b23023fe1bd1661ae79965591974eabba505c1c2f165e6c1df7b9aecf9a35bb5613e183d652a28673a86701b33f061ede3f9202f30b6056a46205027fd85dcca61a05639d02e52f4cc19f9d5621befb5a17b4e8064ef4d77725e426545adc58e0f6b4753ffbf159ae79e608532ee12ae051192553d4a05bcc7e04f524446ec7088904d614a28f42e575c4bfbae385cdc6cbcc521ded00e64e3d791bf731cf6337f15b4c298f95e35ceae566d092efc27079fbbaaf01d55ccd4e0571aa7c23d00f59415ea9fec9cdbc99f9b2a3b2d17e0591d02421e482840a4361218adaa2a962452e17224975a5b9b0bd02c58c47818e112a83731adafc6d944f86d9d74de1f1cc5036b181b728b439ce7a89342083f010127d2744601adf2ad0c2aa2aa46913885c724917628eb28ec57c6e599aee056e65f7fa39d44473cab844649363b3ed3fdcb06e18dc9fb38df12f036c07e5e0275d686e192d59ca89ac455fdd3805c72e363aff381bf83e7f431d50d70f2fcb5b005b656dfe0509bd81449cb7593b3925be1755d157d34bdd11e641cd7165d0dd9c726d4e4753c7f1dddba2d5f1f8370d5079ded4eae23a91f99e057cb56d6a4482a7cdabd0322abe7b96c47901b21c2c0b3c39a30de58d933da52d00264024bb69cb4ebff59842979e7a33244524f453af61add7747aa01c70aa0cecd5da863268c81ea00db0290c13a513749e1ebced0972e008af078c30e9d2fe1eaa5b5814efe4555fd3e88328862c658333ec59a38bd079b3abc590a61cc49fc8be90f7f429d8c89bf050b9f6b222f45c377796b939e8d493c0c2883b4afffb36a05c6c84843fe1a1b3af2ab84c011a93dff84e6042bd59e3afb4a1fadb06bddfaf0f885e7016330f6c81d29c2b166ec5cb79f8ed3eda2576031e357b84afb7f06148f7075bec506ad44eecf1b02f3c99134b40717aa79ba22285606ace740547312239b387080a09a3e1ae12cb164f24e96df19e175198d62d96c66ef1d188f2c42474d32de21093b941bb944b1618fe673ad7adb826b971053a081ee9dd352434077083d2a2db4789591c325ab2ae51552b8867a08aac39e502ca46a6b9fa907638c311d09fbdf19a24fcef84a7703185cc5954527446ce95e0bd0be5e5dd93dc2de0b847df2b506acab8227c6346b58be75851c827f37540490b9507210c5c3982e65ccd73a66a8fcf09862536bad9fa4b27bd11a24bd9e993c303ed9b0c9cd9d846772bb9eb511efd10e69ee7004c34dc9f9d3d314c854c0ee09fc66dfc4e5d67982354357f047ab55065a478b3b38af08302614b169ce0b91276ceb3e3cdd78e8be2c3d8db79c1b105301e728e740cbac7c22a0d82eb5223466d5cc644c38daa0ac40dddbc785a275b80aa97d43424474f2bf1fb70eccdf393eb884bb57856866a5951227d7c486f7625e38c34b85dc13dab8b18662e72977ac9e8193f16ffd915aca12a67bb5946aaf6e1b17f0e6ad9f4e6ef6c173f4390f6018e66134fa8e7b1be2734ab1cc47c470d399eaee1b1f6c66db5314f1e4f6a1a04ff8528197613e3210eca26e33c43c2fca63099e2fa74119d91f71946b26d5a624e0c3f0802103c31e300aa31c480345223d9a380d4d8b2ecf68fe69a22542002b8f70c81c03b358ec94fe92832ce90d3806e0e80465b4d22b0d5b695f142b71df9c7b44268326093b99e3b0a4ee15658699ee9494816348a4d14cf8c00b1a3e72546f7b4188a178e84941edf7e2c45e2ab796860e025d46f9759a0eb577ecb09d2e9a3cc06116cfe346c7b977f1b299f0a654a9a7f7ee24843b970a2ccbe85222f2699535991bea03c3ff0dbfcdd05b1fe915530ac03f7384f41ec20ef092a1aec36c27fdb378b7c82b13352d10baa6780be8a50f434f7e0ff439d0233fcff6653c3db8d2b2a09c107b5647d8d075e0a284defe4e6e1ffc4159652d80ebb27eaafa4d64162d277237493616d84e57e1e9943379b6b7ad7ca1825d04c7b434f432a82bbab4daaa2f7a7eb64abfd9a528f97e41da22418a8f13eb02ae26d85ecd101631d354c0d895a0bbc4daeaa75c4292b1340fcd34df214f2fa85b2bf1d09f17d5da0c4148c18dd8fa1bce6b90da449e5e3a90efc9f4a9cf16acde0daedcf864b0bfea1079b3e5a0684eb80a79e8764a8d1a9dc51d1d60d173ba711ff7232c3ab13567ee668c7ca29c3f4c6b437d349b1732c5fb198ef21388401dcb8030d111d2acd67b603514b93d469eaad7b178c5987c696224183bb8a5ecd094eee13932f4c58ce10ad8600b470b26a83f487d07855246b38f6bdc0bb7561058094374aab40c2c5a1abfea288c105c307bdf6f222b91e1c7396246984b48730c5223490c495173c3d133af61d591906c121e36a44f13879d28b7da17a5b3fe86651e677158fe5a98604758765a4e359e0267e321822e960c8fd84020b838507627c3b98cf6bf124e555dcc15bfa29811d4b248f3f0db739a0bcf5104e05fb906f16c144c5d708486abe7d5c2cf11efdf9ca1d7803f8a878ce2e562845697eacc244dd140f7dd95938469aceddb30aba87c9b35cf418bbf465886c97126c95a4297376cd562f85edaebecb5dd0f522b9b999c2c4a7919c365122ece4b468a0271e0cec7453754da1019b88d78c19edebe743300ca0c983083e8ce42024db625b12e6c625444b9ea3634879741a8edb9cbc59b2ba8c44183d05f72c7d74d508d921903e6b1c5e3e102e57ce8a0029a8da63986b6aeb89c0f46604432139610cb149b2f84797cc746f4c243c517fef3c03b64082d61e1f3679ef39304c32cc6b51aa2b41f3ce23863c29964a48182ef5553a39349d691f36325e360a642bf3fef8ebde0792c01035c62be93a73245ef731f1d739fcebe2d231340b4fc8cece5031df3d1add8fd6d3d7d632c8a77736b1444e417754fe0c327db4aff910475116064674244a311649086b0fc3beee76f26e8ea27740c96ee3585c9ddd71f47acbc61d74c0695fdeaf678c9b658fd8b664f8b0bb9896f5b89e08acc448d5c4ac6ebfcc7844ec3ea23acf4bd6e8249218c181be2d9ad198e5afa48ae312929e87b8b6f557ba1e5988df2e7c45760d87ed915fe16f264f76585766dbd8a949e083f506d7804a292eaaf411c9591ddaf4a450e54a60eae13d79d020f2f4f113636cb09ee820978ec0772b9cbfc52568d99f7893cea1667f6a47b8cae74a485345ee892160b4a656310327a4f0f03b479fc56782ec275b5f8a79c50ff91ceb22f960a7961e2ff1fc46a0911977cf9c798b66984b13a3b01597a5fbc0b1257f723e34497e62a1a9fbffc2205390f56d703087b01aefeb0f471e616942a8069231c80a44a5d967c78811e8f0485e0e7115415c331353ba801a90a653155ed52db0954e6b3aa63c8709bc3146596f1c5bdb4fb05dd3004720d3cf51828bdb37fd46d719fcd7f411fc03686affa8ad17c14280b6684a4fe603de9cfa37faf999278522732373188c56851a93b96a9c73fee55fd98fcd82cc7e8886c38e512c90af21c176c64cabf2e6abd8481a38dad64ea552ebf2a15f5094c2f5af983afafa5a999329c09711ae3bab58a8571d6584c377c652b5ea98e6a722f7509b957a2172caf22efe439c769545462bf661c42ee2c034494b056efc7b43305f0e35cbe8d1ddcac2e7e910e0e4029481753fb94f4f78040edf96388a2315ad0a10a8fd645845ee18ad711f54e151054f375cacc34ddcb431e2c66d8883f5c8ab0bd67aadaa69659721b4ac1690c99a6b83e7ef187001566f88b632f511296546fb2d2de278d2259c10eaa7ca0cf51be35618334992caeb181d2af42beb2851d57be7ffa9b452d6b4c2c8d2a7446a62a66e1add0fee6566eb602280ca1a6a84ebf70bfec232c9f2689465e35239bcfcb75eb2fd2e06ec13132eeee9894bafb792ac19e7195f6fa74e1b7a1011d7cacc4d8d6a9c73a904fe379f7d2e0f791141730d85b9dbcdbb0cbf85516c90944f0a63db91a68686a872733fef6460f9ab7b13e577faabee86334e161bf2b25483450689bffc39b9c96c8874461d36139627f1b0042ace8b1e246200d5e2dc1dbc1b72f5575e4160f5bbef1b987034887c085bdae39a55b3f19aec84c179fdf89d3d8d0b56baad022367833bb1da6beeb8f06076cffa906e0ebef66b507a4de361431f0045adac8293f5b1bc91c655f61fb1832a0548c02862d136c1eb4bf05f8a4d764fd84f85e39bb7f2b597fc6a258690f2052102cadf23827ceed2a9f690389b428b825e0fc734a47d4cdb4f274a58d8e389d54aaf722f114ff77b8b9d04d3bfd8cd06922a9186b3a6d626927803b7626262be032447d10a814d8b052e017bb592d1f7c66e25b8d207f9fe3b1df76acf952b0639c2307ea1b24dd3996ef0d77325add441e28502b582993bd0548dcf93ad5cb7a6ad2d495ce2476bd3046a9a9eba16c9f5391d6c816feea352b616ae2b2fc1f3287b678a56618b4780e0e5f4a19f9afd88f0ff6a9855dcf66a45bd36e51f2fb7a969ad4d390d1372fb96371588f2a839352070778c42ff6262e53051e6faeb41674e69abc994f2750384215ac23a1e888bf20b57cbe9d2feb0529dffb318ab49c7679cde66213732a5ed8c72a3a0a672838718e930c3775ea40ed7e50d4873185e2da45826e58f6e9c170cfceb5964dabda0d972d04d9d28cca4b5be97c814bd49b4a461b4ac4dffea607421910c4794f2c28041dea4d20d6afd43df84fac6a9c27caeac5f8ed65b2f38087f13e85c9bd849ba6c20b7b0e420cbdc2afdc5f5454f9c9082566479a6c3cccf3231ff7b83117e7cc10ef2c6a51f00e6c10d0bfe0eb2b24cb03006eac02e6bee3a592e5893706afde12f6550eea643db732e47d9314aad054884caf4a6a17db8197d86b81c69fa74fb18610c2a561cb84864bc74c8a6e3c59404dcb23d888222c558c81e2d7c533bcc1a8a7dc1af6fdedb522677c1eae48cdb4d9c2dbd4a74bcc34ff70981aa93cf62d117eb988fead78448a9828c3f325109eb2976da81a142165bd04d6afbe7d36b13e651fe0847e72b3b44f56fae541e723db1b727360fbdbc1ffe6e00dfa8b960f2c8ea3b0468601073cc09f96c51074fb05f7dbb701a476ca5a20353629b928591fde4410f8916124fe7f50deaed727c48c5a49a1d290711e6be5d490e340cab6c11252e7a99ce61765bd6a6727ba6caeac15b8675ddf60b056f1db3611bbb32a68037414bf4bf41537964b5cf1fcb77ffc0c71f6c6232cd4d4109fa1aafb50a1f893cf55f01c9388d0417879bbda3ff8bad76a7a512668902785530bf2c7b2f77bd4758de8a662700eb65ce7b4420b147eac748db6be163404979f52862d8a9f5c6194ed85d7640e96c95f98753f4253dab5b2c2805d78cd2ba26bef827798e2b594482c6f0e2fb4d1393635094961f4711fc5f1a453d13924bb76bf99b63bbb78a0b3662f56687e8d9bd6bc844a5e4810c86f84b277b806999a03609a1ddbd711e2b5794bd0411fec4d6a31e0e66d6f4a97e354721dc2f722d92900b2307d56febb283be52b75c114f2900103ad08bfefb8e7c4dd1cc4e33422396dfae464d3c466d1be1ecb75741942dad595a0cb249300b97dcf0e309c35076313dacfadb3b35adb5b8a3ddc9380767d33da71539af451b59c86da37f1d24d78837cd5c38bfedc9df6aff8a3f4442a0da29b3fe3c86359da6c96ce324a26d23950d8b2064462d00250da7898ce68ecb3f4459df2eb71784bf2fba5c2b2e6ad83ba810d856b95ab805bedad8dffa61dcdcdf52a6d532fc78cc40200039e9375f00f31695c78fca5685ca82551613777fda4b4dacd412d65502ba6686e9dfa172255816cdbe6f1be44d19f31466b4a160a22b4ac4d2a47ad30cbae22987c63b2e880e45ef1c0ce623b003762bf685ebad2d5f482b2c2092d9b14910e1e651c1c8c88b841e05a4b40b41835fbc6e1fb260c2337bf1ce75ac3478b76ba170b4955add57ac95a8639a54bcd3a2b6cd00aaa8148098bd253f7d4ddd6371816c9ce3df7b6424fec0f785b4914720912f431f52e6209c34bb0bd823008d3aa94d6df5b4727c8f0329f2fc7b1eab7edb23b2441ec7a42ef4d276331e9be2caf68d06051c8c12589f3687af57301807e22a617c109bf5a3191e8bb198f2379db3758fef2bd09ac0d236b425fcd4e10385ce0c58c8ac476da0289c8da79809bdafe247c69542104895b59a2ca17efcdeb74c03cc9227eb81b70f6094c84a045ce5a928d95e87e0a227ad4108b6e726efeef65de16a77e167f384c965ae9fd89f2e7a6e0021c1d85e8fabac5fb56dfcb55030c00c8edb56134cf9f08cb6602b28ecd41c6c3348d62acb1ab959bf7310cbe86b7f17400c03bad10eab214430aef6f6119e53ebb6879b6acff90efc364897b72a37b13d32496d1206905448eb7006c541a826bc27160f5bd7f983a18c4804a544d2eb1578db3d1bfb8f28babd6e9640f2f3f818ea9338df17a7ab13a347fefb030e3098f67849ba506c936d7086d1714f68cdbb722a444a2d16b4676ad360fffdf2bc95fb558c443bfe1f562556ee38705b664a92c03e1894e2439d73a33a9da764064a637a3493e04eaa5ce248a507f16b42672aa42b5807b753305c399fd7bbb8846c30178a2c2bc8aace7d51ac4c693e02b81865577ca9775eb15130c45f56ffdf2aeaf2287aa4c18b37b26570200270806ef2f02900aad88faa2ea39e8a718c5b2955bdb6f6cd22bf6ecec3033de71fd17ab131eac4bd789241cf0673954e95019c9fb246fdf88631d78d7043a6c3085f4b030a1a8a9bcbf75d7fbb8266af21117ec811bb0e795003056a13bce8b290e7c8916b501be9056b01ab437eac77840e117f0384c60ab4fbc9d8592808b70afd021e378415944a1c1eb9ffc20a29fbdd74730e2007215f7ad3f3ed19e996e653383e71d39a180ae48986ef5319c326df8b542742f75453eba56be1e809265a6f895ea618912cb3eb71664cc04ae5a48af60cb16fa8fcce2eb26fe768c8efb184b304fca70da0a55eb93b70e9cbf72039073e6ef32ed3d2753e5940b0a6fc207e53cd09395af6f88ae28044d1295575eeb3acb09b656f668e040fbe118931adfdef1788524edd7e7ebbf167f4cdf69887bf5b5c0df0eb6982f8e5474a27521e6d4e64e5b0c3d8124ae788a30564c7fed99b94cca6afa53432f402c3a090ca326da87671cbefb0c9dbe580d7b5aab599240c83e6bf08354beea795de056bf21d978c0ce33d480b560a6701d02aa9687c67e064f05a240ce8dbe4dbaaf99245c5278953ccb05656a1997684fbb13125426b119fbe3f529fb03e3a23669fda4297ac4258b90c816ba7992cf144a6bf0dd9ff889d1ad69812413a346713fd105a259fc5e79cd32d1ac31e1ec7fc6a552698bff01f12fb8b7e96421353ab58f1402f14c9832d5109b9db261c8aa8690c5486bc7861e2a38c08c7b03fee8b21e2b247757a3277f09ad18122325e4ff83451d7d2d157c38f9b615f3a4d23a96cc900755d05a90a37c9d256deacc0ceb877e8c6018b66a9ea8b1eb43a0b409ee9afce2be8f4614e8581c68fc22dae04e5526f7abe60af502e18a22b4c678aa6ea1a25fe716f75ae11ad4c15f0609baecbaf4da78a1d0808b20ffc91072a68d88491177d976c2e6d743a540050a701a269b1dddeedfd47aa34d123e3be208043687639bcbe6363b8907aa359f36c4fa44d05c83a9dedc87758c43000610ebe54cb542ce4ef152ab36b2bd2cbc9fd8371d8c5100bd3e832a821f3c3ac20fda464aae294aeae6e4d2ea80b7b71a5470f2625ee7bf91074171e2f48bb95d2c513dc49fd75e6ee359237a97a0b06f61729a8580f29e051b85c781600dfc11d358d961e64810f376a50849c3eca129be7f35bb71cbab20489fd3d051280d65313f26d6cb14fee0fcfbe8633f4b63d4f9737b9ce810dea6bb7e44f7abfa303b289ae5821d20f3a372518ef4e5a15dad1b67569352f2b2d17d06653d9aaa93f9fb8cd86cd493d7e94e1719035e2cc4c2ffe15d0d6a80fba2cec0ed7f9d6fd27df2e795f175c501b733f54f56263e01f17c6539bf630a27a8e883fd418333063735a307b37a4a774a1b452a1c704eccb3602e6b2db3c7b1847afebe407053203c88fd539a90633e227e113e5e2be050c6da52b1c4f2b7cfa5c5fe9dcc754a2b15d40979881a6beef6aa0ba93101c66ecd31b1d03598f5cfed325274d360ece907b4e21b12d607e06144a2082f58b62d0d0f5f20a371ea60e2ab796f609f0753dc5de990d2148a148294c1a534e889e4ff7f116a8be4653a5540dc7e5d85da871c37429265992083675eda6583d56c714e0c8013f055720897442695e347cd76b0c31936bdc1186f9bf356406515c3ebe650d7eb1918cd5fa8ffc6a1300f631cb508f994fb3854fca51c6a76a98e5be268fd25b2549c4184c54e3c3298bfaa190f0d1174c6ee8dfe06cb87484a658f4fe09917593d74b25eb6c2c0cbbee0fd7f7e3f1908b67808bc50944da8edf192fa4c081b8b98eaec940e8cf0ad9cd2f18d1bd3129938dbc71a4b3b96bb888fa9e904e7cc2c7c5c63f4b8e1a33e280d403b089b1bd9c424608644a2abbe6856558480560221304135858a043d2b42bfb29facbe13dcafac946e5c0aa43a66f130d3245f5190d7c661bf57053a9c59347e121a5d2c3a68e571cfc1d25bd0ebcf68ba25b2dd66d5138f1d2e734b9b5705d3671a0acaa5628d4b269e065ef936bf8ee14cc7eb861e478979c96591b74eec2a81cd82e3a050b35255b633182ea47bd9b5440181bc4b9fc85bd17818b67b5e284ef54209170685c8cfcf2d03c5b43c09cee2a64047e9a8e77f313d258305583056d614411f5becab88a68cd27f81477419f9f359024edbfbe7f3c9919c702b23455759b4007678a3e5f73e10229a4a8492719364bd0b4457968cdcfebd4ae11432b30eb370f04d17ef19d68ba324daae8214d604b1d3b5d42b9f6d27cf77c0299a8da9032c1c903532c7412180ff4ff682f2f81cb84dfa780ee6126cb7d83384ab9d42c3105faf7d100aff05201c44d11950f3a9740b3a48042dc8db12f4735bdae3ce4a34ab61d5a3abeb160968bf16ef24ca371fdcfe0863bbab071c376af1fc312236d80996ced82338ed6e39f4bc6a8c01a8100ae6714ff39866989ff05761f94c161c6094550b83dca21590b925c842e4997223cac1d53996a821df280446b43f674e5ce3b25f2de10d46e880b80c69af1cf140e5bf28894680d101194b6eb400656cf1b703cf2cc56591510efe85d8a15e54b3de1c92ca0a3b4b0a14885ba649f8b36588ac4c3a1dd2618cec73d253c6c741e9bd5baaff2ce4295ac0a82ba70a5ca97039235feb181b02b1b4be5613b90ded1096530cb58b50d9e8e51474712d34bc40ac6be2e12545cfa956c15a28bfd479e49b7b866c131008dff56c4e5a43f1f167cf36b9be4f2b576975a07caf7b1a1c53842ac9835638601875d68047e8ee5c17cf05b84d02fab065cb248e9d7673f65298de990f0f866afc3606b59511b8582841e758de73c020b6fba2710d6c6e47b020b37d06e2a79dc013f4b0446776dcfebb2cada107dfc4d1ae279ffb3cc175d1a1d9611d9ee97f4d561207b79fdb609235ca370cef753cfb71c2770cfd5501c1600e6c43f840f3d0531b718bbead047b75979b06e1c0c8d6038209d4c9e37d01b95339fff3259c24cd34bbd93cb8a17ae599fdb182987ab6d8c57490daa676a43d641c8973282fd494e99cab2e5f211bdfd55c85352a64dfeb7c810918f728af09e746eecf798f31f9deb9776e6b4438b10c001d07d162b0495d5b1413b8d262dfae0e6a24e9cd36fa920e80691caf579ec0e3894d231c4a3bfd2c2fa4dd59c733bd108d34259f39d14c590f233d69e484627c15f30a8051261cf6f29759eb269f9bb50c42957c9f51c3ff6b926c60da34e7e4b7742d15218f885e6dcaa958981604e7ab35861f455fe25f8a81d679f7e856c75ac20addc131218aa87104477fa758d0ddaa387483b13bddfacb8a26afbfdc3482b2be51607af08b374189cb7dc0abc0f21f597b3be2b6998a8f51cef8aefe3f2f96856da76718eba99b6645652db26e9b681ff89b9ab398a165eb84f13993db6ba1b7de40d34c7f9e499b924ef95dba1a1578ecb5dd35293a8283fc8b8d36db1aa546839effcc73ab5dca3a6a4dae8a71e51d78a181039f8ad779e42d0d26658fbe5602a4990b9d6f3948b8526452041d362ab58541e68be86199a61c07c859959fdee53d70e77cbe04f6b511c828d3d8f660a4664f311b37e97d562de6a6d46ce9839fde99aa877be7ddabf47a1d546383687465ee81504ac3c616b798a4660c03cedd4612e9d9a61f9d916a85319fd3c2392259d4f18cce2056c56bdda23ff73e3fa6f4e81f92f55ad68795f82544f97db479b98b75bb3ff71fa82661f77e66f9a2cbdcd1efa13ffee5c5e8b8073deae1095906e8024fe1b9850017b6e1453e4e9c53dee90759220be874d984f4c11cbb8d813b7c05363cc3323a81654e1231a566859c3725b024802958eb4e303a95b674cb8e630f9cd23be21c392508303c0c0b9f694b710994c87649b4f305c8a4ede427402bb63ecb67f0fc37c522642fb94302ba21d03350d2cce4d3bc8cbbebbf4011f4d604ff8331636c81257dfbc34a1056567f2940e4f128a77a5179cdf0f69cb062baef3db4a535fd05ff1d0fa3ce055d0fbbd344061fbee0ae32e13129e04392fc38b077eefb7dde99fc60816f8db18587effbbeace700a2a43d610683c69cf86b96696a22e4deb95e2785eabf744e15ebf4a050f340f80ff79aeb9ebec0b53c5d3bfd558df2e35a5df3b2cdbc0a4a39a147df8492d04829f71cc69426467a42e4b75f054816748e3c2e560b5395f1eb9c517cc5b3b21e231916334fbe45d97b27c26127ec73ee305c9b3e67c00b8b64c0d532826819d21bad14a38ce7cade4d7bc73d2795845efbfdd22e6685fb35c675255a980b9a6f7634101056479d2b6e8be98f081470c9bd1797b9fbb1b6799167128c1b3cadc59229d9e0dff84561af772eb08aa499c58a5ff3295bc6b5da0da81101e759d6747a3bc008193b87912aa159cd5443db0afb2c3d988ac9114a61701e00649acd1225cda7f9539684d88db83032bb6df10c7ef6f876da819648134f7811b7a8fa2e4313eb3b9eac49a636f33b13ed7a542b74703b873c57a7916a1b94cf9a8dd7f92c19d7ae3bc2e89d0f461253d19495fe81ddf79d297477f39cd2c321c471a1237072dd23d841654ad5fbf6c43d3d318744c3fb4824c7fb83442b4d70cecf653637ccc0b15d72fd44acaf2b9f81c59b34561a17439ffa5d5fc34f2e9db5d285c0e59b42ad6a132328b2fbf973f4d028f71d73c531bf5f1d7028d6468d874e285a647131979db0daacf5cfe68a6ae277660e15e0b267dba6966fffe1932fa556c420ba4c4c114b7571ae51afe0221a4f561b44941e79df75a0f3f697e8ae5959f9e772c447d278f21b2cdbbef29b60fe72edcf446ebf8ad233bb87d972c91a369e760bdaf3379746811cf47bee8545276739b9ba190d59701edb92418c663bedbb885f66fedc782a2e2cb702ca3e57f691912d85793ad17ee34b8407ab3d111cf25296f90cb9b0cd3878f4de7d6374697f0e947ce922501369562dda0448576cd2822ccc0df006c42d0fb4f5965f51e298a6bd97be4016e435481d483cf6a8e3b4bb45363dc2b516a98550636b12c99875a5db6a01e8af3c7e9654e318e54100c1a90105c31d3987a4751c822cec87f6e2fe3de9b89fd5c5f930cdb36de2060f3a6c0c6cdc4501791a13696cf114212b1fc5ec1778fbe76500cbbce0f7e38d675c3b4fd836f502256b49c4bc6396901d32efe8401eb34517c302f429787e7146bf906006627789f92b83944b0c0bc9d9e5f2937c20a7738acbdc2dbef04c265bf7b593396da35c20c65c59d78094e6a07293dbab9b42b3d30864b6b810fc42e25430f58cc5de6dd1abf386505ef4f2fb3b77c094fbb8ec696addd4b092e5c40244215b23fb28b54e49ef73cf3765a983014db47e9236e770bfed02828d9ddecca5d07c26031335cd12a9ade9c630e0438d9189780a684c439139ebc196a250feec8b9e803215d52c2a4760b78bd2368e80b81d49da5bd9a1c8b1728c53870d50592aaaadd639b37d6d174e1063d747fc11b32ed9895a7a83fcabc79af12dac38c0d01cb90d3fb7127f1cf201fbb0f4c40c3ab6743f3a05b0e0b59741175a99873db572d084fe08ae62051f51ba9e4d659af339b34753909ecaadc67eb64afd75d40a339a3e357318ad8a2b8d272c9d06d917997207b042b5a68e18798ab0009b0841a46e9cf202f46a55c3550777d8c12958190b62c53ca572d99e3c1833f460688cefc1282013eec32d0bfe057cfb703646aad75ec8b5db6ddcebaa364a05eb8475abc4ca44ea1b25b5ae7ba2dcf44573cddcd897831ddd38d1b5b88b6231fbb21e0c2826f1e98dd5132ac59f2af01eddad494ef783e04de934d17743f61101c50c992a64a1bb0a65a987f6708f5fab9e33f975544e38493799637503ed3bd6796fecd583ba11bba5cf87e1da2f3e6f7c91b969a8ab39f40f02d3d942619f91e1d07d0a011cd45f77d4781e7106010a97067e6baf58e390bc7c0c40a759921035eba6f0d3400da06bf57e6ae6aa97989624396a53c45d2405ff3c00bbad3656170084a7704b7037290f54c18c7def2246d70fd50ae02ac077a8bd45eebe4ca950a4f054bf8e4750c2d8cd26ff69f1e4a8c0ac56966504d8b70e963e6b1b28b44dfe15a0a3c24eca1ba98231a95135c4acc3bb7744da76523a5db08a4bad1ee58a1e1527392add4370f504e6d8b1ac0383b2bbb412db6669b20c683b1c5e54c1fb06bd6e26b02328d23a1641c519ecf2fa0b4b36c0d4a9d3bb8d16eaee36dd0b3b05c5a1ddd6954a5edcb7c6418d60f1bb9af357465eb02ed7f12904553bfd19f363236e2ead8e6486feb752400488d040a75788c90d5cb075af6cc8d84ee443f87f53c2b8cdb9669fbf9b4a3a95fa26787983ccd9ed427254dfcbb6aa5b1cedadb0df5f0ce352d1026f210f2994da01834f66c46196a4b7c23e1afdb8e2e439da65e51d6b064faf37574fdc7c0a1f58235c5b7db0ab8d28180784f6db9c38e945e140d18cbb221dcb756e37f3af0db6a1af256b1eb9979f09227375aa637cce57e2349591787de2e3b0d13ceaebcf1eb12172891b02fef42987d474ab1cc73d6faa0ad7c720737e661a2ab4202590ed523e5dc1cf83b596769d9fb46b232c6656752279633a2226f631c2caaa655d87a5010cd8aed7041b80967d89691e0be6035b8dcbc6c999febadc2c1072650dd9005da59839f00b98857ac3e5675d3bef292978516ffe609732f528e36fc22a7befe19d1e9941024d854aad12b7b7d7ea7e0bb9d25cf763f8389b69927c3e9c9047bfd8042a1b594ff61790906dfc0ab60545c31872cbf4ce701362ed7e43eea36429db58869461ec44bfced4911e3eca5518689912220e26869752428c7eee37662b6b203af3c5d424c2ae48ba928ceccbc223138c988f33460eda1416c263df6cfa665cafae432c619ade42b050e33843ca7658f47d581bcf5d01f7647cc6565b592ef5b07e8333ce5575aef9bcded4a3df69dd615ce1797412df14c1d8d5012621c9d8a3db844b18cb43e04eb809cb8d5071220d8aec40be5dc4448759435206c291a7eec510341ba4dfe6cbbee87492fa67e6a59ec97edc8809613d40f32e29b967bdfec1ea8eea6029eb523060270774ff5dd6351fce749027981227b162b89103f8090e4281f28b66b985be1992215ed523f79be403952273b037ef57850799313cc7cb0a6317acf50d2a54a85dd8515d8f9287e672deed2e3989e3dcc30efb5fd000fe3b679a5661ccf4df9c45182279be84f2b5be4a52902146d56aba63a372ba3e6f87baf18bb44b003ad8241aa3ef91fe7b042f83e2cac67ce164ea735b7352703154457ad0be8d703a8dc6eae17254754eac3ad9ab71a1a1537f9792a6be3922634c064a74a19f79abfbea8e144eb2753b4b82e1e700b52ce761a027bdc142609ca79e2a7800da044f60e1a6325db7840768eac5fb6ef29723043a8402a82c6f4350c34909b55a31636359a73af3906b48303795ced9341f4896ec4bb77080cf9b0bf1f2d04702c15d53abddc001ef42497d237dd04c2818b503bd554687266d7096b1d2f5038bdb44906f883c2bf0d2e1020aac3354af0f87e92ee1bac5ae1650428abb288f1e6349d9aefef60259ecbac35c4e302dc4cd2ebfa2c8e65380914c39179d67c26f9940726b77af62d32d563381561088f867e1e4bca46fd7a63ba28706a2a50f19882553b1d908104594b3b8cc126a16fefde928290fbf70d8c7e843ab6b5503fd5463c6c458bf2be9982d527d3a78acc3c4a7334d0ff58092c1d809fbf809d9df02c71d2ef2686bb2dcca6d522489d6907142e14ea4f14c50c241ff21375aec78d64f989911c4b21f4a491eaeb2eba7da6c0c6bd1b235bf98217e57120fdb58341af494218e68ff9dd5802642cbd4a94964a7714d77de8971ea918596e37aa32f8c4b8aa40ca94f15fa43ddfcad0e40f974cbca93fd604a1ffe3698bcaf72e34c1b5dd6b745a5a0fe91556bfff3c21cdb2ada778511f9ac298c30004be31342af6fbc3ede9cabac96818d66f9643c7f6a4eef049d99c1bba6d2d28e877788878ce293ba6dd933a3ea4bd22b4f99c09b5768e9be84a17a9d119aec61a20d8c994bf728435d937f159ddf9f5646684de8987086ef46e9556286d19c43ca48b166bac5c0435abaecab23693885ff6f39b4e186c65b96f545ec5f2fcced3da4d0a28b5b1a084f72fe723161ccfa1ab239bbefec9a897529c124d2a4b0cef034f85157f0e3e9e11c67f1937cdc4d4e4ea340359c7f580d9f4ca549af65f5dd40b7dd7b1d91319b22fc50e06bee51f05371756e2475d4a9a6fd9281a9196650870bda4a0d94c93ee56e1010bec394aaf971480b28840c7b66aeb4de4ab87a9432b49d680c4881098c4edc0e05dc53a840ba6849a0a5837983e592f7b6d1e99fd008c9cab7f0be741d942267eb95b626575dbb409d1663a8004c50d86df8c188e3cb5dc7a928d1ceecdfb49ed847b3d5ffcbbff0fb2d481f7cb86a75ea1598b5bf29d222d7e78d60db4861d852baa2989695774ddfad6aebbacbc57fd204179cd2d22da66f1fe2cd166ffa449c26894e3621d47055579751063fe62c09506b1ff17366118081637393796f60d74ecbf80ed79f23ec209be48f558d8526621de4947b1a4635b6ab8b10edae2176453b7c42fa0a29b546717045c40bcc5462c019c02804c109b044f797f09fdbc4e9e7069ed0011dd266bfc28ed801d16bf4b92385a0a1b53c1b5d02e2e0ba8ef22859ee0cb1046feb8b46a718e13947406410e3a23835318a3a408a430dc03b0db9c70459e15b06a13227c0e29b547b70974b71fd069590cf8e084d1f21d10c31cbf48dd601c167ea8fbe0c27ac1dda840a8bbac99a3ac0f4e179b27d01bd0adfe55e86374a20239550b5b90b52ede7dede6e3cf90bd5a23bb61afac2ea9a67eafd218cbb0f4d9746886d75e6f5095477fd79a733f7ae108382cedba3e7d19f2db18a7510262894c7e3e367792627973b1f4468f355d5e727d54bd8bcd6179c44f39b6b3b4b12c09a321b43ec5625c0433da1647f2aa2070a54f3e852516b2ce2328bbfcb1ae740a24bada809092a0c9e3c47b9f5f0c96b71d1ac47cc835fa6738e34b298c4a08d46bbe5fea2190193796eb06d82df55a0f2500fff0d72f7a0c56886fecdcd8f6d80b200c14203aa7c8276bb6fc0936c50ed420f5dc8636fa1af77f95e04a6a2cd191737ad0feddad37cbf540f9aff0e28a61efb91394bfaf0607bf090fc2c691e43c23aa5e37d330b556946b25b4d45057c220c37a79a0a2556c6750a4d8569929faf0657fbcf6d2fc4ca0c954ff7e56d94eb2b71ae85713e3cafc51f5a3fbc87874279bf0644e4811428f22ec4bfc1739b9a6ee2b8cfd0e7c30e72c4e273b8965643932ac2794fada234e2e4c565940e5bbc0873fd98ba7a5f51938a4280a8d09c13cbb78e8bf6d6d42579d71a0916639f3d954c0edf61742dccb38fe16232103e73b0e5fdb38e797a057576d84f18d1433071e6d720adc5acaa6ef368cf4816897c2219f51f4c75bad2e380a5c4db6bdfa3eefd2c7d337d702704a8ba9dc9113db80ddb5e9b5aa6782e1aff840cf9d960f3e8f905315c90a975ed81292a35e41bc3a5b23cb9f74c966b92c48cf49bd0213efde706f623be3e05037351050d8cc5ce756dc4504f55026a33a8965d9e38a1fb0b367898d0fd695094e9775b86bfae3852cdad3edb756870ac65d4311b3c789f5219cdfdedacd0344947f25bf3bcce7c6e6a7d07441f31a42e06944c659842c466426bcbdbee37f07e81fe7f4259e795be5a7c907d744ab7e9550195a6ecd6d96fe98d10874aff8bf231277bb3f0933b82f7dda585a75e90439e99b3e06d18fb20ec3145f74a6bf1ef924650a1194dd01fd69e6e5e44df4f897767fe0fc8369b02330fad3775564f0cdb524e0f815745e54604630fd52d76008e6d9619210b3f118d5924274ad6b89abbd551277017bfece4abd0f6ca68a7c96249ee99536651e82bf6ffe4e0814fa5166d0cec59beac4979e2cc1f03f1d6a8b5942fdec39165582bc831e658bbd8cb68e5c684e10fea6cd3a5e923124dfb0f77f18a76f045054c58110db5bb19d45889adfb7ffe9715291feb035aed768c81ce3a9fc52c76375c36aa7e960ff87bc69267492863e1f0f4ed96e396616552aa3ac51aa59b81219d6d65efa4a2556337d861ed1ca41fd347596dac20f9283923d4922180aae8ec5614eb3e6d6bb47cbdf01362efc2a44916e8609bb79e5e4a79b0be29c13c6440bfffea769a88c0194b177bb28e30a2ead6342ec878b0be89908b21e9b8a947ccb2b2f6fedb0edcc3438de130aea36913b7f4657ccec111132348ca73da9c99b62a467feddfbe345c547b368a546496e6440c9ebad5e9c0c56bf470741e8d308720325c9d4cb93a740e5d3cd2362b2acda200a6d1d330ccc2ee89c7b6e5d5e9f80ec5da0d2d3738e15b97b8498d825a2aef940d5ae984f77d5c6ead32a27b40c304ab9e73192c7d296fd8a2189c9b5437ada249876f733ada700e497ce056713fce27e1be8f17b582414c860cb0ab2dc7fb00d6ed1e8f5ac7d39d82f9356b6732ce2e14096845e2a6cfd0080e766fb8536506df4ece97d55ad5c0626701b5c064225db4380883ff821ffa025c7e76d2845fbc13a84a927f674fb63a1ce147393a8d082d47f6e901bbd03d8835793d51e485660841f48b89715bb73ad3bcbefdfc2343839f63b8b1bbd1f87c1f42389752f274026795f9befade613a52f490a1a5b9ba05f45fa8e1a4396dd981428ada5bbddd9d800ba95754f7e62ac3756ba604fbd8cfb044dfd82c65dc998917e7e11b06e3ee63acf5e591f214083881cd701bdb519080bc4a33d792801b23aad4dc0b1cc885c308ce9b1daf7215fa8352ad5146e436bc242124864d3427385171f6bb3dbe16739819dcadc7a0d8a77765b23834aeea7318f929b4d73a7aaf7c5e19d7b19deb65bae6a54c3cdea3dc4cd5bccfb25f8ec31ff729723c0d222e648846fb3f393ac36f45890e1f91456fac7d4aef9d67d11263bd6c4278fd036fdccdbcc26f6d4dba26e2a0f360db1fcc8bfc76cb7fc7ef2ad62ff9e79740e7ca993ac036b7d54c3b43da58e3fed2a8314aa25d8a9f8ffde1c53ee23b9d2afa55ff1ac77bddc16aea389804d72de4c8b9805815bf918a9eb15ca433fa11d2199ffc60e3ba9404fe1e5c390cc9c338d3c994d71407c4fef684eff4f46ffd4b563956028d079684367384ba1735984bca769e11b23cc8070c2bea82afd63615f936bf882a9c0be873b21f035cf2e287df22ae25caa2ba1b07e6188b616bc20bd63c2067407321f60c1bf32276568d644d5316f0afb16261f349a24e03c63cbcdf9046b42eb9440696ab98dcf93639b5ba1bedc2ff69fa1a5413099164dd5f4ac53879e7d3df280a5f758b8231ec5e32a26d324fcbaf22a702cce966f743d5da3ced3d47e7229fab3181b08eb29798e9bb808be95cf28f6854d604cf0adbb229d28b8a61daf840c5fb73d4c4862eb179726cfc8c6b0b124ae95d1535dde0f98d8ae85c47314c841e67c399593b9bf19c49c6177ab52d09a5d19b16d93a1cf165bc0d62ce245a7c006ba701b9f4f11ddbd8675141e6f9c50b6c57f362aeb7232fb6585a826ae08c12954b5538adb4c5ef977d8752ea0797b2323540482d542eae7d16c8fb866ae54e7e964893a6b267e0dca287c9b2bff217fbcd5e93066c7e3cda7c6b4fba7ece5f5510ecea977482542a708140716d7f2ee6a61571bd9c835760157cd4787db3178b0ce28b4b793d2de74294cc1861adfa6cf8712d007f4fb37200b4da7b5c5e70fac924a92a752ca8cec42bf4a622ac712ba97ce2b1ae9a602dd927657a65706f6c7a4425710b733102d7c52cd3dec93eeeb2b572fa77dbe41f6c623bd7db1bd1e8fcca4d9a611ead7c5a86a17f38688f8b78311ca7f8492d9eb93e8b4d8c9ba711fe92248dc6c419dfcbc7ccf41e24d83dc6845a9472fbb9e7d3c9bfde4da02be74ab62ec1d9088460f451e1cde3462acae1c5c52efbe2de8688fb5f57b58b746eb09a906044f0bb0b28601495ed84223270fa6079e8674474bb9e2803be94b1530468ecd3bff7bc0fd05a07bd1aa3dbd060d1d59361379039c57140b2d96968670ea030422e2f0e169c7d1204800eeabf1fe62bcaa6426300c62ea3ee5df4a0a94c7205d82cb9f38872303d2835e0d64a98caf83cb2f69e7876a1c0422f488fda2c821b09be2070ec67ac0a311d043e22f6de5a4c2c2bb7e3941853c16621ef85c358b584771d68ec243c72b686cca5bee8179a2bfd165fb6e9cad124caf236e288535f4bffe8a744271b1eaf5b514cd3e978fe6038a65c5e451def5be9c30affebfa279843310c15cae3c6e1be12a13298cf4d018695917193b43cb14ed5ee9fc05bb532bd0106e5461788c703cac67e1386a3aaf2513d697d4ed1d400a27a3630caef09c93f22d130e84f8cdf37e050430cc71788203ee0aa5a33b38a9cd6b220da3f34011342f4578d7364b7b20126b064123bb3af14f03333a5cffa95cf76a3b85e2bd34aefba117ef375b31ea29b06a12a2ade53ea02216fde20fd33255c44ada11b98bfe8d85bbfb473fd54e6142479bb169b494fa48c0f8d04d46e309fb3d39c0c494f02d72f1db705bea0c169e795f54d37fe48e4712c4cf1325b6ecddb116927a0f52e49359c825a041ec6a4e307bb10084d432a05b877d947b7a1a565eab93ef74034fb62f031371647862a4de8a15863c61e390bdddcbc6f8135935217fd7119fec9c074ebbd1f2c2122631d7ee0886bffc94c3de6de1d8a02f7b11149d660a10bb3164725387172f8b6b01d82d0dabebceb6b488a9fca3d3a67baf01bb546aaadbceae1796923ec88bfb22f6460e5f66890999fed2ffe1064fa4f969b75e3a4abfb66fbc8486cf99ac84465e4ffb40d4d2cca782960a394a64b632c9b49127b28c01ed6bf0bd3e5001829cfcea62eb483a4e67ec0b2569961c264ee03f2a1e5f101cdba0d8bbf1aa467aaf0df03ef9eb28b0954ef6a48ec22f5f63df35c2a2dc524b525584ebd56b8f23b01977e76b600cc8e1b932b662118b268c2ee7fd14995bcdd85a5d456b8f76fb7b78aa798a2d9206e85fdc45be066e72f6a70648d2012ff18d03ebca9ec81817cd6e0ed2ada486ce74b3cd1564ea1db3e89279bb1f9745249ea97e0a74a1658c15ce839b6fb867077c5b3235c867fb1a48a022108d2e97bcbd65a9312180e55f38b9ea1ca67b7e863da90993e5a4c84673bc52fd34e516397f68dbd058bab5ab00b59776701aedc82fb4eb03a0d0535f22c8f5fb6e4c6af9136d5cb67d7ab3154317e6d3ff0fecf6012d343f1caf7699593339c5a73499b47629c2be9e6efd28a65f39c1ac1e6515a316a49ff25fe964d149bbf4a0121d449152b591220deb3b1a5fd0751cf29dac7fed9d690708b01efa1774123b5fbc3c4961f2c9312833c45465e4f609dde8f5d262c09bc3ddec9a04b70bc0747d76722bec1cdceafb7bf37bc92c474931c8026630f4c874c0a1c9768da615475903939c34d7706b02f40e9bd48e3e997bf401336f1c6cd4827543a2a07ffc7a9c497dcf41ccd8eac35abcd75faff26fb6bcd2ce7cc791e128c2824ae994ee8479d3a7ed52821dad98088b239a4e67b55358633c5e128f7a2df9c80acbea301aa6af88ef5119b43f88c5ed3b998fb12cbc1aa175acb16130cea6561143526ff330a51eb0744eee930ae5e30391543c0146e5c11d6af60446f35301eab59b80fd22adb910dc02606702cb06dd112ea8a8fa38eca127b0db035f264ce25c7302acbc206b03849c43808530d84a3287472bb98bd4736fce5bcf570fe9fc90e59976e4730708f1afd9a0a0060f8f71bdb3d8cb3d94d998a20ee0256e98362f818af34f1c53951f30ee0f0c878d346034ef5c57dc194850025a711431f02753856ef93b0ff5e472ffa4e2e85588fc016e346449c2d729072feb6b1b46144bcfa77b23562a63e6c92482ecae83d54513d0a7279095bb3ef94fcb7f712502b703bd804df09b1c8369b5a6f9781ddb035e47235ea206292865a4d9fd6a26ed74cfcf21c2cc9f1a83de92aa1a910c09fa8be6081ddcb4d2168b866ad26cd352bdac86bc10d8dacfd6fa3b8d1f402e07e2c6a6d86fd8663d570b11e34f7ba6a2cc82db8ac0bb37f118666adb10910ae8766a9e403d42c1e2e49c67a42ed7a5a8503f3ed8b290c85090ae934ee67c32e758bd04ca105e6f0c29128e8b527a5cc742e5ea550bb357e24e585f6bc3f1da83d49f0b2fd07cf787ef70618f79721fec4c7dadee3adccb1da2aa4b0f56f25be6b617ea2e84ed8e684ec75c681bdc42b8eb337eb83a54243a4757672c37a853f2ebf8a8e7e54e790f17590e824b90d522604b36d5f421a978e9fa00d1b307d45d097ded0cff1e176b98f8e714a3fc4612001fa4c58bcfa021f8e144ab368d12fbf9cdbe51770c09644404ee2bb5b1451d471993ad85682ac59db7c21dc087f37119bc22132e8e87f9c285507ddb2814ecbed284a3cd799642490b102d8e4b8a7602ec257ca6f8813bc0caaedf13e0cab083356bf74a0bbf8e8f292bdf2204e7cb0143ef204e55a0ae8ea6c7d5005a08d8ce6bb96f7b1852c1e1d0055ebd92b765b2207f802a17855f7b432443df60247142db394fc68f315a606521c27f6536e44b9951e506ee20fe31c4436941dfd02cdc9cd0873444f5e4ac25db77d13ae08567707b3ae477079bf49d39997067fc64cb3497d108f8b62f808a12441a452ef85cc928f89a0340f81bd45e48d0b50095095b6dea19b2bc0e6e7d75e81be83456e310777a2a0333996e21102b3cfdc2a24bce9bafabb752ba3dc6ed86977a7f63e1e59b04d4e7c6e52dabde084ca9b35d3b5e30826729c2c0084dbdea9d8261f730af32038de60db0a7f7069132751d014fa050beaab02145dd476b2efa22e775d1973d0e40ed444cc82e0d92936cb1cc2a77fbb67d97be1117cf74ecf42ed1ffcf52ab71c8692ed7402ed9e4ed070d8157619c8721cfc438ac9c74283ddb83d09f51d6f2a2ada60fbfaa424cb2961c3c5aa865bfebd366b878eb79914a35de418590712099e5d976df5b53b4c68e62bcbb0ebcbdf97505827ad610989df0b1e39862c8d385e302aff16dafa208a331efd171e3cf8f1a912dff6447381c9f027a7ec9ddb3d1f2d2007c107db4668ceb31db01eb9b6671f661ee2789441e09423a8014a05d1ec680239693d1a2c31a8ee3e5359279afa4e07d5b1e67eafb05c54fa7605581d67530c945f37e835c7aa858b4b8d81c9d8a22db4174bf3aca3a9ba75295d68856306feece37eb07fa27f512763093c344665e48c70f00defae29eea98bcf23c356969b6be3ca3a4faf21cd267f21f9ba8838115e504b7f79d605450e6555d15686d4ed56c50bdd82e1765bc4bddb88ab5ba18635209f4adb22a02a30efef4a6b808a443975e8c7688a61ca73e05e9711859430dab5c04287cfceec9d296a422b38871a33eec0155904e8cd113d6decc62682f022954590f822ffc281eb6ac6a1df2fff499f2f20834857e642f51423cfea525b6aea238d558328028515d5bbd46dd12d8b6581452a9bcd0ab8368c965e7b28802ab12832d49524c3bdc1f7ebd5222dd3e637f3b2d3dca7b8a2a88c1db8647e59a99d8ea11d0711371e71880cb7ac043c1021c3f4b7edb6feeb466de7121072c774e99c46e2a41f2f20412cdca0816c1e6d815e81e755db02248df6ac73764e71527a1a8432f8b813bd472269f5cd1b7a118bc98702cc9e01649592dacdae85c68a92e967c572364646045170582b335d593f15982384ac76bbe87689f66fa2f1be422c86961ccbf1ea37bb36f25e73504f3a871f33032350e08b3457328e07753949f68723c049955695dc2e1b269c6ab841226b5b1d2d837637cad21e4f522b5c52c66b10002cc6b9ade2170c6db2e55fcf9f0795c17ad91f49ef34a2c21c289b46a082e2d4113a2e13f159d632881a301aea70fd7cc7ca820216bc5dd174cd2191d1452caf0f0722c3aa9f689ee03c7b27fcca70c97199bfc57af5422abeb41895b17b4bd9e6387f001165b017726e40cf844a57a9411a1151cb8fa0283abdfa5ad037be8fd8daa27c52ea564b31e2acd6b7a6ddc4ed5d8939abc7acc51d5231e06a538bb875a6ca870f71d31ad7a1656f81a4e13d0904aa94bb6921d9fc2852c56aa35905c1162899bf7eefc8be69a3649b191c251bef468e4df71db041bd3723b32acf62d780306f0b1d31ff601cc3bb688aed60e9284a9a1e8f63addc18f0d12e4065eb4a4b57fdeae035455564f51bdc6528fcde8c78ed65f3adddb4f9182d6a151cac026b5b5bd2dcdb823be54dbd31984ad371ea1849d62b91bc29d2c9a4d31254f286f213e4fde7a434844579b01fc1db943481792409322f41221f0c5f53566b9be12a93e8ec456a76ebad7e558d445b62f79726dd7dee40031058478e454fc5d009e867ca2516a85fe78d484df895ac1ae66474bd21a129295ef4d306a610476ab4526a2451978233e10ebc24bfd53d3f7903331029aa891af8a44210c80c2022ffb68fd0b5578aa081a58a2b6720b166ce5c4a1baa444530778615ad1a55884b51b1735b78878ebdbdcd42be49c3d8525f469df15032b93323bc21407de467f93754316f4964847081731cee729f673058f04c93cbd3d8461f9cc81f7e5a080668453125043885ba956d8998fc67a0f7f97e5b8b56de1ac1083495061762f05f23850848165a18bd22dc25667c8296c8ffb4b965a57c28757dfd05a634729997111db5355bc4492af2b1a776b6efd20831760f10dc4d99375f056941e1d187684787cb9bb07b12e0146a489643111d605e322d154ea088fa0ab4dc315b351bc429c572c656e99b9b8299313f9b6eee4582984a6ac20415dfb59b6e004ecd5b85d81b21e14f81618ee5254c9fa8ea8c35f1268b88294d0d167af9f32858c3d478a1880148a5c9b763df237f14cd26e77b52819ad7cda59e47b2abbb2aad89274dd6f53bce34cbd243219b067edb2a892254e4511b16aca2e5bc7243d1b8ceca242370b8446af6c9b2f7b79902846329b68307a47759f53b10fb2c73b79e8455a45f96185ba0b3ad8eb747384471a9bc5566b948bac17d2415814ea0624224a1bfdd23a79a56dec1c1ae0f39999bb133fc2e6c08124aa53c9d1ec417205a68b194a492bbee0395d4d33bb42a320962b4fe1cdbc9c75406a46571aca609780fa6b99d43add78e6e6bbf398bbf624c9b9f88b759178913973ee1e0c35d0f2cbf5474bfb4c64eddcfdde51398bad9fe7554cb1028bc81f9229b2ac1236f4cfdef646945fda1410a204634aa969742135b9fd98023d22d4e6dfafcba7634776be2ce66b4ea9a2048b28ff05fa6efdc4c0d4f1201ee4c9cd2f3d364388da5086270f59c196ac59e15e49c8102fb909043d12287ab405476501e7e4371c3371d998332a67b5053c50198934d472b0ef040a4c34de095c5718935e67ed0ebd0543bbc492e676b6cd794d24c20aef92ace8e6e2e1ebf84cfb746ed75b49d32689c031b0e1f91093603cd6a3dcfd25ecd98a0414488d5b861f1b4f4bc9144619aaffdfd782be8605f7f001aa1b07a00c7e82d0cb81c00d836ff460045090802347ad72e1161be1e1da2df2ef06d88b26878848f6a9ea8d9f1d9a3874608af745aea0dff3cb9903009a5fccc60464b181e4762983ba29298b426c4299bf53cb1145f47fe8850cb48c782aab4c416f13416a504016d243fec3f8d89cbe0f89836ed8edb897bc6c3cb0605b6716cbfd7080a9a90ace3d9ba29117cf2a370082bf8fddfd114c016df59d1119673905ad528cf62fbc58b7d18f88f3ad2816b6d58289a547e55553dbd3c157a25b9a642a54731e011587beeaadf6542fab2b4f795e4abad42e646b635a0f08ffb4584402a647ee895af3483e7320e2062c931f8dcf062e613665b7a2e806a80e8284f8f3a9ac2fd850fc35aeacc7ee0f74693b836d81a1236904de3598841f554f26871079967f57bd9e84083b769e795a582ba4bb95cb2f3c1e714398655d637315179b8e0e47a409ccf064f34b90486b7f7dc7bf4297da27c1d6dbdec8807366b8a87972b9a7466acdaf786465d5f29b494b44c84a06139b9f0d013914ea618d60d8ca91fed16f4f5e09cb1805abfbbe4f9ac74d0be6d589cbe3f691a13770632114f683fdbf8269476abc70ef22320b172469337f5181cb52817ced1db7adda207d12712933f7bceedc8cbde8aa12703f04aeae2ebffacc00338e2c2c9bbfba4ada0ec392d0c79f7786da1c03cb24e4ec3dab105b135a9e1c9f25c651f0b67d12e76a8721fe5668553d7c0f92afae1787b693bdb11a77ea7b9e3a211dc7580b717a3a4fb0e73890855cbd9033c185b0ebd10bddc463ecb8b812bd260530183f5e091d5f33cdc14941b4fca64912e3044ec49107852f1df8179ef12757e490755fdfad65e85b233bf3e199bc8763a1a257596fb073d057d0d601303deaccc7b78982bd44553e64797589c194718e1e11225c53e8e252389930a04616e5b79b2a3fbfcfbef93009c41c401345abb670548d6c04c5562401b38c9e8d0dca549e506621254abd3d6de1a3e94dbabdfffca16b9608bea920c8b7f5c2d38bf208a362038b90b108f95db8e5d7816c78a77e14a95e5a9e54a257e92c7807672561c74e9e7d357fd12f83506345030f572f5a7fe7cd1114888dc5fcced2aa797dcd96a8beaac883e4148ae7528043beb99a8db8daf5b5e66f477a72122253176094e63c9d9a977fef6731025f70be5b115cf98cebc1e0d991bcdc9c05b5acc6ff620d91ca3ba7470cc1dc5ab8869019ce9b9292887484d6f3978ddc9ff929dca5977952fc0f386d417c4ef335bf3ab788ad94fd8a445ed1ccf3f5348c370ede4919ad9489df0987571446148f7a4c97bf1e71f797cbc608451e338b22515847dde13c9a026b21a010c451a4ce5f40a5dd7f058a28cf554428678fa38b03dfdb48512845d15f22eec224ecb8bda1043d6b9259eaeb892fbadd72e6a80127d109fff02eeb3c0e469253bd0029f0bdf99552d046374e89c6dda46d675c80c217bb7121b1178a4ff0f5b9d7d6239a3d924034e3217c8cdb74ea8e5424f31da8d32cdecdecebaf3438c1b57bc06a5748fcfeab08f885c636275289d2645ff34465146243b93da4a50b9d06f32faf790b9e67da09dd048f9526c84bfee64cd9339d011d0591a78cb6df216af8aaed00b673c9edc8181a6785f5c0d80a9ca1a5e3c5bb428c5450b3407b219f69fba74a6bcec170ef574e1cbd86b40432a54dfd268bf2ea0f9791cce35d98f4e6c0628c6e8ecff92f2ebc548ae1186833f875d8da14143233e639969d01f22fbd662c90e03ca27400086d14f84e0ce6b69ad7cc4c76aebf77ec4561189b2b8befe40b97df61aa99dd4e542218dd68e1051188479a4f3759dc75a961393002d53d707b90b0b6531e4ca6cbfbb549a53061a7434c888d2b3019fff5cae1418270fb146c0fe03e79c09ea769fdffce0d6618f8cb291833dfa24f6798359ecddd1982cdad51203c6cded4efad1ef4120cd3936a9d24853e03ae047db3ecb986036cbbd348c213aa57f7de45e41c5de9c4c0702db8e2ac4d318f275b7c6130ed6f176380be5c95d6066bc30bab09e00d03bac99bfd9d762283a59a8087d5c4afe86850b95f6939b91e13c6c3638483af22877e6f95172d5b65dc72f51877b13fbfcaf65ad253b8795d485566ee9c3407d3d65b569c32ae91ae179b606758b224fcd77328a5ccff57b7bde8bc2c915513150ce8eee5994c17ea4cb924b404d0ca223c1d181fcc75b596f8c1175294b7552ca22ee70d9570878e96e7a59d2ff59c20ed889bd2cf63592ee868f8572451c59ceebef3fca62e7aa7c22b0cb6e0cb4d0fcfc5d7cc704d6222d4833c36b935389cde3e90970fd0d203fe325fcec874c5062db09fc5d1b25311b53fe78e558eaa2cf9cb63a58ff32d7880d9b943320ee26dc935d50d2bc6379feea0ddd212e082c67811531eb623beeea732e13f39d1e39a3f2b3e1d1de49ce2a85753edadaf9af24bc37ec34cc43ee16339e5e3d3975c1bfb24b8e9baf63d67c7bc2c8ab2be4fd0341c4bd81d79e0e62bc3fd9f7661b0ec0c189878420f3d6078f6875de06c4badc1ca81d7781f4b93e4e84223df5b644e5903cc493af62bb27d127ba1cdf8206aa538c8f7e0db532610f938a781aa1c737848f1fe29911d1d880d006b95dd3f9b392c146b1c2e7e3307c086bc28f4b753b6c4e9dd472fa44b406118280e80dad5ff556b0b748083fc1095842022a212dea5c57eb594df55cf0f88c6dbaab944cff1998bd8914736f3737f7849304862b3ed788a23e451c0484b5d8a247d39a973296b744711e2d0ea5f939b8df3a86059b6d1916da0573e6cb1a3b5f25574577885e44f0d1a4b702e62a5a8cde4894e786d1a4389ca3a70ea7b06badfdfc09ac81cac586e552048e29e61192c3ea0677f41a57278e46bfa2ec5a14450d1fa455b966e2f39f63b20cfa4a5de1382ee0f08ae01143de98246617d7f87eeb4e2a5a8646d840a9c7b57ad4df3691be58dd09bad297ee9e1f465371f900e00c20b3015c4ef59e21f4528d67a17a6bf8c15065579874cbb8e1985ac35e1d83a9b4d80932556a5cc8750c3c2cc1b9e507366fc24fb494bb7f4e7d459cea2c33c36d951acceb237b9731e050e6fe6f7c1bb1a3f0208ea87551a3fd135dc5cde5b63b1a537270cb8817f8979f3ab41a9ead2485040f23b0d75253c77c301cbf4067623dd0fe74269da13d5229f6756e996bc02cef7828e8c428aec5040fc058b2f0d4ec38ecc55e2841d593932dd4cdcd58652dc09e1b841568ef1bf904f50b23d31077391cc431b935c12a2410d8744392e4ef56ac9c0a121ddad42a535ce1d43e86e29b9ae33bfc564a4d9bca1e3194c1e666596f5443479ff35a91dd9d32b89d9fce2eb09840cf56425b48134ba7e42e2b44555919223dfd87080fa4cb63962e3bdf6b096e8fe62ccecb80b759bd3cd861cc7772f0fb5743570c9507bf819419a64d47384eeabce0d0e34f2d34c12ece793b08298591ca8c25a37fded43de6960e350f652b48c227d134f58f90f33b75d1118bd2185a009f1726a71804bcd1988031c817e1fb2050f7dc868cde6e6621373212de52b23dacac595195f5836e0c140f91477b2468b37e7a50eae83c3fffdd4fa5b0fdaaf6f3c962b30db57ca8e98bac7ba02fe7eb3e81b92d853cd87cda1520bfc69ee1ea76b710a5fee473f0bef6d9cf9c46b368868bc73f69aa576539d4833d4e64e337b2723c86d09ed17aceafc06f932f6d8bb31e7732540ba3f36cab949ce90ba1253e57b141a58f931950f1a2450b1d4cc25539ed3cb08e0cac8daaa795634030cb0a09ea85267d3e776a87dabe07297cffc2bee6449f157457beac6106242ed7a8c00a5cf92e01c3b46c0737270586207de3cb60379d9f4b4b1eac3a4c95aad8dadd845ad5d6035e0340b60db55b9e9a2862de91e4ca7e67c616d280064662010d98d720e3140015e1361756981aedfac4cf5742dcdd8b8cb30143fc416a154f6ff05a4f2d20e31c82cad26092685c975881c711fdf1f711074511a57137aa13ce22564c3e45fb6455b75c1c45210060dafaeb546b295240ccb86fbdfedf74fc9d8ba00abbc1116e9acb443e6698824603cbde13e967bcbc1d88a203197c93f44b176353c1e3953cde7c4d0b8c9866695ce54a6a9c2896c9c0fa2a76cf89398e4d024ea03136f24e5e3b85a463108fbaee57c89de97ead83093d3c03b7e51e0b26d1d00ebd41c9bf5f5704843d3192e8678208f46f60afca314f63fb4c904f9d3155e255b7f131191564f4437748e13a638adcdd3cc72dbfb7b43823b799088a5c80c30fd9ad9204d1df90bba5af95c21b82441a0c0c348bf4d77ffc0b301883167180436280036ef3a425341027dc7c2e34a8aa63baab4b2717c77ad694c2220cf179221a7e7ae55bd44d6935ccd4a02d041e0c80573dc295e4d99699955b7a6b46300eb3229fd2ae4e0bacdd7ac005e52142a9f1804f7c105eaa4d18354289cb17f1c4612a8e22edc4ae0bea26992a602945383c497a6d3f1fe07e598ba43f42a9e4847a313b87cc77e1c0bfd21269382f538bddaadaddf9bf8bb8c640f87b1ce88734573fd204ac6e818e47a1c0ea8bfbe1ad5ab670ea45a4fa7d9b13faa3bf047a097067c8599e6406e4b94b60c10e5111b169406d86c5038ba09e973353048f38c894182dedfd5142aabd9f58cd4405392bd356e34d42d86fcfb2055d9140b86453733f04e6bdf42f3633d4425c8a6357cf35adb847fb9ebfac5ff5bef46e353f8917f6040589269f89935315e9bff344e0186414d2b0d0f7869ba127517bc5b449b4ad12ea304e0f7305ff35991910a2e6744ddf5ff745bf324b539a0710c2b25b3b7901934415a1ff6275f2387a02c0e8f3840429a63d530d34d1adf93e956f5c32c6f2f211fe931e4e994b5e81eb3b3e51d6961ea885935c8be38e2534d085a3752363996c182a7348678f6bcef0cf98a03c81b658a51801c9b0acc39a2395ebdddf9a68eba82cd4ed2597d2d64c6c4a12c4254bb679d17fd9f83e37a33f11f43bda8a78be3654a26c9068332843eb3402be71d4714627e9433735bc262b6bbbf323542f616cc6f308f57f6e655f71dbb0a0b5d083fe9055c29e7c36a606b4562b20e1738d03aae63b16ca3dfe63e1cc56b9982069b267e21490bfc2a3e2a86f928fedef0f6febb4633a2aa03977f36dba19ba5219b80ab6b001c4b5752fcd919160df4efec6af4a502a2eb29dead9972307be20635fef328e5819782fe5c45960a6313a672c5efcd061255686f1724ecb0c8a1991d52886539573b728f6501a3bd905cc95156f545530bd41599421d8ea636bb395a100d014d2f45016f44b015e8a1708bbd406f032c058c0a997c548a8d2cf67ce36b582cc361fd3ab9ce39cab35e22e83cdd7d473967e3e4b769ea05cd81c92121db7518bb1b2039ffc9ec8fb3d5ad72b47a73c84fa505e392d9576aefb9e1ddeaa5b4ab6b9a4c0b1ad23384b20e5b6c2c13ad315cab2c1bb464e62744178cd3abc10a2f5c421783b1a7ccf7edf385504befa2e04360c55e6009ebfd7ccf93529dc4c7c14be08c1ae8c95d75fdc4c563cd1223a299a41ea3f2ca65a29283505632c191510311ce69750c14f5e1a39f927f3d81fab18d26ebba670e175bb162463fac51598f36a1a5ae656e1835d4b64fcf12a7ae74fc0d988ad248881161cd970da7da458925cd766fc250c21e44c1eb41f3eeada09982d3f99f36f244e4a632c7cf97d011aceafebb341f70ae5bc8062b9e1d895eddbfca6597b00ef5ccabaffc05ac336b5d20a6198222b6c0c6eb97698df671d8cfee468e76003259903ab7ce0eb22a3e01a4ad3562074fa4abb95e243aafb9efbe491d018c849be3a99ffb38dba33632674d995b748b6d56e2236b3bd3f64dcb27ab428a6037b6e274c47d47595251a922f3bedacf05db74a096bb7a110638cdfb8f1f262d5dcf95e7c50bccc0719f94a9762270fa3b2ff0bbbe454b3c61c42a9793dc1fe81aa3d77319592917c8f5d6115885e30d2a5812944f4e7aa3ace2f9328a3068645083f4508c023a56c73674600d7e5fd7741a8767f204c74e676f241dc9ce56b7cb906f7fbf472f1328c8002d16fb0f57bfe7fd5251fdd2efb5525f700663854dd5206760ec6a9fd7cfbd14576f2f83d9e2e18df46b264258a6a514c705c139276f3b9dc454eeaf0ede73afb9b61ba388d2251cab0554f092b9d50d029102650a4fa801c15e5b33e58cac5209829e26e5a35c345dcdf9627c62d438315649e6d1d345695b86a88a2afedbfcb85cc0e0dc2bc0db70bd9dddb553c6e7ee0b2bfc82dd515092ea8515b2de7d9709e2d3fb0fb0b8cc248dbe99fbf0a8ba433b36cae5af80016e1029e697b7aea8a5f1ea0d38e4db73ad5f16211f02f40016beda54ca4a295b15352761682518057e91d98c2e15dc05be534d61369d6e367cd171734f1d6a64fd690b5615b4a816f935759b1b5cda052cdb47ee0e916b504053c157f12157a1a89fd1e7a788c104745d99d6986622fd37d116d71d80ae201fc4ac21c92eda95061708ab318df2c2d1d889211f2e5ba12495ea95b533b23143b7a0b9a9d7f397d7dd9b042954d2ea1e2b1206e7fc8bf0d43d99573a40b0b2c10b75f41d0a4d511555335f78173eb3f89653cbcd18cb585d511b463be4e7d851b2737258733aa72d00841c0bcb3c8c3897a4e0921c18c08fc2ecc9893505a9880d0df5229b9dfdffe2dbe330001b08b76840a3a167eb7d4779f0f20f5a616099d96ca4de54a1779fa620728468d65ae2e936a68cf84eab66593f36dc73780f2b10e5f32742737caaa3d877068949ee0635e931606ff8a3fad573f8e363972cb5df81e7bbfb766c8cc4a9cdc2201ef2fecf921303ed90cebdf5b059cab2ac1764fec55d14b449d9bdc2fb01a42c9478caa4eafd8437357d9f7555d530919acae70e44edef73734ab3848dc4843ec27bf496354849c15cede83d3ba18717c13f6413653841c28b4a5b4e15bf9e6e3b058068304192947c286767cd1829242574c058ae56cfba9ee45eaeee5a403fba5aff8d7eafd2e6978875e1e7b48f194ecf8bceb1d73cd65ac274813710f583304bcff07c13b09afe48dc477b6bd02504d5be0b2ff6a81c977f17517fbef903fdbc60a75ab2463c6cbfd7248487c222ed152f0e04da9935f3e041a28991015dfff4dc22c38a31e32627cd8a0da50cacbeda5ed4c8d6d42033732163dc579cf61f150b1aeb2e6ee81ad8d8a2fb2a3f20e4fc4f2d11711bfe8351b04a9b3379cf5d05ee9760fa587ed68549cdee94c7fc764bcdde917aa358bc3278be1f4a2d019ea4a9c5b242f03c1023bd711040014e90080acf82e785b034b61615334860598c2aec9ed3dbfa057d2cba9098f75d3db38b5edc1153ada0721fb9675e5b5acf96894e348fe43f7358770c703f392a7d0842e95ecbaa6ce7b613418e65d3f2f345204330b6ba5343b7c9266a53151a83786665844df1e0c9f287c2dd34f538324afcca26a9ea37d7b246c83f564834a313e3eaaed78fc25cd774ec5e8941ae8b2f1622ce2f9b75b8d07d2f74a8d6beb294737e2d58936e4622d442f708fe4bef87c38f9e44750acba6eaf12d4a546aa5e7cc672ba5e5923d0ed7161ccc363187844f809e3f817ce933956ab5a3d98eddbed43c1c08fae60883b48a14c961e4c1df7d961299ed03c719d2326cdfc20eed3972824cc9e4cd7110c761ac21f74b947fdaa65c8fbed09423583dd23c5eaa114b22a4de4c25b45cdeff34f7d7a9933cb5ec27f2f72d83a48ebecac2fc1cbeada18bc4e568e4ee18e9b675b0d5b010155a557b0771cba95effaa01e43043dbc7d4b3cdeed2106e1043561299e20c7c7e9f61497950925fc33b7b6892f832fbe6cc88843beaf2951bd3dac2129873eeff0075d2489b202bd37a6e49316ed069c56ee9abcd39498987038abbc976cb29fe4fccfe63c673256d96fcdf857eac8558c453b73e5f00c932510034248686ec689767c8024571dec7eae61f0e9cbae5048de16aef6a161c1e92ae3e1fea18398b75e934ef4d162b899bd470e84963ff2759ecc9679e228d4e843bc32ed5094c5439f1d9970f86539f113b0afbcfa07c2d8009e3b0603b721fa08c65fe297401b8f2f1bbc3aef8359739a1fbc74947f94ad2c41d4615190306c7f117195b922b93553fb61ae4c4c3630aa51e09b7a99296ba6e88b77b47569f09f57ee195d9a4247d74863cf8a3ddaba448b4d3c70fb30e1ece08418f2af4e7db856a8d471441d4e91d85d7d7268894211106049fc25b96120bc5fa6361912f0034aeb90fec996cfdab0e57483bde687d1ca75a44f4e69d8e3772f58c224df55d71e3d7e8eac2822a89051a119ceb86f36d43c3ec55a8dc4f22dd3f21e9cda8af09bffb9e4610520733cd3caf541833c46920d60b4370e068504e4a2dd024fed73cba28d03b1500ba61e0dd0994b2b37a59d9a1f613af91748a53e4f9db493cd598087531d1e0c07d1b632abc62486b14a40986d84f0a2f8872bac0979310217d74687c90dec269df6462a4192387a79065c50ecadc918f1b436ab92b197b851beb08a3aef8f46a50fb68806367f9f6629eccf0d2a8e976f7fe5c1ae7d4df4e616ae030c443a4588cc502eadae5633fc47f318591420454776434ee770449d9b598f08791b4b5ff0af1c1491a5cb6d979f4b9b040e2a55b8061975195f9e0611d894c753d79e58adc9f942ce7cc08b185a5eb45c260e9ce4ec85c1924b29dca1e0d34994c7766375baa6390264f1070deaf6605f6ccb9656d40710ba6e15a78b8bf28e7ef83230726590e369e3963c5531cfa4fa90eabe7175bfa6f1a57ed2b85bba9cb2f937d6f6c59d94d78a54611c9eb3a3bb93e7ced8a702efc0718b37752cb805a3da645bdaa47dc6f5b4a435890301c7cafe146b126dae05bd8872a7635eddcdedb93c806b242cd1393ccd8bd6ee2fed6d94af60318d8916e0517340cd0ca743db89f83fd22b5bbf80e6326bdb8fd1fbdf53783e67f0bfc0bc921e2c35e3ba6a3f237f441a6acabd8bc93d49e08f3c025598731ea2f3d0f57566d9ba5f347388677545873de95e6993ed0995e64a2299ea3091eaf1436a4013581de1eb20034b6d9f39ea9a44b3f30eee0a1dbaf7f51109230f0eab83f8d7ebab87e9d4bdf156fc427ad08598bfc8e7bcab777aaec983429883e97514ee7f0c2f3338f33fc7e776877d8903ed138f6a1abc4f69d160bb6ffc70857d4d95fb838d89361a94b7cdc030614a05c4037f21a39eb8bc183db14dcfe34630d519600c90e7b6558f8e2fb896bc21298ae2818fe65e276a6bcf738d132f078458f8980f8e503264fa18e7ed9374b1bb0cc0050df0fa20bedad06e7033a816c896fadd3218e124c63caa54bf9864ffe81c29bb04cbf128b985625aad891c58e97995c869cbc35c6d136a5b0027926cad79baabcfd30793e828dc79debe6d33ad4d6e22505816cd965c3e457cccd5432dbafddf1fdf540cb5e6d8ed567d1f0e45882d94bbe06209a011bc29cf747126a04eeaafa7fcf041960bd1dbe10a9694ed93c31d39a3b6a2bf1dfcdedc810c8990023b565ea44cfe7cc11aba4789844f0dfd285ac9e3309d9625bc1e92a26a61e325fca9ecbba74aa1bccdce2ab9c7e940a77248749ed900b826dd172575babac67079dca840fe7b9273d9e6f129996cd463362989158d0cbe159dbe87f066c93c45d447c1f7db602f3fcf4842d0083a2ce421f623e9037d2d629e3c37b63586ba3247a0b5ecf52b973229173853eb82d2be0b90bda004e3e81c554b6cd54b87f74d8704b2e7e4f494f52a2357700da8a4665e140af74a6c440f48c7be92b43a14abf92dea263f85526b1ba8cf28317cbc58498f104b02364102f0060d0db77f5bb198165e1c6faff071e573ffa2a4bcdbd7442437db5bce61b2afed8af3a1e3d8a7764bfa7f595c195c9228ef82d0e50b852e6d665ea29bcc287f1ffc372288f29ff0442aada6e1658c0d2d1dec6cac4457a86a68449ef7fccdee1e3b0a920fe980b168c3ff26e0bd39212909b0cfa0cf1120d60d8873efc2b3a0269d9056e7018ee512620a7cb59125340a37a00050845398ae49bda71b86921330b35e009f8729e43287a8574f15ea82d75057a605d3fedbc7b46a223e3136100634039a8249b9514d4047067e7338969ef4bfa584d3051163f18dda85f71caa9af044aff622fed7977c7bfb4bc69892c90afe569aadf46b854f960e846c146643661caf56e40fd52b10f2e2e27d23899ef8e592906495923c616f913e51da43f05c519a91d9b03d16a91f08ad38350034e138dd3440da6d21de2405508244bf103b59403d4ef7363b1f542080fd54247bb1dc8f8115c1d9a2fd65ec3d73a9fdd81f387001945b78a195adbf25c044b3c8d7f138285e560a6bdd4df53e8c2e469157992a46db6166c1819ad08503449f9449bc399ffb1594dda30c7cc604d86e27c5c9ccd320b041e4ee49653e83591c5a344cb14d3f22da0bd06d4c220992a946861f570c0a2e1197332d1526d7476596a8047e6fa6f021e4e662c65f1398a9c90ae57eb9e59d92242a71de674fa7b00c6dee0073c4030f76c7731ed24856c2859526231a085916cd0aa2d1ca58c0ec057dce887b681845c421215c6361e19f70e0204753de6bd02c9b1d29233e102e70b338a16980117de8b8a8708142f02e6ce79ee1f49cd713a7a325bec078cfa31271ad00d10944de7608286ba3976fddc703d125e7380bbebb2d65fc3031927b9dcd0bfa60abe5f6e34ff2417d920e0da9b86a95830da742cb3227dca5abf56d5659856d212a8af646b42afa8e436b334130b57345c472bba57176dd041404d4cf9c022bde69ec4a4b8ff48dc46880ca37367ed7db2233b8889489c373daa3c663000107ba9482b5b53d63850aa827c2a82fd7282df968d8ee0e0bd5e00338e397e07b058b0e7441741fe0cb180c690778e4268dcc49fabb7c0574ed5bb578bfa0390f82cbba6ec2757d5c3f3a64b7a0f1749168d8efa8edd692c2fb6a685e2bb1860bbaf6ad85564fc80186410c8bb53c22905e35dd2c7241a4d8ef62a971dbd5ca94b1a3921c4d67350e2f1feb6ca7f1581a576ab2f5ccacc6fe00772896121e712a0b5cfb60ca17bdb75387b1ecb0b303b8baa275acdbf46d64226814f3d948623e24a5fcb375288b1e64f3941c5c96a993ec30558c991b4b3aabe7e20b8afe97622b7a31a41fa67c48c29703523cf43c2cefe426a8fd51f2c5762853f39ce42bed21c7308c3b499718b003c50bd2723476e87bec26928620d02e97df0e6934efefc2dc4c5bff39e428fabb9480455e6ce0d1ee01ccce5c2a5a910c37f1ba2cf64c1af8aab2f1b0db4a31b8975f5f1880e00e9c862fe506203a32ab0587933f19dcfe792f6b1d5f8b1c18971409a40ff904ecb4047168cac45632be7ad1e1e184697e6eac4c505acd9f28f6b7b091cc6d0b6b2b6e415f5fb3d0b168ff9897a3a646fcf62175e4c0c57b3efd998c6e21941d3cf51c37c1d37bc3f5ff2653aa0acde41e25d81fa82da03d6a11b0edee6397733537482b38cf1a7ecbb6e1accbe642af18d962aa345649d8e7494a1088b1cf5c9516451dc8ce6ccd038a66069ea1ec633d98a75226adaf58e42fda3b39f0b10f3d70a3dc9a70d14ebff6b20b757ec4e3156a345f45802f85b53a78645bd218142ed76612dbf453005ba43600f8677b053a598c6cc51156ff457b2ca6e9a2f10c6ff4af6210672571387eec67c18ffadfb1f56f8e7a0ba2b410e587f93877339305fe1c223522d6d6d6ba0d2d32146d8a6905f12bfb3586656d050d208da937d5496f9a7b014ed9fa3cf0df4ca9e2c6477c6ac0fb6d0937a64495270e4f0c075a9f7adeb1308ff65403ca1a8cb3849d7b44b41d4e06d843f5103dfa7ad00c9c53a8534d11e24819f00f90006c622cf0ba0e0e57c2106ddf53910d32383b15b221404dc1bb02bac1981b2251a571380f06b7b86c1aeb87177721c0655a063b0633787d9abdffa8284055448af6b202ea3a890d084718e48517d2ff84ed97efff76ddf22aba5495e3a209e1be7fdaeea3138f8b8ca6d89a96d064d7eb65f74dc145dd014e6f9d3d21798918e273dede145eb9d940a99a486105ca6e4a41bb72d34a84b5474a075a250f12bfeb0d7ec6098fe00ff4da28ce10bdd3f0c282e4f89fd562c17db204f5baa8326fdda562fd43ed501049e61f364169618d0c0c7d080a9264c0d7eb27704a9ebbb8d0b13a83f1aa0760aa5ebebd721ba77cd5b28e783503e99b1cc4612dbdfbd72484c32e1a52560a317371871099f5ec7d19cb00aee1572374ebd50dec45d535a7085f8a4351f379b6e09179904c8802bf4d0be84a1eeb5805689ba9c08d32c62482be8bd88d2e9ebd31ea06beb61fdb6a5c42ed0f1e9433285be9603ee0c2b94d2dd4ed95feed064e409f0549932a72b73d4c075e5eea006d433db82b58e79a5fdf0d8628285aaf2527a06c00cc383db988ee27a0bfdfad96c8661dde193bb44cca7d844bb9c3976abc40577c37533fc77473251f7635a55b5b250256b128b1e90a8f24b35f25f747fc454b66fdfe0d1451d6750f0cdcb155473040c06806d27758254b6a68d8225ea99b4eccad0e0bebc785fa6089c7e6bc7beacc589b795cf374c31b6f1db1764a14fd7b5d2b10e85a86b8aa88800356848c271d897ec62cd128b84b0130be003f4e5dda0e5e8911f0fec237995cfe938cb9d754cadc6fcc889e23b002d8f41ba26dcd98a1f17480772ac5409a40882fc1c7abf554026d76ce4a112ab3d8976565a9476b4b18bb171aa392aa23fde3dba35ec178d360ca420be3c3170462cfd887c4d41981b557b5dddf9a437b685ec3c9a16810a3462fb08703a0ef58a67983b05cab2706e99b372c892dbccc636d044b87af9c042f31d9e84cfc939dc5bb4b03b8c776a0e8708efee6d4de11f48e8a62e98c3bfd258f4ad8f6b8b597ac5f15a7092ec0fe58e1024846fcba3a68ce69a5926f22391797bf3017e6bb1cc334947226c17b4f266b4494687f465cea6b047d4b0dcda6842854c69a0abc5eb656fd49585e4a27311eae77f978f97b2ab2e9e00180154c79d195e70e7fc221c264edc72578d0819aed85ea8a6956a925938a28d6a8349a1e7f263d5593daf5917c9df2fcbb455b9f2047dd9acf5bbaab9de3507576e7092586bed0322c103d1536270955103abd5ae6ca1000786252f72dacd51388d34828f5de9079a6c506f3d38517fde8404e326daa00d521304b2e166d0be1d3f1e70a0f9a529373e962aaa60751543406f62070fad92cfe00464299cfd8bc1734942f9d57e02417222070cbc7a09e104a46c2e8527d399870e5168dfd0b5c262c561155bfae609df0f34941fc5b3a0f39ae4ecde9e764434ad8fe673bc3d45891028672978ce69d9e8df01281b126337a910e33d41c69c2dcff7228ca6d6a67c736da8da7e759c9ed96da8db97ecb46ed44d42c1709b395bece76ebbabdeece1d1ed492c4f7b833dbce9397b1091474b4acbbd2fc372384170be184141d4b16c2048eea516011aeef06348122817227e6bf104b393621d3a954cf7836fede7bbe4eac025c0142c2e9969d40d960149019554b40b591a6b1f697e9d3b4d0e496a1569e9a65905c86db5adfb383f06c2ccec45663ebd24f2e482addfc0a8c17ed90f543f0ceaa0b14fb12587093f315f10627a1998d18817d1cf038581466df843abd95167b5f624437458c188cf7794b18657d37c937408d2796ffc98c63bb4e4beca3a622fc81ddb539cf8a88f8b322e21a094efc2a3cd739fd6ad8e745c16c11caa3982f4220c7c152b09924bdf01a8414647215af41ff3c46f2706634815660197cd2d09372455d639417e83b64fb9413b32b01ddcd48afd6af6e23d0835f54d8cef092613c79956e9a41fa97398ec1a749a900e793e429296181bea3b1aae11ff9078c0d0dbd5b4a37368943fb6a3d4ce11ca7fa974f1733dba3e2ebf7b710c3b37c7d58608dd9728b26f1803b03f71e1758a0359da76d082e9d4a5ba0ad06e0be04a33d8731e39357bbe2cea115d0b85ad4f4c282eddd6d2cd417f36c0f6b22e2a8c2452c6baaee441a5414cb4ecbcd885cd2224ec3c17b340a6e8b2e6acd856b2f207ec17814faf7357c1c7188a99032a53d99b3721ea9708be2cb212feb0f366570ecc5666f901073c594f4910da50ad8e14a79f11a25c26cb08a5ddb5cc72d036c1c121f3e9fef27361083f6a086c4c2b27fd236a9080f35d98f26055951f8b35538ca51145e954ddc68876371c66638fd20095ab7cfeddc4c17186d785ebf1b1d5cd5ba1cfefa9306283906c5fbc4d6e6a58efc2efadb37cdc4fef403a96a3d8983befc0cfa1da8dd3cbbb7c51d492e6e86b34967b955e4dc6653bef638aa8164d32c8abcc5b6d233b87008f869475dcc92ccaeb1693aa2b241b9525a22defc94922d67bcbc1d3ce2f0aa078ad008ecc37e268a5945c1dddb314741824ed6da97305e0ff0f8e1a71d128c0b5c7097e8d7dd521530cecd033ae38eb2478f2b3a5bf9da236866305c3cda501f3b05dee7c5dbd97b7de3be981878baa9ac56c8a853da5e775271c0411e7985efdaa890af624a315fdc839d6f4059d41a73156a1c19166f66c7c1e6311f6d5e2a3eee4a0c6db1d41e27498792b61267c986e672606b3ddaa225590350c6b9d9299fdaf7863d77768b042175256c2ab10b6658b10bebbb533bca8c76dc8d332ff5597f4bc6467596467ffdb5797b236a95928915aa6e53a78aedc639e4eab1d48b59679e3fa448ed413659cfb1c77cd108eaefdfee8f55dddac0bfe55954c8f784bf428215d2b66a69185b791d691588e1d57d1451c5421a153b3aae6283cabe4c625f98d15760e84a8355000ff3db3579a1821aebda2b58008e328672bfd73b184166eb72b814f59eb7a099c5b069e1e93259c7a1f58022562507b72be6b56421f19cdf2a1c56a016cd4fcda99f59f8a6701a00b07d4e3170d032727f36445803646a62b5e969363350620fd5df1f57bd8d79a5dc874a95165200ea5ebf0de957e7bcea322e59d81dfffe526edc57baafdb9f23c0c44aafcdf70cb7a936736f29c7af0db57f40e546df3c33cd50316e3c96cbc896ee80e459b01bb3b24052dffc8609357ee83d12e33ab5d55abb311d860db103ee442fceb018f4f89222285784366e5bd8f0b6e91d0696b71221d4f8c41a9d36e6db91755b27d50f23a22ac59307cb473b47b68dd28cc2d230e897e129d6e750d664c247a83403ceb808ca27aa6e49cbd4d089d4cc033e6effef9b7036e7b60c232f4512111c48912d5522d26968162fad8d5d1eeec900536921deec024e2e84e7cbd14891effde7ead3d3281cd737e879ea98dbca603579ae962db7c5d68fc7322795de95033b4b738fe0bf339193bf708e5ce29c91d02e4a4e287bcee44482da93699cf80960e0f53de2a48c1ff96cb27f8274d934010374453876e2da5be7c89ebcc872972f64d4c87f4b3f40ca27d27942fc78199fb23b6c167e66c871efdbce8ab703eead99d24699a38364a33cfa23b9ad5f3274cdd58b584948e5c2d1151acd0e67a6ccfb8258b8cc4bc55e34117bbe7ce26f3fdb672172769ec44ab793ca7fde59222b17aa538ef8165edc17216e2fbc2f93760fbe6d9f5715d0963782e318084ca549cbcc098bdca8de23a2da3265a20c195c5d0628d9fd0e40b7b39168572b3c95d0ffc9bbd33c468bd8ebd4ca99973c1c5a7e82538e6aff2d708624286f34a26007f7185c03dcb2fb50dedd861bbfebcf269e826afada17ec1590f61bac9bc5d3a9a3493035d9da8c2146bbebeaf25dc9309f8eb1f0a53898418a0babd7346bf15be51d3752dd68933798a499204892e30811ebd8816ee87ee328fb7c4f93931ad0d1eeb4e8dcca3d2a9b8ebc94bd80f4d30ad9dc7fba1b54763f84bdb497a52caea309224c30c9e5bec4ddd46475404c8a754b106bcae1ed247ef6e89781564948ac73648271e76d6fcbd397e457b6d1b5dec7454c5b777b3befcb95672b11c60b2631cb762518e1527fb6d9eee9bf7c8920473f7919d081bba26ce870fb4b2b67b1e453c8008137409c4a48cf8125de63cd80698b15f82ef7ecfea2044f439aaf2eb4b2b3069901f1cb30a00ffde8cfa9b9d39ac243d0fd8992c0a650e8de0a455c419d5498ecdb0682b0f7955ac0ce439231b7ee98c799bc8c0fb48277caf5788c25450e4787be104e9955faa7a4a58aabd6df1f76c514ee3f9369adb35b5f85654664192a36f78d303bf5e94db41ed2f8c554e9e684179beed4050e193e4c1938808786dd3abfcdc8cabba0c63968bfd5f037bdf8b12c84154bfe98112ca43ee7adc0e87646097b15a871bf23b4d6258abc99ceeeffcf18d724825178b47be5505328dd240ea9415c7135cae6b842e4fd55ae7633559fd177d93a2338ef649060f48e23e9b8b0741cee1f3687bfa8f983905a3cfdf6ae6b0f291b153f424ae75e1d87647fe104396210ecf2b0c7dac2933ada75e5fe6adabf514e05fa5191ca6173570ccc44e2b11755eb876b02f5043da17679b63c597bedeecaea59801902572dc8374bc25393b9d6d10feb75d2abc54c9a389b564da50e7dc69cdb8d0affccedc24746959574ef180414cec0cce395d3a44ee652f79f9ffa7d62904a2c9f78d49a3bbc53f4c9254494b7fc6568a7b162f3f3b1c72d343b2169ad79cd0665e9577ba53fb09f3f51dea69489415f5d3af88d25125f622705c11b49640dfe13a4ee725a202dd88f63058a2d2aa92dacd4de5292226b0442dacb0e670fd65536aecc7f987dda521472ebfdc025147d791a56983c5bbfa5f0775b68af4251c3e3be5125583094c10a301260f38fd36b1377066d94473916d07ec59ff912a1fc70d1cf703ce356392f769e9edee325c5f38965e9f9714af4ff6b191ec9e0b4a8b5b051b15094ff822641262d7a004c63e39a7997f2b72319901714b8b0c257ea1696bd0696aec42857da278fb7ac09d4fcd1676eed86d8deb8b03589b5cc8e26cdae897b0dbabb549479a3b76cdbeb4e7ff9f00e333418bd07286adcc6956eaa749ee66e7ecee2dc1fee822332349335f735ecf0306edd67eed8457d60910e060f2ad1287e0a460a25b46e225229805f6022b38635", + "md5": "e3Q5Hgi8bYsu5GR6oCzVpw==", + "path": "synthetic/scan02.bin", + "role": "other", + "sha256": "3fda1dfcabd6f77b655435c16a6c7b75d5f2f2b4ef9dccd814fede0f2b69e1f1" + }, + { + "bytes": 9793, + "contentType": "application/gzip", + "content_hex": "1f8b08000000000004ff012a26d5d9742c65706f63682c747261636b696e672c74782c74792c747a2c71782c71792c717a2c71772c66782c66792c63782c63790a353030302e3030303030302c65312c6e6f726d616c2c302e3030303933392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3031363636372c65312c6e6f726d616c2c302e3030323437342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3033333333332c65312c6e6f726d616c2c302e3030343032392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3035303030302c65312c6e6f726d616c2c302e3030353139322c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3036363636372c65312c6e6f726d616c2c302e3030373232392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3038333333332c65312c6e6f726d616c2c302e3030383433342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3130303030302c65312c6e6f726d616c2c302e3031303034362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3131363636372c65312c6e6f726d616c2c302e3031323635382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3133333333332c65312c6e6f726d616c2c302e3031333430372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3135303030302c65312c6e6f726d616c2c302e3031353335362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3136363636372c65312c6e6f726d616c2c302e3031373231322c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3138333333332c65312c6e6f726d616c2c302e3031383335312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3230303030302c65312c6e6f726d616c2c302e3032303137322c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3231363636372c65312c6e6f726d616c2c302e3032313830382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3233333333332c65312c6e6f726d616c2c302e3032333438372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3235303030302c65312c6e6f726d616c2c302e3032353339302c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3236363636372c65312c6e6f726d616c2c302e3032363733342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3238333333332c65312c6e6f726d616c2c302e3032383632362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3330303030302c65312c6e6f726d616c2c302e3033303834342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3331363636372c65312c6e6f726d616c2c302e3033323230352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3333333333332c65312c6e6f726d616c2c302e3033333830372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3335303030302c65312c6e6f726d616c2c302e3033353139362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3336363636372c65312c6e6f726d616c2c302e3033373339382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3338333333332c65312c6e6f726d616c2c302e3033383838342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3430303030302c65312c6e6f726d616c2c302e3034303230352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3431363636372c65312c6e6f726d616c2c302e3034323134392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3433333333332c65312c6e6f726d616c2c302e3034343032342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3435303030302c65312c6e6f726d616c2c302e3034353237312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3436363636372c65312c6e6f726d616c2c302e3034373034392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3438333333332c65312c6e6f726d616c2c302e3034383935352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3530303030302c65312c6e6f726d616c2c302e3035303433302c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3531363636372c65312c6e6f726d616c2c302e3035313738312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3533333333332c65312c6e6f726d616c2c302e3035333334312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3535303030302c65312c6e6f726d616c2c302e3035353338332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3536363636372c65312c6e6f726d616c2c302e3035373630312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3538333333332c65312c6e6f726d616c2c302e3035383839352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3630303030302c65312c6e6f726d616c2c302e3036303039332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3631363636372c65312c6e6f726d616c2c302e3036313737352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3633333333332c65312c6e6f726d616c2c302e3036333536362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3635303030302c65312c6e6f726d616c2c302e3036353436372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3636363636372c65312c6e6f726d616c2c302e3036373632322c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3638333333332c65312c6e6f726d616c2c302e3036393033392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3730303030302c65312c6e6f726d616c2c302e3037303438312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3731363636372c65312c6e6f726d616c2c302e3037323237372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3733333333332c65312c6e6f726d616c2c302e3037333939392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3735303030302c65312c6e6f726d616c2c302e3037353935362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3736363636372c65312c6e6f726d616c2c302e3037373436372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3738333333332c65312c6e6f726d616c2c302e3037383633332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3830303030302c65312c6e6f726d616c2c302e3038303534302c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3831363636372c65312c6e6f726d616c2c302e3038323631362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3833333333332c65312c6e6f726d616c2c302e3038333637312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3835303030302c65312c6e6f726d616c2c302e3038353231342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3836363636372c65312c6e6f726d616c2c302e3038373634342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3838333333332c65312c6e6f726d616c2c302e3038383535372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3930303030302c65312c6e6f726d616c2c302e3039303038332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3931363636372c65312c6e6f726d616c2c302e3039313931312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3933333333332c65312c6e6f726d616c2c302e3039343239332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3935303030302c65312c6e6f726d616c2c302e3039353530382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3936363636372c65312c6e6f726d616c2c302e3039373530312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030302e3938333333332c65312c6e6f726d616c2c302e3039383335352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3030303030302c65312c6e6f726d616c2c302e3130303234362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3031363636372c65312c6e6f726d616c2c302e3130323632332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3033333333332c65312c6e6f726d616c2c302e3130343236392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3035303030302c65312c6e6f726d616c2c302e3130353437372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3036363636372c65312c6e6f726d616c2c302e3130373134362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3038333333332c65312c6e6f726d616c2c302e3130393133312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3130303030302c65312c6e6f726d616c2c302e3131303834392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3131363636372c65312c6e6f726d616c2c302e3131323130332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3133333333332c65312c6e6f726d616c2c302e3131333732312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3135303030302c65312c6e6f726d616c2c302e3131353636382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3136363636372c65312c6e6f726d616c2c302e3131373234382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3138333333332c65312c6e6f726d616c2c302e3131383639352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3230303030302c65312c6e6f726d616c2c302e3132303433372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3231363636372c65312c6e6f726d616c2c302e3132313939362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3233333333332c65312c6e6f726d616c2c302e3132333932312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3235303030302c65312c6e6f726d616c2c302e3132353232312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3236363636372c65312c6e6f726d616c2c302e3132363735382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3238333333332c65312c6e6f726d616c2c302e3132383834302c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3330303030302c65312c6e6f726d616c2c302e3133303834322c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3331363636372c65312c6e6f726d616c2c302e3133313931332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3333333333332c65312c6e6f726d616c2c302e3133333934342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3335303030302c65312c6e6f726d616c2c302e3133353531312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3336363636372c65312c6e6f726d616c2c302e3133373635352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3338333333332c65312c6e6f726d616c2c302e3133393039352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3430303030302c65312c6e6f726d616c2c302e3134303532332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3431363636372c65312c6e6f726d616c2c302e3134323239302c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3433333333332c65312c6e6f726d616c2c302e3134333939342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3435303030302c65312c6e6f726d616c2c302e3134353232342c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3436363636372c65312c6e6f726d616c2c302e3134363838352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3438333333332c65312c6e6f726d616c2c302e3134393036332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3530303030302c65312c6e6f726d616c2c302e3135303933372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3531363636372c65312c6e6f726d616c2c302e3135323132302c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3533333333332c65312c6e6f726d616c2c302e3135333936372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3535303030302c65312c6e6f726d616c2c302e3135353436322c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3536363636372c65312c6e6f726d616c2c302e3135373633382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3538333333332c65312c6e6f726d616c2c302e3135393134352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3630303030302c65312c6e6f726d616c2c302e3136303632322c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3631363636372c65312c6e6f726d616c2c302e3136323538382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3633333333332c65312c6e6f726d616c2c302e3136333339322c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3635303030302c65312c6e6f726d616c2c302e3136353933352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3636363636372c65312c6e6f726d616c2c302e3136373337382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3638333333332c65312c6e6f726d616c2c302e3136383334362c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3730303030302c65312c6e6f726d616c2c302e3137303934372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3731363636372c65312c6e6f726d616c2c302e3137313637352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3733333333332c65312c6e6f726d616c2c302e3137333531302c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3735303030302c65312c6e6f726d616c2c302e3137353334392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3736363636372c65312c6e6f726d616c2c302e3137373432302c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3738333333332c65312c6e6f726d616c2c302e3137393037332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3830303030302c65312c6e6f726d616c2c302e3138303635352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3831363636372c65312c6e6f726d616c2c302e3138323331332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3833333333332c65312c6e6f726d616c2c302e3138333833352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3835303030302c65312c6e6f726d616c2c302e3138353733372c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3836363636372c65312c6e6f726d616c2c302e3138363830332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3838333333332c65312c6e6f726d616c2c302e3138383934312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3930303030302c65312c6e6f726d616c2c302e3139303838312c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3931363636372c65312c6e6f726d616c2c302e3139323430332c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3933333333332c65312c6e6f726d616c2c302e3139343035382c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3935303030302c65312c6e6f726d616c2c302e3139353332352c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3936363636372c65312c6e6f726d616c2c302e3139363637392c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a353030312e3938333333332c65312c6e6f726d616c2c302e3139393231322c312e352c302e302c302e302c302e302c302e302c312e302c313434352e302c313434352e302c3936302e302c3732302e300a9f1aef852a260000", + "md5": "eP4kBfUytijL+5O+FKUUeQ==", + "path": "streams/arkit_poses.csv.gz", + "role": "stream", + "sha256": "a23bcec6f6829c053e7bc1871999ca7b1a5e88639b5a6cde56afc655d3447388" + }, + { + "bytes": 9443, + "contentType": "application/gzip", + "content_hex": "1f8b08000000000004ff01cc2433db742c61782c61792c617a2c67782c67792c677a0a353030302e3030303030302c302e3030303434312c2d312e302c302e302c302e302c302e3030303732392c302e300a353030302e3031303030302c302e3030303032312c2d312e302c302e302c302e302c302e3030303138302c302e300a353030302e3032303030302c302e3030303532302c2d312e302c302e302c302e302c302e3030303634342c302e300a353030302e3033303030302c302e3030303132392c2d312e302c302e302c302e302c302e3030303137302c302e300a353030302e3034303030302c302e3030303239332c2d312e302c302e302c302e302c302e3030303038322c302e300a353030302e3035303030302c302e3030303933382c2d312e302c302e302c302e302c302e3030303534302c302e300a353030302e3036303030302c302e3030303535352c2d312e302c302e302c302e302c302e3030303037332c302e300a353030302e3037303030302c302e3030303233332c2d312e302c302e302c302e302c302e3030303132382c302e300a353030302e3038303030302c302e3030303530372c2d312e302c302e302c302e302c302e3030303435362c302e300a353030302e3039303030302c302e3030303039382c2d312e302c302e302c302e302c302e3030303637362c302e300a353030302e3130303030302c302e3030303335382c2d312e302c302e302c302e302c302e3030303435332c302e300a353030302e3131303030302c302e3030303233332c2d312e302c302e302c302e302c302e3030303139352c302e300a353030302e3132303030302c302e3030303137372c2d312e302c302e302c302e302c302e3030303932372c302e300a353030302e3133303030302c302e3030303130342c2d312e302c302e302c302e302c302e3030303533352c302e300a353030302e3134303030302c302e3030303637342c2d312e302c302e302c302e302c302e3030303832362c302e300a353030302e3135303030302c302e3030303137392c2d312e302c302e302c302e302c302e3030303131362c302e300a353030302e3136303030302c302e3030303038382c2d312e302c302e302c302e302c302e3030303235332c302e300a353030302e3137303030302c302e3030303433312c2d312e302c302e302c302e302c302e3030303836332c302e300a353030302e3138303030302c302e3030303830372c2d312e302c302e302c302e302c302e3030303238302c302e300a353030302e3139303030302c302e3030303132352c2d312e302c302e302c302e302c302e3030303032342c302e300a353030302e3230303030302c302e3030303330362c2d312e302c302e302c302e302c302e3030303630302c302e300a353030302e3231303030302c302e3030303235322c2d312e302c302e302c302e302c302e3030303130302c302e300a353030302e3232303030302c302e3030303034362c2d312e302c302e302c302e302c302e3030303536342c302e300a353030302e3233303030302c302e3030303234322c2d312e302c302e302c302e302c302e3030303639342c302e300a353030302e3234303030302c302e3030303137362c2d312e302c302e302c302e302c302e3030303832312c302e300a353030302e3235303030302c302e3030303138322c2d312e302c302e302c302e302c302e3030303933362c302e300a353030302e3236303030302c302e3030303237382c2d312e302c302e302c302e302c302e3030303830382c302e300a353030302e3237303030302c302e3030303932342c2d312e302c302e302c302e302c302e3030303834312c302e300a353030302e3238303030302c302e3030303033312c2d312e302c302e302c302e302c302e3030303231372c302e300a353030302e3239303030302c302e3030303534332c2d312e302c302e302c302e302c302e3030303930382c302e300a353030302e3330303030302c302e3030303834382c2d312e302c302e302c302e302c302e3030303231362c302e300a353030302e3331303030302c302e3030303735372c2d312e302c302e302c302e302c302e3030303935352c302e300a353030302e3332303030302c302e3030303432312c2d312e302c302e302c302e302c302e3030303837322c302e300a353030302e3333303030302c302e3030303034312c2d312e302c302e302c302e302c302e3030303731382c302e300a353030302e3334303030302c302e3030303434362c2d312e302c302e302c302e302c302e3030303935302c302e300a353030302e3335303030302c302e3030303238382c2d312e302c302e302c302e302c302e3030303335322c302e300a353030302e3336303030302c302e3030303735342c2d312e302c302e302c302e302c302e3030303739312c302e300a353030302e3337303030302c302e3030303730392c2d312e302c302e302c302e302c302e3030303138332c302e300a353030302e3338303030302c302e3030303637342c2d312e302c302e302c302e302c302e3030303235392c302e300a353030302e3339303030302c302e3030303934312c2d312e302c302e302c302e302c302e3030303636362c302e300a353030302e3430303030302c302e3030303234362c2d312e302c302e302c302e302c302e3030303330322c302e300a353030302e3431303030302c302e3030303133342c2d312e302c302e302c302e302c302e3030303630372c302e300a353030302e3432303030302c302e3030303735372c2d312e302c302e302c302e302c302e3030303736342c302e300a353030302e3433303030302c302e3030303835322c2d312e302c302e302c302e302c302e3030303534302c302e300a353030302e3434303030302c302e3030303039352c2d312e302c302e302c302e302c302e3030303239352c302e300a353030302e3435303030302c302e3030303633312c2d312e302c302e302c302e302c302e3030303731312c302e300a353030302e3436303030302c302e3030303137362c2d312e302c302e302c302e302c302e3030303334372c302e300a353030302e3437303030302c302e3030303532322c2d312e302c302e302c302e302c302e3030303139322c302e300a353030302e3438303030302c302e3030303236312c2d312e302c302e302c302e302c302e3030303335382c302e300a353030302e3439303030302c302e3030303535332c2d312e302c302e302c302e302c302e3030303830332c302e300a353030302e3530303030302c302e3030303633372c2d312e302c302e302c302e302c302e3030303836372c302e300a353030302e3531303030302c302e3030303339312c2d312e302c302e302c302e302c302e3030303432322c302e300a353030302e3532303030302c302e3030303034372c2d312e302c302e302c302e302c302e3030303238332c302e300a353030302e3533303030302c302e3030303231322c2d312e302c302e302c302e302c302e3030303330362c302e300a353030302e3534303030302c302e3030303731352c2d312e302c302e302c302e302c302e3030303535332c302e300a353030302e3535303030302c302e3030303531342c2d312e302c302e302c302e302c302e3030303437352c302e300a353030302e3536303030302c302e3030303636362c2d312e302c302e302c302e302c302e3030303830392c302e300a353030302e3537303030302c302e3030303132372c2d312e302c302e302c302e302c302e3030303835312c302e300a353030302e3538303030302c302e3030303933352c2d312e302c302e302c302e302c302e3030303031342c302e300a353030302e3539303030302c302e3030303235342c2d312e302c302e302c302e302c302e3030303832392c302e300a353030302e3630303030302c302e3030303039362c2d312e302c302e302c302e302c302e3030303932312c302e300a353030302e3631303030302c302e3030303131312c2d312e302c302e302c302e302c302e3030303633332c302e300a353030302e3632303030302c302e3030303239382c2d312e302c302e302c302e302c302e3030303434302c302e300a353030302e3633303030302c302e3030303432392c2d312e302c302e302c302e302c302e3030303439352c302e300a353030302e3634303030302c302e3030303139362c2d312e302c302e302c302e302c302e3030303034362c302e300a353030302e3635303030302c302e3030303338332c2d312e302c302e302c302e302c302e3030303237322c302e300a353030302e3636303030302c302e3030303036382c2d312e302c302e302c302e302c302e3030303839392c302e300a353030302e3637303030302c302e3030303833352c2d312e302c302e302c302e302c302e3030303134302c302e300a353030302e3638303030302c302e3030303731322c2d312e302c302e302c302e302c302e3030303535322c302e300a353030302e3639303030302c302e3030303336352c2d312e302c302e302c302e302c302e3030303039342c302e300a353030302e3730303030302c302e3030303038372c2d312e302c302e302c302e302c302e3030303632382c302e300a353030302e3731303030302c302e3030303336372c2d312e302c302e302c302e302c302e3030303137332c302e300a353030302e3732303030302c302e3030303730362c2d312e302c302e302c302e302c302e3030303137312c302e300a353030302e3733303030302c302e3030303539312c2d312e302c302e302c302e302c302e3030303137352c302e300a353030302e3734303030302c302e3030303236322c2d312e302c302e302c302e302c302e3030303830342c302e300a353030302e3735303030302c302e3030303735382c2d312e302c302e302c302e302c302e3030303230382c302e300a353030302e3736303030302c302e3030303932342c2d312e302c302e302c302e302c302e3030303137322c302e300a353030302e3737303030302c302e3030303431342c2d312e302c302e302c302e302c302e3030303739372c302e300a353030302e3738303030302c302e3030303238362c2d312e302c302e302c302e302c302e3030303739342c302e300a353030302e3739303030302c302e3030303136342c2d312e302c302e302c302e302c302e3030303333332c302e300a353030302e3830303030302c302e3030303732372c2d312e302c302e302c302e302c302e3030303537382c302e300a353030302e3831303030302c302e3030303932352c2d312e302c302e302c302e302c302e3030303033332c302e300a353030302e3832303030302c302e3030303131362c2d312e302c302e302c302e302c302e3030303136332c302e300a353030302e3833303030302c302e3030303936362c2d312e302c302e302c302e302c302e3030303438322c302e300a353030302e3834303030302c302e3030303630322c2d312e302c302e302c302e302c302e3030303436352c302e300a353030302e3835303030302c302e3030303333352c2d312e302c302e302c302e302c302e3030303438322c302e300a353030302e3836303030302c302e3030303634302c2d312e302c302e302c302e302c302e3030303435372c302e300a353030302e3837303030302c302e3030303535342c2d312e302c302e302c302e302c302e3030303430362c302e300a353030302e3838303030302c302e3030303132322c2d312e302c302e302c302e302c302e3030303035352c302e300a353030302e3839303030302c302e3030303037332c2d312e302c302e302c302e302c302e3030303834302c302e300a353030302e3930303030302c302e3030303333342c2d312e302c302e302c302e302c302e3030303032372c302e300a353030302e3931303030302c302e3030303139302c2d312e302c302e302c302e302c302e3030303330312c302e300a353030302e3932303030302c302e3030303037342c2d312e302c302e302c302e302c302e3030303332392c302e300a353030302e3933303030302c302e3030303830392c2d312e302c302e302c302e302c302e3030303436352c302e300a353030302e3934303030302c302e3030303638322c2d312e302c302e302c302e302c302e3030303730392c302e300a353030302e3935303030302c302e3030303135382c2d312e302c302e302c302e302c302e3030303737352c302e300a353030302e3936303030302c302e3030303533352c2d312e302c302e302c302e302c302e3030303130312c302e300a353030302e3937303030302c302e3030303238332c2d312e302c302e302c302e302c302e3030303935392c302e300a353030302e3938303030302c302e3030303830322c2d312e302c302e302c302e302c302e3030303337372c302e300a353030302e3939303030302c302e3030303235362c2d312e302c302e302c302e302c302e3030303032372c302e300a353030312e3030303030302c302e3030303031342c2d312e302c302e302c302e302c302e3030303931382c302e300a353030312e3031303030302c302e3030303431342c2d312e302c302e302c302e302c302e3030303937382c302e300a353030312e3032303030302c302e3030303031372c2d312e302c302e302c302e302c302e3030303638382c302e300a353030312e3033303030302c302e3030303134332c2d312e302c302e302c302e302c302e3030303134332c302e300a353030312e3034303030302c302e3030303534382c2d312e302c302e302c302e302c302e3030303236392c302e300a353030312e3035303030302c302e3030303938312c2d312e302c302e302c302e302c302e3030303338352c302e300a353030312e3036303030302c302e3030303636392c2d312e302c302e302c302e302c302e3030303931342c302e300a353030312e3037303030302c302e3030303933342c2d312e302c302e302c302e302c302e3030303838332c302e300a353030312e3038303030302c302e3030303037332c2d312e302c302e302c302e302c302e3030303231372c302e300a353030312e3039303030302c302e3030303435372c2d312e302c302e302c302e302c302e3030303437342c302e300a353030312e3130303030302c302e3030303639312c2d312e302c302e302c302e302c302e3030303635392c302e300a353030312e3131303030302c302e3030303037342c2d312e302c302e302c302e302c302e3030303833332c302e300a353030312e3132303030302c302e3030303436322c2d312e302c302e302c302e302c302e3030303835312c302e300a353030312e3133303030302c302e3030303131362c2d312e302c302e302c302e302c302e3030303639302c302e300a353030312e3134303030302c302e3030303139322c2d312e302c302e302c302e302c302e3030303030332c302e300a353030312e3135303030302c302e3030303137382c2d312e302c302e302c302e302c302e3030303538302c302e300a353030312e3136303030302c302e3030303132322c2d312e302c302e302c302e302c302e3030303339362c302e300a353030312e3137303030302c302e3030303036382c2d312e302c302e302c302e302c302e3030303235362c302e300a353030312e3138303030302c302e3030303035372c2d312e302c302e302c302e302c302e3030303533352c302e300a353030312e3139303030302c302e3030303636312c2d312e302c302e302c302e302c302e3030303837332c302e300a353030312e3230303030302c302e3030303933392c2d312e302c302e302c302e302c302e3030303432362c302e300a353030312e3231303030302c302e3030303537332c2d312e302c302e302c302e302c302e3030303731332c302e300a353030312e3232303030302c302e3030303938302c2d312e302c302e302c302e302c302e3030303938332c302e300a353030312e3233303030302c302e3030303933382c2d312e302c302e302c302e302c302e3030303432362c302e300a353030312e3234303030302c302e3030303236392c2d312e302c302e302c302e302c302e3030303536372c302e300a353030312e3235303030302c302e3030303534362c2d312e302c302e302c302e302c302e3030303536342c302e300a353030312e3236303030302c302e3030303934352c2d312e302c302e302c302e302c302e3030303236362c302e300a353030312e3237303030302c302e3030303632362c2d312e302c302e302c302e302c302e3030303438382c302e300a353030312e3238303030302c302e3030303431392c2d312e302c302e302c302e302c302e3030303135312c302e300a353030312e3239303030302c302e3030303230392c2d312e302c302e302c302e302c302e3030303837302c302e300a353030312e3330303030302c302e3030303535382c2d312e302c302e302c302e302c302e3030303039322c302e300a353030312e3331303030302c302e3030303039392c2d312e302c302e302c302e302c302e3030303133302c302e300a353030312e3332303030302c302e3030303736302c2d312e302c302e302c302e302c302e3030303739362c302e300a353030312e3333303030302c302e3030303031372c2d312e302c302e302c302e302c302e3030303332322c302e300a353030312e3334303030302c302e3030303536312c2d312e302c302e302c302e302c302e3030303736322c302e300a353030312e3335303030302c302e3030303130362c2d312e302c302e302c302e302c302e3030303036352c302e300a353030312e3336303030302c302e3030303932332c2d312e302c302e302c302e302c302e3030303030342c302e300a353030312e3337303030302c302e3030303434312c2d312e302c302e302c302e302c302e3030303334302c302e300a353030312e3338303030302c302e3030303439382c2d312e302c302e302c302e302c302e3030303934362c302e300a353030312e3339303030302c302e3030303338322c2d312e302c302e302c302e302c302e3030303638382c302e300a353030312e3430303030302c302e3030303433342c2d312e302c302e302c302e302c302e3030303532312c302e300a353030312e3431303030302c302e3030303934302c2d312e302c302e302c302e302c302e3030303336312c302e300a353030312e3432303030302c302e3030303138372c2d312e302c302e302c302e302c302e3030303735372c302e300a353030312e3433303030302c302e3030303232352c2d312e302c302e302c302e302c302e3030303739352c302e300a353030312e3434303030302c302e3030303930332c2d312e302c302e302c302e302c302e3030303533362c302e300a353030312e3435303030302c302e3030303737312c2d312e302c302e302c302e302c302e3030303433302c302e300a353030312e3436303030302c302e3030303530382c2d312e302c302e302c302e302c302e3030303036362c302e300a353030312e3437303030302c302e3030303532352c2d312e302c302e302c302e302c302e3030303131342c302e300a353030312e3438303030302c302e3030303232382c2d312e302c302e302c302e302c302e3030303734382c302e300a353030312e3439303030302c302e3030303139362c2d312e302c302e302c302e302c302e3030303737302c302e300a353030312e3530303030302c302e3030303033332c2d312e302c302e302c302e302c302e3030303738342c302e300a353030312e3531303030302c302e3030303931372c2d312e302c302e302c302e302c302e3030303637362c302e300a353030312e3532303030302c302e3030303039302c2d312e302c302e302c302e302c302e3030303838312c302e300a353030312e3533303030302c302e3030303334342c2d312e302c302e302c302e302c302e3030303430302c302e300a353030312e3534303030302c302e3030303036382c2d312e302c302e302c302e302c302e3030303838322c302e300a353030312e3535303030302c302e3030303135302c2d312e302c302e302c302e302c302e3030303337362c302e300a353030312e3536303030302c302e3030303734342c2d312e302c302e302c302e302c302e3030303736392c302e300a353030312e3537303030302c302e3030303335342c2d312e302c302e302c302e302c302e3030303636372c302e300a353030312e3538303030302c302e3030303737382c2d312e302c302e302c302e302c302e3030303037362c302e300a353030312e3539303030302c302e3030303831332c2d312e302c302e302c302e302c302e3030303237322c302e300a353030312e3630303030302c302e3030303231322c2d312e302c302e302c302e302c302e3030303438352c302e300a353030312e3631303030302c302e3030303631372c2d312e302c302e302c302e302c302e3030303931302c302e300a353030312e3632303030302c302e3030303037352c2d312e302c302e302c302e302c302e3030303337342c302e300a353030312e3633303030302c302e3030303734332c2d312e302c302e302c302e302c302e3030303832392c302e300a353030312e3634303030302c302e3030303231312c2d312e302c302e302c302e302c302e3030303030342c302e300a353030312e3635303030302c302e3030303839342c2d312e302c302e302c302e302c302e3030303538312c302e300a353030312e3636303030302c302e3030303235382c2d312e302c302e302c302e302c302e3030303139382c302e300a353030312e3637303030302c302e3030303337392c2d312e302c302e302c302e302c302e3030303234352c302e300a353030312e3638303030302c302e3030303238342c2d312e302c302e302c302e302c302e3030303739372c302e300a353030312e3639303030302c302e3030303437392c2d312e302c302e302c302e302c302e3030303733332c302e300a353030312e3730303030302c302e3030303730382c2d312e302c302e302c302e302c302e3030303237342c302e300a353030312e3731303030302c302e3030303439392c2d312e302c302e302c302e302c302e3030303334362c302e300a353030312e3732303030302c302e3030303531372c2d312e302c302e302c302e302c302e3030303339312c302e300a353030312e3733303030302c302e3030303731362c2d312e302c302e302c302e302c302e3030303235342c302e300a353030312e3734303030302c302e3030303430342c2d312e302c302e302c302e302c302e3030303830372c302e300a353030312e3735303030302c302e3030303335352c2d312e302c302e302c302e302c302e3030303937352c302e300a353030312e3736303030302c302e3030303038372c2d312e302c302e302c302e302c302e3030303035392c302e300a353030312e3737303030302c302e3030303430392c2d312e302c302e302c302e302c302e3030303837302c302e300a353030312e3738303030302c302e3030303235322c2d312e302c302e302c302e302c302e3030303938352c302e300a353030312e3739303030302c302e3030303139392c2d312e302c302e302c302e302c302e3030303937322c302e300a353030312e3830303030302c302e3030303530382c2d312e302c302e302c302e302c302e3030303339332c302e300a353030312e3831303030302c302e3030303937322c2d312e302c302e302c302e302c302e3030303330322c302e300a353030312e3832303030302c302e3030303837322c2d312e302c302e302c302e302c302e3030303136312c302e300a353030312e3833303030302c302e3030303739332c2d312e302c302e302c302e302c302e3030303932372c302e300a353030312e3834303030302c302e3030303730302c2d312e302c302e302c302e302c302e3030303035322c302e300a353030312e3835303030302c302e3030303133342c2d312e302c302e302c302e302c302e3030303638372c302e300a353030312e3836303030302c302e3030303235372c2d312e302c302e302c302e302c302e3030303037372c302e300a353030312e3837303030302c302e3030303638382c2d312e302c302e302c302e302c302e3030303836342c302e300a353030312e3838303030302c302e3030303439332c2d312e302c302e302c302e302c302e3030303732332c302e300a353030312e3839303030302c302e3030303732352c2d312e302c302e302c302e302c302e3030303234392c302e300a353030312e3930303030302c302e3030303037382c2d312e302c302e302c302e302c302e3030303736392c302e300a353030312e3931303030302c302e3030303930362c2d312e302c302e302c302e302c302e3030303030352c302e300a353030312e3932303030302c302e3030303433312c2d312e302c302e302c302e302c302e3030303936332c302e300a353030312e3933303030302c302e3030303637372c2d312e302c302e302c302e302c302e3030303139332c302e300a353030312e3934303030302c302e3030303938302c2d312e302c302e302c302e302c302e3030303735332c302e300a353030312e3935303030302c302e3030303435312c2d312e302c302e302c302e302c302e3030303539362c302e300a353030312e3936303030302c302e3030303137322c2d312e302c302e302c302e302c302e3030303236382c302e300a353030312e3937303030302c302e3030303536302c2d312e302c302e302c302e302c302e3030303334342c302e300a353030312e3938303030302c302e3030303634312c2d312e302c302e302c302e302c302e3030303434382c302e300a353030312e3939303030302c302e3030303635352c2d312e302c302e302c302e302c302e3030303035392c302e300ac3f1dcc5cc240000", + "md5": "t5vju7JkH3bCXL8RNmnOHw==", + "path": "streams/imu_raw.csv.gz", + "role": "stream", + "sha256": "ae96d9008b71882aeb0dbc1c5463897aa9c316fbda28d5503b4676e0bd85a161" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "content_hex": "ffd8ffe000104a46494600010100000100010000fffe0164000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdb00430010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010ffc0000b080030004001011100ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffda0008010100003f00e6abd6abc9696bbaae66bd06a9579dd76d58b5d2d73b5835dad7115d4562558ac7af52ac6ad4ae1aa3ae9ebabaf16ad9af50af15ad8ac7af41ad6a6570150d6e54153d74b5c057abd435ce579fd7775fffd9", + "md5": "lnjoOyel7xcvq0dCbLHBoA==", + "path": "keyframes/kf01.jpg", + "role": "keyframe", + "sha256": "3ee4012f8d1aad5e8b030eacf846677051e207d891a4587fcf8e57e6bea8eb5c" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "content_hex": "ffd8ffe000104a46494600010100000100010000fffe016500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdb00430010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010ffc0000b080030004001011100ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffda0008010100003f00d0ae36bbcae8eb8bacfaed2b99ae36b56bd2ab12b42b82a82ba1a92b94af53aa959b5c3d7af579cd51a7577f5c1d6bd7355d354b53d455ca550aeceb98aa75ea552579955faceaf5aae3eb91af5dafffd9", + "md5": "SqXCqvv6r7chaJE1kVFApg==", + "path": "keyframes/kf02.jpg", + "role": "keyframe", + "sha256": "1f19a24b5184b45b77ac39e8a73bca0068aeed712f91390b58efd551b9c2448f" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "content_hex": "ffd8ffe000104a46494600010100000100010000fffe01690000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffdb00430010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010ffc0000b080030004001011100ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffda0008010100003f00e4eba6ae7ebd92b93ac2aa754eba7ae42bd56b0ab1aa5ae92bcdab4ab2abd1e92b82ae9e96bbaae06a6aeda92bcc6abd56a4ad8aa9566bafa9ea1ae1abd3ab8ca2ae573952d5daf43af2faffd9", + "md5": "d15HJKlwOnNGXHD6FobLuA==", + "path": "keyframes/kf03.jpg", + "role": "keyframe", + "sha256": "ab61b8867e6e94cfbecddf130d718ce07ea0fa761b2e651b717f6d1e4c8dd801" + } + ], + "packet_hex": "7b22636f6e76656e74696f6e73223a7b2263616d657261223a2241524b69742063616d6572613a202b782072696768742c202b7920757020696e2074686520756e726f7461746564206c616e64736361706520696d6167652c206c6f6f6b696e6720616c6f6e67202d7a222c22696e7472696e73696373223a225b66782c2066792c2063782c2063795d20696e20706978656c73206f66207468652073617665642c20756e726f7461746564206c616e64736361706520696d616765222c22706978656c223a225b752c20765d20636f6e74696e756f75733a2028302c2030292069732074686520746f702d6c65667420636f726e6572206f662074686520746f702d6c65667420706978656c2c20762067726f777320646f776e222c22706f7365223a2263616d6572612d746f2d776f726c64203478342c203136206e756d6265727320636f6c756d6e20627920636f6c756d6e202873696d645f666c6f6174347834206c61796f7574292c206d6574657273222c22776f726c64223a2241524b697420776f726c642c20776f726c64416c69676e6d656e74202e677261766974793a2072696768742d68616e6465642c202b792075702c206f726967696e207768657265207468652065706f63682073746172746564227d2c22637265617465644174223a22323032362d30392d30315430303a30303a30305a222c2265706f636873223a5b7b226964223a226531222c22726561736f6e223a2273657373696f6e5374617274222c22737461727454696d65223a353030302e307d5d2c2266696c6573223a5b7b226279746573223a36353533362c2270617468223a2273796e7468657469632f7363616e30302e62696e222c22726f6c65223a226f74686572222c22736861323536223a2261316361306161356534373162393862656464663432373338643730363837313534323532303339386365643666336564383130303865386339383132643835227d2c7b226279746573223a36353533362c2270617468223a2273796e7468657469632f7363616e30312e62696e222c22726f6c65223a226f74686572222c22736861323536223a2265663433383063383861376530613264663735303636343066366234333562313533313232653031303730643735373038373065626432643333363764346265227d2c7b226279746573223a36353533362c2270617468223a2273796e7468657469632f7363616e30322e62696e222c22726f6c65223a226f74686572222c22736861323536223a2233666461316466636162643666373762363535343335633136613663376237356435663266326234656639646363643831346665646530663262363965316631227d2c7b226279746573223a393739332c2270617468223a2273747265616d732f61726b69745f706f7365732e6373762e677a222c22726f6c65223a2273747265616d222c22736861323536223a2261323362636563366636383239633035336537626331383731393939636137623161356538383633396235613663646535366166633635356433343437333838227d2c7b226279746573223a393434332c2270617468223a2273747265616d732f696d755f7261772e6373762e677a222c22726f6c65223a2273747265616d222c22736861323536223a2261653936643930303862373138383261656230646263316335343633383937616139633331366662646132386435353033623436373665306264383561313631227d2c7b226279746573223a3736382c2270617468223a226b65796672616d65732f6b6630312e6a7067222c22726f6c65223a226b65796672616d65222c22736861323536223a2233656534303132663864316161643565386230333065616366383436363737303531653230376438393161343538376663663865353765366265613865623563227d2c7b226279746573223a3736382c2270617468223a226b65796672616d65732f6b6630322e6a7067222c22726f6c65223a226b65796672616d65222c22736861323536223a2231663139613234623531383462343562373761633339653861373362636130303638616565643731326639313339306235386566643535316239633234343866227d2c7b226279746573223a3736382c2270617468223a226b65796672616d65732f6b6630332e6a7067222c22726f6c65223a226b65796672616d65222c22736861323536223a2261623631623838363765366539346366626563646466313330643731386365303765613066613736316232653635316237313766366431653463386464383031227d5d2c22666f726d6174223a22686f7573652d636170747572652d7061636b6574222c22666f726d617456657273696f6e223a22302e34222c226b65796672616d6573223a5b7b2265706f6368223a226531222c2268223a34382c226964223a226b663031222c22696d67223a226b65796672616d65732f6b6630312e6a7067222c22696e7472696e73696373223a5b34382e30372c34382e30372c33312e393836372c32332e39385d2c22706f7365223a5b312c302c302c302c302c312c302c302c302c302c312c302c302e302c2d302e302c302e302c315d2c22726561736f6e223a226d6f74696f6e222c2274696d657374616d70223a353030302e302c22747261636b696e67223a226e6f726d616c222c2277223a36347d2c7b2265706f6368223a226531222c2268223a34382c226964223a226b663032222c22696d67223a226b65796672616d65732f6b6630322e6a7067222c22696e7472696e73696373223a5b34382e30372c34382e30372c33312e393836372c32332e39385d2c22706f7365223a5b312c302c302c302c302c312c302c302c302c302c312c302c302e30322c2d302e30312c302e302c315d2c22726561736f6e223a226d6f74696f6e222c2274696d657374616d70223a353030302e3036363636363636363636372c22747261636b696e67223a226e6f726d616c222c2277223a36347d2c7b2265706f6368223a226531222c2268223a34382c226964223a226b663033222c22696d67223a226b65796672616d65732f6b6630332e6a7067222c22696e7472696e73696373223a5b34382e30372c34382e30372c33312e393836372c32332e39385d2c22706f7365223a5b312c302c302c302c302c312c302c302c302c302c312c302c302e30342c2d302e30322c302e302c315d2c22726561736f6e223a226d6f74696f6e222c2274696d657374616d70223a353030302e3133333333333333333333332c22747261636b696e67223a226e6f726d616c222c2277223a36347d5d2c227061636b65744964223a2273796e7468657469632d303030303031222c227363616c655265666572656e6365223a7b22657874223a7b22646f6f725669657773223a5b5d2c226d6574686f64223a2261392d6d657465722d6d6f64656c222c226f626c69717565436c6f73655570223a7b226361707475726564223a66616c73657d7d2c226d65746572436c6f73655570223a7b226361707475726564223a66616c73657d7d2c2273657373696f6e223a7b2261707056657273696f6e223a22302e30202873796e74686574696329222c226465766963654d6f64656c223a2273796e7468657469632d646576696365222c226964223a2273657373696f6e2d73796e7468657469632d303030303031222c226c69646172417661696c61626c65223a66616c73652c227363656e654465707468456e61626c6564223a66616c73652c22737461727465644174223a22323032362d30392d30315430303a30303a30305a222c22737461727465644174557074696d65223a353030302e302c2273797374656d56657273696f6e223a22302e30222c2274696572223a2261726b6974222c22766964656f466f726d6174223a7b22696d6167655265736f6c7574696f6e223a5b313932302c313434305d7d2c22776f726c64416c69676e6d656e74223a2267726176697479227d2c22736f75726365223a7b226b696e64223a2273796e746865746963227d2c2273747265616d73223a7b2261726b6974506f736573223a7b22636f6c756d6e73223a5b2274222c2265706f6368222c22747261636b696e67222c227478222c227479222c22747a222c227178222c227179222c22717a222c227177222c226678222c226679222c226378222c226379225d2c2266696c65223a2273747265616d732f61726b69745f706f7365732e6373762e677a222c2272617465487a223a36302e307d2c22696d75526177223a7b22636f6c756d6e73223a5b2274222c226178222c226179222c22617a222c226778222c226779222c22677a225d2c2266696c65223a2273747265616d732f696d755f7261772e6373762e677a222c2272617465487a223a3130302e307d7d2c22747261636b696e67223a5b5d2c22756e697473223a7b22616363656c65726174696f6e223a22672028392e3830363635206d2f735e3229222c22616e676c65223a2264656772656573222c22696d616765223a22706978656c73206f66207468652073617665642c20756e726f7461746564206c616e647363617065204a504547222c226c656e677468223a226d6574657273222c22726f746174696f6e52617465223a2272616469616e7320706572207365636f6e64222c2274696d65223a227365636f6e6473206f662064657669636520757074696d65202841524672616d652e74696d657374616d7020616e6420436f7265204d6f74696f6e2074696d657374616d7029227d7d", + "packet_id": "synthetic-000001", + "packet_sha256": "551d7a302b9351113fbb6840754ef80a05f3c9545baa19cd9cd1e7ae657af184" + } +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/checks.jsonl b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/checks.jsonl new file mode 100644 index 000000000..19f1996b7 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/checks.jsonl @@ -0,0 +1,17 @@ +{"expected": "an HTTP 2xx answer with status ok", "id": "lifecycle.health", "observed": {"contract": {"status": "ok"}, "http": {"attempts": 1, "body_bytes": 96, "body_sha256": "78db994d461b", "elapsed_ms": 2, "fields": ["status"], "http_status": 200, "shape": "object"}, "violations": []}, "oracle": "tools/integration-viewer reads GET /v1/healthz; HouseScanKit never calls it", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:33:52.352Z"} +{"expected": "2xx, a captureId and a published capture status", "id": "lifecycle.create", "observed": {"contract": {"captureId": "id:97830ad9b3b4", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "f1910dc6a8d9", "elapsed_ms": 568, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.create: POST captures with Idempotency-Key=packetId; the answer decodes as CaptureAPI.CreateResponse", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:33:52.921Z"} +{"expected": "every requested path answered exactly once, no other path, each committed or given a usable PUT target", "id": "lifecycle.register", "observed": {"batches": [{"contract": {"files": [{"path": "keyframes/k00001.features.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/k00001.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/k00002.features.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/k00002.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/k00003.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/k00004.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/arkit_poses.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/heading.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/imu_raw.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/location.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}]}, "http": {"attempts": 1, "body_bytes": 5692, "body_sha256": "8eca13a4bcc4", "elapsed_ms": 9, "fields": ["files"], "http_status": 200, "shape": "object"}, "violations": []}, {"contract": {"files": [{"path": "streams/motion.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}]}, "http": {"attempts": 1, "body_bytes": 576, "body_sha256": "e0550ff948bc", "elapsed_ms": 1, "fields": ["files"], "http_status": 200, "shape": "object"}, "violations": []}], "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.register: the answer decodes as RegisterResponse and is applied by path; a target needs method PUT and a URL that passes uploadURLProblem", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:33:52.933Z"} +{"expected": "2xx for every file that got a target", "id": "lifecycle.upload", "observed": {"committed_at_register": [], "uploads": [{"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/k00001.features.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/k00001.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/k00002.features.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/k00002.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/k00003.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/k00004.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "streams/arkit_poses.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/heading.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/imu_raw.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/location.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/motion.csv.gz", "shape": "empty"}]}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.put + ScopedCaptureHTTP.upload: exactly the signed headers, never Authorization", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:33:52.947Z"} +{"expected": "committed equals the uploaded set; notFound and mismatch empty; every declared path committed by register or commit", "id": "lifecycle.commit", "observed": {"batches": [{"contract": {"committed": ["keyframes/k00001.features.bin", "keyframes/k00001.jpg", "keyframes/k00002.features.bin", "keyframes/k00002.jpg", "keyframes/k00003.jpg", "keyframes/k00004.jpg", "streams/arkit_poses.csv.gz", "streams/heading.csv.gz", "streams/imu_raw.csv.gz", "streams/location.csv.gz"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 304, "body_sha256": "73333b229940", "elapsed_ms": 9, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}, {"contract": {"committed": ["streams/motion.csv.gz"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 67, "body_sha256": "3a6ac1c75562", "elapsed_ms": 3, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "committed_at_register": [], "committed_total": 11, "declared": 11, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.commit: only a commit acknowledges a file; CommitResponse carries committed, notFound and mismatch", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:33:52.961Z"} +{"expected": "2xx, a runId, a published status, no missing file", "id": "lifecycle.finalize", "observed": {"contract": {"etaS": 180, "missing": [], "runId": "id:cd20e88d3918", "status": "processing"}, "http": {"attempts": 1, "body_bytes": 78, "body_sha256": "c61f75e493a9", "elapsed_ms": 3, "fields": ["etaS", "missing", "runId", "status"], "http_status": 202, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.finalize: X-Packet-Sha256 and Idempotency-Key=packetId; the answer decodes as FinalizeResponse", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:33:52.965Z"} +{"expected": "a terminal status within the budget, every answer contract-shaped", "id": "lifecycle.events", "observed": {"answers": 2, "finalize_retries": 0, "last": {"contract": {"events": [{"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:2c9877104bf1", "status": "unrecognized:12adac54ac6f", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:c7ce66d0fb14"}}, "seq": 6, "type": "unrecognized:f0122973a228"}, {"data": {"unexpected_keys": {"count": 3, "digest": "unexpected-keys:9a804dd01f54"}}, "seq": 7, "type": "unrecognized:e906b3ac1a07"}, {"data": {"unexpected_keys": {"count": 3, "digest": "unexpected-keys:9a804dd01f54"}}, "seq": 8, "type": "unrecognized:e906b3ac1a07"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:2c9877104bf1", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:c7ce66d0fb14"}}, "seq": 9, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:2c9877104bf1", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:f1a6c684daef"}}, "seq": 10, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:4b5c3d8f624e", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:25149aab73ba"}}, "seq": 11, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:0658abbfb854", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:25149aab73ba"}}, "seq": 12, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:abf10a0d6474", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:c7ce66d0fb14"}}, "seq": 13, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:0658abbfb854", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 3, "digest": "unexpected-keys:578001e0d861"}}, "seq": 14, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:4b5c3d8f624e", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 3, "digest": "unexpected-keys:578001e0d861"}}, "seq": 15, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:abf10a0d6474", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:f1a6c684daef"}}, "seq": 16, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:58fee802997c", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:c7ce66d0fb14"}}, "seq": 17, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:58fee802997c", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:f1a6c684daef"}}, "seq": 18, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:2a73cad20bf6", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:25149aab73ba"}}, "seq": 19, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:2a73cad20bf6", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 3, "digest": "unexpected-keys:578001e0d861"}}, "seq": 20, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:a9abdf9d65ac", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:c7ce66d0fb14"}}, "seq": 21, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:a9abdf9d65ac", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:f1a6c684daef"}}, "seq": 22, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:e8f625c40b0e", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:c7ce66d0fb14"}}, "seq": 23, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:e8f625c40b0e", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:f1a6c684daef"}}, "seq": 24, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:73b53f2a6e7b", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:c7ce66d0fb14"}}, "seq": 25, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:73b53f2a6e7b", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:f1a6c684daef"}}, "seq": 26, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:e4e74d8e2c66", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:c7ce66d0fb14"}}, "seq": 27, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:0486413070e1", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:c7ce66d0fb14"}}, "seq": 28, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:0486413070e1", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:f1a6c684daef"}}, "seq": 29, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:e4e74d8e2c66", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:f1a6c684daef"}}, "seq": 30, "type": "unrecognized:f0122973a228"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:d9fd9a3d81d7", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:c7ce66d0fb14"}}, "seq": 31, "type": "unrecognized:f0122973a228"}, {"data": {"kind": "manual_review", "runId": "id:cd20e88d3918", "runId_matches": true}, "seq": 32, "type": "verdict_ready"}, {"data": {"runId": "id:cd20e88d3918", "runId_matches": true, "stage": "unrecognized:d9fd9a3d81d7", "status": "unrecognized:58bf5b5478e5", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:f1a6c684daef"}}, "seq": 33, "type": "unrecognized:f0122973a228"}], "next": 33, "status": "manual_review"}, "http": {"attempts": 1, "body_bytes": 4270, "body_sha256": "4c34db1ef61a", "elapsed_ms": 20002, "fields": ["events", "next", "status"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.pollEvents: EventsResponse until CaptureAPI.terminalStatuses; next never moves back; a verdict names this run; retry_finalize re-sends the packet", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:34:12.972Z"} +{"expected": "a decodable result for this run whose status matches the terminal event status", "id": "lifecycle.result", "observed": {"contract": {"criteria": null, "has_preview_url": true, "memberActions": 0, "outcome": {"kind": "manual_review", "reasons": 0, "unexpected_keys": {"count": 2, "digest": "unexpected-keys:6380fdab2ebf"}}, "runId": "id:cd20e88d3918", "status": "manual_review", "unexpected_keys": {"count": 5, "digest": "unexpected-keys:ba9ed0e1e840"}, "viewsNeeded": 0}, "http": {"attempts": 1, "body_bytes": 778, "body_sha256": "fce991c13cb4", "elapsed_ms": 2, "fields": ["criteria", "memberActions", "outcome", "previewUrl", "reviewUrl", "runId", "status", "viewsNeeded"], "http_status": 200, "shape": "object"}, "not_ready_reads": 0, "run_matches": true, "status_matches": true, "terminal_status": "manual_review", "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.fetchResult: the whole body decodes as CaptureResult.Response, its runId is the finalized run, and a null outcome is final only under statusesWithoutOutcome", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:34:12.975Z"} +{"expected": "both creates 2xx with the same captureId", "id": "control.idempotent-create", "observed": {"first": {"contract": {"captureId": "id:c47173f20564", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "55688e0fef4b", "elapsed_ms": 3, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "same_capture": true, "second": {"contract": {"captureId": "id:c47173f20564", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "55688e0fef4b", "elapsed_ms": 1, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.start: create is bound to Idempotency-Key=packetId, so a repeated create with the same bytes names the same capture", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:34:12.981Z"} +{"expected": "intact files committed; the flipped file in mismatch or notFound, or its PUT refused, and never committed", "id": "control.corrupt-upload", "observed": {"batches": [{"contract": {"committed": ["keyframes/k00001.jpg", "keyframes/k00002.features.bin", "keyframes/k00002.jpg", "keyframes/k00003.jpg", "keyframes/k00004.jpg", "streams/arkit_poses.csv.gz", "streams/heading.csv.gz", "streams/imu_raw.csv.gz", "streams/location.csv.gz"], "mismatch": [], "notFound": ["keyframes/k00001.features.bin"]}, "http": {"attempts": 1, "body_bytes": 303, "body_sha256": "8090e5eeefd6", "elapsed_ms": 6, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}, {"contract": {"committed": ["streams/motion.csv.gz"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 67, "body_sha256": "3a6ac1c75562", "elapsed_ms": 2, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "intact_committed": true, "intact_reported_negative": false, "tampered": "keyframes/k00001.features.bin", "tampered_committed": false, "tampered_put_status": 400, "tampered_reported": true, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CommitResponse separates committed from mismatch/notFound; one file's bytes are flipped after its digest was registered", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:34:13.014Z"} +{"expected": "intact files committed; the truncated file in mismatch or notFound, or its PUT refused, and never committed", "id": "control.truncated-upload", "observed": {"batches": [{"contract": {"committed": ["keyframes/k00001.jpg", "keyframes/k00002.features.bin", "keyframes/k00002.jpg", "keyframes/k00003.jpg", "keyframes/k00004.jpg", "streams/arkit_poses.csv.gz", "streams/heading.csv.gz", "streams/imu_raw.csv.gz", "streams/location.csv.gz"], "mismatch": [], "notFound": ["keyframes/k00001.features.bin"]}, "http": {"attempts": 1, "body_bytes": 303, "body_sha256": "8090e5eeefd6", "elapsed_ms": 6, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}, {"contract": {"committed": ["streams/motion.csv.gz"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 67, "body_sha256": "3a6ac1c75562", "elapsed_ms": 3, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "intact_committed": true, "intact_reported_negative": false, "tampered": "keyframes/k00001.features.bin", "tampered_committed": false, "tampered_put_status": 400, "tampered_reported": true, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CommitResponse separates committed from mismatch/notFound; one file loses its last byte after its digest was registered", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:34:13.046Z"} +{"expected": "404 with error code capture_not_found for an id the harness invented", "id": "control.wrong-capture", "observed": {"capture": "id:cdd962a6682b", "errors": {"codes": ["capture_not_found"]}, "http": {"attempts": 1, "body_bytes": 85, "body_sha256": "1abfeda9732f", "elapsed_ms": 1, "fields": ["errors"], "http_status": 404, "shape": "object"}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.captureGone: an unknown capture answers 404 capture_not_found", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:34:13.047Z"} +{"expected": "every traced check present and PASS with the traced status class and fields, or upload and commit skipped because register reported every declared file committed", "id": "trace.expected-lifecycle-v3", "observed": {"compared": 12, "disagreements": [], "not_comparable": []}, "oracle": "frozen expected trace traces/expected-lifecycle-v3.jsonl, written from the published contract, with a no-request branch for files committed at register", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:34:13.050Z"} +{"expected": "after a successful restart the capture still reports its terminal status and run", "id": "control.restart-recovery", "observed": {"after_restart": [{"errors": {"codes": ["capture_not_found"]}, "http": {"attempts": 2, "body_bytes": 85, "body_sha256": "1abfeda9732f", "elapsed_ms": 4, "fields": ["errors"], "http_status": 404, "shape": "object"}}, {"errors": {"codes": ["capture_not_found"]}, "http": {"attempts": 1, "body_bytes": 85, "body_sha256": "1abfeda9732f", "elapsed_ms": 11, "fields": ["errors"], "http_status": 404, "shape": "object"}}], "exit_code": 0, "run_matches": false, "status_matches": false}, "oracle": "operator restart command, then the baseline capture is read again over the published events and result routes", "status": "FAIL", "transport": "REAL_API", "ts": "2026-10-16T11:34:14.078Z"} +{"expected": "not run", "id": "gpu-stub.objects", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:34:14.078Z"} +{"expected": "not run", "id": "gpu-stub.vlm", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:34:14.078Z"} +{"expected": "not run", "id": "gpu-stub.dense", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:34:14.078Z"} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/privacy-chain.jsonl b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/privacy-chain.jsonl new file mode 100644 index 000000000..1968d4d1d --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/privacy-chain.jsonl @@ -0,0 +1,4 @@ +{"artifact": "run-manifest.json", "at": "2026-10-16T11:33:52.348Z", "bytes": 5116, "chain_sha256": "51d59f06d1fb257272b1634b744f015e38f70f512141e6eddaa9dc2909fe6a51", "sha256": "81346991b10b1ea7d40f410aafb8b84a313eb2a75d71f34a08a67114bfdf05ec"} +{"artifact": "checks.jsonl", "at": "2026-10-16T11:34:14.078Z", "bytes": 24967, "chain_sha256": "900f9470f6fef17e03c772f687faa8e29fdf8645a10fd87d602c885bc9ecc65e", "sha256": "fff92fe1a4e1de81729f7d8840720524b822054c54693b19ab881f4a3f609a08"} +{"artifact": "summary.json", "at": "2026-10-16T11:34:14.078Z", "bytes": 1294, "chain_sha256": "af4f9378cf224189c7e0c0dc9a7a27fcd8b4da5a2c9005965079f13dfaf79993", "sha256": "f9db6910f4e8f554b9d26fe93ccd83dfa629365671797d201e37e56c292eaaf1"} +{"artifact": "privacy-screen.json", "at": "2026-10-16T11:34:14.095Z", "bytes": 238, "chain_sha256": "d41481e4fea8ea2f7e6f11f45bc3b912fdfa6253e85b65c5acd4494c6ecac013", "sha256": "45ad67f8fb8e2971251f89605d9ff926716400cdf6879170314ee5ffbc6b4a29"} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/privacy-screen.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/privacy-screen.json new file mode 100644 index 000000000..206431e5c --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/privacy-screen.json @@ -0,0 +1,12 @@ +{ + "clean": true, + "findings": [], + "finished_utc": "2026-10-16T11:34:14.095Z", + "missing": [], + "schema": "hunter-local-ingest/privacy-screen/2", + "screened": [ + "run-manifest.json", + "checks.jsonl", + "summary.json" + ] +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/run-manifest.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/run-manifest.json new file mode 100644 index 000000000..59b69c111 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/run-manifest.json @@ -0,0 +1,160 @@ +{ + "backend": { + "declared_mode": "REAL_API", + "declared_ref": "46bed47e", + "verified": false + }, + "client": { + "declared_ref": null, + "git": { + "diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "dirty": false, + "head": "46bed47e3438b11439b7a2e004d10ae35a561647", + "untracked": 0 + }, + "interface": "2.0.0", + "package_version": "0.2.0", + "source_sha256": "1187b70d311a949318aa37d1935204dd4297f327ddd98e4debc88abc90ddbfe7" + }, + "command": [ + "--endpoint", + "127.0.0.1:8000", + "--plan-file", + "", + "--backend-mode", + "REAL_API", + "--backend-ref", + "46bed47e", + "--out", + "", + "--label", + "realapi-miniarkit", + "--api-token-env", + "--restart-argv-json", + "" + ], + "created_utc": "2026-10-16T11:33:52.327Z", + "endpoint": "127.0.0.1:8000", + "fixture": { + "create_sha256": "e05e5b952a17707ec3d614f5f89729af41d22dc6c9464e049901edfae84c5efe", + "files": [ + { + "bytes": 4240, + "contentType": "application/octet-stream", + "path": "keyframes/k00001.features.bin", + "role": "features", + "sha256": "7710dcbc1ad6d99132a3cdf2c45f49cbae908eff3398c8edd779955e37962bf8" + }, + { + "bytes": 714, + "contentType": "image/jpeg", + "path": "keyframes/k00001.jpg", + "role": "keyframe", + "sha256": "753a386b150b92e235357144459d2109ed480bed805fbb0ac4ca989c42bc6d79" + }, + { + "bytes": 3740, + "contentType": "application/octet-stream", + "path": "keyframes/k00002.features.bin", + "role": "features", + "sha256": "ee6e18a01b94f594c8f17cc92e6f3e3bcef5347190b02a6a67fce8b10dc1f8b9" + }, + { + "bytes": 713, + "contentType": "image/jpeg", + "path": "keyframes/k00002.jpg", + "role": "keyframe", + "sha256": "80beae7b3ea40a8951f3001ea9e87a5bb342e9d4a402037bda815f953c3a3c8e" + }, + { + "bytes": 714, + "contentType": "image/jpeg", + "path": "keyframes/k00003.jpg", + "role": "keyframe", + "sha256": "a53e442431e7041303f024d5432e133dac2e3dc5726cbed37653b3d656a8b143" + }, + { + "bytes": 714, + "contentType": "image/jpeg", + "path": "keyframes/k00004.jpg", + "role": "keyframe", + "sha256": "98a40bb14e16042551263230a3474a2fa2ea688f2262ca2b84b6becc7dc67f65" + }, + { + "bytes": 73, + "contentType": "application/gzip", + "path": "streams/arkit_poses.csv.gz", + "role": "stream", + "sha256": "8b95dff9754f3567bd2b8d03906aa24c97c7d97d0e881970a8ddb0dd55d3dc3e" + }, + { + "bytes": 76, + "contentType": "application/gzip", + "path": "streams/heading.csv.gz", + "role": "stream", + "sha256": "4a9c16d18e22eeeb85c024b6fa0db32b9a22dd89c48e10bb14c989f183696a58" + }, + { + "bytes": 44, + "contentType": "application/gzip", + "path": "streams/imu_raw.csv.gz", + "role": "stream", + "sha256": "564ece90c04a9c78f7690ccae56c032dd4f1fb904e64b847697f66125bfd4b60" + }, + { + "bytes": 107, + "contentType": "application/gzip", + "path": "streams/location.csv.gz", + "role": "stream", + "sha256": "fc12d4b107cc3e7f7a903375c90310bcb2565fd3b50785b6bf3696282f83cc30" + }, + { + "bytes": 95, + "contentType": "application/gzip", + "path": "streams/motion.csv.gz", + "role": "stream", + "sha256": "d21ce4423410a0b1c5178c268dbbe615090e1dd9521affd4c31a34f830b4ec54" + } + ], + "format_version": 2, + "generator": "gen_miniarkit_packet", + "packet_id": "mini-arkit", + "packet_sha256": "9f59f921eddbdaed8bcda904db5c14dce364950c02d5d2902668ca756391fd0e", + "plan_file_sha256": "61af8c94dc58cc08ffc0922a191285e019772b7e02ca1e1b783eaa9c3cb507aa", + "plan_sha256": "d7af5c2ebda638a9815463fdf3c71e7b9db9dfb84ddba22eaab9dc7da0e251a6", + "seed": null + }, + "label": "realapi-miniarkit", + "origin_note": "Derived from published client behavior in HouseScanKit upload and result sources at alpha 263827ef. No private source, schema, spec, log or credential material appears in this package or its receipts.", + "restart": { + "argv": [ + "", + "", + "-k", + "-t", + "", + "" + ], + "configured": true, + "timeout_s": 120.0 + }, + "run_id": "d433c04240ec810d", + "runtime": { + "cpus": 8, + "implementation": "CPython", + "machine": "x86_64", + "python": "3.13.14", + "release": "6.1.158+", + "system": "Linux" + }, + "sanitization": "Every value here passed the typed export schema before it was written: published enum words, package constants, digests, bounded numbers, and the plan's own synthetic paths and packet ids. A pattern screen then ran over the written files.", + "schema": "hunter-local-ingest/run-manifest/2", + "settings": { + "events_wait_s": 20, + "max_retries": 2, + "poll_interval_s": 2.0, + "result_budget_s": 1500.0, + "retry_backoff_s": 1.0, + "with_faults": false + } +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/summary.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/summary.json new file mode 100644 index 000000000..e166a16ff --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-miniarkit-20261016T113352Z-d433c04240ec810d/summary.json @@ -0,0 +1,41 @@ +{ + "artifacts": { + "checks.jsonl": "fff92fe1a4e1de81729f7d8840720524b822054c54693b19ab881f4a3f609a08", + "run-manifest.json": "81346991b10b1ea7d40f410aafb8b84a313eb2a75d71f34a08a67114bfdf05ec" + }, + "blocked": [], + "counts_by_transport": { + "GPU_STUB": { + "NOT_RUN": 3 + }, + "REAL_API": { + "FAIL": 1, + "PASS": 13 + } + }, + "failed": [ + "control.restart-recovery" + ], + "finished_utc": "2026-10-16T11:34:14.078Z", + "lead_questions": [ + "Amendment semantics: does the published contract allow amending a registered capture, and with which route and headers?", + "--api-token-env opts into HUNTER_API_TOKEN for scoped API routes; token-protected proxy fault coverage remains BLOCKED.", + "Clock and expiry authority: whose clock governs capture expiry on the local backend?", + "Homeowner text: confirm that receipts may carry outcome kinds and counts but never messages, prompts or reasons." + ], + "mode": { + "backend_verified": false, + "declared_backend": "REAL_API", + "gpu_arms": "NOT_RUN", + "real_mirror_cpu": "NOT_ESTABLISHED" + }, + "not_run": [ + "gpu-stub.objects", + "gpu-stub.vlm", + "gpu-stub.dense" + ], + "run_id": "d433c04240ec810d", + "schema": "hunter-local-ingest/summary/2", + "total": 17, + "verdict": "FAIL" +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/checks.jsonl b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/checks.jsonl new file mode 100644 index 000000000..973f3accd --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/checks.jsonl @@ -0,0 +1,29 @@ +{"expected": "an HTTP 2xx answer with status ok", "id": "lifecycle.health", "observed": {"contract": {"status": "ok"}, "http": {"attempts": 1, "body_bytes": 96, "body_sha256": "78db994d461b", "elapsed_ms": 1, "fields": ["status"], "http_status": 200, "shape": "object"}, "violations": []}, "oracle": "tools/integration-viewer reads GET /v1/healthz; HouseScanKit never calls it", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.428Z"} +{"expected": "2xx, a captureId and a published capture status", "id": "lifecycle.create", "observed": {"contract": {"captureId": "id:0b50e7078585", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "112ea2af8e8c", "elapsed_ms": 2, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.create: POST captures with Idempotency-Key=packetId; the answer decodes as CaptureAPI.CreateResponse", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.431Z"} +{"expected": "every requested path answered exactly once, no other path, each committed or given a usable PUT target", "id": "lifecycle.register", "observed": {"batches": [{"contract": {"files": [{"path": "synthetic/scan00.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan01.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan02.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/arkit_poses.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/imu_raw.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf01.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf02.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf03.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}]}, "http": {"attempts": 1, "body_bytes": 4530, "body_sha256": "f0b572109003", "elapsed_ms": 5, "fields": ["files"], "http_status": 200, "shape": "object"}, "violations": []}], "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.register: the answer decodes as RegisterResponse and is applied by path; a target needs method PUT and a URL that passes uploadURLProblem", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.437Z"} +{"expected": "2xx for every file that got a target", "id": "lifecycle.upload", "observed": {"committed_at_register": [], "uploads": [{"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan00.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan01.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan02.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/arkit_poses.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/imu_raw.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf01.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf02.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf03.jpg", "shape": "empty"}]}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.put + ScopedCaptureHTTP.upload: exactly the signed headers, never Authorization", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.447Z"} +{"expected": "committed equals the uploaded set; notFound and mismatch empty; every declared path committed by register or commit", "id": "lifecycle.commit", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan00.bin", "synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 229, "body_sha256": "2cf7cd1cfbf0", "elapsed_ms": 2, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "committed_at_register": [], "committed_total": 8, "declared": 8, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.commit: only a commit acknowledges a file; CommitResponse carries committed, notFound and mismatch", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.450Z"} +{"expected": "2xx, a runId, a published status, no missing file", "id": "lifecycle.finalize", "observed": {"contract": {"etaS": 180, "missing": [], "runId": "id:d5cabee148e2", "status": "processing"}, "http": {"attempts": 1, "body_bytes": 78, "body_sha256": "b2c9a61d5cc5", "elapsed_ms": 2, "fields": ["etaS", "missing", "runId", "status"], "http_status": 202, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.finalize: X-Packet-Sha256 and Idempotency-Key=packetId; the answer decodes as FinalizeResponse", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.453Z"} +{"expected": "a terminal status within the budget, every answer contract-shaped", "id": "lifecycle.events", "observed": {"answers": 2, "finalize_retries": 0, "last": {"contract": {"events": [{"data": {"code": "unrecognized:ce62fc583826", "next": "unrecognized:30a0924a3360", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:29bd6ce81d82"}}, "seq": 3, "type": "failed"}], "next": 3, "status": "failed"}, "http": {"attempts": 1, "body_bytes": 204, "body_sha256": "99a6f4f8eec1", "elapsed_ms": 147, "fields": ["events", "next", "status"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.pollEvents: EventsResponse until CaptureAPI.terminalStatuses; next never moves back; a verdict names this run; retry_finalize re-sends the packet", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.603Z"} +{"expected": "a decodable result for this run whose status matches the terminal event status", "id": "lifecycle.result", "observed": {"contract": {"criteria": null, "has_preview_url": false, "memberActions": 0, "outcome": null, "runId": "id:d5cabee148e2", "status": "failed", "unexpected_keys": {"count": 5, "digest": "unexpected-keys:ba9ed0e1e840"}, "viewsNeeded": 0}, "http": {"attempts": 1, "body_bytes": 223, "body_sha256": "6035313a13ad", "elapsed_ms": 1, "fields": ["criteria", "memberActions", "outcome", "previewUrl", "reviewUrl", "runId", "status", "viewsNeeded"], "http_status": 200, "shape": "object"}, "not_ready_reads": 0, "run_matches": true, "status_matches": true, "terminal_status": "failed", "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.fetchResult: the whole body decodes as CaptureResult.Response, its runId is the finalized run, and a null outcome is final only under statusesWithoutOutcome", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.605Z"} +{"expected": "both creates 2xx with the same captureId", "id": "control.idempotent-create", "observed": {"first": {"contract": {"captureId": "id:3ac1b57a0525", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "776572931c2f", "elapsed_ms": 1, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "same_capture": true, "second": {"contract": {"captureId": "id:3ac1b57a0525", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "776572931c2f", "elapsed_ms": 0, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.start: create is bound to Idempotency-Key=packetId, so a repeated create with the same bytes names the same capture", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.608Z"} +{"expected": "intact files committed; the flipped file in mismatch or notFound, or its PUT refused, and never committed", "id": "control.corrupt-upload", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": ["synthetic/scan00.bin"]}, "http": {"attempts": 1, "body_bytes": 228, "body_sha256": "f66d409bbb61", "elapsed_ms": 1, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "intact_committed": true, "intact_reported_negative": false, "tampered": "synthetic/scan00.bin", "tampered_committed": false, "tampered_put_status": 400, "tampered_reported": true, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CommitResponse separates committed from mismatch/notFound; one file's bytes are flipped after its digest was registered", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.625Z"} +{"expected": "intact files committed; the truncated file in mismatch or notFound, or its PUT refused, and never committed", "id": "control.truncated-upload", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": ["synthetic/scan00.bin"]}, "http": {"attempts": 1, "body_bytes": 228, "body_sha256": "f66d409bbb61", "elapsed_ms": 1, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "intact_committed": true, "intact_reported_negative": false, "tampered": "synthetic/scan00.bin", "tampered_committed": false, "tampered_put_status": 400, "tampered_reported": true, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CommitResponse separates committed from mismatch/notFound; one file loses its last byte after its digest was registered", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.640Z"} +{"expected": "404 with error code capture_not_found for an id the harness invented", "id": "control.wrong-capture", "observed": {"capture": "id:1976512104be", "errors": {"codes": ["capture_not_found"]}, "http": {"attempts": 1, "body_bytes": 85, "body_sha256": "1abfeda9732f", "elapsed_ms": 1, "fields": ["errors"], "http_status": 404, "shape": "object"}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.captureGone: an unknown capture answers 404 capture_not_found", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:49.642Z"} +{"expected": "an HTTP 2xx answer with status ok", "id": "fault.lifecycle.health", "observed": {"contract": {"status": "ok"}, "http": {"attempts": 1, "body_bytes": 96, "body_sha256": "78db994d461b", "elapsed_ms": 1, "fields": ["status"], "http_status": 200, "shape": "object"}, "violations": []}, "oracle": "tools/integration-viewer reads GET /v1/healthz; HouseScanKit never calls it", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:49.644Z"} +{"expected": "2xx, a captureId and a published capture status", "id": "fault.lifecycle.create", "observed": {"contract": {"captureId": "id:641c05ce7565", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "04b34eb1b155", "elapsed_ms": 102, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.create: POST captures with Idempotency-Key=packetId; the answer decodes as CaptureAPI.CreateResponse", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:49.747Z"} +{"expected": "every requested path answered exactly once, no other path, each committed or given a usable PUT target", "id": "fault.lifecycle.register", "observed": {"batches": [{"contract": {"files": [{"path": "synthetic/scan00.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan01.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan02.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/arkit_poses.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/imu_raw.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf01.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf02.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf03.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}]}, "http": {"attempts": 1, "body_bytes": 4530, "body_sha256": "8657b5535884", "elapsed_ms": 4, "fields": ["files"], "http_status": 200, "shape": "object"}, "violations": []}], "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.register: the answer decodes as RegisterResponse and is applied by path; a target needs method PUT and a URL that passes uploadURLProblem", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:49.752Z"} +{"expected": "2xx for every file that got a target", "id": "fault.lifecycle.upload", "observed": {"committed_at_register": [], "uploads": [{"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan00.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan01.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan02.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/arkit_poses.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "streams/imu_raw.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf01.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf02.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "keyframes/kf03.jpg", "shape": "empty"}]}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.put + ScopedCaptureHTTP.upload: exactly the signed headers, never Authorization", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:49.762Z"} +{"expected": "committed equals the uploaded set; notFound and mismatch empty; every declared path committed by register or commit", "id": "fault.lifecycle.commit", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan00.bin", "synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 229, "body_sha256": "2cf7cd1cfbf0", "elapsed_ms": 2, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "committed_at_register": [], "committed_total": 8, "declared": 8, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.commit: only a commit acknowledges a file; CommitResponse carries committed, notFound and mismatch", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:49.765Z"} +{"expected": "2xx, a runId, a published status, no missing file", "id": "fault.lifecycle.finalize", "observed": {"contract": {"etaS": 180, "missing": [], "runId": "id:cd0d704e8562", "status": "processing"}, "http": {"attempts": 1, "body_bytes": 78, "body_sha256": "1654a0180e90", "elapsed_ms": 3, "fields": ["etaS", "missing", "runId", "status"], "http_status": 202, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.finalize: X-Packet-Sha256 and Idempotency-Key=packetId; the answer decodes as FinalizeResponse", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:49.769Z"} +{"expected": "a terminal status within the budget, every answer contract-shaped", "id": "fault.lifecycle.events", "observed": {"answers": 1, "finalize_retries": 0, "last": {"contract": {"events": [{"data": {"unexpected_keys": {"count": 3, "digest": "unexpected-keys:dd00736cc4cd"}}, "seq": 1, "type": "unrecognized:8fc8ef9e6dc5"}, {"data": {"runId": "id:cd0d704e8562", "runId_matches": true, "stage": "unrecognized:2c9877104bf1", "status": "unrecognized:79d116a0c160", "unexpected_keys": {"count": 4, "digest": "unexpected-keys:b39fd182ab56"}}, "seq": 2, "type": "unrecognized:f0122973a228"}, {"data": {"code": "unrecognized:ce62fc583826", "next": "unrecognized:30a0924a3360", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:29bd6ce81d82"}}, "seq": 3, "type": "failed"}], "next": 3, "status": "failed"}, "http": {"attempts": 1, "body_bytes": 688, "body_sha256": "f8ad0bd42b8c", "elapsed_ms": 2, "fields": ["events", "next", "status"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.pollEvents: EventsResponse until CaptureAPI.terminalStatuses; next never moves back; a verdict names this run; retry_finalize re-sends the packet", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:49.772Z"} +{"expected": "a decodable result for this run whose status matches the terminal event status", "id": "fault.lifecycle.result", "observed": {"contract": {"criteria": null, "has_preview_url": false, "memberActions": 0, "outcome": null, "runId": "id:cd0d704e8562", "status": "failed", "unexpected_keys": {"count": 5, "digest": "unexpected-keys:ba9ed0e1e840"}, "viewsNeeded": 0}, "http": {"attempts": 1, "body_bytes": 223, "body_sha256": "4315b606b9a7", "elapsed_ms": 2, "fields": ["criteria", "memberActions", "outcome", "previewUrl", "reviewUrl", "runId", "status", "viewsNeeded"], "http_status": 200, "shape": "object"}, "not_ready_reads": 0, "run_matches": true, "status_matches": true, "terminal_status": "failed", "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.fetchResult: the whole body decodes as CaptureResult.Response, its runId is the finalized run, and a null outcome is final only under statusesWithoutOutcome", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:49.774Z"} +{"expected": "the proxy's single 503 is followed by a second attempt that creates the capture", "id": "fault.retry-transient", "observed": {"contract": {"captureId": "id:dd8c25cfaef3", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 2, "body_bytes": 277, "body_sha256": "16ea15c2030f", "elapsed_ms": 2, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "proxy_hits": 2, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.isTransient: a 503 is retried with the same body", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:50.777Z"} +{"expected": "exactly one attempt and a reported non-2xx answer", "id": "fault.no-retry-501", "observed": {"errors": {"codes": ["harness_fault"]}, "http": {"attempts": 1, "body_bytes": 39, "body_sha256": "be37db4e697d", "elapsed_ms": 1, "fields": ["errors"], "http_status": 501, "shape": "object"}, "proxy_hits": 1}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.isTransient excludes 501", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:51.280Z"} +{"expected": "a transport error category after 1 + max_retries attempts, no capture id taken", "id": "fault.abort", "observed": {"http": {"attempts": 2, "error": "transport:remote-disconnected"}, "proxy_hits": 2}, "oracle": "an answer-less connection is a transport failure, retried a bounded number of times", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:51.784Z"} +{"expected": "a transport error category, no capture id taken", "id": "fault.truncated-response", "observed": {"http": {"attempts": 1, "error": "transport:incomplete-read"}, "proxy_hits": 1}, "oracle": "a body shorter than its Content-Length is a transport failure, never a parsed answer", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:22:52.287Z"} +{"expected": "every traced check present and PASS with the traced status class and fields, or upload and commit skipped because register reported every declared file committed", "id": "trace.expected-lifecycle-v3", "observed": {"compared": 12, "disagreements": [], "not_comparable": []}, "oracle": "frozen expected trace traces/expected-lifecycle-v3.jsonl, written from the published contract, with a no-request branch for files committed at register", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:22:52.291Z"} +{"expected": "after a successful restart the capture still reports its terminal status and run", "id": "control.restart-recovery", "observed": {"note": "restart-not-configured"}, "oracle": "operator restart command, then the baseline capture is read again over the published events and result routes", "status": "NOT_RUN", "transport": "REAL_API", "ts": "2026-10-16T11:22:52.291Z"} +{"expected": "not run", "id": "gpu-stub.objects", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:22:52.291Z"} +{"expected": "not run", "id": "gpu-stub.vlm", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:22:52.291Z"} +{"expected": "not run", "id": "gpu-stub.dense", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:22:52.291Z"} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/privacy-chain.jsonl b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/privacy-chain.jsonl new file mode 100644 index 000000000..2787da708 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/privacy-chain.jsonl @@ -0,0 +1,4 @@ +{"artifact": "run-manifest.json", "at": "2026-10-16T11:22:49.426Z", "bytes": 4256, "chain_sha256": "366c9e02d62019a612f34e0d7559f7c0610248b647d81ad03a1bc2f175c9223d", "sha256": "4a48cf7e41a7bfb921dd11e5fa35eea81d7eb39b5fdee836c9ff6209edf2e803"} +{"artifact": "checks.jsonl", "at": "2026-10-16T11:22:52.291Z", "bytes": 26712, "chain_sha256": "8138ed032d3129243fd23ea65eed1a5472444eee7a0247114b4defcce9e79aed", "sha256": "defbe3958731b3187c7dd5063d162217af79298a74d1f04800862719e99249db"} +{"artifact": "summary.json", "at": "2026-10-16T11:22:52.292Z", "bytes": 1340, "chain_sha256": "f0f111318b96d35a698d541869ee8476899fd48abf0d33aa915373adf4a94313", "sha256": "e3b200334bab1b3781c96d913c41248329a71f2f1a8d7f8404fe12567ebfb53f"} +{"artifact": "privacy-screen.json", "at": "2026-10-16T11:22:52.313Z", "bytes": 238, "chain_sha256": "fc8a7a66b427347bc021da08c3683430199bd390fb22cc73acaf0d9c0e2b9d8b", "sha256": "8005ce17f88729f7cbfab363508ff9f15d0db47d992109cc26fa513fbd212a57"} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/privacy-screen.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/privacy-screen.json new file mode 100644 index 000000000..1fe936905 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/privacy-screen.json @@ -0,0 +1,12 @@ +{ + "clean": true, + "findings": [], + "finished_utc": "2026-10-16T11:22:52.312Z", + "missing": [], + "schema": "hunter-local-ingest/privacy-screen/2", + "screened": [ + "run-manifest.json", + "checks.jsonl", + "summary.json" + ] +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/run-manifest.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/run-manifest.json new file mode 100644 index 000000000..12a73fd7a --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/run-manifest.json @@ -0,0 +1,130 @@ +{ + "backend": { + "declared_mode": "REAL_API", + "declared_ref": "46bed47e", + "verified": false + }, + "client": { + "declared_ref": null, + "git": { + "diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "dirty": false, + "head": "46bed47e3438b11439b7a2e004d10ae35a561647", + "untracked": 0 + }, + "interface": "2.0.0", + "package_version": "0.2.0", + "source_sha256": "1187b70d311a949318aa37d1935204dd4297f327ddd98e4debc88abc90ddbfe7" + }, + "command": [ + "--endpoint", + "127.0.0.1:8000", + "--plan-file", + "", + "--backend-mode", + "REAL_API", + "--backend-ref", + "46bed47e", + "--out", + "", + "--label", + "realapi-none", + "--with-faults" + ], + "created_utc": "2026-10-16T11:22:49.412Z", + "endpoint": "127.0.0.1:8000", + "fixture": { + "create_sha256": "9c2dd5f33bb70b7199e85f165e87602986faa7f6b5beaee6f55db4f1f9edce97", + "files": [ + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan00.bin", + "role": "other", + "sha256": "a1ca0aa5e471b98beddf42738d706871542520398ced6f3ed81008e8c9812d85" + }, + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan01.bin", + "role": "other", + "sha256": "ef4380c88a7e0a2df7506640f6b435b153122e01070d7570870ebd2d3367d4be" + }, + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan02.bin", + "role": "other", + "sha256": "3fda1dfcabd6f77b655435c16a6c7b75d5f2f2b4ef9dccd814fede0f2b69e1f1" + }, + { + "bytes": 9793, + "contentType": "application/gzip", + "path": "streams/arkit_poses.csv.gz", + "role": "stream", + "sha256": "a23bcec6f6829c053e7bc1871999ca7b1a5e88639b5a6cde56afc655d3447388" + }, + { + "bytes": 9443, + "contentType": "application/gzip", + "path": "streams/imu_raw.csv.gz", + "role": "stream", + "sha256": "ae96d9008b71882aeb0dbc1c5463897aa9c316fbda28d5503b4676e0bd85a161" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf01.jpg", + "role": "keyframe", + "sha256": "3ee4012f8d1aad5e8b030eacf846677051e207d891a4587fcf8e57e6bea8eb5c" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf02.jpg", + "role": "keyframe", + "sha256": "1f19a24b5184b45b77ac39e8a73bca0068aeed712f91390b58efd551b9c2448f" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf03.jpg", + "role": "keyframe", + "sha256": "ab61b8867e6e94cfbecddf130d718ce07ea0fa761b2e651b717f6d1e4c8dd801" + } + ], + "format_version": 2, + "generator": "gen_synthetic_packet", + "packet_id": "synthetic-000001", + "packet_sha256": "551d7a302b9351113fbb6840754ef80a05f3c9545baa19cd9cd1e7ae657af184", + "plan_file_sha256": "605d1c8c24c3fd6222d50f266d208011a0f5149c658f5dfab72617ef3d52ba4a", + "plan_sha256": "8c9e543fd3dd3fee1e73edafe2bf07cdb6fe611f0fd46c529ea79636812a71b2", + "seed": 1 + }, + "label": "realapi-none", + "origin_note": "Derived from published client behavior in HouseScanKit upload and result sources at alpha 263827ef. No private source, schema, spec, log or credential material appears in this package or its receipts.", + "restart": { + "argv": [], + "configured": false, + "timeout_s": 120.0 + }, + "run_id": "58f45a2ef87cc5f9", + "runtime": { + "cpus": 8, + "implementation": "CPython", + "machine": "x86_64", + "python": "3.13.14", + "release": "6.1.158+", + "system": "Linux" + }, + "sanitization": "Every value here passed the typed export schema before it was written: published enum words, package constants, digests, bounded numbers, and the plan's own synthetic paths and packet ids. A pattern screen then ran over the written files.", + "schema": "hunter-local-ingest/run-manifest/2", + "settings": { + "events_wait_s": 20, + "max_retries": 2, + "poll_interval_s": 2.0, + "result_budget_s": 1500.0, + "retry_backoff_s": 1.0, + "with_faults": true + } +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/summary.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/summary.json new file mode 100644 index 000000000..94c556273 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-none-20261016T112249Z-58f45a2ef87cc5f9/summary.json @@ -0,0 +1,43 @@ +{ + "artifacts": { + "checks.jsonl": "defbe3958731b3187c7dd5063d162217af79298a74d1f04800862719e99249db", + "run-manifest.json": "4a48cf7e41a7bfb921dd11e5fa35eea81d7eb39b5fdee836c9ff6209edf2e803" + }, + "blocked": [], + "counts_by_transport": { + "FAKE_HUNTER": { + "PASS": 12 + }, + "GPU_STUB": { + "NOT_RUN": 3 + }, + "REAL_API": { + "NOT_RUN": 1, + "PASS": 13 + } + }, + "failed": [], + "finished_utc": "2026-10-16T11:22:52.291Z", + "lead_questions": [ + "Amendment semantics: does the published contract allow amending a registered capture, and with which route and headers?", + "--api-token-env opts into HUNTER_API_TOKEN for scoped API routes; token-protected proxy fault coverage remains BLOCKED.", + "Clock and expiry authority: whose clock governs capture expiry on the local backend?", + "Homeowner text: confirm that receipts may carry outcome kinds and counts but never messages, prompts or reasons." + ], + "mode": { + "backend_verified": false, + "declared_backend": "REAL_API", + "gpu_arms": "NOT_RUN", + "real_mirror_cpu": "NOT_ESTABLISHED" + }, + "not_run": [ + "control.restart-recovery", + "gpu-stub.objects", + "gpu-stub.vlm", + "gpu-stub.dense" + ], + "run_id": "58f45a2ef87cc5f9", + "schema": "hunter-local-ingest/summary/2", + "total": 29, + "verdict": "PASS" +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/checks.jsonl b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/checks.jsonl new file mode 100644 index 000000000..02539221a --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/checks.jsonl @@ -0,0 +1,29 @@ +{"expected": "an HTTP 2xx answer with status ok", "id": "lifecycle.health", "observed": {"contract": {"status": "ok"}, "http": {"attempts": 1, "body_bytes": 96, "body_sha256": "78db994d461b", "elapsed_ms": 1, "fields": ["status"], "http_status": 200, "shape": "object"}, "violations": []}, "oracle": "tools/integration-viewer reads GET /v1/healthz; HouseScanKit never calls it", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.236Z"} +{"expected": "2xx, a captureId and a published capture status", "id": "lifecycle.create", "observed": {"contract": {"captureId": "id:d7810075c6f4", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "82a0185ea86b", "elapsed_ms": 2, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.create: POST captures with Idempotency-Key=packetId; the answer decodes as CaptureAPI.CreateResponse", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.239Z"} +{"expected": "every requested path answered exactly once, no other path, each committed or given a usable PUT target", "id": "lifecycle.register", "observed": {"batches": [{"contract": {"files": [{"path": "synthetic/scan00.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan01.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan02.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/arkit_poses.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/imu_raw.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf01.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf02.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf03.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}]}, "http": {"attempts": 1, "body_bytes": 4530, "body_sha256": "daefeef84397", "elapsed_ms": 5, "fields": ["files"], "http_status": 200, "shape": "object"}, "violations": []}], "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.register: the answer decodes as RegisterResponse and is applied by path; a target needs method PUT and a URL that passes uploadURLProblem", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.245Z"} +{"expected": "2xx for every file that got a target", "id": "lifecycle.upload", "observed": {"committed_at_register": [], "uploads": [{"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 2, "fields": [], "http_status": 200, "path": "synthetic/scan00.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan01.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan02.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/arkit_poses.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "streams/imu_raw.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "keyframes/kf01.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf02.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf03.jpg", "shape": "empty"}]}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.put + ScopedCaptureHTTP.upload: exactly the signed headers, never Authorization", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.256Z"} +{"expected": "committed equals the uploaded set; notFound and mismatch empty; every declared path committed by register or commit", "id": "lifecycle.commit", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan00.bin", "synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 229, "body_sha256": "2cf7cd1cfbf0", "elapsed_ms": 2, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "committed_at_register": [], "committed_total": 8, "declared": 8, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.commit: only a commit acknowledges a file; CommitResponse carries committed, notFound and mismatch", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.259Z"} +{"expected": "2xx, a runId, a published status, no missing file", "id": "lifecycle.finalize", "observed": {"contract": {"etaS": 180, "missing": [], "runId": "id:89d5545dddb6", "status": "processing"}, "http": {"attempts": 1, "body_bytes": 78, "body_sha256": "62d40aa6b97a", "elapsed_ms": 2, "fields": ["etaS", "missing", "runId", "status"], "http_status": 202, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.finalize: X-Packet-Sha256 and Idempotency-Key=packetId; the answer decodes as FinalizeResponse", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.261Z"} +{"expected": "a terminal status within the budget, every answer contract-shaped", "id": "lifecycle.events", "observed": {"answers": 2, "finalize_retries": 0, "last": {"contract": {"events": [{"data": {"code": "unrecognized:ce62fc583826", "next": "unrecognized:30a0924a3360", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:29bd6ce81d82"}}, "seq": 3, "type": "failed"}], "next": 3, "status": "failed"}, "http": {"attempts": 1, "body_bytes": 204, "body_sha256": "aadf7c424f7a", "elapsed_ms": 58, "fields": ["events", "next", "status"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.pollEvents: EventsResponse until CaptureAPI.terminalStatuses; next never moves back; a verdict names this run; retry_finalize re-sends the packet", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.322Z"} +{"expected": "a decodable result for this run whose status matches the terminal event status", "id": "lifecycle.result", "observed": {"contract": {"criteria": null, "has_preview_url": false, "memberActions": 0, "outcome": null, "runId": "id:89d5545dddb6", "status": "failed", "unexpected_keys": {"count": 5, "digest": "unexpected-keys:ba9ed0e1e840"}, "viewsNeeded": 0}, "http": {"attempts": 1, "body_bytes": 223, "body_sha256": "09a786b7ec82", "elapsed_ms": 1, "fields": ["criteria", "memberActions", "outcome", "previewUrl", "reviewUrl", "runId", "status", "viewsNeeded"], "http_status": 200, "shape": "object"}, "not_ready_reads": 0, "run_matches": true, "status_matches": true, "terminal_status": "failed", "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.fetchResult: the whole body decodes as CaptureResult.Response, its runId is the finalized run, and a null outcome is final only under statusesWithoutOutcome", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.324Z"} +{"expected": "both creates 2xx with the same captureId", "id": "control.idempotent-create", "observed": {"first": {"contract": {"captureId": "id:effdbaf787e1", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "97eb7b986dec", "elapsed_ms": 1, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "same_capture": true, "second": {"contract": {"captureId": "id:effdbaf787e1", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "97eb7b986dec", "elapsed_ms": 1, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.start: create is bound to Idempotency-Key=packetId, so a repeated create with the same bytes names the same capture", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.327Z"} +{"expected": "intact files committed; the flipped file in mismatch or notFound, or its PUT refused, and never committed", "id": "control.corrupt-upload", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": ["synthetic/scan00.bin"]}, "http": {"attempts": 1, "body_bytes": 228, "body_sha256": "f66d409bbb61", "elapsed_ms": 1, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "intact_committed": true, "intact_reported_negative": false, "tampered": "synthetic/scan00.bin", "tampered_committed": false, "tampered_put_status": 400, "tampered_reported": true, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CommitResponse separates committed from mismatch/notFound; one file's bytes are flipped after its digest was registered", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.347Z"} +{"expected": "intact files committed; the truncated file in mismatch or notFound, or its PUT refused, and never committed", "id": "control.truncated-upload", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": ["synthetic/scan00.bin"]}, "http": {"attempts": 1, "body_bytes": 228, "body_sha256": "f66d409bbb61", "elapsed_ms": 1, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "intact_committed": true, "intact_reported_negative": false, "tampered": "synthetic/scan00.bin", "tampered_committed": false, "tampered_put_status": 400, "tampered_reported": true, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CommitResponse separates committed from mismatch/notFound; one file loses its last byte after its digest was registered", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.365Z"} +{"expected": "404 with error code capture_not_found for an id the harness invented", "id": "control.wrong-capture", "observed": {"capture": "id:1976512104be", "errors": {"codes": ["capture_not_found"]}, "http": {"attempts": 1, "body_bytes": 85, "body_sha256": "1abfeda9732f", "elapsed_ms": 1, "fields": ["errors"], "http_status": 404, "shape": "object"}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.captureGone: an unknown capture answers 404 capture_not_found", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:02.366Z"} +{"expected": "an HTTP 2xx answer with status ok", "id": "fault.lifecycle.health", "observed": {"contract": {"status": "ok"}, "http": {"attempts": 1, "body_bytes": 96, "body_sha256": "78db994d461b", "elapsed_ms": 2, "fields": ["status"], "http_status": 200, "shape": "object"}, "violations": []}, "oracle": "tools/integration-viewer reads GET /v1/healthz; HouseScanKit never calls it", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:02.369Z"} +{"expected": "2xx, a captureId and a published capture status", "id": "fault.lifecycle.create", "observed": {"contract": {"captureId": "id:6252b7a5426c", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "057c34d8ce65", "elapsed_ms": 102, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.create: POST captures with Idempotency-Key=packetId; the answer decodes as CaptureAPI.CreateResponse", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:02.472Z"} +{"expected": "every requested path answered exactly once, no other path, each committed or given a usable PUT target", "id": "fault.lifecycle.register", "observed": {"batches": [{"contract": {"files": [{"path": "synthetic/scan00.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan01.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan02.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/arkit_poses.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/imu_raw.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf01.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf02.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf03.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}]}, "http": {"attempts": 1, "body_bytes": 4530, "body_sha256": "b863ed74b6e2", "elapsed_ms": 4, "fields": ["files"], "http_status": 200, "shape": "object"}, "violations": []}], "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.register: the answer decodes as RegisterResponse and is applied by path; a target needs method PUT and a URL that passes uploadURLProblem", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:02.477Z"} +{"expected": "2xx for every file that got a target", "id": "fault.lifecycle.upload", "observed": {"committed_at_register": [], "uploads": [{"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan00.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan01.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan02.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/arkit_poses.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/imu_raw.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf01.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf02.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf03.jpg", "shape": "empty"}]}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.put + ScopedCaptureHTTP.upload: exactly the signed headers, never Authorization", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:02.488Z"} +{"expected": "committed equals the uploaded set; notFound and mismatch empty; every declared path committed by register or commit", "id": "fault.lifecycle.commit", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan00.bin", "synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 229, "body_sha256": "2cf7cd1cfbf0", "elapsed_ms": 3, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "committed_at_register": [], "committed_total": 8, "declared": 8, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.commit: only a commit acknowledges a file; CommitResponse carries committed, notFound and mismatch", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:02.492Z"} +{"expected": "2xx, a runId, a published status, no missing file", "id": "fault.lifecycle.finalize", "observed": {"contract": {"etaS": 180, "missing": [], "runId": "id:31afd92d5817", "status": "processing"}, "http": {"attempts": 1, "body_bytes": 78, "body_sha256": "5ae39229d6ff", "elapsed_ms": 3, "fields": ["etaS", "missing", "runId", "status"], "http_status": 202, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.finalize: X-Packet-Sha256 and Idempotency-Key=packetId; the answer decodes as FinalizeResponse", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:02.496Z"} +{"expected": "a terminal status within the budget, every answer contract-shaped", "id": "fault.lifecycle.events", "observed": {"answers": 2, "finalize_retries": 0, "last": {"contract": {"events": [{"data": {"code": "unrecognized:ce62fc583826", "next": "unrecognized:30a0924a3360", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:29bd6ce81d82"}}, "seq": 3, "type": "failed"}], "next": 3, "status": "failed"}, "http": {"attempts": 1, "body_bytes": 204, "body_sha256": "aadf7c424f7a", "elapsed_ms": 1, "fields": ["events", "next", "status"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.pollEvents: EventsResponse until CaptureAPI.terminalStatuses; next never moves back; a verdict names this run; retry_finalize re-sends the packet", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:02.501Z"} +{"expected": "a decodable result for this run whose status matches the terminal event status", "id": "fault.lifecycle.result", "observed": {"contract": {"criteria": null, "has_preview_url": false, "memberActions": 0, "outcome": null, "runId": "id:31afd92d5817", "status": "failed", "unexpected_keys": {"count": 5, "digest": "unexpected-keys:ba9ed0e1e840"}, "viewsNeeded": 0}, "http": {"attempts": 1, "body_bytes": 223, "body_sha256": "16a7c434e72c", "elapsed_ms": 2, "fields": ["criteria", "memberActions", "outcome", "previewUrl", "reviewUrl", "runId", "status", "viewsNeeded"], "http_status": 200, "shape": "object"}, "not_ready_reads": 0, "run_matches": true, "status_matches": true, "terminal_status": "failed", "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.fetchResult: the whole body decodes as CaptureResult.Response, its runId is the finalized run, and a null outcome is final only under statusesWithoutOutcome", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:02.504Z"} +{"expected": "the proxy's single 503 is followed by a second attempt that creates the capture", "id": "fault.retry-transient", "observed": {"contract": {"captureId": "id:1d225e4f9e08", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 2, "body_bytes": 277, "body_sha256": "d2d9dfb3d002", "elapsed_ms": 2, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "proxy_hits": 2, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.isTransient: a 503 is retried with the same body", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:03.507Z"} +{"expected": "exactly one attempt and a reported non-2xx answer", "id": "fault.no-retry-501", "observed": {"errors": {"codes": ["harness_fault"]}, "http": {"attempts": 1, "body_bytes": 39, "body_sha256": "be37db4e697d", "elapsed_ms": 1, "fields": ["errors"], "http_status": 501, "shape": "object"}, "proxy_hits": 1}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.isTransient excludes 501", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:04.010Z"} +{"expected": "a transport error category after 1 + max_retries attempts, no capture id taken", "id": "fault.abort", "observed": {"http": {"attempts": 2, "error": "transport:remote-disconnected"}, "proxy_hits": 2}, "oracle": "an answer-less connection is a transport failure, retried a bounded number of times", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:04.513Z"} +{"expected": "a transport error category, no capture id taken", "id": "fault.truncated-response", "observed": {"http": {"attempts": 1, "error": "transport:incomplete-read"}, "proxy_hits": 1}, "oracle": "a body shorter than its Content-Length is a transport failure, never a parsed answer", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:23:05.016Z"} +{"expected": "every traced check present and PASS with the traced status class and fields, or upload and commit skipped because register reported every declared file committed", "id": "trace.expected-lifecycle-v3", "observed": {"compared": 12, "disagreements": [], "not_comparable": []}, "oracle": "frozen expected trace traces/expected-lifecycle-v3.jsonl, written from the published contract, with a no-request branch for files committed at register", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:05.021Z"} +{"expected": "after a successful restart the capture still reports its terminal status and run", "id": "control.restart-recovery", "observed": {"after_restart": [{"errors": {"codes": ["capture_not_found"]}, "http": {"attempts": 2, "body_bytes": 85, "body_sha256": "1abfeda9732f", "elapsed_ms": 4, "fields": ["errors"], "http_status": 404, "shape": "object"}}, {"errors": {"codes": ["capture_not_found"]}, "http": {"attempts": 1, "body_bytes": 85, "body_sha256": "1abfeda9732f", "elapsed_ms": 12, "fields": ["errors"], "http_status": 404, "shape": "object"}}], "exit_code": 0, "run_matches": false, "status_matches": false}, "oracle": "operator restart command, then the baseline capture is read again over the published events and result routes", "status": "FAIL", "transport": "REAL_API", "ts": "2026-10-16T11:23:06.051Z"} +{"expected": "not run", "id": "gpu-stub.objects", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:23:06.051Z"} +{"expected": "not run", "id": "gpu-stub.vlm", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:23:06.051Z"} +{"expected": "not run", "id": "gpu-stub.dense", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:23:06.051Z"} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/privacy-chain.jsonl b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/privacy-chain.jsonl new file mode 100644 index 000000000..6535c7f8e --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/privacy-chain.jsonl @@ -0,0 +1,4 @@ +{"artifact": "run-manifest.json", "at": "2026-10-16T11:23:02.233Z", "bytes": 4398, "chain_sha256": "096fc7ee504b967be83f0707451cefb634fd2ed017b9869168c9fb55104efbcd", "sha256": "3237f31254927c6c7c553e81f7672f986433af695693cb0f11fd6343f71f318b"} +{"artifact": "checks.jsonl", "at": "2026-10-16T11:23:06.051Z", "bytes": 26757, "chain_sha256": "29c6a76a95ee64a4d2d29ff90310570a39d607ad904fd7158ee59690a0261b00", "sha256": "b1057d7691adec2d6a6a15b4ee6095b4a46f3f8190f0bf47a6b3a62cf5cda541"} +{"artifact": "summary.json", "at": "2026-10-16T11:23:06.052Z", "bytes": 1339, "chain_sha256": "a64d0b6e2ad5ab826f4a076dac69d1705a7d5b0e028600fbd307794411e748b5", "sha256": "5f35eaefee430dd933f9c26f0f289a032a9a45cb54972c2d97ff5fc4a0ff75c2"} +{"artifact": "privacy-screen.json", "at": "2026-10-16T11:23:06.076Z", "bytes": 238, "chain_sha256": "48db406830adec58e50424965a3f440730c08a672311397ddbf0c19561bb3f2c", "sha256": "445780a723633a02e9d3727d19d2b4b8728281820f555aeebe6d9b55f134feff"} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/privacy-screen.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/privacy-screen.json new file mode 100644 index 000000000..0a11cccab --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/privacy-screen.json @@ -0,0 +1,12 @@ +{ + "clean": true, + "findings": [], + "finished_utc": "2026-10-16T11:23:06.076Z", + "missing": [], + "schema": "hunter-local-ingest/privacy-screen/2", + "screened": [ + "run-manifest.json", + "checks.jsonl", + "summary.json" + ] +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/run-manifest.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/run-manifest.json new file mode 100644 index 000000000..f29a18950 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/run-manifest.json @@ -0,0 +1,139 @@ +{ + "backend": { + "declared_mode": "REAL_API", + "declared_ref": "46bed47e", + "verified": false + }, + "client": { + "declared_ref": null, + "git": { + "diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "dirty": false, + "head": "46bed47e3438b11439b7a2e004d10ae35a561647", + "untracked": 0 + }, + "interface": "2.0.0", + "package_version": "0.2.0", + "source_sha256": "1187b70d311a949318aa37d1935204dd4297f327ddd98e4debc88abc90ddbfe7" + }, + "command": [ + "--endpoint", + "127.0.0.1:8000", + "--plan-file", + "", + "--backend-mode", + "REAL_API", + "--backend-ref", + "46bed47e", + "--out", + "", + "--label", + "realapi-restart", + "--with-faults", + "--restart-argv-json", + "" + ], + "created_utc": "2026-10-16T11:23:02.218Z", + "endpoint": "127.0.0.1:8000", + "fixture": { + "create_sha256": "9c2dd5f33bb70b7199e85f165e87602986faa7f6b5beaee6f55db4f1f9edce97", + "files": [ + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan00.bin", + "role": "other", + "sha256": "a1ca0aa5e471b98beddf42738d706871542520398ced6f3ed81008e8c9812d85" + }, + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan01.bin", + "role": "other", + "sha256": "ef4380c88a7e0a2df7506640f6b435b153122e01070d7570870ebd2d3367d4be" + }, + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan02.bin", + "role": "other", + "sha256": "3fda1dfcabd6f77b655435c16a6c7b75d5f2f2b4ef9dccd814fede0f2b69e1f1" + }, + { + "bytes": 9793, + "contentType": "application/gzip", + "path": "streams/arkit_poses.csv.gz", + "role": "stream", + "sha256": "a23bcec6f6829c053e7bc1871999ca7b1a5e88639b5a6cde56afc655d3447388" + }, + { + "bytes": 9443, + "contentType": "application/gzip", + "path": "streams/imu_raw.csv.gz", + "role": "stream", + "sha256": "ae96d9008b71882aeb0dbc1c5463897aa9c316fbda28d5503b4676e0bd85a161" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf01.jpg", + "role": "keyframe", + "sha256": "3ee4012f8d1aad5e8b030eacf846677051e207d891a4587fcf8e57e6bea8eb5c" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf02.jpg", + "role": "keyframe", + "sha256": "1f19a24b5184b45b77ac39e8a73bca0068aeed712f91390b58efd551b9c2448f" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf03.jpg", + "role": "keyframe", + "sha256": "ab61b8867e6e94cfbecddf130d718ce07ea0fa761b2e651b717f6d1e4c8dd801" + } + ], + "format_version": 2, + "generator": "gen_synthetic_packet", + "packet_id": "synthetic-000001", + "packet_sha256": "551d7a302b9351113fbb6840754ef80a05f3c9545baa19cd9cd1e7ae657af184", + "plan_file_sha256": "605d1c8c24c3fd6222d50f266d208011a0f5149c658f5dfab72617ef3d52ba4a", + "plan_sha256": "8c9e543fd3dd3fee1e73edafe2bf07cdb6fe611f0fd46c529ea79636812a71b2", + "seed": 1 + }, + "label": "realapi-restart", + "origin_note": "Derived from published client behavior in HouseScanKit upload and result sources at alpha 263827ef. No private source, schema, spec, log or credential material appears in this package or its receipts.", + "restart": { + "argv": [ + "", + "", + "-k", + "-t", + "", + "" + ], + "configured": true, + "timeout_s": 120.0 + }, + "run_id": "5e804874d9703640", + "runtime": { + "cpus": 8, + "implementation": "CPython", + "machine": "x86_64", + "python": "3.13.14", + "release": "6.1.158+", + "system": "Linux" + }, + "sanitization": "Every value here passed the typed export schema before it was written: published enum words, package constants, digests, bounded numbers, and the plan's own synthetic paths and packet ids. A pattern screen then ran over the written files.", + "schema": "hunter-local-ingest/run-manifest/2", + "settings": { + "events_wait_s": 20, + "max_retries": 2, + "poll_interval_s": 2.0, + "result_budget_s": 1500.0, + "retry_backoff_s": 1.0, + "with_faults": true + } +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/summary.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/summary.json new file mode 100644 index 000000000..00f066b5c --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-restart-20261016T112302Z-5e804874d9703640/summary.json @@ -0,0 +1,44 @@ +{ + "artifacts": { + "checks.jsonl": "b1057d7691adec2d6a6a15b4ee6095b4a46f3f8190f0bf47a6b3a62cf5cda541", + "run-manifest.json": "3237f31254927c6c7c553e81f7672f986433af695693cb0f11fd6343f71f318b" + }, + "blocked": [], + "counts_by_transport": { + "FAKE_HUNTER": { + "PASS": 12 + }, + "GPU_STUB": { + "NOT_RUN": 3 + }, + "REAL_API": { + "FAIL": 1, + "PASS": 13 + } + }, + "failed": [ + "control.restart-recovery" + ], + "finished_utc": "2026-10-16T11:23:06.052Z", + "lead_questions": [ + "Amendment semantics: does the published contract allow amending a registered capture, and with which route and headers?", + "--api-token-env opts into HUNTER_API_TOKEN for scoped API routes; token-protected proxy fault coverage remains BLOCKED.", + "Clock and expiry authority: whose clock governs capture expiry on the local backend?", + "Homeowner text: confirm that receipts may carry outcome kinds and counts but never messages, prompts or reasons." + ], + "mode": { + "backend_verified": false, + "declared_backend": "REAL_API", + "gpu_arms": "NOT_RUN", + "real_mirror_cpu": "NOT_ESTABLISHED" + }, + "not_run": [ + "gpu-stub.objects", + "gpu-stub.vlm", + "gpu-stub.dense" + ], + "run_id": "5e804874d9703640", + "schema": "hunter-local-ingest/summary/2", + "total": 29, + "verdict": "FAIL" +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/checks.jsonl b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/checks.jsonl new file mode 100644 index 000000000..37dea3f38 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/checks.jsonl @@ -0,0 +1,17 @@ +{"expected": "an HTTP 2xx answer with status ok", "id": "lifecycle.health", "observed": {"contract": {"status": "ok"}, "http": {"attempts": 1, "body_bytes": 96, "body_sha256": "78db994d461b", "elapsed_ms": 1, "fields": ["status"], "http_status": 200, "shape": "object"}, "violations": []}, "oracle": "tools/integration-viewer reads GET /v1/healthz; HouseScanKit never calls it", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.368Z"} +{"expected": "2xx, a captureId and a published capture status", "id": "lifecycle.create", "observed": {"contract": {"captureId": "id:7674643ab097", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "ddb17720a8a1", "elapsed_ms": 1, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.create: POST captures with Idempotency-Key=packetId; the answer decodes as CaptureAPI.CreateResponse", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.370Z"} +{"expected": "every requested path answered exactly once, no other path, each committed or given a usable PUT target", "id": "lifecycle.register", "observed": {"batches": [{"contract": {"files": [{"path": "synthetic/scan00.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan01.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan02.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/arkit_poses.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "streams/imu_raw.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf01.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf02.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf03.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 2, "signs_auth_header": false, "unexpected_keys": {"count": 3, "digest": "unexpected-keys:6672d6d94bc6"}, "url_policy": "ok", "url_present": true}}]}, "http": {"attempts": 1, "body_bytes": 4530, "body_sha256": "f9ff6a270d01", "elapsed_ms": 4, "fields": ["files"], "http_status": 200, "shape": "object"}, "violations": []}], "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.register: the answer decodes as RegisterResponse and is applied by path; a target needs method PUT and a URL that passes uploadURLProblem", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.376Z"} +{"expected": "2xx for every file that got a target", "id": "lifecycle.upload", "observed": {"committed_at_register": [], "uploads": [{"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 2, "fields": [], "http_status": 200, "path": "synthetic/scan00.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan01.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan02.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/arkit_poses.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "streams/imu_raw.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf01.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf02.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "keyframes/kf03.jpg", "shape": "empty"}]}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.put + ScopedCaptureHTTP.upload: exactly the signed headers, never Authorization", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.389Z"} +{"expected": "committed equals the uploaded set; notFound and mismatch empty; every declared path committed by register or commit", "id": "lifecycle.commit", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan00.bin", "synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 229, "body_sha256": "2cf7cd1cfbf0", "elapsed_ms": 3, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "committed_at_register": [], "committed_total": 8, "declared": 8, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.commit: only a commit acknowledges a file; CommitResponse carries committed, notFound and mismatch", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.392Z"} +{"expected": "2xx, a runId, a published status, no missing file", "id": "lifecycle.finalize", "observed": {"contract": {"etaS": 180, "missing": [], "runId": "id:b49f85286147", "status": "processing"}, "http": {"attempts": 1, "body_bytes": 78, "body_sha256": "989464942ede", "elapsed_ms": 2, "fields": ["etaS", "missing", "runId", "status"], "http_status": 202, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.finalize: X-Packet-Sha256 and Idempotency-Key=packetId; the answer decodes as FinalizeResponse", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.395Z"} +{"expected": "a terminal status within the budget, every answer contract-shaped", "id": "lifecycle.events", "observed": {"answers": 2, "finalize_retries": 0, "last": {"contract": {"events": [{"data": {"code": "unrecognized:ce62fc583826", "next": "unrecognized:30a0924a3360", "unexpected_keys": {"count": 2, "digest": "unexpected-keys:29bd6ce81d82"}}, "seq": 3, "type": "failed"}], "next": 3, "status": "failed"}, "http": {"attempts": 1, "body_bytes": 204, "body_sha256": "0ba22c28a32e", "elapsed_ms": 20, "fields": ["events", "next", "status"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.pollEvents: EventsResponse until CaptureAPI.terminalStatuses; next never moves back; a verdict names this run; retry_finalize re-sends the packet", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.419Z"} +{"expected": "a decodable result for this run whose status matches the terminal event status", "id": "lifecycle.result", "observed": {"contract": {"criteria": null, "has_preview_url": false, "memberActions": 0, "outcome": null, "runId": "id:b49f85286147", "status": "failed", "unexpected_keys": {"count": 5, "digest": "unexpected-keys:ba9ed0e1e840"}, "viewsNeeded": 0}, "http": {"attempts": 1, "body_bytes": 223, "body_sha256": "8e5a12584004", "elapsed_ms": 1, "fields": ["criteria", "memberActions", "outcome", "previewUrl", "reviewUrl", "runId", "status", "viewsNeeded"], "http_status": 200, "shape": "object"}, "not_ready_reads": 0, "run_matches": true, "status_matches": true, "terminal_status": "failed", "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.fetchResult: the whole body decodes as CaptureResult.Response, its runId is the finalized run, and a null outcome is final only under statusesWithoutOutcome", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.420Z"} +{"expected": "both creates 2xx with the same captureId", "id": "control.idempotent-create", "observed": {"first": {"contract": {"captureId": "id:7e1d95dd41cf", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "6cb43439b63b", "elapsed_ms": 0, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "same_capture": true, "second": {"contract": {"captureId": "id:7e1d95dd41cf", "maxBatch": 50, "status": "uploading", "unexpected_keys": {"count": 1, "digest": "unexpected-keys:fa9988c1b06b"}, "upload_unexpected_keys": {"count": 1, "digest": "unexpected-keys:ddda965602b3"}}, "http": {"attempts": 1, "body_bytes": 277, "body_sha256": "6cb43439b63b", "elapsed_ms": 0, "fields": ["captureId", "finalizeBy", "status", "upload"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.start: create is bound to Idempotency-Key=packetId, so a repeated create with the same bytes names the same capture", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.423Z"} +{"expected": "intact files committed; the flipped file in mismatch or notFound, or its PUT refused, and never committed", "id": "control.corrupt-upload", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": ["synthetic/scan00.bin"]}, "http": {"attempts": 1, "body_bytes": 228, "body_sha256": "f66d409bbb61", "elapsed_ms": 1, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "intact_committed": true, "intact_reported_negative": false, "tampered": "synthetic/scan00.bin", "tampered_committed": false, "tampered_put_status": 400, "tampered_reported": true, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CommitResponse separates committed from mismatch/notFound; one file's bytes are flipped after its digest was registered", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.438Z"} +{"expected": "intact files committed; the truncated file in mismatch or notFound, or its PUT refused, and never committed", "id": "control.truncated-upload", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": ["synthetic/scan00.bin"]}, "http": {"attempts": 1, "body_bytes": 228, "body_sha256": "f66d409bbb61", "elapsed_ms": 1, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "intact_committed": true, "intact_reported_negative": false, "tampered": "synthetic/scan00.bin", "tampered_committed": false, "tampered_put_status": 400, "tampered_reported": true, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CommitResponse separates committed from mismatch/notFound; one file loses its last byte after its digest was registered", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.452Z"} +{"expected": "404 with error code capture_not_found for an id the harness invented", "id": "control.wrong-capture", "observed": {"capture": "id:1976512104be", "errors": {"codes": ["capture_not_found"]}, "http": {"attempts": 1, "body_bytes": 85, "body_sha256": "1abfeda9732f", "elapsed_ms": 0, "fields": ["errors"], "http_status": 404, "shape": "object"}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.captureGone: an unknown capture answers 404 capture_not_found", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.454Z"} +{"expected": "every traced check present and PASS with the traced status class and fields, or upload and commit skipped because register reported every declared file committed", "id": "trace.expected-lifecycle-v3", "observed": {"compared": 12, "disagreements": [], "not_comparable": []}, "oracle": "frozen expected trace traces/expected-lifecycle-v3.jsonl, written from the published contract, with a no-request branch for files committed at register", "status": "PASS", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.456Z"} +{"expected": "after a successful restart the capture still reports its terminal status and run", "id": "control.restart-recovery", "observed": {"note": "restart-not-configured"}, "oracle": "operator restart command, then the baseline capture is read again over the published events and result routes", "status": "NOT_RUN", "transport": "REAL_API", "ts": "2026-10-16T11:23:16.456Z"} +{"expected": "not run", "id": "gpu-stub.objects", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:23:16.456Z"} +{"expected": "not run", "id": "gpu-stub.vlm", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:23:16.456Z"} +{"expected": "not run", "id": "gpu-stub.dense", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:23:16.456Z"} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/privacy-chain.jsonl b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/privacy-chain.jsonl new file mode 100644 index 000000000..a57c27803 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/privacy-chain.jsonl @@ -0,0 +1,4 @@ +{"artifact": "run-manifest.json", "at": "2026-10-16T11:23:16.366Z", "bytes": 4263, "chain_sha256": "280444c1443a2fdb5a62a63dca24a6e232d8868fdb2b2fc1db966888454ba128", "sha256": "3118ff3791f26839234b6c4f9f083fd29f8909a0206db47e74e41aa986e74a44"} +{"artifact": "checks.jsonl", "at": "2026-10-16T11:23:16.456Z", "bytes": 14935, "chain_sha256": "51700f48695d5a310e7da5c2362ac56b0f99417fa4fa0cc5843e6ce928721191", "sha256": "18021d752597e6009c41afda5df8030de9d810a509a5da7a64c29b224ce4b4ed"} +{"artifact": "summary.json", "at": "2026-10-16T11:23:16.457Z", "bytes": 1295, "chain_sha256": "32f9c4e019302d4687dbec273450a6e1d775c8504dc1051b8b7672692a111abc", "sha256": "dbf8140be81b5c7ba29aa7d3261d8916eb8fc952fc414f30bfa45c43cc887bab"} +{"artifact": "privacy-screen.json", "at": "2026-10-16T11:23:16.469Z", "bytes": 238, "chain_sha256": "ce6cfb899fcffcacb32b5978bfa602348acb3b537a5d5c21e3d4a09e4ee972f6", "sha256": "ea5a27e15735897084c96f9beeba7e954a99b5c7d4d9b7e2b2501c9d121d2644"} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/privacy-screen.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/privacy-screen.json new file mode 100644 index 000000000..7d76228c2 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/privacy-screen.json @@ -0,0 +1,12 @@ +{ + "clean": true, + "findings": [], + "finished_utc": "2026-10-16T11:23:16.469Z", + "missing": [], + "schema": "hunter-local-ingest/privacy-screen/2", + "screened": [ + "run-manifest.json", + "checks.jsonl", + "summary.json" + ] +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/run-manifest.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/run-manifest.json new file mode 100644 index 000000000..ef802bcaa --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/run-manifest.json @@ -0,0 +1,130 @@ +{ + "backend": { + "declared_mode": "REAL_API", + "declared_ref": "46bed47e", + "verified": false + }, + "client": { + "declared_ref": null, + "git": { + "diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "dirty": false, + "head": "46bed47e3438b11439b7a2e004d10ae35a561647", + "untracked": 0 + }, + "interface": "2.0.0", + "package_version": "0.2.0", + "source_sha256": "1187b70d311a949318aa37d1935204dd4297f327ddd98e4debc88abc90ddbfe7" + }, + "command": [ + "--endpoint", + "127.0.0.1:8000", + "--plan-file", + "", + "--backend-mode", + "REAL_API", + "--backend-ref", + "46bed47e", + "--out", + "", + "--label", + "realapi-static", + "--api-token-env" + ], + "created_utc": "2026-10-16T11:23:16.352Z", + "endpoint": "127.0.0.1:8000", + "fixture": { + "create_sha256": "9c2dd5f33bb70b7199e85f165e87602986faa7f6b5beaee6f55db4f1f9edce97", + "files": [ + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan00.bin", + "role": "other", + "sha256": "a1ca0aa5e471b98beddf42738d706871542520398ced6f3ed81008e8c9812d85" + }, + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan01.bin", + "role": "other", + "sha256": "ef4380c88a7e0a2df7506640f6b435b153122e01070d7570870ebd2d3367d4be" + }, + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan02.bin", + "role": "other", + "sha256": "3fda1dfcabd6f77b655435c16a6c7b75d5f2f2b4ef9dccd814fede0f2b69e1f1" + }, + { + "bytes": 9793, + "contentType": "application/gzip", + "path": "streams/arkit_poses.csv.gz", + "role": "stream", + "sha256": "a23bcec6f6829c053e7bc1871999ca7b1a5e88639b5a6cde56afc655d3447388" + }, + { + "bytes": 9443, + "contentType": "application/gzip", + "path": "streams/imu_raw.csv.gz", + "role": "stream", + "sha256": "ae96d9008b71882aeb0dbc1c5463897aa9c316fbda28d5503b4676e0bd85a161" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf01.jpg", + "role": "keyframe", + "sha256": "3ee4012f8d1aad5e8b030eacf846677051e207d891a4587fcf8e57e6bea8eb5c" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf02.jpg", + "role": "keyframe", + "sha256": "1f19a24b5184b45b77ac39e8a73bca0068aeed712f91390b58efd551b9c2448f" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf03.jpg", + "role": "keyframe", + "sha256": "ab61b8867e6e94cfbecddf130d718ce07ea0fa761b2e651b717f6d1e4c8dd801" + } + ], + "format_version": 2, + "generator": "gen_synthetic_packet", + "packet_id": "synthetic-000001", + "packet_sha256": "551d7a302b9351113fbb6840754ef80a05f3c9545baa19cd9cd1e7ae657af184", + "plan_file_sha256": "605d1c8c24c3fd6222d50f266d208011a0f5149c658f5dfab72617ef3d52ba4a", + "plan_sha256": "8c9e543fd3dd3fee1e73edafe2bf07cdb6fe611f0fd46c529ea79636812a71b2", + "seed": 1 + }, + "label": "realapi-static", + "origin_note": "Derived from published client behavior in HouseScanKit upload and result sources at alpha 263827ef. No private source, schema, spec, log or credential material appears in this package or its receipts.", + "restart": { + "argv": [], + "configured": false, + "timeout_s": 120.0 + }, + "run_id": "8ca841e02f7fb6f7", + "runtime": { + "cpus": 8, + "implementation": "CPython", + "machine": "x86_64", + "python": "3.13.14", + "release": "6.1.158+", + "system": "Linux" + }, + "sanitization": "Every value here passed the typed export schema before it was written: published enum words, package constants, digests, bounded numbers, and the plan's own synthetic paths and packet ids. A pattern screen then ran over the written files.", + "schema": "hunter-local-ingest/run-manifest/2", + "settings": { + "events_wait_s": 20, + "max_retries": 2, + "poll_interval_s": 2.0, + "result_budget_s": 1500.0, + "retry_backoff_s": 1.0, + "with_faults": false + } +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/summary.json b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/summary.json new file mode 100644 index 000000000..60a03f8b0 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/realapi-static-20261016T112316Z-8ca841e02f7fb6f7/summary.json @@ -0,0 +1,40 @@ +{ + "artifacts": { + "checks.jsonl": "18021d752597e6009c41afda5df8030de9d810a509a5da7a64c29b224ce4b4ed", + "run-manifest.json": "3118ff3791f26839234b6c4f9f083fd29f8909a0206db47e74e41aa986e74a44" + }, + "blocked": [], + "counts_by_transport": { + "GPU_STUB": { + "NOT_RUN": 3 + }, + "REAL_API": { + "NOT_RUN": 1, + "PASS": 13 + } + }, + "failed": [], + "finished_utc": "2026-10-16T11:23:16.456Z", + "lead_questions": [ + "Amendment semantics: does the published contract allow amending a registered capture, and with which route and headers?", + "--api-token-env opts into HUNTER_API_TOKEN for scoped API routes; token-protected proxy fault coverage remains BLOCKED.", + "Clock and expiry authority: whose clock governs capture expiry on the local backend?", + "Homeowner text: confirm that receipts may carry outcome kinds and counts but never messages, prompts or reasons." + ], + "mode": { + "backend_verified": false, + "declared_backend": "REAL_API", + "gpu_arms": "NOT_RUN", + "real_mirror_cpu": "NOT_ESTABLISHED" + }, + "not_run": [ + "control.restart-recovery", + "gpu-stub.objects", + "gpu-stub.vlm", + "gpu-stub.dense" + ], + "run_id": "8ca841e02f7fb6f7", + "schema": "hunter-local-ingest/summary/2", + "total": 17, + "verdict": "PASS" +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/checks.jsonl b/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/checks.jsonl new file mode 100644 index 000000000..d8d12e66b --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/checks.jsonl @@ -0,0 +1,29 @@ +{"expected": "an HTTP 2xx answer with status ok", "id": "lifecycle.health", "observed": {"contract": {"status": "ok"}, "http": {"attempts": 1, "body_bytes": 16, "body_sha256": "08e2c358ce13", "elapsed_ms": 1, "fields": ["status"], "http_status": 200, "shape": "object"}, "violations": []}, "oracle": "tools/integration-viewer reads GET /v1/healthz; HouseScanKit never calls it", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.509Z"} +{"expected": "2xx, a captureId and a published capture status", "id": "lifecycle.create", "observed": {"contract": {"captureId": "id:fd102437f369", "maxBatch": 50, "status": "uploading"}, "http": {"attempts": 1, "body_bytes": 78, "body_sha256": "8edf48cf4ce9", "elapsed_ms": 1, "fields": ["captureId", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.create: POST captures with Idempotency-Key=packetId; the answer decodes as CaptureAPI.CreateResponse", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.511Z"} +{"expected": "every requested path answered exactly once, no other path, each committed or given a usable PUT target", "id": "lifecycle.register", "observed": {"batches": [{"contract": {"files": [{"path": "synthetic/scan00.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan01.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan02.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "streams/arkit_poses.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "streams/imu_raw.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf01.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf02.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf03.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}]}, "http": {"attempts": 1, "body_bytes": 1955, "body_sha256": "fd17aa03d0bb", "elapsed_ms": 0, "fields": ["files"], "http_status": 200, "shape": "object"}, "violations": []}], "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.register: the answer decodes as RegisterResponse and is applied by path; a target needs method PUT and a URL that passes uploadURLProblem", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.512Z"} +{"expected": "2xx for every file that got a target", "id": "lifecycle.upload", "observed": {"committed_at_register": [], "uploads": [{"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "synthetic/scan00.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "synthetic/scan01.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "synthetic/scan02.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "streams/arkit_poses.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "streams/imu_raw.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "keyframes/kf01.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "keyframes/kf02.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "keyframes/kf03.jpg", "shape": "empty"}]}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.put + ScopedCaptureHTTP.upload: exactly the signed headers, never Authorization", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.519Z"} +{"expected": "committed equals the uploaded set; notFound and mismatch empty; every declared path committed by register or commit", "id": "lifecycle.commit", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan00.bin", "synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 241, "body_sha256": "0012e9db83ef", "elapsed_ms": 0, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "committed_at_register": [], "committed_total": 8, "declared": 8, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.commit: only a commit acknowledges a file; CommitResponse carries committed, notFound and mismatch", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.520Z"} +{"expected": "2xx, a runId, a published status, no missing file", "id": "lifecycle.finalize", "observed": {"contract": {"missing": [], "runId": "id:492e113d2d27", "status": "processing"}, "http": {"attempts": 1, "body_bytes": 62, "body_sha256": "425e9d06a56d", "elapsed_ms": 1, "fields": ["missing", "runId", "status"], "http_status": 202, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.finalize: X-Packet-Sha256 and Idempotency-Key=packetId; the answer decodes as FinalizeResponse", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.522Z"} +{"expected": "a terminal status within the budget, every answer contract-shaped", "id": "lifecycle.events", "observed": {"answers": 1, "finalize_retries": 0, "last": {"contract": {"events": [{"data": {"runId": "id:492e113d2d27", "runId_matches": true}, "seq": 1, "type": "verdict_ready"}], "next": 1, "status": "complete"}, "http": {"attempts": 1, "body_bytes": 145, "body_sha256": "f7919284ecb6", "elapsed_ms": 0, "fields": ["events", "next", "status"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.pollEvents: EventsResponse until CaptureAPI.terminalStatuses; next never moves back; a verdict names this run; retry_finalize re-sends the packet", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.523Z"} +{"expected": "a decodable result for this run whose status matches the terminal event status", "id": "lifecycle.result", "observed": {"contract": {"criteria": null, "has_preview_url": false, "memberActions": 0, "outcome": {"kind": "eligible", "reasons": 0}, "runId": "id:492e113d2d27", "status": "complete", "viewsNeeded": 0}, "http": {"attempts": 1, "body_bytes": 227, "body_sha256": "1dc1b0ebf7a6", "elapsed_ms": 0, "fields": ["memberActions", "outcome", "runId", "status", "viewsNeeded"], "http_status": 200, "shape": "object"}, "not_ready_reads": 0, "run_matches": true, "status_matches": true, "terminal_status": "complete", "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.fetchResult: the whole body decodes as CaptureResult.Response, its runId is the finalized run, and a null outcome is final only under statusesWithoutOutcome", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.524Z"} +{"expected": "both creates 2xx with the same captureId", "id": "control.idempotent-create", "observed": {"first": {"contract": {"captureId": "id:b9d50067aadb", "maxBatch": 50, "status": "uploading"}, "http": {"attempts": 1, "body_bytes": 78, "body_sha256": "ec8a1ff9228b", "elapsed_ms": 0, "fields": ["captureId", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "same_capture": true, "second": {"contract": {"captureId": "id:b9d50067aadb", "maxBatch": 50, "status": "uploading"}, "http": {"attempts": 1, "body_bytes": 78, "body_sha256": "ec8a1ff9228b", "elapsed_ms": 0, "fields": ["captureId", "status", "upload"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.start: create is bound to Idempotency-Key=packetId, so a repeated create with the same bytes names the same capture", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.526Z"} +{"expected": "intact files committed; the flipped file in mismatch or notFound, or its PUT refused, and never committed", "id": "control.corrupt-upload", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": ["synthetic/scan00.bin"], "notFound": []}, "http": {"attempts": 1, "body_bytes": 239, "body_sha256": "87b1a5c1ed3d", "elapsed_ms": 0, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "intact_committed": true, "intact_reported_negative": false, "tampered": "synthetic/scan00.bin", "tampered_committed": false, "tampered_put_status": 200, "tampered_reported": true, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CommitResponse separates committed from mismatch/notFound; one file's bytes are flipped after its digest was registered", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.537Z"} +{"expected": "intact files committed; the truncated file in mismatch or notFound, or its PUT refused, and never committed", "id": "control.truncated-upload", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": ["synthetic/scan00.bin"], "notFound": []}, "http": {"attempts": 1, "body_bytes": 239, "body_sha256": "87b1a5c1ed3d", "elapsed_ms": 1, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "intact_committed": true, "intact_reported_negative": false, "tampered": "synthetic/scan00.bin", "tampered_committed": false, "tampered_put_status": 200, "tampered_reported": true, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CommitResponse separates committed from mismatch/notFound; one file loses its last byte after its digest was registered", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.549Z"} +{"expected": "404 with error code capture_not_found for an id the harness invented", "id": "control.wrong-capture", "observed": {"capture": "id:1976512104be", "errors": {"codes": ["capture_not_found"]}, "http": {"attempts": 1, "body_bytes": 43, "body_sha256": "23553eb17fe9", "elapsed_ms": 1, "fields": ["errors"], "http_status": 404, "shape": "object"}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.captureGone: an unknown capture answers 404 capture_not_found", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.550Z"} +{"expected": "an HTTP 2xx answer with status ok", "id": "fault.lifecycle.health", "observed": {"contract": {"status": "ok"}, "http": {"attempts": 1, "body_bytes": 16, "body_sha256": "08e2c358ce13", "elapsed_ms": 1, "fields": ["status"], "http_status": 200, "shape": "object"}, "violations": []}, "oracle": "tools/integration-viewer reads GET /v1/healthz; HouseScanKit never calls it", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.553Z"} +{"expected": "2xx, a captureId and a published capture status", "id": "fault.lifecycle.create", "observed": {"contract": {"captureId": "id:d6611115894b", "maxBatch": 50, "status": "uploading"}, "http": {"attempts": 1, "body_bytes": 78, "body_sha256": "1ff5bb037620", "elapsed_ms": 102, "fields": ["captureId", "status", "upload"], "http_status": 201, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.create: POST captures with Idempotency-Key=packetId; the answer decodes as CaptureAPI.CreateResponse", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.656Z"} +{"expected": "every requested path answered exactly once, no other path, each committed or given a usable PUT target", "id": "fault.lifecycle.register", "observed": {"batches": [{"contract": {"files": [{"path": "synthetic/scan00.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan01.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "synthetic/scan02.bin", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "streams/arkit_poses.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "streams/imu_raw.csv.gz", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf01.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf02.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}, {"path": "keyframes/kf03.jpg", "state": "pending", "upload": {"method": "PUT", "signed_content_type": true, "signed_header_count": 1, "signs_auth_header": false, "url_policy": "ok", "url_present": true}}]}, "http": {"attempts": 1, "body_bytes": 1955, "body_sha256": "f1bf8e86456b", "elapsed_ms": 2, "fields": ["files"], "http_status": 200, "shape": "object"}, "violations": []}], "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.register: the answer decodes as RegisterResponse and is applied by path; a target needs method PUT and a URL that passes uploadURLProblem", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.659Z"} +{"expected": "2xx for every file that got a target", "id": "fault.lifecycle.upload", "observed": {"committed_at_register": [], "uploads": [{"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 1, "fields": [], "http_status": 200, "path": "synthetic/scan00.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "synthetic/scan01.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "synthetic/scan02.bin", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "streams/arkit_poses.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "streams/imu_raw.csv.gz", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "keyframes/kf01.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "keyframes/kf02.jpg", "shape": "empty"}, {"attempts": 1, "body_bytes": 0, "body_sha256": null, "elapsed_ms": 0, "fields": [], "http_status": 200, "path": "keyframes/kf03.jpg", "shape": "empty"}]}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.put + ScopedCaptureHTTP.upload: exactly the signed headers, never Authorization", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.666Z"} +{"expected": "committed equals the uploaded set; notFound and mismatch empty; every declared path committed by register or commit", "id": "fault.lifecycle.commit", "observed": {"batches": [{"contract": {"committed": ["synthetic/scan00.bin", "synthetic/scan01.bin", "synthetic/scan02.bin", "streams/arkit_poses.csv.gz", "streams/imu_raw.csv.gz", "keyframes/kf01.jpg", "keyframes/kf02.jpg", "keyframes/kf03.jpg"], "mismatch": [], "notFound": []}, "http": {"attempts": 1, "body_bytes": 241, "body_sha256": "0012e9db83ef", "elapsed_ms": 1, "fields": ["committed", "mismatch", "notFound"], "http_status": 200, "shape": "object"}, "violations": []}], "committed_at_register": [], "committed_total": 8, "declared": 8, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.commit: only a commit acknowledges a file; CommitResponse carries committed, notFound and mismatch", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.669Z"} +{"expected": "2xx, a runId, a published status, no missing file", "id": "fault.lifecycle.finalize", "observed": {"contract": {"missing": [], "runId": "id:636f557a124e", "status": "processing"}, "http": {"attempts": 1, "body_bytes": 62, "body_sha256": "cc5e4603e9bd", "elapsed_ms": 1, "fields": ["missing", "runId", "status"], "http_status": 202, "shape": "object"}, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.finalize: X-Packet-Sha256 and Idempotency-Key=packetId; the answer decodes as FinalizeResponse", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.671Z"} +{"expected": "a terminal status within the budget, every answer contract-shaped", "id": "fault.lifecycle.events", "observed": {"answers": 1, "finalize_retries": 0, "last": {"contract": {"events": [{"data": {"runId": "id:636f557a124e", "runId_matches": true}, "seq": 1, "type": "verdict_ready"}], "next": 1, "status": "complete"}, "http": {"attempts": 1, "body_bytes": 145, "body_sha256": "6519430bc83d", "elapsed_ms": 1, "fields": ["events", "next", "status"], "http_status": 200, "shape": "object"}, "violations": []}}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.pollEvents: EventsResponse until CaptureAPI.terminalStatuses; next never moves back; a verdict names this run; retry_finalize re-sends the packet", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.673Z"} +{"expected": "a decodable result for this run whose status matches the terminal event status", "id": "fault.lifecycle.result", "observed": {"contract": {"criteria": null, "has_preview_url": false, "memberActions": 0, "outcome": {"kind": "eligible", "reasons": 0}, "runId": "id:636f557a124e", "status": "complete", "viewsNeeded": 0}, "http": {"attempts": 1, "body_bytes": 227, "body_sha256": "f0543371247b", "elapsed_ms": 1, "fields": ["memberActions", "outcome", "runId", "status", "viewsNeeded"], "http_status": 200, "shape": "object"}, "not_ready_reads": 0, "run_matches": true, "status_matches": true, "terminal_status": "complete", "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.fetchResult: the whole body decodes as CaptureResult.Response, its runId is the finalized run, and a null outcome is final only under statusesWithoutOutcome", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:23.675Z"} +{"expected": "the proxy's single 503 is followed by a second attempt that creates the capture", "id": "fault.retry-transient", "observed": {"contract": {"captureId": "id:40a0732506ed", "maxBatch": 50, "status": "uploading"}, "http": {"attempts": 2, "body_bytes": 78, "body_sha256": "2350cd7a9fb2", "elapsed_ms": 1, "fields": ["captureId", "status", "upload"], "http_status": 201, "shape": "object"}, "proxy_hits": 2, "violations": []}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.isTransient: a 503 is retried with the same body", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:24.678Z"} +{"expected": "exactly one attempt and a reported non-2xx answer", "id": "fault.no-retry-501", "observed": {"errors": {"codes": ["harness_fault"]}, "http": {"attempts": 1, "body_bytes": 39, "body_sha256": "be37db4e697d", "elapsed_ms": 1, "fields": ["errors"], "http_status": 501, "shape": "object"}, "proxy_hits": 1}, "oracle": "HouseScanKit @ alpha 263827ef CaptureUploader.isTransient excludes 501", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:25.181Z"} +{"expected": "a transport error category after 1 + max_retries attempts, no capture id taken", "id": "fault.abort", "observed": {"http": {"attempts": 2, "error": "transport:remote-disconnected"}, "proxy_hits": 2}, "oracle": "an answer-less connection is a transport failure, retried a bounded number of times", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:25.685Z"} +{"expected": "a transport error category, no capture id taken", "id": "fault.truncated-response", "observed": {"http": {"attempts": 1, "error": "transport:incomplete-read"}, "proxy_hits": 1}, "oracle": "a body shorter than its Content-Length is a transport failure, never a parsed answer", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:26.187Z"} +{"expected": "every traced check present and PASS with the traced status class and fields, or upload and commit skipped because register reported every declared file committed", "id": "trace.expected-lifecycle-v3", "observed": {"compared": 12, "disagreements": [], "not_comparable": []}, "oracle": "frozen expected trace traces/expected-lifecycle-v3.jsonl, written from the published contract, with a no-request branch for files committed at register", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:26.190Z"} +{"expected": "after a successful restart the capture still reports its terminal status and run", "id": "control.restart-recovery", "observed": {"after_restart": [{"contract": {"events": [{"data": {"runId": "id:492e113d2d27", "runId_matches": true}, "seq": 1, "type": "verdict_ready"}], "next": 1, "status": "complete"}, "http": {"attempts": 1, "body_bytes": 145, "body_sha256": "f7919284ecb6", "elapsed_ms": 1, "fields": ["events", "next", "status"], "http_status": 200, "shape": "object"}, "violations": []}, {"contract": {"criteria": null, "has_preview_url": false, "memberActions": 0, "outcome": {"kind": "eligible", "reasons": 0}, "runId": "id:492e113d2d27", "status": "complete", "viewsNeeded": 0}, "http": {"attempts": 1, "body_bytes": 227, "body_sha256": "1dc1b0ebf7a6", "elapsed_ms": 0, "fields": ["memberActions", "outcome", "runId", "status", "viewsNeeded"], "http_status": 200, "shape": "object"}, "violations": []}], "exit_code": 0, "run_matches": true, "status_matches": true}, "oracle": "operator restart command, then the baseline capture is read again over the published events and result routes", "status": "PASS", "transport": "FAKE_HUNTER", "ts": "2026-10-16T11:19:26.207Z"} +{"expected": "not run", "id": "gpu-stub.objects", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:19:26.208Z"} +{"expected": "not run", "id": "gpu-stub.vlm", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:19:26.208Z"} +{"expected": "not run", "id": "gpu-stub.dense", "observed": {"note": "gpu-not-authorized"}, "oracle": "GPU-dependent arms are named and never executed by this harness", "status": "NOT_RUN", "transport": "GPU_STUB", "ts": "2026-10-16T11:19:26.208Z"} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/privacy-chain.jsonl b/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/privacy-chain.jsonl new file mode 100644 index 000000000..bf752adc7 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/privacy-chain.jsonl @@ -0,0 +1,4 @@ +{"artifact": "run-manifest.json", "at": "2026-10-16T11:19:23.507Z", "bytes": 4410, "chain_sha256": "364b43b94e2d169871309dcf425415896dfa04a3f412659b7c1c89b180fb635e", "sha256": "539ea16af34af0ba3ba077c1241e7b349cc18349cee730d4800ebb87b8582b23"} +{"artifact": "checks.jsonl", "at": "2026-10-16T11:19:26.208Z", "bytes": 24725, "chain_sha256": "28ff1ed2338c2f52457bcb2c62fc7d5603ee3236fab5d3597ebcb6d038502629", "sha256": "bbfcfc2a4b17beca611b6e488bb0d2381ba71f5f3864b3ac345e73404748d56c"} +{"artifact": "summary.json", "at": "2026-10-16T11:19:26.208Z", "bytes": 1249, "chain_sha256": "be05c362c429af55aefd712a282d71b88c510b19de29541ca852ff004d6f30b3", "sha256": "de63286154f6a429cc60f26f9797e0757c42f7a6a7cb529addcf4ccb797c0cc8"} +{"artifact": "privacy-screen.json", "at": "2026-10-16T11:19:26.225Z", "bytes": 238, "chain_sha256": "ff755e942201fdc5ac7a1df1ed7ffb3f6c68c1511f55ea3f4cdab2e0cd0cba63", "sha256": "453a2788d7b788d46698c9df1f9bf33e920b606733ddc62dbfb5bc5a6b374f9d"} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/privacy-screen.json b/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/privacy-screen.json new file mode 100644 index 000000000..a0569c0ff --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/privacy-screen.json @@ -0,0 +1,12 @@ +{ + "clean": true, + "findings": [], + "finished_utc": "2026-10-16T11:19:26.225Z", + "missing": [], + "schema": "hunter-local-ingest/privacy-screen/2", + "screened": [ + "run-manifest.json", + "checks.jsonl", + "summary.json" + ] +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/run-manifest.json b/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/run-manifest.json new file mode 100644 index 000000000..1022ef477 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/run-manifest.json @@ -0,0 +1,140 @@ +{ + "backend": { + "declared_mode": "FAKE_HUNTER", + "declared_ref": null, + "verified": false + }, + "client": { + "declared_ref": null, + "git": { + "diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "dirty": false, + "head": "46bed47e3438b11439b7a2e004d10ae35a561647", + "untracked": 0 + }, + "interface": "2.0.0", + "package_version": "0.2.0", + "source_sha256": "1187b70d311a949318aa37d1935204dd4297f327ddd98e4debc88abc90ddbfe7" + }, + "command": [ + "--endpoint", + "127.0.0.1:43913", + "--plan-file", + "", + "--out", + "", + "--label", + "selfcheck", + "--backend-mode", + "FAKE_HUNTER", + "--poll-interval-s", + "0.05", + "--events-wait-s", + "0", + "--retry-backoff-s", + "0.0", + "--with-faults", + "--restart-argv-json", + "" + ], + "created_utc": "2026-10-16T11:19:23.490Z", + "endpoint": "127.0.0.1:43913", + "fixture": { + "create_sha256": "9c2dd5f33bb70b7199e85f165e87602986faa7f6b5beaee6f55db4f1f9edce97", + "files": [ + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan00.bin", + "role": "other", + "sha256": "a1ca0aa5e471b98beddf42738d706871542520398ced6f3ed81008e8c9812d85" + }, + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan01.bin", + "role": "other", + "sha256": "ef4380c88a7e0a2df7506640f6b435b153122e01070d7570870ebd2d3367d4be" + }, + { + "bytes": 65536, + "contentType": "application/octet-stream", + "path": "synthetic/scan02.bin", + "role": "other", + "sha256": "3fda1dfcabd6f77b655435c16a6c7b75d5f2f2b4ef9dccd814fede0f2b69e1f1" + }, + { + "bytes": 9793, + "contentType": "application/gzip", + "path": "streams/arkit_poses.csv.gz", + "role": "stream", + "sha256": "a23bcec6f6829c053e7bc1871999ca7b1a5e88639b5a6cde56afc655d3447388" + }, + { + "bytes": 9443, + "contentType": "application/gzip", + "path": "streams/imu_raw.csv.gz", + "role": "stream", + "sha256": "ae96d9008b71882aeb0dbc1c5463897aa9c316fbda28d5503b4676e0bd85a161" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf01.jpg", + "role": "keyframe", + "sha256": "3ee4012f8d1aad5e8b030eacf846677051e207d891a4587fcf8e57e6bea8eb5c" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf02.jpg", + "role": "keyframe", + "sha256": "1f19a24b5184b45b77ac39e8a73bca0068aeed712f91390b58efd551b9c2448f" + }, + { + "bytes": 768, + "contentType": "image/jpeg", + "path": "keyframes/kf03.jpg", + "role": "keyframe", + "sha256": "ab61b8867e6e94cfbecddf130d718ce07ea0fa761b2e651b717f6d1e4c8dd801" + } + ], + "format_version": 2, + "generator": "gen_synthetic_packet", + "packet_id": "synthetic-000001", + "packet_sha256": "551d7a302b9351113fbb6840754ef80a05f3c9545baa19cd9cd1e7ae657af184", + "plan_file_sha256": "605d1c8c24c3fd6222d50f266d208011a0f5149c658f5dfab72617ef3d52ba4a", + "plan_sha256": "8c9e543fd3dd3fee1e73edafe2bf07cdb6fe611f0fd46c529ea79636812a71b2", + "seed": 1 + }, + "label": "selfcheck", + "origin_note": "Derived from published client behavior in HouseScanKit upload and result sources at alpha 263827ef. No private source, schema, spec, log or credential material appears in this package or its receipts.", + "restart": { + "argv": [ + "", + "-c", + "" + ], + "configured": true, + "timeout_s": 120.0 + }, + "run_id": "eebbb6f25a6cea14", + "runtime": { + "cpus": 8, + "implementation": "CPython", + "machine": "x86_64", + "python": "3.13.14", + "release": "6.1.158+", + "system": "Linux" + }, + "sanitization": "Every value here passed the typed export schema before it was written: published enum words, package constants, digests, bounded numbers, and the plan's own synthetic paths and packet ids. A pattern screen then ran over the written files.", + "schema": "hunter-local-ingest/run-manifest/2", + "settings": { + "events_wait_s": 0, + "max_retries": 2, + "poll_interval_s": 0.05, + "result_budget_s": 1500.0, + "retry_backoff_s": 0.0, + "with_faults": true + } +} diff --git a/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/summary.json b/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/summary.json new file mode 100644 index 000000000..ac9c86ab2 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/receipts/selfcheck-20261016T111923Z-eebbb6f25a6cea14/summary.json @@ -0,0 +1,38 @@ +{ + "artifacts": { + "checks.jsonl": "bbfcfc2a4b17beca611b6e488bb0d2381ba71f5f3864b3ac345e73404748d56c", + "run-manifest.json": "539ea16af34af0ba3ba077c1241e7b349cc18349cee730d4800ebb87b8582b23" + }, + "blocked": [], + "counts_by_transport": { + "FAKE_HUNTER": { + "PASS": 26 + }, + "GPU_STUB": { + "NOT_RUN": 3 + } + }, + "failed": [], + "finished_utc": "2026-10-16T11:19:26.208Z", + "lead_questions": [ + "Amendment semantics: does the published contract allow amending a registered capture, and with which route and headers?", + "--api-token-env opts into HUNTER_API_TOKEN for scoped API routes; token-protected proxy fault coverage remains BLOCKED.", + "Clock and expiry authority: whose clock governs capture expiry on the local backend?", + "Homeowner text: confirm that receipts may carry outcome kinds and counts but never messages, prompts or reasons." + ], + "mode": { + "backend_verified": false, + "declared_backend": "FAKE_HUNTER", + "gpu_arms": "NOT_RUN", + "real_mirror_cpu": "NOT_ESTABLISHED" + }, + "not_run": [ + "gpu-stub.objects", + "gpu-stub.vlm", + "gpu-stub.dense" + ], + "run_id": "eebbb6f25a6cea14", + "schema": "hunter-local-ingest/summary/2", + "total": 29, + "verdict": "PASS" +} diff --git a/evidence/burst11-bs-ingest-harness-local/runs.tsv b/evidence/burst11-bs-ingest-harness-local/runs.tsv new file mode 100644 index 000000000..a76882097 --- /dev/null +++ b/evidence/burst11-bs-ingest-harness-local/runs.tsv @@ -0,0 +1,5 @@ +realapi-miniarkit-20261016T113352Z-d433c04240ec810d FAIL GPU_STUB NOT_RUN:3; REAL_API FAIL:1, PASS:13 control.restart-recovery=FAIL, gpu-stub.dense=NOT_RUN, gpu-stub.objects=NOT_RUN, gpu-stub.vlm=NOT_RUN +realapi-none-20261016T112249Z-58f45a2ef87cc5f9 PASS FAKE_HUNTER PASS:12; GPU_STUB NOT_RUN:3; REAL_API NOT_RUN:1, PASS:13 control.restart-recovery=NOT_RUN, gpu-stub.dense=NOT_RUN, gpu-stub.objects=NOT_RUN, gpu-stub.vlm=NOT_RUN +realapi-restart-20261016T112302Z-5e804874d9703640 FAIL FAKE_HUNTER PASS:12; GPU_STUB NOT_RUN:3; REAL_API FAIL:1, PASS:13 control.restart-recovery=FAIL, gpu-stub.dense=NOT_RUN, gpu-stub.objects=NOT_RUN, gpu-stub.vlm=NOT_RUN +realapi-static-20261016T112316Z-8ca841e02f7fb6f7 PASS GPU_STUB NOT_RUN:3; REAL_API NOT_RUN:1, PASS:13 control.restart-recovery=NOT_RUN, gpu-stub.dense=NOT_RUN, gpu-stub.objects=NOT_RUN, gpu-stub.vlm=NOT_RUN +selfcheck-20261016T111923Z-eebbb6f25a6cea14 PASS FAKE_HUNTER PASS:26; GPU_STUB NOT_RUN:3 gpu-stub.dense=NOT_RUN, gpu-stub.objects=NOT_RUN, gpu-stub.vlm=NOT_RUN diff --git a/evidence/burst11-bs-ingest-harness-local/selfcheck.gif b/evidence/burst11-bs-ingest-harness-local/selfcheck.gif new file mode 100644 index 000000000..1a302919d Binary files /dev/null and b/evidence/burst11-bs-ingest-harness-local/selfcheck.gif differ diff --git a/tools/hunter-local-ingest/fixtures/gen_miniarkit_plan.py b/tools/hunter-local-ingest/fixtures/gen_miniarkit_plan.py new file mode 100644 index 000000000..d9a888fca --- /dev/null +++ b/tools/hunter-local-ingest/fixtures/gen_miniarkit_plan.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +"""Repo entry point for the mini-arkit plan generator. + +The generator lives in the package (src/hunter_local_ingest/gen_miniarkit.py) +so an installed copy has it too (``hunter-gen-miniarkit``). This wrapper +puts the checkout's src/ on the import path, so it runs without installing. +""" + +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) + +from hunter_local_ingest.gen_miniarkit import main # noqa: E402 + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/hunter-local-ingest/pyproject.toml b/tools/hunter-local-ingest/pyproject.toml index 458660f6d..ed16188c0 100644 --- a/tools/hunter-local-ingest/pyproject.toml +++ b/tools/hunter-local-ingest/pyproject.toml @@ -16,6 +16,7 @@ hunter-local-ingest = "hunter_local_ingest.runner:main" hunter-selfcheck = "hunter_local_ingest.selfcheck:main" hunter-verify-run = "hunter_local_ingest.verify:main" hunter-gen-plan = "hunter_local_ingest.fixturegen:main" +hunter-gen-miniarkit = "hunter_local_ingest.gen_miniarkit:main" [tool.setuptools.packages.find] where = ["src"] diff --git a/tools/hunter-local-ingest/src/hunter_local_ingest/export.py b/tools/hunter-local-ingest/src/hunter_local_ingest/export.py index 29ffd74d3..93820b1c8 100644 --- a/tools/hunter-local-ingest/src/hunter_local_ingest/export.py +++ b/tools/hunter-local-ingest/src/hunter_local_ingest/export.py @@ -232,6 +232,7 @@ class ExportContext: paths: frozenset[str] = frozenset() packet_ids: frozenset[str] = frozenset() + generator_name: str | None = None class _V: @@ -467,9 +468,25 @@ def validate_manifest(manifest: object, ctx: ExportContext, known: Mapping[str, "files", }, ) - v.member(fixture["generator"], "/fixture/generator", {"gen_synthetic_packet"}, "generator") + v.member( + fixture["generator"], + "/fixture/generator", + {"gen_synthetic_packet", "gen_miniarkit_packet"}, + "generator", + ) + if ctx.generator_name is not None and fixture["generator"] != ctx.generator_name: + raise v.fail("/fixture/generator", "fixture-generator-does-not-match-plan") v.integer(fixture["format_version"], "/fixture/format_version", low=1, high=100) - v.integer(fixture["seed"], "/fixture/seed", low=0, high=2**31) + # Seed semantics belong to the generator family: the synthetic family is + # seeded (bounded), the mini-arkit family is fixture-determined with a + # null seed. Enforcing the pairing here keeps a rewritten manifest from + # claiming the other family and still passing verification. + if fixture["generator"] == "gen_synthetic_packet": + if fixture["seed"] is None: + raise v.fail("/fixture/seed", "synthetic-fixture-requires-a-seed") + v.integer(fixture["seed"], "/fixture/seed", low=0, high=2**31) + elif fixture["seed"] is not None: + raise v.fail("/fixture/seed", "miniarkit-fixture-seed-must-be-null") for key in ("plan_file_sha256", "plan_sha256", "packet_sha256", "create_sha256"): v.match(fixture[key], f"/fixture/{key}", _HEX64_RE, "not-a-digest") v.member( @@ -643,7 +660,7 @@ def validate_chain_entry(entry: object) -> None: SCREENED_ARTIFACTS = ("run-manifest.json", "checks.jsonl", "summary.json") CHAINED_ARTIFACTS = ("run-manifest.json", "checks.jsonl", "summary.json", "privacy-screen.json") -CONTENT_TYPES = ("application/octet-stream", "application/gzip") +CONTENT_TYPES = ("application/octet-stream", "application/gzip", "image/jpeg") # PASS: every executed check passed and nothing was blocked. NOT_RUN rows # (GPU arms, an unconfigured restart) are listed in the summary, not hidden. diff --git a/tools/hunter-local-ingest/src/hunter_local_ingest/fixturegen.py b/tools/hunter-local-ingest/src/hunter_local_ingest/fixturegen.py index 9e3ad3c7c..e610ca98f 100644 --- a/tools/hunter-local-ingest/src/hunter_local_ingest/fixturegen.py +++ b/tools/hunter-local-ingest/src/hunter_local_ingest/fixturegen.py @@ -9,8 +9,12 @@ The create body and the packet follow the published types in ios/HouseScanKit/Sources/HouseScanKit (Upload/CaptureAPI.swift CreateRequest, Packet/Packet04.swift Packet, Packet/Packet04Streams.swift -column names) at alpha 263827ef. Keyframes are empty: the files are noise, -not images, and the packet says so rather than pretending. +column names) at alpha 263827ef. Keyframes are synthetic: small seeded +baseline JPEGs a pipeline can decode (a seeded 8x8 tile mosaic, written +by the package's own minimal encoder), declared with the keyframe role, +so an arkit-tier packet carries what the published contract requires +(the first REAL_API run: the server refused an arkit packet without +keyframes). The runner's loader (plan.py) re-verifies every digest written here. @@ -45,6 +49,317 @@ "cy", ] IMU_COLUMNS = ["t", "ax", "ay", "az", "gx", "gy", "gz"] +KEYFRAME_COUNT = 3 +MAX_MESH_COUNT = 59 # 59 meshes + 2 streams + 3 keyframes stays within MAX_FILES=64. + +# Keyframe geometry: the packet's declared keyframe w/h, a multiple of the +# 8x8 JPEG block so no MCU is padded. +KEYFRAME_WIDTH = 64 +KEYFRAME_HEIGHT = 48 +# Every quantization value is 16, so a DC-only tile of quantized level L +# decodes back to the exact pixel value 2L + 128: the JPEG DC coefficient +# carries the block average AFTER the standard level shift (pixels are +# centered on 128 before the DCT), so F(0,0) = 8 * (value - 128). +_JPEG_QUANT = 16 +# Every keyframe is padded to this fixed byte count with a COM (comment) +# segment right after APP0, so the plan's per-file byte counts stay +# seed-independent (the receipts contract pins non-stream file sizes). +_KEYFRAME_JPEG_BYTES = 768 + +# Annex K luminance huffman tables (JPEG spec, Figures K.3 and K.5): the +# BITS counts per code length 1..16 and the symbols in order. +_DC_BITS = (0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0) +_DC_VALS = tuple(range(12)) +_AC_BITS = (0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7D) +_AC_VALS = ( + 0x01, + 0x02, + 0x03, + 0x00, + 0x04, + 0x11, + 0x05, + 0x12, + 0x21, + 0x31, + 0x41, + 0x06, + 0x13, + 0x51, + 0x61, + 0x07, + 0x22, + 0x71, + 0x14, + 0x32, + 0x81, + 0x91, + 0xA1, + 0x08, + 0x23, + 0x42, + 0xB1, + 0xC1, + 0x15, + 0x52, + 0xD1, + 0xF0, + 0x24, + 0x33, + 0x62, + 0x72, + 0x82, + 0x09, + 0x0A, + 0x16, + 0x17, + 0x18, + 0x19, + 0x1A, + 0x25, + 0x26, + 0x27, + 0x28, + 0x29, + 0x2A, + 0x34, + 0x35, + 0x36, + 0x37, + 0x38, + 0x39, + 0x3A, + 0x43, + 0x44, + 0x45, + 0x46, + 0x47, + 0x48, + 0x49, + 0x4A, + 0x53, + 0x54, + 0x55, + 0x56, + 0x57, + 0x58, + 0x59, + 0x5A, + 0x63, + 0x64, + 0x65, + 0x66, + 0x67, + 0x68, + 0x69, + 0x6A, + 0x73, + 0x74, + 0x75, + 0x76, + 0x77, + 0x78, + 0x79, + 0x7A, + 0x83, + 0x84, + 0x85, + 0x86, + 0x87, + 0x88, + 0x89, + 0x8A, + 0x92, + 0x93, + 0x94, + 0x95, + 0x96, + 0x97, + 0x98, + 0x99, + 0x9A, + 0xA2, + 0xA3, + 0xA4, + 0xA5, + 0xA6, + 0xA7, + 0xA8, + 0xA9, + 0xAA, + 0xB2, + 0xB3, + 0xB4, + 0xB5, + 0xB6, + 0xB7, + 0xB8, + 0xB9, + 0xBA, + 0xC2, + 0xC3, + 0xC4, + 0xC5, + 0xC6, + 0xC7, + 0xC8, + 0xC9, + 0xCA, + 0xD2, + 0xD3, + 0xD4, + 0xD5, + 0xD6, + 0xD7, + 0xD8, + 0xD9, + 0xDA, + 0xE1, + 0xE2, + 0xE3, + 0xE4, + 0xE5, + 0xE6, + 0xE7, + 0xE8, + 0xE9, + 0xEA, + 0xF1, + 0xF2, + 0xF3, + 0xF4, + 0xF5, + 0xF6, + 0xF7, + 0xF8, + 0xF9, + 0xFA, +) + + +def _canonical_codes(bits: tuple[int, ...], symbols: tuple[int, ...]) -> dict[int, tuple[int, int]]: + """Canonical huffman codes (JPEG spec C.2): (code, length) per symbol.""" + codes: dict[int, tuple[int, int]] = {} + code = 0 + index = 0 + for length in range(1, 17): + for _ in range(bits[length - 1]): + codes[symbols[index]] = (code, length) + index += 1 + code += 1 + code <<= 1 + assert index == len(symbols), "table bits must match its symbols" + return codes + + +_DC_CODES = _canonical_codes(_DC_BITS, _DC_VALS) +_AC_CODES = _canonical_codes(_AC_BITS, _AC_VALS) + + +class _BitWriter: + """MSB-first bit writer with JPEG byte stuffing (0xFF -> 0xFF 0x00).""" + + def __init__(self) -> None: + self.out = bytearray() + self._acc = 0 + self._n = 0 + + def write(self, code: int, length: int) -> None: + for shift in range(length - 1, -1, -1): + self._acc = (self._acc << 1) | ((code >> shift) & 1) + self._n += 1 + if self._n == 8: + self.out.append(self._acc) + if self._acc == 0xFF: + self.out.append(0x00) + self._acc = 0 + self._n = 0 + + def flush(self) -> bytes: + if self._n: + self._acc = (self._acc << (8 - self._n)) | ((1 << (8 - self._n)) - 1) + self.out.append(self._acc) + if self._acc == 0xFF: + self.out.append(0x00) + return bytes(self.out) + + +def _segment(marker: int, payload: bytes) -> bytes: + # The two length bytes count themselves: length = len(payload) + 2. + return bytes((0xFF, marker)) + (len(payload) + 2).to_bytes(2, "big") + payload + + +def keyframe_tiles(seed: int, path: str, width: int, height: int) -> list[list[int]]: + """One even pixel value (32..254) per 8x8 tile, seed- and path-dependent.""" + blocks_x, blocks_y = width // 8, height // 8 + raw = noise_bytes(seed, f"{path}:tiles", blocks_x * blocks_y) + return [ + [2 * (16 + raw[y * blocks_x + x] % 112) for x in range(blocks_x)] for y in range(blocks_y) + ] + + +def keyframe_jpeg( + seed: int, path: str, width: int = KEYFRAME_WIDTH, height: int = KEYFRAME_HEIGHT +) -> bytes: + """A small, valid, deterministic baseline JPEG. + + A grayscale 8x8 tile mosaic whose tile values come from the seeded byte + stream: the image decodes in any reader and still changes byte for byte + with the seed and path. The encoder is DC-only per tile (every AC + coefficient is zero), so the entropy stream is the DC symbol, its + amplitude bits and an end-of-block code per block. + """ + if width % 8 or height % 8: + raise ValueError("keyframe dimensions must be multiples of the 8x8 JPEG block") + tiles = keyframe_tiles(seed, path, width, height) + blocks_x, blocks_y = width // 8, height // 8 + + out = bytearray(b"\xff\xd8") # SOI + # JFIF APP0: version 1.01, no density units, square aspect. + out += _segment(0xE0, b"JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00") + # The rest of the stream, built first so the COM padding below can be + # sized to the exact final byte count. + body = bytearray() + # DQT: table 0, eight-bit precision, every value _JPEG_QUANT. + body += _segment(0xDB, b"\x00" + bytes([_JPEG_QUANT]) * 64) + # SOF0: baseline, one component, no subsampling, table 0. + frame = b"\x08" + height.to_bytes(2, "big") + width.to_bytes(2, "big") + b"\x01\x01\x11\x00" + body += _segment(0xC0, frame) + # DHT: the standard luminance DC and AC tables. + body += _segment(0xC4, b"\x00" + bytes(_DC_BITS) + bytes(_DC_VALS)) + body += _segment(0xC4, b"\x10" + bytes(_AC_BITS) + bytes(_AC_VALS)) + # SOS: component 1, DC table 0 and AC table 0, spectral 0..63, point 0. + body += _segment(0xDA, b"\x01\x01\x00\x00\x3f\x00") + writer = _BitWriter() + predictor = 0 + for y in range(blocks_y): + for x in range(blocks_x): + # Quantized DC level of the block average, level shift included: + # exact for even tile values ((value - 128) is even, halved once). + level = (tiles[y][x] - 128) // 2 + diff = level - predictor + predictor = level + if diff == 0: + code, length = _DC_CODES[0] + writer.write(code, length) + else: + category = abs(diff).bit_length() + code, length = _DC_CODES[category] + writer.write(code, length) + amplitude = diff if diff > 0 else diff + (1 << category) - 1 + writer.write(amplitude, category) + eob, eob_length = _AC_CODES[0x00] + writer.write(eob, eob_length) + body += writer.flush() + body += b"\xff\xd9" # EOI + # COM padding to the fixed byte count: a comment segment every reader + # ignores, so the file length does not depend on the seeded entropy. + pad = _KEYFRAME_JPEG_BYTES - len(out) - len(body) - 4 + if pad < 0: + raise ValueError("keyframe overflows its fixed byte budget") + out += _segment(0xFE, b"\x00" * pad) + out += body + return bytes(out) def noise_bytes(seed: int, path: str, n: int) -> bytes: @@ -118,6 +433,8 @@ def imu_stream(seed: int) -> bytes: def build(seed: int, mesh_count: int, mesh_kb: int) -> dict: + if not (1 <= mesh_count <= MAX_MESH_COUNT): + raise ValueError(f"mesh_count must be 1..{MAX_MESH_COUNT}") packet_id = f"synthetic-{seed:06d}" contents: list[tuple[str, str, str, bytes]] = [] for i in range(mesh_count): @@ -127,6 +444,16 @@ def build(seed: int, mesh_count: int, mesh_kb: int) -> dict: ) contents.append(("streams/arkit_poses.csv.gz", "stream", "application/gzip", pose_stream(seed))) contents.append(("streams/imu_raw.csv.gz", "stream", "application/gzip", imu_stream(seed))) + for i in range(KEYFRAME_COUNT): + path = f"keyframes/kf{i + 1:02d}.jpg" + contents.append( + ( + path, + "keyframe", + "image/jpeg", + keyframe_jpeg(seed, path, KEYFRAME_WIDTH, KEYFRAME_HEIGHT), + ) + ) files = [] entries = [] @@ -186,7 +513,21 @@ def build(seed: int, mesh_count: int, mesh_kb: int) -> dict: "videoFormat": {"imageResolution": [1920, 1440]}, }, "epochs": [{"id": "e1", "startTime": 5000.0, "reason": "sessionStart"}], - "keyframes": [], + "keyframes": [ + { + "id": f"kf{i + 1:02d}", + "img": f"keyframes/kf{i + 1:02d}.jpg", + "w": 64, + "h": 48, + "intrinsics": [48.07, 48.07, 31.9867, 23.98], + "pose": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0.02 * i, -0.01 * i, 0.0, 1], + "timestamp": 5000.0 + i / 15.0, + "tracking": "normal", + "epoch": "e1", + "reason": "motion", + } + for i in range(KEYFRAME_COUNT) + ], "tracking": [], "streams": { "imuRaw": {"file": "streams/imu_raw.csv.gz", "columns": IMU_COLUMNS, "rateHz": 100.0}, @@ -256,8 +597,12 @@ def main() -> int: parser.add_argument("--mesh-count", type=int, default=3) parser.add_argument("--mesh-kb", type=int, default=64, help="per-file size in KiB") args = parser.parse_args() - if not (0 <= args.seed < 2**31) or not (1 <= args.mesh_count <= 62) or args.mesh_kb < 1: - parser.error("seed must be 0..2^31-1, mesh-count 1..62, mesh-kb >= 1") + if ( + not (0 <= args.seed < 2**31) + or not (1 <= args.mesh_count <= MAX_MESH_COUNT) + or args.mesh_kb < 1 + ): + parser.error(f"seed must be 0..2^31-1, mesh-count 1..{MAX_MESH_COUNT}, mesh-kb >= 1") out = Path(args.out) document = write_plan(out, args.seed, args.mesh_count, args.mesh_kb) diff --git a/tools/hunter-local-ingest/src/hunter_local_ingest/gen_miniarkit.py b/tools/hunter-local-ingest/src/hunter_local_ingest/gen_miniarkit.py new file mode 100644 index 000000000..274f67df1 --- /dev/null +++ b/tools/hunter-local-ingest/src/hunter_local_ingest/gen_miniarkit.py @@ -0,0 +1,144 @@ +"""Build a capture plan from the committed mini-arkit packet. + +Reads ``backend/data/fixtures/packets/mini-arkit`` from a repo checkout: +the committed ``packet.json`` plus every file it lists. Each file is read +from disk and digested again, so a drifted or missing fixture fails here, +at build time, instead of at finalize. The document mirrors the synthetic +family's ``plan`` section; the ``generator`` section is +``gen_miniarkit_packet`` and carries no seed — the fixture, not a seed, +determines the bytes. + +The committed packet's ``source.kind`` is ``synthetic``: the repo ships it +as site-shaped fixture data, never a real capture. + +Usage: + hunter-gen-miniarkit --out miniarkit-plan.json + python fixtures/gen_miniarkit_plan.py --out miniarkit-plan.json (repo checkout) +""" + +from __future__ import annotations + +import argparse +import base64 +import hashlib +import json +from pathlib import Path + +from .plan import MINIARKIT_PACKET_ID, canonical_digest + +_CONTENT_TYPES = { + ".jpg": "image/jpeg", + ".bin": "application/octet-stream", + ".csv.gz": "application/gzip", +} +_ROLES = {"keyframe", "features", "stream"} + + +def default_fixture_dir() -> Path | None: + """The committed packet, when this package sits in a repo checkout.""" + candidate = ( + Path(__file__).resolve().parents[4] + / "backend" + / "data" + / "fixtures" + / "packets" + / "mini-arkit" + ) + return candidate if candidate.is_dir() else None + + +def build(fixture_dir: Path) -> dict: + """Read the committed packet and its files into a loadable plan document.""" + raw_packet = (fixture_dir / "packet.json").read_bytes() + parsed = json.loads(raw_packet.decode("utf-8")) + if parsed.get("packetId") != MINIARKIT_PACKET_ID: + raise SystemExit("the committed packet.json is not the mini-arkit packet") + session = parsed.get("session") or {} + if session.get("tier") != "arkit" or not parsed.get("keyframes"): + raise SystemExit("the committed packet is not an arkit packet with keyframes") + if (parsed.get("source") or {}).get("kind") != "synthetic": + raise SystemExit("the committed packet is not synthetic by construction") + + files: list[dict] = [] + entries: list[dict] = [] + for entry in parsed["files"]: + path = entry["path"] + content = (fixture_dir / path).read_bytes() + sha = hashlib.sha256(content).hexdigest() + if entry.get("bytes") != len(content) or entry.get("sha256") != sha: + raise SystemExit(f"fixture file {path} drifts from packet.json") + content_type = next( + (value for suffix, value in _CONTENT_TYPES.items() if path.endswith(suffix)), None + ) + if content_type is None or entry.get("role") not in _ROLES: + raise SystemExit(f"fixture file {path} has an unexpected role or content type") + files.append( + { + "path": path, + "role": entry["role"], + "contentType": content_type, + "bytes": len(content), + "sha256": sha, + "md5": base64.b64encode( + hashlib.md5(content, usedforsecurity=False).digest() + ).decode(), + "content_hex": content.hex(), + } + ) + entries.append({"path": path, "bytes": len(content), "sha256": sha, "role": entry["role"]}) + + document = { + "format": "hunter-local-ingest-plan", + "format_version": 2, + "generator": {"name": "gen_miniarkit_packet", "sha256_of_plan": None}, + "plan": { + "packet_id": parsed["packetId"], + # CaptureAPI.CreateRequest, from the packet's own session. + "create_request": { + "packetId": parsed["packetId"], + "formatVersion": "0.4", + "tier": session["tier"], + "flow": "guided", + "device": { + "model": session["deviceModel"], + "systemVersion": session["systemVersion"], + "appVersion": session["appVersion"], + }, + }, + "files": files, + "packet_hex": raw_packet.hex(), + "packet_sha256": hashlib.sha256(raw_packet).hexdigest(), + }, + } + document["generator"]["sha256_of_plan"] = canonical_digest(document) + return document + + +def write_plan(out: Path, fixture_dir: Path) -> dict: + document = build(fixture_dir) + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text(json.dumps(document, indent=2, sort_keys=True) + "\n", encoding="utf-8") + return document + + +def main() -> int: + parser = argparse.ArgumentParser(prog="hunter-gen-miniarkit", description=__doc__) + parser.add_argument("--out", default="miniarkit-plan.json") + parser.add_argument( + "--fixture-dir", + default=None, + help="the committed mini-arkit packet directory (default: repo checkout path)", + ) + args = parser.parse_args() + fixture_dir = Path(args.fixture_dir) if args.fixture_dir else default_fixture_dir() + if fixture_dir is None or not fixture_dir.is_dir(): + parser.error("run from a repo checkout: backend/data/fixtures/packets/mini-arkit not found") + + out = Path(args.out) + document = write_plan(out, fixture_dir) + print(f"wrote {out.name} (plan sha256 {document['generator']['sha256_of_plan']})") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/hunter-local-ingest/src/hunter_local_ingest/plan.py b/tools/hunter-local-ingest/src/hunter_local_ingest/plan.py index 50b3b3635..6b55f4c58 100644 --- a/tools/hunter-local-ingest/src/hunter_local_ingest/plan.py +++ b/tools/hunter-local-ingest/src/hunter_local_ingest/plan.py @@ -1,6 +1,8 @@ """The synthetic capture plan: strict loading, digest binding, control identities. -A plan file comes from fixtures/gen_synthetic_packet.py. Loading checks +A plan file comes from the synthetic generator +(fixtures/gen_synthetic_packet.py) or from the committed mini-arkit packet +(fixtures/gen_miniarkit_plan.py). Loading checks every field against the generator's format and the published request types, and recomputes every digest from the bytes actually read, so the manifest's fixture identity describes the bytes the run sent. A plan that @@ -27,12 +29,35 @@ PLAN_FORMAT = "hunter-local-ingest-plan" PLAN_FORMAT_VERSION = 2 -PACKET_ID_RE = re.compile(r"^synthetic-[0-9]{6}$") -# Exactly the paths the generator writes. A plan that names any other path -# is refused, so a receipt can quote plan paths verbatim. -PATH_RE = re.compile(r"^(synthetic/scan[0-9]{2}\.bin|streams/(arkit_poses|imu_raw)\.csv\.gz)$") -CONTENT_TYPES = {"application/octet-stream", "application/gzip"} -_DEVICE_TEXT_RE = re.compile(r"^[A-Za-z0-9 ._()-]{1,40}$") +MINIARKIT_PACKET_ID = "mini-arkit" + +# Per generator family: the keys its generator section carries, whether it +# is seeded, and exactly the paths it writes. A plan that names any other +# path is refused, so a receipt can quote plan paths verbatim. +FAMILIES = { + "gen_synthetic_packet": { + "generator_keys": {"name", "seed", "mesh_count", "mesh_kb", "sha256_of_plan"}, + "seeded": True, + "packet_id_re": re.compile(r"^synthetic-[0-9]{6}$"), + "path_re": re.compile( + r"^(synthetic/scan[0-9]{2}\.bin|streams/(arkit_poses|imu_raw)\.csv\.gz" + r"|keyframes/kf[0-9]{2}\.jpg)$" + ), + }, + "gen_miniarkit_packet": { + "generator_keys": {"name", "sha256_of_plan"}, + "seeded": False, + "packet_id_re": re.compile(r"^mini-arkit$"), + "path_re": re.compile( + r"^(keyframes/k0000[1-4]\.jpg|keyframes/k0000[1-2]\.features\.bin" + r"|streams/(arkit_poses|heading|imu_raw|location|motion)\.csv\.gz)$" + ), + }, +} +CONTENT_TYPES = {"application/octet-stream", "application/gzip", "image/jpeg"} +# Bounded device-text charset; the comma is real deviceModel usage +# ("iPhone15,4", the committed mini-arkit fixture's device). +_DEVICE_TEXT_RE = re.compile(r"^[A-Za-z0-9 ._(),-]{1,40}$") _HEX64_RE = re.compile(r"^[0-9a-f]{64}$") _NONCE_RE = re.compile(r"^[0-9a-f]{8}$") @@ -139,7 +164,8 @@ def derived_id(packet_id: str, suffix: str, nonce: str = "") -> str: @dataclasses.dataclass(frozen=True) class LoadedPlan: plan: CapturePlan - seed: int + generator_name: str + seed: int | None format_version: int plan_file_sha256: str plan_sha256: str @@ -191,20 +217,25 @@ def load_plan(path: Path, expected_seed: int | None = None) -> LoadedPlan: _dict(document, "plan-file", {"format", "format_version", "generator", "plan"}) _need(document["format"] == PLAN_FORMAT, "format", "not a hunter-local-ingest plan") _need(document["format_version"] == PLAN_FORMAT_VERSION, "format_version", "unsupported") - generator = _dict( - document["generator"], - "generator", - {"name", "seed", "mesh_count", "mesh_kb", "sha256_of_plan"}, - ) - _need(generator["name"] == "gen_synthetic_packet", "generator.name", "unknown generator") - seed = generator["seed"] - _need( - isinstance(seed, int) and not isinstance(seed, bool) and 0 <= seed < 2**31, - "generator.seed", - "not a seed", - ) - if expected_seed is not None: - _need(seed == expected_seed, "generator.seed", "differs from --seed") + generator_raw = document["generator"] + _need(isinstance(generator_raw, dict), "generator", "not an object") + family_name = generator_raw.get("name") + _need(isinstance(family_name, str), "generator.name", "not a string") + _need(family_name in FAMILIES, "generator.name", "unknown generator") + family = FAMILIES[family_name] + generator = _dict(generator_raw, "generator", family["generator_keys"]) + if family["seeded"]: + seed = generator["seed"] + _need( + isinstance(seed, int) and not isinstance(seed, bool) and 0 <= seed < 2**31, + "generator.seed", + "not a seed", + ) + if expected_seed is not None: + _need(seed == expected_seed, "generator.seed", "differs from --seed") + else: + seed = None + _need(expected_seed is None, "generator.seed", "this plan family has no seed") recorded = generator["sha256_of_plan"] _need( isinstance(recorded, str) and bool(_HEX64_RE.fullmatch(recorded)), @@ -224,11 +255,12 @@ def load_plan(path: Path, expected_seed: int | None = None) -> LoadedPlan: ) packet_id = body["packet_id"] _need( - isinstance(packet_id, str) and bool(PACKET_ID_RE.fullmatch(packet_id)), + isinstance(packet_id, str) and bool(family["packet_id_re"].fullmatch(packet_id)), "plan.packet_id", - "not a synthetic packet id", + "not a generator packet id", ) - _need(packet_id == f"synthetic-{seed:06d}", "plan.packet_id", "does not match the seed") + if family["seeded"]: + _need(packet_id == f"synthetic-{seed:06d}", "plan.packet_id", "does not match the seed") create = _dict( body["create_request"], @@ -268,7 +300,7 @@ def load_plan(path: Path, expected_seed: int | None = None) -> LoadedPlan: ) fpath = entry["path"] _need( - isinstance(fpath, str) and bool(PATH_RE.fullmatch(fpath)), + isinstance(fpath, str) and bool(family["path_re"].fullmatch(fpath)), f"{field}.path", "not a generator path", ) @@ -295,17 +327,58 @@ def load_plan(path: Path, expected_seed: int | None = None) -> LoadedPlan: _need(parsed.get("format") == "house-capture-packet", "packet.format", "not Packet04") _need(parsed.get("formatVersion") == FORMAT_VERSION, "packet.formatVersion", "not 0.4") _need(parsed.get("packetId") == packet_id, "packet.packetId", "differs from packet_id") - _need(parsed.get("source") == {"kind": "synthetic"}, "packet.source", "not synthetic") + if family["seeded"]: + _need(parsed.get("source") == {"kind": "synthetic"}, "packet.source", "not synthetic") + else: + _need( + isinstance(parsed.get("source"), dict) and parsed["source"].get("kind") == "synthetic", + "packet.source", + "not synthetic", + ) listed = [ {"path": f.path, "bytes": len(f.content), "sha256": f.sha256, "role": f.role} for f in files ] _need(parsed.get("files") == listed, "packet.files", "differs from the plan's files") + # The published Packet04 rule the first REAL_API run taught: an arkit + # tier carries keyframes, photo_only carries none, and every keyframe + # image is a declared file with the keyframe role. + session = parsed.get("session") + _need(isinstance(session, dict), "packet.session", "not an object") + tier = session.get("tier") + _need( + tier in ("arkit", "arkit_lidar", "photo_only") and tier == create["tier"], + "packet.session.tier", + "not the create request's tier", + ) + keyframes = parsed.get("keyframes") + if tier in ("arkit", "arkit_lidar"): + _need( + isinstance(keyframes, list) and len(keyframes) >= 1, + "packet.keyframes", + "arkit packets include at least one keyframe", + ) + listed_by_path = {entry["path"]: entry for entry in listed} + for index, keyframe in enumerate(keyframes or []): + field = f"packet.keyframes[{index}]" + _need(isinstance(keyframe, dict), field, "not an object") + image = keyframe.get("img") + entry = listed_by_path.get(image) if isinstance(image, str) else None + _need(entry is not None, f"{field}.img", "not a declared file") + _need( + entry["role"] == "keyframe", + f"{field}.img", + "not declared with the keyframe role", + ) + else: + _need(keyframes == [], "packet.keyframes", "photo_only packets have no keyframes") + plan = CapturePlan( packet_id=packet_id, create_request=create, files=tuple(files), packet=packet ) return LoadedPlan( plan=plan, + generator_name=family_name, seed=seed, format_version=PLAN_FORMAT_VERSION, plan_file_sha256=hashlib.sha256(raw).hexdigest(), diff --git a/tools/hunter-local-ingest/src/hunter_local_ingest/receipts.py b/tools/hunter-local-ingest/src/hunter_local_ingest/receipts.py index 497d99be9..dfd6ee763 100644 --- a/tools/hunter-local-ingest/src/hunter_local_ingest/receipts.py +++ b/tools/hunter-local-ingest/src/hunter_local_ingest/receipts.py @@ -50,7 +50,7 @@ ) from .modes import Status, Transport from .observations import Observation -from .plan import DERIVED_SUFFIXES, PACKET_ID_RE, PATH_RE, derived_id +from .plan import DERIVED_SUFFIXES, FAMILIES, derived_id from .sanitize import screen_artifact from .scenarios.oracles import oracle_for @@ -112,14 +112,26 @@ def fresh_run_dir(root: Path, label: str) -> tuple[Path, str]: def context_for(paths: frozenset[str], packet_id: str, nonce: str = "") -> ExportContext: """The export context of a plan: its paths and its derived packet ids.""" - if not PACKET_ID_RE.fullmatch(packet_id) or not all(PATH_RE.fullmatch(p) for p in paths): + if not any( + family["packet_id_re"].fullmatch(packet_id) + and all(family["path_re"].fullmatch(p) for p in paths) + for family in FAMILIES.values() + ): raise ExportError(MANIFEST, "/fixture", "undeclared-identity") + family_name = next( + family_name + for family_name, family in FAMILIES.items() + if family["packet_id_re"].fullmatch(packet_id) + and all(family["path_re"].fullmatch(p) for p in paths) + ) ids = {packet_id} for suffix in DERIVED_SUFFIXES: ids.add(derived_id(packet_id, suffix)) if nonce: ids.add(derived_id(packet_id, suffix, nonce)) - return ExportContext(paths=frozenset(paths), packet_ids=frozenset(ids)) + return ExportContext( + paths=frozenset(paths), packet_ids=frozenset(ids), generator_name=family_name + ) def _write_exclusive(path: Path, text: str) -> None: diff --git a/tools/hunter-local-ingest/src/hunter_local_ingest/runner.py b/tools/hunter-local-ingest/src/hunter_local_ingest/runner.py index 7126ccbea..36e5ff800 100644 --- a/tools/hunter-local-ingest/src/hunter_local_ingest/runner.py +++ b/tools/hunter-local-ingest/src/hunter_local_ingest/runner.py @@ -242,7 +242,7 @@ def _manifest(args, argv: Sequence[str], loaded: LoadedPlan, run_id: str, label: "declared_ref": args.client_ref, }, "fixture": { - "generator": "gen_synthetic_packet", + "generator": loaded.generator_name, "format_version": loaded.format_version, "seed": loaded.seed, "plan_file_sha256": loaded.plan_file_sha256, diff --git a/tools/hunter-local-ingest/tests/test_export.py b/tools/hunter-local-ingest/tests/test_export.py index 22fe96371..0b7cb3af1 100644 --- a/tools/hunter-local-ingest/tests/test_export.py +++ b/tools/hunter-local-ingest/tests/test_export.py @@ -134,6 +134,11 @@ def real_artifacts(fake, plan_path, tmp_path): (lambda m, c: m.update(endpoint=f"{c}.example:80"), "not-an-endpoint-label"), (lambda m, c: m.update(extra=c), "unexpected-key"), (lambda m, c: m["settings"].update(poll_interval_s=float("nan")), "non-finite-number"), + (lambda m, c: m["fixture"].update(seed=None), "synthetic-fixture-requires-a-seed"), + ( + lambda m, c: m["fixture"].update(generator="gen_miniarkit_packet"), + "fixture-generator-does-not-match-plan", + ), ], ) def test_manifest_mutations_rejected(real_artifacts, mutate, category): @@ -148,6 +153,16 @@ def test_manifest_mutations_rejected(real_artifacts, mutate, category): assert marker not in str(exc.value) +def test_manifest_generator_must_match_the_plan_family(real_artifacts): + manifest, _summary, ctx = real_artifacts + bad = copy.deepcopy(manifest) + bad["fixture"]["generator"] = "gen_miniarkit_packet" + bad["fixture"]["seed"] = None + with pytest.raises(ExportError) as exc: + validate_manifest(bad, ctx, FLAG_KINDS) + assert exc.value.category == "fixture-generator-does-not-match-plan" + + def test_label_must_be_label_shaped(real_artifacts): """The label is operator-chosen public text; only its shape is enforced.""" manifest, _summary, ctx = real_artifacts diff --git a/tools/hunter-local-ingest/tests/test_keyframes.py b/tools/hunter-local-ingest/tests/test_keyframes.py new file mode 100644 index 000000000..37c7f31cf --- /dev/null +++ b/tools/hunter-local-ingest/tests/test_keyframes.py @@ -0,0 +1,303 @@ +"""The synthetic keyframes are real, decodable JPEGs. + +The first REAL_API review caught the earlier fixture: SHA-256 noise bytes +declared ``image/jpeg`` decode nowhere, so any reader that opens the +captured images fails. These tests pin the contract the fixture now +carries: each keyframe is a baseline JFIF JPEG that a strict marker, +huffman and IDCT decoder (this file, standard-library only) turns back +into the seeded tile mosaic the generator wrote, at the packet's +declared dimensions, byte for byte reproducible per seed. + +The decoder here walks the actual segment stream, reads the file's own +quantization and huffman tables, un-stuffs entropy bytes, decodes the +DC/AC coefficient stream and runs the published 2D IDCT, so it fails on +noise bytes at the first marker and fails on any structural shortcut. +""" + +from __future__ import annotations + +import hashlib +import json +import math +from pathlib import Path + +import pytest + +from hunter_local_ingest.fixturegen import build, keyframe_jpeg, keyframe_tiles, write_plan + +KEYFRAME_PATHS = tuple(f"keyframes/kf{i + 1:02d}.jpg" for i in range(3)) +WIDTH, HEIGHT = 64, 48 + + +class _JpegError(ValueError): + """Not the JPEG the contract requires.""" + + +class _BitReader: + """Entropy-coded bytes with JPEG byte un-stuffing (FF00 -> FF).""" + + def __init__(self, data: bytes) -> None: + self._data = data + self._pos = 0 + self._acc = 0 + self._n = 0 + + def bit(self) -> int: + if self._n == 0: + if self._pos >= len(self._data): + raise _JpegError("entropy data exhausted") + byte = self._data[self._pos] + self._pos += 1 + if byte == 0xFF: + if self._pos >= len(self._data) or self._data[self._pos] != 0x00: + raise _JpegError("marker inside entropy data") + self._pos += 1 + self._acc = byte + self._n = 8 + self._n -= 1 + return (self._acc >> self._n) & 1 + + def bits(self, count: int) -> int: + value = 0 + for _ in range(count): + value = (value << 1) | self.bit() + return value + + +def _codes_from_table(bits: list[int], symbols: list[int]) -> dict[int, tuple[int, int]]: + """Canonical huffman codes (JPEG spec C.2): (code, length) per symbol.""" + codes: dict[int, tuple[int, int]] = {} + code = 0 + index = 0 + for length in range(1, 17): + for _ in range(bits[length - 1]): + if index >= len(symbols): + raise _JpegError("huffman table longer than its symbols") + codes[symbols[index]] = (code, length) + index += 1 + code += 1 + code <<= 1 + if index != len(symbols): + raise _JpegError("huffman table shorter than its symbols") + return codes + + +def _decode_huffman(reader: _BitReader, codes: dict[int, tuple[int, int]]) -> int: + code = 0 + for length in range(1, 17): + code = (code << 1) | reader.bit() + for symbol, (known, known_length) in codes.items(): + if known_length == length and known == code: + return symbol + raise _JpegError("no huffman code matches") + + +def _extend(value: int, category: int) -> int: + return value if value >= (1 << (category - 1)) else value - (1 << category) + 1 + + +def _idct(coefficients: list[int], quant: list[int]) -> list[list[float]]: + """The published 2D IDCT (JPEG spec A.3.3) over one dequantized block.""" + spatial = [[0.0] * 8 for _ in range(8)] + for x in range(8): + for y in range(8): + total = 0.0 + for u in range(8): + cu = 1.0 / math.sqrt(2.0) if u == 0 else 1.0 + for v in range(8): + cv = 1.0 / math.sqrt(2.0) if v == 0 else 1.0 + total += ( + cu + * cv + * coefficients[v * 8 + u] + * quant[v * 8 + u] + * math.cos((2 * x + 1) * u * math.pi / 16) + * math.cos((2 * y + 1) * v * math.pi / 16) + ) + spatial[y][x] = total / 4.0 + return spatial + + +def _decode_baseline_jpeg(data: bytes) -> list[list[list[float]]]: + """One-component baseline JPEG to a list of 8x8 pixel blocks, strictly.""" + if data[:2] != b"\xff\xd8": + raise _JpegError("no SOI") + pos = 2 + quant: list[int] | None = None + dims: tuple[int, int] | None = None + dc_codes: dict[int, tuple[int, int]] | None = None + ac_codes: dict[int, tuple[int, int]] | None = None + jfif = False + blocks: list[list[list[float]]] = [] + while pos < len(data): + if data[pos] != 0xFF: + raise _JpegError("no marker where a marker belongs") + while pos < len(data) and data[pos] == 0xFF: + pos += 1 + marker = data[pos] + pos += 1 + if marker == 0xD9: # EOI + if pos != len(data): + raise _JpegError("trailing bytes after EOI") + if quant is None or dims is None or dc_codes is None or ac_codes is None: + raise _JpegError("stream ended before the tables it needs") + return blocks + if marker == 0x01 or 0xD0 <= marker <= 0xD7: # standalone markers + continue + if pos + 2 > len(data): + raise _JpegError("segment header cut off") + length = int.from_bytes(data[pos : pos + 2], "big") + segment = data[pos + 2 : pos + length] + pos += length + if marker == 0xE0: + jfif = segment[:5] == b"JFIF\x00" + elif marker == 0xFE: # COM: ignored, carries the fixed-size padding + continue + elif marker == 0xDB: + if segment[0] != 0x00: + raise _JpegError("only 8-bit quantization tables are required") + quant = list(segment[1:65]) + if len(quant) != 64: + raise _JpegError("quantization table is not 64 entries") + elif marker == 0xC0: + if segment[0] != 8: + raise _JpegError("only 8-bit baseline JPEG is required") + dims = (int.from_bytes(segment[1:3], "big"), int.from_bytes(segment[3:5], "big")) + if segment[5] != 1 or segment[7] != 0x11 or segment[8] != 0x00: + raise _JpegError("not a single-component, non-subsampled frame") + elif marker == 0xC4: + table_class = segment[0] >> 4 + bits = list(segment[1:17]) + symbols = list(segment[17:]) + codes = _codes_from_table(bits, symbols) + if table_class == 0: + dc_codes = codes + else: + ac_codes = codes + elif marker == 0xDA: + if dims is None or quant is None or dc_codes is None or ac_codes is None: + raise _JpegError("scan before the tables it needs") + if ( + segment[0] != 1 + or segment[1] != 0x01 + or segment[2] != 0x00 + or segment[3:] != b"\x00\x3f\x00" + ): + raise _JpegError("unexpected scan header") + scan_start = pos + while pos < len(data): + if ( + data[pos] == 0xFF + and data[pos + 1] not in (0x00,) + and not (0xD0 <= data[pos + 1] <= 0xD7) + ): + break + pos += 1 + reader = _BitReader(data[scan_start:pos]) + blocks_x = (dims[1] + 7) // 8 + blocks_y = (dims[0] + 7) // 8 + predictor = 0 + for _ in range(blocks_y): + for _ in range(blocks_x): + category = _decode_huffman(reader, dc_codes) + diff = _extend(reader.bits(category), category) if category else 0 + predictor += diff + coefficients = [0] * 64 + coefficients[0] = predictor + while True: + symbol = _decode_huffman(reader, ac_codes) + run, size = symbol >> 4, symbol & 0x0F + if size == 0: + if run != 0: + raise _JpegError("AC symbol is not an end-of-block") + break + reader.bits(size) # the fixture carries no AC detail + blocks.append(_idct(coefficients, quant)) + if not jfif: + raise _JpegError("no JFIF APP0 segment") + else: + raise _JpegError("unexpected segment in a baseline stream") + raise _JpegError("no EOI") + + +def _expected_blocks(tiles: list[list[int]]) -> list[tuple[int, int, int]]: + """Tile (column, row, value) in scan order, one per 8x8 block.""" + return [(x, y, tiles[y][x]) for y in range(len(tiles)) for x in range(len(tiles[0]))] + + +def test_keyframes_are_decodable_jpegs_at_the_declared_dimensions(tmp_path: Path) -> None: + document = write_plan(tmp_path / "plan.json", seed=1) + packet = json.loads(bytes.fromhex(document["plan"]["packet_hex"]).decode("utf-8")) + assert (packet["keyframes"][0]["w"], packet["keyframes"][0]["h"]) == (WIDTH, HEIGHT) + declared = {entry["path"]: entry for entry in document["plan"]["files"]} + for path in KEYFRAME_PATHS: + content = bytes.fromhex(declared[path]["content_hex"]) + blocks = _decode_baseline_jpeg(content) + assert len(blocks) == (WIDTH // 8) * (HEIGHT // 8) + + +def test_decoded_keyframe_pixels_are_the_seeded_mosaic(tmp_path: Path) -> None: + for seed in (0, 1, 7): + document = write_plan(tmp_path / f"plan-{seed}.json", seed=seed) + declared = {entry["path"]: entry for entry in document["plan"]["files"]} + tiles = keyframe_tiles(seed, KEYFRAME_PATHS[0], WIDTH, HEIGHT) + content = bytes.fromhex(declared[KEYFRAME_PATHS[0]]["content_hex"]) + blocks = _decode_baseline_jpeg(content) + for x, y, value in _expected_blocks(tiles): + block = blocks[y * (WIDTH // 8) + x] + # The IDCT returns level-shifted values (centered on 0); the + # decoded pixel adds the standard +128 back. + flat = [round(v) + 128 for row in block for v in row] + assert max(flat) - min(flat) == 0, "a tile decoded with internal detail" + assert flat[0] == value, f"tile ({x}, {y}) decoded {flat[0]}, generator wrote {value}" + + +def test_keyframe_jpeg_is_deterministic_and_seed_dependent() -> None: + again = keyframe_jpeg(1, KEYFRAME_PATHS[0], WIDTH, HEIGHT) + other = keyframe_jpeg(2, KEYFRAME_PATHS[0], WIDTH, HEIGHT) + assert keyframe_jpeg(1, KEYFRAME_PATHS[0], WIDTH, HEIGHT) == again + assert again != other, "a different seed must change the keyframe bytes" + assert ( + hashlib.sha256(again).hexdigest() + == hashlib.sha256(keyframe_jpeg(1, KEYFRAME_PATHS[0], WIDTH, HEIGHT)).hexdigest() + ) + + +def test_plan_keyframe_digests_bind_the_jpeg_bytes(tmp_path: Path) -> None: + document = write_plan(tmp_path / "plan.json", seed=1) + for i, path in enumerate(KEYFRAME_PATHS): + entry = next(f for f in document["plan"]["files"] if f["path"] == path) + content = bytes.fromhex(entry["content_hex"]) + assert entry["sha256"] == hashlib.sha256(content).hexdigest() + assert content[:3] == b"\xff\xd8\xff", "a JPEG starts with SOI and a marker" + assert content != keyframe_jpeg( + 1, KEYFRAME_PATHS[(i + 1) % len(KEYFRAME_PATHS)], WIDTH, HEIGHT + ) + + +def test_keyframe_byte_counts_are_seed_independent() -> None: + """Non-stream file sizes must not depend on the seed (receipts contract).""" + from hunter_local_ingest.fixturegen import _KEYFRAME_JPEG_BYTES + + sizes = { + (seed, path): len(keyframe_jpeg(seed, path, WIDTH, HEIGHT)) + for seed in (0, 1, 7) + for path in KEYFRAME_PATHS + } + assert set(sizes.values()) == {_KEYFRAME_JPEG_BYTES} + + +def test_noise_bytes_are_not_keyframes() -> None: + """The reviewed bug stays fixed: hash-noise bytes fail the strict decoder.""" + from hunter_local_ingest.fixturegen import noise_bytes + + with pytest.raises(_JpegError): + _decode_baseline_jpeg(noise_bytes(1, "keyframes/kf01.jpg", 1536)) + + +def test_build_ties_keyframes_to_the_packet(tmp_path: Path) -> None: + document = build(1, 3, 64) + packet = json.loads(bytes.fromhex(document["plan"]["packet_hex"]).decode("utf-8")) + assert [entry["path"] for entry in packet["files"] if entry["role"] == "keyframe"] == list( + KEYFRAME_PATHS + ) diff --git a/tools/hunter-local-ingest/tests/test_lifecycle.py b/tools/hunter-local-ingest/tests/test_lifecycle.py index e718fd376..7cb3408cc 100644 --- a/tools/hunter-local-ingest/tests/test_lifecycle.py +++ b/tools/hunter-local-ingest/tests/test_lifecycle.py @@ -334,7 +334,8 @@ def test_a_server_minted_traversal_id_never_carries_the_credential(fake, plan): def test_a_two_file_batch_limit_is_honoured_everywhere(fake, plan): - assert len(plan.files) == 5 + # 5 synthetic artifacts + 3 keyframe images = 8 files in the fixture. + assert len(plan.files) == 8 with fake(FakeConfig(max_batch=2)) as api: rows, _ = _run(api, plan) controls = _controls(api, plan) @@ -349,7 +350,8 @@ def test_a_two_file_batch_limit_is_honoured_everywhere(fake, plan): assert observed["tampered_committed"] is False # the fake answers 413 to any register or commit over two files, so the # all-PASS rows above mean every request respected the limit - assert len(rows["lifecycle.register"]["observed"]["batches"]) == 3 + # 8 files in two-file batches = 4 batches. + assert len(rows["lifecycle.register"]["observed"]["batches"]) == 4 # each control on a capture of its own; the baseline bytes are untouched assert len(set(by_packet.values())) == len(by_packet) for f in plan.files: @@ -588,4 +590,5 @@ def test_expected_tamper_still_passes_across_batches(fake, plan): controls = _controls(api, plan) for check_id in ("control.corrupt-upload", "control.truncated-upload"): assert controls[check_id]["status"] == "PASS" - assert len(controls[check_id]["observed"]["batches"]) == 3 + # 8 files in two-file batches = 4 batches. + assert len(controls[check_id]["observed"]["batches"]) == 4 diff --git a/tools/hunter-local-ingest/tests/test_packaging.py b/tools/hunter-local-ingest/tests/test_packaging.py index ef0a342ca..effc35efb 100644 --- a/tools/hunter-local-ingest/tests/test_packaging.py +++ b/tools/hunter-local-ingest/tests/test_packaging.py @@ -489,9 +489,10 @@ def test_installed_rerun_of_a_committed_capture_passes(venv, outside): assert rows["lifecycle.upload"]["observed"]["uploads"] == [] assert rows["trace.expected-lifecycle-v3"]["status"] == "PASS" assert rows["control.corrupt-upload"]["status"] == "PASS" - # first run: 5 baseline + 5 per tamper control; the rerun re-uploads only - # its fresh control captures, never the committed baseline - assert len(puts) == 5 + 10 + 10 + # every uploaded round is now 8 files: the first run uploads the baseline + # plus its two tamper controls (8 x 3); the rerun's baseline capture is + # already committed, so only its two fresh controls upload (8 x 2) + assert len(puts) == 8 * 5 def test_installed_runner_reads_the_token_only_from_the_named_env(venv, outside): diff --git a/tools/hunter-local-ingest/tests/test_plans.py b/tools/hunter-local-ingest/tests/test_plans.py new file mode 100644 index 000000000..a11038f20 --- /dev/null +++ b/tools/hunter-local-ingest/tests/test_plans.py @@ -0,0 +1,197 @@ +"""Published-contract gates on plan families. + +The first REAL_API run showed the synthetic fixture refused at finalize: +the server validates ``arkit packets must include at least one keyframe``, +and the generator wrote none. The app never sends an arkit packet without +keyframes, so the fixture was unrepresentative. These tests pin the +published contract at loader level: + +- the synthetic generator emits arkit keyframes whose image files are + declared with the ``keyframe`` role and whose digests bind; +- the loader refuses an arkit packet without keyframes; +- the loader accepts the committed mini-arkit plan family and refuses a + tampered file. +""" + +from __future__ import annotations + +import hashlib +import json +from pathlib import Path + +import pytest + +from hunter_local_ingest.fixturegen import build, write_plan +from hunter_local_ingest.gen_miniarkit import MINIARKIT_PACKET_ID +from hunter_local_ingest.gen_miniarkit import write_plan as write_miniarkit +from hunter_local_ingest.plan import PlanError, canonical_digest, load_plan + +REPO_ROOT = Path(__file__).resolve().parents[3] +MINIARKIT_DIR = REPO_ROOT / "backend" / "data" / "fixtures" / "packets" / "mini-arkit" + + +def _packet(document: dict) -> dict: + return json.loads(bytes.fromhex(document["plan"]["packet_hex"]).decode("utf-8")) + + +def _rewrite_packet(document: dict, packet: dict) -> dict: + """Re-seal the document around a modified packet object.""" + packet_bytes = json.dumps(packet, sort_keys=True, separators=(",", ":")).encode("utf-8") + document["plan"]["packet_hex"] = packet_bytes.hex() + document["plan"]["packet_sha256"] = hashlib.sha256(packet_bytes).hexdigest() + document["generator"]["sha256_of_plan"] = canonical_digest(document) + return document + + +def _declared(document: dict) -> dict[str, dict]: + return {entry["path"]: entry for entry in document["plan"]["files"]} + + +def test_synthetic_arkit_packet_has_declared_keyframes(tmp_path: Path) -> None: + document = write_plan(tmp_path / "plan.json", seed=1) + packet = _packet(document) + assert packet["session"]["tier"] in ("arkit", "arkit_lidar") + keyframes = packet["keyframes"] + assert isinstance(keyframes, list) and keyframes, "arkit packets include keyframes" + declared = _declared(document) + for keyframe in keyframes: + image = keyframe["img"] + assert image in declared, f"keyframe img {image} is not a declared file" + entry = declared[image] + assert entry["role"] == "keyframe" + content = bytes.fromhex(entry["content_hex"]) + assert entry["sha256"] == hashlib.sha256(content).hexdigest() + + +def test_synthetic_mesh_limit_stays_within_manifest_file_limit() -> None: + mesh_limit = 59 + build(1, mesh_limit, 1) + with pytest.raises(ValueError, match=f"1..{mesh_limit}"): + build(1, mesh_limit + 1, 1) + + +def test_loader_refuses_arkit_packet_without_keyframes(tmp_path: Path) -> None: + path = tmp_path / "plan.json" + document = write_plan(path, seed=1) + packet = _packet(document) + packet["keyframes"] = [] + _rewrite_packet(document, packet) + path.write_text(json.dumps(document, indent=2, sort_keys=True) + "\n", encoding="utf-8") + with pytest.raises(PlanError, match="keyframes"): + load_plan(path) + + +@pytest.mark.skipif(not MINIARKIT_DIR.exists(), reason="repo checkout required") +def test_miniarkit_plan_loads_and_binds_digests(tmp_path: Path) -> None: + path = tmp_path / "miniarkit-plan.json" + write_miniarkit(path, MINIARKIT_DIR) + loaded = load_plan(path) + assert loaded.plan.packet_id == MINIARKIT_PACKET_ID + packet = json.loads(loaded.plan.packet.decode("utf-8")) + assert packet["session"]["tier"] == "arkit" + assert packet["keyframes"], "the committed packet carries keyframes" + + # A tampered file is refused: the loader recomputes every digest. + document = json.loads(path.read_text(encoding="utf-8")) + document["plan"]["files"][0]["content_hex"] = ( + bytes.fromhex(document["plan"]["files"][0]["content_hex"])[:-1] + b"\x00" + ).hex() + path.write_text(json.dumps(document, indent=2, sort_keys=True) + "\n", encoding="utf-8") + with pytest.raises(PlanError): + load_plan(path) + + +def test_loader_records_the_generator_family(tmp_path: Path) -> None: + path = tmp_path / "plan.json" + write_plan(path, seed=1) + assert load_plan(path).generator_name == "gen_synthetic_packet" + + +@pytest.mark.skipif(not MINIARKIT_DIR.exists(), reason="repo checkout required") +def test_miniarkit_loader_records_the_generator_family(tmp_path: Path) -> None: + path = tmp_path / "miniarkit-plan.json" + write_miniarkit(path, MINIARKIT_DIR) + assert load_plan(path).generator_name == "gen_miniarkit_packet" + + +def test_loader_refuses_a_non_string_generator_name(tmp_path: Path) -> None: + """A list where the generator name belongs raises PlanError, not TypeError.""" + path = tmp_path / "plan.json" + document = write_plan(path, seed=1) + for bad_name in ([], {}, 5, True): + document["generator"]["name"] = bad_name + document["generator"]["sha256_of_plan"] = canonical_digest(document) + path.write_text(json.dumps(document, indent=2, sort_keys=True) + "\n", encoding="utf-8") + with pytest.raises(PlanError, match="generator.name"): + load_plan(path) + + +def test_loader_refuses_a_non_object_session(tmp_path: Path) -> None: + """A string or list session raises PlanError, not AttributeError.""" + path = tmp_path / "plan.json" + document = write_plan(path, seed=1) + packet = _packet(document) + for bad_session in ("x", ["arkit"], 3): + packet["session"] = bad_session + _rewrite_packet(document, packet) + path.write_text(json.dumps(document, indent=2, sort_keys=True) + "\n", encoding="utf-8") + with pytest.raises(PlanError, match="session"): + load_plan(path) + + +@pytest.mark.skipif(not MINIARKIT_DIR.exists(), reason="repo checkout required") +def test_runner_manifest_records_the_loaded_generator(tmp_path: Path) -> None: + """The manifest names the generator that produced the run's fixture.""" + import argparse + + from hunter_local_ingest import runner + + path = tmp_path / "miniarkit-plan.json" + write_miniarkit(path, MINIARKIT_DIR) + loaded = load_plan(path) + args = argparse.Namespace( + endpoint="http://127.0.0.1:8000/v1", + backend_mode="REAL_API", + backend_ref=None, + client_ref=None, + restart_argv_json=None, + restart_timeout_s=120.0, + result_budget_s=1500.0, + poll_interval_s=2.0, + events_wait_s=20, + max_retries=2, + retry_backoff_s=1.0, + with_faults=False, + ) + manifest = runner._manifest( + args, ["--endpoint", "http://127.0.0.1:8000/v1"], loaded, "0" * 16, "run" + ) + assert manifest["fixture"]["generator"] == "gen_miniarkit_packet" + assert manifest["fixture"]["seed"] is None + + +def test_runner_manifest_records_the_synthetic_generator(tmp_path: Path) -> None: + import argparse + + from hunter_local_ingest import runner + + path = tmp_path / "plan.json" + write_plan(path, seed=1) + loaded = load_plan(path) + args = argparse.Namespace( + endpoint="http://127.0.0.1:8000/v1", + backend_mode="REAL_API", + backend_ref=None, + client_ref=None, + restart_argv_json=None, + restart_timeout_s=120.0, + result_budget_s=1500.0, + poll_interval_s=2.0, + events_wait_s=20, + max_retries=2, + retry_backoff_s=1.0, + with_faults=False, + ) + manifest = runner._manifest(args, ["--endpoint", "127.0.0.1:8000"], loaded, "0" * 16, "run") + assert manifest["fixture"]["generator"] == "gen_synthetic_packet" + assert manifest["fixture"]["seed"] == 1