// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Text; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.HPack; using Xunit; namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests { public class HuffmanTests { public static readonly TheoryData _validData = new TheoryData { // Single 5-bit symbol { new byte[] { 0x07 }, Encoding.ASCII.GetBytes("0") }, // Single 6-bit symbol { new byte[] { 0x57 }, Encoding.ASCII.GetBytes("%") }, // Single 7-bit symbol { new byte[] { 0xb9 }, Encoding.ASCII.GetBytes(":") }, // Single 8-bit symbol { new byte[] { 0xf8 }, Encoding.ASCII.GetBytes("&") }, // Single 10-bit symbol { new byte[] { 0xfe, 0x3f }, Encoding.ASCII.GetBytes("!") }, // Single 11-bit symbol { new byte[] { 0xff, 0x7f }, Encoding.ASCII.GetBytes("+") }, // Single 12-bit symbol { new byte[] { 0xff, 0xaf }, Encoding.ASCII.GetBytes("#") }, // Single 13-bit symbol { new byte[] { 0xff, 0xcf }, Encoding.ASCII.GetBytes("$") }, // Single 14-bit symbol { new byte[] { 0xff, 0xf3 }, Encoding.ASCII.GetBytes("^") }, // Single 15-bit symbol { new byte[] { 0xff, 0xf9 }, Encoding.ASCII.GetBytes("<") }, // Single 19-bit symbol { new byte[] { 0xff, 0xfe, 0x1f }, Encoding.ASCII.GetBytes("\\") }, // Single 20-bit symbol { new byte[] { 0xff, 0xfe, 0x6f }, new byte[] { 0x80 } }, // Single 21-bit symbol { new byte[] { 0xff, 0xfe, 0xe7 }, new byte[] { 0x99 } }, // Single 22-bit symbol { new byte[] { 0xff, 0xff, 0x4b }, new byte[] { 0x81 } }, // Single 23-bit symbol { new byte[] { 0xff, 0xff, 0xb1 }, new byte[] { 0x01 } }, // Single 24-bit symbol { new byte[] { 0xff, 0xff, 0xea }, new byte[] { 0x09 } }, // Single 25-bit symbol { new byte[] { 0xff, 0xff, 0xf6, 0x7f }, new byte[] { 0xc7 } }, // Single 26-bit symbol { new byte[] { 0xff, 0xff, 0xf8, 0x3f }, new byte[] { 0xc0 } }, // Single 27-bit symbol { new byte[] { 0xff, 0xff, 0xfb, 0xdf }, new byte[] { 0xcb } }, // Single 28-bit symbol { new byte[] { 0xff, 0xff, 0xfe, 0x2f }, new byte[] { 0x02 } }, // Single 30-bit symbol { new byte[] { 0xff, 0xff, 0xff, 0xf3 }, new byte[] { 0x0a } }, // h e l l o * { new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_1111 }, Encoding.ASCII.GetBytes("hello") }, // Sequences that uncovered errors { new byte[] { 0xb6, 0xb9, 0xac, 0x1c, 0x85, 0x58, 0xd5, 0x20, 0xa4, 0xb6, 0xc2, 0xad, 0x61, 0x7b, 0x5a, 0x54, 0x25, 0x1f }, Encoding.ASCII.GetBytes("upgrade-insecure-requests") }, { new byte[] { 0xfe, 0x53 }, Encoding.ASCII.GetBytes("\"t") } }; [Theory] [MemberData(nameof(_validData))] public void HuffmanDecodeArray(byte[] encoded, byte[] expected) { var dst = new byte[expected.Length]; Assert.Equal(expected.Length, Huffman.Decode(new ReadOnlySpan(encoded), dst)); Assert.Equal(expected, dst); } public static readonly TheoryData _longPaddingData = new TheoryData { // h e l l o * new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_1111, 0b11111111 }, // '&' (8 bits) + 8 bit padding new byte[] { 0xf8, 0xff }, // ':' (7 bits) + 9 bit padding new byte[] { 0xb9, 0xff } }; [Theory] [MemberData(nameof(_longPaddingData))] public void ThrowsOnPaddingLongerThanSevenBits(byte[] encoded) { var exception = Assert.Throws(() => Huffman.Decode(new ReadOnlySpan(encoded), new byte[encoded.Length * 2])); Assert.Equal(CoreStrings.HPackHuffmanErrorIncomplete, exception.Message); } public static readonly TheoryData _eosData = new TheoryData { // EOS new byte[] { 0xff, 0xff, 0xff, 0xff }, // '&' + EOS + '0' new byte[] { 0xf8, 0xff, 0xff, 0xff, 0xfc, 0x1f } }; [Theory] [MemberData(nameof(_eosData))] public void ThrowsOnEOS(byte[] encoded) { var exception = Assert.Throws(() => Huffman.Decode(new ReadOnlySpan(encoded), new byte[encoded.Length * 2])); Assert.Equal(CoreStrings.HPackHuffmanErrorEOS, exception.Message); } [Fact] public void ThrowsOnDestinationBufferTooSmall() { // h e l l o * var encoded = new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_1111 }; var exception = Assert.Throws(() => Huffman.Decode(new ReadOnlySpan(encoded), new byte[encoded.Length])); Assert.Equal(CoreStrings.HPackHuffmanErrorDestinationTooSmall, exception.Message); } public static readonly TheoryData _incompleteSymbolData = new TheoryData { // h e l l o (incomplete) new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0 }, // Non-zero padding will be seen as incomplete symbol // h e l l o * new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_0000 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_0001 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_0010 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_0011 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_0100 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_0101 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_0110 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_0111 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_1000 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_1001 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_1010 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_1011 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_1100 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_1101 }, new byte[] { 0b100111_00, 0b101_10100, 0b0_101000_0, 0b0111_1110 } }; [Theory] [MemberData(nameof(_incompleteSymbolData))] public void ThrowsOnIncompleteSymbol(byte[] encoded) { var exception = Assert.Throws(() => Huffman.Decode(new ReadOnlySpan(encoded), new byte[encoded.Length * 2])); Assert.Equal(CoreStrings.HPackHuffmanErrorIncomplete, exception.Message); } [Fact] public void DecodeCharactersThatSpans5Octets() { var expectedLength = 2; var decodedBytes = new byte[expectedLength]; // B LF EOS var encoded = new byte[] { 0b1011101_1, 0b11111111, 0b11111111, 0b11111111, 0b11100_111 }; var decodedLength = Huffman.Decode(new ReadOnlySpan(encoded, 0, encoded.Length), decodedBytes); Assert.Equal(expectedLength, decodedLength); Assert.Equal(new byte [] { (byte)'B', (byte)'\n' }, decodedBytes); } [Theory] [MemberData(nameof(HuffmanData))] public void HuffmanEncode(int code, uint expectedEncoded, int expectedBitLength) { var (encoded, bitLength) = Huffman.Encode(code); Assert.Equal(expectedEncoded, encoded); Assert.Equal(expectedBitLength, bitLength); } [Theory] [MemberData(nameof(HuffmanData))] public void HuffmanDecode(int code, uint encoded, int bitLength) { Assert.Equal(code, Huffman.DecodeValue(encoded, bitLength, out var decodedBits)); Assert.Equal(bitLength, decodedBits); } [Theory] [MemberData(nameof(HuffmanData))] public void HuffmanEncodeDecode( int code, // Suppresses the warning about an unused theory parameter because // this test shares data with other methods #pragma warning disable xUnit1026 uint encoded, #pragma warning restore xUnit1026 int bitLength) { Assert.Equal(code, Huffman.DecodeValue(Huffman.Encode(code).encoded, bitLength, out var decodedBits)); Assert.Equal(bitLength, decodedBits); } public static TheoryData HuffmanData { get { var data = new TheoryData(); data.Add(0, 0b11111111_11000000_00000000_00000000, 13); data.Add(1, 0b11111111_11111111_10110000_00000000, 23); data.Add(2, 0b11111111_11111111_11111110_00100000, 28); data.Add(3, 0b11111111_11111111_11111110_00110000, 28); data.Add(4, 0b11111111_11111111_11111110_01000000, 28); data.Add(5, 0b11111111_11111111_11111110_01010000, 28); data.Add(6, 0b11111111_11111111_11111110_01100000, 28); data.Add(7, 0b11111111_11111111_11111110_01110000, 28); data.Add(8, 0b11111111_11111111_11111110_10000000, 28); data.Add(9, 0b11111111_11111111_11101010_00000000, 24); data.Add(10, 0b11111111_11111111_11111111_11110000, 30); data.Add(11, 0b11111111_11111111_11111110_10010000, 28); data.Add(12, 0b11111111_11111111_11111110_10100000, 28); data.Add(13, 0b11111111_11111111_11111111_11110100, 30); data.Add(14, 0b11111111_11111111_11111110_10110000, 28); data.Add(15, 0b11111111_11111111_11111110_11000000, 28); data.Add(16, 0b11111111_11111111_11111110_11010000, 28); data.Add(17, 0b11111111_11111111_11111110_11100000, 28); data.Add(18, 0b11111111_11111111_11111110_11110000, 28); data.Add(19, 0b11111111_11111111_11111111_00000000, 28); data.Add(20, 0b11111111_11111111_11111111_00010000, 28); data.Add(21, 0b11111111_11111111_11111111_00100000, 28); data.Add(22, 0b11111111_11111111_11111111_11111000, 30); data.Add(23, 0b11111111_11111111_11111111_00110000, 28); data.Add(24, 0b11111111_11111111_11111111_01000000, 28); data.Add(25, 0b11111111_11111111_11111111_01010000, 28); data.Add(26, 0b11111111_11111111_11111111_01100000, 28); data.Add(27, 0b11111111_11111111_11111111_01110000, 28); data.Add(28, 0b11111111_11111111_11111111_10000000, 28); data.Add(29, 0b11111111_11111111_11111111_10010000, 28); data.Add(30, 0b11111111_11111111_11111111_10100000, 28); data.Add(31, 0b11111111_11111111_11111111_10110000, 28); data.Add(32, 0b01010000_00000000_00000000_00000000, 6); data.Add(33, 0b11111110_00000000_00000000_00000000, 10); data.Add(34, 0b11111110_01000000_00000000_00000000, 10); data.Add(35, 0b11111111_10100000_00000000_00000000, 12); data.Add(36, 0b11111111_11001000_00000000_00000000, 13); data.Add(37, 0b01010100_00000000_00000000_00000000, 6); data.Add(38, 0b11111000_00000000_00000000_00000000, 8); data.Add(39, 0b11111111_01000000_00000000_00000000, 11); data.Add(40, 0b11111110_10000000_00000000_00000000, 10); data.Add(41, 0b11111110_11000000_00000000_00000000, 10); data.Add(42, 0b11111001_00000000_00000000_00000000, 8); data.Add(43, 0b11111111_01100000_00000000_00000000, 11); data.Add(44, 0b11111010_00000000_00000000_00000000, 8); data.Add(45, 0b01011000_00000000_00000000_00000000, 6); data.Add(46, 0b01011100_00000000_00000000_00000000, 6); data.Add(47, 0b01100000_00000000_00000000_00000000, 6); data.Add(48, 0b00000000_00000000_00000000_00000000, 5); data.Add(49, 0b00001000_00000000_00000000_00000000, 5); data.Add(50, 0b00010000_00000000_00000000_00000000, 5); data.Add(51, 0b01100100_00000000_00000000_00000000, 6); data.Add(52, 0b01101000_00000000_00000000_00000000, 6); data.Add(53, 0b01101100_00000000_00000000_00000000, 6); data.Add(54, 0b01110000_00000000_00000000_00000000, 6); data.Add(55, 0b01110100_00000000_00000000_00000000, 6); data.Add(56, 0b01111000_00000000_00000000_00000000, 6); data.Add(57, 0b01111100_00000000_00000000_00000000, 6); data.Add(58, 0b10111000_00000000_00000000_00000000, 7); data.Add(59, 0b11111011_00000000_00000000_00000000, 8); data.Add(60, 0b11111111_11111000_00000000_00000000, 15); data.Add(61, 0b10000000_00000000_00000000_00000000, 6); data.Add(62, 0b11111111_10110000_00000000_00000000, 12); data.Add(63, 0b11111111_00000000_00000000_00000000, 10); data.Add(64, 0b11111111_11010000_00000000_00000000, 13); data.Add(65, 0b10000100_00000000_00000000_00000000, 6); data.Add(66, 0b10111010_00000000_00000000_00000000, 7); data.Add(67, 0b10111100_00000000_00000000_00000000, 7); data.Add(68, 0b10111110_00000000_00000000_00000000, 7); data.Add(69, 0b11000000_00000000_00000000_00000000, 7); data.Add(70, 0b11000010_00000000_00000000_00000000, 7); data.Add(71, 0b11000100_00000000_00000000_00000000, 7); data.Add(72, 0b11000110_00000000_00000000_00000000, 7); data.Add(73, 0b11001000_00000000_00000000_00000000, 7); data.Add(74, 0b11001010_00000000_00000000_00000000, 7); data.Add(75, 0b11001100_00000000_00000000_00000000, 7); data.Add(76, 0b11001110_00000000_00000000_00000000, 7); data.Add(77, 0b11010000_00000000_00000000_00000000, 7); data.Add(78, 0b11010010_00000000_00000000_00000000, 7); data.Add(79, 0b11010100_00000000_00000000_00000000, 7); data.Add(80, 0b11010110_00000000_00000000_00000000, 7); data.Add(81, 0b11011000_00000000_00000000_00000000, 7); data.Add(82, 0b11011010_00000000_00000000_00000000, 7); data.Add(83, 0b11011100_00000000_00000000_00000000, 7); data.Add(84, 0b11011110_00000000_00000000_00000000, 7); data.Add(85, 0b11100000_00000000_00000000_00000000, 7); data.Add(86, 0b11100010_00000000_00000000_00000000, 7); data.Add(87, 0b11100100_00000000_00000000_00000000, 7); data.Add(88, 0b11111100_00000000_00000000_00000000, 8); data.Add(89, 0b11100110_00000000_00000000_00000000, 7); data.Add(90, 0b11111101_00000000_00000000_00000000, 8); data.Add(91, 0b11111111_11011000_00000000_00000000, 13); data.Add(92, 0b11111111_11111110_00000000_00000000, 19); data.Add(93, 0b11111111_11100000_00000000_00000000, 13); data.Add(94, 0b11111111_11110000_00000000_00000000, 14); data.Add(95, 0b10001000_00000000_00000000_00000000, 6); data.Add(96, 0b11111111_11111010_00000000_00000000, 15); data.Add(97, 0b00011000_00000000_00000000_00000000, 5); data.Add(98, 0b10001100_00000000_00000000_00000000, 6); data.Add(99, 0b00100000_00000000_00000000_00000000, 5); data.Add(100, 0b10010000_00000000_00000000_00000000, 6); data.Add(101, 0b00101000_00000000_00000000_00000000, 5); data.Add(102, 0b10010100_00000000_00000000_00000000, 6); data.Add(103, 0b10011000_00000000_00000000_00000000, 6); data.Add(104, 0b10011100_00000000_00000000_00000000, 6); data.Add(105, 0b00110000_00000000_00000000_00000000, 5); data.Add(106, 0b11101000_00000000_00000000_00000000, 7); data.Add(107, 0b11101010_00000000_00000000_00000000, 7); data.Add(108, 0b10100000_00000000_00000000_00000000, 6); data.Add(109, 0b10100100_00000000_00000000_00000000, 6); data.Add(110, 0b10101000_00000000_00000000_00000000, 6); data.Add(111, 0b00111000_00000000_00000000_00000000, 5); data.Add(112, 0b10101100_00000000_00000000_00000000, 6); data.Add(113, 0b11101100_00000000_00000000_00000000, 7); data.Add(114, 0b10110000_00000000_00000000_00000000, 6); data.Add(115, 0b01000000_00000000_00000000_00000000, 5); data.Add(116, 0b01001000_00000000_00000000_00000000, 5); data.Add(117, 0b10110100_00000000_00000000_00000000, 6); data.Add(118, 0b11101110_00000000_00000000_00000000, 7); data.Add(119, 0b11110000_00000000_00000000_00000000, 7); data.Add(120, 0b11110010_00000000_00000000_00000000, 7); data.Add(121, 0b11110100_00000000_00000000_00000000, 7); data.Add(122, 0b11110110_00000000_00000000_00000000, 7); data.Add(123, 0b11111111_11111100_00000000_00000000, 15); data.Add(124, 0b11111111_10000000_00000000_00000000, 11); data.Add(125, 0b11111111_11110100_00000000_00000000, 14); data.Add(126, 0b11111111_11101000_00000000_00000000, 13); data.Add(127, 0b11111111_11111111_11111111_11000000, 28); data.Add(128, 0b11111111_11111110_01100000_00000000, 20); data.Add(129, 0b11111111_11111111_01001000_00000000, 22); data.Add(130, 0b11111111_11111110_01110000_00000000, 20); data.Add(131, 0b11111111_11111110_10000000_00000000, 20); data.Add(132, 0b11111111_11111111_01001100_00000000, 22); data.Add(133, 0b11111111_11111111_01010000_00000000, 22); data.Add(134, 0b11111111_11111111_01010100_00000000, 22); data.Add(135, 0b11111111_11111111_10110010_00000000, 23); data.Add(136, 0b11111111_11111111_01011000_00000000, 22); data.Add(137, 0b11111111_11111111_10110100_00000000, 23); data.Add(138, 0b11111111_11111111_10110110_00000000, 23); data.Add(139, 0b11111111_11111111_10111000_00000000, 23); data.Add(140, 0b11111111_11111111_10111010_00000000, 23); data.Add(141, 0b11111111_11111111_10111100_00000000, 23); data.Add(142, 0b11111111_11111111_11101011_00000000, 24); data.Add(143, 0b11111111_11111111_10111110_00000000, 23); data.Add(144, 0b11111111_11111111_11101100_00000000, 24); data.Add(145, 0b11111111_11111111_11101101_00000000, 24); data.Add(146, 0b11111111_11111111_01011100_00000000, 22); data.Add(147, 0b11111111_11111111_11000000_00000000, 23); data.Add(148, 0b11111111_11111111_11101110_00000000, 24); data.Add(149, 0b11111111_11111111_11000010_00000000, 23); data.Add(150, 0b11111111_11111111_11000100_00000000, 23); data.Add(151, 0b11111111_11111111_11000110_00000000, 23); data.Add(152, 0b11111111_11111111_11001000_00000000, 23); data.Add(153, 0b11111111_11111110_11100000_00000000, 21); data.Add(154, 0b11111111_11111111_01100000_00000000, 22); data.Add(155, 0b11111111_11111111_11001010_00000000, 23); data.Add(156, 0b11111111_11111111_01100100_00000000, 22); data.Add(157, 0b11111111_11111111_11001100_00000000, 23); data.Add(158, 0b11111111_11111111_11001110_00000000, 23); data.Add(159, 0b11111111_11111111_11101111_00000000, 24); data.Add(160, 0b11111111_11111111_01101000_00000000, 22); data.Add(161, 0b11111111_11111110_11101000_00000000, 21); data.Add(162, 0b11111111_11111110_10010000_00000000, 20); data.Add(163, 0b11111111_11111111_01101100_00000000, 22); data.Add(164, 0b11111111_11111111_01110000_00000000, 22); data.Add(165, 0b11111111_11111111_11010000_00000000, 23); data.Add(166, 0b11111111_11111111_11010010_00000000, 23); data.Add(167, 0b11111111_11111110_11110000_00000000, 21); data.Add(168, 0b11111111_11111111_11010100_00000000, 23); data.Add(169, 0b11111111_11111111_01110100_00000000, 22); data.Add(170, 0b11111111_11111111_01111000_00000000, 22); data.Add(171, 0b11111111_11111111_11110000_00000000, 24); data.Add(172, 0b11111111_11111110_11111000_00000000, 21); data.Add(173, 0b11111111_11111111_01111100_00000000, 22); data.Add(174, 0b11111111_11111111_11010110_00000000, 23); data.Add(175, 0b11111111_11111111_11011000_00000000, 23); data.Add(176, 0b11111111_11111111_00000000_00000000, 21); data.Add(177, 0b11111111_11111111_00001000_00000000, 21); data.Add(178, 0b11111111_11111111_10000000_00000000, 22); data.Add(179, 0b11111111_11111111_00010000_00000000, 21); data.Add(180, 0b11111111_11111111_11011010_00000000, 23); data.Add(181, 0b11111111_11111111_10000100_00000000, 22); data.Add(182, 0b11111111_11111111_11011100_00000000, 23); data.Add(183, 0b11111111_11111111_11011110_00000000, 23); data.Add(184, 0b11111111_11111110_10100000_00000000, 20); data.Add(185, 0b11111111_11111111_10001000_00000000, 22); data.Add(186, 0b11111111_11111111_10001100_00000000, 22); data.Add(187, 0b11111111_11111111_10010000_00000000, 22); data.Add(188, 0b11111111_11111111_11100000_00000000, 23); data.Add(189, 0b11111111_11111111_10010100_00000000, 22); data.Add(190, 0b11111111_11111111_10011000_00000000, 22); data.Add(191, 0b11111111_11111111_11100010_00000000, 23); data.Add(192, 0b11111111_11111111_11111000_00000000, 26); data.Add(193, 0b11111111_11111111_11111000_01000000, 26); data.Add(194, 0b11111111_11111110_10110000_00000000, 20); data.Add(195, 0b11111111_11111110_00100000_00000000, 19); data.Add(196, 0b11111111_11111111_10011100_00000000, 22); data.Add(197, 0b11111111_11111111_11100100_00000000, 23); data.Add(198, 0b11111111_11111111_10100000_00000000, 22); data.Add(199, 0b11111111_11111111_11110110_00000000, 25); data.Add(200, 0b11111111_11111111_11111000_10000000, 26); data.Add(201, 0b11111111_11111111_11111000_11000000, 26); data.Add(202, 0b11111111_11111111_11111001_00000000, 26); data.Add(203, 0b11111111_11111111_11111011_11000000, 27); data.Add(204, 0b11111111_11111111_11111011_11100000, 27); data.Add(205, 0b11111111_11111111_11111001_01000000, 26); data.Add(206, 0b11111111_11111111_11110001_00000000, 24); data.Add(207, 0b11111111_11111111_11110110_10000000, 25); data.Add(208, 0b11111111_11111110_01000000_00000000, 19); data.Add(209, 0b11111111_11111111_00011000_00000000, 21); data.Add(210, 0b11111111_11111111_11111001_10000000, 26); data.Add(211, 0b11111111_11111111_11111100_00000000, 27); data.Add(212, 0b11111111_11111111_11111100_00100000, 27); data.Add(213, 0b11111111_11111111_11111001_11000000, 26); data.Add(214, 0b11111111_11111111_11111100_01000000, 27); data.Add(215, 0b11111111_11111111_11110010_00000000, 24); data.Add(216, 0b11111111_11111111_00100000_00000000, 21); data.Add(217, 0b11111111_11111111_00101000_00000000, 21); data.Add(218, 0b11111111_11111111_11111010_00000000, 26); data.Add(219, 0b11111111_11111111_11111010_01000000, 26); data.Add(220, 0b11111111_11111111_11111111_11010000, 28); data.Add(221, 0b11111111_11111111_11111100_01100000, 27); data.Add(222, 0b11111111_11111111_11111100_10000000, 27); data.Add(223, 0b11111111_11111111_11111100_10100000, 27); data.Add(224, 0b11111111_11111110_11000000_00000000, 20); data.Add(225, 0b11111111_11111111_11110011_00000000, 24); data.Add(226, 0b11111111_11111110_11010000_00000000, 20); data.Add(227, 0b11111111_11111111_00110000_00000000, 21); data.Add(228, 0b11111111_11111111_10100100_00000000, 22); data.Add(229, 0b11111111_11111111_00111000_00000000, 21); data.Add(230, 0b11111111_11111111_01000000_00000000, 21); data.Add(231, 0b11111111_11111111_11100110_00000000, 23); data.Add(232, 0b11111111_11111111_10101000_00000000, 22); data.Add(233, 0b11111111_11111111_10101100_00000000, 22); data.Add(234, 0b11111111_11111111_11110111_00000000, 25); data.Add(235, 0b11111111_11111111_11110111_10000000, 25); data.Add(236, 0b11111111_11111111_11110100_00000000, 24); data.Add(237, 0b11111111_11111111_11110101_00000000, 24); data.Add(238, 0b11111111_11111111_11111010_10000000, 26); data.Add(239, 0b11111111_11111111_11101000_00000000, 23); data.Add(240, 0b11111111_11111111_11111010_11000000, 26); data.Add(241, 0b11111111_11111111_11111100_11000000, 27); data.Add(242, 0b11111111_11111111_11111011_00000000, 26); data.Add(243, 0b11111111_11111111_11111011_01000000, 26); data.Add(244, 0b11111111_11111111_11111100_11100000, 27); data.Add(245, 0b11111111_11111111_11111101_00000000, 27); data.Add(246, 0b11111111_11111111_11111101_00100000, 27); data.Add(247, 0b11111111_11111111_11111101_01000000, 27); data.Add(248, 0b11111111_11111111_11111101_01100000, 27); data.Add(249, 0b11111111_11111111_11111111_11100000, 28); data.Add(250, 0b11111111_11111111_11111101_10000000, 27); data.Add(251, 0b11111111_11111111_11111101_10100000, 27); data.Add(252, 0b11111111_11111111_11111101_11000000, 27); data.Add(253, 0b11111111_11111111_11111101_11100000, 27); data.Add(254, 0b11111111_11111111_11111110_00000000, 27); data.Add(255, 0b11111111_11111111_11111011_10000000, 26); data.Add(256, 0b11111111_11111111_11111111_11111100, 30); return data; } } } }