init bundle-size=4
----
Size: 0

put
abc
----
Size: 8
nKeys=1; bundleSize=4
blockPrefixLen=3; currentBundleLen=3; currentBundleKeys=1
Offsets:
  0000  0000  0003
Data (len=3):
abc

unsafe-get i=(0)
----
UnsafeGet(0) = abc

finish rows=1
----
prefix-bytes
 ├── 0-1: x 02 # bundle size: 4
 ├── offsets table
 │    ├── 1-2: x 01 # encoding: 1b
 │    ├── 2-3: x 03 # data[0] = 3 [8 overall]
 │    ├── 3-4: x 03 # data[1] = 3 [8 overall]
 │    └── 4-5: x 03 # data[2] = 3 [8 overall]
 └── data
      ├── 5-8: x 616263 # data[00]: abc (block prefix)
      ├── 8-8: x        # data[01]: ... (bundle prefix)
      └── 8-8: x        # data[02]: ...

init bundle-size=4
----
Size: 0

put
abc
----
Size: 8
nKeys=1; bundleSize=4
blockPrefixLen=3; currentBundleLen=3; currentBundleKeys=1
Offsets:
  0000  0000  0003
Data (len=3):
abc

unsafe-get i=(0)
----
UnsafeGet(0) = abc

put
abcd
----
Size: 10
nKeys=2; bundleSize=4
blockPrefixLen=3; currentBundleLen=7; currentBundleKeys=2
Offsets:
  0000  0000  0003  0007
Data (len=7):
abcabcd

unsafe-get i=(0, 1)
----
UnsafeGet(0) = abc
UnsafeGet(1) = abcd

put
abce
----
Size: 12
nKeys=3; bundleSize=4
blockPrefixLen=3; currentBundleLen=11; currentBundleKeys=3
Offsets:
  0000  0000  0003  0007  0011
Data (len=11):
abcabcdabce

unsafe-get i=(1, 2)
----
UnsafeGet(1) = abcd
UnsafeGet(2) = abce

put
abdd
----
Size: 17
nKeys=4; bundleSize=4
blockPrefixLen=2; currentBundleLen=15; currentBundleKeys=4
Offsets:
  0000  0000  0003  0007  0011  0015
Data (len=15):
abcabcdabceabdd

unsafe-get i=(2, 3)
----
UnsafeGet(2) = abce
UnsafeGet(3) = abdd

put
abde
----
Size: 21
nKeys=5; bundleSize=4
blockPrefixLen=2; currentBundleLen=4; currentBundleKeys=1
Offsets:
  0000  0002  0003  0007  0011  0015  0000  0019
Data (len=19):
abcabcdabceabddabde

unsafe-get i=(3, 4)
----
UnsafeGet(3) = abdd
UnsafeGet(4) = abde

# Try finishing just the n-1 rows.

finish rows=4
----
prefix-bytes
 ├── 00-01: x 02 # bundle size: 4
 ├── offsets table
 │    ├── 01-02: x 01 # encoding: 1b
 │    ├── 02-03: x 02 # data[0] = 2 [10 overall]
 │    ├── 03-04: x 02 # data[1] = 2 [10 overall]
 │    ├── 04-05: x 03 # data[2] = 3 [11 overall]
 │    ├── 05-06: x 05 # data[3] = 5 [13 overall]
 │    ├── 06-07: x 07 # data[4] = 7 [15 overall]
 │    └── 07-08: x 09 # data[5] = 9 [17 overall]
 └── data
      ├── 08-10: x 6162 # data[00]: ab (block prefix)
      ├── 10-10: x      # data[01]: .. (bundle prefix)
      ├── 10-11: x 63   # data[02]: ..c
      ├── 11-13: x 6364 # data[03]: ..cd
      ├── 13-15: x 6365 # data[04]: ..ce
      └── 15-17: x 6464 # data[05]: ..dd

# Finish the entirety of all put rows.

finish rows=5
----
prefix-bytes
 ├── 00-01: x 02 # bundle size: 4
 ├── offsets table
 │    ├── 01-02: x 01 # encoding: 1b
 │    ├── 02-03: x 02 # data[0] = 2 [12 overall]
 │    ├── 03-04: x 02 # data[1] = 2 [12 overall]
 │    ├── 04-05: x 03 # data[2] = 3 [13 overall]
 │    ├── 05-06: x 05 # data[3] = 5 [15 overall]
 │    ├── 06-07: x 07 # data[4] = 7 [17 overall]
 │    ├── 07-08: x 09 # data[5] = 9 [19 overall]
 │    ├── 08-09: x 0b # data[6] = 11 [21 overall]
 │    └── 09-10: x 0b # data[7] = 11 [21 overall]
 └── data
      ├── 10-12: x 6162 # data[00]: ab (block prefix)
      ├── 12-12: x      # data[01]: .. (bundle prefix)
      ├── 12-13: x 63   # data[02]: ..c
      ├── 13-15: x 6364 # data[03]: ..cd
      ├── 15-17: x 6365 # data[04]: ..ce
      ├── 17-19: x 6464 # data[05]: ..dd
      ├── 19-21: x 6465 # data[06]: ..de (bundle prefix)
      └── 21-21: x      # data[07]: ....

get indices=(0, 1, 2, 3, 4)
----
abc
abcd
abce
abdd
abde

search
a
ab
abaaaa
abc
abcc
abccaat
abcd
abcda
----
Search("a") = (0, false)
Search("ab") = (0, false)
Search("abaaaa") = (0, false)
Search("abc") = (0, true)
Search("abcc") = (1, false)
Search("abccaat") = (1, false)
Search("abcd") = (1, true)
Search("abcda") = (2, false)

search
abce
abdd
abde
abdeee
abdf
----
Search("abce") = (2, true)
Search("abdd") = (3, true)
Search("abde") = (4, true)
Search("abdeee") = (5, false)
Search("abdf") = (5, false)

init bundle-size=4
----
Size: 0

put
aaabbbc
----
Size: 12
nKeys=1; bundleSize=4
blockPrefixLen=7; currentBundleLen=7; currentBundleKeys=1
Offsets:
  0000  0000  0007
Data (len=7):
aaabbbc

put
aaabbbcc
----
Size: 14
nKeys=2; bundleSize=4
blockPrefixLen=7; currentBundleLen=15; currentBundleKeys=2
Offsets:
  0000  0000  0007  0015
Data (len=15):
aaabbbcaaabbbcc

put
aaabbbcde
----
Size: 17
nKeys=3; bundleSize=4
blockPrefixLen=7; currentBundleLen=24; currentBundleKeys=3
Offsets:
  0000  0000  0007  0015  0024
Data (len=24):
aaabbbcaaabbbccaaabbbcde

put
aaabbbce
----
Size: 19
nKeys=4; bundleSize=4
blockPrefixLen=7; currentBundleLen=32; currentBundleKeys=4
Offsets:
  0000  0000  0007  0015  0024  0032
Data (len=32):
aaabbbcaaabbbccaaabbbcdeaaabbbce

unsafe-get i=(2, 3)
----
UnsafeGet(2) = aaabbbcde
UnsafeGet(3) = aaabbbce

put
aaabbbdee*
----
Size: 25
nKeys=5; bundleSize=4
blockPrefixLen=6; currentBundleLen=10; currentBundleKeys=1
Offsets:
  0000  0007  0007  0015  0024  0032  0000  0042
Data (len=42):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*

unsafe-get i=(3, 4)
----
UnsafeGet(3) = aaabbbce
UnsafeGet(4) = aaabbbdee*

put
aaabbbdee*
----
Size: 26
nKeys=6; bundleSize=4
blockPrefixLen=6; currentBundleLen=10; currentBundleKeys=1
Offsets:
  0000  0007  0007  0015  0024  0032  0000  0042  0042
Data (len=42):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*

unsafe-get i=(4, 5)
----
UnsafeGet(4) = aaabbbdee*
UnsafeGet(5) = aaabbbdee*

put
aaabbbdee*
----
Size: 27
nKeys=7; bundleSize=4
blockPrefixLen=6; currentBundleLen=10; currentBundleKeys=1
Offsets:
  0000  0007  0007  0015  0024  0032  0000  0042  0042  0042
Data (len=42):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*

unsafe-get i=(5, 6)
----
UnsafeGet(5) = aaabbbdee*
UnsafeGet(6) = aaabbbdee*

put
aaabbbeff
----
Size: 31
nKeys=8; bundleSize=4
blockPrefixLen=6; currentBundleLen=19; currentBundleKeys=2
Offsets:
  0000  0007  0007  0015  0024  0032  0000  0042  0042  0042
  0051
Data (len=51):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*aaabbbeff

unsafe-get i=(6, 7)
----
UnsafeGet(6) = aaabbbdee*
UnsafeGet(7) = aaabbbeff

put
aaabbe
----
Size: 35
nKeys=9; bundleSize=4
blockPrefixLen=5; currentBundleLen=6; currentBundleKeys=1
Offsets:
  0000  0007  0007  0015  0024  0032  0038  0042  0042  0042
  0051  0000  0057
Data (len=57):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*aaabbbeffaaabbe

put
aaabbeef*
----
Size: 39
nKeys=10; bundleSize=4
blockPrefixLen=5; currentBundleLen=15; currentBundleKeys=2
Offsets:
  0000  0007  0007  0015  0024  0032  0038  0042  0042  0042
  0051  0000  0057  0066
Data (len=66):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*aaabbbeffaaabbeaaa
bbeef*

put
aaabbeef*
----
Size: 40
nKeys=11; bundleSize=4
blockPrefixLen=5; currentBundleLen=15; currentBundleKeys=2
Offsets:
  0000  0007  0007  0015  0024  0032  0038  0042  0042  0042
  0051  0000  0057  0066  0066
Data (len=66):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*aaabbbeffaaabbeaaa
bbeef*

put
aaabc
----
Size: 46
nKeys=12; bundleSize=4
blockPrefixLen=4; currentBundleLen=20; currentBundleKeys=3
Offsets:
  0000  0007  0007  0015  0024  0032  0038  0042  0042  0042
  0051  0000  0057  0066  0066  0071
Data (len=71):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*aaabbbeffaaabbeaaa
bbeef*aaabc

put
aabcceef*
aabcceef*
----
Size: 60
nKeys=14; bundleSize=4
blockPrefixLen=2; currentBundleLen=9; currentBundleKeys=1
Offsets:
  0000  0007  0007  0015  0024  0032  0038  0042  0042  0042
  0051  0055  0057  0066  0066  0071  0000  0080  0080
Data (len=80):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*aaabbbeffaaabbeaaa
bbeef*aaabcaabcceef*

# Add a 15th key that will force 16-bit offsets if we include it.

put
aabcceegggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
----
Size: 335
nKeys=15; bundleSize=4
blockPrefixLen=2; currentBundleLen=270; currentBundleKeys=2
Offsets:
  0000  0007  0007  0015  0024  0032  0038  0042  0042  0042
  0051  0055  0057  0066  0066  0071  0000  0080  0080  0341
Data (len=341):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*aaabbbeffaaabbeaaa
bbeef*aaabcaabcceef*aabcceeggggggggggggggggggggggggggggggggg
gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
ggggggggggggggggggggggggggggggggggggggggg

# But if we don't include it, we should still get 8-bit offsets.

finish rows=14
----
prefix-bytes
 ├── 00-01: x 02 # bundle size: 4
 ├── offsets table
 │    ├── 01-02: x 01 # encoding: 1b
 │    ├── 02-03: x 02 # data[0] = 2 [23 overall]
 │    ├── 03-04: x 07 # data[1] = 7 [28 overall]
 │    ├── 04-05: x 07 # data[2] = 7 [28 overall]
 │    ├── 05-06: x 08 # data[3] = 8 [29 overall]
 │    ├── 06-07: x 0a # data[4] = 10 [31 overall]
 │    ├── 07-08: x 0b # data[5] = 11 [32 overall]
 │    ├── 08-09: x 0f # data[6] = 15 [36 overall]
 │    ├── 09-10: x 13 # data[7] = 19 [40 overall]
 │    ├── 10-11: x 13 # data[8] = 19 [40 overall]
 │    ├── 11-12: x 13 # data[9] = 19 [40 overall]
 │    ├── 12-13: x 16 # data[10] = 22 [43 overall]
 │    ├── 13-14: x 18 # data[11] = 24 [45 overall]
 │    ├── 14-15: x 1a # data[12] = 26 [47 overall]
 │    ├── 15-16: x 1f # data[13] = 31 [52 overall]
 │    ├── 16-17: x 1f # data[14] = 31 [52 overall]
 │    ├── 17-18: x 20 # data[15] = 32 [53 overall]
 │    ├── 18-19: x 27 # data[16] = 39 [60 overall]
 │    ├── 19-20: x 27 # data[17] = 39 [60 overall]
 │    └── 20-21: x 27 # data[18] = 39 [60 overall]
 └── data
      ├── 21-23: x 6161           # data[00]: aa (block prefix)
      ├── 23-28: x 6162626263     # data[01]: ..abbbc (bundle prefix)
      ├── 28-28: x                # data[02]: .......
      ├── 28-29: x 63             # data[03]: .......c
      ├── 29-31: x 6465           # data[04]: .......de
      ├── 31-32: x 65             # data[05]: .......e
      ├── 32-36: x 61626262       # data[06]: ..abbb (bundle prefix)
      ├── 36-40: x 6465652a       # data[07]: ......dee*
      ├── 40-40: x                # data[08]: ..........
      ├── 40-40: x                # data[09]: ..........
      ├── 40-43: x 656666         # data[10]: ......eff
      ├── 43-45: x 6162           # data[11]: ..ab (bundle prefix)
      ├── 45-47: x 6265           # data[12]: ....be
      ├── 47-52: x 626565662a     # data[13]: ....beef*
      ├── 52-52: x                # data[14]: .........
      ├── 52-53: x 63             # data[15]: ....c
      ├── 53-60: x 6263636565662a # data[16]: ..bcceef* (bundle prefix)
      ├── 60-60: x                # data[17]: .........
      └── 60-60: x                # data[18]: .........


get indices=(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
----
aaabbbc
aaabbbcc
aaabbbcde
aaabbbce
aaabbbdee*
aaabbbdee*
aaabbbdee*
aaabbbeff
aaabbe
aaabbeef*
aaabbeef*
aaabc
aabcceef*
aabcceef*

search
a
aaabb
aaabbbc
aaabbbca
aaabbbcc
aaabbbcca
aaabbbcde
----
Search("a") = (0, false)
Search("aaabb") = (0, false)
Search("aaabbbc") = (0, true)
Search("aaabbbca") = (1, false)
Search("aaabbbcc") = (1, true)
Search("aaabbbcca") = (2, false)
Search("aaabbbcde") = (2, true)

search
aaabbbcef
aaabbbdee
aaabbbdee*
aaabbee
aabcceef*
aabcceef**
abba
----
Search("aaabbbcef") = (4, false)
Search("aaabbbdee") = (4, false)
Search("aaabbbdee*") = (4, true)
Search("aaabbee") = (9, false)
Search("aabcceef*") = (12, true)
Search("aabcceef**") = (14, false)
Search("abba") = (14, false)

bundle-prefixes
----
0: "abbbc"
1: "abbb"
2: "ab"
3: "bcceef*"

# But if we do include the 15-th key, we should get 16-bit offsets.

finish rows=15
----
prefix-bytes
 ├── 000-001: x 02 # bundle size: 4
 ├── offsets table
 │    ├── 001-002: x 02   # encoding: 2b
 │    ├── 002-004: x 0200 # data[0] = 2 [44 overall]
 │    ├── 004-006: x 0700 # data[1] = 7 [49 overall]
 │    ├── 006-008: x 0700 # data[2] = 7 [49 overall]
 │    ├── 008-010: x 0800 # data[3] = 8 [50 overall]
 │    ├── 010-012: x 0a00 # data[4] = 10 [52 overall]
 │    ├── 012-014: x 0b00 # data[5] = 11 [53 overall]
 │    ├── 014-016: x 0f00 # data[6] = 15 [57 overall]
 │    ├── 016-018: x 1300 # data[7] = 19 [61 overall]
 │    ├── 018-020: x 1300 # data[8] = 19 [61 overall]
 │    ├── 020-022: x 1300 # data[9] = 19 [61 overall]
 │    ├── 022-024: x 1600 # data[10] = 22 [64 overall]
 │    ├── 024-026: x 1800 # data[11] = 24 [66 overall]
 │    ├── 026-028: x 1a00 # data[12] = 26 [68 overall]
 │    ├── 028-030: x 1f00 # data[13] = 31 [73 overall]
 │    ├── 030-032: x 1f00 # data[14] = 31 [73 overall]
 │    ├── 032-034: x 2000 # data[15] = 32 [74 overall]
 │    ├── 034-036: x 2500 # data[16] = 37 [79 overall]
 │    ├── 036-038: x 2700 # data[17] = 39 [81 overall]
 │    ├── 038-040: x 2700 # data[18] = 39 [81 overall]
 │    └── 040-042: x 2501 # data[19] = 293 [335 overall]
 └── data
      ├── 042-044: x 6161                                     # data[00]: aa (block prefix)
      ├── 044-049: x 6162626263                               # data[01]: ..abbbc (bundle prefix)
      ├── 049-049: x                                          # data[02]: .......
      ├── 049-050: x 63                                       # data[03]: .......c
      ├── 050-052: x 6465                                     # data[04]: .......de
      ├── 052-053: x 65                                       # data[05]: .......e
      ├── 053-057: x 61626262                                 # data[06]: ..abbb (bundle prefix)
      ├── 057-061: x 6465652a                                 # data[07]: ......dee*
      ├── 061-061: x                                          # data[08]: ..........
      ├── 061-061: x                                          # data[09]: ..........
      ├── 061-064: x 656666                                   # data[10]: ......eff
      ├── 064-066: x 6162                                     # data[11]: ..ab (bundle prefix)
      ├── 066-068: x 6265                                     # data[12]: ....be
      ├── 068-073: x 626565662a                               # data[13]: ....beef*
      ├── 073-073: x                                          # data[14]: .........
      ├── 073-074: x 63                                       # data[15]: ....c
      ├── 074-079: x 6263636565                               # data[16]: ..bccee (bundle prefix)
      ├── 079-081: x 662a                                     # data[17]: .......f*
      ├── 081-081: x                                          # data[18]: .........
      ├── 081-101: x 6767676767676767676767676767676767676767 # data[19]: .......gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
      ├── 101-121: x 6767676767676767676767676767676767676767 # (continued...)
      ├── 121-141: x 6767676767676767676767676767676767676767 # (continued...)
      ├── 141-161: x 6767676767676767676767676767676767676767 # (continued...)
      ├── 161-181: x 6767676767676767676767676767676767676767 # (continued...)
      ├── 181-201: x 6767676767676767676767676767676767676767 # (continued...)
      ├── 201-221: x 6767676767676767676767676767676767676767 # (continued...)
      ├── 221-241: x 6767676767676767676767676767676767676767 # (continued...)
      ├── 241-261: x 6767676767676767676767676767676767676767 # (continued...)
      ├── 261-281: x 6767676767676767676767676767676767676767 # (continued...)
      ├── 281-301: x 6767676767676767676767676767676767676767 # (continued...)
      ├── 301-321: x 6767676767676767676767676767676767676767 # (continued...)
      └── 321-335: x 6767676767676767676767676767             # (continued...)

init bundle-size=2
----
Size: 0

put
aaabbbc
aaabbbcc
aaabbbcde
aaabbbce
aaabbbdee*
aaabbbdee*
aaabbbdee*
aaabbbeff
aaabbe
aaabbeef*
aaabbeef*
aaabc
aabcceef*
aabcceef*
aabcceef*
----
Size: 90
nKeys=15; bundleSize=2
blockPrefixLen=2; currentBundleLen=9; currentBundleKeys=1
Offsets:
  0000  0007  0007  0015  0022  0024  0032  0042  0042  0042
  0048  0052  0061  0067  0067  0076  0080  0085  0090  0099
  0099  0099  0000  0108
Data (len=108):
aaabbbcaaabbbccaaabbbcdeaaabbbceaaabbbdee*aaabbbdee*aaabbbef
faaabbeaaabbeef*aaabbeef*aaabcaabcceef*aabcceef*

finish rows=14
----
prefix-bytes
 ├── 00-01: x 01 # bundle size: 2
 ├── offsets table
 │    ├── 01-02: x 01 # encoding: 1b
 │    ├── 02-03: x 02 # data[0] = 2 [26 overall]
 │    ├── 03-04: x 07 # data[1] = 7 [31 overall]
 │    ├── 04-05: x 07 # data[2] = 7 [31 overall]
 │    ├── 05-06: x 08 # data[3] = 8 [32 overall]
 │    ├── 06-07: x 0d # data[4] = 13 [37 overall]
 │    ├── 07-08: x 0f # data[5] = 15 [39 overall]
 │    ├── 08-09: x 10 # data[6] = 16 [40 overall]
 │    ├── 09-10: x 18 # data[7] = 24 [48 overall]
 │    ├── 10-11: x 18 # data[8] = 24 [48 overall]
 │    ├── 11-12: x 18 # data[9] = 24 [48 overall]
 │    ├── 12-13: x 1c # data[10] = 28 [52 overall]
 │    ├── 13-14: x 20 # data[11] = 32 [56 overall]
 │    ├── 14-15: x 23 # data[12] = 35 [59 overall]
 │    ├── 15-16: x 27 # data[13] = 39 [63 overall]
 │    ├── 16-17: x 27 # data[14] = 39 [63 overall]
 │    ├── 17-18: x 2a # data[15] = 42 [66 overall]
 │    ├── 18-19: x 2c # data[16] = 44 [68 overall]
 │    ├── 19-20: x 31 # data[17] = 49 [73 overall]
 │    ├── 20-21: x 32 # data[18] = 50 [74 overall]
 │    ├── 21-22: x 39 # data[19] = 57 [81 overall]
 │    ├── 22-23: x 39 # data[20] = 57 [81 overall]
 │    └── 23-24: x 39 # data[21] = 57 [81 overall]
 └── data
      ├── 24-26: x 6161             # data[00]: aa (block prefix)
      ├── 26-31: x 6162626263       # data[01]: ..abbbc (bundle prefix)
      ├── 31-31: x                  # data[02]: .......
      ├── 31-32: x 63               # data[03]: .......c
      ├── 32-37: x 6162626263       # data[04]: ..abbbc (bundle prefix)
      ├── 37-39: x 6465             # data[05]: .......de
      ├── 39-40: x 65               # data[06]: .......e
      ├── 40-48: x 616262626465652a # data[07]: ..abbbdee* (bundle prefix)
      ├── 48-48: x                  # data[08]: ..........
      ├── 48-48: x                  # data[09]: ..........
      ├── 48-52: x 61626262         # data[10]: ..abbb (bundle prefix)
      ├── 52-56: x 6465652a         # data[11]: ......dee*
      ├── 56-59: x 656666           # data[12]: ......eff
      ├── 59-63: x 61626265         # data[13]: ..abbe (bundle prefix)
      ├── 63-63: x                  # data[14]: ......
      ├── 63-66: x 65662a           # data[15]: ......ef*
      ├── 66-68: x 6162             # data[16]: ..ab (bundle prefix)
      ├── 68-73: x 626565662a       # data[17]: ....beef*
      ├── 73-74: x 63               # data[18]: ....c
      ├── 74-81: x 6263636565662a   # data[19]: ..bcceef* (bundle prefix)
      ├── 81-81: x                  # data[20]: .........
      └── 81-81: x                  # data[21]: .........

finish rows=15
----
prefix-bytes
 ├── 00-01: x 01 # bundle size: 2
 ├── offsets table
 │    ├── 01-02: x 01 # encoding: 1b
 │    ├── 02-03: x 02 # data[0] = 2 [28 overall]
 │    ├── 03-04: x 07 # data[1] = 7 [33 overall]
 │    ├── 04-05: x 07 # data[2] = 7 [33 overall]
 │    ├── 05-06: x 08 # data[3] = 8 [34 overall]
 │    ├── 06-07: x 0d # data[4] = 13 [39 overall]
 │    ├── 07-08: x 0f # data[5] = 15 [41 overall]
 │    ├── 08-09: x 10 # data[6] = 16 [42 overall]
 │    ├── 09-10: x 18 # data[7] = 24 [50 overall]
 │    ├── 10-11: x 18 # data[8] = 24 [50 overall]
 │    ├── 11-12: x 18 # data[9] = 24 [50 overall]
 │    ├── 12-13: x 1c # data[10] = 28 [54 overall]
 │    ├── 13-14: x 20 # data[11] = 32 [58 overall]
 │    ├── 14-15: x 23 # data[12] = 35 [61 overall]
 │    ├── 15-16: x 27 # data[13] = 39 [65 overall]
 │    ├── 16-17: x 27 # data[14] = 39 [65 overall]
 │    ├── 17-18: x 2a # data[15] = 42 [68 overall]
 │    ├── 18-19: x 2c # data[16] = 44 [70 overall]
 │    ├── 19-20: x 31 # data[17] = 49 [75 overall]
 │    ├── 20-21: x 32 # data[18] = 50 [76 overall]
 │    ├── 21-22: x 39 # data[19] = 57 [83 overall]
 │    ├── 22-23: x 39 # data[20] = 57 [83 overall]
 │    ├── 23-24: x 39 # data[21] = 57 [83 overall]
 │    ├── 24-25: x 40 # data[22] = 64 [90 overall]
 │    └── 25-26: x 40 # data[23] = 64 [90 overall]
 └── data
      ├── 26-28: x 6161             # data[00]: aa (block prefix)
      ├── 28-33: x 6162626263       # data[01]: ..abbbc (bundle prefix)
      ├── 33-33: x                  # data[02]: .......
      ├── 33-34: x 63               # data[03]: .......c
      ├── 34-39: x 6162626263       # data[04]: ..abbbc (bundle prefix)
      ├── 39-41: x 6465             # data[05]: .......de
      ├── 41-42: x 65               # data[06]: .......e
      ├── 42-50: x 616262626465652a # data[07]: ..abbbdee* (bundle prefix)
      ├── 50-50: x                  # data[08]: ..........
      ├── 50-50: x                  # data[09]: ..........
      ├── 50-54: x 61626262         # data[10]: ..abbb (bundle prefix)
      ├── 54-58: x 6465652a         # data[11]: ......dee*
      ├── 58-61: x 656666           # data[12]: ......eff
      ├── 61-65: x 61626265         # data[13]: ..abbe (bundle prefix)
      ├── 65-65: x                  # data[14]: ......
      ├── 65-68: x 65662a           # data[15]: ......ef*
      ├── 68-70: x 6162             # data[16]: ..ab (bundle prefix)
      ├── 70-75: x 626565662a       # data[17]: ....beef*
      ├── 75-76: x 63               # data[18]: ....c
      ├── 76-83: x 6263636565662a   # data[19]: ..bcceef* (bundle prefix)
      ├── 83-83: x                  # data[20]: .........
      ├── 83-83: x                  # data[21]: .........
      ├── 83-90: x 6263636565662a   # data[22]: ..bcceef* (bundle prefix)
      └── 90-90: x                  # data[23]: .........

get indices=(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)
----
aaabbbc
aaabbbcc
aaabbbcde
aaabbbce
aaabbbdee*
aaabbbdee*
aaabbbdee*
aaabbbeff
aaabbe
aaabbeef*
aaabbeef*
aaabc
aabcceef*
aabcceef*
aabcceef*

# Try finishing without the last key which forces a shorter bundle+block prefix.

init bundle-size=4
----
Size: 0

put
abcd
abce
abcf
abg
----
Size: 17
nKeys=4; bundleSize=4
blockPrefixLen=2; currentBundleLen=15; currentBundleKeys=4
Offsets:
  0000  0000  0004  0008  0012  0015
Data (len=15):
abcdabceabcfabg

finish rows=3
----
prefix-bytes
 ├── 00-01: x 02 # bundle size: 4
 ├── offsets table
 │    ├── 01-02: x 01 # encoding: 1b
 │    ├── 02-03: x 03 # data[0] = 3 [10 overall]
 │    ├── 03-04: x 03 # data[1] = 3 [10 overall]
 │    ├── 04-05: x 04 # data[2] = 4 [11 overall]
 │    ├── 05-06: x 05 # data[3] = 5 [12 overall]
 │    └── 06-07: x 06 # data[4] = 6 [13 overall]
 └── data
      ├── 07-10: x 616263 # data[00]: abc (block prefix)
      ├── 10-10: x        # data[01]: ... (bundle prefix)
      ├── 10-11: x 64     # data[02]: ...d
      ├── 11-12: x 65     # data[03]: ...e
      └── 12-13: x 66     # data[04]: ...f

# Try finishing without the last key which forces a shorter bundle prefix only.

init bundle-size=2
----
Size: 0

put
abad
abae
abbf
abc
----
Size: 17
nKeys=4; bundleSize=2
blockPrefixLen=2; currentBundleLen=7; currentBundleKeys=2
Offsets:
  0000  0003  0004  0008  0000  0012  0015
Data (len=15):
abadabaeabbfabc

finish rows=3
----
prefix-bytes
 ├── 00-01: x 01 # bundle size: 2
 ├── offsets table
 │    ├── 01-02: x 01 # encoding: 1b
 │    ├── 02-03: x 02 # data[0] = 2 [10 overall]
 │    ├── 03-04: x 03 # data[1] = 3 [11 overall]
 │    ├── 04-05: x 04 # data[2] = 4 [12 overall]
 │    ├── 05-06: x 05 # data[3] = 5 [13 overall]
 │    ├── 06-07: x 07 # data[4] = 7 [15 overall]
 │    └── 07-08: x 07 # data[5] = 7 [15 overall]
 └── data
      ├── 08-10: x 6162 # data[00]: ab (block prefix)
      ├── 10-11: x 61   # data[01]: ..a (bundle prefix)
      ├── 11-12: x 64   # data[02]: ...d
      ├── 12-13: x 65   # data[03]: ...e
      ├── 13-15: x 6266 # data[04]: ..bf (bundle prefix)
      └── 15-15: x      # data[05]: ....

# Test strings long enough to force 16-bit offsets, and have zero-length block
# and bundle prefixes.

init bundle-size=2
----
Size: 0

put
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
----
Size: 682
nKeys=6; bundleSize=2
blockPrefixLen=0; currentBundleLen=220; currentBundleKeys=2
Offsets:
  0000  0000  0110  0220  0220  0330  0440  0000  0550  0660
Data (len=660):
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
eeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

finish rows=6
----
prefix-bytes
 ├── 000-001: x 01 # bundle size: 2
 ├── offsets table
 │    ├── 001-002: x 02   # encoding: 2b
 │    ├── 002-004: x 0000 # data[0] = 0 [22 overall]
 │    ├── 004-006: x 0000 # data[1] = 0 [22 overall]
 │    ├── 006-008: x 6e00 # data[2] = 110 [132 overall]
 │    ├── 008-010: x dc00 # data[3] = 220 [242 overall]
 │    ├── 010-012: x dc00 # data[4] = 220 [242 overall]
 │    ├── 012-014: x 4a01 # data[5] = 330 [352 overall]
 │    ├── 014-016: x b801 # data[6] = 440 [462 overall]
 │    ├── 016-018: x b801 # data[7] = 440 [462 overall]
 │    ├── 018-020: x 2602 # data[8] = 550 [572 overall]
 │    └── 020-022: x 9402 # data[9] = 660 [682 overall]
 └── data
      ├── 022-022: x                                          # data[00]:  (block prefix)
      ├── 022-022: x                                          # data[01]:  (bundle prefix)
      ├── 022-042: x 6161616161616161616161616161616161616161 # data[02]: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
      ├── 042-062: x 6161616161616161616161616161616161616161 # (continued...)
      ├── 062-082: x 6161616161616161616161616161616161616161 # (continued...)
      ├── 082-102: x 6161616161616161616161616161616161616161 # (continued...)
      ├── 102-122: x 6161616161616161616161616161616161616161 # (continued...)
      ├── 122-132: x 61616161616161616161                     # (continued...)
      ├── 132-152: x 6262626262626262626262626262626262626262 # data[03]: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
      ├── 152-172: x 6262626262626262626262626262626262626262 # (continued...)
      ├── 172-192: x 6262626262626262626262626262626262626262 # (continued...)
      ├── 192-212: x 6262626262626262626262626262626262626262 # (continued...)
      ├── 212-232: x 6262626262626262626262626262626262626262 # (continued...)
      ├── 232-242: x 62626262626262626262                     # (continued...)
      ├── 242-242: x                                          # data[04]:  (bundle prefix)
      ├── 242-262: x 6363636363636363636363636363636363636363 # data[05]: cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
      ├── 262-282: x 6363636363636363636363636363636363636363 # (continued...)
      ├── 282-302: x 6363636363636363636363636363636363636363 # (continued...)
      ├── 302-322: x 6363636363636363636363636363636363636363 # (continued...)
      ├── 322-342: x 6363636363636363636363636363636363636363 # (continued...)
      ├── 342-352: x 63636363636363636363                     # (continued...)
      ├── 352-372: x 6464646464646464646464646464646464646464 # data[06]: dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
      ├── 372-392: x 6464646464646464646464646464646464646464 # (continued...)
      ├── 392-412: x 6464646464646464646464646464646464646464 # (continued...)
      ├── 412-432: x 6464646464646464646464646464646464646464 # (continued...)
      ├── 432-452: x 6464646464646464646464646464646464646464 # (continued...)
      ├── 452-462: x 64646464646464646464                     # (continued...)
      ├── 462-462: x                                          # data[07]:  (bundle prefix)
      ├── 462-482: x 6565656565656565656565656565656565656565 # data[08]: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
      ├── 482-502: x 6565656565656565656565656565656565656565 # (continued...)
      ├── 502-522: x 6565656565656565656565656565656565656565 # (continued...)
      ├── 522-542: x 6565656565656565656565656565656565656565 # (continued...)
      ├── 542-562: x 6565656565656565656565656565656565656565 # (continued...)
      ├── 562-572: x 65656565656565656565                     # (continued...)
      ├── 572-592: x 6666666666666666666666666666666666666666 # data[09]: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
      ├── 592-612: x 6666666666666666666666666666666666666666 # (continued...)
      ├── 612-632: x 6666666666666666666666666666666666666666 # (continued...)
      ├── 632-652: x 6666666666666666666666666666666666666666 # (continued...)
      ├── 652-672: x 6666666666666666666666666666666666666666 # (continued...)
      └── 672-682: x 66666666666666666666                     # (continued...)

get indices=(0, 1, 2, 3, 4, 5)
----
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

# Test excluding a final key that forces a shorter block prefix.

init bundle-size=4
----
Size: 0

put
aaaaa
aaaab
aaaac
aaaad
----
Size: 16
nKeys=4; bundleSize=4
blockPrefixLen=4; currentBundleLen=20; currentBundleKeys=4
Offsets:
  0000  0000  0005  0010  0015  0020
Data (len=20):
aaaaaaaaabaaaacaaaad

put
aaaae
aab
----
Size: 23
nKeys=6; bundleSize=4
blockPrefixLen=2; currentBundleLen=8; currentBundleKeys=2
Offsets:
  0000  0004  0005  0010  0015  0020  0000  0025  0028
Data (len=28):
aaaaaaaaabaaaacaaaadaaaaeaab

finish rows=5
----
prefix-bytes
 ├── 00-01: x 02 # bundle size: 4
 ├── offsets table
 │    ├── 01-02: x 01 # encoding: 1b
 │    ├── 02-03: x 04 # data[0] = 4 [14 overall]
 │    ├── 03-04: x 04 # data[1] = 4 [14 overall]
 │    ├── 04-05: x 05 # data[2] = 5 [15 overall]
 │    ├── 05-06: x 06 # data[3] = 6 [16 overall]
 │    ├── 06-07: x 07 # data[4] = 7 [17 overall]
 │    ├── 07-08: x 08 # data[5] = 8 [18 overall]
 │    ├── 08-09: x 09 # data[6] = 9 [19 overall]
 │    └── 09-10: x 09 # data[7] = 9 [19 overall]
 └── data
      ├── 10-14: x 61616161 # data[00]: aaaa (block prefix)
      ├── 14-14: x          # data[01]: .... (bundle prefix)
      ├── 14-15: x 61       # data[02]: ....a
      ├── 15-16: x 62       # data[03]: ....b
      ├── 16-17: x 63       # data[04]: ....c
      ├── 17-18: x 64       # data[05]: ....d
      ├── 18-19: x 65       # data[06]: ....e (bundle prefix)
      └── 19-19: x          # data[07]: .....

init bundle-size=4
----
Size: 0

put
a
a
a
a
a
a
a
aa
aa
aa
aa
aa
ab
ab
ab
ab
----
Size: 27
nKeys=16; bundleSize=4
blockPrefixLen=1; currentBundleLen=2; currentBundleKeys=1
Offsets:
  0000  0001  0001  0001  0001  0001  0002  0002  0002  0002
  0004  0006  0006  0006  0006  0006  0000  0008  0008  0008
  0008
Data (len=8):
aaaaaaab

unsafe-get i=(15, 14)
----
UnsafeGet(15) = ab
UnsafeGet(14) = ab
