| 256 | }; |
| 257 | // length codes generation |
| 258 | var lc = function (c) { |
| 259 | var s = c.length; |
| 260 | // Note that the semicolon was intentional |
| 261 | while (s && !c[--s]); |
| 262 | var cl = new u16(++s); |
| 263 | // ind num streak |
| 264 | var cli = 0, |
| 265 | cln = c[0], |
| 266 | cls = 1; |
| 267 | var w = function (v) { |
| 268 | cl[cli++] = v; |
| 269 | }; |
| 270 | for (var i = 1; i <= s; ++i) { |
| 271 | if (c[i] == cln && i != s) ++cls; |
| 272 | else { |
| 273 | if (!cln && cls > 2) { |
| 274 | for (; cls > 138; cls -= 138) w(32754); |
| 275 | if (cls > 2) { |
| 276 | w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305); |
| 277 | cls = 0; |
| 278 | } |
| 279 | } else if (cls > 3) { |
| 280 | (w(cln), --cls); |
| 281 | for (; cls > 6; cls -= 6) w(8304); |
| 282 | if (cls > 2) (w(((cls - 3) << 5) | 8208), (cls = 0)); |
| 283 | } |
| 284 | while (cls--) w(cln); |
| 285 | cls = 1; |
| 286 | cln = c[i]; |
| 287 | } |
| 288 | } |
| 289 | return { c: cl.subarray(0, cli), n: s }; |
| 290 | }; |
| 291 | // calculate the length of output from tree, code lengths |
| 292 | var clen = function (cf, cl) { |
| 293 | var l = 0; |