]> git.sesse.net Git - ffmpeg/blob - libavcodec/ra144.c
Merge commit '50079a6aa93291e6dc9d9fb8d33da83f79e9311d'
[ffmpeg] / libavcodec / ra144.c
1 /*
2  * Real Audio 1.0 (14.4K)
3  * Copyright (c) 2003 the ffmpeg project
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #include <stdint.h>
23 #include "avcodec.h"
24 #include "celp_filters.h"
25 #include "mathops.h"
26 #include "ra144.h"
27
28 const int16_t ff_gain_val_tab[256][3] = {
29     { 541, 956,  768}, { 877, 581,  568}, { 675,1574,  635}, {1248,1464,  668},
30     {1246, 839, 1394}, {2560,1386,  991}, { 925, 687,  608}, {2208, 797, 1144},
31     { 535, 832,  799}, { 762, 605, 1154}, { 832,1122, 1003}, {1180, 687, 1176},
32     {1292, 901,  732}, {1656, 689,  896}, {1750,1248,  848}, {2284, 942, 1022},
33     { 824,1472,  643}, { 517, 765,  512}, { 562,1816, 1522}, { 694,1826, 2700},
34     { 704, 524,  672}, {1442, 757, 2232}, { 884, 551, 1266}, {2232,1007, 1692},
35     { 932, 746,  777}, {1132, 822,  926}, {1226, 771,  611}, {2948,1342, 1008},
36     {1302, 594, 1158}, {1602, 636, 1128}, {3408, 910, 1438}, {1996, 614,  575},
37     { 665, 935,  628}, { 631,1192,  829}, { 644, 926, 1052}, { 879, 988, 1226},
38     { 941,2768, 2772}, { 565,1344, 2304}, { 547, 628,  740}, { 639, 532, 1074},
39     { 955,1208,  598}, {1124,1160,  900}, {1206, 899, 1242}, { 746, 533,  624},
40     {1458,1028,  735}, {1706,1102,  692}, {1898,1018, 1004}, {2176, 988,  735},
41     {1578, 782, 1642}, { 897, 516,  754}, {2068, 702, 1656}, {2344, 818, 1526},
42     { 907, 652,  592}, {1056, 652,  642}, {2124,1416,  780}, {2664,1250,  727},
43     {1894, 727, 1108}, {2196, 657,  981}, {4840, 920, 1704}, {4992,1238,  983},
44     {2420, 909, 1094}, {2760, 935, 1032}, {2800, 612,  853}, {3068, 832,  574},
45     { 523,1796,  923}, { 722,1916, 1382}, {1226,1542,  928}, { 758, 757,  584},
46     { 512,1134,  577}, { 615,1276,  698}, { 574,2568, 2356}, { 993,2728, 3512},
47     { 539, 890,  913}, { 694, 928, 1088}, { 805, 600, 1360}, {2160, 951, 3128},
48     { 816, 950,  590}, { 955, 847,  811}, {1094, 883,  556}, {1304, 888,  604},
49     { 863,1170,  855}, {1023, 997, 1032}, { 932,1228, 1280}, { 627, 564,  573},
50     { 876, 900, 1448}, {1030, 857, 1792}, {1294, 953, 1758}, {1612, 854, 1714},
51     {1090,1166,  631}, {1314,1202,  751}, {1480, 905,  795}, {1682,1016,  568},
52     {1494,1178,  983}, { 878, 613,  526}, {1728,1446,  779}, {2136,1348,  774},
53     { 950, 649,  939}, {1180, 703,  899}, {1236, 527, 1158}, {1450, 647,  972},
54     {1282, 647,  707}, {1460, 663,  644}, {1614, 572,  578}, {3516,1222,  821},
55     {2668, 729, 1682}, {3128, 585, 1502}, {3208, 733,  976}, {6800, 871, 1416},
56     {3480, 743, 1408}, {3764, 899, 1170}, {3772, 632,  875}, {4092, 732,  638},
57     {3112, 753, 2620}, {3372, 945, 1890}, {3768, 969, 2288}, {2016, 559,  854},
58     {1736, 729,  787}, {1940, 686,  547}, {2140, 635,  674}, {4480,1272,  828},
59     {3976, 592, 1666}, {4384, 621, 1388}, {4400, 801,  955}, {4656, 522,  646},
60     {4848, 625, 1636}, {4984, 591,  874}, {5352, 535, 1001}, {11216,938, 1184},
61     { 925,3280, 1476}, { 735,1580, 1088}, {1150,1576,  674}, { 655, 783,  528},
62     { 527,2052, 1354}, { 782,1704, 1880}, { 578, 910, 1026}, { 692, 882, 1468},
63     { 586, 683,  715}, { 739, 609,  717}, { 778, 773,  697}, { 922, 785,  813},
64     { 766, 651,  984}, { 978, 596, 1030}, {1070, 757, 1080}, {1324, 687, 1178},
65     {1108,2144,  979}, { 723, 982,  690}, { 936, 956,  527}, {1180,1002,  547},
66     { 517,1306,  825}, { 832,1184,  974}, {1024, 957,  903}, {1262,1090,  906},
67     {1028, 720,  649}, {1192, 679,  694}, {2468,1480,  979}, {2844,1370,  877},
68     {1310, 835,  848}, {1508, 839,  698}, {1742,1030,  769}, {1910, 852,  573},
69     {1280, 859, 1174}, {1584, 863, 1108}, {1686, 708, 1364}, {1942, 768, 1104},
70     { 891, 536,  690}, {1016, 560,  663}, {2172, 870, 1348}, {2404, 999, 1170},
71     {1890, 966,  889}, {2116, 912,  777}, {2296,1020,  714}, {4872,1844,  932},
72     {2392, 778,  929}, {2604, 772,  744}, {2764, 957,  722}, {5832,1532,  984},
73     {2188, 519, 1264}, {2332, 532,  922}, {5064, 995, 2412}, {2708, 571,  874},
74     {2408, 545,  666}, {5016,1084,  875}, {5376, 983, 1196}, {5536, 979,  730},
75     {5344, 634, 1744}, {5688, 706, 1348}, {5912, 977, 1190}, {6072, 905,  763},
76     {6048, 582, 1526}, {11968,1013,1816}, {12864,937, 1900}, {12560,1086, 998},
77     {1998, 684, 1884}, {2504, 633, 1992}, {1252, 567,  835}, {1478, 571,  973},
78     {2620, 769, 1414}, {2808, 952, 1142}, {2908, 712, 1028}, {2976, 686,  741},
79     {1462, 552,  714}, {3296, 991, 1452}, {1590, 615,  544}, {3480,1150,  824},
80     {3212, 832,  923}, {3276, 839,  531}, {3548, 786,  852}, {3732, 764,  570},
81     {5728, 906, 2616}, {6272, 804, 2252}, {3096, 535,  876}, {3228, 598,  649},
82     {6536, 759, 1436}, {6648, 993,  846}, {6864, 567, 1210},{14016,1012, 1302},
83     {3408, 548, 1098}, {7160,1008, 1742}, {7136,1000, 1182}, {7480,1032,  836},
84     {7448, 612, 1552}, {7744, 614,  816}, {8384, 777, 1438}, {8784, 694,  786},
85     { 882,1508, 1068}, { 597, 837,  766}, {1270, 954, 1408}, { 803, 550,  798},
86     {1398,1308,  798}, {1848,1534,  738}, { 970, 675,  608}, {1264, 706,  684},
87     {1716, 767, 1126}, {2108, 765, 1404}, {2236, 924, 1003}, {2472,1048,  611},
88     { 999, 942,  963}, {1094, 857,  935}, {2936, 926, 1138}, {1934, 746,  551},
89     {3336, 633, 1762}, {3764, 701, 1454}, {1890, 564,  636}, {4096,1126,  793},
90     {3936, 556, 1140}, {3936, 540,  740}, {4216, 764,  874}, {8480,1328, 1014},
91     {2184, 515, 1042}, {4432, 934, 1344}, {4784, 945, 1112}, {5016,1062,  733},
92     {9216,1020, 2028}, {9968, 924, 1188}, {5424, 909, 1206}, {6512, 744, 1086}
93 };
94
95 const uint8_t ff_gain_exp_tab[256] = {
96    15, 15, 15, 15, 15, 16, 14, 15, 14, 14, 14, 14, 14, 14, 14, 14,
97    14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13,
98    13, 13, 13, 13, 14, 13, 12, 12, 13, 13, 13, 12, 13, 13, 13, 13,
99    13, 12, 13, 13, 12, 12, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13,
100    13, 13, 13, 12, 12, 12, 13, 13, 12, 12, 12, 13, 12, 12, 12, 12,
101    12, 12, 12, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, 12,
102    12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13,
103    13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14,
104    13, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
105    12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 11, 11, 11, 11,
106    12, 12, 12, 12, 11, 11, 12, 12, 12, 12, 12, 13, 12, 12, 12, 13,
107    12, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
108    12, 12, 11, 11, 12, 12, 12, 12, 11, 12, 11, 12, 12, 12, 12, 12,
109    13, 13, 12, 12, 13, 13, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13,
110    11, 10, 11, 10, 11, 11, 10, 10, 11, 11, 11, 11, 10,  9, 11, 10,
111    12, 12, 11, 12, 12, 12, 12, 13, 11, 12, 12, 12, 13, 13, 12, 12
112 };
113
114 const int8_t ff_cb1_vects[128][40]={
115     {
116      38,  -4,  15,  -4,  14, -13,  12, -11,  -2,  -6,
117      -6, -11, -45, -16, -11, -13,  -7,   6, -12,   4,
118     -20,   3, -16,  12,  -1,  12,  46,  24,   0,  33,
119      -3,   9, -12, -12,  -8,  -7,  17,  -6,   0,  -2,
120     }, {
121      60, -16,   3, -22,  10, -32,   0, -28, -17, -18,
122      -3, -25, -37, -23, -10,   3,   2,   3,   0,   3,
123     -14,   0, -14,  -1,   0,   2,  32,   9,  -1,  25,
124       7,  13,  -5,  13,   8,   1,   2,   8, -10,   6,
125     }, {
126      27, -12,  28,  -2,   6,  -7,  15,   9, -11,   1,
127     -13, -11, -40,   4, -29, -14, -19,  -5, -23,  -8,
128     -30, -13, -17,   0, -14,  12,  34,  20,  -2,  25,
129       2, -16,  -4, -12,  15,  16,  29,   7,  24,  10,
130     }, {
131      49, -24,  16, -20,   2, -26,   2,  -7, -25, -10,
132     -11, -25, -32,  -3, -27,   2,  -8,  -8, -11,  -9,
133     -24, -17, -16, -14, -13,   2,  20,   5,  -4,  17,
134      14, -12,   3,  13,  33,  25,  14,  23,  15,  19,
135     }, {
136      46,  -6,  21,   8,  -2, -16,  -5,  -8, -11,   4,
137       8,  15, -24,   4,  -2, -26,  -3, -16, -16, -14,
138      -9,  -2,  -1,   4,  19,   7,  36,  17,   9,  13,
139       0,  31,  -5, -12,   7,  -8,  11, -15, -13,  -4,
140     }, {
141      68, -18,   9,  -9,  -6, -35, -18, -25, -26,  -7,
142      10,   1, -16,  -3,  -1,  -9,   6, -19,  -4, -15,
143      -4,  -6,   0,  -8,  20,  -2,  23,   2,   7,   5,
144      12,  35,   1,  13,  24,   0,  -3,   0, -22,   4,
145     }, {
146      35, -14,  34,  10, -10, -10,  -1,  12, -20,  12,
147       0,  15, -18,  24, -20, -27, -14, -28, -27, -27,
148     -20, -19,  -2,  -8,   5,   7,  25,  13,   5,   5,
149       6,   5,   2, -12,  31,  15,  23,  -1,  12,   8,
150     }, {
151      57, -26,  22,  -7, -14, -28, -14,  -3, -35,   0,
152       3,   1, -11,  16, -18, -10,  -4, -31, -15, -28,
153     -14, -23,  -1, -21,   7,  -2,  11,  -1,   3,  -1,
154      18,   9,  10,  13,  49,  24,   8,  14,   2,  16,
155     }, {
156      25,  15,  22,  11,  18,   4,  15, -22,   8,  -2,
157     -17,  -9, -48, -20, -30, -17, -16,  11,  -1,  16,
158       2,  10,  -5,  26,  -2,  -4,  22,   0,   2,  10,
159      -6,  13, -14,  10, -23,   0,  10,  -2,   1,   0,
160     }, {
161      47,   3,  11,  -6,  15, -13,   2, -38,  -6, -13,
162     -15, -22, -40, -28, -28,   0,  -5,   8,  10,  15,
163       7,   7,  -4,  13,  -1, -14,   9, -14,   0,   2,
164       4,  18,  -7,  36,  -6,   8,  -3,  13,  -7,   8,
165     }, {
166      14,   7,  36,  13,  10,  10,  18,   0,   0,   5,
167     -25,  -8, -43,   0, -48, -18, -27,   0, -12,   3,
168      -7,  -6,  -7,  13, -15,  -5,  11,  -3,   0,   2,
169       0, -12,  -6,  10,   0,  23,  22,  11,  26,  12,
170     }, {
171      36,  -5,  24,  -4,   7,  -7,   6, -17, -14,  -5,
172     -22, -22, -35,  -8, -46,  -1, -17,  -3,   0,   2,
173      -2, -10,  -5,   0, -14, -15,  -2, -18,  -2,  -4,
174      11,  -7,   1,  36,  18,  32,   7,  27,  17,  20,
175     }, {
176      33,  13,  29,  24,   1,   1,  -2, -18,   0,   9,
177      -3,  17, -27,   0, -21, -30, -12, -11,  -5,  -2,
178      12,   4,   9,  19,  18,  -9,  13,  -6,  11,  -8,
179      -2,  35,  -8,  10,  -7,  -1,   4, -11, -10,  -2,
180     }, {
181      55,   1,  17,   6,  -1, -16, -15, -35, -15,  -2,
182       0,   4, -19,  -8, -20, -13,  -1, -14,   7,  -3,
183      18,   0,  10,   5,  19, -19,   0, -21,   8, -16,
184       9,  39,   0,  36,  10,   7,  -9,   4, -20,   5,
185     }, {
186      22,   5,  42,  26,  -6,   8,   1,   2,  -9,  17,
187     -10,  18, -21,  19, -39, -31, -23, -23, -16, -15,
188       2, -12,   7,   6,   5,  -9,   1, -10,   7, -16,
189       4,   9,   0,  10,  17,  22,  16,   2,  14,   9,
190     }, {
191      44,  -6,  30,   8,  -9, -10, -11, -14, -23,   5,
192      -8,   4, -14,  12, -37, -14, -12, -26,  -4, -16,
193       8, -16,   9,  -7,   6, -19, -12, -25,   5, -24,
194      15,  13,   8,  36,  34,  31,   1,  18,   4,  18,
195     }, {
196      -3,  -5,  -9,  -7,  15,  -1,   5,  13,   2,  12,
197       5,   2, -21, -23,  -2, -16,   0,   5,  -6,  13,
198     -23,   3, -32,  10, -15,   8,  44,  28,   9,  37,
199      -2,  13,  -9, -15, -12, -27,  -7, -12,   0, -11,
200     }, {
201      18, -17, -21, -25,  11, -19,  -6,  -3, -11,   0,
202       7, -11, -13, -31,  -1,   0,   9,   1,   5,  12,
203     -18,   0, -31,  -2, -13,  -1,  30,  14,   7,  29,
204       9,  18,  -1,  10,   4, -18, -22,   3, -10,  -2,
205     }, {
206     -13, -13,   3,  -5,   7,   4,   9,  34,  -5,  20,
207      -2,   3, -16,  -3, -20, -17, -11,  -7, -17,   0,
208     -34, -13, -33,  -2, -28,   8,  32,  24,   5,  29,
209       3, -12,   0, -15,  11,  -3,   3,   2,  24,   1,
210     }, {
211       8, -25,  -8, -23,   3, -13,  -3,  17, -20,   8,
212       0, -10,  -8, -11, -18,   0,  -1, -10,  -5,   0,
213     -28, -17, -32, -15, -26,  -1,  19,   9,   3,  21,
214      15,  -7,   6,   9,  29,   5, -10,  17,  15,   9,
215     }, {
216       4,  -6,  -3,   5,  -1,  -4, -11,  16,  -6,  23,
217      19,  29,   0,  -3,   6, -30,   3, -17, -10,  -5,
218     -13,  -2, -17,   3,   5,   3,  35,  21,  17,  17,
219       2,  35,  -2, -15,   3, -28, -13, -21, -13, -13,
220     }, {
221      26, -19, -15, -12,  -5, -22, -24,   0, -21,  12,
222      21,  15,   8, -11,   7, -12,  14, -20,   2,  -6,
223      -7,  -6, -16,  -9,   6,  -5,  21,   7,  15,  10,
224      13,  39,   5,  10,  20, -19, -28,  -5, -22,  -5,
225     }, {
226      -5, -15,   9,   7,  -9,   2,  -8,  37, -14,  31,
227      11,  29,   5,  16, -11, -30,  -7, -29, -21, -18,
228     -23, -19, -18,  -9,  -7,   3,  23,  17,  14,   9,
229       8,   9,   6, -15,  27,  -4,  -2,  -6,  12,  -1,
230     }, {
231      16, -27,  -2, -10, -13, -16, -20,  20, -29,  20,
232      14,  16,  13,   8,  -9, -13,   2, -33,  -9, -19,
233     -17, -23, -17, -22,  -6,  -6,   9,   2,  12,   2,
234      20,  13,  13,  10,  45,   4, -16,   8,   2,   7,
235     }, {
236     -16,  14,  -2,   8,  20,  17,   9,   2,  14,  16,
237      -6,   5, -24, -28, -21, -20,  -8,   9,   4,  25,
238      -1,  11, -22,  24, -15,  -8,  21,   5,  11,  14,
239      -5,  18, -11,   7, -27, -20, -14,  -7,   1,  -9,
240     }, {
241       6,   2, -14,  -9,  16,  -1,  -3, -14,   0,   5,
242      -3,  -8, -16, -36, -19,  -3,   1,   6,  17,  24,
243       4,   7, -21,  11, -14, -18,   7,  -9,   9,   7,
244       6,  22,  -3,  33, -10, -11, -28,   7,  -7,   0,
245     }, {
246     -26,   6,  11,  10,  12,  23,  12,  23,   5,  24,
247     -13,   5, -19,  -8, -38, -21, -20,  -2,  -6,  12,
248     -11,  -5, -23,  11, -29,  -9,   9,   0,   7,   6,
249       1,  -7,  -2,   7,  -3,   3,  -2,   6,  27,   3,
250     }, {
251      -4,  -6,   0,  -7,   8,   4,   0,   6,  -9,  13,
252     -11,  -7, -11, -15, -37,  -4,  -9,  -5,   5,  11,
253      -5,  -9, -22,  -1, -27, -18,  -4, -14,   5,   0,
254      12,  -3,   4,  32,  14,  12, -17,  22,  17,  11,
255     }, {
256      -8,  12,   3,  21,   3,  14,  -8,   5,   4,  28,
257       7,  32,  -2,  -8, -12, -34,  -4, -12,   1,   6,
258       9,   4,  -7,  17,   4, -13,  11,  -1,  19,  -4,
259       0,  39,  -4,   7, -11, -21, -20, -16, -10, -11,
260     }, {
261      13,   0,  -8,   3,   0,  -4, -21, -11,  -9,  16,
262      10,  18,   5, -16, -10, -16,   5, -15,  13,   5,
263      15,   1,  -6,   4,   6, -23,  -2, -16,  17, -12,
264      10,  44,   3,  33,   6, -12, -34,  -1, -20,  -3,
265     }, {
266     -18,   4,  17,  23,  -4,  20,  -4,  26,  -3,  36,
267       0,  32,   2,  12, -29, -34, -16, -24, -10,  -6,
268       0, -12,  -8,   4,  -8, -13,   0,  -6,  16, -12,
269       5,  13,   3,   7,  13,   3,  -8,  -2,  14,   0,
270     }, {
271       3,  -7,   5,   5,  -8,   2, -17,   9, -18,  24,
272       2,  19,  10,   4, -28, -17,  -5, -28,   2,  -7,
273       4, -15,  -7,  -8,  -6, -23, -13, -21,  14, -20,
274      17,  18,  11,  33,  30,  11, -23,  13,   5,   9,
275     }, {
276      60,  10,   7,  -1,   9,  -8,   6, -13,   2, -15,
277      -1, -10, -13, -11,  15,   0,   6,   9,  -1,   0,
278     -13,   1, -11,  -3, -13,  21,  13,  26,  -7,  31,
279     -10,  -7, -16, -33, -31, -10,  22,  -8,   1,  -2,
280     }, {
281      82,  -1,  -4, -19,   6, -27,  -6, -29, -12, -26,
282       1, -24,  -5, -18,  17,  17,  17,   6,  10,   0,
283      -7,  -2,  -9, -16, -12,  11,   0,  11,  -9,  23,
284       0,  -3,  -8,  -8, -13,  -1,   8,   7,  -7,   6,
285     }, {
286      49,   2,  21,   0,   1,  -2,   9,   8,  -6,  -6,
287      -8, -10,  -8,   9,  -2,   0,  -4,  -2, -13, -12,
288     -23, -15, -12, -16, -26,  21,   2,  21, -11,  23,
289      -4, -33,  -7, -33,  -6,  13,  34,   5,  27,  10,
290     }, {
291      71, -10,   9, -17,  -1, -20,  -3,  -8, -21, -18,
292      -6, -24,   0,   1,   0,  16,   6,  -5,   0, -13,
293     -17, -19, -11, -29, -25,  11, -11,   6, -13,  15,
294       7, -29,   0,  -8,  11,  22,  20,  21,  17,  18,
295     }, {
296      67,   8,  14,  11,  -7, -11, -11,  -9,  -7,  -3,
297      13,  16,   8,   9,  24, -12,  10, -13,  -5, -17,
298      -2,  -4,   3, -10,   6,  17,   4,  19,   0,  11,
299      -6,  13,  -9, -33, -14, -10,  16, -17, -10,  -4,
300     }, {
301      90,  -3,   2,  -6, -10, -29, -24, -26, -21, -15,
302      15,   2,  16,   1,  25,   4,  21, -16,   6, -18,
303       3,  -8,   5, -24,   8,   7,  -9,   4,  -1,   3,
304       5,  18,  -1,  -7,   2,  -1,   2,  -1, -19,   3,
305     }, {
306      57,   0,  27,  13, -14,  -5,  -7,  11, -15,   4,
307       5,  16,  13,  29,   6, -13,   0, -25, -16, -31,
308     -12, -22,   2, -23,  -6,  16,  -7,  14,  -2,   3,
309       0, -12,   0, -33,   9,  13,  28,  -3,  14,   7,
310     }, {
311      79, -11,  15,  -4, -18, -23, -20,  -5, -30,  -7,
312       7,   2,  21,  21,   8,   3,  10, -28,  -4, -31,
313      -6, -25,   3, -37,  -4,   7, -20,   0,  -4,  -4,
314      11,  -7,   6,  -8,  27,  22,  14,  12,   5,  16,
315     }, {
316      47,  30,  15,  14,  14,   9,   9, -23,  13, -10,
317     -12,  -7, -16, -15,  -3,  -3,  -1,  14,   9,  12,
318       9,   8,   0,  10, -14,   4,  -9,   2,  -5,   8,
319     -13,  -3, -18, -10, -45,  -3,  16,  -4,   4,   0,
320     }, {
321      69,  17,   3,  -3,  10,  -8,  -3, -40,  -1, -21,
322     -10, -21,  -8, -23,  -1,  13,   8,  11,  21,  11,
323      15,   4,   0,  -2, -13,  -5, -23, -12,  -7,   0,
324      -1,   0, -10,  14, -28,   5,   1,  11,  -5,   7,
325     }, {
326      36,  21,  28,  16,   6,  16,  12,  -2,   4,  -2,
327     -20,  -7, -11,   4, -20,  -4, -12,   2,  -1,   0,
328       0,  -8,  -2,  -2, -27,   4, -21,  -2,  -9,   0,
329      -6, -29,  -9, -10, -21,  21,  28,  10,  29,  11,
330     }, {
331      58,   9,  16,  -1,   2,  -2,   0, -19, -10, -13,
332     -17, -21,  -3,  -3, -19,  12,  -2,   0,  10,  -1,
333       5, -12,   0, -15, -26,  -5, -34, -16, -11,  -7,
334       4, -25,  -2,  14,  -3,  29,  13,  25,  20,  20,
335     }, {
336      55,  28,  21,  27,  -2,   7,  -8, -20,   4,   1,
337       1,  18,   5,   4,   5, -16,   2,  -8,   5,  -5,
338      19,   2,  14,   3,   6,   0, -18,  -4,   2, -11,
339      -8,  18, -11, -10, -29,  -3,  10, -13,  -8,  -3,
340     }, {
341      77,  16,   9,   9,  -6, -11, -21, -37, -10, -10,
342       4,   5,  13,  -3,   7,   0,  13, -11,  17,  -6,
343      25,  -1,  15,  -9,   7,  -9, -32, -19,   0, -18,
344       2,  22,  -3,  15, -12,   5,  -4,   2, -17,   5,
345     }, {
346      44,  20,  34,  29, -10,  13,  -4,   0,  -4,   9,
347      -5,  19,  10,  24, -11, -17,  -8, -20,  -5, -19,
348       9, -14,  12,  -9,  -6,   0, -30,  -9,   0, -19,
349      -2,  -7,  -2, -10,  -5,  20,  21,   1,  17,   9,
350     }, {
351      66,   8,  23,  11, -14,  -5, -17, -16, -19,  -2,
352      -3,   5,  18,  17, -10,   0,   1, -23,   6, -20,
353      15, -18,  14, -22,  -5, -10, -44, -23,  -2, -26,
354       9,  -3,   4,  14,  12,  29,   7,  16,   7,  18,
355     }, {
356      18,   9, -17,  -4,  11,   3,   0,  11,   7,   4,
357      10,   3,  10, -18,  24,  -3,  14,   7,   4,  10,
358     -16,   1, -27,  -4, -27,  17,  12,  30,   0,  35,
359      -9,  -3, -12, -36, -35, -30,  -2, -13,   2, -11,
360     }, {
361      40,  -2, -29, -22,   7, -14, -12,  -5,  -7,  -7,
362      12,  -9,  18, -26,  26,  14,  24,   4,  16,   9,
363     -10,  -2, -26, -18, -26,   7,  -1,  15,  -1,  27,
364       2,   0,  -4, -11, -17, -21, -16,   1,  -7,  -3,
365     }, {
366       8,   1,  -3,  -2,   3,  10,   3,  32,  -1,  12,
367       2,   4,  15,   1,   7,  -3,   2,  -4,  -6,  -3,
368     -26, -15, -29, -17, -40,  17,   0,  26,  -2,  27,
369      -2, -29,  -4, -36, -10,  -6,   9,   0,  27,   0,
370     }, {
371      30, -11, -15, -20,   0,  -8,  -9,  15, -15,   0,
372       5,  -9,  23,  -6,   8,  13,  13,  -7,   5,  -3,
373     -20, -19, -27, -31, -39,   7, -13,  11,  -4,  19,
374       8, -25,   3, -11,   7,   2,  -4,  16,  18,   9,
375     }, {
376      26,   7, -11,   8,  -5,   1, -17,  14,  -1,  15,
377      24,  30,  32,   1,  33, -16,  18, -14,   0,  -8,
378      -6,  -4, -12, -12,  -6,  13,   2,  23,   8,  15,
379      -4,  17,  -5, -36, -18, -30,  -8, -22, -10, -14,
380     }, {
381      48,  -4, -23,  -9,  -9, -17, -30,  -2, -16,   3,
382      26,  16,  40,  -6,  35,   1,  28, -17,  12,  -9,
383       0,  -8, -11, -25,  -5,   3, -10,   8,   6,   7,
384       6,  22,   1, -11,  -1, -21, -22,  -7, -19,  -5,
385     }, {
386      15,   0,   2,  10, -13,   7, -14,  35, -10,  23,
387      16,  31,  37,  21,  16, -17,   6, -26, -10, -21,
388     -16, -21, -13, -25, -19,  13,  -8,  19,   5,   7,
389       1,  -8,   2, -36,   5,  -6,   3,  -8,  15,  -1,
390     }, {
391      37, -12,  -9,  -7, -17, -11, -26,  18, -25,  12,
392      19,  17,  45,  14,  17,   0,  17, -30,   1, -22,
393     -10, -25, -12, -38, -18,   3, -22,   4,   3,   0,
394      13,  -3,  10, -11,  23,   2, -10,   7,   5,   7,
395     }, {
396       5,  29,  -9,  11,  15,  22,   3,   0,  18,   8,
397      -1,   6,   7, -23,   6,  -6,   5,  12,  15,  21,
398       5,   8, -17,   9, -28,   0, -11,   6,   2,  12,
399     -11,   0, -14, -13, -49, -22,  -8,  -9,   4,  -9,
400     }, {
401      27,  16, -21,  -6,  12,   3,  -9, -16,   3,  -2,
402       1,  -7,  15, -31,   7,  10,  16,   9,  27,  21,
403      11,   5, -16,  -3, -26,  -9, -24,  -7,   0,   4,
404       0,   4,  -6,  11, -32, -14, -23,   6,  -5,  -1,
405     }, {
406      -4,  20,   3,  13,   8,  28,   6,  21,  10,  16,
407      -8,   7,  12,  -3, -11,  -7,  -5,   0,   4,   8,
408      -4,  -8, -18,  -3, -41,   0, -22,   2,   0,   4,
409      -5, -25,  -6, -14, -25,   1,   2,   4,  29,   2,
410     }, {
411      17,   8,  -8,  -4,   4,  10,  -6,   5,  -4,   5,
412      -6,  -6,  20, -10,  -9,   9,   4,  -2,  16,   7,
413       1, -12, -17, -16, -39,  -9, -36, -12,  -2,  -3,
414       6, -21,   1,  11,  -7,  10, -11,  20,  20,  11,
415     }, {
416      13,  27,  -3,  24,  -1,  19, -14,   3,   9,  20,
417      12,  33,  29,  -3,  15, -20,   9,  -9,  11,   3,
418      16,   2,  -2,   2,  -7,  -3, -20,   0,  10,  -7,
419      -7,  22,  -7, -13, -33, -23, -14, -18,  -7, -12,
420     }, {
421      35,  15, -15,   6,  -4,   1, -27, -12,  -5,   8,
422      15,  19,  37, -11,  16,  -2,  20, -12,  23,   2,
423      22,  -1,  -1, -11,  -5, -13, -34, -14,   8, -14,
424       4,  26,   0,  11, -16, -14, -29,  -2, -17,  -3,
425     }, {
426       3,  19,   9,  26,  -8,  26, -10,  24,   0,  28,
427       5,  33,  34,  17,  -2, -20,  -1, -22,   0, -10,
428       6, -14,  -3, -10, -20,  -4, -32,  -4,   7, -15,
429       0,  -3,   0, -13,  -9,   0,  -3,  -4,  17,   0,
430     }, {
431      25,   7,  -2,   8, -12,   7, -23,   8, -13,  16,
432       7,  20,  42,   9,   0,  -3,   9, -25,  12, -10,
433      12, -18,  -2, -24, -19, -13, -46, -19,   5, -22,
434      10,   0,   8,  11,   8,   9, -17,  11,   7,   8,
435     }, {
436     -25,  -7,   2,  -8,  12,  -7,  23,  -8,  13, -16,
437      -7, -20, -42,  -9,   0,   3,  -9,  25, -12,  10,
438     -12,  18,   2,  24,  19,  13,  46,  19,  -5,  22,
439     -10,   0,  -8, -11,  -8,  -9,  17, -11,  -7,  -8,
440     }, {
441      -3, -19,  -9, -26,   8, -26,  10, -24,   0, -28,
442      -5, -33, -34, -17,   2,  20,   1,  22,   0,  10,
443      -6,  14,   3,  10,  20,   4,  32,   4,  -7,  15,
444       0,   3,   0,  13,   9,   0,   3,   4, -17,   0,
445     }, {
446     -35, -15,  15,  -6,   4,  -1,  27,  12,   5,  -8,
447     -15, -19, -37,  11, -16,   2, -20,  12, -23,  -2,
448     -22,   1,   1,  11,   5,  13,  34,  14,  -8,  14,
449      -4, -26,   0, -11,  16,  14,  29,   2,  17,   3,
450     }, {
451     -13, -27,   3, -24,   1, -19,  14,  -3,  -9, -20,
452     -12, -33, -29,   3, -15,  20,  -9,   9, -11,  -3,
453     -16,  -2,   2,  -2,   7,   3,  20,   0, -10,   7,
454       7, -22,   7,  13,  33,  23,  14,  18,   7,  12,
455     }, {
456     -17,  -8,   8,   4,  -4, -10,   6,  -5,   4,  -5,
457       6,   6, -20,  10,   9,  -9,  -4,   2, -16,  -7,
458      -1,  12,  17,  16,  39,   9,  36,  12,   2,   3,
459      -6,  21,  -1, -11,   7, -10,  11, -20, -20, -11,
460     }, {
461       4, -20,  -3, -13,  -8, -28,  -6, -21, -10, -16,
462       8,  -7, -12,   3,  11,   7,   5,   0,  -4,  -8,
463       4,   8,  18,   3,  41,   0,  22,  -2,   0,  -4,
464       5,  25,   6,  14,  25,  -1,  -2,  -4, -29,  -2,
465     }, {
466     -27, -16,  21,   6, -12,  -3,   9,  16,  -3,   2,
467      -1,   7, -15,  31,  -7, -10, -16,  -9, -27, -21,
468     -11,  -5,  16,   3,  26,   9,  24,   7,   0,  -4,
469       0,  -4,   6, -11,  32,  14,  23,  -6,   5,   1,
470     }, {
471      -5, -29,   9, -11, -15, -22,  -3,   0, -18,  -8,
472       1,  -6,  -7,  23,  -6,   6,  -5, -12, -15, -21,
473      -5,  -8,  17,  -9,  28,   0,  11,  -6,  -2, -12,
474      11,   0,  14,  13,  49,  22,   8,   9,  -4,   9,
475     }, {
476     -37,  12,   9,   7,  17,  11,  26, -18,  25, -12,
477     -19, -17, -45, -14, -17,   0, -17,  30,  -1,  22,
478      10,  25,  12,  38,  18,  -3,  22,  -4,  -3,   0,
479     -13,   3, -10,  11, -23,  -2,  10,  -7,  -5,  -7,
480     }, {
481     -15,   0,  -2, -10,  13,  -7,  14, -35,  10, -23,
482     -16, -31, -37, -21, -16,  17,  -6,  26,  10,  21,
483      16,  21,  13,  25,  19, -13,   8, -19,  -5,  -7,
484      -1,   8,  -2,  36,  -5,   6,  -3,   8, -15,   1,
485     }, {
486     -48,   4,  23,   9,   9,  17,  30,   2,  16,  -3,
487     -26, -16, -40,   6, -35,  -1, -28,  17, -12,   9,
488       0,   8,  11,  25,   5,  -3,  10,  -8,  -6,  -7,
489      -6, -22,  -1,  11,   1,  21,  22,   7,  19,   5,
490     }, {
491     -26,  -7,  11,  -8,   5,  -1,  17, -14,   1, -15,
492     -24, -30, -32,  -1, -33,  16, -18,  14,   0,   8,
493       6,   4,  12,  12,   6, -13,  -2, -23,  -8, -15,
494       4, -17,   5,  36,  18,  30,   8,  22,  10,  14,
495     }, {
496     -30,  11,  15,  20,   0,   8,   9, -15,  15,   0,
497      -5,   9, -23,   6,  -8, -13, -13,   7,  -5,   3,
498      20,  19,  27,  31,  39,  -7,  13, -11,   4, -19,
499      -8,  25,  -3,  11,  -7,  -2,   4, -16, -18,  -9,
500     }, {
501      -8,  -1,   3,   2,  -3, -10,  -3, -32,   1, -12,
502      -2,  -4, -15,  -1,  -7,   3,  -2,   4,   6,   3,
503      26,  15,  29,  17,  40, -17,   0, -26,   2, -27,
504       2,  29,   4,  36,  10,   6,  -9,   0, -27,   0,
505     }, {
506     -40,   2,  29,  22,  -7,  14,  12,   5,   7,   7,
507     -12,   9, -18,  26, -26, -14, -24,  -4, -16,  -9,
508      10,   2,  26,  18,  26,  -7,   1, -15,   1, -27,
509      -2,   0,   4,  11,  17,  21,  16,  -1,   7,   3,
510     }, {
511     -18,  -9,  17,   4, -11,  -3,   0, -11,  -7,  -4,
512     -10,  -3, -10,  18, -24,   3, -14,  -7,  -4, -10,
513      16,  -1,  27,   4,  27, -17, -12, -30,   0, -35,
514       9,   3,  12,  36,  35,  30,   2,  13,  -2,  11,
515     }, {
516     -66,  -8, -23, -11,  14,   5,  17,  16,  19,   2,
517       3,  -5, -18, -17,  10,   0,  -1,  23,  -6,  20,
518     -15,  18, -14,  22,   5,  10,  44,  23,   2,  26,
519      -9,   3,  -4, -14, -12, -29,  -7, -16,  -7, -18,
520     }, {
521     -44, -20, -34, -29,  10, -13,   4,   0,   4,  -9,
522       5, -19, -10, -24,  11,  17,   8,  20,   5,  19,
523      -9,  14, -12,   9,   6,   0,  30,   9,   0,  19,
524       2,   7,   2,  10,   5, -20, -21,  -1, -17,  -9,
525     }, {
526     -77, -16,  -9,  -9,   6,  11,  21,  37,  10,  10,
527      -4,  -5, -13,   3,  -7,   0, -13,  11, -17,   6,
528     -25,   1, -15,   9,  -7,   9,  32,  19,   0,  18,
529      -2, -22,   3, -15,  12,  -5,   4,  -2,  17,  -5,
530     }, {
531     -55, -28, -21, -27,   2,  -7,   8,  20,  -4,  -1,
532      -1, -18,  -5,  -4,  -5,  16,  -2,   8,  -5,   5,
533     -19,  -2, -14,  -3,  -6,   0,  18,   4,  -2,  11,
534       8, -18,  11,  10,  29,   3, -10,  13,   8,   3,
535     }, {
536     -58,  -9, -16,   1,  -2,   2,   0,  19,  10,  13,
537      17,  21,   3,   3,  19, -12,   2,   0, -10,   1,
538      -5,  12,   0,  15,  26,   5,  34,  16,  11,   7,
539      -4,  25,   2, -14,   3, -29, -13, -25, -20, -20,
540     }, {
541     -36, -21, -28, -16,  -6, -16, -12,   2,  -4,   2,
542      20,   7,  11,  -4,  20,   4,  12,  -2,   1,   0,
543       0,   8,   2,   2,  27,  -4,  21,   2,   9,   0,
544       6,  29,   9,  10,  21, -21, -28, -10, -29, -11,
545     }, {
546     -69, -17,  -3,   3, -10,   8,   3,  40,   1,  21,
547      10,  21,   8,  23,   1, -13,  -8, -11, -21, -11,
548     -15,  -4,   0,   2,  13,   5,  23,  12,   7,   0,
549       1,   0,  10, -14,  28,  -5,  -1, -11,   5,  -7,
550     }, {
551     -47, -30, -15, -14, -14,  -9,  -9,  23, -13,  10,
552      12,   7,  16,  15,   3,   3,   1, -14,  -9, -12,
553      -9,  -8,   0, -10,  14,  -4,   9,  -2,   5,  -8,
554      13,   3,  18,  10,  45,   3, -16,   4,  -4,   0,
555     }, {
556     -79,  11, -15,   4,  18,  23,  20,   5,  30,   7,
557      -7,  -2, -21, -21,  -8,  -3, -10,  28,   4,  31,
558       6,  25,  -3,  37,   4,  -7,  20,   0,   4,   4,
559     -11,   7,  -6,   8, -27, -22, -14, -12,  -5, -16,
560     }, {
561     -57,   0, -27, -13,  14,   5,   7, -11,  15,  -4,
562      -5, -16, -13, -29,  -6,  13,   0,  25,  16,  31,
563      12,  22,  -2,  23,   6, -16,   7, -14,   2,  -3,
564       0,  12,   0,  33,  -9, -13, -28,   3, -14,  -7,
565     }, {
566     -90,   3,  -2,   6,  10,  29,  24,  26,  21,  15,
567     -15,  -2, -16,  -1, -25,  -4, -21,  16,  -6,  18,
568      -3,   8,  -5,  24,  -8,  -7,   9,  -4,   1,  -3,
569      -5, -18,   1,   7,  -2,   1,  -2,   1,  19,  -3,
570     }, {
571     -67,  -8, -14, -11,   7,  11,  11,   9,   7,   3,
572     -13, -16,  -8,  -9, -24,  12, -10,  13,   5,  17,
573       2,   4,  -3,  10,  -6, -17,  -4, -19,   0, -11,
574       6, -13,   9,  33,  14,  10, -16,  17,  10,   4,
575     }, {
576     -71,  10,  -9,  17,   1,  20,   3,   8,  21,  18,
577       6,  24,   0,  -1,   0, -16,  -6,   5,   0,  13,
578      17,  19,  11,  29,  25, -11,  11,  -6,  13, -15,
579      -7,  29,   0,   8, -11, -22, -20, -21, -17, -18,
580     }, {
581     -49,  -2, -21,   0,  -1,   2,  -9,  -8,   6,   6,
582       8,  10,   8,  -9,   2,   0,   4,   2,  13,  12,
583      23,  15,  12,  16,  26, -21,  -2, -21,  11, -23,
584       4,  33,   7,  33,   6, -13, -34,  -5, -27, -10,
585     }, {
586     -82,   1,   4,  19,  -6,  27,   6,  29,  12,  26,
587      -1,  24,   5,  18, -17, -17, -17,  -6, -10,   0,
588       7,   2,   9,  16,  12, -11,   0, -11,   9, -23,
589       0,   3,   8,   8,  13,   1,  -8,  -7,   7,  -6,
590     }, {
591     -60, -10,  -7,   1,  -9,   8,  -6,  13,  -2,  15,
592       1,  10,  13,  11, -15,   0,  -6,  -9,   1,   0,
593      13,  -1,  11,   3,  13, -21, -13, -26,   7, -31,
594      10,   7,  16,  33,  31,  10, -22,   8,  -1,   2,
595     }, {
596      -3,   7,  -5,  -5,   8,  -2,  17,  -9,  18, -24,
597      -2, -19, -10,  -4,  28,  17,   5,  28,  -2,   7,
598      -4,  15,   7,   8,   6,  23,  13,  21, -14,  20,
599     -17, -18, -11, -33, -30, -11,  23, -13,  -5,  -9,
600     }, {
601      18,  -4, -17, -23,   4, -20,   4, -26,   3, -36,
602       0, -32,  -2, -12,  29,  34,  16,  24,  10,   6,
603       0,  12,   8,  -4,   8,  13,   0,   6, -16,  12,
604      -5, -13,  -3,  -7, -13,  -3,   8,   2, -14,   0,
605     }, {
606     -13,   0,   8,  -3,   0,   4,  21,  11,   9, -16,
607     -10, -18,  -5,  16,  10,  16,  -5,  15, -13,  -5,
608     -15,  -1,   6,  -4,  -6,  23,   2,  16, -17,  12,
609     -10, -44,  -3, -33,  -6,  12,  34,   1,  20,   3,
610     }, {
611       8, -12,  -3, -21,  -3, -14,   8,  -5,  -4, -28,
612      -7, -32,   2,   8,  12,  34,   4,  12,  -1,  -6,
613      -9,  -4,   7, -17,  -4,  13, -11,   1, -19,   4,
614       0, -39,   4,  -7,  11,  21,  20,  16,  10,  11,
615     }, {
616       4,   6,   0,   7,  -8,  -4,   0,  -6,   9, -13,
617      11,   7,  11,  15,  37,   4,   9,   5,  -5, -11,
618       5,   9,  22,   1,  27,  18,   4,  14,  -5,   0,
619     -12,   3,  -4, -32, -14, -12,  17, -22, -17, -11,
620     }, {
621      26,  -6, -11, -10, -12, -23, -12, -23,  -5, -24,
622      13,  -5,  19,   8,  38,  21,  20,   2,   6, -12,
623      11,   5,  23, -11,  29,   9,  -9,   0,  -7,  -6,
624      -1,   7,   2,  -7,   3,  -3,   2,  -6, -27,  -3,
625     }, {
626      -6,  -2,  14,   9, -16,   1,   3,  14,   0,  -5,
627       3,   8,  16,  36,  19,   3,  -1,  -6, -17, -24,
628      -4,  -7,  21, -11,  14,  18,  -7,   9,  -9,  -7,
629      -6, -22,   3, -33,  10,  11,  28,  -7,   7,   0,
630     }, {
631      16, -14,   2,  -8, -20, -17,  -9,  -2, -14, -16,
632       6,  -5,  24,  28,  21,  20,   8,  -9,  -4, -25,
633       1, -11,  22, -24,  15,   8, -21,  -5, -11, -14,
634       5, -18,  11,  -7,  27,  20,  14,   7,  -1,   9,
635     }, {
636     -16,  27,   2,  10,  13,  16,  20, -20,  29, -20,
637     -14, -16, -13,  -8,   9,  13,  -2,  33,   9,  19,
638      17,  23,  17,  22,   6,   6,  -9,  -2, -12,  -2,
639     -20, -13, -13, -10, -45,  -4,  16,  -8,  -2,  -7,
640     }, {
641       5,  15,  -9,  -7,   9,  -2,   8, -37,  14, -31,
642     -11, -29,  -5, -16,  11,  30,   7,  29,  21,  18,
643      23,  19,  18,   9,   7,  -3, -23, -17, -14,  -9,
644      -8,  -9,  -6,  15, -27,   4,   2,   6, -12,   1,
645     }, {
646     -26,  19,  15,  12,   5,  22,  24,   0,  21, -12,
647     -21, -15,  -8,  11,  -7,  12, -14,  20,  -2,   6,
648       7,   6,  16,   9,  -6,   5, -21,  -7, -15, -10,
649     -13, -39,  -5, -10, -20,  19,  28,   5,  22,   5,
650     }, {
651      -4,   6,   3,  -5,   1,   4,  11, -16,   6, -23,
652     -19, -29,   0,   3,  -6,  30,  -3,  17,  10,   5,
653      13,   2,  17,  -3,  -5,  -3, -35, -21, -17, -17,
654      -2, -35,   2,  15,  -3,  28,  13,  21,  13,  13,
655     }, {
656      -8,  25,   8,  23,  -3,  13,   3, -17,  20,  -8,
657       0,  10,   8,  11,  18,   0,   1,  10,   5,   0,
658      28,  17,  32,  15,  26,   1, -19,  -9,  -3, -21,
659     -15,   7,  -6,  -9, -29,  -5,  10, -17, -15,  -9,
660     }, {
661      13,  13,  -3,   5,  -7,  -4,  -9, -34,   5, -20,
662       2,  -3,  16,   3,  20,  17,  11,   7,  17,   0,
663      34,  13,  33,   2,  28,  -8, -32, -24,  -5, -29,
664      -3,  12,   0,  15, -11,   3,  -3,  -2, -24,  -1,
665     }, {
666     -18,  17,  21,  25, -11,  19,   6,   3,  11,   0,
667      -7,  11,  13,  31,   1,   0,  -9,  -1,  -5, -12,
668      18,   0,  31,   2,  13,   1, -30, -14,  -7, -29,
669      -9, -18,   1, -10,  -4,  18,  22,  -3,  10,   2,
670     }, {
671       3,   5,   9,   7, -15,   1,  -5, -13,  -2, -12,
672      -5,  -2,  21,  23,   2,  16,   0,  -5,   6, -13,
673      23,  -3,  32, -10,  15,  -8, -44, -28,  -9, -37,
674       2, -13,   9,  15,  12,  27,   7,  12,   0,  11,
675     }, {
676     -44,   6, -30,  -8,   9,  10,  11,  14,  23,  -5,
677       8,  -4,  14, -12,  37,  14,  12,  26,   4,  16,
678      -8,  16,  -9,   7,  -6,  19,  12,  25,  -5,  24,
679     -15, -13,  -8, -36, -34, -31,  -1, -18,  -4, -18,
680     }, {
681     -22,  -5, -42, -26,   6,  -8,  -1,  -2,   9, -17,
682      10, -18,  21, -19,  39,  31,  23,  23,  16,  15,
683      -2,  12,  -7,  -6,  -5,   9,  -1,  10,  -7,  16,
684      -4,  -9,   0, -10, -17, -22, -16,  -2, -14,  -9,
685     }, {
686     -55,  -1, -17,  -6,   1,  16,  15,  35,  15,   2,
687       0,  -4,  19,   8,  20,  13,   1,  14,  -7,   3,
688     -18,   0, -10,  -5, -19,  19,   0,  21,  -8,  16,
689      -9, -39,   0, -36, -10,  -7,   9,  -4,  20,  -5,
690     }, {
691     -33, -13, -29, -24,  -1,  -1,   2,  18,   0,  -9,
692       3, -17,  27,   0,  21,  30,  12,  11,   5,   2,
693     -12,  -4,  -9, -19, -18,   9, -13,   6, -11,   8,
694       2, -35,   8, -10,   7,   1,  -4,  11,  10,   2,
695     }, {
696     -36,   5, -24,   4,  -7,   7,  -6,  17,  14,   5,
697      22,  22,  35,   8,  46,   1,  17,   3,   0,  -2,
698       2,  10,   5,   0,  14,  15,   2,  18,   2,   4,
699     -11,   7,  -1, -36, -18, -32,  -7, -27, -17, -20,
700     }, {
701     -14,  -7, -36, -13, -10, -10, -18,   0,   0,  -5,
702      25,   8,  43,   0,  48,  18,  27,   0,  12,  -3,
703       7,   6,   7, -13,  15,   5, -11,   3,   0,  -2,
704       0,  12,   6, -10,   0, -23, -22, -11, -26, -12,
705     }, {
706     -47,  -3, -11,   6, -15,  13,  -2,  38,   6,  13,
707      15,  22,  40,  28,  28,   0,   5,  -8, -10, -15,
708      -7,  -7,   4, -13,   1,  14,  -9,  14,   0,  -2,
709      -4, -18,   7, -36,   6,  -8,   3, -13,   7,  -8,
710     }, {
711     -25, -15, -22, -11, -18,  -4, -15,  22,  -8,   2,
712      17,   9,  48,  20,  30,  17,  16, -11,   1, -16,
713      -2, -10,   5, -26,   2,   4, -22,   0,  -2, -10,
714       6, -13,  14, -10,  23,   0, -10,   2,  -1,   0,
715     }, {
716     -57,  26, -22,   7,  14,  28,  14,   3,  35,   0,
717      -3,  -1,  11, -16,  18,  10,   4,  31,  15,  28,
718      14,  23,   1,  21,  -7,   2, -11,   1,  -3,   1,
719     -18,  -9, -10, -13, -49, -24,  -8, -14,  -2, -16,
720     }, {
721     -35,  14, -34, -10,  10,  10,   1, -12,  20, -12,
722       0, -15,  18, -24,  20,  27,  14,  28,  27,  27,
723      20,  19,   2,   8,  -5,  -7, -25, -13,  -5,  -5,
724      -6,  -5,  -2,  12, -31, -15, -23,   1, -12,  -8,
725     }, {
726     -68,  18,  -9,   9,   6,  35,  18,  25,  26,   7,
727     -10,  -1,  16,   3,   1,   9,  -6,  19,   4,  15,
728       4,   6,   0,   8, -20,   2, -23,  -2,  -7,  -5,
729     -12, -35,  -1, -13, -24,   0,   3,   0,  22,  -4,
730     }, {
731     -46,   6, -21,  -8,   2,  16,   5,   8,  11,  -4,
732      -8, -15,  24,  -4,   2,  26,   3,  16,  16,  14,
733       9,   2,   1,  -4, -19,  -7, -36, -17,  -9, -13,
734       0, -31,   5,  12,  -7,   8, -11,  15,  13,   4,
735     }, {
736     -49,  24, -16,  20,  -2,  26,  -2,   7,  25,  10,
737      11,  25,  32,   3,  27,  -2,   8,   8,  11,   9,
738      24,  17,  16,  14,  13,  -2, -20,  -5,   4, -17,
739     -14,  12,  -3, -13, -33, -25, -14, -23, -15, -19,
740     }, {
741     -27,  12, -28,   2,  -6,   7, -15,  -9,  11,  -1,
742      13,  11,  40,  -4,  29,  14,  19,   5,  23,   8,
743      30,  13,  17,   0,  14, -12, -34, -20,   2, -25,
744      -2,  16,   4,  12, -15, -16, -29,  -7, -24, -10,
745     }, {
746     -60,  16,  -3,  22, -10,  32,   0,  28,  17,  18,
747       3,  25,  37,  23,  10,  -3,  -2,  -3,   0,  -3,
748      14,   0,  14,   1,   0,  -2, -32,  -9,   1, -25,
749      -7, -13,   5, -13,  -8,  -1,  -2,  -8,  10,  -6,
750     }, {
751     -38,   4, -15,   4, -14,  13, -12,  11,   2,   6,
752       6,  11,  45,  16,  11,  13,   7,  -6,  12,  -4,
753      20,  -3,  16, -12,   1, -12, -46, -24,   0, -33,
754       3,  -9,  12,  12,   8,   7, -17,   6,   0,   2
755     }
756 };
757
758 const int8_t ff_cb2_vects[128][40]={
759     {
760      73, -32, -60, -15, -26,  59,   2, -33,  30, -10,
761      -3, -17,   8,  30,  -1, -26,  -4, -22,  10,  16,
762     -36,  -5, -11,  56,  37,   6, -10,  -5, -13,  -3,
763       6,  -5,  11,   4, -19,  -5, -16,  41,  24,  13,
764     }, {
765       4, -11, -37,  23,  -5,  46,  -2, -29,  -5, -39,
766     -21,  -9,   0,  49,  12,  -9, -16, -26,  22,  15,
767     -45, -20,  -5,  40,  22,  17, -26,  31, -14,   2,
768     -14,  10,  30,  20, -27,  -9, -39,  39,  18,   5,
769     }, {
770      34, -25, -48, -28, -11,  34,  -2, -41,   9,  -7,
771     -17,  21,  20,  24, -17, -33,   0, -24,  10,  42,
772       3,  -5,  10,  42,  11,   8,  -3,   3,  16,   9,
773      22,  -2,   0, -33, -10,  18,   7,  58,  10,  28,
774     }, {
775     -34,  -4, -25,  10,   9,  21,  -7, -36, -26, -36,
776     -35,  28,  12,  42,  -3, -16, -12, -28,  21,  42,
777      -5, -21,  16,  26,  -4,  19, -19,  39,  15,  15,
778       1,  13,  19, -17, -17,  14, -15,  55,   4,  19,
779     }, {
780      28, -20, -51, -14,  -6,   7,   0, -26,  27,  -4,
781      18, -40,  -6,  16,  -1, -15,   0, -55,  -5, -16,
782     -19,  14,  -3,  49,  14,   1, -22, -30, -12,   0,
783      24,  15,   9, -17, -45, -29,   4,  28,  51,  35,
784     }, {
785     -40,   0, -28,  24,  14,  -5,  -4, -21,  -7, -33,
786       0, -32, -15,  35,  12,   1, -11, -58,   5, -16,
787     -28,   0,   1,  33,   0,  11, -39,   5, -14,   6,
788       3,  31,  28,  -1, -53, -33, -19,  25,  46,  26,
789     }, {
790     -11, -14, -39, -27,   9, -17,  -4, -33,   6,   0,
791       4,  -1,   5,  10, -17, -22,   5, -57,  -5,   9,
792      20,  13,  18,  35, -11,   3, -16, -22,  17,  13,
793      40,  19,  -1, -55, -35,  -5,  27,  44,  37,  49,
794     }, {
795     -80,   6, -16,  11,  30, -30,  -9, -28, -28, -29,
796     -13,   6,  -2,  28,  -3,  -5,  -7, -60,   5,   9,
797      11,  -1,  24,  19, -27,  13, -32,  13,  15,  19,
798      19,  35,  17, -39, -43,  -9,   4,  42,  32,  41,
799     }, {
800      78, -21, -43,   4, -38,  17,  17,  -5,  55,  24,
801     -15, -36,  14,   4,  24, -24,  12,   5,  17,  31,
802     -54,  -5,  -2,  27,  43, -12,   2,   9,  -9, -15,
803      22,  -3,  28,  21, -20,   3,  20,  28,   9,  -5,
804     }, {
805       9,  -1, -20,  43, -17,   3,  12,   0,  20,  -4,
806     -33, -29,   6,  22,  38,  -7,   0,   1,  29,  30,
807     -63, -21,   3,  11,  27,  -1, -14,  45, -10,  -9,
808       1,  12,  47,  37, -28,   0,  -2,  26,   4, -13,
809     }, {
810      39, -14, -30,  -8, -22,  -8,  12, -12,  34,  27,
811     -29,   2,  26,  -2,   8, -31,  16,   3,  17,  57,
812     -14,  -6,  19,  13,  16, -10,   8,  17,  20,  -2,
813      38,   0,  17, -16, -11,  27,  44,  45,  -4,   8,
814     }, {
815     -29,   5,  -7,  30,  -1, -21,   7,  -7,   0,   0,
816     -47,   9,  18,  15,  22, -14,   4,   0,  28,  57,
817     -23, -21,  25,  -2,   1,   0,  -7,  53,  19,   3,
818      17,  15,  36,   0, -19,  24,  21,  43,  -9,   0,
819     }, {
820      33, -10, -34,   5, -17, -35,  15,   1,  53,  30,
821       6, -59,   0, -10,  24, -13,  17, -27,   1,  -1,
822     -37,  13,   4,  20,  20, -18, -10, -16,  -8, -11,
823      39,  18,  26,   0, -46, -20,  41,  15,  37,  15,
824     }, {
825     -35,  10, -11,  44,   3, -48,  10,   6,  17,   2,
826     -11, -51,  -8,   8,  38,   3,   4, -31,  12,  -2,
827     -46,  -1,  10,   4,   5,  -7, -26,  19, -10,  -5,
828      18,  34,  45,  15, -54, -24,  18,  13,  31,   7,
829     }, {
830      -5,  -3, -21,  -7,  -2, -60,  10,  -5,  32,  34,
831      -7, -20,  11, -16,   8, -20,  21, -29,   1,  24,
832       2,  13,  27,   6,  -5, -15,  -3,  -8,  21,   1,
833      55,  21,  15, -38, -37,   3,  65,  32,  23,  30,
834     }, {
835     -74,  17,   0,  31,  18, -73,   5,   0,  -3,   5,
836     -25, -12,   3,   1,  22,  -3,   9, -33,  12,  24,
837      -6,  -2,  33,  -9, -21,  -5, -20,  27,  19,   7,
838      34,  37,  34, -22, -44,   0,  41,  29,  17,  21,
839     }, {
840      76, -35, -31, -28, -49,  43, -40,   0,  29, -14,
841       8,   5,  10,  18, -26, -46,   0,   7,   6,   3,
842     -25,  -7,  -2,  40,  28,  14,  18,  -3, -27, -28,
843      -8, -45, -13,  34, -13, -27, -15,  31,  12,   3,
844     }, {
845       7, -15,  -9,   9, -28,  29, -45,   5,  -6, -43,
846      -9,  12,   2,  36, -12, -30, -11,   3,  17,   3,
847     -34, -22,   3,  24,  12,  24,   2,  32, -28, -22,
848     -29, -29,   5,  50, -21, -31, -38,  29,   7,  -5,
849     }, {
850      36, -29, -19, -41, -34,  18, -45,  -6,   8, -10,
851      -5,  43,  23,  11, -42, -53,   5,   5,   6,  30,
852      14,  -8,  20,  26,   1,  16,  25,   4,   3, -15,
853       7, -41, -23,  -3,  -4,  -3,   8,  48,  -1,  17,
854     }, {
855     -32,  -8,   3,  -2, -13,   4, -50,  -1, -27, -39,
856     -23,  51,  15,  30, -27, -37,  -7,   1,  17,  29,
857       5, -23,  25,  10, -14,  26,   8,  41,   1,  -9,
858     -13, -26,  -5,  12, -12,  -7, -14,  45,  -6,   9,
859     }, {
860      31, -24, -23, -27, -29,  -9, -43,   8,  26,  -7,
861      30, -17,  -4,   3, -26, -35,   5, -24, -10, -28,
862      -9,  12,   5,  33,   5,   8,   5, -29, -26, -24,
863       9, -23, -14,  12, -39, -52,   5,  18,  39,  24,
864     }, {
865     -37,  -3,   0,  10,  -7, -22, -48,  12,  -8, -36,
866      12,  -9, -12,  22, -12, -19,  -6, -28,   0, -29,
867     -18,  -3,  11,  17, -10,  18, -10,   7, -27, -18,
868     -11,  -7,   3,  28, -47, -55, -18,  15,  34,  16,
869     }, {
870      -8, -17, -10, -40, -13, -34, -47,   0,   5,  -4,
871      16,  21,   8,  -2, -42, -43,  10, -26, -10,  -2,
872      31,  11,  27,  19, -21,  10,  12, -20,   3, -11,
873      25, -20, -25, -25, -29, -28,  28,  34,  25,  38,
874     }, {
875     -77,   2,  11,  -1,   7, -47, -52,   5, -29, -33,
876      -1,  28,   0,  15, -28, -26,  -2, -30,   0,  -2,
877      22,  -4,  33,   3, -36,  21,  -3,  15,   2,  -5,
878       4,  -4,  -6,  -9, -37, -31,   5,  32,  20,  30,
879     }, {
880      81, -25, -14,  -8, -61,   0, -25,  28,  54,  20,
881      -3, -14,  17,  -8,   0, -44,  16,  35,  13,  18,
882     -43,  -7,   6,  11,  33,  -4,  30,  11, -22, -40,
883       6, -43,   3,  50, -14, -18,  22,  18,  -1, -16,
884     }, {
885      12,  -4,   8,  29, -39, -12, -30,  33,  19,  -8,
886     -21,  -6,   8,   9,  13, -28,   4,  31,  24,  18,
887     -52, -23,  12,  -4,  18,   5,  14,  47, -24, -34,
888     -14, -27,  22,  66, -22, -22,  -1,  16,  -6, -24,
889     }, {
890      41, -18,  -2, -21, -45, -24, -30,  21,  33,  24,
891     -17,  24,  29, -15, -16, -51,  21,  33,  13,  45,
892      -3,  -8,  28,  -2,   7,  -2,  37,  19,   7, -27,
893      22, -39,  -7,  12,  -5,   5,  45,  35, -15,  -1,
894     }, {
895     -27,   1,  20,  17, -24, -38, -35,  26,  -1,  -4,
896     -35,  32,  21,   3,  -2, -35,   8,  29,  24,  44,
897     -12, -24,  34, -18,  -8,   7,  21,  55,   5, -21,
898       2, -23,  11,  28, -13,   1,  22,  33, -21, -10,
899     }, {
900      36, -13,  -5,  -7, -40, -51, -28,  36,  52,  27,
901      18, -36,   2, -22,   0, -33,  21,   2,  -3, -13,
902     -26,  11,  14,   4,  10, -10,  18, -14, -22, -36,
903      24, -21,   1,  28, -40, -42,  42,   5,  25,   5,
904     }, {
905     -32,   6,  17,  31, -19, -65, -33,  41,  16,  -1,
906       0, -29,  -6,  -4,  13, -17,   9,  -1,   8, -14,
907     -35,  -3,  19, -11,  -4,   0,   1,  21, -23, -30,
908       3,  -5,  20,  44, -48, -46,  19,   3,  20,  -3,
909     }, {
910      -3,  -7,   6, -20, -25, -77, -32,  29,  31,  30,
911       4,   2,  14, -29, -16, -40,  26,   0,  -3,  12,
912      13,  10,  36,  -9, -15,  -8,  24,  -6,   7, -22,
913      40, -17,  -8,  -9, -31, -18,  66,  22,  11,  19,
914     }, {
915     -72,  13,  29,  18,  -4, -90, -37,  34,  -4,   1,
916     -13,   9,   6, -11,  -2, -24,  13,  -3,   7,  11,
917       4,  -4,  42, -25, -31,   1,   8,  29,   6, -17,
918      19,  -2,  10,   6, -38, -22,  42,  19,   6,  11,
919     }, {
920     116, -20, -68, -30, -28,  83,  28, -18,  32, -22,
921     -13, -21,   5,  28,   5,  -7, -24,  -8, -22,  17,
922     -23,  30, -25,  45,  15,  -9, -11, -18,  22, -10,
923       4,  -2,  19, -12,  23,   3, -43,   2,  12,  -4,
924     }, {
925      47,   0, -45,   7,  -7,  69,  23, -13,  -2, -51,
926     -32, -14,  -3,  47,  19,   8, -37, -11, -10,  16,
927     -32,  15, -19,  29,   0,   1, -28,  18,  20,  -4,
928     -16,  13,  38,   3,  15,   0, -66,   0,   7, -13,
929     }, {
930      77, -13, -56, -43, -13,  57,  23, -26,  11, -19,
931     -27,  16,  17,  22, -10, -15, -19, -10, -22,  43,
932      16,  30,  -2,  31, -11,  -6,  -5,  -9,  52,   2,
933      20,   0,   8, -50,  33,  27, -19,  19,  -1,   9,
934     }, {
935       8,   6, -33,  -4,   7,  44,  18, -21, -23, -48,
936     -46,  24,   9,  40,   3,   1, -32, -13, -11,  43,
937       7,  14,   3,  15, -26,   3, -21,  26,  50,   8,
938       0,  16,  27, -34,  25,  23, -43,  17,  -6,   1,
939     }, {
940      71,  -9, -59, -29,  -8,  30,  26, -11,  30, -16,
941       8, -44,  -9,  14,   5,   2, -19, -40, -38, -15,
942      -7,  50, -17,  38,  -7, -14, -24, -43,  22,  -6,
943      22,  19,  17, -34,  -2, -20, -23, -10,  39,  16,
944     }, {
945       2,  11, -36,   9,  13,  17,  21,  -6,  -5, -45,
946     -10, -36, -18,  33,  19,  19, -31, -44, -27, -15,
947     -16,  34, -11,  22, -22,  -4, -40,  -7,  21,   0,
948       1,  35,  36, -18, -10, -24, -46, -12,  34,   8,
949     }, {
950      32,  -2, -47, -42,   7,   5,  21, -18,   9, -12,
951      -5,  -5,   2,   8, -10,  -4, -14, -42, -38,  10,
952      33,  49,   5,  24, -33, -12, -17, -35,  52,   6,
953      38,  22,   7, -72,   7,   3,   0,   6,  25,  30,
954     }, {
955     -36,  18, -24,  -3,  28,  -7,  16, -13, -26, -41,
956     -24,   1,  -5,  26,   3,  12, -27, -46, -27,  10,
957      24,  34,  10,   8, -49,  -2, -34,   0,  51,  12,
958      17,  38,  25, -56,   0,   0, -22,   3,  20,  22,
959     }, {
960     121,  -9, -50, -10, -40,  40,  43,   9,  58,  12,
961     -25, -41,  11,   2,  31,  -5,  -8,  19, -15,  32,
962     -41,  30, -16,  16,  20, -28,   0,  -3,  26, -22,
963      19,   0,  36,   4,  22,  12,  -6,  -9,  -1, -24,
964     }, {
965      52,  10, -27,  27, -18,  26,  38,  14,  23, -16,
966     -44, -33,   3,  20,  45,  10, -20,  15,  -3,  31,
967     -50,  14, -10,   0,   5, -17, -15,  32,  24, -16,
968      -1,  15,  55,  20,  14,   8, -29, -12,  -7, -32,
969     }, {
970      82,  -3, -38, -23, -24,  15,  38,   2,  37,  15,
971     -39,  -2,  23,  -4,  15, -12,  -3,  17, -15,  58,
972      -1,  29,   6,   2,  -5, -26,   7,   4,  56,  -9,
973      35,   3,  25, -33,  32,  36,  17,   7, -15,  -9,
974     }, {
975      13,  17, -15,  15,  -3,   1,  33,   7,   1, -12,
976     -58,   5,  15,  13,  29,   3, -16,  13,  -4,  57,
977     -10,  13,  11, -13, -21, -15,  -9,  40,  55,  -3,
978      14,  19,  44, -17,  24,  32,  -5,   4, -21, -18,
979     }, {
980      76,   1, -41,  -9, -19, -12,  41,  17,  55,  18,
981      -3, -63,  -3, -12,  30,   5,  -3, -12, -31,   0,
982     -24,  49,  -8,   9,  -1, -33, -12, -29,  27, -18,
983      37,  21,  34, -17,  -3, -11,  14, -23,  25,  -2,
984     }, {
985       7,  22, -18,  29,   1, -25,  36,  21,  20,  -9,
986     -22, -56, -11,   6,  45,  21, -15, -16, -20,  -1,
987     -33,  34,  -2,  -6, -17, -23, -28,   6,  25, -12,
988      16,  37,  53,  -1, -11, -15,  -8, -25,  20, -11,
989     }, {
990      37,   8, -29, -22,  -4, -37,  36,   9,  34,  22,
991     -17, -24,   8, -18,  15,  -2,   1, -14, -31,  25,
992      15,  48,  13,  -4, -28, -31,  -5, -21,  57,  -4,
993      53,  24,  23, -55,   6,  12,  37,  -6,  11,  11,
994     }, {
995     -31,  28,  -6,  16,  16, -50,  31,  14,   0,  -6,
996     -36, -17,   0,   0,  29,  14, -11, -18, -20,  25,
997       6,  33,  19, -20, -43, -21, -21,  14,  55,   0,
998      32,  40,  42, -39,  -1,   8,  14,  -8,   6,   3,
999     }, {
1000     119, -24, -39, -44, -51,  66, -14,  15,  31, -26,
1001      -1,   0,   7,  16, -19, -28, -19,  22, -26,   4,
1002     -13,  28, -16,  29,   5,  -1,  16, -16,   8, -35,
1003     -10, -42,  -4,  17,  29, -19, -42,  -7,   0, -15,
1004     }, {
1005      50,  -3, -16,  -5, -30,  53, -19,  20,  -3, -55,
1006     -19,   8,   0,  34,  -5, -11, -32,  18, -15,   4,
1007     -22,  13, -10,  13,  -9,   8,   0,  19,   7, -29,
1008     -31, -26,  13,  33,  21, -22, -65,  -9,  -4, -23,
1009     }, {
1010      79, -17, -27, -56, -36,  41, -19,   8,  10, -22,
1011     -15,  39,  20,   9, -35, -35, -15,  20, -26,  31,
1012      26,  27,   6,  15, -20,   0,  23,  -8,  38, -22,
1013       5, -38, -15, -20,  39,   4, -18,   9, -13,  -1,
1014     }, {
1015      10,   3,  -4, -18, -15,  27, -24,  13, -24, -51,
1016     -34,  47,  12,  28, -21, -19, -27,  16, -15,  30,
1017      17,  12,  12,   0, -36,  10,   7,  27,  37, -16,
1018     -15, -22,   3,  -4,  31,   1, -42,   7, -18,  -9,
1019     }, {
1020      74, -12, -30, -42, -30,  14, -16,  23,  29, -19,
1021      20, -21,  -7,   1, -19, -17, -14, -10, -43, -27,
1022       3,  48,  -8,  22, -16,  -7,   4, -42,   9, -31,
1023       6, -20,  -6,  -4,   3, -43, -22, -20,  28,   5,
1024     }, {
1025       5,   7,  -7,  -4,  -9,   0, -21,  28,  -6, -48,
1026       2, -14, -15,  20,  -5,   0, -27, -14, -32, -28,
1027      -5,  32,  -2,   6, -32,   3, -12,  -5,   8, -25,
1028     -14,  -4,  12,  11,  -4, -47, -45, -22,  22,  -2,
1029     }, {
1030      34,  -6, -18, -55, -15, -11, -21,  16,   8, -16,
1031       6,  16,   5,  -4, -35, -24, -10, -12, -43,  -1,
1032      43,  47,  14,   8, -43,  -5,  10, -34,  39, -18,
1033      22, -16, -17, -42,  13, -19,   1,  -3,  14,  20,
1034     }, {
1035     -34,  14,   4, -17,   5, -24, -26,  20, -27, -45,
1036     -12,  24,  -2,  13, -21,  -8, -22, -16, -32,  -2,
1037      34,  31,  20,  -7, -58,   5,  -5,   2,  38, -12,
1038       2,  -1,   1, -26,   5, -23, -21,  -6,   8,  11,
1039     }, {
1040     124, -13, -21, -23, -62,  23,   0,  43,  57,   8,
1041     -13, -18,  14, -10,   6, -26,  -3,  49, -19,  19,
1042     -31,  27,  -7,   0,  11, -20,  29,  -1,  12, -47,
1043       4, -39,  11,  34,  28,  -9,  -5, -19, -13, -34,
1044     }, {
1045      55,   6,   1,  14, -41,  10,  -4,  48,  22, -20,
1046     -31, -10,   5,   7,  20,  -9, -16,  45,  -8,  19,
1047     -40,  12,  -1, -15,  -4, -10,  12,  34,  11, -41,
1048     -16, -24,  30,  49,  20, -13, -28, -22, -18, -43,
1049     }, {
1050      84,  -6,  -9, -36, -47,  -1,  -4,  36,  36,  12,
1051     -27,  20,  26, -17,  -9, -33,   1,  47, -19,  46,
1052       9,  27,  15, -13, -15, -18,  35,   6,  42, -33,
1053      20, -36,   1,  -4,  38,  14,  18,  -2, -27, -20,
1054     }, {
1055      15,  13,  13,   1, -26, -14,  -9,  41,   1, -16,
1056     -46,  27,  18,   1,   4, -16, -11,  43,  -8,  45,
1057       0,  11,  21, -29, -30,  -8,  19,  42,  41, -28,
1058       0, -20,  20,  11,  30,  10,  -4,  -5, -32, -28,
1059     }, {
1060      79,  -2, -12, -22, -42, -28,  -1,  51,  54,  15,
1061       8, -41,   0, -24,   6, -15,   1,  17, -36, -12,
1062     -14,  47,   0,  -6, -11, -26,  16, -27,  13, -43,
1063      22, -18,  10,  12,   2, -34,  15, -33,  13, -13,
1064     }, {
1065      10,  18,  10,  15, -21, -41,  -6,  56,  19, -13,
1066      -9, -33,  -9,  -6,  20,   1, -11,  13, -24, -13,
1067     -23,  32,   6, -22, -26, -15,   0,   8,  12, -37,
1068       1,  -2,  28,  27,  -5, -37,  -7, -35,   8, -21,
1069     }, {
1070      39,   4,   0, -35, -27, -53,  -6,  44,  33,  18,
1071      -5,  -2,  11, -31,  -9, -22,   6,  15, -36,  13,
1072      25,  46,  23, -20, -37, -24,  23, -19,  43, -29,
1073      38, -14,   0, -26,  12, -10,  38, -16,   0,   0,
1074     }, {
1075     -29,  25,  22,   2,  -6, -67, -11,  49,  -1, -10,
1076     -24,   5,   3, -13,   4,  -5,  -6,  11, -25,  12,
1077      16,  31,  28, -36, -53, -13,   6,  16,  42, -24,
1078      17,   1,  18, -10,   4, -13,  15, -18,  -5,  -7,
1079     }, {
1080      29, -25, -22,  -2,   6,  67,  11, -49,   1,  10,
1081      24,  -5,  -3,  13,  -4,   5,   6, -11,  25, -12,
1082     -16, -31, -28,  36,  53,  13,  -6, -16, -42,  24,
1083     -17,  -1, -18,  10,  -4,  13, -15,  18,   5,   7,
1084     }, {
1085     -39,  -4,   0,  35,  27,  53,   6, -44, -33, -18,
1086       5,   2, -11,  31,   9,  22,  -6, -15,  36, -13,
1087     -25, -46, -23,  20,  37,  24, -23,  19, -43,  29,
1088     -38,  14,   0,  26, -12,  10, -38,  16,   0,   0,
1089     }, {
1090     -10, -18, -10, -15,  21,  41,   6, -56, -19,  13,
1091       9,  33,   9,   6, -20,  -1,  11, -13,  24,  13,
1092      23, -32,  -6,  22,  26,  15,   0,  -8, -12,  37,
1093      -1,   2, -28, -27,   5,  37,   7,  35,  -8,  21,
1094     }, {
1095     -79,   2,  12,  22,  42,  28,   1, -51, -54, -15,
1096      -8,  41,   0,  24,  -6,  15,  -1, -17,  36,  12,
1097      14, -47,   0,   6,  11,  26, -16,  27, -13,  43,
1098     -22,  18, -10, -12,  -2,  34, -15,  33, -13,  13,
1099     }, {
1100     -15, -13, -13,  -1,  26,  14,   9, -41,  -1,  16,
1101      46, -27, -18,  -1,  -4,  16,  11, -43,   8, -45,
1102       0, -11, -21,  29,  30,   8, -19, -42, -41,  28,
1103       0,  20, -20, -11, -30, -10,   4,   5,  32,  28,
1104     }, {
1105     -84,   6,   9,  36,  47,   1,   4, -36, -36, -12,
1106      27, -20, -26,  17,   9,  33,  -1, -47,  19, -46,
1107      -9, -27, -15,  13,  15,  18, -35,  -6, -42,  33,
1108     -20,  36,  -1,   4, -38, -14, -18,   2,  27,  20,
1109     }, {
1110     -55,  -6,  -1, -14,  41, -10,   4, -48, -22,  20,
1111      31,  10,  -5,  -7, -20,   9,  16, -45,   8, -19,
1112      40, -12,   1,  15,   4,  10, -12, -34, -11,  41,
1113      16,  24, -30, -49, -20,  13,  28,  22,  18,  43,
1114     }, {
1115    -124,  13,  21,  23,  62, -23,   0, -43, -57,  -8,
1116      13,  18, -14,  10,  -6,  26,   3, -49,  19, -19,
1117      31, -27,   7,   0, -11,  20, -29,   1, -12,  47,
1118      -4,  39, -11, -34, -28,   9,   5,  19,  13,  34,
1119     }, {
1120      34, -14,  -4,  17,  -5,  24,  26, -20,  27,  45,
1121      12, -24,   2, -13,  21,   8,  22,  16,  32,   2,
1122     -34, -31, -20,   7,  58,  -5,   5,  -2, -38,  12,
1123      -2,   1,  -1,  26,  -5,  23,  21,   6,  -8, -11,
1124     }, {
1125     -34,   6,  18,  55,  15,  11,  21, -16,  -8,  16,
1126      -6, -16,  -5,   4,  35,  24,  10,  12,  43,   1,
1127     -43, -47, -14,  -8,  43,   5, -10,  34, -39,  18,
1128     -22,  16,  17,  42, -13,  19,  -1,   3, -14, -20,
1129     }, {
1130      -5,  -7,   7,   4,   9,   0,  21, -28,   6,  48,
1131      -2,  14,  15, -20,   5,   0,  27,  14,  32,  28,
1132       5, -32,   2,  -6,  32,  -3,  12,   5,  -8,  25,
1133      14,   4, -12, -11,   4,  47,  45,  22, -22,   2,
1134     }, {
1135     -74,  12,  30,  42,  30, -14,  16, -23, -29,  19,
1136     -20,  21,   7,  -1,  19,  17,  14,  10,  43,  27,
1137      -3, -48,   8, -22,  16,   7,  -4,  42,  -9,  31,
1138      -6,  20,   6,   4,  -3,  43,  22,  20, -28,  -5,
1139     }, {
1140     -10,  -3,   4,  18,  15, -27,  24, -13,  24,  51,
1141      34, -47, -12, -28,  21,  19,  27, -16,  15, -30,
1142     -17, -12, -12,   0,  36, -10,  -7, -27, -37,  16,
1143      15,  22,  -3,   4, -31,  -1,  42,  -7,  18,   9,
1144     }, {
1145     -79,  17,  27,  56,  36, -41,  19,  -8, -10,  22,
1146      15, -39, -20,  -9,  35,  35,  15, -20,  26, -31,
1147     -26, -27,  -6, -15,  20,   0, -23,   8, -38,  22,
1148      -5,  38,  15,  20, -39,  -4,  18,  -9,  13,   1,
1149     }, {
1150     -50,   3,  16,   5,  30, -53,  19, -20,   3,  55,
1151      19,  -8,   0, -34,   5,  11,  32, -18,  15,  -4,
1152      22, -13,  10, -13,   9,  -8,   0, -19,  -7,  29,
1153      31,  26, -13, -33, -21,  22,  65,   9,   4,  23,
1154     }, {
1155    -119,  24,  39,  44,  51, -66,  14, -15, -31,  26,
1156       1,   0,  -7, -16,  19,  28,  19, -22,  26,  -4,
1157      13, -28,  16, -29,  -5,   1, -16,  16,  -8,  35,
1158      10,  42,   4, -17, -29,  19,  42,   7,   0,  15,
1159     }, {
1160      31, -28,   6, -16, -16,  50, -31, -14,   0,   6,
1161      36,  17,   0,   0, -29, -14,  11,  18,  20, -25,
1162      -6, -33, -19,  20,  43,  21,  21, -14, -55,   0,
1163     -32, -40, -42,  39,   1,  -8, -14,   8,  -6,  -3,
1164     }, {
1165     -37,  -8,  29,  22,   4,  37, -36,  -9, -34, -22,
1166      17,  24,  -8,  18, -15,   2,  -1,  14,  31, -25,
1167     -15, -48, -13,   4,  28,  31,   5,  21, -57,   4,
1168     -53, -24, -23,  55,  -6, -12, -37,   6, -11, -11,
1169     }, {
1170      -7, -22,  18, -29,  -1,  25, -36, -21, -20,   9,
1171      22,  56,  11,  -6, -45, -21,  15,  16,  20,   1,
1172      33, -34,   2,   6,  17,  23,  28,  -6, -25,  12,
1173     -16, -37, -53,   1,  11,  15,   8,  25, -20,  11,
1174     }, {
1175     -76,  -1,  41,   9,  19,  12, -41, -17, -55, -18,
1176       3,  63,   3,  12, -30,  -5,   3,  12,  31,   0,
1177      24, -49,   8,  -9,   1,  33,  12,  29, -27,  18,
1178     -37, -21, -34,  17,   3,  11, -14,  23, -25,   2,
1179     }, {
1180     -13, -17,  15, -15,   3,  -1, -33,  -7,  -1,  12,
1181      58,  -5, -15, -13, -29,  -3,  16, -13,   4, -57,
1182      10, -13, -11,  13,  21,  15,   9, -40, -55,   3,
1183     -14, -19, -44,  17, -24, -32,   5,  -4,  21,  18,
1184     }, {
1185     -82,   3,  38,  23,  24, -15, -38,  -2, -37, -15,
1186      39,   2, -23,   4, -15,  12,   3, -17,  15, -58,
1187       1, -29,  -6,  -2,   5,  26,  -7,  -4, -56,   9,
1188     -35,  -3, -25,  33, -32, -36, -17,  -7,  15,   9,
1189     }, {
1190     -52, -10,  27, -27,  18, -26, -38, -14, -23,  16,
1191      44,  33,  -3, -20, -45, -10,  20, -15,   3, -31,
1192      50, -14,  10,   0,  -5,  17,  15, -32, -24,  16,
1193       1, -15, -55, -20, -14,  -8,  29,  12,   7,  32,
1194     }, {
1195    -121,   9,  50,  10,  40, -40, -43,  -9, -58, -12,
1196      25,  41, -11,  -2, -31,   5,   8, -19,  15, -32,
1197      41, -30,  16, -16, -20,  28,   0,   3, -26,  22,
1198     -19,   0, -36,  -4, -22, -12,   6,   9,   1,  24,
1199     }, {
1200      36, -18,  24,   3, -28,   7, -16,  13,  26,  41,
1201      24,  -1,   5, -26,  -3, -12,  27,  46,  27, -10,
1202     -24, -34, -10,  -8,  49,   2,  34,   0, -51, -12,
1203     -17, -38, -25,  56,   0,   0,  22,  -3, -20, -22,
1204     }, {
1205     -32,   2,  47,  42,  -7,  -5, -21,  18,  -9,  12,
1206       5,   5,  -2,  -8,  10,   4,  14,  42,  38, -10,
1207     -33, -49,  -5, -24,  33,  12,  17,  35, -52,  -6,
1208     -38, -22,  -7,  72,  -7,  -3,   0,  -6, -25, -30,
1209     }, {
1210      -2, -11,  36,  -9, -13, -17, -21,   6,   5,  45,
1211      10,  36,  18, -33, -19, -19,  31,  44,  27,  15,
1212      16, -34,  11, -22,  22,   4,  40,   7, -21,   0,
1213      -1, -35, -36,  18,  10,  24,  46,  12, -34,  -8,
1214     }, {
1215     -71,   9,  59,  29,   8, -30, -26,  11, -30,  16,
1216      -8,  44,   9, -14,  -5,  -2,  19,  40,  38,  15,
1217       7, -50,  17, -38,   7,  14,  24,  43, -22,   6,
1218     -22, -19, -17,  34,   2,  20,  23,  10, -39, -16,
1219     }, {
1220      -8,  -6,  33,   4,  -7, -44, -18,  21,  23,  48,
1221      46, -24,  -9, -40,  -3,  -1,  32,  13,  11, -43,
1222      -7, -14,  -3, -15,  26,  -3,  21, -26, -50,  -8,
1223       0, -16, -27,  34, -25, -23,  43, -17,   6,  -1,
1224     }, {
1225     -77,  13,  56,  43,  13, -57, -23,  26, -11,  19,
1226      27, -16, -17, -22,  10,  15,  19,  10,  22, -43,
1227     -16, -30,   2, -31,  11,   6,   5,   9, -52,  -2,
1228     -20,   0,  -8,  50, -33, -27,  19, -19,   1,  -9,
1229     }, {
1230     -47,   0,  45,  -7,   7, -69, -23,  13,   2,  51,
1231      32,  14,   3, -47, -19,  -8,  37,  11,  10, -16,
1232      32, -15,  19, -29,   0,  -1,  28, -18, -20,   4,
1233      16, -13, -38,  -3, -15,   0,  66,   0,  -7,  13,
1234     }, {
1235    -116,  20,  68,  30,  28, -83, -28,  18, -32,  22,
1236      13,  21,  -5, -28,  -5,   7,  24,   8,  22, -17,
1237      23, -30,  25, -45, -15,   9,  11,  18, -22,  10,
1238      -4,   2, -19,  12, -23,  -3,  43,  -2, -12,   4,
1239     }, {
1240      72, -13, -29, -18,   4,  90,  37, -34,   4,  -1,
1241      13,  -9,  -6,  11,   2,  24, -13,   3,  -7, -11,
1242      -4,   4, -42,  25,  31,  -1,  -8, -29,  -6,  17,
1243     -19,   2, -10,  -6,  38,  22, -42, -19,  -6, -11,
1244     }, {
1245       3,   7,  -6,  20,  25,  77,  32, -29, -31, -30,
1246      -4,  -2, -14,  29,  16,  40, -26,   0,   3, -12,
1247     -13, -10, -36,   9,  15,   8, -24,   6,  -7,  22,
1248     -40,  17,   8,   9,  31,  18, -66, -22, -11, -19,
1249     }, {
1250      32,  -6, -17, -31,  19,  65,  33, -41, -16,   1,
1251       0,  29,   6,   4, -13,  17,  -9,   1,  -8,  14,
1252      35,   3, -19,  11,   4,   0,  -1, -21,  23,  30,
1253      -3,   5, -20, -44,  48,  46, -19,  -3, -20,   3,
1254     }, {
1255     -36,  13,   5,   7,  40,  51,  28, -36, -52, -27,
1256     -18,  36,  -2,  22,   0,  33, -21,  -2,   3,  13,
1257      26, -11, -14,  -4, -10,  10, -18,  14,  22,  36,
1258     -24,  21,  -1, -28,  40,  42, -42,  -5, -25,  -5,
1259     }, {
1260      27,  -1, -20, -17,  24,  38,  35, -26,   1,   4,
1261      35, -32, -21,  -3,   2,  35,  -8, -29, -24, -44,
1262      12,  24, -34,  18,   8,  -7, -21, -55,  -5,  21,
1263      -2,  23, -11, -28,  13,  -1, -22, -33,  21,  10,
1264     }, {
1265     -41,  18,   2,  21,  45,  24,  30, -21, -33, -24,
1266      17, -24, -29,  15,  16,  51, -21, -33, -13, -45,
1267       3,   8, -28,   2,  -7,   2, -37, -19,  -7,  27,
1268     -22,  39,   7, -12,   5,  -5, -45, -35,  15,   1,
1269     }, {
1270     -12,   4,  -8, -29,  39,  12,  30, -33, -19,   8,
1271      21,   6,  -8,  -9, -13,  28,  -4, -31, -24, -18,
1272      52,  23, -12,   4, -18,  -5, -14, -47,  24,  34,
1273      14,  27, -22, -66,  22,  22,   1, -16,   6,  24,
1274     }, {
1275     -81,  25,  14,   8,  61,   0,  25, -28, -54, -20,
1276       3,  14, -17,   8,   0,  44, -16, -35, -13, -18,
1277      43,   7,  -6, -11, -33,   4, -30, -11,  22,  40,
1278      -6,  43,  -3, -50,  14,  18, -22, -18,   1,  16,
1279     }, {
1280      77,  -2, -11,   1,  -7,  47,  52,  -5,  29,  33,
1281       1, -28,   0, -15,  28,  26,   2,  30,   0,   2,
1282     -22,   4, -33,  -3,  36, -21,   3, -15,  -2,   5,
1283      -4,   4,   6,   9,  37,  31,  -5, -32, -20, -30,
1284     }, {
1285       8,  17,  10,  40,  13,  34,  47,   0,  -5,   4,
1286     -16, -21,  -8,   2,  42,  43, -10,  26,  10,   2,
1287     -31, -11, -27, -19,  21, -10, -12,  20,  -3,  11,
1288     -25,  20,  25,  25,  29,  28, -28, -34, -25, -38,
1289     }, {
1290      37,   3,   0, -10,   7,  22,  48, -12,   8,  36,
1291     -12,   9,  12, -22,  12,  19,   6,  28,   0,  29,
1292      18,   3, -11, -17,  10, -18,  10,  -7,  27,  18,
1293      11,   7,  -3, -28,  47,  55,  18, -15, -34, -16,
1294     }, {
1295     -31,  24,  23,  27,  29,   9,  43,  -8, -26,   7,
1296     -30,  17,   4,  -3,  26,  35,  -5,  24,  10,  28,
1297       9, -12,  -5, -33,  -5,  -8,  -5,  29,  26,  24,
1298      -9,  23,  14, -12,  39,  52,  -5, -18, -39, -24,
1299     }, {
1300      32,   8,  -3,   2,  13,  -4,  50,   1,  27,  39,
1301      23, -51, -15, -30,  27,  37,   7,  -1, -17, -29,
1302      -5,  23, -25, -10,  14, -26,  -8, -41,  -1,   9,
1303      13,  26,   5, -12,  12,   7,  14, -45,   6,  -9,
1304     }, {
1305     -36,  29,  19,  41,  34, -18,  45,   6,  -8,  10,
1306       5, -43, -23, -11,  42,  53,  -5,  -5,  -6, -30,
1307     -14,   8, -20, -26,  -1, -16, -25,  -4,  -3,  15,
1308      -7,  41,  23,   3,   4,   3,  -8, -48,   1, -17,
1309     }, {
1310      -7,  15,   9,  -9,  28, -29,  45,  -5,   6,  43,
1311       9, -12,  -2, -36,  12,  30,  11,  -3, -17,  -3,
1312      34,  22,  -3, -24, -12, -24,  -2, -32,  28,  22,
1313      29,  29,  -5, -50,  21,  31,  38, -29,  -7,   5,
1314     }, {
1315     -76,  35,  31,  28,  49, -43,  40,   0, -29,  14,
1316      -8,  -5, -10, -18,  26,  46,   0,  -7,  -6,  -3,
1317      25,   7,   2, -40, -28, -14, -18,   3,  27,  28,
1318       8,  45,  13, -34,  13,  27,  15, -31, -12,  -3,
1319     }, {
1320      74, -17,   0, -31, -18,  73,  -5,   0,   3,  -5,
1321      25,  12,  -3,  -1, -22,   3,  -9,  33, -12, -24,
1322       6,   2, -33,   9,  21,   5,  20, -27, -19,  -7,
1323     -34, -37, -34,  22,  44,   0, -41, -29, -17, -21,
1324     }, {
1325       5,   3,  21,   7,   2,  60, -10,   5, -32, -34,
1326       7,  20, -11,  16,  -8,  20, -21,  29,  -1, -24,
1327      -2, -13, -27,  -6,   5,  15,   3,   8, -21,  -1,
1328     -55, -21, -15,  38,  37,  -3, -65, -32, -23, -30,
1329     }, {
1330      35, -10,  11, -44,  -3,  48, -10,  -6, -17,  -2,
1331      11,  51,   8,  -8, -38,  -3,  -4,  31, -12,   2,
1332      46,   1, -10,  -4,  -5,   7,  26, -19,  10,   5,
1333     -18, -34, -45, -15,  54,  24, -18, -13, -31,  -7,
1334     }, {
1335     -33,  10,  34,  -5,  17,  35, -15,  -1, -53, -30,
1336      -6,  59,   0,  10, -24,  13, -17,  27,  -1,   1,
1337      37, -13,  -4, -20, -20,  18,  10,  16,   8,  11,
1338     -39, -18, -26,   0,  46,  20, -41, -15, -37, -15,
1339     }, {
1340      29,  -5,   7, -30,   1,  21,  -7,   7,   0,   0,
1341      47,  -9, -18, -15, -22,  14,  -4,   0, -28, -57,
1342      23,  21, -25,   2,  -1,   0,   7, -53, -19,  -3,
1343     -17, -15, -36,   0,  19, -24, -21, -43,   9,   0,
1344     }, {
1345     -39,  14,  30,   8,  22,   8, -12,  12, -34, -27,
1346      29,  -2, -26,   2,  -8,  31, -16,  -3, -17, -57,
1347      14,   6, -19, -13, -16,  10,  -8, -17, -20,   2,
1348     -38,   0, -17,  16,  11, -27, -44, -45,   4,  -8,
1349     }, {
1350      -9,   1,  20, -43,  17,  -3, -12,   0, -20,   4,
1351      33,  29,  -6, -22, -38,   7,   0,  -1, -29, -30,
1352      63,  21,  -3, -11, -27,   1,  14, -45,  10,   9,
1353      -1, -12, -47, -37,  28,   0,   2, -26,  -4,  13,
1354     }, {
1355     -78,  21,  43,  -4,  38, -17, -17,   5, -55, -24,
1356      15,  36, -14,  -4, -24,  24, -12,  -5, -17, -31,
1357      54,   5,   2, -27, -43,  12,  -2,  -9,   9,  15,
1358     -22,   3, -28, -21,  20,  -3, -20, -28,  -9,   5,
1359     }, {
1360      80,  -6,  16, -11, -30,  30,   9,  28,  28,  29,
1361      13,  -6,   2, -28,   3,   5,   7,  60,  -5,  -9,
1362     -11,   1, -24, -19,  27, -13,  32, -13, -15, -19,
1363     -19, -35, -17,  39,  43,   9,  -4, -42, -32, -41,
1364     }, {
1365      11,  14,  39,  27,  -9,  17,   4,  33,  -6,   0,
1366      -4,   1,  -5, -10,  17,  22,  -5,  57,   5,  -9,
1367     -20, -13, -18, -35,  11,  -3,  16,  22, -17, -13,
1368     -40, -19,   1,  55,  35,   5, -27, -44, -37, -49,
1369     }, {
1370      40,   0,  28, -24, -14,   5,   4,  21,   7,  33,
1371       0,  32,  15, -35, -12,  -1,  11,  58,  -5,  16,
1372      28,   0,  -1, -33,   0, -11,  39,  -5,  14,  -6,
1373      -3, -31, -28,   1,  53,  33,  19, -25, -46, -26,
1374     }, {
1375     -28,  20,  51,  14,   6,  -7,   0,  26, -27,   4,
1376     -18,  40,   6, -16,   1,  15,   0,  55,   5,  16,
1377      19, -14,   3, -49, -14,  -1,  22,  30,  12,   0,
1378     -24, -15,  -9,  17,  45,  29,  -4, -28, -51, -35,
1379     }, {
1380      34,   4,  25, -10,  -9, -21,   7,  36,  26,  36,
1381      35, -28, -12, -42,   3,  16,  12,  28, -21, -42,
1382       5,  21, -16, -26,   4, -19,  19, -39, -15, -15,
1383      -1, -13, -19,  17,  17, -14,  15, -55,  -4, -19,
1384     }, {
1385     -34,  25,  48,  28,  11, -34,   2,  41,  -9,   7,
1386      17, -21, -20, -24,  17,  33,   0,  24, -10, -42,
1387      -3,   5, -10, -42, -11,  -8,   3,  -3, -16,  -9,
1388     -22,   2,   0,  33,  10, -18,  -7, -58, -10, -28,
1389     }, {
1390      -4,  11,  37, -23,   5, -46,   2,  29,   5,  39,
1391      21,   9,   0, -49, -12,   9,  16,  26, -22, -15,
1392      45,  20,   5, -40, -22, -17,  26, -31,  14,  -2,
1393      14, -10, -30, -20,  27,   9,  39, -39, -18,  -5,
1394     }, {
1395     -73,  32,  60,  15,  26, -59,  -2,  33, -30,  10,
1396       3,  17,  -8, -30,   1,  26,   4,  22, -10, -16,
1397      36,   5,  11, -56, -37,  -6,  10,   5,  13,   3,
1398      -6,   5, -11,  -4,  19,   5,  16, -41, -24, -13
1399     }
1400 };
1401
1402 const uint16_t ff_cb1_base[128]={
1403     19657, 18474, 18365, 17520, 21048, 18231, 18584, 16671,
1404     20363, 19069, 19409, 18430, 21844, 18753, 19613, 17411,
1405     20389, 21772, 20129, 21702, 20978, 20472, 19627, 19387,
1406     21477, 23134, 21841, 23919, 22089, 21519, 21134, 20852,
1407     19675, 17821, 19044, 17477, 19986, 16955, 18446, 16086,
1408     21138, 18899, 20952, 18929, 21452, 17833, 20104, 17159,
1409     19770, 20056, 20336, 20866, 19329, 18217, 18908, 18004,
1410     21556, 21948, 23079, 23889, 20922, 19544, 20984, 19781,
1411     19781, 20984, 19544, 20922, 23889, 23079, 21948, 21556,
1412     18004, 18908, 18217, 19329, 20866, 20336, 20056, 19770,
1413     17159, 20104, 17833, 21452, 18929, 20952, 18899, 21138,
1414     16086, 18446, 16955, 19986, 17477, 19044, 17821, 19675,
1415     20852, 21134, 21519, 22089, 23919, 21841, 23134, 21477,
1416     19387, 19627, 20472, 20978, 21702, 20129, 21772, 20389,
1417     17411, 19613, 18753, 21844, 18430, 19409, 19069, 20363,
1418     16671, 18584, 18231, 21048, 17520, 18365, 18474, 19657,
1419 };
1420
1421 const uint16_t ff_cb2_base[128]={
1422     12174, 13380, 13879, 13832, 13170, 13227, 13204, 12053,
1423     12410, 13988, 14348, 14631, 13100, 13415, 13224, 12268,
1424     11982, 13825, 13499, 14210, 13877, 14788, 13811, 13109,
1425     11449, 13275, 12833, 13717, 12728, 13696, 12759, 12405,
1426     10230, 12185, 11628, 13161, 11762, 13458, 12312, 12818,
1427     10443, 12773, 12011, 14020, 11818, 13825, 12453, 13226,
1428     10446, 13162, 11881, 14300, 12859, 16288, 13490, 15053,
1429     10155, 12820, 11519, 13973, 12041, 15081, 12635, 14198,
1430     14198, 12635, 15081, 12041, 13973, 11519, 12820, 10155,
1431     15053, 13490, 16288, 12859, 14300, 11881, 13162, 10446,
1432     13226, 12453, 13825, 11818, 14020, 12011, 12773, 10443,
1433     12818, 12312, 13458, 11762, 13161, 11628, 12185, 10230,
1434     12405, 12759, 13696, 12728, 13717, 12833, 13275, 11449,
1435     13109, 13811, 14788, 13877, 14210, 13499, 13825, 11982,
1436     12268, 13224, 13415, 13100, 14631, 14348, 13988, 12410,
1437     12053, 13204, 13227, 13170, 13832, 13879, 13380, 12174,
1438 };
1439
1440 const int16_t ff_energy_tab[32]={
1441         0,    16,    20,    25,    32,    41,    51,    65,
1442        81,   103,   129,   163,   205,   259,   326,   410,
1443       516,   650,   819,  1031,  1298,  1634,  2057,  2590,
1444      3261,  4105,  5168,  6507,  8192, 10313, 12983, 16345
1445 };
1446
1447 static const int16_t lpc_refl_cb1[64]={
1448     -4041, -4018, -3998, -3977, -3954, -3930, -3906, -3879,
1449     -3852, -3825, -3795, -3764, -3731, -3699, -3666, -3631,
1450     -3594, -3555, -3513, -3468, -3420, -3372, -3321, -3268,
1451     -3212, -3153, -3090, -3021, -2944, -2863, -2772, -2676,
1452     -2565, -2445, -2328, -2202, -2072, -1941, -1808, -1660,
1453     -1508, -1348, -1185,  -994,  -798,  -600,  -374,  -110,
1454       152,   447,   720,   982,  1229,  1456,  1682,  1916,
1455      2130,  2353,  2595,  2853,  3118,  3363,  3588,  3814
1456 };
1457
1458 static const int16_t lpc_refl_cb2[32]={
1459     -3091, -2386, -1871, -1425, -1021,  -649,  -316,   -20,
1460       267,   544,   810,  1065,  1305,  1534,  1756,  1970,
1461      2171,  2359,  2536,  2700,  2854,  2996,  3133,  3263,
1462      3386,  3499,  3603,  3701,  3789,  3870,  3947,  4020
1463 };
1464
1465 static const int16_t lpc_refl_cb3[32]={
1466     -3525, -3295, -3081, -2890, -2696, -2511, -2328, -2149,
1467     -1979, -1817, -1658, -1498, -1341, -1188, -1032,  -876,
1468      -721,  -561,  -394,  -228,   -54,   119,   296,   484,
1469       683,   895,  1123,  1373,  1651,  1965,  2360,  2854
1470 };
1471
1472 static const int16_t lpc_refl_cb4[16]={
1473     -1845, -1057,  -522,   -77,   301,   647,   975,  1285,
1474      1582,  1873,  2163,  2452,  2735,  3017,  3299,  3569
1475 };
1476
1477 static const int16_t lpc_refl_cb5[16]={
1478     -2691, -2187, -1788, -1435, -1118,  -837,  -571,  -316,
1479       -59,   201,   470,   759,  1077,  1457,  1908,  2495
1480 };
1481
1482 static const int16_t lpc_refl_cb6[8]={
1483     -1372,  -474,   133,   632,  1100,  1571,  2075,  2672
1484 };
1485
1486 static const int16_t lpc_refl_cb7[8]={
1487     -2389, -1787, -1231,  -717,  -239,   234,   770,  1474
1488 };
1489
1490 static const int16_t lpc_refl_cb8[8]={
1491     -1569,  -864,  -296,   200,   670,  1151,  1709,  2385
1492 };
1493
1494 static const int16_t lpc_refl_cb9[8]={
1495     -2200, -1608, -1062,  -569,  -120,   338,   863,  1621
1496 };
1497
1498 static const int16_t lpc_refl_cb10[4]={
1499      -617,   190,   802,  1483
1500 };
1501
1502 const int16_t * const ff_lpc_refl_cb[10]={
1503     lpc_refl_cb1, lpc_refl_cb2, lpc_refl_cb3, lpc_refl_cb4, lpc_refl_cb5,
1504     lpc_refl_cb6, lpc_refl_cb7, lpc_refl_cb8, lpc_refl_cb9, lpc_refl_cb10
1505 };
1506
1507 static void add_wav(int16_t *dest, int n, int skip_first, int *m,
1508                     const int16_t *s1, const int8_t *s2, const int8_t *s3)
1509 {
1510     int i;
1511     int v[3];
1512
1513     v[0] = 0;
1514     for (i=!skip_first; i<3; i++)
1515         v[i] = (ff_gain_val_tab[n][i] * m[i]) >> ff_gain_exp_tab[n];
1516
1517     if (v[0]) {
1518         for (i=0; i < BLOCKSIZE; i++)
1519             dest[i] = (s1[i]*v[0] + s2[i]*v[1] + s3[i]*v[2]) >> 12;
1520     } else {
1521         for (i=0; i < BLOCKSIZE; i++)
1522             dest[i] = (             s2[i]*v[1] + s3[i]*v[2]) >> 12;
1523     }
1524 }
1525
1526 /**
1527  * Copy the last offset values of *source to *target. If those values are not
1528  * enough to fill the target buffer, fill it with another copy of those values.
1529  */
1530 void ff_copy_and_dup(int16_t *target, const int16_t *source, int offset)
1531 {
1532     source += BUFFERSIZE - offset;
1533
1534     memcpy(target, source, FFMIN(BLOCKSIZE, offset)*sizeof(*target));
1535     if (offset < BLOCKSIZE)
1536         memcpy(target + offset, source, (BLOCKSIZE - offset)*sizeof(*target));
1537 }
1538
1539 /**
1540  * Evaluate the reflection coefficients from the filter coefficients.
1541  *
1542  * @return 1 if one of the reflection coefficients is greater than
1543  *         4095, 0 if not.
1544  */
1545 int ff_eval_refl(int *refl, const int16_t *coefs, AVCodecContext *avctx)
1546 {
1547     int b, i, j;
1548     int buffer1[LPC_ORDER];
1549     int buffer2[LPC_ORDER];
1550     int *bp1 = buffer1;
1551     int *bp2 = buffer2;
1552
1553     for (i=0; i < LPC_ORDER; i++)
1554         buffer2[i] = coefs[i];
1555
1556     refl[LPC_ORDER-1] = bp2[LPC_ORDER-1];
1557
1558     if ((unsigned) bp2[LPC_ORDER-1] + 0x1000 > 0x1fff) {
1559         av_log(avctx, AV_LOG_ERROR, "Overflow. Broken sample?\n");
1560         return 1;
1561     }
1562
1563     for (i = LPC_ORDER-2; i >= 0; i--) {
1564         b = 0x1000-((bp2[i+1] * bp2[i+1]) >> 12);
1565
1566         if (!b)
1567             b = -2;
1568
1569         b = 0x1000000 / b;
1570         for (j=0; j <= i; j++) {
1571 #if CONFIG_FTRAPV
1572             int a = bp2[j] - ((refl[i+1] * bp2[i-j]) >> 12);
1573             if((int)(a*(unsigned)b) != a*(int64_t)b)
1574                 return 1;
1575 #endif
1576             bp1[j] = ((bp2[j] - ((refl[i+1] * bp2[i-j]) >> 12)) * b) >> 12;
1577         }
1578
1579         if ((unsigned) bp1[i] + 0x1000 > 0x1fff)
1580             return 1;
1581
1582         refl[i] = bp1[i];
1583
1584         FFSWAP(int *, bp1, bp2);
1585     }
1586     return 0;
1587 }
1588
1589 /**
1590  * Evaluate the LPC filter coefficients from the reflection coefficients.
1591  * Does the inverse of the ff_eval_refl() function.
1592  */
1593 void ff_eval_coefs(int *coefs, const int *refl)
1594 {
1595     int buffer[LPC_ORDER];
1596     int *b1 = buffer;
1597     int *b2 = coefs;
1598     int i, j;
1599
1600     for (i=0; i < LPC_ORDER; i++) {
1601         b1[i] = refl[i] << 4;
1602
1603         for (j=0; j < i; j++)
1604             b1[j] = ((refl[i] * b2[i-j-1]) >> 12) + b2[j];
1605
1606         FFSWAP(int *, b1, b2);
1607     }
1608
1609     for (i=0; i < LPC_ORDER; i++)
1610         coefs[i] >>= 4;
1611 }
1612
1613 void ff_int_to_int16(int16_t *out, const int *inp)
1614 {
1615     int i;
1616
1617     for (i = 0; i < LPC_ORDER; i++)
1618         *out++ = *inp++;
1619 }
1620
1621 /**
1622  * Evaluate sqrt(x << 24). x must fit in 20 bits. This value is evaluated in an
1623  * odd way to make the output identical to the binary decoder.
1624  */
1625 int ff_t_sqrt(unsigned int x)
1626 {
1627     int s = 2;
1628     while (x > 0xfff) {
1629         s++;
1630         x >>= 2;
1631     }
1632
1633     return ff_sqrt(x << 20) << s;
1634 }
1635
1636 unsigned int ff_rms(const int *data)
1637 {
1638     int i;
1639     unsigned int res = 0x10000;
1640     int b = LPC_ORDER;
1641
1642     for (i = 0; i < LPC_ORDER; i++) {
1643         res = (((0x1000000 - data[i]*data[i]) >> 12) * res) >> 12;
1644
1645         if (res == 0)
1646             return 0;
1647
1648         while (res <= 0x3fff) {
1649             b++;
1650             res <<= 2;
1651         }
1652     }
1653
1654     return ff_t_sqrt(res) >> b;
1655 }
1656
1657 int ff_interp(RA144Context *ractx, int16_t *out, int a, int copyold, int energy)
1658 {
1659     int work[LPC_ORDER];
1660     int b = NBLOCKS - a;
1661     int i;
1662
1663     // Interpolate block coefficients from the this frame's forth block and
1664     // last frame's forth block.
1665     for (i = 0; i < LPC_ORDER; i++)
1666         out[i] = (a * ractx->lpc_coef[0][i] + b * ractx->lpc_coef[1][i])>> 2;
1667
1668     if (ff_eval_refl(work, out, ractx->avctx)) {
1669         // The interpolated coefficients are unstable, copy either new or old
1670         // coefficients.
1671         ff_int_to_int16(out, ractx->lpc_coef[copyold]);
1672         return ff_rescale_rms(ractx->lpc_refl_rms[copyold], energy);
1673     } else {
1674         return ff_rescale_rms(ff_rms(work), energy);
1675     }
1676 }
1677
1678 unsigned int ff_rescale_rms(unsigned int rms, unsigned int energy)
1679 {
1680     return (rms * energy) >> 10;
1681 }
1682
1683 /** inverse root mean square */
1684 int ff_irms(const int16_t *data)
1685 {
1686     unsigned int i, sum = 0;
1687
1688     for (i=0; i < BLOCKSIZE; i++)
1689         sum += data[i] * data[i];
1690
1691     if (sum == 0)
1692         return 0; /* OOPS - division by zero */
1693
1694     return 0x20000000 / (ff_t_sqrt(sum) >> 8);
1695 }
1696
1697 void ff_subblock_synthesis(RA144Context *ractx, const int16_t *lpc_coefs,
1698                            int cba_idx, int cb1_idx, int cb2_idx,
1699                            int gval, int gain)
1700 {
1701     int16_t buffer_a[BLOCKSIZE];
1702     int16_t *block;
1703     int m[3];
1704
1705     if (cba_idx) {
1706         cba_idx += BLOCKSIZE/2 - 1;
1707         ff_copy_and_dup(buffer_a, ractx->adapt_cb, cba_idx);
1708         m[0] = (ff_irms(buffer_a) * gval) >> 12;
1709     } else {
1710         m[0] = 0;
1711     }
1712     m[1] = (ff_cb1_base[cb1_idx] * gval) >> 8;
1713     m[2] = (ff_cb2_base[cb2_idx] * gval) >> 8;
1714     memmove(ractx->adapt_cb, ractx->adapt_cb + BLOCKSIZE,
1715             (BUFFERSIZE - BLOCKSIZE) * sizeof(*ractx->adapt_cb));
1716
1717     block = ractx->adapt_cb + BUFFERSIZE - BLOCKSIZE;
1718
1719     add_wav(block, gain, cba_idx, m, cba_idx? buffer_a: NULL,
1720             ff_cb1_vects[cb1_idx], ff_cb2_vects[cb2_idx]);
1721
1722     memcpy(ractx->curr_sblock, ractx->curr_sblock + BLOCKSIZE,
1723            LPC_ORDER*sizeof(*ractx->curr_sblock));
1724
1725     if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + LPC_ORDER, lpc_coefs,
1726                                     block, BLOCKSIZE, LPC_ORDER, 1, 0, 0xfff))
1727         memset(ractx->curr_sblock, 0, (LPC_ORDER+BLOCKSIZE)*sizeof(*ractx->curr_sblock));
1728 }