aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin <quentin@dufour.io>2024-02-23 17:32:38 +0000
committerQuentin <quentin@dufour.io>2024-02-23 17:32:38 +0000
commitd92ae5220cdaddf941da5a216fbd2c3549ccdec3 (patch)
tree464814294b6e50811e0c667cd1430c6855006f8a
parent0bb7cdf696190200d1885ec822518ac45b685a9b (diff)
parent1ea3de30995b434c4e59123c1ab634d89a0274b5 (diff)
downloadaerogramme-0.2.2.tar.gz
aerogramme-0.2.2.zip
Merge pull request 'Perf measurement & bottleneck fix' (#102) from perf/cpu-ram-bottleneck into main0.2.2
Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/aerogramme/pulls/102
-rw-r--r--Cargo.lock462
-rw-r--r--Cargo.nix686
-rw-r--r--Cargo.toml15
-rw-r--r--flake.lock30
-rw-r--r--flake.nix4
-rw-r--r--src/imap/capability.rs4
-rw-r--r--src/imap/command/authenticated.rs22
-rw-r--r--src/imap/command/selected.rs17
-rw-r--r--src/imap/flow.rs11
-rw-r--r--src/imap/mailbox_view.rs131
-rw-r--r--src/imap/mime_view.rs12
-rw-r--r--src/imap/mod.rs189
-rw-r--r--src/imap/request.rs4
-rw-r--r--src/imap/response.rs3
-rw-r--r--src/imap/search.rs25
-rw-r--r--src/imap/session.rs52
-rw-r--r--src/login/ldap_provider.rs7
-rw-r--r--src/login/static_provider.rs6
-rw-r--r--src/mail/mailbox.rs2
-rw-r--r--src/mail/query.rs91
-rw-r--r--src/storage/garage.rs74
-rw-r--r--tests/behavior.rs2
-rw-r--r--tests/common/fragments.rs3
-rw-r--r--tests/emails/.gitattributes1
-rw-r--r--tests/emails/.gitignore1
-rw-r--r--tests/emails/aero100.mbox.zstd3
-rw-r--r--tests/emails/imap_commands_dataset.log240
-rw-r--r--tests/emails/imap_commands_summary.csv45
-rw-r--r--tests/emails/mailbox_email_sizes.csv2428
-rw-r--r--tests/emails/report.R14
30 files changed, 3803 insertions, 781 deletions
diff --git a/Cargo.lock b/Cargo.lock
index c37165a..a50d101 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -28,13 +28,15 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aerogramme"
-version = "0.2.1"
+version = "0.2.2"
dependencies = [
"anyhow",
"argon2",
"async-trait",
"aws-config",
"aws-sdk-s3",
+ "aws-smithy-runtime",
+ "aws-smithy-runtime-api",
"backtrace",
"base64 0.21.7",
"chrono",
@@ -44,7 +46,8 @@ dependencies = [
"eml-codec",
"futures",
"hex",
- "hyper-rustls",
+ "hyper-rustls 0.26.0",
+ "hyper-util",
"im",
"imap-codec",
"imap-flow",
@@ -455,28 +458,27 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "aws-config"
-version = "1.1.2"
+version = "1.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e64b72d4bdbb41a73d27709c65a25b6e4bfc8321bf70fa3a8b19ce7d4eb81b0"
+checksum = "3182c19847238b50b62ae0383a6dbfc14514e552eb5e307e1ea83ccf5840b8a6"
dependencies = [
"aws-credential-types",
- "aws-http",
"aws-runtime",
"aws-sdk-sso",
"aws-sdk-ssooidc",
"aws-sdk-sts",
"aws-smithy-async",
- "aws-smithy-http 0.60.3",
+ "aws-smithy-http",
"aws-smithy-json",
"aws-smithy-runtime",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"aws-types",
"bytes",
"fastrand 2.0.1",
"hex",
- "http",
- "hyper",
+ "http 0.2.11",
+ "hyper 0.14.28",
"ring 0.17.7",
"time",
"tokio",
@@ -486,77 +488,84 @@ dependencies = [
[[package]]
name = "aws-credential-types"
-version = "1.1.2"
+version = "1.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a7cb3510b95492bd9014b60e2e3bee3e48bc516e220316f8e6b60df18b47331"
+checksum = "e5635d8707f265c773282a22abe1ecd4fbe96a8eb2f0f14c0796f8016f11a41a"
dependencies = [
"aws-smithy-async",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"zeroize",
]
[[package]]
-name = "aws-http"
-version = "0.60.2"
+name = "aws-runtime"
+version = "1.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a95d41abe4e941399fdb4bc2f54713eac3c839d98151875948bb24e66ab658f2"
+checksum = "6f82b9ae2adfd9d6582440d0eeb394c07f74d21b4c0cc72bdb73735c9e1a9c0e"
dependencies = [
+ "aws-credential-types",
+ "aws-sigv4",
+ "aws-smithy-async",
+ "aws-smithy-eventstream",
+ "aws-smithy-http",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"aws-types",
"bytes",
- "http",
- "http-body",
+ "fastrand 2.0.1",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "percent-encoding",
"pin-project-lite 0.2.13",
"tracing",
+ "uuid",
]
[[package]]
-name = "aws-runtime"
-version = "1.1.2"
+name = "aws-sdk-config"
+version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "233cca219c6705d525ace011d6f9bc51aaf32fce5b4c41661d2d7ff22d9b4d49"
+checksum = "0cb71960e3e197c3f512f3bf0f47f444acd708db59733416107ec2ff161ff5c4"
dependencies = [
"aws-credential-types",
- "aws-http",
- "aws-sigv4 1.1.2",
+ "aws-runtime",
"aws-smithy-async",
- "aws-smithy-eventstream",
- "aws-smithy-http 0.60.3",
+ "aws-smithy-http",
+ "aws-smithy-json",
+ "aws-smithy-runtime",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"aws-types",
- "fastrand 2.0.1",
- "http",
- "percent-encoding",
+ "bytes",
+ "http 0.2.11",
+ "once_cell",
+ "regex-lite",
"tracing",
- "uuid",
]
[[package]]
name = "aws-sdk-s3"
-version = "1.12.0"
+version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634fbe5b6591ee2e281cd2ba8641e9bd752dbf5bf338924d6ad4bd5a3304fe31"
+checksum = "5076637347e7d0218e61facae853110682ae58efabd2f4e2a9e530c203d5fa7b"
dependencies = [
"aws-credential-types",
- "aws-http",
"aws-runtime",
- "aws-sigv4 1.1.2",
+ "aws-sigv4",
"aws-smithy-async",
"aws-smithy-checksums",
"aws-smithy-eventstream",
- "aws-smithy-http 0.60.3",
+ "aws-smithy-http",
"aws-smithy-json",
"aws-smithy-runtime",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"aws-smithy-xml",
"aws-types",
"bytes",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.6",
"once_cell",
"percent-encoding",
"regex-lite",
@@ -566,22 +575,21 @@ dependencies = [
[[package]]
name = "aws-sdk-sso"
-version = "1.10.0"
+version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee41005e0f3a19ae749c7953d9e1f1ef8d2183f76f64966e346fa41c1ba0ed44"
+checksum = "ca7e8097448832fcd22faf6bb227e97d76b40e354509d1307653a885811c7151"
dependencies = [
"aws-credential-types",
- "aws-http",
"aws-runtime",
"aws-smithy-async",
- "aws-smithy-http 0.60.3",
+ "aws-smithy-http",
"aws-smithy-json",
"aws-smithy-runtime",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"aws-types",
"bytes",
- "http",
+ "http 0.2.11",
"once_cell",
"regex-lite",
"tracing",
@@ -589,22 +597,21 @@ dependencies = [
[[package]]
name = "aws-sdk-ssooidc"
-version = "1.10.0"
+version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa08168f8a27505e7b90f922c32a489feb1f2133878981a15138bebc849ac09c"
+checksum = "a75073590e23d63044606771afae309fada8eb10ded54a1ce4598347221d3fef"
dependencies = [
"aws-credential-types",
- "aws-http",
"aws-runtime",
"aws-smithy-async",
- "aws-smithy-http 0.60.3",
+ "aws-smithy-http",
"aws-smithy-json",
"aws-smithy-runtime",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"aws-types",
"bytes",
- "http",
+ "http 0.2.11",
"once_cell",
"regex-lite",
"tracing",
@@ -612,23 +619,22 @@ dependencies = [
[[package]]
name = "aws-sdk-sts"
-version = "1.10.0"
+version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29102eff04d50ef70f11a48823db33e33c6cc5f027bfb6ff4864efbd5f1f66f3"
+checksum = "650e4aaae41547151dea4d8142f7ffcc8ab8ba76d5dccc8933936ef2102c3356"
dependencies = [
"aws-credential-types",
- "aws-http",
"aws-runtime",
"aws-smithy-async",
- "aws-smithy-http 0.60.3",
+ "aws-smithy-http",
"aws-smithy-json",
"aws-smithy-query",
"aws-smithy-runtime",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"aws-smithy-xml",
"aws-types",
- "http",
+ "http 0.2.11",
"once_cell",
"regex-lite",
"tracing",
@@ -636,40 +642,22 @@ dependencies = [
[[package]]
name = "aws-sigv4"
-version = "0.55.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c"
-dependencies = [
- "aws-smithy-http 0.55.3",
- "form_urlencoded",
- "hex",
- "hmac",
- "http",
- "once_cell",
- "percent-encoding",
- "regex",
- "sha2",
- "time",
- "tracing",
-]
-
-[[package]]
-name = "aws-sigv4"
-version = "1.1.2"
+version = "1.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b92384b39aedb258aa734fe0e7b2ffcd13f33e68227251a72cd2635e0acc8f1a"
+checksum = "404c64a104188ac70dd1684718765cb5559795458e446480e41984e68e57d888"
dependencies = [
"aws-credential-types",
"aws-smithy-eventstream",
- "aws-smithy-http 0.60.3",
+ "aws-smithy-http",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"bytes",
"crypto-bigint 0.5.5",
"form_urlencoded",
"hex",
"hmac",
- "http",
+ "http 0.2.11",
+ "http 1.0.0",
"once_cell",
"p256",
"percent-encoding",
@@ -683,9 +671,9 @@ dependencies = [
[[package]]
name = "aws-smithy-async"
-version = "1.1.3"
+version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2eac0bb78e9e2765699999a02d7bfb4e6ad8f13e0962ebb9f5202b1d8cd76006"
+checksum = "fcf7f09a27286d84315dfb9346208abb3b0973a692454ae6d0bc8d803fcce3b4"
dependencies = [
"futures-util",
"pin-project-lite 0.2.13",
@@ -694,18 +682,18 @@ dependencies = [
[[package]]
name = "aws-smithy-checksums"
-version = "0.60.3"
+version = "0.60.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "535a2d5f1e459bc7709580a77152c8d493982db083236c2b1d1c51dc6217e8a3"
+checksum = "0fd4b66f2a8e7c84d7e97bda2666273d41d2a2e25302605bcf906b7b2661ae5e"
dependencies = [
- "aws-smithy-http 0.60.3",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-http",
+ "aws-smithy-types",
"bytes",
"crc32c",
"crc32fast",
"hex",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.6",
"md-5",
"pin-project-lite 0.2.13",
"sha1",
@@ -715,49 +703,29 @@ dependencies = [
[[package]]
name = "aws-smithy-eventstream"
-version = "0.60.3"
+version = "0.60.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "682371561562d08ab437766903c6bc28f4f95d7ab2ecfb389bda7849dd98aefe"
+checksum = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858"
dependencies = [
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"bytes",
"crc32fast",
]
[[package]]
name = "aws-smithy-http"
-version = "0.55.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28"
-dependencies = [
- "aws-smithy-types 0.55.3",
- "bytes",
- "bytes-utils",
- "futures-core",
- "http",
- "http-body",
- "hyper",
- "once_cell",
- "percent-encoding",
- "pin-project-lite 0.2.13",
- "pin-utils",
- "tracing",
-]
-
-[[package]]
-name = "aws-smithy-http"
-version = "0.60.3"
+version = "0.60.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "365ca49744b2bda2f1e2dc03b856da3fa5a28ca5b0a41e41d7ff5305a8fae190"
+checksum = "b6ca214a6a26f1b7ebd63aa8d4f5e2194095643023f9608edf99a58247b9d80d"
dependencies = [
"aws-smithy-eventstream",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"bytes",
"bytes-utils",
"futures-core",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.6",
"once_cell",
"percent-encoding",
"pin-project-lite 0.2.13",
@@ -767,40 +735,40 @@ dependencies = [
[[package]]
name = "aws-smithy-json"
-version = "0.60.3"
+version = "0.60.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "733ccdb727ac63370836aa3b3c483d75ad2ef7bc6507db3efe1d01e8d2e50367"
+checksum = "1af80ecf3057fb25fe38d1687e94c4601a7817c6a1e87c1b0635f7ecb644ace5"
dependencies = [
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
]
[[package]]
name = "aws-smithy-query"
-version = "0.60.3"
+version = "0.60.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aff02ae2ee7968bbce2983ffb5ce529d24f4848532300f398347bde8c2196974"
+checksum = "eb27084f72ea5fc20033efe180618677ff4a2f474b53d84695cfe310a6526cbc"
dependencies = [
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"urlencoding",
]
[[package]]
name = "aws-smithy-runtime"
-version = "1.1.3"
+version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ab9cb6fee50680af8ceaa293ae79eba32095ca117161cb323f9ee30dd87d139"
+checksum = "fbb5fca54a532a36ff927fbd7407a7c8eb9c3b4faf72792ba2965ea2cad8ed55"
dependencies = [
"aws-smithy-async",
- "aws-smithy-http 0.60.3",
+ "aws-smithy-http",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"bytes",
"fastrand 2.0.1",
- "h2",
- "http",
- "http-body",
- "hyper",
- "hyper-rustls",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "hyper 0.14.28",
+ "hyper-rustls 0.24.2",
"once_cell",
"pin-project-lite 0.2.13",
"pin-utils",
@@ -811,14 +779,15 @@ dependencies = [
[[package]]
name = "aws-smithy-runtime-api"
-version = "1.1.3"
+version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02ca2da7619517310bfead6d18abcdde90f1439224d887d608503cfacff46dff"
+checksum = "22389cb6f7cac64f266fb9f137745a9349ced7b47e0d2ba503e9e40ede4f7060"
dependencies = [
"aws-smithy-async",
- "aws-smithy-types 1.1.3",
+ "aws-smithy-types",
"bytes",
- "http",
+ "http 0.2.11",
+ "http 1.0.0",
"pin-project-lite 0.2.13",
"tokio",
"tracing",
@@ -827,29 +796,16 @@ dependencies = [
[[package]]
name = "aws-smithy-types"
-version = "0.55.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8"
-dependencies = [
- "base64-simd",
- "itoa",
- "num-integer",
- "ryu",
- "time",
-]
-
-[[package]]
-name = "aws-smithy-types"
-version = "1.1.3"
+version = "1.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d4bb944488536cd2fef43212d829bc7e9a8bfc4afa079d21170441e7be8d2d0"
+checksum = "f081da5481210523d44ffd83d9f0740320050054006c719eae0232d411f024d3"
dependencies = [
"base64-simd",
"bytes",
"bytes-utils",
"futures-core",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.6",
"itoa",
"num-integer",
"pin-project-lite 0.2.13",
@@ -863,24 +819,24 @@ dependencies = [
[[package]]
name = "aws-smithy-xml"
-version = "0.60.3"
+version = "0.60.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef796feaf894d7fd03869235237aeffe73ed1b29a3927cceeee2eecadf876eba"
+checksum = "0fccd8f595d0ca839f9f2548e66b99514a85f92feb4c01cf2868d93eb4888a42"
dependencies = [
"xmlparser",
]
[[package]]
name = "aws-types"
-version = "1.1.2"
+version = "1.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8549aa62c5b7db5c57ab915200ee214b4f5d8f19b29a4a8fa0b3ad3bca1380e3"
+checksum = "8fbb5d48aae496f628e7aa2e41991dd4074f606d9e3ade1ce1059f293d40f9a2"
dependencies = [
"aws-credential-types",
"aws-smithy-async",
"aws-smithy-runtime-api",
- "aws-smithy-types 1.1.3",
- "http",
+ "aws-smithy-types",
+ "http 0.2.11",
"rustc_version",
"tracing",
]
@@ -896,9 +852,9 @@ dependencies = [
"bitflags 1.3.2",
"bytes",
"futures-util",
- "http",
- "http-body",
- "hyper",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "hyper 0.14.28",
"itoa",
"matchit",
"memchr",
@@ -922,8 +878,8 @@ dependencies = [
"async-trait",
"bytes",
"futures-util",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.6",
"mime",
"rustversion",
"tower-layer",
@@ -1242,9 +1198,9 @@ dependencies = [
[[package]]
name = "crc32c"
-version = "0.6.4"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74"
+checksum = "89254598aa9b9fa608de44b3ae54c810f0f06d755e24c50177f1f8f31ff50ce2"
dependencies = [
"rustc_version",
]
@@ -1743,7 +1699,26 @@ dependencies = [
"futures-core",
"futures-sink",
"futures-util",
- "http",
+ "http 0.2.11",
+ "indexmap 2.1.0",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "h2"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http 1.0.0",
"indexmap 2.1.0",
"slab",
"tokio",
@@ -1824,13 +1799,47 @@ dependencies = [
]
[[package]]
+name = "http"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
name = "http-body"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
dependencies = [
"bytes",
- "http",
+ "http 0.2.11",
+ "pin-project-lite 0.2.13",
+]
+
+[[package]]
+name = "http-body"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
+dependencies = [
+ "bytes",
+ "http 1.0.0",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"
+dependencies = [
+ "bytes",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
"pin-project-lite 0.2.13",
]
@@ -1862,9 +1871,9 @@ dependencies = [
"futures-channel",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.6",
"httparse",
"httpdate",
"itoa",
@@ -1877,34 +1886,94 @@ dependencies = [
]
[[package]]
+name = "hyper"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "h2 0.4.2",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite 0.2.13",
+ "smallvec",
+ "tokio",
+ "want",
+]
+
+[[package]]
name = "hyper-rustls"
version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
dependencies = [
"futures-util",
- "http",
- "hyper",
+ "http 0.2.11",
+ "hyper 0.14.28",
"log",
"rustls 0.21.10",
- "rustls-native-certs",
+ "rustls-native-certs 0.6.3",
"tokio",
"tokio-rustls 0.24.1",
]
[[package]]
+name = "hyper-rustls"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c"
+dependencies = [
+ "futures-util",
+ "http 1.0.0",
+ "hyper 1.2.0",
+ "hyper-util",
+ "log",
+ "rustls 0.22.2",
+ "rustls-native-certs 0.7.0",
+ "rustls-pki-types",
+ "tokio",
+ "tokio-rustls 0.25.0",
+ "tower-service",
+]
+
+[[package]]
name = "hyper-timeout"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
dependencies = [
- "hyper",
+ "hyper 0.14.28",
"pin-project-lite 0.2.13",
"tokio",
"tokio-io-timeout",
]
[[package]]
+name = "hyper-util"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "hyper 1.2.0",
+ "pin-project-lite 0.2.13",
+ "socket2 0.5.5",
+ "tokio",
+ "tower",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
name = "iana-time-zone"
version = "0.1.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1965,7 +2034,7 @@ dependencies = [
[[package]]
name = "imap-codec"
version = "2.0.0"
-source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#0adcc244282c64cc7874ffa9cd22e4a451ee19f8"
+source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#d8a5afc03fb771232e94c73af6a05e79dc80bbed"
dependencies = [
"abnf-core",
"base64 0.21.7",
@@ -1980,19 +2049,21 @@ dependencies = [
[[package]]
name = "imap-flow"
version = "0.1.0"
-source = "git+https://github.com/superboum/imap-flow.git?branch=custom/aerogramme#60ff9e082ccfcd10a042b616d8038a578fa0c8ff"
+source = "git+https://github.com/duesee/imap-flow.git?branch=main#68c1da5d1c56dbe543d9736de9683259d1d28191"
dependencies = [
"bounded-static",
"bytes",
"imap-codec",
+ "imap-types",
"thiserror",
"tokio",
+ "tracing",
]
[[package]]
name = "imap-types"
version = "2.0.0"
-source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#0adcc244282c64cc7874ffa9cd22e4a451ee19f8"
+source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#d8a5afc03fb771232e94c73af6a05e79dc80bbed"
dependencies = [
"base64 0.21.7",
"bounded-static",
@@ -2076,14 +2147,17 @@ dependencies = [
[[package]]
name = "k2v-client"
version = "0.0.4"
-source = "git+https://git.deuxfleurs.fr/Deuxfleurs/garage.git?tag=v0.9.1#ee57dd922b9c396298473b41e4046c8d00ee77d5"
+source = "git+https://git.deuxfleurs.fr/Deuxfleurs/garage.git?branch=k2v/shared_http_client#8b35a946d9f6b31b26b9783acbfab984316051f4"
dependencies = [
- "aws-sigv4 0.55.3",
+ "aws-sdk-config",
+ "aws-sigv4",
"base64 0.21.7",
"hex",
- "http",
- "hyper",
- "hyper-rustls",
+ "http 1.0.0",
+ "http-body-util",
+ "hyper 1.2.0",
+ "hyper-rustls 0.26.0",
+ "hyper-util",
"log",
"percent-encoding",
"serde",
@@ -2136,7 +2210,7 @@ dependencies = [
"percent-encoding",
"ring 0.16.20",
"rustls 0.20.9",
- "rustls-native-certs",
+ "rustls-native-certs 0.6.3",
"thiserror",
"tokio",
"tokio-rustls 0.23.4",
@@ -2906,6 +2980,19 @@ dependencies = [
]
[[package]]
+name = "rustls-native-certs"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792"
+dependencies = [
+ "openssl-probe",
+ "rustls-pemfile 2.0.0",
+ "rustls-pki-types",
+ "schannel",
+ "security-framework",
+]
+
+[[package]]
name = "rustls-pemfile"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3520,10 +3607,10 @@ dependencies = [
"axum",
"base64 0.21.7",
"bytes",
- "h2",
- "http",
- "http-body",
- "hyper",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "hyper 0.14.28",
"hyper-timeout",
"percent-encoding",
"pin-project",
@@ -3574,6 +3661,7 @@ version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
dependencies = [
+ "log",
"pin-project-lite 0.2.13",
"tracing-attributes",
"tracing-core",
diff --git a/Cargo.nix b/Cargo.nix
index 3a77fae..7c184ab 100644
--- a/Cargo.nix
+++ b/Cargo.nix
@@ -23,7 +23,7 @@ args@{
ignoreLockHash,
}:
let
- nixifiedLockHash = "92030f2aa1c723f2d8dc8fb6d98a261fbc7ba40c61a6426fa0b55448dd0d3ad1";
+ nixifiedLockHash = "1636bcbca38619e40eeddcb9e9c0af1240654ca176fe1a6fb3444b21526b53c2";
workspaceSrc = if args.workspaceSrc == null then ./. else args.workspaceSrc;
currentLockHash = builtins.hashFile "sha256" (workspaceSrc + /Cargo.lock);
lockHashIgnored = if ignoreLockHash
@@ -45,7 +45,7 @@ in
{
cargo2nixVersion = "0.11.0";
workspace = {
- aerogramme = rustPackages.unknown.aerogramme."0.2.1";
+ aerogramme = rustPackages.unknown.aerogramme."0.2.2";
};
"registry+https://github.com/rust-lang/crates.io-index".abnf-core."0.6.0" = overridableMkRustCrate (profileName: rec {
name = "abnf-core";
@@ -74,17 +74,19 @@ in
src = fetchCratesIo { inherit name version; sha256 = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"; };
});
- "unknown".aerogramme."0.2.1" = overridableMkRustCrate (profileName: rec {
+ "unknown".aerogramme."0.2.2" = overridableMkRustCrate (profileName: rec {
name = "aerogramme";
- version = "0.2.1";
+ version = "0.2.2";
registry = "unknown";
src = fetchCrateLocal workspaceSrc;
dependencies = {
anyhow = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anyhow."1.0.79" { inherit profileName; }).out;
argon2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".argon2."0.5.2" { inherit profileName; }).out;
async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
- aws_config = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-config."1.1.2" { inherit profileName; }).out;
- aws_sdk_s3 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."1.12.0" { inherit profileName; }).out;
+ aws_config = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-config."1.1.6" { inherit profileName; }).out;
+ aws_sdk_s3 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."1.16.0" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
backtrace = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".backtrace."0.3.69" { inherit profileName; }).out;
base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.31" { inherit profileName; }).out;
@@ -94,10 +96,11 @@ in
eml_codec = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".eml-codec."0.1.2" { inherit profileName; }).out;
futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
- hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" { inherit profileName; }).out;
+ hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.26.0" { inherit profileName; }).out;
+ hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out;
im = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".im."15.1.0" { inherit profileName; }).out;
imap_codec = (rustPackages."git+https://github.com/superboum/imap-codec".imap-codec."2.0.0" { inherit profileName; }).out;
- imap_flow = (rustPackages."git+https://github.com/superboum/imap-flow.git".imap-flow."0.1.0" { inherit profileName; }).out;
+ imap_flow = (rustPackages."git+https://github.com/duesee/imap-flow.git".imap-flow."0.1.0" { inherit profileName; }).out;
itertools = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itertools."0.10.5" { inherit profileName; }).out;
k2v_client = (rustPackages."git+https://git.deuxfleurs.fr/Deuxfleurs/garage.git".k2v-client."0.0.4" { inherit profileName; }).out;
lazy_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out;
@@ -612,11 +615,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-config."1.1.2" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-config."1.1.6" = overridableMkRustCrate (profileName: rec {
name = "aws-config";
- version = "1.1.2";
+ version = "1.1.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "7e64b72d4bdbb41a73d27709c65a25b6e4bfc8321bf70fa3a8b19ce7d4eb81b0"; };
+ src = fetchCratesIo { inherit name version; sha256 = "3182c19847238b50b62ae0383a6dbfc14514e552eb5e307e1ea83ccf5840b8a6"; };
features = builtins.concatLists [
[ "behavior-version-latest" ]
[ "client-hyper" ]
@@ -627,19 +630,18 @@ in
[ "sso" ]
];
dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out;
- aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out;
- aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" { inherit profileName; }).out;
- aws_sdk_sso = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."1.10.0" { inherit profileName; }).out;
- aws_sdk_ssooidc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-ssooidc."1.10.0" { inherit profileName; }).out;
- aws_sdk_sts = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."1.10.0" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out;
- aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" { inherit profileName; }).out;
- aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out;
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out;
+ aws_sdk_sso = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."1.14.0" { inherit profileName; }).out;
+ aws_sdk_ssooidc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-ssooidc."1.14.0" { inherit profileName; }).out;
+ aws_sdk_sts = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."1.14.0" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
@@ -653,71 +655,85 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" = overridableMkRustCrate (profileName: rec {
name = "aws-credential-types";
- version = "1.1.2";
+ version = "1.1.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "4a7cb3510b95492bd9014b60e2e3bee3e48bc516e220316f8e6b60df18b47331"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e5635d8707f265c773282a22abe1ecd4fbe96a8eb2f0f14c0796f8016f11a41a"; };
features = builtins.concatLists [
[ "test-util" ]
];
dependencies = {
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" = overridableMkRustCrate (profileName: rec {
- name = "aws-http";
- version = "0.60.2";
+ "registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" = overridableMkRustCrate (profileName: rec {
+ name = "aws-runtime";
+ version = "1.1.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "a95d41abe4e941399fdb4bc2f54713eac3c839d98151875948bb24e66ab658f2"; };
+ src = fetchCratesIo { inherit name version; sha256 = "6f82b9ae2adfd9d6582440d0eeb394c07f74d21b4c0cc72bdb73735c9e1a9c0e"; };
+ features = builtins.concatLists [
+ [ "event-stream" ]
+ [ "http-02x" ]
+ [ "sigv4a" ]
+ ];
dependencies = {
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out;
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out;
+ aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.6" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out;
http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ uuid = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".uuid."1.7.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" = overridableMkRustCrate (profileName: rec {
- name = "aws-runtime";
- version = "1.1.2";
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-config."1.15.0" = overridableMkRustCrate (profileName: rec {
+ name = "aws-sdk-config";
+ version = "1.15.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "233cca219c6705d525ace011d6f9bc51aaf32fce5b4c41661d2d7ff22d9b4d49"; };
+ src = fetchCratesIo { inherit name version; sha256 = "0cb71960e3e197c3f512f3bf0f47f444acd708db59733416107ec2ff161ff5c4"; };
features = builtins.concatLists [
- [ "event-stream" ]
- [ "sigv4a" ]
+ [ "default" ]
+ [ "rt-tokio" ]
+ [ "rustls" ]
];
dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out;
- aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out;
- aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.2" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out;
- aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out;
- fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out;
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ regex_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-lite."0.1.5" { inherit profileName; }).out;
tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
- uuid = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".uuid."1.7.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."1.12.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."1.16.0" = overridableMkRustCrate (profileName: rec {
name = "aws-sdk-s3";
- version = "1.12.0";
+ version = "1.16.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "634fbe5b6591ee2e281cd2ba8641e9bd752dbf5bf338924d6ad4bd5a3304fe31"; };
+ src = fetchCratesIo { inherit name version; sha256 = "5076637347e7d0218e61facae853110682ae58efabd2f4e2a9e530c203d5fa7b"; };
features = builtins.concatLists [
[ "default" ]
[ "rt-tokio" ]
@@ -725,20 +741,19 @@ in
[ "sigv4a" ]
];
dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out;
- aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out;
- aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" { inherit profileName; }).out;
- aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.2" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out;
- aws_smithy_checksums = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.60.3" { inherit profileName; }).out;
- aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out;
- aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" { inherit profileName; }).out;
- aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
- aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out;
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out;
+ aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.6" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_checksums = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.60.6" { inherit profileName; }).out;
+ aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
+ aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.6" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
@@ -750,22 +765,21 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."1.10.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."1.14.0" = overridableMkRustCrate (profileName: rec {
name = "aws-sdk-sso";
- version = "1.10.0";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "ee41005e0f3a19ae749c7953d9e1f1ef8d2183f76f64966e346fa41c1ba0ed44"; };
- dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out;
- aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out;
- aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out;
- aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" { inherit profileName; }).out;
- aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out;
+ version = "1.14.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "ca7e8097448832fcd22faf6bb227e97d76b40e354509d1307653a885811c7151"; };
+ dependencies = {
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
@@ -774,22 +788,21 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-ssooidc."1.10.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-ssooidc."1.14.0" = overridableMkRustCrate (profileName: rec {
name = "aws-sdk-ssooidc";
- version = "1.10.0";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "fa08168f8a27505e7b90f922c32a489feb1f2133878981a15138bebc849ac09c"; };
- dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out;
- aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out;
- aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out;
- aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" { inherit profileName; }).out;
- aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out;
+ version = "1.14.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "a75073590e23d63044606771afae309fada8eb10ded54a1ce4598347221d3fef"; };
+ dependencies = {
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
@@ -798,24 +811,23 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."1.10.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."1.14.0" = overridableMkRustCrate (profileName: rec {
name = "aws-sdk-sts";
- version = "1.10.0";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "29102eff04d50ef70f11a48823db33e33c6cc5f027bfb6ff4864efbd5f1f66f3"; };
- dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out;
- aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.60.2" { inherit profileName; }).out;
- aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.2" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out;
- aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" { inherit profileName; }).out;
- aws_smithy_query = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.60.3" { inherit profileName; }).out;
- aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
- aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" { inherit profileName; }).out;
+ version = "1.14.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "650e4aaae41547151dea4d8142f7ffcc8ab8ba76d5dccc8933936ef2102c3356"; };
+ dependencies = {
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.6" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" { inherit profileName; }).out;
+ aws_smithy_query = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.60.6" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
+ aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.6" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" { inherit profileName; }).out;
http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
regex_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-lite."0.1.5" { inherit profileName; }).out;
@@ -823,57 +835,32 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."0.55.3" = overridableMkRustCrate (profileName: rec {
- name = "aws-sigv4";
- version = "0.55.3";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c"; };
- features = builtins.concatLists [
- [ "default" ]
- [ "form_urlencoded" ]
- [ "http" ]
- [ "percent-encoding" ]
- [ "sign-http" ]
- ];
- dependencies = {
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- form_urlencoded = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.1" { inherit profileName; }).out;
- hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
- hmac = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hmac."0.12.1" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
- once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
- regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.10.2" { inherit profileName; }).out;
- sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" { inherit profileName; }).out;
- time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.3.31" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.2" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.6" = overridableMkRustCrate (profileName: rec {
name = "aws-sigv4";
- version = "1.1.2";
+ version = "1.1.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "b92384b39aedb258aa734fe0e7b2ffcd13f33e68227251a72cd2635e0acc8f1a"; };
+ src = fetchCratesIo { inherit name version; sha256 = "404c64a104188ac70dd1684718765cb5559795458e446480e41984e68e57d888"; };
features = builtins.concatLists [
[ "default" ]
[ "http0-compat" ]
+ [ "http1" ]
[ "sign-eventstream" ]
[ "sign-http" ]
[ "sigv4a" ]
];
dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out;
- aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out;
+ aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
crypto_bigint = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crypto-bigint."0.5.5" { inherit profileName; }).out;
form_urlencoded = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.1" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
hmac = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hmac."0.12.1" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http0 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
p256 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".p256."0.11.1" { inherit profileName; }).out;
percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
@@ -886,11 +873,11 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-async";
- version = "1.1.3";
+ version = "1.1.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2eac0bb78e9e2765699999a02d7bfb4e6ad8f13e0962ebb9f5202b1d8cd76006"; };
+ src = fetchCratesIo { inherit name version; sha256 = "fcf7f09a27286d84315dfb9346208abb3b0973a692454ae6d0bc8d803fcce3b4"; };
features = builtins.concatLists [
[ "rt-tokio" ]
];
@@ -901,16 +888,16 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.60.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.60.6" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-checksums";
- version = "0.60.3";
+ version = "0.60.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "535a2d5f1e459bc7709580a77152c8d493982db083236c2b1d1c51dc6217e8a3"; };
+ src = fetchCratesIo { inherit name version; sha256 = "0fd4b66f2a8e7c84d7e97bda2666273d41d2a2e25302605bcf906b7b2661ae5e"; };
dependencies = {
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
- crc32c = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32c."0.6.4" { inherit profileName; }).out;
+ crc32c = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32c."0.6.5" { inherit profileName; }).out;
crc32fast = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32fast."1.3.2" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
@@ -923,52 +910,31 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-eventstream";
- version = "0.60.3";
+ version = "0.60.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "682371561562d08ab437766903c6bc28f4f95d7ab2ecfb389bda7849dd98aefe"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858"; };
dependencies = {
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
crc32fast = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32fast."1.3.2" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-http";
- version = "0.55.3";
+ version = "0.60.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28"; };
- dependencies = {
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
- bytes_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes-utils."0.1.4" { inherit profileName; }).out;
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
- http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out;
- once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
- pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- pin_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" = overridableMkRustCrate (profileName: rec {
- name = "aws-smithy-http";
- version = "0.60.3";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "365ca49744b2bda2f1e2dc03b856da3fa5a28ca5b0a41e41d7ff5305a8fae190"; };
+ src = fetchCratesIo { inherit name version; sha256 = "b6ca214a6a26f1b7ebd63aa8d4f5e2194095643023f9608edf99a58247b9d80d"; };
features = builtins.concatLists [
[ "aws-smithy-eventstream" ]
[ "event-stream" ]
];
dependencies = {
- aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
+ aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
bytes_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes-utils."0.1.4" { inherit profileName; }).out;
futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
@@ -982,32 +948,32 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.6" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-json";
- version = "0.60.3";
+ version = "0.60.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "733ccdb727ac63370836aa3b3c483d75ad2ef7bc6507db3efe1d01e8d2e50367"; };
+ src = fetchCratesIo { inherit name version; sha256 = "1af80ecf3057fb25fe38d1687e94c4601a7817c6a1e87c1b0635f7ecb644ace5"; };
dependencies = {
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.60.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.60.6" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-query";
- version = "0.60.3";
+ version = "0.60.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "aff02ae2ee7968bbce2983ffb5ce529d24f4848532300f398347bde8c2196974"; };
+ src = fetchCratesIo { inherit name version; sha256 = "eb27084f72ea5fc20033efe180618677ff4a2f474b53d84695cfe310a6526cbc"; };
dependencies = {
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
urlencoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".urlencoding."2.1.3" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.7" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-runtime";
- version = "1.1.3";
+ version = "1.1.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "6ab9cb6fee50680af8ceaa293ae79eba32095ca117161cb323f9ee30dd87d139"; };
+ src = fetchCratesIo { inherit name version; sha256 = "fbb5fca54a532a36ff927fbd7407a7c8eb9c3b4faf72792ba2965ea2cad8ed55"; };
features = builtins.concatLists [
[ "client" ]
[ "connector-hyper-0-14-x" ]
@@ -1015,10 +981,10 @@ in
[ "tls-rustls" ]
];
dependencies = {
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.6" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out;
h2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.3.24" { inherit profileName; }).out;
@@ -1035,11 +1001,11 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-runtime-api";
- version = "1.1.3";
+ version = "1.1.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "02ca2da7619517310bfead6d18abcdde90f1439224d887d608503cfacff46dff"; };
+ src = fetchCratesIo { inherit name version; sha256 = "22389cb6f7cac64f266fb9f137745a9349ced7b47e0d2ba503e9e40ede4f7060"; };
features = builtins.concatLists [
[ "client" ]
[ "default" ]
@@ -1047,10 +1013,11 @@ in
[ "http-auth" ]
];
dependencies = {
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http1 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out;
tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
@@ -1058,25 +1025,11 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" = overridableMkRustCrate (profileName: rec {
- name = "aws-smithy-types";
- version = "0.55.3";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8"; };
- dependencies = {
- base64_simd = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64-simd."0.8.0" { inherit profileName; }).out;
- itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
- num_integer = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-integer."0.1.45" { inherit profileName; }).out;
- ryu = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.16" { inherit profileName; }).out;
- time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.3.31" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-types";
- version = "1.1.3";
+ version = "1.1.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "5d4bb944488536cd2fef43212d829bc7e9a8bfc4afa079d21170441e7be8d2d0"; };
+ src = fetchCratesIo { inherit name version; sha256 = "f081da5481210523d44ffd83d9f0740320050054006c719eae0232d411f024d3"; };
features = builtins.concatLists [
[ "byte-stream-poll-next" ]
[ "http-body-0-4-x" ]
@@ -1101,26 +1054,26 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.6" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-xml";
- version = "0.60.3";
+ version = "0.60.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "ef796feaf894d7fd03869235237aeffe73ed1b29a3927cceeee2eecadf876eba"; };
+ src = fetchCratesIo { inherit name version; sha256 = "0fccd8f595d0ca839f9f2548e66b99514a85f92feb4c01cf2868d93eb4888a42"; };
dependencies = {
xmlparser = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".xmlparser."0.13.6" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.2" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.6" = overridableMkRustCrate (profileName: rec {
name = "aws-types";
- version = "1.1.2";
+ version = "1.1.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "8549aa62c5b7db5c57ab915200ee214b4f5d8f19b29a4a8fa0b3ad3bca1380e3"; };
+ src = fetchCratesIo { inherit name version; sha256 = "8fbb5d48aae496f628e7aa2e41991dd4074f606d9e3ade1ce1059f293d40f9a2"; };
dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.2" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.3" { inherit profileName; }).out;
- aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.3" { inherit profileName; }).out;
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.6" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.7" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.7" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.7" { inherit profileName; }).out;
http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
@@ -1639,11 +1592,11 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".crc32c."0.6.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".crc32c."0.6.5" = overridableMkRustCrate (profileName: rec {
name = "crc32c";
- version = "0.6.4";
+ version = "0.6.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74"; };
+ src = fetchCratesIo { inherit name version; sha256 = "89254598aa9b9fa608de44b3ae54c810f0f06d755e24c50177f1f8f31ff50ce2"; };
buildDependencies = {
rustc_version = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".rustc_version."0.4.0" { profileName = "__noProfile"; }).out;
};
@@ -2417,6 +2370,26 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".h2."0.4.2" = overridableMkRustCrate (profileName: rec {
+ name = "h2";
+ version = "0.4.2";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943"; };
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ fnv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ indexmap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."2.1.0" { inherit profileName; }).out;
+ slab = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.9" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out;
+ tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.12.3" = overridableMkRustCrate (profileName: rec {
name = "hashbrown";
version = "0.12.3";
@@ -2527,6 +2500,22 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" = overridableMkRustCrate (profileName: rec {
+ name = "http";
+ version = "1.0.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"; };
+ features = builtins.concatLists [
+ [ "default" ]
+ [ "std" ]
+ ];
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ fnv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out;
+ itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" = overridableMkRustCrate (profileName: rec {
name = "http-body";
version = "0.4.6";
@@ -2539,6 +2528,31 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" = overridableMkRustCrate (profileName: rec {
+ name = "http-body";
+ version = "1.0.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"; };
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".http-body-util."0.1.0" = overridableMkRustCrate (profileName: rec {
+ name = "http-body-util";
+ version = "0.1.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"; };
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" { inherit profileName; }).out;
+ pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".httparse."1.8.0" = overridableMkRustCrate (profileName: rec {
name = "httparse";
version = "1.8.0";
@@ -2602,6 +2616,35 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".hyper."1.2.0" = overridableMkRustCrate (profileName: rec {
+ name = "hyper";
+ version = "1.2.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a"; };
+ features = builtins.concatLists [
+ [ "client" ]
+ [ "default" ]
+ [ "http1" ]
+ [ "http2" ]
+ [ "server" ]
+ ];
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ h2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.4.2" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" { inherit profileName; }).out;
+ httparse = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httparse."1.8.0" { inherit profileName; }).out;
+ httpdate = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httpdate."1.0.3" { inherit profileName; }).out;
+ itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
+ pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
+ smallvec = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.13.1" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out;
+ want = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".want."0.3.1" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" = overridableMkRustCrate (profileName: rec {
name = "hyper-rustls";
version = "0.24.2";
@@ -2631,6 +2674,37 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.26.0" = overridableMkRustCrate (profileName: rec {
+ name = "hyper-rustls";
+ version = "0.26.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c"; };
+ features = builtins.concatLists [
+ [ "default" ]
+ [ "http1" ]
+ [ "http2" ]
+ [ "log" ]
+ [ "logging" ]
+ [ "native-tokio" ]
+ [ "ring" ]
+ [ "rustls-native-certs" ]
+ [ "tls12" ]
+ ];
+ dependencies = {
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.2.0" { inherit profileName; }).out;
+ hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out;
+ log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
+ rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.22.2" { inherit profileName; }).out;
+ rustls_native_certs = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-native-certs."0.7.0" { inherit profileName; }).out;
+ pki_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.1.0" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out;
+ tokio_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.25.0" { inherit profileName; }).out;
+ tower_service = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".hyper-timeout."0.4.1" = overridableMkRustCrate (profileName: rec {
name = "hyper-timeout";
version = "0.4.1";
@@ -2644,6 +2718,39 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" = overridableMkRustCrate (profileName: rec {
+ name = "hyper-util";
+ version = "0.1.3";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa"; };
+ features = builtins.concatLists [
+ [ "client" ]
+ [ "client-legacy" ]
+ [ "default" ]
+ [ "full" ]
+ [ "http1" ]
+ [ "http2" ]
+ [ "server" ]
+ [ "server-auto" ]
+ [ "service" ]
+ [ "tokio" ]
+ ];
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.2.0" { inherit profileName; }).out;
+ pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
+ socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.5" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out;
+ tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out;
+ tower_service = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".iana-time-zone."0.1.59" = overridableMkRustCrate (profileName: rec {
name = "iana-time-zone";
version = "0.1.59";
@@ -2725,7 +2832,7 @@ in
url = https://github.com/superboum/imap-codec;
name = "imap-codec";
version = "2.0.0";
- rev = "0adcc244282c64cc7874ffa9cd22e4a451ee19f8";
+ rev = "d8a5afc03fb771232e94c73af6a05e79dc80bbed";
ref = "custom/aerogramme";};
features = builtins.concatLists [
[ "bounded-static" ]
@@ -2747,22 +2854,24 @@ in
};
});
- "git+https://github.com/superboum/imap-flow.git".imap-flow."0.1.0" = overridableMkRustCrate (profileName: rec {
+ "git+https://github.com/duesee/imap-flow.git".imap-flow."0.1.0" = overridableMkRustCrate (profileName: rec {
name = "imap-flow";
version = "0.1.0";
- registry = "git+https://github.com/superboum/imap-flow.git";
+ registry = "git+https://github.com/duesee/imap-flow.git";
src = fetchCrateGit {
- url = https://github.com/superboum/imap-flow.git;
+ url = https://github.com/duesee/imap-flow.git;
name = "imap-flow";
version = "0.1.0";
- rev = "60ff9e082ccfcd10a042b616d8038a578fa0c8ff";
- ref = "custom/aerogramme";};
+ rev = "68c1da5d1c56dbe543d9736de9683259d1d28191";
+ ref = "main";};
dependencies = {
bounded_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bounded-static."0.5.0" { inherit profileName; }).out;
bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
imap_codec = (rustPackages."git+https://github.com/superboum/imap-codec".imap-codec."2.0.0" { inherit profileName; }).out;
+ imap_types = (rustPackages."git+https://github.com/superboum/imap-codec".imap-types."2.0.0" { inherit profileName; }).out;
thiserror = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.35.1" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
@@ -2774,7 +2883,7 @@ in
url = https://github.com/superboum/imap-codec;
name = "imap-types";
version = "2.0.0";
- rev = "0adcc244282c64cc7874ffa9cd22e4a451ee19f8";
+ rev = "d8a5afc03fb771232e94c73af6a05e79dc80bbed";
ref = "custom/aerogramme";};
features = builtins.concatLists [
[ "bounded-static" ]
@@ -2898,14 +3007,18 @@ in
url = https://git.deuxfleurs.fr/Deuxfleurs/garage.git;
name = "k2v-client";
version = "0.0.4";
- rev = "ee57dd922b9c396298473b41e4046c8d00ee77d5";};
+ rev = "8b35a946d9f6b31b26b9783acbfab984316051f4";
+ ref = "k2v/shared_http_client";};
dependencies = {
- aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."0.55.3" { inherit profileName; }).out;
+ aws_sdk_config = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-config."1.15.0" { inherit profileName; }).out;
+ aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.6" { inherit profileName; }).out;
base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out;
- hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body-util."0.1.0" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.2.0" { inherit profileName; }).out;
+ hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.26.0" { inherit profileName; }).out;
+ hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out;
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.195" { inherit profileName; }).out;
@@ -3793,23 +3906,9 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"; };
features = builtins.concatLists [
- [ "default" ]
- [ "perf" ]
- [ "perf-backtrack" ]
- [ "perf-cache" ]
- [ "perf-dfa" ]
- [ "perf-inline" ]
- [ "perf-literal" ]
- [ "perf-onepass" ]
[ "std" ]
- [ "unicode" ]
- [ "unicode-age" ]
- [ "unicode-bool" ]
[ "unicode-case" ]
- [ "unicode-gencat" ]
[ "unicode-perl" ]
- [ "unicode-script" ]
- [ "unicode-segment" ]
];
dependencies = {
aho_corasick = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aho-corasick."1.1.2" { inherit profileName; }).out;
@@ -3841,26 +3940,13 @@ in
src = fetchCratesIo { inherit name version; sha256 = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"; };
features = builtins.concatLists [
[ "alloc" ]
- [ "dfa-onepass" ]
- [ "hybrid" ]
[ "meta" ]
- [ "nfa-backtrack" ]
[ "nfa-pikevm" ]
[ "nfa-thompson" ]
- [ "perf-inline" ]
- [ "perf-literal" ]
- [ "perf-literal-multisubstring" ]
- [ "perf-literal-substring" ]
[ "std" ]
[ "syntax" ]
- [ "unicode" ]
- [ "unicode-age" ]
- [ "unicode-bool" ]
[ "unicode-case" ]
- [ "unicode-gencat" ]
[ "unicode-perl" ]
- [ "unicode-script" ]
- [ "unicode-segment" ]
[ "unicode-word-boundary" ]
];
dependencies = {
@@ -3906,16 +3992,9 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"; };
features = builtins.concatLists [
- [ "default" ]
[ "std" ]
- [ "unicode" ]
- [ "unicode-age" ]
- [ "unicode-bool" ]
[ "unicode-case" ]
- [ "unicode-gencat" ]
[ "unicode-perl" ]
- [ "unicode-script" ]
- [ "unicode-segment" ]
];
});
@@ -4173,6 +4252,20 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".rustls-native-certs."0.7.0" = overridableMkRustCrate (profileName: rec {
+ name = "rustls-native-certs";
+ version = "0.7.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792"; };
+ dependencies = {
+ ${ if hostPlatform.isUnix && !(hostPlatform.parsed.kernel.name == "darwin") then "openssl_probe" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".openssl-probe."0.1.5" { inherit profileName; }).out;
+ rustls_pemfile = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."2.0.0" { inherit profileName; }).out;
+ pki_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.1.0" { inherit profileName; }).out;
+ ${ if hostPlatform.isWindows then "schannel" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".schannel."0.1.23" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.kernel.name == "darwin" then "security_framework" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".security-framework."2.9.2" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."1.0.4" = overridableMkRustCrate (profileName: rec {
name = "rustls-pemfile";
version = "1.0.4";
@@ -4366,6 +4459,7 @@ in
[ "alloc" ]
[ "default" ]
[ "derive" ]
+ [ "rc" ]
[ "serde_derive" ]
[ "std" ]
];
@@ -4510,6 +4604,10 @@ in
version = "1.13.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"; };
+ features = builtins.concatLists [
+ [ "const_generics" ]
+ [ "const_new" ]
+ ];
});
"registry+https://github.com/rust-lang/crates.io-index".smol."1.3.0" = overridableMkRustCrate (profileName: rec {
@@ -4931,7 +5029,7 @@ in
${ if hostPlatform.isUnix then "signal_hook_registry" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".signal-hook-registry."1.4.1" { inherit profileName; }).out;
socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.5" { inherit profileName; }).out;
tokio_macros = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-macros."2.2.0" { profileName = "__noProfile"; }).out;
- ${ if true then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ ${ if false then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
${ if hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
};
});
@@ -5108,12 +5206,14 @@ in
[ "__common" ]
[ "balance" ]
[ "buffer" ]
+ [ "default" ]
[ "discover" ]
[ "futures-core" ]
[ "futures-util" ]
[ "indexmap" ]
[ "limit" ]
[ "load" ]
+ [ "log" ]
[ "make" ]
[ "pin-project" ]
[ "pin-project-lite" ]
@@ -5164,10 +5264,12 @@ in
features = builtins.concatLists [
[ "attributes" ]
[ "default" ]
+ [ "log" ]
[ "std" ]
[ "tracing-attributes" ]
];
dependencies = {
+ log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
tracing_attributes = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-attributes."0.1.27" { profileName = "__noProfile"; }).out;
tracing_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.32" { inherit profileName; }).out;
diff --git a/Cargo.toml b/Cargo.toml
index 41002fc..7d2e032 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "aerogramme"
-version = "0.2.1"
+version = "0.2.2"
authors = ["Alex Auvolat <alex@adnab.me>", "Quentin Dufour <quentin@dufour.io>"]
edition = "2021"
license = "EUPL-1.2"
@@ -48,23 +48,26 @@ rand = "0.8.5"
rustls = "0.22"
rustls-pemfile = "2.0"
tokio-rustls = "0.25"
-hyper-rustls = { version = "0.24", features = ["http2"] }
+hyper-rustls = { version = "0.26", features = ["http2"] }
+hyper-util = { version = "0.1", features = ["full"] }
rpassword = "7.0"
# login
ldap3 = { version = "0.10", default-features = false, features = ["tls-rustls"] }
# storage
-k2v-client = { git = "https://git.deuxfleurs.fr/Deuxfleurs/garage.git", tag = "v0.9.1" }
-aws-config = { version = "1.1.1", features = ["behavior-version-latest"] }
-aws-sdk-s3 = "1.9.0"
+k2v-client = { git = "https://git.deuxfleurs.fr/Deuxfleurs/garage.git", branch = "k2v/shared_http_client" }
+aws-config = { version = "1", features = ["behavior-version-latest"] }
+aws-sdk-s3 = "1"
+aws-smithy-runtime = "1"
+aws-smithy-runtime-api = "1"
# email protocols
eml-codec = "0.1.2"
smtp-message = { git = "http://github.com/Alexis211/kannader", branch = "feature/lmtp" }
smtp-server = { git = "http://github.com/Alexis211/kannader", branch = "feature/lmtp" }
imap-codec = { version = "2.0.0", features = ["bounded-static", "ext_condstore_qresync"] }
-imap-flow = { git = "https://github.com/superboum/imap-flow.git", branch = "custom/aerogramme" }
+imap-flow = { git = "https://github.com/duesee/imap-flow.git", branch = "main" }
thiserror = "1.0.56"
[dev-dependencies]
diff --git a/flake.lock b/flake.lock
index 374a5d8..2371bdb 100644
--- a/flake.lock
+++ b/flake.lock
@@ -48,11 +48,11 @@
"rust-analyzer-src": "rust-analyzer-src"
},
"locked": {
- "lastModified": 1688484237,
- "narHash": "sha256-qFUn2taHGe203wm7Oio4UGFz1sAiq+kitRexY3sQ1CA=",
+ "lastModified": 1706768574,
+ "narHash": "sha256-4o6TMpzBHO659EiJTzd/EGQGUDdbgwKwhqf3u6b23U8=",
"owner": "nix-community",
"repo": "fenix",
- "rev": "626a9e0a84010728b335f14d3982e11b99af7dc6",
+ "rev": "668102037129923cd0fc239d864fce71eabdc6a3",
"type": "github"
},
"original": {
@@ -116,11 +116,11 @@
"systems": "systems_2"
},
"locked": {
- "lastModified": 1689068808,
- "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=",
+ "lastModified": 1705309234,
+ "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
"owner": "numtide",
"repo": "flake-utils",
- "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4",
+ "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
"type": "github"
},
"original": {
@@ -162,11 +162,11 @@
},
"nixpkgs_3": {
"locked": {
- "lastModified": 1688231357,
- "narHash": "sha256-ZOn16X5jZ6X5ror58gOJAxPfFLAQhZJ6nOUeS4tfFwo=",
+ "lastModified": 1706550542,
+ "narHash": "sha256-UcsnCG6wx++23yeER4Hg18CXWbgNpqNXcHIo5/1Y+hc=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "645ff62e09d294a30de823cb568e9c6d68e92606",
+ "rev": "97b17f32362e475016f942bbdfda4a4a72a8a652",
"type": "github"
},
"original": {
@@ -178,11 +178,11 @@
},
"nixpkgs_4": {
"locked": {
- "lastModified": 1690294827,
- "narHash": "sha256-JV53dEaMM566e+6R4Wj58jBAkFg7HaZr3SsXZ9hdh40=",
+ "lastModified": 1708673722,
+ "narHash": "sha256-FPbPhA727wuVkmR21Va6scRjAmj4pk3U8blteaXB/Hg=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "7ce0abe77d2ace6d6fc43ff7077019e62a77e741",
+ "rev": "92cf4feb2b9091466a82b27e4bb045cbccc2ba09",
"type": "github"
},
"original": {
@@ -204,11 +204,11 @@
"rust-analyzer-src": {
"flake": false,
"locked": {
- "lastModified": 1688410727,
- "narHash": "sha256-TqKZO9D64UDBCMY2sUP2ebAKP0oY7S9enrHfZaDiqBQ=",
+ "lastModified": 1706735270,
+ "narHash": "sha256-IJk+UitcJsxzMQWm9pa1ZbJBriQ4ginXOlPyVq+Cu40=",
"owner": "rust-lang",
"repo": "rust-analyzer",
- "rev": "45272efec5fcb8bc46e303d6ced8bd2ba095a667",
+ "rev": "42cb1a2bd79af321b0cc503d2960b73f34e2f92b",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index 0c0f783..5dae3c4 100644
--- a/flake.nix
+++ b/flake.nix
@@ -61,8 +61,8 @@
packageFun = import ./Cargo.nix;
target = rustTarget;
release = true;
- rustcLinkFlags = [ "--cfg" "tokio_unstable" ];
- rustcBuildFlags = [ "--cfg" "tokio_unstable" ];
+ #rustcLinkFlags = [ "--cfg" "tokio_unstable" ];
+ #rustcBuildFlags = [ "--cfg" "tokio_unstable" ];
rustToolchain = with fenix.packages.x86_64-linux; combine [
minimal.cargo
minimal.rustc
diff --git a/src/imap/capability.rs b/src/imap/capability.rs
index 256d820..c76b51c 100644
--- a/src/imap/capability.rs
+++ b/src/imap/capability.rs
@@ -1,5 +1,5 @@
use imap_codec::imap_types::command::{FetchModifier, SelectExamineModifier, StoreModifier};
-use imap_codec::imap_types::core::NonEmptyVec;
+use imap_codec::imap_types::core::Vec1;
use imap_codec::imap_types::extensions::enable::{CapabilityEnable, Utf8Kind};
use imap_codec::imap_types::response::Capability;
use std::collections::HashSet;
@@ -49,7 +49,7 @@ impl Default for ServerCapability {
}
impl ServerCapability {
- pub fn to_vec(&self) -> NonEmptyVec<Capability<'static>> {
+ pub fn to_vec(&self) -> Vec1<Capability<'static>> {
self.0
.iter()
.map(|v| v.clone())
diff --git a/src/imap/command/authenticated.rs b/src/imap/command/authenticated.rs
index 26b1946..eb8833d 100644
--- a/src/imap/command/authenticated.rs
+++ b/src/imap/command/authenticated.rs
@@ -6,7 +6,7 @@ use anyhow::{anyhow, bail, Result};
use imap_codec::imap_types::command::{
Command, CommandBody, ListReturnItem, SelectExamineModifier,
};
-use imap_codec::imap_types::core::{Atom, Literal, NonEmptyVec, QuotedChar};
+use imap_codec::imap_types::core::{Atom, Literal, QuotedChar, Vec1};
use imap_codec::imap_types::datetime::DateTime;
use imap_codec::imap_types::extensions::enable::CapabilityEnable;
use imap_codec::imap_types::flag::{Flag, FlagNameAttribute};
@@ -17,10 +17,10 @@ use imap_codec::imap_types::status::{StatusDataItem, StatusDataItemName};
use crate::imap::capability::{ClientCapability, ServerCapability};
use crate::imap::command::{anystate, MailboxName};
use crate::imap::flow;
-use crate::imap::mailbox_view::MailboxView;
+use crate::imap::mailbox_view::{MailboxView, UpdateParameters};
use crate::imap::response::Response;
+use crate::imap::Body;
-use crate::mail::mailbox::Mailbox;
use crate::mail::uidindex::*;
use crate::mail::user::{User, MAILBOX_HIERARCHY_DELIMITER as MBX_HIER_DELIM_RAW};
use crate::mail::IMF;
@@ -549,6 +549,8 @@ impl<'a> AuthenticatedContext<'a> {
))
}
+ //@FIXME we should write a specific version for the "selected" state
+ //that returns some unsollicited responses
async fn append(
self,
mailbox: &MailboxCodec<'a>,
@@ -558,7 +560,7 @@ impl<'a> AuthenticatedContext<'a> {
) -> Result<(Response<'static>, flow::Transition)> {
let append_tag = self.req.tag.clone();
match self.append_internal(mailbox, flags, date, message).await {
- Ok((_mb, uidvalidity, uid, _modseq)) => Ok((
+ Ok((_mb_view, uidvalidity, uid, _modseq)) => Ok((
Response::build()
.tag(append_tag)
.message("APPEND completed")
@@ -580,7 +582,7 @@ impl<'a> AuthenticatedContext<'a> {
fn enable(
self,
- cap_enable: &NonEmptyVec<CapabilityEnable<'static>>,
+ cap_enable: &Vec1<CapabilityEnable<'static>>,
) -> Result<(Response<'static>, flow::Transition)> {
let mut response_builder = Response::build().to_req(self.req);
let capabilities = self.client_capabilities.try_enable(cap_enable.as_ref());
@@ -593,13 +595,14 @@ impl<'a> AuthenticatedContext<'a> {
))
}
+ //@FIXME should be refactored and integrated to the mailbox view
pub(crate) async fn append_internal(
self,
mailbox: &MailboxCodec<'a>,
flags: &[Flag<'a>],
date: &Option<DateTime>,
message: &Literal<'a>,
- ) -> Result<(Arc<Mailbox>, ImapUidvalidity, ImapUid, ModSeq)> {
+ ) -> Result<(MailboxView, ImapUidvalidity, ImapUid, ModSeq)> {
let name: &str = MailboxName(mailbox).try_into()?;
let mb_opt = self.user.open_mailbox(&name).await?;
@@ -607,6 +610,7 @@ impl<'a> AuthenticatedContext<'a> {
Some(mb) => mb,
None => bail!("Mailbox does not exist"),
};
+ let mut view = MailboxView::new(mb, self.client_capabilities.condstore.is_enabled()).await;
if date.is_some() {
tracing::warn!("Cannot set date when appending message");
@@ -617,9 +621,11 @@ impl<'a> AuthenticatedContext<'a> {
let flags = flags.iter().map(|x| x.to_string()).collect::<Vec<_>>();
// TODO: filter allowed flags? ping @Quentin
- let (uidvalidity, uid, modseq) = mb.append(msg, None, &flags[..]).await?;
+ let (uidvalidity, uid, modseq) =
+ view.internal.mailbox.append(msg, None, &flags[..]).await?;
+ //let unsollicited = view.update(UpdateParameters::default()).await?;
- Ok((mb, uidvalidity, uid, modseq))
+ Ok((view, uidvalidity, uid, modseq))
}
}
diff --git a/src/imap/command/selected.rs b/src/imap/command/selected.rs
index 73f8aec..d000905 100644
--- a/src/imap/command/selected.rs
+++ b/src/imap/command/selected.rs
@@ -3,7 +3,7 @@ use std::sync::Arc;
use anyhow::Result;
use imap_codec::imap_types::command::{Command, CommandBody, FetchModifier, StoreModifier};
-use imap_codec::imap_types::core::Charset;
+use imap_codec::imap_types::core::{Charset, Vec1};
use imap_codec::imap_types::fetch::MacroOrMessageDataItemNames;
use imap_codec::imap_types::flag::{Flag, StoreResponse, StoreType};
use imap_codec::imap_types::mailbox::Mailbox as MailboxCodec;
@@ -54,11 +54,15 @@ pub async fn dispatch<'a>(
ctx.fetch(sequence_set, macro_or_item_names, modifiers, uid)
.await
}
+ //@FIXME SearchKey::And is a legacy hack, should be refactored
CommandBody::Search {
charset,
criteria,
uid,
- } => ctx.search(charset, criteria, uid).await,
+ } => {
+ ctx.search(charset, &SearchKey::And(criteria.clone()), uid)
+ .await
+ }
CommandBody::Expunge {
// UIDPLUS (rfc4315)
uid_sequence_set,
@@ -88,15 +92,6 @@ pub async fn dispatch<'a>(
// UNSELECT extension (rfc3691)
CommandBody::Unselect => ctx.unselect().await,
- // IDLE extension (rfc2177)
- CommandBody::Idle => Ok((
- Response::build()
- .to_req(ctx.req)
- .message("DUMMY command due to anti-pattern in the code")
- .ok()?,
- flow::Transition::Idle(ctx.req.tag.clone(), tokio::sync::Notify::new()),
- )),
-
// In selected mode, we fallback to authenticated when needed
_ => {
authenticated::dispatch(authenticated::AuthenticatedContext {
diff --git a/src/imap/flow.rs b/src/imap/flow.rs
index 6ddd092..e372d69 100644
--- a/src/imap/flow.rs
+++ b/src/imap/flow.rs
@@ -1,11 +1,12 @@
use std::error::Error as StdError;
use std::fmt;
use std::sync::Arc;
+
+use imap_codec::imap_types::core::Tag;
use tokio::sync::Notify;
use crate::imap::mailbox_view::MailboxView;
use crate::mail::user::User;
-use imap_codec::imap_types::core::Tag;
#[derive(Debug)]
pub enum Error {
@@ -31,6 +32,14 @@ pub enum State {
),
Logout,
}
+impl State {
+ pub fn notify(&self) -> Option<Arc<Notify>> {
+ match self {
+ Self::Idle(_, _, _, _, anotif) => Some(anotif.clone()),
+ _ => None,
+ }
+ }
+}
impl fmt::Display for State {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use State::*;
diff --git a/src/imap/mailbox_view.rs b/src/imap/mailbox_view.rs
index d57e9a3..1c53b93 100644
--- a/src/imap/mailbox_view.rs
+++ b/src/imap/mailbox_view.rs
@@ -4,9 +4,9 @@ use std::sync::Arc;
use anyhow::{anyhow, Error, Result};
-use futures::stream::{FuturesOrdered, StreamExt};
+use futures::stream::{StreamExt, TryStreamExt};
-use imap_codec::imap_types::core::Charset;
+use imap_codec::imap_types::core::{Charset, Vec1};
use imap_codec::imap_types::fetch::MessageDataItem;
use imap_codec::imap_types::flag::{Flag, FlagFetch, FlagPerm, StoreResponse, StoreType};
use imap_codec::imap_types::response::{Code, CodeOther, Data, Status};
@@ -362,46 +362,36 @@ impl MailboxView {
.iter()
.map(|midx| midx.uuid)
.collect::<Vec<_>>();
- let query_result = self.internal.query(&uuids, query_scope).fetch().await?;
- // [3/6] Derive an IMAP-specific view from the results, apply the filters
- let views = query_result
- .iter()
- .zip(mail_idx_list.into_iter())
- .map(|(qr, midx)| MailView::new(qr, midx))
- .collect::<Result<Vec<_>, _>>()?;
-
- // [4/6] Apply the IMAP transformation, bubble up any error
- // We get 2 results:
- // - The one we send to the client
- // - The \Seen flags we must set internally
- let (flag_mgmt, imap_ret): (Vec<_>, Vec<_>) = views
- .iter()
- .map(|mv| mv.filter(&ap).map(|(body, seen)| ((mv, seen), body)))
- .collect::<Result<Vec<_>, _>>()?
- .into_iter()
- .unzip();
+ let query = self.internal.query(&uuids, query_scope);
+ //let query_result = self.internal.query(&uuids, query_scope).fetch().await?;
- // [5/6] Register the \Seen flags
- flag_mgmt
- .iter()
- .filter(|(_mv, seen)| matches!(seen, SeenFlag::MustAdd))
- .map(|(mv, _seen)| async move {
- let seen_flag = Flag::Seen.to_string();
- self.internal
- .mailbox
- .add_flags(*mv.query_result.uuid(), &[seen_flag])
- .await?;
- Ok::<_, anyhow::Error>(())
+ let query_stream = query
+ .fetch()
+ .zip(futures::stream::iter(mail_idx_list))
+ // [3/6] Derive an IMAP-specific view from the results, apply the filters
+ .map(|(maybe_qr, midx)| match maybe_qr {
+ Ok(qr) => Ok((MailView::new(&qr, midx)?.filter(&ap)?, midx)),
+ Err(e) => Err(e),
})
- .collect::<FuturesOrdered<_>>()
- .collect::<Vec<_>>()
- .await
- .into_iter()
- .collect::<Result<_, _>>()?;
+ // [4/6] Apply the IMAP transformation
+ .then(|maybe_ret| async move {
+ let ((body, seen), midx) = maybe_ret?;
+
+ // [5/6] Register the \Seen flags
+ if matches!(seen, SeenFlag::MustAdd) {
+ let seen_flag = Flag::Seen.to_string();
+ self.internal
+ .mailbox
+ .add_flags(midx.uuid, &[seen_flag])
+ .await?;
+ }
+
+ Ok::<_, anyhow::Error>(body)
+ });
// [6/6] Build the final result that will be sent to the client.
- Ok(imap_ret)
+ query_stream.try_collect().await
}
/// A naive search implementation...
@@ -423,39 +413,54 @@ impl MailboxView {
// 3. Filter the selection based on the ID / UID / Flags
let (kept_idx, to_fetch) = crit.filter_on_idx(&selection);
- // 4. Fetch additional info about the emails
+ // 4.a Fetch additional info about the emails
let query_scope = crit.query_scope();
let uuids = to_fetch.iter().map(|midx| midx.uuid).collect::<Vec<_>>();
- let query_result = self.internal.query(&uuids, query_scope).fetch().await?;
+ let query = self.internal.query(&uuids, query_scope);
+
+ // 4.b We don't want to keep all data in memory, so we do the computing in a stream
+ let query_stream = query
+ .fetch()
+ .zip(futures::stream::iter(&to_fetch))
+ // 5.a Build a mailview with the body, might fail with an error
+ // 5.b If needed, filter the selection based on the body, but keep the errors
+ // 6. Drop the query+mailbox, keep only the mail index
+ // Here we release a lot of memory, this is the most important part ^^
+ .filter_map(|(maybe_qr, midx)| {
+ let r = match maybe_qr {
+ Ok(qr) => match MailView::new(&qr, midx).map(|mv| crit.is_keep_on_query(&mv)) {
+ Ok(true) => Some(Ok(*midx)),
+ Ok(_) => None,
+ Err(e) => Some(Err(e)),
+ },
+ Err(e) => Some(Err(e)),
+ };
+ futures::future::ready(r)
+ });
- // 5. If needed, filter the selection based on the body
- let kept_query = crit.filter_on_query(&to_fetch, &query_result)?;
+ // 7. Chain both streams (part resolved from index, part resolved from metadata+body)
+ let main_stream = futures::stream::iter(kept_idx)
+ .map(Ok)
+ .chain(query_stream)
+ .map_ok(|idx| match uid {
+ true => (idx.uid, idx.modseq),
+ _ => (idx.i, idx.modseq),
+ });
- // 6. Format the result according to the client's taste:
- // either return UID or ID.
- let final_selection = kept_idx.iter().chain(kept_query.iter());
- let selection_fmt = match uid {
- true => final_selection.map(|in_idx| in_idx.uid).collect(),
- _ => final_selection.map(|in_idx| in_idx.i).collect(),
- };
+ // 8. Do the actual computation
+ let internal_result: Vec<_> = main_stream.try_collect().await?;
+ let (selection, modseqs): (Vec<_>, Vec<_>) = internal_result.into_iter().unzip();
- // 7. Add the modseq entry if needed
- let is_modseq = crit.is_modseq();
- let maybe_modseq = match is_modseq {
- true => {
- let final_selection = kept_idx.iter().chain(kept_query.iter());
- final_selection
- .map(|in_idx| in_idx.modseq)
- .max()
- .map(|r| NonZeroU64::try_from(r))
- .transpose()?
- }
+ // 9. Aggregate the maximum modseq value
+ let maybe_modseq = match crit.is_modseq() {
+ true => modseqs.into_iter().max(),
_ => None,
};
+ // 10. Return the final result
Ok((
- vec![Body::Data(Data::Search(selection_fmt, maybe_modseq))],
- is_modseq,
+ vec![Body::Data(Data::Search(selection, maybe_modseq))],
+ maybe_modseq.is_some(),
))
}
@@ -626,7 +631,7 @@ impl MailboxView {
mod tests {
use super::*;
use imap_codec::encode::Encoder;
- use imap_codec::imap_types::core::NonEmptyVec;
+ use imap_codec::imap_types::core::Vec1;
use imap_codec::imap_types::fetch::Section;
use imap_codec::imap_types::fetch::{MacroOrMessageDataItemNames, MessageDataItemName};
use imap_codec::imap_types::response::Response;
@@ -746,7 +751,7 @@ mod tests {
let test_repr = Response::Data(Data::Fetch {
seq: NonZeroU32::new(1).unwrap(),
- items: NonEmptyVec::from(MessageDataItem::Body(mime_view::bodystructure(
+ items: Vec1::from(MessageDataItem::Body(mime_view::bodystructure(
&message.child,
false,
)?)),
diff --git a/src/imap/mime_view.rs b/src/imap/mime_view.rs
index 8fc043b..8bbbd2d 100644
--- a/src/imap/mime_view.rs
+++ b/src/imap/mime_view.rs
@@ -8,7 +8,7 @@ use imap_codec::imap_types::body::{
BasicFields, Body as FetchBody, BodyStructure, MultiPartExtensionData, SinglePartExtensionData,
SpecificFields,
};
-use imap_codec::imap_types::core::{AString, IString, NString, NonEmptyVec};
+use imap_codec::imap_types::core::{AString, IString, NString, Vec1};
use imap_codec::imap_types::fetch::{Part as FetchPart, Section as FetchSection};
use eml_codec::{
@@ -141,8 +141,8 @@ impl<'a> NodeMime<'a> {
enum SubsettedSection<'a> {
Part,
Header,
- HeaderFields(&'a NonEmptyVec<AString<'a>>),
- HeaderFieldsNot(&'a NonEmptyVec<AString<'a>>),
+ HeaderFields(&'a Vec1<AString<'a>>),
+ HeaderFieldsNot(&'a Vec1<AString<'a>>),
Text,
Mime,
}
@@ -238,7 +238,7 @@ impl<'a> SelectedMime<'a> {
/// case-insensitive but otherwise exact.
fn header_fields(
&self,
- fields: &'a NonEmptyVec<AString<'a>>,
+ fields: &'a Vec1<AString<'a>>,
invert: bool,
) -> Result<ExtractedFull<'a>> {
// Build a lowercase ascii hashset with the fields to fetch
@@ -398,8 +398,8 @@ impl<'a> NodeMult<'a> {
.filter_map(|inner| NodeMime(&inner).structure(is_ext).ok())
.collect::<Vec<_>>();
- NonEmptyVec::validate(&inner_bodies)?;
- let bodies = NonEmptyVec::unvalidated(inner_bodies);
+ Vec1::validate(&inner_bodies)?;
+ let bodies = Vec1::unvalidated(inner_bodies);
Ok(BodyStructure::Multi {
bodies,
diff --git a/src/imap/mod.rs b/src/imap/mod.rs
index 58c4dc0..02ab9ce 100644
--- a/src/imap/mod.rs
+++ b/src/imap/mod.rs
@@ -15,7 +15,7 @@ mod session;
use std::net::SocketAddr;
-use anyhow::{bail, Result};
+use anyhow::{anyhow, bail, Context, Result};
use futures::stream::{FuturesUnordered, StreamExt};
use tokio::net::TcpListener;
@@ -144,13 +144,6 @@ use tokio_util::bytes::BytesMut;
const PIPELINABLE_COMMANDS: usize = 64;
-#[derive(Debug)]
-enum LoopMode {
- Quit,
- Interactive,
- Idle(BytesMut, Arc<Notify>),
-}
-
// @FIXME a full refactor of this part of the code will be needed sooner or later
struct NetLoop {
ctx: ClientContext,
@@ -163,7 +156,7 @@ impl NetLoop {
async fn handler(ctx: ClientContext, sock: AnyStream) {
let addr = ctx.addr.clone();
- let nl = match Self::new(ctx, sock).await {
+ let mut nl = match Self::new(ctx, sock).await {
Ok(nl) => {
tracing::debug!(addr=?addr, "netloop successfully initialized");
nl
@@ -185,15 +178,15 @@ impl NetLoop {
}
async fn new(ctx: ClientContext, sock: AnyStream) -> Result<Self> {
+ let mut opts = ServerFlowOptions::default();
+ opts.crlf_relaxed = false;
+ opts.literal_accept_text = Text::unvalidated("OK");
+ opts.literal_reject_text = Text::unvalidated("Literal rejected");
+
// Send greeting
let (server, _) = ServerFlow::send_greeting(
sock,
- ServerFlowOptions {
- crlf_relaxed: false,
- literal_accept_text: Text::unvalidated("OK"),
- literal_reject_text: Text::unvalidated("Literal rejected"),
- ..ServerFlowOptions::default()
- },
+ opts,
Greeting::ok(
Some(Code::Capability(ctx.server_capabilities.to_vec())),
"Aerogramme",
@@ -241,85 +234,111 @@ impl NetLoop {
tracing::info!("runner is quitting");
}
- async fn core(mut self) -> Result<()> {
- tracing::trace!("Starting the core loop");
- let mut mode = LoopMode::Interactive;
+ async fn core(&mut self) -> Result<()> {
+ let mut maybe_idle: Option<Arc<Notify>> = None;
loop {
- tracing::trace!(mode=?mode, "Core loop iter");
- mode = match mode {
- LoopMode::Interactive => self.interactive_mode().await?,
- LoopMode::Idle(buff, stop) => self.idle_mode(buff, stop).await?,
- LoopMode::Quit => break,
- }
- }
- Ok(())
- }
-
- async fn interactive_mode(&mut self) -> Result<LoopMode> {
- tokio::select! {
- // Managing imap_flow stuff
- srv_evt = self.server.progress() => match srv_evt? {
- ServerFlowEvent::ResponseSent { handle: _handle, response } => {
- match response {
- Response::Status(Status::Bye(_)) => return Ok(LoopMode::Quit),
- _ => tracing::trace!("sent to {} content {:?}", self.ctx.addr, response),
- }
- },
- ServerFlowEvent::CommandReceived { command } => {
- match self.cmd_tx.try_send(Request::ImapCommand(command)) {
- Ok(_) => (),
- Err(mpsc::error::TrySendError::Full(_)) => {
- self.server.enqueue_status(Status::bye(None, "Too fast").unwrap());
- tracing::error!("client {:?} is sending commands too fast, closing.", self.ctx.addr);
+ tokio::select! {
+ // Managing imap_flow stuff
+ srv_evt = self.server.progress() => match srv_evt? {
+ ServerFlowEvent::ResponseSent { handle: _handle, response } => {
+ match response {
+ Response::Status(Status::Bye(_)) => return Ok(()),
+ _ => tracing::trace!("sent to {} content {:?}", self.ctx.addr, response),
+ }
+ },
+ ServerFlowEvent::CommandReceived { command } => {
+ match self.cmd_tx.try_send(Request::ImapCommand(command)) {
+ Ok(_) => (),
+ Err(mpsc::error::TrySendError::Full(_)) => {
+ self.server.enqueue_status(Status::bye(None, "Too fast").unwrap());
+ tracing::error!("client {:?} is sending commands too fast, closing.", self.ctx.addr);
+ }
+ _ => {
+ self.server.enqueue_status(Status::bye(None, "Internal session exited").unwrap());
+ tracing::error!("session task exited for {:?}, quitting", self.ctx.addr);
+ }
}
- _ => {
- self.server.enqueue_status(Status::bye(None, "Internal session exited").unwrap());
- tracing::error!("session task exited for {:?}, quitting", self.ctx.addr);
+ },
+ ServerFlowEvent::IdleCommandReceived { tag } => {
+ match self.cmd_tx.try_send(Request::IdleStart(tag)) {
+ Ok(_) => (),
+ Err(mpsc::error::TrySendError::Full(_)) => {
+ self.server.enqueue_status(Status::bye(None, "Too fast").unwrap());
+ tracing::error!("client {:?} is sending commands too fast, closing.", self.ctx.addr);
+ }
+ _ => {
+ self.server.enqueue_status(Status::bye(None, "Internal session exited").unwrap());
+ tracing::error!("session task exited for {:?}, quitting", self.ctx.addr);
+ }
}
}
- },
- flow => {
- self.server.enqueue_status(Status::bye(None, "Unsupported server flow event").unwrap());
- tracing::error!("session task exited for {:?} due to unsupported flow {:?}", self.ctx.addr, flow);
- }
- },
-
- // Managing response generated by Aerogramme
- maybe_msg = self.resp_rx.recv() => match maybe_msg {
- Some(ResponseOrIdle::Response(response)) => {
- tracing::trace!("Interactive, server has a response for the client");
- for body_elem in response.body.into_iter() {
- let _handle = match body_elem {
- Body::Data(d) => self.server.enqueue_data(d),
- Body::Status(s) => self.server.enqueue_status(s),
- };
+ ServerFlowEvent::IdleDoneReceived => {
+ tracing::trace!("client sent DONE and want to stop IDLE");
+ maybe_idle.ok_or(anyhow!("Received IDLE done but not idling currently"))?.notify_one();
+ maybe_idle = None;
+ }
+ flow => {
+ self.server.enqueue_status(Status::bye(None, "Unsupported server flow event").unwrap());
+ tracing::error!("session task exited for {:?} due to unsupported flow {:?}", self.ctx.addr, flow);
}
- self.server.enqueue_status(response.completion);
- },
- Some(ResponseOrIdle::StartIdle(stop)) => {
- tracing::trace!("Interactive, server agreed to switch in idle mode");
- let cr = CommandContinuationRequest::basic(None, "Idling")?;
- self.server.enqueue_continuation(cr);
- self.cmd_tx.try_send(Request::Idle)?;
- return Ok(LoopMode::Idle(BytesMut::new(), stop))
- },
- None => {
- self.server.enqueue_status(Status::bye(None, "Internal session exited").unwrap());
- tracing::error!("session task exited for {:?}, quitting", self.ctx.addr);
},
- Some(_) => unreachable!(),
- },
+ // Managing response generated by Aerogramme
+ maybe_msg = self.resp_rx.recv() => match maybe_msg {
+ Some(ResponseOrIdle::Response(response)) => {
+ tracing::trace!("Interactive, server has a response for the client");
+ for body_elem in response.body.into_iter() {
+ let _handle = match body_elem {
+ Body::Data(d) => self.server.enqueue_data(d),
+ Body::Status(s) => self.server.enqueue_status(s),
+ };
+ }
+ self.server.enqueue_status(response.completion);
+ },
+ Some(ResponseOrIdle::IdleAccept(stop)) => {
+ tracing::trace!("Interactive, server agreed to switch in idle mode");
+ let cr = CommandContinuationRequest::basic(None, "Idling")?;
+ self.server.idle_accept(cr).or(Err(anyhow!("refused continuation for idle accept")))?;
+ self.cmd_tx.try_send(Request::IdlePoll)?;
+ if maybe_idle.is_some() {
+ bail!("Can't start IDLE if already idling");
+ }
+ maybe_idle = Some(stop);
+ },
+ Some(ResponseOrIdle::IdleEvent(elems)) => {
+ tracing::trace!("server imap session has some change to communicate to the client");
+ for body_elem in elems.into_iter() {
+ let _handle = match body_elem {
+ Body::Data(d) => self.server.enqueue_data(d),
+ Body::Status(s) => self.server.enqueue_status(s),
+ };
+ }
+ self.cmd_tx.try_send(Request::IdlePoll)?;
+ },
+ Some(ResponseOrIdle::IdleReject(response)) => {
+ tracing::trace!("inform client that session rejected idle");
+ self.server
+ .idle_reject(response.completion)
+ .or(Err(anyhow!("wrong reject command")))?;
+ },
+ None => {
+ self.server.enqueue_status(Status::bye(None, "Internal session exited").unwrap());
+ tracing::error!("session task exited for {:?}, quitting", self.ctx.addr);
+ },
+ Some(_) => unreachable!(),
- // When receiving a CTRL+C
- _ = self.ctx.must_exit.changed() => {
- tracing::trace!("Interactive, CTRL+C, exiting");
- self.server.enqueue_status(Status::bye(None, "Server is being shutdown").unwrap());
- },
- };
- Ok(LoopMode::Interactive)
+ },
+
+ // When receiving a CTRL+C
+ _ = self.ctx.must_exit.changed() => {
+ tracing::trace!("Interactive, CTRL+C, exiting");
+ self.server.enqueue_status(Status::bye(None, "Server is being shutdown").unwrap());
+ },
+ };
+ }
}
+ /*
async fn idle_mode(&mut self, mut buff: BytesMut, stop: Arc<Notify>) -> Result<LoopMode> {
// Flush send
loop {
@@ -398,5 +417,5 @@ impl NetLoop {
return Ok(LoopMode::Interactive)
},
};
- }
+ }*/
}
diff --git a/src/imap/request.rs b/src/imap/request.rs
index 49b4992..cff18a3 100644
--- a/src/imap/request.rs
+++ b/src/imap/request.rs
@@ -1,7 +1,9 @@
use imap_codec::imap_types::command::Command;
+use imap_codec::imap_types::core::Tag;
#[derive(Debug)]
pub enum Request {
ImapCommand(Command<'static>),
- Idle,
+ IdleStart(Tag<'static>),
+ IdlePoll,
}
diff --git a/src/imap/response.rs b/src/imap/response.rs
index 40e6927..b6a0e98 100644
--- a/src/imap/response.rs
+++ b/src/imap/response.rs
@@ -118,6 +118,7 @@ impl<'a> Response<'a> {
#[derive(Debug)]
pub enum ResponseOrIdle {
Response(Response<'static>),
- StartIdle(Arc<Notify>),
+ IdleAccept(Arc<Notify>),
+ IdleReject(Response<'static>),
IdleEvent(Vec<Body<'static>>),
}
diff --git a/src/imap/search.rs b/src/imap/search.rs
index d06c3bd..37a7e9e 100644
--- a/src/imap/search.rs
+++ b/src/imap/search.rs
@@ -1,13 +1,12 @@
use std::num::{NonZeroU32, NonZeroU64};
-use anyhow::Result;
-use imap_codec::imap_types::core::NonEmptyVec;
+use imap_codec::imap_types::core::Vec1;
use imap_codec::imap_types::search::{MetadataItemSearch, SearchKey};
use imap_codec::imap_types::sequence::{SeqOrUid, Sequence, SequenceSet};
use crate::imap::index::MailIndex;
use crate::imap::mail_view::MailView;
-use crate::mail::query::{QueryResult, QueryScope};
+use crate::mail::query::QueryScope;
pub enum SeqType {
Undefined,
@@ -49,7 +48,7 @@ impl<'a> Criteria<'a> {
let mut new_vec = base.0.into_inner();
new_vec.extend_from_slice(ext.0.as_ref());
let seq = SequenceSet(
- NonEmptyVec::try_from(new_vec)
+ Vec1::try_from(new_vec)
.expect("merging non empty vec lead to non empty vec"),
);
(seq, x)
@@ -145,22 +144,6 @@ impl<'a> Criteria<'a> {
(to_keep, to_fetch)
}
- pub fn filter_on_query<'b>(
- &self,
- midx_list: &[&'b MailIndex<'b>],
- query_result: &'b Vec<QueryResult>,
- ) -> Result<Vec<&'b MailIndex<'b>>> {
- Ok(midx_list
- .iter()
- .zip(query_result.iter())
- .map(|(midx, qr)| MailView::new(qr, midx))
- .collect::<Result<Vec<_>, _>>()?
- .into_iter()
- .filter(|mail_view| self.is_keep_on_query(mail_view))
- .map(|mail_view| mail_view.in_idx)
- .collect())
- }
-
// ----
/// Here we are doing a partial filtering: we do not have access
@@ -213,7 +196,7 @@ impl<'a> Criteria<'a> {
/// the email, as body(x) might be false. So we need to check it. But as seqid(x) is true,
/// we could simplify the request to just body(x) and truncate the first OR. Today, we are
/// not doing that, and thus we reevaluate everything.
- fn is_keep_on_query(&self, mail_view: &MailView) -> bool {
+ pub fn is_keep_on_query(&self, mail_view: &MailView) -> bool {
use SearchKey::*;
match self.0 {
// Combinator logic
diff --git a/src/imap/session.rs b/src/imap/session.rs
index 12bbfee..fa3232a 100644
--- a/src/imap/session.rs
+++ b/src/imap/session.rs
@@ -4,8 +4,8 @@ use crate::imap::flow;
use crate::imap::request::Request;
use crate::imap::response::{Response, ResponseOrIdle};
use crate::login::ArcLoginProvider;
-use anyhow::{anyhow, bail, Result};
-use imap_codec::imap_types::command::Command;
+use anyhow::{anyhow, bail, Context, Result};
+use imap_codec::imap_types::{command::Command, core::Tag};
//-----
pub struct Instance {
@@ -27,13 +27,48 @@ impl Instance {
pub async fn request(&mut self, req: Request) -> ResponseOrIdle {
match req {
- Request::Idle => self.idle().await,
+ Request::IdleStart(tag) => self.idle_init(tag),
+ Request::IdlePoll => self.idle_poll().await,
Request::ImapCommand(cmd) => self.command(cmd).await,
}
}
- pub async fn idle(&mut self) -> ResponseOrIdle {
- match self.idle_happy().await {
+ pub fn idle_init(&mut self, tag: Tag<'static>) -> ResponseOrIdle {
+ // Build transition
+ //@FIXME the notifier should be hidden inside the state and thus not part of the transition!
+ let transition = flow::Transition::Idle(tag.clone(), tokio::sync::Notify::new());
+
+ // Try to apply the transition and get the stop notifier
+ let maybe_stop = self
+ .state
+ .apply(transition)
+ .context("IDLE transition failed")
+ .and_then(|_| {
+ self.state
+ .notify()
+ .ok_or(anyhow!("IDLE state has no Notify object"))
+ });
+
+ // Build an appropriate response
+ match maybe_stop {
+ Ok(stop) => ResponseOrIdle::IdleAccept(stop),
+ Err(e) => {
+ tracing::error!(err=?e, "unable to init idle due to a transition error");
+ //ResponseOrIdle::IdleReject(tag)
+ let no = Response::build()
+ .tag(tag)
+ .message(
+ "Internal error, processing command triggered an illegal IMAP state transition",
+ )
+ .no()
+ .unwrap();
+ ResponseOrIdle::IdleReject(no)
+ }
+ }
+ }
+
+ pub async fn idle_poll(&mut self) -> ResponseOrIdle {
+ match self.idle_poll_happy().await {
Ok(r) => r,
Err(e) => {
tracing::error!(err=?e, "something bad happened in idle");
@@ -42,7 +77,7 @@ impl Instance {
}
}
- pub async fn idle_happy(&mut self) -> Result<ResponseOrIdle> {
+ pub async fn idle_poll_happy(&mut self) -> Result<ResponseOrIdle> {
let (mbx, tag, stop) = match &mut self.state {
flow::State::Idle(_, ref mut mbx, _, tag, stop) => (mbx, tag.clone(), stop.clone()),
_ => bail!("Invalid session state, can't idle"),
@@ -128,10 +163,11 @@ impl Instance {
.bad()
.unwrap());
}
+ ResponseOrIdle::Response(resp)
- match &self.state {
+ /*match &self.state {
flow::State::Idle(_, _, _, _, n) => ResponseOrIdle::StartIdle(n.clone()),
_ => ResponseOrIdle::Response(resp),
- }
+ }*/
}
}
diff --git a/src/login/ldap_provider.rs b/src/login/ldap_provider.rs
index e73e1dc..0af5676 100644
--- a/src/login/ldap_provider.rs
+++ b/src/login/ldap_provider.rs
@@ -21,6 +21,7 @@ pub struct LdapLoginProvider {
storage_specific: StorageSpecific,
in_memory_store: storage::in_memory::MemDb,
+ garage_store: storage::garage::GarageRoot,
}
enum BucketSource {
@@ -91,7 +92,11 @@ impl LdapLoginProvider {
mail_attr: config.mail_attr,
crypto_root_attr: config.crypto_root_attr,
storage_specific: specific,
+ //@FIXME should be created outside of the login provider
+ //Login provider should return only a cryptoroot + a storage URI
+ //storage URI that should be resolved outside...
in_memory_store: storage::in_memory::MemDb::new(),
+ garage_store: storage::garage::GarageRoot::new()?,
})
}
@@ -114,7 +119,7 @@ impl LdapLoginProvider {
BucketSource::Attr(a) => get_attr(user, &a)?,
};
- storage::garage::GarageBuilder::new(storage::garage::GarageConf {
+ self.garage_store.user(storage::garage::GarageConf {
region: from_config.aws_region.clone(),
s3_endpoint: from_config.s3_endpoint.clone(),
k2v_endpoint: from_config.k2v_endpoint.clone(),
diff --git a/src/login/static_provider.rs b/src/login/static_provider.rs
index 1e1ecbf..79626df 100644
--- a/src/login/static_provider.rs
+++ b/src/login/static_provider.rs
@@ -25,6 +25,7 @@ pub struct UserDatabase {
pub struct StaticLoginProvider {
user_db: watch::Receiver<UserDatabase>,
in_memory_store: storage::in_memory::MemDb,
+ garage_store: storage::garage::GarageRoot,
}
pub async fn update_user_list(config: PathBuf, up: watch::Sender<UserDatabase>) -> Result<()> {
@@ -84,6 +85,7 @@ impl StaticLoginProvider {
Ok(Self {
user_db: rx,
in_memory_store: storage::in_memory::MemDb::new(),
+ garage_store: storage::garage::GarageRoot::new()?,
})
}
}
@@ -109,7 +111,7 @@ impl LoginProvider for StaticLoginProvider {
let storage: storage::Builder = match &user.config.storage {
StaticStorage::InMemory => self.in_memory_store.builder(username).await,
StaticStorage::Garage(grgconf) => {
- storage::garage::GarageBuilder::new(storage::garage::GarageConf {
+ self.garage_store.user(storage::garage::GarageConf {
region: grgconf.aws_region.clone(),
k2v_endpoint: grgconf.k2v_endpoint.clone(),
s3_endpoint: grgconf.s3_endpoint.clone(),
@@ -140,7 +142,7 @@ impl LoginProvider for StaticLoginProvider {
let storage: storage::Builder = match &user.config.storage {
StaticStorage::InMemory => self.in_memory_store.builder(&user.username).await,
StaticStorage::Garage(grgconf) => {
- storage::garage::GarageBuilder::new(storage::garage::GarageConf {
+ self.garage_store.user(storage::garage::GarageConf {
region: grgconf.aws_region.clone(),
k2v_endpoint: grgconf.k2v_endpoint.clone(),
s3_endpoint: grgconf.s3_endpoint.clone(),
diff --git a/src/mail/mailbox.rs b/src/mail/mailbox.rs
index c20d815..9190883 100644
--- a/src/mail/mailbox.rs
+++ b/src/mail/mailbox.rs
@@ -498,7 +498,7 @@ fn dump(uid_index: &Bayou<UidIndex>) {
/// The metadata of a message that is stored in K2V
/// at pk = mail/<mailbox uuid>, sk = <message uuid>
-#[derive(Debug, Serialize, Deserialize)]
+#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MailMeta {
/// INTERNALDATE field (milliseconds since epoch)
pub internaldate: u64,
diff --git a/src/mail/query.rs b/src/mail/query.rs
index a183c5a..3e6fe99 100644
--- a/src/mail/query.rs
+++ b/src/mail/query.rs
@@ -2,7 +2,8 @@ use super::mailbox::MailMeta;
use super::snapshot::FrozenMailbox;
use super::unique_ident::UniqueIdent;
use anyhow::Result;
-use futures::stream::{FuturesOrdered, StreamExt};
+use futures::future::FutureExt;
+use futures::stream::{BoxStream, Stream, StreamExt};
/// Query is in charge of fetching efficiently
/// requested data for a list of emails
@@ -28,64 +29,62 @@ impl QueryScope {
}
}
+//type QueryResultStream = Box<dyn Stream<Item = Result<QueryResult>>>;
+
impl<'a, 'b> Query<'a, 'b> {
- pub async fn fetch(&self) -> Result<Vec<QueryResult>> {
+ pub fn fetch(&self) -> BoxStream<Result<QueryResult>> {
match self.scope {
- QueryScope::Index => Ok(self
- .emails
- .iter()
- .map(|&uuid| QueryResult::IndexResult { uuid })
- .collect()),
- QueryScope::Partial => self.partial().await,
- QueryScope::Full => self.full().await,
+ QueryScope::Index => Box::pin(
+ futures::stream::iter(self.emails)
+ .map(|&uuid| Ok(QueryResult::IndexResult { uuid })),
+ ),
+ QueryScope::Partial => Box::pin(self.partial()),
+ QueryScope::Full => Box::pin(self.full()),
}
}
// --- functions below are private *for reasons*
+ fn partial<'d>(&'d self) -> impl Stream<Item = Result<QueryResult>> + 'd + Send {
+ async move {
+ let maybe_meta_list: Result<Vec<MailMeta>> =
+ self.frozen.mailbox.fetch_meta(self.emails).await;
+ let list_res = maybe_meta_list
+ .map(|meta_list| {
+ meta_list
+ .into_iter()
+ .zip(self.emails)
+ .map(|(metadata, &uuid)| Ok(QueryResult::PartialResult { uuid, metadata }))
+ .collect()
+ })
+ .unwrap_or_else(|e| vec![Err(e)]);
- async fn partial(&self) -> Result<Vec<QueryResult>> {
- let meta = self.frozen.mailbox.fetch_meta(self.emails).await?;
- let result = meta
- .into_iter()
- .zip(self.emails.iter())
- .map(|(metadata, &uuid)| QueryResult::PartialResult { uuid, metadata })
- .collect::<Vec<_>>();
-
- Ok(result)
+ futures::stream::iter(list_res)
+ }
+ .flatten_stream()
}
- /// @FIXME WARNING: THIS CAN ALLOCATE A LOT OF MEMORY
- /// AND GENERATE SO MUCH NETWORK TRAFFIC.
- /// THIS FUNCTION SHOULD BE REWRITTEN, FOR EXAMPLE WITH
- /// SOMETHING LIKE AN ITERATOR
- async fn full(&self) -> Result<Vec<QueryResult>> {
- let meta_list = self.partial().await?;
- meta_list
- .into_iter()
- .map(|meta| async move {
- let content = self
- .frozen
- .mailbox
- .fetch_full(
- *meta.uuid(),
- &meta
- .metadata()
- .expect("meta to be PartialResult")
- .message_key,
- )
- .await?;
+ fn full<'d>(&'d self) -> impl Stream<Item = Result<QueryResult>> + 'd + Send {
+ self.partial().then(move |maybe_meta| async move {
+ let meta = maybe_meta?;
- Ok(meta.into_full(content).expect("meta to be PartialResult"))
- })
- .collect::<FuturesOrdered<_>>()
- .collect::<Vec<_>>()
- .await
- .into_iter()
- .collect::<Result<Vec<_>, _>>()
+ let content = self
+ .frozen
+ .mailbox
+ .fetch_full(
+ *meta.uuid(),
+ &meta
+ .metadata()
+ .expect("meta to be PartialResult")
+ .message_key,
+ )
+ .await?;
+
+ Ok(meta.into_full(content).expect("meta to be PartialResult"))
+ })
}
}
-#[derive(Debug)]
+#[derive(Debug, Clone)]
pub enum QueryResult {
IndexResult {
uuid: UniqueIdent,
diff --git a/src/storage/garage.rs b/src/storage/garage.rs
index 709e729..7152764 100644
--- a/src/storage/garage.rs
+++ b/src/storage/garage.rs
@@ -1,7 +1,45 @@
-use crate::storage::*;
use aws_sdk_s3::{self as s3, error::SdkError, operation::get_object::GetObjectError};
+use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder;
+use aws_smithy_runtime_api::client::http::SharedHttpClient;
+use hyper_rustls::HttpsConnector;
+use hyper_util::client::legacy::{connect::HttpConnector, Client as HttpClient};
+use hyper_util::rt::TokioExecutor;
use serde::Serialize;
+use crate::storage::*;
+
+pub struct GarageRoot {
+ k2v_http: HttpClient<HttpsConnector<HttpConnector>, k2v_client::Body>,
+ aws_http: SharedHttpClient,
+}
+
+impl GarageRoot {
+ pub fn new() -> anyhow::Result<Self> {
+ let connector = hyper_rustls::HttpsConnectorBuilder::new()
+ .with_native_roots()?
+ .https_or_http()
+ .enable_http1()
+ .enable_http2()
+ .build();
+ let k2v_http = HttpClient::builder(TokioExecutor::new()).build(connector);
+ let aws_http = HyperClientBuilder::new().build_https();
+ Ok(Self { k2v_http, aws_http })
+ }
+
+ pub fn user(&self, conf: GarageConf) -> anyhow::Result<Arc<GarageUser>> {
+ let mut unicity: Vec<u8> = vec![];
+ unicity.extend_from_slice(file!().as_bytes());
+ unicity.append(&mut rmp_serde::to_vec(&conf)?);
+
+ Ok(Arc::new(GarageUser {
+ conf,
+ aws_http: self.aws_http.clone(),
+ k2v_http: self.k2v_http.clone(),
+ unicity,
+ }))
+ }
+}
+
#[derive(Clone, Debug, Serialize)]
pub struct GarageConf {
pub region: String,
@@ -12,23 +50,19 @@ pub struct GarageConf {
pub bucket: String,
}
+//@FIXME we should get rid of this builder
+//and allocate a S3 + K2V client only once per user
+//(and using a shared HTTP client)
#[derive(Clone, Debug)]
-pub struct GarageBuilder {
+pub struct GarageUser {
conf: GarageConf,
+ aws_http: SharedHttpClient,
+ k2v_http: HttpClient<HttpsConnector<HttpConnector>, k2v_client::Body>,
unicity: Vec<u8>,
}
-impl GarageBuilder {
- pub fn new(conf: GarageConf) -> anyhow::Result<Arc<Self>> {
- let mut unicity: Vec<u8> = vec![];
- unicity.extend_from_slice(file!().as_bytes());
- unicity.append(&mut rmp_serde::to_vec(&conf)?);
- Ok(Arc::new(Self { conf, unicity }))
- }
-}
-
#[async_trait]
-impl IBuilder for GarageBuilder {
+impl IBuilder for GarageUser {
async fn build(&self) -> Result<Store, StorageError> {
let s3_creds = s3::config::Credentials::new(
self.conf.aws_access_key_id.clone(),
@@ -41,6 +75,7 @@ impl IBuilder for GarageBuilder {
let sdk_config = aws_config::from_env()
.region(aws_config::Region::new(self.conf.region.clone()))
.credentials_provider(s3_creds)
+ .http_client(self.aws_http.clone())
.endpoint_url(self.conf.s3_endpoint.clone())
.load()
.await;
@@ -60,13 +95,14 @@ impl IBuilder for GarageBuilder {
user_agent: None,
};
- let k2v_client = match k2v_client::K2vClient::new(k2v_config) {
- Err(e) => {
- tracing::error!("unable to build k2v client: {}", e);
- return Err(StorageError::Internal);
- }
- Ok(v) => v,
- };
+ let k2v_client =
+ match k2v_client::K2vClient::new_with_client(k2v_config, self.k2v_http.clone()) {
+ Err(e) => {
+ tracing::error!("unable to build k2v client: {}", e);
+ return Err(StorageError::Internal);
+ }
+ Ok(v) => v,
+ };
Ok(Box::new(GarageStore {
bucket: self.conf.bucket.clone(),
diff --git a/tests/behavior.rs b/tests/behavior.rs
index 7fdd553..13baf0e 100644
--- a/tests/behavior.rs
+++ b/tests/behavior.rs
@@ -225,7 +225,7 @@ fn rfc4551_imapext_condstore() {
FetchKind::Rfc822Size,
FetchMod::ChangedSince(2),
)?;
- assert!(fetch_res.contains("* 1 FETCH (RFC822.SIZE 84 MODSEQ (3))"));
+ assert!(fetch_res.contains("* 1 FETCH (RFC822.SIZE 81 MODSEQ (3))"));
assert!(!fetch_res.contains("* 2 FETCH"));
assert_eq!(store_res.lines().count(), 2);
diff --git a/tests/common/fragments.rs b/tests/common/fragments.rs
index a10d4e0..606af2b 100644
--- a/tests/common/fragments.rs
+++ b/tests/common/fragments.rs
@@ -384,8 +384,7 @@ pub fn append(imap: &mut TcpStream, content: Email) -> Result<String> {
// write our stuff
imap.write(ref_mail)?;
imap.write(&b"\r\n"[..])?;
- let read = read_lines(imap, &mut buffer, None)?;
- assert_eq!(&read[..5], &b"47 OK"[..]);
+ let read = read_lines(imap, &mut buffer, Some(&b"47 OK"[..]))?;
let srv_msg = std::str::from_utf8(read)?;
Ok(srv_msg.to_string())
diff --git a/tests/emails/.gitattributes b/tests/emails/.gitattributes
new file mode 100644
index 0000000..1e01fd4
--- /dev/null
+++ b/tests/emails/.gitattributes
@@ -0,0 +1 @@
+*.zstd filter=lfs diff=lfs merge=lfs -text
diff --git a/tests/emails/.gitignore b/tests/emails/.gitignore
new file mode 100644
index 0000000..18e5b03
--- /dev/null
+++ b/tests/emails/.gitignore
@@ -0,0 +1 @@
+*.mbox
diff --git a/tests/emails/aero100.mbox.zstd b/tests/emails/aero100.mbox.zstd
new file mode 100644
index 0000000..fea64e0
--- /dev/null
+++ b/tests/emails/aero100.mbox.zstd
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:26ef794e27662426602351335f1847d3497d40068422b59042b4bf2bf3b700d5
+size 15844589
diff --git a/tests/emails/imap_commands_dataset.log b/tests/emails/imap_commands_dataset.log
new file mode 100644
index 0000000..00223d8
--- /dev/null
+++ b/tests/emails/imap_commands_dataset.log
@@ -0,0 +1,240 @@
+Append { mailbox: Other(MailboxOther(Atom(AtomExt("Sent")))), flags: [Seen], date: None, message: REDACTED } }
+Append { mailbox: Other(MailboxOther(String(Quoted(Quoted("Drafts"))))), flags: [Seen, Draft], date: None, message: REDACTED } }
+Append { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), flags: [Seen], date: None, message: REDACTED } }
+Append { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), flags: [Seen], date: Some(2024-02-14T14:12:35+01:00), message: REDACTED } }
+Capability
+Check
+Close
+Create { mailbox: Other(MailboxOther(Atom(AtomExt("Mailspring")))) } }
+Create { mailbox: Other(MailboxOther(String(Quoted(Quoted("Dataset"))))) } }
+Create { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring.Snoozed"))))) } }
+Enable { capabilities: [CondStore]+ } }
+Enable { capabilities: [Utf8(Accept)]+ } }
+Examine { mailbox: Inbox, modifiers: [] } }
+Expunge { uid_sequence_set: None } }
+Fetch { sequence_set: SequenceSet([Range(Asterisk, Value(5))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Envelope, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(12), Value(13))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Rfc822Size, Flags, ModSeq, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(22)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(24)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(5)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(638435220681800000)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(638435229950250000)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(638435249520030000)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(6)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(7)], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [ChangedSince(8)], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, InternalDate, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SENDER")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("TO")), Atom(AtomExt("CC")), Atom(AtomExt("MESSAGE-ID")), Atom(AtomExt("REFERENCES")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("CONTENT-DESCRIPTION")), Atom(AtomExt("IN-REPLY-TO")), Atom(AtomExt("REPLY-TO")), Atom(AtomExt("LINES")), Atom(AtomExt("LIST-POST")), Atom(AtomExt("X-LABEL"))]+)), partial: None, peek: true }]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(20))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(20))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(23))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags, Uid]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Flags, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("X-MS-TNEF-Correlator")), Atom(AtomExt("CONTENT-CLASS")), Atom(AtomExt("IMPORTANCE")), Atom(AtomExt("PRIORITY")), Atom(AtomExt("X-PRIORITY")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }, BodyStructure]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, InternalDate, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SENDER")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("TO")), Atom(AtomExt("CC")), Atom(AtomExt("MESSAGE-ID")), Atom(AtomExt("REFERENCES")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("CONTENT-DESCRIPTION")), Atom(AtomExt("IN-REPLY-TO")), Atom(AtomExt("REPLY-TO")), Atom(AtomExt("LINES")), Atom(AtomExt("LIST-POST")), Atom(AtomExt("X-LABEL"))]+)), partial: None, peek: true }]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26))]+), modifiers: [ChangedSince(68)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26))]+), modifiers: [ChangedSince(69)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34))]+), modifiers: [ChangedSince(102)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34))]+), modifiers: [ChangedSince(189)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34))]+), modifiers: [ChangedSince(81)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34)), Range(Value(60), Value(62))]+), modifiers: [ChangedSince(165)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34)), Range(Value(60), Value(62))]+), modifiers: [ChangedSince(166)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(2)), Range(Value(11), Value(13)), Range(Value(18), Value(19)), Range(Value(22), Value(26)), Range(Value(33), Value(34)), Range(Value(60), Value(62))]+), modifiers: [ChangedSince(168)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags, Uid]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Flags, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("X-MS-TNEF-Correlator")), Atom(AtomExt("CONTENT-CLASS")), Atom(AtomExt("IMPORTANCE")), Atom(AtomExt("PRIORITY")), Atom(AtomExt("X-PRIORITY")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }, BodyStructure]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(6))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(7))]+), modifiers: [ChangedSince(9)], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(1), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(20), Value(23))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(27), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(2), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(30), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(3), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(3), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(4), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(5), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(5), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Flags, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("X-MS-TNEF-Correlator")), Atom(AtomExt("CONTENT-CLASS")), Atom(AtomExt("IMPORTANCE")), Atom(AtomExt("PRIORITY")), Atom(AtomExt("X-PRIORITY")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }, BodyStructure]), uid: false } }
+Fetch { sequence_set: SequenceSet([Range(Value(5), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(60), Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Rfc822Size, Flags, ModSeq, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(60), Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(63), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(6), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(6), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, InternalDate, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(6), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, InternalDate, Envelope, BodyStructure, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("REFERENCES")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("FROM")), Atom(AtomExt("SENDER")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(6), Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(86), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(8), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Range(Value(9), Asterisk)]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(13))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Header(None)), partial: None, peek: true }, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Flags, Uid]), uid: false } }
+Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([1]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: false }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Resent-Message-ID")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To")), Atom(AtomExt("List-Unsubscribe")), Atom(AtomExt("Received")), Atom(AtomExt("Delivery-Date"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1)), Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("bcc")), Atom(AtomExt("cc")), Atom(AtomExt("date")), Atom(AtomExt("from")), Atom(AtomExt("reply-to")), Atom(AtomExt("sender")), Atom(AtomExt("subject")), Atom(AtomExt("to"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1)), Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("in-reply-to")), Atom(AtomExt("message-id")), Atom(AtomExt("references"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1)), Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1)), Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Rfc822Size, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(1)), Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(22))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(24))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(24))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, InternalDate, Envelope, BodyStructure, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("REFERENCES")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("FROM")), Atom(AtomExt("SENDER")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(24))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(24))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(24)), Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Resent-Message-ID")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To")), Atom(AtomExt("List-Unsubscribe")), Atom(AtomExt("Received")), Atom(AtomExt("Delivery-Date"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(29))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(29))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: false } }
+Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Envelope, InternalDate, Rfc822Size, Flags, BodyStructure, Uid, BodyExt { section: Some(Header(None)), partial: None, peek: true }, Rfc822Size, InternalDate]), uid: false } }
+Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([1]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(2))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(2)), Single(Value(8))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Flags, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("DATE")), Atom(AtomExt("FROM")), Atom(AtomExt("SUBJECT")), Atom(AtomExt("CONTENT-TYPE")), Atom(AtomExt("X-MS-TNEF-Correlator")), Atom(AtomExt("CONTENT-CLASS")), Atom(AtomExt("IMPORTANCE")), Atom(AtomExt("PRIORITY")), Atom(AtomExt("X-PRIORITY")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("REPLY-TO"))]+)), partial: None, peek: true }, BodyStructure]), uid: false } }
+Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([1]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([2]+))), partial: Some((0, 10240)), peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, BodyStructure, InternalDate, Rfc822Size]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, InternalDate, Envelope, BodyStructure, Rfc822Size, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("REFERENCES")), Atom(AtomExt("THREAD-TOPIC")), Atom(AtomExt("FROM")), Atom(AtomExt("SENDER")), Atom(AtomExt("REPLY-TO")), Atom(AtomExt("AUTO-SUBMITTED")), Atom(AtomExt("BOUNCES-TO")), Atom(AtomExt("LIST-ARCHIVE")), Atom(AtomExt("LIST-HELP")), Atom(AtomExt("LIST-ID")), Atom(AtomExt("LIST-OWNER")), Atom(AtomExt("LIST-POST")), Atom(AtomExt("LIST-SUBSCRIBE")), Atom(AtomExt("LIST-UNSUBSCRIBE")), Atom(AtomExt("PRECEDENCE")), Atom(AtomExt("RESENT-FROM")), Atom(AtomExt("RETURN-PATH"))]+)), partial: None, peek: true }, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(3))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(3)), Single(Value(2)), Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Resent-Message-ID")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To")), Atom(AtomExt("List-Unsubscribe")), Atom(AtomExt("Received")), Atom(AtomExt("Delivery-Date"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([2, 1]+))), partial: None, peek: true }, BodyExt { section: Some(Part(Part([2, 2]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(4))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(4)), Single(Value(3)), Single(Value(2)), Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(5))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(5))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([1, 2]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(5))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(5))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(60))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Part(Part([1, 2]+))), partial: Some((0, 2227)), peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(60))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(60))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyStructure, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(60))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(61))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Header(None)), partial: None, peek: true }, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Part(Part([1, 2]+))), partial: Some((0, 711)), peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyStructure, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(62))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(6))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(6))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(6))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Flags, Envelope, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("References"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(6))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Header(None)), partial: None, peek: true }, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Rfc822Size, Flags, ModSeq, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Rfc822Header, BodyExt { section: Some(Part(Part([1, 2]+))), partial: None, peek: true }, BodyExt { section: Some(Part(Part([2]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, BodyExt { section: Some(Part(Part([1, 2]+))), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(7))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, BodyExt { section: None, partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(7)), Single(Value(6)), Single(Value(5)), Single(Value(4)), Single(Value(3)), Single(Value(2)), Single(Value(1))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([Uid, Rfc822Size, Flags, BodyExt { section: Some(HeaderFields(None, [Atom(AtomExt("From")), Atom(AtomExt("To")), Atom(AtomExt("Cc")), Atom(AtomExt("Bcc")), Atom(AtomExt("Resent-Message-ID")), Atom(AtomExt("Subject")), Atom(AtomExt("Date")), Atom(AtomExt("Message-ID")), Atom(AtomExt("Priority")), Atom(AtomExt("X-Priority")), Atom(AtomExt("References")), Atom(AtomExt("Newsgroups")), Atom(AtomExt("In-Reply-To")), Atom(AtomExt("Content-Type")), Atom(AtomExt("Reply-To")), Atom(AtomExt("List-Unsubscribe")), Atom(AtomExt("Received")), Atom(AtomExt("Delivery-Date"))]+)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(83))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([BodyExt { section: Some(Header(None)), partial: None, peek: true }, BodyExt { section: Some(Text(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(83))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Rfc822Size, Flags, ModSeq, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } }
+Fetch { sequence_set: SequenceSet([Single(Value(85))]+), modifiers: [], macro_or_item_names: MessageDataItemNames([InternalDate, Uid, Rfc822Size, Flags, ModSeq, BodyExt { section: Some(Header(None)), partial: None, peek: true }]), uid: true } }
+Idle
+List { reference: Other(MailboxOther(String(Quoted(Quoted("Archive."))))), mailbox_wildcard: Token(ListCharString("*")), return: [] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted("INBOX."))))), mailbox_wildcard: Token(ListCharString("*")), return: [] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted("Dataset"))), return: [] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted("INBOX"))), return: [] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted(""))), return: [] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted("*"))), return: [] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted("*"))), return: [Status([Unseen])] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: Token(ListCharString("INBOX")), return: [] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: Token(ListCharString("%")), return: [] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted("Mailspring."))))), mailbox_wildcard: Token(ListCharString("*")), return: [] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted("Sent."))))), mailbox_wildcard: Token(ListCharString("*")), return: [] } }
+List { reference: Other(MailboxOther(String(Quoted(Quoted("Trash."))))), mailbox_wildcard: Token(ListCharString("*")), return: [] } }
+Login { username: Atom(AtomExt("REDACTED")), password: /* REDACTED */ } }
+Login { username: String(Quoted(Quoted("REDACTED"))), password: /* REDACTED */ } }
+Login { username: String(Quoted(Quoted("REDACTED@saint-ex.deuxfleurs.org"))), password: /* REDACTED */ } }
+Logout
+Lsub { reference: Other(MailboxOther(String(Quoted(Quoted(""))))), mailbox_wildcard: String(Quoted(Quoted("*"))) } }
+Move { sequence_set: SequenceSet([Range(Value(20), Value(21))]+), mailbox: Other(MailboxOther(String(Quoted(Quoted("Dataset"))))), uid: true } }
+Move { sequence_set: SequenceSet([Single(Value(29))]+), mailbox: Other(MailboxOther(String(Quoted(Quoted("Dataset"))))), uid: true } }
+Noop
+Search { charset: None, criteria: And([Header(Atom(AtomExt("Message-ID")), Atom(AtomExt("<Mailbird-8d3b03f5-7737-479e-b8d7-a3cae013e72f@saint-ex.deuxfleurs.org>"))), Undeleted]+), uid: true } }
+Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Asterisk)]+)), Deleted]+), uid: true } }
+Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Asterisk)]+)), Not(Deleted)]+), uid: true } }
+Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Asterisk)]+)), Since(2023-11-16)]+), uid: true } }
+Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Asterisk)]+)), Unseen]+), uid: true } }
+Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Value(1))]+)), Not(Deleted)]+), uid: true } }
+Search { charset: None, criteria: And([SequenceSet(SequenceSet([Range(Value(1), Value(4))]+)), Not(Deleted)]+), uid: true } }
+Search { charset: None, criteria: And([Since(2024-02-07), All]+), uid: false } }
+Search { charset: None, criteria: And([Since(2024-02-08), All]+), uid: false } }
+Search { charset: None, criteria: And([Since(2024-02-09), All]+), uid: false } }
+Search { charset: None, criteria: And([Undeleted, Since(2023-11-17)]+), uid: false } }
+Search { charset: None, criteria: And([Undeleted, Since(2024-02-13)]+), uid: false } }
+Search { charset: None, criteria: Before(2024-02-09), uid: true } }
+Search { charset: None, criteria: Since(2024-01-31), uid: true } }
+Select { mailbox: Inbox, modifiers: [] } }
+Select { mailbox: Inbox, modifiers: [Condstore] } }
+Select { mailbox: Other(MailboxOther(Atom(AtomExt("Archive")))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(Atom(AtomExt("Drafts")))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(Atom(AtomExt("Mailspring")))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(Atom(AtomExt("Sent")))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(Atom(AtomExt("Test.Coucou")))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(Atom(AtomExt("Test")))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(Atom(AtomExt("Trash")))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Archive"))))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Dataset"))))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Drafts"))))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("INBOX.Pourriel"))))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring"))))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring.Snoozed"))))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), modifiers: [] } }
+Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), modifiers: [Condstore] } }
+Select { mailbox: Other(MailboxOther(String(Quoted(Quoted("Trash"))))), modifiers: [] } }
+Status { mailbox: Inbox, item_names: [Messages, Recent, UidNext, UidValidity, Unseen] } }
+Status { mailbox: Inbox, item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } }
+Status { mailbox: Other(MailboxOther(Atom(AtomExt("Archive")))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } }
+Status { mailbox: Other(MailboxOther(Atom(AtomExt("Drafts")))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } }
+Status { mailbox: Other(MailboxOther(Atom(AtomExt("Mailspring")))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } }
+Status { mailbox: Other(MailboxOther(Atom(AtomExt("Sent")))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } }
+Status { mailbox: Other(MailboxOther(Atom(AtomExt("Trash")))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Archive"))))), item_names: [UidNext, Messages, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Archive"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Drafts"))))), item_names: [Messages] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Drafts"))))), item_names: [UidNext, Messages, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Drafts"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("INBOX.Pourriel"))))), item_names: [UidNext, Messages, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("INBOX.Pourriel"))))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring"))))), item_names: [UidNext, Messages, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring.Snoozed"))))), item_names: [UidNext, Messages, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring.Snoozed"))))), item_names: [Unseen, Messages, Recent, UidNext, UidValidity, HighestModSeq] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), item_names: [UidNext, Messages, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Sent"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Test.Coucou"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Test"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } }
+Status { mailbox: Other(MailboxOther(String(Quoted(Quoted("Trash"))))), item_names: [UidNext, UidValidity, Unseen, Recent] } }
+Store { sequence_set: SequenceSet([Range(Value(60), Value(62))]+), kind: Add, response: Answer, flags: [Deleted], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Range(Value(60), Value(62))]+), kind: Add, response: Answer, flags: [Deleted, Seen], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Range(Value(60), Value(62))]+), kind: Add, response: Answer, flags: [Seen, Deleted], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(1))]+), kind: Add, response: Answer, flags: [Seen], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(24))]+), kind: Add, response: Answer, flags: [Seen, Deleted], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(24))]+), kind: Add, response: Answer, flags: [Seen], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(26))]+), kind: Add, response: Answer, flags: [Answered], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(29))]+), kind: Add, response: Answer, flags: [Keyword(Atom("NonJunk"))], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(29))]+), kind: Add, response: Answer, flags: [Seen], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(2))]+), kind: Add, response: Answer, flags: [Seen], modifiers: [], uid: false } }
+Store { sequence_set: SequenceSet([Single(Value(2))]+), kind: Add, response: Silent, flags: [Deleted], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(3))]+), kind: Add, response: Answer, flags: [Seen], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(3))]+), kind: Add, response: Silent, flags: [Seen], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(5))]+), kind: Add, response: Answer, flags: [Keyword(Atom("NonJunk"))], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(60))]+), kind: Add, response: Answer, flags: [Seen, Deleted], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(60))]+), kind: Add, response: Silent, flags: [Seen], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(61))]+), kind: Add, response: Answer, flags: [Seen, Deleted], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(61))]+), kind: Add, response: Silent, flags: [Seen], modifiers: [], uid: true } }
+Store { sequence_set: SequenceSet([Single(Value(62))]+), kind: Add, response: Silent, flags: [Seen], modifiers: [], uid: true } }
+Subscribe { mailbox: Other(MailboxOther(Atom(AtomExt("Mailspring")))) } }
+Subscribe { mailbox: Other(MailboxOther(String(Quoted(Quoted("Dataset"))))) } }
+Subscribe { mailbox: Other(MailboxOther(String(Quoted(Quoted("Mailspring.Snoozed"))))) } }
+Unselect
diff --git a/tests/emails/imap_commands_summary.csv b/tests/emails/imap_commands_summary.csv
new file mode 100644
index 0000000..d04803b
--- /dev/null
+++ b/tests/emails/imap_commands_summary.csv
@@ -0,0 +1,45 @@
+count,command,aggregation
+6,Append,Raw
+33,Capability,Raw
+96,Check,Raw
+6,Close,Raw
+3,Create,Raw
+9,Enable,Raw
+26,Examine,Raw
+1,Expunge,Raw
+1187,Fetch,Raw
+248,Idle,Raw
+132,List,Raw
+244,Login,Raw
+169,Logout,Raw
+14,Lsub,Raw
+2,Move,Raw
+295,Noop,Raw
+658,Search,Raw
+746,Select,Raw
+203,Status,Raw
+23,Store,Raw
+3,Subscribe,Raw
+515,Unselect,Raw
+6,Append,Unique
+1,Capability,Unique
+1,Check,Unique
+1,Close,Unique
+3,Create,Unique
+2,Enable,Unique
+1,Examine,Unique
+1,Expunge,Unique
+128,Fetch,Unique
+1,Idle,Unique
+12,List,Unique
+9,Login,Unique
+1,Logout,Unique
+1,Lsub,Unique
+2,Move,Unique
+1,Noop,Unique
+14,Search,Unique
+18,Select,Unique
+22,Status,Unique
+19,Store,Unique
+3,Subscribe,Unique
+1,Unselect,Unique
diff --git a/tests/emails/mailbox_email_sizes.csv b/tests/emails/mailbox_email_sizes.csv
new file mode 100644
index 0000000..afcd630
--- /dev/null
+++ b/tests/emails/mailbox_email_sizes.csv
@@ -0,0 +1,2428 @@
+pos,size,mailbox
+0,10988,personal
+1,27704,personal
+2,43026,personal
+3,55998,personal
+4,92193,personal
+5,6348,personal
+6,5312,personal
+7,5820,personal
+8,5275,personal
+9,5312,personal
+10,6817,personal
+11,5412,personal
+12,4758,personal
+13,10434,personal
+14,16572,personal
+15,108694,personal
+16,3464,personal
+17,38964,personal
+18,3842,personal
+19,133952,personal
+20,2975,personal
+21,4101,personal
+22,8128,personal
+23,11277,personal
+24,1945,personal
+25,16028,personal
+26,2430,personal
+27,2616,personal
+28,54781,personal
+29,83451,personal
+30,50419,personal
+31,12881,personal
+32,11385,personal
+33,37353,personal
+34,1345,personal
+35,130505,personal
+36,109192,personal
+37,11364,personal
+38,59164,personal
+39,1436448,personal
+40,1436447,personal
+41,9917,personal
+42,29469,personal
+43,6040,personal
+44,6199,personal
+45,4842,personal
+46,5317,personal
+47,5117,personal
+48,20511,personal
+49,20511,personal
+50,20524,personal
+51,29203,personal
+52,28611,personal
+53,6964,personal
+54,29148,personal
+55,8015,personal
+56,7567,personal
+57,8751,personal
+58,233544,personal
+59,7549,personal
+60,5733,personal
+61,168918,personal
+62,4945,personal
+63,6883,personal
+64,260171,personal
+65,116465,personal
+66,1453,personal
+67,6562,personal
+68,6367,personal
+69,5997,personal
+70,5489,personal
+71,6221,personal
+72,61097,personal
+73,5500,personal
+74,10150,personal
+75,5454,personal
+76,5080,personal
+77,9628,personal
+78,6569,personal
+79,6252,personal
+80,110054,personal
+81,5491,personal
+82,5354,personal
+83,31057,personal
+84,4518,personal
+85,6830,personal
+86,5662,personal
+87,6020,personal
+88,5296,personal
+89,5653,personal
+90,5614,personal
+91,124107,personal
+92,123586,personal
+93,5449,personal
+94,84358,personal
+95,16534,personal
+96,11760,personal
+97,40738,personal
+98,5395,personal
+99,4979,personal
+100,5276,personal
+101,4972,personal
+102,211571,personal
+103,5355,personal
+104,16492,personal
+105,50631,personal
+106,1346,personal
+107,6232,personal
+108,41804,personal
+109,5562,personal
+110,3134,personal
+111,45611,personal
+112,765,personal
+113,16546,personal
+114,75240,personal
+115,5911,personal
+116,75363,personal
+117,5155,personal
+118,153337,personal
+119,61773,personal
+120,5419,personal
+121,5441,personal
+122,5395,personal
+123,5419,personal
+124,4982,personal
+125,5296,personal
+126,5851,personal
+127,5499,personal
+128,4832,personal
+129,5403,personal
+130,12702,personal
+131,77842,personal
+132,13377,personal
+133,50691,personal
+134,118018,personal
+135,2497,personal
+136,159149,personal
+137,1874,personal
+138,4531,personal
+139,2970,personal
+140,8801,personal
+141,11430,personal
+142,31230,personal
+143,6065,personal
+144,2097,personal
+145,1318,personal
+146,6243,personal
+147,5766,personal
+148,5370,personal
+149,5224,personal
+150,8626,personal
+151,4274,personal
+152,122687,personal
+153,16568,personal
+154,75293,personal
+155,1582,personal
+156,96133,personal
+157,49847,personal
+158,761,personal
+159,8269,personal
+160,102047,personal
+161,7989,personal
+162,6700512,personal
+163,2735,personal
+164,3924,personal
+165,93180,personal
+166,2272,personal
+167,8262,personal
+168,5306,personal
+169,27415,personal
+170,12684,personal
+171,5699,personal
+172,5557,personal
+173,5311,personal
+174,9829,personal
+175,5393,personal
+176,5249,personal
+177,8247,personal
+178,9504,personal
+179,29354,personal
+180,2977,personal
+181,4488,personal
+182,55256,personal
+183,5364,personal
+184,12328,personal
+185,24247,personal
+186,5454,personal
+187,7421,personal
+188,5268,personal
+189,4743,personal
+190,5515,personal
+191,5364,personal
+192,5352,personal
+193,6734,personal
+194,68126,personal
+195,19590,personal
+196,63306,personal
+197,3383,personal
+198,5425,personal
+199,3405,personal
+200,4690,personal
+201,14973,personal
+202,16278,personal
+203,41111,personal
+204,13487763,personal
+205,23570,personal
+206,7894,personal
+207,6375,personal
+208,4302,personal
+209,154404,personal
+210,7195,personal
+211,3754,personal
+212,2140,personal
+213,12393,personal
+214,71969,personal
+215,16951,personal
+216,62668,personal
+217,35402,personal
+218,8337,personal
+219,18178,personal
+220,22764,personal
+221,13286,personal
+222,65418,personal
+223,42071,personal
+224,1344,personal
+225,4436,personal
+226,12239,personal
+227,4656,personal
+228,35675,personal
+229,1599,personal
+230,3867,personal
+231,54796,personal
+232,11325,personal
+233,2318,personal
+234,697520,personal
+235,95386,personal
+236,4794,personal
+237,699633,personal
+238,216324,personal
+239,54641,personal
+240,15290,personal
+241,4587,personal
+242,20146,personal
+243,10810,personal
+244,223134,personal
+245,5308,personal
+246,5380,personal
+247,5383,personal
+248,15172,personal
+249,11623,personal
+250,5363,personal
+251,124804,personal
+252,7973,personal
+253,51955,personal
+254,116668,personal
+255,3798,personal
+256,6142,personal
+257,51549,personal
+258,11447,personal
+259,20550,personal
+260,23745,personal
+261,2629,personal
+262,29248,personal
+263,2096,personal
+264,26693,personal
+265,14281,personal
+266,1714,personal
+267,14026,personal
+268,22319,personal
+269,2980,personal
+270,2805,personal
+271,5424,personal
+272,5423,personal
+273,5426,personal
+274,5431,personal
+275,35136,personal
+276,120451,personal
+277,5427,personal
+278,5447,personal
+279,5427,personal
+280,12513,personal
+281,29035,personal
+282,1346,personal
+283,1346,personal
+284,30488,personal
+285,1345,personal
+286,74474,personal
+287,286076,personal
+288,34133,personal
+289,20123,personal
+290,36199,personal
+291,37734,personal
+292,35246,personal
+293,23025,personal
+294,1346,personal
+295,11087,personal
+296,3551263,personal
+297,16963,personal
+298,25394,personal
+299,123716,personal
+300,27672,personal
+301,27712,personal
+302,30050,personal
+303,87408,personal
+304,38683,personal
+305,40160,personal
+306,1346,personal
+307,4780,personal
+308,16601,personal
+309,6065,personal
+310,11431,personal
+311,10365,personal
+312,8934,personal
+313,4340,personal
+314,21579,personal
+315,6877,personal
+316,4070,personal
+317,90207,personal
+318,22981,personal
+319,10319,personal
+320,10359,personal
+321,3478528,personal
+322,879706,personal
+323,9756,personal
+324,1141732,personal
+325,2216472,personal
+326,5045,personal
+327,5498,personal
+328,4837,personal
+329,5923,personal
+330,4988,personal
+331,4803,personal
+332,6279,personal
+333,4750,personal
+334,229353,personal
+335,6585,personal
+336,5958,personal
+337,7040,personal
+338,5942,personal
+339,5015,personal
+340,4796,personal
+341,60376,personal
+342,18078,personal
+343,13588,personal
+344,21268,personal
+345,5640,personal
+346,32853,personal
+347,139216,personal
+348,6595,personal
+349,1753,personal
+350,1745,personal
+351,2287,personal
+352,165450,personal
+353,15359,personal
+354,31160,personal
+355,2482519,personal
+356,23041,personal
+357,219359,personal
+358,21070,personal
+359,6087,personal
+360,892629,personal
+361,4765,personal
+362,5605,personal
+363,10979,personal
+364,33973,personal
+365,3412,personal
+366,159790,personal
+367,7499,personal
+368,4668,personal
+369,72384,personal
+370,65135,personal
+371,10649,personal
+372,21299,personal
+373,24338,personal
+374,24273,personal
+375,26460,personal
+376,123105,personal
+377,28210,personal
+378,8109,personal
+379,15858,personal
+380,11430,personal
+381,21620,personal
+382,3604,personal
+383,27469,personal
+384,16633,personal
+385,23103,personal
+386,15261,personal
+387,30289,personal
+388,39715,personal
+389,43012,personal
+390,37162,personal
+391,28633,personal
+392,3526,personal
+393,31052,personal
+394,2600,personal
+395,38025,personal
+396,37960,personal
+397,19971,personal
+398,43690,personal
+399,23588,personal
+400,159106,personal
+401,58972,personal
+402,16365,personal
+403,9157,personal
+404,70530,personal
+405,25035,personal
+406,46121,personal
+407,189615,personal
+408,189623,personal
+409,13374,personal
+410,11030,personal
+411,70461,personal
+412,4478,personal
+413,14946,personal
+414,1345,personal
+415,17999,personal
+416,32282,personal
+417,65622,personal
+418,65600,personal
+419,21125,personal
+420,419621,personal
+421,155859,personal
+422,16185,personal
+423,4443,personal
+424,6216,personal
+425,19750,personal
+426,23160,personal
+427,1211134,personal
+428,1211176,personal
+429,27636,personal
+430,31129,personal
+431,1168,personal
+432,167150,personal
+433,17741,personal
+434,27816,personal
+435,40235,personal
+436,45600,personal
+437,49645,personal
+438,5336,personal
+439,31775,personal
+440,29347,personal
+441,25679,personal
+442,34324,personal
+443,17325,personal
+444,25600,personal
+445,41884,personal
+446,3889,personal
+447,62773,personal
+448,54677,personal
+449,31018,personal
+450,29346,personal
+451,80042,personal
+452,78099,personal
+453,84093,personal
+454,27588,personal
+455,329106,personal
+456,38900,personal
+457,40378,personal
+458,563565,personal
+459,4332,personal
+460,19009,personal
+461,26851,personal
+462,99596,personal
+463,21971,personal
+464,21588,personal
+465,17282,personal
+466,29329,personal
+467,31991,personal
+468,25679,personal
+469,48542,personal
+470,27567,personal
+471,55265,personal
+472,61304,personal
+473,215578,personal
+474,113788,personal
+475,43532,personal
+476,5323,personal
+477,29329,personal
+478,31991,personal
+479,25676,personal
+480,32442,personal
+481,2247,personal
+482,26550,personal
+483,25247,personal
+484,19597,personal
+485,26551,personal
+486,60706,personal
+487,3355,personal
+488,116004,personal
+489,51180,personal
+490,20399,personal
+491,21186,personal
+492,22222,personal
+493,11889,personal
+494,337173,personal
+495,108663,personal
+496,8307,personal
+497,22748,personal
+498,5460,personal
+499,39727,personal
+500,30202,personal
+501,32228,personal
+502,26555,personal
+503,47412,personal
+504,409018,personal
+505,19738,personal
+506,100835,personal
+507,53070,personal
+508,7831,personal
+509,33014,personal
+510,6480,personal
+511,30210,personal
+512,52665,personal
+513,9327,personal
+514,45697,personal
+515,50784,personal
+516,26812,personal
+517,92628,personal
+518,1013627,personal
+519,215559,personal
+520,5187,personal
+521,149887,personal
+522,3022,personal
+523,23086,personal
+524,23140,personal
+525,93493,personal
+526,41329,personal
+527,41327,personal
+528,170064,personal
+529,14307,personal
+530,331440,personal
+531,2549,personal
+532,2547,personal
+533,2585,personal
+534,6065,personal
+535,19904,personal
+536,10141,personal
+537,10845,personal
+538,26568,personal
+539,109856,personal
+540,11437,personal
+541,49659,personal
+542,94750,personal
+543,10435,personal
+544,17100,personal
+545,91092,personal
+546,4278,personal
+547,5908,personal
+548,3591,personal
+549,50548,personal
+550,44138,personal
+551,30689,personal
+552,7447,personal
+553,3790,personal
+554,73284,personal
+555,36735,personal
+556,94775,personal
+557,91312,personal
+558,12011,personal
+559,7267,personal
+560,8166,personal
+561,3795,personal
+562,4812,personal
+563,14140,personal
+564,8174,personal
+565,4674,personal
+566,2625,personal
+567,3794,personal
+568,84958,personal
+569,1898,personal
+570,84906,personal
+571,5544,personal
+572,5546,personal
+573,9175,personal
+574,6186,personal
+575,48620,personal
+576,3798,personal
+577,766,personal
+578,3097,personal
+579,15819,personal
+580,37577,personal
+581,39888,personal
+582,45569,personal
+583,2595,personal
+584,45303,personal
+585,12022,personal
+586,12064,personal
+587,3840,personal
+588,30648,personal
+589,4277,personal
+590,19520,personal
+591,102074,personal
+592,102075,personal
+593,123217,personal
+594,12530,personal
+595,32545,personal
+596,3796,personal
+597,20593,personal
+598,80377,personal
+599,33252,personal
+600,2022,personal
+601,92874,personal
+602,138321,personal
+603,3794,personal
+604,30204,personal
+605,30207,personal
+606,24814,personal
+607,24856,personal
+608,11708,personal
+609,8236,personal
+610,32797,personal
+611,4917,personal
+612,3091,personal
+613,3093,personal
+614,16726,personal
+615,4851,personal
+616,20339,personal
+617,20379,personal
+618,4847,personal
+619,4628,personal
+620,3796,personal
+621,1746,personal
+622,1738,personal
+623,2274,personal
+624,4799,personal
+625,9469,personal
+626,9469,personal
+627,10630,personal
+628,8170,personal
+629,34914,personal
+630,7785,personal
+631,7785,personal
+632,7785,personal
+633,7785,personal
+634,7785,personal
+635,7785,personal
+636,7785,personal
+637,4346,personal
+638,10014,personal
+639,16288,personal
+640,11084,personal
+641,1346,personal
+642,9202,personal
+643,16097,personal
+644,20571,personal
+645,3294,personal
+646,231192,personal
+647,7810,personal
+648,5515,personal
+649,3229,personal
+650,4331191,personal
+651,16241,personal
+652,23566,personal
+653,4460,personal
+654,4690,personal
+655,47755,personal
+656,26510,personal
+657,69171,personal
+658,100964,personal
+659,97938,personal
+660,112149,personal
+661,61898,personal
+662,5068,personal
+663,60174,personal
+664,5240,personal
+665,16726,personal
+666,16730,personal
+667,4681,personal
+668,4422,personal
+669,155320,personal
+670,72414,personal
+671,41602,personal
+672,1346,personal
+673,1346,personal
+674,27819,personal
+675,16728,personal
+676,30218,personal
+677,45838,personal
+678,199999,personal
+679,3128,personal
+680,3886,personal
+681,3992,personal
+682,4020,personal
+683,4091,personal
+684,2535680,personal
+685,6750,personal
+686,2926,personal
+687,2946,personal
+688,2677,personal
+689,5403,personal
+690,258438,personal
+691,61329,personal
+692,4883,personal
+693,20765,personal
+694,4452,personal
+695,4758,personal
+696,19750,personal
+697,30211,personal
+698,38731,personal
+699,113183,personal
+700,1345,personal
+701,5671,personal
+702,44266,personal
+703,46228,personal
+704,376289,personal
+705,962,personal
+706,16877,personal
+707,36532,personal
+708,71070,personal
+709,47738,personal
+710,30191,personal
+711,3922,personal
+712,3136,personal
+713,11598,personal
+714,44391,personal
+715,41098,personal
+716,32442,personal
+717,5705,personal
+718,42783,personal
+719,15601,personal
+720,120413,personal
+721,5446,personal
+722,1605,personal
+723,8328659,personal
+724,264852,personal
+725,5956,personal
+726,146369,personal
+727,1605,personal
+728,16963,personal
+729,1692,personal
+730,1345,personal
+731,46910,personal
+732,21578,personal
+733,31118,personal
+734,45763,personal
+735,3163,personal
+736,5029,personal
+737,2306,personal
+738,10955,personal
+739,2316,personal
+740,2948,personal
+741,98182,personal
+742,10595,personal
+743,10637,personal
+744,30850,personal
+745,29825,personal
+746,7687,personal
+747,30684,personal
+748,32378,personal
+749,26581,personal
+750,81517,personal
+751,11431,personal
+752,32228,personal
+753,28181,personal
+754,2200,personal
+755,2092,personal
+756,2307,personal
+757,6065,personal
+758,322708,personal
+759,322711,personal
+760,50991,personal
+761,10809,personal
+762,63100,personal
+763,15641,personal
+764,3215,personal
+765,51839,personal
+766,5291,personal
+767,7086,personal
+768,264849,personal
+769,127296,personal
+770,16469,personal
+771,3658,personal
+772,3261,personal
+773,22822,personal
+774,23941,personal
+775,3656,personal
+776,2452,personal
+777,28751,personal
+778,32646,personal
+779,37442,personal
+780,42287,personal
+781,33442,personal
+782,39108,personal
+783,43848,personal
+784,48539,personal
+785,3822,personal
+786,2759,personal
+787,2650,personal
+788,3146,personal
+789,3519,personal
+790,79643,personal
+791,1519,personal
+792,70038,personal
+793,8862,personal
+794,74977,personal
+795,115250,personal
+796,97631,personal
+797,129978,personal
+798,14296,personal
+799,39014,personal
+800,39056,personal
+801,13225829,personal
+802,33146,personal
+803,1346,personal
+804,103214,personal
+805,154914,personal
+806,126564,personal
+807,110745,personal
+808,115688,personal
+809,382958,personal
+810,1146569,personal
+811,191439,personal
+812,143936,personal
+813,41810,personal
+814,19189,personal
+815,39112,personal
+816,21466,personal
+817,21508,personal
+818,16257,personal
+819,42901,personal
+820,5230,personal
+821,81946,personal
+822,23043,personal
+823,196068,personal
+824,66879,personal
+825,21272,personal
+826,6185,personal
+827,61727,personal
+828,198514,personal
+829,73220,personal
+830,31402,personal
+831,7125,personal
+832,123046,personal
+833,54125,personal
+834,16732,personal
+835,3949,personal
+836,13974,personal
+837,26512,personal
+838,5216,personal
+839,14727,personal
+840,4558,personal
+841,26122,personal
+842,68225,personal
+843,42271,personal
+844,16243,personal
+845,4697,personal
+846,23562,personal
+847,17425,personal
+848,18839,personal
+849,24558,personal
+850,39161,personal
+851,30036,personal
+852,67071,personal
+853,84460,personal
+854,48272,personal
+855,47312,personal
+856,47027,personal
+857,47426,personal
+858,36573,personal
+859,40378,personal
+860,71618,personal
+861,47761,personal
+862,154922,personal
+863,4226,personal
+864,2806,personal
+865,4974,personal
+866,4720,personal
+867,13346,personal
+868,148283,personal
+869,249741,personal
+870,196070,personal
+871,178058,personal
+872,23657,personal
+873,16718,personal
+874,16718,personal
+875,42660,personal
+876,7096,personal
+877,175456,personal
+878,65954,personal
+879,19750,personal
+880,54656,personal
+881,79684,personal
+882,129385,personal
+883,2231,personal
+884,2231,personal
+885,34642,personal
+886,12216,personal
+887,3712,personal
+888,5586,personal
+889,1007167,personal
+890,3145,personal
+891,416953,personal
+892,13076,personal
+893,15008,personal
+894,10980,personal
+895,11850,personal
+896,203697,personal
+897,52541,personal
+898,58031,personal
+899,2376,personal
+900,44580,personal
+901,6773,personal
+902,39303,personal
+903,73398,personal
+904,1105766,personal
+905,47101,personal
+906,5466,personal
+907,4666,personal
+908,40382,personal
+909,71558,personal
+910,4947,personal
+911,3713,personal
+912,1346,personal
+913,17413,personal
+914,17537,personal
+915,6262,personal
+916,205042,personal
+917,17031,personal
+918,15311698,personal
+919,30018,personal
+920,111473,personal
+921,15710,personal
+922,125475,personal
+923,39061,personal
+924,1892,personal
+925,28361,personal
+926,6565,personal
+927,2592,personal
+928,35201,personal
+929,2737,personal
+930,41809,personal
+931,97049,personal
+932,1700951,personal
+933,10869,personal
+934,17207,personal
+935,17249,personal
+936,22429,personal
+937,217977,personal
+938,30833,personal
+939,27591,personal
+940,12407,personal
+941,104585,personal
+942,203694,personal
+943,40370,personal
+944,33448,personal
+945,11435,personal
+946,6065,personal
+947,5615,personal
+948,163229,personal
+949,27636,personal
+950,2385,personal
+951,2382,personal
+952,13407,personal
+953,2936,personal
+954,90101,personal
+955,90143,personal
+956,61186,personal
+957,5822,personal
+958,31820,personal
+959,35042,personal
+960,33470,personal
+961,24861,personal
+962,6658,personal
+963,6574,personal
+964,33216,personal
+965,4461,personal
+966,3780,personal
+967,4157,personal
+968,7683,personal
+969,8026,personal
+970,14391,personal
+971,5237,personal
+972,35491,personal
+973,19168,personal
+974,71953,personal
+975,2023,personal
+976,203698,personal
+977,1346,personal
+978,33755,personal
+979,52617,personal
+980,13076,personal
+981,63332,personal
+982,40240,personal
+983,143079,personal
+984,143121,personal
+985,33779,personal
+986,23079,personal
+987,1660,personal
+988,16261,personal
+989,266286,personal
+990,16229,personal
+991,4688,personal
+992,6850,personal
+993,1284251,personal
+994,49120,personal
+995,1437,personal
+996,96032,personal
+997,5553,personal
+998,16221,personal
+999,128480,personal
+1000,6780,personal
+1001,24772,personal
+1002,105102,personal
+1003,135764,personal
+1004,788403,personal
+1005,22430,personal
+1006,36292,personal
+1007,144924,personal
+1008,20354,personal
+1009,1346,personal
+1010,18134,personal
+1011,16191,personal
+1012,275120,personal
+1013,23559,personal
+1014,2935,personal
+1015,80367,personal
+1016,4106,personal
+1017,13064,personal
+1018,43034,personal
+1019,26566,personal
+1020,15792,personal
+1021,5969,personal
+1022,13684,personal
+1023,6600,personal
+1024,13838,personal
+1025,18914,personal
+1026,15052,personal
+1027,84238,personal
+1028,20822,personal
+1029,19750,personal
+1030,218390,personal
+1031,13650,personal
+1032,16418977,personal
+1033,41458,personal
+1034,16712,personal
+1035,1438,personal
+1036,1189,personal
+1037,1074,personal
+1038,23079,personal
+1039,60074,personal
+1040,54867,personal
+1041,4989,personal
+1042,18092,personal
+1043,204887,personal
+1044,56631,personal
+1045,80294,personal
+1046,5917,personal
+1047,3213,personal
+1048,2490793,personal
+1049,2527,personal
+1050,48147,personal
+1051,31220,personal
+1052,6671,personal
+1053,19260,personal
+1054,47634,personal
+1055,35305,personal
+1056,9236,personal
+1057,4407,personal
+1058,40474,personal
+1059,11647,personal
+1060,338144,personal
+1061,16427205,personal
+1062,66186,personal
+1063,2022,personal
+1064,13065,personal
+1065,40453,personal
+1066,6550,personal
+1067,5843,personal
+1068,6842,personal
+1069,6363,personal
+1070,204887,personal
+1071,60386,personal
+1072,19581,personal
+1073,6465,personal
+1074,12340,personal
+1075,18905,personal
+1076,164427,personal
+1077,6657,personal
+1078,8930,personal
+1079,209718,personal
+1080,12947,personal
+1081,7038,personal
+1082,6435,personal
+1083,156944,personal
+1084,5900,personal
+1085,11433,personal
+1086,8179,personal
+1087,49051,personal
+1088,3281,personal
+1089,2802464,personal
+1090,6758,personal
+1091,13892,personal
+1092,49054,personal
+1093,175699,personal
+1094,63602,personal
+1095,488824,personal
+1096,19787,personal
+1097,6065,personal
+1098,7371,personal
+1099,9893,personal
+1100,2721,personal
+1101,869721,personal
+1102,15040,personal
+1103,116310,personal
+1104,6281,personal
+1105,259363,personal
+1106,9523,personal
+1107,17277,personal
+1108,16716,personal
+1109,3118,personal
+1110,428015,personal
+1111,11661,personal
+1112,34556,personal
+1113,3283,personal
+1114,5579,personal
+1115,3695,personal
+1116,23653,personal
+1117,8927,personal
+1118,20847,personal
+1119,65086,personal
+1120,150393,personal
+1121,1346,personal
+1122,34267,personal
+1123,3405,personal
+1124,432856,personal
+1125,24295,personal
+1126,266636,personal
+1127,337074,personal
+1128,36175,personal
+1129,7601,personal
+1130,30233,personal
+1131,67433,personal
+1132,1199,personal
+1133,7112,personal
+1134,10505,personal
+1135,7584,personal
+1136,7207,personal
+1137,3732,personal
+1138,4568,personal
+1139,1565,personal
+1140,1565,personal
+1141,13805,personal
+1142,9238,personal
+1143,5553,personal
+1144,16712,personal
+1145,6061,personal
+1146,3438,personal
+1147,25065,personal
+1148,7300,personal
+1149,60576,personal
+1150,40593,personal
+1151,3587,personal
+1152,5764,personal
+1153,5643,personal
+1154,868992,personal
+1155,129639,personal
+1156,2509,personal
+1157,204887,personal
+1158,11224,personal
+1159,16157,personal
+1160,7153,personal
+1161,16235,personal
+1162,220108,personal
+1163,106681,personal
+1164,21523,personal
+1165,281067,personal
+1166,15037,personal
+1167,5155,personal
+1168,10287,personal
+1169,253205,personal
+1170,12285,personal
+1171,63287,personal
+1172,4483,personal
+1173,4806,personal
+1174,19118,personal
+1175,3390,personal
+1176,5693,personal
+1177,33754,personal
+1178,10962,personal
+1179,16203,personal
+1180,4704,personal
+1181,22663,personal
+1182,20584130,personal
+1183,5056,personal
+1184,4863,personal
+1185,4581,personal
+1186,5512,personal
+1187,68110,personal
+1188,4803,personal
+1189,16188,personal
+1190,16194,personal
+1191,16228,personal
+1192,6395,personal
+1193,22446,personal
+1194,155775,personal
+1195,21905,personal
+1196,3349,personal
+1197,4591,personal
+1198,4848,personal
+1199,7026,personal
+1200,53946,personal
+1201,12050,personal
+1202,5910,personal
+1203,6495,personal
+1204,7197,personal
+1205,14455,personal
+1206,18931,personal
+1207,6187,personal
+1208,16204,personal
+1209,5145,personal
+1210,4722,personal
+1211,3228,personal
+1212,2224,personal
+1213,22837,personal
+1214,205488,personal
+1215,2552,personal
+1216,16146,personal
+1217,44144,personal
+1218,85766,personal
+1219,11668,personal
+1220,19754,personal
+1221,129639,personal
+1222,1307,personal
+1223,1630,personal
+1224,4052,personal
+1225,36680,personal
+1226,45179,personal
+1227,180734,personal
+1228,147458,personal
+1229,1849,personal
+1230,25038,personal
+1231,206466,personal
+1232,40010,personal
+1233,8902,personal
+1234,11015,personal
+1235,6410,personal
+1236,17362,personal
+1237,4684,personal
+1238,21465,personal
+1239,1573,personal
+1240,3892,personal
+1241,3510,personal
+1242,48006,personal
+1243,6514,personal
+1244,4531,personal
+1245,9921,personal
+1246,10235,personal
+1247,9891,personal
+1248,9075,personal
+1249,4883,personal
+1250,5375,personal
+1251,5147,personal
+1252,13297,personal
+1253,15804,personal
+1254,16629,personal
+1255,17866,personal
+1256,21645,personal
+1257,21529,personal
+1258,21449,personal
+1259,25047,personal
+1260,25226,personal
+1261,5252,personal
+1262,5462,personal
+1263,86317,personal
+1264,49958,personal
+1265,6249,personal
+1266,1356,personal
+1267,1945,personal
+1268,5379,personal
+1269,5379,personal
+1270,1328,personal
+1271,6589,personal
+1272,6946,personal
+1273,118937,personal
+1274,94080,personal
+1275,21613,personal
+1276,21228,personal
+1277,29264,personal
+1278,1346,personal
+1279,28229,personal
+1280,8914,personal
+1281,4881,personal
+1282,13205,personal
+1283,3093,personal
+1284,34331,personal
+1285,17309,personal
+1286,18314,personal
+1287,23460,personal
+1288,16696,personal
+1289,52973,personal
+1290,4346,personal
+1291,4107,personal
+1292,21579,personal
+1293,6570,personal
+1294,6065,personal
+1295,1287,personal
+1296,1391,personal
+1297,2665,personal
+1298,4707,personal
+1299,5693,personal
+1300,252592,personal
+1301,16187,personal
+1302,44144,personal
+1303,12515,personal
+1304,4406,personal
+1305,61550,personal
+1306,29063,personal
+1307,11435,personal
+1308,82024,personal
+1309,16169,personal
+1310,3045,personal
+1311,14136,personal
+1312,25822,personal
+1313,94127,personal
+1314,3446,personal
+1315,259217,personal
+1316,22566,personal
+1317,8299,personal
+1318,4509,personal
+1319,39879,personal
+1320,11989,personal
+1321,28332,personal
+1322,7273,personal
+1323,27794,personal
+1324,50492,personal
+1325,15283,personal
+1326,6118,personal
+1327,2788,personal
+1328,20549,personal
+1329,7858,personal
+1330,3888,personal
+1331,1684,personal
+1332,1676,personal
+1333,128500,personal
+1334,3306,personal
+1335,4522395,personal
+1336,1730,personal
+1337,1722,personal
+1338,1594,personal
+1339,20263,personal
+1340,11447,personal
+1341,31112,personal
+1342,220809,personal
+1343,422050,personal
+1344,209401,personal
+1345,81981,personal
+1346,1558,personal
+1347,7564,personal
+1348,60817,personal
+1349,6515,personal
+1350,1346,personal
+1351,91392,personal
+1352,9906,personal
+1353,160534,personal
+1354,118358,personal
+1355,4450,personal
+1356,4321,personal
+1357,16870,personal
+1358,4438,personal
+1359,5142,personal
+1360,4745,personal
+1361,349779,personal
+1362,5243,personal
+1363,1105030,personal
+1364,30826,personal
+1365,16781,personal
+1366,17662,personal
+1367,42596,personal
+1368,2626,personal
+1369,4386,personal
+1370,3038,personal
+1371,4689,personal
+1372,16270,personal
+1373,23600,personal
+1374,2655,personal
+1375,208926,personal
+1376,4460,personal
+1377,220795,personal
+1378,28548,personal
+1379,16182,personal
+1380,16206,personal
+1381,28307,personal
+1382,243060,personal
+1383,593078,personal
+1384,16708,personal
+1385,30207,personal
+1386,22667,personal
+1387,4278,personal
+1388,4497,personal
+1389,5566,personal
+1390,5528,personal
+1391,5530,personal
+1392,16142,personal
+1393,48213,personal
+1394,3931,personal
+1395,19750,personal
+1396,268165,personal
+1397,1345,personal
+1398,1870,personal
+1399,24896,personal
+1400,5793,personal
+1401,33604,personal
+1402,4062,personal
+1403,13750,personal
+1404,33616,personal
+1405,42596,personal
+1406,2425,personal
+1407,4849,personal
+1408,5470,personal
+1409,5200,personal
+1410,220802,personal
+1411,47400,personal
+1412,52294,personal
+1413,14493,personal
+1414,88657,personal
+1415,4555,personal
+1416,120414,personal
+1417,2022,personal
+1418,1536,personal
+1419,71689,personal
+1420,93114,personal
+1421,43718,personal
+1422,2099,personal
+1423,5352,personal
+1424,7328,personal
+1425,10845,personal
+1426,68540,personal
+1427,24458,personal
+1428,2462,personal
+1429,1894,personal
+1430,5542,personal
+1431,14514,personal
+1432,220795,personal
+1433,24758,personal
+1434,1268,personal
+1435,4514,personal
+1436,6065,personal
+1437,148109,personal
+1438,1894,personal
+1439,4272,personal
+1440,4439,personal
+1441,4732,personal
+1442,4440,personal
+1443,4969,personal
+1444,5924,personal
+1445,28959,personal
+1446,4439,personal
+1447,53633,personal
+1448,4636,personal
+1449,2772,personal
+1450,4724,personal
+1451,10673,personal
+1452,4673,personal
+1453,271191,personal
+1454,11538,personal
+1455,10659,personal
+1456,22983,personal
+1457,22918,personal
+1458,16809,personal
+1459,1942,personal
+1460,8806,personal
+1461,167064,personal
+1462,2471,personal
+1463,19852,personal
+1464,21339,personal
+1465,5233,personal
+1466,220791,personal
+1467,272724,personal
+1468,3706,personal
+1469,4291,personal
+1470,4461,personal
+1471,844204,personal
+1472,1596393,personal
+1473,198879,personal
+1474,1027186,personal
+1475,2377,personal
+1476,634817,personal
+1477,5069,personal
+1478,103650,personal
+1479,103667,personal
+1480,26844,personal
+1481,7441,personal
+1482,563791,personal
+1483,4461,personal
+1484,1488,personal
+1485,499302,personal
+1486,4461,personal
+1487,2473,personal
+1488,40722,personal
+1489,47648,personal
+1490,1275,personal
+1491,816671,personal
+1492,2129,personal
+1493,2986,personal
+1494,4628,personal
+1495,4691,personal
+1496,16193,personal
+1497,1549,personal
+1498,7298,personal
+1499,4922,personal
+1500,4947,personal
+1501,47700,personal
+1502,28763,personal
+1503,44407,personal
+1504,45582,personal
+1505,14145,personal
+1506,33113,personal
+1507,2512,personal
+1508,9769,personal
+1509,47706,personal
+1510,23889,personal
+1511,11277,personal
+1512,1585,personal
+1513,720998,personal
+1514,16237,personal
+1515,53043,personal
+1516,1730,personal
+1517,3766,personal
+1518,136161,personal
+1519,6458,personal
+1520,5299,personal
+1521,2995,personal
+1522,19984,personal
+1523,4611,personal
+1524,9603,personal
+1525,277102,personal
+1526,1379,personal
+1527,3865,personal
+1528,1828,personal
+1529,48027,personal
+1530,3489,personal
+1531,76299,personal
+1532,3888,personal
+1533,32386,personal
+1534,852619,personal
+1535,8496,personal
+1536,146302,personal
+1537,4694,personal
+1538,583592,personal
+1539,4656,personal
+1540,6305,personal
+1541,5255,personal
+1542,5852,personal
+1543,34244,personal
+1544,30845,personal
+1545,201318,personal
+1546,96779,personal
+1547,11469,personal
+1548,11730,personal
+1549,11794,personal
+1550,5774,personal
+1551,1805,personal
+1552,1161067,personal
+1553,7006,personal
+1554,1285,personal
+1555,2664,personal
+1556,16737,personal
+1557,14354,personal
+1558,6180,personal
+1559,1286,personal
+1560,9963,personal
+1561,22416,personal
+1562,3373,personal
+1563,4694,personal
+1564,1348,personal
+1565,9057,personal
+1566,34085,personal
+1567,4045,personal
+1568,754554,personal
+1569,8494,personal
+1570,551856,personal
+1571,6088,personal
+1572,3299,personal
+1573,36429,personal
+1574,757618,personal
+1575,26838,personal
+1576,4573,personal
+1577,9412,personal
+1578,10145,personal
+1579,4410,personal
+1580,5223,personal
+1581,1357,personal
+1582,434981,personal
+1583,225513,personal
+1584,36897,personal
+1585,629762,personal
+1586,22292,personal
+1587,1356,personal
+1588,53833,personal
+1589,434915,personal
+1590,434895,personal
+1591,434969,personal
+1592,434908,personal
+1593,3693,personal
+1594,11914,personal
+1595,12153,personal
+1596,16716,personal
+1597,84517,personal
+1598,17876,personal
+1599,119306,personal
+1600,66005,personal
+1601,1758,personal
+1602,7293,personal
+1603,9442,personal
+1604,2384,personal
+1605,4660,personal
+1606,7266,personal
+1607,92040,personal
+1608,6653,personal
+1609,13641,personal
+1610,12014,personal
+1611,19286,personal
+1612,34501,personal
+1613,3815,personal
+1614,815,personal
+1615,61349,personal
+1616,4753,personal
+1617,9861,personal
+1618,14101,personal
+1619,11178,personal
+1620,15526,personal
+1621,33107,personal
+1622,33107,personal
+1623,22103,personal
+1624,28014,personal
+1625,5741,personal
+1626,122052,personal
+1627,144682,personal
+1628,28077,personal
+1629,110832,personal
+1630,3445,personal
+1631,68644,personal
+1632,53849,personal
+1633,132847,personal
+1634,289419,personal
+1635,6062,personal
+1636,13408,personal
+1637,4443,personal
+1638,59515,personal
+1639,3096,personal
+1640,16176,personal
+1641,5799,personal
+1642,35599,personal
+1643,1201,personal
+1644,2843,personal
+1645,3064,personal
+1646,2370,personal
+1647,11450,personal
+1648,3375,personal
+1649,227230,personal
+1650,5385,personal
+1651,5788,personal
+1652,4658,personal
+1653,4656,personal
+1654,7958,personal
+1655,4546,personal
+1656,4757,personal
+1657,1686,personal
+1658,4055,personal
+1659,2224,personal
+1660,23192,personal
+1661,257277,personal
+1662,1349,personal
+1663,14484,personal
+1664,5036,personal
+1665,5349494,personal
+1666,4653,personal
+1667,183198,personal
+1668,30055,personal
+1669,30550,personal
+1670,1393,personal
+1671,1650,personal
+1672,58403,personal
+1673,68576,personal
+1674,1349,personal
+1675,4620,personal
+1676,571731,personal
+1677,5672,personal
+1678,5682,personal
+1679,1349,personal
+1680,35143,personal
+1681,4695,personal
+1682,525746,personal
+1683,36122,personal
+1684,55951,personal
+1685,60246,personal
+1686,32713,personal
+1687,5019,personal
+1688,7741,personal
+1689,6856,personal
+1690,11361,personal
+1691,1349,personal
+1692,227221,personal
+1693,14550,personal
+1694,66050,personal
+1695,2204111,personal
+1696,16884,personal
+1697,6271,personal
+1698,14415,personal
+1699,16706,personal
+1700,51202,personal
+1701,51194,personal
+1702,468194,personal
+1703,23329,personal
+1704,14291,personal
+1705,18823,personal
+1706,533759,personal
+1707,4610,personal
+1708,19820,personal
+1709,16711,personal
+1710,3853,personal
+1711,16715,personal
+1712,534797,personal
+1713,78003,personal
+1714,7164,personal
+1715,4424,personal
+1716,16072,personal
+1717,6269,personal
+1718,8614,personal
+1719,204200,personal
+1720,8698,personal
+1721,148965,personal
+1722,5908,personal
+1723,13987,personal
+1724,582644,personal
+1725,5024,personal
+1726,7046,personal
+1727,6446,personal
+1728,3251,personal
+1729,3017,personal
+1730,38578,personal
+1731,10411,personal
+1732,6526,personal
+1733,12293,personal
+1734,227222,personal
+1735,22338,personal
+1736,45128,personal
+1737,42234,personal
+1738,57453,personal
+1739,99301,personal
+1740,4004,personal
+1741,984471,personal
+1742,1596428,personal
+1743,1063483,personal
+1744,384566,personal
+1745,1985,personal
+1746,9805,personal
+1747,6294,personal
+1748,1348,personal
+1749,14201,personal
+1750,86449,personal
+1751,7208,personal
+1752,4081,personal
+1753,59957,personal
+1754,2505,personal
+1755,3075,personal
+1756,16727,personal
+1757,34484,personal
+1758,7071,personal
+1759,19751,personal
+1760,10394,personal
+1761,2716,personal
+1762,55449,personal
+1763,7226,personal
+1764,20279,personal
+1765,18381,personal
+1766,18129,personal
+1767,9204,personal
+1768,11635,personal
+1769,13681,personal
+1770,10922,personal
+1771,27906,personal
+1772,70764,personal
+1773,70764,personal
+1774,70764,personal
+1775,70764,personal
+1776,70764,personal
+1777,70764,personal
+1778,70764,personal
+1779,7545,personal
+1780,7545,personal
+1781,7545,personal
+1782,7545,personal
+1783,7545,personal
+1784,7545,personal
+1785,7545,personal
+1786,93520,personal
+1787,28358,personal
+1788,11807,personal
+1789,11815,personal
+1790,312483,personal
+1791,7163,personal
+1792,7182,personal
+1793,7418,personal
+1794,30352,personal
+1795,30315,personal
+1796,7871,personal
+1797,10628,personal
+1798,9535,personal
+1799,4672041,personal
+1800,14304,personal
+1801,28683,personal
+1802,2795,personal
+1803,3188,personal
+1804,2997,personal
+1805,8280,personal
+1806,3314,personal
+1807,1512,personal
+1808,2235,personal
+1809,11158,personal
+1810,26729,personal
+1811,1555,personal
+1812,13398,personal
+1813,652095,personal
+1814,12227,personal
+1815,49723,personal
+1816,3863,personal
+1817,1463982,personal
+1818,10795,personal
+1819,2427,personal
+1820,6493,personal
+1821,29273,personal
+1822,2509,personal
+1823,3547,personal
+1824,3432,personal
+1825,3693,personal
+1826,14175,personal
+1827,3488,personal
+1828,3704,personal
+1829,13230,personal
+1830,14704,personal
+1831,3701,personal
+1832,7055,personal
+1833,10220,personal
+1834,6452,personal
+1835,2397,personal
+1836,97816,personal
+1837,311964,personal
+1838,5372,personal
+1839,9347,personal
+1840,3708,personal
+1841,21518,personal
+1842,4451,personal
+1843,14649,personal
+1844,26348,personal
+1845,1357,personal
+1846,15043,personal
+1847,25183,personal
+1848,1349,personal
+1849,4574,personal
+1850,5059,personal
+1851,2427,personal
+1852,47579,personal
+1853,12360,personal
+1854,50329,personal
+1855,50337,personal
+1856,77446,personal
+1857,98260,personal
+1858,1436,personal
+1859,3335,personal
+1860,6265,personal
+1861,60526,personal
+1862,5712,personal
+1863,4484,personal
+1864,4326,personal
+1865,4833,personal
+1866,16255,personal
+1867,66769,personal
+1868,104508,personal
+1869,1319310,personal
+1870,2348,personal
+1871,104508,personal
+1872,385566,personal
+1873,90936,personal
+1874,90995,personal
+1875,90733,personal
+1876,90733,personal
+1877,4131,personal
+1878,8708,personal
+1879,5536,personal
+1880,1349,personal
+1881,4983,personal
+1882,18027,personal
+1883,17359,personal
+1884,5151,personal
+1885,92809,personal
+1886,21199,personal
+1887,312418,personal
+1888,3527,personal
+1889,18389,personal
+1890,5210,personal
+1891,49731,personal
+1892,49723,personal
+1893,16743,personal
+1894,5786,personal
+1895,4958,personal
+1896,4994,personal
+1897,5006,personal
+1898,4996,personal
+1899,4894,personal
+1900,130397,personal
+1901,4950,personal
+1902,10179,personal
+1903,78041,personal
+1904,21595,personal
+1905,1357,personal
+1906,231960,personal
+1907,1589,personal
+1908,1790,personal
+1909,1764,personal
+1910,5030,personal
+1911,4450,personal
+1912,6192,personal
+1913,311825,personal
+1914,5171,personal
+1915,582904,personal
+1916,38500,personal
+1917,2748,personal
+1918,169644,personal
+1919,656534,personal
+1920,2062,personal
+1921,16735,personal
+1922,65026,personal
+1923,59900,personal
+1924,19751,personal
+1925,209612,personal
+1926,311829,personal
+1927,9816,personal
+1928,29342,personal
+1929,16192,personal
+1930,112768,personal
+1931,1491,personal
+1932,2248,personal
+1933,2130,personal
+1934,1071,personal
+1935,111473,personal
+1936,67433,personal
+1937,86214,personal
+1938,26555,personal
+1939,6999,personal
+1940,25981,personal
+1941,35195,personal
+1942,1752,personal
+1943,1744,personal
+1944,2549,personal
+1945,2585,personal
+1946,93256,personal
+1947,279295,personal
+1948,318753,personal
+1949,5055,personal
+1950,4983,personal
+1951,9579,personal
+1952,5035,personal
+1953,5285,personal
+1954,6452,personal
+1955,5081,personal
+1956,5924,personal
+1957,17476,personal
+1958,26683,personal
+1959,26538,personal
+1960,5029,personal
+1961,35086,personal
+1962,22782,personal
+1963,3990,personal
+1964,318749,personal
+1965,6613,personal
+1966,2985,personal
+1967,67524,personal
+1968,13906,personal
+1969,49817,personal
+1970,2536,personal
+1971,20106,personal
+1972,28159,personal
+1973,72032,personal
+1974,24723,personal
+1975,168692,personal
+1976,37272,personal
+1977,31154,personal
+1978,3111,personal
+1979,318753,personal
+1980,1357,personal
+1981,2864,personal
+1982,1512,personal
+1983,7229,personal
+1984,112847,personal
+1985,9595,personal
+1986,6918,personal
+1987,194701,personal
+1988,196830,personal
+1989,202695,personal
+1990,3246,personal
+1991,75125,personal
+1992,208331,personal
+1993,6896,personal
+1994,139517,personal
+1995,141290,personal
+1996,146064,personal
+1997,582005,personal
+1998,3028,personal
+1999,152075,personal
+2000,7709,personal
+2001,11121,personal
+2002,6332,personal
+2003,160332,personal
+2004,33150,personal
+2005,39364,personal
+2006,64145,personal
+2007,161255,personal
+2008,5784,personal
+2009,4732,personal
+2010,2493,personal
+2011,2602,personal
+2012,2934,personal
+2013,2583,personal
+2014,2773,personal
+2015,3815,personal
+2016,11814,personal
+2017,16661,personal
+2018,3558,personal
+2019,53462,personal
+2020,191425,personal
+2021,318751,personal
+2022,2194,personal
+2023,2029,personal
+2024,5132,personal
+2025,273842,personal
+2026,6261,personal
+2027,6817,personal
+2028,908189,personal
+2029,60399,personal
+2030,3639,personal
+2031,63917,personal
+2032,8869,personal
+2033,21686,personal
+2034,7742,personal
+2035,7647,personal
+2036,10490,personal
+2037,5116,personal
+2038,22354,personal
+2039,29887,personal
+2040,43967,personal
+2041,2845,personal
+2042,50108,personal
+2043,6733,personal
+2044,5254,personal
+2045,485352,personal
+2046,1076610,personal
+2047,21622,personal
+2048,11836,personal
+2049,2019,personal
+2050,85704,personal
+2051,135646,personal
+2052,19871,personal
+2053,7126,personal
+2054,903991,personal
+2055,4960,personal
+2056,41659,personal
+2057,12558,personal
+2058,19339,personal
+2059,4401,personal
+2060,22280,personal
+2061,19861,personal
+2062,62083,personal
+2063,28538,personal
+2064,21765,personal
+2065,45044,personal
+2066,27824,personal
+2067,107442,personal
+2068,10883,personal
+2069,55860,personal
+2070,29534,personal
+2071,55872,personal
+2072,1955,personal
+2073,10979,personal
+2074,55045,personal
+2075,44704,personal
+2076,101343,personal
+2077,6452,personal
+2078,6176,personal
+2079,21940,personal
+2080,47127,personal
+2081,86773,personal
+2082,62307,personal
+2083,80272,personal
+2084,6847,personal
+2085,10454,personal
+2086,12258,personal
+2087,209527,personal
+2088,29059,personal
+2089,12712,personal
+2090,9857,personal
+2091,2887,personal
+2092,147536,personal
+2093,55099,personal
+2094,64299,personal
+2095,6979,personal
+2096,11212,personal
+2097,19593,personal
+2098,10554,personal
+2099,60830,personal
+2100,3861,personal
+2101,4165,personal
+2102,1560,personal
+2103,39554,personal
+2104,33125,personal
+2105,6287,personal
+2106,32288,personal
+2107,26784,personal
+2108,62032,personal
+2109,113896,personal
+2110,19576,personal
+2111,1959,personal
+2112,12963,personal
+2113,794113,personal
+2114,582301,personal
+2115,50105,personal
+2116,16285,personal
+2117,47254,personal
+2118,221535,personal
+2119,275148,personal
+2120,3337,personal
+2121,5029,personal
+2122,318752,personal
+2123,1347,personal
+2124,8983,personal
+2125,28259,personal
+2126,3136,personal
+2127,5723,personal
+2128,3410,personal
+2129,14536,personal
+2130,49858,personal
+2131,32878,personal
+2132,12002,personal
+2133,2913,personal
+2134,24177,personal
+2135,18759,personal
+2136,38371,personal
+2137,5465,personal
+2138,1281175,personal
+2139,22331,personal
+2140,85687,personal
+2141,318752,personal
+2142,4699,personal
+2143,36943,personal
+2144,1348,personal
+2145,551460,personal
+2146,105202,personal
+2147,157420,personal
+2148,1566,personal
+2149,5269,personal
+2150,4837,personal
+2151,4835,personal
+2152,4934,personal
+2153,4467,personal
+2154,6454,personal
+2155,5115,personal
+2156,64312,personal
+2157,58013,personal
+2158,66602,personal
+2159,6777,personal
+2160,8932,personal
+2161,5042,personal
+2162,4653,personal
+2163,5029,personal
+2164,4651,personal
+2165,66600,personal
+2166,5748,personal
+2167,5750,personal
+2168,5785,personal
+2169,125623,personal
+2170,3465,personal
+2171,3851,personal
+2172,4906,personal
+2173,2490,personal
+2174,76240,personal
+2175,112715,personal
+2176,108003,personal
+2177,36454,personal
+2178,11704,personal
+2179,10595,personal
+2180,12908,personal
+2181,6302,personal
+2182,9423,personal
+2183,106475,personal
+2184,27475,personal
+2185,5348,personal
+2186,5444,personal
+2187,325201,personal
+2188,4088,personal
+2189,6476,personal
+2190,9691,personal
+2191,9618,personal
+2192,28048,personal
+2193,43034,personal
+2194,6452,personal
+2195,5833,personal
+2196,4724,personal
+2197,4675,personal
+2198,82191,personal
+2199,42475,personal
+2200,19319,personal
+2201,19667,personal
+2202,5359,personal
+2203,1108,personal
+2204,25544,personal
+2205,18492,personal
+2206,4364,personal
+2207,4549,personal
+2208,5982,personal
+2209,5010,personal
+2210,279308,personal
+2211,2704,personal
+2212,12634,personal
+2213,3446,personal
+2214,3112,personal
+2215,4210,personal
+2216,3920,personal
+2217,3985,personal
+2218,4786,personal
+2219,2465,personal
+2220,43030,personal
+2221,32821,personal
+2222,12775,personal
+2223,3144,personal
+2224,1572,personal
+2225,4750,personal
+2226,164896,personal
+2227,228538,personal
+2228,2534,personal
+2229,7685,personal
+2230,709325,personal
+2231,16312,personal
+2232,11446,personal
+2233,25577,personal
+2234,1492,personal
+2235,1492,personal
+2236,8969,personal
+2237,8061,personal
+2238,724446,personal
+2239,15757,personal
+2240,13251,personal
+2241,13251,personal
+2242,10876,personal
+2243,5103,personal
+2244,5405,personal
+2245,71210,personal
+2246,4287,personal
+2247,651056,personal
+2248,27099,personal
+2249,12635,personal
+2250,723,personal
+2251,1079,personal
+2252,567459,personal
+2253,144264,personal
+2254,9460,personal
+2255,31002,personal
+2256,73559,personal
+2257,4230,personal
+2258,4713,personal
+2259,5024,personal
+2260,38647,personal
+2261,41058,personal
+2262,41496,personal
+2263,119170,personal
+2264,11635,personal
+2265,27375,personal
+2266,7759,personal
+2267,2146,personal
+2268,3724,personal
+2269,4996,personal
+2270,2811,personal
+2271,37985,personal
+2272,32553,personal
+2273,2940,personal
+2274,47618,personal
+2275,1762,personal
+2276,325200,personal
+2277,5405,personal
+2278,1591,personal
+2279,63849,personal
+2280,4676,personal
+2281,31885,personal
+2282,8031,personal
+2283,63019,personal
+2284,63029,personal
+2285,4912,personal
+2286,16884,personal
+2287,16989,personal
+2288,34496,personal
+2289,16886,personal
+2290,16980,personal
+2291,16894,personal
+2292,6588,personal
+2293,76875,personal
+2294,134765,personal
+2295,47047,personal
+2296,3397,personal
+2297,49301,personal
+2298,6532,personal
+2299,5344,personal
+2300,6779,personal
+2301,6672,personal
+2302,5758,personal
+2303,8183,personal
+2304,6528,personal
+2305,6763,personal
+2306,29384,personal
+2307,6909,personal
+2308,42787,personal
+2309,14995,personal
+2310,4916,personal
+2311,9493,personal
+2312,16382,personal
+2313,42229,personal
+2314,40629,personal
+2315,6452,personal
+2316,7593,personal
+2317,10583,personal
+2318,4418,personal
+2319,3877,personal
+2320,3832,personal
+2321,3892,personal
+2322,4510,personal
+2323,4070,personal
+2324,4540,personal
+2325,18890,personal
+2326,5005,personal
+0,1197,dataset
+1,669,dataset
+2,2446863,dataset
+3,17570,dataset
+4,32629,dataset
+5,20966,dataset
+6,17060,dataset
+7,6813,dataset
+8,1536,dataset
+9,33864,dataset
+10,32553,dataset
+11,184932,dataset
+12,16344,dataset
+13,6302,dataset
+14,14536,dataset
+15,5255,dataset
+16,11538,dataset
+17,20549,dataset
+18,21465,dataset
+19,10962,dataset
+20,33754,dataset
+21,3383940,dataset
+22,3007,dataset
+23,695324,dataset
+24,2006073,dataset
+25,21523,dataset
+26,23653,dataset
+27,19581,dataset
+28,17413,dataset
+29,26122,dataset
+30,23941,dataset
+31,47047,dataset
+32,25577,dataset
+33,36454,dataset
+34,44704,dataset
+35,39364,dataset
+36,59164,dataset
+37,41804,dataset
+38,49847,dataset
+39,19590,dataset
+40,60376,dataset
+41,17741,dataset
+42,44138,dataset
+43,32797,dataset
+44,45838,dataset
+45,28181,dataset
+46,42271,dataset
+47,24861,dataset
+48,20822,dataset
+49,31220,dataset
+50,3281,dataset
+51,17277,dataset
+52,43718,dataset
+53,40722,dataset
+54,289419,dataset
+55,525746,dataset
+56,29273,dataset
+57,35086,dataset
+58,20106,dataset
+59,22782,dataset
+60,5808,dataset
+61,62307,dataset
+62,3321,dataset
+63,71315,dataset
+64,6578,dataset
+65,10878,dataset
+66,37947,dataset
+67,21278,dataset
+68,3957,dataset
+69,3987,dataset
+70,4102,dataset
+71,4233,dataset
+72,4194,dataset
+73,4065,dataset
+74,3927,dataset
+75,3886,dataset
+76,4352,dataset
+77,3933,dataset
+78,4104,dataset
+79,4794,dataset
+80,4804,dataset
+81,49034,dataset
+82,6361558,dataset
+83,124050,dataset
+84,137595,dataset
+85,19489,dataset
+86,28247,dataset
+87,84954,dataset
+88,14315,dataset
+89,1391,dataset
+90,4127,dataset
+91,3884,dataset
+92,1280,dataset
+93,5502023,dataset
+94,2487,dataset
+95,83298,dataset
+96,911,dataset
+97,1607,dataset
+98,737,dataset
+99,2615,dataset
diff --git a/tests/emails/report.R b/tests/emails/report.R
new file mode 100644
index 0000000..928597a
--- /dev/null
+++ b/tests/emails/report.R
@@ -0,0 +1,14 @@
+library(tidyverse)
+library(lubridate)
+read_csv("imap_commands_summary.csv") -> cmd
+
+ggplot(cmd, aes(x=command, y=count)) +
+ geom_bar(stat = "identity")+
+ theme_classic() +
+ facet_wrap(~aggregation, ncol=1, scales = "free")
+
+read_csv("mailbox_email_sizes.csv") -> mbx
+ggplot(mbx, aes(x=size, colour=mailbox)) +
+ stat_ecdf(pad=FALSE,geom = "step") +
+scale_x_log10()+ theme_classic()
+