taldir

Directory service to resolve wallet mailboxes by messenger addresses
Log | Files | Refs | Submodules | README | LICENSE

version.go (30968B)


      1 // go-qrcode
      2 // Copyright 2014 Tom Harwood
      3 
      4 package qrcode
      5 
      6 import (
      7 	"log"
      8 
      9 	bitset "github.com/skip2/go-qrcode/bitset"
     10 )
     11 
     12 // Error detection/recovery capacity.
     13 //
     14 // There are several levels of error detection/recovery capacity. Higher levels
     15 // of error recovery are able to correct more errors, with the trade-off of
     16 // increased symbol size.
     17 type RecoveryLevel int
     18 
     19 const (
     20 	// Level L: 7% error recovery.
     21 	Low RecoveryLevel = iota
     22 
     23 	// Level M: 15% error recovery. Good default choice.
     24 	Medium
     25 
     26 	// Level Q: 25% error recovery.
     27 	High
     28 
     29 	// Level H: 30% error recovery.
     30 	Highest
     31 )
     32 
     33 // qrCodeVersion describes the data length and encoding order of a single QR
     34 // Code version. There are 40 versions numbers x 4 recovery levels == 160
     35 // possible qrCodeVersion structures.
     36 type qrCodeVersion struct {
     37 	// Version number (1-40 inclusive).
     38 	version int
     39 
     40 	// Error recovery level.
     41 	level RecoveryLevel
     42 
     43 	dataEncoderType dataEncoderType
     44 
     45 	// Encoded data can be split into multiple blocks. Each block contains data
     46 	// and error recovery bytes.
     47 	//
     48 	// Larger QR Codes contain more blocks.
     49 	block []block
     50 
     51 	// Number of bits required to pad the combined data & error correction bit
     52 	// stream up to the symbol's full capacity.
     53 	numRemainderBits int
     54 }
     55 
     56 type block struct {
     57 	numBlocks int
     58 
     59 	// Total codewords (numCodewords == numErrorCodewords+numDataCodewords).
     60 	numCodewords int
     61 
     62 	// Number of data codewords.
     63 	numDataCodewords int
     64 }
     65 
     66 var (
     67 	versions = []qrCodeVersion{
     68 		{
     69 			1,
     70 			Low,
     71 			dataEncoderType1To9,
     72 			[]block{
     73 				{
     74 					1,
     75 					26,
     76 					19,
     77 				},
     78 			},
     79 			0,
     80 		},
     81 		{
     82 			1,
     83 			Medium,
     84 			dataEncoderType1To9,
     85 			[]block{
     86 				{
     87 					1,
     88 					26,
     89 					16,
     90 				},
     91 			},
     92 			0,
     93 		},
     94 		{
     95 			1,
     96 			High,
     97 			dataEncoderType1To9,
     98 			[]block{
     99 				{
    100 					1,
    101 					26,
    102 					13,
    103 				},
    104 			},
    105 			0,
    106 		},
    107 		{
    108 			1,
    109 			Highest,
    110 			dataEncoderType1To9,
    111 			[]block{
    112 				{
    113 					1,
    114 					26,
    115 					9,
    116 				},
    117 			},
    118 			0,
    119 		},
    120 		{
    121 			2,
    122 			Low,
    123 			dataEncoderType1To9,
    124 			[]block{
    125 				{
    126 					1,
    127 					44,
    128 					34,
    129 				},
    130 			},
    131 			7,
    132 		},
    133 		{
    134 			2,
    135 			Medium,
    136 			dataEncoderType1To9,
    137 			[]block{
    138 				{
    139 					1,
    140 					44,
    141 					28,
    142 				},
    143 			},
    144 			7,
    145 		},
    146 		{
    147 			2,
    148 			High,
    149 			dataEncoderType1To9,
    150 			[]block{
    151 				{
    152 					1,
    153 					44,
    154 					22,
    155 				},
    156 			},
    157 			7,
    158 		},
    159 		{
    160 			2,
    161 			Highest,
    162 			dataEncoderType1To9,
    163 			[]block{
    164 				{
    165 					1,
    166 					44,
    167 					16,
    168 				},
    169 			},
    170 			7,
    171 		},
    172 		{
    173 			3,
    174 			Low,
    175 			dataEncoderType1To9,
    176 			[]block{
    177 				{
    178 					1,
    179 					70,
    180 					55,
    181 				},
    182 			},
    183 			7,
    184 		},
    185 		{
    186 			3,
    187 			Medium,
    188 			dataEncoderType1To9,
    189 			[]block{
    190 				{
    191 					1,
    192 					70,
    193 					44,
    194 				},
    195 			},
    196 			7,
    197 		},
    198 		{
    199 			3,
    200 			High,
    201 			dataEncoderType1To9,
    202 			[]block{
    203 				{
    204 					2,
    205 					35,
    206 					17,
    207 				},
    208 			},
    209 			7,
    210 		},
    211 		{
    212 			3,
    213 			Highest,
    214 			dataEncoderType1To9,
    215 			[]block{
    216 				{
    217 					2,
    218 					35,
    219 					13,
    220 				},
    221 			},
    222 			7,
    223 		},
    224 		{
    225 			4,
    226 			Low,
    227 			dataEncoderType1To9,
    228 			[]block{
    229 				{
    230 					1,
    231 					100,
    232 					80,
    233 				},
    234 			},
    235 			7,
    236 		},
    237 		{
    238 			4,
    239 			Medium,
    240 			dataEncoderType1To9,
    241 			[]block{
    242 				{
    243 					2,
    244 					50,
    245 					32,
    246 				},
    247 			},
    248 			7,
    249 		},
    250 		{
    251 			4,
    252 			High,
    253 			dataEncoderType1To9,
    254 			[]block{
    255 				{
    256 					2,
    257 					50,
    258 					24,
    259 				},
    260 			},
    261 			7,
    262 		},
    263 		{
    264 			4,
    265 			Highest,
    266 			dataEncoderType1To9,
    267 			[]block{
    268 				{
    269 					4,
    270 					25,
    271 					9,
    272 				},
    273 			},
    274 			7,
    275 		},
    276 		{
    277 			5,
    278 			Low,
    279 			dataEncoderType1To9,
    280 			[]block{
    281 				{
    282 					1,
    283 					134,
    284 					108,
    285 				},
    286 			},
    287 			7,
    288 		},
    289 		{
    290 			5,
    291 			Medium,
    292 			dataEncoderType1To9,
    293 			[]block{
    294 				{
    295 					2,
    296 					67,
    297 					43,
    298 				},
    299 			},
    300 			7,
    301 		},
    302 		{
    303 			5,
    304 			High,
    305 			dataEncoderType1To9,
    306 			[]block{
    307 				{
    308 					2,
    309 					33,
    310 					15,
    311 				},
    312 				{
    313 					2,
    314 					34,
    315 					16,
    316 				},
    317 			},
    318 			7,
    319 		},
    320 		{
    321 			5,
    322 			Highest,
    323 			dataEncoderType1To9,
    324 			[]block{
    325 				{
    326 					2,
    327 					33,
    328 					11,
    329 				},
    330 				{
    331 					2,
    332 					34,
    333 					12,
    334 				},
    335 			},
    336 			7,
    337 		},
    338 		{
    339 			6,
    340 			Low,
    341 			dataEncoderType1To9,
    342 			[]block{
    343 				{
    344 					2,
    345 					86,
    346 					68,
    347 				},
    348 			},
    349 			7,
    350 		},
    351 		{
    352 			6,
    353 			Medium,
    354 			dataEncoderType1To9,
    355 			[]block{
    356 				{
    357 					4,
    358 					43,
    359 					27,
    360 				},
    361 			},
    362 			7,
    363 		},
    364 		{
    365 			6,
    366 			High,
    367 			dataEncoderType1To9,
    368 			[]block{
    369 				{
    370 					4,
    371 					43,
    372 					19,
    373 				},
    374 			},
    375 			7,
    376 		},
    377 		{
    378 			6,
    379 			Highest,
    380 			dataEncoderType1To9,
    381 			[]block{
    382 				{
    383 					4,
    384 					43,
    385 					15,
    386 				},
    387 			},
    388 			7,
    389 		},
    390 		{
    391 			7,
    392 			Low,
    393 			dataEncoderType1To9,
    394 			[]block{
    395 				{
    396 					2,
    397 					98,
    398 					78,
    399 				},
    400 			},
    401 			0,
    402 		},
    403 		{
    404 			7,
    405 			Medium,
    406 			dataEncoderType1To9,
    407 			[]block{
    408 				{
    409 					4,
    410 					49,
    411 					31,
    412 				},
    413 			},
    414 			0,
    415 		},
    416 		{
    417 			7,
    418 			High,
    419 			dataEncoderType1To9,
    420 			[]block{
    421 				{
    422 					2,
    423 					32,
    424 					14,
    425 				},
    426 				{
    427 					4,
    428 					33,
    429 					15,
    430 				},
    431 			},
    432 			0,
    433 		},
    434 		{
    435 			7,
    436 			Highest,
    437 			dataEncoderType1To9,
    438 			[]block{
    439 				{
    440 					4,
    441 					39,
    442 					13,
    443 				},
    444 				{
    445 					1,
    446 					40,
    447 					14,
    448 				},
    449 			},
    450 			0,
    451 		},
    452 		{
    453 			8,
    454 			Low,
    455 			dataEncoderType1To9,
    456 			[]block{
    457 				{
    458 					2,
    459 					121,
    460 					97,
    461 				},
    462 			},
    463 			0,
    464 		},
    465 		{
    466 			8,
    467 			Medium,
    468 			dataEncoderType1To9,
    469 			[]block{
    470 				{
    471 					2,
    472 					60,
    473 					38,
    474 				},
    475 				{
    476 					2,
    477 					61,
    478 					39,
    479 				},
    480 			},
    481 			0,
    482 		},
    483 		{
    484 			8,
    485 			High,
    486 			dataEncoderType1To9,
    487 			[]block{
    488 				{
    489 					4,
    490 					40,
    491 					18,
    492 				},
    493 				{
    494 					2,
    495 					41,
    496 					19,
    497 				},
    498 			},
    499 			0,
    500 		},
    501 		{
    502 			8,
    503 			Highest,
    504 			dataEncoderType1To9,
    505 			[]block{
    506 				{
    507 					4,
    508 					40,
    509 					14,
    510 				},
    511 				{
    512 					2,
    513 					41,
    514 					15,
    515 				},
    516 			},
    517 			0,
    518 		},
    519 		{
    520 			9,
    521 			Low,
    522 			dataEncoderType1To9,
    523 			[]block{
    524 				{
    525 					2,
    526 					146,
    527 					116,
    528 				},
    529 			},
    530 			0,
    531 		},
    532 		{
    533 			9,
    534 			Medium,
    535 			dataEncoderType1To9,
    536 			[]block{
    537 				{
    538 					3,
    539 					58,
    540 					36,
    541 				},
    542 				{
    543 					2,
    544 					59,
    545 					37,
    546 				},
    547 			},
    548 			0,
    549 		},
    550 		{
    551 			9,
    552 			High,
    553 			dataEncoderType1To9,
    554 			[]block{
    555 				{
    556 					4,
    557 					36,
    558 					16,
    559 				},
    560 				{
    561 					4,
    562 					37,
    563 					17,
    564 				},
    565 			},
    566 			0,
    567 		},
    568 		{
    569 			9,
    570 			Highest,
    571 			dataEncoderType1To9,
    572 			[]block{
    573 				{
    574 					4,
    575 					36,
    576 					12,
    577 				},
    578 				{
    579 					4,
    580 					37,
    581 					13,
    582 				},
    583 			},
    584 			0,
    585 		},
    586 		{
    587 			10,
    588 			Low,
    589 			dataEncoderType10To26,
    590 			[]block{
    591 				{
    592 					2,
    593 					86,
    594 					68,
    595 				},
    596 				{
    597 					2,
    598 					87,
    599 					69,
    600 				},
    601 			},
    602 			0,
    603 		},
    604 		{
    605 			10,
    606 			Medium,
    607 			dataEncoderType10To26,
    608 			[]block{
    609 				{
    610 					4,
    611 					69,
    612 					43,
    613 				},
    614 				{
    615 					1,
    616 					70,
    617 					44,
    618 				},
    619 			},
    620 			0,
    621 		},
    622 		{
    623 			10,
    624 			High,
    625 			dataEncoderType10To26,
    626 			[]block{
    627 				{
    628 					6,
    629 					43,
    630 					19,
    631 				},
    632 				{
    633 					2,
    634 					44,
    635 					20,
    636 				},
    637 			},
    638 			0,
    639 		},
    640 		{
    641 			10,
    642 			Highest,
    643 			dataEncoderType10To26,
    644 			[]block{
    645 				{
    646 					6,
    647 					43,
    648 					15,
    649 				},
    650 				{
    651 					2,
    652 					44,
    653 					16,
    654 				},
    655 			},
    656 			0,
    657 		},
    658 		{
    659 			11,
    660 			Low,
    661 			dataEncoderType10To26,
    662 			[]block{
    663 				{
    664 					4,
    665 					101,
    666 					81,
    667 				},
    668 			},
    669 			0,
    670 		},
    671 		{
    672 			11,
    673 			Medium,
    674 			dataEncoderType10To26,
    675 			[]block{
    676 				{
    677 					1,
    678 					80,
    679 					50,
    680 				},
    681 				{
    682 					4,
    683 					81,
    684 					51,
    685 				},
    686 			},
    687 			0,
    688 		},
    689 		{
    690 			11,
    691 			High,
    692 			dataEncoderType10To26,
    693 			[]block{
    694 				{
    695 					4,
    696 					50,
    697 					22,
    698 				},
    699 				{
    700 					4,
    701 					51,
    702 					23,
    703 				},
    704 			},
    705 			0,
    706 		},
    707 		{
    708 			11,
    709 			Highest,
    710 			dataEncoderType10To26,
    711 			[]block{
    712 				{
    713 					3,
    714 					36,
    715 					12,
    716 				},
    717 				{
    718 					8,
    719 					37,
    720 					13,
    721 				},
    722 			},
    723 			0,
    724 		},
    725 		{
    726 			12,
    727 			Low,
    728 			dataEncoderType10To26,
    729 			[]block{
    730 				{
    731 					2,
    732 					116,
    733 					92,
    734 				},
    735 				{
    736 					2,
    737 					117,
    738 					93,
    739 				},
    740 			},
    741 			0,
    742 		},
    743 		{
    744 			12,
    745 			Medium,
    746 			dataEncoderType10To26,
    747 			[]block{
    748 				{
    749 					6,
    750 					58,
    751 					36,
    752 				},
    753 				{
    754 					2,
    755 					59,
    756 					37,
    757 				},
    758 			},
    759 			0,
    760 		},
    761 		{
    762 			12,
    763 			High,
    764 			dataEncoderType10To26,
    765 			[]block{
    766 				{
    767 					4,
    768 					46,
    769 					20,
    770 				},
    771 				{
    772 					6,
    773 					47,
    774 					21,
    775 				},
    776 			},
    777 			0,
    778 		},
    779 		{
    780 			12,
    781 			Highest,
    782 			dataEncoderType10To26,
    783 			[]block{
    784 				{
    785 					7,
    786 					42,
    787 					14,
    788 				},
    789 				{
    790 					4,
    791 					43,
    792 					15,
    793 				},
    794 			},
    795 			0,
    796 		},
    797 		{
    798 			13,
    799 			Low,
    800 			dataEncoderType10To26,
    801 			[]block{
    802 				{
    803 					4,
    804 					133,
    805 					107,
    806 				},
    807 			},
    808 			0,
    809 		},
    810 		{
    811 			13,
    812 			Medium,
    813 			dataEncoderType10To26,
    814 			[]block{
    815 				{
    816 					8,
    817 					59,
    818 					37,
    819 				},
    820 				{
    821 					1,
    822 					60,
    823 					38,
    824 				},
    825 			},
    826 			0,
    827 		},
    828 		{
    829 			13,
    830 			High,
    831 			dataEncoderType10To26,
    832 			[]block{
    833 				{
    834 					8,
    835 					44,
    836 					20,
    837 				},
    838 				{
    839 					4,
    840 					45,
    841 					21,
    842 				},
    843 			},
    844 			0,
    845 		},
    846 		{
    847 			13,
    848 			Highest,
    849 			dataEncoderType10To26,
    850 			[]block{
    851 				{
    852 					12,
    853 					33,
    854 					11,
    855 				},
    856 				{
    857 					4,
    858 					34,
    859 					12,
    860 				},
    861 			},
    862 			0,
    863 		},
    864 		{
    865 			14,
    866 			Low,
    867 			dataEncoderType10To26,
    868 			[]block{
    869 				{
    870 					3,
    871 					145,
    872 					115,
    873 				},
    874 				{
    875 					1,
    876 					146,
    877 					116,
    878 				},
    879 			},
    880 			3,
    881 		},
    882 		{
    883 			14,
    884 			Medium,
    885 			dataEncoderType10To26,
    886 			[]block{
    887 				{
    888 					4,
    889 					64,
    890 					40,
    891 				},
    892 				{
    893 					5,
    894 					65,
    895 					41,
    896 				},
    897 			},
    898 			3,
    899 		},
    900 		{
    901 			14,
    902 			High,
    903 			dataEncoderType10To26,
    904 			[]block{
    905 				{
    906 					11,
    907 					36,
    908 					16,
    909 				},
    910 				{
    911 					5,
    912 					37,
    913 					17,
    914 				},
    915 			},
    916 			3,
    917 		},
    918 		{
    919 			14,
    920 			Highest,
    921 			dataEncoderType10To26,
    922 			[]block{
    923 				{
    924 					11,
    925 					36,
    926 					12,
    927 				},
    928 				{
    929 					5,
    930 					37,
    931 					13,
    932 				},
    933 			},
    934 			3,
    935 		},
    936 		{
    937 			15,
    938 			Low,
    939 			dataEncoderType10To26,
    940 			[]block{
    941 				{
    942 					5,
    943 					109,
    944 					87,
    945 				},
    946 				{
    947 					1,
    948 					110,
    949 					88,
    950 				},
    951 			},
    952 			3,
    953 		},
    954 		{
    955 			15,
    956 			Medium,
    957 			dataEncoderType10To26,
    958 			[]block{
    959 				{
    960 					5,
    961 					65,
    962 					41,
    963 				},
    964 				{
    965 					5,
    966 					66,
    967 					42,
    968 				},
    969 			},
    970 			3,
    971 		},
    972 		{
    973 			15,
    974 			High,
    975 			dataEncoderType10To26,
    976 			[]block{
    977 				{
    978 					5,
    979 					54,
    980 					24,
    981 				},
    982 				{
    983 					7,
    984 					55,
    985 					25,
    986 				},
    987 			},
    988 			3,
    989 		},
    990 		{
    991 			15,
    992 			Highest,
    993 			dataEncoderType10To26,
    994 			[]block{
    995 				{
    996 					11,
    997 					36,
    998 					12,
    999 				},
   1000 				{
   1001 					7,
   1002 					37,
   1003 					13,
   1004 				},
   1005 			},
   1006 			3,
   1007 		},
   1008 		{
   1009 			16,
   1010 			Low,
   1011 			dataEncoderType10To26,
   1012 			[]block{
   1013 				{
   1014 					5,
   1015 					122,
   1016 					98,
   1017 				},
   1018 				{
   1019 					1,
   1020 					123,
   1021 					99,
   1022 				},
   1023 			},
   1024 			3,
   1025 		},
   1026 		{
   1027 			16,
   1028 			Medium,
   1029 			dataEncoderType10To26,
   1030 			[]block{
   1031 				{
   1032 					7,
   1033 					73,
   1034 					45,
   1035 				},
   1036 				{
   1037 					3,
   1038 					74,
   1039 					46,
   1040 				},
   1041 			},
   1042 			3,
   1043 		},
   1044 		{
   1045 			16,
   1046 			High,
   1047 			dataEncoderType10To26,
   1048 			[]block{
   1049 				{
   1050 					15,
   1051 					43,
   1052 					19,
   1053 				},
   1054 				{
   1055 					2,
   1056 					44,
   1057 					20,
   1058 				},
   1059 			},
   1060 			3,
   1061 		},
   1062 		{
   1063 			16,
   1064 			Highest,
   1065 			dataEncoderType10To26,
   1066 			[]block{
   1067 				{
   1068 					3,
   1069 					45,
   1070 					15,
   1071 				},
   1072 				{
   1073 					13,
   1074 					46,
   1075 					16,
   1076 				},
   1077 			},
   1078 			3,
   1079 		},
   1080 		{
   1081 			17,
   1082 			Low,
   1083 			dataEncoderType10To26,
   1084 			[]block{
   1085 				{
   1086 					1,
   1087 					135,
   1088 					107,
   1089 				},
   1090 				{
   1091 					5,
   1092 					136,
   1093 					108,
   1094 				},
   1095 			},
   1096 			3,
   1097 		},
   1098 		{
   1099 			17,
   1100 			Medium,
   1101 			dataEncoderType10To26,
   1102 			[]block{
   1103 				{
   1104 					10,
   1105 					74,
   1106 					46,
   1107 				},
   1108 				{
   1109 					1,
   1110 					75,
   1111 					47,
   1112 				},
   1113 			},
   1114 			3,
   1115 		},
   1116 		{
   1117 			17,
   1118 			High,
   1119 			dataEncoderType10To26,
   1120 			[]block{
   1121 				{
   1122 					1,
   1123 					50,
   1124 					22,
   1125 				},
   1126 				{
   1127 					15,
   1128 					51,
   1129 					23,
   1130 				},
   1131 			},
   1132 			3,
   1133 		},
   1134 		{
   1135 			17,
   1136 			Highest,
   1137 			dataEncoderType10To26,
   1138 			[]block{
   1139 				{
   1140 					2,
   1141 					42,
   1142 					14,
   1143 				},
   1144 				{
   1145 					17,
   1146 					43,
   1147 					15,
   1148 				},
   1149 			},
   1150 			3,
   1151 		},
   1152 		{
   1153 			18,
   1154 			Low,
   1155 			dataEncoderType10To26,
   1156 			[]block{
   1157 				{
   1158 					5,
   1159 					150,
   1160 					120,
   1161 				},
   1162 				{
   1163 					1,
   1164 					151,
   1165 					121,
   1166 				},
   1167 			},
   1168 			3,
   1169 		},
   1170 		{
   1171 			18,
   1172 			Medium,
   1173 			dataEncoderType10To26,
   1174 			[]block{
   1175 				{
   1176 					9,
   1177 					69,
   1178 					43,
   1179 				},
   1180 				{
   1181 					4,
   1182 					70,
   1183 					44,
   1184 				},
   1185 			},
   1186 			3,
   1187 		},
   1188 		{
   1189 			18,
   1190 			High,
   1191 			dataEncoderType10To26,
   1192 			[]block{
   1193 				{
   1194 					17,
   1195 					50,
   1196 					22,
   1197 				},
   1198 				{
   1199 					1,
   1200 					51,
   1201 					23,
   1202 				},
   1203 			},
   1204 			3,
   1205 		},
   1206 		{
   1207 			18,
   1208 			Highest,
   1209 			dataEncoderType10To26,
   1210 			[]block{
   1211 				{
   1212 					2,
   1213 					42,
   1214 					14,
   1215 				},
   1216 				{
   1217 					19,
   1218 					43,
   1219 					15,
   1220 				},
   1221 			},
   1222 			3,
   1223 		},
   1224 		{
   1225 			19,
   1226 			Low,
   1227 			dataEncoderType10To26,
   1228 			[]block{
   1229 				{
   1230 					3,
   1231 					141,
   1232 					113,
   1233 				},
   1234 				{
   1235 					4,
   1236 					142,
   1237 					114,
   1238 				},
   1239 			},
   1240 			3,
   1241 		},
   1242 		{
   1243 			19,
   1244 			Medium,
   1245 			dataEncoderType10To26,
   1246 			[]block{
   1247 				{
   1248 					3,
   1249 					70,
   1250 					44,
   1251 				},
   1252 				{
   1253 					11,
   1254 					71,
   1255 					45,
   1256 				},
   1257 			},
   1258 			3,
   1259 		},
   1260 		{
   1261 			19,
   1262 			High,
   1263 			dataEncoderType10To26,
   1264 			[]block{
   1265 				{
   1266 					17,
   1267 					47,
   1268 					21,
   1269 				},
   1270 				{
   1271 					4,
   1272 					48,
   1273 					22,
   1274 				},
   1275 			},
   1276 			3,
   1277 		},
   1278 		{
   1279 			19,
   1280 			Highest,
   1281 			dataEncoderType10To26,
   1282 			[]block{
   1283 				{
   1284 					9,
   1285 					39,
   1286 					13,
   1287 				},
   1288 				{
   1289 					16,
   1290 					40,
   1291 					14,
   1292 				},
   1293 			},
   1294 			3,
   1295 		},
   1296 		{
   1297 			20,
   1298 			Low,
   1299 			dataEncoderType10To26,
   1300 			[]block{
   1301 				{
   1302 					3,
   1303 					135,
   1304 					107,
   1305 				},
   1306 				{
   1307 					5,
   1308 					136,
   1309 					108,
   1310 				},
   1311 			},
   1312 			3,
   1313 		},
   1314 		{
   1315 			20,
   1316 			Medium,
   1317 			dataEncoderType10To26,
   1318 			[]block{
   1319 				{
   1320 					3,
   1321 					67,
   1322 					41,
   1323 				},
   1324 				{
   1325 					13,
   1326 					68,
   1327 					42,
   1328 				},
   1329 			},
   1330 			3,
   1331 		},
   1332 		{
   1333 			20,
   1334 			High,
   1335 			dataEncoderType10To26,
   1336 			[]block{
   1337 				{
   1338 					15,
   1339 					54,
   1340 					24,
   1341 				},
   1342 				{
   1343 					5,
   1344 					55,
   1345 					25,
   1346 				},
   1347 			},
   1348 			3,
   1349 		},
   1350 		{
   1351 			20,
   1352 			Highest,
   1353 			dataEncoderType10To26,
   1354 			[]block{
   1355 				{
   1356 					15,
   1357 					43,
   1358 					15,
   1359 				},
   1360 				{
   1361 					10,
   1362 					44,
   1363 					16,
   1364 				},
   1365 			},
   1366 			3,
   1367 		},
   1368 		{
   1369 			21,
   1370 			Low,
   1371 			dataEncoderType10To26,
   1372 			[]block{
   1373 				{
   1374 					4,
   1375 					144,
   1376 					116,
   1377 				},
   1378 				{
   1379 					4,
   1380 					145,
   1381 					117,
   1382 				},
   1383 			},
   1384 			4,
   1385 		},
   1386 		{
   1387 			21,
   1388 			Medium,
   1389 			dataEncoderType10To26,
   1390 			[]block{
   1391 				{
   1392 					17,
   1393 					68,
   1394 					42,
   1395 				},
   1396 			},
   1397 			4,
   1398 		},
   1399 		{
   1400 			21,
   1401 			High,
   1402 			dataEncoderType10To26,
   1403 			[]block{
   1404 				{
   1405 					17,
   1406 					50,
   1407 					22,
   1408 				},
   1409 				{
   1410 					6,
   1411 					51,
   1412 					23,
   1413 				},
   1414 			},
   1415 			4,
   1416 		},
   1417 		{
   1418 			21,
   1419 			Highest,
   1420 			dataEncoderType10To26,
   1421 			[]block{
   1422 				{
   1423 					19,
   1424 					46,
   1425 					16,
   1426 				},
   1427 				{
   1428 					6,
   1429 					47,
   1430 					17,
   1431 				},
   1432 			},
   1433 			4,
   1434 		},
   1435 		{
   1436 			22,
   1437 			Low,
   1438 			dataEncoderType10To26,
   1439 			[]block{
   1440 				{
   1441 					2,
   1442 					139,
   1443 					111,
   1444 				},
   1445 				{
   1446 					7,
   1447 					140,
   1448 					112,
   1449 				},
   1450 			},
   1451 			4,
   1452 		},
   1453 		{
   1454 			22,
   1455 			Medium,
   1456 			dataEncoderType10To26,
   1457 			[]block{
   1458 				{
   1459 					17,
   1460 					74,
   1461 					46,
   1462 				},
   1463 			},
   1464 			4,
   1465 		},
   1466 		{
   1467 			22,
   1468 			High,
   1469 			dataEncoderType10To26,
   1470 			[]block{
   1471 				{
   1472 					7,
   1473 					54,
   1474 					24,
   1475 				},
   1476 				{
   1477 					16,
   1478 					55,
   1479 					25,
   1480 				},
   1481 			},
   1482 			4,
   1483 		},
   1484 		{
   1485 			22,
   1486 			Highest,
   1487 			dataEncoderType10To26,
   1488 			[]block{
   1489 				{
   1490 					34,
   1491 					37,
   1492 					13,
   1493 				},
   1494 			},
   1495 			4,
   1496 		},
   1497 		{
   1498 			23,
   1499 			Low,
   1500 			dataEncoderType10To26,
   1501 			[]block{
   1502 				{
   1503 					4,
   1504 					151,
   1505 					121,
   1506 				},
   1507 				{
   1508 					5,
   1509 					152,
   1510 					122,
   1511 				},
   1512 			},
   1513 			4,
   1514 		},
   1515 		{
   1516 			23,
   1517 			Medium,
   1518 			dataEncoderType10To26,
   1519 			[]block{
   1520 				{
   1521 					4,
   1522 					75,
   1523 					47,
   1524 				},
   1525 				{
   1526 					14,
   1527 					76,
   1528 					48,
   1529 				},
   1530 			},
   1531 			4,
   1532 		},
   1533 		{
   1534 			23,
   1535 			High,
   1536 			dataEncoderType10To26,
   1537 			[]block{
   1538 				{
   1539 					11,
   1540 					54,
   1541 					24,
   1542 				},
   1543 				{
   1544 					14,
   1545 					55,
   1546 					25,
   1547 				},
   1548 			},
   1549 			4,
   1550 		},
   1551 		{
   1552 			23,
   1553 			Highest,
   1554 			dataEncoderType10To26,
   1555 			[]block{
   1556 				{
   1557 					16,
   1558 					45,
   1559 					15,
   1560 				},
   1561 				{
   1562 					14,
   1563 					46,
   1564 					16,
   1565 				},
   1566 			},
   1567 			4,
   1568 		},
   1569 		{
   1570 			24,
   1571 			Low,
   1572 			dataEncoderType10To26,
   1573 			[]block{
   1574 				{
   1575 					6,
   1576 					147,
   1577 					117,
   1578 				},
   1579 				{
   1580 					4,
   1581 					148,
   1582 					118,
   1583 				},
   1584 			},
   1585 			4,
   1586 		},
   1587 		{
   1588 			24,
   1589 			Medium,
   1590 			dataEncoderType10To26,
   1591 			[]block{
   1592 				{
   1593 					6,
   1594 					73,
   1595 					45,
   1596 				},
   1597 				{
   1598 					14,
   1599 					74,
   1600 					46,
   1601 				},
   1602 			},
   1603 			4,
   1604 		},
   1605 		{
   1606 			24,
   1607 			High,
   1608 			dataEncoderType10To26,
   1609 			[]block{
   1610 				{
   1611 					11,
   1612 					54,
   1613 					24,
   1614 				},
   1615 				{
   1616 					16,
   1617 					55,
   1618 					25,
   1619 				},
   1620 			},
   1621 			4,
   1622 		},
   1623 		{
   1624 			24,
   1625 			Highest,
   1626 			dataEncoderType10To26,
   1627 			[]block{
   1628 				{
   1629 					30,
   1630 					46,
   1631 					16,
   1632 				},
   1633 				{
   1634 					2,
   1635 					47,
   1636 					17,
   1637 				},
   1638 			},
   1639 			4,
   1640 		},
   1641 		{
   1642 			25,
   1643 			Low,
   1644 			dataEncoderType10To26,
   1645 			[]block{
   1646 				{
   1647 					8,
   1648 					132,
   1649 					106,
   1650 				},
   1651 				{
   1652 					4,
   1653 					133,
   1654 					107,
   1655 				},
   1656 			},
   1657 			4,
   1658 		},
   1659 		{
   1660 			25,
   1661 			Medium,
   1662 			dataEncoderType10To26,
   1663 			[]block{
   1664 				{
   1665 					8,
   1666 					75,
   1667 					47,
   1668 				},
   1669 				{
   1670 					13,
   1671 					76,
   1672 					48,
   1673 				},
   1674 			},
   1675 			4,
   1676 		},
   1677 		{
   1678 			25,
   1679 			High,
   1680 			dataEncoderType10To26,
   1681 			[]block{
   1682 				{
   1683 					7,
   1684 					54,
   1685 					24,
   1686 				},
   1687 				{
   1688 					22,
   1689 					55,
   1690 					25,
   1691 				},
   1692 			},
   1693 			4,
   1694 		},
   1695 		{
   1696 			25,
   1697 			Highest,
   1698 			dataEncoderType10To26,
   1699 			[]block{
   1700 				{
   1701 					22,
   1702 					45,
   1703 					15,
   1704 				},
   1705 				{
   1706 					13,
   1707 					46,
   1708 					16,
   1709 				},
   1710 			},
   1711 			4,
   1712 		},
   1713 		{
   1714 			26,
   1715 			Low,
   1716 			dataEncoderType10To26,
   1717 			[]block{
   1718 				{
   1719 					10,
   1720 					142,
   1721 					114,
   1722 				},
   1723 				{
   1724 					2,
   1725 					143,
   1726 					115,
   1727 				},
   1728 			},
   1729 			4,
   1730 		},
   1731 		{
   1732 			26,
   1733 			Medium,
   1734 			dataEncoderType10To26,
   1735 			[]block{
   1736 				{
   1737 					19,
   1738 					74,
   1739 					46,
   1740 				},
   1741 				{
   1742 					4,
   1743 					75,
   1744 					47,
   1745 				},
   1746 			},
   1747 			4,
   1748 		},
   1749 		{
   1750 			26,
   1751 			High,
   1752 			dataEncoderType10To26,
   1753 			[]block{
   1754 				{
   1755 					28,
   1756 					50,
   1757 					22,
   1758 				},
   1759 				{
   1760 					6,
   1761 					51,
   1762 					23,
   1763 				},
   1764 			},
   1765 			4,
   1766 		},
   1767 		{
   1768 			26,
   1769 			Highest,
   1770 			dataEncoderType10To26,
   1771 			[]block{
   1772 				{
   1773 					33,
   1774 					46,
   1775 					16,
   1776 				},
   1777 				{
   1778 					4,
   1779 					47,
   1780 					17,
   1781 				},
   1782 			},
   1783 			4,
   1784 		},
   1785 		{
   1786 			27,
   1787 			Low,
   1788 			dataEncoderType27To40,
   1789 			[]block{
   1790 				{
   1791 					8,
   1792 					152,
   1793 					122,
   1794 				},
   1795 				{
   1796 					4,
   1797 					153,
   1798 					123,
   1799 				},
   1800 			},
   1801 			4,
   1802 		},
   1803 		{
   1804 			27,
   1805 			Medium,
   1806 			dataEncoderType27To40,
   1807 			[]block{
   1808 				{
   1809 					22,
   1810 					73,
   1811 					45,
   1812 				},
   1813 				{
   1814 					3,
   1815 					74,
   1816 					46,
   1817 				},
   1818 			},
   1819 			4,
   1820 		},
   1821 		{
   1822 			27,
   1823 			High,
   1824 			dataEncoderType27To40,
   1825 			[]block{
   1826 				{
   1827 					8,
   1828 					53,
   1829 					23,
   1830 				},
   1831 				{
   1832 					26,
   1833 					54,
   1834 					24,
   1835 				},
   1836 			},
   1837 			4,
   1838 		},
   1839 		{
   1840 			27,
   1841 			Highest,
   1842 			dataEncoderType27To40,
   1843 			[]block{
   1844 				{
   1845 					12,
   1846 					45,
   1847 					15,
   1848 				},
   1849 				{
   1850 					28,
   1851 					46,
   1852 					16,
   1853 				},
   1854 			},
   1855 			4,
   1856 		},
   1857 		{
   1858 			28,
   1859 			Low,
   1860 			dataEncoderType27To40,
   1861 			[]block{
   1862 				{
   1863 					3,
   1864 					147,
   1865 					117,
   1866 				},
   1867 				{
   1868 					10,
   1869 					148,
   1870 					118,
   1871 				},
   1872 			},
   1873 			3,
   1874 		},
   1875 		{
   1876 			28,
   1877 			Medium,
   1878 			dataEncoderType27To40,
   1879 			[]block{
   1880 				{
   1881 					3,
   1882 					73,
   1883 					45,
   1884 				},
   1885 				{
   1886 					23,
   1887 					74,
   1888 					46,
   1889 				},
   1890 			},
   1891 			3,
   1892 		},
   1893 		{
   1894 			28,
   1895 			High,
   1896 			dataEncoderType27To40,
   1897 			[]block{
   1898 				{
   1899 					4,
   1900 					54,
   1901 					24,
   1902 				},
   1903 				{
   1904 					31,
   1905 					55,
   1906 					25,
   1907 				},
   1908 			},
   1909 			3,
   1910 		},
   1911 		{
   1912 			28,
   1913 			Highest,
   1914 			dataEncoderType27To40,
   1915 			[]block{
   1916 				{
   1917 					11,
   1918 					45,
   1919 					15,
   1920 				},
   1921 				{
   1922 					31,
   1923 					46,
   1924 					16,
   1925 				},
   1926 			},
   1927 			3,
   1928 		},
   1929 		{
   1930 			29,
   1931 			Low,
   1932 			dataEncoderType27To40,
   1933 			[]block{
   1934 				{
   1935 					7,
   1936 					146,
   1937 					116,
   1938 				},
   1939 				{
   1940 					7,
   1941 					147,
   1942 					117,
   1943 				},
   1944 			},
   1945 			3,
   1946 		},
   1947 		{
   1948 			29,
   1949 			Medium,
   1950 			dataEncoderType27To40,
   1951 			[]block{
   1952 				{
   1953 					21,
   1954 					73,
   1955 					45,
   1956 				},
   1957 				{
   1958 					7,
   1959 					74,
   1960 					46,
   1961 				},
   1962 			},
   1963 			3,
   1964 		},
   1965 		{
   1966 			29,
   1967 			High,
   1968 			dataEncoderType27To40,
   1969 			[]block{
   1970 				{
   1971 					1,
   1972 					53,
   1973 					23,
   1974 				},
   1975 				{
   1976 					37,
   1977 					54,
   1978 					24,
   1979 				},
   1980 			},
   1981 			3,
   1982 		},
   1983 		{
   1984 			29,
   1985 			Highest,
   1986 			dataEncoderType27To40,
   1987 			[]block{
   1988 				{
   1989 					19,
   1990 					45,
   1991 					15,
   1992 				},
   1993 				{
   1994 					26,
   1995 					46,
   1996 					16,
   1997 				},
   1998 			},
   1999 			3,
   2000 		},
   2001 		{
   2002 			30,
   2003 			Low,
   2004 			dataEncoderType27To40,
   2005 			[]block{
   2006 				{
   2007 					5,
   2008 					145,
   2009 					115,
   2010 				},
   2011 				{
   2012 					10,
   2013 					146,
   2014 					116,
   2015 				},
   2016 			},
   2017 			3,
   2018 		},
   2019 		{
   2020 			30,
   2021 			Medium,
   2022 			dataEncoderType27To40,
   2023 			[]block{
   2024 				{
   2025 					19,
   2026 					75,
   2027 					47,
   2028 				},
   2029 				{
   2030 					10,
   2031 					76,
   2032 					48,
   2033 				},
   2034 			},
   2035 			3,
   2036 		},
   2037 		{
   2038 			30,
   2039 			High,
   2040 			dataEncoderType27To40,
   2041 			[]block{
   2042 				{
   2043 					15,
   2044 					54,
   2045 					24,
   2046 				},
   2047 				{
   2048 					25,
   2049 					55,
   2050 					25,
   2051 				},
   2052 			},
   2053 			3,
   2054 		},
   2055 		{
   2056 			30,
   2057 			Highest,
   2058 			dataEncoderType27To40,
   2059 			[]block{
   2060 				{
   2061 					23,
   2062 					45,
   2063 					15,
   2064 				},
   2065 				{
   2066 					25,
   2067 					46,
   2068 					16,
   2069 				},
   2070 			},
   2071 			3,
   2072 		},
   2073 		{
   2074 			31,
   2075 			Low,
   2076 			dataEncoderType27To40,
   2077 			[]block{
   2078 				{
   2079 					13,
   2080 					145,
   2081 					115,
   2082 				},
   2083 				{
   2084 					3,
   2085 					146,
   2086 					116,
   2087 				},
   2088 			},
   2089 			3,
   2090 		},
   2091 		{
   2092 			31,
   2093 			Medium,
   2094 			dataEncoderType27To40,
   2095 			[]block{
   2096 				{
   2097 					2,
   2098 					74,
   2099 					46,
   2100 				},
   2101 				{
   2102 					29,
   2103 					75,
   2104 					47,
   2105 				},
   2106 			},
   2107 			3,
   2108 		},
   2109 		{
   2110 			31,
   2111 			High,
   2112 			dataEncoderType27To40,
   2113 			[]block{
   2114 				{
   2115 					42,
   2116 					54,
   2117 					24,
   2118 				},
   2119 				{
   2120 					1,
   2121 					55,
   2122 					25,
   2123 				},
   2124 			},
   2125 			3,
   2126 		},
   2127 		{
   2128 			31,
   2129 			Highest,
   2130 			dataEncoderType27To40,
   2131 			[]block{
   2132 				{
   2133 					23,
   2134 					45,
   2135 					15,
   2136 				},
   2137 				{
   2138 					28,
   2139 					46,
   2140 					16,
   2141 				},
   2142 			},
   2143 			3,
   2144 		},
   2145 		{
   2146 			32,
   2147 			Low,
   2148 			dataEncoderType27To40,
   2149 			[]block{
   2150 				{
   2151 					17,
   2152 					145,
   2153 					115,
   2154 				},
   2155 			},
   2156 			3,
   2157 		},
   2158 		{
   2159 			32,
   2160 			Medium,
   2161 			dataEncoderType27To40,
   2162 			[]block{
   2163 				{
   2164 					10,
   2165 					74,
   2166 					46,
   2167 				},
   2168 				{
   2169 					23,
   2170 					75,
   2171 					47,
   2172 				},
   2173 			},
   2174 			3,
   2175 		},
   2176 		{
   2177 			32,
   2178 			High,
   2179 			dataEncoderType27To40,
   2180 			[]block{
   2181 				{
   2182 					10,
   2183 					54,
   2184 					24,
   2185 				},
   2186 				{
   2187 					35,
   2188 					55,
   2189 					25,
   2190 				},
   2191 			},
   2192 			3,
   2193 		},
   2194 		{
   2195 			32,
   2196 			Highest,
   2197 			dataEncoderType27To40,
   2198 			[]block{
   2199 				{
   2200 					19,
   2201 					45,
   2202 					15,
   2203 				},
   2204 				{
   2205 					35,
   2206 					46,
   2207 					16,
   2208 				},
   2209 			},
   2210 			3,
   2211 		},
   2212 		{
   2213 			33,
   2214 			Low,
   2215 			dataEncoderType27To40,
   2216 			[]block{
   2217 				{
   2218 					17,
   2219 					145,
   2220 					115,
   2221 				},
   2222 				{
   2223 					1,
   2224 					146,
   2225 					116,
   2226 				},
   2227 			},
   2228 			3,
   2229 		},
   2230 		{
   2231 			33,
   2232 			Medium,
   2233 			dataEncoderType27To40,
   2234 			[]block{
   2235 				{
   2236 					14,
   2237 					74,
   2238 					46,
   2239 				},
   2240 				{
   2241 					21,
   2242 					75,
   2243 					47,
   2244 				},
   2245 			},
   2246 			3,
   2247 		},
   2248 		{
   2249 			33,
   2250 			High,
   2251 			dataEncoderType27To40,
   2252 			[]block{
   2253 				{
   2254 					29,
   2255 					54,
   2256 					24,
   2257 				},
   2258 				{
   2259 					19,
   2260 					55,
   2261 					25,
   2262 				},
   2263 			},
   2264 			3,
   2265 		},
   2266 		{
   2267 			33,
   2268 			Highest,
   2269 			dataEncoderType27To40,
   2270 			[]block{
   2271 				{
   2272 					11,
   2273 					45,
   2274 					15,
   2275 				},
   2276 				{
   2277 					46,
   2278 					46,
   2279 					16,
   2280 				},
   2281 			},
   2282 			3,
   2283 		},
   2284 		{
   2285 			34,
   2286 			Low,
   2287 			dataEncoderType27To40,
   2288 			[]block{
   2289 				{
   2290 					13,
   2291 					145,
   2292 					115,
   2293 				},
   2294 				{
   2295 					6,
   2296 					146,
   2297 					116,
   2298 				},
   2299 			},
   2300 			3,
   2301 		},
   2302 		{
   2303 			34,
   2304 			Medium,
   2305 			dataEncoderType27To40,
   2306 			[]block{
   2307 				{
   2308 					14,
   2309 					74,
   2310 					46,
   2311 				},
   2312 				{
   2313 					23,
   2314 					75,
   2315 					47,
   2316 				},
   2317 			},
   2318 			3,
   2319 		},
   2320 		{
   2321 			34,
   2322 			High,
   2323 			dataEncoderType27To40,
   2324 			[]block{
   2325 				{
   2326 					44,
   2327 					54,
   2328 					24,
   2329 				},
   2330 				{
   2331 					7,
   2332 					55,
   2333 					25,
   2334 				},
   2335 			},
   2336 			3,
   2337 		},
   2338 		{
   2339 			34,
   2340 			Highest,
   2341 			dataEncoderType27To40,
   2342 			[]block{
   2343 				{
   2344 					59,
   2345 					46,
   2346 					16,
   2347 				},
   2348 				{
   2349 					1,
   2350 					47,
   2351 					17,
   2352 				},
   2353 			},
   2354 			3,
   2355 		},
   2356 		{
   2357 			35,
   2358 			Low,
   2359 			dataEncoderType27To40,
   2360 			[]block{
   2361 				{
   2362 					12,
   2363 					151,
   2364 					121,
   2365 				},
   2366 				{
   2367 					7,
   2368 					152,
   2369 					122,
   2370 				},
   2371 			},
   2372 			0,
   2373 		},
   2374 		{
   2375 			35,
   2376 			Medium,
   2377 			dataEncoderType27To40,
   2378 			[]block{
   2379 				{
   2380 					12,
   2381 					75,
   2382 					47,
   2383 				},
   2384 				{
   2385 					26,
   2386 					76,
   2387 					48,
   2388 				},
   2389 			},
   2390 			0,
   2391 		},
   2392 		{
   2393 			35,
   2394 			High,
   2395 			dataEncoderType27To40,
   2396 			[]block{
   2397 				{
   2398 					39,
   2399 					54,
   2400 					24,
   2401 				},
   2402 				{
   2403 					14,
   2404 					55,
   2405 					25,
   2406 				},
   2407 			},
   2408 			0,
   2409 		},
   2410 		{
   2411 			35,
   2412 			Highest,
   2413 			dataEncoderType27To40,
   2414 			[]block{
   2415 				{
   2416 					22,
   2417 					45,
   2418 					15,
   2419 				},
   2420 				{
   2421 					41,
   2422 					46,
   2423 					16,
   2424 				},
   2425 			},
   2426 			0,
   2427 		},
   2428 		{
   2429 			36,
   2430 			Low,
   2431 			dataEncoderType27To40,
   2432 			[]block{
   2433 				{
   2434 					6,
   2435 					151,
   2436 					121,
   2437 				},
   2438 				{
   2439 					14,
   2440 					152,
   2441 					122,
   2442 				},
   2443 			},
   2444 			0,
   2445 		},
   2446 		{
   2447 			36,
   2448 			Medium,
   2449 			dataEncoderType27To40,
   2450 			[]block{
   2451 				{
   2452 					6,
   2453 					75,
   2454 					47,
   2455 				},
   2456 				{
   2457 					34,
   2458 					76,
   2459 					48,
   2460 				},
   2461 			},
   2462 			0,
   2463 		},
   2464 		{
   2465 			36,
   2466 			High,
   2467 			dataEncoderType27To40,
   2468 			[]block{
   2469 				{
   2470 					46,
   2471 					54,
   2472 					24,
   2473 				},
   2474 				{
   2475 					10,
   2476 					55,
   2477 					25,
   2478 				},
   2479 			},
   2480 			0,
   2481 		},
   2482 		{
   2483 			36,
   2484 			Highest,
   2485 			dataEncoderType27To40,
   2486 			[]block{
   2487 				{
   2488 					2,
   2489 					45,
   2490 					15,
   2491 				},
   2492 				{
   2493 					64,
   2494 					46,
   2495 					16,
   2496 				},
   2497 			},
   2498 			0,
   2499 		},
   2500 		{
   2501 			37,
   2502 			Low,
   2503 			dataEncoderType27To40,
   2504 			[]block{
   2505 				{
   2506 					17,
   2507 					152,
   2508 					122,
   2509 				},
   2510 				{
   2511 					4,
   2512 					153,
   2513 					123,
   2514 				},
   2515 			},
   2516 			0,
   2517 		},
   2518 		{
   2519 			37,
   2520 			Medium,
   2521 			dataEncoderType27To40,
   2522 			[]block{
   2523 				{
   2524 					29,
   2525 					74,
   2526 					46,
   2527 				},
   2528 				{
   2529 					14,
   2530 					75,
   2531 					47,
   2532 				},
   2533 			},
   2534 			0,
   2535 		},
   2536 		{
   2537 			37,
   2538 			High,
   2539 			dataEncoderType27To40,
   2540 			[]block{
   2541 				{
   2542 					49,
   2543 					54,
   2544 					24,
   2545 				},
   2546 				{
   2547 					10,
   2548 					55,
   2549 					25,
   2550 				},
   2551 			},
   2552 			0,
   2553 		},
   2554 		{
   2555 			37,
   2556 			Highest,
   2557 			dataEncoderType27To40,
   2558 			[]block{
   2559 				{
   2560 					24,
   2561 					45,
   2562 					15,
   2563 				},
   2564 				{
   2565 					46,
   2566 					46,
   2567 					16,
   2568 				},
   2569 			},
   2570 			0,
   2571 		},
   2572 		{
   2573 			38,
   2574 			Low,
   2575 			dataEncoderType27To40,
   2576 			[]block{
   2577 				{
   2578 					4,
   2579 					152,
   2580 					122,
   2581 				},
   2582 				{
   2583 					18,
   2584 					153,
   2585 					123,
   2586 				},
   2587 			},
   2588 			0,
   2589 		},
   2590 		{
   2591 			38,
   2592 			Medium,
   2593 			dataEncoderType27To40,
   2594 			[]block{
   2595 				{
   2596 					13,
   2597 					74,
   2598 					46,
   2599 				},
   2600 				{
   2601 					32,
   2602 					75,
   2603 					47,
   2604 				},
   2605 			},
   2606 			0,
   2607 		},
   2608 		{
   2609 			38,
   2610 			High,
   2611 			dataEncoderType27To40,
   2612 			[]block{
   2613 				{
   2614 					48,
   2615 					54,
   2616 					24,
   2617 				},
   2618 				{
   2619 					14,
   2620 					55,
   2621 					25,
   2622 				},
   2623 			},
   2624 			0,
   2625 		},
   2626 		{
   2627 			38,
   2628 			Highest,
   2629 			dataEncoderType27To40,
   2630 			[]block{
   2631 				{
   2632 					42,
   2633 					45,
   2634 					15,
   2635 				},
   2636 				{
   2637 					32,
   2638 					46,
   2639 					16,
   2640 				},
   2641 			},
   2642 			0,
   2643 		},
   2644 		{
   2645 			39,
   2646 			Low,
   2647 			dataEncoderType27To40,
   2648 			[]block{
   2649 				{
   2650 					20,
   2651 					147,
   2652 					117,
   2653 				},
   2654 				{
   2655 					4,
   2656 					148,
   2657 					118,
   2658 				},
   2659 			},
   2660 			0,
   2661 		},
   2662 		{
   2663 			39,
   2664 			Medium,
   2665 			dataEncoderType27To40,
   2666 			[]block{
   2667 				{
   2668 					40,
   2669 					75,
   2670 					47,
   2671 				},
   2672 				{
   2673 					7,
   2674 					76,
   2675 					48,
   2676 				},
   2677 			},
   2678 			0,
   2679 		},
   2680 		{
   2681 			39,
   2682 			High,
   2683 			dataEncoderType27To40,
   2684 			[]block{
   2685 				{
   2686 					43,
   2687 					54,
   2688 					24,
   2689 				},
   2690 				{
   2691 					22,
   2692 					55,
   2693 					25,
   2694 				},
   2695 			},
   2696 			0,
   2697 		},
   2698 		{
   2699 			39,
   2700 			Highest,
   2701 			dataEncoderType27To40,
   2702 			[]block{
   2703 				{
   2704 					10,
   2705 					45,
   2706 					15,
   2707 				},
   2708 				{
   2709 					67,
   2710 					46,
   2711 					16,
   2712 				},
   2713 			},
   2714 			0,
   2715 		},
   2716 		{
   2717 			40,
   2718 			Low,
   2719 			dataEncoderType27To40,
   2720 			[]block{
   2721 				{
   2722 					19,
   2723 					148,
   2724 					118,
   2725 				},
   2726 				{
   2727 					6,
   2728 					149,
   2729 					119,
   2730 				},
   2731 			},
   2732 			0,
   2733 		},
   2734 		{
   2735 			40,
   2736 			Medium,
   2737 			dataEncoderType27To40,
   2738 			[]block{
   2739 				{
   2740 					18,
   2741 					75,
   2742 					47,
   2743 				},
   2744 				{
   2745 					31,
   2746 					76,
   2747 					48,
   2748 				},
   2749 			},
   2750 			0,
   2751 		},
   2752 		{
   2753 			40,
   2754 			High,
   2755 			dataEncoderType27To40,
   2756 			[]block{
   2757 				{
   2758 					34,
   2759 					54,
   2760 					24,
   2761 				},
   2762 				{
   2763 					34,
   2764 					55,
   2765 					25,
   2766 				},
   2767 			},
   2768 			0,
   2769 		},
   2770 		{
   2771 			40,
   2772 			Highest,
   2773 			dataEncoderType27To40,
   2774 			[]block{
   2775 				{
   2776 					20,
   2777 					45,
   2778 					15,
   2779 				},
   2780 				{
   2781 					61,
   2782 					46,
   2783 					16,
   2784 				},
   2785 			},
   2786 			0,
   2787 		},
   2788 	}
   2789 )
   2790 
   2791 var (
   2792 	// Each QR Code contains a 15-bit Format Information value.  The 15 bits
   2793 	// consist of 5 data bits concatenated with 10 error correction bits.
   2794 	//
   2795 	// The 5 data bits consist of:
   2796 	// - 2 bits for the error correction level (L=01, M=00, G=11, H=10).
   2797 	// - 3 bits for the data mask pattern identifier.
   2798 	//
   2799 	// formatBitSequence is a mapping from the 5 data bits to the completed 15-bit
   2800 	// Format Information value.
   2801 	//
   2802 	// For example, a QR Code using error correction level L, and data mask
   2803 	// pattern identifier 001:
   2804 	//
   2805 	// 01 | 001 = 01001 = 0x9
   2806 	// formatBitSequence[0x9].qrCode = 0x72f3 = 111001011110011
   2807 	formatBitSequence = []struct {
   2808 		regular uint32
   2809 		micro   uint32
   2810 	}{
   2811 		{0x5412, 0x4445},
   2812 		{0x5125, 0x4172},
   2813 		{0x5e7c, 0x4e2b},
   2814 		{0x5b4b, 0x4b1c},
   2815 		{0x45f9, 0x55ae},
   2816 		{0x40ce, 0x5099},
   2817 		{0x4f97, 0x5fc0},
   2818 		{0x4aa0, 0x5af7},
   2819 		{0x77c4, 0x6793},
   2820 		{0x72f3, 0x62a4},
   2821 		{0x7daa, 0x6dfd},
   2822 		{0x789d, 0x68ca},
   2823 		{0x662f, 0x7678},
   2824 		{0x6318, 0x734f},
   2825 		{0x6c41, 0x7c16},
   2826 		{0x6976, 0x7921},
   2827 		{0x1689, 0x06de},
   2828 		{0x13be, 0x03e9},
   2829 		{0x1ce7, 0x0cb0},
   2830 		{0x19d0, 0x0987},
   2831 		{0x0762, 0x1735},
   2832 		{0x0255, 0x1202},
   2833 		{0x0d0c, 0x1d5b},
   2834 		{0x083b, 0x186c},
   2835 		{0x355f, 0x2508},
   2836 		{0x3068, 0x203f},
   2837 		{0x3f31, 0x2f66},
   2838 		{0x3a06, 0x2a51},
   2839 		{0x24b4, 0x34e3},
   2840 		{0x2183, 0x31d4},
   2841 		{0x2eda, 0x3e8d},
   2842 		{0x2bed, 0x3bba},
   2843 	}
   2844 
   2845 	// QR Codes version 7 and higher contain an 18-bit Version Information value,
   2846 	// consisting of a 6 data bits and 12 error correction bits.
   2847 	//
   2848 	// versionBitSequence is a mapping from QR Code version to the completed
   2849 	// 18-bit Version Information value.
   2850 	//
   2851 	// For example, a QR code of version 7:
   2852 	// versionBitSequence[0x7] = 0x07c94 = 000111110010010100
   2853 	versionBitSequence = []uint32{
   2854 		0x00000,
   2855 		0x00000,
   2856 		0x00000,
   2857 		0x00000,
   2858 		0x00000,
   2859 		0x00000,
   2860 		0x00000,
   2861 		0x07c94,
   2862 		0x085bc,
   2863 		0x09a99,
   2864 		0x0a4d3,
   2865 		0x0bbf6,
   2866 		0x0c762,
   2867 		0x0d847,
   2868 		0x0e60d,
   2869 		0x0f928,
   2870 		0x10b78,
   2871 		0x1145d,
   2872 		0x12a17,
   2873 		0x13532,
   2874 		0x149a6,
   2875 		0x15683,
   2876 		0x168c9,
   2877 		0x177ec,
   2878 		0x18ec4,
   2879 		0x191e1,
   2880 		0x1afab,
   2881 		0x1b08e,
   2882 		0x1cc1a,
   2883 		0x1d33f,
   2884 		0x1ed75,
   2885 		0x1f250,
   2886 		0x209d5,
   2887 		0x216f0,
   2888 		0x228ba,
   2889 		0x2379f,
   2890 		0x24b0b,
   2891 		0x2542e,
   2892 		0x26a64,
   2893 		0x27541,
   2894 		0x28c69,
   2895 	}
   2896 )
   2897 
   2898 const (
   2899 	formatInfoLengthBits  = 15
   2900 	versionInfoLengthBits = 18
   2901 )
   2902 
   2903 // formatInfo returns the 15-bit Format Information value for a QR
   2904 // code.
   2905 func (v qrCodeVersion) formatInfo(maskPattern int) *bitset.Bitset {
   2906 	formatID := 0
   2907 
   2908 	switch v.level {
   2909 	case Low:
   2910 		formatID = 0x08 // 0b01000
   2911 	case Medium:
   2912 		formatID = 0x00 // 0b00000
   2913 	case High:
   2914 		formatID = 0x18 // 0b11000
   2915 	case Highest:
   2916 		formatID = 0x10 // 0b10000
   2917 	default:
   2918 		log.Panicf("Invalid level %d", v.level)
   2919 	}
   2920 
   2921 	if maskPattern < 0 || maskPattern > 7 {
   2922 		log.Panicf("Invalid maskPattern %d", maskPattern)
   2923 	}
   2924 
   2925 	formatID |= maskPattern & 0x7
   2926 
   2927 	result := bitset.New()
   2928 
   2929 	result.AppendUint32(formatBitSequence[formatID].regular, formatInfoLengthBits)
   2930 
   2931 	return result
   2932 }
   2933 
   2934 // versionInfo returns the 18-bit Version Information value for a QR Code.
   2935 //
   2936 // Version Information is applicable only to QR Codes versions 7-40 inclusive.
   2937 // nil is returned if Version Information is not required.
   2938 func (v qrCodeVersion) versionInfo() *bitset.Bitset {
   2939 	if v.version < 7 {
   2940 		return nil
   2941 	}
   2942 
   2943 	result := bitset.New()
   2944 	result.AppendUint32(versionBitSequence[v.version], 18)
   2945 
   2946 	return result
   2947 }
   2948 
   2949 // numDataBits returns the data capacity in bits.
   2950 func (v qrCodeVersion) numDataBits() int {
   2951 	numDataBits := 0
   2952 	for _, b := range v.block {
   2953 		numDataBits += 8 * b.numBlocks * b.numDataCodewords // 8 bits in a byte
   2954 	}
   2955 
   2956 	return numDataBits
   2957 }
   2958 
   2959 // chooseQRCodeVersion chooses the most suitable QR Code version for a stated
   2960 // data length in bits, the error recovery level required, and the data encoder
   2961 // used.
   2962 //
   2963 // The chosen QR Code version is the smallest version able to fit numDataBits
   2964 // and the optional terminator bits required by the specified encoder.
   2965 //
   2966 // On success the chosen QR Code version is returned.
   2967 func chooseQRCodeVersion(level RecoveryLevel, encoder *dataEncoder, numDataBits int) *qrCodeVersion {
   2968 	var chosenVersion *qrCodeVersion
   2969 
   2970 	for _, v := range versions {
   2971 		if v.level != level {
   2972 			continue
   2973 		} else if v.version < encoder.minVersion {
   2974 			continue
   2975 		} else if v.version > encoder.maxVersion {
   2976 			break
   2977 		}
   2978 
   2979 		numFreeBits := v.numDataBits() - numDataBits
   2980 
   2981 		if numFreeBits >= 0 {
   2982 			chosenVersion = &v
   2983 			break
   2984 		}
   2985 	}
   2986 
   2987 	return chosenVersion
   2988 }
   2989 
   2990 func (v qrCodeVersion) numTerminatorBitsRequired(numDataBits int) int {
   2991 	numFreeBits := v.numDataBits() - numDataBits
   2992 
   2993 	var numTerminatorBits int
   2994 
   2995 	switch {
   2996 	case numFreeBits >= 4:
   2997 		numTerminatorBits = 4
   2998 	default:
   2999 		numTerminatorBits = numFreeBits
   3000 	}
   3001 
   3002 	return numTerminatorBits
   3003 }
   3004 
   3005 // numBlocks returns the number of blocks.
   3006 func (v qrCodeVersion) numBlocks() int {
   3007 	numBlocks := 0
   3008 
   3009 	for _, b := range v.block {
   3010 		numBlocks += b.numBlocks
   3011 	}
   3012 
   3013 	return numBlocks
   3014 }
   3015 
   3016 // numBitsToPadToCodeword returns the number of bits required to pad data of
   3017 // length numDataBits upto the nearest codeword size.
   3018 func (v qrCodeVersion) numBitsToPadToCodeword(numDataBits int) int {
   3019 	if numDataBits == v.numDataBits() {
   3020 		return 0
   3021 	}
   3022 
   3023 	return (8 - numDataBits%8) % 8
   3024 }
   3025 
   3026 // symbolSize returns the size of the QR Code symbol in number of modules (which
   3027 // is both the width and height, since QR codes are square). The QR Code has
   3028 // size symbolSize() x symbolSize() pixels. This does not include the quiet
   3029 // zone.
   3030 func (v qrCodeVersion) symbolSize() int {
   3031 	return 21 + (v.version-1)*4
   3032 }
   3033 
   3034 // quietZoneSize returns the number of pixels of border space on each side of
   3035 // the QR Code. The quiet space assists with decoding.
   3036 func (v qrCodeVersion) quietZoneSize() int {
   3037 	return 4
   3038 }
   3039 
   3040 // getQRCodeVersion returns the QR Code version by version number and recovery
   3041 // level. Returns nil if the requested combination is not defined.
   3042 func getQRCodeVersion(level RecoveryLevel, version int) *qrCodeVersion {
   3043 	for _, v := range versions {
   3044 		if v.level == level && v.version == version {
   3045 			return &v
   3046 		}
   3047 	}
   3048 
   3049 	return nil
   3050 }