use crate::Result;
use std::cmp;
use trackable::error::Failed;
#[derive(Debug)]
pub struct BitReader<'a> {
data: &'a [u8],
offset: usize,
}
impl<'a> BitReader<'a> {
pub fn new(data: &'a [u8]) -> Self {
BitReader { data, offset: 0 }
}
pub fn remaining_bits(&self) -> usize {
self.data.len() * 8 - self.offset
}
pub fn read_bits(&mut self, bits: usize) -> Result<u32> {
debug_assert!(1 <= bits && bits <= 5);
debug_assert!(self.offset + bits <= self.data.len() * 8);
let new_offset = self.offset + bits;
let mut value = 0;
for i in self.offset..new_offset {
let bit = (self.data[i / 8] >> (7 - (i % 8))) & 0b1;
value = (value << 1) | bit as u32;
}
self.offset = new_offset;
Ok(value)
}
}
pub fn decode(data: &[u8]) -> Result<Vec<u8>> {
let mut buf = Vec::new();
let mut value = 0;
let mut next_bits = 5;
let mut acc_bits = 0;
let mut reader = BitReader::new(data);
while reader.remaining_bits() > 0 {
next_bits = cmp::min(next_bits, reader.remaining_bits());
value = (value << next_bits) + track!(reader.read_bits(next_bits))?;
acc_bits += next_bits;
if let Ok(i) = DECODING_TABLE.binary_search_by_key(&(value, acc_bits), |e| (e.0, e.1)) {
track_assert_ne!(i, 256, Failed);
buf.push(DECODING_TABLE[i].2 as u8);
next_bits = 5;
acc_bits = 0;
value = 0;
} else {
next_bits = 1;
}
}
track_assert_eq!(value, (1 << acc_bits) - 1, Failed);
Ok(buf)
}
#[derive(Debug)]
struct BitWriter {
buf: Vec<u8>,
offset: usize,
}
impl BitWriter {
pub fn new() -> Self {
BitWriter {
buf: Vec::new(),
offset: 0,
}
}
pub fn write_bit(&mut self, bit: u8) {
if self.offset == 0 {
self.buf.push(0);
self.offset = 8;
}
self.offset -= 1;
let b = self.buf.last_mut().expect("Never fails");
*b |= bit << self.offset;
}
pub fn finish(mut self) -> Vec<u8> {
for i in 0..self.offset {
let b = self.buf.last_mut().expect("Never fails");
*b |= 1 << i;
}
self.buf
}
}
pub fn encode(data: &[u8]) -> Vec<u8> {
let mut writer = BitWriter::new();
for b in data.iter() {
let (code, bitwidth) = ENCODING_TABLE[*b as usize];
for i in 0..bitwidth {
let bit = (code >> (bitwidth - i - 1)) & 0b1;
writer.write_bit(bit as u8);
}
}
writer.finish()
}
const DECODING_TABLE: [(u32, usize, u16); 257] = [
(0b0000_0, 5, 48),
(0b0000_1, 5, 49),
(0b0001_0, 5, 50),
(0b0001_1, 5, 97),
(0b0010_0, 5, 99),
(0b0010_1, 5, 101),
(0b0011_0, 5, 105),
(0b0011_1, 5, 111),
(0b0100_0, 5, 115),
(0b0100_1, 5, 116),
(0b0101_00, 6, 32),
(0b0101_01, 6, 37),
(0b0101_10, 6, 45),
(0b0101_11, 6, 46),
(0b0110_00, 6, 47),
(0b0110_01, 6, 51),
(0b0110_10, 6, 52),
(0b0110_11, 6, 53),
(0b0111_00, 6, 54),
(0b0111_01, 6, 55),
(0b0111_10, 6, 56),
(0b0111_11, 6, 57),
(0b1000_00, 6, 61),
(0b1000_01, 6, 65),
(0b1000_10, 6, 95),
(0b1000_11, 6, 98),
(0b1001_00, 6, 100),
(0b1001_01, 6, 102),
(0b1001_10, 6, 103),
(0b1001_11, 6, 104),
(0b1010_00, 6, 108),
(0b1010_01, 6, 109),
(0b1010_10, 6, 110),
(0b1010_11, 6, 112),
(0b1011_00, 6, 114),
(0b1011_01, 6, 117),
(0b1011_100, 7, 58),
(0b1011_101, 7, 66),
(0b1011_110, 7, 67),
(0b1011_111, 7, 68),
(0b1100_000, 7, 69),
(0b1100_001, 7, 70),
(0b1100_010, 7, 71),
(0b1100_011, 7, 72),
(0b1100_100, 7, 73),
(0b1100_101, 7, 74),
(0b1100_110, 7, 75),
(0b1100_111, 7, 76),
(0b1101_000, 7, 77),
(0b1101_001, 7, 78),
(0b1101_010, 7, 79),
(0b1101_011, 7, 80),
(0b1101_100, 7, 81),
(0b1101_101, 7, 82),
(0b1101_110, 7, 83),
(0b1101_111, 7, 84),
(0b1110_000, 7, 85),
(0b1110_001, 7, 86),
(0b1110_010, 7, 87),
(0b1110_011, 7, 89),
(0b1110_100, 7, 106),
(0b1110_101, 7, 107),
(0b1110_110, 7, 113),
(0b1110_111, 7, 118),
(0b1111_000, 7, 119),
(0b1111_001, 7, 120),
(0b1111_010, 7, 121),
(0b1111_011, 7, 122),
(0b1111_1000, 8, 38),
(0b1111_1001, 8, 42),
(0b1111_1010, 8, 44),
(0b1111_1011, 8, 59),
(0b1111_1100, 8, 88),
(0b1111_1101, 8, 90),
(0b1111_1110_00, 10, 33),
(0b1111_1110_01, 10, 34),
(0b1111_1110_10, 10, 40),
(0b1111_1110_11, 10, 41),
(0b1111_1111_00, 10, 63),
(0b1111_1111_010, 11, 39),
(0b1111_1111_011, 11, 43),
(0b1111_1111_100, 11, 124),
(0b1111_1111_1010, 12, 35),
(0b1111_1111_1011, 12, 62),
(0b1111_1111_1100_0, 13, 0),
(0b1111_1111_1100_1, 13, 36),
(0b1111_1111_1101_0, 13, 64),
(0b1111_1111_1101_1, 13, 91),
(0b1111_1111_1110_0, 13, 93),
(0b1111_1111_1110_1, 13, 126),
(0b1111_1111_1111_00, 14, 94),
(0b1111_1111_1111_01, 14, 125),
(0b1111_1111_1111_100, 15, 60),
(0b1111_1111_1111_101, 15, 96),
(0b1111_1111_1111_110, 15, 123),
(0b1111_1111_1111_1110_000, 19, 92),
(0b1111_1111_1111_1110_001, 19, 195),
(0b1111_1111_1111_1110_010, 19, 208),
(0b1111_1111_1111_1110_0110, 20, 128),
(0b1111_1111_1111_1110_0111, 20, 130),
(0b1111_1111_1111_1110_1000, 20, 131),
(0b1111_1111_1111_1110_1001, 20, 162),
(0b1111_1111_1111_1110_1010, 20, 184),
(0b1111_1111_1111_1110_1011, 20, 194),
(0b1111_1111_1111_1110_1100, 20, 224),
(0b1111_1111_1111_1110_1101, 20, 226),
(0b1111_1111_1111_1110_1110_0, 21, 153),
(0b1111_1111_1111_1110_1110_1, 21, 161),
(0b1111_1111_1111_1110_1111_0, 21, 167),
(0b1111_1111_1111_1110_1111_1, 21, 172),
(0b1111_1111_1111_1111_0000_0, 21, 176),
(0b1111_1111_1111_1111_0000_1, 21, 177),
(0b1111_1111_1111_1111_0001_0, 21, 179),
(0b1111_1111_1111_1111_0001_1, 21, 209),
(0b1111_1111_1111_1111_0010_0, 21, 216),
(0b1111_1111_1111_1111_0010_1, 21, 217),
(0b1111_1111_1111_1111_0011_0, 21, 227),
(0b1111_1111_1111_1111_0011_1, 21, 229),
(0b1111_1111_1111_1111_0100_0, 21, 230),
(0b1111_1111_1111_1111_0100_10, 22, 129),
(0b1111_1111_1111_1111_0100_11, 22, 132),
(0b1111_1111_1111_1111_0101_00, 22, 133),
(0b1111_1111_1111_1111_0101_01, 22, 134),
(0b1111_1111_1111_1111_0101_10, 22, 136),
(0b1111_1111_1111_1111_0101_11, 22, 146),
(0b1111_1111_1111_1111_0110_00, 22, 154),
(0b1111_1111_1111_1111_0110_01, 22, 156),
(0b1111_1111_1111_1111_0110_10, 22, 160),
(0b1111_1111_1111_1111_0110_11, 22, 163),
(0b1111_1111_1111_1111_0111_00, 22, 164),
(0b1111_1111_1111_1111_0111_01, 22, 169),
(0b1111_1111_1111_1111_0111_10, 22, 170),
(0b1111_1111_1111_1111_0111_11, 22, 173),
(0b1111_1111_1111_1111_1000_00, 22, 178),
(0b1111_1111_1111_1111_1000_01, 22, 181),
(0b1111_1111_1111_1111_1000_10, 22, 185),
(0b1111_1111_1111_1111_1000_11, 22, 186),
(0b1111_1111_1111_1111_1001_00, 22, 187),
(0b1111_1111_1111_1111_1001_01, 22, 189),
(0b1111_1111_1111_1111_1001_10, 22, 190),
(0b1111_1111_1111_1111_1001_11, 22, 196),
(0b1111_1111_1111_1111_1010_00, 22, 198),
(0b1111_1111_1111_1111_1010_01, 22, 228),
(0b1111_1111_1111_1111_1010_10, 22, 232),
(0b1111_1111_1111_1111_1010_11, 22, 233),
(0b1111_1111_1111_1111_1011_000, 23, 1),
(0b1111_1111_1111_1111_1011_001, 23, 135),
(0b1111_1111_1111_1111_1011_010, 23, 137),
(0b1111_1111_1111_1111_1011_011, 23, 138),
(0b1111_1111_1111_1111_1011_100, 23, 139),
(0b1111_1111_1111_1111_1011_101, 23, 140),
(0b1111_1111_1111_1111_1011_110, 23, 141),
(0b1111_1111_1111_1111_1011_111, 23, 143),
(0b1111_1111_1111_1111_1100_000, 23, 147),
(0b1111_1111_1111_1111_1100_001, 23, 149),
(0b1111_1111_1111_1111_1100_010, 23, 150),
(0b1111_1111_1111_1111_1100_011, 23, 151),
(0b1111_1111_1111_1111_1100_100, 23, 152),
(0b1111_1111_1111_1111_1100_101, 23, 155),
(0b1111_1111_1111_1111_1100_110, 23, 157),
(0b1111_1111_1111_1111_1100_111, 23, 158),
(0b1111_1111_1111_1111_1101_000, 23, 165),
(0b1111_1111_1111_1111_1101_001, 23, 166),
(0b1111_1111_1111_1111_1101_010, 23, 168),
(0b1111_1111_1111_1111_1101_011, 23, 174),
(0b1111_1111_1111_1111_1101_100, 23, 175),
(0b1111_1111_1111_1111_1101_101, 23, 180),
(0b1111_1111_1111_1111_1101_110, 23, 182),
(0b1111_1111_1111_1111_1101_111, 23, 183),
(0b1111_1111_1111_1111_1110_000, 23, 188),
(0b1111_1111_1111_1111_1110_001, 23, 191),
(0b1111_1111_1111_1111_1110_010, 23, 197),
(0b1111_1111_1111_1111_1110_011, 23, 231),
(0b1111_1111_1111_1111_1110_100, 23, 239),
(0b1111_1111_1111_1111_1110_1010, 24, 9),
(0b1111_1111_1111_1111_1110_1011, 24, 142),
(0b1111_1111_1111_1111_1110_1100, 24, 144),
(0b1111_1111_1111_1111_1110_1101, 24, 145),
(0b1111_1111_1111_1111_1110_1110, 24, 148),
(0b1111_1111_1111_1111_1110_1111, 24, 159),
(0b1111_1111_1111_1111_1111_0000, 24, 171),
(0b1111_1111_1111_1111_1111_0001, 24, 206),
(0b1111_1111_1111_1111_1111_0010, 24, 215),
(0b1111_1111_1111_1111_1111_0011, 24, 225),
(0b1111_1111_1111_1111_1111_0100, 24, 236),
(0b1111_1111_1111_1111_1111_0101, 24, 237),
(0b1111_1111_1111_1111_1111_0110_0, 25, 199),
(0b1111_1111_1111_1111_1111_0110_1, 25, 207),
(0b1111_1111_1111_1111_1111_0111_0, 25, 234),
(0b1111_1111_1111_1111_1111_0111_1, 25, 235),
(0b1111_1111_1111_1111_1111_1000_00, 26, 192),
(0b1111_1111_1111_1111_1111_1000_01, 26, 193),
(0b1111_1111_1111_1111_1111_1000_10, 26, 200),
(0b1111_1111_1111_1111_1111_1000_11, 26, 201),
(0b1111_1111_1111_1111_1111_1001_00, 26, 202),
(0b1111_1111_1111_1111_1111_1001_01, 26, 205),
(0b1111_1111_1111_1111_1111_1001_10, 26, 210),
(0b1111_1111_1111_1111_1111_1001_11, 26, 213),
(0b1111_1111_1111_1111_1111_1010_00, 26, 218),
(0b1111_1111_1111_1111_1111_1010_01, 26, 219),
(0b1111_1111_1111_1111_1111_1010_10, 26, 238),
(0b1111_1111_1111_1111_1111_1010_11, 26, 240),
(0b1111_1111_1111_1111_1111_1011_00, 26, 242),
(0b1111_1111_1111_1111_1111_1011_01, 26, 243),
(0b1111_1111_1111_1111_1111_1011_10, 26, 255),
(0b1111_1111_1111_1111_1111_1011_110, 27, 203),
(0b1111_1111_1111_1111_1111_1011_111, 27, 204),
(0b1111_1111_1111_1111_1111_1100_000, 27, 211),
(0b1111_1111_1111_1111_1111_1100_001, 27, 212),
(0b1111_1111_1111_1111_1111_1100_010, 27, 214),
(0b1111_1111_1111_1111_1111_1100_011, 27, 221),
(0b1111_1111_1111_1111_1111_1100_100, 27, 222),
(0b1111_1111_1111_1111_1111_1100_101, 27, 223),
(0b1111_1111_1111_1111_1111_1100_110, 27, 241),
(0b1111_1111_1111_1111_1111_1100_111, 27, 244),
(0b1111_1111_1111_1111_1111_1101_000, 27, 245),
(0b1111_1111_1111_1111_1111_1101_001, 27, 246),
(0b1111_1111_1111_1111_1111_1101_010, 27, 247),
(0b1111_1111_1111_1111_1111_1101_011, 27, 248),
(0b1111_1111_1111_1111_1111_1101_100, 27, 250),
(0b1111_1111_1111_1111_1111_1101_101, 27, 251),
(0b1111_1111_1111_1111_1111_1101_110, 27, 252),
(0b1111_1111_1111_1111_1111_1101_111, 27, 253),
(0b1111_1111_1111_1111_1111_1110_000, 27, 254),
(0b1111_1111_1111_1111_1111_1110_0010, 28, 2),
(0b1111_1111_1111_1111_1111_1110_0011, 28, 3),
(0b1111_1111_1111_1111_1111_1110_0100, 28, 4),
(0b1111_1111_1111_1111_1111_1110_0101, 28, 5),
(0b1111_1111_1111_1111_1111_1110_0110, 28, 6),
(0b1111_1111_1111_1111_1111_1110_0111, 28, 7),
(0b1111_1111_1111_1111_1111_1110_1000, 28, 8),
(0b1111_1111_1111_1111_1111_1110_1001, 28, 11),
(0b1111_1111_1111_1111_1111_1110_1010, 28, 12),
(0b1111_1111_1111_1111_1111_1110_1011, 28, 14),
(0b1111_1111_1111_1111_1111_1110_1100, 28, 15),
(0b1111_1111_1111_1111_1111_1110_1101, 28, 16),
(0b1111_1111_1111_1111_1111_1110_1110, 28, 17),
(0b1111_1111_1111_1111_1111_1110_1111, 28, 18),
(0b1111_1111_1111_1111_1111_1111_0000, 28, 19),
(0b1111_1111_1111_1111_1111_1111_0001, 28, 20),
(0b1111_1111_1111_1111_1111_1111_0010, 28, 21),
(0b1111_1111_1111_1111_1111_1111_0011, 28, 23),
(0b1111_1111_1111_1111_1111_1111_0100, 28, 24),
(0b1111_1111_1111_1111_1111_1111_0101, 28, 25),
(0b1111_1111_1111_1111_1111_1111_0110, 28, 26),
(0b1111_1111_1111_1111_1111_1111_0111, 28, 27),
(0b1111_1111_1111_1111_1111_1111_1000, 28, 28),
(0b1111_1111_1111_1111_1111_1111_1001, 28, 29),
(0b1111_1111_1111_1111_1111_1111_1010, 28, 30),
(0b1111_1111_1111_1111_1111_1111_1011, 28, 31),
(0b1111_1111_1111_1111_1111_1111_1100, 28, 127),
(0b1111_1111_1111_1111_1111_1111_1101, 28, 220),
(0b1111_1111_1111_1111_1111_1111_1110, 28, 249),
(0b1111_1111_1111_1111_1111_1111_1111_00, 30, 10),
(0b1111_1111_1111_1111_1111_1111_1111_01, 30, 13),
(0b1111_1111_1111_1111_1111_1111_1111_10, 30, 22),
(0b1111_1111_1111_1111_1111_1111_1111_11, 30, 256),
];
const ENCODING_TABLE: [(u32, u8); 257] = [
(0b1111_1111_1100_0, 13),
(0b1111_1111_1111_1111_1011_000, 23),
(0b1111_1111_1111_1111_1111_1110_0010, 28),
(0b1111_1111_1111_1111_1111_1110_0011, 28),
(0b1111_1111_1111_1111_1111_1110_0100, 28),
(0b1111_1111_1111_1111_1111_1110_0101, 28),
(0b1111_1111_1111_1111_1111_1110_0110, 28),
(0b1111_1111_1111_1111_1111_1110_0111, 28),
(0b1111_1111_1111_1111_1111_1110_1000, 28),
(0b1111_1111_1111_1111_1110_1010, 24),
(0b1111_1111_1111_1111_1111_1111_1111_00, 30),
(0b1111_1111_1111_1111_1111_1110_1001, 28),
(0b1111_1111_1111_1111_1111_1110_1010, 28),
(0b1111_1111_1111_1111_1111_1111_1111_01, 30),
(0b1111_1111_1111_1111_1111_1110_1011, 28),
(0b1111_1111_1111_1111_1111_1110_1100, 28),
(0b1111_1111_1111_1111_1111_1110_1101, 28),
(0b1111_1111_1111_1111_1111_1110_1110, 28),
(0b1111_1111_1111_1111_1111_1110_1111, 28),
(0b1111_1111_1111_1111_1111_1111_0000, 28),
(0b1111_1111_1111_1111_1111_1111_0001, 28),
(0b1111_1111_1111_1111_1111_1111_0010, 28),
(0b1111_1111_1111_1111_1111_1111_1111_10, 30),
(0b1111_1111_1111_1111_1111_1111_0011, 28),
(0b1111_1111_1111_1111_1111_1111_0100, 28),
(0b1111_1111_1111_1111_1111_1111_0101, 28),
(0b1111_1111_1111_1111_1111_1111_0110, 28),
(0b1111_1111_1111_1111_1111_1111_0111, 28),
(0b1111_1111_1111_1111_1111_1111_1000, 28),
(0b1111_1111_1111_1111_1111_1111_1001, 28),
(0b1111_1111_1111_1111_1111_1111_1010, 28),
(0b1111_1111_1111_1111_1111_1111_1011, 28),
(0b0101_00, 6),
(0b1111_1110_00, 10),
(0b1111_1110_01, 10),
(0b1111_1111_1010, 12),
(0b1111_1111_1100_1, 13),
(0b0101_01, 6),
(0b1111_1000, 8),
(0b1111_1111_010, 11),
(0b1111_1110_10, 10),
(0b1111_1110_11, 10),
(0b1111_1001, 8),
(0b1111_1111_011, 11),
(0b1111_1010, 8),
(0b0101_10, 6),
(0b0101_11, 6),
(0b0110_00, 6),
(0b0000_0, 5),
(0b0000_1, 5),
(0b0001_0, 5),
(0b0110_01, 6),
(0b0110_10, 6),
(0b0110_11, 6),
(0b0111_00, 6),
(0b0111_01, 6),
(0b0111_10, 6),
(0b0111_11, 6),
(0b1011_100, 7),
(0b1111_1011, 8),
(0b1111_1111_1111_100, 15),
(0b1000_00, 6),
(0b1111_1111_1011, 12),
(0b1111_1111_00, 10),
(0b1111_1111_1101_0, 13),
(0b1000_01, 6),
(0b1011_101, 7),
(0b1011_110, 7),
(0b1011_111, 7),
(0b1100_000, 7),
(0b1100_001, 7),
(0b1100_010, 7),
(0b1100_011, 7),
(0b1100_100, 7),
(0b1100_101, 7),
(0b1100_110, 7),
(0b1100_111, 7),
(0b1101_000, 7),
(0b1101_001, 7),
(0b1101_010, 7),
(0b1101_011, 7),
(0b1101_100, 7),
(0b1101_101, 7),
(0b1101_110, 7),
(0b1101_111, 7),
(0b1110_000, 7),
(0b1110_001, 7),
(0b1110_010, 7),
(0b1111_1100, 8),
(0b1110_011, 7),
(0b1111_1101, 8),
(0b1111_1111_1101_1, 13),
(0b1111_1111_1111_1110_000, 19),
(0b1111_1111_1110_0, 13),
(0b1111_1111_1111_00, 14),
(0b1000_10, 6),
(0b1111_1111_1111_101, 15),
(0b0001_1, 5),
(0b1000_11, 6),
(0b0010_0, 5),
(0b1001_00, 6),
(0b0010_1, 5),
(0b1001_01, 6),
(0b1001_10, 6),
(0b1001_11, 6),
(0b0011_0, 5),
(0b1110_100, 7),
(0b1110_101, 7),
(0b1010_00, 6),
(0b1010_01, 6),
(0b1010_10, 6),
(0b0011_1, 5),
(0b1010_11, 6),
(0b1110_110, 7),
(0b1011_00, 6),
(0b0100_0, 5),
(0b0100_1, 5),
(0b1011_01, 6),
(0b1110_111, 7),
(0b1111_000, 7),
(0b1111_001, 7),
(0b1111_010, 7),
(0b1111_011, 7),
(0b1111_1111_1111_110, 15),
(0b1111_1111_100, 11),
(0b1111_1111_1111_01, 14),
(0b1111_1111_1110_1, 13),
(0b1111_1111_1111_1111_1111_1111_1100, 28),
(0b1111_1111_1111_1110_0110, 20),
(0b1111_1111_1111_1111_0100_10, 22),
(0b1111_1111_1111_1110_0111, 20),
(0b1111_1111_1111_1110_1000, 20),
(0b1111_1111_1111_1111_0100_11, 22),
(0b1111_1111_1111_1111_0101_00, 22),
(0b1111_1111_1111_1111_0101_01, 22),
(0b1111_1111_1111_1111_1011_001, 23),
(0b1111_1111_1111_1111_0101_10, 22),
(0b1111_1111_1111_1111_1011_010, 23),
(0b1111_1111_1111_1111_1011_011, 23),
(0b1111_1111_1111_1111_1011_100, 23),
(0b1111_1111_1111_1111_1011_101, 23),
(0b1111_1111_1111_1111_1011_110, 23),
(0b1111_1111_1111_1111_1110_1011, 24),
(0b1111_1111_1111_1111_1011_111, 23),
(0b1111_1111_1111_1111_1110_1100, 24),
(0b1111_1111_1111_1111_1110_1101, 24),
(0b1111_1111_1111_1111_0101_11, 22),
(0b1111_1111_1111_1111_1100_000, 23),
(0b1111_1111_1111_1111_1110_1110, 24),
(0b1111_1111_1111_1111_1100_001, 23),
(0b1111_1111_1111_1111_1100_010, 23),
(0b1111_1111_1111_1111_1100_011, 23),
(0b1111_1111_1111_1111_1100_100, 23),
(0b1111_1111_1111_1110_1110_0, 21),
(0b1111_1111_1111_1111_0110_00, 22),
(0b1111_1111_1111_1111_1100_101, 23),
(0b1111_1111_1111_1111_0110_01, 22),
(0b1111_1111_1111_1111_1100_110, 23),
(0b1111_1111_1111_1111_1100_111, 23),
(0b1111_1111_1111_1111_1110_1111, 24),
(0b1111_1111_1111_1111_0110_10, 22),
(0b1111_1111_1111_1110_1110_1, 21),
(0b1111_1111_1111_1110_1001, 20),
(0b1111_1111_1111_1111_0110_11, 22),
(0b1111_1111_1111_1111_0111_00, 22),
(0b1111_1111_1111_1111_1101_000, 23),
(0b1111_1111_1111_1111_1101_001, 23),
(0b1111_1111_1111_1110_1111_0, 21),
(0b1111_1111_1111_1111_1101_010, 23),
(0b1111_1111_1111_1111_0111_01, 22),
(0b1111_1111_1111_1111_0111_10, 22),
(0b1111_1111_1111_1111_1111_0000, 24),
(0b1111_1111_1111_1110_1111_1, 21),
(0b1111_1111_1111_1111_0111_11, 22),
(0b1111_1111_1111_1111_1101_011, 23),
(0b1111_1111_1111_1111_1101_100, 23),
(0b1111_1111_1111_1111_0000_0, 21),
(0b1111_1111_1111_1111_0000_1, 21),
(0b1111_1111_1111_1111_1000_00, 22),
(0b1111_1111_1111_1111_0001_0, 21),
(0b1111_1111_1111_1111_1101_101, 23),
(0b1111_1111_1111_1111_1000_01, 22),
(0b1111_1111_1111_1111_1101_110, 23),
(0b1111_1111_1111_1111_1101_111, 23),
(0b1111_1111_1111_1110_1010, 20),
(0b1111_1111_1111_1111_1000_10, 22),
(0b1111_1111_1111_1111_1000_11, 22),
(0b1111_1111_1111_1111_1001_00, 22),
(0b1111_1111_1111_1111_1110_000, 23),
(0b1111_1111_1111_1111_1001_01, 22),
(0b1111_1111_1111_1111_1001_10, 22),
(0b1111_1111_1111_1111_1110_001, 23),
(0b1111_1111_1111_1111_1111_1000_00, 26),
(0b1111_1111_1111_1111_1111_1000_01, 26),
(0b1111_1111_1111_1110_1011, 20),
(0b1111_1111_1111_1110_001, 19),
(0b1111_1111_1111_1111_1001_11, 22),
(0b1111_1111_1111_1111_1110_010, 23),
(0b1111_1111_1111_1111_1010_00, 22),
(0b1111_1111_1111_1111_1111_0110_0, 25),
(0b1111_1111_1111_1111_1111_1000_10, 26),
(0b1111_1111_1111_1111_1111_1000_11, 26),
(0b1111_1111_1111_1111_1111_1001_00, 26),
(0b1111_1111_1111_1111_1111_1011_110, 27),
(0b1111_1111_1111_1111_1111_1011_111, 27),
(0b1111_1111_1111_1111_1111_1001_01, 26),
(0b1111_1111_1111_1111_1111_0001, 24),
(0b1111_1111_1111_1111_1111_0110_1, 25),
(0b1111_1111_1111_1110_010, 19),
(0b1111_1111_1111_1111_0001_1, 21),
(0b1111_1111_1111_1111_1111_1001_10, 26),
(0b1111_1111_1111_1111_1111_1100_000, 27),
(0b1111_1111_1111_1111_1111_1100_001, 27),
(0b1111_1111_1111_1111_1111_1001_11, 26),
(0b1111_1111_1111_1111_1111_1100_010, 27),
(0b1111_1111_1111_1111_1111_0010, 24),
(0b1111_1111_1111_1111_0010_0, 21),
(0b1111_1111_1111_1111_0010_1, 21),
(0b1111_1111_1111_1111_1111_1010_00, 26),
(0b1111_1111_1111_1111_1111_1010_01, 26),
(0b1111_1111_1111_1111_1111_1111_1101, 28),
(0b1111_1111_1111_1111_1111_1100_011, 27),
(0b1111_1111_1111_1111_1111_1100_100, 27),
(0b1111_1111_1111_1111_1111_1100_101, 27),
(0b1111_1111_1111_1110_1100, 20),
(0b1111_1111_1111_1111_1111_0011, 24),
(0b1111_1111_1111_1110_1101, 20),
(0b1111_1111_1111_1111_0011_0, 21),
(0b1111_1111_1111_1111_1010_01, 22),
(0b1111_1111_1111_1111_0011_1, 21),
(0b1111_1111_1111_1111_0100_0, 21),
(0b1111_1111_1111_1111_1110_011, 23),
(0b1111_1111_1111_1111_1010_10, 22),
(0b1111_1111_1111_1111_1010_11, 22),
(0b1111_1111_1111_1111_1111_0111_0, 25),
(0b1111_1111_1111_1111_1111_0111_1, 25),
(0b1111_1111_1111_1111_1111_0100, 24),
(0b1111_1111_1111_1111_1111_0101, 24),
(0b1111_1111_1111_1111_1111_1010_10, 26),
(0b1111_1111_1111_1111_1110_100, 23),
(0b1111_1111_1111_1111_1111_1010_11, 26),
(0b1111_1111_1111_1111_1111_1100_110, 27),
(0b1111_1111_1111_1111_1111_1011_00, 26),
(0b1111_1111_1111_1111_1111_1011_01, 26),
(0b1111_1111_1111_1111_1111_1100_111, 27),
(0b1111_1111_1111_1111_1111_1101_000, 27),
(0b1111_1111_1111_1111_1111_1101_001, 27),
(0b1111_1111_1111_1111_1111_1101_010, 27),
(0b1111_1111_1111_1111_1111_1101_011, 27),
(0b1111_1111_1111_1111_1111_1111_1110, 28),
(0b1111_1111_1111_1111_1111_1101_100, 27),
(0b1111_1111_1111_1111_1111_1101_101, 27),
(0b1111_1111_1111_1111_1111_1101_110, 27),
(0b1111_1111_1111_1111_1111_1101_111, 27),
(0b1111_1111_1111_1111_1111_1110_000, 27),
(0b1111_1111_1111_1111_1111_1011_10, 26),
(0b1111_1111_1111_1111_1111_1111_1111_11, 30),
];