HuffmanEncoder.cs 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917
  1. #if (!UNITY_WEBGL || UNITY_EDITOR) && !BESTHTTP_DISABLE_ALTERNATE_SSL && !BESTHTTP_DISABLE_HTTP2
  2. using System;
  3. namespace BestHTTP.Connections.HTTP2
  4. {
  5. [BestHTTP.PlatformSupport.IL2CPP.Il2CppEagerStaticClassConstruction]
  6. static class HuffmanEncoder
  7. {
  8. public const UInt16 EOS = 256;
  9. public struct TableEntry
  10. {
  11. public UInt32 Code;
  12. public byte Bits;
  13. /// <summary>
  14. /// It must return 0 or 1 at bit index. Indexing will be relative to the Bits representing the current code. Idx grows from left to right. Idx must be between [1..Bits].
  15. /// </summary>
  16. public byte GetBitAtIdx(byte idx)
  17. {
  18. return (byte)((this.Code >> (this.Bits - idx)) & 1);
  19. }
  20. public override string ToString()
  21. {
  22. return string.Format("[TableEntry Code: 0x{0:X}, Bits: {1}]", this.Code, this.Bits);
  23. }
  24. }
  25. public struct TreeNode
  26. {
  27. public UInt16 NextZeroIdx;
  28. public UInt16 NextOneIdx;
  29. public UInt16 Value;
  30. public override string ToString()
  31. {
  32. return string.Format("[TreeNode Value: {0}, NextZeroIdx: {1}, NextOneIdx: {2}]",
  33. this.Value, this.NextZeroIdx, this.NextOneIdx);
  34. }
  35. }
  36. static TableEntry[] StaticTable = new TableEntry[257]
  37. {
  38. new TableEntry{ Code = 0x1ff8 , Bits = 13 },
  39. new TableEntry{ Code = 0x7fffd8 , Bits = 23 },
  40. new TableEntry{ Code = 0xfffffe2, Bits = 28 },
  41. new TableEntry{ Code = 0xfffffe3, Bits = 28 },
  42. new TableEntry{ Code = 0xfffffe4, Bits = 28 },
  43. new TableEntry{ Code = 0xfffffe5, Bits = 28 },
  44. new TableEntry{ Code = 0xfffffe6, Bits = 28 },
  45. new TableEntry{ Code = 0xfffffe7, Bits = 28 },
  46. new TableEntry{ Code = 0xfffffe8, Bits = 28 },
  47. new TableEntry{ Code = 0xffffea, Bits = 24 },
  48. new TableEntry{ Code = 0x3ffffffc , Bits = 30 },
  49. new TableEntry{ Code = 0xfffffe9 , Bits = 28 },
  50. new TableEntry{ Code = 0xfffffea , Bits = 28 },
  51. new TableEntry{ Code = 0x3ffffffd , Bits = 30 },
  52. new TableEntry{ Code = 0xfffffeb , Bits = 28 },
  53. new TableEntry{ Code = 0xfffffec , Bits = 28 },
  54. new TableEntry{ Code = 0xfffffed , Bits = 28 },
  55. new TableEntry{ Code = 0xfffffee , Bits = 28 },
  56. new TableEntry{ Code = 0xfffffef , Bits = 28 },
  57. new TableEntry{ Code = 0xffffff0 , Bits = 28 },
  58. new TableEntry{ Code = 0xffffff1 , Bits = 28 },
  59. new TableEntry{ Code = 0xffffff2 , Bits = 28 },
  60. new TableEntry{ Code = 0x3ffffffe, Bits = 30 },
  61. new TableEntry{ Code = 0xffffff3 , Bits = 28 },
  62. new TableEntry{ Code = 0xffffff4 , Bits = 28 },
  63. new TableEntry{ Code = 0xffffff5 , Bits = 28 },
  64. new TableEntry{ Code = 0xffffff6 , Bits = 28 },
  65. new TableEntry{ Code = 0xffffff7 , Bits = 28 },
  66. new TableEntry{ Code = 0xffffff8 , Bits = 28 },
  67. new TableEntry{ Code = 0xffffff9 , Bits = 28 },
  68. new TableEntry{ Code = 0xffffffa , Bits = 28 },
  69. new TableEntry{ Code = 0xffffffb , Bits = 28 },
  70. new TableEntry{ Code = 0x14 , Bits = 6 },
  71. new TableEntry{ Code = 0x3f8, Bits = 10 },
  72. new TableEntry{ Code = 0x3f9, Bits = 10 },
  73. new TableEntry{ Code = 0xffa, Bits = 12 },
  74. new TableEntry{ Code = 0x1ff9 , Bits = 13 },
  75. new TableEntry{ Code = 0x15 , Bits = 6 },
  76. new TableEntry{ Code = 0xf8 , Bits = 8 },
  77. new TableEntry{ Code = 0x7fa, Bits = 11 },
  78. new TableEntry{ Code = 0x3fa, Bits = 10 },
  79. new TableEntry{ Code = 0x3fb, Bits = 10 },
  80. new TableEntry{ Code = 0xf9 , Bits = 8 },
  81. new TableEntry{ Code = 0x7fb, Bits = 11 },
  82. new TableEntry{ Code = 0xfa , Bits = 8 },
  83. new TableEntry{ Code = 0x16 , Bits = 6 },
  84. new TableEntry{ Code = 0x17 , Bits = 6 },
  85. new TableEntry{ Code = 0x18 , Bits = 6 },
  86. new TableEntry{ Code = 0x0 , Bits = 5 },
  87. new TableEntry{ Code = 0x1 , Bits = 5 },
  88. new TableEntry{ Code = 0x2 , Bits = 5 },
  89. new TableEntry{ Code = 0x19 , Bits = 6 },
  90. new TableEntry{ Code = 0x1a , Bits = 6 },
  91. new TableEntry{ Code = 0x1b , Bits = 6 },
  92. new TableEntry{ Code = 0x1c , Bits = 6 },
  93. new TableEntry{ Code = 0x1d , Bits = 6 },
  94. new TableEntry{ Code = 0x1e , Bits = 6 },
  95. new TableEntry{ Code = 0x1f , Bits = 6 },
  96. new TableEntry{ Code = 0x5c , Bits = 7 },
  97. new TableEntry{ Code = 0xfb , Bits = 8 },
  98. new TableEntry{ Code = 0x7ffc , Bits = 15 },
  99. new TableEntry{ Code = 0x20 , Bits = 6 },
  100. new TableEntry{ Code = 0xffb, Bits = 12 },
  101. new TableEntry{ Code = 0x3fc, Bits = 10 },
  102. new TableEntry{ Code = 0x1ffa , Bits = 13 },
  103. new TableEntry{ Code = 0x21, Bits = 6 },
  104. new TableEntry{ Code = 0x5d, Bits = 7 },
  105. new TableEntry{ Code = 0x5e, Bits = 7 },
  106. new TableEntry{ Code = 0x5f, Bits = 7 },
  107. new TableEntry{ Code = 0x60, Bits = 7 },
  108. new TableEntry{ Code = 0x61, Bits = 7 },
  109. new TableEntry{ Code = 0x62, Bits = 7 },
  110. new TableEntry{ Code = 0x63, Bits = 7 },
  111. new TableEntry{ Code = 0x64, Bits = 7 },
  112. new TableEntry{ Code = 0x65, Bits = 7 },
  113. new TableEntry{ Code = 0x66, Bits = 7 },
  114. new TableEntry{ Code = 0x67, Bits = 7 },
  115. new TableEntry{ Code = 0x68, Bits = 7 },
  116. new TableEntry{ Code = 0x69, Bits = 7 },
  117. new TableEntry{ Code = 0x6a, Bits = 7 },
  118. new TableEntry{ Code = 0x6b, Bits = 7 },
  119. new TableEntry{ Code = 0x6c, Bits = 7 },
  120. new TableEntry{ Code = 0x6d, Bits = 7 },
  121. new TableEntry{ Code = 0x6e, Bits = 7 },
  122. new TableEntry{ Code = 0x6f, Bits = 7 },
  123. new TableEntry{ Code = 0x70, Bits = 7 },
  124. new TableEntry{ Code = 0x71, Bits = 7 },
  125. new TableEntry{ Code = 0x72, Bits = 7 },
  126. new TableEntry{ Code = 0xfc, Bits = 8 },
  127. new TableEntry{ Code = 0x73, Bits = 7 },
  128. new TableEntry{ Code = 0xfd, Bits = 8 },
  129. new TableEntry{ Code = 0x1ffb, Bits = 13 },
  130. new TableEntry{ Code = 0x7fff0, Bits = 19 },
  131. new TableEntry{ Code = 0x1ffc, Bits = 13 },
  132. new TableEntry{ Code = 0x3ffc, Bits = 14 },
  133. new TableEntry{ Code = 0x22, Bits = 6 },
  134. new TableEntry{ Code = 0x7ffd, Bits = 15 },
  135. new TableEntry{ Code = 0x3, Bits = 5 },
  136. new TableEntry{ Code = 0x23, Bits = 6 },
  137. new TableEntry{ Code = 0x4, Bits = 5 },
  138. new TableEntry{ Code = 0x24, Bits = 6 },
  139. new TableEntry{ Code = 0x5, Bits = 5 },
  140. new TableEntry{ Code = 0x25, Bits = 6 },
  141. new TableEntry{ Code = 0x26, Bits = 6 },
  142. new TableEntry{ Code = 0x27, Bits = 6 },
  143. new TableEntry{ Code = 0x6 , Bits = 5 },
  144. new TableEntry{ Code = 0x74, Bits = 7 },
  145. new TableEntry{ Code = 0x75, Bits = 7 },
  146. new TableEntry{ Code = 0x28, Bits = 6 },
  147. new TableEntry{ Code = 0x29, Bits = 6 },
  148. new TableEntry{ Code = 0x2a, Bits = 6 },
  149. new TableEntry{ Code = 0x7 , Bits = 5 },
  150. new TableEntry{ Code = 0x2b, Bits = 6 },
  151. new TableEntry{ Code = 0x76, Bits = 7 },
  152. new TableEntry{ Code = 0x2c, Bits = 6 },
  153. new TableEntry{ Code = 0x8 , Bits = 5 },
  154. new TableEntry{ Code = 0x9 , Bits = 5 },
  155. new TableEntry{ Code = 0x2d, Bits = 6 },
  156. new TableEntry{ Code = 0x77, Bits = 7 },
  157. new TableEntry{ Code = 0x78, Bits = 7 },
  158. new TableEntry{ Code = 0x79, Bits = 7 },
  159. new TableEntry{ Code = 0x7a, Bits = 7 },
  160. new TableEntry{ Code = 0x7b, Bits = 7 },
  161. new TableEntry{ Code = 0x7ffe, Bits = 15 },
  162. new TableEntry{ Code = 0x7fc, Bits = 11 },
  163. new TableEntry{ Code = 0x3ffd, Bits = 14 },
  164. new TableEntry{ Code = 0x1ffd, Bits = 13 },
  165. new TableEntry{ Code = 0xffffffc, Bits = 28 },
  166. new TableEntry{ Code = 0xfffe6 , Bits = 20 },
  167. new TableEntry{ Code = 0x3fffd2, Bits = 22 },
  168. new TableEntry{ Code = 0xfffe7 , Bits = 20 },
  169. new TableEntry{ Code = 0xfffe8 , Bits = 20 },
  170. new TableEntry{ Code = 0x3fffd3, Bits = 22 },
  171. new TableEntry{ Code = 0x3fffd4, Bits = 22 },
  172. new TableEntry{ Code = 0x3fffd5, Bits = 22 },
  173. new TableEntry{ Code = 0x7fffd9, Bits = 23 },
  174. new TableEntry{ Code = 0x3fffd6, Bits = 22 },
  175. new TableEntry{ Code = 0x7fffda, Bits = 23 },
  176. new TableEntry{ Code = 0x7fffdb, Bits = 23 },
  177. new TableEntry{ Code = 0x7fffdc, Bits = 23 },
  178. new TableEntry{ Code = 0x7fffdd, Bits = 23 },
  179. new TableEntry{ Code = 0x7fffde, Bits = 23 },
  180. new TableEntry{ Code = 0xffffeb, Bits = 24 },
  181. new TableEntry{ Code = 0x7fffdf, Bits = 23 },
  182. new TableEntry{ Code = 0xffffec, Bits = 24 },
  183. new TableEntry{ Code = 0xffffed, Bits = 24 },
  184. new TableEntry{ Code = 0x3fffd7, Bits = 22 },
  185. new TableEntry{ Code = 0x7fffe0, Bits = 23 },
  186. new TableEntry{ Code = 0xffffee, Bits = 24 },
  187. new TableEntry{ Code = 0x7fffe1, Bits = 23 },
  188. new TableEntry{ Code = 0x7fffe2, Bits = 23 },
  189. new TableEntry{ Code = 0x7fffe3, Bits = 23 },
  190. new TableEntry{ Code = 0x7fffe4, Bits = 23 },
  191. new TableEntry{ Code = 0x1fffdc, Bits = 21 },
  192. new TableEntry{ Code = 0x3fffd8, Bits = 22 },
  193. new TableEntry{ Code = 0x7fffe5, Bits = 23 },
  194. new TableEntry{ Code = 0x3fffd9, Bits = 22 },
  195. new TableEntry{ Code = 0x7fffe6, Bits = 23 },
  196. new TableEntry{ Code = 0x7fffe7, Bits = 23 },
  197. new TableEntry{ Code = 0xffffef, Bits = 24 },
  198. new TableEntry{ Code = 0x3fffda, Bits = 22 },
  199. new TableEntry{ Code = 0x1fffdd, Bits = 21 },
  200. new TableEntry{ Code = 0xfffe9 , Bits = 20 },
  201. new TableEntry{ Code = 0x3fffdb, Bits = 22 },
  202. new TableEntry{ Code = 0x3fffdc, Bits = 22 },
  203. new TableEntry{ Code = 0x7fffe8, Bits = 23 },
  204. new TableEntry{ Code = 0x7fffe9, Bits = 23 },
  205. new TableEntry{ Code = 0x1fffde, Bits = 21 },
  206. new TableEntry{ Code = 0x7fffea, Bits = 23 },
  207. new TableEntry{ Code = 0x3fffdd, Bits = 22 },
  208. new TableEntry{ Code = 0x3fffde, Bits = 22 },
  209. new TableEntry{ Code = 0xfffff0, Bits = 24 },
  210. new TableEntry{ Code = 0x1fffdf, Bits = 21 },
  211. new TableEntry{ Code = 0x3fffdf, Bits = 22 },
  212. new TableEntry{ Code = 0x7fffeb, Bits = 23 },
  213. new TableEntry{ Code = 0x7fffec, Bits = 23 },
  214. new TableEntry{ Code = 0x1fffe0, Bits = 21 },
  215. new TableEntry{ Code = 0x1fffe1, Bits = 21 },
  216. new TableEntry{ Code = 0x3fffe0, Bits = 22 },
  217. new TableEntry{ Code = 0x1fffe2, Bits = 21 },
  218. new TableEntry{ Code = 0x7fffed, Bits = 23 },
  219. new TableEntry{ Code = 0x3fffe1, Bits = 22 },
  220. new TableEntry{ Code = 0x7fffee, Bits = 23 },
  221. new TableEntry{ Code = 0x7fffef, Bits = 23 },
  222. new TableEntry{ Code = 0xfffea , Bits = 20 },
  223. new TableEntry{ Code = 0x3fffe2, Bits = 22 },
  224. new TableEntry{ Code = 0x3fffe3, Bits = 22 },
  225. new TableEntry{ Code = 0x3fffe4, Bits = 22 },
  226. new TableEntry{ Code = 0x7ffff0, Bits = 23 },
  227. new TableEntry{ Code = 0x3fffe5, Bits = 22 },
  228. new TableEntry{ Code = 0x3fffe6, Bits = 22 },
  229. new TableEntry{ Code = 0x7ffff1, Bits = 23 },
  230. new TableEntry{ Code = 0x3ffffe0, Bits = 26 },
  231. new TableEntry{ Code = 0x3ffffe1, Bits = 26 },
  232. new TableEntry{ Code = 0xfffeb , Bits = 20 },
  233. new TableEntry{ Code = 0x7fff1 , Bits = 19 },
  234. new TableEntry{ Code = 0x3fffe7, Bits = 22 },
  235. new TableEntry{ Code = 0x7ffff2, Bits = 23 },
  236. new TableEntry{ Code = 0x3fffe8, Bits = 22 },
  237. new TableEntry{ Code = 0x1ffffec, Bits = 25 },
  238. new TableEntry{ Code = 0x3ffffe2, Bits = 26 },
  239. new TableEntry{ Code = 0x3ffffe3, Bits = 26 },
  240. new TableEntry{ Code = 0x3ffffe4, Bits = 26 },
  241. new TableEntry{ Code = 0x7ffffde, Bits = 27 },
  242. new TableEntry{ Code = 0x7ffffdf, Bits = 27 },
  243. new TableEntry{ Code = 0x3ffffe5, Bits = 26 },
  244. new TableEntry{ Code = 0xfffff1 , Bits = 24 },
  245. new TableEntry{ Code = 0x1ffffed, Bits = 25 },
  246. new TableEntry{ Code = 0x7fff2 , Bits = 19 },
  247. new TableEntry{ Code = 0x1fffe3 , Bits = 21 },
  248. new TableEntry{ Code = 0x3ffffe6, Bits = 26 },
  249. new TableEntry{ Code = 0x7ffffe0, Bits = 27 },
  250. new TableEntry{ Code = 0x7ffffe1, Bits = 27 },
  251. new TableEntry{ Code = 0x3ffffe7, Bits = 26 },
  252. new TableEntry{ Code = 0x7ffffe2, Bits = 27 },
  253. new TableEntry{ Code = 0xfffff2 , Bits = 24 },
  254. new TableEntry{ Code = 0x1fffe4 , Bits = 21 },
  255. new TableEntry{ Code = 0x1fffe5 , Bits = 21 },
  256. new TableEntry{ Code = 0x3ffffe8, Bits = 26 },
  257. new TableEntry{ Code = 0x3ffffe9, Bits = 26 },
  258. new TableEntry{ Code = 0xffffffd, Bits = 28 },
  259. new TableEntry{ Code = 0x7ffffe3, Bits = 27 },
  260. new TableEntry{ Code = 0x7ffffe4, Bits = 27 },
  261. new TableEntry{ Code = 0x7ffffe5, Bits = 27 },
  262. new TableEntry{ Code = 0xfffec , Bits = 20 },
  263. new TableEntry{ Code = 0xfffff3, Bits = 24 },
  264. new TableEntry{ Code = 0xfffed , Bits = 20 },
  265. new TableEntry{ Code = 0x1fffe6, Bits = 21 },
  266. new TableEntry{ Code = 0x3fffe9, Bits = 22 },
  267. new TableEntry{ Code = 0x1fffe7, Bits = 21 },
  268. new TableEntry{ Code = 0x1fffe8, Bits = 21 },
  269. new TableEntry{ Code = 0x7ffff3, Bits = 23 },
  270. new TableEntry{ Code = 0x3fffea, Bits = 22 },
  271. new TableEntry{ Code = 0x3fffeb, Bits = 22 },
  272. new TableEntry{ Code = 0x1ffffee, Bits = 25 },
  273. new TableEntry{ Code = 0x1ffffef, Bits = 25 },
  274. new TableEntry{ Code = 0xfffff4 , Bits = 24 },
  275. new TableEntry{ Code = 0xfffff5 , Bits = 24 },
  276. new TableEntry{ Code = 0x3ffffea, Bits = 26 },
  277. new TableEntry{ Code = 0x7ffff4 , Bits = 23 },
  278. new TableEntry{ Code = 0x3ffffeb, Bits = 26 },
  279. new TableEntry{ Code = 0x7ffffe6, Bits = 27 },
  280. new TableEntry{ Code = 0x3ffffec, Bits = 26 },
  281. new TableEntry{ Code = 0x3ffffed, Bits = 26 },
  282. new TableEntry{ Code = 0x7ffffe7, Bits = 27 },
  283. new TableEntry{ Code = 0x7ffffe8, Bits = 27 },
  284. new TableEntry{ Code = 0x7ffffe9, Bits = 27 },
  285. new TableEntry{ Code = 0x7ffffea, Bits = 27 },
  286. new TableEntry{ Code = 0x7ffffeb, Bits = 27 },
  287. new TableEntry{ Code = 0xffffffe, Bits = 28 },
  288. new TableEntry{ Code = 0x7ffffec, Bits = 27 },
  289. new TableEntry{ Code = 0x7ffffed, Bits = 27 },
  290. new TableEntry{ Code = 0x7ffffee, Bits = 27 },
  291. new TableEntry{ Code = 0x7ffffef, Bits = 27 },
  292. new TableEntry{ Code = 0x7fffff0, Bits = 27 },
  293. new TableEntry{ Code = 0x3ffffee, Bits = 26 },
  294. new TableEntry{ Code = 0x3fffffff, Bits = 30 }
  295. };
  296. //static List<TreeNode> entries = new List<TreeNode>();
  297. static TreeNode[] HuffmanTree = new TreeNode[]
  298. {
  299. new TreeNode { Value = 0, NextZeroIdx = 98, NextOneIdx = 1 },
  300. new TreeNode { Value = 0, NextZeroIdx = 151, NextOneIdx = 2 },
  301. new TreeNode { Value = 0, NextZeroIdx = 173, NextOneIdx = 3 },
  302. new TreeNode { Value = 0, NextZeroIdx = 204, NextOneIdx = 4 },
  303. new TreeNode { Value = 0, NextZeroIdx = 263, NextOneIdx = 5 },
  304. new TreeNode { Value = 0, NextZeroIdx = 113, NextOneIdx = 6 },
  305. new TreeNode { Value = 0, NextZeroIdx = 211, NextOneIdx = 7 },
  306. new TreeNode { Value = 0, NextZeroIdx = 104, NextOneIdx = 8 },
  307. new TreeNode { Value = 0, NextZeroIdx = 116, NextOneIdx = 9 },
  308. new TreeNode { Value = 0, NextZeroIdx = 108, NextOneIdx = 10 },
  309. new TreeNode { Value = 0, NextZeroIdx = 11, NextOneIdx = 14 },
  310. new TreeNode { Value = 0, NextZeroIdx = 12, NextOneIdx = 166 },
  311. new TreeNode { Value = 0, NextZeroIdx = 13, NextOneIdx = 111 },
  312. new TreeNode { Value = 0, NextZeroIdx = 0, NextOneIdx = 0 },
  313. new TreeNode { Value = 0, NextZeroIdx = 220, NextOneIdx = 15 },
  314. new TreeNode { Value = 0, NextZeroIdx = 222, NextOneIdx = 16 },
  315. new TreeNode { Value = 0, NextZeroIdx = 158, NextOneIdx = 17 },
  316. new TreeNode { Value = 0, NextZeroIdx = 270, NextOneIdx = 18 },
  317. new TreeNode { Value = 0, NextZeroIdx = 216, NextOneIdx = 19 },
  318. new TreeNode { Value = 0, NextZeroIdx = 279, NextOneIdx = 20 },
  319. new TreeNode { Value = 0, NextZeroIdx = 21, NextOneIdx = 27 },
  320. new TreeNode { Value = 0, NextZeroIdx = 377, NextOneIdx = 22 },
  321. new TreeNode { Value = 0, NextZeroIdx = 414, NextOneIdx = 23 },
  322. new TreeNode { Value = 0, NextZeroIdx = 24, NextOneIdx = 301 },
  323. new TreeNode { Value = 0, NextZeroIdx = 25, NextOneIdx = 298 },
  324. new TreeNode { Value = 0, NextZeroIdx = 26, NextOneIdx = 295 },
  325. new TreeNode { Value = 1, NextZeroIdx = 0, NextOneIdx = 0 },
  326. new TreeNode { Value = 0, NextZeroIdx = 314, NextOneIdx = 28 },
  327. new TreeNode { Value = 0, NextZeroIdx = 50, NextOneIdx = 29 },
  328. new TreeNode { Value = 0, NextZeroIdx = 362, NextOneIdx = 30 },
  329. new TreeNode { Value = 0, NextZeroIdx = 403, NextOneIdx = 31 },
  330. new TreeNode { Value = 0, NextZeroIdx = 440, NextOneIdx = 32 },
  331. new TreeNode { Value = 0, NextZeroIdx = 33, NextOneIdx = 55 },
  332. new TreeNode { Value = 0, NextZeroIdx = 34, NextOneIdx = 46 },
  333. new TreeNode { Value = 0, NextZeroIdx = 35, NextOneIdx = 39 },
  334. new TreeNode { Value = 0, NextZeroIdx = 510, NextOneIdx = 36 },
  335. new TreeNode { Value = 0, NextZeroIdx = 37, NextOneIdx = 38 },
  336. new TreeNode { Value = 2, NextZeroIdx = 0, NextOneIdx = 0 },
  337. new TreeNode { Value = 3, NextZeroIdx = 0, NextOneIdx = 0 },
  338. new TreeNode { Value = 0, NextZeroIdx = 40, NextOneIdx = 43 },
  339. new TreeNode { Value = 0, NextZeroIdx = 41, NextOneIdx = 42 },
  340. new TreeNode { Value = 4, NextZeroIdx = 0, NextOneIdx = 0 },
  341. new TreeNode { Value = 5, NextZeroIdx = 0, NextOneIdx = 0 },
  342. new TreeNode { Value = 0, NextZeroIdx = 44, NextOneIdx = 45 },
  343. new TreeNode { Value = 6, NextZeroIdx = 0, NextOneIdx = 0 },
  344. new TreeNode { Value = 7, NextZeroIdx = 0, NextOneIdx = 0 },
  345. new TreeNode { Value = 0, NextZeroIdx = 47, NextOneIdx = 67 },
  346. new TreeNode { Value = 0, NextZeroIdx = 48, NextOneIdx = 63 },
  347. new TreeNode { Value = 0, NextZeroIdx = 49, NextOneIdx = 62 },
  348. new TreeNode { Value = 8, NextZeroIdx = 0, NextOneIdx = 0 },
  349. new TreeNode { Value = 0, NextZeroIdx = 396, NextOneIdx = 51 },
  350. new TreeNode { Value = 0, NextZeroIdx = 52, NextOneIdx = 309 },
  351. new TreeNode { Value = 0, NextZeroIdx = 486, NextOneIdx = 53 },
  352. new TreeNode { Value = 0, NextZeroIdx = 54, NextOneIdx = 307 },
  353. new TreeNode { Value = 9, NextZeroIdx = 0, NextOneIdx = 0 },
  354. new TreeNode { Value = 0, NextZeroIdx = 74, NextOneIdx = 56 },
  355. new TreeNode { Value = 0, NextZeroIdx = 91, NextOneIdx = 57 },
  356. new TreeNode { Value = 0, NextZeroIdx = 274, NextOneIdx = 58 },
  357. new TreeNode { Value = 0, NextZeroIdx = 502, NextOneIdx = 59 },
  358. new TreeNode { Value = 0, NextZeroIdx = 60, NextOneIdx = 81 },
  359. new TreeNode { Value = 0, NextZeroIdx = 61, NextOneIdx = 65 },
  360. new TreeNode { Value = 10, NextZeroIdx = 0, NextOneIdx = 0 },
  361. new TreeNode { Value = 11, NextZeroIdx = 0, NextOneIdx = 0 },
  362. new TreeNode { Value = 0, NextZeroIdx = 64, NextOneIdx = 66 },
  363. new TreeNode { Value = 12, NextZeroIdx = 0, NextOneIdx = 0 },
  364. new TreeNode { Value = 13, NextZeroIdx = 0, NextOneIdx = 0 },
  365. new TreeNode { Value = 14, NextZeroIdx = 0, NextOneIdx = 0 },
  366. new TreeNode { Value = 0, NextZeroIdx = 68, NextOneIdx = 71 },
  367. new TreeNode { Value = 0, NextZeroIdx = 69, NextOneIdx = 70 },
  368. new TreeNode { Value = 15, NextZeroIdx = 0, NextOneIdx = 0 },
  369. new TreeNode { Value = 16, NextZeroIdx = 0, NextOneIdx = 0 },
  370. new TreeNode { Value = 0, NextZeroIdx = 72, NextOneIdx = 73 },
  371. new TreeNode { Value = 17, NextZeroIdx = 0, NextOneIdx = 0 },
  372. new TreeNode { Value = 18, NextZeroIdx = 0, NextOneIdx = 0 },
  373. new TreeNode { Value = 0, NextZeroIdx = 75, NextOneIdx = 84 },
  374. new TreeNode { Value = 0, NextZeroIdx = 76, NextOneIdx = 79 },
  375. new TreeNode { Value = 0, NextZeroIdx = 77, NextOneIdx = 78 },
  376. new TreeNode { Value = 19, NextZeroIdx = 0, NextOneIdx = 0 },
  377. new TreeNode { Value = 20, NextZeroIdx = 0, NextOneIdx = 0 },
  378. new TreeNode { Value = 0, NextZeroIdx = 80, NextOneIdx = 83 },
  379. new TreeNode { Value = 21, NextZeroIdx = 0, NextOneIdx = 0 },
  380. new TreeNode { Value = 0, NextZeroIdx = 82, NextOneIdx = 512 },
  381. new TreeNode { Value = 22, NextZeroIdx = 0, NextOneIdx = 0 },
  382. new TreeNode { Value = 23, NextZeroIdx = 0, NextOneIdx = 0 },
  383. new TreeNode { Value = 0, NextZeroIdx = 85, NextOneIdx = 88 },
  384. new TreeNode { Value = 0, NextZeroIdx = 86, NextOneIdx = 87 },
  385. new TreeNode { Value = 24, NextZeroIdx = 0, NextOneIdx = 0 },
  386. new TreeNode { Value = 25, NextZeroIdx = 0, NextOneIdx = 0 },
  387. new TreeNode { Value = 0, NextZeroIdx = 89, NextOneIdx = 90 },
  388. new TreeNode { Value = 26, NextZeroIdx = 0, NextOneIdx = 0 },
  389. new TreeNode { Value = 27, NextZeroIdx = 0, NextOneIdx = 0 },
  390. new TreeNode { Value = 0, NextZeroIdx = 92, NextOneIdx = 95 },
  391. new TreeNode { Value = 0, NextZeroIdx = 93, NextOneIdx = 94 },
  392. new TreeNode { Value = 28, NextZeroIdx = 0, NextOneIdx = 0 },
  393. new TreeNode { Value = 29, NextZeroIdx = 0, NextOneIdx = 0 },
  394. new TreeNode { Value = 0, NextZeroIdx = 96, NextOneIdx = 97 },
  395. new TreeNode { Value = 30, NextZeroIdx = 0, NextOneIdx = 0 },
  396. new TreeNode { Value = 31, NextZeroIdx = 0, NextOneIdx = 0 },
  397. new TreeNode { Value = 0, NextZeroIdx = 133, NextOneIdx = 99 },
  398. new TreeNode { Value = 0, NextZeroIdx = 100, NextOneIdx = 129 },
  399. new TreeNode { Value = 0, NextZeroIdx = 258, NextOneIdx = 101 },
  400. new TreeNode { Value = 0, NextZeroIdx = 102, NextOneIdx = 126 },
  401. new TreeNode { Value = 0, NextZeroIdx = 103, NextOneIdx = 112 },
  402. new TreeNode { Value = 32, NextZeroIdx = 0, NextOneIdx = 0 },
  403. new TreeNode { Value = 0, NextZeroIdx = 105, NextOneIdx = 119 },
  404. new TreeNode { Value = 0, NextZeroIdx = 106, NextOneIdx = 107 },
  405. new TreeNode { Value = 33, NextZeroIdx = 0, NextOneIdx = 0 },
  406. new TreeNode { Value = 34, NextZeroIdx = 0, NextOneIdx = 0 },
  407. new TreeNode { Value = 0, NextZeroIdx = 271, NextOneIdx = 109 },
  408. new TreeNode { Value = 0, NextZeroIdx = 110, NextOneIdx = 164 },
  409. new TreeNode { Value = 35, NextZeroIdx = 0, NextOneIdx = 0 },
  410. new TreeNode { Value = 36, NextZeroIdx = 0, NextOneIdx = 0 },
  411. new TreeNode { Value = 37, NextZeroIdx = 0, NextOneIdx = 0 },
  412. new TreeNode { Value = 0, NextZeroIdx = 114, NextOneIdx = 124 },
  413. new TreeNode { Value = 0, NextZeroIdx = 115, NextOneIdx = 122 },
  414. new TreeNode { Value = 38, NextZeroIdx = 0, NextOneIdx = 0 },
  415. new TreeNode { Value = 0, NextZeroIdx = 165, NextOneIdx = 117 },
  416. new TreeNode { Value = 0, NextZeroIdx = 118, NextOneIdx = 123 },
  417. new TreeNode { Value = 39, NextZeroIdx = 0, NextOneIdx = 0 },
  418. new TreeNode { Value = 0, NextZeroIdx = 120, NextOneIdx = 121 },
  419. new TreeNode { Value = 40, NextZeroIdx = 0, NextOneIdx = 0 },
  420. new TreeNode { Value = 41, NextZeroIdx = 0, NextOneIdx = 0 },
  421. new TreeNode { Value = 42, NextZeroIdx = 0, NextOneIdx = 0 },
  422. new TreeNode { Value = 43, NextZeroIdx = 0, NextOneIdx = 0 },
  423. new TreeNode { Value = 0, NextZeroIdx = 125, NextOneIdx = 157 },
  424. new TreeNode { Value = 44, NextZeroIdx = 0, NextOneIdx = 0 },
  425. new TreeNode { Value = 0, NextZeroIdx = 127, NextOneIdx = 128 },
  426. new TreeNode { Value = 45, NextZeroIdx = 0, NextOneIdx = 0 },
  427. new TreeNode { Value = 46, NextZeroIdx = 0, NextOneIdx = 0 },
  428. new TreeNode { Value = 0, NextZeroIdx = 130, NextOneIdx = 144 },
  429. new TreeNode { Value = 0, NextZeroIdx = 131, NextOneIdx = 141 },
  430. new TreeNode { Value = 0, NextZeroIdx = 132, NextOneIdx = 140 },
  431. new TreeNode { Value = 47, NextZeroIdx = 0, NextOneIdx = 0 },
  432. new TreeNode { Value = 0, NextZeroIdx = 134, NextOneIdx = 229 },
  433. new TreeNode { Value = 0, NextZeroIdx = 135, NextOneIdx = 138 },
  434. new TreeNode { Value = 0, NextZeroIdx = 136, NextOneIdx = 137 },
  435. new TreeNode { Value = 48, NextZeroIdx = 0, NextOneIdx = 0 },
  436. new TreeNode { Value = 49, NextZeroIdx = 0, NextOneIdx = 0 },
  437. new TreeNode { Value = 0, NextZeroIdx = 139, NextOneIdx = 227 },
  438. new TreeNode { Value = 50, NextZeroIdx = 0, NextOneIdx = 0 },
  439. new TreeNode { Value = 51, NextZeroIdx = 0, NextOneIdx = 0 },
  440. new TreeNode { Value = 0, NextZeroIdx = 142, NextOneIdx = 143 },
  441. new TreeNode { Value = 52, NextZeroIdx = 0, NextOneIdx = 0 },
  442. new TreeNode { Value = 53, NextZeroIdx = 0, NextOneIdx = 0 },
  443. new TreeNode { Value = 0, NextZeroIdx = 145, NextOneIdx = 148 },
  444. new TreeNode { Value = 0, NextZeroIdx = 146, NextOneIdx = 147 },
  445. new TreeNode { Value = 54, NextZeroIdx = 0, NextOneIdx = 0 },
  446. new TreeNode { Value = 55, NextZeroIdx = 0, NextOneIdx = 0 },
  447. new TreeNode { Value = 0, NextZeroIdx = 149, NextOneIdx = 150 },
  448. new TreeNode { Value = 56, NextZeroIdx = 0, NextOneIdx = 0 },
  449. new TreeNode { Value = 57, NextZeroIdx = 0, NextOneIdx = 0 },
  450. new TreeNode { Value = 0, NextZeroIdx = 160, NextOneIdx = 152 },
  451. new TreeNode { Value = 0, NextZeroIdx = 246, NextOneIdx = 153 },
  452. new TreeNode { Value = 0, NextZeroIdx = 256, NextOneIdx = 154 },
  453. new TreeNode { Value = 0, NextZeroIdx = 155, NextOneIdx = 170 },
  454. new TreeNode { Value = 0, NextZeroIdx = 156, NextOneIdx = 169 },
  455. new TreeNode { Value = 58, NextZeroIdx = 0, NextOneIdx = 0 },
  456. new TreeNode { Value = 59, NextZeroIdx = 0, NextOneIdx = 0 },
  457. new TreeNode { Value = 0, NextZeroIdx = 159, NextOneIdx = 226 },
  458. new TreeNode { Value = 60, NextZeroIdx = 0, NextOneIdx = 0 },
  459. new TreeNode { Value = 0, NextZeroIdx = 161, NextOneIdx = 232 },
  460. new TreeNode { Value = 0, NextZeroIdx = 162, NextOneIdx = 224 },
  461. new TreeNode { Value = 0, NextZeroIdx = 163, NextOneIdx = 168 },
  462. new TreeNode { Value = 61, NextZeroIdx = 0, NextOneIdx = 0 },
  463. new TreeNode { Value = 62, NextZeroIdx = 0, NextOneIdx = 0 },
  464. new TreeNode { Value = 63, NextZeroIdx = 0, NextOneIdx = 0 },
  465. new TreeNode { Value = 0, NextZeroIdx = 167, NextOneIdx = 215 },
  466. new TreeNode { Value = 64, NextZeroIdx = 0, NextOneIdx = 0 },
  467. new TreeNode { Value = 65, NextZeroIdx = 0, NextOneIdx = 0 },
  468. new TreeNode { Value = 66, NextZeroIdx = 0, NextOneIdx = 0 },
  469. new TreeNode { Value = 0, NextZeroIdx = 171, NextOneIdx = 172 },
  470. new TreeNode { Value = 67, NextZeroIdx = 0, NextOneIdx = 0 },
  471. new TreeNode { Value = 68, NextZeroIdx = 0, NextOneIdx = 0 },
  472. new TreeNode { Value = 0, NextZeroIdx = 174, NextOneIdx = 189 },
  473. new TreeNode { Value = 0, NextZeroIdx = 175, NextOneIdx = 182 },
  474. new TreeNode { Value = 0, NextZeroIdx = 176, NextOneIdx = 179 },
  475. new TreeNode { Value = 0, NextZeroIdx = 177, NextOneIdx = 178 },
  476. new TreeNode { Value = 69, NextZeroIdx = 0, NextOneIdx = 0 },
  477. new TreeNode { Value = 70, NextZeroIdx = 0, NextOneIdx = 0 },
  478. new TreeNode { Value = 0, NextZeroIdx = 180, NextOneIdx = 181 },
  479. new TreeNode { Value = 71, NextZeroIdx = 0, NextOneIdx = 0 },
  480. new TreeNode { Value = 72, NextZeroIdx = 0, NextOneIdx = 0 },
  481. new TreeNode { Value = 0, NextZeroIdx = 183, NextOneIdx = 186 },
  482. new TreeNode { Value = 0, NextZeroIdx = 184, NextOneIdx = 185 },
  483. new TreeNode { Value = 73, NextZeroIdx = 0, NextOneIdx = 0 },
  484. new TreeNode { Value = 74, NextZeroIdx = 0, NextOneIdx = 0 },
  485. new TreeNode { Value = 0, NextZeroIdx = 187, NextOneIdx = 188 },
  486. new TreeNode { Value = 75, NextZeroIdx = 0, NextOneIdx = 0 },
  487. new TreeNode { Value = 76, NextZeroIdx = 0, NextOneIdx = 0 },
  488. new TreeNode { Value = 0, NextZeroIdx = 190, NextOneIdx = 197 },
  489. new TreeNode { Value = 0, NextZeroIdx = 191, NextOneIdx = 194 },
  490. new TreeNode { Value = 0, NextZeroIdx = 192, NextOneIdx = 193 },
  491. new TreeNode { Value = 77, NextZeroIdx = 0, NextOneIdx = 0 },
  492. new TreeNode { Value = 78, NextZeroIdx = 0, NextOneIdx = 0 },
  493. new TreeNode { Value = 0, NextZeroIdx = 195, NextOneIdx = 196 },
  494. new TreeNode { Value = 79, NextZeroIdx = 0, NextOneIdx = 0 },
  495. new TreeNode { Value = 80, NextZeroIdx = 0, NextOneIdx = 0 },
  496. new TreeNode { Value = 0, NextZeroIdx = 198, NextOneIdx = 201 },
  497. new TreeNode { Value = 0, NextZeroIdx = 199, NextOneIdx = 200 },
  498. new TreeNode { Value = 81, NextZeroIdx = 0, NextOneIdx = 0 },
  499. new TreeNode { Value = 82, NextZeroIdx = 0, NextOneIdx = 0 },
  500. new TreeNode { Value = 0, NextZeroIdx = 202, NextOneIdx = 203 },
  501. new TreeNode { Value = 83, NextZeroIdx = 0, NextOneIdx = 0 },
  502. new TreeNode { Value = 84, NextZeroIdx = 0, NextOneIdx = 0 },
  503. new TreeNode { Value = 0, NextZeroIdx = 205, NextOneIdx = 242 },
  504. new TreeNode { Value = 0, NextZeroIdx = 206, NextOneIdx = 209 },
  505. new TreeNode { Value = 0, NextZeroIdx = 207, NextOneIdx = 208 },
  506. new TreeNode { Value = 85, NextZeroIdx = 0, NextOneIdx = 0 },
  507. new TreeNode { Value = 86, NextZeroIdx = 0, NextOneIdx = 0 },
  508. new TreeNode { Value = 0, NextZeroIdx = 210, NextOneIdx = 213 },
  509. new TreeNode { Value = 87, NextZeroIdx = 0, NextOneIdx = 0 },
  510. new TreeNode { Value = 0, NextZeroIdx = 212, NextOneIdx = 214 },
  511. new TreeNode { Value = 88, NextZeroIdx = 0, NextOneIdx = 0 },
  512. new TreeNode { Value = 89, NextZeroIdx = 0, NextOneIdx = 0 },
  513. new TreeNode { Value = 90, NextZeroIdx = 0, NextOneIdx = 0 },
  514. new TreeNode { Value = 91, NextZeroIdx = 0, NextOneIdx = 0 },
  515. new TreeNode { Value = 0, NextZeroIdx = 217, NextOneIdx = 286 },
  516. new TreeNode { Value = 0, NextZeroIdx = 218, NextOneIdx = 276 },
  517. new TreeNode { Value = 0, NextZeroIdx = 219, NextOneIdx = 410 },
  518. new TreeNode { Value = 92, NextZeroIdx = 0, NextOneIdx = 0 },
  519. new TreeNode { Value = 0, NextZeroIdx = 221, NextOneIdx = 273 },
  520. new TreeNode { Value = 93, NextZeroIdx = 0, NextOneIdx = 0 },
  521. new TreeNode { Value = 0, NextZeroIdx = 223, NextOneIdx = 272 },
  522. new TreeNode { Value = 94, NextZeroIdx = 0, NextOneIdx = 0 },
  523. new TreeNode { Value = 0, NextZeroIdx = 225, NextOneIdx = 228 },
  524. new TreeNode { Value = 95, NextZeroIdx = 0, NextOneIdx = 0 },
  525. new TreeNode { Value = 96, NextZeroIdx = 0, NextOneIdx = 0 },
  526. new TreeNode { Value = 97, NextZeroIdx = 0, NextOneIdx = 0 },
  527. new TreeNode { Value = 98, NextZeroIdx = 0, NextOneIdx = 0 },
  528. new TreeNode { Value = 0, NextZeroIdx = 230, NextOneIdx = 240 },
  529. new TreeNode { Value = 0, NextZeroIdx = 231, NextOneIdx = 235 },
  530. new TreeNode { Value = 99, NextZeroIdx = 0, NextOneIdx = 0 },
  531. new TreeNode { Value = 0, NextZeroIdx = 233, NextOneIdx = 237 },
  532. new TreeNode { Value = 0, NextZeroIdx = 234, NextOneIdx = 236 },
  533. new TreeNode { Value = 100, NextZeroIdx = 0, NextOneIdx = 0 },
  534. new TreeNode { Value = 101, NextZeroIdx = 0, NextOneIdx = 0 },
  535. new TreeNode { Value = 102, NextZeroIdx = 0, NextOneIdx = 0 },
  536. new TreeNode { Value = 0, NextZeroIdx = 238, NextOneIdx = 239 },
  537. new TreeNode { Value = 103, NextZeroIdx = 0, NextOneIdx = 0 },
  538. new TreeNode { Value = 104, NextZeroIdx = 0, NextOneIdx = 0 },
  539. new TreeNode { Value = 0, NextZeroIdx = 241, NextOneIdx = 252 },
  540. new TreeNode { Value = 105, NextZeroIdx = 0, NextOneIdx = 0 },
  541. new TreeNode { Value = 0, NextZeroIdx = 243, NextOneIdx = 254 },
  542. new TreeNode { Value = 0, NextZeroIdx = 244, NextOneIdx = 245 },
  543. new TreeNode { Value = 106, NextZeroIdx = 0, NextOneIdx = 0 },
  544. new TreeNode { Value = 107, NextZeroIdx = 0, NextOneIdx = 0 },
  545. new TreeNode { Value = 0, NextZeroIdx = 247, NextOneIdx = 250 },
  546. new TreeNode { Value = 0, NextZeroIdx = 248, NextOneIdx = 249 },
  547. new TreeNode { Value = 108, NextZeroIdx = 0, NextOneIdx = 0 },
  548. new TreeNode { Value = 109, NextZeroIdx = 0, NextOneIdx = 0 },
  549. new TreeNode { Value = 0, NextZeroIdx = 251, NextOneIdx = 253 },
  550. new TreeNode { Value = 110, NextZeroIdx = 0, NextOneIdx = 0 },
  551. new TreeNode { Value = 111, NextZeroIdx = 0, NextOneIdx = 0 },
  552. new TreeNode { Value = 112, NextZeroIdx = 0, NextOneIdx = 0 },
  553. new TreeNode { Value = 0, NextZeroIdx = 255, NextOneIdx = 262 },
  554. new TreeNode { Value = 113, NextZeroIdx = 0, NextOneIdx = 0 },
  555. new TreeNode { Value = 0, NextZeroIdx = 257, NextOneIdx = 261 },
  556. new TreeNode { Value = 114, NextZeroIdx = 0, NextOneIdx = 0 },
  557. new TreeNode { Value = 0, NextZeroIdx = 259, NextOneIdx = 260 },
  558. new TreeNode { Value = 115, NextZeroIdx = 0, NextOneIdx = 0 },
  559. new TreeNode { Value = 116, NextZeroIdx = 0, NextOneIdx = 0 },
  560. new TreeNode { Value = 117, NextZeroIdx = 0, NextOneIdx = 0 },
  561. new TreeNode { Value = 118, NextZeroIdx = 0, NextOneIdx = 0 },
  562. new TreeNode { Value = 0, NextZeroIdx = 264, NextOneIdx = 267 },
  563. new TreeNode { Value = 0, NextZeroIdx = 265, NextOneIdx = 266 },
  564. new TreeNode { Value = 119, NextZeroIdx = 0, NextOneIdx = 0 },
  565. new TreeNode { Value = 120, NextZeroIdx = 0, NextOneIdx = 0 },
  566. new TreeNode { Value = 0, NextZeroIdx = 268, NextOneIdx = 269 },
  567. new TreeNode { Value = 121, NextZeroIdx = 0, NextOneIdx = 0 },
  568. new TreeNode { Value = 122, NextZeroIdx = 0, NextOneIdx = 0 },
  569. new TreeNode { Value = 123, NextZeroIdx = 0, NextOneIdx = 0 },
  570. new TreeNode { Value = 124, NextZeroIdx = 0, NextOneIdx = 0 },
  571. new TreeNode { Value = 125, NextZeroIdx = 0, NextOneIdx = 0 },
  572. new TreeNode { Value = 126, NextZeroIdx = 0, NextOneIdx = 0 },
  573. new TreeNode { Value = 0, NextZeroIdx = 275, NextOneIdx = 459 },
  574. new TreeNode { Value = 127, NextZeroIdx = 0, NextOneIdx = 0 },
  575. new TreeNode { Value = 0, NextZeroIdx = 436, NextOneIdx = 277 },
  576. new TreeNode { Value = 0, NextZeroIdx = 278, NextOneIdx = 285 },
  577. new TreeNode { Value = 128, NextZeroIdx = 0, NextOneIdx = 0 },
  578. new TreeNode { Value = 0, NextZeroIdx = 372, NextOneIdx = 280 },
  579. new TreeNode { Value = 0, NextZeroIdx = 281, NextOneIdx = 332 },
  580. new TreeNode { Value = 0, NextZeroIdx = 282, NextOneIdx = 291 },
  581. new TreeNode { Value = 0, NextZeroIdx = 473, NextOneIdx = 283 },
  582. new TreeNode { Value = 0, NextZeroIdx = 284, NextOneIdx = 290 },
  583. new TreeNode { Value = 129, NextZeroIdx = 0, NextOneIdx = 0 },
  584. new TreeNode { Value = 130, NextZeroIdx = 0, NextOneIdx = 0 },
  585. new TreeNode { Value = 0, NextZeroIdx = 287, NextOneIdx = 328 },
  586. new TreeNode { Value = 0, NextZeroIdx = 288, NextOneIdx = 388 },
  587. new TreeNode { Value = 0, NextZeroIdx = 289, NextOneIdx = 345 },
  588. new TreeNode { Value = 131, NextZeroIdx = 0, NextOneIdx = 0 },
  589. new TreeNode { Value = 132, NextZeroIdx = 0, NextOneIdx = 0 },
  590. new TreeNode { Value = 0, NextZeroIdx = 292, NextOneIdx = 296 },
  591. new TreeNode { Value = 0, NextZeroIdx = 293, NextOneIdx = 294 },
  592. new TreeNode { Value = 133, NextZeroIdx = 0, NextOneIdx = 0 },
  593. new TreeNode { Value = 134, NextZeroIdx = 0, NextOneIdx = 0 },
  594. new TreeNode { Value = 135, NextZeroIdx = 0, NextOneIdx = 0 },
  595. new TreeNode { Value = 0, NextZeroIdx = 297, NextOneIdx = 313 },
  596. new TreeNode { Value = 136, NextZeroIdx = 0, NextOneIdx = 0 },
  597. new TreeNode { Value = 0, NextZeroIdx = 299, NextOneIdx = 300 },
  598. new TreeNode { Value = 137, NextZeroIdx = 0, NextOneIdx = 0 },
  599. new TreeNode { Value = 138, NextZeroIdx = 0, NextOneIdx = 0 },
  600. new TreeNode { Value = 0, NextZeroIdx = 302, NextOneIdx = 305 },
  601. new TreeNode { Value = 0, NextZeroIdx = 303, NextOneIdx = 304 },
  602. new TreeNode { Value = 139, NextZeroIdx = 0, NextOneIdx = 0 },
  603. new TreeNode { Value = 140, NextZeroIdx = 0, NextOneIdx = 0 },
  604. new TreeNode { Value = 0, NextZeroIdx = 306, NextOneIdx = 308 },
  605. new TreeNode { Value = 141, NextZeroIdx = 0, NextOneIdx = 0 },
  606. new TreeNode { Value = 142, NextZeroIdx = 0, NextOneIdx = 0 },
  607. new TreeNode { Value = 143, NextZeroIdx = 0, NextOneIdx = 0 },
  608. new TreeNode { Value = 0, NextZeroIdx = 310, NextOneIdx = 319 },
  609. new TreeNode { Value = 0, NextZeroIdx = 311, NextOneIdx = 312 },
  610. new TreeNode { Value = 144, NextZeroIdx = 0, NextOneIdx = 0 },
  611. new TreeNode { Value = 145, NextZeroIdx = 0, NextOneIdx = 0 },
  612. new TreeNode { Value = 146, NextZeroIdx = 0, NextOneIdx = 0 },
  613. new TreeNode { Value = 0, NextZeroIdx = 315, NextOneIdx = 350 },
  614. new TreeNode { Value = 0, NextZeroIdx = 316, NextOneIdx = 325 },
  615. new TreeNode { Value = 0, NextZeroIdx = 317, NextOneIdx = 322 },
  616. new TreeNode { Value = 0, NextZeroIdx = 318, NextOneIdx = 321 },
  617. new TreeNode { Value = 147, NextZeroIdx = 0, NextOneIdx = 0 },
  618. new TreeNode { Value = 0, NextZeroIdx = 320, NextOneIdx = 341 },
  619. new TreeNode { Value = 148, NextZeroIdx = 0, NextOneIdx = 0 },
  620. new TreeNode { Value = 149, NextZeroIdx = 0, NextOneIdx = 0 },
  621. new TreeNode { Value = 0, NextZeroIdx = 323, NextOneIdx = 324 },
  622. new TreeNode { Value = 150, NextZeroIdx = 0, NextOneIdx = 0 },
  623. new TreeNode { Value = 151, NextZeroIdx = 0, NextOneIdx = 0 },
  624. new TreeNode { Value = 0, NextZeroIdx = 326, NextOneIdx = 338 },
  625. new TreeNode { Value = 0, NextZeroIdx = 327, NextOneIdx = 336 },
  626. new TreeNode { Value = 152, NextZeroIdx = 0, NextOneIdx = 0 },
  627. new TreeNode { Value = 0, NextZeroIdx = 465, NextOneIdx = 329 },
  628. new TreeNode { Value = 0, NextZeroIdx = 330, NextOneIdx = 355 },
  629. new TreeNode { Value = 0, NextZeroIdx = 331, NextOneIdx = 344 },
  630. new TreeNode { Value = 153, NextZeroIdx = 0, NextOneIdx = 0 },
  631. new TreeNode { Value = 0, NextZeroIdx = 333, NextOneIdx = 347 },
  632. new TreeNode { Value = 0, NextZeroIdx = 334, NextOneIdx = 342 },
  633. new TreeNode { Value = 0, NextZeroIdx = 335, NextOneIdx = 337 },
  634. new TreeNode { Value = 154, NextZeroIdx = 0, NextOneIdx = 0 },
  635. new TreeNode { Value = 155, NextZeroIdx = 0, NextOneIdx = 0 },
  636. new TreeNode { Value = 156, NextZeroIdx = 0, NextOneIdx = 0 },
  637. new TreeNode { Value = 0, NextZeroIdx = 339, NextOneIdx = 340 },
  638. new TreeNode { Value = 157, NextZeroIdx = 0, NextOneIdx = 0 },
  639. new TreeNode { Value = 158, NextZeroIdx = 0, NextOneIdx = 0 },
  640. new TreeNode { Value = 159, NextZeroIdx = 0, NextOneIdx = 0 },
  641. new TreeNode { Value = 0, NextZeroIdx = 343, NextOneIdx = 346 },
  642. new TreeNode { Value = 160, NextZeroIdx = 0, NextOneIdx = 0 },
  643. new TreeNode { Value = 161, NextZeroIdx = 0, NextOneIdx = 0 },
  644. new TreeNode { Value = 162, NextZeroIdx = 0, NextOneIdx = 0 },
  645. new TreeNode { Value = 163, NextZeroIdx = 0, NextOneIdx = 0 },
  646. new TreeNode { Value = 0, NextZeroIdx = 348, NextOneIdx = 360 },
  647. new TreeNode { Value = 0, NextZeroIdx = 349, NextOneIdx = 359 },
  648. new TreeNode { Value = 164, NextZeroIdx = 0, NextOneIdx = 0 },
  649. new TreeNode { Value = 0, NextZeroIdx = 351, NextOneIdx = 369 },
  650. new TreeNode { Value = 0, NextZeroIdx = 352, NextOneIdx = 357 },
  651. new TreeNode { Value = 0, NextZeroIdx = 353, NextOneIdx = 354 },
  652. new TreeNode { Value = 165, NextZeroIdx = 0, NextOneIdx = 0 },
  653. new TreeNode { Value = 166, NextZeroIdx = 0, NextOneIdx = 0 },
  654. new TreeNode { Value = 0, NextZeroIdx = 356, NextOneIdx = 366 },
  655. new TreeNode { Value = 167, NextZeroIdx = 0, NextOneIdx = 0 },
  656. new TreeNode { Value = 0, NextZeroIdx = 358, NextOneIdx = 368 },
  657. new TreeNode { Value = 168, NextZeroIdx = 0, NextOneIdx = 0 },
  658. new TreeNode { Value = 169, NextZeroIdx = 0, NextOneIdx = 0 },
  659. new TreeNode { Value = 0, NextZeroIdx = 361, NextOneIdx = 367 },
  660. new TreeNode { Value = 170, NextZeroIdx = 0, NextOneIdx = 0 },
  661. new TreeNode { Value = 0, NextZeroIdx = 363, NextOneIdx = 417 },
  662. new TreeNode { Value = 0, NextZeroIdx = 364, NextOneIdx = 449 },
  663. new TreeNode { Value = 0, NextZeroIdx = 365, NextOneIdx = 434 },
  664. new TreeNode { Value = 171, NextZeroIdx = 0, NextOneIdx = 0 },
  665. new TreeNode { Value = 172, NextZeroIdx = 0, NextOneIdx = 0 },
  666. new TreeNode { Value = 173, NextZeroIdx = 0, NextOneIdx = 0 },
  667. new TreeNode { Value = 174, NextZeroIdx = 0, NextOneIdx = 0 },
  668. new TreeNode { Value = 0, NextZeroIdx = 370, NextOneIdx = 385 },
  669. new TreeNode { Value = 0, NextZeroIdx = 371, NextOneIdx = 383 },
  670. new TreeNode { Value = 175, NextZeroIdx = 0, NextOneIdx = 0 },
  671. new TreeNode { Value = 0, NextZeroIdx = 373, NextOneIdx = 451 },
  672. new TreeNode { Value = 0, NextZeroIdx = 374, NextOneIdx = 381 },
  673. new TreeNode { Value = 0, NextZeroIdx = 375, NextOneIdx = 376 },
  674. new TreeNode { Value = 176, NextZeroIdx = 0, NextOneIdx = 0 },
  675. new TreeNode { Value = 177, NextZeroIdx = 0, NextOneIdx = 0 },
  676. new TreeNode { Value = 0, NextZeroIdx = 378, NextOneIdx = 393 },
  677. new TreeNode { Value = 0, NextZeroIdx = 379, NextOneIdx = 390 },
  678. new TreeNode { Value = 0, NextZeroIdx = 380, NextOneIdx = 384 },
  679. new TreeNode { Value = 178, NextZeroIdx = 0, NextOneIdx = 0 },
  680. new TreeNode { Value = 0, NextZeroIdx = 382, NextOneIdx = 437 },
  681. new TreeNode { Value = 179, NextZeroIdx = 0, NextOneIdx = 0 },
  682. new TreeNode { Value = 180, NextZeroIdx = 0, NextOneIdx = 0 },
  683. new TreeNode { Value = 181, NextZeroIdx = 0, NextOneIdx = 0 },
  684. new TreeNode { Value = 0, NextZeroIdx = 386, NextOneIdx = 387 },
  685. new TreeNode { Value = 182, NextZeroIdx = 0, NextOneIdx = 0 },
  686. new TreeNode { Value = 183, NextZeroIdx = 0, NextOneIdx = 0 },
  687. new TreeNode { Value = 0, NextZeroIdx = 389, NextOneIdx = 409 },
  688. new TreeNode { Value = 184, NextZeroIdx = 0, NextOneIdx = 0 },
  689. new TreeNode { Value = 0, NextZeroIdx = 391, NextOneIdx = 392 },
  690. new TreeNode { Value = 185, NextZeroIdx = 0, NextOneIdx = 0 },
  691. new TreeNode { Value = 186, NextZeroIdx = 0, NextOneIdx = 0 },
  692. new TreeNode { Value = 0, NextZeroIdx = 394, NextOneIdx = 400 },
  693. new TreeNode { Value = 0, NextZeroIdx = 395, NextOneIdx = 399 },
  694. new TreeNode { Value = 187, NextZeroIdx = 0, NextOneIdx = 0 },
  695. new TreeNode { Value = 0, NextZeroIdx = 397, NextOneIdx = 412 },
  696. new TreeNode { Value = 0, NextZeroIdx = 398, NextOneIdx = 402 },
  697. new TreeNode { Value = 188, NextZeroIdx = 0, NextOneIdx = 0 },
  698. new TreeNode { Value = 189, NextZeroIdx = 0, NextOneIdx = 0 },
  699. new TreeNode { Value = 0, NextZeroIdx = 401, NextOneIdx = 411 },
  700. new TreeNode { Value = 190, NextZeroIdx = 0, NextOneIdx = 0 },
  701. new TreeNode { Value = 191, NextZeroIdx = 0, NextOneIdx = 0 },
  702. new TreeNode { Value = 0, NextZeroIdx = 404, NextOneIdx = 427 },
  703. new TreeNode { Value = 0, NextZeroIdx = 405, NextOneIdx = 424 },
  704. new TreeNode { Value = 0, NextZeroIdx = 406, NextOneIdx = 421 },
  705. new TreeNode { Value = 0, NextZeroIdx = 407, NextOneIdx = 408 },
  706. new TreeNode { Value = 192, NextZeroIdx = 0, NextOneIdx = 0 },
  707. new TreeNode { Value = 193, NextZeroIdx = 0, NextOneIdx = 0 },
  708. new TreeNode { Value = 194, NextZeroIdx = 0, NextOneIdx = 0 },
  709. new TreeNode { Value = 195, NextZeroIdx = 0, NextOneIdx = 0 },
  710. new TreeNode { Value = 196, NextZeroIdx = 0, NextOneIdx = 0 },
  711. new TreeNode { Value = 0, NextZeroIdx = 413, NextOneIdx = 474 },
  712. new TreeNode { Value = 197, NextZeroIdx = 0, NextOneIdx = 0 },
  713. new TreeNode { Value = 0, NextZeroIdx = 415, NextOneIdx = 475 },
  714. new TreeNode { Value = 0, NextZeroIdx = 416, NextOneIdx = 471 },
  715. new TreeNode { Value = 198, NextZeroIdx = 0, NextOneIdx = 0 },
  716. new TreeNode { Value = 0, NextZeroIdx = 481, NextOneIdx = 418 },
  717. new TreeNode { Value = 0, NextZeroIdx = 419, NextOneIdx = 478 },
  718. new TreeNode { Value = 0, NextZeroIdx = 420, NextOneIdx = 435 },
  719. new TreeNode { Value = 199, NextZeroIdx = 0, NextOneIdx = 0 },
  720. new TreeNode { Value = 0, NextZeroIdx = 422, NextOneIdx = 423 },
  721. new TreeNode { Value = 200, NextZeroIdx = 0, NextOneIdx = 0 },
  722. new TreeNode { Value = 201, NextZeroIdx = 0, NextOneIdx = 0 },
  723. new TreeNode { Value = 0, NextZeroIdx = 425, NextOneIdx = 438 },
  724. new TreeNode { Value = 0, NextZeroIdx = 426, NextOneIdx = 433 },
  725. new TreeNode { Value = 202, NextZeroIdx = 0, NextOneIdx = 0 },
  726. new TreeNode { Value = 0, NextZeroIdx = 455, NextOneIdx = 428 },
  727. new TreeNode { Value = 0, NextZeroIdx = 490, NextOneIdx = 429 },
  728. new TreeNode { Value = 0, NextZeroIdx = 511, NextOneIdx = 430 },
  729. new TreeNode { Value = 0, NextZeroIdx = 431, NextOneIdx = 432 },
  730. new TreeNode { Value = 203, NextZeroIdx = 0, NextOneIdx = 0 },
  731. new TreeNode { Value = 204, NextZeroIdx = 0, NextOneIdx = 0 },
  732. new TreeNode { Value = 205, NextZeroIdx = 0, NextOneIdx = 0 },
  733. new TreeNode { Value = 206, NextZeroIdx = 0, NextOneIdx = 0 },
  734. new TreeNode { Value = 207, NextZeroIdx = 0, NextOneIdx = 0 },
  735. new TreeNode { Value = 208, NextZeroIdx = 0, NextOneIdx = 0 },
  736. new TreeNode { Value = 209, NextZeroIdx = 0, NextOneIdx = 0 },
  737. new TreeNode { Value = 0, NextZeroIdx = 439, NextOneIdx = 446 },
  738. new TreeNode { Value = 210, NextZeroIdx = 0, NextOneIdx = 0 },
  739. new TreeNode { Value = 0, NextZeroIdx = 441, NextOneIdx = 494 },
  740. new TreeNode { Value = 0, NextZeroIdx = 442, NextOneIdx = 461 },
  741. new TreeNode { Value = 0, NextZeroIdx = 443, NextOneIdx = 447 },
  742. new TreeNode { Value = 0, NextZeroIdx = 444, NextOneIdx = 445 },
  743. new TreeNode { Value = 211, NextZeroIdx = 0, NextOneIdx = 0 },
  744. new TreeNode { Value = 212, NextZeroIdx = 0, NextOneIdx = 0 },
  745. new TreeNode { Value = 213, NextZeroIdx = 0, NextOneIdx = 0 },
  746. new TreeNode { Value = 0, NextZeroIdx = 448, NextOneIdx = 460 },
  747. new TreeNode { Value = 214, NextZeroIdx = 0, NextOneIdx = 0 },
  748. new TreeNode { Value = 0, NextZeroIdx = 450, NextOneIdx = 467 },
  749. new TreeNode { Value = 215, NextZeroIdx = 0, NextOneIdx = 0 },
  750. new TreeNode { Value = 0, NextZeroIdx = 452, NextOneIdx = 469 },
  751. new TreeNode { Value = 0, NextZeroIdx = 453, NextOneIdx = 454 },
  752. new TreeNode { Value = 216, NextZeroIdx = 0, NextOneIdx = 0 },
  753. new TreeNode { Value = 217, NextZeroIdx = 0, NextOneIdx = 0 },
  754. new TreeNode { Value = 0, NextZeroIdx = 456, NextOneIdx = 484 },
  755. new TreeNode { Value = 0, NextZeroIdx = 457, NextOneIdx = 458 },
  756. new TreeNode { Value = 218, NextZeroIdx = 0, NextOneIdx = 0 },
  757. new TreeNode { Value = 219, NextZeroIdx = 0, NextOneIdx = 0 },
  758. new TreeNode { Value = 220, NextZeroIdx = 0, NextOneIdx = 0 },
  759. new TreeNode { Value = 221, NextZeroIdx = 0, NextOneIdx = 0 },
  760. new TreeNode { Value = 0, NextZeroIdx = 462, NextOneIdx = 488 },
  761. new TreeNode { Value = 0, NextZeroIdx = 463, NextOneIdx = 464 },
  762. new TreeNode { Value = 222, NextZeroIdx = 0, NextOneIdx = 0 },
  763. new TreeNode { Value = 223, NextZeroIdx = 0, NextOneIdx = 0 },
  764. new TreeNode { Value = 0, NextZeroIdx = 466, NextOneIdx = 468 },
  765. new TreeNode { Value = 224, NextZeroIdx = 0, NextOneIdx = 0 },
  766. new TreeNode { Value = 225, NextZeroIdx = 0, NextOneIdx = 0 },
  767. new TreeNode { Value = 226, NextZeroIdx = 0, NextOneIdx = 0 },
  768. new TreeNode { Value = 0, NextZeroIdx = 470, NextOneIdx = 472 },
  769. new TreeNode { Value = 227, NextZeroIdx = 0, NextOneIdx = 0 },
  770. new TreeNode { Value = 228, NextZeroIdx = 0, NextOneIdx = 0 },
  771. new TreeNode { Value = 229, NextZeroIdx = 0, NextOneIdx = 0 },
  772. new TreeNode { Value = 230, NextZeroIdx = 0, NextOneIdx = 0 },
  773. new TreeNode { Value = 231, NextZeroIdx = 0, NextOneIdx = 0 },
  774. new TreeNode { Value = 0, NextZeroIdx = 476, NextOneIdx = 477 },
  775. new TreeNode { Value = 232, NextZeroIdx = 0, NextOneIdx = 0 },
  776. new TreeNode { Value = 233, NextZeroIdx = 0, NextOneIdx = 0 },
  777. new TreeNode { Value = 0, NextZeroIdx = 479, NextOneIdx = 480 },
  778. new TreeNode { Value = 234, NextZeroIdx = 0, NextOneIdx = 0 },
  779. new TreeNode { Value = 235, NextZeroIdx = 0, NextOneIdx = 0 },
  780. new TreeNode { Value = 0, NextZeroIdx = 482, NextOneIdx = 483 },
  781. new TreeNode { Value = 236, NextZeroIdx = 0, NextOneIdx = 0 },
  782. new TreeNode { Value = 237, NextZeroIdx = 0, NextOneIdx = 0 },
  783. new TreeNode { Value = 0, NextZeroIdx = 485, NextOneIdx = 487 },
  784. new TreeNode { Value = 238, NextZeroIdx = 0, NextOneIdx = 0 },
  785. new TreeNode { Value = 239, NextZeroIdx = 0, NextOneIdx = 0 },
  786. new TreeNode { Value = 240, NextZeroIdx = 0, NextOneIdx = 0 },
  787. new TreeNode { Value = 0, NextZeroIdx = 489, NextOneIdx = 493 },
  788. new TreeNode { Value = 241, NextZeroIdx = 0, NextOneIdx = 0 },
  789. new TreeNode { Value = 0, NextZeroIdx = 491, NextOneIdx = 492 },
  790. new TreeNode { Value = 242, NextZeroIdx = 0, NextOneIdx = 0 },
  791. new TreeNode { Value = 243, NextZeroIdx = 0, NextOneIdx = 0 },
  792. new TreeNode { Value = 244, NextZeroIdx = 0, NextOneIdx = 0 },
  793. new TreeNode { Value = 0, NextZeroIdx = 495, NextOneIdx = 503 },
  794. new TreeNode { Value = 0, NextZeroIdx = 496, NextOneIdx = 499 },
  795. new TreeNode { Value = 0, NextZeroIdx = 497, NextOneIdx = 498 },
  796. new TreeNode { Value = 245, NextZeroIdx = 0, NextOneIdx = 0 },
  797. new TreeNode { Value = 246, NextZeroIdx = 0, NextOneIdx = 0 },
  798. new TreeNode { Value = 0, NextZeroIdx = 500, NextOneIdx = 501 },
  799. new TreeNode { Value = 247, NextZeroIdx = 0, NextOneIdx = 0 },
  800. new TreeNode { Value = 248, NextZeroIdx = 0, NextOneIdx = 0 },
  801. new TreeNode { Value = 249, NextZeroIdx = 0, NextOneIdx = 0 },
  802. new TreeNode { Value = 0, NextZeroIdx = 504, NextOneIdx = 507 },
  803. new TreeNode { Value = 0, NextZeroIdx = 505, NextOneIdx = 506 },
  804. new TreeNode { Value = 250, NextZeroIdx = 0, NextOneIdx = 0 },
  805. new TreeNode { Value = 251, NextZeroIdx = 0, NextOneIdx = 0 },
  806. new TreeNode { Value = 0, NextZeroIdx = 508, NextOneIdx = 509 },
  807. new TreeNode { Value = 252, NextZeroIdx = 0, NextOneIdx = 0 },
  808. new TreeNode { Value = 253, NextZeroIdx = 0, NextOneIdx = 0 },
  809. new TreeNode { Value = 254, NextZeroIdx = 0, NextOneIdx = 0 },
  810. new TreeNode { Value = 255, NextZeroIdx = 0, NextOneIdx = 0 },
  811. new TreeNode { Value = 256, NextZeroIdx = 0, NextOneIdx = 0 }
  812. };
  813. //static HuffmanEncoder()
  814. //{
  815. // BuildTree();
  816. //}
  817. //
  818. //private static void BuildTree()
  819. //{
  820. // // Add root
  821. // entries.Add(new TreeNode());
  822. //
  823. // for (int i = 0; i < StaticTable.Length; ++i)
  824. // {
  825. // var tableEntry = StaticTable[i];
  826. // var currentNode = entries[0];
  827. // int currentNodeIdx = 0;
  828. //
  829. // for (byte bitIdx = 1; bitIdx <= tableEntry.Bits; bitIdx++)
  830. // {
  831. // byte bit = tableEntry.GetBitAtIdx(bitIdx);
  832. //
  833. // switch(bit)
  834. // {
  835. // case 0:
  836. // if (currentNode.NextZeroIdx == 0)
  837. // {
  838. // currentNode.NextZeroIdx = (UInt16)entries.Count;
  839. // entries[currentNodeIdx] = currentNode;
  840. // entries.Add(new TreeNode());
  841. // }
  842. //
  843. // currentNodeIdx = currentNode.NextZeroIdx;
  844. // currentNode = entries[currentNodeIdx];
  845. // break;
  846. //
  847. // case 1:
  848. // if (currentNode.NextOneIdx == 0)
  849. // {
  850. // currentNode.NextOneIdx = (UInt16)entries.Count;
  851. // entries[currentNodeIdx] = currentNode;
  852. // entries.Add(new TreeNode());
  853. // }
  854. //
  855. // currentNodeIdx = currentNode.NextOneIdx;
  856. // currentNode = entries[currentNodeIdx];
  857. // break;
  858. //
  859. // default:
  860. // HTTPManager.Logger.Information("HuffmanEncoder", "BuildTree - GetBitAtIdx returned with an unsupported value: " + bit);
  861. // break;
  862. // }
  863. // }
  864. //
  865. // entries[currentNodeIdx] = new TreeNode { Value = (UInt16)i };
  866. //
  867. // //HTTPManager.Logger.Information("HuffmanEncoder", string.Format("BuildTree - {0} - Entry({1}) added to idx: {2}", i, entries[currentNodeIdx], currentNodeIdx));
  868. // }
  869. //
  870. // //HTTPManager.Logger.Information("HuffmanEncoder", "BuildTree - entries: " + entries.Count);
  871. // //for (int i = 0; i < entries.Count; ++i)
  872. // // HTTPManager.Logger.Information("HuffmanEncoder", string.Format("{0} - Entry : {1}", i, entries[i]));
  873. // System.Text.StringBuilder sb = new System.Text.StringBuilder();
  874. // for (int i = 0; i < entries.Count; ++i)
  875. // {
  876. // sb.AppendFormat("new TreeNode {{ Value = {0}, NextZeroIdx = {1}, NextOneIdx = {2} }},\n", entries[i].Value, entries[i].NextZeroIdx, entries[i].NextOneIdx);
  877. // }
  878. // UnityEngine.Debug.Log(sb.ToString());
  879. //}
  880. public static TreeNode GetRoot()
  881. {
  882. return HuffmanTree[0];
  883. }
  884. public static TreeNode GetNext(TreeNode current, byte bit)
  885. {
  886. switch(bit)
  887. {
  888. case 0:
  889. return HuffmanTree[current.NextZeroIdx];
  890. case 1:
  891. return HuffmanTree[current.NextOneIdx];
  892. }
  893. throw new Exception("HuffmanEncoder - GetNext - unsupported bit: " + bit);
  894. }
  895. public static TableEntry GetEntryForCodePoint(UInt16 codePoint)
  896. {
  897. return StaticTable[codePoint];
  898. }
  899. }
  900. }
  901. #endif