const JP2_CHAR_CONTEXT: &[&[u8]] = &[
&[
0,
0,
0,
2,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
],
&[
2,
4,
0,
4,
0,
3,
0,
4,
0,
3,
4,
4,
4,
2,
4,
3,
3,
4,
3,
2,
3,
3,
4,
2,
3,
3,
3,
2,
4,
1,
4,
3,
3,
1,
5,
4,
3,
4,
3,
4,
3,
5,
3,
0,
3,
5,
4,
2,
0,
3,
1,
0,
3,
3,
0,
3,
3,
0,
1,
1,
0,
4,
3,
0,
3,
3,
0,
4,
0,
2,
0,
3,
5,
5,
5,
5,
4,
0,
4,
1,
0,
3,
4,
],
&[
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2,
],
&[
0,
4,
0,
5,
0,
5,
0,
4,
0,
4,
5,
4,
4,
3,
5,
3,
5,
1,
5,
3,
4,
3,
4,
4,
3,
4,
3,
3,
4,
3,
5,
4,
4,
3,
5,
5,
3,
5,
5,
5,
3,
5,
5,
3,
4,
5,
5,
3,
1,
3,
2,
0,
3,
4,
0,
4,
2,
0,
4,
2,
1,
5,
3,
2,
3,
5,
0,
4,
0,
2,
0,
5,
4,
4,
5,
4,
5,
0,
4,
0,
0,
4,
4,
],
&[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
],
&[
0,
3,
0,
4,
0,
3,
0,
3,
0,
4,
5,
4,
3,
3,
3,
3,
4,
3,
5,
4,
4,
3,
5,
4,
4,
3,
4,
3,
4,
4,
4,
4,
5,
3,
4,
4,
3,
4,
5,
5,
4,
5,
5,
1,
4,
5,
4,
3,
0,
3,
3,
1,
3,
3,
0,
4,
4,
0,
3,
3,
1,
5,
3,
3,
3,
5,
0,
4,
0,
3,
0,
4,
4,
3,
4,
3,
3,
0,
4,
1,
1,
3,
4,
],
&[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
],
&[
0,
4,
0,
3,
0,
3,
0,
4,
0,
3,
4,
4,
3,
2,
2,
1,
2,
1,
3,
1,
3,
3,
3,
3,
3,
4,
3,
1,
3,
3,
5,
3,
3,
0,
4,
3,
0,
5,
4,
3,
3,
5,
4,
4,
3,
4,
4,
5,
0,
1,
2,
0,
1,
2,
0,
2,
2,
0,
1,
0,
0,
5,
2,
2,
1,
4,
0,
3,
0,
1,
0,
4,
4,
3,
5,
4,
3,
0,
2,
1,
0,
4,
3,
],
&[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
],
&[
0,
3,
0,
5,
0,
4,
0,
2,
1,
4,
4,
2,
4,
1,
4,
2,
4,
2,
4,
3,
3,
3,
4,
3,
3,
3,
3,
1,
4,
2,
3,
3,
3,
1,
4,
4,
1,
1,
1,
4,
3,
3,
2,
0,
2,
4,
3,
2,
0,
3,
3,
0,
3,
1,
1,
0,
0,
0,
3,
3,
0,
4,
2,
2,
3,
4,
0,
4,
0,
3,
0,
4,
4,
5,
3,
4,
4,
0,
3,
0,
0,
1,
4,
],
&[
1,
4,
0,
4,
0,
4,
0,
4,
0,
3,
5,
4,
4,
3,
4,
3,
5,
4,
3,
3,
4,
3,
5,
4,
4,
4,
4,
3,
4,
2,
4,
3,
3,
1,
5,
4,
3,
2,
4,
5,
4,
5,
5,
4,
4,
5,
4,
4,
0,
3,
2,
2,
3,
3,
0,
4,
3,
1,
3,
2,
1,
4,
3,
3,
4,
5,
0,
3,
0,
2,
0,
4,
5,
5,
4,
5,
4,
0,
4,
0,
0,
5,
4,
],
&[
0,
5,
0,
5,
0,
4,
0,
3,
0,
4,
4,
3,
4,
3,
3,
3,
4,
0,
4,
4,
4,
3,
4,
3,
4,
3,
3,
1,
4,
2,
4,
3,
4,
0,
5,
4,
1,
4,
5,
4,
4,
5,
3,
2,
4,
3,
4,
3,
2,
4,
1,
3,
3,
3,
2,
3,
2,
0,
4,
3,
3,
4,
3,
3,
3,
4,
0,
4,
0,
3,
0,
4,
5,
4,
4,
4,
3,
0,
4,
1,
0,
1,
3,
],
&[
0,
3,
1,
4,
0,
3,
0,
2,
0,
3,
4,
4,
3,
1,
4,
2,
3,
3,
4,
3,
4,
3,
4,
3,
4,
4,
3,
2,
3,
1,
5,
4,
4,
1,
4,
4,
3,
5,
4,
4,
3,
5,
5,
4,
3,
4,
4,
3,
1,
2,
3,
1,
2,
2,
0,
3,
2,
0,
3,
1,
0,
5,
3,
3,
3,
4,
3,
3,
3,
3,
4,
4,
4,
4,
5,
4,
2,
0,
3,
3,
2,
4,
3,
],
&[
0,
2,
0,
3,
0,
1,
0,
1,
0,
0,
3,
2,
0,
0,
2,
0,
1,
0,
2,
1,
3,
3,
3,
1,
2,
3,
1,
0,
1,
0,
4,
2,
1,
1,
3,
3,
0,
4,
3,
3,
1,
4,
3,
3,
0,
3,
3,
2,
0,
0,
0,
0,
1,
0,
0,
2,
0,
0,
0,
0,
0,
4,
1,
0,
2,
3,
2,
2,
2,
1,
3,
3,
3,
4,
4,
3,
2,
0,
3,
1,
0,
3,
3,
],
&[
0,
4,
0,
4,
0,
3,
0,
3,
0,
4,
4,
4,
3,
3,
3,
3,
3,
3,
4,
3,
4,
2,
4,
3,
4,
3,
3,
2,
4,
3,
4,
5,
4,
1,
4,
5,
3,
5,
4,
5,
3,
5,
4,
0,
3,
5,
5,
3,
1,
3,
3,
2,
2,
3,
0,
3,
4,
1,
3,
3,
2,
4,
3,
3,
3,
4,
0,
4,
0,
3,
0,
4,
5,
4,
4,
5,
3,
0,
4,
1,
0,
3,
4,
],
&[
0,
2,
0,
3,
0,
3,
0,
0,
0,
2,
2,
2,
1,
0,
1,
0,
0,
0,
3,
0,
3,
0,
3,
0,
1,
3,
1,
0,
3,
1,
3,
3,
3,
1,
3,
3,
3,
0,
1,
3,
1,
3,
4,
0,
0,
3,
1,
1,
0,
3,
2,
0,
0,
0,
0,
1,
3,
0,
1,
0,
0,
3,
3,
2,
0,
3,
0,
0,
0,
0,
0,
3,
4,
3,
4,
3,
3,
0,
3,
0,
0,
2,
3,
],
&[
2,
3,
0,
3,
0,
2,
0,
1,
0,
3,
3,
4,
3,
1,
3,
1,
1,
1,
3,
1,
4,
3,
4,
3,
3,
3,
0,
0,
3,
1,
5,
4,
3,
1,
4,
3,
2,
5,
5,
4,
4,
4,
4,
3,
3,
4,
4,
4,
0,
2,
1,
1,
3,
2,
0,
1,
2,
0,
0,
1,
0,
4,
1,
3,
3,
3,
0,
3,
0,
1,
0,
4,
4,
4,
5,
5,
3,
0,
2,
0,
0,
4,
4,
],
&[
0,
2,
0,
1,
0,
3,
1,
3,
0,
2,
3,
3,
3,
0,
3,
1,
0,
0,
3,
0,
3,
2,
3,
1,
3,
2,
1,
1,
0,
0,
4,
2,
1,
0,
2,
3,
1,
4,
3,
2,
0,
4,
4,
3,
1,
3,
1,
3,
0,
1,
0,
0,
1,
0,
0,
0,
1,
0,
0,
0,
0,
4,
1,
1,
1,
2,
0,
3,
0,
0,
0,
3,
4,
2,
4,
3,
2,
0,
1,
0,
0,
3,
3,
],
&[
0,
1,
0,
4,
0,
5,
0,
4,
0,
2,
4,
4,
2,
3,
3,
2,
3,
3,
5,
3,
3,
3,
4,
3,
4,
2,
3,
0,
4,
3,
3,
3,
4,
1,
4,
3,
2,
1,
5,
5,
3,
4,
5,
1,
3,
5,
4,
2,
0,
3,
3,
0,
1,
3,
0,
4,
2,
0,
1,
3,
1,
4,
3,
3,
3,
3,
0,
3,
0,
1,
0,
3,
4,
4,
4,
5,
5,
0,
3,
0,
1,
4,
5,
],
&[
0,
2,
0,
3,
0,
3,
0,
0,
0,
2,
3,
1,
3,
0,
4,
0,
1,
1,
3,
0,
3,
4,
3,
2,
3,
1,
0,
3,
3,
2,
3,
1,
3,
0,
2,
3,
0,
2,
1,
4,
1,
2,
2,
0,
0,
3,
3,
0,
0,
2,
0,
0,
0,
1,
0,
0,
0,
0,
2,
2,
0,
3,
2,
1,
3,
3,
0,
2,
0,
2,
0,
0,
3,
3,
1,
2,
4,
0,
3,
0,
2,
2,
3,
],
&[
2,
4,
0,
5,
0,
4,
0,
4,
0,
2,
4,
4,
4,
3,
4,
3,
3,
3,
1,
2,
4,
3,
4,
3,
4,
4,
5,
0,
3,
3,
3,
3,
2,
0,
4,
3,
1,
4,
3,
4,
1,
4,
4,
3,
3,
4,
4,
3,
1,
2,
3,
0,
4,
2,
0,
4,
1,
0,
3,
3,
0,
4,
3,
3,
3,
4,
0,
4,
0,
2,
0,
3,
5,
3,
4,
5,
2,
0,
3,
0,
0,
4,
5,
],
&[
0,
3,
0,
4,
0,
1,
0,
1,
0,
1,
3,
2,
2,
1,
3,
0,
3,
0,
2,
0,
2,
0,
3,
0,
2,
0,
0,
0,
1,
0,
1,
1,
0,
0,
3,
1,
0,
0,
0,
4,
0,
3,
1,
0,
2,
1,
3,
0,
0,
0,
0,
0,
0,
3,
0,
0,
0,
0,
0,
0,
0,
4,
2,
2,
3,
1,
0,
3,
0,
0,
0,
1,
4,
4,
4,
3,
0,
0,
4,
0,
0,
1,
4,
],
&[
1,
4,
1,
5,
0,
3,
0,
3,
0,
4,
5,
4,
4,
3,
5,
3,
3,
4,
4,
3,
4,
1,
3,
3,
3,
3,
2,
1,
4,
1,
5,
4,
3,
1,
4,
4,
3,
5,
4,
4,
3,
5,
4,
3,
3,
4,
4,
4,
0,
3,
3,
1,
2,
3,
0,
3,
1,
0,
3,
3,
0,
5,
4,
4,
4,
4,
4,
4,
3,
3,
5,
4,
4,
3,
3,
5,
4,
0,
3,
2,
0,
4,
4,
],
&[
0,
2,
0,
3,
0,
1,
0,
0,
0,
1,
3,
3,
3,
2,
4,
1,
3,
0,
3,
1,
3,
0,
2,
2,
1,
1,
0,
0,
2,
0,
4,
3,
1,
0,
4,
3,
0,
4,
4,
4,
1,
4,
3,
1,
1,
3,
3,
1,
0,
2,
0,
0,
1,
3,
0,
0,
0,
0,
2,
0,
0,
4,
3,
2,
4,
3,
5,
4,
3,
3,
3,
4,
3,
3,
4,
3,
3,
0,
2,
1,
0,
3,
3,
],
&[
0,
2,
0,
4,
0,
3,
0,
2,
0,
2,
5,
5,
3,
4,
4,
4,
4,
1,
4,
3,
3,
0,
4,
3,
4,
3,
1,
3,
3,
2,
4,
3,
0,
3,
4,
3,
0,
3,
4,
4,
2,
4,
4,
0,
4,
5,
3,
3,
2,
2,
1,
1,
1,
2,
0,
1,
5,
0,
3,
3,
2,
4,
3,
3,
3,
4,
0,
3,
0,
2,
0,
4,
4,
3,
5,
5,
0,
0,
3,
0,
2,
3,
3,
],
&[
0,
3,
0,
4,
0,
3,
0,
1,
0,
3,
4,
3,
3,
1,
3,
3,
3,
0,
3,
1,
3,
0,
4,
3,
3,
1,
1,
0,
3,
0,
3,
3,
0,
0,
4,
4,
0,
1,
5,
4,
3,
3,
5,
0,
3,
3,
4,
3,
0,
2,
0,
1,
1,
1,
0,
1,
3,
0,
1,
2,
1,
3,
3,
2,
3,
3,
0,
3,
0,
1,
0,
1,
3,
3,
4,
4,
1,
0,
1,
2,
2,
1,
3,
],
&[
0,
1,
0,
4,
0,
4,
0,
3,
0,
1,
3,
3,
3,
2,
3,
1,
1,
0,
3,
0,
3,
3,
4,
3,
2,
4,
2,
0,
1,
0,
4,
3,
2,
0,
4,
3,
0,
5,
3,
3,
2,
4,
4,
4,
3,
3,
3,
4,
0,
1,
3,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
4,
2,
3,
3,
3,
0,
3,
0,
0,
0,
4,
4,
4,
5,
3,
2,
0,
3,
3,
0,
3,
5,
],
&[
0,
2,
0,
3,
0,
0,
0,
3,
0,
1,
3,
0,
2,
0,
0,
0,
1,
0,
3,
1,
1,
3,
3,
0,
0,
3,
0,
0,
3,
0,
2,
3,
1,
0,
3,
1,
0,
3,
3,
2,
0,
4,
2,
2,
0,
2,
0,
0,
0,
4,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2,
1,
2,
0,
1,
0,
1,
0,
0,
0,
1,
3,
1,
2,
0,
0,
0,
1,
0,
0,
1,
4,
],
&[
0,
3,
0,
3,
0,
5,
0,
1,
0,
2,
4,
3,
1,
3,
3,
2,
1,
1,
5,
2,
1,
0,
5,
1,
2,
0,
0,
0,
3,
3,
2,
2,
3,
2,
4,
3,
0,
0,
3,
3,
1,
3,
3,
0,
2,
5,
3,
4,
0,
3,
3,
0,
1,
2,
0,
2,
2,
0,
3,
2,
0,
2,
2,
3,
3,
3,
0,
2,
0,
1,
0,
3,
4,
4,
2,
5,
4,
0,
3,
0,
0,
3,
5,
],
&[
0,
3,
0,
3,
0,
3,
0,
1,
0,
3,
3,
3,
3,
0,
3,
0,
2,
0,
2,
1,
1,
0,
2,
0,
1,
0,
0,
0,
2,
1,
0,
0,
1,
0,
3,
2,
0,
0,
3,
3,
1,
2,
3,
1,
0,
3,
3,
0,
0,
1,
0,
0,
0,
0,
0,
2,
0,
0,
0,
0,
0,
2,
3,
1,
2,
3,
0,
3,
0,
1,
0,
3,
2,
1,
0,
4,
3,
0,
1,
1,
0,
3,
3,
],
&[
0,
4,
0,
5,
0,
3,
0,
3,
0,
4,
5,
5,
4,
3,
5,
3,
4,
3,
5,
3,
3,
2,
5,
3,
4,
4,
4,
3,
4,
3,
4,
5,
5,
3,
4,
4,
3,
4,
4,
5,
4,
4,
4,
3,
4,
5,
5,
4,
2,
3,
4,
2,
3,
4,
0,
3,
3,
1,
4,
3,
2,
4,
3,
3,
5,
5,
0,
3,
0,
3,
0,
5,
5,
5,
5,
4,
4,
0,
4,
0,
1,
4,
4,
],
&[
0,
4,
0,
4,
0,
3,
0,
3,
0,
3,
5,
4,
4,
2,
3,
2,
5,
1,
3,
2,
5,
1,
4,
2,
3,
2,
3,
3,
4,
3,
3,
3,
3,
2,
5,
4,
1,
3,
3,
5,
3,
4,
4,
0,
4,
4,
3,
1,
1,
3,
1,
0,
2,
3,
0,
2,
3,
0,
3,
0,
0,
4,
3,
1,
3,
4,
0,
3,
0,
2,
0,
4,
4,
4,
3,
4,
5,
0,
4,
0,
0,
3,
4,
],
&[
0,
3,
0,
3,
0,
3,
1,
2,
0,
3,
4,
4,
3,
3,
3,
0,
2,
2,
4,
3,
3,
1,
3,
3,
3,
1,
1,
0,
3,
1,
4,
3,
2,
3,
4,
4,
2,
4,
4,
4,
3,
4,
4,
3,
2,
4,
4,
3,
1,
3,
3,
1,
3,
3,
0,
4,
1,
0,
2,
2,
1,
4,
3,
2,
3,
3,
5,
4,
3,
3,
5,
4,
4,
3,
3,
0,
4,
0,
3,
2,
2,
4,
4,
],
&[
0,
2,
0,
1,
0,
0,
0,
0,
0,
1,
2,
1,
3,
0,
0,
0,
0,
0,
2,
0,
1,
2,
1,
0,
0,
1,
0,
0,
0,
0,
3,
0,
0,
1,
0,
1,
1,
3,
1,
0,
0,
0,
1,
1,
0,
1,
1,
0,
0,
0,
0,
0,
2,
0,
0,
0,
0,
0,
0,
0,
0,
1,
1,
2,
2,
0,
3,
4,
0,
0,
0,
1,
1,
0,
0,
1,
0,
0,
0,
0,
0,
1,
1,
],
&[
0,
1,
0,
0,
0,
1,
0,
0,
0,
0,
4,
0,
4,
1,
4,
0,
3,
0,
4,
0,
3,
0,
4,
0,
3,
0,
3,
0,
4,
1,
5,
1,
4,
0,
0,
3,
0,
5,
0,
5,
2,
0,
1,
0,
0,
0,
2,
1,
4,
0,
1,
3,
0,
0,
3,
0,
0,
3,
1,
1,
4,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
],
&[
1,
4,
0,
5,
0,
3,
0,
2,
0,
3,
5,
4,
4,
3,
4,
3,
5,
3,
4,
3,
3,
0,
4,
3,
3,
3,
3,
3,
3,
2,
4,
4,
3,
1,
3,
4,
4,
5,
4,
4,
3,
4,
4,
1,
3,
5,
4,
3,
3,
3,
1,
2,
2,
3,
3,
1,
3,
1,
3,
3,
3,
5,
3,
3,
4,
5,
0,
3,
0,
3,
0,
3,
4,
3,
4,
4,
3,
0,
3,
0,
2,
4,
3,
],
&[
0,
1,
0,
4,
0,
0,
0,
0,
0,
1,
4,
0,
4,
1,
4,
2,
4,
0,
3,
0,
1,
0,
1,
0,
0,
0,
0,
0,
2,
0,
3,
1,
1,
1,
0,
3,
0,
0,
0,
1,
2,
1,
0,
0,
1,
1,
1,
1,
0,
1,
0,
0,
0,
1,
0,
0,
3,
0,
0,
0,
0,
3,
2,
0,
2,
2,
0,
1,
0,
0,
0,
2,
3,
2,
3,
3,
0,
0,
0,
0,
2,
1,
0,
],
&[
0,
5,
1,
5,
0,
3,
0,
3,
0,
5,
4,
4,
5,
1,
5,
3,
3,
0,
4,
3,
4,
3,
5,
3,
4,
3,
3,
2,
4,
3,
4,
3,
3,
0,
3,
3,
1,
4,
4,
3,
4,
4,
4,
3,
4,
5,
5,
3,
2,
3,
1,
1,
3,
3,
1,
3,
1,
1,
3,
3,
2,
4,
5,
3,
3,
5,
0,
4,
0,
3,
0,
4,
4,
3,
5,
3,
3,
0,
3,
4,
0,
4,
3,
],
&[
0,
5,
0,
5,
0,
3,
0,
2,
0,
4,
4,
3,
5,
2,
4,
3,
3,
3,
4,
4,
4,
3,
5,
3,
5,
3,
3,
1,
4,
0,
4,
3,
3,
0,
3,
3,
0,
4,
4,
4,
4,
5,
4,
3,
3,
5,
5,
3,
2,
3,
1,
2,
3,
2,
0,
1,
0,
0,
3,
2,
2,
4,
4,
3,
1,
5,
0,
4,
0,
3,
0,
4,
3,
1,
3,
2,
1,
0,
3,
3,
0,
3,
3,
],
&[
0,
4,
0,
5,
0,
5,
0,
4,
0,
4,
5,
5,
5,
3,
4,
3,
3,
2,
5,
4,
4,
3,
5,
3,
5,
3,
4,
0,
4,
3,
4,
4,
3,
2,
4,
4,
3,
4,
5,
4,
4,
5,
5,
0,
3,
5,
5,
4,
1,
3,
3,
2,
3,
3,
1,
3,
1,
0,
4,
3,
1,
4,
4,
3,
4,
5,
0,
4,
0,
2,
0,
4,
3,
4,
4,
3,
3,
0,
4,
0,
0,
5,
5,
],
&[
0,
4,
0,
4,
0,
5,
0,
1,
1,
3,
3,
4,
4,
3,
4,
1,
3,
0,
5,
1,
3,
0,
3,
1,
3,
1,
1,
0,
3,
0,
3,
3,
4,
0,
4,
3,
0,
4,
4,
4,
3,
4,
4,
0,
3,
5,
4,
1,
0,
3,
0,
0,
2,
3,
0,
3,
1,
0,
3,
1,
0,
3,
2,
1,
3,
5,
0,
3,
0,
1,
0,
3,
2,
3,
3,
4,
4,
0,
2,
2,
0,
4,
4,
],
&[
2,
4,
0,
5,
0,
4,
0,
3,
0,
4,
5,
5,
4,
3,
5,
3,
5,
3,
5,
3,
5,
2,
5,
3,
4,
3,
3,
4,
3,
4,
5,
3,
2,
1,
5,
4,
3,
2,
3,
4,
5,
3,
4,
1,
2,
5,
4,
3,
0,
3,
3,
0,
3,
2,
0,
2,
3,
0,
4,
1,
0,
3,
4,
3,
3,
5,
0,
3,
0,
1,
0,
4,
5,
5,
5,
4,
3,
0,
4,
2,
0,
3,
5,
],
&[
0,
5,
0,
4,
0,
4,
0,
2,
0,
5,
4,
3,
4,
3,
4,
3,
3,
3,
4,
3,
4,
2,
5,
3,
5,
3,
4,
1,
4,
3,
4,
4,
4,
0,
3,
5,
0,
4,
4,
4,
4,
5,
3,
1,
3,
4,
5,
3,
3,
3,
3,
3,
3,
3,
0,
2,
2,
0,
3,
3,
2,
4,
3,
3,
3,
5,
3,
4,
1,
3,
3,
5,
3,
2,
0,
0,
0,
0,
4,
3,
1,
3,
3,
],
&[
0,
1,
0,
3,
0,
3,
0,
1,
0,
1,
3,
3,
3,
2,
3,
3,
3,
0,
3,
0,
0,
0,
3,
1,
3,
0,
0,
0,
2,
2,
2,
3,
0,
0,
3,
2,
0,
1,
2,
4,
1,
3,
3,
0,
0,
3,
3,
3,
0,
1,
0,
0,
2,
1,
0,
0,
3,
0,
3,
1,
0,
3,
0,
0,
1,
3,
0,
2,
0,
1,
0,
3,
3,
1,
3,
3,
0,
0,
1,
1,
0,
3,
3,
],
&[
0,
2,
0,
3,
0,
2,
1,
4,
0,
2,
2,
3,
1,
1,
3,
1,
1,
0,
2,
0,
3,
1,
2,
3,
1,
3,
0,
0,
1,
0,
4,
3,
2,
3,
3,
3,
1,
4,
2,
3,
3,
3,
3,
1,
0,
3,
1,
4,
0,
1,
1,
0,
1,
2,
0,
1,
1,
0,
1,
1,
0,
3,
1,
3,
2,
2,
0,
1,
0,
0,
0,
2,
3,
3,
3,
1,
0,
0,
0,
0,
0,
2,
3,
],
&[
0,
5,
0,
4,
0,
5,
0,
2,
0,
4,
5,
5,
3,
3,
4,
3,
3,
1,
5,
4,
4,
2,
4,
4,
4,
3,
4,
2,
4,
3,
5,
5,
4,
3,
3,
4,
3,
3,
5,
5,
4,
5,
5,
1,
3,
4,
5,
3,
1,
4,
3,
1,
3,
3,
0,
3,
3,
1,
4,
3,
1,
4,
5,
3,
3,
5,
0,
4,
0,
3,
0,
5,
3,
3,
1,
4,
3,
0,
4,
0,
1,
5,
3,
],
&[
0,
5,
0,
5,
0,
4,
0,
2,
0,
4,
4,
3,
4,
3,
3,
3,
3,
3,
5,
4,
4,
4,
4,
4,
4,
5,
3,
3,
5,
2,
4,
4,
4,
3,
4,
4,
3,
3,
4,
4,
5,
5,
3,
3,
4,
3,
4,
3,
3,
4,
3,
3,
3,
3,
1,
2,
2,
1,
4,
3,
3,
5,
4,
4,
3,
4,
0,
4,
0,
3,
0,
4,
4,
4,
4,
4,
1,
0,
4,
2,
0,
2,
4,
],
&[
0,
4,
0,
4,
0,
3,
0,
1,
0,
3,
5,
2,
3,
0,
3,
0,
2,
1,
4,
2,
3,
3,
4,
1,
4,
3,
3,
2,
4,
1,
3,
3,
3,
0,
3,
3,
0,
0,
3,
3,
3,
5,
3,
3,
3,
3,
3,
2,
0,
2,
0,
0,
2,
0,
0,
2,
0,
0,
1,
0,
0,
3,
1,
2,
2,
3,
0,
3,
0,
2,
0,
4,
4,
3,
3,
4,
1,
0,
3,
0,
0,
2,
4,
],
&[
0,
0,
0,
4,
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
2,
0,
0,
0,
0,
0,
1,
0,
2,
0,
1,
0,
0,
0,
0,
0,
3,
1,
3,
0,
3,
2,
0,
0,
0,
1,
0,
3,
2,
0,
0,
2,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
3,
4,
0,
2,
0,
0,
0,
0,
0,
0,
2,
],
&[
0,
2,
1,
3,
0,
2,
0,
2,
0,
3,
3,
3,
3,
1,
3,
1,
3,
3,
3,
3,
3,
3,
4,
2,
2,
1,
2,
1,
4,
0,
4,
3,
1,
3,
3,
3,
2,
4,
3,
5,
4,
3,
3,
3,
3,
3,
3,
3,
0,
1,
3,
0,
2,
0,
0,
1,
0,
0,
1,
0,
0,
4,
2,
0,
2,
3,
0,
3,
3,
0,
3,
3,
4,
2,
3,
1,
4,
0,
1,
2,
0,
2,
3,
],
&[
0,
3,
0,
3,
0,
1,
0,
3,
0,
2,
3,
3,
3,
0,
3,
1,
2,
0,
3,
3,
2,
3,
3,
2,
3,
2,
3,
1,
3,
0,
4,
3,
2,
0,
3,
3,
1,
4,
3,
3,
2,
3,
4,
3,
1,
3,
3,
1,
1,
0,
1,
1,
0,
1,
0,
1,
0,
1,
0,
0,
0,
4,
1,
1,
0,
3,
0,
3,
1,
0,
2,
3,
3,
3,
3,
3,
1,
0,
0,
2,
0,
3,
3,
],
&[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
3,
0,
2,
0,
3,
0,
0,
0,
0,
0,
0,
0,
3,
0,
0,
0,
0,
0,
0,
0,
3,
0,
3,
0,
3,
1,
0,
1,
0,
1,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
3,
0,
2,
0,
2,
3,
0,
0,
0,
0,
0,
0,
0,
0,
3,
],
&[
0,
2,
0,
3,
1,
3,
0,
3,
0,
2,
3,
3,
3,
1,
3,
1,
3,
1,
3,
1,
3,
3,
3,
1,
3,
0,
2,
3,
1,
1,
4,
3,
3,
2,
3,
3,
1,
2,
2,
4,
1,
3,
3,
0,
1,
4,
2,
3,
0,
1,
3,
0,
3,
0,
0,
1,
3,
0,
2,
0,
0,
3,
3,
2,
1,
3,
0,
3,
0,
2,
0,
3,
4,
4,
4,
3,
1,
0,
3,
0,
0,
3,
3,
],
&[
0,
2,
0,
1,
0,
2,
0,
0,
0,
1,
3,
2,
2,
1,
3,
0,
1,
1,
3,
0,
3,
2,
3,
1,
2,
0,
2,
0,
1,
1,
3,
3,
3,
0,
3,
3,
1,
1,
2,
3,
2,
3,
3,
1,
2,
3,
2,
0,
0,
1,
0,
0,
0,
0,
0,
0,
3,
0,
1,
0,
0,
2,
1,
2,
1,
3,
0,
3,
0,
0,
0,
3,
4,
4,
4,
3,
2,
0,
2,
0,
0,
2,
4,
],
&[
0,
0,
0,
1,
0,
1,
0,
0,
0,
0,
1,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
1,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2,
2,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
1,
3,
1,
0,
0,
0,
0,
0,
0,
0,
3,
],
&[
0,
3,
0,
3,
0,
2,
0,
3,
0,
3,
3,
3,
2,
3,
2,
2,
2,
0,
3,
1,
3,
3,
3,
2,
3,
3,
0,
0,
3,
0,
3,
2,
2,
0,
2,
3,
1,
4,
3,
4,
3,
3,
2,
3,
1,
5,
4,
4,
0,
3,
1,
2,
1,
3,
0,
3,
1,
1,
2,
0,
2,
3,
1,
3,
1,
3,
0,
3,
0,
1,
0,
3,
3,
4,
4,
2,
1,
0,
2,
1,
0,
2,
4,
],
&[
0,
1,
0,
3,
0,
1,
0,
2,
0,
1,
4,
2,
5,
1,
4,
0,
2,
0,
2,
1,
3,
1,
4,
0,
2,
1,
0,
0,
2,
1,
4,
1,
1,
0,
3,
3,
0,
5,
1,
3,
2,
3,
3,
1,
0,
3,
2,
3,
0,
1,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
4,
0,
1,
0,
3,
0,
2,
0,
1,
0,
3,
3,
3,
4,
3,
3,
0,
0,
0,
0,
2,
3,
],
&[
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
2,
0,
1,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
3,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2,
1,
0,
0,
1,
0,
0,
0,
0,
0,
3,
],
&[
0,
1,
0,
3,
0,
4,
0,
3,
0,
2,
4,
3,
1,
0,
3,
2,
2,
1,
3,
1,
2,
2,
3,
1,
1,
1,
2,
1,
3,
0,
1,
2,
0,
1,
3,
2,
1,
3,
0,
5,
5,
1,
0,
0,
1,
3,
2,
1,
0,
3,
0,
0,
1,
0,
0,
0,
0,
0,
3,
4,
0,
1,
1,
1,
3,
2,
0,
2,
0,
1,
0,
2,
3,
3,
1,
2,
3,
0,
1,
0,
1,
0,
4,
],
&[
0,
0,
0,
1,
0,
3,
0,
3,
0,
2,
2,
1,
0,
0,
4,
0,
3,
0,
3,
1,
3,
0,
3,
0,
3,
0,
1,
0,
3,
0,
3,
1,
3,
0,
3,
3,
0,
0,
1,
2,
1,
1,
1,
0,
1,
2,
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
2,
2,
1,
2,
0,
0,
2,
0,
0,
0,
0,
2,
3,
3,
3,
3,
0,
0,
0,
0,
1,
4,
],
&[
0,
0,
0,
3,
0,
3,
0,
0,
0,
0,
3,
1,
1,
0,
3,
0,
1,
0,
2,
0,
1,
0,
0,
0,
0,
0,
0,
0,
1,
0,
3,
0,
2,
0,
2,
3,
0,
0,
2,
2,
3,
1,
2,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
3,
0,
0,
2,
0,
0,
0,
0,
2,
3,
],
&[
2,
4,
0,
5,
0,
5,
0,
4,
0,
3,
4,
3,
3,
3,
4,
3,
3,
3,
4,
3,
4,
4,
5,
4,
5,
5,
5,
2,
3,
0,
5,
5,
4,
1,
5,
4,
3,
1,
5,
4,
3,
4,
4,
3,
3,
4,
3,
3,
0,
3,
2,
0,
2,
3,
0,
3,
0,
0,
3,
3,
0,
5,
3,
2,
3,
3,
0,
3,
0,
3,
0,
3,
4,
5,
4,
5,
3,
0,
4,
3,
0,
3,
4,
],
&[
0,
3,
0,
3,
0,
3,
0,
3,
0,
3,
3,
4,
3,
2,
3,
2,
3,
0,
4,
3,
3,
3,
3,
3,
3,
3,
3,
0,
3,
2,
4,
3,
3,
1,
3,
4,
3,
4,
4,
4,
3,
4,
4,
3,
2,
4,
4,
1,
0,
2,
0,
0,
1,
1,
0,
2,
0,
0,
3,
1,
0,
5,
3,
2,
1,
3,
0,
3,
0,
1,
2,
4,
3,
2,
4,
3,
3,
0,
3,
2,
0,
4,
4,
],
&[
0,
3,
0,
3,
0,
1,
0,
0,
0,
1,
4,
3,
3,
2,
3,
1,
3,
1,
4,
2,
3,
2,
4,
2,
3,
4,
3,
0,
2,
2,
3,
3,
3,
0,
3,
3,
3,
0,
3,
4,
1,
3,
3,
0,
3,
4,
3,
3,
0,
1,
1,
0,
1,
0,
0,
0,
4,
0,
3,
0,
0,
3,
1,
2,
1,
3,
0,
4,
0,
1,
0,
4,
3,
3,
4,
3,
3,
0,
2,
0,
0,
3,
3,
],
&[
0,
3,
0,
4,
0,
1,
0,
3,
0,
3,
4,
3,
3,
0,
3,
3,
3,
1,
3,
1,
3,
3,
4,
3,
3,
3,
0,
0,
3,
1,
5,
3,
3,
1,
3,
3,
2,
5,
4,
3,
3,
4,
5,
3,
2,
5,
3,
4,
0,
1,
0,
0,
0,
0,
0,
2,
0,
0,
1,
1,
0,
4,
2,
2,
1,
3,
0,
3,
0,
2,
0,
4,
4,
3,
5,
3,
2,
0,
1,
1,
0,
3,
4,
],
&[
0,
5,
0,
4,
0,
5,
0,
2,
0,
4,
4,
3,
3,
2,
3,
3,
3,
1,
4,
3,
4,
1,
5,
3,
4,
3,
4,
0,
4,
2,
4,
3,
4,
1,
5,
4,
0,
4,
4,
4,
4,
5,
4,
1,
3,
5,
4,
2,
1,
4,
1,
1,
3,
2,
0,
3,
1,
0,
3,
2,
1,
4,
3,
3,
3,
4,
0,
4,
0,
3,
0,
4,
4,
4,
3,
3,
3,
0,
4,
2,
0,
3,
4,
],
&[
1,
4,
0,
4,
0,
3,
0,
1,
0,
3,
3,
3,
1,
1,
3,
3,
2,
2,
3,
3,
1,
0,
3,
2,
2,
1,
2,
0,
3,
1,
2,
1,
2,
0,
3,
2,
0,
2,
2,
3,
3,
4,
3,
0,
3,
3,
1,
2,
0,
1,
1,
3,
1,
2,
0,
0,
3,
0,
1,
1,
0,
3,
2,
2,
3,
3,
0,
3,
0,
0,
0,
2,
3,
3,
4,
3,
3,
0,
1,
0,
0,
1,
4,
],
&[
0,
4,
0,
4,
0,
4,
0,
0,
0,
3,
4,
4,
3,
1,
4,
2,
3,
2,
3,
3,
3,
1,
4,
3,
4,
0,
3,
0,
4,
2,
3,
3,
2,
2,
5,
4,
2,
1,
3,
4,
3,
4,
3,
1,
3,
3,
4,
2,
0,
2,
1,
0,
3,
3,
0,
0,
2,
0,
3,
1,
0,
4,
4,
3,
4,
3,
0,
4,
0,
1,
0,
2,
4,
4,
4,
4,
4,
0,
3,
2,
0,
3,
3,
],
&[
0,
0,
0,
1,
0,
4,
0,
0,
0,
0,
0,
0,
1,
1,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
1,
0,
3,
2,
0,
0,
1,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
2,
],
&[
0,
2,
0,
3,
0,
4,
0,
4,
0,
1,
3,
3,
3,
0,
4,
0,
2,
1,
2,
1,
1,
1,
2,
0,
3,
1,
1,
0,
1,
0,
3,
1,
0,
0,
3,
3,
2,
0,
1,
1,
0,
0,
0,
0,
0,
1,
0,
2,
0,
2,
2,
0,
3,
1,
0,
0,
1,
0,
1,
1,
0,
1,
2,
0,
3,
0,
0,
0,
0,
1,
0,
0,
3,
3,
4,
3,
1,
0,
1,
0,
3,
0,
2,
],
&[
0,
0,
0,
3,
0,
5,
0,
0,
0,
0,
1,
0,
2,
0,
3,
1,
0,
1,
3,
0,
0,
0,
2,
0,
0,
0,
1,
0,
0,
0,
1,
1,
0,
0,
4,
0,
0,
0,
2,
3,
0,
1,
4,
1,
0,
2,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
3,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
0,
2,
0,
0,
3,
0,
0,
0,
0,
0,
3,
],
&[
0,
2,
0,
5,
0,
5,
0,
1,
0,
2,
4,
3,
3,
2,
5,
1,
3,
2,
3,
3,
3,
0,
4,
1,
2,
0,
3,
0,
4,
0,
2,
2,
1,
1,
5,
3,
0,
0,
1,
4,
2,
3,
2,
0,
3,
3,
3,
2,
0,
2,
4,
1,
1,
2,
0,
1,
1,
0,
3,
1,
0,
1,
3,
1,
2,
3,
0,
2,
0,
0,
0,
1,
3,
5,
4,
4,
4,
0,
3,
0,
0,
1,
3,
],
&[
0,
4,
0,
5,
0,
4,
0,
4,
0,
4,
5,
4,
3,
3,
4,
3,
3,
3,
4,
3,
4,
4,
5,
3,
4,
5,
4,
2,
4,
2,
3,
4,
3,
1,
4,
4,
1,
3,
5,
4,
4,
5,
5,
4,
4,
5,
5,
5,
2,
3,
3,
1,
4,
3,
1,
3,
3,
0,
3,
3,
1,
4,
3,
4,
4,
4,
0,
3,
0,
4,
0,
3,
3,
4,
4,
5,
0,
0,
4,
3,
0,
4,
5,
],
&[
0,
4,
0,
4,
0,
3,
0,
3,
0,
3,
4,
4,
4,
3,
3,
2,
4,
3,
4,
3,
4,
3,
5,
3,
4,
3,
2,
1,
4,
2,
4,
4,
3,
1,
3,
4,
2,
4,
5,
5,
3,
4,
5,
4,
1,
5,
4,
3,
0,
3,
2,
2,
3,
2,
1,
3,
1,
0,
3,
3,
3,
5,
3,
3,
3,
5,
4,
4,
2,
3,
3,
4,
3,
3,
3,
2,
1,
0,
3,
2,
1,
4,
3,
],
&[
0,
4,
0,
5,
0,
4,
0,
3,
0,
3,
5,
5,
3,
2,
4,
3,
4,
0,
5,
4,
4,
1,
4,
4,
4,
3,
3,
3,
4,
3,
5,
5,
2,
3,
3,
4,
1,
2,
5,
5,
3,
5,
5,
2,
3,
5,
5,
4,
0,
3,
2,
0,
3,
3,
1,
1,
5,
1,
4,
1,
0,
4,
3,
2,
3,
5,
0,
4,
0,
3,
0,
5,
4,
3,
4,
3,
0,
0,
4,
1,
0,
4,
4,
],
&[
1,
3,
0,
4,
0,
2,
0,
2,
0,
2,
5,
5,
3,
3,
3,
3,
3,
0,
4,
2,
3,
4,
4,
4,
3,
4,
0,
0,
3,
4,
5,
4,
3,
3,
3,
3,
2,
5,
5,
4,
5,
5,
5,
4,
3,
5,
5,
5,
1,
3,
1,
0,
1,
0,
0,
3,
2,
0,
4,
2,
0,
5,
2,
3,
2,
4,
1,
3,
0,
3,
0,
4,
5,
4,
5,
4,
3,
0,
4,
2,
0,
5,
4,
],
&[
0,
3,
0,
4,
0,
5,
0,
3,
0,
3,
4,
4,
3,
2,
3,
2,
3,
3,
3,
3,
3,
2,
4,
3,
3,
2,
2,
0,
3,
3,
3,
3,
3,
1,
3,
3,
3,
0,
4,
4,
3,
4,
4,
1,
1,
4,
4,
2,
0,
3,
1,
0,
1,
1,
0,
4,
1,
0,
2,
3,
1,
3,
3,
1,
3,
4,
0,
3,
0,
1,
0,
3,
1,
3,
0,
0,
1,
0,
2,
0,
0,
4,
4,
],
&[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
],
&[
0,
3,
0,
3,
0,
2,
0,
3,
0,
1,
5,
4,
3,
3,
3,
1,
4,
2,
1,
2,
3,
4,
4,
2,
4,
4,
5,
0,
3,
1,
4,
3,
4,
0,
4,
3,
3,
3,
2,
3,
2,
5,
3,
4,
3,
2,
2,
3,
0,
0,
3,
0,
2,
1,
0,
1,
2,
0,
0,
0,
0,
2,
1,
1,
3,
1,
0,
2,
0,
4,
0,
3,
4,
4,
4,
5,
2,
0,
2,
0,
0,
1,
3,
],
&[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
1,
1,
1,
0,
0,
1,
1,
0,
0,
0,
4,
2,
1,
1,
0,
1,
0,
3,
2,
0,
0,
3,
1,
1,
1,
2,
2,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
3,
0,
1,
0,
0,
0,
2,
0,
0,
0,
1,
4,
0,
4,
2,
1,
0,
0,
0,
0,
0,
1,
],
&[
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
0,
0,
0,
1,
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
0,
0,
0,
3,
1,
0,
0,
0,
2,
0,
2,
1,
0,
0,
1,
2,
1,
0,
1,
1,
0,
0,
3,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
3,
1,
0,
0,
0,
0,
0,
1,
0,
0,
2,
1,
0,
0,
0,
0,
0,
0,
0,
0,
2,
],
&[
0,
4,
0,
4,
0,
4,
0,
3,
0,
4,
4,
3,
4,
2,
4,
3,
2,
0,
4,
4,
4,
3,
5,
3,
5,
3,
3,
2,
4,
2,
4,
3,
4,
3,
1,
4,
0,
2,
3,
4,
4,
4,
3,
3,
3,
4,
4,
4,
3,
4,
1,
3,
4,
3,
2,
1,
2,
1,
3,
3,
3,
4,
4,
3,
3,
5,
0,
4,
0,
3,
0,
4,
3,
3,
3,
2,
1,
0,
3,
0,
0,
3,
3,
],
&[
0,
4,
0,
3,
0,
3,
0,
3,
0,
3,
5,
5,
3,
3,
3,
3,
4,
3,
4,
3,
3,
3,
4,
4,
4,
3,
3,
3,
3,
4,
3,
5,
3,
3,
1,
3,
2,
4,
5,
5,
5,
5,
4,
3,
4,
5,
5,
3,
2,
2,
3,
3,
3,
3,
2,
3,
3,
1,
2,
3,
2,
4,
3,
3,
3,
4,
0,
4,
0,
2,
0,
4,
3,
2,
2,
1,
2,
0,
3,
0,
0,
4,
1,
],
];
pub trait JapaneseContextAnalysis {
fn reset(&mut self);
fn feed(&mut self, byte_str: &[u8], num_bytes: usize);
fn got_enough_data(&self) -> bool;
fn get_confidence(&self) -> f32;
fn get_order(&mut self, byte_str: &[u8]) -> (i16, usize);
}
#[derive(Debug)]
pub struct BaseJapaneseContextAnalysis {
c_enough_rel_threshold: usize,
c_max_rel_threshold: usize,
c_minimum_data_threshold: usize,
m_total_rel: usize,
m_rel_sample: [usize; 6],
m_need_to_skip_char_num: usize,
m_last_char_order: i16,
m_done: bool,
pub m_charset: String,
}
impl BaseJapaneseContextAnalysis {
pub fn new() -> BaseJapaneseContextAnalysis {
BaseJapaneseContextAnalysis {
c_enough_rel_threshold: 100,
c_max_rel_threshold: 1000,
c_minimum_data_threshold: 4,
m_total_rel: 0,
m_rel_sample: [0; 6],
m_need_to_skip_char_num: 0,
m_last_char_order: -1,
m_done: false,
m_charset: "".to_string(),
}
}
}
impl JapaneseContextAnalysis for BaseJapaneseContextAnalysis {
fn reset(&mut self) {
self.m_total_rel = 0;
self.m_rel_sample = [0; 6];
self.m_need_to_skip_char_num = 0;
self.m_last_char_order = -1;
self.m_done = false;
}
fn feed(&mut self, _: &[u8], _: usize) {}
fn got_enough_data(&self) -> bool {
self.m_total_rel > self.c_enough_rel_threshold
}
fn get_confidence(&self) -> f32 {
if self.m_total_rel > self.c_minimum_data_threshold {
((self.m_total_rel as f32) - (self.m_rel_sample[0] as f32)) / (self.m_total_rel as f32)
} else {
-1.0
}
}
fn get_order(&mut self, _: &[u8]) -> (i16, usize) {
(-1, 0)
}
}
#[derive(Debug)]
pub struct SJISContextAnalysis {
base: BaseJapaneseContextAnalysis,
}
impl SJISContextAnalysis {
pub fn new() -> SJISContextAnalysis {
let mut x = SJISContextAnalysis { base: BaseJapaneseContextAnalysis::new() };
x.base.m_charset = "SHIFT_JIS".to_string();
x
}
pub fn get_charset(&self) -> String {
self.base.m_charset.clone()
}
}
impl JapaneseContextAnalysis for SJISContextAnalysis {
fn reset(&mut self) {
self.base.reset();
self.base.m_charset = "SHIFT_JIS".to_string();
}
fn got_enough_data(&self) -> bool {
self.base.got_enough_data()
}
fn get_confidence(&self) -> f32 {
self.base.get_confidence()
}
fn feed(&mut self, byte_str: &[u8], num_bytes: usize) {
if self.base.m_done {
return;
}
let mut i = self.base.m_need_to_skip_char_num;
let mut order: (i16, usize);
while i < num_bytes {
order = self.get_order(&byte_str[i..]);
i += order.1;
if i > num_bytes {
self.base.m_need_to_skip_char_num = i - num_bytes;
self.base.m_last_char_order = -1;
} else {
if (order.0 != -1) && (self.base.m_last_char_order != -1) {
self.base.m_total_rel += 1;
if self.base.m_total_rel > self.base.c_max_rel_threshold {
self.base.m_done = true;
break;
}
self.base.m_rel_sample[JP2_CHAR_CONTEXT[self.base.m_last_char_order as usize]
[order.0 as usize] as
usize] += 1;
}
self.base.m_last_char_order = order.0;
}
}
}
fn get_order(&mut self, byte_str: &[u8]) -> (i16, usize) {
let char_len: usize;
if ((byte_str[0] >= 0x81) && (byte_str[0] <= 0x9F)) ||
((byte_str[0] >= 0xE0) && (byte_str[0] <= 0xFC))
{
char_len = 2;
if (byte_str[0] == 0x87) || ((byte_str[0] >= 0xFA) && (byte_str[0] <= 0xFC)) {
self.base.m_charset = "CP932".to_string();
}
} else {
char_len = 1;
}
if byte_str.len() > 1 {
if (byte_str[0] == 0x82) && ((byte_str[1] >= 0x9F) && (byte_str[1] <= 0xF1)) {
return ((byte_str[1] as i16) - 0x9F, char_len);
}
}
return (-1, char_len);
}
}
#[derive(Debug)]
pub struct EUCJPContextAnalysis {
base: BaseJapaneseContextAnalysis,
}
impl EUCJPContextAnalysis {
pub fn new() -> EUCJPContextAnalysis {
let mut x = EUCJPContextAnalysis { base: BaseJapaneseContextAnalysis::new() };
x.base.m_charset = "EUC-JP".to_string();
x
}
pub fn get_charset(&self) -> String {
self.base.m_charset.clone()
}
}
impl JapaneseContextAnalysis for EUCJPContextAnalysis {
fn reset(&mut self) {
self.base.reset();
self.base.m_charset = "EUC-JP".to_string();
}
fn got_enough_data(&self) -> bool {
self.base.got_enough_data()
}
fn get_confidence(&self) -> f32 {
self.base.get_confidence()
}
fn feed(&mut self, byte_str: &[u8], num_bytes: usize) {
if self.base.m_done {
return;
}
let mut i = self.base.m_need_to_skip_char_num;
let mut order: (i16, usize);
while i < num_bytes {
order = self.get_order(&byte_str[i..]);
i += order.1;
if i > num_bytes {
self.base.m_need_to_skip_char_num = i - num_bytes;
self.base.m_last_char_order = -1;
} else {
if (order.0 != -1) && (self.base.m_last_char_order != -1) {
self.base.m_total_rel += 1;
if self.base.m_total_rel > self.base.c_max_rel_threshold {
self.base.m_done = true;
break;
}
self.base.m_rel_sample[JP2_CHAR_CONTEXT[self.base.m_last_char_order as usize]
[order.0 as usize] as
usize] += 1;
}
self.base.m_last_char_order = order.0;
}
}
}
fn get_order(&mut self, byte_str: &[u8]) -> (i16, usize) {
if byte_str.len() <= 0 {
return (-1, 1);
}
let char_len: usize;
if (byte_str[0] == 0x8E) || ((byte_str[0] >= 0xA1) && (byte_str[0] <= 0xFE)) {
char_len = 2;
} else if byte_str[0] == 0x8F {
char_len = 3;
} else {
char_len = 1;
}
if byte_str.len() > 1 {
if (byte_str[0] == 0xA4) && ((byte_str[1] >= 0xA1) && (byte_str[1] <= 0xF3)) {
return ((byte_str[1] as i16) - 0xA1, char_len);
}
}
return (-1, char_len);
}
}