• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Portions copyright 2012 Google, Inc.
2// Portions copyright 2011 Mozilla Foundation. All rights reserved.
3
4// This program is free software; you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation; either version 2 of the License, or
7// (at your option) any later version.
8//
9// This program is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program; if not, write to the Free Software
16// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18// The PDF-JS code in this file has been written by Mozilla.
19// It is available in its latest version from:
20//
21//   https://github.com/mozilla/pdf.js
22
23
24//////// Benchmark set-up. (c) by Google. ////////
25
26var pdf_file = "test.pdf";
27var canvas_logs = [];
28
29var PdfJS = new BenchmarkSuite("PdfJS", 9000000, [
30  new Benchmark("PdfJS", runPdfJS, setupPdfJS, tearDownPdfJS, 4)
31]);
32
33function setupPdfJS() {
34  // Check for Typed Arrays support, throw error if not.
35  if (!(typeof Uint8Array != "undefined" &&
36    typeof Float64Array != "undefined" &&
37    typeof (new Uint8Array(0)).subarray != "undefined")) {
38      throw "TypedArrayUnsupported";
39    }
40
41  PdfJS_window.__resources__[pdf_file] = buffer(PdfJS_window.atob(getPDF()));
42}
43
44function runPdfJS() {
45  PDFJS.getDocument(pdf_file).then(function(pdf) {
46    var canvas = PdfJS_window.document.getElementById('canvas');
47    var context = canvas.getContext('2d');
48    var renderContext = {canvasContext: context};
49    canvas_logs.push(context.__log__);
50
51    // Cycle through all pages.
52    function renderPages(i, j) {
53      if (i > j) return;
54      context.clearRect(0, 0, canvas.width, canvas.height);
55      pdf.getPage(i).then(function(page) {
56        renderContext.viewport = page.getViewport(1);
57        canvas.height = renderContext.viewport.height;
58        canvas.width = renderContext.viewport.width;
59        page.render(renderContext).then(renderPages.bind(null, i + 1, j));
60      });
61    }
62    renderPages(1, pdf.numPages);
63  });
64
65  // Wait for everything to complete.
66  PdfJS_window.flushTimeouts();
67}
68
69function tearDownPdfJS() {
70  // Should produce 36788 939524096 for all runs.
71  for (var i = 0; i < canvas_logs.length; ++i) {
72    var log_length = canvas_logs[i].length;
73    var log_hash = hash(canvas_logs[i].join(" "));
74    var expected_length = 36788;
75    var expected_hash = 939524096;
76    if (log_length !== expected_length || log_hash !== expected_hash) {
77      var message = "PdfJS produced incorrect output: " +
78          "expected " + expected_length + " " + expected_hash + ", " +
79          "got " + log_length + " " + log_hash;
80      console.log(message + "\n");
81      throw message;
82    }
83  }
84  // Allow GC of global state.
85  delete this.PDFJS;
86  delete this.PdfJS_window;
87}
88
89function buffer(s) {
90  var b = new ArrayBuffer(s.length);
91  var a = new Uint8Array(b);
92  for (var i = 0; i < s.length; ++i) a[i] = s.charCodeAt(i);
93  return b;
94}
95
96function hash(s) {
97  var up = Math.floor((s.length + 3) / 4);
98  var h = 0;
99  for (var i = 0; 4*i - 3 < s.length; i += 4) {
100    for (var j = 0; j < 4 && i + j < s.length; ++j)
101      h = (h + s.charCodeAt(i + j) << (8*j)) | 0;
102  }
103  return h;
104}
105
106
107///////// Mocks of relevant browser functionality. (c) by Google. ////////
108
109// Every acces to window will be redirected to PdfJS_window.
110var PdfJS_window = Object.create(this);
111
112function PdfJS_windowInstall(name, x) {
113  Object.defineProperty(PdfJS_window, name, {value: x});
114}
115
116PdfJS_windowInstall("setTimeout", function(cmd, delay) {
117  PdfJS_window.__timeouts__.push(cmd);
118});
119
120PdfJS_windowInstall("flushTimeouts", function() {
121  while (PdfJS_window.__timeouts__.length != 0) {
122    var next = PdfJS_window.__timeouts__.pop();
123    if (typeof next === "function")
124      next({data: "{}"});
125    else
126      eval(next);
127  }
128});
129
130PdfJS_windowInstall("window", PdfJS_window);
131
132PdfJS_window.__timeouts__ = [];
133PdfJS_window.__resources__ = {};
134
135
136// Base64 encoding/decoding is based on code by Grant Galitz.
137PdfJS_window.__to64__ = [
138  "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
139  "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
140  "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
141  "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
142  "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/", "="
143];
144
145PdfJS_windowInstall("btoa", function(data) {
146  var result = "";
147  if (data.length > 0) {
148    var i = 0;
149    while (i < data.length) {
150      var b1 = data.charCodeAt(i++) & 0xff;
151      var b2 = data.charCodeAt(i++ < data.length ? i-1 : 0) & 0xff;
152      var b3 = data.charCodeAt(i++ < data.length ? i-1 : 0) & 0xff;
153      result += PdfJS_window.__to64__[b1 >> 2];
154      if (i === data.length + 2) {
155        result += PdfJS_window.__to64__[(b1 & 0x3) << 4] + "==";
156      } else {
157        result += PdfJS_window.__to64__[((b1 & 0x3) << 4) | (b2 >> 4)];
158        if (i === data.length + 1) {
159          result += PdfJS_window.__to64__[(b2 & 0xF) << 2] + "=";
160        } else {
161          result += PdfJS_window.__to64__[((b2 & 0xF) << 2) | (b3 >> 6)] +
162	      PdfJS_window.__to64__[b3 & 0x3F];
163        }
164      }
165    }
166  }
167  return result;
168});
169
170PdfJS_window.__from64__ =
171  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
172
173PdfJS_windowInstall("atob", function(data) {
174  var result = "";
175  var i = 0;
176  while (i < data.length) {
177    var x1 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
178    var x2 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
179    var x3 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
180    var x4 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
181    result += String.fromCharCode((x1 << 2) | (x2 >> 4));
182    if (x3 != 0x40) {
183       result += String.fromCharCode(((x2 & 0x0F) << 4) | (x3 >> 2));
184       if (x4 != 0x40) {
185         result += String.fromCharCode(((x3 & 0x03) << 6) | x4);
186      }
187    }
188  }
189  return result;
190});
191
192
193PdfJS_windowInstall("XMLHttpRequest", function() {
194  this.open = function(type, url, some_bool) {
195    this.url = url;
196  }
197  this.overrideMimeType = function() {}
198  this.send = function() {
199    this.response = PdfJS_window.__resources__[this.url];
200    this.readyState = 4;
201    this.status = 0;
202    this.onreadystatechange();
203  }
204});
205
206PdfJS_windowInstall("console", this.console ? this.console : {
207  log: function(s) {
208    // To verify that the test produces the right results,
209    // uncomment this code.
210    /*
211    var re = new RegExp("%d", "g");
212    var args = arguments;
213    var i = 0;
214    print(s.replace(re, function() { return args[++i] }));
215    */
216  }
217});
218
219PdfJS_windowInstall("location", {
220  protocol: ""
221});
222
223PdfJS_windowInstall("Event", function() {
224  this.initEvent = function(name) {
225    this.name = name;
226  }
227});
228
229PdfJS_windowInstall("Element", function(type) {
230  this.__listeners__ = {};
231  this.element_type = type;
232  this.insertBefore = function() {};
233  this.addEventListener = function(name, listener) {
234    this.__listeners__[name] = listener;
235  };
236  this.removeEventListener = function(name) {
237    delete this.__listeners__[name];
238  };
239  this.dispatchEvent = function(event) {
240    this.__listeners__[event.name](event)
241  };
242  this.getElementsByTagName = function(name) {
243    if (name === "head") {
244      return [{appendChild: function() {}}]
245    }
246  };
247  this.appendChild = function() {};
248  this.setAttribute = function() {};
249  this.sheet = {
250    cssRules: [],
251    insertRule: function() {}
252  };
253});
254
255PdfJS_windowInstall("Context", function() {
256  this.__log__ = [];
257  this.save = function() {
258    this.__log__.push("save","\n");
259  }
260  this.restore = function() {
261    this.__log__.push("restore","\n");
262  }
263  this.transform = function(a,b,c,d,e,f) {
264    this.__log__.push("transform",a,b,c,d,e,f,"\n");
265  }
266  this.translate = function(x,y) {
267    this.__log__.push("translate",x,y,"\n");
268  }
269  this.scale = function(x,y) {
270    this.__log__.push("scale",x,y,"\n");
271  }
272  this.rect = function(x,y,w,h) {
273    this.__log__.push("rect",x,y,w,h,"\n");
274  }
275  this.clip = function() {
276    this.__log__.push("clip","\n");
277  }
278  this.fill = function() {
279    this.__log__.push("fill","\n");
280  }
281  this.stroke = function() {
282    this.__log__.push("stroke","\n");
283  }
284  this.beginPath = function() {
285    this.__log__.push("beginPath","\n");
286  }
287  this.closePath = function() {
288    this.__log__.push("closePath","\n");
289  }
290  this.moveTo = function(x,y) {
291    this.__log__.push("moveTo",x,y,"\n");
292  }
293  this.lineTo = function(x,y) {
294    this.__log__.push("lineTo",x,y,"\n");
295  }
296  this.fillRect = function(x,y,w,h) {
297    this.__log__.push("fillRect",x,y,w,h,"\n");
298  }
299  this.fillText = function(s,x,y,w) {
300    this.__log__.push("fillText",s,x,y,"\n");
301  }
302  this.strokeText = function(s,x,y,w) {
303    this.__log__.push("strokeText",s,x,y,"\n");
304  }
305  this.getImageData = function(x,y,w,h) {
306    this.__log__.push("getImageData",x,y,w,h,"\n");
307    return {data: []};
308  }
309  this.putImageData = function(data,x,y) {
310    this.__log__.push("putImageData","{...}",x,y,"\n");
311  }
312  this.drawImage = function(image,x,y) {
313    this.__log__.push("drawImage","<elem>",x,y,"\n");
314  }
315  this.getParameter = function(name) {
316    this.__log__.push("getParameter",name,"\n");
317    return null;
318  }
319  this.enable = function() {
320    this.__log__.push("enable","\n");
321  }
322  this.disable = function() {
323    this.__log__.push("disable","\n");
324  }
325  this.depthFunc = function(param) {
326    this.__log__.push("depthFunc",param,"\n");
327  }
328  this.clearColor = function(r,g,b,a) {
329    this.__log__.push("clearColor",r,g,b,a,"\n");
330  }
331  this.clear = function(m) {
332    this.__log__.push("clear",m,"\n");
333  }
334  this.clearRect = function(x,y,w,h) {
335    this.__log__.push("createRect",x,y,w,h,"\n");
336  }
337});
338
339PdfJS_windowInstall("Canvas", function() {
340  this.getContext = function() {
341    return new PdfJS_window.Context();
342  }
343  this.width = 100;
344  this.height = 100;
345  this.style = { visibility: "visibile" };
346});
347
348PdfJS_windowInstall("document", {
349  body : new PdfJS_window.Element("body"),
350  documentElement : new PdfJS_window.Element("document"),
351  createElement : function(element_type) {
352    var element;
353    if (element_type === "canvas") {
354      element = new PdfJS_window.Canvas();
355    } else {
356      element = new PdfJS_window.Element(element_type);
357    }
358    element.parentNode = new PdfJS_window.Element("dummy_parent");
359    return element;
360  },
361  getElementById : function(name) {
362    if (name === "canvas") {
363      return new PdfJS_window.Canvas();
364    } else {
365      return undefined;
366    }
367  },
368  getElementsByTagName : function(element) {
369    if (element === "script") {
370      return new Array(new this.createElement(element));
371    }
372  },
373  createEvent : function() { return new PdfJS_window.Event() }
374});
375
376PdfJS_window.window.addEventListener = function(name, listener) {
377  PdfJS_window.setTimeout(listener)
378}
379
380PdfJS_windowInstall("Worker", undefined);
381
382
383///////// The PDF we want to render, encoded in base64. ////////
384
385function getPDF() {
386  return "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NyAzOTkuNyA1MTMuOSA3OTkuNCAyODUuNSAzNDIuNiAyODUuNSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSAyODUuNSAyODUuNSAyODUuNSA3OTkuNCA0ODUuMyA0ODUuMyA3OTkuNCA3NzAuNyA3MjcuOSA3NDIuMyA3ODUgNjk5LjQgNjcwLjggODA2LjUgNzcwLjcgMzcxIDUyOC4xIDc5OS4yIDY0Mi4zIDk0MiA3NzAuNyA3OTkuNCA2OTkuNCA3OTkuNCA3NTYuNSA1NzEgNzQyLjMgNzcwLjcgNzcwLjcgMTA1Ni4yIDc3MC43IDc3MC43IDYyOC4xIDI4NS41IDUxMy45IDI4NS41IDUxMy45IDI4NS41IDI4NS41IDUxMy45IDU3MSA0NTYuOCA1NzEgNDU3LjIgMzE0IDUxMy45IDU3MSAyODUuNSAzMTQgNTQyLjQgMjg1LjUgODU2LjUgNTcxIDUxMy45IDU3MSA1NDIuNCA0MDIgNDA1LjQgMzk5LjcgNTcxIDU0Mi40IDc0Mi4zIDU0Mi40IDU0Mi40XQplbmRvYmoKMTYgMCBvYmoKWzYzOC45XQplbmRvYmoKMTcgMCBvYmoKWzU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDMxMi41IDMxMi41IDM0Mi42IDg3NSA1MzEuMiA1MzEuMiA4NzUgODQ5LjUgNzk5LjggODEyLjUgODYyLjMgNzM4LjQgNzA3LjIgODg0LjMgODc5LjYgNDE5IDU4MSA4ODAuOCA2NzUuOSAxMDY3LjEgODc5LjYgODQ0LjkgNzY4LjUgODQ0LjkgODM5LjEgNjI1IDc4Mi40IDg2NC42IDg0OS41IDExNjIgODQ5LjUgODQ5LjUgNjg3LjUgMzEyLjUgNTgxIDMxMi41IDU2Mi41IDMxMi41IDMxMi41IDU0Ni45IDYyNSA1MDAgNjI1IDUxMy4zIDM0My43IDU2Mi41IDYyNSAzMTIuNSAzNDMuNyA1OTMuNyAzMTIuNSA5MzcuNSA2MjUgNTYyLjUgNjI1IDU5My43IDQ1OS41IDQ0My44IDQzNy41IDYyNV0KZW5kb2JqCjE4IDAgb2JqCls1ODMuMyA1NTUuNiA1NTUuNiA4MzMuMyA4MzMuMyAyNzcuOCAzMDUuNiA1MDAgNTAwIDUwMCA1MDAgNTAwIDc1MCA0NDQuNCA1MDAgNzIyLjIgNzc3LjggNTAwIDkwMi44IDEwMTMuOSA3NzcuOCAyNzcuOCAyNzcuOCA1MDAgODMzLjMgNTAwIDgzMy4zIDc3Ny44IDI3Ny44IDM4OC45IDM4OC45IDUwMCA3NzcuOCAyNzcuOCAzMzMuMyAyNzcuOCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDI3Ny44IDI3Ny44IDI3Ny44IDc3Ny44IDQ3Mi4yIDQ3Mi4yIDc3Ny44IDc1MCA3MDguMyA3MjIuMiA3NjMuOSA2ODAuNiA2NTIuOCA3ODQuNyA3NTAgMzYxLjEgNTEzLjkgNzc3LjggNjI1IDkxNi43IDc1MCA3NzcuOCA2ODAuNiA3NzcuOCA3MzYuMSA1NTUuNiA3MjIuMiA3NTAgNzUwIDEwMjcuOCA3NTAgNzUwIDYxMS4xIDI3Ny44IDUwMCAyNzcuOCA1MDAgMjc3LjggMjc3LjggNTAwIDU1NS42IDQ0NC40IDU1NS42IDQ0NC40IDMwNS42IDUwMCA1NTUuNiAyNzcuOCAzMDUuNiA1MjcuOCAyNzcuOCA4MzMuMyA1NTUuNiA1MDAgNTU1LjYgNTI3LjggMzkxLjcgMzk0LjQgMzg4LjkgNTU1LjYgNTI3LjggNzIyLjIgNTI3LjggNTI3LjggNDQ0LjRdCmVuZG9iagoxOSAwIG9iagpbODY5LjQgODE4LjEgODMwLjYgODgxLjkgNzU1LjYgNzIzLjYgOTA0LjIgOTAwIDQzNi4xIDU5NC40IDkwMS40IDY5MS43IDEwOTEuNyA5MDAgODYzLjkgNzg2LjEgODYzLjkgODYyLjUgNjM4LjkgODAwIDg4NC43IDg2OS40IDExODguOSA4NjkuNCA4NjkuNCA3MDIuOCAzMTkuNCA2MDIuOCAzMTkuNCA1NzUgMzE5LjQgMzE5LjQgNTU5IDYzOC45IDUxMS4xIDYzOC45IDUyNy4xIDM1MS40IDU3NSA2MzguOSAzMTkuNCAzNTEuNCA2MDYuOSAzMTkuNCA5NTguMyA2MzguOSA1NzUgNjM4LjkgNjA2LjkgNDczLjYgNDUzLjYgNDQ3LjJdCmVuZG9iagoyMCAwIG9iagpbMjcyIDMyNi40IDI3MiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiAyNzIgMjcyIDI3MiA3NjEuNiA0NjIuNCA0NjIuNCA3NjEuNiA3MzQgNjkzLjQgNzA3LjIgNzQ3LjggNjY2LjIgNjM5IDc2OC4zIDczNCAzNTMuMiA1MDMgNzYxLjIgNjExLjggODk3LjIgNzM0IDc2MS42IDY2Ni4yIDc2MS42IDcyMC42IDU0NCA3MDcuMiA3MzQgNzM0IDEwMDYgNzM0IDczNCA1OTguNCAyNzIgNDg5LjYgMjcyIDQ4OS42IDI3MiAyNzIgNDg5LjYgNTQ0IDQzNS4yIDU0NCA0MzUuMiAyOTkuMiA0ODkuNiA1NDQgMjcyIDI5OS4yIDUxNi44IDI3MiA4MTYgNTQ0IDQ4OS42IDU0NCA1MTYuOCAzODAuOCAzODYuMiAzODAuOCA1NDQgNTE2LjggNzA3LjIgNTE2LjggNTE2LjggNDM1LjIgNDg5LjYgOTc5LjIgNDg5LjYgNDg5LjYgNDg5LjZdCmVuZG9iagoyMSAwIG9iagpbNTAwXQplbmRvYmoKMjIgMCBvYmoKWzYwMi4xIDcyNi4zIDY5My4zIDMyNy42IDQ3MS41IDcxOS40IDU3NiA4NTAgNjkzLjMgNzE5LjggNjI4LjIgNzE5LjggNjgwLjUgNTEwLjkgNjY3LjYgNjkzLjMgNjkzLjMgOTU0LjUgNjkzLjMgNjkzLjMgNTYzLjEgMjQ5LjYgNDU4LjYgMjQ5LjYgNDU4LjYgMjQ5LjYgMjQ5LjYgNDU4LjYgNTEwLjkgNDA2LjQgNTEwLjkgNDA2LjQgMjc1LjggNDU4LjYgNTEwLjkgMjQ5LjYgMjc1LjggNDg0LjcgMjQ5LjYgNzcyLjEgNTEwLjkgNDU4LjYgNTEwLjkgNDg0LjcgMzU0LjEgMzU5LjQgMzU0LjEgNTEwLjkgNDg0LjcgNjY3LjYgNDg0LjcgNDg0LjddCmVuZG9iagoyMyAwIG9iaiA8PAovTGVuZ3RoMSAxNDc4Ci9MZW5ndGgyIDg1MTgKL0xlbmd0aDMgMAovTGVuZ3RoIDk1MDQgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjajbYFUBtaEzaMuxa3ErRAcXd3Kw7FAwQIFgjBvbh78aItLsWtWPHiFHfXAm1x60d7733t/2e+bzKTnN19dvc8K2fCQKOhzSZlBbEAyUOcYGxc7JzCABk1aQMuTgAnJw87Jyc3BgODDhjmAPpHj8GgB4K6giFOwv+BkIGCgLAnnSwQ9gRUgzgBlN0cAFw8AC5+YS4BYU5OADcnp9A/QAhUGCALdAdbAdTYAcoQJ5ArBoMMxNkLCraxhT3l+ecIYLJkBnAJCQmw/nEHSDmCoGBLoBNADQizBTk+ZbQEOgC0IZZgEMzrv0IwidrCYM7CHBweHh7sQEdXdgjURpyZFeABhtkCtECuIKg7yArwmzJAHegI+psaOwYDQMcW7PqXQRtiDfMAQkGAJ4UD2BLk5Prk4uZkBYICnrIDtJVUAa+cQU5/gVX/ArAC/i4OgIud61/h/vb+HQjs9McZaGkJcXQGOnmBnWwA1mAHEOCVvCo7zBPGCgA6Wf0GAh1cIU/+QHcg2AFo8QT4c3UgQF5KEwB8Yvg3P1dLKNgZ5sruCnb4zZHjd5inMss5WclAHB1BTjBXjN/3kwVDQZZPdffi+Lu59k4QDyeffyRrsJOV9W8aVm7OHLpOYBc3kJLs35gnFca/dTYgGICPk5NTgF8QAHIBgDwtbTl+J9Dxcgb9MXL9Vj9x8PNxhjgDrJ9ogPzA1qCnHwwfV6A7CACDuoH8fP7T8N8SBhcXwApsCQNYgGzAThj/jv6kBln/JT/1Hwr2BBhxPo0fF4Dz9+dfJ5OnCbOCODl4/Rv+p8UcmoYqWrJqL/+m/C+jtDTEE+DDxscPYOPm4wRwcfHzAgSeDn7/HedfFfiH/R+tBhD89+3+I6KSkzUEIPQXiafq/UPE/e/JYPp7bZgB/51BHfI0zyAA07/H35iTj9Py6Yvr/3kJ/rj8/83+7yj/1/H/3xvJuzk4/LEz/QX4/9iBjmAHr78RT/PsBnvaDTXI04Y4/S9UH/TXQktDHKz+16YEAz5tiJSTjcO/ygh2lQd7gqw0wDBL27+G6J8uPAV3ADuBNCCu4N8PDoCNi5Pzf2xPO2dp//SouD716o8J9LRS/51SzskSYvV797if+g6EQoFeGE+tf5L4AD5cT0tqBfL8M9sADnYnCOzJBfBEzg9gDYFi/O4oPx+AQ+q36o8kJADgAP5bEgRwWPxbEgJwWP5L4uLiBXBA/0N8iuP6HyI/gAP2R/yv21q6QaFPm/xnnp6o/CP/eTZAIE+QJcbCLMRSJMSuNqT9ukaKwoNtZ0xsmmFHP52ZzWcB+sntFgc1lbk6+80a9FIqdagHb3lLjulCcpH6weeopR41vDVZs+3O994sUWtypw1jfoK4f7zoSKqujwqdkk1Hctf3wcVXL8gesQW+U5khz8VNEEejgODao1fBs66vbGkkbHZHc7eaXwXzvmyKLVY3xjio+CtDvkXODCktCoyNCo3l2Zkn7teLy+lnueO/qJUTX2L4HcfyvPcxXOeOu5nxXqnQ4XbtIqMnMySlQrx4NjLJ6CO9/1aZZM6n5EPMmtjcO4HI+MHFkN6kGRU9Mlp/DVJoSCmbWFagaicBfVeuh2UW1EHPclwdwPiCug7NJ5ShRME6uYpuqMQshxIccPNAR6WdZABv9fJT9/Ou4xPdThbfpHhSYa7YvTHH55diBJsdOf789zcoHOXASQVV5FRruFW6RfVXxFOj2vl+clpDrrH1RT5Gfb/y2T9csdkh2oX7foA5Gq8K92J6CpJojN1ZaNTvJ59+e3jfmWA7ZNRQQ3hBFDyBZ9YhFLE1AeN+5EluFPgewqrETSKN8608R3BQOX2Nc4bQ0ZVSF0F/QvPWyuCYhnKyTwJn+iGn41uZxJLmybNj3m8grWjFWEyT6Sj2DOcAs4lRSonsoG3Bk3fCkAPhJl1ytyLZZEMjxwxTjkFgw/TybsAsbxpag8M572DSDPEOTFXUn5FaPzO0wkMVKGTzTAOt28V2QzMwcyyPuMvOvWqSOfTUxPWjixbtw0T1QCjdfQLopIuqKfXmAdlQJUBD8SwRKp8leiWnXFB7lylCsT7Jru5/VBqoN13jgqaq/NJsEs1uun4TA/b42l1loYD6E8jYDS1D9UzTJU5UL0lJajaU/PBGCNiOarb6gvFQXrZJSIFOr+39jaS7fdQQrJldjtLXu7zTsACcJfJO/SPWKxVqDsFbMtoztEm8UkWpRYGOWQlx2vJ3hTkksOO3Qx4iLJM7EQ58mJ2Y8vLY0vrbt1yh2s9pHvsQirhZGo4pUL6OmlPECAobJLQG/XDQLSdHbQ5RKjiXMPIoRyDfHLFEZzTcMy8mmyzN7VitwXK1UgTJf0h7QdzM4rq7jz01EaRjJfRVGrheFI33JnTRKG4EmEj/1qaWq+3eGhfVeD8VlfMAXeDbc6DWuCk+U+a9KokdPt0XGkePVe42ujanL9ANet/oX5M6z76poqYkm0z4lBsUm/+65e1jV0j1IGis2F7y1bjmlj60Wa73+Glh3yVf8w4TM0i9otjaTiTOSoIuwYH2Jf9xOVWPDcJuvM/NBT7LzerJtzSySUwCVm3NbRzuD20FdxWML0qcKsmMzWtNNKNDgoX3cTZXWnr4HcicOC2EwhxN2s++sx5xLJa8N35Nz09u9DJIVy6Krr85Ri3/1TET9ngtu+z9hmr1Zhmp8QXLhuS1N8+L4g+ME6n8H0LOuNOWUaI6GZBfMqWeZ9oHmteSyq49ctQOIqTaMz0bSoqLt0/Hc67GgZlfmh5If74NJ92c+WisGOR/+JrA7LL0S1L9IxHaHYElQxeuPxMhzSKGsvucKw6uX/qAkMusx+7Eus9WHn/Ys6ox17FkfLWQDPRrRk22z85v9l5EMkZlqDHWCtTjt+C/hRmu3SEZQ6kCfPlS1Yqb+Wjr3rB0VON2Uh0vHorWxIylysbF1LG2qf60tnuZkng83PGp8wv85VHuUA6tJ2fPlS0dYvmam5Hkot/G/gLtbDDGkJVSohwLOivArnPXZLfPnb0b5tmCRlSKfppkL9f92qGg+oOfVTg7G0gZc69u4EImIRU14IMYdanKFnGDLLadU7USrRehQTgF1rJso+81Y3t+xOcLe/F9cE57z8IxHhwhgWdNzJFFi1uPBMWHsMmPSYMA1oxTvRbXHO+u1PsdKUvsgDZshefTWAX9opYOpf2n443PvbVlFJusED+qxpbwI+W8HYH1dVEbIyybTBjkDTrYfEUc/mSfZPKaeRYJunCBLPjitFV8bV1AMTevzRy+Nw61PeBFbyMzPhSjdbNxKq4uV2FothrhfQGioX+WzF4aRrQuOxK2XLRM2wZPLrLfrC3I6W1v8aYcQWIFzU2QzL2R58ioZ5VTj4wLXQOdDriVHe8cfK0/x/EdvMMSLKFivjj0Lr8Xb+GB4pffgY3IWGdiLW5FsmTRpxjxWcXqwIruo7ub09IlRyehEa6MW7bwq528O6JSI7wkBPiKb33Yn7H2YHYCmGg8fWorXpveH0J2WTckDM+aJHdvtQg1pMHiP7cnjt6fHi+5R+jJzxhL2dp/hKQ3ViGv42ULIlGjIGQgnZ6yoHT2U0WqK5FruhcL8SJ4t/2K5J27cgzCBTgJMlPJ5hyuWZgMLLxD/SV6OqrLZLNzMX+zylRk/oo7LbrloYh0yduCB5lzC/PLBRupjl6NT3s1+rWZ4mlCtGm4UQeIwEF6YHMTOy2O6p43Rv17KGC76zaCuEVcvFMMlFvMo5k8wZb5gtNrcu1bKWluHN2FMpo+gBNtbSWCQsD4LvQZ7IyvapmMJzZFjDru81g72XwrEkkJbs+sr5FW5sZHcb4gpViCkLIcaNMFlieebZWtF82Wvd4X7cEqgXAlzGsd20GgTvIF4QrkaCjoKiSOqQpL38pVV+la7NTkdjoDT813Gjkz0Ur52vh1mRZOuYJXIG4TrxUT3pp6/BZlsw8tscONcRTAxH6wSlAPI+Ma/vRM6lRMbPwaegHQ2zYNuGTZcfS8YAJdVVD+EDPuH66huXnM+yzd+M5CMHCiZdIAezZDrbTmU31M5bP54s1nYAznuPX0aOYB6GkpVp7/9grXz0zMnrn4TFRRkQAr1mrTaf73O9Y5rBpdzmMlvmdV9u1agq0CDefPxcGYESgRjR9BANPOkLrsHPWpAkrJthrbZ/s55tVG0vLhHausqgxfHXUps9v3CeqlQYHtLPQ11E4Qzw0eFQDeRc9PPfoOowKj7piH0HRrXREy3sfo2Np3ZJoodi0/k25D6hKjUGzawqlt0tYgq8vYNAxUuuSEXe22ke9L25aZvuYAuC/2W+Zy6zo/BhcUswI26tczPr0iNZqISBozM5aI04d9ER0M5RBpicVqoN3Voqx0XOmpys1irrosJcySizOGDupzYXVPTyZBUt5PEMB5bc1GLjBLj0SdGXdILtoEHcSMK0s4AuRcXBZSQs4FeU1nJ4c3cTsnZXMbKYH3QgJYW0XNXRM+lUPFWc/KDWnqzczZoIsOC/Esp20u8G+ySN9tUy60zkflw7CQVGXgbaYwhJ0slNEjblVbe13iyVMGoHt2fKa9Qohl6lp6dcq4e5UCIKL1HwlOtQzHG+M1BK/7U90GYbMBb58vIUWQ8PY3R2+JutDqw6SNRfKlSq6RTe4LC5Gf115QWJMOeXh5+SoS5vschun6E4s6dI4AH9W+UyGnY8F1BOKfuC7Ntcyv45pNtvfejc2Iy49F96ZFuSdphg/Z4eY+4pMjJN1W5fATMbyzDESkKxrwb0jATIv68moXGRsRhDAVmRj+ArigzZX5YxwUDtjtkcd0w3Y1BdOSHhyGetV7JLCmNAT7o8ucvU/y39TqTzJvZ6V4sKMNfrkwWKFiH4utyUcSmT2sFFxm9+VeLuy7hQ7zCW41bh5tbFideIPHwYr7Xd2GLz0JO+9hMovktKvEEgb4OmLcGa7eom/TGIoeK4QjVf553VD0xv1l2TBKtarMdlvq2MsSqiVBhHjCt5Q3XtHsnjJTC/25jG86dUtS/RaMlXbII6DUOcO3wyTKNhRYOV0bwrtLshKk5KXDgCRUpqwf5Pjd7G+PqfhiDbSwzDmWbj+V+KAKmVcJrhPhxkdv9i7KP5NlVH0z4ms288g+VJGX5A48XNfeSRMR0GUYsRdB3FLFkpY2P4HZF/mhy/Xs4DYEGkcoamH3j9LKZxx+M8CrCfdd9ho/dfPf0cS3LbfvdOfVQ50uyoMnOnimot86liP4vSQloIeHIA7+Dn/m9b3pfCLbN/UFJr90Kj/MmWT2n4n64HIiYNFUCIUYvEdwsQRlObn/SLYhIm8F4OSk4VQdb1TcU2QVZwij2D8i25IjT3F/vPzl87gRBmnHg0Y2gQks4nfamdynD2Es3/vkUgYgLs9FOiNm2sY5dvHjWvkPjUqwVPFmT/Agzd0UTTpYP5bRSvPlI1NqxcXa8b7PC541RtEnvMu12olmpOOknoRcp8DcjOqnNUdH7uR0B2goSfu+GFOvJrgSeMj9+nldUb1wzN9arj8XixlGoCmIjv2tThSLwdOBMYiiGGP2vBLvxF/adlNsXb6+YI2W27jFhHU7YPqjJBTEVILjIL/H0hf1WuB+IXZx3rwI86OztgRDM9j3S/QNzBfOCO2K2EL0hkJATewme0qAxHVowqmB/M0EXuNkmQc37yreXGiXFYfFiay/EXP1DaoNb3E+z/7DigIjHIezenAPA24q1YJIZTsseRcbPk0YPobUef8Q65DwpsfPQy2TCJ8Dzgf9/XhFYCEnu0Vp2pYdjeFWnKRodNEu9pvLR2+vWYevzL8eaGsBS2cXKvkE41vBXSu6jpCpjBO0Be4iOEuEND/mwJytPe/kdWEyUfyPV6cXSyHyN9ToeZCes75gvNJ32/sKqrhewzqLAj9E5ZZONx+7XCL1/WXqC24cX5P9FNsDbbFbMdxi7XKK//ogskbQGd/URL/93XQMIU+c9XU2O5X83XJKEXxmLgN8isJnklZCuw5WRrgTYl3GMe2KMk7cwwyKmPJ07cpRmw7jreaeu6iMo5VJpJe2guzhhDRDxfUSib94/ZBf9o0Mneenn1rJjMzmi1wePVfo7agpDCzq7zOkk6pPIs0vrTudwgO5yLWI4yJ0aqmWob95DFSZl6T3XZDVr8yInj7n0FCvQzGdSOVh4VS52A466H1Y7m9i9ptGrFI+ULOhnaLnuxX8btZhUy7jyi3TIMCqkpOLO/NOAm2sbWycOW83NYJ3FesWZ5mLDr4H0lr+tqWJhEiJ2sAyR+Nq3j+yiQtQeIAG/PFm2/R9H+8D0RA/1XQKsx3Vqw+LQCJALxDbFOL1EGuaVz7FKESwlhZ5gbY3UM5Q0Ckq6rFZImYvkTKGuPRoJ1mh4Utpf0kcwFso/3gc5urHYvDweV7lg11xxk9LZ5MA/wxB0S7JrYTudJ7GQruWHe6c8DcMqfBCAupjZ/Te/gmmPd1RCOKOqp9V1beErrwij+q6ycKO0eAAwDlmlHFq3XtmWXaJ0Vm4WaH2nGprXq1L7rLTuEmDlpYRbDQPuue4ZlreFGiGI27MLhvrPoBbgkucCzQe2y3t47WsPQ2idXzZ4b4kTxRmQbTp4160ZIbZtJ6dBE0T0a+Q3hHriWj/WessMZfsT02Eyr3lFbI0hksdMyqyFENTlt1Xh0w7ogUGpAMJpOw5+9QTigct2DyKxBEDcKGlyvEXPYgaAtdJqXRfnsdrvWy21N0op9LR2YBnesdM3Xgvp2JqtcRQ30X741E7ml2lryyX0VfAJdxjRuGBbD7r9h39ul7kpHp+x/yjg+MUvwu3sVJYwHpaTOsy3GjncRFthCSQh7kXIw8TXl1gX1mgjhrp6waXQOnOrEq9N4ucCOnazfAoKb45hMH1OcGQlgQjAzGJVzdJRJmBfpqa3kKNn0zp6A316Jccm879UmtG1kHj+dnTn+uixhy9x4FL9QYFRJUS/EmQ8ZPPGwpmj6uBefezjmfJVJcf247VHWiYphdy3p5q3X2VnWl/Z8IWDn+1rfHTmvnFsfs9b9R4ebecsl7AmJFQp+N7EYSIY2gCDhSBJhZ0PHosUu9pOnUSvKwenD6ScVCRaCeg/+GQLqtuKgllGjVlbrhuaKBVWk+BKWAdvE1itK1UrC8lKtm8v5UlVsN/KVFNcGADhx9Dj60zrFB69Cw/iFPdVZXvYgFu7CBRlfqnWxRbHDz/rI2Z+y0Chuou5L1cdXN/gb8Sc70KDY/B9zGPT88w4VQ1r3ae+Vx1p8PGQCnsFJeW/cZsaMVSuVLp3S/geNRwhwh8V2q3VkBFpc7nH12JCEwFVbjS77xYbDhSTntLFgUqDrUBWKJgQiO7wRTL3gd9d5X36GSDS5WeBgb9dAhKkFCBaMy4rstl/JkNzBJly03hoZfazzuD21CYAGn7zsDiNSTa40FXE8a06qVNk2z7n996tOtVT72OV80e7a6/pGvNNYqebgF+jLTMoEE5msq7SbJsULuXvai2VlUKWYkSeiCEfNqK2HQqubgkRoxYcxWku+eWfVh5ZMg/RESzrFqo8ZA+165t9kstvDh4SSko6eWlqX3kNox/mjJu4P34zvFggcdz7jwSrEITW+nqFj2RZBVdtyAGJZX5aCDx06E9OHVEL0DfymtliU8ZN6Fuct9++YjzaPIaU7u1zVZ7RaVlO5a5mQg58Hng3G0ZeWRqg0OzxYbrGUXNow/8kbCST705I0Db+XHmK1YtfEF6YtXrVZtiRHGh0quJUQDeMnTUmiZYuHCOyGPdCYd6UQS3JRVwICl1q4KeKWET14OknugSdpiGxAtXK4jH3Buv834Uvc8SruvZSkm6lnbLuMrwqPCRPW/hT8JlbbS3fgsiPKJvlw6HG0QP0wDauqYIY9HxEOdzvPpf1rR8klLR6AW73y1cCA/hTSgvO/RnWfRexT9Xq4QtzrJqn9mYoZmZNORxhkZVHbIpDBvMXHvX7b9U8E1Cy7c2S4KayCkkLq0BXZay42wSih3RZ0wa1JwKf6WhuTPVyNZy1J8vqlqU4wccRM9ZbZ4uaFWKLClkSUgAlT/r6eBuPHqZ7i9V/mqyKXT0X880rzXkjtnfmIjwjUae8NmWUrZM09S6LsJycbJiWsVdyvbK+NF0CZEdNdcpU5aJR1r+qRjurQVcPh+YptK4r30onEvBmzuMHPbsz5aRbHuMSVZzHhM1io/lHJcoeQANiCAY6hyex78MLdUyKrC/tukbL479RUgUPEmSAkQO7aQtc8Ex/Wgxe1bTsbYwiM6ydR9A9ngMvTpe+O5bJSzchKeHrJ4g/apb1xtnaFnR4gyoUC2riFP9jZ6fnhem2t6AV61sAd+A0a50oq5EKjOb7dIAZFfJwGftr8QSD5RJ8sJwSEUTePHO0ToZk7EeMszVt1EqHLoLfpwKLcXfcaOqxXbsXgGpjwfC52YgSHKJAKSl746JTvwMmfK/klBoEPB0wYtbR26jmZedO3rceSHOV9Sud5ok+6lyorlANpTnvg0AMs4XTtfJeLdX9GSkpYNKVffuPEe5XM1KK8iYjLmHtwy3OwzZp5cxFCSuVjYpgg5B5Dkx9W6NjYIH2Lg8685v7wXxZV1Yk/s7GK9XcI141LDON1xRemGzHATjZd3NOlgieydJd424MiJEKSaysh/dOFcQUAuxZoo0743EvAMfh99r5LOoyOi6JNnnwaXEMIUPQUk/Dh43EKY2OKazawnE7wzn4CGJR4g7VOugIDvyh7U6G+HhfkcUWSf84DdUaWCg0x0Tbifl4T8z2tuaFoIx55BsfypNKEApJ9VotTq1QaMSw33eg17WYMi/m1miLe/gsoNSs0FTXptMgF7EFSwosbSFxDbk7ivpG3VwJHTJJT8/zrJ2dpl7EWgWqPc1+4AGxvJskhpN2PH6G3NWua2LnUlYEZvyUINqjtT6cgO7lZvuWl4epGHvhOj5QSbwQ3zPnbcuP/K4eZPpd+XWiLioMPiAFjyMReFHGPN3vAi6PZhnqZrS6f37JHMFsTW68u0kxyBA0gFb0YQaWmqNj/UMr1JYITrp/kki7KbGmIgavuwkW3aI3XfYcWKWjFFB1W7Yf1XGOmAE9g1bZL+Az+p6ubDhEvZ1B/xmJ49sXpkW6jwpem3HHEVhmte4GgxMCHyUxnK17dvjjjtzPg97xr4epegsBwTKRTsk55tzvN5Ikspw4NgnFELx8uqDIqOVNTakxQKRCTA2X9PtHXl0PVww2QR+dhfLDZrRffvFW93IbArW2Zs2rQKfEmohuGHzzEv2KHBZ7/ZtGJSHYpsxluWTRTC99sfMt1aDVlUR8Z8UeCsnTKcFw5n0hMcy4UP7NobRLvJZzCxFXRgr9RbF6d0QYH4Q1fxWZ+y0UYrIAn18KZdldyRPk9g7pI+Zi1HNjl3MB0V7fNm3K28ldIPIF9m+1bVSENL/CNTiri6jw6Dw8h4TFHCs4abye8nz2fsAbxfJ7N01T9HHhud6KIadp3j8J+VxSD/pTSIr+Pq6hn8Fv7SqYFuu9H1FUmb6+u1Ep6lNCGF26EP+PVnZe1Wly7NGedvbCprCn3ppc/4Yt+p0GNvwX45MDVzEp8KoPcnPTXSn5nnCD8LVi61j8AFqsTiD5Sy1YvSvlr6tpwNx+Q6Ja34SBBh8cubJXSup82TlPv2kPW9upmfGjai/5EEx9wE2Z1YfVoofAg/de/MVmku3r0P+Da5ApISQW6yQJhF3XZi7iDw8U2oI9yGxEIWhyvfdcz741rItjJMmkRuvJmtETZwmv8rPpbiJF3y3YMdCRaxQH3+OZ1zxvGEsous+r1ORAQ6i5q9eIQwSmZtgTD2ijpaUPlbZibDtc0p+tP/VduQaikOT0TwJP2hcPXDc+wsuKojudqIO+/aKhIa8L6dzkXjB/luJ9FAzaqz5zi2ek1AgGXXufvQdmvgEJupNAaZLAktFP5aTrX1F35tB7reoeIGBjOItrDmXi0fve7ZQhKztzcTeoTXlaw14KvdDnAa0vtJEvmpz/nlxuuibpzDmUp/McLrvpxFVRbGgPguxeQxuRyYMdIu/LWn0XMPv+KCR8D1Vb8fChu8kXc1ttiuCR8y0h+9b58OJuPyKwSukZHvtz4OUC3sO2838jZbkcxbCmYdT2mHl0hZo77HWB+FE/ZSgonUaucwJmXBZ1gyj2u/SAjBnE7eRWL+JWums9Ym4phjSI3eYF1dY12mvVyVq40zb45e4ppRd2KbqjfK1Jnb+INcDN3Fpa5Kd4nhpE8ZsITiWCS2plzT99BgLUCyuIIge42DEM4Rf2fpKysBjSboI94gbLI6eJpDPulMUJdXGITm4cPhO4M2PEYEqS6NwK//dlzh2YzpNe6XjYu28ZZjXCO8xsGg9KH00e7BnpoKVkHO5KztNBBrTduOnLqBten30j32fZwj2WzgdWr5jP2+60Vo8tqmsbfdvr9wo1FXG3GmB6/nFP2nV1MFwc41fZD2G1DNm6KG+xV7ycycbOfmRwDtg0z1urLPHWF7HZelt0kAeweD3aI7XRZKTR9TDvjtu7fLTLzQ9Rdzyl9x3Bd0b7zJfRvckF39+sLstR9Y/Sb4OGHi/aGJRa90fwnv12a36fNjCTUXe9JkgvSmTENRcXczoqq0qu5d+08MzUlvB8Ch0yLKxQYdeS1Ua4kf8QXEmR4TXhvsrdxyzH4MbvzirWcGVMhlfMh23BlV9mm7TvMRlE0segnhgOB3qevTqugTE1facdsHvetRtBzEOtqJFy32hY+kxVNqBQzG9oKkaOVo4QLbIlnlHPF/aUr3QKYQ0ebz2EVENkfBcysraJzKZKA7KicFkn9GuSBtJShU5DrvJMJLc6TNrD1pM79NzuNk9JeZ62RjO4ijM/8kkp0Mb9ypkMpAYPTorH0mYDWWAQ63nR3OjzJgxe9J56QCWv43KDV0/Ek5JoMtFzJywIyZnore8nNfHH6+Q7poWAAaJ1XDxYTnn6N65iw6vhC74UK/H8JrEh3d7t4kZGsfF8SzdXyWHRUiShEjy97T6z8csf/ZvjMaYHMh37UIIJo9K8N0ZeE3iwYocT9lHHvdK1VKSIYaoTKcjP2RG2oZp2XhG0fzgrDvBuoQZ66drglJwAAo2xzE1TRQK3jn2BDdlzLFy4MPN7tDq3alXRmr6DmxJpyxGp5uO0arPupzkcDbOOVxQXGtrA3+7ntBKbj+P2EWTWt3iyjtkHm/GtPGmtrwFX7fqXms/VFw7pd13lNsriHed+XlUvIqyWNUKrfHWvN9mbWunSriwbsNWzWn5IMYBXa3E0CU1+RhsPnhQkQQjlmDUSvXnDaOmzh2SicHK49cECECv9vHuNu+X0iv7gdczqePM/Eh+VxBe7w83QV54lPhf4KQFL3wtwNplhcoWG9U+4Qv6SJkvuLriggRIRVEFJ7r6MRpc9s2Fkt+4q/VIBVFkwDsVB0xewpv8oNwEJ+0LH2TfTsIyylDwTND7744ZO2DpyQNQhu52KzvZrkssXupT5z6l6VW+Ghq6BImrF0nyj5G8iJ5hr8+TKt50bhQM056KZzF9TXX7ccAZKIlJOtVv4gMocbW9RP9y73Nthqcazo5/KX1Y79T7k+So0Etft1/bf7RP5qLoNnhcWPhGAl2yLxL+/tMCn3vmZnzexhhDNGiFg1opnaVQ+ajb1Gmwja4clZiAeRHBaJ2XrB/nE7bm01+6xS+tjJAxTER07pj154eL1pm9R2u9NYteQ/a8QoLRMbkOjwr3396JyTvIdbEFJxNTUQy3RssfVJrVmyhKpo+Zb++tUfgPpSTlbJVE3agfQ6h3f9DZrsu03rJ+GYZ9cdEJhYlGSqcA3nK+0e3+GhIQCTAncn7PdLCReS+XG5K1lNwsEzHgK7akREVHj2JH0h1d60NF76uAu2AP/SJCKZ5xHUfXay1Ulu9tJyHCp1Bp+uJBnwmVJpKLBVsselXzbdWXOHi6OGtVv9VCheaOFZ6EW6lhQVEEC5FnxPXThMPcUpN7XY2KD+TMcr0VgbwDqxOC7NFC7Hbw+s2w3A+I6ka7kXNGQZUh2l3nL86DpE3eSOy428tDIlZIabTsDjaK5D/Tqp3RwNYaITHZz2nQFX0S92iK+VkwK1MTaX3PZCUmolnQsggxMjl3mx1vsQb4jg7Eul2FRLO25sbYxCUjlB8jV+Mb1ZA9m5txyBPtL8gWvrR1zbsc0ioQN8dgje31l9VwXCkXAdfdSMNu/Eew7eAakZreyCOS36yHmA5gDM9qu/sXWm+tp+f1fc++rw96Zdc/6iDHuZFTes+oWsP1WqXurehJ+f2wN4sukf+5eCFLid/D/A9GatEbzbQP2WZ1kgJhZpefTIo+LpvvpyJSsZYd6++AO04DgqTfHiMZZl+yq3QRZd3NRmmnjmAmwUOHSqd0v2armaF/r2rbQUTajI2Hy3fwhQ665wo1JHP6uGUly4QEdezA9NbIeg+tPHQgZuQ9D/eHj5c70ikIIMbOrGeGmBpaaIvCzcTGdbMWFLFqvBMLMfBMjk06+LTo1NUIhV8Pgi/iI7W6xAHWNA/Q5QbphrIt4SGj1EgLPE8POiXYqeNiodwBPd3Gt8I96x/aiSken22PjxvLGKmDj8mEMAha6dEFhsckPvySvvzU21vDHSJC2Rc00sXwMgi8eFymsXDRf0IKrPjGhsBdi0CM6jEi/n8AGodoJwplbmRzdHJlYW0KZW5kb2JqCjI0IDAgb2JqIDw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL1FaS1JETStDTUJYMTAKL0ZsYWdzIDQKL0ZvbnRCQm94IFstNTYgLTI1MCAxMTY0IDc1MF0KL0FzY2VudCA2OTQKL0NhcEhlaWdodCA2ODYKL0Rlc2NlbnQgLTE5NAovSXRhbGljQW5nbGUgMAovU3RlbVYgMTE0Ci9YSGVpZ2h0IDQ0NAovQ2hhclNldCAoL0EvYS9iL2Mvci9zL3QpCi9Gb250RmlsZSAyMyAwIFIKPj4gZW5kb2JqCjI1IDAgb2JqIDw8Ci9MZW5ndGgxIDE1MjYKL0xlbmd0aDIgNzE5MwovTGVuZ3RoMyAwCi9MZW5ndGggODE5NCAgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqNtwVUVN8bLgwiIS2dcihphu6QlpQGSYeZAQaGGRgapEtCBJFWKelS6QaRbqQ7JBQJSSm56K//37fWvWvWmjnPm/vZ+3n3OsPOrGvApwBF2cBUUUg3PkF+ASlASVvRVFAIEBAQ5hcQEMJnZzeEuyFgf9nx2Y1haFc4Cin1rwglNAzsdm1TBrtdB2qjkICGOwIQFAYExaQExaUEBAAhAQHJvwJRaClAGewBhwLa/IAGCglzxWdXQjl7o+F29m7Xff56BDghXICgpKQ47+90QMEJhoZDwEhAG+xmD3O67ggBIwADFAQOc/P+TwlOGXs3N2cpEMjT05Mf7OTKj0LbyXHxAp5wN3tAH+YKQ3vAoMAvyoAO2An2JzV+fHbA0B7u+ofDAGXr5glGw4BrAwIOgSFdr1PckVAYGrjuDhioawEPnGHIP4K1/gjgBf7cHECQX/Dvcn9m/yoER/5OBkMgKCdnMNIbjrQDbOEIGPBAVYvfzcuNFwAjob8CwQhX1HU+2AMMR4BtrgN+Lx0MqCroAeBrhn/yc4Wg4c5urvyucMQvjqBfZa63WQUJVUI5OcGQbq74v9anDEfDINf77g3683AdkShPpO9fyBaOhNr+ogF1dwYZIeEu7jB15T9jrk34/9jsYG6AqICAgLiYJABzAWBeEHvQrwaG3s6w307BX+ZrDn6+zihnwPaaBswPbgu7/sH3dQV7wAA3tDvMz/ffjv8ifEFBAAqHuAE2MDs4Ev+f6tdmmO0f+Pr80XAvwFzgWn6CgMCvz99PltcKg6KQCO9/wn8fMUjNVE1NUY/nT8p/OxUVUV6AL5+oMMAnJCoICAoKSwLiogKA33/r/L0Df7H/bdUFw/9cncA/FdWRtihA8g8S17v3FxGPP5XB+efYcAH/7aCDutYzDOD8R/4WAqICkOsvwf/nIfid8v+n/V9V/q/y/98VqbojEL/9nH8E/H/8YCc4wvvPiGs9u7tdz4Y26npCkP8bagL7Y6AVUQjo//rU3cDXE6KAtEP8vY1wV1W4FwyqC3eD2P8hor9O4bo4Ao6E6aJc4b8uHIBPUEDgf3zXMwdxvL5UXK/P6rcLdj1S/22pgoSgoL9mT0hUDACj0WBvfIFrgQmJigK+gtdDCoV5/dY2AOJHotyuU4Brcn6ALQqN/+tExYUBkPov028kKQmAIH+jX+sBQf8FRQEQ/B8oeO1F/gsKAiDU31DkutL1dfgvtwgAQv8LigEgt39BcQDk/hv+hx3EHY2+nvzf+rum/hf+fc3AYF4wCP70BAoiHerwPrTxx1sFek++tUHZT+xrJilcfL7T6Cb3M2LcRK7yl8GL6GOFxJ4PpHOrKpxH92aYLn236ipxI+oT9BrOH19Yx+uPrDXgTw1TdQ692VKo6GC8xcBneG/98aXLY+MgR6w6zBYN9kwXdwli3WzyH54f1bwqOopm+8Mn1vTWy8U0CS6KRvmeGsVYBOWPsWfZvBqnYcFx42PE4ybb8yIZOzr+RJYxdMWkEc+D7/ftqXCur9mSUOzpuM98iaGQaystG60ZDSPWEVn/yF1fxc0kDepJ34K8Zxrh0Xm2jFYTNXJNJGAXkXfMLdMyRX1Dy300X6yDlIpIVkfCn0H0VtgVe74gDDKaacgyK8TzRy8FrXPwXfWaNy6pfKJLx16iQ+Q7Hd22dYUiUtufI+6EHnHK4zRvRmwmTYpN0WZ3dkj6j3JUPr8KuBc/JWST5Wbe5gv2ItpuviH+47vf0JAaEu+1+aHhw205w2EMhh5WcK+gPXOGNM6j7dcm3Z1lZFeOcpj0hU9Hbmg69L9b1GjxIb5q13m9BQmRn7GSWT+9R3hjadLFcM09dApaZA4biU1zkNJoQ97s0zyPYhUyyH5r/mKr45WiDZl8f4k2ZjAq9L14eQEY/CYpMpuDrjbC7jD/RJdRarBypHD0CcEXaLki9PnjEfWi4Z2w+1aeT7RJyoqHYKzKyruCr4qFTRJyWiP5+4cPWjT4qcQmy8YYZVIMabV7vrFUyYWiaThpS3SCuyhfJxGuhLCmy9WYObQd22f3VPGkGP30LL/6vop/UckW97l9eMVi2USHXymX03jUYldnfZ0hs+lDrfBtYuwxBfl9hDWpa1uhdrhuzUkRQXOst62Bd8HyRIvN0u2B9keS7ozOsZ3HuivdcW913NETXFqy7vaFsePBo93Kg9NZ9W26Y9FW+X40NbVM2K2tY/if+QoGfYy4B2bvCJds+B+v3s/1pA7xWdOTujHeg9vARDyxPMD/YoQS4lVfRJXjQZNcRMeZFkwmYyYTJTaVJqo5O5ZWgfmJx+fitlpTlgAmV2sA+mFJQpTUZDlFDyQbk0qRqDBLXN14POgSe2It0+SqLl3fkqjqpeRHbDOzdEanxxBqVGjEu7ignmB1C6dwHYxwf2Tqi69r24THmbQCFrSXtlqE6eibUxM3ExuDHny88sebmR/Yjk0vbSXBxJLGDOXs5ZhZZwpKbrN9F0J0AcqFmCSHKKd0XdIWSGCG9J7pd3JakBSE1g+SZ9/8OD3aknbB5rxHnsA8zMI4dyBZEaMPyIqb7fsVvpyLs+TZ8oGF0Rjjmqf23qLDcaria+ZeXG1dEsmjYJt+Yaxsxlee1FaWOmYyo5nkXFVOuJNdW53lb+h+krs38WCrQpAyvoT5NIjBH5x+V1zkTcgGdsyXudGWDlxe2XqeviJjVWrIunCH8Ns+2i4Jxw4C+2/W2Ns4iAbKDQUkXtwiOG2tKrjmWKe1i2isRWovK988lW0gAyo1DIdQTqQ6XCqdawt9ftQvii7TenYglUPzueJN99lSafOA/9JPSCbZpPajWwVLkeTMtpLWcrpfy/3wVN8UHpfKYU+tp5AnVqfgruGJJDQySvjAbhjh8WjQbGOf0jrepiWUkeO9719mVdyNaSRX7n+bbMGf66YkdZJaBh+FdSjP0FgETrLQj8Y4pzT4+ungK0EM9LvEwm+HHXJmxTv9C/JDsQMSK7pmmE6bcTisTjBl3cORtIInYvX08S9OJfM8ZO1VWq1NOTu948J1fqTgckrS5W9QQ0UnZLIXTEWKsBtEyZmf7RGaKqXjvFW5o3EcW9xcQ2oxNWZpmkVBU590p7Is/WIawV071k8v9ZChik+OwblH/DixVqv+vLJryux1l5J/RRfi6PSoJIqsAZoq+GZAChR0Btgx81J04TfN+T3NItYb5NnDlRQ29gWaE/WeIia21MqqqleIxDGYpZluYHq78CyvF38nGtWoTAxQ2MLGubXuceIAQg+Pz7wMMWPUJeUSeWs7wfPA2dT6iZs/IJpk/kzfjE3GPlNpwTOlien7uYiuAvkLT3ubloD7p8JwFb/Q4Cpzklynbz4nifqUP9gYP11gmatkiviSh3109tEHmZx+Iea71RBUALZWx16vSnCyTyiC2e5zNNYGbpi7pNfk4/G/mlAScGcwyj5h/NZ0t2htlldh5JYnHwuPSAXbQq7caN2bFFnWMtg9TW6TG40qkeVuN617+DSaXnQR2DAO5kTkHJhBn+0V2kckxb2PfvZRzktnuzB7wXn1mStW3qs6Na3A6Qe59nIHGZ9QTw8/bWUWvKJrxZjRkN7T4LFwwh9kYtCgPRej6f3gSEseO+EUJMmCo0MIPFIebTNv2gM27cU8fRVIIDKyC2Uefun9JLoYSrmLeKPcUY9dFSaTv9lqdvIclgoyB5U+zU8wQJ6+6Vj1Z30aYH2bO9yS8XWVBXyPmfJUYwD+stelL8VJA9CsAGybMp94cxucYhL7HUfC1YzFPME1mNTLbE7vwz1kSH3M9OittMY3BHS+6rukHTPPcov3uGs9aByUtQkY8N+5sJ7XuHWpFKwuLyP6PRebwJDQxzW/ctvPXetRkvZUYFEzi/hrzeZPBFg7JxsN+5/D5yW8HwDRvvv7cW8eZ3o84rrzgV85nIFBOGt6PVGTLZGWImfzVmojwCsc8D4taXTetf2VMnXD0if9q8iE3A+GRNWB/ZB3uMVC3+JD2IMuvJUttCtvG0jen9rTe9o4/gpte6iWb3VhISoakci6Ou1BaR72cKiSi3KDSvOzQa4VQ6U/si61VJvO9JxX4m6OOJioE8r2M3k+kcDKDWRCFjTlPdQS0PKRJh/voESkVk/Tl2tadgAjzES5ESrXgKKDfZ0xS3eeTqSDh/LBSO7pPte6snn2uOSY1RmbRaxF8ymxFpOuad+ijw1xXoZZOGT0xO8qaJuLnVprStP2gRDJfFnQyhLAqTNWaRRXzlcJu2pCB2TE7LsT6hfXeccYOiKo5Oo5lt7f3/5EuCA5Esz3guu05dz9HX6rOw8FohJ69Fmk6kutTyFEyzUigeqHoQaOuRR2iccg3UXYeoy8SaTOj2htSu56orc62PDdHS3bA1vVMVC+PEEORv8LFOlgvzV4gDlzjmhF8aub5ZFPsEUTdTp2ycILfVAqWuTN1uYWlfZZQRLVOEb6pKpnQPcuTJQj1nI/oNKsVXfgjnM3ZuzkZHUeuly+WzcOHNpDMqiVwMGHRd+BPwShvF0UPXcirOaXa4hJu8GRNpP1DNnK2m0ld+PZaOYERyZfeu3NwIXAOdUfzZ7aDwzjypVdNVL69OjrK8/aQnxxb50HNRkuNNccCpUZ08aX6bgujsae75MENLMrhszYx+zPsjFM8i4fyGWsR9AdoL5oJs+w3H81VE48RpIJ1BYLDSqSFhgNiHNovOOs3m1g7Eof2S+FCOqqz8ctn/AjMvXGMB16VNkdMgp0K/EFdxp8bIR6yt6ZBC5o8zhp1oTWdXbZ8rLMgYT9cz6WS58fJ4lng8TbSmX7UHwb+uyBUetLyCQGDcVqhnvIdcwrMQWBLx/sWyn0VSXfZhhOEPrGcWbfTdljWwyLC5DqO7RvoTu5OnqmfeXQuoFbkEE4Rf+NPU71BrVx6NXME7WVbo+aYBz5RwZSS1tSGjBn/c7+6h6SHwErkunFGDGZffMyD0/Mkd3J1aWHXQs3YrfwKD4tNS9PhEh8ZTtrYWWB4Q3Lko07MhIwfrddsA3NSnoWk9FHUEZWGFxJqOtJr1IlmX80xKbTEDojk31ZcPWExcEUu8HUFetSG0039VWlvPLbq3GtC5ZN5m/ctjQ86cyYRgqR8UO9Nwh55YXJWle9xJO+i7HSt1yBmQ+iZJ+ssnaTn18S9CT2uOdSR9tk14ISFtVaKuZYgfu6JxaFFo9sllfH2Y7Rss1cA/JxoDy6E8lYmXQUuaIR6detafEy/kzRwlUaxepVfXUgtSJXEsxCY8xMvnqX0eu2oN16/laJS4pjomxS+LcYPsBMsDH8aXnj/H3z3bK0z6pgrHoDj3ujOfAv1Z4bo96sl9C0qxsf+nbDSdldexf90y2wYKeRPz5ZcsbuzuBLre2DherfyI+Qz835hmWuraplTLzGu/deqjMLUXLW4Qpel9icblarHzWOsm041LjdmDXXvJXbr44p86huJ5ZPfufIUprvYIsKR83PgO0O+DHhyTKKcLLa0Z1j1zOd9LI82TsIQ/VrSuiCc3ul0B2KuoSPfurcC5XUikpDct7yaQ+sezCxG0WSyS6kVhLf2ahsZBpbhgpWjxrvndrwhrBEaKJUBaA2cWC6+m+0V/0ZC7Yialb9JY7POX032gek5vDxUqt+LljywTRqpmzoEvsgQePylO8yLvrte05cecgGswOizjqtq1zTX3cavKd+tcnIC3Yr8IZjvvs+0o/+Wcdeua8qTHthR5qbkbsQfTdb229qtqBbOEPZsdv+0VOLDLQ7VG7xu/QJvE6B3rp5J5ISH6VqPZIKcTzSSR+L/sGEfJR95jFJOc4llJY4m/r8MxvrNpHY6Yjvz128i+KNlbJqC1WPI6NvJowELYGIHXx2L2xzu8ox0u0wBzH/XDIlgjHKOZbnz60cEUrvd71J6ufYGX4ycQ2zI6tNxlVfPgBhUGiTpnqXBvRQjG34H5i5NG0XzjDB1bPDgtjyMpT6DNO5vUKKOizPizaSuA6Z4BmYmG4iZulJxhhjlk5rkUHGnzDiZx6cJwQFlh01ctlhwH/W4e+z893QMOrMNLd9a2gqPgbipwuDRFBFB+EZ3XzCe2IvviuhnS0y9JXhls+mpNRqf8Wyw08ntMdRuu5hLCuR3PNMPJtAr/2GVeuThrw+rfbajxkE3sXhRQkhbw+HRElG9O+BfG239JS++xVDe1vxuieP/adW0RVfmMuxRBouM0bijhpibHVzUDXbgS3an3isOHhTiHfErEGzJr72UwM9uz2gyJG0r/0OGxUGfqM/tzUifAhGXMOjxqs/Ry1POFDfKlio8PdJ1/J1UbDA0B+1Z+OKlvLRMdDQmvdmcLB6/fFF13PGKsy4ToY7XKOGw/7DmmZYCpRnugLYz4JxNHSp/Dnl/CVX7rbnLni0rVhdseCFYDdzNUWYim7Qy9pj6YwGg3VIp94Xsj8VxF6Z8MARnLPzkN8IFBGrEA+6fxxPtcX886BK5/CyzSF75YEIY0ETxXSzzfzV2pu6p5huWar73vvrFWtH3+/u+h546pnzmEVpPM92qcXnqVu+R7C76oTkXXTQRqrYqhM6ERToqzGWG90srXxIXC7xIe2HThh1Qc7VK03SKCl6y49vFJmLOqh15AM1KKN2NzgmFfiPHVt9ZXS7PyTLr7GBbLJX2SH6lUHhy8hG5pvcIav7aVmSFBQSUUxzOiTu1oavvqYJVhMy3d3hxoa90bG6m++u/vjoNJTnakKgsIqFQIoAMw5KbYC7V1r8QazMyPPoAYvK5HkA4/De/pas6rN2mU6mTJIRc5YwLwEKjNurlwSpR2a+vsFP2w8XmPhDaQi3Jfq6OKrNblW2DViD2e2gRP4NAXE2q5uaJmPFW0aZPuH7mMfZ0b06r8Kzj3nVgWHYDvzWxg2EXPXFRukyZDUnvBWbB4RQzBzxp8DyCTvhW88kaNbBfmlCSW4CaUA/Gyb/EhZJHSMf8MGYFxqIacEmnVfixmCo38pOoS3RpvwtoHZYK8P1oW+kciWrCMGPEGVfcKGFg3QNGzKXFNqbwTEwoKlCmMThnLBGCP5053jOWuk2NabgBJSY+KL3AqyiQjwnwtKSJ2P+tafED1s8UJx9qj51I9ARJKRe7RjJUZrviWUj06+YSHb8uEv64Uo8QVkLolXVd6qIl/L45XquJD45B69cCGKLIcfMxeXe20dUkTQUStFvd3iJxWhnHu8b0W6+NxfqKvT9Udu/tu57aF3BEHUtbsSrRvNWzqOUOZWS1bC4l3crNZn5Bdy+cJXkxpHa7h2Njx2IJ+LEIkaQadqea6YyLwke9xC1/Miq3VvwpBFibeiVetw33Ci2kDUpcv/0be6YI/q7v3oohkpsrtPh2Pc0j9LIchveD+ZpXkXBQcvdpA/D7tWkLKEZtKhrWjnOmIT7pB7lKogrPfM35bFeT2nWZ1X7rGD80c0ySnkBStRcyXxrQiBwhTvIfRF71ufQ5jP12+CUt/RbxeiHI9t573Wi3mZUsx+M0NrhYex30xmZ3rUfeCIWN/WgeePgbGnMZFDondUMzY84TGIftfLtCwCukzk6WHx56W3bZG1wxTItd85v9+iYTlFMbQP/sntLMfHORTfUdCeuiuIots5UxQ/j3cvtsLB1mAlZg/VmBgKhV0gudokDRxWEBj1XlamIoxMeS70ww/o5v6LDTrWgh2PlOUgzHxLd7pt+V6U0RirbURYgifxC/z2NQbHgXY3649xE/Az/8Zn0clvNQrijVy7wbMenzamqFiD4JHw2XeHvtO2Ir5/DlxtQs4puuP9uyzVpJnLmwix/raSI/6blzzZL6mwZ5mpKe65+oP1xuq35fcoixFy48GxQr/lihE8ncQcIwMnfDXl4md+QxLsJHYmwOGgRQz1N2S4fm2rdrKNT+SCBoTZuTjpKTmxbme99L1Dc1DyTkDQaE/cLlMyEQ6xBQ6HgXO1IA7RLwOavxBjLXLnil0m0GnhTW7OCQKHGTOo4k7a5jSg+HuVH0V+mqpe1IBVtEEOVUKNrb4BLNbg+41F3mWaUA6/AlCimmdmtFLO0Onmxp97f3liSEOJOEsadpi/Ttri/Us2yK8WPteU/mPoD727pefh0leGtFxha9DqSFWr+sjzgwSZwFuhsMryBsxL/Cr8Fq/fTFVqyyL52qHudcSUH2TTKTqDpLzPX55Wy4u4N1mH9rgehlhhGnrIlmVvnBX8orf/pGR5pZN6mDd3Y3tJrTv25YFsZiTtc5Sk1P8/aR3zXclO7Xjqdu0Ys/uhixUr7w6j3uRq07kiLIV+M+T37Hc0F56V43rRVpHMb1R0tfxNlnseuvVATNbGy996CuDbFFLimItiaarnvWT/uiI9sCI/zoalISeNFWJBEgwpJGgfTZPQ4ictMlNL8/pjPlDXHMfvmUMFmecPSOZ42XgeNW1QhzBehH0xATokfels66ZNVlhoF3XapKJSoPSzxhaO1x/d4rMROpoZO7F93NDNXGgSoL2kZ1uZRB58JeQfz2eOR4xaNlfNX3HxiaVPmgZZuWhaNPHy3Uu/zLI6+/suDzy+r6pxIG4e3hDNcOHkeMAoRFBzGhKZOHnJtpVtSnEe6EiVFi6bcxCTh0rJBBKVpW5kjKGsDB56HtYM/UzXfZMLJ+egHWp81pcbt8TxFrIJYFCPL/LAJOF9UG3i4rSfud1gZKzgVbYLX2Mt2Lcvr+PgsdcK6KSZ2q+OITCSd7dotnbQy716WVG5jZF6Nag5ov4ZjS2/7vLyhFm+7cko7H+2ZXOcSb0faJbI7fEw4npMcsTPcJc+XvUa8Kby4rFlvMLrDx+4lUzI65UzziKyGO2Bqog4UnpxhFyKfxNjuH333C2lgb362BPJzo9zhvq3AUu1YmANTJ+X4w+97bmKpuyJg6TT6raHA76RDDqh7dLZnKjz57U23A3vpzDUaVivmnXGdM+Nm9r4mvFaWc8xnsFQU5xZFkko0uMot9UhWjhvMG7szXnCFKxO5IKiJuVtE7L3s7tYM85AKdtwu59C6jIjY2n61UbsX7pmy3q1O9U1naKNl3zf3KdV4KLGiw7sOrPNq5sGA6Tg5dIZC4ir7LfXEGM8HMUk5Dxc/HjYb/bxkt7ee9Qp2SDUkNmNMzZASN0vSRSjJpP90/MYtKiYb7on9dc0ZN9fu3DbP5/2Xw80hzVLs4Hv2Mwrg6kMVWOn6JGFOSDRyqoFVnDjn4e245A5OWRGb/KA6ymkGkqdqtcezWjl5DJcdifcoY2a/1ZiNd7hOyr+eeryur+8QEHmemuvcb2CREev9JZcB9zjt7ecJx88RrVXiFHjrb844gfQIjXP+i7OaXc01kNkdvRcZhrJxKeEKHG6YJkgTLO/SDm4s6el24S7SomK7JmKpJ+BjPuxJSS8x35QXoIsZhFeSfg37sso5Mzc60NVwkPIDkz2yK5ob39A4025CRPATlffnfbEb7w2egzK7Ht+kONEqnnfKy4CLedLm3WWf84tQ8vnsTlrW3R5gHb3sWCBL7AfQr9M+EXJ+rvlIlrIzkc1P6nTGa+U1cWyg4bwQ0vQn+1Pil1EgwgNtOkf8WTPnIpKaPfDcSnFFgvc6dOtFg6k+Mi33Z3+bqmA/gv0sqYZw8XYY3jbN2+WmaauDZxeCb2eLVMd/yPUimVmSMCGn1QlKxt9y+DNzR+Ptxq/kE+xmX32r+8SaeJYy6Dddkl+eUPn9yMWPpzgrbIkrI1FveYBOR/mNg1bOh0LLT1Y+d6pjfMonsrrXQxctZGoKB0P81Bd/vLBYY15rDRcgLkVAeMctyW+pZ8k2rDg4mM7oe5NgmeNy2oltwKWSyV638jkSAYqTJGo5SCNBuoSJDd7GqQnrbs0HX9GXGxYQI6YMONKGA1WmVrVwe1lYLpFHgIgCXSbd9SA9elu7H+o8/1KFjaH96Lap0+DKTJ7xCHX/gF/kGgVBJ6lBCnfnWbZw/2lVsyKJs38FtU+lwQURaBEijBibaA+Z2A3bXQG9un5xt5QIIug5kuN7h4GiNw/GNJ2102cF5qMZhjGHGlMm+B8ziHkeBHwdR+lGnHLXpT+ZV5S8heeleeMVx0JhWBv9Tv2xzmeUZI6NNXSSOYz7YnZ/W1fKgjE+D2dan1DsJQYvYyGkLsFM/JCca3HucRpMZ8fv/fIrpbVlTb+AO1g4hK6tH3qMCag47rw2m9GjY4bdwarasdjJOs9LNsRDBvam3EbGxMX7VTMvPqQ6UJ4n/MYbxasgUW6jy1xN+1abLVddgbTNaKFdrmpALDmIvBGPqpzLIyZF3qnKHw5dvNOC985J5WLOBXM7pYQg86uLYfugmf7FB6cGz8jiUMh6OavFMQHFpt0tQ1q8z9E8j6SZSt97BeLoCceilgAqZ/2xs023O7WZbeQtlRLkM6xP0bYBmbHVxK/KXNZnOyK1O5LdE9H7j56POwDI+Fhu+rZ5USZuwjAxqY1j/LPOhJ2fhLjNQvOvJWYEv7r44IJ5yKErsU49fccXO3BFkM6KcE/qUpfAiK5TYjEpO4MYX8mea/4WER03t5TUm6XkzMrF+ZmPkb3v1hJvLVkOy9yavbeDQ3s7pRGEkjbQC1tQNjMgDq1dKaqPpwjXHx1ZidqxANRRW/pp94QWhlt5pQ5oAC+7zR+ec5ae+fmatWt2s5fLTS4uT9aXytQCWYrG3myJEu3jY/zAljlnl2HrNP+8lTy9EnTXL9UtJaDdo6MMys64804aSo9PMOn5c2NTV15/nQa/EoIumCBgT5/EVB6LSe9+kzLw/lFn3ZOfF8jqdQxUWd/XTkhvfcbKouvzvj7n1CBvUmxn0sKelScldbvjoiTPM6KOtfVSw7ANPiE0n2OQsX9XuD37vFC45AWsaPCq8OsZKu/oxqwliygXk7RumpmA/VxqzAJRY3OrUAJVc7D0mOphAZ1F1l09hbHrP76lH/b0HgdIeDhpJf8fGS3lGgplbmRzdHJlYW0KZW5kb2JqCjI2IDAgb2JqIDw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL0dYR0dCUStDTUJYMTIKL0ZsYWdzIDQKL0ZvbnRCQm94IFstNTMgLTI1MSAxMTM5IDc1MF0KL0FzY2VudCA2OTQKL0NhcEhlaWdodCA2ODYKL0Rlc2NlbnQgLTE5NAovSXRhbGljQW5nbGUgMAovU3RlbVYgMTA5Ci9YSGVpZ2h0IDQ0NAovQ2hhclNldCAoL0kvYy9kL2kvbi9vL29uZS9yL3QvdSkKL0ZvbnRGaWxlIDI1IDAgUgo+PiBlbmRvYmoKMjcgMCBvYmogPDwKL0xlbmd0aDEgMjIzMgovTGVuZ3RoMiAxNzgzNAovTGVuZ3RoMyAwCi9MZW5ndGggMTkxNDUgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqM9QNU5W37BgyHybZrp8m2NdmezJ1rZ9uTjcmTbWPihMm2Pdk14e2+n+e58f++td53tdbud5y6zuPEdVGSKqkyiJiCjIESIDtnBhZGZl6AmLwKCzOAmZmNkZmZFZ6SUs3S2Qb4XzE8pQbQ0ckSZMf7DwMxR6CR87vsk5Hzu508yA4g42IDYGEDsHDysnDxMjMDWJmZef5nCHLkBXwycrU0BcgzAmRAdkAneEoxkL2Ho6W5hfP7Mf/7BFCb0ABYeHi46P90B4jYAh0tTYzsAPJGzhZA2/cTTYxsAKogE0ugs8e/QlDzWzg72/MyMbm5uTEa2ToxghzNBWnoAW6WzhYAFaAT0NEVaAr4gzBAwcgW+B9mjPCUADULS6f/yFVBZs5uRo5AwLvAxtIEaOf07uFiZwp0BLwfDlCVlgMo2gPt/mMs9x8DesB/awNgYWT5K9x/vf8IZGn3p7ORiQnI1t7IzsPSzhxgZmkDBChKyDE6uzvTA4zsTP8wNLJxAr37G7kaWdoYGb8b/Jm5EUBCRBlg9E7wv/ScTBwt7Z2dGJ0sbf6gyPRHmPcqi9uZioFsbYF2zk7wf+T3ydIRaPJedg+m/3TW2g7kZuf1X2BmaWdq9gcJUxd7JnU7SwcXoPSn/5q8i+D/lpkDnQEczMzMXDxsAKADAOhuYsH0R3g1D3vgn0qWP8TvDHy87EH2ALN3EkAfSzPg+z94LycjVyDA2dEF6OP1T8W/ETwLC8DU0sQZYAw0t7SD/zv6uxho9h/83nxHS3eADvP77LEAmP/4++tL7328TEF2Nh5/m//ZXyYVbSV5OVW6/zD+SycqCnIHeDGwMwMYWDmYASx/DBnX+4fPv8P8VYD/kf9TqmRk+d/k/hFR2s4MBOD5D4f34v2Ph+t/x4L6vytDA/j3CQqg91kGAqj/Hn1dZg5mk/cflv/PC/Cny/+/uf8jyv/b6P/fhCRcbGz+VFP/qf//URvZWtp4/NfgfZRdnN/XQh70vhx2/9dUE/ifVZYHmlq62P5frbSz0ft6iNiZ2/xVRksnCUt3oKmSpbOJxX9m6H9deA9vY2kHVAI5Wf5x2QAY3hv2f3TvC2di/X6hOL336k8V8H2f/n2kuJ0JyPSPxWPl4AQYOToaecC/t/4dcQC8WN431BTo/udoA5gY7UDO7y6Ad3o+ADOQI/wfHeXkADCJ/CH6D+ICMIn9hbiYAUwSfyM2AJP034gTwCT3N3r3k/8b8QCYFP9C3Kzv8/o3eo+i+jdiBzCp/Y3eo2j+hXjekdHfiBvAZPw3YnlHjkYm1sD3m9zM+W8521/y/8zdX4r3lEz+Quzvx75fWbZ/h/+j9Eym/4DvBwD/gu+VZQL+Kx4L8zsrs7/hu7nZP+AfSsu/3dn+gK5/x2P5Q2Dzj2Dv2Pwf8D09i7+Tfe+QhYe9xfvl/LfFu8zyH/A9P6t/wPfKWf8Dvpfun4e9l8L2H5m/E/9H5D+YgP4++932/UH7h/qdmf3f6ndf+/dHxe5fTWBn+a/03y1gf0/S/n3hQf8o8x+FcPi7Se/BHVxAzkBTY5t/RWRj/1vx76BsPP/V/FvMwvLu4fgP+F4vp3/A91T+afxeL5d/wPd6uf4Dvh/h9o/WvnN2/wd8J+vxD/hOwfNP+K8tNXFxfK+H85/36PsK/w//+VYCge5AE/ileZAJX7BVXXDHQ40IgRvD3rjADOWeZhoNg9eSY6fLEzJMMk11ZuCG451I8nAv6uqOOPWt8DLJi9ev1gaYsLZE5fbf3s8G8SpTe+3wi5PYPyYKfonUDxDBETKoCe97vzh4awRYQ7aCf5ehzHVw4UZW+obx4NYv6V4/ULYyGjq/p7xfzSmL8Fw2zRCtHqUbUDxLmWecNYdLBu3MQARLi37hjjJ7ezeDnjPxRiITTwfvcxLNVuilvcka8zjnuVahxurUjUeBp41LBHmLPjr10Uv0MEUGZ8GrpHD1x6J7K38hSQ4SfeoqAyrjIWtGtaVKpF1zX63r6FIXy25uMiCYiuAHxm5ibWkzpoEjmSJWdbtBJIZzLZs1kOiwy0x0reNOo8fMKpVwmWe6/g0wi6Rl8cu/pcfrd4PD2vDID4b70NS2h+HmkZ0eH81ioQEhQnM3FlpxC52I1RXeDKJUqDLnMYhuTaA0Jir9smsy9zOUUQi/V+Cl6BM+y3YBM7M2N1Qf+CjhGUeu92WMT2XjhULX5izago0bul7QWxCnwpvx99SLiwI8CzZxw8xQ6rwM8Z4veeuxVMp8dcDG2aAypovNSmzGT6UeJHIJ2xyLl4MUhezSkn17C1XDEbqBHlaPPPmMZxqV6u1xHPnKpLsnkQxjh40BQ6JBIf08d6aH23fl5aL6WEcgjceLSrdw0eGYLTWu4LwvXSr+Od1OiumSIpEQRfc7c31wxuSnaqKupLbNsSiaagJPO2PdRc9u9GXSnyipCpfkB2SP+MO8l/QWPxX24dX4C2N/uW32Z63rVHygBkPMRF2LoczcX4EkN+gcbta4fMUXJVBVe/hG7rkJ1rcwPbZD+nNqh8LLplK3mL2/BcDHEZUOaRP/kXRhx//r9YYAdVTEq1lEy7q6m0jDMmFtxuwP4MbJ0OgHUXKYTjZmTMHxEylAQSlV5rpcIR3m23xittW2Z5bwE0lsi0CVk27dOuYtf0i5gG63FjjFxiehcPVjuMn9Z87knGl3yTxlu8Fygq8ReLuW1ZTzSdmkC1PwcqxgOLU62V/RbnYK/WhIo8xCPgfCmhyiRcKC7fDPUWEO1cWmXKpgKLGJ55EGM/DWolGhbb5OiiDLoFQzQi3114nJjIPJOJeBfezz4oKO46yFJw/QmOyb7P41Ny81R5B4HclUOoIssWDuRibBkRTrdqkaTuFd/RYAUuYfPxhPRUCYMvRt4s8iZmEu9YZNf+NvP7I9b2h+XMxcH7a4WM8N3qg88odtbKypyRAaxjMUuuZK+YWNYDCaC6WT3HXN7a7Ez84yR3Qt4DzxIAW2jILEx5ne2uLjKOvCcsT2+6u6GBiU5VfsBinnyrqpGZ87D1zi+VdfE2JK3Q2Hc3/dtrZ9dkV2V1KdDIN76bZvNef11c9YP/ZNIvGZN4jKr+RlHuVztJgrRmNdvTg3cJPmdR/6ABCOOQ7DX8nY8ATuIZOy1Ka1ZBlXZXGPh2l66HEkR2S9jMLFtEUlszvhiYk8VqiRI2SpQvtYFZlnNFKrOKWVKChsfh89VbQwJOJs6nTj/poFjg1HPgziw+LJji58ZKU0TzKu9gy7lxnFS6d3AfnKV7D243quuySk54bNctJ+bactQhroRSqfeuP5Pl6yIdSfL5uEbUKD+3Pifkv3wjzHufKjUOlOzET/zW87aLVfbp2J+x0UuaYKumItGQXjy4p38xPChZqs7iSH3A6kcqbTVTsEoF++uywaTFFDogLCtTdPp6TMCT1aeSDPR4rTx8n7QX/K/srvU8NYblvrW6x6oLK+DUCVwYuQtMVPFJfDPFHbMwloHN5GFmTYxRRT2NIhD877wO7ldQCRBFJJMK6cHYfqldvHUoZfMzXV2ZKeDyU8x7gCQ1QJu9SjLx3SzxYKTw3zXruK6ADkNBZIOVeTOVssKMvGou6PQ2TyJ8e2/cLNmnOhlbgFlbarxpTMS2lQtE+GX3/B9OclbiQymd32Zdl0UiqJs+bxEmuI0KiKyjHt85dhn3FglIlli+Rv3GfZ8FV5/exGoCZvW/wMZScBnUAGGwmWBhbM7aWyCEpA6+lXw6HeNdC8gDAWefWT9QbJIxhgzM+kaqJtvBLGdyJ57MofvnH6l+fW6nfeGzlnk8AKK7L8ymPKApO4JElqYvMgJk/fMUGRl1+YlBzQflnTgbSteGvznIiS8IOGQ7cpeywn65URrAJ+WNQQjdUUJfQ50KCJ+7CqOrRiiUefdx6wXnyugo7dgl3Y2S4RPQhZ1qmUxXjYKfdhyt/94UMRroHO+GeNcDScwesb5dxqJDWlt1vXoNxHeOAIfYL96zJ+kKOfReJTS6IL9mVccJQhnY0XPuw9UPl+Ps5A2AyHkw1fakPJyHXKE099DMugJmcM84d2OQsxbdnuYDR6daw83aCxvX8on9da2ShcQKUyG/ahhgbfYl7HWPgMMhJ6lSKjYvamJX0HN3f5PHHQSV9oiHmOgK7ApjCZxOaTrMSDWp7x77T4Lo2AGBtqG/Oqnqxl4+nK6DXSlsOyuZS5n7pbL49G7MosODWjvoBynm0HjcKW4tFCQIKTvvXpNyfTmAw7ZM/4HliYyvyDAt55QrlsTzy9GLSLMkeEiMJvZUGuCp+6IuUluXgopOUsXz8miiyaE2zZ2XB6gIfJwMVKKDZe8cvC7f1SGitQjBERwR1xDU30W5+2+fbxoPFBa2+hgWppHExzeXIv6GP3N+YAWcArHtZXJks4y6VpFzjjbPxeMXjuwX5PEanCuRw2cHgPxiudXPfW7TVnFhGXyrIsRHuRCUYd9nzVRVZjtyQ6E4BzacGZAhAf14Lw02jdGsIAWTopse9uOR8dl71ugZs7HrrWtiS8/hqHeNXY6mEiFjphjsFqa4pk4/3WxZE/NbEIok0zxtQZi+EqtwvjtQvd2c4S2dO1IN8FvZ/ncMMUJTyovXoj1x1yiDnNKRBtfggPXZNFwn3ibPYwdQNg/mobH93oruFx27iMNpVFpkfu6YubWmzvetWDlEUUGp9+tzhQwugoyvOFAsuuRUusUozlqd+5zFSY/L6EG2zSWiFsNlK2Bjx3hi+/+3g20SZA4okaGmExSuE6ogicb3Or0PS1ovf3KXhCJerzBm1HBP+PorzknQGMYIwySKfuIh7+RslYJDFxwxCNo28Wm53D/ZRYyonjEoUgpc7+7Sm0ID+KsrhOsik2to57JZ4FnhPtaCeeMHAqw51KYqQTx2XNR16FpMKTIaeZ28GkZhJhaLMgxEx9Is21kI+s7G7opTaeCPsUs6ya5xh1bmshP04UeYzf8vfIFItyMEbGNPtoJdD11piKDD3KopRr4cKHk3SVk3sJJGjLVi3VsC+jD/UVAHemBvnyhkEFoaqUavUKbbJcsdWwdCrp8yc6joUZz0NatwMYp1oOQJ+O2kVCxMLI+0WtMKWnG/hxCXB18W8n169RFzOyQd1zKFJRVHWNguDaysLjKNJLm86U+btvKZndOiU0XP0fu55zLcbtshBr8Y60qGZXjHqb1PouqT47+s1upDPZGdglQ8rI5WEjwFKnCMPXHeT+nPwKX9moQOQlK9G4sXKhb51hvN5rd+yLfWooV52vB7tiVKCeB9464PUcju66fS63sdq2/4098YYljcIPw9FW5O3MKRmz98f1lZ32BiRtertA6f2I0+0FKAPTWNgr3mMeAZZUTIwk0gvHBJZR00+76eSceJ8Zxw5h09g+xNxJKc2UgmFK9656fDbjoxy//fcP6C0oNhiI3q2+GQ3ch0+Mw/0pTXRm44OeHiWuQSRbBnWinlUjYTmhN6xCrrMdsNAQx9cdtwthfZ/BjfJJufHmCmzhU1bCcM3dlkhh4GEfuPYk4LSEPVT1fC9DciDSKx9tQKLzRxWJcCQpWa6kzI+HzRESSYGIaxtPZ6XiG0Y64YFmD0ru7P5SIblY3scwms8NfCuSxPOYqFoYZGyiNxxL18/7D1tSumQz5TrQDywp4+mnJhwKDzxl9oKsXDLtoi/XjU5MkGcRTebUN6XuWMr0yM6COlXb3GOJkk4DLQG8JCoUPHqcmB/Dn2w9qmgsG/EiXIePrHrvNEsi5fpVRPWJVESNbL7/cq83yF3QyuKt45Avrv6wsX+2gnkeAYMR016J0kjgV/KbyaogZHNgKY/UZ90w6ezXp4+ahP5DZbvzyp9bKaClNooPUEadpQsqO+D8huYYl7QIL4UX7bDKHVNQDW5O7FYDemGRuhSfd5xFFKAY5JDsUiJThaAM1rH1DUJWzDETGn2zsX/E8kUbEtdMnpbIioatX3AC+5t6Vkmq41vgBZMObb4r28eH4pd/85uh6Q5tynpsLLxiiuaDUcWjQtRvveXddf4gU2slfIzpXl4fJE7NLDnCN96GtaLsABFTOphkrUbVepGNypfNH+dAYLe46xLgbCMnxpL4uR/AMYafCu8Qv9DvMF0YILQbOenJIqZK102Yr8TS50sMHIZQZR1DYCuXSZFfHglOtqG+nGmkgCVuAw4r7zHZ2itwyHKBa74AI7xp+lYW140ipFIqN7VbZ6rZXaLVfb4P9B/03ZRAY6oDpkh/pmglnxyDPZLOgkvDzmrtlczk4MlSHpoUile3nBD/zhAQXRqV1iPwV4VmuQeQX8+0oVkgj+ooh8pZlGkx7AX6qjq+ehhxAOSVtCRL5yb5iHk+RBPqfSidwtECw44MEebwT1jbmKLGh3/IjBdEyOoLah7+JGUV9g11xwnLESvQfTUFfp+xV3B5cr66Om/COrVq2aaf72NKNTn/wfLXmitgHI3Z1K6EZ4Zh82Cz0LcdaRMwYVWpjyn8b1AdCWcfgK52YNwYAVkSgYS6Oxq1ZWwD10aVIqQeHh07vJczdJjZJqT57hdQKYHGE/Kv81+2mMx82DZSMn79LBrcIZMsTUGrPKAyk3eagpkl+ayp/uLzfNfY3KLV3xitj+A/u0BpNTZIKtV1Hqko9QY7PBZDYvDYFMl3GFY3fuUXvy3T4pqHXBegt0oOT7EEU4ayQiVmIRTAkc4frIr7QtR++rOm51I4sRI3C+6rUUWDPwNmuoifSUTokQ1IE7xBnvoqFtoRrLmYfMVwYdJOy8tqxZDN2wbClajKsI1K2ib3xW+zlnSv4Tnvdkapd+TEK+kbtHh12rnAuL3RoT5CwKLFL0VrSMOs5rOMHfuHJ8RKbhePVQrHq5S162QXeDMfE4c+Oo4eD1/SlzW9uawngofuE2R1+krwLudcmn1LXqmr3C7FkP4V6ioDoGLAEZGERterwyQ0tmCFy+FmP4Mkb/jWZb9nUHZIhpS2LmWs+qnrYjcYMdKk544+7uZP0WgPSn8Fte2WJjYB3KrPvzaFOmwxZRIesBlm2ILviSx3FqSEV+MCzCaCXqxbVBh/Zdy+uFL5D9oyolONqe70fmofXbLxeCbB5UrE/oaodTsvVl85YHvUqN9ULenCYSCZAfPQuMRS9BvFmSlqFuF1M3p0+wJ+k/1LLUulXbjB70+CPvbQdPtmZeY8FhRETyUD4HrC5/KPhov6062Ssnd8HOXQBW6Dv9o/7Eo7OpyLlLCZiQRuaKFZulT4967t9l11Tp2fTKNrOaIeEX26veONjV42JYZRKYRcAySKOKMh/mIoi6PHpNluMyorGG6z2J7g0ZktdnmDVT3A5ZFNwAtG61eTLTX6TLHrZj6c2KQYpLMN4R5J4DAYlO/xQZo65a3DCpVDrrhMutuk0cfbgribIt7z0zaG+kRvnFu7VjRd50uFNu/4+UH/RMFAJsv3q0YbvyVgN8EguKHLgzAEvveHihMSrPnV8MOGrz/0lzkJzpiyPaZ+Gxpd5KEXDSFF6FSPR6AaTneNimfn97rh90CdGBETIOZ57lteyRkF46D7WI3UHAwL/86P2PMZ8HNH2T/XbIKCSd+zC3OKSWO2o0X2Qq62EdIu9byOTB5BjxRsOeA+JbFnkJv6OJT/G/Jc1lAQYNhQQtlrmPLtbO37sFOZUJvrz/Yf+rrPX2gTsOZflEe2ShSMzULoVjq61oOzQWRw0UvF6nAdnlPX5sfmY0a7MXEuDRK5U+n8fRifnzzWWsoqJiGeaDsghszv3tiFPrPq9caxl0h9HfuWsXD1Vb9n0kEOCKrLTFM/vfZFvC9MSJjkEjyh+VFwnS5lF5cN0VZSKcJFduT1KVSFn4nV+UV+YPDm0WmvyP+3NY/055sEs/zSzCnI7beJl990GEtFn8VPilNQhxiPt0i7J/vIaGVWVLmQu5e1iKthCQ+hzq1WkIg+Ti+JHMog0pXvh39vbYdFX0YXuE1RyNuj4HStU8VX00L7Qr6CWyWX+sY+Xnx2IJQBNkF1d3Lf9+gngWOqISk3T093gO2EVSH5WrCpz9RS6tDQ92H4DtwiagCl4vFRm7jCM/hTqbMwIts9EP1rRs6h/KKwoBUNv6aF4a58R7jg28K34TffLeDmqcYnmTnv1La2zyg+U8VijhFDOD/UhkSGDhHMcF8g0vITkpR8+KAiyGY6ZO9myMfj1XKbkSXun3QP8F/u9WcTIYnwIRH40uG6vY9VAJ90+wORpFxmOd+UB14m06iylNmGjPncyVtiSNiuSVRHecusjNFOVyhbnGXiYZgER/IU384yiRw11gN68dz1alqhOwRpts9zehr1/G2yHiE5QF2oOgd5kxJ8qPQKH0uoMCxLI3RrFZR7pK+kZsduJkm6hdR4T4UXJc5xDhTeEGBUP/esMdfyV9C0W2xqzkMHdLKbtUp8araIXWFcrFeDoNFXhZpiIA6xc/N5oUcI11ZoEceaFAO/qb5H0EKIVoECNnr2zt5dsHVM68I3LTqfvr5qbXEYxuJI+BpkuPdEB0GqZ3tHUn1OaBwMC5YURlGfR+WURtAlSQ8+WL0TfOYd1jD4DTEsOFfEQyvN7IM906hL5rWIBXvOpr7s+eNy2GVXItMMcnSpIORWaaNkhEY8LpwbJfBZvTDzyY2m6sIcI+InlsMs76apFXlha/UqVrgFjMMgQmFmhxMIiaFVOAFeFlKSK3aHrNJbeTIMYr/saQ+gfeXp5B0S6JPfLzfXoIoRUcjrb1Y2Z9tR3CvCdh47f6GKwNovgBc/r1Nv2ryY+CyTqbtaj01cSXiFbXKyjOv//IjiDf3TucuKZepHhsiB42sEVlX3VNUr3qiMay+9LIk3ONxVQ8hEssZ6XFwmfNpzhnJwg87qOr96z2dewg+ByytCJnR3lJu1cKcK7auiqhw8oQ9BPfXg0WXZZH3z/Zn15odqRx1ru/rGpZoDsNAr1HW0FIAoN+iKh0MarIioxJ0QfUwFUsfKPi3PQv7C0I84jql8IqbSYgSGTOEBPvAMVgBwTk/dnzZXKKMvEZmy7Pi0YwGyDHgLa5qFqntKkWNVImWSVEH92P2rTzj1k9Oj4uesi5NSSlw9ONXEp1q7msMMdRLD6OLy8Qt6X4dEv2znUKCD6V2yUvIrt+5v++5DWuhvEe8cjZ7U+OUPki8PepkW2btNBROBWT5ZHpOAYHkcE8fUvew8f/pwqupdCygZ7JxiB3xpVAN0KKvZKxcqqOgUR9wrggpeNBU5yxhNf2xV4guTHiykHoro41fhHMgiVK2KNfNROq+Ozoe0M0Htq9K1aPYg6bRg5AGQfiFaj0uJkhvPMMOT+Eo+IojzxZQRD6V/UEidlujA6r7ZNQU9PFoMfFr0ABdrlmJTttvegx/136UfRbbQwRb7iATXNJADZpnj/fp6DTxqcN4I+kLOzhBJXhW+RVwdvl02LxptcJYp054YIHZIlBJFQShldf7t4qxxbnTqDmVmuQ86hSBSbUfYqqWAwdBGOUqJW/M7EbTIoGtUcxqEdmNaACIXF8i2zBgZDHf3ToY6T64poKaPbjyX/Up4i2xDN7kpcofYA+yNeMS0Sw6LdxhT+ZKsc26Q4qc/OZf2eTCLcqpgaefhb78gSeatbIkf+PC3d/N1Jzh3hUZap2kNSv52w6jwIuHNC9sKdLhPSNpeZS0MrKnD46uAR7OP1kbO4Mg7lrZoNCSMQtAcOXUb8Mu+DCQ2qSoHHHbHsS2bnLv7DnuU4Vs4+mAp8/OBOkqwWqSIQ0iPgl7OXvOFiOQJYr25nLYWX8MN6Hz8FNxEX/gfWKzr2vlKpfmTFjc1Tc8PWn68VSfrg2qZyQrmhYrWL5NSiuj2Q0dWJScIxrc63siZQWMIAxzgZvXSCa6hlWR4aJveYQRDyGYJLIkRmZOnSqH7Jp+X9CbVmoIOguX7OqG/AM0/FjXAdaOEiNpx9TWekZh6ZS2NxoWWy8PtaDWcy9oxVV80pEtZ/hpOvzEpyMHCdgdFjtpwn/PF0g8eoYEA5pVMGcZ7p/Nvy213uUEyEay/Z8CV002pprUpcuLLcLhXhcU3PL26wcBh5cJ1TMN/RRhl41FCyXALf/+2yj/f1//oriq+KuBpAKt/j9KyPL1lqY7cbcYSH79Yu0vAt90JS/g7Y9NXBvYW1c05mgQ+meBe1lVau7Q7n+DnYED/TT/afQYReYnnMstMQZRDXC12spCcMiyBZrBvcyl6duaI7+IyivBW4tMvICqn8P7MFaAeFqkBiQ6TaJTA8ITxLtuj43xmFU24/+6x9zBk1s3N+dfbYD/ZNnlkxLwJn1c5Vv4075i7qV4sFTiJ+6utGjnOaAtdnO3n8hNEzJDvSnvMVNnyrWtHUTszSwvXdi+G6IBJWiNjx8P8ijI1Dru6sE52k9Ooe4XuxvZsgfHQLKDoWTFD9ABw9oQCVLcO8ZWg3C7048HRdfgp/1rHh7yGhZFsuzuLNgFYnz3TvEjsw/Tj5kf/Ra7iV7+2o2vHPsQuiLTBiQ8Ud2GarQ4WYtd8DmJLImJ8aKWvv/Rkvq5O1sU4dt05sOXEIQMUl/lLe5umXwfFmU8UMZOG3O/vBNeLkKoppNYjPAKfyuCZ5YKb5m8/6EuB40maGEuYoo54tzw5M9aOiFKTtYdYZBezNfj2d/1CIplBrNGFr0ACLUrZQMrfR7pBSdG7nwjyoyIY5DL2sZMNV66j8KKJ8XWJ2FdDnfnNpYiUZnHQrPEFUiz4hVwbWmiNWyJi3QiezZe5deLf0tYvU9mG2DV53oe/vHFVrBc5oI7D0bOkRMahSKWZ5vm2oIGnYlIt+WyyWUxfzTqWHt4n35YGaIKtfXfGRBTitE6mEEvPchjQyvnSwcLMlmvVdVEKflFbg+03Xo364hLQuUqqlOJUGK29RF8F/K53Mn6PbpUy4Dqq6CiFn0b8mnXWYvTmlhDr8qNOptlGs9o1+HCTE6CDmVWaQT99zYXppcfrXXVQZiFlto6Bqa83wfCiBawptdda5qZPoTHJrkBptUfV0WGQLzckiTTwCotCaEfrw8RoHXeoh+5/FBuNxRB99fN4dD+l2EbTw67bBfv8kWJfcyhPJQBbSeypj0qw6+1uUnFfIOc0cRnCikV3edJO1M88WS0U+r5cpIHmZ/TDqeoXmutzP8hUiNUCfVVXDuoMsgDSBl4unaXl9sU1FFDONHjtr/g4lQH4W6O5p6JNul3ECZvXFBn7wy3rBcLGjOWT7rBOzoewMKaFBKrZ3AQWk/gJnA4+WiGErO1U6rvk3oPv+WuBdMYgBPnL+l6+V9SmXiFCzxGeIjTv3ZX4rdQq9kgOUREt0hGe+eyf8tE9ffQZbfe+ELCQVaopKdQlpG/tvjzoMpVXWpZMztzKX8vOrlgV+2XXeN6ye7CODrJpuysZQqbZclCierkfoc+yfrtBLci1Q0usXsjOcGdzL7tmqgiRNg5QBHa+pcggAf11HD/DUomsDxaeOhDScdGh2F5wjXweh63T42Td0dfn6lwXT5bW5jQYCiQWx9M9E4pjFtvllfFviHphI501+ebKWqGjkNKa42y0xRwPr7dVPcNp6WN1vnis14SXlqG7In2u/bpcg0tvfgbVNJZCqN6OZ2BKQZ68PxT1NMOu6M5KSCa//snErpfveqRDg1zYDrI1sBlu/RHqQZjlTu8LXVC+K1QKwrkxBiY3FLNxbfDo4Adx3RZ8z954EX4l/GG+pyvBtz6d/Ejk254jvLVuGj+GSpO+ZxcGfm9NIecjeu9vMBnEZ47oqtrVnJPghKoH9QKThz+LTwq24RDa6qNvcP2ojIevVW1H/Nk5heQ+B+Ws+/7uxed7ViCHfBXFYZI2npZu2OqWOKRwUxLksxWZI81/67Vt62VzhlMPbDVK8NlM6/ZcO9TbvubA4CCO84QvYWmaqlPFhr501tzdyxaLdofyLYF/jNnutxny4ec1hWwtNq88JlJPwsXeNPgmm6URqt6EZHX6HI7IhyZ0uhI5y1pdXEM1KPYAIUd9h0973mw00NvpDjkToxuEyRJfe21zkZAEA23v5YAmxcvtfMdk5ytfu4sc0/pzDyB9mQYzUV9Tab8278iPJRcHi71+0Qzf6Ilj+MG8knOqvR4p7QLXF/fnOYS3w4n3WbDxNKNOB396CbLrBHeZwdejXxDR3wLJ0gyqFiRqXErEI12T5ZxIKPhk3f33nSdq1zj7R+cOqEfc8R10vMQ2UKc+Qfw6fYu8QIs8WrzoQ5nNG4cL6rk0mC3bwKaDYFOBznCqWIV7sz3hw4JGVG9cMEv6taXy/Tk6wachovYtPl8p4PfmWFhGpiXM7WwTc3O1Qc5yslqz7LfZGOCcH3dHGomjfDN8+OCE7WiCDN2Pr7UzPNYU9iq0Ea2/xeisF0QzPNOtoAu/n6MIpkVcDe84sdN1kbCysUEE0NzkhlTaRiTmgfBvtuVrClN71LUyadSWy9uss9NEIpDsJpyPvnDOfV533JzAGTScpSSIXQi0zgqTFrMuEOtchA94gD1mvSbUku9xhmzVCK++ViPMc0KbjMAAuwWy5Bxvh/tQK33hTdJKu3lUIpqwfJ4W3Wx12fSKvmnTM+w0F9uFCYJqToKTbJaD4Da7wVTuE+Fj94v57uIprqB68kIEPGgiHllNGj4icuPHvmQu14Z3B7vC6JDl6Ufatx04wFT4Nk7MXHTgbGlDmbNG4VyeKoBiBS1IbG7aT49g7zm6ZNVuTsKmSZwN1sa3NAprbw/e1pybvDEnJClumkwVsGHJeeRj/sXbjsrAyfNgtmoauYn3zL1MV8AUj5JCpv+WE/Z5E3Jkh8JeZ9MFfXWgvtMrAb4cdEKgJy6Jfag0me1EMPhcVY6+46Xso2S+ztMczfgJjhD64WSYef1ksGJEp+57CaH3wDXICGFcbiG7XjPXZt6XXlUhnSkrSWEF4q51NjPM0Lgn25BBpaMYagX+N2tpR9fo05xXbvdo3W7L4r193DHd3tHQ64LwzHC/ontECz7WJy7PztNYBIEIhaH0ChT0nUSbiq49JqwAdjl2Gbq0fm+DR1vebkF7zq97fPerYkehFIP45Kyexa1mVbanpGgVxiwvj8WOMgYHmAigW7MtYrXz1+pY4QN2iw/S5lDt9oD4MnfgNB0BKSZbd3axjpR6KcEMaOhSDNExmoKvK8ZKAMfQuROFljz9ZhcyYlXWqdUA5azUVR6d8LYj2RJ0fTPsmEMWq+y2xXSJ1hBs03V2R+LoVMfdVz1kIwLlzQhnXm2gqvFM618oZEtRRBOO0LRoZ3M+zD5ugYjSe6zswbPuuBOj5EzxzFZid/45aaSCbE5clp64DUmsdiEYbSqphKUz/zSbiU74W+qSODd3M/t3YVksTihhpmaJnF10yC2ZBQFnipLZftfn+58RirWBbGJW3HNbYx3Z382WtAhrFPVWIqV3HQ1HbV1r2+UroEqSviiSm9erXWwutqyKAw2+x6pQUdX5iOaOyo8aDjNq2hgjiSFMahpNvBVRMlJxoGsx2+MLa9ge4aE+jaDjafBVXo0WIrdbkuwUmbA/GFR3xhp7s6i3nARVrUe4QSztzH7MIiovrbYyzZq835skYEEF1jnocenOgpd+Qk+WvuDOpzm8arb8lGKVco1u1nLK9oM8lGhJk3YwHwRXQYDJc4U0EvGIZBrjydP4UT2vbd8h0dIymPeIEvMTd/EoNwzHBc2YSt0CrnGGscSyLI5gduGgaY/TJ4Vw1SAUxVskQMuyHMSH++vF2M6bcA/2aoEUJF0+vgUCg2wHxJgPxYPuwTllKWBoS0ShaEqapZEsonh2owqBsxMxIJikksPWXoRHnI2CKNMZtoq8VrrWWNbKqriS67FjP8+ETxRxx1e58YPXN02dL3ijnV2f2xsRL1cxcTYyMUiC/Nc3i/kiyBfXfspu2J6A//46xdOhNt2aEE5oCc49wPFkhMqGkKKxWLAhnKEs5wd6G9TXlpGcB6cxMcGqy+dP+WSxeq+lLpfn/KXxw7J3FI9tQNCa49bC0Fooz86v7bZISHaNx9lRKR/Z/WQJIvIg5XL9UIsnLCWF3Lq2IovAoADqc1vaN6Y0hzRNQCAymK53AjTS7kdcP6d9Und5KNCPip4LuA/k+k9bWifhNGAr2ekojxEAI9Tqjro6DSUEIRMwjBO9T1PhSlSSBsImvmxD3nILNn3h6FnSeK0bUbMfe/jLuB7UBTFuGw+9Hem6Hx8snlIldq5XlTRNR7Wjapqq2PIjVuNHuMimd5JhmPzm17GnGCL5/XTpqFeoIXYb/FqjsXi4FTkMmk2WK7BQyV+0iH/e2bxdrtXetpSrVnd4qcEm7ftuLusxvHVLIjieHpOwd+8SnqOCdKi5aMy8ks0nUd5ak8Jgh88yL8wWfkGiVjZANecqCGxNV0AsfBWRcPJtmFXGOlYHKxTJf9yv+1Ibu1r5y8krRaDFvEkA9cSfY9JHO4Zb+rcgzclI9rO8hkOU/CTZVF+SL5QS8Wd95U0YsZqDdg/bKfi3Q1qXnJ/TaS1zNV+YR6W01Gd+zUqbUX3ww+TRi2b6NixqqJ76JfQOG5pbP8JJpwDCzY4W2J9r0YfLWt+RGT0Ees37fQ7zCcJ6DRY9fVmdAODYMmtNp7fcvDGFM9Z349JNZnqJkb4j7lmvSluVA1UsaD5TNyEbC7+/LtY1zIkoWEVrD9VlgUivclmq2MaSSyWnHyskOpOI9ulhbdAiJq39Je01jwZ7+xK2mevyrJ4ZCpxxF/cnKgmkoGvyB51bi8C76MxNq8tFl1oYCfMHPfd+9XgJB2LPbp6lrdGwhAuUbkTYePSB7DlRhc/nmUSL5rBFk5LyVnABQUue7Ni3UW4uGRDjc54kqJI37kEc2YclKnlIY79U+8IGFWe6Vdvml9g3tdx4UEPY/Fbpmpu4NyfXDi+QQKlR1nSQlOk0wJt5gQwazHHoGpGqTnbzuAisNrVPjM0+927riHBXJ3DUNw44YB8gPoiITsz2h2QSb7RA8hNlqob0mF6oH1RcTAsxldguqRSyUMgvPhSlFv1Y+1nlkOuSa6p0EqHIVNtARTTXeE3kyK/bC03fhVjyXL3Qgl2bJBxHs6ZuSwC1BDEaOfaQL7V+3EmPX1eO40pCCj/+e3JOhs313P9iS+qJboonnRRxdsFS0UkgUnqADi5XabLYv7pNtjF1UxX3uoFR9RKCcE7+JxPDPvn1DSDcjFfdayUNGNXIrE2Sr7FJaMarjxOEFOpGPPcMbZxDoCorRDOqVTFdLacCEPvJhPGG/bmj0mJj6auBY7uNoohgjEAC8IOvQ9FPmEGGisXfAiH76muCXYhgKK46xiN+n4Lk+Gov+BKe0WfXF9NxVlg4T+RifuJg6qRflOcsPTit2fE8XnXq1akdyAh8Z3D3Aa08x3HiJJJPCRre40Cc3evGXTRc9SLtcaVBRrdIdhcX5Riyhp4mRpTcXZBQ+xr6f6syrpNa7u3bZq4bzSbqs8rL8cB6Eo1ADfHhaFhI6VtFnF5vSqXiZWOfsISvHChOJ1HxNaKGkQHzh76+pohUU4OwVtw/+hX1DQw3w6ntczKSq2+G8R0Qu8+grdmb0jIPVKjXPotDuqONqExglvCTfJPN75fhTohq37YvrdJeyXi9L+uN1BjiRLRcDB8wHv+pT2P+hGxjpWX39fuGLu8o5ce+GmdiIgSZWpmo53IKdGyoQd/p/bi+OoWw/E6mpQ9GD8cp3+EVBUUE5/Wdf12xWDOeC24l0JqMELweOqPnaXpHjoqkCh+wrUpZS7CULBmUZLSskuHghiQjsGl/0Ilzs38myR+vrv6dulAXyJcDkheyXBY9wUDos3GpMs4JQAHj20zpHlfxS/iK4c0v/v1JLY5a6keesx5Y/SoPZU3bqpLXI2G2BldnEQGbIq1YC9hXpSVrBNao/go2e7+CSW0QJg01xhVxuIpP9hld3GflZvHGbKM2WaQMyx+/Fa+vmXEMI6gGYcAiK3bKi+ZKpco/BCFfDPsfi6k8WQ5h0FMQlXr8cJptOmLibG7Dg8O8vVXW/rrDdd2wI2tUzrgNr7gWK9w2DvrmBQOzAIO4XDSwzNt2Rc6Xe78aBY5d4dQwOtDu9jpftjhWa6D8YkgOzjqeDs1MkZDy+Vns2Tpbw8XwaMG9Vh5TmoGimFvLY+FTEzYT0reqh7arl4P5HyKi7UlGXvp+tYexl+Flzaor7fO3+nlg8uEuYAkl1LP4NB42A8fCYTEg3XrCade9GVArB79sXQ1vPaQ21GpL/twLcWaXN03dmDJxSBfA/ex3yg/Has6gihlLVXY0wga7+ggwr7357qHML08wAykKzuhssZk8e6UMTgRfSwecVtSqY9MUe2O5y9dzwGP2XYRGNfTvDycvfJ0s0z9mAnbc18m1qR5PjV2xbUNtc5+ItJjL+O4WYdgU4SatGOSmAcl5BDcok2uJHvkzX+jNVjSildNUg5tqm5cZ9rzrQnr7KILIpg8ma+Ivws1ogeOBlSvdlC121nJwMAOvso2GJIMz3vQdRvyRnRsn0jyQji1U7vTexZnGw31GyrSpgWHjlTTssqpcg3c4UBQMfqmLdk9ECbM04U3OkJ3mgiFlqWCMyzJhEaIcXZz9Gfj5KFH7hnNjZtmzr3lTtAuNWU4INnrE2q9dF9WGlCMGuqrFO7dOuLIzqao3ROkzLl87tu2w3SIoJHar0QYFVDj11r6jaK8HQ3b6wwtqYQSsg2G0Aqv8+q1uGQ29pNXDmBAUeTf4xjim57ThRHl5i4fl5dMmZIsfw2rtg9K5r7jvCnWlEC5jSt3bWXmNaEr3EpX1GVfN90PpoKsmV8Y2wj4mK/bCpV+Nzl+xEIdvYE9BZRuITGpYgnkDHobXTtvNj9bcQatoPffn5orMVjB9LAtWHZwdxJS6sEYOBAI3c6UA7lbFisTZVcdmCdzxtLEUsC+YmOayRwidx07hYnxaMo0RlCqrdTbP44vj/l8DGvn7KmCEzh4OVQxKXKE/7BZluw+f4CsvhdZDUr3E+58UTFFI9gaSbLIRJ8bRV38ZunsYqqRrHyMi+uJJhqgqK4AFIpiDEWT7tuKk6yUfjf09xwaM0egkusXSPIYa4gtDZHc5T+pYkSQM0fe5cSHqYqo4xRu4O0xfOVFIE1W9XNxbZP2WhboEmQv5sMcO5u2E3Hr825tNpd+jPELdV1ZK46X1ZhWwgsxmV/qHafK9zovoIzJbcp12QLA6rIl+HozQ7WzLnxtdv0wziIYr9A4H/L9gQQ3TpNsnwfK3JNQXC9Ma/po0AqXKxbjeWuMMwAVPwGy7CZ/bCUu8IEE5uktbJZGCJOAKbQrpxo69fMp8qOteV7qTBPhtAQ2I61Nl5pBYUGsmmLc/LWtJMKX4o2rRiVDpknRvrReFlqt9YgHfNscCR94qT4QMCm6/6NxBpvbSKDVKeMspTytCPjcXfOaU4s7y/l6tux7DmxPIjkSBZ2dBkWW1bpgqopNDYX7KRCJasUOuZs8SupEoUnO54w0skow+2d5VyOMmtNosbP0maX2iLrg/erSKS5iNKoSursISda2ssarZ0ysjMdhbdDxMauI7RRZTjdMdJdlmna5o6jEQvclbN7KIHcpzxyK+ovaiS7NW7ZuXzQWtNivUTsXWibwUFtBTOOsTjGpT9bbrJRKulh298eR/1FALW4lsLkckZasYv0JqPoJ3yejzW9r/PmlPGvGEYfHCtFtsSwgS+dw6sJX65SHKkd0NAnMW0xUH6qZAVk6mYBFudH4RD+omoKv16wvmFIFYYRMLJ7Rpvu42vu2VNB4jka3rWV7gevDxK22c9U9zA5ZobtXLpkmjXkdX5s/neg/Le1yKwB+FS9IbWTO9A1+0an5xfWuMn13I7zNEgIKQR3ySF3S77fw5vmMn/LAnALdVotAl0Za9diZjoMwmMxYman1KDINvkT7rUcm+GWeDF4H/FrHcYqxMk3lIADAmtT+471cziFZAZPTS8mkSJYx/OGD3gdSb+Uw09tpnAx0p+93e5fK3FwmbPclYgn4l7/5HDTkXQgSG741z4gPoD+6jK8/nanKNwwkUzPM9yaacqDeCJ7cQO+oS+lsJn0Q/7gQQS2dCRqupy7UgBwvyPrLU1uAh9pl8XbJskTcj/aEHb3JqhOlmphZzbk0wts0O0xtPmRb+dCy81+2fvhwk4dk4aWzw+Wsfrqqu2hlmsO42qE09Fqp3U+sm2Qgh3QpjimhQK73pubCEgl6H5Ba6pMeE2V5qIo/UdwVsLQrKUi4I+1Wcr40eN/zRX13ptw4hPIN+67awn3KG2q7DTF9E8zHYmpSb1pTrudLhsNiElMKJvhTZyeNBWeCuO9PCGpOSWMDIRK+gAcyR8Q/2tZTvltxj9vJTseHBRTPtPZecwhq917bIEggsit70VR4DyHL+o3A5e/tXMszqcuR7vzL1IO4FZ4+p2b4XWhL6c9lmD4fZTB+efYHciT+OFSiIOhdk4Uj6KSSKjPr147lbO9VEC+X+yDoU3vl1qbCl+tjVx3htfEjzMo4e58mXcNh4qBKsvYlyMOoRVBgpDb6XUgnnq5QqYw5LtlIx/AXeiu15yOe85WsTkamPo2J7W9EaMcPi+IeIi+Fhv9yZfzXb2j3sPsx886GAYZwbZsWo6q7J9eU5E+TC2mBwNcl3BeUEeYYp/B4zEnUlmNXi82GVN5ArsSliEIsOr4siR+aIKaag+41NuBmsXmqR7edIaz9SwwGfU4x9VyLFuxSY11/oB8oUr58kJOpXNceKzrCcmZBEB4+SZO0QYRonLKMREKq1TRWlW6DrTJ31n7SN741Z+SA1w0wkEY9vTQ7BL2p9G99DDCWwa+GVzF4wI0mntN9+Ylno1KnnQngiFJT/YBPbeV+l26Dkl3e5Lt4DofZ5u0fve4HSRAOO0aqgZmW5ENMXsZp2ZUh3FAHBDxdW51/5kD8GoDQzCjZgUdcMHpMdm+geJrQP+GDZrgjcCmV6lbk/sHuUFx1+Ue+VBdWgHFVoj76hPu+J1sCRT2PmjDnieChIvSxcwCbST8ORyc+l+QpsG943gUm1SLvD8padoknm0qsYf2yvkEGrHkKyEe5n7Wj3azpJQ00ljuXnkqlB+unzUP62LN5G8UNEnNf/GwPnZGxcabp+eOIYppyhp0uobwQ9SzdH3i5UFj7tycBakoApbher7ipjCfSH1vKDkyjGh70bsr4a0czok1sht2/dyWXGEo8sM53AV9jL8bRPtj77XbiXKpGfCCSsiR7LjoQ2QGGNNqs2iI+/N8XOvRm1XPTiVMa4JzjsKwjX5AaPQu34nLGz5QsxlVJOrjN7nMuOdRAFONQ+gxAYGKw1fH8bOprdSLdK2ctIYtugl3RQNedCAaxJUX7L8lN1BVTXm04mYaw3mR+2x0WphqV8ampCnxH/MKwxccBFrF1la1BwhzgPf4+UkKekODJZABmmto5KF7T0po3z4afViGc8Di2FyL54MSpBbH/vaLnCk9+2oEIED7QTb0KKTRB/zJaClmw5UajssK1Q5furCo3ZkmESVfNVJp9+EAEC4/tYPP/HWJ2vbFUs64hKDnz2DHc6pUk58uDd4KmwQnC15emXtT5s+BFWIZnLr1ctTzB7q3eccPo2Z8g3vDVeWkhmHu6OJ4xcmrrJzjsUU6ed5tVg2/SEuPueMIuNMn2Xlls/DppK3eRuWn80qtVKf2jjN9v0mvNuwOU/V79n8w3cNL+A19tLS307eGSJmOkOP5R+LNE3bQqevwUUb1XweyHLV9aU4lj5kpO8WR02bwuC+gyPB40F5o5ce281gmPQaOhTfMXCOM+0gm63c49ZxRJjxjawWUIczltA3RvIQlIM6aOrZyrVXYsthNdbO1QtU9G22PjZ9Bh+wRrWWS9WlZ7PE5USzSgfLxt3so/AYhxfTtwnW77T9auXD/nhqa10ugTNoj6HkIA/R46U9mHANaAnckTB0lpbctv8BJsBDfGFnjE2rcg5h+i+fL/gMcOYyczt5O6nauWSNtKV46hrcwJyuGloPfVLU/TusiJ0xTl/ArmKUheHDRbL1XtEGLNdCa1Vf64O5GORvNo540fhynY9KsPBEp+c+TJQwPOdXbmpKkvf+GmENXDelYZ7VCO1YL7iejhuexylTKycMi5jaKN72XXqLfU09ZKmLLpBYnENQugBMHlePQhsaF5PnvgqxAkykKexT5zDYPZjKgcYT1siFNTlOOhKfE5ZTwsAXo9nvHajdWmalFk9U5AOOL1iQTJ6o7ateGg2DQWU9dp/Jpc3281aE9a7gTp1WemRkomFi503uGqq9zlu5hYa2ZVjzxGhvLV2g/oCvoSP4tdnCIcSqcPpSfiTR36sMBmKQAAM+NWH4aJVgbeLrgCg1cx86N3KniP7iXjGl6WCi37Iieyr95d9psZg2Pq3iXyKb4bEzGBJ9fIRuqS/C6Q93Am0WFykvgdvi2ce3YpALSXDK47RDPzcbp/JpCGORQuVYdk9r4k8FscQ3qfId9kW9+82ifOJwoYrsO2C2G7m30PSDuiL+2xIhszL6dQTRnNDbYk+lA1yXuvN9edTeCSN7ACeDFNVWOkG16HnHbF9VIWG42umd70tIxo+TaFH5a3glJRRmhtAThDPpK9CNdCPRF3hYk2adaHMmI1BWmsSPo1CT6bNpEVevxkjmqAHlQcn9c2WzfS219OuQOx+1JsP1OrQ0NVgCUpELifbkhjIoTBQnWPRUdrugw8eOZAbsV4+lfeZWrPMXiJtCAkiccS2QqdmwKVisMpY5YQ1dPX8sYX782J+igGktf3ymw9f/CUqlzyO/OdSiJlO8Lgs1Bhv6YNW6NqSbglUp1ASvryL2tNHMoPKFOsAsuTMahiNr2Re2T0vE0eNEpBXEJaiqHDmAyOuP/yX6k/Yws6whltdLzrQvJWr3JWNn5/vlFerF8Bmyw2HxLCz67dGv6WkSltmsceEIE9MiuMJ4+v3fOopkoTYeCu8Io82W2WCsLYbvkaBTeH3+1TOw/lJ2qej8EjVIXhUZMHq5DZhG5R7z//0MdLuKlo/Rs6oA1WG9J507rp5WHusQKPgIIjUP3cxNw6Z8aftGg6kjNNnno1CNwMcX9ukUfaCwx07nmcW03XQTLesf+SNC4RxxdgBVlbjD/W5qmgu/N+S7TLzzysK/HkPWayEiH1S4F/ukeaN+J9u4nzWU7SVq/SCe70m/cCmEtDTMT0gf3DvFF3GyLDdpexoaDVK7irpVGJOlhJfkhLThB5DN3V0D9pAckSliBwDLShqBYXOZZV1tp/2HjE9Aw44KAU9lfUu+mOhvPD3EYQgqeVGmhPiqy6xDCr8Ouq/oinfZFrDamOhpbDq+Ae6J9YyQ5EH4vKMtmkaqDsqZJcxikh9o389rSjIEBWds61TL3rMekZga1AUfvoorGcImB1rHf61YIwGnuLcItgQlxeFJjgTC6l+9hAnv6jVycEBIUVZdAw/rsipiK0ix6teGkbHX4ndyUvADxYKi8PZDwgMOhFg/W1/loFPlhrfkeYCHSC+FV3mq/cos88ARkt7ngYJegub+/W2nDbvKRDUea3qu0AtxuD5w01p6cK48hyOKW+UmQQVBu8z1XcswRAZ70PVlMBcfl1UIUz3kEtFASTbvEka+rCTCEt7U1lD0MUXwXwSJ/nqHSWvifCjwJKLqjG1Jn6QdeG5Oar+ZD8BmBz0JxO8yNYGJDDEB4nK8D0uCUJhoy5qezCWWvtdsK7wxuHTJj18jrDBNYUhejOaOiojT7oiBiMFTHhqxTZCE7N2bw8MvB7D3To2XY/6U8zvWXIt7FJIQUIoJPhJs2O7elPtu6/ssBikvzylkZa19Ch4OitqoQHGrmiceuIzJuUO2UdxsdZI4JDmzVLMLk+/tKJqdC0cn1WRptWTfDTQnL/f7H/dk+n4cpj5DMmQ8nNAG9+1lFPH0zzwuINv5nOdiSk1jQSSbzg7N+WBtY+JH8YHjm0mq1xzbBDysRYMh7GNhdAZb/TKA+QbO2xRrIJN+HHgEqkU7VQipSfzI8kRqacDxDT4QlHKDPIu4eXLyXeZSP6Nxo82gdOvEzlxBXtf8vw3Dw7KvrYkM4rhiDyFpTai3gbzU5zSY4kIT6vgcvkCEJpvGtk7J3BlyeJIwyS6dF4+enKF2MhzbLuYuN+7FgFfRPWKpVg+lGnfEm7Uq0BdBD/wjaQ/VM9SpsCDBJgoqrQnETlDpxwSoaC8+aH6FFXOEQEYQ6Is3JFutL6k5T8J3JC7A+THKXQStO9PzV6SyJMZBU2Mzr7RjDiYK0C69PCFkRorRzwfXG2yfxIrljMUWlyFKZyNZlTHw5Rlg5sPOJWug5vRwA8WslUho83t4Hk9iK6ArZDS3SLX56CVVu3HGa/uERVyzRtX1R24tHEpk8MUl1l+lv5/AjgJx/ZP2C578oV5apsunveomjb9J4Y5drIC75QhTaCMK4xctaAqlG9JTGquwpgPXjnfYWVUFsBG4xIIH2dDrKY3ToEMS3kFpWLrCK+MSvwjy1Yz87LnEAe5MUnKDeNhOcaZG4BLTKeoBIaySfKcfiX07sO4BS2lkGYEN13+HxIWw5RWpJPBEB761OY9l0yWQpPYlWQlzUXApaQZ134E75wwHzykSIjpGiZmQrcP1w5zg6YcW9Fu920cM2ydDW6sCxdftcQRDu56AqnrVLnwtdYf8PDa2d1r0cYpyooIxaiFcECXAOYpcN1Is+c27qv4vGiGL6wQJ2cgA/t7ybJGJpIZ10X8iU+0xni/4EOHRvqL6ed87H10e05MiMBbuJXL2ODh+wQ9YU5eiKTxgFr+0qurcMn/dkmUoj7iHzY5GTh1LZNRjQN3/X2Dw1hEmcJaNEiIeUj/DwpJsMOI6OUM15OSUCs/rjdZwqY3pkZckpqjWwL8WnhSp2uoPf4xEJfsbpV5Bb963EFBjtn98Rvueq10YkzEv+mHXgjw5lC2xQtN5SgqgOVwaDdnl2utzPb6yaAB7nqlGlBibGCDqiG1iJ8okR9keh7HtLuoHCQ/XsF4Yl8uUAkZw3vdGMizLxB26VGIq0PWNORjyh9VMunnRfU+YsWzHwMLtxSVIO2AfV5Ygxpn9oJZmAw3XlHF/4Bz9IOmBZm9ntVn+DUpg9OmUYetKAKw4aO2lIpGTG1celOq70cQAk9PxkDKvWNmqB+Q9RQG/M/gRw6AOBo+eIob/VgwR6/pNOYcTMja8B/V5Rnh9sb8gfrOiYYrgYl7Jk55QgfaeM8kPJVPcXd5yW0WSbgLQhMVbOJ8lgl0AV3QXqd5RQMbXP5pQw6xX4Erk+YgjWVVQciHGpX5L0Ph4wDLQDslLyILjs4ONymjHqjBIJTU04Cv/CSbWhaoABrmO0aT6hwwtI9d4E1XH1bJI8tJ4IoELLyIVbOMyWztHCDEGVXc8Nw3ohDlY1mH+GSLFzdtjhS+HGN0y5Bc9qvSFRAh06NVod/YZlAJ8enIkFV9gS4JpW99HjmqzScFlcf/dmtJOw0VYSa5oFNndIXYTOF7yxGzQVutsWkhBves52wTxwedfQ5ZODtRDlVxV88cvnEVcWaO0+mSkFbcdgTH8MlxhXGa29NmUA22Zjx/UlMFrbpe6Fltwc0inD7nklF7E2odan6Mh2O2h9F6bcUuMASV+IxVPNUtHeIbsG84Z/jpQIYPOMDpz//AVSZPkWbv4gHRj1sgOyI3RYwLqaM/HBKjknWvu5PplYQsOPW9LRNFBrAb/sJoFW8LXfB8Voq9srTpcgP1bIflzXmFRjgGCRbqWyQXcFA+iG8VygWg2jDCq3xA9a/qSu4dl3lOa7ppi9SwJZJj94+0L1PD27u9IgsRl9s1u8zo1UEhyhe5eOOM9j9L0iTfpmbzmnA+1fDwzk/eK25ccdvz+ho343AJRHHcm2JI9EJOVtm5W5KZFuLaktkjeK3h/3TlSasEIQDitjRrEn+ZF3Wt+riFsAf7NXedZCr7YmyIJudIaS77ECXIcjAV/enwHLbPnL2kTbQi82+B3FbufxIpTld1ZykJaUNcw+qLDzaObKgGZA17jMaTlROlwOFEAqAaGtRsUkiOEuvi7tuW3sP3lZaZkT8VGITEhnM4R90aEbLwyPPQx/woHpVxlOzQPnjLuYDM3X8NVKhovw2z/n6czdhtoaduL0XihEJJHimI+tb7nlXWmvjBYoTXeWONjhJzWJEAS6wUtRS/iAawEcGZxFeHuSIaeXMx0WFZLdFX5XpqmItAIQDcE8chGNMpglolPrq4YX2rUNPnDa7oNAzjUMrdlHSGhB7R3fqBdvc5R4KNAVeKIevtcU0410kXpjXl+JmA2Nhopn7g4gdKJI0F8Bsd/odJr5tXPtVQWWH3AjTGUV+UB0l55yBpQ/lO/mQvCKieA5VyGkPDjGmZUUQ2FSOh1FfaLK/uhnNXjOCORsWqLlkHW3+/KTOQlQCEhWVtDr1/ZOsSJMZZPiSnuPL5IQm9ZaYY0Dl+7knP+nOhF82rXCIlV5pR8pBCXgQImyYpHeWlPiPyHqTdvxfWekc7y+SDCrXFjWFMA50gV1ZbJIvhg1JiSFl3BmWhUA8IQAFvbF8GVQvngL5yxH+rjdrCnz3+Ulu7vKTYdmogqoxiXcR1hbN/hOmo9PLdbFZXBYv9p/6QJ3850XnuqlhcDDQiZs5y1sNUNuK8Wbear3QJbNLW6ezgGbmleEQCHoQyhiVforzK/dLxGuHHzbXgY4n7K/sJatVLImGNgD5iJvt9bDFyFo50se4AhMiqcErEMI7X2eXW/oGeorridrhOhXhoVow9J8zeKldQkwRVkDtDs9FExZrRMJVCM6hK1njA/Ne2O12TvNsoq6avSmEqoj+/oiK57l+vUVz7JsFUStgB1YHowm+r2UZTsCiX8KTddvOgbjdG/JXdhkS0236CHImkfPHMHuqo2zKKIiFGPn7yaJoEEBSdc3Q3gjjuwkAp+Z9gaOsMrSKBiId5slXTl6ItbE52prLq7f66XLhGpUWyIPkv2tcFOgTFB/kr6ZLkDl+egDrOVLKxzpl1aWm/7w9SSSN4z5FnuH+EPoqggHMgWJuTMCXEsDs7fU3H6AJlVes9m06yk1IJDd1S2D9KPRwRsuXrZTL2UuWk2gQwCK3JrmndjxCZgnQAKEad5kxQ2E/A3c2tqLXqVvOGc1Z1jgTuCBb4OmedGZ/SOiSzPyY7MVk78T9JCNRWxGzeEKou6/TcxCXAWzwb45QLdBJeZ+QMChHBorH1/ulBVeSUpiiXtv6blMlewyNMQeukHN8qd7K5g/jKMkN59Rj0znKTLhV6Mt59KxFLtEdHwpFZV+ohizyj708aChr/vK7LfuoFdZuFWGbOLkz33HxszURk7GFo/rWff1wgyzJCqoL/QATMcpU1deTRRdTO1OzLhAsv1YD8Ggf1FTdsY72P/QaJOz0m0CqISs6IXaYkCiIKHI53waHbm8tPJdvA6dpMpth+DJXzmlke1B4/HJ6NSZU6bMKhNtu54vd3eLZOfZMZjQQuXJvjq5IL4gkLh4+i8CdJjMt8grHXv7TkdGQXUW5uJaPcnDTW1ftimXJ0a5IKZW5kc3RyZWFtCmVuZG9iagoyOCAwIG9iaiA8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9SWlBNTFMrQ01SMTAKL0ZsYWdzIDQKL0ZvbnRCQm94IFstNDAgLTI1MCAxMDA5IDc1MF0KL0FzY2VudCA2OTQKL0NhcEhlaWdodCA2ODMKL0Rlc2NlbnQgLTE5NAovSXRhbGljQW5nbGUgMAovU3RlbVYgNjkKL1hIZWlnaHQgNDMxCi9DaGFyU2V0ICgvQS9DL0YvSS9ML00vTy9SL1MvVC9XL2EvYi9icmFja2V0bGVmdC9icmFja2V0cmlnaHQvYy9jb21tYS9kL2UvZWlnaHQvZi9mZi9maS9maXZlL2ZsL2cvaC9oeXBoZW4vaS9qL2svbC9tL24vby9vbmUvcC9wYXJlbmxlZnQvcGFyZW5yaWdodC9wZXJpb2QvcS9xdW90ZWRibGxlZnQvcXVvdGVkYmxyaWdodC9xdW90ZXJpZ2h0L3Ivcy90L3Uvdi93L3gveS96KQovRm9udEZpbGUgMjcgMCBSCj4+IGVuZG9iagoyOSAwIG9iaiA8PAovTGVuZ3RoMSAxOTc3Ci9MZW5ndGgyIDEzMDU1Ci9MZW5ndGgzIDAKL0xlbmd0aCAxNDI3MSAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o23BVSb2xYtjLu7E9zdHYpT3KVQLECQ4O7uFKe4F3d3l1Io7q4tFIo7lMeRe3ru/f8x3hsZI/nmsj3n3mvtJDQUqhosEub2pkAZe7ALCwcruyBAUkmdgxPAzs7Fys7OiURDowlysQX+bUai0QY6OYPswYL/CpB0Apq4vNqkTFxe45TswQAFV1sABxeAg1eQg0+QnR3Ayc4u8J9AeydBgJSJG8gcoMQKULAHA52RaCTtHTydQJZWLq/L/OcRQG/GAOAQEOBj/jMdIGEHdAKZmYABSiYuVkC71xXNTGwBGvZmIKCL53+VoBe2cnFxEGRjc3d3ZzWxc2a1d7IUZWAGuINcrADqQGegkxvQHPCHYICyiR3wL2WsSDQATSuQ8192DXsLF3cTJyDg1WALMgOCnV8zXMHmQCfA6+IADXlFgIoDEPxXsOJfAcyAv/cGwMHK8U+5v7P/KAQC/5lsYmZmb+dgAvYEgS0BFiBbIEBFRpHVxcOFGWACNv8j0MTW2f4138TNBGRrYvoa8CdzE4CMhBrA5FXg3/KczZxADi7OrM4g2z8ksv1R5nWXpcHmkvZ2dkCwizPSH/ykQE5As9dt92T762RtwPbuYO+/gQUIbG7xhwhzVwc2LTDI0RUoL/V3yKsJ6bfNEugC4GFnZ+cT4AYAHQFADzMrtj/Ka3o6AP90cvxhflXg6+1g7wCweBUB9AVZAF8/kLydTdyAABcnV6Cv978d/42QODgA5iAzF4Ap0BIERvpd/dUMtPgLvx6+E8gDYMD+2nscAPY/Xv88Gb62l7k92Nbzd/if58umKvdGV0qN6S/F//jevLH3AHizcHEDWDh5OAAC/PwAPh52gO9/V/lH/3+0/2lVNQH9zY39d0F5sIU9QOAvCa979x8Zbn93Bf3fE8MA+O8VlO1fWxkIoP/d+e/YedjNXt84/p/7/8+U/7+2/6PK/63z/5eQjKut7Z9u+j/9/x+3iR3I1vPvgNdOdnV5nQol+9fZAP9vqA7wr0lWApqDXO3+1yvvYvI6HRJgS9t/thHkLAPyAJqrglzMrP5qof+cwmt5WxAYqGrvDPrjrgGwcLCz/4/vdd7MbF7vE+fXs/rTBXwdp/9eUhpsZm/+x9xx8vACTJycTDyR2F/bi5OHB+DN8Tqg5kCPPzsbwMYKtnd5TQG8yvMFWNg7If1xorx8ADbJP0x/IX4Am9RvJABgk/4H8XEA2GR/I04Am9xvxAVgk/+NuAFsCr/Ra03lfxD/a6TGb/QaqfkbvXLR+QcJvCKT31xeI01cfjtfi5r+Rq9Ezf5B3K+hr/eR3e9kDs7XWuYgoBPQ+fUu+sf6OmRswH/BV0kW/0CeP5C9q9O//K/ULf8FX5ex+hfkAbCB/gV5AWzW/4KvBGz+BV/p2/4LvvK3+w052AFs4N9EXlPBr73wL/8rb/vfcl+T7f/L/crc4bf7lYjD65zZm/8r4pX6v4RxvFL/vS08r07n1wvpt/u1wu+df21ENhd3+3+5X/m5/gu+SnP7E/5Xn5q5Ojm93t9/3iSvTfwf/OeXBRDoATRDWl6wNxMKsa4P6byrlSB2Z9n/KjJLs6/zkYHFe9mpy/UBDT6FoSYraNPpRiLlcz/G2q40/bX4Cvmz94+2Rvjw9iS1jkefp/cJ6tP7HUhLU3jDk0U/JBqGSBFJWDTFD3yeHX20A22g2yB7FGjyHF350VQLsO/cB2U9GobKV8fDFvbVDmp43yI/lc+wxGrFvAssmaPJN82eJ6CEc2EhRWDEOvNAn7u+mcXKnXwhV0hgQvI9juUq9tbf4oy7n/dar9TkdO4lpCbUJyCFvsYan6b1fvM9VQF/0bu0eNNpPG0er2ti2y6Zw/Y7vde+svqd0+GFES3NpCA9IQEbNI58dMxmu1yiXQlFIhx39tmawqaH/AVfm6kzs0oi6EXFlq+BRx1ZYL/vIbfB6zs8PW69LmO4uhVuSgM5eIAnnBQyt4EWLaJw33LkKRZ/492I2frYOk5TqwCasTRpW1fAjmVWvXvg4bomxec1j1H5uXMFr5kIt8NdRlucsyuzTPvhnoMJZ3M7QiPIFJqmpiCR77XtKblSyEzE0XgN2aSuNwJtxLBEsVQpWRl5bVxNqsgj7w3r938gM2TWfO8Ycke6ixg62sUp1yp/kaipyuPPwixClIP/EHffAhW+PeGKJzu1LSi1gRW+rRAR94s+rOBSp6r/cqL78tSwkIVdmLXcUuMNOoqybTK2fo5KvOLpbH4cD7GRQOMAzi/BkrftjLA+P2WQgkJevAciASvhAeUL0sybhDmPjp1Q+KJd1uxGaR4/UuvVhn7R6Q4cnvgfhkZ2gghRPgsReup/Vr12aYXZLYDCE32pW1pz+EbGEaihXQvp+2FE8FPvRrnJpTm71eCit7+/sB3cPKf7yXhu6kMYbqglz7AfdFDq6CkE0n0wCbGAbJBVQIzf5MnlHIMwl8Y0AWqoeU8FlMIAxAK+IpkjY/R1Dw1x6K6wOx1HnnPgpZGylFthc0wORhar7GCjBrjTQ//0Z1Eintds5iNrtkZ0ktIVOUPYqvDnlpifbs+qs1YBVMIc8lQq7/ed14s6Bkdlbi1dawd2T/BMt6xXmVzgwu5ekhLzzx5Rc+1UKxg86B52P9By8nobO1gsWKFH4t9OPmHAx4Jgni3PSZUqJt91KMNXXqKdk9WJaWeUzuB7zGTqAn+aETuAPo29RelLRz9M41vrF1P7SIuXyQ01qD84x5D2q4iJKNJObZAOW4B3e0meD67AhH+fTioLapqSXJe98HysNeOe6WjSfN3wzWEqzgyq2EiiZYmJZ/OpxKf6aaO9lnJjuA/XAngZPKyHoBSm4JhuBViPGhTBvsKDtclTPV/1b5OWI/sCfjVThy6HtloPuF4U5YZ04U5ij2KMFuSbdz7x8zfT9AXSV7J9wz3isB0omGCbTD+v78CTlaihQpUb0YGNXYWcmAaJXIacrx8rwg0GEeE6KnEySLUiB0SeYT1PYwl4rnEdks9a1XO1blsvsGlH2DvbS7Hjg+hSWbYyy+r5sVOmXeRfJDwYxwuptynWLMnVoQnkAjQgSCqE1Pu0IU60tgKOxShsP8UqLVdOc1piq3xfZcUJ1RzkSyJ4aHafTPJnEGuDLpZE2MxL1TbF4TPascnMKbtWEKo0Q0VS7k1mvERdjpUl6f1UtLXsk5k4N0AWoVX0YjZRvVnwHe1zqe2c/3YS74xVBi+sASLn8mbTVG48Gbn+lpvWVcaObaeqDw2D9kgrmt1Z+2JFNikWlghtpwnSt0q8K4W4AeePIe9JC8frE9NhPeP8l4l8vNWDCmJ5BxtzxtLepH3gs5a/JYIPxA8PGP3ImUb03GCCE/lUQoPy8lGcjxtZ/AUC94ibPpGkk1UE8idggtw4Z8aKzqFyZpfJI8VtQtc3rF4sehxTdoELU4pUMC3IqPlDU/5sbjwjbRv3ucOS045H7NM2DxCaLO+DkRV6po34ucb78bh9cklbIyO4cd+VZhZHAfH26U3gywaieF3Hr0/weS0+Ue5KUU5JZjgCm6q49Hs5wjb8HfA1QinlfCNybEmFLdxp6ityBB083VWzAXAL+1pNuIvMMiQ+E4xrwTEh0NiVUSbk+w6RaATByhooUwYUtFWw2PEk+0PU/j7zt3Y0UKKaXZM2tdsIh06uobV64krgqBbXrzrGNGJE6Gr8pFfuslyWpAG/hDqRzYvhWtdsx+wRJ4jaOJ9RkrS2L69de3l3PkouRNMQDelpXtOpX8WMEFnPQOTaL3CQKpWDfRV/fWCCOEsSVPnVxDZufCse/G02dzZuHxcC9zN3a1xjhQISWsgblOjxUeoKPZP5WjlcRIkEf0t2PHm1ZMJL4Q0huLRHNx/hE174OdnlPXGXWEfdsBjR7c8fHOTxq2hq6cl0r9xSxg74fDkaBSBtKyRq3q5UB0CS8xZjIqSmGib1YTBlPGzV2SZcvefFvaRLJfwxxbVmbMOoidJMX11mmDOAzsujvsRi0EcvXXUsoUDB5SwIC2SUKDhaKxxHgdX/VT4q7dyoPB1j12g2VX7Oyrp6L4oS3h8xe5ElqtYTTttGnDriUb3/Y7zNC/wRrScizEaytNbCUYdlOeU5mNcx0h6e8aMDE+uNpbWtfp4TmZUL8YevYlyCnMUuy+fLnrTEMukU7sI3juSnaCe1HTKsSrNo3gRl20IZEuzgB9PEajG3QWw95a9MCmnDuzXYQ7y0edTHmY/xwsieWEdUDui3k7XQYKLgK+taVs29FGSI63CC77QVmOH8+3O5XnVD2bL2EQK943OURvhV9wHqGEXYHuE++hRGQ+jd7tImixZ1Mz8/t4DsXrJiubmJ2UyrlV+O6YjSb6DfrvZz7Xdhnl8c1gVWqFhNKkiMpGc0dIoalWAJuOXOxnsyEsPTydu5tM5WC5orU52mBRUmK84SH5ioe+QNUIQ+mVN0qSNDJmf6R2Q0MZ7nwQX27Akc5OFrVA9JmWPbLA0QJZpS1z5on4+ElRu5pHL7WvEAEzbklCOcBuWq5IuZVVrgeem2igm3JzFtCxrIwzKRQl7ClFWOCFaoPEwgEMdUNHMQtPdZOuhbKBSaWvS7PXU3EbtKKQxrvBbXxBdZmwPK7nFReE4iISZZPiRJKTbyvHdalts/rHK0DCqpYSNz+lYShPHdcqJGlSYp2gNQaX7Uk9rrkTcn8Wz2Y+jjWPtkfsGTnvk6fQijYM6dfay5cURBgYTSg6ppSEwYC7goIfywxgUm0ZCqqThy2NaS9vMssDStCv17qimPOfY0o4o0Ik88ap2WptUD4bqtW49AB/F7Bsj7OcJxagfJzIzhH6QYTOP0rUpxiPOdK6qP2tGJKg75YyMuZpLG7fN5O+yZcYP1AdX8PJV6EvRDdIeJERwKGcgMKEQ12MmzImNgMWmHuLhtE0fMgqh3NfdHdAxf3nMvk3b7vtXLr2FqMl8QNTLb0I7mHcZil9YfdmEefcbBJmSoBN1AA/0BKuQNVbO5PGDMT8Qg/jc8vxgPhkPSPLbAXeLkfdKPUFKqL6LteUBqHPnr1WOjVvByrwmyXrko7l1+gQ3VVrW7WJ/DwHbjy0TSwPO2S1M2HulqL8V7DkDn7KC5U7138ZM5SuIuc9KM+IUh01JzQleU5Cq6V9s1GNMb5pBd/ViruufteQwJM+184MohMXntO6Lhqvi1vakCDsU3tRWTWFQKe/WQTWe9l78GzltJHfDx2XEnADgQX3VDFbAwE97y6StKUZoUplxZHMhzlJKIzVm7DNB95hdko4+Rz5HNz12Bh4MYa+KNGoEhDP+IKhzMlF9f5nQDuMvyyFmyDvwiEtHoX9Mh0LPvNSDfTQHzabjZCRMoq9yjq+wgEZnKDaflbGgqZJkASRbLoij4LeaWDbdypXrcAdtkKRUBXXB3isPjfiT5YnTPOAFOuzflnFZaGio3UKzZDIMAbeEOB0VyNW0knY+vnsV4ZJkapqZKyW0T/oj0CM+nIZTWeTDmK0o1ry7FoCUV2Hwy3CDJHXMvJBBMH2K+HJdmP2dPflvyPvQ42Z4TbVd4vaMcESqijmQEtQ8diizcQylevscIqeuqyoDaXErzSH8B4x5lZsB6sGUrKAnko8L6TVrA3VQDqt156A28V/z2QsZoI0VTBqflGVTRwhMObynG1uqEKbyZ00fytovVBB0iDjR/CcpNsG7B+DlHE2QHdyg4IfAtaZ+KJAueskTZtogAviWPyImOkcfEOD2sR2Dj4MtKjrQ/WW3figs/Poavcu7Vgnyc1FhIcuLHyJ6KjGLyHorAeILPUBuwAZSGvpDNMjg9Q70Jy9Ka2JyjduogYcRP/U5cJnjsIz+GKMgsdhJHvsN2RGlk0ergemsTL0BUw62+f0EtR9saLGliS0vXMUMKRN3nSFriyfVM4G8gZkNpX4DTbt+tKblaLmkbuAgMysZgNJLxJSKnEkNRJT6Iaw1ggXs69Uslshvwsz5LzkpEkHEj0R4GkEe+PVtixYB/R6dXcDMcd6UfFJWLHUsaGbHgc4AlQAuf1TWEtmHhxIe+3Ryg1ukHbmEBKPJEqmHtn7AZREF1kRAYJAUFqKi7Akvwn0T3ZQcnkYu9IB5qrFW/1DBb63wLTMZTX6l25Wt0RD3uuLO2s0UKi8rgyqVYOyMUcEoM+UEUC0I8xDB2HeSnqOehJmowgym919JKf1IZE/LzXS1Fb8W8MxcNiRolQhhDG0+9RyW3bO+Gh4W01Xqydyt+jsplwmygVKPxEhmkLtWCgHQVbsFV4FWXTbsZa1wbD3ez29hrwKe5vh/oyG2YwTGsFFGV9A15WnvPuTYyZ/N8jYNN+2MYCvlQCFgny7eYCFssn3oX08WuZtHH1p5wgxj1SE64eZqZA6TQ2PHhjEuSmRKKXYgH4wZwCV7LWseH3zL42aRkjC8r0UlEl6yqi0qStG8qGfk+GIaZK75xbaV3/zg6RAuYl1VgRD+d69aIZffB+S7pMWzfUwxSjgl4K64s/jHmB87HW4uawb31+2DOjdqiftCCUz7fNGwYDUkBtkfU9AR3MV/0Cf+XlpOQgLrw0QIeG795wV9d2VLuDpQVQtbntRIwD1WIX4011N8168Gg1bHOuCtv4T9L1iXY7HtiV/htuMpRHdLzo00q8zUA3NA32eTxyZAthb4nsStZEHkvJT7KcJEiJsUGa7jLgR18perYT+Afflx5Xu+ZWBQFB5RmSXCJSd/Esapj5L5Bg9yE3Q9MgzWb1PJRuShlatMipW50mhZZDo+MryYGxz83fuMxHk8pZN7aZps7M3IS4hEjEhhbOkMXVctSXpTVB8EHV27eZiVYpoU5iHiHzb5HH01nn5ObEKX/0uiq0zVb7OWTqTneuKstr7RbY8G4WRjC248LP272rXrFSDgtS51nwo3FvZpxXwl96UPE/WUqR5B2wScUULjYXkGQwhuL0DzC7B+k6p+g4EHee3JUjdxWyPShkHnElkN+nUj83SwLcYtHoV0TOOJ39L7HmQRPkQd4mllwmshKaVkhqlV1QcanDnMR+cZeMd6/6DKzIjxQIk9xmTISkb7gC/8UdllMFFDOWO4b37SVlyPNW3fOHhA5dQai147vjMPg3/gXcSh8LS9jjF2s7SlTNEhvGYx1ZjSzvBZf8rOzsXArleRfHxvBDglDRRXQdNAX/2CEGTw+DF0Skgfic2ip4GxOCVJTrGjgqy9y6EVtwTMX/8agbtj3YiW2YmAX6iBGdexRmMbODON+IGbv1XCR2bKGIL/jqvxGDp3uGLLhLA5/SFunHDeGQpd3Dpih23HJ5u/rfOc5kZ1xQr/qK8ARedLF3rvnvPwxYhDu1hU28uAK/1ut80ihLKpnxLsifMkLBYg8hkDazV47pUgaYpjdvPEe+Ix3MBI9fVPjF3wOkpV5hYolWMUKb9rYr28wrzPV/e4L7V54hYLjqhDdVHcYsGVrnnb3VQlo0OstDGk+qLgE+n9o298lsLXolLCB38nHEv28kBu63UTu2ywe8X6ypX73BbbsUgeH9lspAyzV/dfFgNqMmIVHpnx86s/xnAeg9+llb7K93GBOjUkMJQ9HDM2YvgcETse0hzTCMgaP3TdV7ysRs7d1ht3mL76bGP0FZz9MvnoZd2nXro1UxlysadB5CVe4vGAScko35BS30r3c8lWEKY/10OV90wwzXcCnflWGlcupkhwnxlnMbW6dUIdF6jxkEi1vUpaY5tLpoDeRxJeA3JgwIseVvPQCJBNjlXEfx91I84+w+RvbX7kOiaBnB9qpt4/YLn1mlNQfWliMY4i3alDKhHgPlB58hnIHLP0uAm71AK7lBnW2F/T2ncsvcHOBlkTpttLox+5JLa19CyFMATH+DlfmKw26tjgfpHRdyXEKcmSR28hMOZWggFWo+5GMwMXFu02Q+qquB3+bxPc0abAGVso7ddx8uDzPNOnZbfTAzH7o9P5gYuvJJ00BDoJT1aQSp5rm5StDTZ/BaVf2dK8tHaUojW8itfFJ0JdgYsh1ouAZm8z7zF+DsQjAuVjm77GD83fkEoULMtlLNo1spu+ud7/Xu8mv3x58hmpBhs5Xw9rAusyGlKqbO7p8tLlzTi2wEm3OMA5NyDWJLVOtpfezplGtDmsd/SyKjtQkq2Obohg4LQaVnh2+13R2/+kGZj2hjLYvysr1GoK2i0wCMowaIyYodo7mIU7A7J0qCqUsPeUGytBO+f3zdVPY9jHs594+nJQZDAivUBiSmNw0JsqkvQDiVpyV1uBy7R25qPTE6xXCplgO2ZXcWzmPqB099M5DzfqJmYrPkM7xLAMOGjFwFX2SDfV5joJIQdACAh5AMzhD9VlvL8k66PB2MU+Vdo0F1gOmLU0q4ydjyiVAIOKwTUKWDadEpug+LUmwUf36d0J1r2kRC8zIw1SGO0trifUkOo9w0zeq5sI1u8VGM3HMsxToA/lu8/t2S8gKFAl1jMLVdWwa9VCj/VAiSuMCvrqkBqvqXNsPEpxMysHmPyh33CBkeBGlrxMNTlnR87/O6isrB0kRk+72fyO3IsCNKfQhxzp7+02UZyaalYf+7fYD7qwoE3xYMBN3h+e8eCnuBmx23NSb+Z8GeuStncnXiJWkLMZPmDEpkckJ5xMJFMUlLD5l1+raSk68iObUmNaxtxXu1UCi3Paq2BN6GlZj1psLVJfeJCRjgvNR/4ic7zeNH8Ac+1YAdLDX9CpQPXsrgAp8b7eHs6FSC/VrOYzAvd9dxZVReeQOzQbCwywqO/1Fu3CuT6BSrt+Rv5bzc9EkJtd5wdeLi0X/+cyrgmDWQI0MOKZRfHFa9K6ohHeD04a92aY6m/kUBcobxQ7LuCYDP9kTLT502n5YB3fMIklLxaI0OsB/l3QSPK+9JMXcnztWw4ARKdyDSPiOszOerdNEDI3H702WYCeptdQi1KLm8ot4N9ugOkp/sxwL03o4o9FHD1qNm3z0QFIYVx84ufQT335v/0Eq1PlygR9yUq7iIXsVZkzpSi7te9tZ3jcuiJN069OOKp/QAQf+s9AFEfIXR0yxmc5Q7BYRaWk04BS06A5vzttAXwvOc3eTBEMTUVFrmc8tdaG/kNJy0sqfnTtDm6cgWi8QoxJH4buftOOjeZKguh6/FA0KMYInTKkvNKrdTqyevrAE8HtOfImv22r+9ZNM5AzkvNobQ+5En82GegpEh+Cn045oe9CPVGTn409XxEUdYShrlX5QapsYG58OeJss1R+yR0ul8QKpS3r0BI3C/Nl3f3uF16Z9EsLU1CNl47iB1aAKK3+abBfrMCwEYjb1EY69Olmev/bFBNE75mPVJoFlxG1/7zEOXCAyae5LY5GcNnV++n5C1Hn+FLW1gj/Q6VwExez4ReXA5NlAo+O22Iah5QFjzAk7KPdrpSSSZnndiF/J+bH5XahRwM10VJf0C7klt8P6gA183aq6XS41fEve9CEHHqU9TFCjYbbfDL2vqkpqIejlSzM/sYiuKdZK+AZjY29mhmUZbbvCA1EaF9a8gUoKZRi2HCcayWR/dTb+mEVKrjihpNEbNi8FeRI4Aj+74dbcGZj9Ql/TOFCSplfOAj3jltTkDwZPJxF/lBb4inGDkPDw0IVmlPIcrT08UZT2M8WRN+FJmdXzM2VJufbtlg8plqzDyRZP3FYJV08T1Eee2Vm2wdraDdRDfaThUkdeUOkXGXoOW+hv5PS2diqWW+DLQE69AlKEJc+fpT8dmFlMsjgyDsEVBeDLpNp7GJi7RkIgHoaSq8opcJhZXSCPr71rDZy3p0OLcQcoOT2TtDvAbAY2TKvylcjiofjFq0Jd0TeiP8zd0lbz1juHWI5pxqkEf6P7Epwep6zs82GmFLqc5PPJkWvisQvptqXwUd5Vn1z14g0kKfdUq0fvVH7eJHFLHbRC/lXg93fh/NaRAc0/276aHdCpidRvnbslQrZsN/djehoVvuxt52uvn2F9fuCaS/3a6Uv841C9We5g7LZk0fwLez7rw5T9vLopTNUMBAI1c7ip1u43WER3S32xcqkQUCs9FurPXr0sT8GnfXVXScUJca5KBNcvRDJyyG7BH144r7hcxrvwvhO6twdzvnM72H6suCzpxqbFulVeUP2SdBDCChD98pPbOyhodwc++hfPBkx1u4RgD4m3PUMGAsUec9r4815kWgAkB4H/idqvfp1MdKhUSlkYqlEIZ2ZhtbiFWsCN7+1GhuAPK6pJd3Yrpu4PtQcnKdcfed6JnEbtlrwrfFYJU0+aJyTLnRwdsnesJZ4HSyL30s4g0jA3tIf7IqL3BcCKFvRjPmiUF91UYXq7YF3pDE9YQdfkmaqtoeozD5pBT6suSFvWzGQHZTJUiYi6x23jPJc3pqoimDRHXZQxuRiuoJtoU7mhre2lLk1Lju1huwrZWqfC0Uvue9I8HrgrmfkF2502fNzevxiRQ0l6Lq+aieb16vgi/nIUTs4CVfoRp2ZKX+S0xZuHLzrufcw17EBTm7A0d+K2NlFZOUynNVXsSBMUucse3Et7ffCmtANxSJa1Qqx9mR9J7chIdXa38htzvhvoNAHptCcHtXeFbV/IZKH1A2U59bSfWh9G2Jp/VqkT8NlYptT4Fz8SyEcX+8tW/sQtcBX0DxDGazdjeZ+hF5BAkBnRe2JCEqoQeK9WmLVz5MV0O8P00dtBDjzDDhnOpkLJZTjeBFfrCIXlwjx51g2o9fU39QjEi88MNE10lUZeCQ4y1nHmCzpxvqIm21ZZ4YM/Y35BzMfVurc0pt6XKCRf8ZzOfqSYRbcFhJTt3n9YUlq0UszARijYVKB1HYuCB8AXWMU7SAIGn+HvtAL2fMKCES7j88mMTX6eYKIxiruk4TC8lXazdQIZH1AYWIAJghBWOrDVjBjxwoanaEqgxjZd2xo9cs9oxtFrna1Wxg4fr5Rdi83LyzC2ZrK1H7ISpTCof630f/PBAbUk3jZVJ/vJE/hs5QzRRS9k0vOHt6lGl3hFruThPN5psQ5HyDpQXEhBFrIFhpUPBwbY3MrmnK+8F7OiDRN+IIbU0BJZXlXTdF2m3Oy0A/WcfM7CP3SNC+gTETNlHTqii188l5JpKKkowVxHsukKaMQtn9Tj4gE+nkhqiVK63hapKq57HYudij0P8wcT79Q30iUWNCcmf/Sto23duG8XVMbtM0mA5JXWZ3yeQY/OTeO04uXpbxU/3KBKNVIGIHmLed08exfOjZ28mOrdfiTe7ZnoZ9MrvLf5aZeW7KVWtwH7eDlKN5H19uGxhvJd6Qs00eMM5rFHmQ8lxJqr0qFAco7sVf92N1TCtzckethFo/RnqFtJhRg9NVkVHwwXdiW6o6TEn5dxOexkr/RQgAVEG35e0t4pngmL6fl5e99sadlrrcOTJnjZ7jrdVGvAeTEHVRxx9NiWewqN+y+BJ9/QyWqg5nPlLpqsJK7CwT8ci+wx4MIvC5Sfcy6DT/fS+xo8ke+fpXrN81JI98qtciJuT849CB9dJ4XS5GTMRPg2XEMarYPwOC4Vv05wNF9dVBqAUD54M7kC6e9tc5z3qHL0JTsE1RXcq/FCctp0cTrJ7vM/xd8U5+JXeWAshQdb1Fb4AEF6JqpCyA7zrCKViFlFvRWWuAJyyeoHe9ElvdnimgKeoYR4W4EtRr2KOaQd88+aYndRk619KsYN1c/x4A5nL7IxBgmeH+9Dao6IZE5HON8SUQJ4JgeEmbchOJAHovWQI5S3irGidpbIA1GlkryEJw9zD7NURj0riamXBNxfzr9DjLZIPVJkCxJmz3FcH/fp/JxZENido0F9z9jc8qWW2RuLz4s0Y5wdtu1OusgTpWz0JzNoWcIkzBPqVH6tym8YJBjCP+sjZU3+JLfnMcCIpSy5gSAToy7ChHJj2N3F996NHCEtRP50pp8ST8VjIgJ0gXmDlXAT6iAZk19IgKFHl6glOPGVRO8Lsdv7bjVJdKCJnrOoXRGiUszkcE2c8F30DLG2QcAK9fvd8V2xEyWbrnYlDzcVJtfq3qklhVQW+7xY1G26GY+Hz9IRQr1C3qZFUYEtEaW/qvmC3B6Q2ySYXCzN9yTIHhGyYXfZg0prP+yMYYTJCx6pa2F6PFyqyDU6OkSRf43tXY+v8jcYcwQxUKRXoNbd3VNy6IWwphjCP9j9HEe1P9yv/nDlPVxJW128HFsUxcsdkWk5vdiO+6Pcy799wCPlBEsy4od3M7eIv0UkVc1NPVu2rdmkrnuHXZ10746MotFuBX/ObJVc3Db7lb02rE/1r22ITi+8Uf8j95m8DGxrZW+VTjrlw9zHM5umGVmz0FHLkZV9nBorf4nqys41WmfDgdwtso/9So0d4EOcthzpT8scDPfmF/mwek+tii3w78MXcYRDIMc+5DdX4PZwdCHMDu1mPkAk1H0Cm0gt4MLsOcuSBjDkWGr5nMlVSME0ygAMdnWDGhGvEjk/EfVdEjI0k43s8rwNm2EbdPGGY/S+d2GV/W7cbgL1yA6Pfdq3WrKEa4Q400tUfy8f54OfTBXKfRZHVbNhGmvbJhloEKdXfwvt/awdQ2B15VWpu+tn/aJw2OFKqegeEzfi+wtW7HxDnnb3CV2fmVyn9hliiBLLj9OffbrQcbECSxWu96l5BTpgkDTlm7jgPCUOuuP4jUPZsrfbhu4nXS7DnjmBTmWoT0e76oALcLz83J5J4Ze38NCmQZc52uYn5V7pDqqYF6lRStLkYolbAfElmTYWfKcRlbZIh19aZ664GCKl98qTOXYy16wwvgXp2R0pFzXzPfPWTlw/wZqoSiPT3JFfRfelzpNpjGzT3Gh61Nb1JGEzBuhIfI9/qfa4CcrRQPdyDLgESwzAc1Cai740oP7Ur4/GgC+orpuzYx3ncZA1//7YWYso1dcyvwVsW/f8QYP/FS7Etj0YdFzMdbhWvR3cHLupuvX6F+6HWoBlDEV7lQlOlN6Xjw4fupvzutDdcIVTAhsIBJdfJn9F4BRfjyQsPiSI064UFqIyKyO9wZV9OB3AfS9H6eFnCzWrsppJwSTB6fFrv+rzE+untzvoSv4mYsNqfp5wUTuJLVEDTGV0Pso1H6f5C1FHdxsx54wOXtzjSeIzgtDWRB4+JC0/52DYClDEQOvKtufXv0RGUlCOdB+ndF/tLUGTCCmNLZIIbXmH2Gb+tIgeSsXWPGux1yutdvJ5h/BpSNpfBaFgzMVGTdXXB4CKMRDX+a0hQMRO+jKbKaKnNfhhbq+B86IiZv4dvVhPXki4SBhhLJYSRPS6RTVSMAycSlYMuvRN06iLgwtjVO3RcywPb/zxVMlNjBdjFwlr/eZjw2lBjMnlwA+i+BXhB3FtaOaGsNP6tao79rrT2w70VhQiXaPqOoCXNgRZWylV+1X/CtJDnU467Uymwq4mhWil1M+yT5W/aqoEpIvo9K3mZiyVnVHx5LuPUZbls7+kgiCPLlyPQjVdaB9jxwAKqhg7EedIFSq5wV+4b486lHFYlBomCDyQpyJ7GuAmRITFpyzbVUrssiA2ZlTCK9dwNSe1bFzaAPmiCpqC0+++7Dk1myGQH9Tg2eH+UowuNUFL/J6DsC3I9pVXM0oO2j9r+FC1Ct6Ky3475uGXWZQv0wkLgEL5hdl0vdxlexyDcpNE7Mxk2zO8h5pttd1LzyzPKWtBBSXnxLjpsmgp/+3x/nDfXi0PHh4ULOqRaPNqbm1zut8bIQaim/aFTnx5Ghlxvbqi9AS0RZXUJKipd2QQylkk9qiSnl4ytxCtLLBBP2i4R+XQ9Iy3oSbm5TxxHisZJ8eQtHA4MJoq1umqpaqbPYcL/ACqdg8e80MXI58/W3en3BIWAt1I+6qJPzZhf7yanhZO01rce5/KpBGprdBVrDiQWYiFsWYzVb141FLFoW2CjMuamECpY9OPay+vhE4Q272IWzQxl7WVV0AKhbkbcyGbC0eu607X8APvncg7pGuFOOUd/icDDSJfGjil+CkHF0cf8ub4jSpJw4xBPmS5npgi7I3aOmmTfESWEewEKNBbKpG8RVHv8EuQo9tZzXwroaU9kGaEu7rzYKDhXoqGRiz/zXEoafZVTQmIi2Ra+mOdFjft0/i2PyHJgDuWtcQRY9s7vdblVRuOWJ6ZojUspTnGQZiNTu53krVXD8GTJLu4FPg3yRvNdbH5b01GtVg765YiN+XyOeoRdMECV8KeAhhuttlYSJMAJshDtK9rPLEJHSrfoMMfCn00Cs9uQzcK7J1o+049hA4RiIfS1vgQThBlK3atvnnB3UYRiEwEeHrXHiByzcOrJK5m1AasIhdg27B8jUcOkS3IldDlhBL6aV047aGcXETzltPVGKIGWnrsko5BOFn1wcgWTb+XnGuijX2MlLAxTVrUg4GEPkaaqCZT3eZ9EV3Z7apnhf6LTg19FSadXECGcryd7nKJBzHIMZx5VWKiYKxSw0rrcA+7KpFVgt5f8NnwyG9hbBNOcluDuqmed1jQw2U4LYzZuGbsfIvTMZe/dalVcxFTe3hK82YUmSnFXUxKMDnIcsrqLD/uW26XkqN6kUI+zD3NtjymE6nhVQhzQEafRecmTl6cHW6WjkTCXKhSyw9WEhE1kVbYY/XgvKr59YYMRn5046riLTK5x+vASZ4WvtLxcaTkr4JD15JTNAltyjv1Mc8n3R2Lie9/HDxdEPnAw9hSqI4uTVDcz5wVCBaXOuTFSpm1pUyaeQ57RnO+W+A+D7THeijQYfE9S8x9iVc98+haj9MLjjsmMzttns+QQiH2xbpPL9XeAyR/RzBsUp10KzrQeW+scq/Xn1+auUZtYMH/sfuptUe1Lt1urJ5i3cuHd1DxBoRC8BZhjRl5RV6MkM7CMADaC9NKROO6+BETiRtCDr81rITXZwAhVpHNEd1JFhNET1zZcM4vRZ5ZPtyCtDSbXO6JS0aple/Q7anHxiiWIRpCfa0oWqVsg4cnyieh45bRn6ooLnpB5sXdvjIUp3w3yeMnp+qcrAA3/y4dgcTsglFu2ALfs0saOjiyfRPCijMnemxMQxc7HrkQtnp7Cu3dF3YOMM7MG06KvYjZEm8DqySsrC4hUfKf01s3E0KVNoIfa/ALiGTo5x+PbK/tCoyMTsh9RDhd7z3Lo+xtgTKWDqWJkTVR8DxWCRNK1OImdJQ8zTVdtWkRNSXr6Obv3GGItJr2SzyWq77d2B6zU6KxDPrQw0zmjnlW6KW2Ey18CZyvtZlGFsv9RgXusMDKQX2DwWb+pPtDRZA1ay4V9MNxP8Zw1pQrz0+SE63mbaOxcTsGhnvLjihyt6fZpPkUkSlMOGjv2uxUO+UpJ5cyFZ73uO6EiT889n6inrPzAxq1GlF5vc6nBdVFiLC+4jpJY5XUMYMGXYsmZGmZgBVBXom1SsI3fH4pBhg/2S9sSfqQoa6nJ9li02vyBOQ/9csQARcXIPngaI7NQp23Hy22qDrnecWJFDRmA0dOrqknE2OVkD4cRi0rpFV7oUwnhlLuZEIPhlm5SzHqzOD3odIJMT99T9pfQpijn/y87tG2GZqRoKA1nTWhVWqDApEFKfqYwrx3GySNqcfLtK+oM6MhNH7mn6+zggYFdFX+dX4KJZ6L38E3k386Vr0R4Yob4I43RVFzev0N/oqvvT9unFRIJ+LFQ5hkN3YJlG/rODzFEY4cNrfkBHrSMqKfs7672W+EPGayvKvvbcReqyv1sMMe8NWgTxCJWsA+oy2wWlwVGk62eBQEvevpK6Cz5FLnw+D1i9gSBa+/d2P5TisohcKZtpn05dPP9T5CVHp9/YGpPUwPOPay0ks8ej5dn5fds8hDEvixXvprGB/TAnow237B2/Ds/ZV5V87JBG77FJ8ksy7d8rI3SgTXeS67HfPnYlgBNv6HHdCzTVIgsRzihLW0C1d8PL0YpBLm3TCmfT1s5I6FgKBChVxqvcuMN4EtZMU0YYpX69P4M1YVxfCGbDGLD7XTWDn6pr74kJ8lImACjfAPrmjOCI55bdtX0gwWvqgBAmMsuKF3SRYmevwS8erRfyacfhAeaRH3peMEIX+QdYKqQSYcOaZQsM5hRkeL6LyMCrmJS1PGY1UQIqKLLMkMhJ7+3IR9+CugP6qObNgTtewTEYEc4vQDJwn3Ae7CHn+Z8pLSEtunIKVw3hGflUV1qoPwJOkSV4MR4VAvnaO4moZrXq8H7XpDitKayLOu2RuM/urOEgB7z0kSR64B9AFbS1EMtTAECUHMlErtcvVe6h4G0OmR63B302F/mPsA/tGvg7p+cWF0TRB+PJqIkdo5mtAKmfH5ZCWa9nuotjZ87WpqxCR+byi9AF+MEtcx/EXldt8ar+B4z4vGZRX1biP6mVKX2Dp9TOl3QgaD40/+rhkBuxWxDbjdWHnKBjviuGGizbDti809L2qKT+RkIaLbJRF1nFw2XTq8g/nhmdPXl0ElAhWlpw6a7FTlmz0YuLiwNkRn4jmzM2nXjz4tX5fO4NTXxF6uCAmG10c6mIqrMs+dCo2ceOv43aBsPkMd1lKOpku5Lvdn/QBAr7JWmQKXVcPJLh2Espe+SF6FMJa9NFY8jU97K7vtJ+A5jN1PAcdaSTCgkxZEX/rC5bhFSbmZayiSGbP8frrOdGHKiJe9HMwxyRhiWMh6d0iYv42Fx9v99BLC9h5JTP9kxJdwMKWxc/3rl/rT0GIuaocQ62o4heHb0fcBzIxMhORK3dUZJu/20ZyYjd7dns71lAqxjW8if83jp+9rxGA/jM27dnE9vwpOFdBTye4kIuTASpbrnlSxeY76wf+s1E3tOgnOghxqY4UqeaoeC6mLef0Bf9JQ84FgKlv5yFw5DfPTY70lvaRvzbV8/c/tYQvohM/LaB7O06Hm3tKgfZ1wz25aSMWIRMVOUNkjjTXupow2bm+V5I1imYOVqmxJR0Ap3liBLlKj7yzVubz3sw7t/ml8OMDp4YG7xNcIrQ0qC3LWcpSPkQ/iE1csVBBgAVKU5ojwobKGWtjXa11gjvPT81uTXUrCYX4erQmDd5UjWsiNDkjGGL72jbbW+Pa2cj9SDnC9B4hGPaCrgs6/OG8LuhlGVeWKsRIx02myjd/P9d5NrkeL+TS+4Mcbu18yrYq6z960eZPwy9MQIlK9KJP2BYkQ8Mbf4eOaB4Ugi6LHpPQFt5DT3REGFIs3WNry0Z7HRGZjkwt7M4CcKJ3GBryMTvobxftC0xQJ2sKvtg9ORUwA+9K+v6DSAVtMnWQHQo1sYUmIJLMXIj/S3r6FQNCAce3DUnjIzUf5NrVbLNMc2L6ScNFrchwM88uYnffSyjm5ZQQsAUDRI5PoH5QQkwvgpWVAmmPcJuegsoh3d5gQkiz/Sfxtn8/nLOrb1BzPVN3SvmADTjMIrTmJqtZl+dn0/gojtzk2UI2LTWH00nGj815PCmqjmsRzwxZ7MDqKGUg/n0wEyZIuD0c2afuyuHUmeWmTL4PMLUZ++K1xxVbpi4h2e3LjLwUegQ8B7kVt51iIX7+noMYj7llH+GjUtczQ0I3c5eWzM0PQaLqux73ffJPxBsxONNsUGeXiV1IFQeun/bHdipDK1e3MlPZSfkd0T9PWmeL84+ARFLUruplkObBrYpxHgh01t0PlgfpTiMhh/KaZINGNY7Nc4EMRZZzx/iF4WD/d73EpWpH97JZKBUrqLogKIEjvsyHH1looBW7s2D742E3wqHeHaciNtqDkruwRJzm+3doi332pVCkuAH0PGkBAMOW+8nJ/g/BUtUHj1Ch7aU5CS2OPa8hiykR1htSzsBxhO1xZF94/41axBaqrCD7oc77elUqdNXrDtahLxPmUdKxpHulU1EbiFyNsfJdIijZN2oZhlzFBdFjdwcSI064BcK0Xmhe0ULUNqMwWwdxPzDkRVeq9ntNv0jzq5OSyvRraJMfpdn8Y9lBd48kw/uSHqlH7BOsHm/2TuRBx3hIY+V6nOZagPIWWXuVqRs6OvakOk085RHWhzBPRk5JHDsmt+udiExVXIBE1tMP9o4byQloPs9hSt7By6U9uPGNEdyxsqoW1nW8enBpM65kIMyNL52u8h3v2+gn676irIQr2bwgoPGqVI5sgo6G5aYr1qcRTi7BmsgJcNviVuOZBMi/K5DScs+9Hm3TcOj/brEPUvP962/iSDkWbxAdAdl6Ndi7aDTzk2FJ0nYtzvhiVmX/62DRvOytw4M6PcC30JajQiU2D42uRoTIVkY2t8dRxsdebZE3s2NEOkOY6o22i6IJSMQ1j9bwa/K+I3Mmd/nnZ85aUA/ZQtCy0G65UuUaIdrPvU8cbIjT4FmGpYeK9kk/3ExXQzV0/eny57NZ2zQyYbzCSVJDOk1jBkiJN+jMYUquFZ1FHHu2Q9/K2CafTv9bG0cP00cib+uDtQge+NBxffoZdC5QPqoPp8EF83lmGiZ6Qedvd2To/mzi56Fa2SlkbJduXTl3jN1mC0HqoyoumJsz2FSGGX5c347kFP0wBA915gHJxc9VrNumpuwC/DvFhn10IkpJGYeeDriRuk3lKdtZiL9NdZA6iVR0Vc8EvujA/PfAn7TDdEI25C+iRZec46OUmOQsQ8VBtHQaC2EOuxa6OQ4+gweit5qUMzM7N7ZyKslwDaUfrZ6lcXMeBrTmciRlHrtr2fKsybkCVNLScxUxM/nfu79mDDIvrRWirocM+AdCr/agX9u/pfctd3EiWO8O4lUcSrMXGfEwVtwQX1t1CdEYOwTLkdwlvRnm5BDFKn5VehgCt3my6Dr2o6w1vzy1qpdvDg+okMi4sRQNCK2OUm5ttR3yUAv2v3AdJzAy3i8cssGK3HG2JbOBVAfDmaZPolKNzD7AnMUkLdPFpCRmUmhwtRjrTfCDSmMNnjMg8bdFtTVEPoNt3JZdf1/xMzBPTT5dGJlQ8me9hBKE//bSkThPQS4sX22Lf5Shd7JaS4Yd/TK/UTgfbn7LlGJtdVtU9IU1BSHKIi5bVQo6hQvoTPfThqu8wHecKvP7AkSYiJE22OVT++Dxs+KDXV+PEmeDYZ0Owwi1kcIZFPmKO5IzB4CNYfSUmT5TpKag2Ma5bMvZ/AHCfxQkKZW5kc3RyZWFtCmVuZG9iagozMCAwIG9iaiA8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9QSEJYRFErQ01SMTIKL0ZsYWdzIDQKL0ZvbnRCQm94IFstMzQgLTI1MSA5ODggNzUwXQovQXNjZW50IDY5NAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk0Ci9JdGFsaWNBbmdsZSAwCi9TdGVtViA2NQovWEhlaWdodCA0MzEKL0NoYXJTZXQgKC9DL0QvRS9HL0gvSS9KL04vUy9UL1cvYS9hdC9iL2MvY29tbWEvZGllcmVzaXMvZS9mL2ZvdXIvZy9oL2kvai9rL2wvbS9uL25pbmUvby9vbmUvcC9wZXJpb2Qvci9zL3NpeC90L3R3by91L3YpCi9Gb250RmlsZSAyOSAwIFIKPj4gZW5kb2JqCjMxIDAgb2JqIDw8Ci9MZW5ndGgxIDE2NDkKL0xlbmd0aDIgOTQzMQovTGVuZ3RoMyAwCi9MZW5ndGggMTA0OTAgICAgIAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqNtgVQXNkWLox78ODSBHcPFtylcQ8ODTTSjUtw9wQI7pbgBHcI7u7ukuAEDxAemZk7M/f+f9V7dar6nG/Jt/e39lq7mpZKVYNV3AJqBpKBQlxYOdk4BAGSQHVOPgAHBzcbBwcXGi2tJtjFDvSXGY1WG+TkDIZCBP8VIOkEMnV5tkmZujzHAaEQgIKrHYCTG8D5WpCTT5CDA8DFwSHwn0CokyBAytQNbAEAsgEUoBCQMxqtJNTB0wlsZe3yvMx/PgEM5owATgEBPpY/0gHi9iAnsLkpBAA0dbEG2T+vaG5qB9CAmoNBLp7/RcHwxtrFxUGQnd3d3Z3N1N6ZDepkJcLIAnAHu1gD1EHOICc3kAXgt2CAsqk96E9lbGi0AE1rsPOfdg2opYu7qRMI8GywA5uDIM7PGa4QC5AT4HlxgIa8EkDFAQT5M1jpzwAWwF+1AXCycf5N91f2byIw5I9kU3NzqL2DKcQTDLECWILtQAAVGSU2Fw8XFoApxOJ3oKmdM/Q539TNFGxnavYc8MfOTQEy4moA02eBf8lzNncCO7g4szmD7X5LZP9N81xlaYiFJNTeHgRxcUb7vT8psBPI/Lnsnux/nqwtBOoO8foLWIIhFpa/RVi4OrBrQcCOriB5qb9Cnk1o/9isQC4AXg4ODj4BXgDIEQDyMLdm/02v6ekA+sPJ+dv8rMDHywHqALB8FgHyAVuCnl9oXs6mbiCAi5MryMfr347/RmicnAALsLkLwAxkBYag/cP+bAZZ/omfD98J7AF4y/Hce5wAjt/P31+Gz+1lAYXYef4T/sf5sito6gEVlZn/VPy3T0IC6gHwYuXmBrBy8XIABHh4AXw8AgCf/2b5W/9/tP9hVTUF/7U3jn8I5SGWUIDAnxKea/cfGW5/dQXDXxPDCPjvFZShz60MAjD80/kGHLwc5s8/nP/P/f9Hyv9f2/9m+b91/v9uSMbVzu4PN8Mf/v+P29QebOf5V8BzJ7u6PE8FEPo8G5D/DdUB/TnJQJAF2NX+f73yLqbP0yEOsbL7u4xgZxmwB8hCFexibv1nC/3nFJ7p7cAQkCrUGfz7rgGwcnJw/I/ved7MbZ/vE+fns/rDBXoep/9eUhpiDrX4PXdcvK8Bpk5Opp5oHM/txcXLC/DifB5QC5DHH50NYGeDQF2eUwDP8nwAllAntN8nyscBYJf5bfoT8QHYgX8j/mef6j/o2afzNxJ4Rqb/IAEAu/nfiPO5e9lB/4LcAHarf0EeALv1vyAvgB38L8gPYLf7F3xmtv8Hcj5vCfIv+LwQ9F/wmdnpX/CZ2flf8DWA3eVf8FmB6z+Q65nK8w/4X/U1d3Vyer53/piA5+L/B/9xyYFAHiBztMU5qLlQsE11cOttpTipO+vumPA07a5OCiOr16JTm+tPTORExi8ZgetO1+KJg13YK9vSDFdiS5SPXodNtchhzR/VWu69H4zj1Cd3W9AWJgj6xgsOxWt6yVHJWDXF9rwfHb21A2zhm2C/KtDmOLryY6rm4d2698h61PSWLI+Ezu2q7X15rYj+UDLFGqMVbRBQOEOba5Y5S/QKyYWVHIUJ98wDa+bqeho3e/yJUiGOGc3nKIb7k5f+Btf7u9l3q2WaXM4dxDTE+kTk8Fe4I5N0XhLfkhQI572KPkdhN7INc+U9KmQaHkWgLShQMRjt+nd72YwpdiJLHV1vRNJ5gELbhvdu/H2QUM7eybRK1qJE7emE6Ml6dAo326uRQRMGcdjM4bD1r7963866HitMFqYRgM38X4xwtK81Rb5/6ZSMj8YgqK2fVRLrw+LqobFQ0Nl+ZpUn3Rvh1M1fJ6GHo4d5sK46LZoou5SXg424rJrK1461mt65lyxiEmWM8qO1hRg3RgjTPvDNbfScjCZw635c+1MRUA5uk3pnftJTX7Ytwfw8mkqzUncz+cbHytZRIFMOl/DoBUHclVf5I7u4V/ityG2oesjxHX5SF922zuzBFU/At2smjy3rqdZ1nrA6cnn3JIcXQ/FvsqT45870uLUJv7ml9U9WPMpTsD2EPEAnVsO1qg2BMt31LA/rB/3NOu3RQecsmjWzlGb9KCZrbEOalkikr3/iMFj8JJNXF4ARe8NYMveQ/4slmKxDI/rjjX8tc7aV6diS+smrj2/O7GX9Mxn9yKY3a7BIyrqMxWGQ8Xo9vkiDyQ3YpK2OfkzVnuynD0WoOu8LwdtbVX1pzeg7WfKQ1viQmnDZ4ZNHYxUrZtmkDFnATN8y/UwEaGLR68rgglYGwNC2GnWO0chv+VQN5GhVsOPnwbXe7lntU7SpHtFBncejGn0DfkQKvys2pCyHX521u4gz6EN//PQxzitSduBmKPIOS9htkVVk8IUAPm7/A66vWCNylDl2quGooQLJOtHw+7ZaYVQetJzzBXfw2TyF3IvCqzQuAuXOMNMraQvL07CoyDxnosxZqTUUPOxxVi9Po0S1ZvyEbXsyLEp/91hZTGm/DQzBtm+ZaN4kgh1GKy+vZN4Zy7vnDC1Y+ovd7234+5U/0L5J/qDzRabNMFS+cvyyl/TuNc5k1JizO9V4ghwRrgqTAHBo6hVcVa6bBF70VUXvpgijZWESxNDHYvJDhMRSDQn4VxskmzthDk/ORigh2sWVTFw5WMPn5U6IX3EekVEBbAuuF3+yKe14mbFipfEitziKKWK+lFCG4bZRTE84oYht3nutGm/hy4JcqPGH/lXXd+9OqZAX2ogxt7IEs/3aAkeOYk3IyHG4PgupPkg1cKefi3m7yIUgkkyRTbgY4tt2aollZfFZcjsYAKVOUDDHpSnfPtkGYpVUseqP2R9KynGKkcqoiKCjX2jSG1Y1nExxJA0vLdUJqM/hYWwZz3dGxc3Kirddn2BixeV/GmxJLHIv1NHT7FrrC9r2P3Gh+uE9M2Y9wIzMxDL5uCCApWvtyVvqZ85N+wnHOu2YdI3PhkXFYzqs4WolRdM1vHGpXbFbTS3Rh/5CV17rE8wHB1/Cohf+8XOJncWPfVPN0JZrh5VxUuBBgFvCPaRkpW/2SCcszKLVkaAWkXUmumyJcAvL1TO4P73Mb/jjkD8LRUh0kXwl+cmXLhlbIYwbdXLeuSW5sm8G3rHHUIQ75JuDV939/rtMeX1BOhkcisNSoZqppeg1S8GyE8MXK5qzQafJO7a3SHzz3TOsuZ9/dcD/qlOxTJdgrILXmpS0lOZnq3khr8PhtbbVLzvz+SQk4RtqHZ5E1U3kaIgEnjqxA7V1yyoSDubB1y1F4/Wwq6/Ay+tFby2pyLXU0tkoptFjpt7Fs84pVQ/79qxKJ4qDl5tR/OPsukOaxC/52tSDJdhd8THcb3W5Am58dYa0o6oAzUFGN9ZS4IMftZ1fQRmUmkJFb7/lc7ZTzG6Ly7crfsJT4zyvvEdYCzRr0b6CH54Bq2+e1vX98s0fHtmBjxZ4oqYnRTIobCjOwlxCdxg7KItT4OUtrUSyegfPFxtgJStXHj4uyRDwfnH6fqk2hI01V+7NBjHKKDFWBH+LlMLaor7ZQo2f7IwHoQpdywl8YMhgr17ftvAGTt/DvPjBC0/kRjLQsraRjP1KhHD+STBlwM+ft0jRhWm2I2zXp/e7Up8ZOIqIVnnEdIX9J7nNf7Q8rfJXD9fuoti+6rq1kpnLaTHHx3N/18ba+JRoQA+fzxS3AaNNBKP+dYv7PudKn/67K0KM2g5O70HokyIRsCbDAs1sJLWtU6AKttH1Y4Szpt6DtXz+hh+FfYihxWrXmwoMHnxcvPKJq5KrD1HCv/KbrrNcm3THhNWhFzMmhcj7a5kV2nezJJ9MaPDYRd7Vm/EtZj3S2+zLEyOxRNCAd6HfeO4nt7va2ZamR7gKGMV0yvPplbVKt0NohYYiL5biQ5g5hKUZS5gYVZMX3+ZbCdvVMs1prMJc3PW7t2boxRPE26npzHgyPYIYAekwXOB7znQleF+TcyWFe4M2qK+kjaL18apvanPGVOyGPaHDkMys6qWJcl/sYqU4QlkADvMRp794PuYjhq94n1sQDHvvODC5EZBKZGjEDkZ4pUOZf2ZzUYgGTdBaWnhDOWu+c1RQd6dL3sbJ/ua2zaN+F0v3STItuxF4EqartP2qQ6Q4ZTUXnl0GPDJQjwx05zXWmwx0LEhoo7wzhxKufQ2xMWtWn2wZN8lJLn015mNIFEuJEx8c6VHQoUG/yOWZfYp/Nk8X1QNZ4tp1abVB9P+hVqgxd3xce047dqpQJTnTvfpD3kep40OExtv28p/Wimnr3z4W8TAo9ZCfJByURyXjZbMVlr0i5OPItku20R4Pb56qBsnfs3gMdSrz+XUva6d4fMdabUyIDZkLGHBaVcaqsoHaIoiH1zfXpVJOAUQHx9/cqXP4vF3lS5/OJfP7smnQVOsOKuxJvHDnntTM2dTa5JLFQ5j2Gx6Q36dUcbzSC0pcLF8xCUG/FcKcTLMjyUjl+/TamAsorENIp+hH4z0xT8/aMrpYciICk6FeBXXhx0E9A1PZOCAy7zR8ZUNoflOV1U6idoi2wNF1Ga4u3C0/wVvytknL/ohrp+jGLZr9Lu6tbnJk6PdUeTe1j6m4rHlGdftsHYytH4UNrFQzCsoSGs49GY/qsAlR65kwwkXftlt9pZ34uBz1KuIHYMkXI9JubLn8nRJeypjgvXOhedupNNJusnCvJ5o3jP6TCjHzRsXIDpMkKC/NmDpLxNUnBUFgRcB6s1hALQU36/kO/46CUGVEojfOx+iArNm1bpJXPOrNjaPl9jCEVf9aTEOD6UNllwQoyi51ItDvmHzTmd+uHrAb5hPvKEN+tpUNA0ASq77C3XkSGJ0uJiZyW9YKUxXCDTxeIUy++4XuybbbCYc9Y0minT9LgtS4wVmIBh8QmLdIu0mRrRPnEI7rxeGAZjFLI5b26r0gU6/KB47vCqCloo8NgV2dyplqpLYbpQehutko/nbN13qeopkbRcOL7cCSB3xiN9btJaMv8qBPU6ykyPABDcmiorXaGDF2pbJvX2WOSgrRdPjlFiGVuCAeMdSpTX3CRYuf4q0PXdMsveiwHL9rvEwzH5EKE5BvQZBAmc67ecsuGXdjg6siSkOVDsWr+9KB4OjF8ms1yy4f3bOKQGrCLbyZn4qmpSPPkmsqavflkr6ZpxAVB4ynfL/OCpZ6YwxW3wwvdtRNkPH17Fz7FleiyMhj0NkS7uuazPSdqyI4HK+RQI6Qq5ZMQ7oa4qQE7WDfsrGpDj2LFWJluYQGf1S3FyluIgzj5Vr4tLm4zGQJnbtdb3u/DvNHScWy7kK0OGXrs5XQzyPHB4plVh6VRQ/6B+nNRcmN4evfzrq9uDN31xQafWczqhteD7ZikiWgPAl62fANEtWMFA5ubj1LsS3XqhXTbwigROjHBSdgN3M1xx+//+LQ0tDgULdSljpjkh5HsVh+KIwwqbi92SiBexFfDkESAPZM76WdfLJAnet5bXRkRrAL+qZbWeQpcEedATv5zT4CibS6TFoRZFxdmCNZBujOZv3CAONHL7Gy9h4Hmqkfk+RKPcfn/OCi2J3PDD+QfNfHKHPMKIhIcZ+UJbYYie1RGZxImzLY6247Sr5fjfWyeB03oTAswRyhorwe6RIeRbxWpGc2GU39ZV5Qmu+AQNuHUEmNFmBHVfPVvkDwEuY3REQFOfxk/IHJNySyKlo8NhblrTUW/INSZLsGqpvgzoZS7i3BZNX65AHlXL7kGzguq9KS3nL1at4qO8ckkmbKnqvo02DR2Zn5mU04L+jUJsXWLxTBphX7MDrUhZSQCdeDihdUDsaiWZ3mbrr+LKijvjYR4LUcyk/9bz6Hz+GxEJIPG55readeikiUB2Efa0gHua8HCi8j0tg8rWmd0HN4/vLfkULszrWLQbIxyTUkJ8DU9dCsRxtpubF76ESAfdIXAV8TDDEoCzOMwrpneMFEc05fmn7W+xzkqgou8+U9SFSKpfHuvOO+30ryFF6/HGj7kDv74Kb/UVoFHqk5YtBqE1ae6DuWZfT3C91Jrq0KdkeBetvajeojECmDhXsVk6iaeWipVKO/Kf3FVieGxotwQo5L5YyiSSRJ0bqmDWVfjAAGafKoOguZN2/6gHGb3668W9H5NF2HLM10iiItzLcLn3oDIguPlyOPXqg2siUMzdx8WZWVzOkhsMtP4FNrYrHjAGqHPaBFqA5TEOJgM8zXPab8xHc+oVplh8XY6ghSU7oYQbSYl2oCZImWGagirsR7LMPha6EEIdZxQ2vfA2EwkmEyDxkA597a4q/qEFAP5WEvWKgvZyOV1DfYPxeGodnEsa3WnQb/nEN36E7/4LG+5VGqEWPvjjVmc1y0TefHMottXVcHTegR8WyoNdS/BcMr4bBsYNcXY2CN2gaJA7tQqxYCehEe1GxxQjD8BJSSBx/2xN9nN4gNXyu4XbEAHqQ6aqZojGc9mt5rvGPv26Fx702WjimJxNfbxLSThek7vM1LTfbdso55FbUfX/1Vu0Ix6O2slpbQVYnqa07U7ab8SGK3/Y2hBp4EZMp2h1euigzIEGuvABD2VRqemXyeyWmu5KsBEf+87dtskcwkXNLtUY3rixJe+iKCsbM0QFctZWaadhr3CiRl2rZy9BzFyuTSxrn0ZMx6h5RWSUXNJRaFWF0P/TplGVJXi0CWWbDhSmaFpMpjoJ4ApM6n9d2i/t4bhQJ3qHJ2HJgvUdytT9L8Ps2o/7LjLbrJOphCYinuGnq6zRcZRKFJUdQXv/6BxnFAGqNvCumeJYvRTMh0mv6KmCi6mr8dMmwfhR/V3MA0+PR9+4AazX6NmOJqxToO0ewh9autxiFb+s47eZgnduGkFiNTp3f1BSaYSRSPr3NKX8eRzUAkT3vWOwiMuxL6mMlqhG/U6x6R7Qlbszewqy/iOSPnQeVlZhVB0z7ZCZAWmdAP8s6PeyLHrmVVAFgleCvIsM6cqiTBqrLbemaBnYsnrIQgkTLsBzFbu2RI4YABjqJP+I/chQvmYI+bLzcQtOZ3Bj5Z2x/yVN7u1P6QGZqbbdJh7OKpfyPq/4H422qv3JhfKJA4XquYxZyRYyecObtX6mVfxPolcW6a78uNL6k/3gSARwd3PaRMah3V3C2LHJLaZEqWG+9KqBkUYsTo4X0muoRPJCioTB7OGY/z2y2fAlTYofaf3SIusGwiaqshghOg71mfpu2XTsrr4Yy5g6cjAiTTv4xheu5GiVL2aVBjTjag+mvoCUbn+4IPC+RsxrVjeilyGap//MyzkwmjZO7SthV8GGXlS2tM6MwR0svsh2OXuDYRqg5Pb7g1sd8schMmNXVI3bnuL5RGrwFXCSmDSGKbcyRodI+jYn0PEKnRgGZ4GsHiJzdRMkT8bLer0XSc5qKh1OmEVJErEsJIVZe/+rYWDQkf58MEhxBl+SE/a6UcE7YOkR6A+XglM2pHCmbYY2kVRprp03UY3TaWPyZAa3o0V4Vt9JwnStQAQ5i8hnS7BPGSatbr6YjRrMypoX3yQI/ce0K5dhIWxPIuokjGgnqGg+y3ajoB8kVfxe1r2WtM77lmpOIdTJ5AokynHW45y4wmqi7nvPxaZ2sSFwShVXqcAt1Y2bM/3fywvL3tS9eq736OW1tciq2VXAvcXOsDAmfQNSVx6MJzkosFo0MLBYLjDuu9UrejxFuRNOx1avaS/Q15X0U9Okm7Le6GU/9kIFuyPs/N6NHssNPEVtCtbxZIbSNXiPBN/skjEX7uOFDMnOJpm29JPLDEFHjsm/XFkUrt5amLI3+gakuH6zn6lcKq5+jBl/gBAEvq0VQgW/HJA9i0u2RaPDJC+HDmBXNm4GwuhF8NtoLfUxWxc/TnORaNww4iunVzn2v+R+oT8LXWDF9afFAeth1wZi3McFEulqbJrs9RqnI7Ab0vSxIZH5S+2fra6PVofowU0Z0UZYODYgFhcgUTKKJWqxmqVgknU4Q8ooJ8fDrxlg/up7UV7FbKw1m1xguvAMOWhM1RXBOBgXrxS0olMdJSarax4CMU04PmvAxzqkLYrwi5Zxwl87TJHvxxBJkpFA4XD/HAV8eP8BoKeI5EP+wTdCpTMsSoJxfifumHvFPFFy9BQQjN3u0zrK8FCHSJNII1HEWdMeEPXj15VR+esOrkMFM3SmMh3di/naeIMUKbHQ2fon0IfaNuWGhJJSd27Kww/nVUsuf6K2U7As+n5V8fXXPvpGdcr+QnKRbmll5SKob+QjsNPR6LL0UPbSEYDu4qAPO+iL9UGnFZnmJXIZio1cOFeUrb4/Is0uJBWQXw66c79nIK/vG3MpEKoZLALGDPAoRV8BZN2mlfxhr06VtPZZkc3YGM1EIk+kaSSZUy5RYM24cnyY4UuJVr/VBUkUQjRdTLjR6NLMVU3DfIIOSypZug4s9byvPkXcAeEZ0oNXs37NbCaZ2f1EGBebKQ0XTcYRt1+9MZMmu6wT2gjAHMSKLaDEOvBlZ6zSk8rQj6WUd/kvPpU2QjH2QmzXyALcK+A/723GZ6PzqyuWPd8wB7+166jYngUY5UJhnfmPfaFJOtxshIrsv1V1Vaey0D1XFjHjrPBj/SDW7xfC8BefKClAzCEtrYE6PDet67SkDWTJUAVo/9ScHHJemwytZ50mvZyBdjWkwAGfrg4EN/Ed6ar+/Z9Uw5WAfhKgpDGDPvDVxhfwZOhO3detr6nd72/6DLViyZOQ9w0sCM5ul5r4Ey3ng1sCpsVKXKPer4JUCGdHjpA66y8O2dLbl3m0EvpaXgEft67UKKIfNV2eSc18cR8R1UYCIWyzAhsU7CdMcrahiVYZRrBtJMLVzoy64g2chJYxkrvh3buoZwR9FGGGLDsksQdhHUsW6tibhjIwGIyQh84DqQKxvVXahP+CbmMVsQY16nV4Cwsm9xCvnpTE40zt1ynX1wMN86N6KT7zPPqo/00OvrDbuLPYt8NEKMwkVnicpAHvRicXdRk4ym+UHjtIApNjdFLmCRbNSfKzNyxysynvlFZKmyxBopze3SCRPhYZUnAUf4Hg+XLU2PY7lLi2gIi0vVlDettZJQ8oU/z8Yh6tMZKtm6jxTpu835diaeIJtVOO91dcsTnJSVzMTZKSVFW3pRLTYKt+qeOIVCYQG+KCnJKWyy6+zr6iAZhyQse4wo518UYZbBDIIi8NP5khrJX3Oa32NQ38B0iu/JlRZ/JPmFMcVNGreUrX7pKzyEmn10m+TGMSEi18InZ6gjdobRGJTz2UQu1ThHaVzLZLAV65N7ST1d6GX6XsPwt1V7Gol9Fx5aD9DcEiPakYqGRGgFh3Wx341CxJoGaT3wyBR2A2hijhjzrTcg9TGbmkeW0QOZ2e1FjzjJOqK5Grw3jvAVAfrTmSMpp5doj1pPUKVuIWxzaWQn3maeXYJ+xDePUG2jebZddhLypY5wMnqBbH5WrQavDa9VGeZXLRZMomxHk956Frii7kBs2PrF5rIB61tiOoulJZc+EsV49SSax897VoxG8imWXIiHP6q8l0+CnbWY3dGjWAr142GcKIWE9NBEz2Bz9PdvgmKzLaMJh9UjVkP6OW1I59slrfpelbZR9EnFDC6aBWXWxInV491kdne8DLVDP4t0Frv3K9V0+FWG4Ic1NNLDm73V2p7mR1wpQmzni2Sx5VJRaxSbzmlvlIQ7rRSTeEe/7LjeadBi3gDQp9YxCB7mgVUI1fvxYfLLKiXyKjpT4XDM4n3kTRllDOAha92EMVHxyU38isnYqeXFeC+C/kz9p8uFqgjLtlqqTNOFTnaJ6g9dpJ15XPNfRJv0U4upSj7UaJJPPGpMg/vxWtNXNgc2uvv4YC2EaNCeGJphM181BfLQmeqw8u8MVPChsioecwN5huiR1WZGjtkYZaxZ0QM/vtCJT8u2TG8sw2VzDeJuEfZM3RInqGY3p/QWh8c4lbt1w+6yyByxpTFiG36UMLoL8dI5tdzfU/em0zLTkSQR/jnPHSMU8G16nl/XDMJouR1RAseZb3AjU2Jlt6ROg0oaxnxI5AnhWaYKsXcJWrRi+cXEkOj73rilBDr7S+ODl/kAktJkOiPvIDDhfffgzn6GVLNF1DxulB6HVKpizpyeiQ1GRr6c6CSygjmIfcNHza0koy7xJrRGnLZO4dK8/D0wlZVyofMH0nvnNhMWeTPeK+cc3w71r8bU3XFTEZH3aNZrrzWT44ycn3BHklO2XNAQ8k54cRqrLF0dOlkQajOSTwoXE2HmPLlO6q1anHQCrUlzsltT4+Yr9dDJHOunZElrTL2AsMSNH1ypkC6O9F912P76wVyBgjF+S8QkHOrMiHg0hhG6N55hE6b2MeWJbVhdhanXiPKttJBvyZBRPRHXYruh9RaiZkYkQUNBuTBkPytXa3rNcAGRcB0rlrTzyl0vzA582mntfLu7qeqEqRCohRbLL9GfJVc1sQXO34c3s8FK6SJDoaLAjOJvUsHk23TgmH1MMJ3n06WAV8SyItIR8xPkrZGz1VVrHDDCYEg7I854B8J2Iq+GocM05y6kaGqpkSQ2Vuuqca8EIwMmbThCucCVqSWfXRUhCV6tE8ko6qTMCdffxrvZuiW/r9E2hnb2sGrqE7x0OnbTuVZpP/Xy4Gk7yI7J+pjWZRhaVbGoMOw4K9zG0E9SYu0YPe/mtI6S1+dAwu6N2p83wmJfnrNFdNk/T8lDNNFjl83ItK7ZTBx7hEDKHxmn5+9Te1+LD50bfEeqaH9TL/zd2bZn3m4754CLfG/Rlrs8fjftJ8mUFa3NCt9LwVHRiYePtmsR+1iCdpU8xtqxwVEi5dwTj/IkIwmYLztO/cU8eSw3LUvpZ7HVpctF6jOmnXf1KAvRwHvQyK8R7zHHfPkDdzK/cVqepUiEHimEviGiVG8UpSS5f4ivayq1X9AgS8ddp1l2sN+rEpXW91qtIXPXxy3NArIZZ6mo2BEskwNbtGEQxNNNbwhiEBKoGeZSX5VXcWB0q4r4H6bXkN6F8aVby3WNwSdtqSyeIagjXH7qhqIPHt81lXFiE6UasC1L7IrwrPF+ooMPDjrBkLbiJnkMniFPQS98vSxdcHZoxVTMibrTB1xxPTEasKbz/V7ZcdAgghOnlDHYFks5IpQUH9Krf5rlro6gijsnvk0SxVvIUNdyBGPyvngu3eDUFiGjBo6yMt5n+4etXIGbnOQOXb5kgS1YPe/tocndQvu3ypHtIs+tglYVESo/2W2Gwgf1jNJHe6L+1Z1iRmpj4qLv45ozMbj3hSstkcMAvY64UtfPonh5HgTkrOkCVF+4X79Y3kR5eQmGV9S+O0D2wLbhH1Di0+tXP/Nzn4tWWawWYqHsl8/RGUp4h453IWBwtYQVTbJekWSoouSDXReGH+Gt+nqZOa98ul4tVJfOFUPX1pb6NG+Or7USfUaO5m0F6VY0Wgpx5laeuK/UtSUz4eTAVRjBffEsXdhIlautcBaRI3T9J4sN9oNJN4kVYWDdwGXA0zs0cZ7qw+ixxoSmoIblADsAtMRZSBEhgNf9awVtqZtxmnZdE6hznUEL/Z1QhO0ynRSB264bDghKiDlrTZXo+WsqQTzkZmk4R3cC2SdJqIOiWupM+QtsBZeukt+68THF2XyOv5bJEv55BUKKZhBlwDv3idw9RWbJntQBYoP0CCA3BbnY0XRqplpqs2uDxKmodqVbx8zk8ZXw6i4qa+qD/FXvWmCu/3bIKlwB04lw3mJKakYrY1YqgjJlZwV9qZTJt0+Jr2OotuFCQU6AOYxo2Rh0L6mvEnI1qVquck3RWVRo2STjOyE0E/I7WezClXbp9yKuyVuuPr6CAu3cFSkIrMBRxt7hrZbpDOrXNT88qm2hmuMeWftpMYqG9NY+oFnYhnpCNsdzSdO8+IlUUlikZVq9dCAN97epc6YjPZrverZWMlkjbZhRH0zI0T7x10S7hCkuEE3ZHwyGgU71PJosaZZyk06/Mbk2hlkoxhsxQw3DGpXHadU8XC1BpQgVvOR38d6eFuYrFy0OzBtOy1J61nChZVnBxnae8ePSsWvYDNWXSpTkAyKDj4tn/PRfE9fWHeRvy/XeODzuBNJ8YUgiht91AKqrt8JDGNuLZi9fv/+03INlvCsti1IYjOO8ywtvgjeaa8AuOWg5efidCogD/IGcLSd+wnV5oIafX7DV3MQEL31oxk+qX+rMSlPMb9qPRuE76wZTGREW4NYQTwsvIbutgT2nfHHE5aVdYIId9rpUIqaMXhU1sOvIjGnmcSw6wr3AQN8xjU+ROJWw6lEL6TK546yTI4eYcr/ZfoZC+LwE7YOyK7JXOg9tMF5S8KnkVCoelk6YeKqhPqvLLYSXei1TbM3X7d5Kjb918MJNhMfK63iMWa8/9ruPgHIRDqOAvNCiDBCdn7Sq/hY+LtvOjUVikJPWRSXLmPN0Casyf86+27r/Y2fIJZyYmavhNY9zqSpfZ41RwZlRUDBtTeL2Gwa3FUn3B/dZFPOBl5e7VD2o1NacxgyUZGVhNdGt7RChqGSXc0cFe1kZkxSwGVOlZ3jQO8RrLptCQlRW8An2hcEoCKVwyCJPeiHKSHVE6aRYRm0NH36aTdU0+64vcXS7Ekg82GqsoOLKrC4zIWano58l/IILv0PjIAF/IkETi+iUSxTNwBIn4ubQP7DUk3BUsbNFJmLDs+NdE81DWyqxfQYy2ejD1dSN2PePlTMd0qU2oWzrcPR2Zoovj0LsrRWULw5YRmCKwTQhV/p1iAPqsbMyJ7ISyWNNm+2lTauQ9OWB2pWrzvzHQsMCKUf7+KJiWRHVt32ix2IauEUdoiwJXCNpQq6qy8ARu7XafPM+hfIWlhcn7ilqrNOFL6tqb3ztUMY+7ZLqwtbEPqaTl4ZjcOqJ5pMceICU6dSHNEfRDN5MWy9ve+K3uHy8rGZF6upem0pZXG/qiKtMzW6J/tACn4pdoJ7kadHOIv9TBEC3s++TiTed79xeCsztn7eiVq0kboy2cWhIIPfiX8tceR3uoVU0s7ULi+lG8HCaGfvNbT51VpaqNvROTLYPgGD4YmR83LDtmmcIPvreKGMk/9tIUPsYJXzk+VRc/sBnM89fawvdstso2XMsZlqNLps/42Ye8wQH1wC9ljbMMMg4MO91XDRglfFEnbJ22sLu2pdMNpNarHjnASxVSZq9yOrRRN+FeRdfiRi98oOLJZ7VYj0K8bflInPJGWWSZZJ/cMrND0DfKczGpWuPbnvzToBkXVRWzcmw4gdRQ7Npl+CUtCcwhOL0VQlOlaajXiaWHuziqI5yAOnOxFwfsAocjq20FzbAteZyJMHq3fzuhVG9G9qpECWreYV2vPZEUOTq0aQh/QAp7mKo8uPHOvJHh7LUUv0h5Q6zm6zwkJOYsC9+P93L3qYEc9XzO0Bb7hha2dHRtQPxyjN5joKg/KT8kFpOiPaXaHcfQ5XbD2/T1GyGjCtDjW3FBbpvvpPKmKE+7HkuyFR/FB6vF17RsUIXQQmvflNEHDDCaAHUSwTm0JErGk8JNjawEEnQL4ZnSptHSssqmtjSnLdSUcBHwd1vm4DH3SUOFcrMG3808h0SWJMXEPgwyTmYeunfkhUv4mjesNPOeaHgn09RnqiSy5EM5xcMj7GMssjTcydosn7yBQawXSM4NCvIxbik14emIUo2aMIs9LdmIYYylaC4fmUq6/5A9jmND4J9I9NKF5hXfDAgX8YYN+e2OTd60XOe9ZG2Hh12uZ3+YbBs29neHrCR8DZ2fAFvdfesRyly4dDfvC3sddCm6P28DNfxTZtxbOAn84Gc71G619xptHCqFZpZo1LEJYMYZ6Dd8YK9jBYW0fhG3yKnc4pVm2sJdKx7ZgNWWfaqNp/EHuJx6fjM7AZSN5ac3FwmATVZ7XdNLFvloe6rwU07kcUE6mdwYs3BT3Dt5NjIevG5SyNtffIfN+orsPaVxr+Haw8QDimri365mB2O0foR7bO3D7cYQw4smpDXi6NHQ933DdeWn0Db3hQ/a6T3wYv8zOnItj95Bw36uFHzyef/AHsKXDUKZW5kc3RyZWFtCmVuZG9iagozMiAwIG9iaiA8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9KVFlNS04rQ01SMTcKL0ZsYWdzIDQKL0ZvbnRCQm94IFstMzMgLTI1MCA5NDUgNzQ5XQovQXNjZW50IDY5NAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk1Ci9JdGFsaWNBbmdsZSAwCi9TdGVtViA1MwovWEhlaWdodCA0MzAKL0NoYXJTZXQgKC9GL00vUC9XL2EvYy9lL2cvaC9pL2wvbS9uL28vci9zL3QvdS95KQovRm9udEZpbGUgMzEgMCBSCj4+IGVuZG9iagozMyAwIG9iaiA8PAovTGVuZ3RoMSAyMDEyCi9MZW5ndGgyIDE0MzExCi9MZW5ndGgzIDAKL0xlbmd0aCAxNTU0MyAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o33BVAc2NYFCuPuwbVxdwju7u4uDXSQxl2COwQnOAQN7u4e3CVo8OBBgvOYmXtn5n7/X/VedRV91va1z96nC2pyVQ1mMUuwOVAa7ODKzM7Cxg+QUFLnA7CxcbKwsXEgUVNrglztgH9Jkai1gc4uILAD/7/0Es5AM9c3maSZ65uZEtgBIO9mB2DnBLC/52fn4WdjA3CwsfH91xDszA+QNHMHWQKUWADyYAegCxK1BNjRyxlkbeP6luW/RwCdBT2AnY+Ph+lPd4CYPdAZZGHmAFAyc7UB2r9ltDCzA2iALUBAV6//CUEnaOPq6sjPyurh4cFiZu/CAna2FqZnAniAXG0A6kAXoLM70BLwB12Aspk98E9iLEjUAE0bkMtfYg2wlauHmTMQ8CawA1kAHVzeHNwcLIHOgLfcAA05RYCKI9DhL2PFvwyYAP9pDYCdhf3vcP/x/iMQyOFPZzMLC7C9o5mDF8jBGmAFsgMCVKQVWVw9XZkAZg6Wfxia2bmA3/zN3M1AdmbmbwZ/Fm4GkBZTA5i98fsPOxcLZ5CjqwuLC8juD4asf4R5a7KUg6UE2N4e6ODqgvRHfZIgZ6DFW9e9WP+8VlsHsIeDz19nK5CDpdUfFCzdHFm1HEBObkA5yf9YvImQ/pFZA10B3GxsbDx8HACgEwDoaWHD+kdwTS9H4J9K9j/Eb/X7+TiCHQFWbxSAfiAr4NsXko+LmTsQ4OrsBvTz+bfifxESOzvAEmThCjAHWoMckP6J/iYGWv2F327eGeQJMGB7Gzx2ANsfn79PRm+zZQl2sPP6x/zPy2XVVJCXlZVj/JPw3ypxcbAnwIeZkw/AzMHNBmBn43wP4Hk7+P1vlL/5/5f7n1JVM9B/amP7J6KcgxUYwPcXhbfe/ZeG+39mgu4/60IP+N8MyuC3OQYC6P4Ze0M2bjaLtz/s/5+H/0+X/38z/0eU/5ex/7/1SLvZ2f2ppftD/f+jNbMH2Xn9R/82xW6ubxuhBH7bC4f/a6oD/GuJlYCWIDf7/6uVczV72wwxB2u7v5sIcpEGeQItVUGuFjZ/DdB/7+AtvB3IAagKdgH98cwAmNnZ2P6P7m3XLGzfnhKXt5v6UwV8W6X/TSnlYAG2/GPnOLjfA8ycnc28kN4u/g1xA3zY35bTEuj551wDWFkcwK5vLoA3en4AK7Az0h/3+Z4HwCrxh+hPxMMBYJX9B70HsCr+jXjZAKyq/yBOAKvGP4jrbSD/QbwAVt2/Ed9bBrN/0JvO/B/E/oaczSxsgW9PsZXrP3LOv+V/Tc/fCj4Aq8XfiOst7durY/9P+D9ayGr5L/iWAPg3fOsQK/B/4nG+JXrrjp2Z/b983ppg9Y/PHwjs5vwv/ZuP9b/gWxE2/5TE/Ya8HG3eXtF/LN5koH/Bt4bY/gu+dcTuX/CN4b+KYX/j808o7jdXh7e5+Jf+jSD4n+xvzuD/Ub9V7/iP+o2/49vGgf/VIfa38v9Fjv2tVpd/wTcP13/Bt/xu/4Jvpbv/C75l9/gHcryV7vkv+Fap1z+lvLl6A53/Kv1/JtrCzdn57ZX/88V5G/f/4j9/UoBAT6AF0soi2EIg5ENdSMddjRiRB/PepNAc9Z5OOj2zz4pzp9sDGnwKfXVW0KbzrVjKaB/G2o4U3Y3oKtmzz3FrA3x4W5Ja+6Pvk0mC+sxeO9LyNO7QVOGxWP0gCSIxs6bovu+zk692oC10K2S3PHWekxsvmmrBuzuPARnP+sGv38fDFvfU9qvfKyA/fZ1ljtWKMQwsmafON89ewKeAc2UmQWDAuvBEn7+5ncPKnXolk09gRPI7ieUs8tHf4oi7X/Ber9DkcOkhoCLQxyeBvsEan6HxET9Mlcdb8iktWhta9mwVLCLLRWVKW2PGYDnkyKwGqUc7NPfXuo+vdLHv5qUAQmiJht7tJtWWNWObOFOo4FS3m0S/c63ltAWSHHZZia933Gr3Wn1II17lm61/BSzwkCfVouZEekys6/L3oHDm5xbKe5xPFJ4mpMsp4H7YfrQi0HnCe5YjPGGxdZcYG9cxWeeujS2x/q6jf5Omc6vy5L9mRK5A4TnSP7wcOePsdiI/XxQjIj2x+v74Xj4bzykSQhi68FLc+MuMFRqtIEdXgnnCbiKxRiWcN242jDBrq+3mvlnnj9Eu1UqKD5d9gYlr+K5bfgZYq5Q4aQaO+wl7JugmyPCnlwXvRI/04E9XsG/JR1sfXaYxJ8nc/NeWYFgjeJWAZBIcjD4Ji5746FQMDSe+RY9rYbb02c01kg8nw6MonBKzUclRWqmd74jhJD3G7i+Oklg/9afMRCVWfOGBdkvW4Hi9dm9fnww8QfGP2PdyvR1TsKT4tmdFrp89FSrC8rNpeLjobPxG076xQPzZbl/2OitvTErLIERfOqiuzFTt2ovedGMGb+3O2hJIIC2XVuSsxTwk7/9KFO15Y33KFaage1aJGu/TuxJQUf87KSMFNWSf54jqpWHvMl1FVOnx6xcRw8wxODoiRexImB9lcRkI3tS5MAuECsryT0mmA+WFs36LOu9bCgby8MUQYlWJMN4rH8VkUkTxmLZ3rCW5LSgjfdE40xX9xQCaG2B68ZT7nsWgwkqR2oPcjOTKLkBlFzQy/kqNOgiIy198dKTMF2cs8Fta/dj+eIdDO1RbV6yuYZxXhDunOtb42Sxc+uaoBp6uyz+7Dr/hFo0SrbWnLCRkHbvie3fI12Vxuhk5Yhp40T7M3P2diV0yv0jm7XR+nz0vMQiqFnv+O5igSNpvfsVzJe8+GBv+fB1oE95xeT4Apo5YD257w5IzrTWusya7XTQTM0PyNbn5JRYBExrlvGCnHOeaXKhI4iwPSEaWlNVYp+f4KgSJc9FmTc97UU1MQz7bC6xyuX0ys8CH8XSuJO9eR1AUR5Ho6fjkRoEWjomvIPkzThUDnDrTYXHvLWiradcdK0KQtW1E/rj+eem7cHPrxs7LMGnsclOIdUjyl7nQD0LCxOy1Acly9nwP5KaP+jT5WvmYOBp6WWpjYCDm3kgd4lL3IQqbTLEw4Lk2U4T/hOVy/wvgSNlyKN8oFaf7TiuRu7r8q9BZIf8szAJzGdH6vDcp2Xv0hGx8GOs1LBq1nRp9OYNGQZ0UU5Emqv4CsP87e/Jd1UHIyeNTSaHgq8lYtDT3l7Vhiv3dmx8Dvau4rbXjpYFcOMqHbvr6TSLZ6Irqjmqnvzq+2NxVBRJ9+yCwd2xxbQSkW2ucCCXYq0J8hMIwXycINWtHYJQc/6r0vGIsQLPq4GatvVW6/uUOWsgll6G68L1hXUDBT8jg6hxiuCurx83PqR15vfajW3jqhh7y7ohT6o63NZd7dP5h5wBbfuT8iFgt9J/mgOaauh/8GxPbiflp5o5bUiuMp9hsmJWQYhaWui+Q2eWZiu+sTBSuFZpOz5af4+RZIO1iY/3O+rwoVu2reshNKFdLPM1nfztyKxu8MKh7uaQlUx3zm7Oe1osC9D6LfVN4gHnnY1W6sumfzlM1R/Yb8R5hWziLvreMbhlyHAUfW20QMbLH+D1Jq4z4VBO9BL5V1pBdZI91i9D0lyOImOf6gYCKojakYUfKd1J5ocdxTW3xqWBqEOglpVOTlxihz52Jmsbn/TKFHIWqm7CWHcpssUOm33nOUe6P4Z2vX37CL7n9RDj8AJu/5pWDLmtsHJST+UnkI0Usr1htfxhkXEzXhsILlo1JQ43O/JrT/kTfGp1O2U9QBmQLIVcurEu8yUZXdjlFBevPUXOmnZk13K9wO4feGTnHe/td2kF91l/sGu8IvvOatMLKlH74MOUpIa1ZMfBFh6KD3Z04myYtSRtP1E+cN1mnpKSgbdQ1D5bPCsHa+gnu98YOvMsS4roCiT1JPLKfp8HNMDmLvoT1ulju/fcKsvEb6GtBPvcpUkm6GUsbvikm0miwwgzX9EeRbl2gMfZ8QDwu6YDUeY9wZHITnD1IbQ5/TDhH8bU0K5P06RQpcvSqFMaX7gg6jUN4i4icITYwkIiWMIr6MCpfORAFD22RhxhqvsBRGBP1l47zu252+M5RCGRlH8UVfsYa4f7noitG6P6J1NSbFn6tuLFbePpjm19jgiXrrqvL/lBFH9hR1HKqmDn9Pqd8IVvTRMLWcGM2wodhuMAy9WFqDKDTbppuP8gj2yxmWnVv6O4PISNnnF/UNyq+pjul0HUIB/VRVwcnl+gNXykLSXq1cpoq4rnBRXESLrWOPa2230QdVFss83MHjWoCAn8snNHQ9SGP0+mxsOLd6Hdr+0ZHM/KIzQT5cX2Fb/qI9Lh51IqyVePV0fru+yznPQ398g73MoWKlmOG76h9fb583Vv5xxZqyRLfLQX5jKcQjRpxntc+wW/gbfAu+M2e/XyFKf9d2OlU2OKmFpU7G7PizPpBceqyI4ZZrGajUkQ0ZDLDafKm5k67c5DuyOwGgrKc12tLm1CQS5Zei6Rf7iGRt8m2YSx+YEL98cZX4HrSG45RNnM8oMiAyCAHQA76zSE+zuObxwRt8jmdKLcuMJHtfoaZRSnGYcU9QZEJIRtrkXIkdWpcQ8nPHPv3Am6x8r3S15u5cbOKzsclhYMf6FCB9zCbxVdqotvQTa8i91juqmyGsoEbHQ64/vlnbDe5/nVctPuz6z0yLT1WSBBF+FzPIL7yCl0bcHlnBuEUl+pcnfe8Pvv0iu7ZzuQFIJTtY92oR81wv3KsSDknC9TYvHmvbOUgIxST8r4J2nEouy9WX1SoS11t0Hc2Fs3RjeFtHhCOauf1r/iIVNsD55cvWaCx/cy5tBe8JQHo8hVTCWOsCdCI5Y1tDyozs4pXjDFnFkGucpAxWKq5F/2xTA3DeNWT54YzqFPEiCNEbLojkx/e/FuhU5XASs6zXdiv/m73YTLtiPCo3fjnhtJtVJykg4lzbhvsuTmYPCo9jNXjU42tQJklqGCAi8ajP6Hku6Iq1mBK+ea1GKVBzyzGQZpt4q+Wmh9Z8hNssofibAu9CVHWPQZaGfOQJlOQ0PjgPQi5Pzu2/xD2DVLWaKXRLnt9FmwllYA8YSkuLSDN+FnRkREYcNKkHf+4Xlxl7zFbIhPMhtP7HlddLwvlSJaGzzoyBL5A+H6FfRxEOqpTndYvJzKUFjJYP1LMQRTWl3KhJ+A1F2QNxr1fKWmrfWyH+hCJDTpoMSqq1HlUq+rzMul+T6CQxz5kIooj62PqGXiAEe95VYNkYl1nbTgo1+waeUaWWRsXHcFtP0CdCyT+7ct22kMMwxrAqQny9jiBCd49hXXy+5ZapHyzf1/yslX/AplDLCcGlPmNKkQbpysBBTuDNslbGnMMjjESWXgK+BoD3PNI+0xnzyBsMHAnw3fYUHPWa8FiziMFuxIK5VfZVYmt8YtOqnBhQt5/WjIATd081BPR1NwhoJHhIqImpR6xWQbzmCQNLE5fl4sdgcaDQ56oEfxzvnjyZdMUjCICz3dfFVli43MgHWvLJ46JpMhe9fu40gtMp4Yvk0DF9nmpxoizkvInFJOKfDGvr//2GUXM+dRZ68Jwv0od2JpuoN3z8IfEpvVpcjscl58qKRAZnQZs14HPlvjtN20PajN1gJ7ww6R2uzL4JHB4OTrk2m5oHQ3hQ46QgOd5zMtA5XXmtz5O9D16uBVymSvXuvZlK3kjglA6hJtvHD5r9CBn9lhe1lTLLL3BET12MWtBrful5HGbI60Xv+sd55YmaGNmJVvGqMl1CPOdekd/u+8JHtwsaN21fGYYmp0I8aKL9IXl/aRYeeRdGCaWtHyIC3U8+GaohgE8r5RC/FKR57zh5JW1r8LDTq2ywW4uVUsBtJwCfcOnnxISx3LU95Vd6Rw+CSOhU3xFQ/mGRKiC/tpmiiWWFg3G9DQfPZdCvZ7NyFShk49bb7mucx2Fl0kJGbYxszBnBl0dQ3o0aPBNNRll0IlQNnfCHlNOVFzcQfBMfA97J7lgw8REmUUImdqyXTG6dKIr9P0XvmiMRVIMWVXoJHISl4iT8G40+ckeTyathPoUSh1/mCOpId2Vs4x2rRzMt0Ybzongkmp09hST4BX8/Duk8IXuuZDrEbVIF3P3diRXooiZ/o4BKmGvM6Fj5h++B1EVkt1ka7Li5S9t46TNY6ysfbvre0Gw1jP2i/cwIhoDeNL3KkQYUr0OPHODGydam3FRWkk/rVbWC5Y6pNDQpz2fK+2L2vu7wlbnTT6HwZZIFqqbHRMv3W06EPROMiwI3UFB/ah230zZ5HhOPBk+3LopXnL9STJxAITfj0bo2NT1jXf7EBgH4J5MZ2j2SUq7dPVsHkE3x1nsnbWDSqLRXiwCkA+qFR/FXHrXXeEKk9N/9jTI+rKxzk2z0/NCYkgpimZWYv0J+okKi3uSygY+eEpgkcz+o5ZnGb3v58E99WJHK0QGPemxFNl373pc0AiZg5HIGIIOugaFmJKpuGC9j/fQbEPMbS+I3UUi5DWlvNk2dU2sNSg2NNe7pbrmkyas1kmfGtL10pCJNXDPTPmyMNJW6wtdoOCjUR1f7ywEB7+VLotIzgTOXxtV399m7CHudeNmvIoPy4jg1vFSNFAElLrO8kndaeDTj2DNDorvevKDzbZ/hlodIlRHS9KkmRAJvtCh8ty8ZiqnKtK2Uc+ZsD92a0JvV73ng/ZylI5q+TUgvIVxYbhJK+EJ7a+o3E4/O3iuvQ8bv5F8U39OqsK2TvFYk59xHTlHIAYwTBksu0APGBnwyHiZOPK68Vam4EwKTshnNNM7l6OgQDSILNPq8uCS6VsKT6Wb3N7OqV+uxr/hgrIU1OmEATU4GsOGcT8BbZwe0TzxmFs9UCrGq9fMri+uheGcV8Ne331dLSUzy/zFEIGGrY7NaHnYw+SRkjf8Q7vEPq8h3r/jSmzmZZ7+9M5XbtcrqyigOYNIFA+p4NOrGHVsBpvDByBCeJNgHKckkRH6VzSiaCEShYv5r/p+9OKgPUqv3xYw8jTHtttuiz9dAl6sl3Vg1wmlDMjUSfA8oLEE5ukL8R40pfU2AyeDe9ncmJDxFCPgNdM2xuJO4n6T9JPbvXeEnqK7+6QuT8MVOVuyNxnuLUn3mxeoc/PpKEWqRQWQCnfaSmcuq8x3+rMQSw5i8jqWw2lUKT6HIkIe1/E30WY9VgdoPL5PccmT75idDvlDiI+nsaoows3S+fys7rq1BgPxqaxu6m/zPiBNVBkmTNGVjb6JSuleobYaZc5PeYGBCoKvo5CcGE7vlxV0A9Wsyr6NIz6NKWGUCtY+pD8doau2WE4P2OxjyIcRdwbFA0B76HjyI6uiemB5ovBSZADB3gpc7oxV/2qwmNeUmzaIcurqiJj3lYumWpK/2VKFBrJHWlCN3cQx3HawfkhQPHyIZktiNUHJ9N1LOXMw295edTyBtYDpXax9IzJw/JPvjrA4I1u8Ehpx1KVhbAwst7mkncGGTgtGe9aHI2H5PbdLunj1tdKt6bTB8H6lx7MsgWAt6Zrp083GsuX29xauA3RXPWOkPfVwavZHfvT2Nojt7xqO3rV1gprYnbfWIR0Socjos9RyzgMiMZcbunvqJ7uOPViTfX62XxUmPG3V4kTIcQpMccVZb1+7MNVO7+9F4mf3fu79fmqp5oKy32EbQXISaqLBGOwVDZlYUxx6KeyzTHRBJlmErcAJPchM7P2OViL002kEU4I5OXEZmqyVnqLYjP+zU/DBIh7b6XcWq4w4DocbCzBTdJX1One18yhlWMut71GIfTUb9wb82N4sWP7acUA25lKioRns5oN8SoJV+KLK7oe7iAjCp9FEte0tIL+w1Qd2jH9zAEWx3X+84g01s3cKQFu2y2glj0bn2Gq4eEkgHizRy8TKeBfU7gLvl1YjFYurKFktM6XBQC+qzBvJTS8x9J0pE9/j5q5xNoNLqHP+PYWSt2tcjtF3MXl6I8WkLDjngBgGOYfU6lwJ4wM1crlOrBI8XDXtxKyai89RezH6dU9YFlEcqwuftDDCChcEJhHEY9K60aTNL6UXqlMSeK8D8GAcdHMb0+RIEmHEFAHGMTcJDH1BmSFglqNUwweNs+1bwr0VmHg9ObcTL3xdl0qRd8ik4+w5JD3dV9Px/IUysFWW1QdOkKXXylTy1l9hHxwUXXZ9xJ30vhl9IEhptHrRE191Po6LOg25+QXqwh+74q5z1IiBK++VqK/Lc+JHCoLm4/MEWsAZqc/5eEvUQoe3iXiptGkssuwzbmlSmj7JMzQEMZRWqThPLPEjszPXdciYYVBI65p3wHOkD6pIMwoCdkhU4x2xhzXp9SDozIK0XxWQSCGKatv1E2fyx2MfRSMi1rtU+LPrdp1rjeP2+ZWK+Vy+oryE5s44iYYwSCY+6KWbYATMCULImQtLXAINzuJaRadLjKiDSIpHPhJRKvBEk2XP/3w4HFH/kJBlyyGWKbxHQxxsXLd+SKDuPSNkhRl5lEp/Z/1BbD2J1jPcXFzVUrB6p8h4No5pjhy9P999Yc9+GVmePKGWQbCqllWjDmqkD0pIaZzPT5fE4Ls65/aDGAejcrDlMcUPdwjp94hSN4kG5yzo+ZNz+srKQZJEJDt9B2Q2+DgxX3zJsC4UDoS5Z6NZuOkUth9w5oQZ4cOCGbnavRZES3E2YLPjpsUXzgz0yFo6km8QK0iYTZ8wY1IikxMuJxLIi0qYfctu1LWVnN8jWlJhfoj9Xe5RBSTMbauMPaWjZjFluf2F6tqThGSKfzkSEJFzeNsQ78C+ZwNAd/Ce+Q5Uz976SOlwb7+LvaFSA/WyEobv0eeh4sagPHyHZgvhaRGV/flV+8t8L1+FbJ8Tbw3HaOEUJudlweSvX0sBC5nXBcEsgRoZcIwjeKI06J1RCYYDM0Y92eY6m/nkBcobRY4rOGb9Z2yJVvEddvHrDu1zSFKSsSgNjvCHEs78lzVXJJh78ydqGDBCX3YhEg6xf4xn6zQSQePy+pAm2EtoLTcLNKu5vhDtZBtURelvfsXC/DCU0eCrB63GRTayLyGIow+cWj7DA+/uPUgGCseehMVcaYvClOH0oqm/D/9dnA8vt844+AEUU6TUif1jKZYlTsAPb1MdYjEwm+2R/JiTUZyNS+XBabPQq+4YW3LPcffBFhrN31kbJlZrEc2u75d0wovQVP92nr8C9hnTWjzydMi3eijnwwsgeXRpKKfHqTPA12q6KfHFlyjArga3hwMCbYmL4rfdHiRw8XPTEe2hnPIME/dtleK4rZIUKR3fpE2R+leZq1AlWp0bxF+17tkO7k5JPPjqnbc8vRgnpQ72jroYsbVJzscPJW2RvLM0JbaQJLnrVn2KGrLyX+fBl8AXLsaObtgWngNo2mgA5eu13bV/qLfjL7JsudGPQj1T8AyHI1e2rbwvdyKI96Hs3IIZcd0H37My8JxMrLtOrj8b9RtJJ5SEQC5JccuF56L2Hp68OpcBil6eLVNl565dojlwqL+3g5LCRUKZ6MkSweNqlJWnKLhj/vH0wVbrckDaTLzavrE8iyzYZfPoT+kEeFHphr/rSstLWmury/dzr1vr3Fr0dRXWsVAm5tCgpdgUBPOmyVuYaDcCgrUrJNx68BCKiVDy7XphO6awptC85ZBa+EXXZBfdYzIXkPJb3FalCgl50Dqbh+GU+E5lDmEiPtCkSG6grRdBRvKkTdJ/NjL8ACxhEBwZsWoOoDCukfgUGv3qyIaMpAGx/7WLu4boM+ERRvNaEPFzlK2hrxBz/HqoQfIeLeYJ7Uh0hZ0NhO9sg3KG3WmwRPdMHrsR09UX8ZH+rRNPGe3XNKcMiu6bOeIsO/QbcKbQZSrPe8u7tS+Nt67ze6CgvTyCZXkKZ8cZEehyCcJs9yxQZtbGS1JOin4Pij3KOmSy7yOU/4i+jmPBB3YNoztpdY2khkveCnAqSileVGbCIJkDG1xlBWn6VAJEcRXKI2KkV3Y2FR2pxIVb6iLa8MVN6A4bm/tzF+bH1fazWlcsHirFRL2aD4P0q2Rh8BE8zipcFLXpJZpAncnDBYHBcaPDyF6j+oj86Oal+rNVH/Ly/RqI5lfvBeRyIuwxaS7N3C86zlre4PpFJRik0LaPFugvwm1LIQEhvITNNZ8wlScmXmyq0eRnrBQLcXCj4sZyE4qVy0viY0KlSEvr9xXpq1zRvvWZdNgRDY2XVQY+JJdnaf96v45DoeJP/UE5jzmf1NCk3z7ZsFR4ID5ppkUkNdyoGZcANlepezO4kfiQWZ/kEqAthWdBRd/8EOvPG7mq/Y3LG5qapNftoKKeLN5B9ivtjt1L2C8ZaIoVLQ8HIjspdnk/P7pfH1DdE+ZEaviwavOYD2f14A6FPIkvPfFCyYUkmULcxq5+Fuf5IVHN+4vXYvfEWoP8KZ7MznS0LOjUzU3b1EjyRUpReBcNVkULQArjlUZaes6tE0zTzz+pI6oDd+t2ej9GCkbn2jdRxEDCVm16tX/06XRIhWK3L5MiVbeQyUu7DgzJ6yEn1amJiE11SLOwMuMPXKEedeU2LapEbEuBoXiokvOCuXtwJqrMVL4QoXpxcOiHHHrE16WdSrMlcAdqE/uQs25bhuMlSTnfu35XMuDzxDSvJfWSG4xDB92QZQoOwN2eBjEKTnEGdJbsEoh9eWrE+1XWuEBWJkYFv43yTSR/yvArwUR7Uau/xAHmDH6rFxDN8gP0yBPUnvROunaNX+Bm5X35SGNmzMUTCH/xLrwzsibniRiBYm0T3ZlylWhvMHzZ0k3hKSQ85Kfo1NJuHoGctxRFFQD/LvjrR8XRVQETN5jQVBcVRJjNWaXufdYAsMosjr2vaAulfdt0QXcGDuENh9kUGoAMD2h6izZs7Gq8rePtgFyXZu5eiWTEQgnyG9y8Sz2JIcBdYGFfPrghWRjQvx+LsjCfCOAdl+jXfFROo95ROAUmIXz/iXZnfF4aIz6cPqBZ2CGPPZQYiaVMYkM0bEy09nsTZlMmtkto/040cn+ryPvDAnXDo3S2ymb4WavU3nTP72Uxa7Zqhd2nJNJUreQtDkfRPKpJqlNL3l8YIjFPox/HEp/ViOv7EgBWCCUJaKTIUBHmVeBt5pk1acK46XfMhKHvrK5rz0F7VCZRUuRXZMeYQRETcbbSOy3jDfl8t19f0QWJJwiXfGhBXquGzW2qMa881Yta4pPx46qXsi8zHBIwosa79SXk2p2IuYzcIQy/aJwWm7HRfwHV3U61otn9ZtG4jqopBPzzLDfHIftDPKovT7TlE9Rvpp0sU0osmqe52LcFdrhweMj7BiLBLuFahtigMj5zP2apOh5pMeobH9m5LzfBfp5ZkAcFCObB3DGVocsPrh1K+KNt1QUc6PDSq7O7xWco48PLmdIn7nGST0PA4Ql1XyUSmZBdjHl+b85FnQvGtJL6968jJZHFDJqwz2ytWNFyggNbfXZXez9Dtao62RQrSySHVGlbEca4V9+XU6IJJTjm7XMhyD14aKImG+kOx0RKhRVISabDc+F5Z7pQ/lpU+izty6z0Ja6Q4wL9PmsrrTz9RWIwsemFZnVIYimI3vC9lu0kgiuCxEIeUaNsDi5l6IiKsNyqh14iyV4hj0v8vNKnBowxmb2sPaYxcWVwJpHNbzY+e3bHZ5t8eJXuQ4udhPn3Wx6bRTexT4onGGXU4Nj6k1NKb9SACm5vhdW7fFTLnYLXI8W5bX4rsXdxh8s//LPSk0POQPHd1HuSMmUjmUnr+S74aewL4k2/f8ywYJ7wVzTzPDAi7n4q1CBMHlsvR03MT2c8a/LJudP4JtdD0PBgir9FQRQivubQ6J625+uW743XYQ3LU70zT3sR1NyWcibilLg7ZtC+dsujaJwoBVIhk+LQiKiUKfGpbTfw7c08EF4mRPY484WUa5lcHmo8/NGTYT4jotHSdZP7mMrfik89zfNplSY2zgNjpazeF/JpMxIaXPjFbKBu7/UY7fMs00Z09TELbLuX1bcrJb786ZPvekWoz7FNaDZhHuoS39fwBh2tspBsI1GMN/gm/U4HESRPplS2XSSJvIvm6u6+Uzy/36dH34UKwMJocyboLkZpd/UmR9ZNwLTSbaXpcMcz4ef5JaVkgphnx3Oqge/4/lYbTpYf8gTkcD/wOY8+o220cNWysM+F9lWWyX14YlA55YeTmQeoPAU7k5Nt68wYtKo2XXGaoy0w9/ilRbTsSXKDe2yEXbLJvWHlCF2osIhewUdCTiYzXTKDRRQJjrBTboMRjDu/ao3uLbBVVHDmKqvBFk71FHiK+0Q496z3lOrom8Sl7WfyG8YQDIPzHjVyWnVlZuQEDqy2uiaXHl5MjdDJXkXOsdDQbLmQGvRBI0UtUf1q5NcPKlGYHYlkuC1/7Q1hTQhacWRMCPsWz+lxHsigW1vygMVxGoCdH+73Bcugr8GqWzDRDUGTF6bRZD+yp1T0WI1k/acCexfBtNeymD5p1yuVnRBxh7iQfq8VKaQrmlnBaJi7H130k936zmo/VJI0l2pd+ndzaZ0EAeghrcVvRl5WIpvGLNtFh17Gjyfw89Fqki1ZNos7Q8TsQiFvhJ/ZD+gkZcQbTPeHxssZGKbOut+rDwoEsH26orKY4inG/up+t3j7JdB8T6LWvi7cAkdgsPZ6SUx5NT/5By6+8hMfzxUcRVpQ2QNiNnVyyZcSxbbfy1fFSCI9HVlI7Cct6Ab3yoQTLsZstj9jwMxLK4fOjeJpvbU5qjGMxQMHmHJBGHqtnB9/aWaTfuwPbjprUmjL2dMgMxFbHRcvsOLs+/zBNAtz7rEfo4/x3foIey/ejdq2AU1jzCM57tjsnLtaGrxYz1mZsgyyAqpnebBGvGf1B6T1lO2f3ol0umx340U0a5BDdfadwSnuQBsygKw3cJNLNPzQrFVKy5XTOyKa9id9/QgvkgXAinI9oVX3s1vih4B3fZpgyrZXA/IuuMwtlbJUvz2OK5LN1G44Qd4k8uGD7X3MrATmpaN6cChZFQeEwlAkgQCzYSAeBehXMOYvUyPmiE8Qly7Ee3LrEDHG/TVxml2bEvEcX2vrIlMVvIA4Iy60PwbX6n5h87j06TYLPDL16mxkNNf5ypw4FCTTAYlLKZEk6o+RnzUNCM0nmII9w+LqMmFF6eQ2/XnJu3od8ykNJi/08FYJEzSJBGz5GP37Kfaa1LVhPtoZ2y1rclpDwzJumY4LYbbmMGBfjUw5ojaCIze2s3KboDwT906nLKuiivN9R4ZiiX6rRcANzaawmiYaDPs6tSloW3PLtiiu1EsYSqzYIiT8wFu+eyUwcwqQzdFz3r5jjXIa6mfFxeK7hjNlwu7SUlTLFLZk/0gr+qMx3jqAcw2e6vDXyJYqZmOGabryjg1m281O2wq2+9p6070+CnHctkWVdectUQF7fBeJopn5UwnfqHYaMcGPjGuFpYJMOs8jvsM9dJ9dzPfwY5HvtHUM1DldLlfrcnchcEIDuQpwT/z1tpP6Jt75KFGNsyC3wDLxfxlpfk8QsdpVtIg9raZO8H2AA75EqLLfWFl2JhRFqQO/SM+XU5BugHZ/54GHFeWDZ6pJyFSKb7r5HbDqIxvRsjPU+acgmiE6mzzsLRYOipQxDBYWyi/Y9dKtwm7KYfa3d2q3C8slKKjkN8KpIluve/39FQDFA37nVT3Yw/rUA7ntVcoa/ASKS+49GLomRn/NL/xF+7l3W/pOOsCrASdEIytNPTB5gQpse4EHmBB3Oq+LnGzKiZdyhXw/C9Mhr5YXYmlGbJllELYgVvOxrN6Rj/N70XTx622hY/eID+1oGaaGAmUV5H2tYEejKS4Lr/0uIKQUwg5BJk7Nq/qY7rUtT64zQo7aTy8N9VtfwvceQ35Lw53drvyIGYnqh9/fTy9+Rp2Wq+lqaxW1cxsW9v/q0RHk7q/73HhC28en5d8FWSTx6dujAio0RcCwM9Xc9xJWhuQVbuPxWwC/xmSZFMK3QKQQL5uaRBM6/qfRjg8wnASo454mGph+Xs4dBefRzXg9xtPzfXaYftxr6Ff6M4bk4oVlOx3YxR+yU4TFyYhpU2NKfxxVRInXaqEs7q8sf8+Qqz/PZhSU5GdYai+4Rlu9zHCTYZrBidBoJ+lAm+tW0u+Or+l2DyRsgbwIjVqXXlxBevVBn//eGRs+3yMoFgCa5Y8eHbha7Hj41kobLMQYW5bWa0cfce5fHelB4ZEGpb7rmP/SQMMXnsUflk8Sl7RKdiNh3hQXC3ciZM+Uz8ty0ZuSPyyjw+V+S7Hp94V0I+kO5RmV3iBHoGs5PZj8yY6kOkNshRpxhKfHGa7CBF3uUzFUmNLXSiborcUcyyEJhMMDSGhzscauhlMaNB9XSj54dRfy3npjjfKD8zamlpITNipTx6SPwbH+1ZQwrFfqcmPkhQZ4Mf2PwwWJweMZHzMq4gNWniwLW5jCrCEbQ3wR3KwuqSCijf00YbdnMvf6KqRzhz99LCgqXm4mLbuIJzXXlM+SIGwtBS7O8YuWROHbmCFAj1DBhED7IYhcKW78zP6pJTNo+Jv7Z6QFix5UVc3zYhK71OxR/0Ppif+lxYI+2jcEoUp2Q3gnekx6Kyoy9qZgEAxHmZKbak591IDe+pkw7nUuy9kDZFFqPu6hm8g3mCcbz64cyP72vB1HayIB9R3cGrQaf6sGViUDSrSZqtJCylMhWUp1LNGGro+wTvQ/JhzNHS5cHHjqdrnP2jHIVuuCBrdTBTO8x2XKO1krZZU0Tb88MwkRHpbyuBjbr62lseWIFMyVDMtaKaHqNd+2lfRT1zqblmTwVUxEwDi16N99j3SvrOSRwK3VYwt9/LiTBSQU3P98zvT8mExXUXfLaGwQUms6JZq04Xxz1DaqSa3bRlBEC/lRpIMEaHA+7fApw6BvoR7dw3Lk7KYy4f3m5IUPx5U/gjd7IMUz5BzadkKbBRU8qgFdKlyQDjhpSDqvxfw258gibECq3/z13hxy4tZApg1Q1BXOEcBDp8208XA0PSXMNI4NMWtl70YwnXhTRIVcy1yEliQCPU9pVBRa0n8liGv2PHqTj4/aBJkZJQf/nRpInGNaX+S8rBEemiXZognQKD5GuIUvS7JFhHrZjNLZGh5Ebpgzuk0DnT+2ojL2xya6pXyDrc9cQVhg4EDsHt/2+VmHk7K1RR8eEi1Mp0OxTvfO+Xf1F9vj+gz0zMSJGbrOa3Z/FfN4uVquWlm5CjX+jDAhPYl4k51Dzr0TfcqBVcNSxwdTi3KMGJLyAt5ryanDClbW67FcXVktbluX+Yr7h7od11O4bF3P9Yc674gInxEbLTrrUng1Mwb/acRkDtwTORGkHzkUnmTYEjeKQiMyw7VaQjyasE3nkx0u+OpbbDLLzNbbfd+wk+nEs6qDe8Jm5b39rVweDXPpG/eZa+3yEIc3Y2nHDziZNr/kPDfCYL0jpBlCGhelw4ez+63vfIWuROrrmBUwyEuRbe1bwoC5o2dxnfDJjUzqgtsR8LWCNMvZSpV5reYZHTT3m3wQ1+r6QaLnK36pksTLpLpcJW3vJ7mCVzgbufvSu3NyhB0YXmB4KDMeLyLnjsWDDLnbQ9kdiTyV9kcQ9pAOT+S5LUrnqPB7knwiDyb0bB/un+qXsEi7NTLRnnsp97FslI05qO1kdvvZP5a45QEnFE/GYpkVlNg6tE/+zAOStj8+GSMWl2c9xlII+n87hkJyWF1774y3sVSJaNzLNgVmm4RwdhxDNOijCf2KidgEicVlvtdc8RqkR2OAU0Ohi0Q4bx+Tqt/KZNO1GCuSATPZBDzeJy0pOGsPFKbclvEUUyggd0aXqgv+gcZ+mEOMcZrightxl9z9pH0JeV+ukEuf9p0cu7qTmyghrXIef6E/FG94oTYrKyz/PRLLg82xzhm6uDCizWvheRioil/cdWkKEClo1X46AH4uuCTs8JyqfXQO/ohyZqxpLbSLwFyIIP1x3LPekR+7cKhOKLZCij1ZzU9aqrtcaeE8QV/dR/nBwATNu3rwKm3BKYGpSxB2OGYGjmwlqCvZffzJYB6C5uwEaF94AyJSr/NRwvZAEH8+IT0DLqCSIDXX+gPHOpWE2Knl/D36KDhkOx6dl52ABWHQn26nJgBji6OOQPMQxKxf5QkN8k+7B89F1bFaGebwOPOqVnEjeWY6HCGvBYR2yP7zUwbyijWYwlcf1HzSj0K+iiUZCXvjKsWyUMYdm/X32hGwxuj64FPSWYzKc8n4U/i2o0P3h2rX16eAogjXkJRSIcLEj6HqgXh5QA+DYcyO5ZURtxX49gSIlEwAVN0Y0SLqAs6BX9yYW39uAbhwFKqXI72SSw58t02EGUN4FXi59R0w8CXPR6OdgcskJGyZU7p/keF99kVzvPChk6D5LoOQu4Oqye9hVeqOIrnYL/Eb1iv3kYw5oTrOOXBKYkSvlH25eDd0wmICSMqKpzWuvSmnzkHW0x5GC/LhEfrYTzCjBzfp5UJqc+W/K+zp97syWVFYKYDErCsslOa0YgPgqcaqsOaajrWPpgFTCyng4FznFlsArfYKLyxMDSp5C8V5I8cKyPIVfEvXpeOP88i06dN2rhWtLyXhtWfpVq8PdeadTbvAqYOktqqmLGra+eubot556u3U98NsONsMaPqDdz2wwHRn6681RtAPtIqp3Uhf0JVc/Ed3LjxcVLsS9c/cHS7xRcdpkBXXU8ZLDp7giiAxJQd5rGaujhp4hj5jX72cDGQbfLXHwPvkSbJLeyC2TyjmMNdcI6V2AqI67cV06zEVOcrbfMYhGOJa9dyp409Iv8JfjDhqNUCWzNLad2pgn+ePQqmyOn4qED7HKaiQf5+2FOEUN/vOJQW/3EY+sQHfD7/hY/TtJJ2Pc41zcH/InfBPcgm0ohHQj9WvuMxfYncS1izzbyEDTwYZItoy4bW2koOAuFJ5Fte9cWoqdtvKHRaMBMplmuNDNs/5oKDH9EBacRQoZ030aCYohPh4Q3QZZd4VyRuzh128cSWFz/OXwD2ZkkPCJY8oXGIp1Wxd6QllrLJrlXQ0H3sexXh+Hc1v2RAY0HUC1ammB0VlYeiMheDBDRhyXjXK3ktIRWkE0oZKoUWuzY5p5wJ1a8ZMBRaDamwT3TzlDjwauSAB/zUvrSHNEoqBM19AeGYVTysVQHC7Vp6UH3t1OdrI/uBLGbMpnetjN4s072abv+ahooauTJwcH1sAZF1wGmlgpLXZhSVXkp8GwnyXtAAcxWbKbY4Cl09+K+JvLX2R+bpPnzL9DJUS3EBjgpadWnUdfZMkPOjggezNzpjWRottD0ob5sSrhlLis+wRZmTlNU4pA2y6r8TDBpDqa69Bl3QHu98u+i7ZpDjn8oR/KY/B8yXJVTE35bQpajjEMteMnCMxF9GFJgH7vtTatmt+bqghhdEhAcB2DJQiFRe+LkNchEIv4DIAw4NWIOUJzDuxoY6D2OtbyMu4dXHO28CUtZdViHaD9DWSvTDN6XOPLPcGWXVd19LHfWXiQ2m1T3n8RXuBVK9RBwVVuKrMEvD2Y93LhTuzJBcE8/dXbJywk15ijgYSqLaxSkTrpJDGuu4hB/KjjU3Kk0ieVaJr4S6o6aY4GJC3Q1cSz3VYYzT9AvABu61FE7BA1vWin1NJgOp2i+aMlE0nwSnAoFgBu6ZlDy4Sr14Y9fEjnn7HJLNPxzu3ogGb7J25uP0HV80cdfQXgnVqD/uMyiz25dBDW7kKyBvZp3TEifYweVeQuwwFChUkAgRdfqKkL05GoH1zOAU9notdNBSf3mik86pDHsek+cOBa5ZLlP+B7tICy27o6hg+kqFtDt7z8KKJ6HAzG2zEDjqxkpIBwxrJryWzz7KMWoB9lOOuTatD1pfITDPXxQy4ymFmSoVHUU0KlLiM/R2OT2YU32Ag8nZzwwXCW1sF6JM1Bh/RfOlZOAa6TcbuL83SxH6cQYNhpTk5Z/sWakZ+4/cmpB9zEXDP6CGKF0sOcX+6dMGJXw2HdpyHkPmawy2PdI1V/oPiKtGGGRwj5Rti8CwoxfSDxJ6iFXhR8fIxNge4vEVuDEAmMV4kDih9ZOXOVIYlFD29MN4zmL4ngJJB85TfP0fKM/3m1ZMPrVyzFuEt+l1vD1jX84hwdnCSkHTyZWwpTuODN1uefXiJzbBFUnk6vrLar0u8ZLLnbAI6/ix6Le+nJ+8ppkM72M8gLYUSAufA5jGMFnuJOcN8Q9UJ2EZL3a6P6KhwcLS4RBZat9V2Eyrkx3IuRCqMaDSSWrdCbogoLwuGZMS3ObxjOIgU3y1FJt6LIRR97UFlO/cJpcQyxGKrRIVaw+0VvKes3VJWwsgtkxZIZ0PzmDmqdezJXUytrQTJDVLclgoyWE99Hd0jFmGN55ejFlOVmp4m/Mydtf8hGGXswJmSZNo7jW3yddtjpUhAgSp+eufR3rknY+650Vbk8++guJRNyN6L5I3xdSH97BoNmou19qFN4tbXwwvDnDQPr6YfpvjLGBELuxJGdiZx0uuWeXvu4deLIgaebCxekZLUU7Z75lFRvLR9Q6EKlFRGUocsGVSfzLQD8qmnmnwoMK3O1J43t8uY4VdkUyxY/bqRr/ttr3P8ZGGigcUZLBo2ByRdCHupPcDJw31NX2TdT1k/TA0ACDy0TXfoQeE/eR0/TRY2UX70grH6tHpeXf8Y1t1TosAj2ouvdpUq3fItuFVJgn2cKtE/ufkH5M/n544A2p254rQsFb7fxfEQCbNxDV9wTo3ZQFS0fRpgCJnVneShAxSLgheZLXKqMQ5DkkfJLmw4eTW52YbmvCuXuVYY/M/Iukm29P4c5x865gTWZBGapMXrXzwyRhDsdnT2oq2M3Rfu9iwhE2h2fhSgBGiHHaDBqUxX26m2wxdsYsoSq47zRj+74p4Wjzr135NDTkjHvNLWNLezkc/8JA/UCkexTSfYw4QXUtkmqmh1RCHWFQqLn0ndWiv0r5/Zy91u6wi5VFVnKTr6dvZLPVLirJBAWpIxx/M1xauxdLa0Is25DK4WmuWuaHXyHIH0h2ZvI2lcdPdT3iCnXuN8NuLBkIr5ZL2wbjHoAKaZVNQjcSr2qB6f5ptNfE4v3kJNWaAMdbuHTpigvfckij8kplW6lqqpE7rSKK3HvVZ9SnD7GocaP7VW1vZ3TCMBELgH8fP3+FncO1/jySTO+gax7B2sAitbF2+u4o4Kux08d4YO16cFHV8n3vkhNhv0ZtiG6qkwf2Sx3w7ZZXM31SjuA0VHv5cKn4KZ7eoUcNG52MwUpXWFGpjMMjUJkBpbGvV+Koqsn2Eyxnr5e9dZQZTkeitdf8pPeUhinc6ytMIB0ZFUsmwpG2t56KJT38QHUiriKcU0bJSeNb6u3DvSag1r9a4zFs8CIp2Erwa6i2HhCIxOzgBMKt92kEp+788106vXRsBRE3WP9IeYLc+sfqkilM/ZkcBBtP+ZPs4oaGA5yviJaH3cJSn9aeIR5sfljv6w3QVfiLIYA86wp8Xnjayj+vReI7xxU4gbrFEvyal09sTPR2H8uvhMSZcPqMFQSPkzHYPsBzZavgw3v9pDtNnhTomiFGGdU+K2N6ZlNAWe+oTk4dyGkkaDfOG32M6hJhhtNmI27ewac3bv3COjc0e9femqzZLdTANgiprYkeEhNmJvL+7xJ8r2omx0PounJr5X+yzgdyYgqkA1hiEe2ayrmycZsuDAS850FE1xY8zDnqgWnLTIx4GUj3k5obmRV8Uv1IBFJLxqWVTCm8oR5RnOgnMb0sFMrucshODxGjn/ovIFgjHO+RgPz0AUFlrg+f4meZ75VtgTbVSVrfIi2zDOsB/j4dRekm9rL+lT3AC8ly2OUwRPaRtUsTF+2OSwyhap3HO8hUlmPUS5Nsrhvf/HUnXVb9o5yuBHHTzaEOJpbZ5LnYfCdhHMNheSrpsJyx14Bde4QRWXOOvwzhR3SuUFq7BFMyZvf2Mh5JPLSayimIUujpLJ4ASUCnGT3wWm/DylutQs3cIfNnZ/1CGNs214jiDmG8tfXaXuSkDOClWRkyCFY3hdU7uf9rlikjmvaUIXaltF0TjhtVlS5vRbVhdLCrcT8CBMIbOlaSmUAkScfkcBZ3ocrTBdbq9mt6n8XmvuR2Uc/GkXh3t8UtxzIT5eJdZThFxlm3Ou92hi2+w6MPzipdReAdV7mMF9pqlbE0EKM486oFiobzMoUXWINSJDs7PeHYoPPz1uYQd5tLBcynwiJbIlV2k/JxGVywrtXsGmd8AeHeEO1gJb5QyN6yf5rvVQrMRiPQYX0zWTx49p+uXIQiTT1Rqx1FCLlPiqoBSI1qO1fUMzQZ/Y2JgZZBk7QCcJwct7CsWxMUf3P6tldzsXx2y3Z848INzKXS0cwwkLObEpvtY/doZs1+Odc7ohxVpowCGX2VRLnLE/NXGT4OZKHkyLJrVpHtOf6cW8+I6sNnEfKi6mzByOfOaW3zJyFdU8JKbWWkGJitwIRWuhIcCr9lJX7pzU08GCePT2D78SflzbWi693kkFOaoJLZFTs7ci2OMOvy5a+jeT4PRauWprRofMfNCUUW8OMoZagSXpz0hHJ+QIfHM3chkWY3d/gwtDQ8sOFU1Wi2HYNQD5V92AnkUho5L2qzE3h1Irwu0GF4Dfgu+j8klQ8G9buehbS1QZscYgSYMJCesX/ffvkI9qZSUhZHWgvokQXwhjNqGxMAU6CAESxfO4ghL7qz1l+c1X08ztHH/apN5UkxCNhmJn5q+1hMzzgNMXpdogJZL8MhSEcW4+Ep+df6UgYe+n79wEMrdSeGhgNFTrQC6uHnB/v2TN//n/AEGINnUKZW5kc3RyZWFtCmVuZG9iagozNCAwIG9iaiA8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9US0pISEkrQ01SOQovRmxhZ3MgNAovRm9udEJCb3ggWy0zOSAtMjUwIDEwMzYgNzUwXQovQXNjZW50IDY5NAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk0Ci9JdGFsaWNBbmdsZSAwCi9TdGVtViA3NAovWEhlaWdodCA0MzEKL0NoYXJTZXQgKC9DL0gvTC9QL1MvVC9YL2EvYi9icmFja2V0bGVmdC9icmFja2V0cmlnaHQvYy9jb21tYS9kL2UvZWlnaHQvZXhjbGFtL2YvZm91ci9nL2gvaHlwaGVuL2kvay9sL20vbi9uaW5lL28vb25lL3AvcGVyaW9kL3Ivcy90L3Uvdi93L3gveS96ZXJvKQovRm9udEZpbGUgMzMgMCBSCj4+IGVuZG9iagozNSAwIG9iaiA8PAovTGVuZ3RoMSAxNDA4Ci9MZW5ndGgyIDYwMzkKL0xlbmd0aDMgMAovTGVuZ3RoIDY5OTggICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjajXgHVFPr0jYC0qQjSDcgvSYgvXeQ3kFqSAIEQoIkdJBepTfpCEoHAeldqQLSBQEVpChdelFBvujx3HvP/f+1vm9lrWS/M8/MvM87z+y9VzjZDIwFlaAoB5g6CokRBAkBpQEqusaWICAACBQVAgJFSDg5TeAYBOxvOwmnGcwDDUchpf8DoeIBA2OwNlUwBgvURSEB9zwRAJAoACQuDZKQBgIBIkCg1N9AlIc0QBXsBYcCdIUA91BIGJqEUwXl7usBd3LGYOv8fQnggfACQFJSEgK/wwFKbjAPOASMBOiCMc4wN2xFCBgBMEZB4DCM7z9S8Mg6YzDu0sLC3t7eQmA3tBDKw0meVwDgDcc4A4xgaJiHFwwK+EUZoAd2g/2hJkTCCTBxhqP/chijHDHeYA8YAGtAwCEwJBob4omEwjwA2OoAYy0dgL47DPkXWOcvgADgz+EAQEKgf6X7E/0rERz5OxgMgaDc3MFIXzjSCeAIR8AA+uo6QhgfjAAAjIT+AoIRaBQ2HuwFhiPADljA762DAepKhgAwluEffmiIB9wdgxZCwxG/OAr/SoM9ZjUkVAXl5gZDYtAkv/anCveAQbDn7iv8p7muSJQ30v/vlSMcCXX8RQPq6S5sioQ/8IRpqf7BYE0k/7Y5wTAAMaCUuLgYCAB7AID5QJyFfxUw8XWH/Xb+NmM5BPq7o9wBjlgasEC4Iwz7Q+KPBnvBABgPT1ig/386/rkiAYEAUDgEA3CAOcGRJP/OjjXDHP9aY/vvAfcBWAGx8gMBgL8+/7qywSoMikIifP8N/91iYVM1rfuW5vx/KP/LqayM8gH4C4pIAQSlxIEAEAgkDpCQEAME/jPPv07gb/a/rQZg+J/d/UdGLaQjCiD1Fwns6f1NxOuPMnj+jA0v4J8V9FBYPcMAPP+WvzVQDAjBfoH+z0PwO+T/p/1fWf5X+f/3jtQ9EYjffp6/AP+PH+wGR/j+QWD17InBzoYuCjshyP+GmsP+GmhdGBTu6fbfXi0MGDsjSkgnrM4FQXeFgHf/ssPR6nAfGNQAjoE4/6Wlv5uBrYGAI2EGKDT8130HGwUE/pcPO3oQV+y9BY1t2W8XDDtZ/6yrhoSgoL9GUERMHAD28AD7kmAVgF2JAfxB2FmFwnx+SxwgLIREYbAhACzHQIAjyoPkV2NFAcJgNJYzHO2K7YPzLyfJPwpAPD08sDP4WwnY6n+vfw88DOYDg5DMz6IgMuEuL8I7zmuVmLwFP48SLC13xSRZ9keLYbjePfF31iHM1ph6oGwPraYfeWwwVx45ORvAxPf1fMzH+lVuyGKGZgEGR61/VXlfsHDo29ErJxgrFMXoNC7xOGaVai/ZkIXC3grfijvVfPYiQqJHdP35l2eXXej1+1LbADdAySklWwYTJl4pv2sb95ElG8cyZtjSmjKB2sMq09NEy3T8EvcRPOFMuSOO4ZvvqlVC1vDHj69zB/ofix4WaffWiFdH0jDc9LvHlj+SMshAm5x7rxmNw6UsdqpSnp7EzlDsFsm1iGcvsfhjumigPXlQ1LPRSU8l5Ib+wzdNnvUosVm5/J7FQ2a7tRyTb8Jk9C0pMc4CtY85lDlroDinw5l7NaKIgl58OlYAQX3X+yvdaVRp2ZmlDu5CUxzhwzBR2y8T9Of28dnJIBGbdDmE5OCnp8riBghW9xFH84UL2XQADSMnjYEWnh6by7LnyB0BoZOn/fBKi9upyOONltcdwz1R+yiOryy0UyFJFp3Z231byc1aYqdvqcz41MQxddrvUN12vIn5idNBRgX5+AbtXRoy9xWl5ibYE81EKQpNqN6Z6KzjZOoRW0pHKAVPU5LTuH4tZ3m+UCX+5olcaItcumQw8OH7if1rqoY7iZR1qzcMe75dt01y8NgXFiGy1S7ouu9sX6rHfQ9zNwnetJ10saFsORWyLzG7WKD80zTIjqbsoXWBY/yPhJP148a9Agul+uj7iJi07qmgVbunb1g67w8kMGe+nNjp7eROX/fRbPx+ir9P4zCsIT3IHl6MqGxKFGtT+ThAG2NqNQDW6ThuIfLoeePYdPyNFGR1JnN3LcTddqNRb8/9R8UDZVUANQX3XISU6Gq1bjCXlD8+abRZkCrZiSQ1GXiiMVRkFimE4+zYRLKGUNBeoCvatuJ41BJLVf9dw33/tJf5I01bHbPwvUE/yBlecai65A8vA9EPn4Qt9MVf+yqhuuu+PtxetzF/wKQaqttKEG15d6n0KLKFqsgyceZNkYWB2r7OpciqnUjrjerWcpRmuj8J6JbPFMPNoS3u7g5PhoB2FNn56XdzvdssRtlqaYclu1mtidO4xz+40lYzEbfVr+isg3SocI2cQc9Z1fMdDkqqxwP5oxBkKuc2gJLi9z08ROHMXo4zqDB+x3H6XN3t3dv1gWcIBWYI32I0+9dq2yCjqi82FW6Ra5Rv4aXh2hX6Q1MJbFo34l5Mv/ixTn9iRPXTDjNtLpPV/eYgc9BTkedOBYbvTSnN9A3TJ7n+AasnJ4aBYNHP6mUIvPSuI0kf/ComwmdTmBRNc6WynuoVmXq2BbPFiZ9kKm3DN8PMUPWP33u15e+kKPTUp92WScutkxv5IC8QPrBaWtllzV75rSk9+9ak0e51LyOV9Lli/FxDVWcSBvJpRTuB/EG6kVyKTldqungHR8S6kta5gS1uRX2W93w2TQlUa0jTz5UHciYa5vMjiTV2KGTHeNjUQKve0V97rHwUzRhB+nXUsqajcFd4x+tV4rhVYeuPOdYWHU79QsXtLM2wyFRq2UUD7oR7T0feB3klzwgMcDSwO5uW6ioc128rLKe6882GS3iRv7sl994AhA5c1aBIVXymlyJmuy+aHmPyuV7SsS0SwOhrWBIV1qrPG95AVgWUmP4yxUkeQRyuQfrse4qR31OaoyPHTf+oCVsqVecPx7JrRf5ZWSvK6SNbs4HfXw7M56NFHLlVjnwXV2rtBp9PP1e0gbBKptYhGSUecIcxfLmmHX1x11Vf7tbuz0rFWVNAStkHhMBHA5Tao8VbX1xx32bxkUsQPcCzWmAj2Dn73jw2tzFtjWoPtX3H0cwV9/no0IZKEpGeuNaMbuUKD38lnLSyYsubzWbyuS8YTHaEu1z1dX6ifpkupNOYvVAmcSP9wtMWxziGREnsMEtcWY7qfZEX8n2WySpRdVZi3XgHe8TkWTmNjTDBqGBQoH/05MCQYsF0Bv8j5mw4+bXLcgh4zB059H61YfrTjH8FmV55KM6eMyf6W8Xmfj4Ap/Xdst4zutC1z1VmC2tjg2Hd4PJsm+MNhRkBUtzdQwdMISI105lSPPlKP9qrx66UwGjzTb1UkjHAFs9gl83Q/Yz4VRLTWauH+FnHK5ni+vsZG90Da15zrFKupL5UCXSNmim+7jKMqkPvVgGpLgy7oNwJ6X2jcJuqjzkOfhoqCuycoQGwj8XebBt1GaPi8SPFRgYbHF+aW6WvOt/yDnUmqN2Z2yiGclf1fu5mEmxtIn0tgiPM1A/gPEgIjJrvZoqb+3CL1G0koub+BWNfkQ655PjL4/l4yMhR4zjq5jxuVWyOjmbx2zbtD8dHTfm8mSeED/L5372HWPqm94+2FxfkXCOhsdN9E3dpL6hYTwikNiO4ZOI+zh2vmzgtxxiXDT2jgCp8rLOgxafhCbMMi+g7c9Uzb7R8uas+J7uhHFifsela/76XcMlol2dhZtxWZI6TEoirdHG54xbejhM3RrGJCHALQ02/3im/y2D4uY22OrzQN48mIDVxwes29R7/w6RnBax9aWqNkIS3L+bxUnQHtt8JV5+y0G1j5iLwLjRh2ZHzBioNm156X9fZNcQDSUt2yL4SFuTbNIIKlW4lvYxL4w9Yr+VZazWbOViK1SirQkiEajsymd/0W/QosNuV+6HB7s9dcXck0kIXUMLTTd+bXhe5x+An/KG+ad5vSqf3fnhAa4zqNdaBu4IU35aBarvuTbGM942/txwpDS5HVRFF179eZphrUVpLa33ViUF01Y1pXhZa4ZiE+KDHdItYIgxi+BqewGDliSWOJV043q4LUfSs55ogXgmiskQ4e/xE714oB5Bl7mdIQ2WvmQK8m5o6xu9oXXKgP6C7WB565eJrkh0f0tto5jb45fEyw4PSN04qwwzJR8l7cy/bsq9J+V1v/2wSrbIYJNyHediW3J8Zeb0UxcK3+1gqbsBjfEbrUSHKpcZ0V/uUxselsE2IWIBg9JzfAVQ7++KAtFcrB6Gqs2d4H0805KzJQBCJOu447OSWnbDsXCKACe6AhM/J4wokQuL41MTuPIZGHTxDJWT426hUyHP8xFMn9nNim4jme4pqw5m+7hL7VlDvR8juaPFoNepQMrFf29vQ6WO8ey4fyJaGPFRoNjY6b6xnu45Uxyzm4fHrq4tzN7KbCPAYmQ3nzR0h9hL7pPZyu+eGzXDmIMY195en/Qmsw4SE6BRcMV8hi7BEPOap0ee8B1+Yi0wKd3FKTqEg7YIi18rKN7EuH4Mqi4iYkEC/WxUaz1mWbz+IaU7cBpebG25y+oVP09970Tpn8YyxqEcUo+UL7Ot6KoQ/fSem3yr1zjOWMNU7am9DU9zda9T5KstO6hYzvfY89KehY0gJ5I1nVFN4jlJhfDVMOxbSJ13r8oMd2dJ8o4s6LI64o/G0vVIpXOAUFxl+Fn/admAUMe/EglKKU2+tNt9WiIV2D+57syZuv/n7R2+UWBZ4iZFfT8dv1M+YdKRR9WYlvdcZWyK/t713uGmrCi+7tCrZl0bL5n1oEelhO7i5aBr1PSAHJ+MOwTcxs/Btx0nT2K0HBiGBZxdTAXJXcdnY95keMf0Ag16CDXS21EEpa0Lg2udUPhIWfid3pWCBWoFXcgEulSJiVCpDoRI5JzOkKXsZNY2P55gpg4Q2hdXLmJiGWkeARRkYo9zltlhcIXZmbxipMyNDN7lB8BPY2qyb++HXe1GoBsXaupWMkCu7/S2lqSDR0hVD2s1uZVaz44cc+1JqRW10SS5yJI9sFACVG3n+3tdr7CjERM+K1b86TXfX381TztpYy9lRKqukXu588GJ8f4Ti9tLLxcm7jYSxrFHPkia+gp4bONK/Ja46Epg17i8QP17tuM78xONZqVXyx1de9p9IOxrrfsTfOu4O8jnT4LgqYAov3hoXCixsHbvxJq257NaH8S710aw0SG1ddnKoHH31K0e2W9du8410VggRCK97E/TFGEm28SjOzz/K9iODtHQq9upxabk9zv/4VN6C7bVbOuxgWHEMQUdufsU+ZaaiuXGeJ/nW9dZM8nVZ3/NcPU8ycBrhVnFZZ79QycAeLkavobgvGiHygrLFVUnLJor3lu45RVCTcdGXK8uMeWQjY2g8AUFW4gxXGZ9tAstgMvcFRBGHYoX+gqt5KEB2aaz/2eOzLtZJxt1a6qut+Qr+NAh5dXCTbOFDX263HbRslulmiJQ7m10Xbqlhx8LJGneJXo5Gw97y9Ux5ctz+stGXLjYN1MgjUQv5e4V+CvOqu8FyeucR1zodkGQs8f4PbjlY8sizz0vybTzqGhp1LfMVPUetxJ7jfAAEH8VorvaQJap6r7Se2zwLJu1kSqLdhj7xV0uhHS7ufeQdMs+wnEUlxEFrtrzuzIjJPfVz5XB15bC5u11Di78PcWwp/F5D2a6Cb56heDhy9EM07/Sx+22EYc2TVMMvWTH4DstltMLuR9caj54wm6Q+6FKflMS3+zmjRJXSjdymMXxLeFXkpp3gz+UnIzvTnU8Q4na4agWXeDNO17Cd+/SAm4/u8oFFsMk15CFGlmkmzvVQmEihXMSNgTd/ZNzxuLVmN315pejc9w7Pao0954J/BRNlKVuHIWuuMJALveTTeuy4rlzJXzXj8WhPbWnPCjO54KSvzRxv+JTjO8cLuZuMn0Lf5SpsQRVFIbyUNqIVjBnkWzPMMzicfLqBmsy9jFmbxfkyKtCny5nXhzzcOxlqQTddLgvUqRgpu6MhEWgWTPquBvfZiop1Rps7L3417ynBz1y729lURbx1Mzyt33OKG2/o6raRNNaHkz0Y8OJqqhk+U1n6LKqH06RzH13vbWLg6Z9Mh+5oG689N8h/xC+YV11eaProcZ36iem5AXu79lhkJH9lx5RlF0yCRgFYyZN+SgSHMjFl6zTIOLkSSr2i5rHUEkyKQ9g/P/kqYz9Du/5FaYJIU7rh+ZNlS00WB1Bq40q75qB/i3fYoJGt5WQ2A7kAyRMO9bK3GZqq84dmjAruh4S+k49bbxoscqrLtYf2DA4oRxGczp8WamjPGTjXP9RrsGrB1xq224oOViHaN6HzW5xyJF4nlp3OSIu7CLlmfxf7VFYDzd7j7rhc/shhH2hETEARSrgQZF0WTLWiJ+LqWAQ+QnnekxDNC6Lcajj0Wt7qPg7Sfm/un6s7vSiq8C4xvlz30OabtDmDzE0qr9tJEZSZ1y1WZK6HK99OIY4ptaBJFDJY1pJRKGAzeRYNELrRjKbbwTs1tVl7HpYiN2kR+/PGZYpYw8vYYI9gXYy8r1xNJN9qiIMKXtdDW7JOTD+TkkddIYK76by/JP3i6Jr18dlcwRCzTgjudlihQSqXBAZDgXvqqeEno+10d+FoMp5VptmTl32zXub7B+P0jB6vzpH9ixOVh/UK3ffC2oVT1NnFTYVqgfLrBLjH/B+0DafDgQzsw9OVk3LbIQfozcXdMB/UPZvldxVsb7wvxPU/CgU+yg/GbI8EiVHtF5mtjJTX81dRFTdXVb+8YJGIrTdFh2Y/ny0f8F3/PNyXSmhSEKcidqHh4bRiStBHKfaGIzHqcRxXQG1iY3cs0cP0jxoVa3OS+Y+3yAprCHS9Pi/xuNzClIatLgHIDsaLkAe7OTZjNv2GuG/M6SP055IZo93IheKeJlTvExtZdd2ayETpybrc+UL0kzt0va8DVE0zR/5SJvA2xX6EtW5QHmSWR3oOllincBoRuUpzP+suq3a0UxR+ef/Gs57ydQoaxbhck6o0wAw3+JSdc0A7wN5QO/BT0evVQ0/VyNzUGPLAI67gyz5JKaHL2dL2dQdGL2UIf5BaN78C6ZBYSTQXQurYotVAfgLpdEyspb4urdCDSZtLIjA21R+DDJC7iKi4WRV/qtSXkA9xNf/uWlxU3ok7YlHDHfbiK0sJXS4FbY+saemLd3rvJXVQUJf36HfkopRR8qRZd5gYDzImMdwW6VBaKX41ibp9vTUCoixonKR/v81hnFtrnnAUw42BA8r89ncJtMVQRi+GR5a4kQSWGac/b3uj3GmON7PYstT6DPIk1BVQ9ON9LgYUUiuH1ew5r5xSlWPz4sb65w2+JhzLKNsaJuqXp4p+6+ZTviFaH+aJbMfjaF7SGiDfuiqw0yeA/bR/S3I7k+Plkn1ooKAUraFwX/Fn3XpYcL7C3KvBoa2p2sZrrJQ7zmt4NrElDvvdxJeb7VuVdlsispPnoxkD/PiUOxjmnopaq/HcumiGe4U/y/UVn3HqJmuFLm6SYUoa57wIwiJnrBlbhR1WJ3sPdc3UaYeBYldj/K5an0XMpeQdMwLLmwGUE+d9TceimKimyqu2QpeKyJLeAPbShi/HX5NmSQoGh6xop3VinQtwEyypaet551BiEq60Sz9T73AGEWqmWOMIVPmMBRyja9A+u8Wa+bLq2lSra1Fz10d3nUtvtN4Xn6CPwHETWJx0NhY0v0+dSI43do+eu7n2bFiubO2Dt97nvHowokI6huNcX2zJYC3cu9duIkYNGMumvSgaMzHCbvt58pvTg59SwDpHtQEeGXd2uZ/DjpB3QjmuGujdGZWR7ZDVWGL9bwfb9tTDRKXuKZn+LUtlWuK3VDK0L1XwhL1r89xuElZ+GDZ+y/Hc8AfrpIrOcdFRcgudT6Y38aeuEpYI9ZbFnOtcZA/Zw9fUUuVHIwOaZOzxKfpJvX5wnt9eqDGx2oXMEtjshcJwY9k1HpsyusQvVRKE+8buY7x8ZqQ9oYbJdJ73fe1uvjCBsqdWPHXgX3+lH2kzh6jx+cQt7n24Km7xQoWyW1WbVZ+Q4VWUYw6Pk6K3jWOJWdZIj9VW0MPtOJD6t01WWwolUa8q4sEV/RyvqRrmJpFrXqQkft8/m7Qsfh8Bzn+86XDnNOeaVY6f73jKDAc+DFT13nVG7DHUSGnHnqc/QtE/Se66r7l89370mvz35Jp1X8Uv/VetpsvfiX7/pdCrKTMI8c/Yl/VVdpAoR7Bx+SS27V9XLI96u5dOJAgtxH/f6bm2ZY3TM4r7hT0z6Izb8+twAC2b/HvRH8CG+Fu9HU9tZ56n0fPOZAn6N+snttbqz34XoTQq62mg8Hm9sU10O9qwn+jYW9lpInml49L4sj0/h/1dBSLHYf/UT6a1LlPLd8Za7d31VyNbMe4eZa66pM2KBIo9MK6XT0TTMxG9wzEY47MvfZwsIbu8G8LuRoPni/MvK9jpRRo9STLVYCli5/x987Xo0vuH3IxEN+taS08yP607RBu+YDzerzVGUBe49J8CkhgY/Qi9GHAoF4NXHnIK0Wj7WevdLIwNX79YPaNT2yIUWIWZiUxRyeneQtHw3hQMuQcZNPv0THqK0XReZLJFfggU/e51KjtFt6F525Mw/cuTyeS7fPp+P9qEIC1HLpC0Skuui6UPc3PjNIk7W3LbEtRplvRZDafnr/e3BJTEkMNaS+qx6cK5ChdvYrOWyWzAaKEGPb71FyZt9YBJqaSr0SYFORPWKcZP7BtuSwDWKqdrTzwqDr2gH/V8MH1rPM4Cqot5OTd77Mp6NrxIRn0PmGmWM+35N+fNFVD4UJngyufMTVz5OK8rlfK0eu1dqerOj5G+3j45DF/D+jvEuvviS6YF304iaPBqffN+Zn4nPTemvs5w/9tmysIgAtGcf0IP+1JLfZh3Oi0qV/HZVTxhUbjHxQJP9XJ39NsAjeNJdFDdOpDCJ3NF1d2WaKljiVTstMr4rY5xvBlDmOnG4SjgBXcsEI1yPtKqdal9lX0t6ojl0+xmtl2NykFqqTPF5A8EiTOaNV2vir6EqCz/WKJoKK+0KX4DovWWe+fTVvxke9P4686LzjVi4IsjtqICxUP/cmOgwEoYrfpkhlFltHKjAX8bjuQ6b80dDriFAwc82dQvQlqTGZV9e1fIddJrZ+DEOZbNJqe6sRK68DTeCP9BhcPuBZG+8tURp9obk83U3NyF2ciUCOYDrkKqhGNkglTjng6RaFxWPRl/5Zfo9ISGNMo2P4zA1ToVO7UNYTmVtV1mUCquOvZBGC77SGNSjTWRPXQMggcSL+lXm7LjwWUQo/EhOOzn2ncgx106YSNWsAbR8FkX/Q9W6JGrCmVuZHN0cmVhbQplbmRvYmoKMzYgMCBvYmogPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Gb250TmFtZSAvVUVJWllXK0NNU1kxMAovRmxhZ3MgNAovRm9udEJCb3ggWy0yOSAtOTYwIDExMTYgNzc1XQovQXNjZW50IDc1MAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk0Ci9JdGFsaWNBbmdsZSAtMTQKL1N0ZW1WIDQwCi9YSGVpZ2h0IDQzMQovQ2hhclNldCAoL2FzdGVyaXNrbWF0aCkKL0ZvbnRGaWxlIDM1IDAgUgo+PiBlbmRvYmoKMzcgMCBvYmogPDwKL0xlbmd0aDEgMTM5OQovTGVuZ3RoMiA2MDg1Ci9MZW5ndGgzIDAKL0xlbmd0aCA3MDQ3ICAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o12B1RTa9MuAtKrNBGQANIhJPSq0ntvUhQCCRAhCSShhCIovfcivQgoXQSp0hTpCAgIKE2lg9JBpPxRz/nOf75717p37bX23u/MMzPv884ze21eLiNTUWUoygGmgUJiRcFAkDxAVd/UShoAAkkAQSBxCl5eMzjWDfaXmYLXAobGwFFI+f8FUEXDIFi8TQ2CxeP0UUiAjqcbACwBAEvLg2XkQSCAOAgk9zcQhZYHqEG84FCAPhCgg0LCMBS8qih3HBru7ILFl/n7FSDgKAgAy8nJiPwOBygjYGi4IwQJ0IdgXWAIfEVHiBvAFOUIh2Fx/0ohoOiCxbrLi4l5e3sDIQgMEIV2vikoAvCGY10AJjAMDO0FgwJ+EQYYQBCwP8yAFLwAMxc45o/dFOWE9YagYQC8wQ3uCENi8BGeSCgMDcAXB5hq6wEM3WHIP2C9PwARwF9nAwADwf9J91f0r0Rw5O9giKMjCuEOQeLgSGeAE9wNBjDU0ANifbAiAAgS+gsIccOg8PEQLwjcDeKAB/zeOQSgoWwMgOAJ/kUP44iGu2MxQAzc7RdFsV9p8KesjoSqohAIGBKLofi1PzU4GuaIP3ac2J/OuiJR3ki/vxZOcCTU6RcJqKe7mDkS7uEJ01b7C4I3Ufxjc4ZhAVIgOWlpSRkAzAMA83F0EfuV3gznDvvtBP8y4xkE+Lmj3AFOeBKwALgTDP+g8MNAvGAALNoTFuD3vx3/XlGAwQAo3BELcIA5w5EU/2THm2FOf9b45qPhPgAbEF57YADo1/Wft7t4eUFRSDfcP/Df/RXTNDe0NNMV/sP4Pz4VFZQPwE9UEiAqJymLl6u4HEBGVhoQ8O8s/+H/N/ffViMI/K+9gf5JqI10QgHk/lDAn93fNLz+UoXAXxMjCPh3BQMUXsowgMA/yrcFSYEc8Tfw/7f+f4f832T/K8v/S/n/vSENTze3326B3/7/ww1BwN1wfwHwSvbE4qdCH4WfDeR/Qy1hfyZZHwaFeyL+26uNheCnQxnpjFe4KFgSCJL8Y4djNOA+MKgRHOvo8kdHf7cCX8MNjoQZoTDwXx8cfBQI9F8+/NA5uuI/Khh8w367YPiZ+ndddaQjCvpr+MSlpAEQNBqCowDhNSYuJQXwA+OnFArz+S1vgBgQicLiQwB4jgEAJxSa4ldbJQBiEAyeMxzjiu+Cyy8nxb8KOHqi0fjp+60DfPW/179HHQbzgTlSTE+iHBVC7teGtB7XKLN5iy4NkcwvtkUmWHVHSGH5PuT7ueiRZmqOeajYQyuvDqQbTT0LG530ZxP6djzsY9uZ/XAuTSsPS6De/UVlW7Sg78depzPsOhR1zfmdTHrkF/rvicYctPY2xDb8yZaTp6EyXRIrVctPztowK9ZyGwAEoOSQjiuNDRurnNu2QRhtxXVjEdtvZUsXdwVtk+Fppm3+7owwGh53pNIaw/oD98Um7nH/7Gxv9tvudIndQt3X1dKVYQysjL46XLkDST2sTInZOg0YAj4VqUPVZ6kJ3KzFiDC+OSJE7TiYnf1G3BtWEAJQyn5/QBkecSkJrZWvdH3zfpVSq2LiIGLy6b5v6traSI7bPGPk65nHodaOZ8XefncZDG32CZcAzKodt2zIMkZZrODMGtU8O8e+lYHuB2kEWaPddBcbdE2QMr4E7PRZAj0SA3yk+GCofsCQxNezzSC8tpOEXDd7xcVucfTQ4mKfv3nGg8RpiS/L+6mQD/LFOtb6TdXklazG7ZdPCKV5HjCktZqU5y8jjjUXUzrYgQUQferU6IZm/x7bOSIB8jUL8OyEC/DB5dI9tZhhrUP989AJGdLsW9ZSSs9SbXX1MwxsKmpLMNJP51fvyNNGjLx6KhWaP6S9qKjyssUhnZ9anTncsL05o61ViLNVXHVTgWz1Fq8/uj0Yd71067G2EMdnYvCoaVxsZaprN00WtjZ+I9rUk+rgmTChXMEI5UKqtDbikQ1NgagrCfCRJWk0XfKu/PDngepnrLU037K5nPYJrqRuyun3sohgwqH7V9vLIebsN+a0+PQ2F+06JhWvRvRBxH8GdTMosGwJHsiKjPPKSz3/VmzwlWoDaWMxSd+gEhn3lejVrWBJJgnOOlc1kQq29mWOLrf1XTRisGt9aHd3uVXuZwZv5VmiSX7egDVRoeKCg6FvoGRVjYVQ5Nu24esVmhy+7Zrc9tmLoIOsVu73npsp7g/oBB/yX6GgUJ6Hse/0bOurX3ocLsFASOSYMJOgqz6vTIfWYGwbryWhqXypfpqxAN7Ya5kXoJKtPKHrZTyXWxgYba0pneQHU7AXf7oOFsOpLH0K8rNzgYae3n1eaeZ+KQqX0ZvkkHpqsijEA9RM1qL7Sh8BUs7cICAkZ7Cxc2EQuMTS/9rkNNLdj4Frm8pch1lt1Yps6WJEQAvdw8bW+l73JMCeUepOpfzjt8L3I15xSkhXPrvM0LSj1OM6GtJpyez5YkvyDqHL9xWPUTesFppssenFKoeux30tav+fDoiSH3lhpwjEzYCC7Z4cSoXkjLCuxhlFjPHnlpe1ULWcvBCupvNRHirymqwo5VcVfAVywYcGNdPrYVxS2elJtipaQlphK8BZiRP6qC5eKoKLsmjnlyWGm8ETOYq6DsbT8RZZLTuc68YHPvqgR5lf67/n003n6tFWu/XS7R/0bQ4HzXJRNotZta3UKK6hBeO0CqDKJXWUChKTRRvlURbU56/TtDkQYU/iVLgCvh8RhSglnSx3RnvZSWbWIjCLyzLlFYtrl0cIWd/rhzhI2AGqijHMoywfI6nortfBbcEXRlA2tHlPyz3PLvAMevt7k8haRJTi+tTrR1mUcLrruDs/LbH30j4bqSdAHnEXYTiytIhiHKlXHJ+7tmIHfnKuGMlt7gykvYUCYysaprWxN3ruUuoe31xbjFo5lnVw+3iZfW2/6lOUtH71JiufboE5BhhLKRj3zEh6Wj2eZCLdozC+TwoFI2bVelUadtiN+QAe8GX7IHUS8hCiC2qYxp7KvtnkuK5W50j0aFRNIJsswz1IJGQzfjKI5c1wx6c6lvACCekj25eKD+b9Ys76KESkaqRItotuBvoPBLN396VoMn7Su0harJJWW/c5dX0QmFg9EUv7NUwwieeDULdpCiFY7fv91w9+tozPUNtk+dymZavppBAvSr0qPJgn4GBZHcsdPc2TSb5eyPjF7WYeNViSqO/DEz+EKt/YS+VlqTg4mlw+MVLQ79vJ99Win85NcDtmYf2wA2Oyu8p9mlzDyuz7FK3XugZzxr6r1Q7kfZKVDLjKfXO7TOUhQnEVerx9HgC0CtsqdSsCgqPHdVXBocfK63O7l4Ib2bOXJIuFYBp3glJuTjrFBUkKuspSpr4/Tb1iEHfDXubny/SMe7QpxQx6ThcFH07kU6LT7cvcSq9QvnlkDFW6ytXTmmvn7vEpI8rnnPCwqSGbfNqWLXqVpo5djt7vKbfhmJSfXM+8bMUxg0ih95A6H6vZpRLUcre29r1kkkUBZrajNW0mqi8bCeS7Bi72glMLt88d/AOpgy5pJtl5kjXvHvjnKRtzf37onUGCatQjBYu2N1zN1uGL/dx+Y/g7O5zR5NLrwIKVFS29ca/xxsPww55ui5tstm0Ha+FgYlsQcSW1mOIYTmvTX3q+9Lbf45yzNzEKTSxblz77aVDzCdIzgUD9ompSN+5113Y8nhB6L6Sze6PRTjZnt5jn6LoEB3kTvDSUrruJmWMxySxV3XGCslKkIczhUs0rC1xaobvriFCWMESmwuhV7eYlpWYeixGCq2QH4cpMvExDc7Z5nQzsCeJscwM/p9n3FEHFd31Rwq0bR6eTDa8aQYdjq559F/I255WFl9kb6xO1F/S/nhioEFVVP09meP0ybVbTuKt/7VtBSG1LhNUkxLI+wsNfd/KlzOGaBlkF1xno3nnoVw6FjiE+noCKi8FhMu1S674njLt0nbEsedQD7VfDkrocdaeM1V+V73WTsVe2BBHLzRf1hzfMM9Dy8MUeeVPZ7g34BqDkDHdlf/Zbc2A0buZqvI5V/Ob/Kbcj8pLpzJ1Pkhvn4+mnln3sN/2PB6Y8RzK+WOwurJPKWqKK2yZkLdNcXwzEQFtjFKT4Su19PiTto1ghBTLWCJrq3Ox9YaMsipS1ZFIlmmkXEhoKpae6kOAIG+tmj74UD1KNcMfryrxaU/lEL6GONdItD0XW+68R9dSEfmQJjdr2OZp727BeFGt2n8etMH+kzsw+vDQ28Qln/W65AOOQ5d1dDHSfkdJO1+An26zXkLrMlXpyhxo+rqKgiOSvELIVJbCn3iXfZfok7nbhg4wicRxRZ7F9rhIv0Ce+afTY7UTf+W1wPavmTMD7afHbN3L3b4U8knVa293KWiBjfLGHDnJuYZyIne9KC460quOKsi8LPCJRRKQ2exIQhDMX/Ci+l0ksN1dLDOJpL7pP+WbG8EbHADLXvUCzQW63rJ6KO/BphX+KxM/yABKBYi0im5yw+0SzVQ6FQPT0j+X6awScM5Zviax1NKU4HFO3nTwVGtx5xPKauhgnl546K9BecwgLcxHceAxw2qJqsmdMNX7sW1ga83MQqYV6o/hslRj1tWr2TrFl6NE00c6FcccLxVlnTibrhQ8GbXvh+g3EjVycE1xq0o/KV3nP3uKuzd4vXPO42x2DrdbNY4DsEM4YMXC30DOvWgUvqkaYCTwLOVCgiy+Magvwzuw66U/1/jB0J2LQVjgFVkNSdqP+hZqqZUVg9WVu1Rqz/S+921hFyQP+9g+kKf1uUIJbAzsUU6VRLKtq4lyNwqgVWirFm7HN4zsFpwlb4yFXfOmxD9T00mdM3lPT08qEUXpwE3VLrhCIu8dZ3DcHUUL8qY4WbxTO8hCILFRDSvPfemrQG5xuVhKtSfl2FzbTfzQpDtLIE+fgER+cVqNou3z/no+a2tip9vE7hIHfyZoiSVQlT4+DzTAp6JxygDfqcE17Irb2wpB9PqVHoTD+aq/1BOdM+tcjEcRcgxvp+13gBBdTeSRfBA0BdeISy6T1fuLjOlFT8QqNKp/KweetTjUNmLCki0RkEwDwlJC4taDnpMi0pi45t3JBbL/8HEgQKD3zyjAPSPA+35wwZoTGI1DpiX83dG1Wk8c1oQJ41m5va/tiNCwoa5DAa32+qad+3Mrj9CgA5LEBssNde17ScoQ4wr6+MI0U/V4fN29871kHaqe4pqC4L4fMFNZDZeFHygSgHfUS9oV7ywDrrKvkk4RjGF1bcrJ7pVoCk+bv4uSSclgeLN2yBCtoTvtnpRyJxRCduN6xtGUYg1gg619IysssDBtTbqE0GfxGhJEtlfmZ0FSEzKzp9LkW52UI9c8bQ7GPXuoLFVtmYZY7cyveET/RU0GhCeIOlUgJmp329VIyF6Js7UQ77lcuLbT3DAvk23TfVeDvCqa8kgZce9r7Y69u9fVC7IWuqIBjPiIUW1yiOdlhP6/0zUvJUe9ns967CMy7x4/HPiGuJrRiftAATdoU/K5ETaYxMS20sLK+VjSfoJBLCzo7+yYYraPRGMBgkpHqOp4d+QroMuOmVfSwRXJoz8CDA8XA2OSr87EfZucgv9PlpzGNzHlKXW2lBvYNqrXBVSgM1xFfckgZSnqfV3mW0hplwkYyySVNGR4ZRSxaX35av79UEXA/7NRGKpLrczJV65Oib/kSr9dzfGJW6aOtziqOC1y03aVielDYemGO2QrR3o4Y0P5Yvzdlrn/qJLcRVY5JUGalpVnAi+AynfRBbw8+1sy3InnuWulQXjCffvX6hOyYXs72bMeqX2Bp/2fRLta2G2Np5/6nAhmzRuGyOo9h5WlGJR20Hx2Ew39C5/oj7lxgPqle1WWJePZZA2dDWqktzc98vJ6y4vOKiWQk4N33nkGvexJn7qFk7cZ3zq2MNJF5sxvEhXrtA4Nf6/MRFMepZalmFPS72uMDLoI0hbyV9z67DdpRXJlPKwzQXTNhhPVKf+9KLS87yxo7/+q7mxpBLn1k4f7cfb2efz5qj+fN0ojU6FzYC1t+odkPJzLirfd0SCXzbuxeBt6Zi5197TZNPqJ9qeABJ+0FYtK19LES6RyW99ZVQqmnk3T3ZqhVGz64iWFshW98MGX2yZ3tmCQVYk6mAy4vfnKKS0vFEPRYH5m5iU4f5PfmL3ME/xACQc2/beDCy7Joa9ero7/7x3y55suHSOhuz7NPO6VpD9JtXaLsK4gbGWHUrvqc+mpM1Utg2C9NcOnuI5EtgaSuvNUE+CkyR76f15SKo6DywWS0A0itKtvHOL4Yzu9bTPs6Z5WL7vygGLSRoW9duFRn5dhV881A6sNeBaUCW1gF+0DnyqnZ4gyOxSdamVuUxodYTaTUr8rr/TvVss47ZmlMwr59y7w/ZnYmiwyuSNunkD7mTfpB06oPdB13k+VWsup836Z1WBHVfauempc0lDzK9za53aFpz1cnA9DOoX3RJzK52arJr9JNznIBpurZclebrAMRhV5fceW0R0MHOznWH6SqIQ+ZCgKR5rM/TK5HVhQrCBgvPdnVwoRJmccyy/YMUAutd9oXyIfs8RVJp7h2WwdZV34caq4u7ErdDC4pu08NJoUhervnyPqf3cOV1kXJ1mu5xiPvpWp9YWmeuGNYpHP54XPRqcvpcyrXtn3YTzR4X+g7ACojbdOJOgjMU/ausbWWONwS6HOE67VTQyp2JA92bwPUed3J0S6GnaBlM9p3uQkRpChfnORD0xOT3sy3BsdnwHmzM1fLLiyriWPKe95ZIUn6J/V87WyT0ZIxJ0D2b62PNarNNApgAq++63qaT0Y2Md+WJZA6+CEjF7wmvx69olhpYJ5WjQsMMchKWZk0x6lQ9DOdHvOsk8ul3/voxnmdxKOuhTmca7pIbgDtNyTzqmc1zk4789E5gFUs8Qe0XIZsynRkoCsQbFEDNuFFjBMmi0JaPF6ReQgEmWZUJRJyeAK/RBDSx5tdefyw1r2kaPMCwWx5SJT0tkC4U1/BGPWoOdEiOfjumucsn2W74tTCG1Hr8yS7idDxwRWYH3xEckHn/bzQ9fdvsqW/toragjkPv4Q8dF59YsZIKP+hWY0sXaGw15Yu76SD4Q0zrfO7SFRjQdHUzHuIddgjos0RdUzwbWms0y5Njp+9/GcC7FireHknj+heCZSSLSDuSUR4R0yPgVY50zCg8f7hm9CutcaaV6SEss6PvTJQ51uCnFSNyeoeQp0Pn79VG3tPJEE6x8Cb08RDtXUT6OI7sPz6+uBNYresbBpMZxrY+oJ7D8T30UQ/kOp0Yhqoy5C8lzW3HSHDbzVlkFGQSDMYiGMAsXxKySUUoq8CJAcJr4slzYSX0NyZhb8x0Jp82ggp+EEunog4yNUAtNYUmTUw5ryJp/riRBNNL9LYpP3U1npI7b4eGY08fDLB/2ai70744SrF8iZHkEYtNiFlpYrT+SSJacukz2HpPrQMRzs3coiItfsZz9Wyyh+ZHcQ4LgQwO7nCGgx4gBMMOOxtBa+ocqZ/aOFJW5PfZuQX96qPEmXJciL5TlL7rMzd9VbKm4Rhpskp+mHf06uM75ZDNxfe1hUKZeFUIXbL9BE3P66ndG1acB+MGB4Kk4wbohi9rgEyvSR8vOPfeFP2R8Pc1HTSdF2kzjXbLAPYaerjVEUCbI+frC/xFRpNxb2jpdXYd/Y10gmvOYyv2Imdp/94LuNp0V+WS1cSFDejx+I3wqMslYUdzmp+YKXFG/dcRW9M//kVDBkxTbUB1yCmX7fiGuYJEeCLXrIpgJzCWjo31I5/SvfVbdK9iiT5+Q3lx+2Un1r0G69KOWUkhhAM0+WKLHEH1da0Ssjjf0ko5HQKpFAyQzzB7EFmlhMfgoazlReVW/NqS2BKAd8YXTQsdJhfUCeV5nSDRFv7yVZJogt/NJsd8MuAvHGv1Htk2+70DUbK+Rcx0qfGKXldIZN3QFi7XEfSPL9jnCFmI3pLHPA5mXu79Jvhc9fDpTaY/QtKllhiaNP6wvPy0imhVTTw5jXWIGQ9Vif8xcObeTGnukVsGarxR7MkU8WRSr15w5NYLu9nQ6G5EvwGP3drnVezYCICalnuBbsnht+KsFM2o0aCAzQDXX1HJwq+lvTP6raYjusOb0ObSs18Vbb2NvrM0HM6WyYWKGcF+sqasnHB5UNv5IXredJash6vkmQOooe1dOI9QUQmjY34YCPXxsSdIFbfnOKEL6P96A3TBb18EWxsIPPHL7ueFdRnW6SI8PNDH0pKt8tpjmLXCGrG6GzXoStFHzsUb5iIdW6ak9ePvPq8krVKae+7+eWWh2fH03cl5AEvWAdmX7hXsLdr9PfXZnLeOm2kWvRgzRJUimKelf9kt2jqDTIUeCEW2uZh1JVtMnH+9iy77Sgmp16yO+QFtig24DDa9Im7acdGggbrdlndXm/bElPr6Gzptnnt1oVMRaumPUsrNM+kjF1cfWE5z8TspU3nXX+CVKFRhoV7yQ+GBJkZFscb7opPt/B+kx+uC7c5i+z7EZ/qd3leT9o9fTOmxebBgkOhuKpn7mg2T56jS/XXs5SRhxFjXCXb2kFSjnVdvsnG6tyCYU4Jq5pxFFCSLjdn5KQlq+M7y9mlkAVsOY6b7i3Rqr5+sO5y2neC4u1n1jd+sPVh5mnk2Tgl7q7hsv1DxYS45w+uR1Il4sJ8/RJM7rJjB3NG27XKj+qD3vJ92xHYO/TgrHuCSXeW34dvhzdFNPeeBYH1NJONXAhuW1pmRt10pbDsNF+vadixZxPcdPf5bFru0CLLGt44PiWJk6pIIA4v5JdNvQXOXGUR6dh67yckoix6SugkN0ywlTduUItzvUf8wbKiYO5BUX2ygvMDI0OMoQtylz92mTlHWWIYHBg68Vbi8lFV3rPR93WhLgUFsESBngzetytaXoTrz7c6t8Tv6k/LzdaExeWG2KY2MxoqGV9TfyZbaL/A8JJ29Wi0JW9/p7PBYfbK4mvu0Z8T+VEt3wnhbSrYmLFzOV6j2FvX6+I3HhBi6m2EU8qzsoL10t+dFZjsd6HpZIvjBOaSCNAr9diAgpOlKRVjTRiXsaVJxcpJ+PLk88tPesqxJjWR9xlseho1dc5I5rl9lK/JbWnFGIQxXyvPhN6mDpe8iauab7oan93Xf8+kZox789KC3pHHegfgYwdu7MMYh7o+Oo2kbBKoQhmF46C1S2tuaxORCiPVPrLwSj58fqcjQKoLE3g5iBLbEKSx/zNsMK3p0BROox4JHaJStVI45lnkyYzmcuSaD2HrKU1CSRhyRuF2m220rHbnyby9Im/NlBA08XM/uMdwychaMd49fzpfq8qiJzHvkDDgaYlxb5U5gcIb5nxz02zTbJlMpQ54r5KIVJmPKtWjc/QmkIsR/VDwOOx/ALLUoVYKZW5kc3RyZWFtCmVuZG9iagozOCAwIG9iaiA8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1lIC9HVU9XVEsrQ01TWTYKL0ZsYWdzIDQKL0ZvbnRCQm94IFstNCAtOTQ4IDEzMjkgNzg2XQovQXNjZW50IDc1MAovQ2FwSGVpZ2h0IDY4MwovRGVzY2VudCAtMTk0Ci9JdGFsaWNBbmdsZSAtMTQKL1N0ZW1WIDUyCi9YSGVpZ2h0IDQzMQovQ2hhclNldCAoL2FzdGVyaXNrbWF0aCkKL0ZvbnRGaWxlIDM3IDAgUgo+PiBlbmRvYmoKMzkgMCBvYmogPDwKL0xlbmd0aDEgMTQyOAovTGVuZ3RoMiA2Mjk3Ci9MZW5ndGgzIDAKL0xlbmd0aCA3MjYyICAgICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42o10B1RTa7M2VSA0AZUmsEFAkZLQpal0kSJNpEMIIQRCAiEJIEWqFEWk916lg3REutJ7U5AiTRABaaKAXiznnO98/7/WvStr7eyZeWbeed55ZvNx6xoIK9pibOBqGDROWFQEIgsoaxsaygAQiLgIBCIG4uMzROJQ8D9uEJ8RHOuKxKBl/wOgjIVDcac+FSjuFKeNQQO38ShAVBwQlZIVlZaFQAAxCETmLyAGKwuoQAlIW0BbBLiNQcNdQXzKGGcPLBJhjzs95q9X4ApMABCVkZEW+pUOKDrBsUgYFA1oQ3H2cKfTE2FQFGCAgSHhOI9/lbgib4/DOcuCwW5ubiJQJ1cRDBZxXUAIcEPi7AF9uCscS4DbAj8JAzpQJ/hvZiIgPsDQHun622+AscO5QbFw4NSBQsLgaNfTDDzaFo4FTg8HDDS0gDvOcPRvsNZvgBDw524AURHRv8v9yf5ZCIn+lQyFwTBOzlC0BxKNAOyQKDhwR01LBOeOEwKgaNufQCjKFXOaDyVAkSiozSngV+dQQE1RD4CeEvxDzxWGRTrjXEVckaifFME/y5zesiraVhnj5ARH41xBP/tTQWLhsNNr9wD/nqwjGuOG9vxj2CHRtnY/SdjincF30UgXPFxD5Q/k1AX6x4eA4wBJCARyTVwUgLsAcHeYPfhneUMPZ/iv4C/3KQNvT2eMM2B3SgLujbSDn/6BPF2hBDiAw+Lh3p7/Gfi3BRIVBWyRMBxgA0cg0aB/qp+64Xa/7dPhY5HugBnkVHuiAOTn7+83i1N52WLQKI9/4L/mC9ZW01ZRVBP8zfjvmJISxh3wFJYChMXExQFJCTFASuYa4P3vIn/T/4v6L68uFPmnNcg/9TTQdhhA5jeD06v7iwXhjyiu/FkYAeDfJ+hgTpUMB678I3xziCQEdvoQ/T/L/1fK/0/1P6v8b8L/74bU8CjUr/CVX/H/Jwx1QqI8/gBOhYzHnS6FNuZ0NdD/Db0H/73I2nBbJN7pv6MaOOjpciiiEai/rxHpqoZ0h9vqInEw+19y+WsIp9VRSDRcF+OK/PmlAYRFIZD/ip1uG8zx9GviejqqXyH46TL9+0RVNAxj+3PrxCSlACgWC/UAQU7FJSYpCXiKnq6nLdz9l64BsAgagztNAU7ZeQN2GCzo50BFIWIA+JfvtykKAcDo/zBFATDmP0wJAIz9Zf6rCRgeiz1dzV8qOe3wL/vXdwAOd4fDQG8mMDC5QIfKwBeH5YrsbsLLAwqjfMv3EgSEPd9gm/Df6ChiBcpS/OewB4qx3W1nZxZVr+zffMt14vmxvooiuCFar/HI69gqUn94uRE0NXTh1WDOR8XnnRxUF4UNb654nbh4Gfk5ktYTN9/my3DBX6PTzWI6dOtQd3/eWTjd93BiWW+lTEqT+rhwRDj87mNzv/wxvkyb1HEWnjM4YQ7Kq4zb7vRj+wejjOmDP7huRwqCvDfCxXM9TefFnnwdv/+u2FDMtYWVl9WUhYN0n7FvmN9T6UPcbeZJz4K8x3MKk2kQARGiKXRr1raSreUBOJdbTFh9UtBnJ89mmEj6OaBzyI8K+G5L5Eqyn7DAh5Gs3RbXqTvqHyLTrYDJbN4VijH5WOEPOU+uVdl8sFrRI3hHsdVWvl43FeHyad2fG2meZj/nniOnJHhcbVzPP5Mu8ABTmcgIOip5CdX4bE2cm6e4JdLL1BqEseoERvyLbFMTLd5sPLvpGk/qzN0+PRkv1/y1WfB4fhOAFWgnPxC4C1x1yk1rHYnMkhBkxfBmkXDdrQpQhcWoXi05tiJVB0Xun++hsBUpbrybPSozeHjwNvdSgsXKNW7aeANvMDQ+vzHnQtEaT9cB14jENVUjedrriTpyKWw1oxRpM8sHTWYyvezR3Lk8OY5Wj0Yf8hLpD4/aMI8nDCM6dylpuvFP3AtGjbTtN8a0eMV1SRKmP50beePRSCeZUnxOqBnDMyR9OWS14eqZT6o5gfJkFabEP0bX8mGNnwv7ba6FY3mt1VqWKGfzwRWp37AHe59eBL07bLPwjZZV2t8lXdYw5/WJVxiLzKpa9x0MCajNepJw4U3vucOulK5m7qX1uMrWCr2WKoOrZFZaAx5Lxj2Iq03cl5Tk1GzPeXyToSWoiTS4t/Hfm/FlHlwdgYVqmo2svSz55rBXAgqY+UxbOWeYImzvUJcwRtYSRSk7UbneZwPrHM1yZ//qM4TgdGQhgzxIssw2jbMYKKjifywujnj8WXxl3c1J7AtZyxNnpccpGn2+5HShsj4RLsVqdPNr/qF4+XeWLETbGqoKg1eHbw+JlJi6PRyBbZKJ+zFMXGPfMKmYEBE966Cp6BouV5+73dH45Iv1gL7lmAeXsp4EpUdjyJPZLrplmprX/J6s+IhtPYQaaIg1l4Cq1M3cqntWntXX2gLqga92KKh7oNxA7haEnAaGsDPZ/N+aGTAydrVvkXovnKvaOmeHPSic9MawSMoLDk971Uinzftb7lIwKhHhC6lkXddWOYJLEgNfe0h/XMqieBGRqn952bCJIrQxaIhkyBPmh00Bb9tshN23w/d57NfNvqJgEbbSPLF/65MGuF44iMwurhstuQ69En8/Nu6R3X3uSyd5QYR3pvgXc0SmKzxG7XdVu9O/uZUcngjvEV8kutn44MwisEZyoeYNElg6gmoIJlDrr5/ta67QjfuR91LO+IUyIAVv+siR3CK46RAKn+wxq26R/sx8IGzpEEWc9d5s69xbVhAbIvRJucyjs6HiJTRT7UGvmFWetbJFfQ0JpYLx0VTUTSVOe5TdVlZ4dp98PeYTM8OIGQ4gJCbG9Dy77m+00ile4JT4o1SGudV/O1XhnnNeiOAiaiKiFT0ZzCWOyCi4JP1KtkfPj6X1ZrWuz4jwBv7maIXKlpE5u6vBsyi57+5yoIDbpcWDtKWXnSPiiXdADR43+r5HWCp37zPufNWgreF9ekvdJAM3as1GG0hJv2Y+zayV4sB3YlecMkDq/nptw+BMMsXbx9iNdzMvC85BvssppKHkypfafTO0hzWuYwDltWoeEJXTq9nnEY17hRqxlrI95+94NeNFLN8P6zCs4nfZUtxsrDeGZRokr1fmHM5S2t6+HURT3rEN+bS3a/w0b7ubw/kgncxsALf7bp6Jk7wb/4HLkm8qb8ea4/I+CGL4IJOGTMOTiitIykEhk/UbSZ9b2BRVd1Nu89tQysbeTumHrIddCScvzwxObzB1fn0r6/kt79wz+v30huAbqFtVLxIFduJXr0XcKbXLyXIyRguFPedM6J2Lp9VNImlCIr9PdVsY89PFflI6cvdkS5DkeF1sd1H1Zchs6UsVdtz86v0JGXSvR6ZSEGdnB5C8iBOkWpJ4HEL2vec8vVCG8yRv1k13/hMvzq2OAolbPhKMm49vSxco+c8nyWclD7UVnVOu6NZdGSJO8Wv1xt//0OaV+gXRzkCMFb6QxCDLlvEBv0S8m8m6N2/WrvLBXA6QN96fsXZjG4VEcIZ2a9hbjJKU61h4LPICXmLTC7XHP5zPL/CzKHGAXjrzPAjLnbk0rn4btk5EpZZ6wGmShgn3pmxWTMgbYDoaXcin6BX4GHGCUO06ZITp28YjiBpWd7+mC1mpnU3Oxngx4ZfMit+fOxjT0xCGned1LYubJ9PfCj96dja6t19kjfBxp95CPjXpQGPwgcEzeiPhBGHlMHvD1+5qdKDYizjej/45OUyDHzZjr+lvaqexTVJAxMRXkv1mUeHlltmOpVrfZItK6Km1uK68HePRah+j+cHprxD2Jc0A63B0NvYz9YknqazTD8904jdzzBhdkwWHFHr/UAAZcf68paSD77PiocaoxEsn6tW6te+mAywlzLTjzD/V+Q0w5BPvl4RErnrYSPnntD19vTiU605uP55APQQ4yNTcR3SJJHa17YAb3kuoMXMtJeWEZeXkTs/RxShKH50nM/B+eoVlctWrrc6tiYHf/S4HcPM5wam6itjPhqI+qjaBWEBbWotSOQAELztZ7CwPEeUYVRx8PuoV41I3xkGWwnIiK8n1ubNJjbjadSf8kEnTcvvDg6692cQ+dvUg7l6lxDA6Z8toJmIm+eOEV/oqGV5ZF/mdK49I3gV2xys4s2zb0n9oUngXRib+2kFl+QdhrSuuZHdGFPTqI/TwjP4NdJdK/o4qu+81Nip/0cHWHy0TYqCisNurSlw4C596R6ZetRn88ybijsyHTPa3b+GJfbI6usgKGj5F58WEL41k6WWkfVqgKL9MNfjgbcqQeoYoeRE/BYS7SXgb7rrhKXtL+J6f76poxX7DMTN8Vr22YeER6Rh5oekbr7ZgAVUZGV6pgk+5+d90bgCBpi2apuvZOYQD+NjM9G7vDVzXB+x084MMMd8Drdpz8ypTW0nWLsS1hJDCe53cY6QGac7EX0rOpNdJAGq0e75z6yL9va0hGYW0zw9Fx9+IF5a03o8+rixAJi6c5IHs3i/E4eq8SJo3TCuveF3dWfEzjuLlVVUlfv6O3f3aElI3n1K2aeEb1SI12L7Mgl5kiJK+HlFcny6EfdZrEvVuN8zp5TemNN4ZwGWwvsNRSK8y0r6NnfPMrmRgZH4qt5KFZUV06mt7hYP1Q9ZbZ9rVFGi7W5qiPAM1T6YjbHp4S6FxNDVzU4UyLynNvJjk/c6ZN/hg7lksJfRmeCs4y+neuiMNoqBmMKr27yJqMn6xeovXIPfGpVXkyTuDPfuyVw3UxViSqSr9RMb3TPeUL2+mIOiUdF+U98JDkDTnzc6o9oatDuGRHoSmm+7Ore7xA2EkIaOWuWeC6YXMeyA/Zr8u8W3rONz4PDepSKsf8Hjt5gOvAs0W3a9nJRTBIWd3fCuE7y0MpMamfkoa2WS0jH93znRJQ1gme6IzPEO3zIeJNQYZGB2lsW2y+B7LVUR3R7tCsv8s9kcRd7AtaTqif2HI113IO1Doy/SFT1lJarfQqk2ctUnGnCo8X0fpLDKCiE9QvPy0jPOThCYRk+vefowZFTZ3jzRYDDwTu8Wk3yp8Jn02skFBo6aU7Bg4exmUt+oLBJOK+PB0dD3YW8Klf7rDcl9YXP+IPmzlTa1pv1l8fGQ0/8hit73K9y9e5Yp6c+rKtwBZ88thddbQ8OGARbH6A08FTMZ1cjzZEP8TyEn9XGOMHPxhKUTUwmiAslMMVnCYk/LkuXVSxsNo5Y7bon6M4PRhrbJ732kTTGCO3ZU5OaFDlOQcVPvt3rD8a2+JtZS9Cio6EQF8L0yKuGREHkfuVN9I3mVJIm6Eh1YOCfr6j9O16474HWxpSAh5X8rwIFKdCk48sOAz7LvedxKw/ZbRW6jVgCqH+8HVB60iuzk0VNEJhATc8pD0wy+7HMxmrHdqs9u4KvTJDotMaoKZHnaf2diPM0gxGCuUHE9DCV6n63/ygqiiDkUvVbZ8t9SkYevZ5ZKCr1ZZznxkFFsK5ccWlrKOYkAni00zufhIJQFPYv49ICIi3pE76WHpKjr1275Y36OAm3p+kVeJmJkIw95jkvfFneanknbAr/YLyp4Xp7NWWdGH7vo0rw2p220TMatvFEZGS8T4C+WWPFpXyJM8OuTLfFtvsaSaeivMDt097ev+6JX+xaqdb+laYK7L9YA0pUhK7eJnOPmXwab8wKdlwcHs0BF17+Uglg9t9NjKTJDPFwGaIgt53ljy7TIxfHUOu/wJQX5nUkeXyStLsetYnc0xp49ahELXpOTV8CjnHbmCxiYl/ZSLAiXPMMVrRuvl7dsG31fkO/wT5KCdepyij/H3ISGaHXwc+t0EYjRCLtKzlLDvWNTJvjm05DMViu61DKIIbbl2c7ax0OSgdrzuyhRbqfv2m9gruNdc/MYmO8KNJdJXi9h3IFvu0QJ9qps45WY3OQSUR1Syw8LM7jlKhGr+g2n4Sk6fhs0TxIWn465u84bh/EXP8kz76k4EVIJulbA+xBXCaWr6pLLqaH3aJL9M1txIYZsqzagafE1+tNDaRjHnGLLEEXQRKyJQE4uqOsiM7XK3qmTmvBGiV3JvWFwsiCLpCqpg8SMtR9jKsJffnUkbYbW41WELkbiLpfqpuirnY+THKhZVju7Mq5DXJVuotJW2aZFzKZCBlxO7slro9ls1N8++3i8pz7GemO9WC0DoWfVogN6fJ0cfueiWNTbUFlldSUBMqbNr8jt1NODq7retHZdYERdiqCetJfLvS+QIh0tTijpu2dK7xj51KzB3pzVNj7pGWkW75mGemKRfQ8KeNTeysT2IIuq7OcbpO50ctDuz0lZdxUtWULbdf+lRN3sb9HKt55j/U+RzJh9NlMPwspHS5ufN6Pt3qx6AjUVpDDKXXBTqvtvzS+N3i8jU94wKPlAqWo21indoH399v+DTZhmUjFshgQRXkpCo88u/7joam4z1HmHZPrSfrW5/tPQNEtidA3szUv4xIvY6fSBRzV4kRiqkSWDOU08pptjY7NKscoeGuEPAd/huVAhYx5c0veGuMYNgzkdWognr4A+RPGHkZ3XNzI/miQIalhSNG6BsXsgcsrgYmlvoEi7HeiG2WurRG9SRt8OtPMQtGdrIYf2H3l4XoDhmuiaq4/AL8qTv5UQJUTczZz0ZVEeKi7p66Wlpks5ltYKTVDekBW/QsVtXjwlKtxlyjJEndIeAs9J9ssWistTgy4/DajWSdyUFDEoZjN9wEXTCquABKdFBXVRKI6XNTh5toR1WohMSuOPOz58yvoyh4iFucT9A4pouIMP3X2cGwxlL+trNi4lHX9zfehKFulgYbMFnk0vmfIJIneGSVqdkF2jCvS83mzcKHdbJfDn13ef1Hcu84ITVx2O0HCQE67CiY4L1cLATPagzxDjDvq7gJP469kJFs2yADJxd1GBPR3ljnhe2MnXIRxNK33dun5erLU/IMFP7jFjYoPKdd8dGmfB0hdjD1wYk0gv4bL9Yq4hAOk/3FNrYt7wbspdMd5AvRXuCC1Ep1B607TWWXnpHaZnlWoMhsGZ+1qFb6CiBGUqqwYKer11e9nCWdpZ3tC3en+mSNQ4btAf3KLNex94b375KLyhsWvxxTsh2ttDDLrPAiTCWbIGj+i5HxsFu/ZbBD1M1xWoRE3bvVjFj+ad5E9J33syXdXWsGwzwSnYXeIVSt8ZjR7UOxpZ2axW+udE7PYc4sRtRnh1bpopD+SVShxjeQeNYs6UmtXmMewMWLx74ubxYVnliB+lxcpW5wdGRlmSVFLHihL5lvagYpDjJ4DSS1MAKmpgpiYZGbWXFEX14vOlgh+67OzWd+LhdOS25HpqNqwU/nlntWGki2iFMz0zOvdV1uajKq6NrafUmyN/26wdCRd1BPg+9YTqRshnwvdmroIkuz23ET9RLmnEvXolv9EfNBzt/rmzmeyXhPLYtC1KUehQa0KYvI6kP6TpVRRbkXxqkIlO+tsYzjScKMI0LVqdR9/ENdZKZWMtRRcSHlUpyB2titAwa43XGOaMO7HXtl1S239boRyayCL8MLK1nM9hZW3kUuNp4g8pvJ295PMfg2hEZVxh3YbxQz+AF6sAiwqAO88VKM9IXgHU3jxIFdCWqTXKCq+3SE1ZbtwaKtXt8JqjQlz4XmGXBVf7XS00L5OBjaq2eOpcyPEc+effckPY4RICYEuxZDWqDsmjmrXGmeTw0V1kvfNBT5td0PYNH9Yzdrk3yOis1SYKc5cWGqE6oGSMQAy/n+Ak9XbesNIryBJ6/fqelz7Jw9UkFey25Xhui27iMCJ9kJDQUxVPIZ/X0GcdTrYHAHB4Jwkx9btubZwTf9kbT1/vc5KDl8b7NozmTm4daYaHnPB/0EeYaIgX9KB4N6Fw1uRDdK+iCtDik3ARbagkscoZVhXFEsTt5zImyKeyGBGuuVzM9oU0s8/FEVuM8R9Bvb1x+GCxWacsmVL3UlDzAMIQN2cRFzj3v/hJzIPxCbSaoJI8xLOdMiBqKlVqLyiOU1O7VitoN7Q++Vln+765CWxniHnOy10+RdLSySY43LI02xbY95m4sDs22zacVo3u0OJBMh/xW4AbmGZRzsbu3w/Mk3pKydBHCy4DABG6VQe/tZhLWnUSO+7OUplvAsJtpnrLNtjy+it9qWQiDhxa63soU21f5KRzde+T2Mh19pWYejtC5dweQ8DWM01oaiw1rPUZYZEYdsu8G9Rk5ldWWEOdp27t/WUrX5d+6MuSZzr6y4484yhqynMhm7jqh6sgZi+r1+lTRcGXD1rFrma15A5w5MNMQfst3LIbUZfD2Zbdipc1sXGkTe75vvN+DNMSdd9Z3KjJy52Bje/XRNKXmKZpXd8EJ/QxHVWdL6ygTXyCeVsqYHshDCEtKkbV7nPc0FeIfLOlFWkBlzsoPthjJC5dow20svWZ9s13Ys1t4OiwH+yb5UUwZXmsRrusI5I9hPYUarhZGhrV97CjZMuBkRsTBOiJLjNW6Mlq3GxQINW5LSWrXQFUXwcMOR0983V41XRgmvWFaquPkr3z3wcOqb1O0x5ETEbFyKN8WGJmcpUJ+4ZcXYKIeVb9LH+eDXHgNnMfZqdgNWyi2mQEasIiLpqJqPzXnilRcBP3nkrze9Xbrfj0VZsXBwiGOyxPoPCkyijsFJ+oji7wLlCr9UXtcZnqNq9dc5XVUpBIQsmU6sQXeEdci+pvw0d7ZUFp4vsLDz5ISftUCi0uSzP74J7VIfP5t+l1RDm2zj1VPnZPcRut55kO81BDeTLZ4jX7rPMJJwuCc7xnvi92By3dPWr9qTpWEUrtbQISubdHofVaTUrmo03Zc95lGXm8DJoOQFMKfNWXkwXPORQo0iVZeZJl/rAJRei45CWg/8c66ZvO9f0HoQAhQfwkTgIHQ6+Sxkxz+ADZnTUgR5RWylTAYcexg6MzmI3diP1MYDm27bKrtmHFLyyXyBa0Yk5Zq9MRK84my8Bj51OubC+F07GE1NALnNCw0SJgv6VhyjpgSVW/rXnL0HqDjLV9Oi5CyIva9YbNuO5d8mEVxd0HFswz84SXBZnYO0Sw9OBTC/p4i/odKjXB7TllG+oSGdLelc9Ctp4mfgw7Q8lsYVHimFDhTPkiBGYhr2U2fkPmuazQ7auMwV55O8wmnRf9ijt1f4gSyVhgZ0hBHU8oW6sX1hTF8TCFnU8HQNq397sOqXfib6+18MYbc189uuXS4fMnLZVyk4xw4GUnhm/P09XGrVeZEn6wNmMwpKYXdNHCv9UibTDTzOjwrYAL+Ed60XoZJGzBu4lgw962mnVXmfeipnSXMtirHxK6cekl+0CvR1NyIKPAE3yu1I9+2c18xvfdcImfCxY6jveiXGjXQGoKhE7OncIRpQnXZRuKOD6NpvVTu19x74WPwc4rmiqJtiwxS5Q0rDTWhm7WtgoalMlZsZavZPY54uUcOkj9Yols2YoQD+nRlTTdWk5fx+qFuz9wcJR6aUQZTv832XogZJGbSaGYK1Q34zL60ryRZziUT9drPG8qqxr1HnhcnLUt0eB5MgEtR9KSHlZ6VX/GSnBwqDM7de+da68ZaQW4ZYwDOlyg5THCpGWvmUxXMK5bjkHPc4r/W12CheT08Of3JVZ4lv3YGa0WDR01mfUmB6xzjokLQc3ukfG6xsIT19/vTqKeVAylXqMyCWRsky4VaZsT7Vibuv8GGxC7XToegrvebyXdbtw9p5HgLpTWptCKqTLk+yf8P4ygJngplbmRzdHJlYW0KZW5kb2JqCjQwIDAgb2JqIDw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL01GTURBRitDTVRUOQovRmxhZ3MgNAovRm9udEJCb3ggWy02IC0yMzMgNTQyIDY5OF0KL0FzY2VudCA2MTEKL0NhcEhlaWdodCA2MTEKL0Rlc2NlbnQgLTIyMgovSXRhbGljQW5nbGUgMAovU3RlbVYgNzQKL1hIZWlnaHQgNDMxCi9DaGFyU2V0ICgvZi9uL28vcikKL0ZvbnRGaWxlIDM5IDAgUgo+PiBlbmRvYmoKNyAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9RWktSRE0rQ01CWDEwCi9Gb250RGVzY3JpcHRvciAyNCAwIFIKL0ZpcnN0Q2hhciA2NQovTGFzdENoYXIgMTE2Ci9XaWR0aHMgMTkgMCBSCj4+IGVuZG9iago5IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0dYR0dCUStDTUJYMTIKL0ZvbnREZXNjcmlwdG9yIDI2IDAgUgovRmlyc3RDaGFyIDQ5Ci9MYXN0Q2hhciAxMTcKL1dpZHRocyAxNyAwIFIKPj4gZW5kb2JqCjggMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvUlpQTUxTK0NNUjEwCi9Gb250RGVzY3JpcHRvciAyOCAwIFIKL0ZpcnN0Q2hhciAxMQovTGFzdENoYXIgMTIyCi9XaWR0aHMgMTggMCBSCj4+IGVuZG9iago2IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1BIQlhEUStDTVIxMgovRm9udERlc2NyaXB0b3IgMzAgMCBSCi9GaXJzdENoYXIgNDQKL0xhc3RDaGFyIDEyNwovV2lkdGhzIDIwIDAgUgo+PiBlbmRvYmoKNCAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9KVFlNS04rQ01SMTcKL0ZvbnREZXNjcmlwdG9yIDMyIDAgUgovRmlyc3RDaGFyIDcwCi9MYXN0Q2hhciAxMjEKL1dpZHRocyAyMiAwIFIKPj4gZW5kb2JqCjExIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1RLSkhISStDTVI5Ci9Gb250RGVzY3JpcHRvciAzNCAwIFIKL0ZpcnN0Q2hhciAzMwovTGFzdENoYXIgMTIxCi9XaWR0aHMgMTUgMCBSCj4+IGVuZG9iago1IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1VFSVpZVytDTVNZMTAKL0ZvbnREZXNjcmlwdG9yIDM2IDAgUgovRmlyc3RDaGFyIDMKL0xhc3RDaGFyIDMKL1dpZHRocyAyMSAwIFIKPj4gZW5kb2JqCjEwIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0dVT1dUSytDTVNZNgovRm9udERlc2NyaXB0b3IgMzggMCBSCi9GaXJzdENoYXIgMwovTGFzdENoYXIgMwovV2lkdGhzIDE2IDAgUgo+PiBlbmRvYmoKMTIgMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvTUZNREFGK0NNVFQ5Ci9Gb250RGVzY3JpcHRvciA0MCAwIFIKL0ZpcnN0Q2hhciAxMDIKL0xhc3RDaGFyIDExNAovV2lkdGhzIDE0IDAgUgo+PiBlbmRvYmoKMTMgMCBvYmogPDwKL1R5cGUgL1BhZ2VzCi9Db3VudCAxCi9LaWRzIFsyIDAgUl0KPj4gZW5kb2JqCjQxIDAgb2JqIDw8Ci9UeXBlIC9DYXRhbG9nCi9QYWdlcyAxMyAwIFIKPj4gZW5kb2JqCjQyIDAgb2JqIDw8Ci9Qcm9kdWNlciAocGRmVGVYLTEuNDAuMTApCi9DcmVhdG9yIChUZVgpCi9DcmVhdGlvbkRhdGUgKEQ6MjAxMjA2MTExODA4NDYrMDInMDAnKQovTW9kRGF0ZSAoRDoyMDEyMDYxMTE4MDg0NiswMicwMCcpCi9UcmFwcGVkIC9GYWxzZQovUFRFWC5GdWxsYmFubmVyIChUaGlzIGlzIHBkZlRlWCwgVmVyc2lvbiAzLjE0MTU5MjYtMS40MC4xMC0yLjIgKFRlWCBMaXZlIDIwMDkvRGViaWFuKSBrcGF0aHNlYSB2ZXJzaW9uIDUuMC4wKQo+PiBlbmRvYmoKeHJlZgowIDQzCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMzMxNiAwMDAwMCBuIAowMDAwMDAzMjA0IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDEwODgzNCAwMDAwMCBuIAowMDAwMTA5MTEyIDAwMDAwIG4gCjAwMDAxMDg2OTUgMDAwMDAgbiAKMDAwMDEwODI3NiAwMDAwMCBuIAowMDAwMTA4NTU2IDAwMDAwIG4gCjAwMDAxMDg0MTYgMDAwMDAgbiAKMDAwMDEwOTI0OSAwMDAwMCBuIAowMDAwMTA4OTczIDAwMDAwIG4gCjAwMDAxMDkzODYgMDAwMDAgbiAKMDAwMDEwOTUyNyAwMDAwMCBuIAowMDAwMDAzNDc0IDAwMDAwIG4gCjAwMDAwMDM1NDQgMDAwMDAgbiAKMDAwMDAwNDA3MSAwMDAwMCBuIAowMDAwMDA0MDk1IDAwMDAwIG4gCjAwMDAwMDQ1MDEgMDAwMDAgbiAKMDAwMDAwNTEyMyAwMDAwMCBuIAowMDAwMDA1NDQxIDAwMDAwIG4gCjAwMDAwMDU5MDYgMDAwMDAgbiAKMDAwMDAwNTkyOCAwMDAwMCBuIAowMDAwMDA2MjU0IDAwMDAwIG4gCjAwMDAwMTU4NzcgMDAwMDAgbiAKMDAwMDAxNjEwOCAwMDAwMCBuIAowMDAwMDI0NDIxIDAwMDAwIG4gCjAwMDAwMjQ2NjAgMDAwMDAgbiAKMDAwMDA0MzkyNSAwMDAwMCBuIAowMDAwMDQ0MzQyIDAwMDAwIG4gCjAwMDAwNTg3MzMgMDAwMDAgbiAKMDAwMDA1OTA1NiAwMDAwMCBuIAowMDAwMDY5NjY1IDAwMDAwIG4gCjAwMDAwNjk5MTcgMDAwMDAgbiAKMDAwMDA4NTU4MCAwMDAwMCBuIAowMDAwMDg1OTMxIDAwMDAwIG4gCjAwMDAwOTMwNDggMDAwMDAgbiAKMDAwMDA5MzI3OSAwMDAwMCBuIAowMDAwMTAwNDQ1IDAwMDAwIG4gCjAwMDAxMDA2NzQgMDAwMDAgbiAKMDAwMDEwODA1NSAwMDAwMCBuIAowMDAwMTA5NTg1IDAwMDAwIG4gCjAwMDAxMDk2MzYgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA0MwovUm9vdCA0MSAwIFIKL0luZm8gNDIgMCBSCi9JRCBbPEE1MTIyOERDMEI2RDhERTcwNDA5QjM4RUY1MDJDQkYwPiA8QTUxMjI4REMwQjZEOERFNzA0MDlCMzhFRjUwMkNCRjA+XSA+PgpzdGFydHhyZWYKMTA5OTAyCiUlRU9GCg=="
387}
388
389
390///////// Rest taken from generated pdf.js. (c) by Mozilla. ////////
391///////// File unchanged, except that all references to DOM- ////////
392///////// specific global names have been prefixed by PdfJS_window., ////////
393///////// to avoid interference with the benchmark runner script. ////////
394
395/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
396/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
397
398var PDFJS = {};
399
400(function pdfjsWrapper() {
401  // Use strict in our context only - users might not want it
402  'use strict';
403
404  PDFJS.build = '3cc61f0';
405
406  // Files are inserted below - see Makefile
407/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
408/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
409
410'use strict';
411
412var globalScope = (typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window;
413
414var isWorker = (typeof PdfJS_window.window == 'undefined');
415
416var ERRORS = 0, WARNINGS = 1, TODOS = 5;
417var verbosity = WARNINGS;
418
419// The global PDFJS object exposes the API
420// In production, it will be declared outside a global wrapper
421// In development, it will be declared here
422if (!globalScope.PDFJS) {
423  globalScope.PDFJS = {};
424}
425
426// getPdf()
427// Convenience function to perform binary Ajax GET
428// Usage: getPdf('http://...', callback)
429//        getPdf({
430//                 url:String ,
431//                 [,progress:Function, error:Function]
432//               },
433//               callback)
434function getPdf(arg, callback) {
435  var params = arg;
436  if (typeof arg === 'string')
437    params = { url: arg };
438
439  var xhr = new PdfJS_window.XMLHttpRequest();
440  xhr.open('GET', params.url);
441  xhr.mozResponseType = xhr.responseType = 'arraybuffer';
442  var protocol = params.url.indexOf(':') < 0 ? PdfJS_window.window.location.protocol :
443    params.url.substring(0, params.url.indexOf(':') + 1);
444  xhr.expected = (protocol === 'http:' || protocol === 'https:') ? 200 : 0;
445
446  if ('progress' in params)
447    xhr.onprogress = params.progress || undefined;
448
449  if ('error' in params)
450    xhr.onerror = params.error || undefined;
451
452  xhr.onreadystatechange = function getPdfOnreadystatechange(e) {
453    if (xhr.readyState === 4) {
454      if (xhr.status === xhr.expected) {
455        var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
456                    xhr.responseArrayBuffer || xhr.response);
457        callback(data);
458      } else if (params.error) {
459        params.error(e);
460      }
461    }
462  };
463  xhr.send(null);
464}
465globalScope.PDFJS.getPdf = getPdf;
466globalScope.PDFJS.pdfBug = false;
467
468var Page = (function PageClosure() {
469  function Page(xref, pageNumber, pageDict, ref) {
470    this.pageNumber = pageNumber;
471    this.pageDict = pageDict;
472    this.xref = xref;
473    this.ref = ref;
474
475    this.displayReadyPromise = null;
476  }
477
478  Page.prototype = {
479    getPageProp: function Page_getPageProp(key) {
480      return this.pageDict.get(key);
481    },
482    inheritPageProp: function Page_inheritPageProp(key) {
483      var dict = this.pageDict;
484      var obj = dict.get(key);
485      while (obj === undefined) {
486        dict = dict.get('Parent');
487        if (!dict)
488          break;
489        obj = dict.get(key);
490      }
491      return obj;
492    },
493    get content() {
494      return shadow(this, 'content', this.getPageProp('Contents'));
495    },
496    get resources() {
497      return shadow(this, 'resources', this.inheritPageProp('Resources'));
498    },
499    get mediaBox() {
500      var obj = this.inheritPageProp('MediaBox');
501      // Reset invalid media box to letter size.
502      if (!isArray(obj) || obj.length !== 4)
503        obj = [0, 0, 612, 792];
504      return shadow(this, 'mediaBox', obj);
505    },
506    get view() {
507      var mediaBox = this.mediaBox;
508      var cropBox = this.inheritPageProp('CropBox');
509      if (!isArray(cropBox) || cropBox.length !== 4)
510        return shadow(this, 'view', mediaBox);
511
512      // From the spec, 6th ed., p.963:
513      // "The crop, bleed, trim, and art boxes should not ordinarily
514      // extend beyond the boundaries of the media box. If they do, they are
515      // effectively reduced to their intersection with the media box."
516      cropBox = Util.intersect(cropBox, mediaBox);
517      if (!cropBox)
518        return shadow(this, 'view', mediaBox);
519
520      return shadow(this, 'view', cropBox);
521    },
522    get annotations() {
523      return shadow(this, 'annotations', this.inheritPageProp('Annots'));
524    },
525    get rotate() {
526      var rotate = this.inheritPageProp('Rotate') || 0;
527      // Normalize rotation so it's a multiple of 90 and between 0 and 270
528      if (rotate % 90 != 0) {
529        rotate = 0;
530      } else if (rotate >= 360) {
531        rotate = rotate % 360;
532      } else if (rotate < 0) {
533        // The spec doesn't cover negatives, assume its counterclockwise
534        // rotation. The following is the other implementation of modulo.
535        rotate = ((rotate % 360) + 360) % 360;
536      }
537      return shadow(this, 'rotate', rotate);
538    },
539
540    getOperatorList: function Page_getOperatorList(handler, dependency) {
541      var xref = this.xref;
542      var content = this.content;
543      var resources = this.resources;
544      if (isArray(content)) {
545        // fetching items
546        var streams = [];
547        var i, n = content.length;
548        for (i = 0; i < n; ++i)
549          streams.push(xref.fetchIfRef(content[i]));
550        content = new StreamsSequenceStream(streams);
551      } else if (isStream(content)) {
552        content.reset();
553      } else if (!content) {
554        // replacing non-existent page content with empty one
555        content = new Stream(new Uint8Array(0));
556      }
557
558      var pe = this.pe = new PartialEvaluator(
559                                xref, handler, 'p' + this.pageNumber + '_');
560
561      return pe.getOperatorList(content, resources, dependency);
562    },
563
564    getLinks: function Page_getLinks() {
565      var links = [];
566      var annotations = pageGetAnnotations();
567      var i, n = annotations.length;
568      for (i = 0; i < n; ++i) {
569        if (annotations[i].type != 'Link')
570          continue;
571        links.push(annotations[i]);
572      }
573      return links;
574    },
575    getAnnotations: function Page_getAnnotations() {
576      var xref = this.xref;
577      function getInheritableProperty(annotation, name) {
578        var item = annotation;
579        while (item && !item.has(name)) {
580          item = item.get('Parent');
581        }
582        if (!item)
583          return null;
584        return item.get(name);
585      }
586      function isValidUrl(url) {
587        if (!url)
588          return false;
589        var colon = url.indexOf(':');
590        if (colon < 0)
591          return false;
592        var protocol = url.substr(0, colon);
593        switch (protocol) {
594          case 'http':
595          case 'https':
596          case 'ftp':
597          case 'mailto':
598            return true;
599          default:
600            return false;
601        }
602      }
603
604      var annotations = this.annotations || [];
605      var i, n = annotations.length;
606      var items = [];
607      for (i = 0; i < n; ++i) {
608        var annotationRef = annotations[i];
609        var annotation = xref.fetch(annotationRef);
610        if (!isDict(annotation))
611          continue;
612        var subtype = annotation.get('Subtype');
613        if (!isName(subtype))
614          continue;
615        var rect = annotation.get('Rect');
616
617        var item = {};
618        item.type = subtype.name;
619        item.rect = rect;
620        switch (subtype.name) {
621          case 'Link':
622            var a = annotation.get('A');
623            if (a) {
624              switch (a.get('S').name) {
625                case 'URI':
626                  var url = a.get('URI');
627                  // TODO: pdf spec mentions urls can be relative to a Base
628                  // entry in the dictionary.
629                  if (!isValidUrl(url))
630                    url = '';
631                  item.url = url;
632                  break;
633                case 'GoTo':
634                  item.dest = a.get('D');
635                  break;
636                default:
637                  TODO('other link types');
638              }
639            } else if (annotation.has('Dest')) {
640              // simple destination link
641              var dest = annotation.get('Dest');
642              item.dest = isName(dest) ? dest.name : dest;
643            }
644            break;
645          case 'Widget':
646            var fieldType = getInheritableProperty(annotation, 'FT');
647            if (!isName(fieldType))
648              break;
649            item.fieldType = fieldType.name;
650            // Building the full field name by collecting the field and
651            // its ancestors 'T' properties and joining them using '.'.
652            var fieldName = [];
653            var namedItem = annotation, ref = annotationRef;
654            while (namedItem) {
655              var parent = namedItem.get('Parent');
656              var parentRef = namedItem.getRaw('Parent');
657              var name = namedItem.get('T');
658              if (name) {
659                fieldName.unshift(stringToPDFString(name));
660              } else {
661                // The field name is absent, that means more than one field
662                // with the same name may exist. Replacing the empty name
663                // with the '`' plus index in the parent's 'Kids' array.
664                // This is not in the PDF spec but necessary to id the
665                // the input controls.
666                var kids = parent.get('Kids');
667                var j, jj;
668                for (j = 0, jj = kids.length; j < jj; j++) {
669                  var kidRef = kids[j];
670                  if (kidRef.num == ref.num && kidRef.gen == ref.gen)
671                    break;
672                }
673                fieldName.unshift('`' + j);
674              }
675              namedItem = parent;
676              ref = parentRef;
677            }
678            item.fullName = fieldName.join('.');
679            var alternativeText = stringToPDFString(annotation.get('TU') || '');
680            item.alternativeText = alternativeText;
681            var da = getInheritableProperty(annotation, 'DA') || '';
682            var m = /([\d\.]+)\sTf/.exec(da);
683            if (m)
684              item.fontSize = parseFloat(m[1]);
685            item.textAlignment = getInheritableProperty(annotation, 'Q');
686            item.flags = getInheritableProperty(annotation, 'Ff') || 0;
687            break;
688          case 'Text':
689            var content = annotation.get('Contents');
690            var title = annotation.get('T');
691            item.content = stringToPDFString(content || '');
692            item.title = stringToPDFString(title || '');
693            item.name = !annotation.has('Name') ? 'Note' :
694              annotation.get('Name').name;
695            break;
696          default:
697            TODO('unimplemented annotation type: ' + subtype.name);
698            break;
699        }
700        items.push(item);
701      }
702      return items;
703    }
704  };
705
706  return Page;
707})();
708
709/**
710 * The `PDFDocument` holds all the data of the PDF file. Compared to the
711 * `PDFDoc`, this one doesn't have any job management code.
712 * Right now there exists one PDFDocument on the main thread + one object
713 * for each worker. If there is no worker support enabled, there are two
714 * `PDFDocument` objects on the main thread created.
715 */
716var PDFDocument = (function PDFDocumentClosure() {
717  function PDFDocument(arg, callback) {
718    if (isStream(arg))
719      init.call(this, arg);
720    else if (isArrayBuffer(arg))
721      init.call(this, new Stream(arg));
722    else
723      error('PDFDocument: Unknown argument type');
724  }
725
726  function init(stream) {
727    assertWellFormed(stream.length > 0, 'stream must have data');
728    this.stream = stream;
729    this.setup();
730    this.acroForm = this.catalog.catDict.get('AcroForm');
731  }
732
733  function find(stream, needle, limit, backwards) {
734    var pos = stream.pos;
735    var end = stream.end;
736    var str = '';
737    if (pos + limit > end)
738      limit = end - pos;
739    for (var n = 0; n < limit; ++n)
740      str += stream.getChar();
741    stream.pos = pos;
742    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
743    if (index == -1)
744      return false; /* not found */
745    stream.pos += index;
746    return true; /* found */
747  }
748
749  PDFDocument.prototype = {
750    get linearization() {
751      var length = this.stream.length;
752      var linearization = false;
753      if (length) {
754        linearization = new Linearization(this.stream);
755        if (linearization.length != length)
756          linearization = false;
757      }
758      // shadow the prototype getter with a data property
759      return shadow(this, 'linearization', linearization);
760    },
761    get startXRef() {
762      var stream = this.stream;
763      var startXRef = 0;
764      var linearization = this.linearization;
765      if (linearization) {
766        // Find end of first obj.
767        stream.reset();
768        if (find(stream, 'endobj', 1024))
769          startXRef = stream.pos + 6;
770      } else {
771        // Find startxref by jumping backward from the end of the file.
772        var step = 1024;
773        var found = false, pos = stream.end;
774        while (!found && pos > 0) {
775          pos -= step - 'startxref'.length;
776          if (pos < 0)
777            pos = 0;
778          stream.pos = pos;
779          found = find(stream, 'startxref', step, true);
780        }
781        if (found) {
782          stream.skip(9);
783          var ch;
784          do {
785            ch = stream.getChar();
786          } while (Lexer.isSpace(ch));
787          var str = '';
788          while ((ch - '0') <= 9) {
789            str += ch;
790            ch = stream.getChar();
791          }
792          startXRef = parseInt(str, 10);
793          if (isNaN(startXRef))
794            startXRef = 0;
795        }
796      }
797      // shadow the prototype getter with a data property
798      return shadow(this, 'startXRef', startXRef);
799    },
800    get mainXRefEntriesOffset() {
801      var mainXRefEntriesOffset = 0;
802      var linearization = this.linearization;
803      if (linearization)
804        mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
805      // shadow the prototype getter with a data property
806      return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
807    },
808    // Find the header, remove leading garbage and setup the stream
809    // starting from the header.
810    checkHeader: function PDFDocument_checkHeader() {
811      var stream = this.stream;
812      stream.reset();
813      if (find(stream, '%PDF-', 1024)) {
814        // Found the header, trim off any garbage before it.
815        stream.moveStart();
816        return;
817      }
818      // May not be a PDF file, continue anyway.
819    },
820    setup: function PDFDocument_setup(ownerPassword, userPassword) {
821      this.checkHeader();
822      var xref = new XRef(this.stream,
823                          this.startXRef,
824                          this.mainXRefEntriesOffset);
825      this.xref = xref;
826      this.catalog = new Catalog(xref);
827    },
828    get numPages() {
829      var linearization = this.linearization;
830      var num = linearization ? linearization.numPages : this.catalog.numPages;
831      // shadow the prototype getter
832      return shadow(this, 'numPages', num);
833    },
834    getDocumentInfo: function PDFDocument_getDocumentInfo() {
835      var info;
836      if (this.xref.trailer.has('Info')) {
837        var infoDict = this.xref.trailer.get('Info');
838
839        info = {};
840        infoDict.forEach(function(key, value) {
841          info[key] = typeof value !== 'string' ? value :
842            stringToPDFString(value);
843        });
844      }
845
846      return shadow(this, 'getDocumentInfo', info);
847    },
848    getFingerprint: function PDFDocument_getFingerprint() {
849      var xref = this.xref, fileID;
850      if (xref.trailer.has('ID')) {
851        fileID = '';
852        var id = xref.trailer.get('ID')[0];
853        id.split('').forEach(function(el) {
854          fileID += Number(el.charCodeAt(0)).toString(16);
855        });
856      } else {
857        // If we got no fileID, then we generate one,
858        // from the first 100 bytes of PDF
859        var data = this.stream.bytes.subarray(0, 100);
860        var hash = calculateMD5(data, 0, data.length);
861        fileID = '';
862        for (var i = 0, length = hash.length; i < length; i++) {
863          fileID += Number(hash[i]).toString(16);
864        }
865      }
866
867      return shadow(this, 'getFingerprint', fileID);
868    },
869    getPage: function PDFDocument_getPage(n) {
870      return this.catalog.getPage(n);
871    }
872  };
873
874  return PDFDocument;
875})();
876
877/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
878/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
879
880'use strict';
881
882function log(msg) {
883  if (PdfJS_window.console && PdfJS_window.console.log)
884    PdfJS_window.console.log(msg);
885  else if (print)
886    print(msg);
887}
888
889function warn(msg) {
890  if (verbosity >= WARNINGS)
891    log('Warning: ' + msg);
892}
893
894function backtrace() {
895  try {
896    throw new Error();
897  } catch (e) {
898    return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
899  }
900}
901
902function error(msg) {
903  log('Error: ' + msg);
904  log(backtrace());
905  throw new Error(msg);
906}
907
908function TODO(what) {
909  if (verbosity >= TODOS)
910    log('TODO: ' + what);
911}
912
913function malformed(msg) {
914  error('Malformed PDF: ' + msg);
915}
916
917function assert(cond, msg) {
918  if (!cond)
919    error(msg);
920}
921
922// In a well-formed PDF, |cond| holds.  If it doesn't, subsequent
923// behavior is undefined.
924function assertWellFormed(cond, msg) {
925  if (!cond)
926    malformed(msg);
927}
928
929function shadow(obj, prop, value) {
930  Object.defineProperty(obj, prop, { value: value,
931                                     enumerable: true,
932                                     configurable: true,
933                                     writable: false });
934  return value;
935}
936
937function bytesToString(bytes) {
938  var str = '';
939  var length = bytes.length;
940  for (var n = 0; n < length; ++n)
941    str += String.fromCharCode(bytes[n]);
942  return str;
943}
944
945function stringToBytes(str) {
946  var length = str.length;
947  var bytes = new Uint8Array(length);
948  for (var n = 0; n < length; ++n)
949    bytes[n] = str.charCodeAt(n) & 0xFF;
950  return bytes;
951}
952
953var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
954
955var Util = PDFJS.Util = (function UtilClosure() {
956  function Util() {}
957
958  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
959    var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0;
960    return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
961  };
962
963  Util.makeCssCmyk = function Util_makeCssCmyk(c, m, y, k) {
964    c = (new DeviceCmykCS()).getRgb([c, m, y, k]);
965    var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0;
966    return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
967  };
968
969  // For 2d affine transforms
970  Util.applyTransform = function Util_applyTransform(p, m) {
971    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
972    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
973    return [xt, yt];
974  };
975
976  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
977    var d = m[0] * m[3] - m[1] * m[2];
978    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
979    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
980    return [xt, yt];
981  };
982
983  Util.inverseTransform = function Util_inverseTransform(m) {
984    var d = m[0] * m[3] - m[1] * m[2];
985    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
986      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
987  };
988
989  // Apply a generic 3d matrix M on a 3-vector v:
990  //   | a b c |   | X |
991  //   | d e f | x | Y |
992  //   | g h i |   | Z |
993  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
994  // with v as [X,Y,Z]
995  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
996    return [
997      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
998      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
999      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
1000    ];
1001  }
1002
1003  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
1004  // For coordinate systems whose origin lies in the bottom-left, this
1005  // means normalization to (BL,TR) ordering. For systems with origin in the
1006  // top-left, this means (TL,BR) ordering.
1007  Util.normalizeRect = function Util_normalizeRect(rect) {
1008    var r = rect.slice(0); // clone rect
1009    if (rect[0] > rect[2]) {
1010      r[0] = rect[2];
1011      r[2] = rect[0];
1012    }
1013    if (rect[1] > rect[3]) {
1014      r[1] = rect[3];
1015      r[3] = rect[1];
1016    }
1017    return r;
1018  }
1019
1020  // Returns a rectangle [x1, y1, x2, y2] corresponding to the
1021  // intersection of rect1 and rect2. If no intersection, returns 'false'
1022  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
1023  Util.intersect = function Util_intersect(rect1, rect2) {
1024    function compare(a, b) {
1025      return a - b;
1026    };
1027
1028    // Order points along the axes
1029    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
1030        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
1031        result = [];
1032
1033    rect1 = Util.normalizeRect(rect1);
1034    rect2 = Util.normalizeRect(rect2);
1035
1036    // X: first and second points belong to different rectangles?
1037    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
1038        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
1039      // Intersection must be between second and third points
1040      result[0] = orderedX[1];
1041      result[2] = orderedX[2];
1042    } else {
1043      return false;
1044    }
1045
1046    // Y: first and second points belong to different rectangles?
1047    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
1048        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
1049      // Intersection must be between second and third points
1050      result[1] = orderedY[1];
1051      result[3] = orderedY[2];
1052    } else {
1053      return false;
1054    }
1055
1056    return result;
1057  };
1058
1059  Util.sign = function Util_sign(num) {
1060    return num < 0 ? -1 : 1;
1061  };
1062
1063  return Util;
1064})();
1065
1066var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
1067  function PageViewport(viewBox, scale, rotate, offsetX, offsetY) {
1068    // creating transform to convert pdf coordinate system to the normal
1069    // canvas like coordinates taking in account scale and rotation
1070    var centerX = (viewBox[2] + viewBox[0]) / 2;
1071    var centerY = (viewBox[3] + viewBox[1]) / 2;
1072    var rotateA, rotateB, rotateC, rotateD;
1073    switch (rotate) {
1074      case -180:
1075      case 180:
1076        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
1077        break;
1078      case -270:
1079      case 90:
1080        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
1081        break;
1082      case -90:
1083      case 270:
1084        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
1085        break;
1086      case 360:
1087      case 0:
1088      default:
1089        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
1090        break;
1091    }
1092    var offsetCanvasX, offsetCanvasY;
1093    var width, height;
1094    if (rotateA == 0) {
1095      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
1096      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
1097      width = Math.abs(viewBox[3] - viewBox[1]) * scale;
1098      height = Math.abs(viewBox[2] - viewBox[0]) * scale;
1099    } else {
1100      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
1101      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
1102      width = Math.abs(viewBox[2] - viewBox[0]) * scale;
1103      height = Math.abs(viewBox[3] - viewBox[1]) * scale;
1104    }
1105    // creating transform for the following operations:
1106    // translate(-centerX, -centerY), rotate and flip vertically,
1107    // scale, and translate(offsetCanvasX, offsetCanvasY)
1108    this.transform = [
1109      rotateA * scale,
1110      rotateB * scale,
1111      rotateC * scale,
1112      rotateD * scale,
1113      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
1114      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
1115    ];
1116
1117    this.offsetX = offsetX;
1118    this.offsetY = offsetY;
1119    this.width = width;
1120    this.height = height;
1121    this.fontScale = scale;
1122  }
1123  PageViewport.prototype = {
1124    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
1125      return Util.applyTransform([x, y], this.transform);
1126    },
1127    convertToViewportRectangle:
1128      function PageViewport_convertToViewportRectangle(rect) {
1129      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
1130      var br = Util.applyTransform([rect[2], rect[3]], this.transform);
1131      return [tl[0], tl[1], br[0], br[1]];
1132    },
1133    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
1134      return Util.applyInverseTransform([x, y], this.transform);
1135    }
1136  };
1137  return PageViewport;
1138})();
1139
1140var PDFStringTranslateTable = [
1141  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1142  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
1143  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,
1144  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,
1145  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,
1146  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
1147  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
1148  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
1149  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
1150];
1151
1152function stringToPDFString(str) {
1153  var i, n = str.length, str2 = '';
1154  if (str[0] === '\xFE' && str[1] === '\xFF') {
1155    // UTF16BE BOM
1156    for (i = 2; i < n; i += 2)
1157      str2 += String.fromCharCode(
1158        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1));
1159  } else {
1160    for (i = 0; i < n; ++i) {
1161      var code = PDFStringTranslateTable[str.charCodeAt(i)];
1162      str2 += code ? String.fromCharCode(code) : str.charAt(i);
1163    }
1164  }
1165  return str2;
1166}
1167
1168function isBool(v) {
1169  return typeof v == 'boolean';
1170}
1171
1172function isInt(v) {
1173  return typeof v == 'number' && ((v | 0) == v);
1174}
1175
1176function isNum(v) {
1177  return typeof v == 'number';
1178}
1179
1180function isString(v) {
1181  return typeof v == 'string';
1182}
1183
1184function isNull(v) {
1185  return v === null;
1186}
1187
1188function isName(v) {
1189  return v instanceof Name;
1190}
1191
1192function isCmd(v, cmd) {
1193  return v instanceof Cmd && (!cmd || v.cmd == cmd);
1194}
1195
1196function isDict(v, type) {
1197  return v instanceof Dict && (!type || v.get('Type').name == type);
1198}
1199
1200function isArray(v) {
1201  return v instanceof Array;
1202}
1203
1204function isStream(v) {
1205  return typeof v == 'object' && v != null && ('getChar' in v);
1206}
1207
1208function isArrayBuffer(v) {
1209  return typeof v == 'object' && v != null && ('byteLength' in v);
1210}
1211
1212function isRef(v) {
1213  return v instanceof Ref;
1214}
1215
1216function isPDFFunction(v) {
1217  var fnDict;
1218  if (typeof v != 'object')
1219    return false;
1220  else if (isDict(v))
1221    fnDict = v;
1222  else if (isStream(v))
1223    fnDict = v.dict;
1224  else
1225    return false;
1226  return fnDict.has('FunctionType');
1227}
1228
1229/**
1230 * 'Promise' object.
1231 * Each object that is stored in PDFObjects is based on a Promise object that
1232 * contains the status of the object and the data. There migth be situations,
1233 * where a function want to use the value of an object, but it isn't ready at
1234 * that time. To get a notification, once the object is ready to be used, s.o.
1235 * can add a callback using the `then` method on the promise that then calls
1236 * the callback once the object gets resolved.
1237 * A promise can get resolved only once and only once the data of the promise
1238 * can be set. If any of these happens twice or the data is required before
1239 * it was set, an exception is throw.
1240 */
1241var Promise = PDFJS.Promise = (function PromiseClosure() {
1242  var EMPTY_PROMISE = {};
1243
1244  /**
1245   * If `data` is passed in this constructor, the promise is created resolved.
1246   * If there isn't data, it isn't resolved at the beginning.
1247   */
1248  function Promise(name, data) {
1249    this.name = name;
1250    this.isRejected = false;
1251    this.error = null;
1252    // If you build a promise and pass in some data it's already resolved.
1253    if (data != null) {
1254      this.isResolved = true;
1255      this._data = data;
1256      this.hasData = true;
1257    } else {
1258      this.isResolved = false;
1259      this._data = EMPTY_PROMISE;
1260    }
1261    this.callbacks = [];
1262    this.errbacks = [];
1263    this.progressbacks = [];
1264  };
1265  /**
1266   * Builds a promise that is resolved when all the passed in promises are
1267   * resolved.
1268   * @param {Promise[]} promises Array of promises to wait for.
1269   * @return {Promise} New dependant promise.
1270   */
1271  Promise.all = function Promise_all(promises) {
1272    var deferred = new Promise();
1273    var unresolved = promises.length;
1274    var results = [];
1275    if (unresolved === 0) {
1276      deferred.resolve(results);
1277      return deferred;
1278    }
1279    for (var i = 0, ii = promises.length; i < ii; ++i) {
1280      var promise = promises[i];
1281      promise.then((function(i) {
1282        return function(value) {
1283          results[i] = value;
1284          unresolved--;
1285          if (unresolved === 0)
1286            deferred.resolve(results);
1287        };
1288      })(i));
1289    }
1290    return deferred;
1291  };
1292  Promise.prototype = {
1293    hasData: false,
1294
1295    set data(value) {
1296      if (value === undefined) {
1297        return;
1298      }
1299      if (this._data !== EMPTY_PROMISE) {
1300        error('Promise ' + this.name +
1301              ': Cannot set the data of a promise twice');
1302      }
1303      this._data = value;
1304      this.hasData = true;
1305
1306      if (this.onDataCallback) {
1307        this.onDataCallback(value);
1308      }
1309    },
1310
1311    get data() {
1312      if (this._data === EMPTY_PROMISE) {
1313        error('Promise ' + this.name + ': Cannot get data that isn\'t set');
1314      }
1315      return this._data;
1316    },
1317
1318    onData: function Promise_onData(callback) {
1319      if (this._data !== EMPTY_PROMISE) {
1320        callback(this._data);
1321      } else {
1322        this.onDataCallback = callback;
1323      }
1324    },
1325
1326    resolve: function Promise_resolve(data) {
1327      if (this.isResolved) {
1328        error('A Promise can be resolved only once ' + this.name);
1329      }
1330      if (this.isRejected) {
1331        error('The Promise was already rejected ' + this.name);
1332      }
1333
1334      this.isResolved = true;
1335      this.data = data || null;
1336      var callbacks = this.callbacks;
1337
1338      for (var i = 0, ii = callbacks.length; i < ii; i++) {
1339        callbacks[i].call(null, data);
1340      }
1341    },
1342
1343    progress: function Promise_progress(data) {
1344      var callbacks = this.progressbacks;
1345      for (var i = 0, ii = callbacks.length; i < ii; i++) {
1346        callbacks[i].call(null, data);
1347      }
1348    },
1349
1350    reject: function Promise_reject(reason) {
1351      if (this.isRejected) {
1352        error('A Promise can be rejected only once ' + this.name);
1353      }
1354      if (this.isResolved) {
1355        error('The Promise was already resolved ' + this.name);
1356      }
1357
1358      this.isRejected = true;
1359      this.error = reason || null;
1360      var errbacks = this.errbacks;
1361
1362      for (var i = 0, ii = errbacks.length; i < ii; i++) {
1363        errbacks[i].call(null, reason);
1364      }
1365    },
1366
1367    then: function Promise_then(callback, errback, progressback) {
1368      if (!callback) {
1369        error('Requiring callback' + this.name);
1370      }
1371
1372      // If the promise is already resolved, call the callback directly.
1373      if (this.isResolved) {
1374        var data = this.data;
1375        callback.call(null, data);
1376      } else if (this.isRejected && errback) {
1377        var error = this.error;
1378        errback.call(null, error);
1379      } else {
1380        this.callbacks.push(callback);
1381        if (errback)
1382          this.errbacks.push(errback);
1383      }
1384
1385      if (progressback)
1386        this.progressbacks.push(progressback);
1387    }
1388  };
1389
1390  return Promise;
1391})();
1392
1393var StatTimer = (function StatTimerClosure() {
1394  function rpad(str, pad, length) {
1395    while (str.length < length)
1396      str += pad;
1397    return str;
1398  }
1399  function StatTimer() {
1400    this.started = {};
1401    this.times = [];
1402    this.enabled = true;
1403  }
1404  StatTimer.prototype = {
1405    time: function StatTimer_time(name) {
1406      if (!this.enabled)
1407        return;
1408      if (name in this.started)
1409        throw 'Timer is already running for ' + name;
1410      this.started[name] = Date.now();
1411    },
1412    timeEnd: function StatTimer_timeEnd(name) {
1413      if (!this.enabled)
1414        return;
1415      if (!(name in this.started))
1416        throw 'Timer has not been started for ' + name;
1417      this.times.push({
1418        'name': name,
1419        'start': this.started[name],
1420        'end': Date.now()
1421      });
1422      // Remove timer from started so it can be called again.
1423      delete this.started[name];
1424    },
1425    toString: function StatTimer_toString() {
1426      var times = this.times;
1427      var out = '';
1428      // Find the longest name for padding purposes.
1429      var longest = 0;
1430      for (var i = 0, ii = times.length; i < ii; ++i) {
1431        var name = times[i]['name'];
1432        if (name.length > longest)
1433          longest = name.length;
1434      }
1435      for (var i = 0, ii = times.length; i < ii; ++i) {
1436        var span = times[i];
1437        var duration = span.end - span.start;
1438        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
1439      }
1440      return out;
1441    }
1442  };
1443  return StatTimer;
1444})();
1445
1446/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1447/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
1448
1449/**
1450 * This is the main entry point for loading a PDF and interacting with it.
1451 * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
1452 * is used, which means it must follow the same origin rules that any XHR does
1453 * e.g. No cross domain requests without CORS.
1454 *
1455 * @param {string|TypedAray} source Either a url to a PDF is located or a
1456 * typed array already populated with data.
1457 * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object.
1458 */
1459PDFJS.getDocument = function getDocument(source) {
1460  var promise = new PDFJS.Promise();
1461  var transport = new WorkerTransport(promise);
1462  if (typeof source === 'string') {
1463    // fetch url
1464    PDFJS.getPdf(
1465      {
1466        url: source,
1467        progress: function getPDFProgress(evt) {
1468          if (evt.lengthComputable)
1469            promise.progress({
1470              loaded: evt.loaded,
1471              total: evt.total
1472            });
1473        },
1474        error: function getPDFError(e) {
1475          promise.reject('Unexpected server response of ' +
1476            e.target.status + '.');
1477        }
1478      },
1479      function getPDFLoad(data) {
1480        transport.sendData(data);
1481      });
1482  } else {
1483    // assuming the source is array, instantiating directly from it
1484    transport.sendData(source);
1485  }
1486  return promise;
1487};
1488
1489/**
1490 * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
1491 * properties that can be read synchronously.
1492 */
1493var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
1494  function PDFDocumentProxy(pdfInfo, transport) {
1495    this.pdfInfo = pdfInfo;
1496    this.transport = transport;
1497  }
1498  PDFDocumentProxy.prototype = {
1499    /**
1500     * @return {number} Total number of pages the PDF contains.
1501     */
1502    get numPages() {
1503      return this.pdfInfo.numPages;
1504    },
1505    /**
1506     * @return {string} A unique ID to identify a PDF. Not guaranteed to be
1507     * unique.
1508     */
1509    get fingerprint() {
1510      return this.pdfInfo.fingerprint;
1511    },
1512    /**
1513     * @param {number} The page number to get. The first page is 1.
1514     * @return {Promise} A promise that is resolved with a {PDFPageProxy}
1515     * object.
1516     */
1517    getPage: function PDFDocumentProxy_getPage(number) {
1518      return this.transport.getPage(number);
1519    },
1520    /**
1521     * @return {Promise} A promise that is resolved with a lookup table for
1522     * mapping named destinations to reference numbers.
1523     */
1524    getDestinations: function PDFDocumentProxy_getDestinations() {
1525      var promise = new PDFJS.Promise();
1526      var destinations = this.pdfInfo.destinations;
1527      promise.resolve(destinations);
1528      return promise;
1529    },
1530    /**
1531     * @return {Promise} A promise that is resolved with an {array} that is a
1532     * tree outline (if it has one) of the PDF. The tree is in the format of:
1533     * [
1534     *  {
1535     *   title: string,
1536     *   bold: boolean,
1537     *   italic: boolean,
1538     *   color: rgb array,
1539     *   dest: dest obj,
1540     *   items: array of more items like this
1541     *  },
1542     *  ...
1543     * ].
1544     */
1545    getOutline: function PDFDocumentProxy_getOutline() {
1546      var promise = new PDFJS.Promise();
1547      var outline = this.pdfInfo.outline;
1548      promise.resolve(outline);
1549      return promise;
1550    },
1551    /**
1552     * @return {Promise} A promise that is resolved with an {object} that has
1553     * info and metadata properties.  Info is an {object} filled with anything
1554     * available in the information dictionary and similarly metadata is a
1555     * {Metadata} object with information from the metadata section of the PDF.
1556     */
1557    getMetadata: function PDFDocumentProxy_getMetadata() {
1558      var promise = new PDFJS.Promise();
1559      var info = this.pdfInfo.info;
1560      var metadata = this.pdfInfo.metadata;
1561      promise.resolve({
1562        info: info,
1563        metadata: metadata ? new PDFJS.Metadata(metadata) : null
1564      });
1565      return promise;
1566    },
1567    destroy: function PDFDocumentProxy_destroy() {
1568      this.transport.destroy();
1569    }
1570  };
1571  return PDFDocumentProxy;
1572})();
1573
1574var PDFPageProxy = (function PDFPageProxyClosure() {
1575  function PDFPageProxy(pageInfo, transport) {
1576    this.pageInfo = pageInfo;
1577    this.transport = transport;
1578    this.stats = new StatTimer();
1579    this.stats.enabled = !!globalScope.PDFJS.enableStats;
1580    this.objs = transport.objs;
1581    this.renderInProgress = false;
1582  }
1583  PDFPageProxy.prototype = {
1584    /**
1585     * @return {number} Page number of the page. First page is 1.
1586     */
1587    get pageNumber() {
1588      return this.pageInfo.pageIndex + 1;
1589    },
1590    /**
1591     * @return {number} The number of degrees the page is rotated clockwise.
1592     */
1593    get rotate() {
1594      return this.pageInfo.rotate;
1595    },
1596    /**
1597     * @return {object} The reference that points to this page. It has 'num' and
1598     * 'gen' properties.
1599     */
1600    get ref() {
1601      return this.pageInfo.ref;
1602    },
1603    /**
1604     * @return {array} An array of the visible portion of the PDF page in the
1605     * user space units - [x1, y1, x2, y2].
1606     */
1607    get view() {
1608      return this.pageInfo.view;
1609    },
1610    /**
1611     * @param {number} scale The desired scale of the viewport.
1612     * @param {number} rotate Degrees to rotate the viewport. If omitted this
1613     * defaults to the page rotation.
1614     * @return {PageViewport} Contains 'width' and 'height' properties along
1615     * with transforms required for rendering.
1616     */
1617    getViewport: function PDFPageProxy_getViewport(scale, rotate) {
1618      if (arguments.length < 2)
1619        rotate = this.rotate;
1620      return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
1621    },
1622    /**
1623     * @return {Promise} A promise that is resolved with an {array} of the
1624     * annotation objects.
1625     */
1626    getAnnotations: function PDFPageProxy_getAnnotations() {
1627      if (this.annotationsPromise)
1628        return this.annotationsPromise;
1629
1630      var promise = new PDFJS.Promise();
1631      this.annotationsPromise = promise;
1632      this.transport.getAnnotations(this.pageInfo.pageIndex);
1633      return promise;
1634    },
1635    /**
1636     * Begins the process of rendering a page to the desired context.
1637     * @param {object} params A parameter object that supports:
1638     * {
1639     *   canvasContext(required): A 2D context of a DOM Canvas object.,
1640     *   textLayer(optional): An object that has beginLayout, endLayout, and
1641     *                        appendText functions.
1642     * }.
1643     * @return {Promise} A promise that is resolved when the page finishes
1644     * rendering.
1645     */
1646    render: function PDFPageProxy_render(params) {
1647      this.renderInProgress = true;
1648
1649      var promise = new Promise();
1650      var stats = this.stats;
1651      stats.time('Overall');
1652      // If there is no displayReadyPromise yet, then the operatorList was never
1653      // requested before. Make the request and create the promise.
1654      if (!this.displayReadyPromise) {
1655        this.displayReadyPromise = new Promise();
1656        this.destroyed = false;
1657
1658        this.stats.time('Page Request');
1659        this.transport.messageHandler.send('RenderPageRequest', {
1660          pageIndex: this.pageNumber - 1
1661        });
1662      }
1663
1664      var self = this;
1665      function complete(error) {
1666        self.renderInProgress = false;
1667        if (self.destroyed) {
1668          delete self.operatorList;
1669          delete self.displayReadyPromise;
1670        }
1671
1672        if (error)
1673          promise.reject(error);
1674        else
1675          promise.resolve();
1676      };
1677
1678      // Once the operatorList and fonts are loaded, do the actual rendering.
1679      this.displayReadyPromise.then(
1680        function pageDisplayReadyPromise() {
1681          if (self.destroyed) {
1682            complete();
1683            return;
1684          }
1685
1686          var gfx = new CanvasGraphics(params.canvasContext,
1687            this.objs, params.textLayer);
1688          try {
1689           this.display(gfx, params.viewport, complete);
1690          } catch (e) {
1691            complete(e);
1692          }
1693        }.bind(this),
1694        function pageDisplayReadPromiseError(reason) {
1695          complete(reason);
1696        }
1697      );
1698
1699      return promise;
1700    },
1701    /**
1702     * For internal use only.
1703     */
1704    startRenderingFromOperatorList:
1705      function PDFPageProxy_startRenderingFromOperatorList(operatorList,
1706                                                           fonts) {
1707      var self = this;
1708      this.operatorList = operatorList;
1709
1710      var displayContinuation = function pageDisplayContinuation() {
1711        // Always defer call to display() to work around bug in
1712        // Firefox error reporting from XHR callbacks.
1713        PdfJS_window.setTimeout(function pageSetTimeout() {
1714          self.displayReadyPromise.resolve();
1715        });
1716      };
1717
1718      this.ensureFonts(fonts,
1719        function pageStartRenderingFromOperatorListEnsureFonts() {
1720          displayContinuation();
1721        }
1722      );
1723    },
1724    /**
1725     * For internal use only.
1726     */
1727    ensureFonts: function PDFPageProxy_ensureFonts(fonts, callback) {
1728      this.stats.time('Font Loading');
1729      // Convert the font names to the corresponding font obj.
1730      for (var i = 0, ii = fonts.length; i < ii; i++) {
1731        fonts[i] = this.objs.objs[fonts[i]].data;
1732      }
1733
1734      // Load all the fonts
1735      FontLoader.bind(
1736        fonts,
1737        function pageEnsureFontsFontObjs(fontObjs) {
1738          this.stats.timeEnd('Font Loading');
1739
1740          callback.call(this);
1741        }.bind(this)
1742      );
1743    },
1744    /**
1745     * For internal use only.
1746     */
1747    display: function PDFPageProxy_display(gfx, viewport, callback) {
1748      var stats = this.stats;
1749      stats.time('Rendering');
1750
1751      gfx.beginDrawing(viewport);
1752
1753      var startIdx = 0;
1754      var length = this.operatorList.fnArray.length;
1755      var operatorList = this.operatorList;
1756      var stepper = null;
1757      if (PDFJS.pdfBug && StepperManager.enabled) {
1758        stepper = StepperManager.create(this.pageNumber - 1);
1759        stepper.init(operatorList);
1760        stepper.nextBreakPoint = stepper.getNextBreakPoint();
1761      }
1762
1763      var self = this;
1764      function next() {
1765        startIdx =
1766          gfx.executeOperatorList(operatorList, startIdx, next, stepper);
1767        if (startIdx == length) {
1768          gfx.endDrawing();
1769          stats.timeEnd('Rendering');
1770          stats.timeEnd('Overall');
1771          if (callback) callback();
1772        }
1773      }
1774      next();
1775    },
1776    /**
1777     * Stub for future feature.
1778     */
1779    getTextContent: function PDFPageProxy_getTextContent() {
1780      var promise = new PDFJS.Promise();
1781      var textContent = 'page text'; // not implemented
1782      promise.resolve(textContent);
1783      return promise;
1784    },
1785    /**
1786     * Stub for future feature.
1787     */
1788    getOperationList: function PDFPageProxy_getOperationList() {
1789      var promise = new PDFJS.Promise();
1790      var operationList = { // not implemented
1791        dependencyFontsID: null,
1792        operatorList: null
1793      };
1794      promise.resolve(operationList);
1795      return promise;
1796    },
1797    /**
1798     * Destroys resources allocated by the page.
1799     */
1800    destroy: function PDFPageProxy_destroy() {
1801      this.destroyed = true;
1802
1803      if (!this.renderInProgress) {
1804        delete this.operatorList;
1805        delete this.displayReadyPromise;
1806      }
1807    }
1808  };
1809  return PDFPageProxy;
1810})();
1811/**
1812 * For internal use only.
1813 */
1814var WorkerTransport = (function WorkerTransportClosure() {
1815  function WorkerTransport(promise) {
1816    this.workerReadyPromise = promise;
1817    this.objs = new PDFObjects();
1818
1819    this.pageCache = [];
1820    this.pagePromises = [];
1821    this.fontsLoading = {};
1822
1823    // If worker support isn't disabled explicit and the browser has worker
1824    // support, create a new web worker and test if it/the browser fullfills
1825    // all requirements to run parts of pdf.js in a web worker.
1826    // Right now, the requirement is, that an Uint8Array is still an Uint8Array
1827    // as it arrives on the worker. Chrome added this with version 15.
1828    if (!globalScope.PDFJS.disableWorker && typeof PdfJS_window.Worker !== 'undefined') {
1829      var workerSrc = PDFJS.workerSrc;
1830      if (typeof workerSrc === 'undefined') {
1831        error('No PDFJS.workerSrc specified');
1832      }
1833
1834      try {
1835        var worker;
1836        if (PDFJS.isFirefoxExtension) {
1837          // The firefox extension can't load the worker from the resource://
1838          // url so we have to inline the script and then use the blob loader.
1839          var bb = new MozBlobBuilder();
1840          bb.append(PdfJS_window.document.querySelector('#PDFJS_SCRIPT_TAG').textContent);
1841          var blobUrl = PdfJS_window.window.URL.createObjectURL(bb.getBlob());
1842          worker = new Worker(blobUrl);
1843        } else {
1844          // Some versions of FF can't create a worker on localhost, see:
1845          // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
1846          worker = new Worker(workerSrc);
1847        }
1848
1849        var messageHandler = new MessageHandler('main', worker);
1850        this.messageHandler = messageHandler;
1851
1852        messageHandler.on('test', function transportTest(supportTypedArray) {
1853          if (supportTypedArray) {
1854            this.worker = worker;
1855            this.setupMessageHandler(messageHandler);
1856          } else {
1857            globalScope.PDFJS.disableWorker = true;
1858            this.setupFakeWorker();
1859          }
1860        }.bind(this));
1861
1862        var testObj = new Uint8Array(1);
1863        // Some versions of Opera throw a DATA_CLONE_ERR on
1864        // serializing the typed array.
1865        messageHandler.send('test', testObj);
1866        return;
1867      } catch (e) {
1868        warn('The worker has been disabled.');
1869      }
1870    }
1871    // Either workers are disabled, not supported or have thrown an exception.
1872    // Thus, we fallback to a faked worker.
1873    globalScope.PDFJS.disableWorker = true;
1874    this.setupFakeWorker();
1875  }
1876  WorkerTransport.prototype = {
1877    destroy: function WorkerTransport_destroy() {
1878      if (this.worker)
1879        this.worker.terminate();
1880
1881      this.pageCache = [];
1882      this.pagePromises = [];
1883    },
1884    setupFakeWorker: function WorkerTransport_setupFakeWorker() {
1885      // If we don't use a worker, just post/sendMessage to the main thread.
1886      var fakeWorker = {
1887        postMessage: function WorkerTransport_postMessage(obj) {
1888          fakeWorker.onmessage({data: obj});
1889        },
1890        terminate: function WorkerTransport_terminate() {}
1891      };
1892
1893      var messageHandler = new MessageHandler('main', fakeWorker);
1894      this.setupMessageHandler(messageHandler);
1895
1896      // If the main thread is our worker, setup the handling for the messages
1897      // the main thread sends to it self.
1898      WorkerMessageHandler.setup(messageHandler);
1899    },
1900
1901    setupMessageHandler:
1902      function WorkerTransport_setupMessageHandler(messageHandler) {
1903      this.messageHandler = messageHandler;
1904
1905      messageHandler.on('GetDoc', function transportDoc(data) {
1906        var pdfInfo = data.pdfInfo;
1907        var pdfDocument = new PDFDocumentProxy(pdfInfo, this);
1908        this.pdfDocument = pdfDocument;
1909        this.workerReadyPromise.resolve(pdfDocument);
1910      }, this);
1911
1912      messageHandler.on('GetPage', function transportPage(data) {
1913        var pageInfo = data.pageInfo;
1914        var page = new PDFPageProxy(pageInfo, this);
1915        this.pageCache[pageInfo.pageIndex] = page;
1916        var promise = this.pagePromises[pageInfo.pageIndex];
1917        promise.resolve(page);
1918      }, this);
1919
1920      messageHandler.on('GetAnnotations', function transportAnnotations(data) {
1921        var annotations = data.annotations;
1922        var promise = this.pageCache[data.pageIndex].annotationsPromise;
1923        promise.resolve(annotations);
1924      }, this);
1925
1926      messageHandler.on('RenderPage', function transportRender(data) {
1927        var page = this.pageCache[data.pageIndex];
1928        var depFonts = data.depFonts;
1929
1930        page.stats.timeEnd('Page Request');
1931        page.startRenderingFromOperatorList(data.operatorList, depFonts);
1932      }, this);
1933
1934      messageHandler.on('obj', function transportObj(data) {
1935        var id = data[0];
1936        var type = data[1];
1937        if (this.objs.hasData(id))
1938          return;
1939
1940        switch (type) {
1941          case 'JpegStream':
1942            var imageData = data[2];
1943            loadJpegStream(id, imageData, this.objs);
1944            break;
1945          case 'Image':
1946            var imageData = data[2];
1947            this.objs.resolve(id, imageData);
1948            break;
1949          case 'Font':
1950            var name = data[2];
1951            var file = data[3];
1952            var properties = data[4];
1953
1954            if (file) {
1955              // Rewrap the ArrayBuffer in a stream.
1956              var fontFileDict = new Dict();
1957              file = new Stream(file, 0, file.length, fontFileDict);
1958            }
1959
1960            // At this point, only the font object is created but the font is
1961            // not yet attached to the DOM. This is done in `FontLoader.bind`.
1962            var font = new Font(name, file, properties);
1963            this.objs.resolve(id, font);
1964            break;
1965          default:
1966            error('Got unkown object type ' + type);
1967        }
1968      }, this);
1969
1970      messageHandler.on('PageError', function transportError(data) {
1971        var page = this.pageCache[data.pageNum - 1];
1972        if (page.displayReadyPromise)
1973          page.displayReadyPromise.reject(data.error);
1974        else
1975          error(data.error);
1976      }, this);
1977
1978      messageHandler.on('JpegDecode', function(data, promise) {
1979        var imageData = data[0];
1980        var components = data[1];
1981        if (components != 3 && components != 1)
1982          error('Only 3 component or 1 component can be returned');
1983
1984        var img = new Image();
1985        img.onload = (function messageHandler_onloadClosure() {
1986          var width = img.width;
1987          var height = img.height;
1988          var size = width * height;
1989          var rgbaLength = size * 4;
1990          var buf = new Uint8Array(size * components);
1991          var tmpCanvas = createScratchCanvas(width, height);
1992          var tmpCtx = tmpCanvas.getContext('2d');
1993          tmpCtx.drawImage(img, 0, 0);
1994          var data = tmpCtx.getImageData(0, 0, width, height).data;
1995
1996          if (components == 3) {
1997            for (var i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
1998              buf[j] = data[i];
1999              buf[j + 1] = data[i + 1];
2000              buf[j + 2] = data[i + 2];
2001            }
2002          } else if (components == 1) {
2003            for (var i = 0, j = 0; i < rgbaLength; i += 4, j++) {
2004              buf[j] = data[i];
2005            }
2006          }
2007          promise.resolve({ data: buf, width: width, height: height});
2008        }).bind(this);
2009        var src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData);
2010        img.src = src;
2011      });
2012    },
2013
2014    sendData: function WorkerTransport_sendData(data) {
2015      this.messageHandler.send('GetDocRequest', data);
2016    },
2017
2018    getPage: function WorkerTransport_getPage(pageNumber, promise) {
2019      var pageIndex = pageNumber - 1;
2020      if (pageIndex in this.pagePromises)
2021        return this.pagePromises[pageIndex];
2022      var promise = new PDFJS.Promise('Page ' + pageNumber);
2023      this.pagePromises[pageIndex] = promise;
2024      this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex });
2025      return promise;
2026    },
2027
2028    getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
2029      this.messageHandler.send('GetAnnotationsRequest',
2030        { pageIndex: pageIndex });
2031    }
2032  };
2033  return WorkerTransport;
2034
2035})();
2036
2037/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2038/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
2039
2040'use strict';
2041
2042// <canvas> contexts store most of the state we need natively.
2043// However, PDF needs a bit more state, which we store here.
2044
2045var TextRenderingMode = {
2046  FILL: 0,
2047  STROKE: 1,
2048  FILL_STROKE: 2,
2049  INVISIBLE: 3,
2050  FILL_ADD_TO_PATH: 4,
2051  STROKE_ADD_TO_PATH: 5,
2052  FILL_STROKE_ADD_TO_PATH: 6,
2053  ADD_TO_PATH: 7
2054};
2055
2056// Minimal font size that would be used during canvas fillText operations.
2057var MIN_FONT_SIZE = 1;
2058
2059function createScratchCanvas(width, height) {
2060  var canvas = PdfJS_window.document.createElement('canvas');
2061  canvas.width = width;
2062  canvas.height = height;
2063  return canvas;
2064}
2065
2066function addContextCurrentTransform(ctx) {
2067  // If the context doesn't expose a `mozCurrentTransform`, add a JS based on.
2068  if (!ctx.mozCurrentTransform) {
2069    // Store the original context
2070    ctx._originalSave = ctx.save;
2071    ctx._originalRestore = ctx.restore;
2072    ctx._originalRotate = ctx.rotate;
2073    ctx._originalScale = ctx.scale;
2074    ctx._originalTranslate = ctx.translate;
2075    ctx._originalTransform = ctx.transform;
2076
2077    ctx._transformMatrix = [1, 0, 0, 1, 0, 0];
2078    ctx._transformStack = [];
2079
2080    Object.defineProperty(ctx, 'mozCurrentTransform', {
2081      get: function getCurrentTransform() {
2082        return this._transformMatrix;
2083      }
2084    });
2085
2086    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
2087      get: function getCurrentTransformInverse() {
2088        // Calculation done using WolframAlpha:
2089        // http://www.wolframalpha.com/input/?
2090        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
2091
2092        var m = this._transformMatrix;
2093        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
2094
2095        var ad_bc = a * d - b * c;
2096        var bc_ad = b * c - a * d;
2097
2098        return [
2099          d / ad_bc,
2100          b / bc_ad,
2101          c / bc_ad,
2102          a / ad_bc,
2103          (d * e - c * f) / bc_ad,
2104          (b * e - a * f) / ad_bc
2105        ];
2106      }
2107    });
2108
2109    ctx.save = function ctxSave() {
2110      var old = this._transformMatrix;
2111      this._transformStack.push(old);
2112      this._transformMatrix = old.slice(0, 6);
2113
2114      this._originalSave();
2115    };
2116
2117    ctx.restore = function ctxRestore() {
2118      var prev = this._transformStack.pop();
2119      if (prev) {
2120        this._transformMatrix = prev;
2121        this._originalRestore();
2122      }
2123    };
2124
2125    ctx.translate = function ctxTranslate(x, y) {
2126      var m = this._transformMatrix;
2127      m[4] = m[0] * x + m[2] * y + m[4];
2128      m[5] = m[1] * x + m[3] * y + m[5];
2129
2130      this._originalTranslate(x, y);
2131    };
2132
2133    ctx.scale = function ctxScale(x, y) {
2134      var m = this._transformMatrix;
2135      m[0] = m[0] * x;
2136      m[1] = m[1] * x;
2137      m[2] = m[2] * y;
2138      m[3] = m[3] * y;
2139
2140      this._originalScale(x, y);
2141    };
2142
2143    ctx.transform = function ctxTransform(a, b, c, d, e, f) {
2144      var m = this._transformMatrix;
2145      this._transformMatrix = [
2146        m[0] * a + m[2] * b,
2147        m[1] * a + m[3] * b,
2148        m[0] * c + m[2] * d,
2149        m[1] * c + m[3] * d,
2150        m[0] * e + m[2] * f + m[4],
2151        m[1] * e + m[3] * f + m[5]
2152      ];
2153
2154      ctx._originalTransform(a, b, c, d, e, f);
2155    };
2156
2157    ctx.rotate = function ctxRotate(angle) {
2158      var cosValue = Math.cos(angle);
2159      var sinValue = Math.sin(angle);
2160
2161      var m = this._transformMatrix;
2162      this._transformMatrix = [
2163        m[0] * cosValue + m[2] * sinValue,
2164        m[1] * cosValue + m[3] * sinValue,
2165        m[0] * (-sinValue) + m[2] * cosValue,
2166        m[1] * (-sinValue) + m[3] * cosValue,
2167        m[4],
2168        m[5]
2169      ];
2170
2171      this._originalRotate(angle);
2172    };
2173  }
2174}
2175
2176var CanvasExtraState = (function CanvasExtraStateClosure() {
2177  function CanvasExtraState(old) {
2178    // Are soft masks and alpha values shapes or opacities?
2179    this.alphaIsShape = false;
2180    this.fontSize = 0;
2181    this.fontSizeScale = 1;
2182    this.textMatrix = IDENTITY_MATRIX;
2183    this.fontMatrix = IDENTITY_MATRIX;
2184    this.leading = 0;
2185    // Current point (in user coordinates)
2186    this.x = 0;
2187    this.y = 0;
2188    // Start of text line (in text coordinates)
2189    this.lineX = 0;
2190    this.lineY = 0;
2191    // Character and word spacing
2192    this.charSpacing = 0;
2193    this.wordSpacing = 0;
2194    this.textHScale = 1;
2195    this.textRenderingMode = TextRenderingMode.FILL;
2196    // Color spaces
2197    this.fillColorSpace = new DeviceGrayCS();
2198    this.fillColorSpaceObj = null;
2199    this.strokeColorSpace = new DeviceGrayCS();
2200    this.strokeColorSpaceObj = null;
2201    this.fillColorObj = null;
2202    this.strokeColorObj = null;
2203    // Default fore and background colors
2204    this.fillColor = '#000000';
2205    this.strokeColor = '#000000';
2206    // Note: fill alpha applies to all non-stroking operations
2207    this.fillAlpha = 1;
2208    this.strokeAlpha = 1;
2209    this.lineWidth = 1;
2210
2211    this.old = old;
2212  }
2213
2214  CanvasExtraState.prototype = {
2215    clone: function CanvasExtraState_clone() {
2216      return Object.create(this);
2217    },
2218    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
2219      this.x = x;
2220      this.y = y;
2221    }
2222  };
2223  return CanvasExtraState;
2224})();
2225
2226var CanvasGraphics = (function CanvasGraphicsClosure() {
2227  // Defines the time the executeOperatorList is going to be executing
2228  // before it stops and shedules a continue of execution.
2229  var kExecutionTime = 15;
2230
2231  function CanvasGraphics(canvasCtx, objs, textLayer) {
2232    this.ctx = canvasCtx;
2233    this.current = new CanvasExtraState();
2234    this.stateStack = [];
2235    this.pendingClip = null;
2236    this.res = null;
2237    this.xobjs = null;
2238    this.objs = objs;
2239    this.textLayer = textLayer;
2240    if (canvasCtx) {
2241      addContextCurrentTransform(canvasCtx);
2242    }
2243  }
2244
2245  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
2246  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
2247  var NORMAL_CLIP = {};
2248  var EO_CLIP = {};
2249
2250  CanvasGraphics.prototype = {
2251    slowCommands: {
2252      'stroke': true,
2253      'closeStroke': true,
2254      'fill': true,
2255      'eoFill': true,
2256      'fillStroke': true,
2257      'eoFillStroke': true,
2258      'closeFillStroke': true,
2259      'closeEOFillStroke': true,
2260      'showText': true,
2261      'showSpacedText': true,
2262      'setStrokeColorSpace': true,
2263      'setFillColorSpace': true,
2264      'setStrokeColor': true,
2265      'setStrokeColorN': true,
2266      'setFillColor': true,
2267      'setFillColorN': true,
2268      'setStrokeGray': true,
2269      'setFillGray': true,
2270      'setStrokeRGBColor': true,
2271      'setFillRGBColor': true,
2272      'setStrokeCMYKColor': true,
2273      'setFillCMYKColor': true,
2274      'paintJpegXObject': true,
2275      'paintImageXObject': true,
2276      'paintImageMaskXObject': true,
2277      'shadingFill': true
2278    },
2279
2280    beginDrawing: function CanvasGraphics_beginDrawing(viewport) {
2281      var transform = viewport.transform;
2282      this.ctx.save();
2283      this.ctx.transform.apply(this.ctx, transform);
2284
2285      if (this.textLayer)
2286        this.textLayer.beginLayout();
2287    },
2288
2289    executeOperatorList: function CanvasGraphics_executeOperatorList(
2290                                    operatorList,
2291                                    executionStartIdx, continueCallback,
2292                                    stepper) {
2293      var argsArray = operatorList.argsArray;
2294      var fnArray = operatorList.fnArray;
2295      var i = executionStartIdx || 0;
2296      var argsArrayLen = argsArray.length;
2297
2298      // Sometimes the OperatorList to execute is empty.
2299      if (argsArrayLen == i) {
2300        return i;
2301      }
2302
2303      var executionEndIdx;
2304      var endTime = Date.now() + kExecutionTime;
2305
2306      var objs = this.objs;
2307      var fnName;
2308      var slowCommands = this.slowCommands;
2309
2310      while (true) {
2311        if (stepper && i === stepper.nextBreakPoint) {
2312          stepper.breakIt(i, continueCallback);
2313          return i;
2314        }
2315
2316        fnName = fnArray[i];
2317
2318        if (fnName !== 'dependency') {
2319          this[fnName].apply(this, argsArray[i]);
2320        } else {
2321          var deps = argsArray[i];
2322          for (var n = 0, nn = deps.length; n < nn; n++) {
2323            var depObjId = deps[n];
2324
2325            // If the promise isn't resolved yet, add the continueCallback
2326            // to the promise and bail out.
2327            if (!objs.isResolved(depObjId)) {
2328              objs.get(depObjId, continueCallback);
2329              return i;
2330            }
2331          }
2332        }
2333
2334        i++;
2335
2336        // If the entire operatorList was executed, stop as were done.
2337        if (i == argsArrayLen) {
2338          return i;
2339        }
2340
2341        // If the execution took longer then a certain amount of time, shedule
2342        // to continue exeution after a short delay.
2343        // However, this is only possible if a 'continueCallback' is passed in.
2344        if (continueCallback && slowCommands[fnName] && Date.now() > endTime) {
2345          PdfJS_window.setTimeout(continueCallback, 0);
2346          return i;
2347        }
2348
2349        // If the operatorList isn't executed completely yet OR the execution
2350        // time was short enough, do another execution round.
2351      }
2352    },
2353
2354    endDrawing: function CanvasGraphics_endDrawing() {
2355      this.ctx.restore();
2356
2357      if (this.textLayer)
2358        this.textLayer.endLayout();
2359    },
2360
2361    // Graphics state
2362    setLineWidth: function CanvasGraphics_setLineWidth(width) {
2363      this.current.lineWidth = width;
2364      this.ctx.lineWidth = width;
2365    },
2366    setLineCap: function CanvasGraphics_setLineCap(style) {
2367      this.ctx.lineCap = LINE_CAP_STYLES[style];
2368    },
2369    setLineJoin: function CanvasGraphics_setLineJoin(style) {
2370      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
2371    },
2372    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
2373      this.ctx.miterLimit = limit;
2374    },
2375    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
2376      this.ctx.mozDash = dashArray;
2377      this.ctx.mozDashOffset = dashPhase;
2378      this.ctx.webkitLineDash = dashArray;
2379      this.ctx.webkitLineDashOffset = dashPhase;
2380    },
2381    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
2382      TODO('set rendering intent: ' + intent);
2383    },
2384    setFlatness: function CanvasGraphics_setFlatness(flatness) {
2385      TODO('set flatness: ' + flatness);
2386    },
2387    setGState: function CanvasGraphics_setGState(states) {
2388      for (var i = 0, ii = states.length; i < ii; i++) {
2389        var state = states[i];
2390        var key = state[0];
2391        var value = state[1];
2392
2393        switch (key) {
2394          case 'LW':
2395            this.setLineWidth(value);
2396            break;
2397          case 'LC':
2398            this.setLineCap(value);
2399            break;
2400          case 'LJ':
2401            this.setLineJoin(value);
2402            break;
2403          case 'ML':
2404            this.setMiterLimit(value);
2405            break;
2406          case 'D':
2407            this.setDash(value[0], value[1]);
2408            break;
2409          case 'RI':
2410            this.setRenderingIntent(value);
2411            break;
2412          case 'FL':
2413            this.setFlatness(value);
2414            break;
2415          case 'Font':
2416            this.setFont(state[1], state[2]);
2417            break;
2418          case 'CA':
2419            this.current.strokeAlpha = state[1];
2420            break;
2421          case 'ca':
2422            this.current.fillAlpha = state[1];
2423            this.ctx.globalAlpha = state[1];
2424            break;
2425        }
2426      }
2427    },
2428    save: function CanvasGraphics_save() {
2429      this.ctx.save();
2430      var old = this.current;
2431      this.stateStack.push(old);
2432      this.current = old.clone();
2433    },
2434    restore: function CanvasGraphics_restore() {
2435      var prev = this.stateStack.pop();
2436      if (prev) {
2437        this.current = prev;
2438        this.ctx.restore();
2439      }
2440    },
2441    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
2442      this.ctx.transform(a, b, c, d, e, f);
2443    },
2444
2445    // Path
2446    moveTo: function CanvasGraphics_moveTo(x, y) {
2447      this.ctx.moveTo(x, y);
2448      this.current.setCurrentPoint(x, y);
2449    },
2450    lineTo: function CanvasGraphics_lineTo(x, y) {
2451      this.ctx.lineTo(x, y);
2452      this.current.setCurrentPoint(x, y);
2453    },
2454    curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) {
2455      this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
2456      this.current.setCurrentPoint(x3, y3);
2457    },
2458    curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) {
2459      var current = this.current;
2460      this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3);
2461      current.setCurrentPoint(x3, y3);
2462    },
2463    curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) {
2464      this.curveTo(x1, y1, x3, y3, x3, y3);
2465      this.current.setCurrentPoint(x3, y3);
2466    },
2467    closePath: function CanvasGraphics_closePath() {
2468      this.ctx.closePath();
2469    },
2470    rectangle: function CanvasGraphics_rectangle(x, y, width, height) {
2471      this.ctx.rect(x, y, width, height);
2472    },
2473    stroke: function CanvasGraphics_stroke(consumePath) {
2474      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
2475      var ctx = this.ctx;
2476      var strokeColor = this.current.strokeColor;
2477      if (this.current.lineWidth === 0)
2478        ctx.lineWidth = this.getSinglePixelWidth();
2479      // For stroke we want to temporarily change the global alpha to the
2480      // stroking alpha.
2481      ctx.globalAlpha = this.current.strokeAlpha;
2482      if (strokeColor && strokeColor.hasOwnProperty('type') &&
2483          strokeColor.type === 'Pattern') {
2484        // for patterns, we transform to pattern space, calculate
2485        // the pattern, call stroke, and restore to user space
2486        ctx.save();
2487        ctx.strokeStyle = strokeColor.getPattern(ctx);
2488        ctx.stroke();
2489        ctx.restore();
2490      } else {
2491        ctx.stroke();
2492      }
2493      if (consumePath)
2494        this.consumePath();
2495      // Restore the global alpha to the fill alpha
2496      ctx.globalAlpha = this.current.fillAlpha;
2497    },
2498    closeStroke: function CanvasGraphics_closeStroke() {
2499      this.closePath();
2500      this.stroke();
2501    },
2502    fill: function CanvasGraphics_fill(consumePath) {
2503      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
2504      var ctx = this.ctx;
2505      var fillColor = this.current.fillColor;
2506
2507      if (fillColor && fillColor.hasOwnProperty('type') &&
2508          fillColor.type === 'Pattern') {
2509        ctx.save();
2510        ctx.fillStyle = fillColor.getPattern(ctx);
2511        ctx.fill();
2512        ctx.restore();
2513      } else {
2514        ctx.fill();
2515      }
2516      if (consumePath)
2517        this.consumePath();
2518    },
2519    eoFill: function CanvasGraphics_eoFill() {
2520      var savedFillRule = this.setEOFillRule();
2521      this.fill();
2522      this.restoreFillRule(savedFillRule);
2523    },
2524    fillStroke: function CanvasGraphics_fillStroke() {
2525      this.fill(false);
2526      this.stroke(false);
2527
2528      this.consumePath();
2529    },
2530    eoFillStroke: function CanvasGraphics_eoFillStroke() {
2531      var savedFillRule = this.setEOFillRule();
2532      this.fillStroke();
2533      this.restoreFillRule(savedFillRule);
2534    },
2535    closeFillStroke: function CanvasGraphics_closeFillStroke() {
2536      this.closePath();
2537      this.fillStroke();
2538    },
2539    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
2540      var savedFillRule = this.setEOFillRule();
2541      this.closePath();
2542      this.fillStroke();
2543      this.restoreFillRule(savedFillRule);
2544    },
2545    endPath: function CanvasGraphics_endPath() {
2546      this.consumePath();
2547    },
2548
2549    // Clipping
2550    clip: function CanvasGraphics_clip() {
2551      this.pendingClip = NORMAL_CLIP;
2552    },
2553    eoClip: function CanvasGraphics_eoClip() {
2554      this.pendingClip = EO_CLIP;
2555    },
2556
2557    // Text
2558    beginText: function CanvasGraphics_beginText() {
2559      this.current.textMatrix = IDENTITY_MATRIX;
2560      this.current.x = this.current.lineX = 0;
2561      this.current.y = this.current.lineY = 0;
2562    },
2563    endText: function CanvasGraphics_endText() {
2564    },
2565    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
2566      this.current.charSpacing = spacing;
2567    },
2568    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
2569      this.current.wordSpacing = spacing;
2570    },
2571    setHScale: function CanvasGraphics_setHScale(scale) {
2572      this.current.textHScale = scale / 100;
2573    },
2574    setLeading: function CanvasGraphics_setLeading(leading) {
2575      this.current.leading = -leading;
2576    },
2577    setFont: function CanvasGraphics_setFont(fontRefName, size) {
2578      var fontObj = this.objs.get(fontRefName);
2579      var current = this.current;
2580
2581      if (!fontObj)
2582        error('Can\'t find font for ' + fontRefName);
2583
2584      // Slice-clone matrix so we can manipulate it without affecting original
2585      if (fontObj.fontMatrix)
2586        current.fontMatrix = fontObj.fontMatrix.slice(0);
2587      else
2588        current.fontMatrix = IDENTITY_MATRIX.slice(0);
2589
2590      // A valid matrix needs all main diagonal elements to be non-zero
2591      // This also ensures we bypass FF bugzilla bug #719844.
2592      if (current.fontMatrix[0] === 0 ||
2593          current.fontMatrix[3] === 0) {
2594        warn('Invalid font matrix for font ' + fontRefName);
2595      }
2596
2597      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
2598      // and in some docs this can be negative (inverted x-y axes).
2599      // We implement this condition with fontMatrix.
2600      if (size < 0) {
2601        size = -size;
2602        current.fontMatrix[0] *= -1;
2603        current.fontMatrix[3] *= -1;
2604      }
2605
2606      this.current.font = fontObj;
2607      this.current.fontSize = size;
2608
2609      if (fontObj.coded)
2610        return; // we don't need ctx.font for Type3 fonts
2611
2612      var name = fontObj.loadedName || 'sans-serif';
2613      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
2614                                 (fontObj.bold ? 'bold' : 'normal');
2615
2616      var italic = fontObj.italic ? 'italic' : 'normal';
2617      var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif';
2618      var typeface = '"' + name + '", ' + serif;
2619
2620      // Some font backends cannot handle fonts below certain size.
2621      // Keeping the font at minimal size and using the fontSizeScale to change
2622      // the current transformation matrix before the fillText/strokeText.
2623      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
2624      var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
2625      this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 :
2626                                   size / MIN_FONT_SIZE;
2627
2628      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
2629      this.ctx.font = rule;
2630    },
2631    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
2632      if (mode >= TextRenderingMode.FILL_ADD_TO_PATH)
2633        TODO('unsupported text rendering mode: ' + mode);
2634      this.current.textRenderingMode = mode;
2635    },
2636    setTextRise: function CanvasGraphics_setTextRise(rise) {
2637      TODO('text rise: ' + rise);
2638    },
2639    moveText: function CanvasGraphics_moveText(x, y) {
2640      this.current.x = this.current.lineX += x;
2641      this.current.y = this.current.lineY += y;
2642    },
2643    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
2644      this.setLeading(-y);
2645      this.moveText(x, y);
2646    },
2647    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
2648      this.current.textMatrix = [a, b, c, d, e, f];
2649
2650      this.current.x = this.current.lineX = 0;
2651      this.current.y = this.current.lineY = 0;
2652    },
2653    nextLine: function CanvasGraphics_nextLine() {
2654      this.moveText(0, this.current.leading);
2655    },
2656    applyTextTransforms: function CanvasGraphics_applyTextTransforms() {
2657      var ctx = this.ctx;
2658      var current = this.current;
2659      var textHScale = current.textHScale;
2660      var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
2661
2662      ctx.transform.apply(ctx, current.textMatrix);
2663      ctx.scale(1, -1);
2664      ctx.translate(current.x, -1 * current.y);
2665      ctx.transform.apply(ctx, fontMatrix);
2666      ctx.scale(textHScale, 1);
2667    },
2668    getTextGeometry: function CanvasGraphics_getTextGeometry() {
2669      var geometry = {};
2670      var ctx = this.ctx;
2671      var font = this.current.font;
2672      var ctxMatrix = ctx.mozCurrentTransform;
2673      if (ctxMatrix) {
2674        var bl = Util.applyTransform([0, 0], ctxMatrix);
2675        var tr = Util.applyTransform([1, 1], ctxMatrix);
2676        geometry.x = bl[0];
2677        geometry.y = bl[1];
2678        geometry.hScale = tr[0] - bl[0];
2679        geometry.vScale = tr[1] - bl[1];
2680      }
2681      geometry.spaceWidth = font.spaceWidth;
2682      return geometry;
2683    },
2684
2685    showText: function CanvasGraphics_showText(str, skipTextSelection) {
2686      var ctx = this.ctx;
2687      var current = this.current;
2688      var font = current.font;
2689      var glyphs = font.charsToGlyphs(str);
2690      var fontSize = current.fontSize;
2691      var fontSizeScale = current.fontSizeScale;
2692      var charSpacing = current.charSpacing;
2693      var wordSpacing = current.wordSpacing;
2694      var textHScale = current.textHScale;
2695      var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
2696      var textHScale2 = textHScale * fontMatrix[0];
2697      var glyphsLength = glyphs.length;
2698      var textLayer = this.textLayer;
2699      var text = {str: '', length: 0, canvasWidth: 0, geom: {}};
2700      var textSelection = textLayer && !skipTextSelection ? true : false;
2701      var textRenderingMode = current.textRenderingMode;
2702
2703      // Type3 fonts - each glyph is a "mini-PDF"
2704      if (font.coded) {
2705        ctx.save();
2706        ctx.transform.apply(ctx, current.textMatrix);
2707        ctx.translate(current.x, current.y);
2708
2709        ctx.scale(textHScale, 1);
2710
2711        if (textSelection) {
2712          this.save();
2713          ctx.scale(1, -1);
2714          text.geom = this.getTextGeometry();
2715          this.restore();
2716        }
2717        for (var i = 0; i < glyphsLength; ++i) {
2718
2719          var glyph = glyphs[i];
2720          if (glyph === null) {
2721            // word break
2722            this.ctx.translate(wordSpacing, 0);
2723            continue;
2724          }
2725
2726          this.save();
2727          ctx.scale(fontSize, fontSize);
2728          ctx.transform.apply(ctx, fontMatrix);
2729          this.executeOperatorList(glyph.operatorList);
2730          this.restore();
2731
2732          var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
2733          var width = transformed[0] * fontSize +
2734              Util.sign(current.fontMatrix[0]) * charSpacing;
2735
2736          ctx.translate(width, 0);
2737          current.x += width * textHScale;
2738
2739          text.str += glyph.unicode;
2740          text.length++;
2741          text.canvasWidth += width;
2742        }
2743        ctx.restore();
2744      } else {
2745        ctx.save();
2746        this.applyTextTransforms();
2747
2748        var lineWidth = current.lineWidth;
2749        var scale = Math.abs(current.textMatrix[0] * fontMatrix[0]);
2750        if (scale == 0 || lineWidth == 0)
2751          lineWidth = this.getSinglePixelWidth();
2752        else
2753          lineWidth /= scale;
2754
2755        if (textSelection)
2756          text.geom = this.getTextGeometry();
2757
2758        if (fontSizeScale != 1.0) {
2759          ctx.scale(fontSizeScale, fontSizeScale);
2760          lineWidth /= fontSizeScale;
2761        }
2762
2763        ctx.lineWidth = lineWidth;
2764
2765        var x = 0;
2766        for (var i = 0; i < glyphsLength; ++i) {
2767          var glyph = glyphs[i];
2768          if (glyph === null) {
2769            // word break
2770            x += Util.sign(current.fontMatrix[0]) * wordSpacing;
2771            continue;
2772          }
2773
2774          var character = glyph.fontChar;
2775          var charWidth = glyph.width * fontSize * 0.001 +
2776              Util.sign(current.fontMatrix[0]) * charSpacing;
2777
2778          if (!glyph.disabled) {
2779            var scaledX = x / fontSizeScale;
2780            switch (textRenderingMode) {
2781              default: // other unsupported rendering modes
2782              case TextRenderingMode.FILL:
2783              case TextRenderingMode.FILL_ADD_TO_PATH:
2784                ctx.fillText(character, scaledX, 0);
2785                break;
2786              case TextRenderingMode.STROKE:
2787              case TextRenderingMode.STROKE_ADD_TO_PATH:
2788                ctx.strokeText(character, scaledX, 0);
2789                break;
2790              case TextRenderingMode.FILL_STROKE:
2791              case TextRenderingMode.FILL_STROKE_ADD_TO_PATH:
2792                ctx.fillText(character, scaledX, 0);
2793                ctx.strokeText(character, scaledX, 0);
2794                break;
2795              case TextRenderingMode.INVISIBLE:
2796                break;
2797            }
2798          }
2799
2800          x += charWidth;
2801
2802          var glyphUnicode = glyph.unicode === ' ' ? '\u00A0' : glyph.unicode;
2803          var glyphUnicodeLength = glyphUnicode.length;
2804          //reverse an arabic ligature
2805          if (glyphUnicodeLength > 1 &&
2806              isRTLRangeFor(glyphUnicode.charCodeAt(0))) {
2807            for (var ii = glyphUnicodeLength - 1; ii >= 0; ii--)
2808              text.str += glyphUnicode[ii];
2809          } else
2810            text.str += glyphUnicode;
2811          text.length += glyphUnicodeLength;
2812          text.canvasWidth += charWidth;
2813        }
2814        current.x += x * textHScale2;
2815        ctx.restore();
2816      }
2817
2818      if (textSelection)
2819        this.textLayer.appendText(text, font.loadedName, fontSize);
2820
2821      return text;
2822    },
2823    showSpacedText: function CanvasGraphics_showSpacedText(arr) {
2824      var ctx = this.ctx;
2825      var current = this.current;
2826      var font = current.font;
2827      var fontSize = current.fontSize;
2828      var textHScale = current.textHScale;
2829      if (!font.coded)
2830        textHScale *= (current.fontMatrix || IDENTITY_MATRIX)[0];
2831      var arrLength = arr.length;
2832      var textLayer = this.textLayer;
2833      var text = {str: '', length: 0, canvasWidth: 0, geom: {}};
2834      var textSelection = textLayer ? true : false;
2835
2836      if (textSelection) {
2837        ctx.save();
2838        // Type3 fonts - each glyph is a "mini-PDF" (see also showText)
2839        if (font.coded) {
2840          ctx.transform.apply(ctx, current.textMatrix);
2841          ctx.scale(1, -1);
2842          ctx.translate(current.x, -1 * current.y);
2843          ctx.scale(textHScale, 1);
2844        } else
2845          this.applyTextTransforms();
2846        text.geom = this.getTextGeometry();
2847        ctx.restore();
2848      }
2849
2850      for (var i = 0; i < arrLength; ++i) {
2851        var e = arr[i];
2852        if (isNum(e)) {
2853          var spacingLength = -e * 0.001 * fontSize * textHScale;
2854          current.x += spacingLength;
2855
2856          if (textSelection) {
2857            // Emulate precise spacing via HTML spaces
2858            text.canvasWidth += spacingLength;
2859            if (e < 0 && text.geom.spaceWidth > 0) { // avoid div by zero
2860              var numFakeSpaces = Math.round(-e / text.geom.spaceWidth);
2861              if (numFakeSpaces > 0) {
2862                text.str += '\u00A0';
2863                text.length++;
2864              }
2865            }
2866          }
2867        } else if (isString(e)) {
2868          var shownText = this.showText(e, true);
2869
2870          if (textSelection) {
2871            if (shownText.str === ' ') {
2872              text.str += '\u00A0';
2873            } else {
2874              text.str += shownText.str;
2875            }
2876            text.canvasWidth += shownText.canvasWidth;
2877            text.length += shownText.length;
2878          }
2879        } else {
2880          malformed('TJ array element ' + e + ' is not string or num');
2881        }
2882      }
2883
2884      if (textSelection)
2885        this.textLayer.appendText(text, font.loadedName, fontSize);
2886    },
2887    nextLineShowText: function CanvasGraphics_nextLineShowText(text) {
2888      this.nextLine();
2889      this.showText(text);
2890    },
2891    nextLineSetSpacingShowText:
2892      function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing,
2893                                                         charSpacing,
2894                                                         text) {
2895      this.setWordSpacing(wordSpacing);
2896      this.setCharSpacing(charSpacing);
2897      this.nextLineShowText(text);
2898    },
2899
2900    // Type3 fonts
2901    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
2902      // We can safely ignore this since the width should be the same
2903      // as the width in the Widths array.
2904    },
2905    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
2906                                                                        yWidth,
2907                                                                        llx,
2908                                                                        lly,
2909                                                                        urx,
2910                                                                        ury) {
2911      // TODO According to the spec we're also suppose to ignore any operators
2912      // that set color or include images while processing this type3 font.
2913      this.rectangle(llx, lly, urx - llx, ury - lly);
2914      this.clip();
2915      this.endPath();
2916    },
2917
2918    // Color
2919    setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) {
2920      this.current.strokeColorSpace = ColorSpace.fromIR(raw);
2921    },
2922    setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) {
2923      this.current.fillColorSpace = ColorSpace.fromIR(raw);
2924    },
2925    setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) {
2926      var cs = this.current.strokeColorSpace;
2927      var rgbColor = cs.getRgb(arguments);
2928      var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
2929      this.ctx.strokeStyle = color;
2930      this.current.strokeColor = color;
2931    },
2932    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) {
2933      if (IR[0] == 'TilingPattern') {
2934        var args = IR[1];
2935        var base = cs.base;
2936        var color;
2937        if (base) {
2938          var baseComps = base.numComps;
2939
2940          color = [];
2941          for (var i = 0; i < baseComps; ++i)
2942            color.push(args[i]);
2943
2944          color = base.getRgb(color);
2945        }
2946        var pattern = new TilingPattern(IR, color, this.ctx, this.objs);
2947      } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
2948        var pattern = Pattern.shadingFromIR(IR);
2949      } else {
2950        error('Unkown IR type ' + IR[0]);
2951      }
2952      return pattern;
2953    },
2954    setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
2955      var cs = this.current.strokeColorSpace;
2956
2957      if (cs.name == 'Pattern') {
2958        this.current.strokeColor = this.getColorN_Pattern(arguments, cs);
2959      } else {
2960        this.setStrokeColor.apply(this, arguments);
2961      }
2962    },
2963    setFillColor: function CanvasGraphics_setFillColor(/*...*/) {
2964      var cs = this.current.fillColorSpace;
2965      var rgbColor = cs.getRgb(arguments);
2966      var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
2967      this.ctx.fillStyle = color;
2968      this.current.fillColor = color;
2969    },
2970    setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
2971      var cs = this.current.fillColorSpace;
2972
2973      if (cs.name == 'Pattern') {
2974        this.current.fillColor = this.getColorN_Pattern(arguments, cs);
2975      } else {
2976        this.setFillColor.apply(this, arguments);
2977      }
2978    },
2979    setStrokeGray: function CanvasGraphics_setStrokeGray(gray) {
2980      if (!(this.current.strokeColorSpace instanceof DeviceGrayCS))
2981        this.current.strokeColorSpace = new DeviceGrayCS();
2982
2983      var color = Util.makeCssRgb(gray, gray, gray);
2984      this.ctx.strokeStyle = color;
2985      this.current.strokeColor = color;
2986    },
2987    setFillGray: function CanvasGraphics_setFillGray(gray) {
2988      if (!(this.current.fillColorSpace instanceof DeviceGrayCS))
2989        this.current.fillColorSpace = new DeviceGrayCS();
2990
2991      var color = Util.makeCssRgb(gray, gray, gray);
2992      this.ctx.fillStyle = color;
2993      this.current.fillColor = color;
2994    },
2995    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
2996      if (!(this.current.strokeColorSpace instanceof DeviceRgbCS))
2997        this.current.strokeColorSpace = new DeviceRgbCS();
2998
2999      var color = Util.makeCssRgb(r, g, b);
3000      this.ctx.strokeStyle = color;
3001      this.current.strokeColor = color;
3002    },
3003    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
3004      if (!(this.current.fillColorSpace instanceof DeviceRgbCS))
3005        this.current.fillColorSpace = new DeviceRgbCS();
3006
3007      var color = Util.makeCssRgb(r, g, b);
3008      this.ctx.fillStyle = color;
3009      this.current.fillColor = color;
3010    },
3011    setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) {
3012      if (!(this.current.strokeColorSpace instanceof DeviceCmykCS))
3013        this.current.strokeColorSpace = new DeviceCmykCS();
3014
3015      var color = Util.makeCssCmyk(c, m, y, k);
3016      this.ctx.strokeStyle = color;
3017      this.current.strokeColor = color;
3018    },
3019    setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) {
3020      if (!(this.current.fillColorSpace instanceof DeviceCmykCS))
3021        this.current.fillColorSpace = new DeviceCmykCS();
3022
3023      var color = Util.makeCssCmyk(c, m, y, k);
3024      this.ctx.fillStyle = color;
3025      this.current.fillColor = color;
3026    },
3027
3028    shadingFill: function CanvasGraphics_shadingFill(patternIR) {
3029      var ctx = this.ctx;
3030
3031      this.save();
3032      var pattern = Pattern.shadingFromIR(patternIR);
3033      ctx.fillStyle = pattern.getPattern(ctx);
3034
3035      var inv = ctx.mozCurrentTransformInverse;
3036      if (inv) {
3037        var canvas = ctx.canvas;
3038        var width = canvas.width;
3039        var height = canvas.height;
3040
3041        var bl = Util.applyTransform([0, 0], inv);
3042        var br = Util.applyTransform([0, height], inv);
3043        var ul = Util.applyTransform([width, 0], inv);
3044        var ur = Util.applyTransform([width, height], inv);
3045
3046        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
3047        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
3048        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
3049        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
3050
3051        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
3052      } else {
3053        // HACK to draw the gradient onto an infinite rectangle.
3054        // PDF gradients are drawn across the entire image while
3055        // Canvas only allows gradients to be drawn in a rectangle
3056        // The following bug should allow us to remove this.
3057        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
3058
3059        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
3060      }
3061
3062      this.restore();
3063    },
3064
3065    // Images
3066    beginInlineImage: function CanvasGraphics_beginInlineImage() {
3067      error('Should not call beginInlineImage');
3068    },
3069    beginImageData: function CanvasGraphics_beginImageData() {
3070      error('Should not call beginImageData');
3071    },
3072
3073    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
3074                                                                        bbox) {
3075      this.save();
3076
3077      if (matrix && isArray(matrix) && 6 == matrix.length)
3078        this.transform.apply(this, matrix);
3079
3080      if (bbox && isArray(bbox) && 4 == bbox.length) {
3081        var width = bbox[2] - bbox[0];
3082        var height = bbox[3] - bbox[1];
3083        this.rectangle(bbox[0], bbox[1], width, height);
3084        this.clip();
3085        this.endPath();
3086      }
3087    },
3088
3089    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
3090      this.restore();
3091    },
3092
3093    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
3094      var domImage = this.objs.get(objId);
3095      if (!domImage) {
3096        error('Dependent image isn\'t ready yet');
3097      }
3098
3099      this.save();
3100
3101      var ctx = this.ctx;
3102      // scale the image to the unit square
3103      ctx.scale(1 / w, -1 / h);
3104
3105      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
3106                    0, -h, w, h);
3107
3108      this.restore();
3109    },
3110
3111    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(
3112                             imgArray, inverseDecode, width, height) {
3113      function applyStencilMask(buffer, inverseDecode) {
3114        var imgArrayPos = 0;
3115        var i, j, mask, buf;
3116        // removing making non-masked pixels transparent
3117        var bufferPos = 3; // alpha component offset
3118        for (i = 0; i < height; i++) {
3119          mask = 0;
3120          for (j = 0; j < width; j++) {
3121            if (!mask) {
3122              buf = imgArray[imgArrayPos++];
3123              mask = 128;
3124            }
3125            if (!(buf & mask) == inverseDecode) {
3126              buffer[bufferPos] = 0;
3127            }
3128            bufferPos += 4;
3129            mask >>= 1;
3130          }
3131        }
3132      }
3133
3134      this.save();
3135
3136      var ctx = this.ctx;
3137      var w = width, h = height;
3138      // scale the image to the unit square
3139      ctx.scale(1 / w, -1 / h);
3140
3141      var tmpCanvas = createScratchCanvas(w, h);
3142      var tmpCtx = tmpCanvas.getContext('2d');
3143
3144      var fillColor = this.current.fillColor;
3145      tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
3146                          fillColor.type === 'Pattern') ?
3147                          fillColor.getPattern(tmpCtx) : fillColor;
3148      tmpCtx.fillRect(0, 0, w, h);
3149
3150      var imgData = tmpCtx.getImageData(0, 0, w, h);
3151      var pixels = imgData.data;
3152
3153      applyStencilMask(pixels, inverseDecode);
3154
3155      tmpCtx.putImageData(imgData, 0, 0);
3156      ctx.drawImage(tmpCanvas, 0, -h);
3157      this.restore();
3158    },
3159
3160    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
3161      var imgData = this.objs.get(objId);
3162      if (!imgData)
3163        error('Dependent image isn\'t ready yet');
3164
3165      this.save();
3166      var ctx = this.ctx;
3167      var w = imgData.width;
3168      var h = imgData.height;
3169      // scale the image to the unit square
3170      ctx.scale(1 / w, -1 / h);
3171
3172      var tmpCanvas = createScratchCanvas(w, h);
3173      var tmpCtx = tmpCanvas.getContext('2d');
3174      this.putBinaryImageData(tmpCtx, imgData, w, h);
3175
3176      ctx.drawImage(tmpCanvas, 0, -h);
3177      this.restore();
3178    },
3179
3180    putBinaryImageData: function CanvasGraphics_putBinaryImageData() {
3181      //
3182    },
3183
3184    // Marked content
3185
3186    markPoint: function CanvasGraphics_markPoint(tag) {
3187      TODO('Marked content');
3188    },
3189    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
3190      TODO('Marked content');
3191    },
3192    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
3193      TODO('Marked content');
3194    },
3195    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
3196                                        tag, properties) {
3197      TODO('Marked content');
3198    },
3199    endMarkedContent: function CanvasGraphics_endMarkedContent() {
3200      TODO('Marked content');
3201    },
3202
3203    // Compatibility
3204
3205    beginCompat: function CanvasGraphics_beginCompat() {
3206      TODO('ignore undefined operators (should we do that anyway?)');
3207    },
3208    endCompat: function CanvasGraphics_endCompat() {
3209      TODO('stop ignoring undefined operators');
3210    },
3211
3212    // Helper functions
3213
3214    consumePath: function CanvasGraphics_consumePath() {
3215      if (this.pendingClip) {
3216        var savedFillRule = null;
3217        if (this.pendingClip == EO_CLIP)
3218          savedFillRule = this.setEOFillRule();
3219
3220        this.ctx.clip();
3221
3222        this.pendingClip = null;
3223        if (savedFillRule !== null)
3224          this.restoreFillRule(savedFillRule);
3225      }
3226      this.ctx.beginPath();
3227    },
3228    // We generally keep the canvas context set for
3229    // nonzero-winding, and just set evenodd for the operations
3230    // that need them.
3231    setEOFillRule: function CanvasGraphics_setEOFillRule() {
3232      var savedFillRule = this.ctx.mozFillRule;
3233      this.ctx.mozFillRule = 'evenodd';
3234      return savedFillRule;
3235    },
3236    restoreFillRule: function CanvasGraphics_restoreFillRule(rule) {
3237      this.ctx.mozFillRule = rule;
3238    },
3239    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
3240      var inverse = this.ctx.mozCurrentTransformInverse;
3241      return Math.abs(inverse[0] + inverse[2]);
3242    }
3243  };
3244
3245  return CanvasGraphics;
3246})();
3247
3248if (!isWorker) {
3249  // Feature detection if the browser can use an Uint8Array directly as imgData.
3250  var canvas = PdfJS_window.document.createElement('canvas');
3251  canvas.width = 1;
3252  canvas.height = 1;
3253  var ctx = canvas.getContext('2d');
3254
3255  try {
3256    ctx.putImageData({
3257      width: 1,
3258      height: 1,
3259      data: new Uint8Array(4)
3260    }, 0, 0);
3261
3262    CanvasGraphics.prototype.putBinaryImageData =
3263      function CanvasGraphicsPutBinaryImageDataNative(ctx, imgData) {
3264        ctx.putImageData(imgData, 0, 0);
3265      };
3266  } catch (e) {
3267    CanvasGraphics.prototype.putBinaryImageData =
3268      function CanvasGraphicsPutBinaryImageDataShim(ctx, imgData, w, h) {
3269        var tmpImgData = ctx.getImageData(0, 0, w, h);
3270
3271        // Copy over the imageData pixel by pixel.
3272        var tmpImgDataPixels = tmpImgData.data;
3273        var len = tmpImgDataPixels.length;
3274
3275        while (len--) {
3276          tmpImgDataPixels[len] = imgData.data[len];
3277        }
3278
3279        ctx.putImageData(tmpImgData, 0, 0);
3280      };
3281  }
3282}
3283
3284/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
3285/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
3286
3287'use strict';
3288
3289var Name = (function NameClosure() {
3290  function Name(name) {
3291    this.name = name;
3292  }
3293
3294  Name.prototype = {};
3295
3296  return Name;
3297})();
3298
3299var Cmd = (function CmdClosure() {
3300  function Cmd(cmd) {
3301    this.cmd = cmd;
3302  }
3303
3304  Cmd.prototype = {};
3305
3306  var cmdCache = {};
3307
3308  Cmd.get = function Cmd_get(cmd) {
3309    var cmdValue = cmdCache[cmd];
3310    if (cmdValue)
3311      return cmdValue;
3312
3313    return cmdCache[cmd] = new Cmd(cmd);
3314  };
3315
3316  return Cmd;
3317})();
3318
3319var Dict = (function DictClosure() {
3320  // xref is optional
3321  function Dict(xref) {
3322    // Map should only be used internally, use functions below to access.
3323    var map = Object.create(null);
3324
3325    this.assignXref = function Dict_assignXref(newXref) {
3326      xref = newXref;
3327    };
3328
3329    // automatically dereferences Ref objects
3330    this.get = function Dict_get(key1, key2, key3) {
3331      var value;
3332      if (typeof (value = map[key1]) != 'undefined' || key1 in map ||
3333          typeof key2 == 'undefined') {
3334        return xref ? xref.fetchIfRef(value) : value;
3335      }
3336      if (typeof (value = map[key2]) != 'undefined' || key2 in map ||
3337          typeof key3 == 'undefined') {
3338        return xref ? xref.fetchIfRef(value) : value;
3339      }
3340      value = map[key3] || null;
3341      return xref ? xref.fetchIfRef(value) : value;
3342    };
3343
3344    // no dereferencing
3345    this.getRaw = function Dict_getRaw(key) {
3346      return map[key];
3347    };
3348
3349    // creates new map and dereferences all Refs
3350    this.getAll = function Dict_getAll() {
3351      var all = {};
3352      for (var key in map) {
3353        var obj = this.get(key);
3354        all[key] = obj instanceof Dict ? obj.getAll() : obj;
3355      }
3356      return all;
3357    };
3358
3359    this.set = function Dict_set(key, value) {
3360      map[key] = value;
3361    };
3362
3363    this.has = function Dict_has(key) {
3364      return key in map;
3365    };
3366
3367    this.forEach = function Dict_forEach(callback) {
3368      for (var key in map) {
3369        callback(key, this.get(key));
3370      }
3371    };
3372  };
3373
3374  return Dict;
3375})();
3376
3377var Ref = (function RefClosure() {
3378  function Ref(num, gen) {
3379    this.num = num;
3380    this.gen = gen;
3381  }
3382
3383  Ref.prototype = {};
3384
3385  return Ref;
3386})();
3387
3388// The reference is identified by number and generation,
3389// this structure stores only one instance of the reference.
3390var RefSet = (function RefSetClosure() {
3391  function RefSet() {
3392    this.dict = {};
3393  }
3394
3395  RefSet.prototype = {
3396    has: function RefSet_has(ref) {
3397      return !!this.dict['R' + ref.num + '.' + ref.gen];
3398    },
3399
3400    put: function RefSet_put(ref) {
3401      this.dict['R' + ref.num + '.' + ref.gen] = ref;
3402    }
3403  };
3404
3405  return RefSet;
3406})();
3407
3408var Catalog = (function CatalogClosure() {
3409  function Catalog(xref) {
3410    this.xref = xref;
3411    var obj = xref.getCatalogObj();
3412    assertWellFormed(isDict(obj), 'catalog object is not a dictionary');
3413    this.catDict = obj;
3414  }
3415
3416  Catalog.prototype = {
3417    get metadata() {
3418      var stream = this.catDict.get('Metadata');
3419      var metadata;
3420      if (stream && isDict(stream.dict)) {
3421        var type = stream.dict.get('Type');
3422        var subtype = stream.dict.get('Subtype');
3423
3424        if (isName(type) && isName(subtype) &&
3425            type.name === 'Metadata' && subtype.name === 'XML') {
3426          metadata = stringToPDFString(bytesToString(stream.getBytes()));
3427        }
3428      }
3429
3430      return shadow(this, 'metadata', metadata);
3431    },
3432    get toplevelPagesDict() {
3433      var pagesObj = this.catDict.get('Pages');
3434      assertWellFormed(isDict(pagesObj), 'invalid top-level pages dictionary');
3435      // shadow the prototype getter
3436      return shadow(this, 'toplevelPagesDict', pagesObj);
3437    },
3438    get documentOutline() {
3439      var xref = this.xref;
3440      var obj = this.catDict.get('Outlines');
3441      var root = { items: [] };
3442      if (isDict(obj)) {
3443        obj = obj.getRaw('First');
3444        var processed = new RefSet();
3445        if (isRef(obj)) {
3446          var queue = [{obj: obj, parent: root}];
3447          // to avoid recursion keeping track of the items
3448          // in the processed dictionary
3449          processed.put(obj);
3450          while (queue.length > 0) {
3451            var i = queue.shift();
3452            var outlineDict = xref.fetchIfRef(i.obj);
3453            if (outlineDict === null)
3454              continue;
3455            if (!outlineDict.has('Title'))
3456              error('Invalid outline item');
3457            var dest = outlineDict.get('A');
3458            if (dest)
3459              dest = dest.get('D');
3460            else if (outlineDict.has('Dest')) {
3461              dest = outlineDict.getRaw('Dest');
3462              if (isName(dest))
3463                dest = dest.name;
3464            }
3465            var title = outlineDict.get('Title');
3466            var outlineItem = {
3467              dest: dest,
3468              title: stringToPDFString(title),
3469              color: outlineDict.get('C') || [0, 0, 0],
3470              count: outlineDict.get('Count'),
3471              bold: !!(outlineDict.get('F') & 2),
3472              italic: !!(outlineDict.get('F') & 1),
3473              items: []
3474            };
3475            i.parent.items.push(outlineItem);
3476            obj = outlineDict.getRaw('First');
3477            if (isRef(obj) && !processed.has(obj)) {
3478              queue.push({obj: obj, parent: outlineItem});
3479              processed.put(obj);
3480            }
3481            obj = outlineDict.getRaw('Next');
3482            if (isRef(obj) && !processed.has(obj)) {
3483              queue.push({obj: obj, parent: i.parent});
3484              processed.put(obj);
3485            }
3486          }
3487        }
3488      }
3489      obj = root.items.length > 0 ? root.items : null;
3490      return shadow(this, 'documentOutline', obj);
3491    },
3492    get numPages() {
3493      var obj = this.toplevelPagesDict.get('Count');
3494      assertWellFormed(
3495        isInt(obj),
3496        'page count in top level pages object is not an integer'
3497      );
3498      // shadow the prototype getter
3499      return shadow(this, 'num', obj);
3500    },
3501    traverseKids: function Catalog_traverseKids(pagesDict) {
3502      var pageCache = this.pageCache;
3503      var kids = pagesDict.get('Kids');
3504      assertWellFormed(isArray(kids),
3505                       'page dictionary kids object is not an array');
3506      for (var i = 0, ii = kids.length; i < ii; ++i) {
3507        var kid = kids[i];
3508        assertWellFormed(isRef(kid),
3509                        'page dictionary kid is not a reference');
3510        var obj = this.xref.fetch(kid);
3511        if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {
3512          pageCache.push(new Page(this.xref, pageCache.length, obj, kid));
3513        } else { // must be a child page dictionary
3514          assertWellFormed(
3515            isDict(obj),
3516            'page dictionary kid reference points to wrong type of object'
3517          );
3518          this.traverseKids(obj);
3519        }
3520      }
3521    },
3522    get destinations() {
3523      function fetchDestination(dest) {
3524        return isDict(dest) ? dest.get('D') : dest;
3525      }
3526
3527      var xref = this.xref;
3528      var dests = {}, nameTreeRef, nameDictionaryRef;
3529      var obj = this.catDict.get('Names');
3530      if (obj)
3531        nameTreeRef = obj.getRaw('Dests');
3532      else if (this.catDict.has('Dests'))
3533        nameDictionaryRef = this.catDict.get('Dests');
3534
3535      if (nameDictionaryRef) {
3536        // reading simple destination dictionary
3537        obj = nameDictionaryRef;
3538        obj.forEach(function catalogForEach(key, value) {
3539          if (!value) return;
3540          dests[key] = fetchDestination(value);
3541        });
3542      }
3543      if (nameTreeRef) {
3544        // reading name tree
3545        var processed = new RefSet();
3546        processed.put(nameTreeRef);
3547        var queue = [nameTreeRef];
3548        while (queue.length > 0) {
3549          var i, n;
3550          obj = xref.fetch(queue.shift());
3551          if (obj.has('Kids')) {
3552            var kids = obj.get('Kids');
3553            for (i = 0, n = kids.length; i < n; i++) {
3554              var kid = kids[i];
3555              if (processed.has(kid))
3556                error('invalid destinations');
3557              queue.push(kid);
3558              processed.put(kid);
3559            }
3560            continue;
3561          }
3562          var names = obj.get('Names');
3563          for (i = 0, n = names.length; i < n; i += 2) {
3564            dests[names[i]] = fetchDestination(xref.fetchIfRef(names[i + 1]));
3565          }
3566        }
3567      }
3568      return shadow(this, 'destinations', dests);
3569    },
3570    getPage: function Catalog_getPage(n) {
3571      var pageCache = this.pageCache;
3572      if (!pageCache) {
3573        pageCache = this.pageCache = [];
3574        this.traverseKids(this.toplevelPagesDict);
3575      }
3576      return this.pageCache[n - 1];
3577    }
3578  };
3579
3580  return Catalog;
3581})();
3582
3583var XRef = (function XRefClosure() {
3584  function XRef(stream, startXRef, mainXRefEntriesOffset) {
3585    this.stream = stream;
3586    this.entries = [];
3587    this.xrefstms = {};
3588    var trailerDict = this.readXRef(startXRef);
3589    trailerDict.assignXref(this);
3590    this.trailer = trailerDict;
3591    // prepare the XRef cache
3592    this.cache = [];
3593
3594    var encrypt = trailerDict.get('Encrypt');
3595    if (encrypt) {
3596      var fileId = trailerDict.get('ID');
3597      this.encrypt = new CipherTransformFactory(encrypt,
3598                                                fileId[0] /*, password */);
3599    }
3600
3601    // get the root dictionary (catalog) object
3602    if (!(this.root = trailerDict.get('Root')))
3603      error('Invalid root reference');
3604  }
3605
3606  XRef.prototype = {
3607    readXRefTable: function XRef_readXRefTable(parser) {
3608      // Example of cross-reference table:
3609      // xref
3610      // 0 1                    <-- subsection header (first obj #, obj count)
3611      // 0000000000 65535 f     <-- actual object (offset, generation #, f/n)
3612      // 23 2                   <-- subsection header ... and so on ...
3613      // 0000025518 00002 n
3614      // 0000025635 00000 n
3615      // trailer
3616      // ...
3617
3618      // Outer loop is over subsection headers
3619      var obj;
3620      while (!isCmd(obj = parser.getObj(), 'trailer')) {
3621        var first = obj,
3622            count = parser.getObj();
3623
3624        if (!isInt(first) || !isInt(count))
3625          error('Invalid XRef table: wrong types in subsection header');
3626
3627        // Inner loop is over objects themselves
3628        for (var i = 0; i < count; i++) {
3629          var entry = {};
3630          entry.offset = parser.getObj();
3631          entry.gen = parser.getObj();
3632          var type = parser.getObj();
3633
3634          if (isCmd(type, 'f'))
3635            entry.free = true;
3636          else if (isCmd(type, 'n'))
3637            entry.uncompressed = true;
3638
3639          // Validate entry obj
3640          if (!isInt(entry.offset) || !isInt(entry.gen) ||
3641              !(entry.free || entry.uncompressed)) {
3642            error('Invalid entry in XRef subsection: ' + first + ', ' + count);
3643          }
3644
3645          if (!this.entries[i + first])
3646            this.entries[i + first] = entry;
3647        }
3648      }
3649
3650      // Sanity check: as per spec, first object must be free
3651      if (this.entries[0] && !this.entries[0].free)
3652        error('Invalid XRef table: unexpected first object');
3653
3654      // Sanity check
3655      if (!isCmd(obj, 'trailer'))
3656        error('Invalid XRef table: could not find trailer dictionary');
3657
3658      // Read trailer dictionary, e.g.
3659      // trailer
3660      //    << /Size 22
3661      //      /Root 20R
3662      //      /Info 10R
3663      //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
3664      //    >>
3665      // The parser goes through the entire stream << ... >> and provides
3666      // a getter interface for the key-value table
3667      var dict = parser.getObj();
3668      if (!isDict(dict))
3669        error('Invalid XRef table: could not parse trailer dictionary');
3670
3671      return dict;
3672    },
3673    readXRefStream: function XRef_readXRefStream(stream) {
3674      var streamParameters = stream.parameters;
3675      var byteWidths = streamParameters.get('W');
3676      var range = streamParameters.get('Index');
3677      if (!range)
3678        range = [0, streamParameters.get('Size')];
3679      var i, j;
3680      while (range.length > 0) {
3681        var first = range[0], n = range[1];
3682        if (!isInt(first) || !isInt(n))
3683          error('Invalid XRef range fields: ' + first + ', ' + n);
3684        var typeFieldWidth = byteWidths[0];
3685        var offsetFieldWidth = byteWidths[1];
3686        var generationFieldWidth = byteWidths[2];
3687        if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
3688            !isInt(generationFieldWidth)) {
3689          error('Invalid XRef entry fields length: ' + first + ', ' + n);
3690        }
3691        for (i = 0; i < n; ++i) {
3692          var type = 0, offset = 0, generation = 0;
3693          for (j = 0; j < typeFieldWidth; ++j)
3694            type = (type << 8) | stream.getByte();
3695          // if type field is absent, its default value = 1
3696          if (typeFieldWidth == 0)
3697            type = 1;
3698          for (j = 0; j < offsetFieldWidth; ++j)
3699            offset = (offset << 8) | stream.getByte();
3700          for (j = 0; j < generationFieldWidth; ++j)
3701            generation = (generation << 8) | stream.getByte();
3702          var entry = {};
3703          entry.offset = offset;
3704          entry.gen = generation;
3705          switch (type) {
3706            case 0:
3707              entry.free = true;
3708              break;
3709            case 1:
3710              entry.uncompressed = true;
3711              break;
3712            case 2:
3713              break;
3714            default:
3715              error('Invalid XRef entry type: ' + type);
3716          }
3717          if (!this.entries[first + i])
3718            this.entries[first + i] = entry;
3719        }
3720        range.splice(0, 2);
3721      }
3722      return streamParameters;
3723    },
3724    indexObjects: function XRef_indexObjects() {
3725      // Simple scan through the PDF content to find objects,
3726      // trailers and XRef streams.
3727      function readToken(data, offset) {
3728        var token = '', ch = data[offset];
3729        while (ch !== 13 && ch !== 10) {
3730          if (++offset >= data.length)
3731            break;
3732          token += String.fromCharCode(ch);
3733          ch = data[offset];
3734        }
3735        return token;
3736      }
3737      function skipUntil(data, offset, what) {
3738        var length = what.length, dataLength = data.length;
3739        var skipped = 0;
3740        // finding byte sequence
3741        while (offset < dataLength) {
3742          var i = 0;
3743          while (i < length && data[offset + i] == what[i])
3744            ++i;
3745          if (i >= length)
3746            break; // sequence found
3747
3748          offset++;
3749          skipped++;
3750        }
3751        return skipped;
3752      }
3753      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
3754      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
3755                                          101, 102]);
3756      var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
3757      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
3758
3759      var stream = this.stream;
3760      stream.pos = 0;
3761      var buffer = stream.getBytes();
3762      var position = stream.start, length = buffer.length;
3763      var trailers = [], xrefStms = [];
3764      var state = 0;
3765      var currentToken;
3766      while (position < length) {
3767        var ch = buffer[position];
3768        if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
3769          ++position;
3770          continue;
3771        }
3772        if (ch === 37) { // %-comment
3773          do {
3774            ++position;
3775            ch = buffer[position];
3776          } while (ch !== 13 && ch !== 10);
3777          continue;
3778        }
3779        var token = readToken(buffer, position);
3780        var m;
3781        if (token === 'xref') {
3782          position += skipUntil(buffer, position, trailerBytes);
3783          trailers.push(position);
3784          position += skipUntil(buffer, position, startxrefBytes);
3785        } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
3786          this.entries[m[1]] = {
3787            offset: position,
3788            gen: m[2] | 0,
3789            uncompressed: true
3790          };
3791
3792          var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
3793          var content = buffer.subarray(position, position + contentLength);
3794
3795          // checking XRef stream suspect
3796          // (it shall have '/XRef' and next char is not a letter)
3797          var xrefTagOffset = skipUntil(content, 0, xrefBytes);
3798          if (xrefTagOffset < contentLength &&
3799              content[xrefTagOffset + 5] < 64) {
3800            xrefStms.push(position);
3801            this.xrefstms[position] = 1; // don't read it recursively
3802          }
3803
3804          position += contentLength;
3805        } else
3806          position += token.length + 1;
3807      }
3808      // reading XRef streams
3809      for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
3810          this.readXRef(xrefStms[i], true);
3811      }
3812      // finding main trailer
3813      var dict;
3814      for (var i = 0, ii = trailers.length; i < ii; ++i) {
3815        stream.pos = trailers[i];
3816        var parser = new Parser(new Lexer(stream), true, null);
3817        var obj = parser.getObj();
3818        if (!isCmd(obj, 'trailer'))
3819          continue;
3820        // read the trailer dictionary
3821        if (!isDict(dict = parser.getObj()))
3822          continue;
3823        // taking the first one with 'ID'
3824        if (dict.has('ID'))
3825          return dict;
3826      }
3827      // no tailer with 'ID', taking last one (if exists)
3828      if (dict)
3829        return dict;
3830      // nothing helps
3831      error('Invalid PDF structure');
3832    },
3833    readXRef: function XRef_readXRef(startXRef, recoveryMode) {
3834      var stream = this.stream;
3835      stream.pos = startXRef;
3836
3837      try {
3838        var parser = new Parser(new Lexer(stream), true, null);
3839        var obj = parser.getObj();
3840        var dict;
3841
3842        // Get dictionary
3843        if (isCmd(obj, 'xref')) {
3844          // Parse end-of-file XRef
3845          dict = this.readXRefTable(parser);
3846
3847          // Recursively get other XRefs 'XRefStm', if any
3848          obj = dict.get('XRefStm');
3849          if (isInt(obj)) {
3850            var pos = obj;
3851            // ignore previously loaded xref streams
3852            // (possible infinite recursion)
3853            if (!(pos in this.xrefstms)) {
3854              this.xrefstms[pos] = 1;
3855              this.readXRef(pos);
3856            }
3857          }
3858        } else if (isInt(obj)) {
3859          // Parse in-stream XRef
3860          if (!isInt(parser.getObj()) ||
3861              !isCmd(parser.getObj(), 'obj') ||
3862              !isStream(obj = parser.getObj())) {
3863            error('Invalid XRef stream');
3864          }
3865          dict = this.readXRefStream(obj);
3866          if (!dict)
3867            error('Failed to read XRef stream');
3868        }
3869
3870        // Recursively get previous dictionary, if any
3871        obj = dict.get('Prev');
3872        if (isInt(obj))
3873          this.readXRef(obj, recoveryMode);
3874        else if (isRef(obj)) {
3875          // The spec says Prev must not be a reference, i.e. "/Prev NNN"
3876          // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R"
3877          this.readXRef(obj.num, recoveryMode);
3878        }
3879
3880        return dict;
3881      } catch (e) {
3882        log('(while reading XRef): ' + e);
3883      }
3884
3885      if (recoveryMode)
3886        return;
3887
3888      warn('Indexing all PDF objects');
3889      return this.indexObjects();
3890    },
3891    getEntry: function XRef_getEntry(i) {
3892      var e = this.entries[i];
3893      if (e === null)
3894        return null;
3895      return e.free ? null : e; // returns null is the entry is free
3896    },
3897    fetchIfRef: function XRef_fetchIfRef(obj) {
3898      if (!isRef(obj))
3899        return obj;
3900      return this.fetch(obj);
3901    },
3902    fetch: function XRef_fetch(ref, suppressEncryption) {
3903      assertWellFormed(isRef(ref), 'ref object is not a reference');
3904      var num = ref.num;
3905      if (num in this.cache)
3906        return this.cache[num];
3907
3908      var e = this.getEntry(num);
3909
3910      // the referenced entry can be free
3911      if (e === null)
3912        return (this.cache[num] = e);
3913
3914      var gen = ref.gen;
3915      var stream, parser;
3916      if (e.uncompressed) {
3917        if (e.gen != gen)
3918          error('inconsistent generation in XRef');
3919        stream = this.stream.makeSubStream(e.offset);
3920        parser = new Parser(new Lexer(stream), true, this);
3921        var obj1 = parser.getObj();
3922        var obj2 = parser.getObj();
3923        var obj3 = parser.getObj();
3924        if (!isInt(obj1) || obj1 != num ||
3925            !isInt(obj2) || obj2 != gen ||
3926            !isCmd(obj3)) {
3927          error('bad XRef entry');
3928        }
3929        if (!isCmd(obj3, 'obj')) {
3930          // some bad pdfs use "obj1234" and really mean 1234
3931          if (obj3.cmd.indexOf('obj') == 0) {
3932            num = parseInt(obj3.cmd.substring(3), 10);
3933            if (!isNaN(num))
3934              return num;
3935          }
3936          error('bad XRef entry');
3937        }
3938        if (this.encrypt && !suppressEncryption) {
3939          try {
3940            e = parser.getObj(this.encrypt.createCipherTransform(num, gen));
3941          } catch (ex) {
3942            // almost all streams must be encrypted, but sometimes
3943            // they are not probably due to some broken generators
3944            // re-trying without encryption
3945            return this.fetch(ref, true);
3946          }
3947        } else {
3948          e = parser.getObj();
3949        }
3950        // Don't cache streams since they are mutable (except images).
3951        if (!isStream(e) || e instanceof JpegStream)
3952          this.cache[num] = e;
3953        return e;
3954      }
3955
3956      // compressed entry
3957      stream = this.fetch(new Ref(e.offset, 0));
3958      if (!isStream(stream))
3959        error('bad ObjStm stream');
3960      var first = stream.parameters.get('First');
3961      var n = stream.parameters.get('N');
3962      if (!isInt(first) || !isInt(n)) {
3963        error('invalid first and n parameters for ObjStm stream');
3964      }
3965      parser = new Parser(new Lexer(stream), false, this);
3966      var i, entries = [], nums = [];
3967      // read the object numbers to populate cache
3968      for (i = 0; i < n; ++i) {
3969        num = parser.getObj();
3970        if (!isInt(num)) {
3971          error('invalid object number in the ObjStm stream: ' + num);
3972        }
3973        nums.push(num);
3974        var offset = parser.getObj();
3975        if (!isInt(offset)) {
3976          error('invalid object offset in the ObjStm stream: ' + offset);
3977        }
3978      }
3979      // read stream objects for cache
3980      for (i = 0; i < n; ++i) {
3981        entries.push(parser.getObj());
3982        this.cache[nums[i]] = entries[i];
3983      }
3984      e = entries[e.gen];
3985      if (!e) {
3986        error('bad XRef entry for compressed object');
3987      }
3988      return e;
3989    },
3990    getCatalogObj: function XRef_getCatalogObj() {
3991      return this.root;
3992    }
3993  };
3994
3995  return XRef;
3996})();
3997
3998/**
3999 * A PDF document and page is built of many objects. E.g. there are objects
4000 * for fonts, images, rendering code and such. These objects might get processed
4001 * inside of a worker. The `PDFObjects` implements some basic functions to
4002 * manage these objects.
4003 */
4004var PDFObjects = (function PDFObjectsClosure() {
4005  function PDFObjects() {
4006    this.objs = {};
4007  }
4008
4009  PDFObjects.prototype = {
4010    objs: null,
4011
4012    /**
4013     * Internal function.
4014     * Ensures there is an object defined for `objId`. Stores `data` on the
4015     * object *if* it is created.
4016     */
4017    ensureObj: function PDFObjects_ensureObj(objId, data) {
4018      if (this.objs[objId])
4019        return this.objs[objId];
4020      return this.objs[objId] = new Promise(objId, data);
4021    },
4022
4023    /**
4024     * If called *without* callback, this returns the data of `objId` but the
4025     * object needs to be resolved. If it isn't, this function throws.
4026     *
4027     * If called *with* a callback, the callback is called with the data of the
4028     * object once the object is resolved. That means, if you call this
4029     * function and the object is already resolved, the callback gets called
4030     * right away.
4031     */
4032    get: function PDFObjects_get(objId, callback) {
4033      // If there is a callback, then the get can be async and the object is
4034      // not required to be resolved right now
4035      if (callback) {
4036        this.ensureObj(objId).then(callback);
4037        return null;
4038      }
4039
4040      // If there isn't a callback, the user expects to get the resolved data
4041      // directly.
4042      var obj = this.objs[objId];
4043
4044      // If there isn't an object yet or the object isn't resolved, then the
4045      // data isn't ready yet!
4046      if (!obj || !obj.isResolved)
4047        error('Requesting object that isn\'t resolved yet ' + objId);
4048
4049      return obj.data;
4050    },
4051
4052    /**
4053     * Resolves the object `objId` with optional `data`.
4054     */
4055    resolve: function PDFObjects_resolve(objId, data) {
4056      var objs = this.objs;
4057
4058      // In case there is a promise already on this object, just resolve it.
4059      if (objs[objId]) {
4060        objs[objId].resolve(data);
4061      } else {
4062        this.ensureObj(objId, data);
4063      }
4064    },
4065
4066    onData: function PDFObjects_onData(objId, callback) {
4067      this.ensureObj(objId).onData(callback);
4068    },
4069
4070    isResolved: function PDFObjects_isResolved(objId) {
4071      var objs = this.objs;
4072      if (!objs[objId]) {
4073        return false;
4074      } else {
4075        return objs[objId].isResolved;
4076      }
4077    },
4078
4079    hasData: function PDFObjects_hasData(objId) {
4080      var objs = this.objs;
4081      if (!objs[objId]) {
4082        return false;
4083      } else {
4084        return objs[objId].hasData;
4085      }
4086    },
4087
4088    /**
4089     * Sets the data of an object but *doesn't* resolve it.
4090     */
4091    setData: function PDFObjects_setData(objId, data) {
4092      // Watchout! If you call `this.ensureObj(objId, data)` you're going to
4093      // create a *resolved* promise which shouldn't be the case!
4094      this.ensureObj(objId).data = data;
4095    }
4096  };
4097  return PDFObjects;
4098})();
4099
4100
4101/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
4102/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
4103
4104'use strict';
4105
4106var PDFFunction = (function PDFFunctionClosure() {
4107  var CONSTRUCT_SAMPLED = 0;
4108  var CONSTRUCT_INTERPOLATED = 2;
4109  var CONSTRUCT_STICHED = 3;
4110  var CONSTRUCT_POSTSCRIPT = 4;
4111
4112  return {
4113    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
4114                                                       str) {
4115      var length = 1;
4116      for (var i = 0, ii = size.length; i < ii; i++)
4117        length *= size[i];
4118      length *= outputSize;
4119
4120      var array = [];
4121      var codeSize = 0;
4122      var codeBuf = 0;
4123      // 32 is a valid bps so shifting won't work
4124      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
4125
4126      var strBytes = str.getBytes((length * bps + 7) / 8);
4127      var strIdx = 0;
4128      for (var i = 0; i < length; i++) {
4129        while (codeSize < bps) {
4130          codeBuf <<= 8;
4131          codeBuf |= strBytes[strIdx++];
4132          codeSize += 8;
4133        }
4134        codeSize -= bps;
4135        array.push((codeBuf >> codeSize) * sampleMul);
4136        codeBuf &= (1 << codeSize) - 1;
4137      }
4138      return array;
4139    },
4140
4141    getIR: function PDFFunction_getIR(xref, fn) {
4142      var dict = fn.dict;
4143      if (!dict)
4144        dict = fn;
4145
4146      var types = [this.constructSampled,
4147                   null,
4148                   this.constructInterpolated,
4149                   this.constructStiched,
4150                   this.constructPostScript];
4151
4152      var typeNum = dict.get('FunctionType');
4153      var typeFn = types[typeNum];
4154      if (!typeFn)
4155        error('Unknown type of function');
4156
4157      return typeFn.call(this, fn, dict, xref);
4158    },
4159
4160    fromIR: function PDFFunction_fromIR(IR) {
4161      var type = IR[0];
4162      switch (type) {
4163        case CONSTRUCT_SAMPLED:
4164          return this.constructSampledFromIR(IR);
4165        case CONSTRUCT_INTERPOLATED:
4166          return this.constructInterpolatedFromIR(IR);
4167        case CONSTRUCT_STICHED:
4168          return this.constructStichedFromIR(IR);
4169        case CONSTRUCT_POSTSCRIPT:
4170        default:
4171          return this.constructPostScriptFromIR(IR);
4172      }
4173    },
4174
4175    parse: function PDFFunction_parse(xref, fn) {
4176      var IR = this.getIR(xref, fn);
4177      return this.fromIR(IR);
4178    },
4179
4180    constructSampled: function PDFFunction_constructSampled(str, dict) {
4181      function toMultiArray(arr) {
4182        var inputLength = arr.length;
4183        var outputLength = arr.length / 2;
4184        var out = [];
4185        var index = 0;
4186        for (var i = 0; i < inputLength; i += 2) {
4187          out[index] = [arr[i], arr[i + 1]];
4188          ++index;
4189        }
4190        return out;
4191      }
4192      var domain = dict.get('Domain');
4193      var range = dict.get('Range');
4194
4195      if (!domain || !range)
4196        error('No domain or range');
4197
4198      var inputSize = domain.length / 2;
4199      var outputSize = range.length / 2;
4200
4201      domain = toMultiArray(domain);
4202      range = toMultiArray(range);
4203
4204      var size = dict.get('Size');
4205      var bps = dict.get('BitsPerSample');
4206      var order = dict.get('Order');
4207      if (!order)
4208        order = 1;
4209      if (order !== 1)
4210        error('No support for cubic spline interpolation: ' + order);
4211
4212      var encode = dict.get('Encode');
4213      if (!encode) {
4214        encode = [];
4215        for (var i = 0; i < inputSize; ++i) {
4216          encode.push(0);
4217          encode.push(size[i] - 1);
4218        }
4219      }
4220      encode = toMultiArray(encode);
4221
4222      var decode = dict.get('Decode');
4223      if (!decode)
4224        decode = range;
4225      else
4226        decode = toMultiArray(decode);
4227
4228      var samples = this.getSampleArray(size, outputSize, bps, str);
4229
4230      return [
4231        CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
4232        outputSize, Math.pow(2, bps) - 1, range
4233      ];
4234    },
4235
4236    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
4237      // See chapter 3, page 109 of the PDF reference
4238      function interpolate(x, xmin, xmax, ymin, ymax) {
4239        return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
4240      }
4241
4242      return function constructSampledFromIRResult(args) {
4243        // See chapter 3, page 110 of the PDF reference.
4244        var m = IR[1];
4245        var domain = IR[2];
4246        var encode = IR[3];
4247        var decode = IR[4];
4248        var samples = IR[5];
4249        var size = IR[6];
4250        var n = IR[7];
4251        var mask = IR[8];
4252        var range = IR[9];
4253
4254        if (m != args.length)
4255          error('Incorrect number of arguments: ' + inputSize + ' != ' +
4256                args.length);
4257
4258        var x = args;
4259
4260        // Building the cube vertices: its part and sample index
4261        // http://rjwagner49.com/Mathematics/Interpolation.pdf
4262        var cubeVertices = 1 << m;
4263        var cubeN = new Float64Array(cubeVertices);
4264        var cubeVertex = new Uint32Array(cubeVertices);
4265        for (var j = 0; j < cubeVertices; j++)
4266          cubeN[j] = 1;
4267
4268        var k = n, pos = 1;
4269        // Map x_i to y_j for 0 <= i < m using the sampled function.
4270        for (var i = 0; i < m; ++i) {
4271          // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
4272          var domain_2i = domain[i][0];
4273          var domain_2i_1 = domain[i][1];
4274          var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1);
4275
4276          // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
4277          //                   Encode_2i, Encode_2i+1)
4278          var e = interpolate(xi, domain_2i, domain_2i_1,
4279                              encode[i][0], encode[i][1]);
4280
4281          // e_i' = min(max(e_i, 0), Size_i - 1)
4282          var size_i = size[i];
4283          e = Math.min(Math.max(e, 0), size_i - 1);
4284
4285          // Adjusting the cube: N and vertex sample index
4286          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
4287          var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
4288          var n1 = e - e0; // (e - e0) / (e1 - e0);
4289          var offset0 = e0 * k;
4290          var offset1 = offset0 + k; // e1 * k
4291          for (var j = 0; j < cubeVertices; j++) {
4292            if (j & pos) {
4293              cubeN[j] *= n1;
4294              cubeVertex[j] += offset1;
4295            } else {
4296              cubeN[j] *= n0;
4297              cubeVertex[j] += offset0;
4298            }
4299          }
4300
4301          k *= size_i;
4302          pos <<= 1;
4303        }
4304
4305        var y = new Float64Array(n);
4306        for (var j = 0; j < n; ++j) {
4307          // Sum all cube vertices' samples portions
4308          var rj = 0;
4309          for (var i = 0; i < cubeVertices; i++)
4310            rj += samples[cubeVertex[i] + j] * cubeN[i];
4311
4312          // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
4313          //                    Decode_2j, Decode_2j+1)
4314          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
4315
4316          // y_j = min(max(r_j, range_2j), range_2j+1)
4317          y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
4318        }
4319
4320        return y;
4321      }
4322    },
4323
4324    constructInterpolated: function PDFFunction_constructInterpolated(str,
4325                                                                      dict) {
4326      var c0 = dict.get('C0') || [0];
4327      var c1 = dict.get('C1') || [1];
4328      var n = dict.get('N');
4329
4330      if (!isArray(c0) || !isArray(c1))
4331        error('Illegal dictionary for interpolated function');
4332
4333      var length = c0.length;
4334      var diff = [];
4335      for (var i = 0; i < length; ++i)
4336        diff.push(c1[i] - c0[i]);
4337
4338      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
4339    },
4340
4341    constructInterpolatedFromIR:
4342      function PDFFunction_constructInterpolatedFromIR(IR) {
4343      var c0 = IR[1];
4344      var diff = IR[2];
4345      var n = IR[3];
4346
4347      var length = diff.length;
4348
4349      return function constructInterpolatedFromIRResult(args) {
4350        var x = n == 1 ? args[0] : Math.pow(args[0], n);
4351
4352        var out = [];
4353        for (var j = 0; j < length; ++j)
4354          out.push(c0[j] + (x * diff[j]));
4355
4356        return out;
4357
4358      }
4359    },
4360
4361    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
4362      var domain = dict.get('Domain');
4363
4364      if (!domain)
4365        error('No domain');
4366
4367      var inputSize = domain.length / 2;
4368      if (inputSize != 1)
4369        error('Bad domain for stiched function');
4370
4371      var fnRefs = dict.get('Functions');
4372      var fns = [];
4373      for (var i = 0, ii = fnRefs.length; i < ii; ++i)
4374        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
4375
4376      var bounds = dict.get('Bounds');
4377      var encode = dict.get('Encode');
4378
4379      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
4380    },
4381
4382    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
4383      var domain = IR[1];
4384      var bounds = IR[2];
4385      var encode = IR[3];
4386      var fnsIR = IR[4];
4387      var fns = [];
4388
4389      for (var i = 0, ii = fnsIR.length; i < ii; i++) {
4390        fns.push(PDFFunction.fromIR(fnsIR[i]));
4391      }
4392
4393      return function constructStichedFromIRResult(args) {
4394        var clip = function constructStichedFromIRClip(v, min, max) {
4395          if (v > max)
4396            v = max;
4397          else if (v < min)
4398            v = min;
4399          return v;
4400        };
4401
4402        // clip to domain
4403        var v = clip(args[0], domain[0], domain[1]);
4404        // calulate which bound the value is in
4405        for (var i = 0, ii = bounds.length; i < ii; ++i) {
4406          if (v < bounds[i])
4407            break;
4408        }
4409
4410        // encode value into domain of function
4411        var dmin = domain[0];
4412        if (i > 0)
4413          dmin = bounds[i - 1];
4414        var dmax = domain[1];
4415        if (i < bounds.length)
4416          dmax = bounds[i];
4417
4418        var rmin = encode[2 * i];
4419        var rmax = encode[2 * i + 1];
4420
4421        var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
4422
4423        // call the appropropriate function
4424        return fns[i]([v2]);
4425      };
4426    },
4427
4428    constructPostScript: function PDFFunction_constructPostScript(fn, dict,
4429                                                                  xref) {
4430      var domain = dict.get('Domain');
4431      var range = dict.get('Range');
4432
4433      if (!domain)
4434        error('No domain.');
4435
4436      if (!range)
4437        error('No range.');
4438
4439      var lexer = new PostScriptLexer(fn);
4440      var parser = new PostScriptParser(lexer);
4441      var code = parser.parse();
4442
4443      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
4444    },
4445
4446    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
4447                                          IR) {
4448      var domain = IR[1];
4449      var range = IR[2];
4450      var code = IR[3];
4451      var numOutputs = range.length / 2;
4452      var evaluator = new PostScriptEvaluator(code);
4453      // Cache the values for a big speed up, the cache size is limited though
4454      // since the number of possible values can be huge from a PS function.
4455      var cache = new FunctionCache();
4456      return function constructPostScriptFromIRResult(args) {
4457        var initialStack = [];
4458        for (var i = 0, ii = (domain.length / 2); i < ii; ++i) {
4459          initialStack.push(args[i]);
4460        }
4461
4462        var key = initialStack.join('_');
4463        if (cache.has(key))
4464          return cache.get(key);
4465
4466        var stack = evaluator.execute(initialStack);
4467        var transformed = [];
4468        for (i = numOutputs - 1; i >= 0; --i) {
4469          var out = stack.pop();
4470          var rangeIndex = 2 * i;
4471          if (out < range[rangeIndex])
4472            out = range[rangeIndex];
4473          else if (out > range[rangeIndex + 1])
4474            out = range[rangeIndex + 1];
4475          transformed[i] = out;
4476        }
4477        cache.set(key, transformed);
4478        return transformed;
4479      };
4480    }
4481  };
4482})();
4483
4484var FunctionCache = (function FunctionCacheClosure() {
4485  // Of 10 PDF's with type4 functions the maxium number of distinct values seen
4486  // was 256. This still may need some tweaking in the future though.
4487  var MAX_CACHE_SIZE = 1024;
4488  function FunctionCache() {
4489    this.cache = {};
4490    this.total = 0;
4491  }
4492  FunctionCache.prototype = {
4493    has: function FunctionCache_has(key) {
4494      return key in this.cache;
4495    },
4496    get: function FunctionCache_get(key) {
4497      return this.cache[key];
4498    },
4499    set: function FunctionCache_set(key, value) {
4500      if (this.total < MAX_CACHE_SIZE) {
4501        this.cache[key] = value;
4502        this.total++;
4503      }
4504    }
4505  };
4506  return FunctionCache;
4507})();
4508
4509var PostScriptStack = (function PostScriptStackClosure() {
4510  var MAX_STACK_SIZE = 100;
4511  function PostScriptStack(initialStack) {
4512    this.stack = initialStack || [];
4513  }
4514
4515  PostScriptStack.prototype = {
4516    push: function PostScriptStack_push(value) {
4517      if (this.stack.length >= MAX_STACK_SIZE)
4518        error('PostScript function stack overflow.');
4519      this.stack.push(value);
4520    },
4521    pop: function PostScriptStack_pop() {
4522      if (this.stack.length <= 0)
4523        error('PostScript function stack underflow.');
4524      return this.stack.pop();
4525    },
4526    copy: function PostScriptStack_copy(n) {
4527      if (this.stack.length + n >= MAX_STACK_SIZE)
4528        error('PostScript function stack overflow.');
4529      var stack = this.stack;
4530      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++)
4531        stack.push(stack[i]);
4532    },
4533    index: function PostScriptStack_index(n) {
4534      this.push(this.stack[this.stack.length - n - 1]);
4535    },
4536    // rotate the last n stack elements p times
4537    roll: function PostScriptStack_roll(n, p) {
4538      var stack = this.stack;
4539      var l = stack.length - n;
4540      var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
4541      for (i = l, j = r; i < j; i++, j--) {
4542        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
4543      }
4544      for (i = l, j = c - 1; i < j; i++, j--) {
4545        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
4546      }
4547      for (i = c, j = r; i < j; i++, j--) {
4548        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
4549      }
4550    }
4551  };
4552  return PostScriptStack;
4553})();
4554var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
4555  function PostScriptEvaluator(operators, operands) {
4556    this.operators = operators;
4557    this.operands = operands;
4558  }
4559  PostScriptEvaluator.prototype = {
4560    execute: function PostScriptEvaluator_execute(initialStack) {
4561      var stack = new PostScriptStack(initialStack);
4562      var counter = 0;
4563      var operators = this.operators;
4564      var length = operators.length;
4565      var operator, a, b;
4566      while (counter < length) {
4567        operator = operators[counter++];
4568        if (typeof operator == 'number') {
4569          // Operator is really an operand and should be pushed to the stack.
4570          stack.push(operator);
4571          continue;
4572        }
4573        switch (operator) {
4574          // non standard ps operators
4575          case 'jz': // jump if false
4576            b = stack.pop();
4577            a = stack.pop();
4578            if (!a)
4579              counter = b;
4580            break;
4581          case 'j': // jump
4582            a = stack.pop();
4583            counter = a;
4584            break;
4585
4586          // all ps operators in alphabetical order (excluding if/ifelse)
4587          case 'abs':
4588            a = stack.pop();
4589            stack.push(Math.abs(a));
4590            break;
4591          case 'add':
4592            b = stack.pop();
4593            a = stack.pop();
4594            stack.push(a + b);
4595            break;
4596          case 'and':
4597            b = stack.pop();
4598            a = stack.pop();
4599            if (isBool(a) && isBool(b))
4600              stack.push(a && b);
4601            else
4602              stack.push(a & b);
4603            break;
4604          case 'atan':
4605            a = stack.pop();
4606            stack.push(Math.atan(a));
4607            break;
4608          case 'bitshift':
4609            b = stack.pop();
4610            a = stack.pop();
4611            if (a > 0)
4612              stack.push(a << b);
4613            else
4614              stack.push(a >> b);
4615            break;
4616          case 'ceiling':
4617            a = stack.pop();
4618            stack.push(Math.ceil(a));
4619            break;
4620          case 'copy':
4621            a = stack.pop();
4622            stack.copy(a);
4623            break;
4624          case 'cos':
4625            a = stack.pop();
4626            stack.push(Math.cos(a));
4627            break;
4628          case 'cvi':
4629            a = stack.pop() | 0;
4630            stack.push(a);
4631            break;
4632          case 'cvr':
4633            // noop
4634            break;
4635          case 'div':
4636            b = stack.pop();
4637            a = stack.pop();
4638            stack.push(a / b);
4639            break;
4640          case 'dup':
4641            stack.copy(1);
4642            break;
4643          case 'eq':
4644            b = stack.pop();
4645            a = stack.pop();
4646            stack.push(a == b);
4647            break;
4648          case 'exch':
4649            stack.roll(2, 1);
4650            break;
4651          case 'exp':
4652            b = stack.pop();
4653            a = stack.pop();
4654            stack.push(Math.pow(a, b));
4655            break;
4656          case 'false':
4657            stack.push(false);
4658            break;
4659          case 'floor':
4660            a = stack.pop();
4661            stack.push(Math.floor(a));
4662            break;
4663          case 'ge':
4664            b = stack.pop();
4665            a = stack.pop();
4666            stack.push(a >= b);
4667            break;
4668          case 'gt':
4669            b = stack.pop();
4670            a = stack.pop();
4671            stack.push(a > b);
4672            break;
4673          case 'idiv':
4674            b = stack.pop();
4675            a = stack.pop();
4676            stack.push((a / b) | 0);
4677            break;
4678          case 'index':
4679            a = stack.pop();
4680            stack.index(a);
4681            break;
4682          case 'le':
4683            b = stack.pop();
4684            a = stack.pop();
4685            stack.push(a <= b);
4686            break;
4687          case 'ln':
4688            a = stack.pop();
4689            stack.push(Math.log(a));
4690            break;
4691          case 'log':
4692            a = stack.pop();
4693            stack.push(Math.log(a) / Math.LN10);
4694            break;
4695          case 'lt':
4696            b = stack.pop();
4697            a = stack.pop();
4698            stack.push(a < b);
4699            break;
4700          case 'mod':
4701            b = stack.pop();
4702            a = stack.pop();
4703            stack.push(a % b);
4704            break;
4705          case 'mul':
4706            b = stack.pop();
4707            a = stack.pop();
4708            stack.push(a * b);
4709            break;
4710          case 'ne':
4711            b = stack.pop();
4712            a = stack.pop();
4713            stack.push(a != b);
4714            break;
4715          case 'neg':
4716            a = stack.pop();
4717            stack.push(-b);
4718            break;
4719          case 'not':
4720            a = stack.pop();
4721            if (isBool(a) && isBool(b))
4722              stack.push(a && b);
4723            else
4724              stack.push(a & b);
4725            break;
4726          case 'or':
4727            b = stack.pop();
4728            a = stack.pop();
4729            if (isBool(a) && isBool(b))
4730              stack.push(a || b);
4731            else
4732              stack.push(a | b);
4733            break;
4734          case 'pop':
4735            stack.pop();
4736            break;
4737          case 'roll':
4738            b = stack.pop();
4739            a = stack.pop();
4740            stack.roll(a, b);
4741            break;
4742          case 'round':
4743            a = stack.pop();
4744            stack.push(Math.round(a));
4745            break;
4746          case 'sin':
4747            a = stack.pop();
4748            stack.push(Math.sin(a));
4749            break;
4750          case 'sqrt':
4751            a = stack.pop();
4752            stack.push(Math.sqrt(a));
4753            break;
4754          case 'sub':
4755            b = stack.pop();
4756            a = stack.pop();
4757            stack.push(a - b);
4758            break;
4759          case 'true':
4760            stack.push(true);
4761            break;
4762          case 'truncate':
4763            a = stack.pop();
4764            a = a < 0 ? Math.ceil(a) : Math.floor(a);
4765            stack.push(a);
4766            break;
4767          case 'xor':
4768            b = stack.pop();
4769            a = stack.pop();
4770            if (isBool(a) && isBool(b))
4771              stack.push(a != b);
4772            else
4773              stack.push(a ^ b);
4774            break;
4775          default:
4776            error('Unknown operator ' + operator);
4777            break;
4778        }
4779      }
4780      return stack.stack;
4781    }
4782  };
4783  return PostScriptEvaluator;
4784})();
4785
4786var PostScriptParser = (function PostScriptParserClosure() {
4787  function PostScriptParser(lexer) {
4788    this.lexer = lexer;
4789    this.operators = [];
4790    this.token;
4791    this.prev;
4792  }
4793  PostScriptParser.prototype = {
4794    nextToken: function PostScriptParser_nextToken() {
4795      this.prev = this.token;
4796      this.token = this.lexer.getToken();
4797    },
4798    accept: function PostScriptParser_accept(type) {
4799      if (this.token.type == type) {
4800        this.nextToken();
4801        return true;
4802      }
4803      return false;
4804    },
4805    expect: function PostScriptParser_expect(type) {
4806      if (this.accept(type))
4807        return true;
4808      error('Unexpected symbol: found ' + this.token.type + ' expected ' +
4809            type + '.');
4810    },
4811    parse: function PostScriptParser_parse() {
4812      this.nextToken();
4813      this.expect(PostScriptTokenTypes.LBRACE);
4814      this.parseBlock();
4815      this.expect(PostScriptTokenTypes.RBRACE);
4816      return this.operators;
4817    },
4818    parseBlock: function PostScriptParser_parseBlock() {
4819      while (true) {
4820        if (this.accept(PostScriptTokenTypes.NUMBER)) {
4821          this.operators.push(this.prev.value);
4822        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
4823          this.operators.push(this.prev.value);
4824        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
4825          this.parseCondition();
4826        } else {
4827          return;
4828        }
4829      }
4830    },
4831    parseCondition: function PostScriptParser_parseCondition() {
4832      // Add two place holders that will be updated later
4833      var conditionLocation = this.operators.length;
4834      this.operators.push(null, null);
4835
4836      this.parseBlock();
4837      this.expect(PostScriptTokenTypes.RBRACE);
4838      if (this.accept(PostScriptTokenTypes.IF)) {
4839        // The true block is right after the 'if' so it just falls through on
4840        // true else it jumps and skips the true block.
4841        this.operators[conditionLocation] = this.operators.length;
4842        this.operators[conditionLocation + 1] = 'jz';
4843      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
4844        var jumpLocation = this.operators.length;
4845        this.operators.push(null, null);
4846        var endOfTrue = this.operators.length;
4847        this.parseBlock();
4848        this.expect(PostScriptTokenTypes.RBRACE);
4849        this.expect(PostScriptTokenTypes.IFELSE);
4850        // The jump is added at the end of the true block to skip the false
4851        // block.
4852        this.operators[jumpLocation] = this.operators.length;
4853        this.operators[jumpLocation + 1] = 'j';
4854
4855        this.operators[conditionLocation] = endOfTrue;
4856        this.operators[conditionLocation + 1] = 'jz';
4857      } else {
4858        error('PS Function: error parsing conditional.');
4859      }
4860    }
4861  };
4862  return PostScriptParser;
4863})();
4864
4865var PostScriptTokenTypes = {
4866  LBRACE: 0,
4867  RBRACE: 1,
4868  NUMBER: 2,
4869  OPERATOR: 3,
4870  IF: 4,
4871  IFELSE: 5
4872};
4873
4874var PostScriptToken = (function PostScriptTokenClosure() {
4875  function PostScriptToken(type, value) {
4876    this.type = type;
4877    this.value = value;
4878  }
4879
4880  var opCache = {};
4881
4882  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
4883    var opValue = opCache[op];
4884    if (opValue)
4885      return opValue;
4886
4887    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
4888  };
4889
4890  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
4891                                                '{');
4892  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
4893                                                '}');
4894  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
4895  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
4896                                                'IFELSE');
4897  return PostScriptToken;
4898})();
4899
4900var PostScriptLexer = (function PostScriptLexerClosure() {
4901  function PostScriptLexer(stream) {
4902    this.stream = stream;
4903  }
4904  PostScriptLexer.prototype = {
4905    getToken: function PostScriptLexer_getToken() {
4906      var s = '';
4907      var ch;
4908      var comment = false;
4909      var stream = this.stream;
4910
4911      // skip comments
4912      while (true) {
4913        if (!(ch = stream.getChar()))
4914          return EOF;
4915
4916        if (comment) {
4917          if (ch == '\x0a' || ch == '\x0d')
4918            comment = false;
4919        } else if (ch == '%') {
4920          comment = true;
4921        } else if (!Lexer.isSpace(ch)) {
4922          break;
4923        }
4924      }
4925      switch (ch) {
4926        case '0': case '1': case '2': case '3': case '4':
4927        case '5': case '6': case '7': case '8': case '9':
4928        case '+': case '-': case '.':
4929          return new PostScriptToken(PostScriptTokenTypes.NUMBER,
4930                                      this.getNumber(ch));
4931        case '{':
4932          return PostScriptToken.LBRACE;
4933        case '}':
4934          return PostScriptToken.RBRACE;
4935      }
4936      // operator
4937      var str = ch.toLowerCase();
4938      while (true) {
4939        ch = stream.lookChar();
4940        if (ch === null)
4941          break;
4942        ch = ch.toLowerCase();
4943        if (ch >= 'a' && ch <= 'z')
4944          str += ch;
4945        else
4946          break;
4947        stream.skip();
4948      }
4949      switch (str) {
4950        case 'if':
4951          return PostScriptToken.IF;
4952        case 'ifelse':
4953          return PostScriptToken.IFELSE;
4954        default:
4955          return PostScriptToken.getOperator(str);
4956      }
4957    },
4958    getNumber: function PostScriptLexer_getNumber(ch) {
4959      var str = ch;
4960      var stream = this.stream;
4961      while (true) {
4962        ch = stream.lookChar();
4963        if ((ch >= '0' && ch <= '9') || ch == '-' || ch == '.')
4964          str += ch;
4965        else
4966          break;
4967        stream.skip();
4968      }
4969      var value = parseFloat(str);
4970      if (isNaN(value))
4971        error('Invalid floating point number: ' + value);
4972      return value;
4973    }
4974  };
4975  return PostScriptLexer;
4976})();
4977
4978
4979/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
4980/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
4981
4982'use strict';
4983
4984var ISOAdobeCharset = [
4985  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
4986  'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
4987  'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
4988  'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
4989  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
4990  'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
4991  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
4992  'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
4993  'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
4994  'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
4995  'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
4996  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
4997  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
4998  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
4999  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
5000  'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
5001  'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
5002  'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
5003  'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
5004  'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
5005  'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
5006  'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
5007  'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
5008  'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
5009  'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
5010  'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
5011  'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
5012  'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
5013  'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
5014  'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
5015  'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
5016  'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
5017  'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
5018  'ugrave', 'yacute', 'ydieresis', 'zcaron'
5019];
5020
5021var ExpertCharset = [
5022  '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
5023  'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
5024  'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
5025  'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
5026  'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
5027  'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
5028  'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
5029  'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
5030  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
5031  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
5032  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
5033  'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
5034  'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
5035  'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
5036  'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
5037  'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
5038  'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
5039  'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
5040  'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
5041  'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
5042  'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
5043  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
5044  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
5045  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
5046  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
5047  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
5048  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
5049  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
5050  'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
5051  'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
5052  'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
5053  'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
5054  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
5055  'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
5056  'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
5057  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
5058  'Ydieresissmall'
5059];
5060
5061var ExpertSubsetCharset = [
5062  '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
5063  'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
5064  'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
5065  'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
5066  'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
5067  'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
5068  'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
5069  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
5070  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
5071  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
5072  'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
5073  'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
5074  'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
5075  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
5076  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
5077  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
5078  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
5079  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
5080  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
5081  'periodinferior', 'commainferior'
5082];
5083
5084
5085/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
5086/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
5087
5088'use strict';
5089
5090var CIDToUnicodeMaps = {
5091  'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165,
5092    {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771],
5093    [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402,
5094    0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0,
5095    [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769},
5096    [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212],
5097    198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172,
5098    174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
5099    {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
5100    {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
5101    {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288],
5102    {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
5103    {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
5104    {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
5105    65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288},
5106    {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291,
5107    [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806},
5108    8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284,
5109    {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675,
5110    9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306,
5111    8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838},
5112    {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704,
5113    8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730,
5114    8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834,
5115    {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313},
5116    {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913},
5117    {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025,
5118    {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463,
5119    21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569,
5120    28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451,
5121    22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433,
5122    24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301,
5123    20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944,
5124    26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806,
5125    [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946,
5126    37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419,
5127    39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139,
5128    32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879,
5129    [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867,
5130    [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417,
5131    28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180,
5132    21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945,
5133    29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123,
5134    30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290,
5135    22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814,
5136    28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467,
5137    40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540,
5138    25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206,
5139    [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742,
5140    29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899],
5141    19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025,
5142    22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827,
5143    [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499,
5144    33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942,
5145    38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469,
5146    34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602,
5147    22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913,
5148    39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809,
5149    38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830,
5150    24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012,
5151    39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275,
5152    25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226,
5153    [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398,
5154    23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949,
5155    28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088,
5156    36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427,
5157    33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000,
5158    33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223,
5159    24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185,
5160    24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454,
5161    27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475,
5162    31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694,
5163    35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867,
5164    39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721,
5165    32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916,
5166    22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582,
5167    26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671,
5168    27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020,
5169    36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096],
5170    20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097,
5171    31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507,
5172    21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458,
5173    33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470,
5174    [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699,
5175    31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435,
5176    23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624,
5177    28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689,
5178    20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659,
5179    23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841,
5180    29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911,
5181    39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997,
5182    [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670,
5183    [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465,
5184    33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061,
5185    20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368,
5186    39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533,
5187    20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705,
5188    31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531,
5189    34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670,
5190    21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693,
5191    24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054,
5192    31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336,
5193    35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119,
5194    25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500,
5195    [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537,
5196    20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314,
5197    25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486,
5198    30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562,
5199    36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187,
5200    24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328],
5201    35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396,
5202    [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392,
5203    31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431,
5204    38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566,
5205    23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492,
5206    35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809,
5207    20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897,
5208    22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055,
5209    24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511,
5210    25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946,
5211    28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024,
5212    32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618,
5213    [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783,
5214    37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083,
5215    21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811,
5216    21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425,
5217    33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915,
5218    20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681,
5219    26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449,
5220    21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782,
5221    35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622,
5222    22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319,
5223    29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555,
5224    21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018,
5225    32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662,
5226    26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545,
5227    21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217,
5228    38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977,
5229    20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642,
5230    29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283,
5231    27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235,
5232    [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107,
5233    24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525,
5234    [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992],
5235    32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430,
5236    35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284,
5237    20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835,
5238    29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819],
5239    [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235,
5240    31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460,
5241    24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612,
5242    33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012,
5243    29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034,
5244    20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509,
5245    23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530,
5246    29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463,
5247    21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447,
5248    23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333,
5249    32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655,
5250    36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313],
5251    24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460,
5252    22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899,
5253    36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490,
5254    26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981,
5255    37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210,
5256    32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207,
5257    24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484,
5258    21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558,
5259    [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220,
5260    25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167,
5261    27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465,
5262    30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750,
5263    33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062,
5264    37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055,
5265    20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465,
5266    26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065,
5267    22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394],
5268    35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767,
5269    23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862,
5270    27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051,
5271    [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763],
5272    36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563,
5273    29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920,
5274    37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700],
5275    28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543,
5276    29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441,
5277    26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990,
5278    28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104,
5279    25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298,
5280    [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488,
5281    35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246,
5282    33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707],
5283    31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889,
5284    20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634,
5285    32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554,
5286    23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927,
5287    26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680,
5288    33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983,
5289    37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109,
5290    32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970,
5291    29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311,
5292    35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489,
5293    21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436,
5294    25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437,
5295    29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609,
5296    33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783,
5297    38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419,
5298    20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895,
5299    20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384,
5300    23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409,
5301    21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364,
5302    39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907,
5303    25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864,
5304    36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261,
5305    38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299,
5306    27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552,
5307    21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466,
5308    36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336,
5309    22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701,
5310    31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727,
5311    24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320,
5312    24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933,
5313    39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378,
5314    33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609,
5315    27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710,
5316    29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086,
5317    24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397,
5318    28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548,
5319    36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189,
5320    25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684,
5321    26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131,
5322    20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378,
5323    22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302,
5324    20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237,
5325    24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118,
5326    31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336,
5327    [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969,
5328    37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635,
5329    22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857,
5330    20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615,
5331    22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077,
5332    36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900,
5333    24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616,
5334    22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812,
5335    26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095,
5336    31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342,
5337    35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472,
5338    38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643,
5339    31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499,
5340    28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233,
5341    20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702,
5342    22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311,
5343    37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466,
5344    37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741,
5345    [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425,
5346    24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219,
5347    22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105,
5348    24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492,
5349    22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468,
5350    24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110,
5351    32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479,
5352    30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757,
5353    26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204,
5354    30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333],
5355    31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707,
5356    39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368,
5357    24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271,
5358    39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532,
5359    38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495,
5360    27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009,
5361    31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436,
5362    30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754,
5363    25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382],
5364    30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991,
5365    [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503,
5366    27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305,
5367    [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050,
5368    31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426,
5369    27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551,
5370    30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428,
5371    25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184,
5372    22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975,
5373    26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676,
5374    36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310,
5375    33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239,
5376    21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343,
5377    25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996,
5378    25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862,
5379    19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109,
5380    38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887,
5381    21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232,
5382    36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303,
5383    37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675,
5384    24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253,
5385    21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447,
5386    25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990,
5387    33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165,
5388    40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125,
5389    {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938,
5390    33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693,
5391    [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187,
5392    27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705,
5393    30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737,
5394    27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451,
5395    [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975,
5396    24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637,
5397    23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885,
5398    [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695,
5399    40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855,
5400    37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236,
5401    [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611],
5402    29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665,
5403    [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839,
5404    24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822,
5405    37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493,
5406    38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664,
5407    21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558,
5408    26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480,
5409    36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313,
5410    19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562,
5411    25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992],
5412    31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965,
5413    38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096,
5414    32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853,
5415    37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033,
5416    21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041,
5417    [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504,
5418    30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534,
5419    [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142,
5420    20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637,
5421    31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147],
5422    32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563,
5423    40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363,
5424    20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646,
5425    38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265,
5426    24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676,
5427    21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266,
5428    24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725,
5429    [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682,
5430    35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434,
5431    20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109,
5432    24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031],
5433    20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333,
5434    20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174,
5435    20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233,
5436    20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376,
5437    20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447,
5438    20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520,
5439    20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478,
5440    20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570,
5441    20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681},
5442    20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725,
5443    20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791,
5444    20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834,
5445    31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873,
5446    20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898,
5447    {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917,
5448    20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976,
5449    [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038,
5450    21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108,
5451    21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137,
5452    36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214,
5453    21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254,
5454    21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283,
5455    21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321,
5456    21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367,
5457    [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430],
5458    21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498,
5459    21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533,
5460    21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627,
5461    21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676,
5462    21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720,
5463    {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817,
5464    21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811,
5465    21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918,
5466    21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956,
5467    21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009,
5468    22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063,
5469    22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190,
5470    22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225,
5471    22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280,
5472    22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327},
5473    22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409,
5474    22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484,
5475    {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561,
5476    22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687,
5477    22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743,
5478    22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777,
5479    {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790,
5480    22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862,
5481    22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941,
5482    20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001},
5483    23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113,
5484    {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229,
5485    23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318,
5486    23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381,
5487    {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418,
5488    [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504,
5489    23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557,
5490    {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592,
5491    [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409,
5492    23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939,
5493    23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785,
5494    23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839,
5495    23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886,
5496    23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980,
5497    23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022,
5498    [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091,
5499    {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162,
5500    24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636,
5501    [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291,
5502    24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305,
5503    24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413,
5504    24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392,
5505    24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409,
5506    [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458,
5507    24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508,
5508    24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672,
5509    24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591,
5510    24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675,
5511    24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707,
5512    24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760,
5513    24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853,
5514    24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817,
5515    {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876,
5516    24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948,
5517    24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967,
5518    25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033,
5519    25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059,
5520    25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096],
5521    25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136,
5522    {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212,
5523    25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303,
5524    25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290,
5525    25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352,
5526    25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472,
5527    25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534,
5528    25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652,
5529    25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711,
5530    25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818,
5531    25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289,
5532    {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850,
5533    25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908],
5534    [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933,
5535    25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015,
5536    26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073,
5537    [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483,
5538    {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205,
5539    26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249,
5540    26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296,
5541    26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359,
5542    26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433,
5543    26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480,
5544    26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607,
5545    26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606,
5546    26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701,
5547    26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767,
5548    26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784,
5549    26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918,
5550    26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839,
5551    26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913,
5552    26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937,
5553    26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058,
5554    27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101,
5555    27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102,
5556    27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057,
5557    27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204,
5558    27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192,
5559    27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323,
5560    27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354,
5561    27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448,
5562    27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476,
5563    27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523,
5564    27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569,
5565    [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628,
5566    27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684,
5567    27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803,
5568    27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863,
5569    27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882,
5570    27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922,
5571    27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644,
5572    28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140,
5573    28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138,
5574    28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267,
5575    28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189,
5576    28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356,
5577    28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748,
5578    28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478,
5579    28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659,
5580    28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579,
5581    28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632,
5582    28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670,
5583    28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753,
5584    28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895,
5585    28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064,
5586    29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096,
5587    29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164,
5588    29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229,
5589    29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254,
5590    29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346,
5591    29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410,
5592    {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469,
5593    29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546,
5594    29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627,
5595    29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746,
5596    29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795,
5597    29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681,
5598    29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943,
5599    29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990,
5600    29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057,
5601    30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090,
5602    30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147,
5603    30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179,
5604    30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194},
5605    30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256,
5606    30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305},
5607    {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332,
5608    30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384,
5609    30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437,
5610    30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494,
5611    {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571,
5612    30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622,
5613    30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679,
5614    30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018,
5615    30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890,
5616    30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956,
5617    30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019,
5618    31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114,
5619    31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189,
5620    31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263,
5621    31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329},
5622    31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382,
5623    31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434,
5624    31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457},
5625    31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512},
5626    31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564,
5627    31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645,
5628    31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641,
5629    31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764,
5630    31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757,
5631    31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811,
5632    31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852,
5633    31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923,
5634    31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954,
5635    31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002,
5636    32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070,
5637    32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137,
5638    32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189,
5639    32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221,
5640    32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274,
5641    32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313,
5642    32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345},
5643    32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383,
5644    {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398,
5645    {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592,
5646    [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616},
5647    32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670,
5648    32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697,
5649    {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761,
5650    39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801,
5651    32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866,
5652    32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900,
5653    32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997,
5654    32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065,
5655    33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137,
5656    33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184,
5657    33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208,
5658    33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224,
5659    33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281},
5660    33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331,
5661    33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384,
5662    {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426,
5663    33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523,
5664    33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497,
5665    33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583,
5666    33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571,
5667    33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704,
5668    33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783,
5669    33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787,
5670    33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922,
5671    33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983,
5672    33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953,
5673    34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044,
5674    34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212,
5675    34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204,
5676    34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269,
5677    34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338,
5678    34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417,
5679    34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500,
5680    34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527,
5681    34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569,
5682    34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586,
5683    34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649,
5684    34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749,
5685    34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799,
5686    34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833,
5687    34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884,
5688    34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933,
5689    34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957,
5690    34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032},
5691    35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082,
5692    35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126,
5693    35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183,
5694    35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233,
5695    35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290,
5696    {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355,
5697    35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437,
5698    35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493},
5699    35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556,
5700    35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610,
5701    35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646,
5702    35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691,
5703    35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730},
5704    35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920,
5705    [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973,
5706    35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029,
5707    {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093,
5708    {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112,
5709    40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225,
5710    36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299,
5711    {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351,
5712    {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423,
5713    36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437,
5714    36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499,
5715    36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542,
5716    36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618,
5717    36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646,
5718    36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686,
5719    36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791,
5720    36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857},
5721    36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917,
5722    36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958,
5723    36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002,
5724    37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083,
5725    37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221,
5726    37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290,
5727    37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343,
5728    37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397,
5729    37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451,
5730    37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609,
5731    37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685,
5732    37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780,
5733    37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832,
5734    37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941,
5735    37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994,
5736    37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015,
5737    38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311,
5738    38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348,
5739    38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440,
5740    {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493,
5741    38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567,
5742    {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585],
5743    38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660,
5744    38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698,
5745    38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748,
5746    38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780,
5747    38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819,
5748    {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876,
5749    [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968,
5750    38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023},
5751    39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145,
5752    39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204,
5753    39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243,
5754    {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341},
5755    39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405},
5756    {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467,
5757    39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511,
5758    39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612,
5759    39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647],
5760    {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675,
5761    39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717],
5762    {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747,
5763    39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825,
5764    {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865,
5765    39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994,
5766    39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944,
5767    39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007,
5768    39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172,
5769    40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227,
5770    40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264,
5771    {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363,
5772    40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376,
5773    40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431,
5774    40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584,
5775    {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632,
5776    40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669,
5777    40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697],
5778    {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737,
5779    40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803,
5780    {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822,
5781    40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0,
5782    {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0,
5783    13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0,
5784    {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470,
5785    13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180,
5786    8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976,
5787    0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0,
5788    194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171,
5789    0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070,
5790    {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4},
5791    64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625,
5792    39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0,
5793    28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802,
5794    63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584,
5795    {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432,
5796    194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0,
5797    {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0,
5798    {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089},
5799    {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508,
5800    65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825,
5801    9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235,
5802    13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090,
5803    13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056,
5804    13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3},
5805    {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560},
5806    {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856,
5807    12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976,
5808    12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947,
5809    12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260,
5810    13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256,
5811    8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824,
5812    9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953,
5813    9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612,
5814    9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566,
5815    9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20},
5816    20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575,
5817    8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0,
5818    12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704,
5819    37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389,
5820    [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362,
5821    20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546,
5822    20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148,
5823    21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014,
5824    21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471,
5825    64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970,
5826    23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0,
5827    23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542,
5828    24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880,
5829    24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133,
5830    26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272,
5831    26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831,
5832    64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262,
5833    27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039,
5834    28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199,
5835    28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843,
5836    28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374,
5837    29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685,
5838    29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364,
5839    30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842,
5840    31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467,
5841    31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030,
5842    33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155,
5843    64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495,
5844    35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214,
5845    64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335,
5846    37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434,
5847    37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495},
5848    37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665,
5849    37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830,
5850    37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
5851    38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
5852    {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
5853    39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636},
5854    8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256,
5855    298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
5856    {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
5857    467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
5858    8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
5859    331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108},
5860    {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424},
5861    {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944,
5862    {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963,
5863    12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111,
5864    {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0,
5865    0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3},
5866    {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0,
5867    13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082},
5868    {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0,
5869    {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0,
5870    13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128,
5871    {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139,
5872    {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0,
5873    {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265,
5874    {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312},
5875    {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121,
5876    {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8},
5877    9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855,
5878    {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598},
5879    8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0,
5880    9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093},
5881    {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069,
5882    64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105,
5883    64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072,
5884    64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885,
5885    64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095,
5886    24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075,
5887    64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150,
5888    64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0,
5889    37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5},
5890    37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478,
5891    11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10},
5892    171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7},
5893    11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555,
5894    23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4},
5895    29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600,
5896    0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577,
5897    {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136],
5898    [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155],
5899    131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237,
5900    {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4},
5901    [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842,
5902    {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741,
5903    194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9},
5904    20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46},
5905    13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0,
5906    0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0,
5907    63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210,
5908    194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669,
5909    23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0,
5910    26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818,
5911    {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570,
5912    30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5},
5913    11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094],
5914    [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4},
5915    34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0,
5916    0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206,
5917    {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972},
5918    19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058],
5919    20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245,
5920    20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431,
5921    20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586,
5922    20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747,
5923    20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993,
5924    [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232,
5925    {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478,
5926    21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677,
5927    21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896,
5928    21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118,
5929    22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193,
5930    22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348,
5931    22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537,
5932    22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761,
5933    22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011},
5934    23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207,
5935    23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420,
5936    {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676,
5937    23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956,
5938    23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088,
5939    24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274,
5940    24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384,
5941    [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504,
5942    [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627,
5943    24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850},
5944    24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155,
5945    25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368,
5946    25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502,
5947    25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723,
5948    {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959,
5949    25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209,
5950    26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486,
5951    26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672},
5952    26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856,
5953    26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979,
5954    26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137,
5955    27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227,
5956    27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428,
5957    27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699,
5958    [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856,
5959    27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950,
5960    27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194,
5961    28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506,
5962    28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583},
5963    28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772,
5964    [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892,
5965    28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139,
5966    29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276,
5967    29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489,
5968    29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598},
5969    29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693,
5970    29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743},
5971    29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809,
5972    29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867,
5973    29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096,
5974    [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229},
5975    30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321,
5976    30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556,
5977    {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726,
5978    30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926,
5979    30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035],
5980    31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163,
5981    31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308,
5982    31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430,
5983    31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602,
5984    31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798,
5985    31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959,
5986    31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083,
5987    32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249,
5988    32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401,
5989    32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657,
5990    32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785,
5991    32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934,
5992    32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156,
5993    33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359,
5994    33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670,
5995    33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866,
5996    33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142,
5997    34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415,
5998    34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579,
5999    34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741,
6000    34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911,
6001    [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035,
6002    {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195,
6003    35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455,
6004    35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924,
6005    35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228,
6006    36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460,
6007    36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662,
6008    36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866,
6009    36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085,
6010    37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220,
6011    37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371,
6012    37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570,
6013    {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0,
6014    37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885,
6015    37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0,
6016    38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564,
6017    38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755,
6018    38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922,
6019    38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096,
6020    39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263,
6021    39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463,
6022    {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673,
6023    39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895,
6024    39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001,
6025    40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316,
6026    40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469,
6027    40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729,
6028    40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848,
6029    40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665,
6030    28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435,
6031    20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668,
6032    29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0,
6033    0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094,
6034    13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836},
6035    {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741},
6036    {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209},
6037    {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472,
6038    474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711,
6039    351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336,
6040    344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345,
6041    369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365,
6042    625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607,
6043    626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644,
6044    608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674,
6045    673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0,
6046    0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828,
6047    820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3},
6048    {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695,
6049    704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0,
6050    {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0,
6051    {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649,
6052    {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0,
6053    9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258,
6054    {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842},
6055    {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504,
6056    20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938,
6057    20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631,
6058    21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391,
6059    22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369,
6060    22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421,
6061    23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760,
6062    138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320,
6063    24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647,
6064    24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302,
6065    25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155,
6066    26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344,
6067    26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953,
6068    144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215,
6069    27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565,
6070    27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967,
6071    27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432,
6072    28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750,
6073    28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063,
6074    29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602,
6075    29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242,
6076    30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420,
6077    30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688,
6078    152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028,
6079    31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052,
6080    31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853,
6081    31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194,
6082    32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120,
6083    {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463,
6084    33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581,
6085    33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887,
6086    33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148,
6087    34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988,
6088    34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898,
6089    34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399,
6090    35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944,
6091    36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638,
6092    36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054,
6093    {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167,
6094    37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939,
6095    37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355,
6096    18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857,
6097    38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682,
6098    39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909,
6099    39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274,
6100    40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623,
6101    40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049,
6102    13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186,
6103    20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343},
6104    20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499,
6105    20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650,
6106    131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686,
6107    131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851,
6108    20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010,
6109    21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144,
6110    133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314,
6111    133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917,
6112    {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602,
6113    21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740,
6114    21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831,
6115    13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765,
6116    21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056,
6117    135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112,
6118    22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239,
6119    22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341},
6120    22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895,
6121    22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004,
6122    22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585,
6123    136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671},
6124    22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771},
6125    {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974,
6126    158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984,
6127    22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079,
6128    23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221,
6129    23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319,
6130    23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468,
6131    {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555,
6132    23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616,
6133    138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642,
6134    23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837,
6135    23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333,
6136    23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036,
6137    24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433,
6138    {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317,
6139    24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519,
6140    24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610,
6141    24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793,
6142    24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928,
6143    141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077,
6144    141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301,
6145    142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397,
6146    {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246,
6147    25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568,
6148    {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715,
6149    25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828,
6150    25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963,
6151    25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062,
6152    26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082,
6153    143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256,
6154    26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386,
6155    144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341,
6156    26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587,
6157    26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683,
6158    26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748,
6159    26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794},
6160    26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841,
6161    {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950,
6162    26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072,
6163    27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309,
6164    27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209,
6165    27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307,
6166    27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389,
6167    145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480,
6168    27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581,
6169    {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662,
6170    27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799,
6171    27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940,
6172    {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016,
6173    {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937,
6174    146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150,
6175    28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239,
6176    {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469,
6177    28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326,
6178    28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591,
6179    15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715,
6180    28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806,
6181    28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934,
6182    28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056,
6183    29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877,
6184    29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311,
6185    29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427,
6186    29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501,
6187    29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588,
6188    29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689,
6189    29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832,
6190    150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882,
6191    29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215,
6192    150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074,
6193    {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135,
6194    {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183,
6195    30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227,
6196    {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273,
6197    151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375},
6198    30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517,
6199    151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618,
6200    30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622,
6201    30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868,
6202    30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999,
6203    30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137,
6204    31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524,
6205    16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324,
6206    31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820,
6207    31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549,
6208    31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609,
6209    31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676,
6210    31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747,
6211    31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222,
6212    155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949,
6213    155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616,
6214    155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090,
6215    32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167,
6216    32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272,
6217    32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195,
6218    32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294,
6219    {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662,
6220    32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790,
6221    32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952,
6222    157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054,
6223    17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436,
6224    33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252,
6225    157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238,
6226    33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379,
6227    158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458,
6228    33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620,
6229    33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587,
6230    {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785,
6231    33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881},
6232    33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982,
6233    17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042,
6234    34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129,
6235    {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205,
6236    34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264},
6237    34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343,
6238    160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441,
6239    {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531,
6240    34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609,
6241    34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731,
6242    160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784,
6243    34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856,
6244    34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329,
6245    34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550,
6246    35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231,
6247    35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345,
6248    35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472,
6249    35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188,
6250    35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901,
6251    162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986,
6252    35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110,
6253    36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374,
6254    {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461,
6255    36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616,
6256    36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806,
6257    64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919,
6258    165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613,
6259    37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106,
6260    37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177,
6261    {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302,
6262    {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251,
6263    37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503,
6264    37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554,
6265    {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673,
6266    166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605,
6267    37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852,
6268    37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997,
6269    37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419,
6270    167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530,
6271    167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616,
6272    38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743,
6273    38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860,
6274    38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132,
6275    169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423,
6276    39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146,
6277    {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753,
6278    {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246,
6279    39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182,
6280    39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500,
6281    39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632,
6282    39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708,
6283    39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787},
6284    {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896,
6285    39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958,
6286    {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028,
6287    171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031,
6288    {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178,
6289    40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058,
6290    40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310},
6291    40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416,
6292    40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581,
6293    40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762,
6294    40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813,
6295    40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326,
6296    19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267,
6297    20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578,
6298    20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743,
6299    {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943,
6300    20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035,
6301    {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112},
6302    21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298,
6303    21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434,
6304    21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556},
6305    21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768,
6306    21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924,
6307    21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008,
6308    22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149,
6309    22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257,
6310    22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333},
6311    22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541,
6312    22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815,
6313    22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218,
6314    23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520,
6315    23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860,
6316    23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155,
6317    24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276},
6318    24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829,
6319    24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989,
6320    25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149,
6321    25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419,
6322    25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578,
6323    {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663,
6324    25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840,
6325    25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056,
6326    26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405,
6327    26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664,
6328    26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051,
6329    27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336},
6330    27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657,
6331    27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001,
6332    28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348,
6333    {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685,
6334    28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207,
6335    29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385,
6336    29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528,
6337    29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015,
6338    30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191,
6339    30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397,
6340    30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521,
6341    30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596,
6342    {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681,
6343    30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931,
6344    30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147,
6345    31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380,
6346    31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730,
6347    31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826},
6348    {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962,
6349    32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208,
6350    32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573,
6351    32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674,
6352    {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980,
6353    33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135,
6354    33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249,
6355    33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389,
6356    33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622,
6357    33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134,
6358    34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617,
6359    34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751,
6360    34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901,
6361    34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086},
6362    35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260,
6363    35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537,
6364    35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704,
6365    35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041,
6366    36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241,
6367    36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363,
6368    36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465,
6369    36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584,
6370    36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679,
6371    36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955,
6372    36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104,
6373    37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307,
6374    37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551,
6375    {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720,
6376    37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901},
6377    37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368,
6378    38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527,
6379    38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696,
6380    38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861,
6381    38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170,
6382    39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459,
6383    39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693},
6384    39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856,
6385    39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040,
6386    40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578},
6387    40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742,
6388    {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044,
6389    151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790,
6390    {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488,
6391    {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339,
6392    0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5},
6393    15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207,
6394    162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532,
6395    63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819,
6396    38315, 38741, 171581, 173594],
6397  'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644],
6398    {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211},
6399    8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308},
6400    {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176,
6401    {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736,
6402    8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679,
6403    9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594,
6404    {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757,
6405    {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745,
6406    {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733,
6407    730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240,
6408    9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673,
6409    9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641,
6410    9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598,
6411    8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250,
6412    13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507,
6413    {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544},
6414    {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472,
6415    9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475,
6416    9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512,
6417    9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494,
6418    9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510},
6419    {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525},
6420    {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539},
6421    {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209},
6422    13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223},
6423    {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200},
6424    8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229},
6425    13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254,
6426    198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330,
6427    {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189,
6428    {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307,
6429    312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800},
6430    {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319,
6431    {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040},
6432    1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036,
6433    {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068,
6434    {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107,
6435    44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151},
6436    44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180,
6437    {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204,
6438    {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232,
6439    44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266,
6440    44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288,
6441    44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329,
6442    {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359,
6443    44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400,
6444    {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417},
6445    {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471,
6446    {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512,
6447    44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555,
6448    44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602,
6449    {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624,
6450    44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648},
6451    44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684,
6452    {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751},
6453    {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796,
6454    {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852,
6455    {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880,
6456    {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936,
6457    {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992,
6458    {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032},
6459    {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072,
6460    45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132,
6461    45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184,
6462    45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212,
6463    {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233,
6464    {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255},
6465    {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320},
6466    {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336},
6467    {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364},
6468    {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392},
6469    {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440,
6470    45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468,
6471    45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544},
6472    45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576,
6473    {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628,
6474    45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692,
6475    {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720},
6476    {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748,
6477    {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789,
6478    45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811},
6479    {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840},
6480    {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915},
6481    {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934,
6482    {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964,
6483    45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024,
6484    {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043,
6485    46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112,
6486    {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168,
6487    {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248,
6488    46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293,
6489    {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319,
6490    46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372},
6491    {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400},
6492    {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428},
6493    {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506},
6494    {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532,
6495    {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612,
6496    46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752,
6497    46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840,
6498    {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895},
6499    {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944,
6500    46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976,
6501    46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008,
6502    {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049,
6503    {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103},
6504    {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133,
6505    {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168,
6506    47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212},
6507    47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288,
6508    {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329,
6509    {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364,
6510    47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441,
6511    {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469,
6512    {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497},
6513    {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551,
6514    47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579,
6515    {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604},
6516    {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676,
6517    47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699},
6518    47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732,
6519    47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787},
6520    47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816,
6521    {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900,
6522    47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931},
6523    {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960,
6524    47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052,
6525    48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124,
6526    {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145,
6527    {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173,
6528    {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201,
6529    {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267},
6530    48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292,
6531    {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316},
6532    48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348,
6533    {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400,
6534    48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464,
6535    {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519},
6536    {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560,
6537    48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640,
6538    48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671,
6539    {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727,
6540    {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752},
6541    {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780},
6542    {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852,
6543    {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904},
6544    {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968,
6545    {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104,
6546    49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248,
6547    {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315,
6548    49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331},
6549    {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360,
6550    {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388,
6551    {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429,
6552    {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452},
6553    {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480},
6554    {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508},
6555    {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552,
6556    49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576},
6557    49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632,
6558    49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668,
6559    {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695},
6560    {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736,
6561    {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776,
6562    49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816,
6563    49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844},
6564    49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899},
6565    49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920,
6566    {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948,
6567    {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032,
6568    50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112,
6569    {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157,
6570    {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228,
6571    {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292},
6572    50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420,
6573    50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460,
6574    {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493,
6575    {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515},
6576    {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536,
6577    {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567,
6578    {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592,
6579    50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619},
6580    {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648,
6581    {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676,
6582    {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704,
6583    {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728,
6584    {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747,
6585    {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771},
6586    {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812,
6587    50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844,
6588    {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872},
6589    {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900,
6590    {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928,
6591    {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964},
6592    50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995,
6593    50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020},
6594    51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060},
6595    51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086,
6596    {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104},
6597    {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132},
6598    {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165,
6599    51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210,
6600    {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236,
6601    {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272},
6602    {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322,
6603    {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357,
6604    51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404,
6605    {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445,
6606    {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473,
6607    51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552},
6608    51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600,
6609    {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655},
6610    51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673},
6611    {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692},
6612    {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720},
6613    {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796,
6614    {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864,
6615    {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923,
6616    {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992,
6617    {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056},
6618    52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201,
6619    {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257},
6620    {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283},
6621    {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320,
6622    52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384,
6623    {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412,
6624    {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481,
6625    {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516,
6626    52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593,
6627    52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647,
6628    52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728},
6629    52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772,
6630    52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828,
6631    {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856,
6632    52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888,
6633    {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929,
6634    {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980},
6635    {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011,
6636    53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048,
6637    {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097,
6638    {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168,
6639    53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237,
6640    53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308,
6641    {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344,
6642    {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412},
6643    53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444,
6644    {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468},
6645    53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517,
6646    {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571},
6647    {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608,
6648    53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672,
6649    {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752,
6650    53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820},
6651    53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896,
6652    {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937,
6653    {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963,
6654    53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008,
6655    {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038,
6656    {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064,
6657    {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140},
6658    54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172,
6659    54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204,
6660    {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243,
6661    {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280,
6662    54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392},
6663    54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420,
6664    54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520,
6665    54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551,
6666    {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609,
6667    {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637,
6668    {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672,
6669    54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747,
6670    54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777,
6671    {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812,
6672    54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853,
6673    {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876,
6674    54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924},
6675    54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971,
6676    {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012,
6677    55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057,
6678    {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085,
6679    {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120},
6680    55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148,
6681    55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184,
6682    {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487,
6683    21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468,
6684    29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747],
6685    36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580,
6686    29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904,
6687    23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567,
6688    30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393,
6689    35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088,
6690    34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954,
6691    26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039,
6692    {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083,
6693    22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074,
6694    30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611,
6695    37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887,
6696    24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445,
6697    33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520,
6698    21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067,
6699    36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062],
6700    24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625,
6701    26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163,
6702    24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160,
6703    35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937,
6704    [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080,
6705    32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435,
6706    20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465,
6707    24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039,
6708    28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478,
6709    32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857,
6710    38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395,
6711    23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926,
6712    31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476,
6713    21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911,
6714    25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295,
6715    32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996,
6716    35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741,
6717    26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825,
6718    26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592],
6719    20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329,
6720    25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521,
6721    [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328,
6722    36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448,
6723    23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733,
6724    35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809,
6725    21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009,
6726    37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871,
6727    25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676,
6728    21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350,
6729    30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171,
6730    39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312,
6731    [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943,
6732    24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628,
6733    27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127,
6734    32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544,
6735    36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407,
6736    [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628,
6737    21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391,
6738    23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240,
6739    21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152,
6740    36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512,
6741    36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789,
6742    31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343,
6743    30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840,
6744    26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135,
6745    29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935,
6746    25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167,
6747    37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834,
6748    30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522,
6749    22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190,
6750    24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231,
6751    27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859,
6752    30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000,
6753    32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215,
6754    37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342,
6755    21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062,
6756    [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423,
6757    25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064,
6758    20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873],
6759    [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684,
6760    25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361,
6761    [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126,
6762    [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612,
6763    [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998],
6764    [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086,
6765    27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170,
6766    37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812,
6767    26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203,
6768    35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530,
6769    22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680,
6770    20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140,
6771    25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503,
6772    24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648,
6773    23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691,
6774    26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153,
6775    31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117,
6776    37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167,
6777    31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788,
6778    28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205,
6779    21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643,
6780    31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168,
6781    31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929,
6782    36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588,
6783    37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758],
6784    [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762],
6785    [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097,
6786    [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771],
6787    [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774],
6788    [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900,
6789    27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261,
6790    [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784],
6791    [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690,
6792    [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790],
6793    [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864],
6794    [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867],
6795    [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791,
6796    [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150,
6797    [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851,
6798    [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881],
6799    [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019,
6800    [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891,
6801    [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894],
6802    [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898],
6803    [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916,
6804    [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909],
6805    28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278,
6806    [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917],
6807    31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921],
6808    [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925],
6809    28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791],
6810    25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794],
6811    [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798],
6812    [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802],
6813    [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805],
6814    [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595,
6815    [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903,
6816    [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814],
6817    [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817],
6818    [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934],
6819    [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938],
6820    [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105,
6821    [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267,
6822    [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825],
6823    [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946],
6824    [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244,
6825    [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954],
6826    [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958],
6827    32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962],
6828    [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828],
6829    [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832],
6830    [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774,
6831    [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432,
6832    [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673,
6833    [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328,
6834    [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982],
6835    [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986],
6836    [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990],
6837    38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705,
6838    29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518,
6839    24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398,
6840    24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067,
6841    34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178,
6842    38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579,
6843    33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757,
6844    27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476,
6845    39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906,
6846    35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236,
6847    [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269,
6848    26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528,
6849    40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720},
6850    26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520,
6851    [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408],
6852    27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818,
6853    26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218,
6854    29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287,
6855    25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045,
6856    32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664,
6857    20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862,
6858    34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614,
6859    23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473,
6860    [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758,
6861    24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225,
6862    38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420,
6863    27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180,
6864    36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856,
6865    26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928,
6866    [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187,
6867    25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747,
6868    20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918,
6869    [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938,
6870    33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848,
6871    20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403,
6872    32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271,
6873    20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146,
6874    29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624,
6875    38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539,
6876    27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887,
6877    34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029,
6878    30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170,
6879    26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432,
6880    20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668,
6881    29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264,
6882    [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068,
6883    35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472,
6884    22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299,
6885    34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613,
6886    21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500,
6887    24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807,
6888    [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000,
6889    36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385,
6890    40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575,
6891    24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452,
6892    36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844,
6893    32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138,
6894    24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604],
6895    {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875,
6896    32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692,
6897    36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338,
6898    24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007,
6899    36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181,
6900    20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235,
6901    [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473,
6902    24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863,
6903    28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023,
6904    32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613,
6905    36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632,
6906    21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948,
6907    37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441,
6908    26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978,
6909    20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120,
6910    24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248,
6911    [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937,
6912    36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850],
6913    [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996,
6914    24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360,
6915    26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298,
6916    34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736],
6917    [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101,
6918    28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808,
6919    21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764,
6920    29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337,
6921    34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352,
6922    23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373,
6923    [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814,
6924    36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615,
6925    24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596,
6926    32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237,
6927    31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569,
6928    24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703,
6929    28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032,
6930    32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902,
6931    39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895,
6932    23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435,
6933    24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862,
6934    37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234,
6935    23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628,
6936    25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159,
6937    29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929,
6938    32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966,
6939    35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539,
6940    {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460,
6941    22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901,
6942    33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529,
6943    27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600,
6944    34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899,
6945    36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629,
6946    [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319,
6947    25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204,
6948    [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178,
6949    26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997,
6950    35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335,
6951    24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996],
6952    36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480,
6953    24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251],
6954    33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805,
6955    22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145,
6956    28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617,
6957    [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105,
6958    [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187,
6959    40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569,
6960    [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823,
6961    23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839,
6962    26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284,
6963    33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171,
6964    27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079,
6965    30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099,
6966    38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825,
6967    25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903,
6968    33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965,
6969    26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344,
6970    [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044,
6971    28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014,
6972    25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578,
6973    23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989,
6974    20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349,
6975    33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123,
6976    32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310,
6977    25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895,
6978    28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893,
6979    36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814,
6980    28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121,
6981    [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704,
6982    27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787,
6983    29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034,
6984    20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454,
6985    34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116,
6986    20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887,
6987    23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595,
6988    28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779,
6989    29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314,
6990    20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252,
6991    28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113,
6992    23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233,
6993    32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352],
6994    24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806,
6995    23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002,
6996    23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796,
6997    31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953,
6998    36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653,
6999    20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263,
7000    28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362,
7001    37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491,
7002    23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760,
7003    30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398,
7004    36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423,
7005    26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550,
7006    28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074,
7007    39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435,
7008    23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304,
7009    29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219,
7010    [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996,
7011    23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806,
7012    33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759,
7013    20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188},
7014    24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586,
7015    {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788,
7016    30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400,
7017    36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603,
7018    [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103,
7019    37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681,
7020    24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093,
7021    38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033,
7022    33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885,
7023    27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516,
7024    35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347,
7025    24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780],
7026    [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180,
7027    28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995,
7028    21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106,
7029    33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777,
7030    [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001,
7031    24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381,
7032    33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383,
7033    23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133,
7034    30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039,
7035    38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189,
7036    33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697,
7037    26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580,
7038    22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454,
7039    27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144,
7040    33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292,
7041    [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685,
7042    26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782,
7043    29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213,
7044    25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672,
7045    32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048,
7046    38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380,
7047    30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042,
7048    [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346,
7049    20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637,
7050    24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728,
7051    [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399,
7052    35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019,
7053    39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118,
7054    21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509,
7055    25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450,
7056    24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230,
7057    26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254,
7058    28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357,
7059    31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478,
7060    37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137,
7061    21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532,
7062    33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988,
7063    [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514,
7064    25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437,
7065    28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199,
7066    31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412,
7067    35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165],
7068    26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469,
7069    20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066,
7070    32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038,
7071    24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610,
7072    21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666,
7073    27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044,
7074    32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659,
7075    36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737,
7076    20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940,
7077    30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210,
7078    34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366,
7079    25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482,
7080    21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088,
7081    26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757,
7082    31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584,
7083    35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767,
7084    21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941,
7085    28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206,
7086    32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587,
7087    [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489,
7088    23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541,
7089    36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878,
7090    38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919,
7091    24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974,
7092    25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158,
7093    29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013,
7094    39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851],
7095    22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513,
7096    21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274,
7097    27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980,
7098    20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081,
7099    37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389,
7100    20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364,
7101    30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029,
7102    25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368,
7103    36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764,
7104    28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979,
7105    30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266,
7106    30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729,
7107    35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558,
7108    36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786,
7109    26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245,
7110    32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259,
7111    37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534,
7112    26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880,
7113    34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894,
7114    27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861,
7115    37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985,
7116    30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600,
7117    36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798,
7118    34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068,
7119    23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519,
7120    40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988,
7121    23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305,
7122    31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347,
7123    [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405,
7124    23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756,
7125    31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171,
7126    25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828,
7127    22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351,
7128    37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187,
7129    35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067,
7130    23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526,
7131    27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580,
7132    25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171,
7133    31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600,
7134    22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110,
7135    24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772,
7136    32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009,
7137    36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726,
7138    25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429,
7139    28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255],
7140    31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544,
7141    33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109,
7142    38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067,
7143    24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071,
7144    33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133,
7145    [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451,
7146    27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697,
7147    31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130,
7148    [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848],
7149    29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979,
7150    20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032,
7151    36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680,
7152    24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289},
7153    38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323,
7154    28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532,
7155    38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239,
7156    26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565,
7157    21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809,
7158    35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184,
7159    26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141,
7160    38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010,
7161    27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203,
7162    [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843,
7163    [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335,
7164    34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880],
7165    [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433,
7166    33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418,
7167    27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610,
7168    34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935,
7169    26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778,
7170    22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009,
7171    28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786,
7172    29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382,
7173    34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239,
7174    23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700,
7175    24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270,
7176    21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457,
7177    33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339,
7178    20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707,
7179    28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748],
7180    29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908,
7181    {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343,
7182    31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238,
7183    24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590,
7184    28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554,
7185    23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783,
7186    28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402,
7187    21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869,
7188    21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347,
7189    [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585,
7190    24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658,
7191    28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958,
7192    33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007,
7193    35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288,
7194    20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984,
7195    25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690,
7196    35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314},
7197    {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759,
7198    {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61},
7199    {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0,
7200    8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771,
7201    8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045,
7202    0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711,
7203    {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102},
7204    {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787,
7205    8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649,
7206    0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716,
7207    {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3},
7208    9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327},
7209    {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0,
7210    8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144},
7211    {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673,
7212    8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944,
7213    {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540,
7214    0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056,
7215    {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078,
7216    {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097},
7217    44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121},
7218    {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153,
7219    {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173},
7220    {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203,
7221    {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222},
7222    {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237},
7223    44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267,
7224    {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286},
7225    {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306},
7226    {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330},
7227    {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349},
7228    44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373},
7229    {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398},
7230    {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419},
7231    {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446},
7232    {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485},
7233    {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509},
7234    {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541},
7235    {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565},
7236    {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612,
7237    {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631},
7238    44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650},
7239    {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670},
7240    {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737},
7241    {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762},
7242    {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782},
7243    {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809},
7244    {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851,
7245    {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874},
7246    {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922},
7247    {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946},
7248    {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989},
7249    {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013},
7250    {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045},
7251    {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069},
7252    {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097},
7253    {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144,
7254    {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185},
7255    {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213},
7256    {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241},
7257    {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266},
7258    {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286},
7259    45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342},
7260    {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366,
7261    {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385},
7262    {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405},
7263    {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441,
7264    {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461},
7265    {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517},
7266    {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536},
7267    {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564,
7268    {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581},
7269    45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621},
7270    {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665},
7271    {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702},
7272    {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723},
7273    45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745},
7274    {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777,
7275    {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799,
7276    {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820},
7277    {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842,
7278    {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917,
7279    {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935,
7280    {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954,
7281    {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973},
7282    {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022},
7283    {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042,
7284    46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053},
7285    {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105},
7286    {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124},
7287    {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169},
7288    46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209},
7289    {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249},
7290    {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273},
7291    {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294},
7292    {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320,
7293    {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361},
7294    {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386},
7295    {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406},
7296    {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430,
7297    {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505,
7298    {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526},
7299    {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546},
7300    {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613},
7301    {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645},
7302    {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750},
7303    {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770},
7304    {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841},
7305    {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893},
7306    {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917},
7307    {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945},
7308    {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966},
7309    {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990,
7310    {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009},
7311    47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048,
7312    {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093},
7313    47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117},
7314    {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142},
7315    {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162},
7316    {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188},
7317    {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216,
7318    {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246},
7319    {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289},
7320    47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313},
7321    {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338},
7322    {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358},
7323    {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422},
7324    {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440,
7325    {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457},
7326    47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481},
7327    {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503},
7328    {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552,
7329    {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580,
7330    {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593},
7331    {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618},
7332    {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677},
7333    47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702},
7334    {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722},
7335    {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750,
7336    {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793,
7337    {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813},
7338    {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873},
7339    {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897},
7340    {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927,
7341    {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950,
7342    {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970,
7343    {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013},
7344    {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045},
7345    {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069},
7346    {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122},
7347    {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144,
7348    {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168,
7349    {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181},
7350    {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202},
7351    {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262},
7352    {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283},
7353    {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306,
7354    {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325},
7355    48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345},
7356    {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392,
7357    {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421},
7358    {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461},
7359    {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489},
7360    {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532,
7361    {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549},
7362    {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601},
7363    {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629},
7364    {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646},
7365    {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670,
7366    {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717,
7367    {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738},
7368    {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758},
7369    {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782,
7370    {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850},
7371    {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870},
7372    {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922,
7373    {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969},
7374    {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073},
7375    {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109},
7376    {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213},
7377    {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249},
7378    {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305},
7379    49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335},
7380    49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354},
7381    {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374},
7382    {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400,
7383    {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417},
7384    {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445,
7385    {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466},
7386    {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486},
7387    {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510,
7388    {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529},
7389    {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566,
7390    49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578},
7391    {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605},
7392    {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625},
7393    {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650,
7394    {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669},
7395    49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693},
7396    {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717},
7397    {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753},
7398    {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777},
7399    {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802},
7400    {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822},
7401    {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848,
7402    {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893},
7403    49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917},
7404    {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942},
7405    {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962},
7406    {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033,
7407    {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053},
7408    {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138},
7409    {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154},
7410    {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185},
7411    {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225},
7412    {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278},
7413    {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298},
7414    {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361},
7415    {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421},
7416    50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445},
7417    {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474},
7418    {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494},
7419    {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527,
7420    {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546,
7421    {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565},
7422    {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585},
7423    {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614},
7424    50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642},
7425    {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671,
7426    {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690},
7427    {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714,
7428    {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735,
7429    {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754},
7430    {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774},
7431    {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800,
7432    {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817},
7433    50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841},
7434    {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866},
7435    {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886},
7436    {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910},
7437    {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929},
7438    {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953},
7439    {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978},
7440    {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000},
7441    {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024,
7442    {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049},
7443    {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071},
7444    51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097,
7445    {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118},
7446    {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138},
7447    {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161},
7448    {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181},
7449    {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220,
7450    {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237},
7451    51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261},
7452    {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285},
7453    {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332,
7454    {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360,
7455    {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397},
7456    {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418},
7457    {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454},
7458    {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474},
7459    {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538},
7460    {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556},
7461    {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581},
7462    {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612,
7463    {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657,
7464    {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678},
7465    51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698},
7466    {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722,
7467    {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754},
7468    {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806,
7469    {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845},
7470    {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909},
7471    51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937},
7472    {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985},
7473    {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034},
7474    {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058},
7475    {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125},
7476    {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200,
7477    {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245},
7478    {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271,
7479    {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294},
7480    {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314},
7481    {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337},
7482    {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385},
7483    52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409},
7484    {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433},
7485    {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465},
7486    {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497},
7487    52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521},
7488    {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577},
7489    {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601},
7490    {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637},
7491    52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677},
7492    {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717},
7493    {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741},
7494    {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762},
7495    {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788,
7496    {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834},
7497    52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857},
7498    {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882},
7499    {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902},
7500    {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969},
7501    {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994},
7502    {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014},
7503    {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038,
7504    {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081},
7505    {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106},
7506    {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126},
7507    {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169},
7508    {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225},
7509    53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249},
7510    {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294},
7511    {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320,
7512    {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337},
7513    {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365},
7514    {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417},
7515    {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442},
7516    {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462},
7517    {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486,
7518    {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554},
7519    {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574},
7520    {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600,
7521    {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629},
7522    {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669},
7523    {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693},
7524    {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753},
7525    53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806},
7526    {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826},
7527    {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890},
7528    {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910},
7529    {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933},
7530    {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953,
7531    {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973},
7532    {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002},
7533    {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031,
7534    {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050},
7535    {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065},
7536    54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142},
7537    {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162},
7538    {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188,
7539    {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205},
7540    {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233},
7541    54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257},
7542    {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281},
7543    {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365},
7544    {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384},
7545    {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412,
7546    {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477},
7547    {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496},
7548    {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521},
7549    54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537},
7550    {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590},
7551    {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610},
7552    {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630},
7553    54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649},
7554    {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673},
7555    {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737,
7556    {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758},
7557    {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778},
7558    {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802,
7559    {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821},
7560    {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849},
7561    {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866},
7562    {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888,
7563    {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916,
7564    {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933},
7565    54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957},
7566    {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982},
7567    {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997},
7568    55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013},
7569    {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038},
7570    {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066},
7571    {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086},
7572    {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109},
7573    55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138,
7574    55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149},
7575    {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170},
7576    {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196,
7577    {f: 6, c: 55198}],
7578  'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294,
7579    8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106,
7580    183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288},
7581    {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308},
7582    {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298},
7583    {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300},
7584    {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113},
7585    {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283,
7586    65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733,
7587    9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0,
7588    {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119},
7589    65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806},
7590    8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869,
7591    8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793,
7592    9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0,
7593    0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451,
7594    8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217,
7595    {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835],
7596    [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044],
7597    [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609,
7598    9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492,
7599    9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698},
7600    9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544},
7601    {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313},
7602    {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
7603    {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153],
7604    [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158],
7605    [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163],
7606    [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168],
7607    [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173],
7608    [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178],
7609    [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008],
7610    [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185],
7611    [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188],
7612    [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191],
7613    [12057, 21353, 63192], [12059, 21430, 63193],
7614    [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195],
7615    [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198],
7616    [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201],
7617    [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204],
7618    [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216},
7619    9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102,
7620    [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837],
7621    [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147],
7622    [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977,
7623    19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062,
7624    20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475],
7625    [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823],
7626    [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544],
7627    [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029,
7628    [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062],
7629    [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165,
7630    19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113,
7631    20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173,
7632    {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844,
7633    20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305,
7634    21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825,
7635    22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187,
7636    24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142],
7637    [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007],
7638    [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352],
7639    [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490],
7640    [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611],
7641    [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226],
7642    [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273],
7643    [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992,
7644    20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180},
7645    {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908,
7646    {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271,
7647    21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487,
7648    21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483,
7649    21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234,
7650    22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039,
7651    24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098,
7652    {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412,
7653    {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712,
7654    27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916],
7655    [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993,
7656    [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333],
7657    [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683],
7658    [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166],
7659    [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073,
7660    20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237,
7661    {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225,
7662    20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015,
7663    {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280,
7664    {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508,
7665    21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237,
7666    22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809},
7667    {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913,
7668    {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673,
7669    24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102,
7670    {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088,
7671    {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421,
7672    27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728,
7673    27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334,
7674    [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566],
7675    [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780],
7676    [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905],
7677    {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267],
7678    [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311],
7679    [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880],
7680    [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303,
7681    20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285,
7682    20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271,
7683    20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853,
7684    {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163,
7685    {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566,
7686    21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545,
7687    21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568,
7688    21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353,
7689    22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846,
7690    22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931,
7691    22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596,
7692    {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043,
7693    24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439,
7694    24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106,
7695    25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212,
7696    25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233,
7697    25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460,
7698    26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599,
7699    27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770,
7700    27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774,
7701    27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796},
7702    28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995,
7703    {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995,
7704    32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426,
7705    33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328],
7706    [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997],
7707    [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523],
7708    [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804,
7709    24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193],
7710    [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006,
7711    20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365,
7712    20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360,
7713    20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821,
7714    20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050,
7715    21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329,
7716    21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624,
7717    21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617,
7718    21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403,
7719    22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857,
7720    {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993,
7721    22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981,
7722    23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578,
7723    23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731,
7724    24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220,
7725    {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447,
7726    24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629,
7727    24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109,
7728    25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273,
7729    25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276,
7730    [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304,
7731    {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106,
7732    26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122,
7733    26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487,
7734    26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485,
7735    26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667,
7736    27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837},
7737    27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822,
7738    27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887,
7739    27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228},
7740    29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609,
7741    29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402,
7742    30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354,
7743    31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933,
7744    32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278,
7745    33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452,
7746    33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021,
7747    34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319,
7748    [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464,
7749    38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738,
7750    [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448,
7751    20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398,
7752    20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881,
7753    20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193,
7754    21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672,
7755    21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697,
7756    21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271,
7757    22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865,
7758    22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013,
7759    23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458,
7760    23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093,
7761    24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456,
7762    24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613,
7763    24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684,
7764    24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345,
7765    25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361,
7766    25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151,
7767    26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580,
7768    26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548,
7769    26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589,
7770    26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915,
7771    27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963,
7772    {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950,
7773    27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856,
7774    28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623,
7775    29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028,
7776    30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328,
7777    {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473,
7778    30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046,
7779    31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359,
7780    31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004,
7781    32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997,
7782    32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989,
7783    33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509,
7784    33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502,
7785    33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923,
7786    35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276,
7787    36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836,
7788    36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480,
7789    {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859],
7790    [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080],
7791    [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056,
7792    20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375],
7793    20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500,
7794    20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522,
7795    20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934,
7796    20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407,
7797    21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766,
7798    21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799,
7799    21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537,
7800    22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059,
7801    23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472,
7802    23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637,
7803    23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796,
7804    24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464,
7805    24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735,
7806    24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343,
7807    25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424,
7808    25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009,
7809    26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177,
7810    26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681,
7811    26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704,
7812    26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529,
7813    27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040,
7814    28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994,
7815    28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888,
7816    28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432,
7817    29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045,
7818    30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140,
7819    30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505,
7820    {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775,
7821    30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062,
7822    31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206,
7823    31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023,
7824    32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013,
7825    32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792,
7826    32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005,
7827    33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261,
7828    33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618,
7829    33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593,
7830    33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451,
7831    34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941,
7832    34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350,
7833    35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524,
7834    36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852,
7835    36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197,
7836    37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497,
7837    38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340],
7838    [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730],
7839    [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556,
7840    20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559,
7841    20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209,
7842    21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364,
7843    21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846,
7844    21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811,
7845    21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496,
7846    22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105,
7847    23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408,
7848    23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648,
7849    {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849,
7850    23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119,
7851    {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425,
7852    24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739,
7853    24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757,
7854    24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775,
7855    {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463,
7856    25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512,
7857    25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449,
7858    25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944,
7859    25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205,
7860    26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799,
7861    26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755,
7862    26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754,
7863    27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082,
7864    28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113,
7865    28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085,
7866    28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074,
7867    28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309,
7868    29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699,
7869    29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986,
7870    {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154,
7871    30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520,
7872    30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381,
7873    31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895,
7874    31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051,
7875    32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718,
7876    32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072,
7877    33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656,
7878    33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655,
7879    {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500,
7880    34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987,
7881    34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365,
7882    35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011,
7883    36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889,
7884    36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896,
7885    36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207,
7886    37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517,
7887    38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633,
7888    31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165],
7889    [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642,
7890    20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977,
7891    21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883,
7892    21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908,
7893    21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947,
7894    21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580,
7895    22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880,
7896    [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506,
7897    23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879,
7898    24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260,
7899    24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800,
7900    24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846,
7901    24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536,
7902    25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558,
7903    {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950,
7904    25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786],
7905    26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397,
7906    26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855,
7907    26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825,
7908    26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631,
7909    {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263,
7910    28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270,
7911    28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901],
7912    28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255,
7913    {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260,
7914    29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730,
7915    29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736,
7916    {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174,
7917    30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813,
7918    30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382,
7919    31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563,
7920    31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043,
7921    32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724},
7922    32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094,
7923    33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805,
7924    33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802,
7925    33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756,
7926    33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532,
7927    34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424,
7928    35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386,
7929    35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027,
7930    36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302,
7931    36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604,
7932    36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129,
7933    37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389,
7934    37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286,
7935    38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593,
7936    38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917},
7937    38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341,
7938    [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661,
7939    {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119,
7940    21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992,
7941    21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978,
7942    21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609,
7943    22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610,
7944    22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234,
7945    23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492,
7946    24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840,
7947    24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887,
7948    {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615,
7949    25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032,
7950    26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028,
7951    26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984,
7952    26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506,
7953    27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304,
7954    28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310,
7955    28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028,
7956    29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032,
7957    29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781,
7958    29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072,
7959    30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195,
7960    {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572,
7961    30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860,
7962    30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165,
7963    31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680,
7964    31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129,
7965    32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854,
7966    32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131,
7967    {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909,
7968    33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897,
7969    33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560,
7970    34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033,
7971    35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435,
7972    {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441,
7973    35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938,
7974    35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037,
7975    36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530,
7976    36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930,
7977    36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926,
7978    36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432,
7979    37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453,
7980    37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603,
7981    {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774,
7982    {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156,
7983    {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718],
7984    [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903],
7985    20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123,
7986    21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022,
7987    22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296,
7988    22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781,
7989    22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254,
7990    23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522,
7991    23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151,
7992    24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907,
7993    24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688,
7994    25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723,
7995    25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029,
7996    27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088,
7997    27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467,
7998    28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418,
7999    28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459,
8000    28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081,
8001    29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796,
8002    29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217,
8003    30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887,
8004    30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401,
8005    31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631,
8006    [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156,
8007    {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191,
8008    32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736},
8009    32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151,
8010    33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990,
8011    33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936,
8012    33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584,
8013    34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048,
8014    35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492,
8015    35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980,
8016    36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629,
8017    36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957,
8018    36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548,
8019    37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521,
8020    38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604,
8021    38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171,
8022    39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745},
8023    40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736,
8024    20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956,
8025    {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066,
8026    22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063},
8027    22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305,
8028    23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531,
8029    {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287,
8030    24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942,
8031    24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003,
8032    24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721,
8033    25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769,
8034    25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973,
8035    {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137,
8036    27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117,
8037    27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497,
8038    28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528,
8039    28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105,
8040    29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824,
8041    30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394,
8042    30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922,
8043    30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291,
8044    31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648,
8045    31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232,
8046    32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631,
8047    32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109,
8048    34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028,
8049    34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664,
8050    34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090},
8051    35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506,
8052    35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916,
8053    35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076},
8054    {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368,
8055    36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635,
8056    36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968,
8057    36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251,
8058    37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575,
8059    37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797,
8060    38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192,
8061    39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607,
8062    {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195,
8063    40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752,
8064    20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137,
8065    22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114,
8066    22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536,
8067    23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034,
8068    25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799,
8069    25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297,
8070    26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193,
8071    27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511,
8072    27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608,
8073    28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138,
8074    29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852,
8075    29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266,
8076    30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951,
8077    31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689,
8078    31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264,
8079    32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690,
8080    {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288,
8081    {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121,
8082    34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114,
8083    35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563,
8084    35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565,
8085    35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404,
8086    36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981,
8087    36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624,
8088    37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665,
8089    37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673,
8090    38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960,
8091    38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195,
8092    39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720,
8093    39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660,
8094    [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158,
8095    22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344,
8096    23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171,
8097    24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806,
8098    25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837,
8099    {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355,
8100    27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632,
8101    28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641,
8102    28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157,
8103    29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872,
8104    29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636,
8105    30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146,
8106    31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964,
8107    31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306,
8108    32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309,
8109    32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883,
8110    33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256,
8111    33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203,
8112    34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758,
8113    34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133,
8114    35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600,
8115    35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425,
8116    36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989,
8117    36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762,
8118    37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744,
8119    37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684,
8120    38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851,
8121    39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667,
8122    40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059,
8123    25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332,
8124    26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487,
8125    27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687,
8126    {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294,
8127    30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150,
8128    {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774,
8129    31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345,
8130    32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217,
8131    34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784,
8132    35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441,
8133    36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995,
8134    37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806,
8135    37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626,
8136    38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989,
8137    38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333,
8138    39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933,
8139    39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181,
8140    22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078,
8141    25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699,
8142    28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346,
8143    29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663,
8144    31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808,
8145    32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696,
8146    33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821,
8147    34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672,
8148    35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466,
8149    36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002},
8150    37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846,
8151    37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698,
8152    38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241,
8153    39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306,
8154    40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196,
8155    22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880,
8156    25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563,
8157    29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820,
8158    31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768,
8159    33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314,
8160    {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679,
8161    35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912,
8162    37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472,
8163    39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803,
8164    40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084,
8165    25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748,
8166    29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700,
8167    34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261,
8168    35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306,
8169    37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712},
8170    38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486,
8171    39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605,
8172    40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217,
8173    23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760,
8174    29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893,
8175    33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705,
8176    37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019,
8177    39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403,
8178    40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899,
8179    25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406,
8180    32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984,
8181    37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635},
8182    39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900,
8183    28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914,
8184    35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724,
8185    38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441},
8186    {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854,
8187    34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715,
8188    40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740,
8189    36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924,
8190    38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060,
8191    [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109,
8192    [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014,
8193    20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787,
8194    22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668],
8195    [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186,
8196    21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428,
8197    23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168,
8198    27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160],
8199    32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215,
8200    20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913,
8201    21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239,
8202    22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903,
8203    22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031,
8204    [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180,
8205    25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911,
8206    26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419,
8207    27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723},
8208    28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593],
8209    [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198],
8210    37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435,
8211    20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319,
8212    20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022,
8213    21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552,
8214    21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583,
8215    21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348,
8216    22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926,
8217    22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693,
8218    23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032,
8219    24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440,
8220    24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548,
8221    24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228,
8222    {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224,
8223    25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437,
8224    26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600,
8225    {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759,
8226    27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749,
8227    27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377,
8228    29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009,
8229    {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924,
8230    33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411},
8231    [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024,
8232    38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352,
8233    20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378,
8234    20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373,
8235    20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041,
8236    21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649,
8237    21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645,
8238    21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383,
8239    22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395,
8240    {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991,
8241    22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973,
8242    22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623,
8243    23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725,
8244    23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084,
8245    24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549,
8246    24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602,
8247    24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585,
8248    24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290,
8249    25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043,
8250    26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117,
8251    26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486,
8252    26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513,
8253    26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518,
8254    27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821,
8255    27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858,
8256    27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847,
8257    27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806,
8258    28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400,
8259    29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613,
8260    29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014,
8261    30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713,
8262    30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861,
8263    31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440,
8264    33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438,
8265    33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442,
8266    34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822,
8267    36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460,
8268    38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436,
8269    20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416,
8270    20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398,
8271    21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687,
8272    21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694,
8273    21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429,
8274    22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797,
8275    22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036,
8276    23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038,
8277    23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771,
8278    23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752,
8279    23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240,
8280    24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631,
8281    24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652,
8282    24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154},
8283    25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356,
8284    25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921,
8285    25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146,
8286    26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561,
8287    26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565,
8288    26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595,
8289    26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572,
8290    26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432,
8291    27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956,
8292    27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929,
8293    27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907,
8294    27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855,
8295    28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249,
8296    {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419,
8297    29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625,
8298    29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624,
8299    29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404,
8300    30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695},
8301    30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723,
8302    30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190,
8303    31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864},
8304    {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775,
8305    {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962,
8306    32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983,
8307    32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512,
8308    33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525,
8309    33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517,
8310    34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283,
8311    35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055,
8312    37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484,
8313    38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514,
8314    20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503,
8315    20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883,
8316    20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074,
8317    {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783,
8318    21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777,
8319    21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771,
8320    {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460,
8321    22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065,
8322    23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404,
8323    23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793,
8324    23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371,
8325    24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722,
8326    24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113,
8327    25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572,
8328    25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433,
8329    25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930,
8330    25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193,
8331    {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699,
8332    26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692,
8333    26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661,
8334    26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622,
8335    27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022,
8336    27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143,
8337    28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999,
8338    28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035,
8339    28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569,
8340    28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890,
8341    28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438,
8342    29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671,
8343    29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655},
8344    29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128,
8345    30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493,
8346    30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498,
8347    30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753,
8348    30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058,
8349    31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197,
8350    31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492,
8351    31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889,
8352    31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024,
8353    32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608,
8354    32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825,
8355    33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317,
8356    33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574,
8357    33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558,
8358    33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566,
8359    33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445,
8360    34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457,
8361    34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883},
8362    34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942,
8363    34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216,
8364    36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859,
8365    36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093,
8366    37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346,
8367    37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095,
8368    20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552,
8369    20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587,
8370    {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099,
8371    21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820,
8372    21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842,
8373    21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824,
8374    21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528,
8375    22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499,
8376    22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540,
8377    22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125,
8378    [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148,
8379    23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182,
8380    23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106,
8381    23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834,
8382    23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843,
8383    23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374,
8384    24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762,
8385    {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759,
8386    24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469,
8387    25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488,
8388    25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503,
8389    25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209,
8390    26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780,
8391    {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741,
8392    26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752,
8393    26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747,
8394    26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535,
8395    {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076,
8396    28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118,
8397    28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144,
8398    28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119,
8399    28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912,
8400    28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918,
8401    28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447,
8402    29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688,
8403    29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708,
8404    29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155},
8405    30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513},
8406    30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797,
8407    30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075,
8408    31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376,
8409    31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530,
8410    31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892,
8411    31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044,
8412    32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661,
8413    {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711,
8414    32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061,
8415    33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053,
8416    33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699,
8417    33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689,
8418    33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675,
8419    33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710,
8420    33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480,
8421    34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499,
8422    {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961,
8423    34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956,
8424    34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358,
8425    35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284,
8426    36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567,
8427    {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098,
8428    37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206,
8429    37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348,
8430    37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524,
8431    38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635,
8432    20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584,
8433    20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415,
8434    21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903,
8435    21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909,
8436    21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568,
8437    22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585,
8438    22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202,
8439    23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172,
8440    23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183,
8441    23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564,
8442    23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886,
8443    23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881,
8444    23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673],
8445    24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852,
8446    24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769,
8447    24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521,
8448    25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568,
8449    25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540,
8450    25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561,
8451    25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013},
8452    26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218,
8453    26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865,
8454    26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849,
8455    26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872,
8456    26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824,
8457    {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917,
8458    26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581,
8459    27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233,
8460    28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275,
8461    28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264,
8462    28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208,
8463    28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262,
8464    {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963,
8465    28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274,
8466    {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489,
8467    29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740,
8468    29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725,
8469    29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177,
8470    30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534},
8471    30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816,
8472    {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824,
8473    30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244,
8474    31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566,
8475    31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099,
8476    32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084,
8477    32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674,
8478    {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091,
8479    33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262,
8480    {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595,
8481    [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788,
8482    33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765,
8483    33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801,
8484    [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735,
8485    33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751,
8486    33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522,
8487    34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888,
8488    34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004,
8489    34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293,
8490    {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415},
8491    {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969,
8492    35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312,
8493    36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311,
8494    36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597,
8495    {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916,
8496    36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115,
8497    37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216,
8498    37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394,
8499    37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399,
8500    37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536},
8501    38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766,
8502    38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669,
8503    20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673,
8504    20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112,
8505    {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981,
8506    [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973,
8507    21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632,
8508    22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629,
8509    22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224,
8510    23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242,
8511    23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603,
8512    23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906,
8513    24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267,
8514    24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886,
8515    24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123,
8516    25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636,
8517    25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612,
8518    25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637,
8519    25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067,
8520    26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400,
8521    26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937,
8522    26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941,
8523    26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968,
8524    26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930,
8525    26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457,
8526    27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360,
8527    28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370,
8528    28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338,
8529    28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321,
8530    28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010,
8531    29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025,
8532    28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005,
8533    29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499,
8534    29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783,
8535    29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951,
8536    29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199,
8537    30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197,
8538    30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554,
8539    30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863,
8540    30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870,
8541    30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255,
8542    31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590,
8543    31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585,
8544    31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141,
8545    32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132,
8546    32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679,
8547    {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122,
8548    33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353,
8549    33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935,
8550    33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882,
8551    33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914,
8552    33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837,
8553    33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851,
8554    33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902,
8555    33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552,
8556    34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021},
8557    35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300,
8558    35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391,
8559    35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915,
8560    35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044,
8561    {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243},
8562    36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323,
8563    36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613,
8564    {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925,
8565    37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230},
8566    37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422,
8567    37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473,
8568    37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462,
8569    37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606,
8570    38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927,
8571    {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597,
8572    39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692,
8573    20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720,
8574    20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420,
8575    22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018,
8576    22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662,
8577    22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658,
8578    22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253,
8579    23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262,
8580    23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936,
8581    23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932,
8582    23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270,
8583    24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876,
8584    24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960,
8585    24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129,
8586    25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714},
8587    25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683,
8588    25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971,
8589    26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081,
8590    27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047,
8591    27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065,
8592    27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031,
8593    27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550},
8594    {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471,
8595    28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434,
8596    28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476,
8597    28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444,
8598    28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065,
8599    29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267,
8600    29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809,
8601    29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230,
8602    30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597,
8603    30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893,
8604    30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128,
8605    {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120,
8606    31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470,
8607    31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630,
8608    31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930,
8609    32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206,
8610    32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166,
8611    32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804,
8612    32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301,
8613    33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963,
8614    33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959,
8615    33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327],
8616    34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968,
8617    33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593,
8618    34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602,
8619    34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616,
8620    34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070,
8621    35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231,
8622    35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478,
8623    35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351,
8624    36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356,
8625    {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149,
8626    37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540,
8627    37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547,
8628    37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501,
8629    37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545,
8630    37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782,
8631    38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934,
8632    {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355,
8633    39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742},
8634    {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739,
8635    20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733,
8636    20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081,
8637    22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078,
8638    22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703,
8639    22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299,
8640    23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959,
8641    23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966,
8642    24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498,
8643    24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007,
8644    25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710,
8645    25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740,
8646    25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979,
8647    {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136,
8648    27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116,
8649    27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111,
8650    27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160,
8651    27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555,
8652    27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551,
8653    28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566,
8654    28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563,
8655    28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521,
8656    28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104,
8657    29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098,
8658    29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533,
8659    29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825,
8660    29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245,
8661    30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364},
8662    30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929,
8663    30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132,
8664    31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691,
8665    31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948,
8666    31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230,
8667    32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749,
8668    32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182,
8669    33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358,
8670    33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079,
8671    34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090,
8672    34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070,
8673    34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086,
8674    {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073,
8675    34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644,
8676    34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638,
8677    34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683,
8678    34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083,
8679    {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235,
8680    35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540},
8681    35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545,
8682    35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071,
8683    36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373,
8684    36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371,
8685    36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643,
8686    {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163,
8687    {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258,
8688    {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593,
8689    37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615,
8690    37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600,
8691    37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268,
8692    38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658,
8693    38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953,
8694    38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188,
8695    {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374,
8696    39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659,
8697    39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798,
8698    39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183,
8699    40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659,
8700    {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473,
8701    22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135,
8702    22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726,
8703    23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539],
8704    23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984,
8705    23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166,
8706    24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989,
8707    25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016,
8708    24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819,
8709    25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304,
8710    {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238,
8711    27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217,
8712    27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220,
8713    27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206,
8714    27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651,
8715    27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612,
8716    28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586,
8717    28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592,
8718    29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130,
8719    29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146},
8720    {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546,
8721    29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255,
8722    30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438,
8723    30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615,
8724    30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957,
8725    {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409,
8726    31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737,
8727    31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959,
8728    {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275,
8729    32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276,
8730    32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809,
8731    32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204,
8732    33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125,
8733    34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129,
8734    34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151,
8735    34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404,
8736    34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712,
8737    34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716,
8738    34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106,
8739    35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570,
8740    {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553,
8741    35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081,
8742    36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416,
8743    36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329],
8744    36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998,
8745    37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263,
8746    37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659,
8747    37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626,
8748    37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685,
8749    37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332,
8750    38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612,
8751    38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959,
8752    38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396,
8753    39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670,
8754    39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803,
8755    39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215,
8756    40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223,
8757    40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722,
8758    40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163,
8759    {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742,
8760    22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334,
8761    23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027,
8762    25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833,
8763    25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277,
8764    27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283,
8765    27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269,
8766    27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643,
8767    28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153,
8768    29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847,
8769    29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968},
8770    29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635,
8771    30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978,
8772    {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144,
8773    31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749,
8774    31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746,
8775    31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760,
8776    31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329,
8777    32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581,
8778    32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226,
8779    33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191,
8780    34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167,
8781    34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189,
8782    34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200,
8783    34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745,
8784    34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756,
8785    34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123,
8786    35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246,
8787    {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599,
8788    35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919,
8789    35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429,
8790    36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274,
8791    37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807,
8792    37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712},
8793    37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711,
8794    37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343,
8795    38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687,
8796    38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868,
8797    38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211},
8798    39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329,
8799    39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421},
8800    39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848,
8801    39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855,
8802    40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261,
8803    {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585,
8804    40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788,
8805    [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173,
8806    22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048,
8807    25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855,
8808    25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330},
8809    26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335,
8810    27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677,
8811    28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682,
8812    [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877,
8813    29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297,
8814    30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988,
8815    {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772,
8816    31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781,
8817    31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352,
8818    32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233},
8819    33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229,
8820    34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230,
8821    34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779,
8822    34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797,
8823    34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147,
8824    35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635,
8825    35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622,
8826    35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992,
8827    35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438,
8828    36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436,
8829    {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285,
8830    37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769,
8831    37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760,
8832    37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354},
8833    38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690,
8834    38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871,
8835    38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226,
8836    39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430,
8837    39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755,
8838    39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876,
8839    39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278,
8840    40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671,
8841    40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780,
8842    40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189,
8843    {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802,
8844    {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865,
8845    25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345,
8846    27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488,
8847    27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713,
8848    28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349},
8849    29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304,
8850    {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006,
8851    31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978,
8852    32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360,
8853    32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237,
8854    33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280,
8855    34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257,
8856    34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806},
8857    34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170,
8858    {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255,
8859    35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659,
8860    35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994,
8861    {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467,
8862    36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788,
8863    37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840,
8864    37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859,
8865    37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362},
8866    38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838,
8867    {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102,
8868    39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460,
8869    39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691,
8870    39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910,
8871    39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905,
8872    39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326,
8873    {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325,
8874    40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593,
8875    40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303,
8876    22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302},
8877    {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344,
8878    {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377,
8879    {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728,
8880    28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203},
8881    29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668,
8882    {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012,
8883    31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815,
8884    31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243,
8885    33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294,
8886    34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835,
8887    34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683,
8888    35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694},
8889    36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298},
8890    37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928,
8891    37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882,
8892    37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894,
8893    38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909},
8894    39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257,
8895    39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465,
8896    39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947,
8897    39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959,
8898    39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347,
8899    40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350,
8900    40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677,
8901    40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793,
8902    40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367,
8903    24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392,
8904    {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210,
8905    29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827,
8906    31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699,
8907    32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343,
8908    34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848,
8909    34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705,
8910    35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702,
8911    36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929,
8912    37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372,
8913    38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256,
8914    39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629,
8915    39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980,
8916    39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391,
8917    40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377},
8918    40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604,
8919    40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804,
8920    40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017,
8921    24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661,
8922    {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909,
8923    29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836,
8924    31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387,
8925    {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858,
8926    34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717,
8927    35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704,
8928    36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957,
8929    {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259,
8930    39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504,
8931    39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004,
8932    39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411,
8933    40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409,
8934    40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754,
8935    40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373,
8936    24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347,
8937    {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571,
8938    30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364,
8939    34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187,
8940    35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707,
8941    37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510,
8942    39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021,
8943    40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420,
8944    40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436,
8945    40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760,
8946    40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221,
8947    23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768,
8948    29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649,
8949    33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732},
8950    {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992},
8951    38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035,
8952    40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454,
8953    40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774,
8954    {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418,
8955    28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410,
8956    32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193},
8957    35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997,
8958    37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459,
8959    40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824,
8960    40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315,
8961    38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049,
8962    40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410,
8963    34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027},
8964    39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776,
8965    25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528,
8966    40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477,
8967    {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0,
8968    65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210],
8969    [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216],
8970    [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339],
8971    [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224],
8972    [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228],
8973    [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232],
8974    [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236],
8975    [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240],
8976    [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244],
8977    [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248],
8978    [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252],
8979    [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256],
8980    [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260],
8981    [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264],
8982    [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268],
8983    [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272],
8984    [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276],
8985    [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280],
8986    [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284],
8987    [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288],
8988    [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292],
8989    [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296],
8990    [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300],
8991    [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304],
8992    [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308],
8993    [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312],
8994    [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316],
8995    [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320],
8996    [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324],
8997    [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328],
8998    [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332],
8999    [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336],
9000    [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340],
9001    [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344],
9002    [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348],
9003    [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352],
9004    [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356],
9005    [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360],
9006    [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364],
9007    [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368],
9008    [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372],
9009    [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376],
9010    [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380],
9011    [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384],
9012    [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388],
9013    [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392],
9014    [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397],
9015    [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402],
9016    [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407],
9017    [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412],
9018    [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417],
9019    [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422],
9020    [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427],
9021    [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432],
9022    [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437],
9023    [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442],
9024    [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447],
9025    [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452],
9026    [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457],
9027    [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461],
9028    [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465],
9029    [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287],
9030    {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287],
9031    [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849,
9032    [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568,
9033    9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563,
9034    9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619,
9035    {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132],
9036    [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137],
9037    [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141],
9038    [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145],
9039    [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813],
9040    [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153],
9041    [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157],
9042    [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878],
9043    [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548],
9044    [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0,
9045    [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177],
9046    [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634],
9047    [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186],
9048    [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192],
9049    [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446],
9050    [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214,
9051    [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206],
9052    [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0,
9053    [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216],
9054    [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220],
9055    [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224],
9056    [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801],
9057    [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666],
9058    [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0,
9059    [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243],
9060    [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247],
9061    [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251],
9062    [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255],
9063    [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824],
9064    [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310],
9065    [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268],
9066    [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273],
9067    [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927],
9068    [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282],
9069    [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286],
9070    [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140],
9071    [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294],
9072    [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139],
9073    [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302],
9074    [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306],
9075    [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444],
9076    [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298],
9077    [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321],
9078    [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0,
9079    [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0,
9080    [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336],
9081    [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340],
9082    [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345],
9083    [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413],
9084    [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353],
9085    [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357],
9086    [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361],
9087    [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366],
9088    [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990],
9089    [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374],
9090    [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873],
9091    [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382],
9092    [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551],
9093    [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437],
9094    [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399],
9095    [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393],
9096    [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616],
9097    [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624],
9098    [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417],
9099    [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421],
9100    [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425],
9101    [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429],
9102    [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261],
9103    [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437],
9104    [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443],
9105    [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447],
9106    [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451],
9107    [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455],
9108    [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459],
9109    [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0,
9110    [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468],
9111    [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475],
9112    [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494],
9113    [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483],
9114    [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0,
9115    [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493],
9116    [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497],
9117    [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598],
9118    [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449],
9119    [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891],
9120    [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515],
9121    [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911],
9122    [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523],
9123    [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527],
9124    [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990],
9125    [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536],
9126    [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541,
9127    [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545],
9128    [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688],
9129    [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493],
9130    [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557],
9131    [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249],
9132    [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405],
9133    [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570],
9134    [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548],
9135    [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578],
9136    [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684],
9137    [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587],
9138    [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591],
9139    [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595],
9140    [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804],
9141    [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603],
9142    [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915],
9143    [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611],
9144    [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615],
9145    [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619],
9146    [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381],
9147    [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627],
9148    [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631],
9149    [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635],
9150    [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640],
9151    [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315],
9152    [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649],
9153    [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434],
9154    [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511],
9155    [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661],
9156    [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531],
9157    [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724],
9158    [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675],
9159    [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324],
9160    [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683],
9161    [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687],
9162    [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138],
9163    [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696],
9164    [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700],
9165    [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705],
9166    [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947],
9167    [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097],
9168    [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717],
9169    [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721],
9170    [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725],
9171    [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729],
9172    [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595],
9173    [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737],
9174    [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349],
9175    [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955],
9176    [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425],
9177    [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753],
9178    [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134],
9179    [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762],
9180    [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924],
9181    [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134],
9182    [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774],
9183    [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506],
9184    [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681],
9185    [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786],
9186    [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135],
9187    [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795],
9188    [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534],
9189    [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804],
9190    [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043],
9191    [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812],
9192    [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701],
9193    [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820],
9194    [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030],
9195    [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828],
9196    [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832],
9197    [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001],
9198    [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081],
9199    [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848],
9200    [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852],
9201    [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856],
9202    [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861],
9203    [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396],
9204    [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870],
9205    [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874],
9206    [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878],
9207    [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909],
9208    [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886],
9209    [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891],
9210    [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470],
9211    [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899],
9212    [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904],
9213    [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117],
9214    [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912],
9215    [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115],
9216    [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920],
9217    [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924],
9218    [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928],
9219    [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158],
9220    [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476],
9221    [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958],
9222    [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682],
9223    [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948],
9224    [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019],
9225    [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957],
9226    [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961],
9227    [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603],
9228    [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827],
9229    [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491],
9230    [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977],
9231    [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114],
9232    [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985],
9233    [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987],
9234    [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994],
9235    [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502],
9236    [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002],
9237    [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006],
9238    [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964],
9239    [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923],
9240    [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258],
9241    [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746],
9242    [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027],
9243    [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731],
9244    [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035],
9245    [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340],
9246    [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043],
9247    [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049],
9248    [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054],
9249    [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490],
9250    [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062],
9251    [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586],
9252    [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603],
9253    [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074],
9254    [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080],
9255    [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084],
9256    [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088],
9257    [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085],
9258    [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285],
9259    [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100],
9260    [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783],
9261    [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239],
9262    [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112],
9263    [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116],
9264    [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120],
9265    [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124],
9266    [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070],
9267    [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133],
9268    [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957],
9269    [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141],
9270    [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097],
9271    [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149],
9272    [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281],
9273    [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157],
9274    [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161],
9275    [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961],
9276    [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169],
9277    [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315],
9278    [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194],
9279    [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934],
9280    [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476],
9281    [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070],
9282    [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195],
9283    [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199],
9284    [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203],
9285    [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566],
9286    [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211],
9287    [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302],
9288    [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219],
9289    [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223],
9290    [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257],
9291    [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266],
9292    [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235],
9293    [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690],
9294    [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164],
9295    [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150],
9296    [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252],
9297    [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257],
9298    [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262],
9299    [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266],
9300    [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274],
9301    [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274],
9302    [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278],
9303    [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377],
9304    [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004],
9305    [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290],
9306    [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294],
9307    [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219],
9308    [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901],
9309    [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306],
9310    [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310],
9311    [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314],
9312    [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318],
9313    [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322],
9314    [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326],
9315    [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331],
9316    [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335],
9317    [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339],
9318    [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343],
9319    [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348],
9320    [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475],
9321    [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941],
9322    [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360],
9323    [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220],
9324    [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082],
9325    [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372],
9326    [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376],
9327    [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380],
9328    [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112],
9329    [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0,
9330    [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703],
9331    [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397],
9332    [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0,
9333    [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853],
9334    [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410],
9335    [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736],
9336    [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469],
9337    [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422],
9338    [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0,
9339    [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757],
9340    [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435],
9341    [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312],
9342    [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443],
9343    [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944],
9344    [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872],
9345    [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455],
9346    [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459],
9347    [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463],
9348    [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565],
9349    [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471],
9350    [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475],
9351    [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275],
9352    [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250],
9353    [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487],
9354    [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491],
9355    [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748],
9356    [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982],
9357    [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504],
9358    [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508],
9359    [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925],
9360    [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516],
9361    [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520],
9362    [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525],
9363    [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529],
9364    [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533],
9365    [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784],
9366    [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542],
9367    [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616],
9368    [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550],
9369    [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554],
9370    [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374],
9371    [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505],
9372    [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945],
9373    [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570],
9374    [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375],
9375    [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578],
9376    [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164],
9377    [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228],
9378    [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590],
9379    [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594],
9380    [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422],
9381    [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602],
9382    [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399],
9383    [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328],
9384    [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614],
9385    [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618],
9386    [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933],
9387    [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900],
9388    [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630],
9389    [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314],
9390    [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638],
9391    [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642],
9392    [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376],
9393    [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650],
9394    [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654],
9395    [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658],
9396    [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662],
9397    [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666],
9398    [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670],
9399    [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674],
9400    [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322],
9401    [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221],
9402    [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613],
9403    [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366],
9404    [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069],
9405    [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698],
9406    [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0,
9407    [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848],
9408    [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712],
9409    [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477],
9410    [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020],
9411    [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724],
9412    [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115],
9413    [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571],
9414    [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369],
9415    [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686],
9416    [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054],
9417    [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749],
9418    [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757],
9419    [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334],
9420    [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797],
9421    [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832],
9422    [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853],
9423    [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898],
9424    [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920],
9425    [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984],
9426    [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038],
9427    [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075],
9428    [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102],
9429    [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132],
9430    [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143],
9431    [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166],
9432    [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194],
9433    [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201],
9434    [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0,
9435    [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233],
9436    [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418],
9437    [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515],
9438    [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625],
9439    [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687],
9440    [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266],
9441    [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274],
9442    [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283],
9443    [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290],
9444    [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299],
9445    [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0,
9446    [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834],
9447    [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327],
9448    [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006],
9449    [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341],
9450    [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0,
9451    [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352],
9452    [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0,
9453    [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369],
9454    [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105],
9455    [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384],
9456    [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390],
9457    [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642],
9458    [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904],
9459    [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979],
9460    [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248],
9461    [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181],
9462    [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714],
9463    [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133],
9464    [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438],
9465    [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446],
9466    [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451],
9467    [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455],
9468    [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133],
9469    [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960],
9470    [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470],
9471    [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474],
9472    [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478],
9473    [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496],
9474    [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0,
9475    [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546],
9476    [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554],
9477    [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876],
9478    [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248],
9479    [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0,
9480    [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416],
9481    [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595],
9482    [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604],
9483    [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608],
9484    [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612],
9485    [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616],
9486    [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620],
9487    [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624],
9488    [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578],
9489    [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632],
9490    [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294],
9491    [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818],
9492    [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646],
9493    [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650],
9494    [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654],
9495    [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027],
9496    [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662],
9497    [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666],
9498    [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670],
9499    [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675],
9500    [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683],
9501    [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697],
9502    [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704],
9503    [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0,
9504    [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719],
9505    [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726],
9506    [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739,
9507    [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744],
9508    [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752],
9509    [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761],
9510    [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765],
9511    [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769],
9512    [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773],
9513    [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777],
9514    [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0,
9515    [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788],
9516    [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797],
9517    [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802],
9518    [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807],
9519    [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023],
9520    [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818],
9521    [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822],
9522    [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826],
9523    [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831],
9524    [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982,
9525    [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842],
9526    [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847],
9527    [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851],
9528    [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855],
9529    [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859],
9530    [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863],
9531    [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867],
9532    [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871],
9533    [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876],
9534    60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882],
9535    [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886],
9536    [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894],
9537    [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898],
9538    [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0,
9539    [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908],
9540    [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913],
9541    [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919],
9542    [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923],
9543    [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927],
9544    [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933],
9545    60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938],
9546    60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943],
9547    [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947],
9548    [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952],
9549    [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957],
9550    [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961],
9551    [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966],
9552    [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203],
9553    [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975,
9554    [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981,
9555    [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985],
9556    [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0,
9557    [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994],
9558    [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998],
9559    [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003],
9560    [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008],
9561    [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013],
9562    [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018],
9563    [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025],
9564    [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030,
9565    [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035],
9566    [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039],
9567    [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043],
9568    [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047],
9569    [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051],
9570    [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056],
9571    [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060],
9572    [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064],
9573    [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0,
9574    [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074],
9575    [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078],
9576    [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0,
9577    [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345],
9578    [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349],
9579    [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826],
9580    [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357],
9581    [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361],
9582    [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643],
9583    [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369],
9584    [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193],
9585    [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968],
9586    [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383],
9587    [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387],
9588    [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391],
9589    [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516],
9590    [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923],
9591    [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531],
9592    [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407],
9593    [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411],
9594    [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417],
9595    [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421],
9596    [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425],
9597    [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429],
9598    [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433],
9599    [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438],
9600    [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0,
9601    [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447],
9602    [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451],
9603    [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455],
9604    [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598],
9605    [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555],
9606    [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468],
9607    [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472],
9608    [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476],
9609    [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480],
9610    [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263],
9611    [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488],
9612    [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516],
9613    [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496],
9614    [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477],
9615    [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504],
9616    [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0,
9617    [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533],
9618    [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517],
9619    [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522],
9620    [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526],
9621    [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758],
9622    [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877],
9623    [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538],
9624    [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542],
9625    [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0,
9626    [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551],
9627    [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555],
9628    [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559],
9629    [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563],
9630    [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568],
9631    [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018],
9632    [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138],
9633    [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917],
9634    [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584],
9635    [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589],
9636    [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628],
9637    [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598],
9638    [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602],
9639    [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588],
9640    [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517],
9641    [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615],
9642    [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619],
9643    [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623],
9644    [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627],
9645    [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631],
9646    [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635],
9647    [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337],
9648    [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643],
9649    [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355],
9650    [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073],
9651    [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659],
9652    [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663],
9653    [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667],
9654    [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240],
9655    [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678],
9656    [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682],
9657    [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992],
9658    [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441],
9659    [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695],
9660    [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699],
9661    [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903],
9662    [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709],
9663    [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442],
9664    [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718],
9665    [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722],
9666    [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726],
9667    [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730],
9668    [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734],
9669    [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738],
9670    [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742],
9671    [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0,
9672    [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753],
9673    [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757],
9674    [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761],
9675    [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824],
9676    [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771,
9677    [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775],
9678    [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780],
9679    [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783],
9680    [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364],
9681    [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559],
9682    [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049],
9683    [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803],
9684    [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807],
9685    [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811],
9686    [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495],
9687    [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819],
9688    [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823],
9689    [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828],
9690    [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832],
9691    [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836],
9692    [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562],
9693    [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844],
9694    [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848],
9695    [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852],
9696    [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0,
9697    [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266],
9698    [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865],
9699    [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869],
9700    [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873],
9701    [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760],
9702    [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450],
9703    [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885],
9704    [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211],
9705    [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893],
9706    [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897],
9707    [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0,
9708    [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908],
9709    [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912],
9710    [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916],
9711    [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920],
9712    [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924],
9713    [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780],
9714    [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513],
9715    [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936],
9716    [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125],
9717    [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945],
9718    [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949],
9719    [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087],
9720    [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0,
9721    [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161],
9722    [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050],
9723    [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971],
9724    [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975],
9725    [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979],
9726    [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983],
9727    [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987],
9728    [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539],
9729    [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996],
9730    [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202],
9731    [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938],
9732    [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008],
9733    [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012],
9734    [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016],
9735    [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602],
9736    [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026],
9737    [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031],
9738    [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807],
9739    [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915],
9740    [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043],
9741    [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048],
9742    [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052],
9743    [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056],
9744    [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060],
9745    [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064],
9746    [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069],
9747    [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966],
9748    [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077],
9749    [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933],
9750    [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085],
9751    [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044],
9752    [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897],
9753    [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100],
9754    [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056],
9755    [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292],
9756    [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114],
9757    [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687],
9758    [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122],
9759    [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126],
9760    [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210],
9761    [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534],
9762    [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968],
9763    [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392],
9764    [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194],
9765    [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092],
9766    [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0,
9767    [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0,
9768    [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564],
9769    [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568],
9770    [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263],
9771    [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0,
9772    [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0,
9773    [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208],
9774    [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0,
9775    [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497],
9776    [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936],
9777    [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0,
9778    [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325],
9779    [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620],
9780    [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624],
9781    [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665],
9782    [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635],
9783    [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209],
9784    [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645],
9785    [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987],
9786    [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778],
9787    [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417],
9788    [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122],
9789    [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630],
9790    [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489],
9791    [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436],
9792    [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0,
9793    [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0,
9794    [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0,
9795    0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030],
9796    [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042],
9797    [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063],
9798    [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924],
9799    [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0,
9800    [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818],
9801    [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388],
9802    [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863],
9803    [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0,
9804    [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963],
9805    [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233],
9806    [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051],
9807    [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078],
9808    [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148],
9809    [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056],
9810    {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520],
9811    {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277],
9812    {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274],
9813    {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776},
9814    [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206],
9815    [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785],
9816    [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789],
9817    [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793],
9818    [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797],
9819    [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801],
9820    [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491],
9821    [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033],
9822    [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970],
9823    [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818],
9824    [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822],
9825    [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826],
9826    [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830],
9827    [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207],
9828    [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521],
9829    [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525],
9830    [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529],
9831    [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534],
9832    [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538],
9833    [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543],
9834    [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969],
9835    [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375],
9836    [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382],
9837    [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387],
9838    [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391],
9839    [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395],
9840    [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399],
9841    [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403],
9842    [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407],
9843    [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411],
9844    [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415],
9845    [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419],
9846    [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423],
9847    [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427],
9848    [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431],
9849    [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435],
9850    [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447],
9851    [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453],
9852    [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510],
9853    [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461],
9854    [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467],
9855    [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471],
9856    [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054],
9857    [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480],
9858    [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484],
9859    [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490],
9860    [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496],
9861    [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501],
9862    [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507],
9863    [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511],
9864    [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515],
9865    [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519],
9866    [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524],
9867    [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155],
9868    [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287],
9869    [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611],
9870    [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724],
9871    [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662],
9872    [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826],
9873    [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503],
9874    [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472],
9875    [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950],
9876    [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526],
9877    [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958],
9878    [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701],
9879    [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830],
9880    [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713],
9881    [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906],
9882    [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019],
9883    [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237],
9884    [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288],
9885    [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777],
9886    [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197],
9887    [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743],
9888    [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093],
9889    [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094],
9890    [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978],
9891    [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759],
9892    [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763],
9893    [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767],
9894    [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484],
9895    [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775],
9896    [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032],
9897    [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039],
9898    [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044],
9899    [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048],
9900    [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053],
9901    [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059],
9902    [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064],
9903    [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070],
9904    [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074],
9905    [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078],
9906    [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083],
9907    [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087],
9908    [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091],
9909    [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096],
9910    [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100],
9911    [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104],
9912    [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108],
9913    [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112],
9914    [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116],
9915    [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120],
9916    [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336],
9917    [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128],
9918    [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132],
9919    [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136],
9920    [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140],
9921    [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144],
9922    [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877],
9923    [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134],
9924    [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188],
9925    [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480],
9926    [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087],
9927    [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385],
9928    [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415],
9929    [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564],
9930    [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922],
9931    [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611],
9932    [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888],
9933    [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010],
9934    [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996],
9935    [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254],
9936    [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427],
9937    [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746],
9938    [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756],
9939    [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761],
9940    [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766],
9941    [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166],
9942    [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774],
9943    [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779],
9944    [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787],
9945    [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794],
9946    [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802],
9947    [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806],
9948    [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810],
9949    [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815],
9950    [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822],
9951    [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827],
9952    [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833],
9953    [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837],
9954    [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844],
9955    [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850],
9956    [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856],
9957    [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864],
9958    [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868],
9959    [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873],
9960    [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878],
9961    [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882],
9962    [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351],
9963    [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891],
9964    [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896],
9965    [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901],
9966    [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906],
9967    [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911],
9968    [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916],
9969    [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921],
9970    [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927],
9971    [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931],
9972    [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937],
9973    [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942],
9974    [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947],
9975    [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951],
9976    [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955],
9977    [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959],
9978    [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965],
9979    [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970],
9980    [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975],
9981    [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979],
9982    [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985],
9983    [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992],
9984    [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996],
9985    [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001],
9986    [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006],
9987    [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010],
9988    [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014],
9989    [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018],
9990    [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022],
9991    [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028],
9992    [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032],
9993    [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036],
9994    [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041],
9995    [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047],
9996    [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052],
9997    [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059],
9998    [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063],
9999    [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069],
10000    [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178],
10001    [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079],
10002    [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086],
10003    [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090],
10004    [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220],
10005    [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311],
10006    [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726],
10007    [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826],
10008    [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091],
10009    [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227],
10010    [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325],
10011    [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578],
10012    [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871],
10013    [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100],
10014    [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304],
10015    [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471],
10016    [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053],
10017    [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155],
10018    [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578],
10019    [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352],
10020    [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029],
10021    [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183],
10022    [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098],
10023    [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715],
10024    [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143],
10025    [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600],
10026    [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741],
10027    [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411],
10028    [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743],
10029    [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231],
10030    [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737],
10031    [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374],
10032    [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108],
10033    [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037],
10034    [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596],
10035    [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646],
10036    [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930],
10037    [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859],
10038    [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316],
10039    [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674],
10040    [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946],
10041    [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436],
10042    [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790],
10043    [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202],
10044    [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621],
10045    [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205],
10046    [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486],
10047    [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740],
10048    [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301],
10049    [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849],
10050    [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984],
10051    [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271],
10052    [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746],
10053    [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230],
10054    [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726],
10055    [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172],
10056    [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286],
10057    [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392],
10058    [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313],
10059    [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766],
10060    [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768],
10061    [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691],
10062    [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543],
10063    [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464],
10064    [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700],
10065    [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809],
10066    [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942],
10067    [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080],
10068    [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698],
10069    [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600],
10070    [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880],
10071    [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254],
10072    [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119],
10073    [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438],
10074    [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828],
10075    [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752],
10076    [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559],
10077    [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727],
10078    [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382],
10079    [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389],
10080    [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374],
10081    [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191],
10082    [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790],
10083    [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100],
10084    [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822],
10085    [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685],
10086    [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928],
10087    [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275],
10088    [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566],
10089    [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088],
10090    [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366],
10091    [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196],
10092    [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015],
10093    [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106],
10094    [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110],
10095    [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520],
10096    [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608],
10097    [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703],
10098    [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486],
10099    [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021],
10100    [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028],
10101    [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779],
10102    [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237],
10103    [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242],
10104    [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248],
10105    [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253],
10106    [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258],
10107    [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263],
10108    [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268],
10109    [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273],
10110    [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279],
10111    [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553],
10112    [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558],
10113    [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530],
10114    [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842,
10115    [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848],
10116    [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450],
10117    36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295],
10118    [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910,
10119    [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871],
10120    34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284,
10121    [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464,
10122    20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678],
10123    24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203,
10124    [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911],
10125    [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237],
10126    31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537,
10127    62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255],
10128    [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333,
10129    34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951],
10130    [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956},
10131    23446, 62959, 32347],
10132  'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168,
10133    12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216},
10134    {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310},
10135    {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746,
10136    8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801,
10137    8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757,
10138    8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504},
10139    8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632,
10140    9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352},
10141    {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544},
10142    {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353},
10143    {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
10144    {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081},
10145    {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284},
10146    {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075},
10147    {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225,
10148    462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363,
10149    250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609,
10150    {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467,
10151    25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861,
10152    29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018,
10153    26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658,
10154    22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494,
10155    [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365,
10156    38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133,
10157    25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256,
10158    25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758,
10159    27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502,
10160    32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453,
10161    25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329,
10162    21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953,
10163    34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454,
10164    36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887,
10165    34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949,
10166    24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534,
10167    36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631,
10168    24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626,
10169    28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851,
10170    30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187,
10171    25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850,
10172    39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493,
10173    31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572,
10174    36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813,
10175    24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133,
10176    26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554,
10177    21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815,
10178    25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130,
10179    20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607,
10180    32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046,
10181    26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507,
10182    24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561,
10183    27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576,
10184    20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507,
10185    30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360,
10186    23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411],
10187    23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167,
10188    32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148,
10189    38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788,
10190    25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383,
10191    24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149,
10192    26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576,
10193    30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425,
10194    32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751,
10195    20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929,
10196    28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514,
10197    25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574,
10198    [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453,
10199    36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086,
10200    27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826,
10201    33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548,
10202    21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783,
10203    30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932,
10204    31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532,
10205    24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856,
10206    38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583,
10207    30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300,
10208    29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025,
10209    39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891,
10210    25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238,
10211    [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602,
10212    29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230,
10213    28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817,
10214    38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462,
10215    36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333,
10216    21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077,
10217    24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780],
10218    [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144,
10219    21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070,
10220    30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820,
10221    33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938,
10222    25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750],
10223    21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153,
10224    33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881,
10225    22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792,
10226    38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964,
10227    20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133,
10228    27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343,
10229    29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104,
10230    36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428],
10231    [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648,
10232    22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178],
10233    [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954,
10234    36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464,
10235    31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295,
10236    21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106,
10237    [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508,
10238    32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775,
10239    [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467,
10240    [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807,
10241    33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629,
10242    20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592],
10243    [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916],
10244    21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448,
10245    20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809,
10246    [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394,
10247    36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053,
10248    36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704,
10249    39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039,
10250    38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421,
10251    26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741,
10252    22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917,
10253    33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977,
10254    38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657],
10255    30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720,
10256    21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399,
10257    29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774,
10258    33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252,
10259    20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010,
10260    21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707,
10261    36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462,
10262    24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822,
10263    29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674,
10264    34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229,
10265    20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746,
10266    27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785,
10267    38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215,
10268    31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521,
10269    21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762,
10270    21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015,
10271    25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490,
10272    35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551,
10273    22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551,
10274    31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546,
10275    38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604,
10276    30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099,
10277    37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073,
10278    39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743,
10279    30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898,
10280    30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605,
10281    38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478,
10282    21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342,
10283    31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571,
10284    31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511,
10285    20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020],
10286    [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827,
10287    38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834,
10288    33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117,
10289    35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742,
10290    31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590,
10291    [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087,
10292    [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141,
10293    23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298,
10294    25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844,
10295    21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899,
10296    25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740,
10297    38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888,
10298    21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570,
10299    21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130,
10300    28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933,
10301    39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838,
10302    32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511,
10303    25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239,
10304    24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393,
10305    24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103,
10306    20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304,
10307    24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420,
10308    22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182,
10309    34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597,
10310    35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070,
10311    26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226,
10312    28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769,
10313    22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792,
10314    29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324],
10315    40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782,
10316    21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813,
10317    [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830,
10318    38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860,
10319    32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238,
10320    20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518,
10321    20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454,
10322    29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161,
10323    21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940,
10324    28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827,
10325    39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657,
10326    31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699,
10327    28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383,
10328    40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108,
10329    24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649,
10330    32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402,
10331    28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814,
10332    32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064,
10333    33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434,
10334    39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033,
10335    30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426,
10336    33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611],
10337    [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040,
10338    29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209,
10339    27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804,
10340    33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753,
10341    31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588,
10342    23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517,
10343    [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937,
10344    34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126,
10345    34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169,
10346    33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819,
10347    28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982,
10348    27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446],
10349    30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435,
10350    27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376,
10351    33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958,
10352    38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346,
10353    34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479,
10354    23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592,
10355    29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445,
10356    33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262,
10357    34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572,
10358    34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750,
10359    25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928,
10360    30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243,
10361    21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060,
10362    36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921,
10363    28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447,
10364    30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860,
10365    33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687,
10366    20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629,
10367    25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179,
10368    20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748,
10369    36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970,
10370    22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450,
10371    26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827,
10372    22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569,
10373    36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668],
10374    36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190,
10375    38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065,
10376    38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424],
10377    27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207,
10378    38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772,
10379    32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054,
10380    20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777,
10381    38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773,
10382    39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714,
10383    22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537,
10384    28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275,
10385    27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820,
10386    30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123,
10387    20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469,
10388    24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748,
10389    20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993,
10390    33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580,
10391    [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741,
10392    [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070,
10393    33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977,
10394    21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234,
10395    29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049,
10396    27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441,
10397    [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203,
10398    21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978,
10399    23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569,
10400    21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198,
10401    25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280,
10402    [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978,
10403    32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499,
10404    30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287,
10405    35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102,
10406    20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351,
10407    23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623,
10408    20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181,
10409    20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797,
10410    25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463,
10411    30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298,
10412    28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626,
10413    34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463,
10414    25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684,
10415    34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841,
10416    [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805,
10417    26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515,
10418    32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824,
10419    24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013,
10420    33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487,
10421    35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635,
10422    30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001,
10423    26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427,
10424    22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488,
10425    27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393,
10426    22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899,
10427    25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776,
10428    31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486,
10429    33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150,
10430    30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884,
10431    20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635,
10432    [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522,
10433    36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572,
10434    20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108,
10435    24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836,
10436    36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648,
10437    [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581,
10438    35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464,
10439    39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964,
10440    23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609,
10441    39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451,
10442    23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448,
10443    26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829,
10444    26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996,
10445    20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890,
10446    39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442,
10447    [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705,
10448    29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779,
10449    24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436,
10450    26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310,
10451    20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735,
10452    35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560,
10453    38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796,
10454    29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219,
10455    21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283,
10456    38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523,
10457    25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335,
10458    38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146,
10459    39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262,
10460    [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819,
10461    21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813,
10462    38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195,
10463    [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123,
10464    27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856,
10465    20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218,
10466    33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449,
10467    34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026,
10468    [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016,
10469    21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152,
10470    31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464,
10471    35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167,
10472    32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873,
10473    30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634,
10474    [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033,
10475    27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493,
10476    21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597,
10477    21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005,
10478    30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839,
10479    22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746,
10480    38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495,
10481    31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687,
10482    20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671,
10483    23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768,
10484    26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994,
10485    21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558,
10486    38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202,
10487    33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050,
10488    [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673,
10489    20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589,
10490    24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764,
10491    32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035,
10492    21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521,
10493    27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631,
10494    36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323,
10495    33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704,
10496    24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001,
10497    37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491,
10498    20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402,
10499    27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189,
10500    28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431,
10501    35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935,
10502    21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507,
10503    35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945,
10504    21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828,
10505    33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053,
10506    23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248,
10507    38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776,
10508    26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874,
10509    26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531,
10510    26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131,
10511    25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166,
10512    21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643,
10513    20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651,
10514    27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360,
10515    26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467,
10516    24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260,
10517    38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903,
10518    21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825,
10519    27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390,
10520    26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529,
10521    24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151,
10522    37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930,
10523    33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540,
10524    20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535,
10525    25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234,
10526    31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405,
10527    24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247,
10528    [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090,
10529    21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482,
10530    35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065,
10531    20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880,
10532    31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776,
10533    36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894,
10534    38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331,
10535    26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672,
10536    36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371,
10537    [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447,
10538    32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199,
10539    [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386,
10540    22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590,
10541    20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317,
10542    19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162,
10543    [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664,
10544    22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720,
10545    20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405,
10546    21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294,
10547    21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043,
10548    {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121,
10549    21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200,
10550    20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263,
10551    20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274,
10552    20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394,
10553    20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444,
10554    20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525,
10555    20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558,
10556    20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716,
10557    20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430,
10558    [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804,
10559    [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128],
10560    20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819,
10561    32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898,
10562    20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767,
10563    {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798,
10564    {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822,
10565    35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847,
10566    35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864,
10567    35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886},
10568    {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434,
10569    38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503,
10570    38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021,
10571    37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071,
10572    37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079,
10573    37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167,
10574    37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759,
10575    21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981],
10576    20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441,
10577    22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329,
10578    {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396,
10579    22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479,
10580    22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456,
10581    22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528,
10582    22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656,
10583    39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412,
10584    33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482,
10585    33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441,
10586    33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551,
10587    33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562,
10588    33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627},
10589    33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607,
10590    33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637,
10591    33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656,
10592    {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705,
10593    33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793,
10594    33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848,
10595    33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733,
10596    33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907,
10597    {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932,
10598    33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994,
10599    33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060,
10600    29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044,
10601    34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171,
10602    34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231,
10603    34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364,
10604    [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263,
10605    [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290,
10606    25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590,
10607    25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532,
10608    25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534,
10609    25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732,
10610    25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815,
10611    25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337,
10612    21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579,
10613    {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634,
10614    21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661,
10615    21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618,
10616    21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724,
10617    {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757,
10618    21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903,
10619    21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846,
10620    {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945,
10621    21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949},
10622    21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972,
10623    21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964},
10624    21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051,
10625    22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114,
10626    22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139},
10627    22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251,
10628    22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081,
10629    24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692,
10630    23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708,
10631    23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748,
10632    23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844,
10633    23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919,
10634    23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955,
10635    23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469,
10636    24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357,
10637    29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416,
10638    29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434},
10639    29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477,
10640    29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566,
10641    [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267,
10642    {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309,
10643    {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229,
10644    24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296,
10645    24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545,
10646    24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614,
10647    24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696},
10648    24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707,
10649    24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794,
10650    24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906,
10651    24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377,
10652    38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403},
10653    38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421},
10654    {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722,
10655    27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782,
10656    27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872,
10657    27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943,
10658    27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950,
10659    27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064,
10660    27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101,
10661    28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075,
10662    28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294,
10663    {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461,
10664    28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303,
10665    28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470,
10666    28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530,
10667    28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654,
10668    28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766,
10669    [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652,
10670    23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837,
10671    36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902,
10672    36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932,
10673    {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989,
10674    36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611,
10675    21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365,
10676    33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953},
10677    22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999,
10678    22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049,
10679    23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100,
10680    23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218,
10681    23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260,
10682    23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397,
10683    23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549,
10684    {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574,
10685    39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591,
10686    32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446,
10687    {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475,
10688    {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525,
10689    32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519},
10690    {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539,
10691    32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565,
10692    [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614,
10693    29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640,
10694    29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711,
10695    29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722,
10696    29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838,
10697    {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863,
10698    29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533,
10699    26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507,
10700    26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585,
10701    26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561,
10702    26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724,
10703    26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697,
10704    26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876,
10705    {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896,
10706    26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000,
10707    26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035,
10708    27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029,
10709    27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204,
10710    27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224,
10711    27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521},
10712    27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562,
10713    36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727,
10714    {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747,
10715    {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122,
10716    25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969,
10717    29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133,
10718    26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207,
10719    26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279,
10720    26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150,
10721    36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173,
10722    36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343,
10723    29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330,
10724    25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637,
10725    27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689,
10726    27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232,
10727    34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939,
10728    32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973,
10729    32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010,
10730    33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096,
10731    33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129,
10732    {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373,
10733    33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447,
10734    27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129},
10735    [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054,
10736    26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829,
10737    28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950,
10738    28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050,
10739    29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213,
10740    29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160},
10741    31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063,
10742    31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529,
10743    24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838,
10744    24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895],
10745    27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737,
10746    26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757,
10747    30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791,
10748    30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898,
10749    30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995,
10750    31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468,
10751    30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517,
10752    30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591,
10753    30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653,
10754    30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600,
10755    32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413,
10756    30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028},
10757    {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051},
10758    38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068,
10759    {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088},
10760    {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110},
10761    38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123,
10762    {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143,
10763    38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157},
10764    {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186},
10765    38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204,
10766    {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220,
10767    {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235,
10768    {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255,
10769    {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211,
10770    31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655,
10771    39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996,
10772    40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503,
10773    {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518},
10774    {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542,
10775    40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102,
10776    30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128,
10777    30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183,
10778    30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218,
10779    30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253,
10780    30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300,
10781    30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368,
10782    31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930,
10783    34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022,
10784    35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097,
10785    35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195,
10786    [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790,
10787    32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821,
10788    32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043,
10789    39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070},
10790    {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414,
10791    34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471,
10792    34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490,
10793    34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547,
10794    34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552,
10795    34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586,
10796    34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594,
10797    {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659,
10798    34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696,
10799    34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763,
10800    34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838,
10801    34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578,
10802    {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509,
10803    31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520,
10804    31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564,
10805    31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654},
10806    31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668,
10807    31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742,
10808    31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808,
10809    33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325,
10810    33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353,
10811    33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039,
10812    35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889,
10813    31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943,
10814    {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703,
10815    32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992],
10816    32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244,
10817    36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198},
10818    37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236,
10819    37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290,
10820    {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331,
10821    36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310},
10822    36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343},
10823    36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396,
10824    36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425,
10825    {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463,
10826    36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970,
10827    35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301,
10828    35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657,
10829    38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835,
10830    {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585],
10831    {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694,
10832    37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267,
10833    40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090},
10834    {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109},
10835    {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138},
10836    {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780,
10837    38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601,
10838    39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618,
10839    {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761,
10840    39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663,
10841    39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715,
10842    {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846,
10843    40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677,
10844    40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772,
10845    12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631,
10846    25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165,
10847    23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970,
10848    32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722,
10849    36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173,
10850    25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922,
10851    24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652,
10852    35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369,
10853    39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396,
10854    [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425,
10855    36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490,
10856    31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659,
10857    30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880,
10858    24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934,
10859    37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153,
10860    27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958,
10861    32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336,
10862    38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346,
10863    29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136,
10864    38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818,
10865    29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684,
10866    36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027,
10867    22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219,
10868    39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489,
10869    36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123,
10870    23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499,
10871    20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865,
10872    39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512,
10873    [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707,
10874    22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703,
10875    40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441,
10876    25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036,
10877    31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554,
10878    36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221,
10879    26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352,
10880    38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381,
10881    27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572,
10882    25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068,
10883    [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559,
10884    28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308,
10885    25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542,
10886    31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180,
10887    30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169,
10888    31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273,
10889    32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982,
10890    27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744,
10891    23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346,
10892    34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348,
10893    34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736,
10894    21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023,
10895    39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486,
10896    32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832,
10897    25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904,
10898    29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936,
10899    39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580,
10900    27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796,
10901    28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311,
10902    24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650,
10903    20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854,
10904    39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393,
10905    21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415,
10906    35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683,
10907    22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313,
10908    40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126,
10909    24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886,
10910    22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016,
10911    33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442,
10912    30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315,
10913    24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229,
10914    [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467,
10915    36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958,
10916    22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434,
10917    27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898,
10918    31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306,
10919    30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054,
10920    32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632,
10921    21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493,
10922    36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086,
10923    35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854,
10924    24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218,
10925    36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360,
10926    36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918,
10927    35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359,
10928    35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403,
10929    25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010,
10930    30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295,
10931    35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307,
10932    32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213,
10933    39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178,
10934    [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702,
10935    32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198,
10936    31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209,
10937    35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676,
10938    23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289,
10939    39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129,
10940    35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406,
10941    33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137,
10942    38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416,
10943    21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232,
10944    21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421,
10945    30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178,
10946    27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291,
10947    37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427,
10948    35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387,
10949    23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111,
10950    31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438,
10951    29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486,
10952    39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729,
10953    22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142,
10954    38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106,
10955    36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042,
10956    36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028,
10957    36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081,
10958    36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806,
10959    38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025,
10960    25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886,
10961    35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225,
10962    36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674,
10963    35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310,
10964    28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013,
10965    21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132,
10966    21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712,
10967    20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131,
10968    33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382,
10969    35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445,
10970    35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535,
10971    35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585,
10972    35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606,
10973    35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734,
10974    38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233,
10975    24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610,
10976    22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338,
10977    34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366,
10978    34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133,
10979    40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167,
10980    34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759,
10981    25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072,
10982    22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118,
10983    22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195,
10984    22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151,
10985    23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937,
10986    24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136,
10987    39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195,
10988    39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082,
10989    25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887,
10990    24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284,
10991    38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333,
10992    38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711,
10993    28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150,
10994    28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703,
10995    28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285,
10996    23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338,
10997    23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498,
10998    39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470,
10999    39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002,
11000    {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272,
11001    32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190,
11002    32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199,
11003    32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225,
11004    32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309,
11005    32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367,
11006    32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908,
11007    29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783,
11008    27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194,
11009    27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384,
11010    27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567,
11011    36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706,
11012    36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636,
11013    36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326,
11014    36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058,
11015    36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247,
11016    35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051,
11017    33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112,
11018    36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152,
11019    31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824,
11020    30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558,
11021    30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351,
11022    37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377,
11023    37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437,
11024    37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453,
11025    37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891,
11026    37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523,
11027    37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906,
11028    37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622,
11029    {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696,
11030    37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703,
11031    37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767,
11032    37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858,
11033    {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879,
11034    37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951,
11035    37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327,
11036    40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275,
11037    40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329,
11038    40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410,
11039    40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311,
11040    30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313,
11041    30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392,
11042    32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481,
11043    38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024,
11044    34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760,
11045    34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691,
11046    31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677,
11047    31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489,
11048    36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451,
11049    36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799,
11050    40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703,
11051    40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056,
11052    31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851,
11053    39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882,
11054    39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906,
11055    39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945,
11056    39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008,
11057    39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857,
11058    40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695,
11059    40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725,
11060    22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339,
11061    39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637,
11062    [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890,
11063    38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590,
11064    31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634,
11065    38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211,
11066    8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786,
11067    {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619},
11068    {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317},
11069    {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252,
11070    13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208,
11071    12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445},
11072    {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128},
11073    12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991,
11074    {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019,
11075    20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053,
11076    20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071},
11077    {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095},
11078    {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118},
11079    20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148,
11080    {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178,
11081    {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205},
11082    20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226},
11083    {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259,
11084    {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281,
11085    20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308,
11086    20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333},
11087    {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357,
11088    20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373,
11089    {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395,
11090    20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416},
11091    {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450,
11092    {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468},
11093    20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490,
11094    20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512,
11095    {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543},
11096    {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560},
11097    {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582},
11098    {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609},
11099    {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631,
11100    {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662,
11101    {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675},
11102    {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690},
11103    {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713},
11104    {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737,
11105    20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758},
11106    {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779},
11107    {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810,
11108    20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829},
11109    {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858,
11110    {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874},
11111    {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897,
11112    20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920},
11113    {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944,
11114    {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962},
11115    {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990,
11116    {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007},
11117    {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025},
11118    {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044},
11119    21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070},
11120    {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087},
11121    {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107,
11122    {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134},
11123    21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166},
11124    {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194,
11125    {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212,
11126    {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234},
11127    {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255,
11128    {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275},
11129    {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287},
11130    {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304],
11131    {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328,
11132    {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356},
11133    21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379,
11134    {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398},
11135    {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418},
11136    {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440,
11137    {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466,
11138    {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506,
11139    21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538,
11140    {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565,
11141    21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580},
11142    21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609},
11143    21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637,
11144    {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660,
11145    {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685},
11146    {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720,
11147    21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743},
11148    {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768,
11149    {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788},
11150    21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810,
11151    {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829,
11152    {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844,
11153    {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858},
11154    {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887,
11155    {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906},
11156    {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920},
11157    {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944,
11158    21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967},
11159    21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991,
11160    {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015,
11161    {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037,
11162    {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056,
11163    {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080,
11164    {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106},
11165    {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131,
11166    22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152},
11167    22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170},
11168    {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197,
11169    {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214},
11170    22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229},
11171    {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254},
11172    {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272},
11173    22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297},
11174    {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315,
11175    {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337,
11176    {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354},
11177    {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382,
11178    {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397},
11179    {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428},
11180    22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453},
11181    {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480},
11182    22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498},
11183    {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517},
11184    {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531},
11185    {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546},
11186    {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562},
11187    {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582},
11188    {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617},
11189    {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637},
11190    {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662},
11191    {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688},
11192    {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717,
11193    {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740,
11194    {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762,
11195    22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775},
11196    {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789},
11197    {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798,
11198    {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813},
11199    {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834},
11200    {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853},
11201    22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875},
11202    22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895},
11203    22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921,
11204    {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936,
11205    {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956},
11206    {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972},
11207    {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997},
11208    23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017},
11209    {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050},
11210    {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065},
11211    {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078},
11212    {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101},
11213    {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126},
11214    {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147},
11215    {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168},
11216    {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211},
11217    23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231},
11218    {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253,
11219    {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268},
11220    {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282},
11221    {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306,
11222    {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330},
11223    {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353},
11224    {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392},
11225    {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417,
11226    {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437},
11227    {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468},
11228    {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491,
11229    {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523,
11230    23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552,
11231    {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577,
11232    23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597},
11233    {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622},
11234    {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642},
11235    23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666},
11236    {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689},
11237    {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709},
11238    {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734,
11239    {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749},
11240    {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778},
11241    23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797,
11242    {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812},
11243    {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832},
11244    {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850},
11245    {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880},
11246    {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900,
11247    {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920},
11248    {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960,
11249    {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976},
11250    23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014},
11251    24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042,
11252    {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063},
11253    24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087,
11254    {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114,
11255    {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129,
11256    {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153},
11257    {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183,
11258    {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216,
11259    24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238},
11260    24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267},
11261    {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292},
11262    24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315},
11263    {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342,
11264    {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360,
11265    {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379,
11266    {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399,
11267    24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421,
11268    {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440,
11269    24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467},
11270    24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491},
11271    {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510},
11272    {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531},
11273    {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549},
11274    {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562},
11275    {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583},
11276    {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602,
11277    {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624},
11278    {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652,
11279    {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662},
11280    {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686,
11281    {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704},
11282    {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725,
11283    {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743,
11284    {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761},
11285    {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786},
11286    {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821,
11287    {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839,
11288    {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861},
11289    {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876},
11290    {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909,
11291    {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921,
11292    {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937,
11293    {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952},
11294    {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981},
11295    {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005,
11296    {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023},
11297    {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045},
11298    {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065},
11299    {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107,
11300    25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131,
11301    25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154,
11302    {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173},
11303    {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192,
11304    {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210},
11305    25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241,
11306    {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257},
11307    {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278,
11308    {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309},
11309    {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333,
11310    {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354},
11311    {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372,
11312    {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392},
11313    {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412,
11314    {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440,
11315    {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459},
11316    {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485,
11317    25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510,
11318    25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533,
11319    25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553,
11320    {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570,
11321    {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591,
11322    {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614,
11323    {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631,
11324    {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653,
11325    {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673,
11326    {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693,
11327    {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712},
11328    {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737},
11329    25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760},
11330    {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795,
11331    25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813},
11332    25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831},
11333    {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855,
11334    {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866},
11335    {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886},
11336    {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916},
11337    {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933},
11338    25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951},
11339    {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974,
11340    {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997},
11341    26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016,
11342    {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040,
11343    {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061,
11344    {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081,
11345    {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104},
11346    {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125,
11347    {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142,
11348    {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162},
11349    {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180},
11350    {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203},
11351    26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217},
11352    {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235},
11353    {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250},
11354    {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270},
11355    {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287},
11356    {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312,
11357    {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334},
11358    {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349},
11359    26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369},
11360    {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390,
11361    {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416,
11362    {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430},
11363    26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450,
11364    {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466},
11365    {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488},
11366    26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506,
11367    {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527},
11368    26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548,
11369    {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591,
11370    26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602},
11371    {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630,
11372    26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654},
11373    {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682},
11374    26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730,
11375    {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759},
11376    {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782,
11377    {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798,
11378    {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826,
11379    26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843},
11380    {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863,
11381    {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877},
11382    {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899},
11383    {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929},
11384    {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944},
11385    {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968},
11386    {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983,
11387    {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998,
11388    {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018},
11389    {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037},
11390    27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061},
11391    {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087,
11392    {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105},
11393    {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136,
11394    {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156},
11395    {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179},
11396    27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195},
11397    {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212},
11398    {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235},
11399    {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261},
11400    {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279,
11401    {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293},
11402    27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312},
11403    {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332},
11404    {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373},
11405    {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397},
11406    {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415},
11407    27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448,
11408    {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464,
11409    {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482},
11410    27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514,
11411    {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540},
11412    27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554},
11413    {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574,
11414    {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587},
11415    {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610,
11416    {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632},
11417    27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648},
11418    {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685,
11419    27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710},
11420    {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734,
11421    {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755},
11422    27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775},
11423    27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793},
11424    {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820,
11425    {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840},
11426    {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857},
11427    {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881,
11428    {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906},
11429    {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919},
11430    {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942,
11431    {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956,
11432    {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980,
11433    27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001},
11434    {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016},
11435    {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035},
11436    28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054},
11437    28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083},
11438    {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104},
11439    {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127,
11440    {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146,
11441    28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175,
11442    {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187},
11443    {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208},
11444    28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223},
11445    {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249},
11446    {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272},
11447    {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298},
11448    {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320},
11449    {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339,
11450    28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358,
11451    {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376},
11452    {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397},
11453    {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416,
11454    {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432},
11455    {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464,
11456    {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482},
11457    {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498},
11458    {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517,
11459    {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539,
11460    {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554},
11461    {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578},
11462    {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594,
11463    {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612},
11464    {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633},
11465    {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652},
11466    {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682,
11467    {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700,
11468    28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721,
11469    {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735},
11470    {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754},
11471    {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773},
11472    {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797,
11473    {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815},
11474    28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850,
11475    {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873,
11476    {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892},
11477    {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917},
11478    28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939},
11479    {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962},
11480    {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998},
11481    29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023},
11482    29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044},
11483    29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061},
11484    {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077},
11485    {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101},
11486    29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122,
11487    {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139,
11488    {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153},
11489    {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178},
11490    29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198},
11491    {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227,
11492    {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248},
11493    {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276,
11494    29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296},
11495    {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314},
11496    {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331},
11497    {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352},
11498    29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381},
11499    {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402},
11500    29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429},
11501    {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451},
11502    {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471},
11503    {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487},
11504    {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506},
11505    {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523},
11506    {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555},
11507    29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576,
11508    29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586},
11509    {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603},
11510    29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624},
11511    {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646,
11512    {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672,
11513    {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695},
11514    29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713},
11515    {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743,
11516    {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760,
11517    {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792},
11518    {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809},
11519    {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834,
11520    {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855},
11521    {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883},
11522    {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907,
11523    {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927},
11524    {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952},
11525    {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979,
11526    {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998,
11527    30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017},
11528    {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032},
11529    {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055},
11530    {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080},
11531    {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101,
11532    30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125,
11533    {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150,
11534    {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172},
11535    {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194},
11536    {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212,
11537    {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234,
11538    {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257},
11539    {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280,
11540    {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301,
11541    {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326],
11542    30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345},
11543    {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356},
11544    {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383},
11545    30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400},
11546    {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421,
11547    {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440},
11548    30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463},
11549    {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478},
11550    {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510,
11551    {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532},
11552    {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559},
11553    30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586},
11554    {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611},
11555    {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635,
11556    {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654,
11557    {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680},
11558    {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704},
11559    {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723},
11560    {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750,
11561    {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766},
11562    {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788,
11563    30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803},
11564    {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825,
11565    {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856,
11566    {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873,
11567    {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890},
11568    {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911},
11569    {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929},
11570    {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953},
11571    {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965},
11572    {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978},
11573    {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002},
11574    {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021},
11575    {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047,
11576    {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073,
11577    {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097,
11578    {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115},
11579    {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147},
11580    31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170,
11581    {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182},
11582    {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200},
11583    31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225},
11584    31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244,
11585    {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259},
11586    31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282,
11587    {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303},
11588    {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331},
11589    31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362,
11590    31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379},
11591    {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407},
11592    {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424},
11593    31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450},
11594    {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470,
11595    {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486,
11596    {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504,
11597    {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519,
11598    {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538,
11599    {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562,
11600    {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582},
11601    31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599},
11602    {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615,
11603    {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630},
11604    {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646},
11605    {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669},
11606    {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693},
11607    31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710},
11608    {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727},
11609    31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745},
11610    {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778,
11611    {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801},
11612    31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837},
11613    {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855},
11614    {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891},
11615    31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910},
11616    {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930},
11617    {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950},
11618    31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987,
11619    31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012,
11620    {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029},
11621    {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052},
11622    32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079,
11623    {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103,
11624    {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120,
11625    {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138},
11626    {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159},
11627    {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188,
11628    {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204},
11629    32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228},
11630    32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245,
11631    {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268},
11632    {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292},
11633    {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316,
11634    {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339,
11635    {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355},
11636    32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378},
11637    {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400},
11638    32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436,
11639    {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567,
11640    32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591,
11641    {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611},
11642    {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634},
11643    {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653,
11644    {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672,
11645    {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691},
11646    {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715,
11647    32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729},
11648    {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754,
11649    {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775},
11650    {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801,
11651    {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820,
11652    {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836},
11653    {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857,
11654    {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888,
11655    {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909},
11656    {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940,
11657    32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965,
11658    {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991},
11659    {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019,
11660    {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035},
11661    33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069},
11662    33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095,
11663    33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115},
11664    {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138},
11665    {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168,
11666    {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185},
11667    {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212,
11668    {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241,
11669    {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259,
11670    {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291,
11671    {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312,
11672    {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340},
11673    {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356},
11674    {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383,
11675    {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400],
11676    {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420,
11677    33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442},
11678    33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471},
11679    {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497},
11680    33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522},
11681    {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549,
11682    33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565},
11683    {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597},
11684    {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619,
11685    {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657},
11686    {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679},
11687    {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697,
11688    {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726},
11689    {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741},
11690    {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762},
11691    {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786},
11692    {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810},
11693    {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837},
11694    {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854},
11695    {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880,
11696    {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904,
11697    33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933,
11698    {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946},
11699    {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971,
11700    {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996,
11701    {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014,
11702    {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046,
11703    {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069},
11704    {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084},
11705    {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114,
11706    {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135,
11707    {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149},
11708    {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168,
11709    {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189},
11710    34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205},
11711    {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232,
11712    {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257},
11713    34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278},
11714    {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300},
11715    {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322},
11716    {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339},
11717    34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365},
11718    {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397,
11719    {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413,
11720    {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446},
11721    34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475,
11722    {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491},
11723    {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514},
11724    {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528},
11725    {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549},
11726    {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571},
11727    {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591},
11728    34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607},
11729    {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620},
11730    {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646,
11731    34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671,
11732    {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687},
11733    {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702},
11734    {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723},
11735    {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748,
11736    {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764},
11737    {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785},
11738    34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803},
11739    {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820,
11740    {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839},
11741    {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867},
11742    {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881},
11743    {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906,
11744    34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929,
11745    {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950},
11746    {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963},
11747    {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988,
11748    {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005},
11749    {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024},
11750    35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040},
11751    {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061},
11752    {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080},
11753    {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100},
11754    {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127,
11755    {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141},
11756    {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173,
11757    {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184},
11758    {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202,
11759    {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216},
11760    {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234},
11761    {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248},
11762    {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277,
11763    {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300,
11764    {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319,
11765    {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343,
11766    {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358,
11767    {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371},
11768    {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383},
11769    {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399,
11770    {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417},
11771    {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431},
11772    35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453},
11773    {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476,
11774    {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495,
11775    {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507},
11776    {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520},
11777    35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536,
11778    {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557,
11779    {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577,
11780    35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595},
11781    35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614},
11782    {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630},
11783    {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658},
11784    {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687},
11785    {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704},
11786    {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727},
11787    35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792,
11788    35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914},
11789    {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931},
11790    {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963},
11791    {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981},
11792    {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003},
11793    {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041,
11794    {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069,
11795    {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095},
11796    {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119},
11797    36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204,
11798    {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226},
11799    {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246},
11800    {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265},
11801    {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293,
11802    {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316,
11803    {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333},
11804    {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358},
11805    36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373},
11806    {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402},
11807    {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419,
11808    {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438},
11809    {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458},
11810    36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477},
11811    36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501},
11812    36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519},
11813    {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539},
11814    {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565},
11815    {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588},
11816    {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616,
11817    {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640},
11818    {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660},
11819    {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675,
11820    {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693},
11821    36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768},
11822    {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789],
11823    {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806,
11824    {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832},
11825    36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853},
11826    {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883,
11827    36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912},
11828    {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931,
11829    {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957,
11830    36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975},
11831    36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001,
11832    {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020,
11833    {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042,
11834    37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062,
11835    {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076},
11836    {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100,
11837    37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113},
11838    {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139,
11839    37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151},
11840    {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175},
11841    {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203},
11842    {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222},
11843    37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256,
11844    37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271},
11845    {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302},
11846    {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334,
11847    {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352,
11848    {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378},
11849    {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394},
11850    {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423,
11851    {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441},
11852    {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458},
11853    37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471},
11854    {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493},
11855    37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510},
11856    {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531,
11857    {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551},
11858    {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574,
11859    {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587},
11860    37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618},
11861    37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634},
11862    {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654},
11863    {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673},
11864    {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687,
11865    {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708,
11866    {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724},
11867    {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745},
11868    {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763,
11869    {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776},
11870    37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807,
11871    {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817},
11872    {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838},
11873    {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861},
11874    {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892},
11875    {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914},
11876    {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935},
11877    37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952},
11878    {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973},
11879    {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001,
11880    {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038,
11881    38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176,
11882    38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254,
11883    {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276},
11884    {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293},
11885    {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318},
11886    {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336},
11887    {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353},
11888    {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371},
11889    {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432,
11890    {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455},
11891    38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481},
11892    {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501},
11893    38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535,
11894    38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569,
11895    {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594},
11896    38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611},
11897    {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628},
11898    {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650,
11899    {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666},
11900    {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685,
11901    {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702},
11902    38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723,
11903    {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740},
11904    {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755},
11905    {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775},
11906    {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803,
11907    {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820},
11908    {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837},
11909    {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858,
11910    {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877,
11911    {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912,
11912    38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937},
11913    {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951},
11914    {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972,
11915    {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997},
11916    39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014,
11917    {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061,
11918    39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092},
11919    {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113},
11920    {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137,
11921    {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157},
11922    {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182},
11923    {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199},
11924    {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220},
11925    {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238},
11926    {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263},
11927    39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298},
11928    39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337},
11929    {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379,
11930    {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395},
11931    {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426},
11932    {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450},
11933    39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494},
11934    {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512},
11935    {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538,
11936    39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590,
11937    {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613},
11938    {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639,
11939    {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660,
11940    {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687,
11941    {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700},
11942    {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722},
11943    39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760,
11944    {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771},
11945    {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810,
11946    {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835},
11947    {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880,
11948    {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907,
11949    {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921},
11950    {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946},
11951    {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972,
11952    {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992,
11953    39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006},
11954    {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032},
11955    {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064,
11956    {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086},
11957    40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136},
11958    {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163},
11959    {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181,
11960    {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220,
11961    40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233},
11962    {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259},
11963    {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299,
11964    {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328,
11965    {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347},
11966    {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373},
11967    {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408,
11968    {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436},
11969    {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487,
11970    40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528,
11971    {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549,
11972    {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576},
11973    {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596},
11974    {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615},
11975    {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633},
11976    40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645},
11977    {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661},
11978    {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683},
11979    {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704},
11980    40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728,
11981    {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749},
11982    {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773},
11983    {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794},
11984    {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811,
11985    {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833},
11986    {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861},
11987    {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024,
11988    {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905,
11989    [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383,
11990    11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616,
11991    59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584,
11992    11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955,
11993    {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622,
11994    18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759,
11995    18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871,
11996    18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575,
11997    19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351,
11998    {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339},
11999    {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904,
12000    {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917},
12001    {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947},
12002    {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964},
12003    {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384},
12004    {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839},
12005    {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703},
12006    {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964},
12007    {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585},
12008    {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208},
12009    {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374},
12010    {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018},
12011    {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318},
12012    {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820,
12013    {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872},
12014    {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738},
12015    {f: 7, c: 19887}]
12016};
12017
12018
12019/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
12020/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
12021
12022'use strict';
12023
12024var ColorSpace = (function ColorSpaceClosure() {
12025  // Constructor should define this.numComps, this.defaultColor, this.name
12026  function ColorSpace() {
12027    error('should not call ColorSpace constructor');
12028  }
12029
12030  ColorSpace.prototype = {
12031    // Input: array of size numComps representing color component values
12032    // Output: array of rgb values, each value ranging from [0.1]
12033    getRgb: function ColorSpace_getRgb(color) {
12034      error('Should not call ColorSpace.getRgb: ' + color);
12035    },
12036    // Input: Uint8Array of component values, each value scaled to [0,255]
12037    // Output: Uint8Array of rgb values, each value scaled to [0,255]
12038    getRgbBuffer: function ColorSpace_getRgbBuffer(input) {
12039      error('Should not call ColorSpace.getRgbBuffer: ' + input);
12040    }
12041  };
12042
12043  ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
12044    var IR = ColorSpace.parseToIR(cs, xref, res);
12045    if (IR instanceof AlternateCS)
12046      return IR;
12047
12048    return ColorSpace.fromIR(IR);
12049  };
12050
12051  ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
12052    var name = isArray(IR) ? IR[0] : IR;
12053
12054    switch (name) {
12055      case 'DeviceGrayCS':
12056        return new DeviceGrayCS();
12057      case 'DeviceRgbCS':
12058        return new DeviceRgbCS();
12059      case 'DeviceCmykCS':
12060        return new DeviceCmykCS();
12061      case 'PatternCS':
12062        var basePatternCS = IR[1];
12063        if (basePatternCS)
12064          basePatternCS = ColorSpace.fromIR(basePatternCS);
12065        return new PatternCS(basePatternCS);
12066      case 'IndexedCS':
12067        var baseIndexedCS = IR[1];
12068        var hiVal = IR[2];
12069        var lookup = IR[3];
12070        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
12071      case 'AlternateCS':
12072        var numComps = IR[1];
12073        var alt = IR[2];
12074        var tintFnIR = IR[3];
12075
12076        return new AlternateCS(numComps, ColorSpace.fromIR(alt),
12077                                PDFFunction.fromIR(tintFnIR));
12078      case 'LabCS':
12079        var whitePoint = IR[1].WhitePoint;
12080        var blackPoint = IR[1].BlackPoint;
12081        var range = IR[1].Range;
12082        return new LabCS(whitePoint, blackPoint, range);
12083      default:
12084        error('Unkown name ' + name);
12085    }
12086    return null;
12087  };
12088
12089  ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
12090    if (isName(cs)) {
12091      var colorSpaces = res.get('ColorSpace');
12092      if (isDict(colorSpaces)) {
12093        var refcs = colorSpaces.get(cs.name);
12094        if (refcs)
12095          cs = refcs;
12096      }
12097    }
12098
12099    cs = xref.fetchIfRef(cs);
12100    var mode;
12101
12102    if (isName(cs)) {
12103      mode = cs.name;
12104      this.mode = mode;
12105
12106      switch (mode) {
12107        case 'DeviceGray':
12108        case 'G':
12109          return 'DeviceGrayCS';
12110        case 'DeviceRGB':
12111        case 'RGB':
12112          return 'DeviceRgbCS';
12113        case 'DeviceCMYK':
12114        case 'CMYK':
12115          return 'DeviceCmykCS';
12116        case 'Pattern':
12117          return ['PatternCS', null];
12118        default:
12119          error('unrecognized colorspace ' + mode);
12120      }
12121    } else if (isArray(cs)) {
12122      mode = cs[0].name;
12123      this.mode = mode;
12124
12125      switch (mode) {
12126        case 'DeviceGray':
12127        case 'G':
12128          return 'DeviceGrayCS';
12129        case 'DeviceRGB':
12130        case 'RGB':
12131          return 'DeviceRgbCS';
12132        case 'DeviceCMYK':
12133        case 'CMYK':
12134          return 'DeviceCmykCS';
12135        case 'CalGray':
12136          return 'DeviceGrayCS';
12137        case 'CalRGB':
12138          return 'DeviceRgbCS';
12139        case 'ICCBased':
12140          var stream = xref.fetchIfRef(cs[1]);
12141          var dict = stream.dict;
12142          var numComps = dict.get('N');
12143          if (numComps == 1)
12144            return 'DeviceGrayCS';
12145          if (numComps == 3)
12146            return 'DeviceRgbCS';
12147          if (numComps == 4)
12148            return 'DeviceCmykCS';
12149          break;
12150        case 'Pattern':
12151          var basePatternCS = cs[1];
12152          if (basePatternCS)
12153            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
12154          return ['PatternCS', basePatternCS];
12155        case 'Indexed':
12156        case 'I':
12157          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
12158          var hiVal = cs[2] + 1;
12159          var lookup = xref.fetchIfRef(cs[3]);
12160          return ['IndexedCS', baseIndexedCS, hiVal, lookup];
12161        case 'Separation':
12162        case 'DeviceN':
12163          var name = cs[1];
12164          var numComps = 1;
12165          if (isName(name))
12166            numComps = 1;
12167          else if (isArray(name))
12168            numComps = name.length;
12169          var alt = ColorSpace.parseToIR(cs[2], xref, res);
12170          var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
12171          return ['AlternateCS', numComps, alt, tintFnIR];
12172        case 'Lab':
12173          var params = cs[1].getAll();
12174          return ['LabCS', params];
12175        default:
12176          error('unimplemented color space object "' + mode + '"');
12177      }
12178    } else {
12179      error('unrecognized color space object: "' + cs + '"');
12180    }
12181    return null;
12182  };
12183  /**
12184   * Checks if a decode map matches the default decode map for a color space.
12185   * This handles the general decode maps where there are two values per
12186   * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.
12187   * This does not handle Lab, Indexed, or Pattern decode maps since they are
12188   * slightly different.
12189   * @param {Array} decode Decode map (usually from an image).
12190   * @param {Number} n Number of components the color space has.
12191   */
12192  ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
12193    if (!decode)
12194      return true;
12195
12196    if (n * 2 !== decode.length) {
12197      warning('The decode map is not the correct length');
12198      return true;
12199    }
12200    for (var i = 0, ii = decode.length; i < ii; i += 2) {
12201      if (decode[i] != 0 || decode[i + 1] != 1)
12202        return false;
12203    }
12204    return true;
12205  };
12206
12207  return ColorSpace;
12208})();
12209
12210/**
12211 * Alternate color space handles both Separation and DeviceN color spaces.  A
12212 * Separation color space is actually just a DeviceN with one color component.
12213 * Both color spaces use a tinting function to convert colors to a base color
12214 * space.
12215 */
12216var AlternateCS = (function AlternateCSClosure() {
12217  function AlternateCS(numComps, base, tintFn) {
12218    this.name = 'Alternate';
12219    this.numComps = numComps;
12220    this.defaultColor = [];
12221    for (var i = 0; i < numComps; ++i)
12222      this.defaultColor.push(1);
12223    this.base = base;
12224    this.tintFn = tintFn;
12225  }
12226
12227  AlternateCS.prototype = {
12228    getRgb: function AlternateCS_getRgb(color) {
12229      var tinted = this.tintFn(color);
12230      return this.base.getRgb(tinted);
12231    },
12232    getRgbBuffer: function AlternateCS_getRgbBuffer(input, bits) {
12233      var tintFn = this.tintFn;
12234      var base = this.base;
12235      var scale = 1 / ((1 << bits) - 1);
12236      var length = input.length;
12237      var pos = 0;
12238      var baseNumComps = base.numComps;
12239      var baseBuf = new Uint8Array(baseNumComps * length);
12240      var numComps = this.numComps;
12241      var scaled = [];
12242
12243      for (var i = 0; i < length; i += numComps) {
12244        for (var z = 0; z < numComps; ++z)
12245          scaled[z] = input[i + z] * scale;
12246
12247        var tinted = tintFn(scaled);
12248        for (var j = 0; j < baseNumComps; ++j)
12249          baseBuf[pos++] = 255 * tinted[j];
12250      }
12251      return base.getRgbBuffer(baseBuf, 8);
12252    },
12253    isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
12254      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12255    }
12256  };
12257
12258  return AlternateCS;
12259})();
12260
12261var PatternCS = (function PatternCSClosure() {
12262  function PatternCS(baseCS) {
12263    this.name = 'Pattern';
12264    this.base = baseCS;
12265  }
12266  PatternCS.prototype = {};
12267
12268  return PatternCS;
12269})();
12270
12271var IndexedCS = (function IndexedCSClosure() {
12272  function IndexedCS(base, highVal, lookup) {
12273    this.name = 'Indexed';
12274    this.numComps = 1;
12275    this.defaultColor = [0];
12276    this.base = base;
12277    this.highVal = highVal;
12278
12279    var baseNumComps = base.numComps;
12280    var length = baseNumComps * highVal;
12281    var lookupArray = new Uint8Array(length);
12282
12283    if (isStream(lookup)) {
12284      var bytes = lookup.getBytes(length);
12285      lookupArray.set(bytes);
12286    } else if (isString(lookup)) {
12287      for (var i = 0; i < length; ++i)
12288        lookupArray[i] = lookup.charCodeAt(i);
12289    } else {
12290      error('Unrecognized lookup table: ' + lookup);
12291    }
12292    this.lookup = lookupArray;
12293  }
12294
12295  IndexedCS.prototype = {
12296    getRgb: function IndexedCS_getRgb(color) {
12297      var numComps = this.base.numComps;
12298      var start = color[0] * numComps;
12299      var c = [];
12300
12301      for (var i = start, ii = start + numComps; i < ii; ++i)
12302        c.push(this.lookup[i]);
12303
12304      return this.base.getRgb(c);
12305    },
12306    getRgbBuffer: function IndexedCS_getRgbBuffer(input) {
12307      var base = this.base;
12308      var numComps = base.numComps;
12309      var lookup = this.lookup;
12310      var length = input.length;
12311      var baseBuf = new Uint8Array(length * numComps);
12312      var baseBufPos = 0;
12313
12314      for (var i = 0; i < length; ++i) {
12315        var lookupPos = input[i] * numComps;
12316        for (var j = 0; j < numComps; ++j) {
12317          baseBuf[baseBufPos++] = lookup[lookupPos + j];
12318        }
12319      }
12320
12321      return base.getRgbBuffer(baseBuf, 8);
12322    },
12323    isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
12324      // indexed color maps shouldn't be changed
12325      return true;
12326    }
12327  };
12328  return IndexedCS;
12329})();
12330
12331var DeviceGrayCS = (function DeviceGrayCSClosure() {
12332  function DeviceGrayCS() {
12333    this.name = 'DeviceGray';
12334    this.numComps = 1;
12335    this.defaultColor = [0];
12336  }
12337
12338  DeviceGrayCS.prototype = {
12339    getRgb: function DeviceGrayCS_getRgb(color) {
12340      var c = color[0];
12341      return [c, c, c];
12342    },
12343    getRgbBuffer: function DeviceGrayCS_getRgbBuffer(input, bits) {
12344      var scale = 255 / ((1 << bits) - 1);
12345      var length = input.length;
12346      var rgbBuf = new Uint8Array(length * 3);
12347      for (var i = 0, j = 0; i < length; ++i) {
12348        var c = (scale * input[i]) | 0;
12349        rgbBuf[j++] = c;
12350        rgbBuf[j++] = c;
12351        rgbBuf[j++] = c;
12352      }
12353      return rgbBuf;
12354    },
12355    isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
12356      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12357    }
12358  };
12359  return DeviceGrayCS;
12360})();
12361
12362var DeviceRgbCS = (function DeviceRgbCSClosure() {
12363  function DeviceRgbCS() {
12364    this.name = 'DeviceRGB';
12365    this.numComps = 3;
12366    this.defaultColor = [0, 0, 0];
12367  }
12368  DeviceRgbCS.prototype = {
12369    getRgb: function DeviceRgbCS_getRgb(color) {
12370      return color;
12371    },
12372    getRgbBuffer: function DeviceRgbCS_getRgbBuffer(input, bits) {
12373      if (bits == 8)
12374        return input;
12375      var scale = 255 / ((1 << bits) - 1);
12376      var i, length = input.length;
12377      var rgbBuf = new Uint8Array(length);
12378      for (i = 0; i < length; ++i)
12379        rgbBuf[i] = (scale * input[i]) | 0;
12380      return rgbBuf;
12381    },
12382    isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
12383      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12384    }
12385  };
12386  return DeviceRgbCS;
12387})();
12388
12389var DeviceCmykCS = (function DeviceCmykCSClosure() {
12390  function DeviceCmykCS() {
12391    this.name = 'DeviceCMYK';
12392    this.numComps = 4;
12393    this.defaultColor = [0, 0, 0, 1];
12394  }
12395  DeviceCmykCS.prototype = {
12396    getRgb: function DeviceCmykCS_getRgb(color) {
12397      var c = color[0], m = color[1], y = color[2], k = color[3];
12398
12399      // CMYK -> CMY: http://www.easyrgb.com/index.php?X=MATH&H=14#text14
12400      c = (c * (1 - k) + k);
12401      m = (m * (1 - k) + k);
12402      y = (y * (1 - k) + k);
12403
12404      // CMY -> RGB: http://www.easyrgb.com/index.php?X=MATH&H=12#text12
12405      var r = (1 - c);
12406      var g = (1 - m);
12407      var b = (1 - y);
12408
12409      return [r, g, b];
12410    },
12411    getRgbBuffer: function DeviceCmykCS_getRgbBuffer(colorBuf, bits) {
12412      var scale = 1 / ((1 << bits) - 1);
12413      var length = colorBuf.length / 4;
12414      var rgbBuf = new Uint8Array(length * 3);
12415      var rgbBufPos = 0;
12416      var colorBufPos = 0;
12417
12418      for (var i = 0; i < length; i++) {
12419        var cmyk = [];
12420        for (var j = 0; j < 4; ++j)
12421          cmyk.push(scale * colorBuf[colorBufPos++]);
12422
12423        var rgb = this.getRgb(cmyk);
12424        for (var j = 0; j < 3; ++j)
12425          rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255);
12426      }
12427
12428      return rgbBuf;
12429    },
12430    isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
12431      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12432    }
12433  };
12434
12435  return DeviceCmykCS;
12436})();
12437
12438//
12439// LabCS: Based on "PDF Reference, Sixth Ed", p.250
12440//
12441var LabCS = (function LabCSClosure() {
12442  function LabCS(whitePoint, blackPoint, range) {
12443    this.name = 'Lab';
12444    this.numComps = 3;
12445    this.defaultColor = [0, 0, 0];
12446
12447    if (!whitePoint)
12448      error('WhitePoint missing - required for color space Lab');
12449    blackPoint = blackPoint || [0, 0, 0];
12450    range = range || [-100, 100, -100, 100];
12451
12452    // Translate args to spec variables
12453    this.XW = whitePoint[0];
12454    this.YW = whitePoint[1];
12455    this.ZW = whitePoint[2];
12456    this.amin = range[0];
12457    this.amax = range[1];
12458    this.bmin = range[2];
12459    this.bmax = range[3];
12460
12461    // These are here just for completeness - the spec doesn't offer any
12462    // formulas that use BlackPoint in Lab
12463    this.XB = blackPoint[0];
12464    this.YB = blackPoint[1];
12465    this.ZB = blackPoint[2];
12466
12467    // Validate vars as per spec
12468    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1)
12469      error('Invalid WhitePoint components, no fallback available');
12470
12471    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
12472      warn('Invalid BlackPoint, falling back to default');
12473      this.XB = this.YB = this.ZB = 0;
12474    }
12475
12476    if (this.amin > this.amax || this.bmin > this.bmax) {
12477      warn('Invalid Range, falling back to defaults');
12478      this.amin = -100;
12479      this.amax = 100;
12480      this.bmin = -100;
12481      this.bmax = 100;
12482    }
12483  };
12484
12485  // Function g(x) from spec
12486  function g(x) {
12487    if (x >= 6 / 29)
12488      return x * x * x;
12489    else
12490      return (108 / 841) * (x - 4 / 29);
12491  }
12492
12493  LabCS.prototype = {
12494    getRgb: function LabCS_getRgb(color) {
12495      // Ls,as,bs <---> L*,a*,b* in the spec
12496      var Ls = color[0], as = color[1], bs = color[2];
12497
12498      // Adjust limits of 'as' and 'bs'
12499      as = as > this.amax ? this.amax : as;
12500      as = as < this.amin ? this.amin : as;
12501      bs = bs > this.bmax ? this.bmax : bs;
12502      bs = bs < this.bmin ? this.bmin : bs;
12503
12504      // Computes intermediate variables X,Y,Z as per spec
12505      var M = (Ls + 16) / 116;
12506      var L = M + (as / 500);
12507      var N = M - (bs / 200);
12508      var X = this.XW * g(L);
12509      var Y = this.YW * g(M);
12510      var Z = this.ZW * g(N);
12511
12512      // XYZ to RGB 3x3 matrix, from:
12513      // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC18
12514      var XYZtoRGB = [3.240479, -1.537150, -0.498535,
12515                      -0.969256, 1.875992, 0.041556,
12516                      0.055648, -0.204043, 1.057311];
12517
12518      return Util.apply3dTransform(XYZtoRGB, [X, Y, Z]);
12519    },
12520    getRgbBuffer: function LabCS_getRgbBuffer(input, bits) {
12521      if (bits == 8)
12522        return input;
12523      var scale = 255 / ((1 << bits) - 1);
12524      var i, length = input.length / 3;
12525      var rgbBuf = new Uint8Array(length);
12526
12527      var j = 0;
12528      for (i = 0; i < length; ++i) {
12529        // Convert L*, a*, s* into RGB
12530        var rgb = this.getRgb([input[i], input[i + 1], input[i + 2]]);
12531        rgbBuf[j++] = rgb[0];
12532        rgbBuf[j++] = rgb[1];
12533        rgbBuf[j++] = rgb[2];
12534      }
12535
12536      return rgbBuf;
12537    },
12538    isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {
12539      // From Table 90 in Adobe's:
12540      // "Document management - Portable document format", 1st ed, 2008
12541      if (decodeMap[0] === 0 && decodeMap[1] === 100 &&
12542          decodeMap[2] === this.amin && decodeMap[3] === this.amax &&
12543          decodeMap[4] === this.bmin && decodeMap[5] === this.bmax)
12544        return true;
12545      else
12546        return false;
12547    }
12548  };
12549  return LabCS;
12550})();
12551
12552/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
12553/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
12554
12555'use strict';
12556
12557var ARCFourCipher = (function ARCFourCipherClosure() {
12558  function ARCFourCipher(key) {
12559    this.a = 0;
12560    this.b = 0;
12561    var s = new Uint8Array(256);
12562    var i, j = 0, tmp, keyLength = key.length;
12563    for (i = 0; i < 256; ++i)
12564      s[i] = i;
12565    for (i = 0; i < 256; ++i) {
12566      tmp = s[i];
12567      j = (j + tmp + key[i % keyLength]) & 0xFF;
12568      s[i] = s[j];
12569      s[j] = tmp;
12570    }
12571    this.s = s;
12572  }
12573
12574  ARCFourCipher.prototype = {
12575    encryptBlock: function ARCFourCipher_encryptBlock(data) {
12576      var i, n = data.length, tmp, tmp2;
12577      var a = this.a, b = this.b, s = this.s;
12578      var output = new Uint8Array(n);
12579      for (i = 0; i < n; ++i) {
12580        a = (a + 1) & 0xFF;
12581        tmp = s[a];
12582        b = (b + tmp) & 0xFF;
12583        tmp2 = s[b];
12584        s[a] = tmp2;
12585        s[b] = tmp;
12586        output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
12587      }
12588      this.a = a;
12589      this.b = b;
12590      return output;
12591    }
12592  };
12593  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
12594
12595  return ARCFourCipher;
12596})();
12597
12598var calculateMD5 = (function calculateMD5Closure() {
12599  var r = new Uint8Array([
12600    7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
12601    5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
12602    4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
12603    6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
12604
12605  var k = new Int32Array([
12606    -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
12607    -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
12608    1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
12609    643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
12610    568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
12611    1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
12612    -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
12613    -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
12614    -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
12615    -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
12616    -145523070, -1120210379, 718787259, -343485551]);
12617
12618  function hash(data, offset, length) {
12619    var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
12620    // pre-processing
12621    var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
12622    var padded = new Uint8Array(paddedLength);
12623    var i, j, n;
12624    for (i = 0; i < length; ++i)
12625      padded[i] = data[offset++];
12626    padded[i++] = 0x80;
12627    n = paddedLength - 8;
12628    while (i < n)
12629      padded[i++] = 0;
12630    padded[i++] = (length << 3) & 0xFF;
12631    padded[i++] = (length >> 5) & 0xFF;
12632    padded[i++] = (length >> 13) & 0xFF;
12633    padded[i++] = (length >> 21) & 0xFF;
12634    padded[i++] = (length >>> 29) & 0xFF;
12635    padded[i++] = 0;
12636    padded[i++] = 0;
12637    padded[i++] = 0;
12638    // chunking
12639    // TODO ArrayBuffer ?
12640    var w = new Int32Array(16);
12641    for (i = 0; i < paddedLength;) {
12642      for (j = 0; j < 16; ++j, i += 4) {
12643        w[j] = (padded[i] | (padded[i + 1] << 8) |
12644                (padded[i + 2] << 16) | (padded[i + 3] << 24));
12645      }
12646      var a = h0, b = h1, c = h2, d = h3, f, g;
12647      for (j = 0; j < 64; ++j) {
12648        if (j < 16) {
12649          f = (b & c) | ((~b) & d);
12650          g = j;
12651        } else if (j < 32) {
12652          f = (d & b) | ((~d) & c);
12653          g = (5 * j + 1) & 15;
12654        } else if (j < 48) {
12655          f = b ^ c ^ d;
12656          g = (3 * j + 5) & 15;
12657        } else {
12658          f = c ^ (b | (~d));
12659          g = (7 * j) & 15;
12660        }
12661        var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
12662        d = c;
12663        c = b;
12664        b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
12665        a = tmp;
12666      }
12667      h0 = (h0 + a) | 0;
12668      h1 = (h1 + b) | 0;
12669      h2 = (h2 + c) | 0;
12670      h3 = (h3 + d) | 0;
12671    }
12672    return new Uint8Array([
12673        h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
12674        h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
12675        h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
12676        h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
12677    ]);
12678  }
12679  return hash;
12680})();
12681
12682var NullCipher = (function NullCipherClosure() {
12683  function NullCipher() {
12684  }
12685
12686  NullCipher.prototype = {
12687    decryptBlock: function NullCipher_decryptBlock(data) {
12688      return data;
12689    }
12690  };
12691
12692  return NullCipher;
12693})();
12694
12695var AES128Cipher = (function AES128CipherClosure() {
12696  var rcon = new Uint8Array([
12697    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
12698    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
12699    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
12700    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
12701    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
12702    0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
12703    0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
12704    0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
12705    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
12706    0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
12707    0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
12708    0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
12709    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
12710    0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
12711    0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
12712    0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
12713    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
12714    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
12715    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
12716    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
12717    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
12718    0x74, 0xe8, 0xcb, 0x8d]);
12719
12720  var s = new Uint8Array([
12721    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
12722    0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
12723    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
12724    0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
12725    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
12726    0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
12727    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
12728    0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
12729    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
12730    0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
12731    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
12732    0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
12733    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
12734    0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
12735    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
12736    0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
12737    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
12738    0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
12739    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
12740    0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
12741    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
12742    0xb0, 0x54, 0xbb, 0x16]);
12743
12744  var inv_s = new Uint8Array([
12745    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
12746    0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
12747    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
12748    0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
12749    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
12750    0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
12751    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
12752    0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
12753    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
12754    0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
12755    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
12756    0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
12757    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
12758    0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
12759    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
12760    0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
12761    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
12762    0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
12763    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
12764    0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
12765    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
12766    0x55, 0x21, 0x0c, 0x7d]);
12767
12768  var mix = new Uint32Array([
12769    0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
12770    0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
12771    0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
12772    0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
12773    0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
12774    0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
12775    0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
12776    0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
12777    0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
12778    0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
12779    0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
12780    0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
12781    0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
12782    0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
12783    0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
12784    0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
12785    0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
12786    0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
12787    0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
12788    0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
12789    0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
12790    0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
12791    0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
12792    0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
12793    0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
12794    0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
12795    0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
12796    0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
12797    0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
12798    0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
12799    0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
12800    0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
12801    0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
12802    0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
12803    0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
12804    0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
12805    0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
12806    0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
12807    0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
12808    0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
12809    0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
12810    0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
12811    0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
12812
12813  function expandKey128(cipherKey) {
12814    var b = 176, result = new Uint8Array(b);
12815    result.set(cipherKey);
12816    for (var j = 16, i = 1; j < b; ++i) {
12817      // RotWord
12818      var t1 = result[j - 3], t2 = result[j - 2],
12819          t3 = result[j - 1], t4 = result[j - 4];
12820      // SubWord
12821      t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4];
12822      // Rcon
12823      t1 = t1 ^ rcon[i];
12824      for (var n = 0; n < 4; ++n) {
12825        result[j] = (t1 ^= result[j - 16]); j++;
12826        result[j] = (t2 ^= result[j - 16]); j++;
12827        result[j] = (t3 ^= result[j - 16]); j++;
12828        result[j] = (t4 ^= result[j - 16]); j++;
12829      }
12830    }
12831    return result;
12832  }
12833
12834  function decrypt128(input, key) {
12835    var state = new Uint8Array(16);
12836    state.set(input);
12837    var i, j, k;
12838    var t, u, v;
12839    // AddRoundKey
12840    for (j = 0, k = 160; j < 16; ++j, ++k)
12841      state[j] ^= key[k];
12842    for (i = 9; i >= 1; --i) {
12843      // InvShiftRows
12844      t = state[13]; state[13] = state[9]; state[9] = state[5];
12845      state[5] = state[1]; state[1] = t;
12846      t = state[14]; u = state[10]; state[14] = state[6];
12847      state[10] = state[2]; state[6] = t; state[2] = u;
12848      t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
12849      state[11] = t; state[7] = u; state[3] = v;
12850      // InvSubBytes
12851      for (j = 0; j < 16; ++j)
12852        state[j] = inv_s[state[j]];
12853      // AddRoundKey
12854      for (j = 0, k = i * 16; j < 16; ++j, ++k)
12855        state[j] ^= key[k];
12856      // InvMixColumns
12857      for (j = 0; j < 16; j += 4) {
12858        var s0 = mix[state[j]], s1 = mix[state[j + 1]],
12859            s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
12860        t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
12861            (s3 >>> 24) ^ (s3 << 8));
12862        state[j] = (t >>> 24) & 0xFF;
12863        state[j + 1] = (t >> 16) & 0xFF;
12864        state[j + 2] = (t >> 8) & 0xFF;
12865        state[j + 3] = t & 0xFF;
12866      }
12867    }
12868    // InvShiftRows
12869    t = state[13]; state[13] = state[9]; state[9] = state[5];
12870    state[5] = state[1]; state[1] = t;
12871    t = state[14]; u = state[10]; state[14] = state[6];
12872    state[10] = state[2]; state[6] = t; state[2] = u;
12873    t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
12874    state[11] = t; state[7] = u; state[3] = v;
12875    for (j = 0; j < 16; ++j) {
12876      // InvSubBytes
12877      state[j] = inv_s[state[j]];
12878      // AddRoundKey
12879      state[j] ^= key[j];
12880    }
12881    return state;
12882  }
12883
12884  function AES128Cipher(key) {
12885    this.key = expandKey128(key);
12886    this.buffer = new Uint8Array(16);
12887    this.bufferPosition = 0;
12888  }
12889
12890  function decryptBlock2(data) {
12891    var i, j, ii, sourceLength = data.length,
12892        buffer = this.buffer, bufferLength = this.bufferPosition,
12893        result = [], iv = this.iv;
12894    for (i = 0; i < sourceLength; ++i) {
12895      buffer[bufferLength] = data[i];
12896      ++bufferLength;
12897      if (bufferLength < 16)
12898        continue;
12899      // buffer is full, decrypting
12900      var plain = decrypt128(buffer, this.key);
12901      // xor-ing the IV vector to get plain text
12902      for (j = 0; j < 16; ++j)
12903        plain[j] ^= iv[j];
12904      iv = buffer;
12905      result.push(plain);
12906      buffer = new Uint8Array(16);
12907      bufferLength = 0;
12908    }
12909    // saving incomplete buffer
12910    this.buffer = buffer;
12911    this.bufferLength = bufferLength;
12912    this.iv = iv;
12913    if (result.length == 0)
12914      return new Uint8Array([]);
12915    if (result.length == 1)
12916      return result[0];
12917    // combining plain text blocks into one
12918    var output = new Uint8Array(16 * result.length);
12919    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16)
12920      output.set(result[i], j);
12921    return output;
12922  }
12923
12924  AES128Cipher.prototype = {
12925    decryptBlock: function AES128Cipher_decryptBlock(data) {
12926      var i, sourceLength = data.length;
12927      var buffer = this.buffer, bufferLength = this.bufferPosition;
12928      // waiting for IV values -- they are at the start of the stream
12929      for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength)
12930        buffer[bufferLength] = data[i];
12931      if (bufferLength < 16) {
12932        // need more data
12933        this.bufferLength = bufferLength;
12934        return new Uint8Array([]);
12935      }
12936      this.iv = buffer;
12937      this.buffer = new Uint8Array(16);
12938      this.bufferLength = 0;
12939      // starting decryption
12940      this.decryptBlock = decryptBlock2;
12941      return this.decryptBlock(data.subarray(16));
12942    }
12943  };
12944
12945  return AES128Cipher;
12946})();
12947
12948var CipherTransform = (function CipherTransformClosure() {
12949  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
12950    this.stringCipherConstructor = stringCipherConstructor;
12951    this.streamCipherConstructor = streamCipherConstructor;
12952  }
12953  CipherTransform.prototype = {
12954    createStream: function CipherTransform_createStream(stream) {
12955      var cipher = new this.streamCipherConstructor();
12956      return new DecryptStream(stream,
12957        function cipherTransformDecryptStream(data) {
12958          return cipher.decryptBlock(data);
12959        }
12960      );
12961    },
12962    decryptString: function CipherTransform_decryptString(s) {
12963      var cipher = new this.stringCipherConstructor();
12964      var data = stringToBytes(s);
12965      data = cipher.decryptBlock(data);
12966      return bytesToString(data);
12967    }
12968  };
12969  return CipherTransform;
12970})();
12971
12972var CipherTransformFactory = (function CipherTransformFactoryClosure() {
12973  function prepareKeyData(fileId, password, ownerPassword, userPassword,
12974                          flags, revision, keyLength, encryptMetadata) {
12975    var defaultPasswordBytes = new Uint8Array([
12976      0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
12977      0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
12978      0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
12979      0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
12980    var hashData = new Uint8Array(100), i = 0, j, n;
12981    if (password) {
12982      n = Math.min(32, password.length);
12983      for (; i < n; ++i)
12984        hashData[i] = password[i];
12985    }
12986    j = 0;
12987    while (i < 32) {
12988      hashData[i++] = defaultPasswordBytes[j++];
12989    }
12990    // as now the padded password in the hashData[0..i]
12991    for (j = 0, n = ownerPassword.length; j < n; ++j)
12992      hashData[i++] = ownerPassword[j];
12993    hashData[i++] = flags & 0xFF;
12994    hashData[i++] = (flags >> 8) & 0xFF;
12995    hashData[i++] = (flags >> 16) & 0xFF;
12996    hashData[i++] = (flags >>> 24) & 0xFF;
12997    for (j = 0, n = fileId.length; j < n; ++j)
12998      hashData[i++] = fileId[j];
12999    if (revision >= 4 && !encryptMetadata) {
13000      hashData[i++] = 0xFF;
13001      hashData[i++] = 0xFF;
13002      hashData[i++] = 0xFF;
13003      hashData[i++] = 0xFF;
13004    }
13005    var hash = calculateMD5(hashData, 0, i);
13006    var keyLengthInBytes = keyLength >> 3;
13007    if (revision >= 3) {
13008      for (j = 0; j < 50; ++j) {
13009         hash = calculateMD5(hash, 0, keyLengthInBytes);
13010      }
13011    }
13012    var encryptionKey = hash.subarray(0, keyLengthInBytes);
13013    var cipher, checkData;
13014
13015    if (revision >= 3) {
13016      // padded password in hashData, we can use this array for user
13017      // password check
13018      i = 32;
13019      for (j = 0, n = fileId.length; j < n; ++j)
13020        hashData[i++] = fileId[j];
13021      cipher = new ARCFourCipher(encryptionKey);
13022      var checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
13023      n = encryptionKey.length;
13024      var derivedKey = new Uint8Array(n), k;
13025      for (j = 1; j <= 19; ++j) {
13026        for (k = 0; k < n; ++k)
13027          derivedKey[k] = encryptionKey[k] ^ j;
13028        cipher = new ARCFourCipher(derivedKey);
13029        checkData = cipher.encryptBlock(checkData);
13030      }
13031    } else {
13032      cipher = new ARCFourCipher(encryptionKey);
13033      checkData = cipher.encryptBlock(hashData.subarray(0, 32));
13034    }
13035    for (j = 0, n = checkData.length; j < n; ++j) {
13036      if (userPassword[j] != checkData[j])
13037        error('incorrect password');
13038    }
13039    return encryptionKey;
13040  }
13041
13042  var identityName = new Name('Identity');
13043
13044  function CipherTransformFactory(dict, fileId, password) {
13045    var filter = dict.get('Filter');
13046    if (!isName(filter) || filter.name != 'Standard')
13047      error('unknown encryption method');
13048    this.dict = dict;
13049    var algorithm = dict.get('V');
13050    if (!isInt(algorithm) ||
13051      (algorithm != 1 && algorithm != 2 && algorithm != 4))
13052      error('unsupported encryption algorithm');
13053    this.algorithm = algorithm;
13054    var keyLength = dict.get('Length') || 40;
13055    if (!isInt(keyLength) ||
13056      keyLength < 40 || (keyLength % 8) != 0)
13057      error('invalid key length');
13058    // prepare keys
13059    var ownerPassword = stringToBytes(dict.get('O'));
13060    var userPassword = stringToBytes(dict.get('U'));
13061    var flags = dict.get('P');
13062    var revision = dict.get('R');
13063    var encryptMetadata =
13064      dict.get('EncryptMetadata') !== false; // makes true as default value
13065    var fileIdBytes = stringToBytes(fileId);
13066    var passwordBytes;
13067    if (password)
13068      passwordBytes = stringToBytes(password);
13069
13070    this.encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
13071                                        ownerPassword, userPassword,
13072                                        flags, revision,
13073                                        keyLength, encryptMetadata);
13074    if (algorithm == 4) {
13075      this.cf = dict.get('CF');
13076      this.stmf = dict.get('StmF') || identityName;
13077      this.strf = dict.get('StrF') || identityName;
13078      this.eff = dict.get('EFF') || this.strf;
13079    }
13080  }
13081
13082  function buildObjectKey(num, gen, encryptionKey, isAes) {
13083    var key = new Uint8Array(encryptionKey.length + 9), i, n;
13084    for (i = 0, n = encryptionKey.length; i < n; ++i)
13085      key[i] = encryptionKey[i];
13086    key[i++] = num & 0xFF;
13087    key[i++] = (num >> 8) & 0xFF;
13088    key[i++] = (num >> 16) & 0xFF;
13089    key[i++] = gen & 0xFF;
13090    key[i++] = (gen >> 8) & 0xFF;
13091    if (isAes) {
13092      key[i++] = 0x73;
13093      key[i++] = 0x41;
13094      key[i++] = 0x6C;
13095      key[i++] = 0x54;
13096    }
13097    var hash = calculateMD5(key, 0, i);
13098    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
13099  }
13100
13101  function buildCipherConstructor(cf, name, num, gen, key) {
13102    var cryptFilter = cf.get(name.name);
13103    var cfm;
13104    if (cryptFilter != null)
13105      cfm = cryptFilter.get('CFM');
13106    if (!cfm || cfm.name == 'None') {
13107      return function cipherTransformFactoryBuildCipherConstructorNone() {
13108        return new NullCipher();
13109      };
13110    }
13111    if ('V2' == cfm.name) {
13112      return function cipherTransformFactoryBuildCipherConstructorV2() {
13113        return new ARCFourCipher(
13114          buildObjectKey(num, gen, key, false));
13115      };
13116    }
13117    if ('AESV2' == cfm.name) {
13118      return function cipherTransformFactoryBuildCipherConstructorAESV2() {
13119        return new AES128Cipher(
13120          buildObjectKey(num, gen, key, true));
13121      };
13122    }
13123    error('Unknown crypto method');
13124  }
13125
13126  CipherTransformFactory.prototype = {
13127    createCipherTransform:
13128      function CipherTransformFactory_createCipherTransform(num, gen) {
13129      if (this.algorithm == 4) {
13130        return new CipherTransform(
13131          buildCipherConstructor(this.cf, this.stmf,
13132            num, gen, this.encryptionKey),
13133          buildCipherConstructor(this.cf, this.strf,
13134            num, gen, this.encryptionKey));
13135      }
13136      // algorithms 1 and 2
13137      var key = buildObjectKey(num, gen, this.encryptionKey, false);
13138      var cipherConstructor = function buildCipherCipherConstructor() {
13139        return new ARCFourCipher(key);
13140      };
13141      return new CipherTransform(cipherConstructor, cipherConstructor);
13142    }
13143  };
13144
13145  return CipherTransformFactory;
13146})();
13147
13148
13149/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
13150/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
13151
13152'use strict';
13153
13154var PartialEvaluator = (function PartialEvaluatorClosure() {
13155  function PartialEvaluator(xref, handler, uniquePrefix) {
13156    this.state = new EvalState();
13157    this.stateStack = [];
13158
13159    this.xref = xref;
13160    this.handler = handler;
13161    this.uniquePrefix = uniquePrefix;
13162    this.objIdCounter = 0;
13163  }
13164
13165  var OP_MAP = {
13166    // Graphics state
13167    w: 'setLineWidth',
13168    J: 'setLineCap',
13169    j: 'setLineJoin',
13170    M: 'setMiterLimit',
13171    d: 'setDash',
13172    ri: 'setRenderingIntent',
13173    i: 'setFlatness',
13174    gs: 'setGState',
13175    q: 'save',
13176    Q: 'restore',
13177    cm: 'transform',
13178
13179    // Path
13180    m: 'moveTo',
13181    l: 'lineTo',
13182    c: 'curveTo',
13183    v: 'curveTo2',
13184    y: 'curveTo3',
13185    h: 'closePath',
13186    re: 'rectangle',
13187    S: 'stroke',
13188    s: 'closeStroke',
13189    f: 'fill',
13190    F: 'fill',
13191    'f*': 'eoFill',
13192    B: 'fillStroke',
13193    'B*': 'eoFillStroke',
13194    b: 'closeFillStroke',
13195    'b*': 'closeEOFillStroke',
13196    n: 'endPath',
13197
13198    // Clipping
13199    W: 'clip',
13200    'W*': 'eoClip',
13201
13202    // Text
13203    BT: 'beginText',
13204    ET: 'endText',
13205    Tc: 'setCharSpacing',
13206    Tw: 'setWordSpacing',
13207    Tz: 'setHScale',
13208    TL: 'setLeading',
13209    Tf: 'setFont',
13210    Tr: 'setTextRenderingMode',
13211    Ts: 'setTextRise',
13212    Td: 'moveText',
13213    TD: 'setLeadingMoveText',
13214    Tm: 'setTextMatrix',
13215    'T*': 'nextLine',
13216    Tj: 'showText',
13217    TJ: 'showSpacedText',
13218    "'": 'nextLineShowText',
13219    '"': 'nextLineSetSpacingShowText',
13220
13221    // Type3 fonts
13222    d0: 'setCharWidth',
13223    d1: 'setCharWidthAndBounds',
13224
13225    // Color
13226    CS: 'setStrokeColorSpace',
13227    cs: 'setFillColorSpace',
13228    SC: 'setStrokeColor',
13229    SCN: 'setStrokeColorN',
13230    sc: 'setFillColor',
13231    scn: 'setFillColorN',
13232    G: 'setStrokeGray',
13233    g: 'setFillGray',
13234    RG: 'setStrokeRGBColor',
13235    rg: 'setFillRGBColor',
13236    K: 'setStrokeCMYKColor',
13237    k: 'setFillCMYKColor',
13238
13239    // Shading
13240    sh: 'shadingFill',
13241
13242    // Images
13243    BI: 'beginInlineImage',
13244    ID: 'beginImageData',
13245    EI: 'endInlineImage',
13246
13247    // XObjects
13248    Do: 'paintXObject',
13249
13250    // Marked content
13251    MP: 'markPoint',
13252    DP: 'markPointProps',
13253    BMC: 'beginMarkedContent',
13254    BDC: 'beginMarkedContentProps',
13255    EMC: 'endMarkedContent',
13256
13257    // Compatibility
13258    BX: 'beginCompat',
13259    EX: 'endCompat'
13260  };
13261
13262  function splitCombinedOperations(operations) {
13263    // Two operations can be combined together, trying to find which two
13264    // operations were concatenated.
13265    for (var i = operations.length - 1; i > 0; i--) {
13266      var op1 = operations.substring(0, i), op2 = operations.substring(i);
13267      if (op1 in OP_MAP && op2 in OP_MAP)
13268        return [op1, op2]; // operations found
13269    }
13270    return null;
13271  }
13272
13273  PartialEvaluator.prototype = {
13274    getOperatorList: function PartialEvaluator_getOperatorList(stream,
13275                                                               resources,
13276                                                               dependency,
13277                                                               queue) {
13278
13279      var self = this;
13280      var xref = this.xref;
13281      var handler = this.handler;
13282      var uniquePrefix = this.uniquePrefix || '';
13283
13284      function insertDependency(depList) {
13285        fnArray.push('dependency');
13286        argsArray.push(depList);
13287        for (var i = 0, ii = depList.length; i < ii; i++) {
13288          var dep = depList[i];
13289          if (dependency.indexOf(dep) == -1) {
13290            dependency.push(depList[i]);
13291          }
13292        }
13293      }
13294
13295      function handleSetFont(fontName, font) {
13296        var loadedName = null;
13297
13298        var fontRes = resources.get('Font');
13299
13300        assert(fontRes, 'fontRes not available');
13301
13302        font = xref.fetchIfRef(font) || fontRes.get(fontName);
13303        assertWellFormed(isDict(font));
13304        ++self.objIdCounter;
13305        if (!font.translated) {
13306          font.translated = self.translateFont(font, xref, resources,
13307                                               dependency);
13308          if (font.translated) {
13309            // keep track of each font we translated so the caller can
13310            // load them asynchronously before calling display on a page
13311            loadedName = 'font_' + uniquePrefix + self.objIdCounter;
13312            font.translated.properties.loadedName = loadedName;
13313            font.loadedName = loadedName;
13314
13315            var translated = font.translated;
13316            // Convert the file to an ArrayBuffer which will be turned back into
13317            // a Stream in the main thread.
13318            if (translated.file)
13319              translated.file = translated.file.getBytes();
13320            if (translated.properties.file) {
13321              translated.properties.file =
13322                  translated.properties.file.getBytes();
13323            }
13324
13325            handler.send('obj', [
13326                loadedName,
13327                'Font',
13328                translated.name,
13329                translated.file,
13330                translated.properties
13331            ]);
13332          }
13333        }
13334        loadedName = loadedName || font.loadedName;
13335
13336        // Ensure the font is ready before the font is set
13337        // and later on used for drawing.
13338        // OPTIMIZE: This should get insert to the operatorList only once per
13339        // page.
13340        insertDependency([loadedName]);
13341        return loadedName;
13342      }
13343
13344      function buildPaintImageXObject(image, inline) {
13345        var dict = image.dict;
13346        var w = dict.get('Width', 'W');
13347        var h = dict.get('Height', 'H');
13348
13349        var imageMask = dict.get('ImageMask', 'IM') || false;
13350        if (imageMask) {
13351          // This depends on a tmpCanvas beeing filled with the
13352          // current fillStyle, such that processing the pixel
13353          // data can't be done here. Instead of creating a
13354          // complete PDFImage, only read the information needed
13355          // for later.
13356
13357          var width = dict.get('Width', 'W');
13358          var height = dict.get('Height', 'H');
13359          var bitStrideLength = (width + 7) >> 3;
13360          var imgArray = image.getBytes(bitStrideLength * height);
13361          var decode = dict.get('Decode', 'D');
13362          var inverseDecode = !!decode && decode[0] > 0;
13363
13364          fn = 'paintImageMaskXObject';
13365          args = [imgArray, inverseDecode, width, height];
13366          return;
13367        }
13368
13369        // If there is no imageMask, create the PDFImage and a lot
13370        // of image processing can be done here.
13371        var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
13372        insertDependency([objId]);
13373        args = [objId, w, h];
13374
13375        var softMask = dict.get('SMask', 'IM') || false;
13376        if (!softMask && image instanceof JpegStream &&
13377            image.isNativelySupported(xref, resources)) {
13378          // These JPEGs don't need any more processing so we can just send it.
13379          fn = 'paintJpegXObject';
13380          handler.send('obj', [objId, 'JpegStream', image.getIR()]);
13381          return;
13382        }
13383
13384        fn = 'paintImageXObject';
13385
13386        PDFImage.buildImage(function(imageObj) {
13387            var drawWidth = imageObj.drawWidth;
13388            var drawHeight = imageObj.drawHeight;
13389            var imgData = {
13390              width: drawWidth,
13391              height: drawHeight,
13392              data: new Uint8Array(drawWidth * drawHeight * 4)
13393            };
13394            var pixels = imgData.data;
13395            imageObj.fillRgbaBuffer(pixels, drawWidth, drawHeight);
13396            handler.send('obj', [objId, 'Image', imgData]);
13397          }, handler, xref, resources, image, inline);
13398      }
13399
13400      if (!queue)
13401        queue = {};
13402
13403      if (!queue.argsArray) {
13404        queue.argsArray = [];
13405      }
13406      if (!queue.fnArray) {
13407        queue.fnArray = [];
13408      }
13409
13410      var fnArray = queue.fnArray, argsArray = queue.argsArray;
13411      var dependencyArray = dependency || [];
13412
13413      resources = resources || new Dict();
13414      var xobjs = resources.get('XObject') || new Dict();
13415      var patterns = resources.get('Pattern') || new Dict();
13416      var parser = new Parser(new Lexer(stream), false, xref);
13417      var res = resources;
13418      var hasNextObj = false, nextObj;
13419      var args = [], obj;
13420      var TILING_PATTERN = 1, SHADING_PATTERN = 2;
13421
13422      while (true) {
13423        if (hasNextObj) {
13424          obj = nextObj;
13425          hasNextObj = false;
13426        } else {
13427          obj = parser.getObj();
13428          if (isEOF(obj))
13429            break;
13430        }
13431
13432        if (isCmd(obj)) {
13433          var cmd = obj.cmd;
13434          var fn = OP_MAP[cmd];
13435          if (!fn) {
13436            // invalid content command, trying to recover
13437            var cmds = splitCombinedOperations(cmd);
13438            if (cmds) {
13439              cmd = cmds[0];
13440              fn = OP_MAP[cmd];
13441              // feeding other command on the next interation
13442              hasNextObj = true;
13443              nextObj = Cmd.get(cmds[1]);
13444            }
13445          }
13446          assertWellFormed(fn, 'Unknown command "' + cmd + '"');
13447          // TODO figure out how to type-check vararg functions
13448
13449          if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) {
13450            // compile tiling patterns
13451            var patternName = args[args.length - 1];
13452            // SCN/scn applies patterns along with normal colors
13453            if (isName(patternName)) {
13454              var pattern = patterns.get(patternName.name);
13455              if (pattern) {
13456                var dict = isStream(pattern) ? pattern.dict : pattern;
13457                var typeNum = dict.get('PatternType');
13458
13459                if (typeNum == TILING_PATTERN) {
13460                  // Create an IR of the pattern code.
13461                  var depIdx = dependencyArray.length;
13462                  var operatorList = this.getOperatorList(pattern,
13463                      dict.get('Resources') || resources, dependencyArray);
13464
13465                  // Add the dependencies that are required to execute the
13466                  // operatorList.
13467                  insertDependency(dependencyArray.slice(depIdx));
13468
13469                  args = TilingPattern.getIR(operatorList, dict, args);
13470                }
13471                else if (typeNum == SHADING_PATTERN) {
13472                  var shading = dict.get('Shading');
13473                  var matrix = dict.get('Matrix');
13474                  var pattern = Pattern.parseShading(shading, matrix, xref,
13475                                                     res);
13476                  args = pattern.getIR();
13477                } else {
13478                  error('Unkown PatternType ' + typeNum);
13479                }
13480              }
13481            }
13482          } else if (cmd == 'Do' && !args[0].code) {
13483            // eagerly compile XForm objects
13484            var name = args[0].name;
13485            var xobj = xobjs.get(name);
13486            if (xobj) {
13487              assertWellFormed(isStream(xobj), 'XObject should be a stream');
13488
13489              var type = xobj.dict.get('Subtype');
13490              assertWellFormed(
13491                isName(type),
13492                'XObject should have a Name subtype'
13493              );
13494
13495              if ('Form' == type.name) {
13496                var matrix = xobj.dict.get('Matrix');
13497                var bbox = xobj.dict.get('BBox');
13498
13499                fnArray.push('paintFormXObjectBegin');
13500                argsArray.push([matrix, bbox]);
13501
13502                // This adds the operatorList of the xObj to the current queue.
13503                var depIdx = dependencyArray.length;
13504
13505                // Pass in the current `queue` object. That means the `fnArray`
13506                // and the `argsArray` in this scope is reused and new commands
13507                // are added to them.
13508                this.getOperatorList(xobj,
13509                    xobj.dict.get('Resources') || resources,
13510                    dependencyArray, queue);
13511
13512               // Add the dependencies that are required to execute the
13513               // operatorList.
13514               insertDependency(dependencyArray.slice(depIdx));
13515
13516                fn = 'paintFormXObjectEnd';
13517                args = [];
13518              } else if ('Image' == type.name) {
13519                buildPaintImageXObject(xobj, false);
13520              } else {
13521                error('Unhandled XObject subtype ' + type.name);
13522              }
13523            }
13524          } else if (cmd == 'Tf') { // eagerly collect all fonts
13525            args[0] = handleSetFont(args[0].name);
13526          } else if (cmd == 'EI') {
13527            buildPaintImageXObject(args[0], true);
13528          }
13529
13530          switch (fn) {
13531            // Parse the ColorSpace data to a raw format.
13532            case 'setFillColorSpace':
13533            case 'setStrokeColorSpace':
13534              args = [ColorSpace.parseToIR(args[0], xref, resources)];
13535              break;
13536            case 'shadingFill':
13537              var shadingRes = res.get('Shading');
13538              if (!shadingRes)
13539                error('No shading resource found');
13540
13541              var shading = shadingRes.get(args[0].name);
13542              if (!shading)
13543                error('No shading object found');
13544
13545              var shadingFill = Pattern.parseShading(shading, null, xref, res);
13546              var patternIR = shadingFill.getIR();
13547              args = [patternIR];
13548              fn = 'shadingFill';
13549              break;
13550            case 'setGState':
13551              var dictName = args[0];
13552              var extGState = resources.get('ExtGState');
13553
13554              if (!isDict(extGState) || !extGState.has(dictName.name))
13555                break;
13556
13557              var gsState = extGState.get(dictName.name);
13558
13559              // This array holds the converted/processed state data.
13560              var gsStateObj = [];
13561
13562              gsState.forEach(
13563                function canvasGraphicsSetGStateForEach(key, value) {
13564                  switch (key) {
13565                    case 'Type':
13566                      break;
13567                    case 'LW':
13568                    case 'LC':
13569                    case 'LJ':
13570                    case 'ML':
13571                    case 'D':
13572                    case 'RI':
13573                    case 'FL':
13574                    case 'CA':
13575                    case 'ca':
13576                      gsStateObj.push([key, value]);
13577                      break;
13578                    case 'Font':
13579                      gsStateObj.push([
13580                        'Font',
13581                        handleSetFont(null, value[0]),
13582                        value[1]
13583                      ]);
13584                      break;
13585                    case 'OP':
13586                    case 'op':
13587                    case 'OPM':
13588                    case 'BG':
13589                    case 'BG2':
13590                    case 'UCR':
13591                    case 'UCR2':
13592                    case 'TR':
13593                    case 'TR2':
13594                    case 'HT':
13595                    case 'SM':
13596                    case 'SA':
13597                    case 'BM':
13598                    case 'SMask':
13599                    case 'AIS':
13600                    case 'TK':
13601                      TODO('graphic state operator ' + key);
13602                      break;
13603                    default:
13604                      warn('Unknown graphic state operator ' + key);
13605                      break;
13606                  }
13607                }
13608              );
13609              args = [gsStateObj];
13610              break;
13611          } // switch
13612
13613          fnArray.push(fn);
13614          argsArray.push(args);
13615          args = [];
13616        } else if (obj != null) {
13617          assertWellFormed(args.length <= 33, 'Too many arguments');
13618          args.push(obj instanceof Dict ? obj.getAll() : obj);
13619        }
13620      }
13621
13622      return queue;
13623    },
13624
13625    extractDataStructures: function
13626      partialEvaluatorExtractDataStructures(dict, baseDict,
13627                                            xref, properties) {
13628      // 9.10.2
13629      var toUnicode = dict.get('ToUnicode') ||
13630        baseDict.get('ToUnicode');
13631      if (toUnicode)
13632        properties.toUnicode = this.readToUnicode(toUnicode, xref, properties);
13633
13634      if (properties.composite) {
13635        // CIDSystemInfo helps to match CID to glyphs
13636        var cidSystemInfo = dict.get('CIDSystemInfo');
13637        if (isDict(cidSystemInfo)) {
13638          properties.cidSystemInfo = {
13639            registry: cidSystemInfo.get('Registry'),
13640            ordering: cidSystemInfo.get('Ordering'),
13641            supplement: cidSystemInfo.get('Supplement')
13642          };
13643        }
13644
13645        var cidToGidMap = dict.get('CIDToGIDMap');
13646        if (isStream(cidToGidMap))
13647          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
13648      }
13649
13650      var flags = properties.flags;
13651      var differences = [];
13652      var baseEncoding = !!(flags & FontFlags.Symbolic) ?
13653                         Encodings.symbolsEncoding : Encodings.StandardEncoding;
13654      var hasEncoding = dict.has('Encoding');
13655      if (hasEncoding) {
13656        var encoding = dict.get('Encoding');
13657        if (isDict(encoding)) {
13658          var baseName = encoding.get('BaseEncoding');
13659          if (baseName)
13660            baseEncoding = Encodings[baseName.name];
13661          else
13662            hasEncoding = false; // base encoding was not provided
13663
13664          // Load the differences between the base and original
13665          if (encoding.has('Differences')) {
13666            var diffEncoding = encoding.get('Differences');
13667            var index = 0;
13668            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
13669              var data = diffEncoding[j];
13670              if (isNum(data))
13671                index = data;
13672              else
13673                differences[index++] = data.name;
13674            }
13675          }
13676        } else if (isName(encoding)) {
13677          baseEncoding = Encodings[encoding.name];
13678        } else {
13679          error('Encoding is not a Name nor a Dict');
13680        }
13681      }
13682
13683      properties.differences = differences;
13684      properties.baseEncoding = baseEncoding;
13685      properties.hasEncoding = hasEncoding;
13686    },
13687
13688    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode, xref,
13689                                                           properties) {
13690      var cmapObj = toUnicode;
13691      var charToUnicode = [];
13692      if (isName(cmapObj)) {
13693        var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-';
13694        if (!isIdentityMap)
13695          error('ToUnicode file cmap translation not implemented');
13696      } else if (isStream(cmapObj)) {
13697        var tokens = [];
13698        var token = '';
13699        var beginArrayToken = {};
13700
13701        var cmap = cmapObj.getBytes(cmapObj.length);
13702        for (var i = 0, ii = cmap.length; i < ii; i++) {
13703          var octet = cmap[i];
13704          if (octet == 0x20 || octet == 0x0D || octet == 0x0A ||
13705              octet == 0x3C || octet == 0x5B || octet == 0x5D) {
13706            switch (token) {
13707              case 'usecmap':
13708                error('usecmap is not implemented');
13709                break;
13710
13711              case 'beginbfchar':
13712              case 'beginbfrange':
13713              case 'begincidchar':
13714              case 'begincidrange':
13715                token = '';
13716                tokens = [];
13717                break;
13718
13719              case 'endcidrange':
13720              case 'endbfrange':
13721                for (var j = 0, jj = tokens.length; j < jj; j += 3) {
13722                  var startRange = tokens[j];
13723                  var endRange = tokens[j + 1];
13724                  var code = tokens[j + 2];
13725                  if (code == 0xFFFF) {
13726                    // CMap is broken, assuming code == startRange
13727                    code = startRange;
13728                  }
13729                  if (isArray(code)) {
13730                    var codeindex = 0;
13731                    while (startRange <= endRange) {
13732                      charToUnicode[startRange] = code[codeindex++];
13733                      ++startRange;
13734                    }
13735                  } else {
13736                    while (startRange <= endRange) {
13737                      charToUnicode[startRange] = code++;
13738                      ++startRange;
13739                    }
13740                  }
13741                }
13742                break;
13743
13744              case 'endcidchar':
13745              case 'endbfchar':
13746                for (var j = 0, jj = tokens.length; j < jj; j += 2) {
13747                  var index = tokens[j];
13748                  var code = tokens[j + 1];
13749                  charToUnicode[index] = code;
13750                }
13751                break;
13752
13753              case '':
13754                break;
13755
13756              default:
13757                if (token[0] >= '0' && token[0] <= '9')
13758                  token = parseInt(token, 10); // a number
13759                tokens.push(token);
13760                token = '';
13761            }
13762            switch (octet) {
13763              case 0x5B:
13764                // begin list parsing
13765                tokens.push(beginArrayToken);
13766                break;
13767              case 0x5D:
13768                // collect array items
13769                var items = [], item;
13770                while (tokens.length &&
13771                       (item = tokens.pop()) != beginArrayToken)
13772                  items.unshift(item);
13773                tokens.push(items);
13774                break;
13775            }
13776          } else if (octet == 0x3E) {
13777            if (token.length) {
13778              // XXX guessing chars size by checking number size in the CMap
13779              if (token.length <= 2 && properties.composite)
13780                properties.wideChars = false;
13781
13782              if (token.length <= 4) {
13783                // parsing hex number
13784                tokens.push(parseInt(token, 16));
13785                token = '';
13786              } else {
13787                // parsing hex UTF-16BE numbers
13788                var str = [];
13789                for (var k = 0, kk = token.length; k < kk; k += 4) {
13790                  var b = parseInt(token.substr(k, 4), 16);
13791                  if (b <= 0x10) {
13792                    k += 4;
13793                    b = (b << 16) | parseInt(token.substr(k, 4), 16);
13794                    b -= 0x10000;
13795                    str.push(0xD800 | (b >> 10));
13796                    str.push(0xDC00 | (b & 0x3FF));
13797                    break;
13798                  }
13799                  str.push(b);
13800                }
13801                tokens.push(String.fromCharCode.apply(String, str));
13802                token = '';
13803              }
13804            }
13805          } else {
13806            token += String.fromCharCode(octet);
13807          }
13808        }
13809      }
13810      return charToUnicode;
13811    },
13812    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
13813      // Extract the encoding from the CIDToGIDMap
13814      var glyphsData = cidToGidStream.getBytes();
13815
13816      // Set encoding 0 to later verify the font has an encoding
13817      var result = [];
13818      for (var j = 0, jj = glyphsData.length; j < jj; j++) {
13819        var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
13820        if (glyphID == 0)
13821          continue;
13822
13823        var code = j >> 1;
13824        result[code] = glyphID;
13825      }
13826      return result;
13827    },
13828
13829    extractWidths: function PartialEvaluator_extractWidths(dict,
13830                                                   xref,
13831                                                   descriptor,
13832                                                   properties) {
13833      var glyphsWidths = [];
13834      var defaultWidth = 0;
13835      if (properties.composite) {
13836        defaultWidth = dict.get('DW') || 1000;
13837
13838        var widths = dict.get('W');
13839        if (widths) {
13840          var start = 0, end = 0;
13841          for (var i = 0, ii = widths.length; i < ii; i++) {
13842            var code = widths[i];
13843            if (isArray(code)) {
13844              for (var j = 0, jj = code.length; j < jj; j++)
13845                glyphsWidths[start++] = code[j];
13846              start = 0;
13847            } else if (start) {
13848              var width = widths[++i];
13849              for (var j = start; j <= code; j++)
13850                glyphsWidths[j] = width;
13851              start = 0;
13852            } else {
13853              start = code;
13854            }
13855          }
13856        }
13857      } else {
13858        var firstChar = properties.firstChar;
13859        var widths = dict.get('Widths');
13860        if (widths) {
13861          var j = firstChar;
13862          for (var i = 0, ii = widths.length; i < ii; i++)
13863            glyphsWidths[j++] = widths[i];
13864          defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
13865        } else {
13866          // Trying get the BaseFont metrics (see comment above).
13867          var baseFontName = dict.get('BaseFont');
13868          if (isName(baseFontName)) {
13869            var metrics = this.getBaseFontMetrics(baseFontName.name);
13870
13871            glyphsWidths = metrics.widths;
13872            defaultWidth = metrics.defaultWidth;
13873          }
13874        }
13875      }
13876
13877      properties.defaultWidth = defaultWidth;
13878      properties.widths = glyphsWidths;
13879    },
13880
13881    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
13882      var defaultWidth = 0, widths = [];
13883      var glyphWidths = Metrics[stdFontMap[name] || name];
13884      if (isNum(glyphWidths)) {
13885        defaultWidth = glyphWidths;
13886      } else {
13887        widths = glyphWidths;
13888      }
13889
13890      return {
13891        defaultWidth: defaultWidth,
13892        widths: widths
13893      };
13894    },
13895
13896    translateFont: function PartialEvaluator_translateFont(dict,
13897                                                           xref,
13898                                                           resources,
13899                                                           dependency) {
13900      var baseDict = dict;
13901      var type = dict.get('Subtype');
13902      assertWellFormed(isName(type), 'invalid font Subtype');
13903
13904      var composite = false;
13905      if (type.name == 'Type0') {
13906        // If font is a composite
13907        //  - get the descendant font
13908        //  - set the type according to the descendant font
13909        //  - get the FontDescriptor from the descendant font
13910        var df = dict.get('DescendantFonts');
13911        if (!df)
13912          return null;
13913
13914        dict = isArray(df) ? xref.fetchIfRef(df[0]) : df;
13915
13916        type = dict.get('Subtype');
13917        assertWellFormed(isName(type), 'invalid font Subtype');
13918        composite = true;
13919      }
13920      var maxCharIndex = composite ? 0xFFFF : 0xFF;
13921
13922      var descriptor = dict.get('FontDescriptor');
13923      if (!descriptor) {
13924        if (type.name == 'Type3') {
13925          // FontDescriptor is only required for Type3 fonts when the document
13926          // is a tagged pdf. Create a barbebones one to get by.
13927          descriptor = new Dict();
13928          descriptor.set('FontName', new Name(type.name));
13929        } else {
13930          // Before PDF 1.5 if the font was one of the base 14 fonts, having a
13931          // FontDescriptor was not required.
13932          // This case is here for compatibility.
13933          var baseFontName = dict.get('BaseFont');
13934          if (!isName(baseFontName))
13935            return null;
13936
13937          // Using base font name as a font name.
13938          baseFontName = baseFontName.name.replace(/[,_]/g, '-');
13939          var metrics = this.getBaseFontMetrics(baseFontName);
13940
13941          // Simulating descriptor flags attribute
13942          var fontNameWoStyle = baseFontName.split('-')[0];
13943          var flags = (serifFonts[fontNameWoStyle] ||
13944            (fontNameWoStyle.search(/serif/gi) != -1) ? FontFlags.Serif : 0) |
13945            (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic :
13946            FontFlags.Nonsymbolic);
13947
13948          var properties = {
13949            type: type.name,
13950            widths: metrics.widths,
13951            defaultWidth: metrics.defaultWidth,
13952            flags: flags,
13953            firstChar: 0,
13954            lastChar: maxCharIndex
13955          };
13956          this.extractDataStructures(dict, dict, xref, properties);
13957
13958          return {
13959            name: baseFontName,
13960            dict: baseDict,
13961            properties: properties
13962          };
13963        }
13964      }
13965
13966      // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
13967      // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem
13968      // to ignore this rule when a variant of a standart font is used.
13969      // TODO Fill the width array depending on which of the base font this is
13970      // a variant.
13971      var firstChar = dict.get('FirstChar') || 0;
13972      var lastChar = dict.get('LastChar') || maxCharIndex;
13973      var fontName = descriptor.get('FontName');
13974      // Some bad pdf's have a string as the font name.
13975      if (isString(fontName))
13976        fontName = new Name(fontName);
13977      assertWellFormed(isName(fontName), 'invalid font name');
13978
13979      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
13980      if (fontFile) {
13981        if (fontFile.dict) {
13982          var subtype = fontFile.dict.get('Subtype');
13983          if (subtype)
13984            subtype = subtype.name;
13985
13986          var length1 = fontFile.dict.get('Length1');
13987
13988          var length2 = fontFile.dict.get('Length2');
13989        }
13990      }
13991
13992      var properties = {
13993        type: type.name,
13994        subtype: subtype,
13995        file: fontFile,
13996        length1: length1,
13997        length2: length2,
13998        composite: composite,
13999        wideChars: composite,
14000        fixedPitch: false,
14001        fontMatrix: dict.get('FontMatrix') || IDENTITY_MATRIX,
14002        firstChar: firstChar || 0,
14003        lastChar: lastChar || maxCharIndex,
14004        bbox: descriptor.get('FontBBox'),
14005        ascent: descriptor.get('Ascent'),
14006        descent: descriptor.get('Descent'),
14007        xHeight: descriptor.get('XHeight'),
14008        capHeight: descriptor.get('CapHeight'),
14009        flags: descriptor.get('Flags'),
14010        italicAngle: descriptor.get('ItalicAngle'),
14011        coded: false
14012      };
14013      this.extractWidths(dict, xref, descriptor, properties);
14014      this.extractDataStructures(dict, baseDict, xref, properties);
14015
14016      if (type.name === 'Type3') {
14017        properties.coded = true;
14018        var charProcs = dict.get('CharProcs').getAll();
14019        var fontResources = dict.get('Resources') || resources;
14020        properties.charProcOperatorList = {};
14021        for (var key in charProcs) {
14022          var glyphStream = charProcs[key];
14023          properties.charProcOperatorList[key] =
14024            this.getOperatorList(glyphStream, fontResources, dependency);
14025        }
14026      }
14027
14028      return {
14029        name: fontName.name,
14030        dict: baseDict,
14031        file: fontFile,
14032        properties: properties
14033      };
14034    }
14035  };
14036
14037  return PartialEvaluator;
14038})();
14039
14040var EvalState = (function EvalStateClosure() {
14041  function EvalState() {
14042    // Are soft masks and alpha values shapes or opacities?
14043    this.alphaIsShape = false;
14044    this.fontSize = 0;
14045    this.textMatrix = IDENTITY_MATRIX;
14046    this.leading = 0;
14047    // Start of text line (in text coordinates)
14048    this.lineX = 0;
14049    this.lineY = 0;
14050    // Character and word spacing
14051    this.charSpacing = 0;
14052    this.wordSpacing = 0;
14053    this.textHScale = 1;
14054    // Color spaces
14055    this.fillColorSpace = null;
14056    this.strokeColorSpace = null;
14057  }
14058  EvalState.prototype = {
14059  };
14060  return EvalState;
14061})();
14062
14063
14064/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
14065/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
14066
14067'use strict';
14068
14069/**
14070 * Maximum time to wait for a font to be loaded by font-face rules.
14071 */
14072var kMaxWaitForFontFace = 1000;
14073
14074// Unicode Private Use Area
14075var kCmapGlyphOffset = 0xE000;
14076var kSizeOfGlyphArea = 0x1900;
14077var kSymbolicFontGlyphOffset = 0xF000;
14078
14079// PDF Glyph Space Units are one Thousandth of a TextSpace Unit
14080// except for Type 3 fonts
14081var kPDFGlyphSpaceUnits = 1000;
14082
14083// Until hinting is fully supported this constant can be used
14084var kHintingEnabled = false;
14085
14086var FontFlags = {
14087  FixedPitch: 1,
14088  Serif: 2,
14089  Symbolic: 4,
14090  Script: 8,
14091  Nonsymbolic: 32,
14092  Italic: 64,
14093  AllCap: 65536,
14094  SmallCap: 131072,
14095  ForceBold: 262144
14096};
14097
14098var Encodings = {
14099  ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14100    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14101    'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',
14102    'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
14103    'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
14104    'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
14105    'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
14106    'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',
14107    'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',
14108    'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',
14109    'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',
14110    'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',
14111    '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',
14112    'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
14113    'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
14114    'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
14115    'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
14116    'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
14117    'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',
14118    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14119    '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
14120    '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
14121    'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
14122    'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
14123    'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
14124    'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
14125    'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
14126    'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
14127    'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
14128    'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
14129    'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
14130    'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
14131    'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
14132    'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
14133    'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
14134    'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
14135    'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
14136    'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
14137    'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
14138    'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
14139    'Ydieresissmall'],
14140  MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
14141    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14142    'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',
14143    'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
14144    'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
14145    'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',
14146    'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',
14147    'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',
14148    'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',
14149    'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',
14150    'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
14151    'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',
14152    'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
14153    'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',
14154    'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
14155    'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
14156    'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
14157    'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
14158    'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',
14159    'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',
14160    'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
14161    'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
14162    'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
14163    'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
14164    'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
14165    'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
14166    'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
14167    'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
14168    'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
14169    'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
14170    'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
14171    'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
14172    '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',
14173    'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',
14174    'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
14175    'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',
14176    'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',
14177    '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',
14178    'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',
14179    'periodsuperior', 'Dotaccentsmall', 'Ringsmall'],
14180  MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14181    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14182    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
14183    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
14184    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
14185    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
14186    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
14187    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
14188    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
14189    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
14190    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
14191    'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '',
14192    'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',
14193    'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',
14194    'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
14195    'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',
14196    'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',
14197    'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',
14198    'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',
14199    'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',
14200    'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',
14201    'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',
14202    'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',
14203    'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',
14204    'guillemotright', 'ellipsis', '', 'Agrave', 'Atilde', 'Otilde', 'OE',
14205    'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',
14206    'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',
14207    'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
14208    'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
14209    'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
14210    'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
14211    'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
14212    'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',
14213    'ogonek', 'caron'],
14214  StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14215    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14216    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
14217    'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
14218    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
14219    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
14220    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
14221    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
14222    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
14223    'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f',
14224    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
14225    'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
14226    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14227    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',
14228    'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
14229    'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
14230    'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
14231    'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
14232    'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
14233    'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
14234    'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',
14235    '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',
14236    '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',
14237    '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
14238    '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
14239  WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14240    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14241    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
14242    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
14243    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
14244    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
14245    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
14246    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
14247    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
14248    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
14249    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
14250    'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
14251    'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',
14252    'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
14253    'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',
14254    'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',
14255    'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',
14256    'zcaron', 'Ydieresis', '', 'exclamdown', 'cent', 'sterling',
14257    'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',
14258    'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',
14259    'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',
14260    'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',
14261    'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',
14262    'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',
14263    'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
14264    'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',
14265    'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',
14266    'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',
14267    'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',
14268    'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',
14269    'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
14270    'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
14271    'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
14272    'ydieresis'],
14273  symbolsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14274    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14275    'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',
14276    'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',
14277    'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
14278    'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
14279    'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',
14280    'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',
14281    'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',
14282    'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',
14283    'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',
14284    'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',
14285    'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',
14286    'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',
14287    'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',
14288    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14289    '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',
14290    'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',
14291    'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',
14292    'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',
14293    'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',
14294    'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',
14295    'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',
14296    'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',
14297    'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',
14298    'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',
14299    'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',
14300    'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',
14301    'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',
14302    'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',
14303    'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',
14304    'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',
14305    '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
14306    'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
14307    'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
14308    'bracerightbt'],
14309  zapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
14310    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14311    'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',
14312    'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',
14313    'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',
14314    'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',
14315    'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',
14316    'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',
14317    'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',
14318    'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',
14319    'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',
14320    'a98', 'a99', 'a100', '', '', '', '', '', '', '', '', '', '', '', '', '',
14321    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14322    '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112',
14323    'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125',
14324    'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134',
14325    'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143',
14326    'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152',
14327    'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161',
14328    'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169',
14329    'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177',
14330    'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201',
14331    'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187',
14332    'a188', 'a189', 'a190', 'a191']
14333};
14334
14335/**
14336 * Hold a map of decoded fonts and of the standard fourteen Type1
14337 * fonts and their acronyms.
14338 */
14339var stdFontMap = {
14340  'ArialNarrow': 'Helvetica',
14341  'ArialNarrow-Bold': 'Helvetica-Bold',
14342  'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
14343  'ArialNarrow-Italic': 'Helvetica-Oblique',
14344  'ArialBlack': 'Helvetica',
14345  'ArialBlack-Bold': 'Helvetica-Bold',
14346  'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
14347  'ArialBlack-Italic': 'Helvetica-Oblique',
14348  'Arial': 'Helvetica',
14349  'Arial-Bold': 'Helvetica-Bold',
14350  'Arial-BoldItalic': 'Helvetica-BoldOblique',
14351  'Arial-Italic': 'Helvetica-Oblique',
14352  'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
14353  'Arial-BoldMT': 'Helvetica-Bold',
14354  'Arial-ItalicMT': 'Helvetica-Oblique',
14355  'ArialMT': 'Helvetica',
14356  'Courier-Bold': 'Courier-Bold',
14357  'Courier-BoldItalic': 'Courier-BoldOblique',
14358  'Courier-Italic': 'Courier-Oblique',
14359  'CourierNew': 'Courier',
14360  'CourierNew-Bold': 'Courier-Bold',
14361  'CourierNew-BoldItalic': 'Courier-BoldOblique',
14362  'CourierNew-Italic': 'Courier-Oblique',
14363  'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
14364  'CourierNewPS-BoldMT': 'Courier-Bold',
14365  'CourierNewPS-ItalicMT': 'Courier-Oblique',
14366  'CourierNewPSMT': 'Courier',
14367  'Helvetica-Bold': 'Helvetica-Bold',
14368  'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
14369  'Helvetica-Italic': 'Helvetica-Oblique',
14370  'Symbol-Bold': 'Symbol',
14371  'Symbol-BoldItalic': 'Symbol',
14372  'Symbol-Italic': 'Symbol',
14373  'TimesNewRoman': 'Times-Roman',
14374  'TimesNewRoman-Bold': 'Times-Bold',
14375  'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
14376  'TimesNewRoman-Italic': 'Times-Italic',
14377  'TimesNewRomanPS': 'Times-Roman',
14378  'TimesNewRomanPS-Bold': 'Times-Bold',
14379  'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
14380  'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
14381  'TimesNewRomanPS-BoldMT': 'Times-Bold',
14382  'TimesNewRomanPS-Italic': 'Times-Italic',
14383  'TimesNewRomanPS-ItalicMT': 'Times-Italic',
14384  'TimesNewRomanPSMT': 'Times-Roman',
14385  'TimesNewRomanPSMT-Bold': 'Times-Bold',
14386  'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
14387  'TimesNewRomanPSMT-Italic': 'Times-Italic'
14388};
14389
14390/**
14391 * Holds the map of the non-standard fonts that might be included as a standard
14392 * fonts without glyph data.
14393 */
14394var nonStdFontMap = {
14395  'ComicSansMS': 'Comic Sans MS',
14396  'ComicSansMS-Bold': 'Comic Sans MS-Bold',
14397  'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic',
14398  'ComicSansMS-Italic': 'Comic Sans MS-Italic',
14399  'LucidaConsole': 'Courier',
14400  'LucidaConsole-Bold': 'Courier-Bold',
14401  'LucidaConsole-BoldItalic': 'Courier-BoldOblique',
14402  'LucidaConsole-Italic': 'Courier-Oblique'
14403};
14404
14405var serifFonts = {
14406  'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
14407  'Aldus': true, 'Alexandria': true, 'Algerian': true,
14408  'American Typewriter': true, 'Antiqua': true, 'Apex': true,
14409  'Arno': true, 'Aster': true, 'Aurora': true,
14410  'Baskerville': true, 'Bell': true, 'Bembo': true,
14411  'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
14412  'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
14413  'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
14414  'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
14415  'Calvert': true, 'Capitals': true, 'Cambria': true,
14416  'Cartier': true, 'Caslon': true, 'Catull': true,
14417  'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
14418  'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
14419  'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
14420  'Cochin': true, 'Colonna': true, 'Computer Modern': true,
14421  'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
14422  'Corona': true, 'Ecotype': true, 'Egyptienne': true,
14423  'Elephant': true, 'Excelsior': true, 'Fairfield': true,
14424  'FF Scala': true, 'Folkard': true, 'Footlight': true,
14425  'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
14426  'Gentium': true, 'Georgia': true, 'Gloucester': true,
14427  'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
14428  'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
14429  'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
14430  'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
14431  'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
14432  'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
14433  'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
14434  'Lucida Bright': true, 'Melior': true, 'Memphis': true,
14435  'Miller': true, 'Minion': true, 'Modern': true,
14436  'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
14437  'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
14438  'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
14439  'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
14440  'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
14441  'Requiem': true, 'Rockwell': true, 'Roman': true,
14442  'Rotis Serif': true, 'Sabon': true, 'Scala': true,
14443  'Seagull': true, 'Sistina': true, 'Souvenir': true,
14444  'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
14445  'Sylfaen': true, 'Times': true, 'Trajan': true,
14446  'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,
14447  'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
14448  'Versailles': true, 'Wanted': true, 'Weiss': true,
14449  'Wide Latin': true, 'Windsor': true, 'XITS': true
14450};
14451
14452var symbolsFonts = {
14453  'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true
14454};
14455
14456// Some characters, e.g. copyrightserif, mapped to the private use area and
14457// might not be displayed using standard fonts. Mapping/hacking well-known chars
14458// to the similar equivalents in the normal characters range.
14459function mapPrivateUseChars(code) {
14460  switch (code) {
14461    case 0xF8E9: // copyrightsans
14462    case 0xF6D9: // copyrightserif
14463      return 0x00A9; // copyright
14464    default:
14465      return code;
14466  }
14467}
14468
14469var FontLoader = {
14470  listeningForFontLoad: false,
14471
14472  bind: function fontLoaderBind(fonts, callback) {
14473    function checkFontsLoaded() {
14474      for (var i = 0, ii = fonts.length; i < ii; i++) {
14475        var fontObj = fonts[i];
14476        if (fontObj.loading) {
14477          return false;
14478        }
14479      }
14480
14481      PdfJS_window.document.documentElement.removeEventListener(
14482        'pdfjsFontLoad', checkFontsLoaded, false);
14483
14484      callback();
14485      return true;
14486    }
14487
14488    var rules = [], names = [], fontsToLoad = [];
14489    var fontCreateTimer = 0;
14490
14491    for (var i = 0, ii = fonts.length; i < ii; i++) {
14492      var font = fonts[i];
14493
14494      // Add the font to the DOM only once or skip if the font
14495      // is already loaded.
14496      if (font.attached || font.loading == false) {
14497        continue;
14498      }
14499      font.attached = true;
14500
14501      fontsToLoad.push(font);
14502
14503      var str = '';
14504      var data = font.data;
14505      if (data) {
14506        var length = data.length;
14507        for (var j = 0; j < length; j++)
14508          str += String.fromCharCode(data[j]);
14509
14510        var rule = font.bindDOM(str);
14511        if (rule) {
14512          rules.push(rule);
14513          names.push(font.loadedName);
14514        }
14515      }
14516    }
14517
14518    this.listeningForFontLoad = false;
14519    if (!isWorker && rules.length) {
14520      FontLoader.prepareFontLoadEvent(rules, names, fontsToLoad);
14521    }
14522
14523    if (!checkFontsLoaded()) {
14524      PdfJS_window.document.documentElement.addEventListener(
14525        'pdfjsFontLoad', checkFontsLoaded, false);
14526    }
14527  },
14528  // Set things up so that at least one pdfjsFontLoad event is
14529  // dispatched when all the @font-face |rules| for |names| have been
14530  // loaded in a subdocument.  It's expected that the load of |rules|
14531  // has already started in this (outer) document, so that they should
14532  // be ordered before the load in the subdocument.
14533  prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names,
14534                                                                fonts) {
14535      /** Hack begin */
14536      // There's no event when a font has finished downloading so the
14537      // following code is a dirty hack to 'guess' when a font is
14538      // ready.  This code will be obsoleted by Mozilla bug 471915.
14539      //
14540      // The only reliable way to know if a font is loaded in Gecko
14541      // (at the moment) is document.onload in a document with
14542      // a @font-face rule defined in a "static" stylesheet.  We use a
14543      // subdocument in an <iframe>, set up properly, to know when
14544      // our @font-face rule was loaded.  However, the subdocument and
14545      // outer document can't share CSS rules, so the inner document
14546      // is only part of the puzzle.  The second piece is an invisible
14547      // div created in order to force loading of the @font-face in
14548      // the *outer* document.  (The font still needs to be loaded for
14549      // its metrics, for reflow).  We create the div first for the
14550      // outer document, then create the iframe.  Unless something
14551      // goes really wonkily, we expect the @font-face for the outer
14552      // document to be processed before the inner.  That's still
14553      // fragile, but seems to work in practice.
14554      //
14555      // The postMessage() hackery was added to work around chrome bug
14556      // 82402.
14557
14558      // Validate the names parameter -- the values can used to construct HTML.
14559      if (!/^\w+$/.test(names.join(''))) {
14560        error('Invalid font name(s): ' + names.join());
14561
14562        // Normally the error-function throws. But if a malicious code
14563        // intercepts the function call then the return is needed.
14564        return;
14565      }
14566
14567      var div = PdfJS_window.document.createElement('div');
14568      div.setAttribute('style',
14569                       'visibility: hidden;' +
14570                       'width: 10px; height: 10px;' +
14571                       'position: absolute; top: 0px; left: 0px;');
14572      var html = '';
14573      for (var i = 0, ii = names.length; i < ii; ++i) {
14574        html += '<span style="font-family:' + names[i] + '">Hi</span>';
14575      }
14576      div.innerHTML = html;
14577      PdfJS_window.document.body.appendChild(div);
14578
14579      if (!this.listeningForFontLoad) {
14580        PdfJS_window.window.addEventListener(
14581          'message',
14582          function fontLoaderMessage(e) {
14583            var fontNames = JSON.parse(e.data);
14584            for (var i = 0, ii = fonts.length; i < ii; ++i) {
14585              var font = fonts[i];
14586              font.loading = false;
14587            }
14588            var evt = PdfJS_window.document.createEvent('Events');
14589            evt.initEvent('pdfjsFontLoad', true, false);
14590            PdfJS_window.document.documentElement.dispatchEvent(evt);
14591          },
14592          false);
14593        this.listeningForFontLoad = true;
14594      }
14595
14596      // XXX we should have a time-out here too, and maybe fire
14597      // pdfjsFontLoadFailed?
14598      var src = '<!DOCTYPE HTML><html><head>';
14599      src += '<style type="text/css">';
14600      for (var i = 0, ii = rules.length; i < ii; ++i) {
14601        src += rules[i];
14602      }
14603      src += '</style>';
14604      src += '<script type="application/javascript">';
14605      var fontNamesArray = '';
14606      for (var i = 0, ii = names.length; i < ii; ++i) {
14607        fontNamesArray += '"' + names[i] + '", ';
14608      }
14609      src += '  var fontNames=[' + fontNamesArray + '];\n';
14610      src += '  PdfJS_window.window.onload = function fontLoaderOnload() {\n';
14611      src += '    parent.postMessage(JSON.stringify(fontNames), "*");\n';
14612      src += '  }';
14613      // Hack so the end script tag isn't counted if this is inline JS.
14614      src += '</scr' + 'ipt></head><body>';
14615      for (var i = 0, ii = names.length; i < ii; ++i) {
14616        src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>';
14617      }
14618      src += '</body></html>';
14619      var frame = PdfJS_window.document.createElement('iframe');
14620      frame.src = 'data:text/html,' + src;
14621      frame.setAttribute('style',
14622                         'visibility: hidden;' +
14623                         'width: 10px; height: 10px;' +
14624                         'position: absolute; top: 0px; left: 0px;');
14625      PdfJS_window.document.body.appendChild(frame);
14626      /** Hack end */
14627  }
14628};
14629
14630var UnicodeRanges = [
14631  { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
14632  { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
14633  { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
14634  { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
14635  { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
14636  { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
14637  { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
14638  { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
14639  { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
14640  { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
14641  { 'begin': 0x0530, 'end': 0x058F }, // Armenian
14642  { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
14643  { 'begin': 0xA500, 'end': 0xA63F }, // Vai
14644  { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
14645  { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
14646  { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
14647  { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
14648  { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
14649  { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
14650  { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
14651  { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
14652  { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
14653  { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
14654  { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
14655  { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
14656  { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
14657  { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
14658  { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
14659  { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
14660  { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
14661  { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
14662  { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
14663  { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
14664  { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
14665  { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
14666  { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
14667  { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
14668  { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
14669  { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
14670  { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
14671  { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
14672  { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
14673  { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
14674  { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
14675  { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
14676  { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
14677  { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
14678  { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
14679  { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
14680  { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
14681  { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
14682  { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
14683  { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
14684  { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
14685  { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
14686  { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
14687  { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
14688  { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
14689  { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
14690  { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
14691  { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
14692  { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
14693  { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
14694  { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
14695  { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
14696  { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
14697  { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
14698  { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
14699  { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
14700  { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
14701  { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
14702  { 'begin': 0x0700, 'end': 0x074F }, // Syriac
14703  { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
14704  { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
14705  { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
14706  { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
14707  { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
14708  { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
14709  { 'begin': 0x1680, 'end': 0x169F }, // Ogham
14710  { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
14711  { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
14712  { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
14713  { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
14714  { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
14715  { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
14716  { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
14717  { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
14718  { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
14719  { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
14720  { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
14721  { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
14722  { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
14723  { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
14724  { 'begin': 0x1900, 'end': 0x194F }, // Limbu
14725  { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
14726  { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
14727  { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
14728  { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
14729  { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
14730  { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
14731  { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
14732  { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
14733  { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
14734  { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
14735  { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
14736  { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
14737  { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
14738  { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
14739  { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
14740  { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
14741  { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
14742  { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
14743  { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
14744  { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
14745  { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
14746  { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
14747  { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
14748  { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
14749  { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
14750  { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
14751  { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
14752  { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
14753  { 'begin': 0x1F030, 'end': 0x1F09F }  // Domino Tiles
14754];
14755
14756var MacStandardGlyphOrdering = [
14757  '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
14758  'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
14759  'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
14760  'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
14761  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
14762  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
14763  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',
14764  'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',
14765  'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
14766  'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
14767  'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
14768  'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
14769  'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
14770  'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
14771  'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
14772  'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
14773  'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
14774  'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
14775  'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
14776  'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
14777  'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
14778  'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
14779  'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
14780  'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
14781  'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
14782  'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
14783  'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
14784  'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
14785  'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
14786  'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
14787  'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
14788  'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
14789  'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
14790  'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
14791  'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
14792  'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
14793
14794function getUnicodeRangeFor(value) {
14795  for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
14796    var range = UnicodeRanges[i];
14797    if (value >= range.begin && value < range.end)
14798      return i;
14799  }
14800  return -1;
14801}
14802
14803function isRTLRangeFor(value) {
14804  var range = UnicodeRanges[13];
14805  if (value >= range.begin && value < range.end)
14806    return true;
14807  range = UnicodeRanges[11];
14808  if (value >= range.begin && value < range.end)
14809    return true;
14810  return false;
14811}
14812
14813function isSpecialUnicode(unicode) {
14814  return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ||
14815    (unicode >= kCmapGlyphOffset &&
14816    unicode < kCmapGlyphOffset + kSizeOfGlyphArea);
14817}
14818
14819/**
14820 * 'Font' is the class the outside world should use, it encapsulate all the font
14821 * decoding logics whatever type it is (assuming the font type is supported).
14822 *
14823 * For example to read a Type1 font and to attach it to the document:
14824 *   var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
14825 *   type1Font.bind();
14826 */
14827var Font = (function FontClosure() {
14828  function Font(name, file, properties) {
14829    this.name = name;
14830    this.coded = properties.coded;
14831    this.charProcOperatorList = properties.charProcOperatorList;
14832    this.sizes = [];
14833
14834    var names = name.split('+');
14835    names = names.length > 1 ? names[1] : names[0];
14836    names = names.split(/[-,_]/g)[0];
14837    this.isSerifFont = !!(properties.flags & FontFlags.Serif);
14838    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
14839
14840    var type = properties.type;
14841    this.type = type;
14842
14843    // If the font is to be ignored, register it like an already loaded font
14844    // to avoid the cost of waiting for it be be loaded by the platform.
14845    if (properties.ignore) {
14846      this.loadedName = this.isSerifFont ? 'serif' : 'sans-serif';
14847      this.loading = false;
14848      return;
14849    }
14850
14851    this.differences = properties.differences;
14852    this.widths = properties.widths;
14853    this.defaultWidth = properties.defaultWidth;
14854    this.composite = properties.composite;
14855    this.wideChars = properties.wideChars;
14856    this.hasEncoding = properties.hasEncoding;
14857
14858    this.fontMatrix = properties.fontMatrix;
14859    this.widthMultiplier = 1.0;
14860    if (properties.type == 'Type3') {
14861      this.encoding = properties.baseEncoding;
14862      return;
14863    }
14864
14865    // Trying to fix encoding using glyph CIDSystemInfo.
14866    this.loadCidToUnicode(properties);
14867
14868    if (properties.toUnicode)
14869      this.toUnicode = properties.toUnicode;
14870    else
14871      this.rebuildToUnicode(properties);
14872
14873    this.toFontChar = this.buildToFontChar(this.toUnicode);
14874
14875    if (!file) {
14876      // The file data is not specified. Trying to fix the font name
14877      // to be used with the canvas.font.
14878      var fontName = name.replace(/[,_]/g, '-');
14879      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
14880
14881      this.bold = (fontName.search(/bold/gi) != -1);
14882      this.italic = (fontName.search(/oblique/gi) != -1) ||
14883                    (fontName.search(/italic/gi) != -1);
14884
14885      // Use 'name' instead of 'fontName' here because the original
14886      // name ArialBlack for example will be replaced by Helvetica.
14887      this.black = (name.search(/Black/g) != -1);
14888
14889      this.encoding = properties.baseEncoding;
14890      this.noUnicodeAdaptation = true;
14891      this.loadedName = fontName.split('-')[0];
14892      this.loading = false;
14893      return;
14894    }
14895
14896    var data;
14897    switch (type) {
14898      case 'Type1':
14899      case 'CIDFontType0':
14900        this.mimetype = 'font/opentype';
14901
14902        var subtype = properties.subtype;
14903        var cff = (subtype == 'Type1C' || subtype == 'CIDFontType0C') ?
14904          new CFFFont(file, properties) : new Type1Font(name, file, properties);
14905
14906        // Wrap the CFF data inside an OTF font file
14907        data = this.convert(name, cff, properties);
14908        break;
14909
14910      case 'TrueType':
14911      case 'CIDFontType2':
14912        this.mimetype = 'font/opentype';
14913
14914        // Repair the TrueType file. It is can be damaged in the point of
14915        // view of the sanitizer
14916        data = this.checkAndRepair(name, file, properties);
14917        break;
14918
14919      default:
14920        warn('Font ' + properties.type + ' is not supported');
14921        break;
14922    }
14923
14924    this.data = data;
14925    this.fontMatrix = properties.fontMatrix;
14926    this.widthMultiplier = !properties.fontMatrix ? 1.0 :
14927      1.0 / properties.fontMatrix[0];
14928    this.encoding = properties.baseEncoding;
14929    this.loadedName = properties.loadedName;
14930    this.loading = true;
14931  };
14932
14933  var numFonts = 0;
14934  function getUniqueName() {
14935    return 'pdfFont' + numFonts++;
14936  }
14937
14938  function stringToArray(str) {
14939    var array = [];
14940    for (var i = 0, ii = str.length; i < ii; ++i)
14941      array[i] = str.charCodeAt(i);
14942
14943    return array;
14944  };
14945
14946  function arrayToString(arr) {
14947    var str = '';
14948    for (var i = 0, ii = arr.length; i < ii; ++i)
14949      str += String.fromCharCode(arr[i]);
14950
14951    return str;
14952  };
14953
14954  function int16(bytes) {
14955    return (bytes[0] << 8) + (bytes[1] & 0xff);
14956  };
14957
14958  function int32(bytes) {
14959    return (bytes[0] << 24) + (bytes[1] << 16) +
14960           (bytes[2] << 8) + (bytes[3] & 0xff);
14961  };
14962
14963  function getMaxPower2(number) {
14964    var maxPower = 0;
14965    var value = number;
14966    while (value >= 2) {
14967      value /= 2;
14968      maxPower++;
14969    }
14970
14971    value = 2;
14972    for (var i = 1; i < maxPower; i++)
14973      value *= 2;
14974    return value;
14975  };
14976
14977  function string16(value) {
14978    return String.fromCharCode((value >> 8) & 0xff) +
14979           String.fromCharCode(value & 0xff);
14980  };
14981
14982  function safeString16(value) {
14983    // clamp value to the 16-bit int range
14984    value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value;
14985    return String.fromCharCode((value >> 8) & 0xff) +
14986           String.fromCharCode(value & 0xff);
14987  };
14988
14989  function string32(value) {
14990    return String.fromCharCode((value >> 24) & 0xff) +
14991           String.fromCharCode((value >> 16) & 0xff) +
14992           String.fromCharCode((value >> 8) & 0xff) +
14993           String.fromCharCode(value & 0xff);
14994  };
14995
14996  function createOpenTypeHeader(sfnt, file, numTables) {
14997    // Windows hates the Mac TrueType sfnt version number
14998    if (sfnt == 'true')
14999      sfnt = string32(0x00010000);
15000
15001    // sfnt version (4 bytes)
15002    var header = sfnt;
15003
15004    // numTables (2 bytes)
15005    header += string16(numTables);
15006
15007    // searchRange (2 bytes)
15008    var tablesMaxPower2 = getMaxPower2(numTables);
15009    var searchRange = tablesMaxPower2 * 16;
15010    header += string16(searchRange);
15011
15012    // entrySelector (2 bytes)
15013    header += string16(Math.log(tablesMaxPower2) / Math.log(2));
15014
15015    // rangeShift (2 bytes)
15016    header += string16(numTables * 16 - searchRange);
15017
15018    file.file += header;
15019    file.virtualOffset += header.length;
15020  };
15021
15022  function createTableEntry(file, tag, data) {
15023    // offset
15024    var offset = file.virtualOffset;
15025
15026    // length
15027    var length = data.length;
15028
15029    // Per spec tables must be 4-bytes align so add padding as needed
15030    while (data.length & 3)
15031      data.push(0x00);
15032
15033    while (file.virtualOffset & 3)
15034      file.virtualOffset++;
15035
15036    // checksum
15037    var checksum = 0, n = data.length;
15038    for (var i = 0; i < n; i += 4)
15039      checksum = (checksum + int32([data[i], data[i + 1], data[i + 2],
15040                                    data[i + 3]])) | 0;
15041
15042    var tableEntry = (tag + string32(checksum) +
15043                      string32(offset) + string32(length));
15044    file.file += tableEntry;
15045    file.virtualOffset += data.length;
15046  };
15047
15048  function getRanges(glyphs) {
15049    // Array.sort() sorts by characters, not numerically, so convert to an
15050    // array of characters.
15051    var codes = [];
15052    var length = glyphs.length;
15053    for (var n = 0; n < length; ++n)
15054      codes.push({ unicode: glyphs[n].unicode, code: n });
15055    codes.sort(function fontGetRangesSort(a, b) {
15056      return a.unicode - b.unicode;
15057    });
15058
15059    // Split the sorted codes into ranges.
15060    var ranges = [];
15061    for (var n = 0; n < length; ) {
15062      var start = codes[n].unicode;
15063      var codeIndices = [codes[n].code];
15064      ++n;
15065      var end = start;
15066      while (n < length && end + 1 == codes[n].unicode) {
15067        codeIndices.push(codes[n].code);
15068        ++end;
15069        ++n;
15070      }
15071      ranges.push([start, end, codeIndices]);
15072    }
15073
15074    return ranges;
15075  };
15076
15077  function createCMapTable(glyphs, deltas) {
15078    var ranges = getRanges(glyphs);
15079
15080    var numTables = 1;
15081    var cmap = '\x00\x00' + // version
15082               string16(numTables) +  // numTables
15083               '\x00\x03' + // platformID
15084               '\x00\x01' + // encodingID
15085               string32(4 + numTables * 8); // start of the table record
15086
15087    var segCount = ranges.length + 1;
15088    var segCount2 = segCount * 2;
15089    var searchRange = getMaxPower2(segCount) * 2;
15090    var searchEntry = Math.log(segCount) / Math.log(2);
15091    var rangeShift = 2 * segCount - searchRange;
15092
15093    // Fill up the 4 parallel arrays describing the segments.
15094    var startCount = '';
15095    var endCount = '';
15096    var idDeltas = '';
15097    var idRangeOffsets = '';
15098    var glyphsIds = '';
15099    var bias = 0;
15100
15101    if (deltas) {
15102      for (var i = 0; i < segCount - 1; i++) {
15103        var range = ranges[i];
15104        var start = range[0];
15105        var end = range[1];
15106        var offset = (segCount - i) * 2 + bias * 2;
15107        bias += (end - start + 1);
15108
15109        startCount += string16(start);
15110        endCount += string16(end);
15111        idDeltas += string16(0);
15112        idRangeOffsets += string16(offset);
15113
15114        var codes = range[2];
15115        for (var j = 0, jj = codes.length; j < jj; ++j)
15116          glyphsIds += string16(deltas[codes[j]]);
15117      }
15118    } else {
15119      for (var i = 0; i < segCount - 1; i++) {
15120        var range = ranges[i];
15121        var start = range[0];
15122        var end = range[1];
15123        var startCode = range[2][0];
15124
15125        startCount += string16(start);
15126        endCount += string16(end);
15127        idDeltas += string16((startCode - start + 1) & 0xFFFF);
15128        idRangeOffsets += string16(0);
15129      }
15130    }
15131
15132    endCount += '\xFF\xFF';
15133    startCount += '\xFF\xFF';
15134    idDeltas += '\x00\x01';
15135    idRangeOffsets += '\x00\x00';
15136
15137    var format314 = '\x00\x00' + // language
15138                    string16(segCount2) +
15139                    string16(searchRange) +
15140                    string16(searchEntry) +
15141                    string16(rangeShift) +
15142                    endCount + '\x00\x00' + startCount +
15143                    idDeltas + idRangeOffsets + glyphsIds;
15144
15145    return stringToArray(cmap +
15146                         '\x00\x04' + // format
15147                         string16(format314.length + 4) + // length
15148                         format314);
15149  };
15150
15151  function createOS2Table(properties, charstrings, override) {
15152    override = override || {
15153      unitsPerEm: 0,
15154      yMax: 0,
15155      yMin: 0,
15156      ascent: 0,
15157      descent: 0
15158    };
15159
15160    var ulUnicodeRange1 = 0;
15161    var ulUnicodeRange2 = 0;
15162    var ulUnicodeRange3 = 0;
15163    var ulUnicodeRange4 = 0;
15164
15165    var firstCharIndex = null;
15166    var lastCharIndex = 0;
15167
15168    if (charstrings) {
15169      for (var i = 0; i < charstrings.length; ++i) {
15170        var code = charstrings[i].unicode;
15171        if (firstCharIndex > code || !firstCharIndex)
15172          firstCharIndex = code;
15173        if (lastCharIndex < code)
15174          lastCharIndex = code;
15175
15176        var position = getUnicodeRangeFor(code);
15177        if (position < 32) {
15178          ulUnicodeRange1 |= 1 << position;
15179        } else if (position < 64) {
15180          ulUnicodeRange2 |= 1 << position - 32;
15181        } else if (position < 96) {
15182          ulUnicodeRange3 |= 1 << position - 64;
15183        } else if (position < 123) {
15184          ulUnicodeRange4 |= 1 << position - 96;
15185        } else {
15186          error('Unicode ranges Bits > 123 are reserved for internal usage');
15187        }
15188      }
15189    } else {
15190      // TODO
15191      firstCharIndex = 0;
15192      lastCharIndex = 255;
15193    }
15194
15195    var unitsPerEm = override.unitsPerEm || kPDFGlyphSpaceUnits;
15196    var typoAscent = override.ascent || properties.ascent;
15197    var typoDescent = override.descent || properties.descent;
15198    var winAscent = override.yMax || typoAscent;
15199    var winDescent = -override.yMin || -typoDescent;
15200
15201    // if there is a units per em value but no other override
15202    // then scale the calculated ascent
15203    if (unitsPerEm != kPDFGlyphSpaceUnits &&
15204        'undefined' == typeof(override.ascent)) {
15205      // if the font units differ to the PDF glyph space units
15206      // then scale up the values
15207      typoAscent = Math.round(typoAscent * unitsPerEm / kPDFGlyphSpaceUnits);
15208      typoDescent = Math.round(typoDescent * unitsPerEm / kPDFGlyphSpaceUnits);
15209      winAscent = typoAscent;
15210      winDescent = -typoDescent;
15211    }
15212
15213    return '\x00\x03' + // version
15214           '\x02\x24' + // xAvgCharWidth
15215           '\x01\xF4' + // usWeightClass
15216           '\x00\x05' + // usWidthClass
15217           '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
15218           '\x02\x8A' + // ySubscriptXSize
15219           '\x02\xBB' + // ySubscriptYSize
15220           '\x00\x00' + // ySubscriptXOffset
15221           '\x00\x8C' + // ySubscriptYOffset
15222           '\x02\x8A' + // ySuperScriptXSize
15223           '\x02\xBB' + // ySuperScriptYSize
15224           '\x00\x00' + // ySuperScriptXOffset
15225           '\x01\xDF' + // ySuperScriptYOffset
15226           '\x00\x31' + // yStrikeOutSize
15227           '\x01\x02' + // yStrikeOutPosition
15228           '\x00\x00' + // sFamilyClass
15229           '\x00\x00\x06' +
15230           String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
15231           '\x00\x00\x00\x00\x00\x00' + // Panose
15232           string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
15233           string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
15234           string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
15235           string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
15236           '\x2A\x32\x31\x2A' + // achVendID
15237           string16(properties.italicAngle ? 1 : 0) + // fsSelection
15238           string16(firstCharIndex ||
15239                    properties.firstChar) + // usFirstCharIndex
15240           string16(lastCharIndex || properties.lastChar) +  // usLastCharIndex
15241           string16(typoAscent) + // sTypoAscender
15242           string16(typoDescent) + // sTypoDescender
15243           '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
15244           string16(winAscent) + // usWinAscent
15245           string16(winDescent) + // usWinDescent
15246           '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
15247           '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
15248           string16(properties.xHeight) + // sxHeight
15249           string16(properties.capHeight) + // sCapHeight
15250           string16(0) + // usDefaultChar
15251           string16(firstCharIndex || properties.firstChar) + // usBreakChar
15252           '\x00\x03';  // usMaxContext
15253  };
15254
15255  function createPostTable(properties) {
15256    var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
15257    return '\x00\x03\x00\x00' + // Version number
15258           string32(angle) + // italicAngle
15259           '\x00\x00' + // underlinePosition
15260           '\x00\x00' + // underlineThickness
15261           string32(properties.fixedPitch) + // isFixedPitch
15262           '\x00\x00\x00\x00' + // minMemType42
15263           '\x00\x00\x00\x00' + // maxMemType42
15264           '\x00\x00\x00\x00' + // minMemType1
15265           '\x00\x00\x00\x00';  // maxMemType1
15266  };
15267
15268  function createNameTable(name) {
15269    var strings = [
15270      'Original licence',  // 0.Copyright
15271      name,                // 1.Font family
15272      'Unknown',           // 2.Font subfamily (font weight)
15273      'uniqueID',          // 3.Unique ID
15274      name,                // 4.Full font name
15275      'Version 0.11',      // 5.Version
15276      '',                  // 6.Postscript name
15277      'Unknown',           // 7.Trademark
15278      'Unknown',           // 8.Manufacturer
15279      'Unknown'            // 9.Designer
15280    ];
15281
15282    // Mac want 1-byte per character strings while Windows want
15283    // 2-bytes per character, so duplicate the names table
15284    var stringsUnicode = [];
15285    for (var i = 0, ii = strings.length; i < ii; i++) {
15286      var str = strings[i];
15287
15288      var strUnicode = '';
15289      for (var j = 0, jj = str.length; j < jj; j++)
15290        strUnicode += string16(str.charCodeAt(j));
15291      stringsUnicode.push(strUnicode);
15292    }
15293
15294    var names = [strings, stringsUnicode];
15295    var platforms = ['\x00\x01', '\x00\x03'];
15296    var encodings = ['\x00\x00', '\x00\x01'];
15297    var languages = ['\x00\x00', '\x04\x09'];
15298
15299    var namesRecordCount = strings.length * platforms.length;
15300    var nameTable =
15301      '\x00\x00' +                           // format
15302      string16(namesRecordCount) +           // Number of names Record
15303      string16(namesRecordCount * 12 + 6);   // Storage
15304
15305    // Build the name records field
15306    var strOffset = 0;
15307    for (var i = 0, ii = platforms.length; i < ii; i++) {
15308      var strs = names[i];
15309      for (var j = 0, jj = strs.length; j < jj; j++) {
15310        var str = strs[j];
15311        var nameRecord =
15312          platforms[i] + // platform ID
15313          encodings[i] + // encoding ID
15314          languages[i] + // language ID
15315          string16(j) + // name ID
15316          string16(str.length) +
15317          string16(strOffset);
15318        nameTable += nameRecord;
15319        strOffset += str.length;
15320      }
15321    }
15322
15323    nameTable += strings.join('') + stringsUnicode.join('');
15324    return nameTable;
15325  }
15326
15327  Font.prototype = {
15328    name: null,
15329    font: null,
15330    mimetype: null,
15331    encoding: null,
15332
15333    checkAndRepair: function Font_checkAndRepair(name, font, properties) {
15334      function readTableEntry(file) {
15335        var tag = file.getBytes(4);
15336        tag = String.fromCharCode(tag[0]) +
15337              String.fromCharCode(tag[1]) +
15338              String.fromCharCode(tag[2]) +
15339              String.fromCharCode(tag[3]);
15340
15341        var checksum = int32(file.getBytes(4));
15342        var offset = int32(file.getBytes(4));
15343        var length = int32(file.getBytes(4));
15344
15345        // Read the table associated data
15346        var previousPosition = file.pos;
15347        file.pos = file.start ? file.start : 0;
15348        file.skip(offset);
15349        var data = file.getBytes(length);
15350        file.pos = previousPosition;
15351
15352        if (tag == 'head') {
15353          // clearing checksum adjustment
15354          data[8] = data[9] = data[10] = data[11] = 0;
15355          data[17] |= 0x20; //Set font optimized for cleartype flag
15356        }
15357
15358        return {
15359          tag: tag,
15360          checksum: checksum,
15361          length: length,
15362          offset: offset,
15363          data: data
15364        };
15365      };
15366
15367      function readOpenTypeHeader(ttf) {
15368        return {
15369          version: arrayToString(ttf.getBytes(4)),
15370          numTables: int16(ttf.getBytes(2)),
15371          searchRange: int16(ttf.getBytes(2)),
15372          entrySelector: int16(ttf.getBytes(2)),
15373          rangeShift: int16(ttf.getBytes(2))
15374        };
15375      };
15376
15377      function createGlyphNameMap(glyphs, ids, properties) {
15378        var glyphNames = properties.glyphNames;
15379        if (!glyphNames) {
15380          properties.glyphNameMap = {};
15381          return;
15382        }
15383        var glyphsLength = glyphs.length;
15384        var glyphNameMap = {};
15385        var encoding = [];
15386        for (var i = 0; i < glyphsLength; ++i) {
15387          var glyphName = glyphNames[ids[i]];
15388          if (!glyphName)
15389            continue;
15390          var unicode = glyphs[i].unicode;
15391          glyphNameMap[glyphName] = unicode;
15392          var code = glyphs[i].code;
15393          encoding[code] = glyphName;
15394        }
15395        properties.glyphNameMap = glyphNameMap;
15396        if (!properties.hasEncoding)
15397          properties.baseEncoding = encoding;
15398      }
15399
15400      function readCMapTable(cmap, font) {
15401        var start = (font.start ? font.start : 0) + cmap.offset;
15402        font.pos = start;
15403
15404        var version = int16(font.getBytes(2));
15405        var numRecords = int16(font.getBytes(2));
15406
15407        var records = [];
15408        for (var i = 0; i < numRecords; i++) {
15409          records.push({
15410            platformID: int16(font.getBytes(2)),
15411            encodingID: int16(font.getBytes(2)),
15412            offset: int32(font.getBytes(4))
15413          });
15414        }
15415
15416        // Check that table are sorted by platformID then encodingID,
15417        records.sort(function fontReadCMapTableSort(a, b) {
15418          return ((a.platformID << 16) + a.encodingID) -
15419                 ((b.platformID << 16) + b.encodingID);
15420        });
15421
15422        var tables = [records[0]];
15423        for (var i = 1; i < numRecords; i++) {
15424          // The sanitizer will drop the font if 2 tables have the same
15425          // platformID and the same encodingID, this will be correct for
15426          // most cases but if the font has been made for Mac it could
15427          // exist a few platformID: 1, encodingID: 0 but with a different
15428          // language field and that's correct. But the sanitizer does not
15429          // seem to support this case.
15430          var current = records[i];
15431          var previous = records[i - 1];
15432          if (((current.platformID << 16) + current.encodingID) <=
15433             ((previous.platformID << 16) + previous.encodingID))
15434                continue;
15435          tables.push(current);
15436        }
15437
15438        var missing = numRecords - tables.length;
15439        if (missing) {
15440          numRecords = tables.length;
15441          var data = string16(version) + string16(numRecords);
15442
15443          for (var i = 0; i < numRecords; i++) {
15444            var table = tables[i];
15445            data += string16(table.platformID) +
15446                    string16(table.encodingID) +
15447                    string32(table.offset);
15448          }
15449
15450          for (var i = 0, ii = data.length; i < ii; i++)
15451            cmap.data[i] = data.charCodeAt(i);
15452        }
15453
15454        for (var i = 0; i < numRecords; i++) {
15455          var table = tables[i];
15456          font.pos = start + table.offset;
15457
15458          var format = int16(font.getBytes(2));
15459          var length = int16(font.getBytes(2));
15460          var language = int16(font.getBytes(2));
15461
15462          if (format == 0) {
15463            // Characters below 0x20 are controls characters that are hardcoded
15464            // into the platform so if some characters in the font are assigned
15465            // under this limit they will not be displayed so let's rewrite the
15466            // CMap.
15467            var glyphs = [];
15468            var ids = [];
15469            for (var j = 0; j < 256; j++) {
15470              var index = font.getByte();
15471              if (index) {
15472                glyphs.push({ unicode: j, code: j });
15473                ids.push(index);
15474              }
15475            }
15476            return {
15477              glyphs: glyphs,
15478              ids: ids,
15479              hasShortCmap: true
15480            };
15481          } else if (format == 4) {
15482            // re-creating the table in format 4 since the encoding
15483            // might be changed
15484            var segCount = (int16(font.getBytes(2)) >> 1);
15485            font.getBytes(6); // skipping range fields
15486            var segIndex, segments = [];
15487            for (segIndex = 0; segIndex < segCount; segIndex++) {
15488              segments.push({ end: int16(font.getBytes(2)) });
15489            }
15490            font.getBytes(2);
15491            for (segIndex = 0; segIndex < segCount; segIndex++) {
15492              segments[segIndex].start = int16(font.getBytes(2));
15493            }
15494
15495            for (segIndex = 0; segIndex < segCount; segIndex++) {
15496              segments[segIndex].delta = int16(font.getBytes(2));
15497            }
15498
15499            var offsetsCount = 0;
15500            for (segIndex = 0; segIndex < segCount; segIndex++) {
15501              var segment = segments[segIndex];
15502              var rangeOffset = int16(font.getBytes(2));
15503              if (!rangeOffset) {
15504                segment.offsetIndex = -1;
15505                continue;
15506              }
15507
15508              var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
15509              segment.offsetIndex = offsetIndex;
15510              offsetsCount = Math.max(offsetsCount, offsetIndex +
15511                segment.end - segment.start + 1);
15512            }
15513
15514            var offsets = [];
15515            for (var j = 0; j < offsetsCount; j++)
15516              offsets.push(int16(font.getBytes(2)));
15517
15518            var glyphs = [], ids = [];
15519
15520            for (segIndex = 0; segIndex < segCount; segIndex++) {
15521              var segment = segments[segIndex];
15522              var start = segment.start, end = segment.end;
15523              var delta = segment.delta, offsetIndex = segment.offsetIndex;
15524
15525              for (var j = start; j <= end; j++) {
15526                if (j == 0xFFFF)
15527                  continue;
15528
15529                var glyphCode = offsetIndex < 0 ? j :
15530                  offsets[offsetIndex + j - start];
15531                glyphCode = (glyphCode + delta) & 0xFFFF;
15532                if (glyphCode == 0)
15533                  continue;
15534
15535                glyphs.push({ unicode: j, code: j });
15536                ids.push(glyphCode);
15537              }
15538            }
15539
15540            return {
15541              glyphs: glyphs,
15542              ids: ids
15543            };
15544          } else if (format == 6) {
15545            // Format 6 is a 2-bytes dense mapping, which means the font data
15546            // lives glue together even if they are pretty far in the unicode
15547            // table. (This looks weird, so I can have missed something), this
15548            // works on Linux but seems to fails on Mac so let's rewrite the
15549            // cmap table to a 3-1-4 style
15550            var firstCode = int16(font.getBytes(2));
15551            var entryCount = int16(font.getBytes(2));
15552
15553            var glyphs = [];
15554            var ids = [];
15555            for (var j = 0; j < entryCount; j++) {
15556              var glyphCode = int16(font.getBytes(2));
15557              var code = firstCode + j;
15558
15559              glyphs.push({ unicode: code, code: code });
15560              ids.push(glyphCode);
15561            }
15562
15563            return {
15564              glyphs: glyphs,
15565              ids: ids
15566            };
15567          }
15568        }
15569        error('Unsupported cmap table format');
15570      };
15571
15572      function sanitizeMetrics(font, header, metrics, numGlyphs) {
15573        if (!header && !metrics)
15574          return;
15575
15576        // The vhea/vmtx tables are not required, so it happens that
15577        // some fonts embed a vmtx table without a vhea table. In this
15578        // situation the sanitizer assume numOfLongVerMetrics = 1. As
15579        // a result it tries to read numGlyphs - 1 SHORT from the vmtx
15580        // table, and if it is not possible, the font is rejected.
15581        // So remove the vmtx table if there is no vhea table.
15582        if (!header && metrics) {
15583          metrics.data = null;
15584          return;
15585        }
15586
15587        font.pos = (font.start ? font.start : 0) + header.offset;
15588        font.pos += header.length - 2;
15589        var numOfMetrics = int16(font.getBytes(2));
15590
15591        var numOfSidebearings = numGlyphs - numOfMetrics;
15592        var numMissing = numOfSidebearings -
15593          ((hmtx.length - numOfMetrics * 4) >> 1);
15594        if (numMissing > 0) {
15595          font.pos = (font.start ? font.start : 0) + metrics.offset;
15596          var entries = '';
15597          for (var i = 0, ii = hmtx.length; i < ii; i++)
15598            entries += String.fromCharCode(font.getByte());
15599          for (var i = 0; i < numMissing; i++)
15600            entries += '\x00\x00';
15601          metrics.data = stringToArray(entries);
15602        }
15603      };
15604
15605      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart) {
15606        if (sourceEnd - sourceStart <= 12) {
15607          // glyph with data less than 12 is invalid one
15608          return 0;
15609        }
15610        var glyf = source.subarray(sourceStart, sourceEnd);
15611        var contoursCount = (glyf[0] << 8) | glyf[1];
15612        if (contoursCount & 0x8000) {
15613          // complex glyph, writing as is
15614          dest.set(glyf, destStart);
15615          return glyf.length;
15616        }
15617
15618        var j = 10, flagsCount = 0;
15619        for (var i = 0; i < contoursCount; i++) {
15620          var endPoint = (glyf[j] << 8) | glyf[j + 1];
15621          flagsCount = endPoint + 1;
15622          j += 2;
15623        }
15624        // skipping instructions
15625        var instructionsLength = (glyf[j] << 8) | glyf[j + 1];
15626        j += 2 + instructionsLength;
15627        // validating flags
15628        var coordinatesLength = 0;
15629        for (var i = 0; i < flagsCount; i++) {
15630          var flag = glyf[j++];
15631          if (flag & 0xC0) {
15632            // reserved flags must be zero, rejecting
15633            return 0;
15634          }
15635          var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
15636                         ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
15637          coordinatesLength += xyLength;
15638          if (flag & 8) {
15639            var repeat = glyf[j++];
15640            i += repeat;
15641            coordinatesLength += repeat * xyLength;
15642          }
15643        }
15644        var glyphDataLength = j + coordinatesLength;
15645        if (glyphDataLength > glyf.length) {
15646          // not enough data for coordinates
15647          return 0;
15648        }
15649        if (glyf.length - glyphDataLength > 3) {
15650          // truncating and aligning to 4 bytes the long glyph data
15651          glyphDataLength = (glyphDataLength + 3) & ~3;
15652          dest.set(glyf.subarray(0, glyphDataLength), destStart);
15653          return glyphDataLength;
15654        }
15655        // glyph data is fine
15656        dest.set(glyf, destStart);
15657        return glyf.length;
15658      }
15659
15660      function sanitizeGlyphLocations(loca, glyf, numGlyphs,
15661                                      isGlyphLocationsLong) {
15662        var itemSize, itemDecode, itemEncode;
15663        if (isGlyphLocationsLong) {
15664          itemSize = 4;
15665          itemDecode = function fontItemDecodeLong(data, offset) {
15666            return (data[offset] << 24) | (data[offset + 1] << 16) |
15667                   (data[offset + 2] << 8) | data[offset + 3];
15668          };
15669          itemEncode = function fontItemEncodeLong(data, offset, value) {
15670            data[offset] = (value >>> 24) & 0xFF;
15671            data[offset + 1] = (value >> 16) & 0xFF;
15672            data[offset + 2] = (value >> 8) & 0xFF;
15673            data[offset + 3] = value & 0xFF;
15674          };
15675        } else {
15676          itemSize = 2;
15677          itemDecode = function fontItemDecode(data, offset) {
15678            return (data[offset] << 9) | (data[offset + 1] << 1);
15679          };
15680          itemEncode = function fontItemEncode(data, offset, value) {
15681            data[offset] = (value >> 9) & 0xFF;
15682            data[offset + 1] = (value >> 1) & 0xFF;
15683          };
15684        }
15685        var locaData = loca.data;
15686        // removing the invalid glyphs
15687        var oldGlyfData = glyf.data;
15688        var oldGlyfDataLength = oldGlyfData.length;
15689        var newGlyfData = new Uint8Array(oldGlyfDataLength);
15690        var startOffset = itemDecode(locaData, 0);
15691        var writeOffset = 0;
15692        itemEncode(locaData, 0, writeOffset);
15693        for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
15694          var endOffset = itemDecode(locaData, j);
15695          if (endOffset > oldGlyfDataLength) {
15696            // glyph end offset points outside glyf data, rejecting the glyph
15697            itemEncode(locaData, j, writeOffset);
15698            startOffset = endOffset;
15699            continue;
15700          }
15701
15702          var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
15703                                        newGlyfData, writeOffset);
15704          writeOffset += newLength;
15705          itemEncode(locaData, j, writeOffset);
15706          startOffset = endOffset;
15707        }
15708
15709        if (writeOffset == 0) {
15710          // glyf table cannot be empty -- redoing the glyf and loca tables
15711          // to have single glyph with one point
15712          var simpleGlyph = new Uint8Array(
15713            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
15714          for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize)
15715            itemEncode(locaData, j, simpleGlyph.length);
15716          glyf.data = simpleGlyph;
15717          return;
15718        }
15719
15720        glyf.data = newGlyfData.subarray(0, writeOffset);
15721      }
15722
15723      function findEmptyGlyphs(locaTable, isGlyphLocationsLong, emptyGlyphIds) {
15724        var itemSize, itemDecode;
15725        if (isGlyphLocationsLong) {
15726          itemSize = 4;
15727          itemDecode = function fontItemDecodeLong(data, offset) {
15728            return (data[offset] << 24) | (data[offset + 1] << 16) |
15729                   (data[offset + 2] << 8) | data[offset + 3];
15730          };
15731        } else {
15732          itemSize = 2;
15733          itemDecode = function fontItemDecode(data, offset) {
15734            return (data[offset] << 9) | (data[offset + 1] << 1);
15735          };
15736        }
15737        var data = locaTable.data, length = data.length;
15738        var lastOffset = itemDecode(data, 0);
15739        for (var i = itemSize, j = 0; i < length; i += itemSize, j++) {
15740          var offset = itemDecode(data, i);
15741          if (offset == lastOffset)
15742            emptyGlyphIds[j] = true;
15743          lastOffset = offset;
15744        }
15745      }
15746
15747      function readGlyphNameMap(post, properties) {
15748        var start = (font.start ? font.start : 0) + post.offset;
15749        font.pos = start;
15750
15751        var length = post.length, end = start + length;
15752        var version = int32(font.getBytes(4));
15753        // skip rest to the tables
15754        font.getBytes(28);
15755
15756        var glyphNames;
15757        switch (version) {
15758          case 0x00010000:
15759            glyphNames = MacStandardGlyphOrdering;
15760            break;
15761          case 0x00020000:
15762            var numGlyphs = int16(font.getBytes(2));
15763            var glyphNameIndexes = [];
15764            for (var i = 0; i < numGlyphs; ++i)
15765              glyphNameIndexes.push(int16(font.getBytes(2)));
15766            var customNames = [];
15767            while (font.pos < end) {
15768              var stringLength = font.getByte();
15769              var string = '';
15770              for (var i = 0; i < stringLength; ++i)
15771                string += font.getChar();
15772              customNames.push(string);
15773            }
15774            glyphNames = [];
15775            for (var i = 0; i < numGlyphs; ++i) {
15776              var j = glyphNameIndexes[i];
15777              if (j < 258) {
15778                glyphNames.push(MacStandardGlyphOrdering[j]);
15779                continue;
15780              }
15781              glyphNames.push(customNames[j - 258]);
15782            }
15783            break;
15784          case 0x00030000:
15785            break;
15786          default:
15787            warn('Unknown/unsupported post table version ' + version);
15788            break;
15789        }
15790        properties.glyphNames = glyphNames;
15791      }
15792
15793      function isOS2Valid(os2Table) {
15794        var data = os2Table.data;
15795        // usWinAscent == 0 makes font unreadable by windows
15796        var usWinAscent = (data[74] << 8) | data[75];
15797        if (usWinAscent == 0)
15798          return false;
15799
15800        return true;
15801      }
15802
15803      // Check that required tables are present
15804      var requiredTables = ['OS/2', 'cmap', 'head', 'hhea',
15805                             'hmtx', 'maxp', 'name', 'post'];
15806
15807      var header = readOpenTypeHeader(font);
15808      var numTables = header.numTables;
15809
15810      var cmap, post, maxp, hhea, hmtx, vhea, vmtx, head, loca, glyf, os2;
15811      var tables = [];
15812      for (var i = 0; i < numTables; i++) {
15813        var table = readTableEntry(font);
15814        var index = requiredTables.indexOf(table.tag);
15815        if (index != -1) {
15816          if (table.tag == 'cmap')
15817            cmap = table;
15818          else if (table.tag == 'post')
15819            post = table;
15820          else if (table.tag == 'maxp')
15821            maxp = table;
15822          else if (table.tag == 'hhea')
15823            hhea = table;
15824          else if (table.tag == 'hmtx')
15825            hmtx = table;
15826          else if (table.tag == 'head')
15827            head = table;
15828          else if (table.tag == 'OS/2')
15829            os2 = table;
15830
15831          requiredTables.splice(index, 1);
15832        } else {
15833          if (table.tag == 'vmtx')
15834            vmtx = table;
15835          else if (table.tag == 'vhea')
15836            vhea = table;
15837          else if (table.tag == 'loca')
15838            loca = table;
15839          else if (table.tag == 'glyf')
15840            glyf = table;
15841        }
15842        tables.push(table);
15843      }
15844
15845      var numTables = tables.length + requiredTables.length;
15846
15847      // header and new offsets. Table entry information is appended to the
15848      // end of file. The virtualOffset represents where to put the actual
15849      // data of a particular table;
15850      var ttf = {
15851        file: '',
15852        virtualOffset: numTables * (4 * 4)
15853      };
15854
15855      // The new numbers of tables will be the last one plus the num
15856      // of missing tables
15857      createOpenTypeHeader(header.version, ttf, numTables);
15858
15859      // Invalid OS/2 can break the font for the Windows
15860      if (os2 && !isOS2Valid(os2)) {
15861        tables.splice(tables.indexOf(os2), 1);
15862        os2 = null;
15863      }
15864
15865      // Ensure the [h/v]mtx tables contains the advance width and
15866      // sidebearings information for numGlyphs in the maxp table
15867      font.pos = (font.start || 0) + maxp.offset;
15868      var version = int16(font.getBytes(4));
15869      var numGlyphs = int16(font.getBytes(2));
15870
15871      sanitizeMetrics(font, hhea, hmtx, numGlyphs);
15872      sanitizeMetrics(font, vhea, vmtx, numGlyphs);
15873
15874      var isGlyphLocationsLong = int16([head.data[50], head.data[51]]);
15875      if (head && loca && glyf) {
15876        sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong);
15877      }
15878
15879      var emptyGlyphIds = [];
15880      if (glyf)
15881        findEmptyGlyphs(loca, isGlyphLocationsLong, emptyGlyphIds);
15882
15883      // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
15884      // Sometimes it's 0. That needs to be fixed
15885      if (hhea.data[10] == 0 && hhea.data[11] == 0) {
15886        hhea.data[10] = 0xFF;
15887        hhea.data[11] = 0xFF;
15888      }
15889
15890      // The 'post' table has glyphs names.
15891      if (post) {
15892        readGlyphNameMap(post, properties);
15893      }
15894
15895      var glyphs, ids;
15896      if (properties.type == 'CIDFontType2') {
15897        // Replace the old CMAP table with a shiny new one
15898        // Type2 composite fonts map characters directly to glyphs so the cmap
15899        // table must be replaced.
15900        // canvas fillText will reencode some characters even if the font has a
15901        // glyph at that position - e.g. newline is converted to a space and
15902        // U+00AD (soft hyphen) is not drawn.
15903        // So, offset all the glyphs by 0xFF to avoid these cases and use
15904        // the encoding to map incoming characters to the new glyph positions
15905        if (!cmap) {
15906          cmap = {
15907            tag: 'cmap',
15908            data: null
15909          };
15910          tables.push(cmap);
15911        }
15912
15913        var cidToGidMap = properties.cidToGidMap || [];
15914        var gidToCidMap = [0];
15915        if (cidToGidMap.length > 0) {
15916          for (var j = cidToGidMap.length - 1; j >= 0; j--) {
15917            var gid = cidToGidMap[j];
15918            if (gid)
15919              gidToCidMap[gid] = j;
15920          }
15921          // filling the gaps using CID above the CIDs currently used in font
15922          var nextCid = cidToGidMap.length;
15923          for (var i = 1; i < numGlyphs; i++) {
15924            if (!gidToCidMap[i])
15925              gidToCidMap[i] = nextCid++;
15926          }
15927        }
15928
15929        glyphs = [];
15930        ids = [];
15931
15932        var usedUnicodes = [];
15933        var unassignedUnicodeItems = [];
15934        for (var i = 1; i < numGlyphs; i++) {
15935          var cid = gidToCidMap[i] || i;
15936          var unicode = this.toFontChar[cid];
15937          if (!unicode || typeof unicode !== 'number' ||
15938              isSpecialUnicode(unicode) || unicode in usedUnicodes) {
15939            unassignedUnicodeItems.push(i);
15940            continue;
15941          }
15942          usedUnicodes[unicode] = true;
15943          glyphs.push({ unicode: unicode, code: cid });
15944          ids.push(i);
15945        }
15946        // trying to fit as many unassigned symbols as we can
15947        // in the range allocated for the user defined symbols
15948        var unusedUnicode = kCmapGlyphOffset;
15949        for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
15950          var i = unassignedUnicodeItems[j];
15951          var cid = gidToCidMap[i] || i;
15952          while (unusedUnicode in usedUnicodes)
15953            unusedUnicode++;
15954          if (unusedUnicode >= kCmapGlyphOffset + kSizeOfGlyphArea)
15955            break;
15956          var unicode = unusedUnicode++;
15957          this.toFontChar[cid] = unicode;
15958          usedUnicodes[unicode] = true;
15959          glyphs.push({ unicode: unicode, code: cid });
15960          ids.push(i);
15961        }
15962      } else {
15963        var cmapTable = readCMapTable(cmap, font);
15964
15965        glyphs = cmapTable.glyphs;
15966        ids = cmapTable.ids;
15967
15968        var hasShortCmap = !!cmapTable.hasShortCmap;
15969        var toFontChar = this.toFontChar;
15970
15971        if (hasShortCmap && ids.length == numGlyphs) {
15972          // Fixes the short cmap tables -- some generators use incorrect
15973          // glyph id.
15974          for (var i = 0, ii = ids.length; i < ii; i++)
15975            ids[i] = i;
15976        }
15977
15978        var unusedUnicode = kCmapGlyphOffset;
15979        var glyphNames = properties.glyphNames || [];
15980        var encoding = properties.baseEncoding;
15981        var differences = properties.differences;
15982        if (toFontChar && toFontChar.length > 0) {
15983          // checking if cmap is just identity map
15984          var isIdentity = true;
15985          for (var i = 0, ii = glyphs.length; i < ii; i++) {
15986            if (glyphs[i].unicode != i + 1) {
15987              isIdentity = false;
15988              break;
15989            }
15990          }
15991          // if it is, replacing with meaningful toUnicode values
15992          if (isIdentity && !this.isSymbolicFont) {
15993            var usedUnicodes = [], unassignedUnicodeItems = [];
15994            for (var i = 0, ii = glyphs.length; i < ii; i++) {
15995              var unicode = toFontChar[i + 1];
15996              if (!unicode || typeof unicode !== 'number' ||
15997                  unicode in usedUnicodes) {
15998                unassignedUnicodeItems.push(i);
15999                continue;
16000              }
16001              glyphs[i].unicode = unicode;
16002              usedUnicodes[unicode] = true;
16003            }
16004            for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
16005              var i = unassignedUnicodeItems[j];
16006              while (unusedUnicode in usedUnicodes)
16007                unusedUnicode++;
16008              var cid = i + 1;
16009              // override only if unicode mapping is not specified
16010              if (!(cid in toFontChar))
16011                toFontChar[cid] = unusedUnicode;
16012              glyphs[i].unicode = unusedUnicode++;
16013            }
16014            this.useToFontChar = true;
16015          }
16016        }
16017
16018        // remove glyph references outside range of avaialable glyphs or empty
16019        var glyphsRemoved = 0;
16020        for (var i = ids.length - 1; i >= 0; i--) {
16021          if (ids[i] < numGlyphs &&
16022              (!emptyGlyphIds[ids[i]] || this.isSymbolicFont))
16023            continue;
16024          ids.splice(i, 1);
16025          glyphs.splice(i, 1);
16026          glyphsRemoved++;
16027        }
16028
16029        // checking if it's a "true" symbolic font
16030        if (this.isSymbolicFont) {
16031          var minUnicode = 0xFFFF, maxUnicode = 0;
16032          for (var i = 0, ii = glyphs.length; i < ii; i++) {
16033            var unicode = glyphs[i].unicode;
16034            minUnicode = Math.min(minUnicode, unicode);
16035            maxUnicode = Math.max(maxUnicode, unicode);
16036          }
16037          // high byte must be the same for min and max unicodes
16038          if ((maxUnicode & 0xFF00) != (minUnicode & 0xFF00))
16039            this.isSymbolicFont = false;
16040        }
16041
16042        // heuristics: if removed more than 2 glyphs encoding WinAnsiEncoding
16043        // does not set properly
16044        if (glyphsRemoved > 2) {
16045          warn('Switching TrueType encoding to MacRomanEncoding for ' +
16046               this.name + ' font');
16047          encoding = Encodings.MacRomanEncoding;
16048        }
16049
16050        if (hasShortCmap && this.hasEncoding && !this.isSymbolicFont) {
16051          // Re-encode short map encoding to unicode -- that simplifies the
16052          // resolution of MacRoman encoded glyphs logic for TrueType fonts:
16053          // copying all characters to private use area, all mapping all known
16054          // glyphs to the unicodes. The glyphs and ids arrays will grow.
16055          var usedUnicodes = [];
16056          for (var i = 0, ii = glyphs.length; i < ii; i++) {
16057            var code = glyphs[i].unicode;
16058            var gid = ids[i];
16059            glyphs[i].unicode += kCmapGlyphOffset;
16060            toFontChar[code] = glyphs[i].unicode;
16061
16062            var glyphName = glyphNames[gid] || encoding[code];
16063            if (glyphName in GlyphsUnicode) {
16064              var unicode = GlyphsUnicode[glyphName];
16065              if (unicode in usedUnicodes)
16066                continue;
16067
16068              usedUnicodes[unicode] = true;
16069              glyphs.push({
16070                unicode: unicode,
16071                code: glyphs[i].code
16072              });
16073              ids.push(gid);
16074              toFontChar[code] = unicode;
16075            }
16076          }
16077          this.useToFontChar = true;
16078        } else if (!this.isSymbolicFont && (this.hasEncoding ||
16079                    properties.glyphNames || differences.length > 0)) {
16080          // Re-encode cmap encoding to unicode, based on the 'post' table data
16081          // diffrence array or base encoding
16082          var reverseMap = [];
16083          for (var i = 0, ii = glyphs.length; i < ii; i++)
16084            reverseMap[glyphs[i].unicode] = i;
16085
16086          var newGlyphUnicodes = [];
16087          for (var i = 0, ii = glyphs.length; i < ii; i++) {
16088            var code = glyphs[i].unicode;
16089            var changeCode = false;
16090            var gid = ids[i];
16091
16092            var glyphName = glyphNames[gid];
16093            if (!glyphName) {
16094              glyphName = differences[code] || encoding[code];
16095              changeCode = true;
16096            }
16097            if (glyphName in GlyphsUnicode) {
16098              var unicode = GlyphsUnicode[glyphName];
16099              if (!unicode || reverseMap[unicode] === i)
16100                continue; // unknown glyph name or in its own place
16101
16102              newGlyphUnicodes[i] = unicode;
16103              if (changeCode)
16104                toFontChar[code] = unicode;
16105              delete reverseMap[code];
16106            }
16107          }
16108          for (var index in newGlyphUnicodes) {
16109            var unicode = newGlyphUnicodes[index];
16110            if (reverseMap[unicode]) {
16111              // avoiding assigning to the same unicode
16112              glyphs[index].unicode = unusedUnicode++;
16113              continue;
16114            }
16115            glyphs[index].unicode = unicode;
16116            reverseMap[unicode] = index;
16117          }
16118          this.useToFontChar = true;
16119        }
16120
16121        // Moving all symbolic font glyphs into 0xF000 - 0xF0FF range.
16122        if (this.isSymbolicFont) {
16123          for (var i = 0, ii = glyphs.length; i < ii; i++) {
16124            var code = glyphs[i].unicode & 0xFF;
16125            var fontCharCode = kSymbolicFontGlyphOffset | code;
16126            glyphs[i].unicode = toFontChar[code] = fontCharCode;
16127          }
16128          this.useToFontChar = true;
16129        }
16130
16131        createGlyphNameMap(glyphs, ids, properties);
16132        this.glyphNameMap = properties.glyphNameMap;
16133      }
16134
16135      // Converting glyphs and ids into font's cmap table
16136      cmap.data = createCMapTable(glyphs, ids);
16137      var unicodeIsEnabled = [];
16138      for (var i = 0, ii = glyphs.length; i < ii; i++) {
16139        unicodeIsEnabled[glyphs[i].unicode] = true;
16140      }
16141      this.unicodeIsEnabled = unicodeIsEnabled;
16142
16143      if (!os2) {
16144        // extract some more font properties from the OpenType head and
16145        // hhea tables; yMin and descent value are always negative
16146        var override = {
16147          unitsPerEm: int16([head.data[18], head.data[19]]),
16148          yMax: int16([head.data[42], head.data[43]]),
16149          yMin: int16([head.data[38], head.data[39]]) - 0x10000,
16150          ascent: int16([hhea.data[4], hhea.data[5]]),
16151          descent: int16([hhea.data[6], hhea.data[7]]) - 0x10000
16152        };
16153
16154        tables.push({
16155          tag: 'OS/2',
16156          data: stringToArray(createOS2Table(properties, glyphs, override))
16157        });
16158      }
16159
16160      // Rewrite the 'post' table if needed
16161      if (requiredTables.indexOf('post') != -1) {
16162        tables.push({
16163          tag: 'post',
16164          data: stringToArray(createPostTable(properties))
16165        });
16166      }
16167
16168      // Rewrite the 'name' table if needed
16169      if (requiredTables.indexOf('name') != -1) {
16170        tables.push({
16171          tag: 'name',
16172          data: stringToArray(createNameTable(this.name))
16173        });
16174      }
16175
16176      // Tables needs to be written by ascendant alphabetic order
16177      tables.sort(function tables_sort(a, b) {
16178        return (a.tag > b.tag) - (a.tag < b.tag);
16179      });
16180
16181      // rewrite the tables but tweak offsets
16182      for (var i = 0, ii = tables.length; i < ii; i++) {
16183        var table = tables[i];
16184        var data = [];
16185
16186        var tableData = table.data;
16187        for (var j = 0, jj = tableData.length; j < jj; j++)
16188          data.push(tableData[j]);
16189        createTableEntry(ttf, table.tag, data);
16190      }
16191
16192      // Add the table datas
16193      for (var i = 0, ii = tables.length; i < ii; i++) {
16194        var table = tables[i];
16195        var tableData = table.data;
16196        ttf.file += arrayToString(tableData);
16197
16198        // 4-byte aligned data
16199        while (ttf.file.length & 3)
16200          ttf.file += String.fromCharCode(0);
16201      }
16202
16203      return stringToArray(ttf.file);
16204    },
16205
16206    convert: function Font_convert(fontName, font, properties) {
16207      function isFixedPitch(glyphs) {
16208        for (var i = 0, ii = glyphs.length - 1; i < ii; i++) {
16209          if (glyphs[i] != glyphs[i + 1])
16210            return false;
16211        }
16212        return true;
16213      }
16214
16215      // The offsets object holds at the same time a representation of where
16216      // to write the table entry information about a table and another offset
16217      // representing the offset where to draw the actual data of a particular
16218      // table
16219      var kRequiredTablesCount = 9;
16220
16221      var otf = {
16222        file: '',
16223        virtualOffset: 9 * (4 * 4)
16224      };
16225
16226      createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9);
16227
16228      var charstrings = font.charstrings;
16229      properties.fixedPitch = isFixedPitch(charstrings);
16230
16231      var glyphNameMap = {};
16232      for (var i = 0; i < charstrings.length; ++i) {
16233        var charstring = charstrings[i];
16234        glyphNameMap[charstring.glyph] = charstring.unicode;
16235      }
16236      this.glyphNameMap = glyphNameMap;
16237
16238      if (!properties.hasEncoding && (properties.subtype == 'Type1C' ||
16239          properties.subtype == 'CIDFontType0C')) {
16240        var encoding = [];
16241        for (var i = 0; i < charstrings.length; ++i) {
16242          var charstring = charstrings[i];
16243          encoding[charstring.code] = charstring.glyph;
16244        }
16245        properties.baseEncoding = encoding;
16246      }
16247      if (properties.subtype == 'CIDFontType0C') {
16248        var toFontChar = [];
16249        for (var i = 0; i < charstrings.length; ++i) {
16250          var charstring = charstrings[i];
16251          toFontChar[charstring.code] = charstring.unicode;
16252        }
16253        this.toFontChar = toFontChar;
16254      }
16255
16256      var fields = {
16257        // PostScript Font Program
16258        'CFF ': font.data,
16259
16260        // OS/2 and Windows Specific metrics
16261        'OS/2': stringToArray(createOS2Table(properties, charstrings)),
16262
16263        // Character to glyphs mapping
16264        'cmap': createCMapTable(charstrings.slice(),
16265                                ('glyphIds' in font) ? font.glyphIds : null),
16266
16267        // Font header
16268        'head': (function fontFieldsHead() {
16269          return stringToArray(
16270              '\x00\x01\x00\x00' + // Version number
16271              '\x00\x00\x10\x00' + // fontRevision
16272              '\x00\x00\x00\x00' + // checksumAdjustement
16273              '\x5F\x0F\x3C\xF5' + // magicNumber
16274              '\x00\x00' + // Flags
16275              '\x03\xE8' + // unitsPerEM (defaulting to 1000)
16276              '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
16277              '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
16278              '\x00\x00' + // xMin
16279              safeString16(properties.descent) + // yMin
16280              '\x0F\xFF' + // xMax
16281              safeString16(properties.ascent) + // yMax
16282              string16(properties.italicAngle ? 2 : 0) + // macStyle
16283              '\x00\x11' + // lowestRecPPEM
16284              '\x00\x00' + // fontDirectionHint
16285              '\x00\x00' + // indexToLocFormat
16286              '\x00\x00');  // glyphDataFormat
16287        })(),
16288
16289        // Horizontal header
16290        'hhea': (function fontFieldsHhea() {
16291          return stringToArray(
16292              '\x00\x01\x00\x00' + // Version number
16293              safeString16(properties.ascent) + // Typographic Ascent
16294              safeString16(properties.descent) + // Typographic Descent
16295              '\x00\x00' + // Line Gap
16296              '\xFF\xFF' + // advanceWidthMax
16297              '\x00\x00' + // minLeftSidebearing
16298              '\x00\x00' + // minRightSidebearing
16299              '\x00\x00' + // xMaxExtent
16300              safeString16(properties.capHeight) + // caretSlopeRise
16301              safeString16(Math.tan(properties.italicAngle) *
16302                       properties.xHeight) + // caretSlopeRun
16303              '\x00\x00' + // caretOffset
16304              '\x00\x00' + // -reserved-
16305              '\x00\x00' + // -reserved-
16306              '\x00\x00' + // -reserved-
16307              '\x00\x00' + // -reserved-
16308              '\x00\x00' + // metricDataFormat
16309              string16(charstrings.length + 1)); // Number of HMetrics
16310        })(),
16311
16312        // Horizontal metrics
16313        'hmtx': (function fontFieldsHmtx() {
16314          var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
16315          for (var i = 0, ii = charstrings.length; i < ii; i++) {
16316            var charstring = charstrings[i];
16317            var width = 'width' in charstring ? charstring.width : 0;
16318            hmtx += string16(width) + string16(0);
16319          }
16320          return stringToArray(hmtx);
16321        })(),
16322
16323        // Maximum profile
16324        'maxp': (function fontFieldsMaxp() {
16325          return stringToArray(
16326              '\x00\x00\x50\x00' + // Version number
16327             string16(charstrings.length + 1)); // Num of glyphs
16328        })(),
16329
16330        // Naming tables
16331        'name': stringToArray(createNameTable(fontName)),
16332
16333        // PostScript informations
16334        'post': stringToArray(createPostTable(properties))
16335      };
16336
16337      for (var field in fields)
16338        createTableEntry(otf, field, fields[field]);
16339
16340      for (var field in fields) {
16341        var table = fields[field];
16342        otf.file += arrayToString(table);
16343      }
16344
16345      return stringToArray(otf.file);
16346    },
16347
16348    buildToFontChar: function Font_buildToFontChar(toUnicode) {
16349      var result = [];
16350      var unusedUnicode = kCmapGlyphOffset;
16351      for (var i = 0, ii = toUnicode.length; i < ii; i++) {
16352        var unicode = toUnicode[i];
16353        var fontCharCode = typeof unicode === 'object' ? unusedUnicode++ :
16354          unicode;
16355        if (typeof unicode !== 'undefined')
16356          result[i] = fontCharCode;
16357      }
16358      return result;
16359    },
16360
16361    rebuildToUnicode: function Font_rebuildToUnicode(properties) {
16362      var firstChar = properties.firstChar, lastChar = properties.lastChar;
16363      var map = [];
16364      if (properties.composite) {
16365        var isIdentityMap = this.cidToUnicode.length == 0;
16366        for (var i = firstChar, ii = lastChar; i <= ii; i++) {
16367          // TODO missing map the character according font's CMap
16368          var cid = i;
16369          map[i] = isIdentityMap ? cid : this.cidToUnicode[cid];
16370        }
16371      } else {
16372        for (var i = firstChar, ii = lastChar; i <= ii; i++) {
16373          var glyph = properties.differences[i];
16374          if (!glyph)
16375            glyph = properties.baseEncoding[i];
16376          if (!!glyph && (glyph in GlyphsUnicode))
16377            map[i] = GlyphsUnicode[glyph];
16378        }
16379      }
16380      this.toUnicode = map;
16381    },
16382
16383    loadCidToUnicode: function Font_loadCidToUnicode(properties) {
16384      if (!properties.cidSystemInfo)
16385        return;
16386
16387      var cidToUnicodeMap = [], unicodeToCIDMap = [];
16388      this.cidToUnicode = cidToUnicodeMap;
16389      this.unicodeToCID = unicodeToCIDMap;
16390
16391      var cidSystemInfo = properties.cidSystemInfo;
16392      var cidToUnicode;
16393      if (cidSystemInfo) {
16394        cidToUnicode = CIDToUnicodeMaps[
16395          cidSystemInfo.registry + '-' + cidSystemInfo.ordering];
16396      }
16397
16398      if (!cidToUnicode)
16399        return; // identity encoding
16400
16401      var cid = 1, i, j, k, ii;
16402      for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
16403        var unicode = cidToUnicode[i];
16404        if (isArray(unicode)) {
16405          var length = unicode.length;
16406          for (j = 0; j < length; j++) {
16407            cidToUnicodeMap[cid] = unicode[j];
16408            unicodeToCIDMap[unicode[j]] = cid;
16409          }
16410          cid++;
16411        } else if (typeof unicode === 'object') {
16412          var fillLength = unicode.f;
16413          if (fillLength) {
16414            k = unicode.c;
16415            for (j = 0; j < fillLength; ++j) {
16416              cidToUnicodeMap[cid] = k;
16417              unicodeToCIDMap[k] = cid;
16418              cid++;
16419              k++;
16420            }
16421          } else
16422            cid += unicode.s;
16423        } else if (unicode) {
16424          cidToUnicodeMap[cid] = unicode;
16425          unicodeToCIDMap[unicode] = cid;
16426          cid++;
16427        } else
16428          cid++;
16429      }
16430    },
16431
16432    bindDOM: function Font_bindDOM(data) {
16433      var fontName = this.loadedName;
16434
16435      // Add the font-face rule to the document
16436      var url = ('url(data:' + this.mimetype + ';base64,' +
16437                 PdfJS_window.window.btoa(data) + ');');
16438      var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}';
16439
16440      var styleElement = PdfJS_window.document.createElement('style');
16441      PdfJS_window.document.documentElement.getElementsByTagName('head')[0].appendChild(
16442        styleElement);
16443
16444      var styleSheet = styleElement.sheet;
16445      styleSheet.insertRule(rule, styleSheet.cssRules.length);
16446
16447      if (PDFJS.pdfBug && FontInspector.enabled)
16448        FontInspector.fontAdded(this, url);
16449
16450      return rule;
16451    },
16452
16453    get spaceWidth() {
16454      // trying to estimate space character width
16455      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];
16456      var width;
16457      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
16458        var glyphName = possibleSpaceReplacements[i];
16459        // if possible, getting width by glyph name
16460        if (glyphName in this.widths) {
16461          width = this.widths[glyphName];
16462          break;
16463        }
16464        var glyphUnicode = GlyphsUnicode[glyphName];
16465        // finding the charcode via unicodeToCID map
16466        var charcode = 0;
16467        if (this.composite)
16468          charcode = this.unicodeToCID[glyphUnicode];
16469        // ... via toUnicode map
16470        if (!charcode && 'toUnicode' in this)
16471          charcode = this.toUnicode.indexOf(glyphUnicode);
16472        // setting it to unicode if negative or undefined
16473        if (!(charcode > 0))
16474          charcode = glyphUnicode;
16475        // trying to get width via charcode
16476        width = this.widths[charcode];
16477        if (width)
16478          break; // the non-zero width found
16479      }
16480      width = (width || this.defaultWidth) * this.widthMultiplier;
16481      return shadow(this, 'spaceWidth', width);
16482    },
16483
16484    charToGlyph: function Font_charToGlyph(charcode) {
16485      var fontCharCode, width, operatorList, disabled;
16486
16487      var width = this.widths[charcode];
16488
16489      switch (this.type) {
16490        case 'CIDFontType0':
16491          if (this.noUnicodeAdaptation) {
16492            width = this.widths[this.unicodeToCID[charcode] || charcode];
16493            fontCharCode = mapPrivateUseChars(charcode);
16494            break;
16495          }
16496          fontCharCode = this.toFontChar[charcode] || charcode;
16497          break;
16498        case 'CIDFontType2':
16499          if (this.noUnicodeAdaptation) {
16500            width = this.widths[this.unicodeToCID[charcode] || charcode];
16501            fontCharCode = mapPrivateUseChars(charcode);
16502            break;
16503          }
16504          fontCharCode = this.toFontChar[charcode] || charcode;
16505          break;
16506        case 'Type1':
16507          var glyphName = this.differences[charcode] || this.encoding[charcode];
16508          if (!isNum(width))
16509            width = this.widths[glyphName];
16510          if (this.noUnicodeAdaptation) {
16511            fontCharCode = mapPrivateUseChars(GlyphsUnicode[glyphName] ||
16512              charcode);
16513            break;
16514          }
16515          fontCharCode = this.glyphNameMap[glyphName] ||
16516            GlyphsUnicode[glyphName] || charcode;
16517          break;
16518        case 'Type3':
16519          var glyphName = this.differences[charcode] || this.encoding[charcode];
16520          operatorList = this.charProcOperatorList[glyphName];
16521          fontCharCode = charcode;
16522          break;
16523        case 'TrueType':
16524          if (this.useToFontChar) {
16525            fontCharCode = this.toFontChar[charcode] || charcode;
16526            break;
16527          }
16528          var glyphName = this.differences[charcode] || this.encoding[charcode];
16529          if (!glyphName)
16530            glyphName = Encodings.StandardEncoding[charcode];
16531          if (!isNum(width))
16532            width = this.widths[glyphName];
16533          if (this.noUnicodeAdaptation) {
16534            fontCharCode = GlyphsUnicode[glyphName] || charcode;
16535            break;
16536          }
16537          if (!this.hasEncoding || this.isSymbolicFont) {
16538            fontCharCode = this.useToFontChar ? this.toFontChar[charcode] :
16539              charcode;
16540            break;
16541          }
16542
16543          // MacRoman encoding address by re-encoding the cmap table
16544          fontCharCode = glyphName in this.glyphNameMap ?
16545            this.glyphNameMap[glyphName] : GlyphsUnicode[glyphName];
16546          break;
16547        default:
16548          warn('Unsupported font type: ' + this.type);
16549          break;
16550      }
16551
16552      var unicodeChars = !('toUnicode' in this) ? charcode :
16553        this.toUnicode[charcode] || charcode;
16554      if (typeof unicodeChars === 'number')
16555        unicodeChars = String.fromCharCode(unicodeChars);
16556
16557      width = (isNum(width) ? width : this.defaultWidth) * this.widthMultiplier;
16558      disabled = this.unicodeIsEnabled ?
16559        !this.unicodeIsEnabled[fontCharCode] : false;
16560
16561      return {
16562        fontChar: String.fromCharCode(fontCharCode),
16563        unicode: unicodeChars,
16564        width: width,
16565        disabled: disabled,
16566        operatorList: operatorList
16567      };
16568    },
16569
16570    charsToGlyphs: function Font_charsToGlyphs(chars) {
16571      var charsCache = this.charsCache;
16572      var glyphs;
16573
16574      // if we translated this string before, just grab it from the cache
16575      if (charsCache) {
16576        glyphs = charsCache[chars];
16577        if (glyphs)
16578          return glyphs;
16579      }
16580
16581      // lazily create the translation cache
16582      if (!charsCache)
16583        charsCache = this.charsCache = Object.create(null);
16584
16585      glyphs = [];
16586
16587      if (this.wideChars) {
16588        // composite fonts have multi-byte strings convert the string from
16589        // single-byte to multi-byte
16590        // XXX assuming CIDFonts are two-byte - later need to extract the
16591        // correct byte encoding according to the PDF spec
16592        var length = chars.length - 1; // looping over two bytes at a time so
16593                                       // loop should never end on the last byte
16594        for (var i = 0; i < length; i++) {
16595          var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]);
16596          var glyph = this.charToGlyph(charcode);
16597          glyphs.push(glyph);
16598          // placing null after each word break charcode (ASCII SPACE)
16599          if (charcode == 0x20)
16600            glyphs.push(null);
16601        }
16602      }
16603      else {
16604        for (var i = 0, ii = chars.length; i < ii; ++i) {
16605          var charcode = chars.charCodeAt(i);
16606          var glyph = this.charToGlyph(charcode);
16607          glyphs.push(glyph);
16608          if (charcode == 0x20)
16609            glyphs.push(null);
16610        }
16611      }
16612
16613      // Enter the translated string into the cache
16614      return (charsCache[chars] = glyphs);
16615    }
16616  };
16617
16618  return Font;
16619})();
16620
16621/*
16622 * Type1Parser encapsulate the needed code for parsing a Type1 font
16623 * program. Some of its logic depends on the Type2 charstrings
16624 * structure.
16625 */
16626var Type1Parser = function type1Parser() {
16627  /*
16628   * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
16629   * of Plaintext Bytes. The function took a key as a parameter which can be
16630   * for decrypting the eexec block of for decoding charStrings.
16631   */
16632  var kEexecEncryptionKey = 55665;
16633  var kCharStringsEncryptionKey = 4330;
16634
16635  function decrypt(stream, key, discardNumber) {
16636    var r = key, c1 = 52845, c2 = 22719;
16637    var decryptedString = [];
16638
16639    var value = '';
16640    var count = stream.length;
16641    for (var i = 0; i < count; i++) {
16642      value = stream[i];
16643      decryptedString[i] = value ^ (r >> 8);
16644      r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
16645    }
16646    return decryptedString.slice(discardNumber);
16647  }
16648
16649  /*
16650   * CharStrings are encoded following the the CharString Encoding sequence
16651   * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
16652   * The value in a byte indicates a command, a number, or subsequent bytes
16653   * that are to be interpreted in a special way.
16654   *
16655   * CharString Number Encoding:
16656   *  A CharString byte containing the values from 32 through 255 inclusive
16657   *  indicate an integer. These values are decoded in four ranges.
16658   *
16659   * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
16660   * indicate the integer v - 139. Thus, the integer values from -107 through
16661   * 107 inclusive may be encoded in single byte.
16662   *
16663   * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
16664   * indicates an integer involving the next byte, w, according to the formula:
16665   * [(v - 247) x 256] + w + 108
16666   *
16667   * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
16668   * indicates an integer involving the next byte, w, according to the formula:
16669   * -[(v - 251) * 256] - w - 108
16670   *
16671   * 4. A CharString containing the value 255 indicates that the next 4 bytes
16672   * are a two complement signed integer. The first of these bytes contains the
16673   * highest order bits, the second byte contains the next higher order bits
16674   * and the fourth byte contain the lowest order bits.
16675   *
16676   *
16677   * CharString Command Encoding:
16678   *  CharStrings commands are encoded in 1 or 2 bytes.
16679   *
16680   *  Single byte commands are encoded in 1 byte that contains a value between
16681   *  0 and 31 inclusive.
16682   *  If a command byte contains the value 12, then the value in the next byte
16683   *  indicates a command. This "escape" mechanism allows many extra commands
16684   * to be encoded and this encoding technique helps to minimize the length of
16685   * the charStrings.
16686   */
16687  var charStringDictionary = {
16688    '1': 'hstem',
16689    '3': 'vstem',
16690    '4': 'vmoveto',
16691    '5': 'rlineto',
16692    '6': 'hlineto',
16693    '7': 'vlineto',
16694    '8': 'rrcurveto',
16695
16696    // closepath is a Type1 command that do not take argument and is useless
16697    // in Type2 and it can simply be ignored.
16698    '9': null, // closepath
16699
16700    '10': 'callsubr',
16701
16702    // return is normally used inside sub-routines to tells to the execution
16703    // flow that it can be back to normal.
16704    // During the translation process Type1 charstrings will be flattened and
16705    // sub-routines will be embedded directly into the charstring directly, so
16706    // this can be ignored safely.
16707    '11': 'return',
16708
16709    '12': {
16710      // dotsection is a Type1 command to specify some hinting feature for dots
16711      // that do not take a parameter and it can safely be ignored for Type2.
16712      '0': null, // dotsection
16713
16714      // [vh]stem3 are Type1 only and Type2 supports [vh]stem with multiple
16715      // parameters, so instead of returning [vh]stem3 take a shortcut and
16716      // return [vhstem] instead.
16717      '1': 'vstem',
16718      '2': 'hstem',
16719
16720      // Type1 only command with command not (yet) built-in ,throw an error
16721      '6': -1, // seac
16722      '7': -1, // sbw
16723
16724      '11': 'sub',
16725      '12': 'div',
16726
16727      // callothersubr is a mechanism to make calls on the postscript
16728      // interpreter, this is not supported by Type2 charstring but hopefully
16729      // most of the default commands can be ignored safely.
16730      '16': 'callothersubr',
16731
16732      '17': 'pop',
16733
16734      // setcurrentpoint sets the current point to x, y without performing a
16735      // moveto (this is a one shot positionning command). This is used only
16736      // with the return of an OtherSubrs call.
16737      // TODO Implement the OtherSubrs charstring embedding and replace this
16738      // call by a no-op, like 2 'pop' commands for example.
16739      '33': null // setcurrentpoint
16740    },
16741    '13': 'hsbw',
16742    '14': 'endchar',
16743    '21': 'rmoveto',
16744    '22': 'hmoveto',
16745    '30': 'vhcurveto',
16746    '31': 'hvcurveto'
16747  };
16748
16749  var kEscapeCommand = 12;
16750
16751  function decodeCharString(array) {
16752    var charstring = [];
16753    var lsb = 0;
16754    var width = 0;
16755    var flexState = 0;
16756
16757    var value = '';
16758    var count = array.length;
16759    for (var i = 0; i < count; i++) {
16760      value = array[i];
16761
16762      if (value < 32) {
16763        var command = null;
16764        if (value == kEscapeCommand) {
16765          var escape = array[++i];
16766
16767          // TODO Clean this code
16768          if (escape == 16) {
16769            var index = charstring.pop();
16770            var argc = charstring.pop();
16771            for (var j = 0; j < argc; j++)
16772              charstring.push('drop');
16773
16774            // If the flex mechanism is not used in a font program, Adobe
16775            // states that entries 0, 1 and 2 can simply be replaced by
16776            // {}, which means that we can simply ignore them.
16777            if (index < 3) {
16778              continue;
16779            }
16780
16781            // This is the same things about hint replacement, if it is not used
16782            // entry 3 can be replaced by {3}
16783            // TODO support hint replacment
16784            if (index == 3) {
16785              charstring.push(3);
16786              i++;
16787              continue;
16788            }
16789          } else if (escape == 17 || escape == 33) {
16790            // pop or setcurrentpoint commands can be ignored
16791            // since we are not doing callothersubr
16792            continue;
16793          } else if (!kHintingEnabled && (escape == 1 || escape == 2)) {
16794            charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop');
16795            continue;
16796          }
16797
16798          command = charStringDictionary['12'][escape];
16799        } else {
16800          // TODO Clean this code
16801          if (value == 13) { // hsbw
16802            if (charstring.length == 2) {
16803              lsb = charstring[0];
16804              width = charstring[1];
16805              charstring.splice(0, 1);
16806            } else if (charstring.length == 4 && charstring[3] == 'div') {
16807              lsb = charstring[0];
16808              width = charstring[1] / charstring[2];
16809              charstring.splice(0, 1);
16810            } else if (charstring.length == 4 && charstring[2] == 'div') {
16811              lsb = charstring[0] / charstring[1];
16812              width = charstring[3];
16813              charstring.splice(0, 3);
16814            } else {
16815              error('Unsupported hsbw format: ' + charstring);
16816            }
16817
16818            charstring.push(lsb, 'hmoveto');
16819            continue;
16820          } else if (value == 10) { // callsubr
16821            if (charstring[charstring.length - 1] < 3) { // subr #0..2
16822              var subrNumber = charstring.pop();
16823              switch (subrNumber) {
16824                case 1:
16825                  flexState = 1; // prepare for flex coordinates
16826                  break;
16827                case 2:
16828                  flexState = 2; // flex in progress
16829                  break;
16830                case 0:
16831                  // type2 flex command does not need final coords
16832                  charstring.push('exch', 'drop', 'exch', 'drop');
16833                  charstring.push('flex');
16834                  flexState = 0;
16835                  break;
16836              }
16837              continue;
16838            }
16839          } else if (value == 21 && flexState > 0) {
16840            if (flexState > 1)
16841              continue; // ignoring rmoveto
16842            value = 5; // first segment replacing with rlineto
16843          } else if (!kHintingEnabled && (value == 1 || value == 3)) {
16844            charstring.push('drop', 'drop');
16845            continue;
16846          }
16847          command = charStringDictionary[value];
16848        }
16849
16850        // Some charstring commands are meaningless in Type2 and will return
16851        // a null, let's just ignored them
16852        if (!command && i < count) {
16853          continue;
16854        } else if (!command) {
16855          break;
16856        } else if (command == -1) {
16857          warn('Support for Type1 command ' + value +
16858                ' (' + escape + ') is not implemented in charstring: ' +
16859                charstring);
16860          if (value == 12) {
16861            // we know how to ignore only some the Type1 commands
16862            switch (escape) {
16863              case 7:
16864                charstring.push('drop', 'drop', 'drop', 'drop');
16865                continue;
16866              case 8:
16867                charstring.push('drop');
16868                continue;
16869            }
16870          }
16871        }
16872
16873        value = command;
16874      } else if (value <= 246) {
16875        value = value - 139;
16876      } else if (value <= 250) {
16877        value = ((value - 247) * 256) + array[++i] + 108;
16878      } else if (value <= 254) {
16879        value = -((value - 251) * 256) - array[++i] - 108;
16880      } else {
16881        value = (array[++i] & 0xff) << 24 | (array[++i] & 0xff) << 16 |
16882                (array[++i] & 0xff) << 8 | (array[++i] & 0xff) << 0;
16883      }
16884
16885      charstring.push(value);
16886    }
16887
16888    return { charstring: charstring, width: width, lsb: lsb };
16889  }
16890
16891  /*
16892   * Returns an object containing a Subrs array and a CharStrings
16893   * array extracted from and eexec encrypted block of data
16894   */
16895  function readNumberArray(str, index) {
16896    var start = index;
16897    while (str[index++] != '[')
16898      start++;
16899    start++;
16900
16901    var count = 0;
16902    while (str[index++] != ']')
16903      count++;
16904
16905    str = str.substr(start, count);
16906
16907    str = str.trim();
16908    // Remove adjacent spaces
16909    str = str.replace(/\s+/g, ' ');
16910
16911    var array = str.split(' ');
16912    for (var i = 0, ii = array.length; i < ii; i++)
16913      array[i] = parseFloat(array[i] || 0);
16914    return array;
16915  }
16916
16917  function readNumber(str, index) {
16918    while (str[index] == ' ')
16919      index++;
16920
16921    var start = index;
16922
16923    var count = 0;
16924    while (str[index++] != ' ')
16925      count++;
16926
16927    return parseFloat(str.substr(start, count) || 0);
16928  }
16929
16930  function isSeparator(c) {
16931    return c == ' ' || c == '\n' || c == '\x0d';
16932  }
16933
16934  this.extractFontProgram = function Type1Parser_extractFontProgram(stream) {
16935    var eexec = decrypt(stream, kEexecEncryptionKey, 4);
16936    var eexecStr = '';
16937    for (var i = 0, ii = eexec.length; i < ii; i++)
16938      eexecStr += String.fromCharCode(eexec[i]);
16939
16940    var glyphsSection = false, subrsSection = false;
16941    var program = {
16942      subrs: [],
16943      charstrings: [],
16944      properties: {
16945        'privateData': {
16946          'lenIV': 4
16947        }
16948      }
16949    };
16950
16951    var glyph = '';
16952    var token = '';
16953    var length = 0;
16954
16955    var c = '';
16956    var count = eexecStr.length;
16957    for (var i = 0; i < count; i++) {
16958      var getToken = function getToken() {
16959        while (i < count && isSeparator(eexecStr[i]))
16960          ++i;
16961
16962        var token = '';
16963        while (i < count && !isSeparator(eexecStr[i]))
16964          token += eexecStr[i++];
16965
16966        return token;
16967      };
16968      var c = eexecStr[i];
16969
16970      if ((glyphsSection || subrsSection) &&
16971          (token == 'RD' || token == '-|')) {
16972        i++;
16973        var data = eexec.slice(i, i + length);
16974        var lenIV = program.properties.privateData['lenIV'];
16975        var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
16976        var str = decodeCharString(encoded);
16977
16978        if (glyphsSection) {
16979          program.charstrings.push({
16980            glyph: glyph,
16981            data: str.charstring,
16982            lsb: str.lsb,
16983            width: str.width
16984          });
16985        } else {
16986          program.subrs.push(str.charstring);
16987        }
16988        i += length;
16989        token = '';
16990      } else if (isSeparator(c)) {
16991        length = parseInt(token, 10);
16992        token = '';
16993      } else {
16994        token += c;
16995        if (!glyphsSection) {
16996          switch (token) {
16997            case '/CharString':
16998              glyphsSection = true;
16999              break;
17000            case '/Subrs':
17001              ++i;
17002              var num = parseInt(getToken(), 10);
17003              getToken(); // read in 'array'
17004              for (var j = 0; j < num; ++j) {
17005                var t = getToken(); // read in 'dup'
17006                if (t == 'ND' || t == '|-' || t == 'noaccess')
17007                  break;
17008                var index = parseInt(getToken(), 10);
17009                if (index > j)
17010                  j = index;
17011                var length = parseInt(getToken(), 10);
17012                getToken(); // read in 'RD'
17013                var data = eexec.slice(i + 1, i + 1 + length);
17014                var lenIV = program.properties.privateData['lenIV'];
17015                var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
17016                var str = decodeCharString(encoded);
17017                i = i + 1 + length;
17018                t = getToken(); // read in 'NP'
17019                if (t == 'noaccess')
17020                  getToken(); // read in 'put'
17021                program.subrs[index] = str.charstring;
17022              }
17023              break;
17024            case '/BlueValues':
17025            case '/OtherBlues':
17026            case '/FamilyBlues':
17027            case '/FamilyOtherBlues':
17028            case '/StemSnapH':
17029            case '/StemSnapV':
17030              program.properties.privateData[token.substring(1)] =
17031                readNumberArray(eexecStr, i + 1);
17032              break;
17033            case '/StdHW':
17034            case '/StdVW':
17035              program.properties.privateData[token.substring(1)] =
17036                readNumberArray(eexecStr, i + 2)[0];
17037              break;
17038            case '/BlueShift':
17039            case '/lenIV':
17040            case '/BlueFuzz':
17041            case '/BlueScale':
17042            case '/LanguageGroup':
17043            case '/ExpansionFactor':
17044              program.properties.privateData[token.substring(1)] =
17045                readNumber(eexecStr, i + 1);
17046              break;
17047          }
17048        } else if (c == '/') {
17049          token = glyph = '';
17050          while ((c = eexecStr[++i]) != ' ')
17051            glyph += c;
17052        }
17053      }
17054    }
17055
17056    return program;
17057  };
17058
17059  this.extractFontHeader = function Type1Parser_extractFontHeader(stream,
17060                                                                  properties) {
17061    var headerString = '';
17062    for (var i = 0, ii = stream.length; i < ii; i++)
17063      headerString += String.fromCharCode(stream[i]);
17064
17065    var token = '';
17066    var count = headerString.length;
17067    for (var i = 0; i < count; i++) {
17068      var getToken = function getToken() {
17069        var character = headerString[i];
17070        while (i < count && (isSeparator(character) || character == '/'))
17071          character = headerString[++i];
17072
17073        var token = '';
17074        while (i < count && !(isSeparator(character) || character == '/')) {
17075          token += character;
17076          character = headerString[++i];
17077        }
17078
17079        return token;
17080      };
17081
17082      var c = headerString[i];
17083      if (isSeparator(c)) {
17084        switch (token) {
17085          case '/FontMatrix':
17086            var matrix = readNumberArray(headerString, i + 1);
17087
17088            // The FontMatrix is in unitPerEm, so make it pixels
17089            for (var j = 0, jj = matrix.length; j < jj; j++)
17090              matrix[j] *= 1000;
17091
17092            // Make the angle into the right direction
17093            matrix[2] *= -1;
17094
17095            properties.fontMatrix = matrix;
17096            break;
17097          case '/Encoding':
17098            var encodingArg = getToken();
17099            var encoding;
17100            if (!/^\d+$/.test(encodingArg)) {
17101              // encoding name is specified
17102              encoding = Encodings[encodingArg];
17103            } else {
17104              encoding = [];
17105              var size = parseInt(encodingArg, 10);
17106              getToken(); // read in 'array'
17107
17108              for (var j = 0; j < size; j++) {
17109                var token = getToken();
17110                if (token == 'dup') {
17111                  var index = parseInt(getToken(), 10);
17112                  var glyph = getToken();
17113                  encoding[index] = glyph;
17114                  getToken(); // read the in 'put'
17115                }
17116              }
17117            }
17118            if (!properties.hasEncoding && encoding) {
17119              properties.baseEncoding = encoding;
17120              break;
17121            }
17122            break;
17123        }
17124        token = '';
17125      } else {
17126        token += c;
17127      }
17128    }
17129  };
17130};
17131
17132/**
17133 * The CFF class takes a Type1 file and wrap it into a
17134 * 'Compact Font Format' which itself embed Type2 charstrings.
17135 */
17136var CFFStandardStrings = [
17137  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
17138  'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
17139  'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
17140  'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
17141  'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
17142  'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
17143  'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
17144  'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
17145  'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
17146  'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
17147  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
17148  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
17149  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
17150  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
17151  'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
17152  'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
17153  'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
17154  'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
17155  'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
17156  'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
17157  'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
17158  'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
17159  'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
17160  'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
17161  'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
17162  'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
17163  'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
17164  'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
17165  'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
17166  'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
17167  'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
17168  'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
17169  'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
17170  'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff',
17171  'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
17172  'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
17173  'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
17174  'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
17175  'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
17176  'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
17177  'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
17178  'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
17179  'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
17180  'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
17181  'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
17182  'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
17183  'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
17184  'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
17185  'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
17186  'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
17187  'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
17188  'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
17189  'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
17190  'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
17191  'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
17192  'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
17193  'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
17194  'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
17195  'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
17196  'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
17197  'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
17198  'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
17199  'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
17200  'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
17201  'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
17202];
17203
17204var type1Parser = new Type1Parser();
17205
17206// Type1Font is also a CIDFontType0.
17207var Type1Font = function Type1Font(name, file, properties) {
17208  // Get the data block containing glyphs and subrs informations
17209  var headerBlock = file.getBytes(properties.length1);
17210  type1Parser.extractFontHeader(headerBlock, properties);
17211
17212  // Decrypt the data blocks and retrieve it's content
17213  var eexecBlock = file.getBytes(properties.length2);
17214  var data = type1Parser.extractFontProgram(eexecBlock);
17215  for (var info in data.properties)
17216    properties[info] = data.properties[info];
17217
17218  var charstrings = this.getOrderedCharStrings(data.charstrings, properties);
17219  var type2Charstrings = this.getType2Charstrings(charstrings);
17220  var subrs = this.getType2Subrs(data.subrs);
17221
17222  this.charstrings = charstrings;
17223  this.data = this.wrap(name, type2Charstrings, this.charstrings,
17224                        subrs, properties);
17225};
17226
17227Type1Font.prototype = {
17228  createCFFIndexHeader: function Type1Font_createCFFIndexHeader(objects,
17229                                                                isByte) {
17230    // First 2 bytes contains the number of objects contained into this index
17231    var count = objects.length;
17232
17233    // If there is no object, just create an array saying that with another
17234    // offset byte.
17235    if (count == 0)
17236      return '\x00\x00\x00';
17237
17238    var data = String.fromCharCode((count >> 8) & 0xFF, count & 0xff);
17239
17240    // Next byte contains the offset size use to reference object in the file
17241    // Actually we're using 0x04 to be sure to be able to store everything
17242    // without thinking of it while coding.
17243    data += '\x04';
17244
17245    // Add another offset after this one because we need a new offset
17246    var relativeOffset = 1;
17247    for (var i = 0; i < count + 1; i++) {
17248      data += String.fromCharCode((relativeOffset >>> 24) & 0xFF,
17249                                  (relativeOffset >> 16) & 0xFF,
17250                                  (relativeOffset >> 8) & 0xFF,
17251                                  relativeOffset & 0xFF);
17252
17253      if (objects[i])
17254        relativeOffset += objects[i].length;
17255    }
17256
17257    for (var i = 0; i < count; i++) {
17258      for (var j = 0, jj = objects[i].length; j < jj; j++)
17259        data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) :
17260                objects[i][j];
17261    }
17262    return data;
17263  },
17264
17265  encodeNumber: function Type1Font_encodeNumber(value) {
17266    // some of the fonts has ouf-of-range values
17267    // they are just arithmetic overflows
17268    // make sanitizer happy
17269    value |= 0;
17270    if (value >= -32768 && value <= 32767) {
17271      return '\x1c' +
17272             String.fromCharCode((value >> 8) & 0xFF) +
17273             String.fromCharCode(value & 0xFF);
17274    } else {
17275      return '\x1d' +
17276             String.fromCharCode((value >> 24) & 0xFF) +
17277             String.fromCharCode((value >> 16) & 0xFF) +
17278             String.fromCharCode((value >> 8) & 0xFF) +
17279             String.fromCharCode(value & 0xFF);
17280    }
17281  },
17282
17283  getOrderedCharStrings: function Type1Font_getOrderedCharStrings(glyphs,
17284                                                            properties) {
17285    var charstrings = [];
17286    var i, length, glyphName;
17287    var unusedUnicode = kCmapGlyphOffset;
17288    for (i = 0, length = glyphs.length; i < length; i++) {
17289      var item = glyphs[i];
17290      var glyphName = item.glyph;
17291      var unicode = glyphName in GlyphsUnicode ?
17292        GlyphsUnicode[glyphName] : unusedUnicode++;
17293      charstrings.push({
17294        glyph: glyphName,
17295        unicode: unicode,
17296        gid: i,
17297        charstring: item.data,
17298        width: item.width,
17299        lsb: item.lsb
17300      });
17301    }
17302
17303    charstrings.sort(function charstrings_sort(a, b) {
17304      return a.unicode - b.unicode;
17305    });
17306    return charstrings;
17307  },
17308
17309  getType2Charstrings: function Type1Font_getType2Charstrings(
17310                                  type1Charstrings) {
17311    var type2Charstrings = [];
17312    var count = type1Charstrings.length;
17313    for (var i = 0; i < count; i++) {
17314      var charstring = type1Charstrings[i].charstring;
17315      type2Charstrings.push(this.flattenCharstring(charstring.slice(),
17316                                                   this.commandsMap));
17317    }
17318    return type2Charstrings;
17319  },
17320
17321  getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
17322    var bias = 0;
17323    var count = type1Subrs.length;
17324    if (count < 1240)
17325      bias = 107;
17326    else if (count < 33900)
17327      bias = 1131;
17328    else
17329      bias = 32768;
17330
17331    // Add a bunch of empty subrs to deal with the Type2 bias
17332    var type2Subrs = [];
17333    for (var i = 0; i < bias; i++)
17334      type2Subrs.push([0x0B]);
17335
17336    for (var i = 0; i < count; i++) {
17337      var subr = type1Subrs[i];
17338      if (!subr)
17339        subr = [0x0B];
17340
17341      type2Subrs.push(this.flattenCharstring(subr, this.commandsMap));
17342    }
17343
17344    return type2Subrs;
17345  },
17346
17347  /*
17348   * Flatten the commands by interpreting the postscript code and replacing
17349   * every 'callsubr', 'callothersubr' by the real commands.
17350   */
17351  commandsMap: {
17352    'hstem': 1,
17353    'vstem': 3,
17354    'vmoveto': 4,
17355    'rlineto': 5,
17356    'hlineto': 6,
17357    'vlineto': 7,
17358    'rrcurveto': 8,
17359    'callsubr': 10,
17360    'return': 11,
17361    'sub': [12, 11],
17362    'div': [12, 12],
17363    'exch': [12, 28],
17364    'flex': [12, 35],
17365    'drop' : [12, 18],
17366    'endchar': 14,
17367    'rmoveto': 21,
17368    'hmoveto': 22,
17369    'vhcurveto': 30,
17370    'hvcurveto': 31
17371  },
17372
17373  flattenCharstring: function Type1Font_flattenCharstring(charstring, map) {
17374    // charstring changes size - can't cache .length in loop
17375    for (var i = 0; i < charstring.length; i++) {
17376      var command = charstring[i];
17377      if (command.charAt) {
17378        var cmd = map[command];
17379        assert(cmd, 'Unknow command: ' + command);
17380
17381        if (isArray(cmd))
17382          charstring.splice(i++, 1, cmd[0], cmd[1]);
17383        else
17384          charstring[i] = cmd;
17385      } else {
17386        // Type1 charstring use a division for number above 32000
17387        if (command > 32000) {
17388          var divisor = charstring[i + 1];
17389          command /= divisor;
17390          charstring.splice(i, 3, 28, command >> 8, command & 0xff);
17391        } else {
17392          charstring.splice(i, 1, 28, command >> 8, command & 0xff);
17393        }
17394        i += 2;
17395      }
17396    }
17397    return charstring;
17398  },
17399
17400  wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
17401    var fields = {
17402      // major version, minor version, header size, offset size
17403      'header': '\x01\x00\x04\x04',
17404
17405      'names': this.createCFFIndexHeader([name]),
17406
17407      'topDict': (function topDict(self) {
17408        return function cffWrapTopDict() {
17409          var header = '\x00\x01\x01\x01';
17410          var dict =
17411              '\xf8\x1b\x00' + // version
17412              '\xf8\x1c\x01' + // Notice
17413              '\xf8\x1d\x02' + // FullName
17414              '\xf8\x1e\x03' + // FamilyName
17415              '\xf8\x1f\x04' +  // Weight
17416              '\x1c\x00\x00\x10'; // Encoding
17417
17418          var boundingBox = properties.bbox;
17419          for (var i = 0, ii = boundingBox.length; i < ii; i++)
17420            dict += self.encodeNumber(boundingBox[i]);
17421          dict += '\x05'; // FontBBox;
17422
17423          var offset = fields.header.length +
17424                       fields.names.length +
17425                       (header.length + 1) +
17426                       (dict.length + (4 + 4)) +
17427                       fields.strings.length +
17428                       fields.globalSubrs.length;
17429
17430          // If the offset if over 32767, encodeNumber is going to return
17431          // 5 bytes to encode the position instead of 3.
17432          if ((offset + fields.charstrings.length) > 32767) {
17433            offset += 9;
17434          } else {
17435            offset += 7;
17436          }
17437
17438          dict += self.encodeNumber(offset) + '\x0f'; // Charset
17439
17440          offset = offset + (glyphs.length * 2) + 1;
17441          dict += self.encodeNumber(offset) + '\x11'; // Charstrings
17442
17443          offset = offset + fields.charstrings.length;
17444          dict += self.encodeNumber(fields.privateData.length);
17445          dict += self.encodeNumber(offset) + '\x12'; // Private
17446
17447          return header + String.fromCharCode(dict.length + 1) + dict;
17448        };
17449      })(this),
17450
17451      'strings': (function strings(self) {
17452        var strings = [
17453          'Version 0.11',         // Version
17454          'See original notice',  // Notice
17455          name,                   // FullName
17456          name,                   // FamilyName
17457          'Medium'                // Weight
17458        ];
17459        return self.createCFFIndexHeader(strings);
17460      })(this),
17461
17462      'globalSubrs': this.createCFFIndexHeader([]),
17463
17464      'charset': (function charset(self) {
17465        var charsetString = '\x00'; // Encoding
17466
17467        var count = glyphs.length;
17468        for (var i = 0; i < count; i++) {
17469          var index = CFFStandardStrings.indexOf(charstrings[i].glyph);
17470          // Some characters like asterikmath && circlecopyrt are
17471          // missing from the original strings, for the moment let's
17472          // map them to .notdef and see later if it cause any
17473          // problems
17474          if (index == -1)
17475            index = 0;
17476
17477          charsetString += String.fromCharCode(index >> 8, index & 0xff);
17478        }
17479        return charsetString;
17480      })(this),
17481
17482      'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs),
17483                                               true),
17484
17485      'privateData': (function cffWrapPrivate(self) {
17486        var data =
17487            '\x8b\x14' + // defaultWidth
17488            '\x8b\x15';  // nominalWidth
17489        var fieldMap = {
17490          BlueValues: '\x06',
17491          OtherBlues: '\x07',
17492          FamilyBlues: '\x08',
17493          FamilyOtherBlues: '\x09',
17494          StemSnapH: '\x0c\x0c',
17495          StemSnapV: '\x0c\x0d',
17496          BlueShift: '\x0c\x0a',
17497          BlueFuzz: '\x0c\x0b',
17498          BlueScale: '\x0c\x09',
17499          LanguageGroup: '\x0c\x11',
17500          ExpansionFactor: '\x0c\x18'
17501        };
17502        for (var field in fieldMap) {
17503          if (!properties.privateData.hasOwnProperty(field))
17504            continue;
17505          var value = properties.privateData[field];
17506
17507          if (isArray(value)) {
17508            data += self.encodeNumber(value[0]);
17509            for (var i = 1, ii = value.length; i < ii; i++)
17510              data += self.encodeNumber(value[i] - value[i - 1]);
17511          } else {
17512            data += self.encodeNumber(value);
17513          }
17514          data += fieldMap[field];
17515        }
17516
17517        data += self.encodeNumber(data.length + 4) + '\x13'; // Subrs offset
17518
17519        return data;
17520      })(this),
17521
17522      'localSubrs': this.createCFFIndexHeader(subrs, true)
17523    };
17524    fields.topDict = fields.topDict();
17525
17526
17527    var cff = [];
17528    for (var index in fields) {
17529      var field = fields[index];
17530      for (var i = 0, ii = field.length; i < ii; i++)
17531        cff.push(field.charCodeAt(i));
17532    }
17533
17534    return cff;
17535  }
17536};
17537
17538var CFFFont = (function CFFFontClosure() {
17539  function CFFFont(file, properties) {
17540    this.properties = properties;
17541
17542    var parser = new CFFParser(file, properties);
17543    var cff = parser.parse();
17544    var compiler = new CFFCompiler(cff);
17545    this.readExtra(cff);
17546    try {
17547      this.data = compiler.compile();
17548    } catch (e) {
17549      warn('Failed to compile font ' + properties.loadedName);
17550      // There may have just been an issue with the compiler, set the data
17551      // anyway and hope the font loaded.
17552      this.data = file;
17553    }
17554  }
17555
17556  CFFFont.prototype = {
17557    readExtra: function CFFFont_readExtra(cff) {
17558      // charstrings contains info about glyphs (one element per glyph
17559      // containing mappings for {unicode, width})
17560      var charset = cff.charset.charset;
17561      var encoding = cff.encoding ? cff.encoding.encoding : null;
17562      var charstrings = this.getCharStrings(charset, encoding);
17563
17564      // create the mapping between charstring and glyph id
17565      var glyphIds = [];
17566      for (var i = 0, ii = charstrings.length; i < ii; i++)
17567        glyphIds.push(charstrings[i].gid);
17568
17569      this.charstrings = charstrings;
17570      this.glyphIds = glyphIds;
17571    },
17572    getCharStrings: function CFFFont_getCharStrings(charsets, encoding) {
17573      var charstrings = [];
17574      var unicodeUsed = [];
17575      var unassignedUnicodeItems = [];
17576      var inverseEncoding = [];
17577      // CID fonts don't have an encoding.
17578      if (encoding !== null)
17579        for (var charcode in encoding)
17580          inverseEncoding[encoding[charcode]] = charcode | 0;
17581      else
17582        inverseEncoding = charsets;
17583      for (var i = 0, ii = charsets.length; i < ii; i++) {
17584        var glyph = charsets[i];
17585        if (glyph == '.notdef')
17586          continue;
17587
17588        var code = inverseEncoding[i];
17589        if (!code || isSpecialUnicode(code)) {
17590          unassignedUnicodeItems.push(i);
17591          continue;
17592        }
17593        charstrings.push({
17594          unicode: code,
17595          code: code,
17596          gid: i,
17597          glyph: glyph
17598        });
17599        unicodeUsed[code] = true;
17600      }
17601
17602      var nextUnusedUnicode = kCmapGlyphOffset;
17603      for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; ++j) {
17604        var i = unassignedUnicodeItems[j];
17605        // giving unicode value anyway
17606        while (nextUnusedUnicode in unicodeUsed)
17607          nextUnusedUnicode++;
17608        var unicode = nextUnusedUnicode++;
17609        charstrings.push({
17610          unicode: unicode,
17611          code: inverseEncoding[i] || 0,
17612          gid: i,
17613          glyph: charsets[i]
17614        });
17615      }
17616
17617      // sort the array by the unicode value (again)
17618      charstrings.sort(function getCharStringsSort(a, b) {
17619        return a.unicode - b.unicode;
17620      });
17621      return charstrings;
17622    }
17623  };
17624
17625  return CFFFont;
17626})();
17627
17628var CFFParser = (function CFFParserClosure() {
17629  function CFFParser(file, properties) {
17630    this.bytes = file.getBytes();
17631    this.properties = properties;
17632  }
17633  CFFParser.prototype = {
17634    parse: function CFFParser_parse() {
17635      var properties = this.properties;
17636      var cff = new CFF();
17637      this.cff = cff;
17638
17639      // The first five sections must be in order, all the others are reached
17640      // via offsets contained in one of the below.
17641      var header = this.parseHeader();
17642      var nameIndex = this.parseIndex(header.endPos);
17643      var topDictIndex = this.parseIndex(nameIndex.endPos);
17644      var stringIndex = this.parseIndex(topDictIndex.endPos);
17645      var globalSubrIndex = this.parseIndex(stringIndex.endPos);
17646
17647      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
17648      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
17649
17650      cff.header = header.obj;
17651      cff.names = this.parseNameIndex(nameIndex.obj);
17652      cff.strings = this.parseStringIndex(stringIndex.obj);
17653      cff.topDict = topDict;
17654      cff.globalSubrIndex = globalSubrIndex.obj;
17655
17656      this.parsePrivateDict(cff.topDict);
17657
17658      cff.isCIDFont = topDict.hasName('ROS');
17659
17660      var charStringOffset = topDict.getByName('CharStrings');
17661      cff.charStrings = this.parseCharStrings(charStringOffset);
17662
17663      var charset, encoding;
17664      if (cff.isCIDFont) {
17665        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
17666        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
17667          var dictRaw = fdArrayIndex.get(i);
17668          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),
17669                                         cff.strings);
17670          this.parsePrivateDict(fontDict);
17671          cff.fdArray.push(fontDict);
17672        }
17673        // cid fonts don't have an encoding
17674        encoding = null;
17675        charset = this.parseCharsets(topDict.getByName('charset'),
17676                                     cff.charStrings.count, cff.strings, true);
17677        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),
17678                                             cff.charStrings.count);
17679      } else {
17680        charset = this.parseCharsets(topDict.getByName('charset'),
17681                                     cff.charStrings.count, cff.strings, false);
17682        encoding = this.parseEncoding(topDict.getByName('Encoding'),
17683                                      properties,
17684                                      cff.strings, charset.charset);
17685      }
17686      cff.charset = charset;
17687      cff.encoding = encoding;
17688
17689      return cff;
17690    },
17691    parseHeader: function CFFParser_parseHeader() {
17692      var bytes = this.bytes;
17693      var offset = 0;
17694
17695      while (bytes[offset] != 1)
17696        ++offset;
17697
17698      if (offset != 0) {
17699        warn('cff data is shifted');
17700        bytes = bytes.subarray(offset);
17701        this.bytes = bytes;
17702      }
17703      var major = bytes[0];
17704      var minor = bytes[1];
17705      var hdrSize = bytes[2];
17706      var offSize = bytes[3];
17707      var header = new CFFHeader(major, minor, hdrSize, offSize);
17708      return {obj: header, endPos: hdrSize};
17709    },
17710    parseDict: function CFFParser_parseDict(dict) {
17711      var pos = 0;
17712
17713      function parseOperand() {
17714        var value = dict[pos++];
17715        if (value === 30) {
17716          return parseFloatOperand(pos);
17717        } else if (value === 28) {
17718          value = dict[pos++];
17719          value = (value << 8) | dict[pos++];
17720          return value;
17721        } else if (value === 29) {
17722          value = dict[pos++];
17723          value = (value << 8) | dict[pos++];
17724          value = (value << 8) | dict[pos++];
17725          value = (value << 8) | dict[pos++];
17726          return value;
17727        } else if (value >= 32 && value <= 246) {
17728          return value - 139;
17729        } else if (value >= 247 && value <= 250) {
17730          return ((value - 247) * 256) + dict[pos++] + 108;
17731        } else if (value >= 251 && value <= 254) {
17732          return -((value - 251) * 256) - dict[pos++] - 108;
17733        } else {
17734          error('255 is not a valid DICT command');
17735        }
17736        return -1;
17737      }
17738
17739      function parseFloatOperand() {
17740        var str = '';
17741        var eof = 15;
17742        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
17743            '9', '.', 'E', 'E-', null, '-'];
17744        var length = dict.length;
17745        while (pos < length) {
17746          var b = dict[pos++];
17747          var b1 = b >> 4;
17748          var b2 = b & 15;
17749
17750          if (b1 == eof)
17751            break;
17752          str += lookup[b1];
17753
17754          if (b2 == eof)
17755            break;
17756          str += lookup[b2];
17757        }
17758        return parseFloat(str);
17759      }
17760
17761      var operands = [];
17762      var entries = [];
17763
17764      var pos = 0;
17765      var end = dict.length;
17766      while (pos < end) {
17767        var b = dict[pos];
17768        if (b <= 21) {
17769          if (b === 12)
17770            b = (b << 8) | dict[++pos];
17771          entries.push([b, operands]);
17772          operands = [];
17773          ++pos;
17774        } else {
17775          operands.push(parseOperand());
17776        }
17777      }
17778      return entries;
17779    },
17780    parseIndex: function CFFParser_parseIndex(pos) {
17781      var cffIndex = new CFFIndex();
17782      var bytes = this.bytes;
17783      var count = (bytes[pos++] << 8) | bytes[pos++];
17784      var offsets = [];
17785      var start = pos;
17786      var end = pos;
17787
17788      if (count != 0) {
17789        var offsetSize = bytes[pos++];
17790        // add 1 for offset to determine size of last object
17791        var startPos = pos + ((count + 1) * offsetSize) - 1;
17792
17793        for (var i = 0, ii = count + 1; i < ii; ++i) {
17794          var offset = 0;
17795          for (var j = 0; j < offsetSize; ++j) {
17796            offset <<= 8;
17797            offset += bytes[pos++];
17798          }
17799          offsets.push(startPos + offset);
17800        }
17801        end = offsets[count];
17802      }
17803      for (var i = 0, ii = offsets.length - 1; i < ii; ++i) {
17804        var offsetStart = offsets[i];
17805        var offsetEnd = offsets[i + 1];
17806        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
17807      }
17808      return {obj: cffIndex, endPos: end};
17809    },
17810    parseNameIndex: function CFFParser_parseNameIndex(index) {
17811      var names = [];
17812      for (var i = 0, ii = index.count; i < ii; ++i) {
17813        var name = index.get(i);
17814        // OTS doesn't allow names to be over 127 characters.
17815        var length = Math.min(name.length, 127);
17816        var data = [];
17817        // OTS also only permits certain characters in the name.
17818        for (var j = 0; j < length; ++j) {
17819          var c = name[j];
17820          if (j === 0 && c === 0) {
17821            data[j] = c;
17822            continue;
17823          }
17824          if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ ||
17825              c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ ||
17826              c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ ||
17827              c === 47 /* / */ || c === 37 /* % */) {
17828            data[j] = 95;
17829            continue;
17830          }
17831          data[j] = c;
17832        }
17833        names.push(String.fromCharCode.apply(null, data));
17834      }
17835      return names;
17836    },
17837    parseStringIndex: function CFFParser_parseStringIndex(index) {
17838      var strings = new CFFStrings();
17839      for (var i = 0, ii = index.count; i < ii; ++i) {
17840        var data = index.get(i);
17841        strings.add(String.fromCharCode.apply(null, data));
17842      }
17843      return strings;
17844    },
17845    createDict: function CFFParser_createDict(type, dict, strings) {
17846      var cffDict = new type(strings);
17847      var types = cffDict.types;
17848
17849      for (var i = 0, ii = dict.length; i < ii; ++i) {
17850        var pair = dict[i];
17851        var key = pair[0];
17852        var value = pair[1];
17853        cffDict.setByKey(key, value);
17854      }
17855      return cffDict;
17856    },
17857    parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) {
17858      var charStrings = this.parseIndex(charStringOffset).obj;
17859      // The CFF specification state that the 'dotsection' command
17860      // (12, 0) is deprecated and treated as a no-op, but all Type2
17861      // charstrings processors should support them. Unfortunately
17862      // the font sanitizer don't. As a workaround the sequence (12, 0)
17863      // is replaced by a useless (0, hmoveto).
17864      var count = charStrings.count;
17865      for (var i = 0; i < count; i++) {
17866        var charstring = charStrings.get(i);
17867
17868        var data = charstring;
17869        var length = data.length;
17870        for (var j = 0; j <= length; j) {
17871          var value = data[j++];
17872          if (value == 12 && data[j++] == 0) {
17873              data[j - 2] = 139;
17874              data[j - 1] = 22;
17875          } else if (value === 28) {
17876            j += 2;
17877          } else if (value >= 247 && value <= 254) {
17878            j++;
17879          } else if (value == 255) {
17880            j += 4;
17881          }
17882        }
17883      }
17884      return charStrings;
17885    },
17886    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
17887      // no private dict, do nothing
17888      if (!parentDict.hasName('Private'))
17889        return;
17890      var privateOffset = parentDict.getByName('Private');
17891      // make sure the params are formatted correctly
17892      if (!isArray(privateOffset) || privateOffset.length !== 2) {
17893        parentDict.removeByName('Private');
17894        return;
17895      }
17896      var size = privateOffset[0];
17897      var offset = privateOffset[1];
17898      // remove empty dicts or ones that refer to invalid location
17899      if (size === 0 || offset >= this.bytes.length) {
17900        parentDict.removeByName('Private');
17901        return;
17902      }
17903
17904      var privateDictEnd = offset + size;
17905      var dictData = this.bytes.subarray(offset, privateDictEnd);
17906      var dict = this.parseDict(dictData);
17907      var privateDict = this.createDict(CFFPrivateDict, dict,
17908                                        parentDict.strings);
17909      parentDict.privateDict = privateDict;
17910
17911      // Parse the Subrs index also since it's relative to the private dict.
17912      if (!privateDict.getByName('Subrs'))
17913        return;
17914      var subrsOffset = privateDict.getByName('Subrs');
17915      var relativeOffset = offset + subrsOffset;
17916      // Validate the offset.
17917      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
17918        privateDict.removeByName('Subrs');
17919        return;
17920      }
17921      var subrsIndex = this.parseIndex(relativeOffset);
17922      privateDict.subrsIndex = subrsIndex.obj;
17923    },
17924    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
17925      if (pos == 0) {
17926        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,
17927                              ISOAdobeCharset);
17928      } else if (pos == 1) {
17929        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,
17930                              ExpertCharset);
17931      } else if (pos == 2) {
17932        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,
17933                              ExpertSubsetCharset);
17934      }
17935
17936      var bytes = this.bytes;
17937      var start = pos;
17938      var format = bytes[pos++];
17939      var charset = ['.notdef'];
17940
17941      // subtract 1 for the .notdef glyph
17942      length -= 1;
17943
17944      switch (format) {
17945        case 0:
17946          for (var i = 0; i < length; i++) {
17947            var id = (bytes[pos++] << 8) | bytes[pos++];
17948            charset.push(cid ? id : strings.get(id));
17949          }
17950          break;
17951        case 1:
17952          while (charset.length <= length) {
17953            var id = (bytes[pos++] << 8) | bytes[pos++];
17954            var count = bytes[pos++];
17955            for (var i = 0; i <= count; i++)
17956              charset.push(cid ? id++ : strings.get(id++));
17957          }
17958          break;
17959        case 2:
17960          while (charset.length <= length) {
17961            var id = (bytes[pos++] << 8) | bytes[pos++];
17962            var count = (bytes[pos++] << 8) | bytes[pos++];
17963            for (var i = 0; i <= count; i++)
17964              charset.push(cid ? id++ : strings.get(id++));
17965          }
17966          break;
17967        default:
17968          error('Unknown charset format');
17969      }
17970      // Raw won't be needed if we actually compile the charset.
17971      var end = pos;
17972      var raw = bytes.subarray(start, end);
17973
17974      return new CFFCharset(false, format, charset, raw);
17975    },
17976    parseEncoding: function CFFParser_parseEncoding(pos,
17977                                                    properties,
17978                                                    strings,
17979                                                    charset) {
17980      var encoding = {};
17981      var bytes = this.bytes;
17982      var predefined = false;
17983      var hasSupplement = false;
17984      var format;
17985      var raw = null;
17986
17987      function readSupplement() {
17988        var supplementsCount = bytes[pos++];
17989        for (var i = 0; i < supplementsCount; i++) {
17990          var code = bytes[pos++];
17991          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
17992          encoding[code] = properties.differences.indexOf(strings.get(sid));
17993        }
17994      }
17995
17996      if (pos == 0 || pos == 1) {
17997        predefined = true;
17998        format = pos;
17999        var gid = 1;
18000        var baseEncoding = pos ? Encodings.ExpertEncoding :
18001                                 Encodings.StandardEncoding;
18002        for (var i = 0, ii = charset.length; i < ii; i++) {
18003          var index = baseEncoding.indexOf(charset[i]);
18004          if (index != -1)
18005            encoding[index] = gid++;
18006        }
18007      } else {
18008        var dataStart = pos;
18009        var format = bytes[pos++];
18010        switch (format & 0x7f) {
18011          case 0:
18012            var glyphsCount = bytes[pos++];
18013            for (var i = 1; i <= glyphsCount; i++)
18014              encoding[bytes[pos++]] = i;
18015            break;
18016
18017          case 1:
18018            var rangesCount = bytes[pos++];
18019            var gid = 1;
18020            for (var i = 0; i < rangesCount; i++) {
18021              var start = bytes[pos++];
18022              var left = bytes[pos++];
18023              for (var j = start; j <= start + left; j++)
18024                encoding[j] = gid++;
18025            }
18026            break;
18027
18028          default:
18029            error('Unknow encoding format: ' + format + ' in CFF');
18030            break;
18031        }
18032        var dataEnd = pos;
18033        if (format & 0x80) {
18034          // The font sanitizer does not support CFF encoding with a
18035          // supplement, since the encoding is not really used to map
18036          // between gid to glyph, let's overwrite what is declared in
18037          // the top dictionary to let the sanitizer think the font use
18038          // StandardEncoding, that's a lie but that's ok.
18039          bytes[dataStart] &= 0x7f;
18040          readSupplement();
18041          hasSupplement = true;
18042        }
18043        raw = bytes.subarray(dataStart, dataEnd);
18044      }
18045      format = format & 0x7f;
18046      return new CFFEncoding(predefined, format, encoding, raw);
18047    },
18048    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
18049      var start = pos;
18050      var bytes = this.bytes;
18051      var format = bytes[pos++];
18052      var fdSelect = [];
18053      switch (format) {
18054        case 0:
18055          for (var i = 0; i < length; ++i) {
18056            var id = bytes[pos++];
18057            fdSelect.push(id);
18058          }
18059          break;
18060        case 3:
18061          var rangesCount = (bytes[pos++] << 8) | bytes[pos++];
18062          for (var i = 0; i < rangesCount; ++i) {
18063            var first = (bytes[pos++] << 8) | bytes[pos++];
18064            var fdIndex = bytes[pos++];
18065            var next = (bytes[pos] << 8) | bytes[pos + 1];
18066            for (var j = first; j < next; ++j)
18067              fdSelect.push(fdIndex);
18068          }
18069          // Advance past the sentinel(next).
18070          pos += 2;
18071          break;
18072        default:
18073          error('Unknown fdselect format ' + format);
18074          break;
18075      }
18076      var end = pos;
18077      return new CFFFDSelect(fdSelect, bytes.subarray(start, end));
18078    }
18079  };
18080  return CFFParser;
18081})();
18082
18083// Compact Font Format
18084var CFF = (function CFFClosure() {
18085  function CFF() {
18086    this.header = null;
18087    this.names = [];
18088    this.topDict = null;
18089    this.strings = new CFFStrings();
18090    this.globalSubrIndex = null;
18091
18092    // The following could really be per font, but since we only have one font
18093    // store them here.
18094    this.encoding = null;
18095    this.charset = null;
18096    this.charStrings = null;
18097    this.fdArray = [];
18098    this.fdSelect = null;
18099
18100    this.isCIDFont = false;
18101  }
18102  return CFF;
18103})();
18104
18105var CFFHeader = (function CFFHeaderClosure() {
18106  function CFFHeader(major, minor, hdrSize, offSize) {
18107    this.major = major;
18108    this.minor = minor;
18109    this.hdrSize = hdrSize;
18110    this.offSize = offSize;
18111  }
18112  return CFFHeader;
18113})();
18114
18115var CFFStrings = (function CFFStringsClosure() {
18116  function CFFStrings() {
18117    this.strings = [];
18118  }
18119  CFFStrings.prototype = {
18120    get: function CFFStrings_get(index) {
18121      if (index >= 0 && index <= 390)
18122        return CFFStandardStrings[index];
18123      if (index - 391 <= this.strings.length)
18124        return this.strings[index - 391];
18125      return CFFStandardStrings[0];
18126    },
18127    add: function CFFStrings_add(value) {
18128      this.strings.push(value);
18129    },
18130    get count() {
18131      return this.strings.length;
18132    }
18133  };
18134  return CFFStrings;
18135})();
18136
18137var CFFIndex = (function CFFIndexClosure() {
18138  function CFFIndex() {
18139    this.objects = [];
18140    this.length = 0;
18141  }
18142  CFFIndex.prototype = {
18143    add: function CFFIndex_add(data) {
18144      this.length += data.length;
18145      this.objects.push(data);
18146    },
18147    get: function CFFIndex_get(index) {
18148      return this.objects[index];
18149    },
18150    get count() {
18151      return this.objects.length;
18152    }
18153  };
18154  return CFFIndex;
18155})();
18156
18157var CFFDict = (function CFFDictClosure() {
18158  function CFFDict(tables, strings) {
18159    this.keyToNameMap = tables.keyToNameMap;
18160    this.nameToKeyMap = tables.nameToKeyMap;
18161    this.defaults = tables.defaults;
18162    this.types = tables.types;
18163    this.opcodes = tables.opcodes;
18164    this.order = tables.order;
18165    this.strings = strings;
18166    this.values = {};
18167  }
18168  CFFDict.prototype = {
18169    // value should always be an array
18170    setByKey: function CFFDict_setByKey(key, value) {
18171      if (!(key in this.keyToNameMap))
18172        return false;
18173      // ignore empty values
18174      if (value.length === 0)
18175        return true;
18176      var type = this.types[key];
18177      // remove the array wrapping these types of values
18178      if (type === 'num' || type === 'sid' || type === 'offset')
18179        value = value[0];
18180      this.values[key] = value;
18181      return true;
18182    },
18183    hasName: function CFFDict_hasName(name) {
18184      return this.nameToKeyMap[name] in this.values;
18185    },
18186    getByName: function CFFDict_getByName(name) {
18187      if (!(name in this.nameToKeyMap))
18188        error('Invalid dictionary name "' + name + '"');
18189      var key = this.nameToKeyMap[name];
18190      if (!(key in this.values))
18191        return this.defaults[key];
18192      return this.values[key];
18193    },
18194    removeByName: function CFFDict_removeByName(name) {
18195      delete this.values[this.nameToKeyMap[name]];
18196    }
18197  };
18198  CFFDict.createTables = function CFFDict_createTables(layout) {
18199    var tables = {
18200      keyToNameMap: {},
18201      nameToKeyMap: {},
18202      defaults: {},
18203      types: {},
18204      opcodes: {},
18205      order: []
18206    };
18207    for (var i = 0, ii = layout.length; i < ii; ++i) {
18208      var entry = layout[i];
18209      var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
18210      tables.keyToNameMap[key] = entry[1];
18211      tables.nameToKeyMap[entry[1]] = key;
18212      tables.types[key] = entry[2];
18213      tables.defaults[key] = entry[3];
18214      tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]];
18215      tables.order.push(key);
18216    }
18217    return tables;
18218  };
18219  return CFFDict;
18220})();
18221
18222var CFFTopDict = (function CFFTopDictClosure() {
18223  var layout = [
18224    [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],
18225    [[12, 20], 'SyntheticBase', 'num', null],
18226    [0, 'version', 'sid', null],
18227    [1, 'Notice', 'sid', null],
18228    [[12, 0], 'Copyright', 'sid', null],
18229    [2, 'FullName', 'sid', null],
18230    [3, 'FamilyName', 'sid', null],
18231    [4, 'Weight', 'sid', null],
18232    [[12, 1], 'isFixedPitch', 'num', 0],
18233    [[12, 2], 'ItalicAngle', 'num', 0],
18234    [[12, 3], 'UnderlinePosition', 'num', -100],
18235    [[12, 4], 'UnderlineThickness', 'num', 50],
18236    [[12, 5], 'PaintType', 'num', 0],
18237    [[12, 6], 'CharstringType', 'num', 2],
18238    [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],
18239                            [.001, 0, 0, .001, 0, 0]],
18240    [13, 'UniqueID', 'num', null],
18241    [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],
18242    [[12, 8], 'StrokeWidth', 'num', 0],
18243    [14, 'XUID', 'array', null],
18244    [15, 'charset', 'offset', 0],
18245    [16, 'Encoding', 'offset', 0],
18246    [17, 'CharStrings', 'offset', 0],
18247    [18, 'Private', ['offset', 'offset'], null],
18248    [[12, 21], 'PostScript', 'sid', null],
18249    [[12, 22], 'BaseFontName', 'sid', null],
18250    [[12, 23], 'BaseFontBlend', 'delta', null],
18251    [[12, 31], 'CIDFontVersion', 'num', 0],
18252    [[12, 32], 'CIDFontRevision', 'num', 0],
18253    [[12, 33], 'CIDFontType', 'num', 0],
18254    [[12, 34], 'CIDCount', 'num', 8720],
18255    [[12, 35], 'UIDBase', 'num', null],
18256    [[12, 36], 'FDArray', 'offset', null],
18257    [[12, 37], 'FDSelect', 'offset', null],
18258    [[12, 38], 'FontName', 'sid', null]];
18259  var tables = null;
18260  function CFFTopDict(strings) {
18261    if (tables === null)
18262      tables = CFFDict.createTables(layout);
18263    CFFDict.call(this, tables, strings);
18264    this.privateDict = null;
18265  }
18266  CFFTopDict.prototype = Object.create(CFFDict.prototype);
18267  return CFFTopDict;
18268})();
18269
18270var CFFPrivateDict = (function CFFPrivateDictClosure() {
18271  var layout = [
18272    [6, 'BlueValues', 'delta', null],
18273    [7, 'OtherBlues', 'delta', null],
18274    [8, 'FamilyBlues', 'delta', null],
18275    [9, 'FamilyOtherBlues', 'delta', null],
18276    [[12, 9], 'BlueScale', 'num', 0.039625],
18277    [[12, 10], 'BlueShift', 'num', 7],
18278    [[12, 11], 'BlueFuzz', 'num', 1],
18279    [10, 'StdHW', 'num', null],
18280    [11, 'StdVW', 'num', null],
18281    [[12, 12], 'StemSnapH', 'delta', null],
18282    [[12, 13], 'StemSnapV', 'delta', null],
18283    [[12, 14], 'ForceBold', 'num', 0],
18284    [[12, 17], 'LanguageGroup', 'num', 0],
18285    [[12, 18], 'ExpansionFactor', 'num', 0.06],
18286    [[12, 19], 'initialRandomSeed', 'num', 0],
18287    [19, 'Subrs', 'offset', null],
18288    [20, 'defaultWidthX', 'num', 0],
18289    [21, 'nominalWidthX', 'num', 0]
18290  ];
18291  var tables = null;
18292  function CFFPrivateDict(strings) {
18293    if (tables === null)
18294      tables = CFFDict.createTables(layout);
18295    CFFDict.call(this, tables, strings);
18296    this.subrsIndex = null;
18297  }
18298  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
18299  return CFFPrivateDict;
18300})();
18301
18302var CFFCharsetPredefinedTypes = {
18303  ISO_ADOBE: 0,
18304  EXPERT: 1,
18305  EXPERT_SUBSET: 2
18306};
18307var CFFCharsetEmbeddedTypes = {
18308  FORMAT0: 0,
18309  FORMAT1: 1,
18310  FORMAT2: 2
18311};
18312var CFFCharset = (function CFFCharsetClosure() {
18313  function CFFCharset(predefined, format, charset, raw) {
18314    this.predefined = predefined;
18315    this.format = format;
18316    this.charset = charset;
18317    this.raw = raw;
18318  }
18319  return CFFCharset;
18320})();
18321
18322var CFFEncodingPredefinedTypes = {
18323  STANDARD: 0,
18324  EXPERT: 1
18325};
18326var CFFCharsetEmbeddedTypes = {
18327  FORMAT0: 0,
18328  FORMAT1: 1
18329};
18330var CFFEncoding = (function CFFEncodingClosure() {
18331  function CFFEncoding(predefined, format, encoding, raw) {
18332    this.predefined = predefined;
18333    this.format = format;
18334    this.encoding = encoding;
18335    this.raw = raw;
18336  }
18337  return CFFEncoding;
18338})();
18339
18340var CFFFDSelect = (function CFFFDSelectClosure() {
18341  function CFFFDSelect(fdSelect, raw) {
18342    this.fdSelect = fdSelect;
18343    this.raw = raw;
18344  }
18345  return CFFFDSelect;
18346})();
18347
18348// Helper class to keep track of where an offset is within the data and helps
18349// filling in that offset once it's known.
18350var CFFOffsetTracker = (function CFFOffsetTrackerClosure() {
18351  function CFFOffsetTracker() {
18352    this.offsets = {};
18353  }
18354  CFFOffsetTracker.prototype = {
18355    isTracking: function CFFOffsetTracker_isTracking(key) {
18356      return key in this.offsets;
18357    },
18358    track: function CFFOffsetTracker_track(key, location) {
18359      if (key in this.offsets)
18360        error('Already tracking location of ' + key);
18361      this.offsets[key] = location;
18362    },
18363    offset: function CFFOffsetTracker_offset(value) {
18364      for (var key in this.offsets) {
18365        this.offsets[key] += value;
18366      }
18367    },
18368    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,
18369                                                                 values,
18370                                                                 output) {
18371      if (!(key in this.offsets))
18372        error('Not tracking location of ' + key);
18373      var data = output.data;
18374      var dataOffset = this.offsets[key];
18375      var size = 5;
18376      for (var i = 0, ii = values.length; i < ii; ++i) {
18377        var offset0 = i * size + dataOffset;
18378        var offset1 = offset0 + 1;
18379        var offset2 = offset0 + 2;
18380        var offset3 = offset0 + 3;
18381        var offset4 = offset0 + 4;
18382        // It's easy to screw up offsets so perform this sanity check.
18383        if (data[offset0] !== 0x1d || data[offset1] !== 0 ||
18384            data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0)
18385          error('writing to an offset that is not empty');
18386        var value = values[i];
18387        data[offset0] = 0x1d;
18388        data[offset1] = (value >> 24) & 0xFF;
18389        data[offset2] = (value >> 16) & 0xFF;
18390        data[offset3] = (value >> 8) & 0xFF;
18391        data[offset4] = value & 0xFF;
18392      }
18393    }
18394  };
18395  return CFFOffsetTracker;
18396})();
18397
18398// Takes a CFF and converts it to the binary representation.
18399var CFFCompiler = (function CFFCompilerClosure() {
18400  function stringToArray(str) {
18401    var array = [];
18402    for (var i = 0, ii = str.length; i < ii; ++i)
18403      array[i] = str.charCodeAt(i);
18404
18405    return array;
18406  };
18407  function CFFCompiler(cff) {
18408    this.cff = cff;
18409  }
18410  CFFCompiler.prototype = {
18411    compile: function CFFCompiler_compile() {
18412      var cff = this.cff;
18413      var output = {
18414        data: [],
18415        length: 0,
18416        add: function CFFCompiler_add(data) {
18417          this.data = this.data.concat(data);
18418          this.length = this.data.length;
18419        }
18420      };
18421
18422      // Compile the five entries that must be in order.
18423      var header = this.compileHeader(cff.header);
18424      output.add(header);
18425
18426      var nameIndex = this.compileNameIndex(cff.names);
18427      output.add(nameIndex);
18428
18429      var compiled = this.compileTopDicts([cff.topDict], output.length);
18430      output.add(compiled.output);
18431      var topDictTracker = compiled.trackers[0];
18432
18433      var stringIndex = this.compileStringIndex(cff.strings.strings);
18434      output.add(stringIndex);
18435
18436      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
18437      output.add(globalSubrIndex);
18438
18439      // Now start on the other entries that have no specfic order.
18440      if (cff.encoding && cff.topDict.hasName('Encoding')) {
18441        if (cff.encoding.predefined) {
18442          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],
18443                                          output);
18444        } else {
18445          var encoding = this.compileEncoding(cff.encoding);
18446          topDictTracker.setEntryLocation('Encoding', [output.length], output);
18447          output.add(encoding);
18448        }
18449      }
18450
18451      if (cff.charset && cff.topDict.hasName('charset')) {
18452        if (cff.charset.predefined) {
18453          topDictTracker.setEntryLocation('charset', [cff.charset.format],
18454                                          output);
18455        } else {
18456          var charset = this.compileCharset(cff.charset);
18457          topDictTracker.setEntryLocation('charset', [output.length], output);
18458          output.add(charset);
18459        }
18460      }
18461
18462      var charStrings = this.compileCharStrings(cff.charStrings);
18463      topDictTracker.setEntryLocation('CharStrings', [output.length], output);
18464      output.add(charStrings);
18465
18466      if (cff.isCIDFont) {
18467        // For some reason FDSelect must be in front of FDArray on windows. OSX
18468        // and linux don't seem to care.
18469        topDictTracker.setEntryLocation('FDSelect', [output.length], output);
18470        var fdSelect = this.compileFDSelect(cff.fdSelect.raw);
18471        output.add(fdSelect);
18472
18473        var compiled = this.compileTopDicts(cff.fdArray, output.length);
18474        topDictTracker.setEntryLocation('FDArray', [output.length], output);
18475        output.add(compiled.output);
18476        var fontDictTrackers = compiled.trackers;
18477
18478        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
18479      }
18480
18481      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
18482
18483      return output.data;
18484    },
18485    encodeNumber: function CFFCompiler_encodeNumber(value) {
18486      if (parseFloat(value) == parseInt(value) && !isNaN(value)) // isInt
18487        return this.encodeInteger(value);
18488      else
18489        return this.encodeFloat(value);
18490    },
18491    encodeFloat: function CFFCompiler_encodeFloat(value) {
18492      value = value.toString();
18493      // Strip off the any leading zeros.
18494      if (value.substr(0, 2) === '0.')
18495        value = value.substr(1);
18496      else if (value.substr(0, 3) === '-0.')
18497        value = '-' + value.substr(2);
18498      var nibbles = [];
18499      for (var i = 0, ii = value.length; i < ii; ++i) {
18500        var a = value.charAt(i), b = value.charAt(i + 1);
18501        var nibble;
18502        if (a === 'e' && b === '-') {
18503          nibble = 0xc;
18504          ++i;
18505        } else if (a === '.') {
18506          nibble = 0xa;
18507        } else if (a === 'E') {
18508          nibble = 0xb;
18509        } else if (a === '-') {
18510          nibble = 0xe;
18511        } else {
18512          nibble = a;
18513        }
18514        nibbles.push(nibble);
18515      }
18516      nibbles.push(0xf);
18517      if (nibbles.length % 2)
18518        nibbles.push(0xf);
18519      var out = [30];
18520      for (var i = 0, ii = nibbles.length; i < ii; i += 2)
18521        out.push(nibbles[i] << 4 | nibbles[i + 1]);
18522      return out;
18523    },
18524    encodeInteger: function CFFCompiler_encodeInteger(value) {
18525      var code;
18526      if (value >= -107 && value <= 107) {
18527        code = [value + 139];
18528      } else if (value >= 108 && value <= 1131) {
18529        value = [value - 108];
18530        code = [(value >> 8) + 247, value & 0xFF];
18531      } else if (value >= -1131 && value <= -108) {
18532        value = -value - 108;
18533        code = [(value >> 8) + 251, value & 0xFF];
18534      } else if (value >= -32768 && value <= 32767) {
18535        code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];
18536      } else {
18537        code = [0x1d,
18538                (value >> 24) & 0xFF,
18539                (value >> 16) & 0xFF,
18540                (value >> 8) & 0xFF,
18541                 value & 0xFF];
18542      }
18543      return code;
18544    },
18545    compileHeader: function CFFCompiler_compileHeader(header) {
18546      return [
18547        header.major,
18548        header.minor,
18549        header.hdrSize,
18550        header.offSize
18551      ];
18552    },
18553    compileNameIndex: function CFFCompiler_compileNameIndex(names) {
18554      var nameIndex = new CFFIndex();
18555      for (var i = 0, ii = names.length; i < ii; ++i)
18556        nameIndex.add(stringToArray(names[i]));
18557      return this.compileIndex(nameIndex);
18558    },
18559    compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length) {
18560      var fontDictTrackers = [];
18561      var fdArrayIndex = new CFFIndex();
18562      for (var i = 0, ii = dicts.length; i < ii; ++i) {
18563        var fontDict = dicts[i];
18564        var fontDictTracker = new CFFOffsetTracker();
18565        var fontDictData = this.compileDict(fontDict, fontDictTracker);
18566        fontDictTrackers.push(fontDictTracker);
18567        fdArrayIndex.add(fontDictData);
18568        fontDictTracker.offset(length);
18569      }
18570      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
18571      return {
18572        trackers: fontDictTrackers,
18573        output: fdArrayIndex
18574      };
18575    },
18576    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,
18577                                                                  trackers,
18578                                                                  output) {
18579      for (var i = 0, ii = dicts.length; i < ii; ++i) {
18580        var fontDict = dicts[i];
18581        if (!fontDict.privateDict || !fontDict.hasName('Private'))
18582          continue;
18583        var privateDict = fontDict.privateDict;
18584        var privateDictTracker = new CFFOffsetTracker();
18585        var privateDictData = this.compileDict(privateDict, privateDictTracker);
18586
18587        privateDictTracker.offset(output.length);
18588        trackers[i].setEntryLocation('Private',
18589                                     [privateDictData.length, output.length],
18590                                     output);
18591        output.add(privateDictData);
18592
18593        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
18594          var subrs = this.compileIndex(privateDict.subrsIndex);
18595          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],
18596                                              output);
18597          output.add(subrs);
18598        }
18599      }
18600    },
18601    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
18602      var out = [];
18603      // The dictionary keys must be in a certain order.
18604      var order = dict.order;
18605      for (var i = 0; i < order.length; ++i) {
18606        var key = order[i];
18607        if (!(key in dict.values))
18608          continue;
18609        var values = dict.values[key];
18610        var types = dict.types[key];
18611        if (!isArray(types)) types = [types];
18612        if (!isArray(values)) values = [values];
18613
18614        // Remove any empty dict values.
18615        if (values.length === 0)
18616          continue;
18617
18618        for (var j = 0, jj = types.length; j < jj; ++j) {
18619          var type = types[j];
18620          var value = values[j];
18621          switch (type) {
18622            case 'num':
18623            case 'sid':
18624              out = out.concat(this.encodeNumber(value));
18625              break;
18626            case 'offset':
18627              // For offsets we just insert a 32bit integer so we don't have to
18628              // deal with figuring out the length of the offset when it gets
18629              // replaced later on by the compiler.
18630              var name = dict.keyToNameMap[key];
18631              // Some offsets have the offset and the length, so just record the
18632              // position of the first one.
18633              if (!offsetTracker.isTracking(name))
18634                offsetTracker.track(name, out.length);
18635              out = out.concat([0x1d, 0, 0, 0, 0]);
18636              break;
18637            case 'array':
18638            case 'delta':
18639              out = out.concat(this.encodeNumber(value));
18640              for (var k = 1, kk = values.length; k < kk; ++k)
18641                out = out.concat(this.encodeNumber(values[k]));
18642              break;
18643            default:
18644              error('Unknown data type of ' + type);
18645              break;
18646          }
18647        }
18648        out = out.concat(dict.opcodes[key]);
18649      }
18650      return out;
18651    },
18652    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
18653      var stringIndex = new CFFIndex();
18654      for (var i = 0, ii = strings.length; i < ii; ++i)
18655        stringIndex.add(stringToArray(strings[i]));
18656      return this.compileIndex(stringIndex);
18657    },
18658    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
18659      var globalSubrIndex = this.cff.globalSubrIndex;
18660      this.out.writeByteArray(this.compileIndex(globalSubrIndex));
18661    },
18662    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
18663      return this.compileIndex(charStrings);
18664    },
18665    compileCharset: function CFFCompiler_compileCharset(charset) {
18666      return this.compileTypedArray(charset.raw);
18667    },
18668    compileEncoding: function CFFCompiler_compileEncoding(encoding) {
18669      return this.compileTypedArray(encoding.raw);
18670    },
18671    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
18672      return this.compileTypedArray(fdSelect);
18673    },
18674    compileTypedArray: function CFFCompiler_compileTypedArray(data) {
18675      var out = [];
18676      for (var i = 0, ii = data.length; i < ii; ++i)
18677        out[i] = data[i];
18678      return out;
18679    },
18680    compileIndex: function CFFCompiler_compileIndex(index, trackers) {
18681      trackers = trackers || [];
18682      var objects = index.objects;
18683      // First 2 bytes contains the number of objects contained into this index
18684      var count = objects.length;
18685
18686      // If there is no object, just create an index. This technically
18687      // should just be [0, 0] but OTS has an issue with that.
18688      if (count == 0)
18689        return [0, 0, 0];
18690
18691      var data = [(count >> 8) & 0xFF, count & 0xff];
18692
18693      var lastOffset = 1;
18694      for (var i = 0; i < count; ++i)
18695        lastOffset += objects[i].length;
18696
18697      var offsetSize;
18698      if (lastOffset < 0x100)
18699        offsetSize = 1;
18700      else if (lastOffset < 0x10000)
18701        offsetSize = 2;
18702      else if (lastOffset < 0x1000000)
18703        offsetSize = 3;
18704      else
18705        offsetSize = 4;
18706
18707      // Next byte contains the offset size use to reference object in the file
18708      data.push(offsetSize);
18709
18710      // Add another offset after this one because we need a new offset
18711      var relativeOffset = 1;
18712      for (var i = 0; i < count + 1; i++) {
18713        if (offsetSize === 1) {
18714          data.push(relativeOffset & 0xFF);
18715        } else if (offsetSize === 2) {
18716          data.push((relativeOffset >> 8) & 0xFF,
18717                     relativeOffset & 0xFF);
18718        } else if (offsetSize === 3) {
18719          data.push((relativeOffset >> 16) & 0xFF,
18720                    (relativeOffset >> 8) & 0xFF,
18721                     relativeOffset & 0xFF);
18722        } else {
18723          data.push((relativeOffset >>> 24) & 0xFF,
18724                    (relativeOffset >> 16) & 0xFF,
18725                    (relativeOffset >> 8) & 0xFF,
18726                     relativeOffset & 0xFF);
18727        }
18728
18729        if (objects[i])
18730          relativeOffset += objects[i].length;
18731      }
18732      var offset = data.length;
18733
18734      for (var i = 0; i < count; i++) {
18735        // Notify the tracker where the object will be offset in the data.
18736        if (trackers[i])
18737          trackers[i].offset(data.length);
18738        for (var j = 0, jj = objects[i].length; j < jj; j++)
18739          data.push(objects[i][j]);
18740      }
18741      return data;
18742    }
18743  };
18744  return CFFCompiler;
18745})();
18746
18747
18748/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
18749/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
18750
18751'use strict';
18752
18753var GlyphsUnicode = {
18754  A: 0x0041,
18755  AE: 0x00C6,
18756  AEacute: 0x01FC,
18757  AEmacron: 0x01E2,
18758  AEsmall: 0xF7E6,
18759  Aacute: 0x00C1,
18760  Aacutesmall: 0xF7E1,
18761  Abreve: 0x0102,
18762  Abreveacute: 0x1EAE,
18763  Abrevecyrillic: 0x04D0,
18764  Abrevedotbelow: 0x1EB6,
18765  Abrevegrave: 0x1EB0,
18766  Abrevehookabove: 0x1EB2,
18767  Abrevetilde: 0x1EB4,
18768  Acaron: 0x01CD,
18769  Acircle: 0x24B6,
18770  Acircumflex: 0x00C2,
18771  Acircumflexacute: 0x1EA4,
18772  Acircumflexdotbelow: 0x1EAC,
18773  Acircumflexgrave: 0x1EA6,
18774  Acircumflexhookabove: 0x1EA8,
18775  Acircumflexsmall: 0xF7E2,
18776  Acircumflextilde: 0x1EAA,
18777  Acute: 0xF6C9,
18778  Acutesmall: 0xF7B4,
18779  Acyrillic: 0x0410,
18780  Adblgrave: 0x0200,
18781  Adieresis: 0x00C4,
18782  Adieresiscyrillic: 0x04D2,
18783  Adieresismacron: 0x01DE,
18784  Adieresissmall: 0xF7E4,
18785  Adotbelow: 0x1EA0,
18786  Adotmacron: 0x01E0,
18787  Agrave: 0x00C0,
18788  Agravesmall: 0xF7E0,
18789  Ahookabove: 0x1EA2,
18790  Aiecyrillic: 0x04D4,
18791  Ainvertedbreve: 0x0202,
18792  Alpha: 0x0391,
18793  Alphatonos: 0x0386,
18794  Amacron: 0x0100,
18795  Amonospace: 0xFF21,
18796  Aogonek: 0x0104,
18797  Aring: 0x00C5,
18798  Aringacute: 0x01FA,
18799  Aringbelow: 0x1E00,
18800  Aringsmall: 0xF7E5,
18801  Asmall: 0xF761,
18802  Atilde: 0x00C3,
18803  Atildesmall: 0xF7E3,
18804  Aybarmenian: 0x0531,
18805  B: 0x0042,
18806  Bcircle: 0x24B7,
18807  Bdotaccent: 0x1E02,
18808  Bdotbelow: 0x1E04,
18809  Becyrillic: 0x0411,
18810  Benarmenian: 0x0532,
18811  Beta: 0x0392,
18812  Bhook: 0x0181,
18813  Blinebelow: 0x1E06,
18814  Bmonospace: 0xFF22,
18815  Brevesmall: 0xF6F4,
18816  Bsmall: 0xF762,
18817  Btopbar: 0x0182,
18818  C: 0x0043,
18819  Caarmenian: 0x053E,
18820  Cacute: 0x0106,
18821  Caron: 0xF6CA,
18822  Caronsmall: 0xF6F5,
18823  Ccaron: 0x010C,
18824  Ccedilla: 0x00C7,
18825  Ccedillaacute: 0x1E08,
18826  Ccedillasmall: 0xF7E7,
18827  Ccircle: 0x24B8,
18828  Ccircumflex: 0x0108,
18829  Cdot: 0x010A,
18830  Cdotaccent: 0x010A,
18831  Cedillasmall: 0xF7B8,
18832  Chaarmenian: 0x0549,
18833  Cheabkhasiancyrillic: 0x04BC,
18834  Checyrillic: 0x0427,
18835  Chedescenderabkhasiancyrillic: 0x04BE,
18836  Chedescendercyrillic: 0x04B6,
18837  Chedieresiscyrillic: 0x04F4,
18838  Cheharmenian: 0x0543,
18839  Chekhakassiancyrillic: 0x04CB,
18840  Cheverticalstrokecyrillic: 0x04B8,
18841  Chi: 0x03A7,
18842  Chook: 0x0187,
18843  Circumflexsmall: 0xF6F6,
18844  Cmonospace: 0xFF23,
18845  Coarmenian: 0x0551,
18846  Csmall: 0xF763,
18847  D: 0x0044,
18848  DZ: 0x01F1,
18849  DZcaron: 0x01C4,
18850  Daarmenian: 0x0534,
18851  Dafrican: 0x0189,
18852  Dcaron: 0x010E,
18853  Dcedilla: 0x1E10,
18854  Dcircle: 0x24B9,
18855  Dcircumflexbelow: 0x1E12,
18856  Dcroat: 0x0110,
18857  Ddotaccent: 0x1E0A,
18858  Ddotbelow: 0x1E0C,
18859  Decyrillic: 0x0414,
18860  Deicoptic: 0x03EE,
18861  Delta: 0x2206,
18862  Deltagreek: 0x0394,
18863  Dhook: 0x018A,
18864  Dieresis: 0xF6CB,
18865  DieresisAcute: 0xF6CC,
18866  DieresisGrave: 0xF6CD,
18867  Dieresissmall: 0xF7A8,
18868  Digammagreek: 0x03DC,
18869  Djecyrillic: 0x0402,
18870  Dlinebelow: 0x1E0E,
18871  Dmonospace: 0xFF24,
18872  Dotaccentsmall: 0xF6F7,
18873  Dslash: 0x0110,
18874  Dsmall: 0xF764,
18875  Dtopbar: 0x018B,
18876  Dz: 0x01F2,
18877  Dzcaron: 0x01C5,
18878  Dzeabkhasiancyrillic: 0x04E0,
18879  Dzecyrillic: 0x0405,
18880  Dzhecyrillic: 0x040F,
18881  E: 0x0045,
18882  Eacute: 0x00C9,
18883  Eacutesmall: 0xF7E9,
18884  Ebreve: 0x0114,
18885  Ecaron: 0x011A,
18886  Ecedillabreve: 0x1E1C,
18887  Echarmenian: 0x0535,
18888  Ecircle: 0x24BA,
18889  Ecircumflex: 0x00CA,
18890  Ecircumflexacute: 0x1EBE,
18891  Ecircumflexbelow: 0x1E18,
18892  Ecircumflexdotbelow: 0x1EC6,
18893  Ecircumflexgrave: 0x1EC0,
18894  Ecircumflexhookabove: 0x1EC2,
18895  Ecircumflexsmall: 0xF7EA,
18896  Ecircumflextilde: 0x1EC4,
18897  Ecyrillic: 0x0404,
18898  Edblgrave: 0x0204,
18899  Edieresis: 0x00CB,
18900  Edieresissmall: 0xF7EB,
18901  Edot: 0x0116,
18902  Edotaccent: 0x0116,
18903  Edotbelow: 0x1EB8,
18904  Efcyrillic: 0x0424,
18905  Egrave: 0x00C8,
18906  Egravesmall: 0xF7E8,
18907  Eharmenian: 0x0537,
18908  Ehookabove: 0x1EBA,
18909  Eightroman: 0x2167,
18910  Einvertedbreve: 0x0206,
18911  Eiotifiedcyrillic: 0x0464,
18912  Elcyrillic: 0x041B,
18913  Elevenroman: 0x216A,
18914  Emacron: 0x0112,
18915  Emacronacute: 0x1E16,
18916  Emacrongrave: 0x1E14,
18917  Emcyrillic: 0x041C,
18918  Emonospace: 0xFF25,
18919  Encyrillic: 0x041D,
18920  Endescendercyrillic: 0x04A2,
18921  Eng: 0x014A,
18922  Enghecyrillic: 0x04A4,
18923  Enhookcyrillic: 0x04C7,
18924  Eogonek: 0x0118,
18925  Eopen: 0x0190,
18926  Epsilon: 0x0395,
18927  Epsilontonos: 0x0388,
18928  Ercyrillic: 0x0420,
18929  Ereversed: 0x018E,
18930  Ereversedcyrillic: 0x042D,
18931  Escyrillic: 0x0421,
18932  Esdescendercyrillic: 0x04AA,
18933  Esh: 0x01A9,
18934  Esmall: 0xF765,
18935  Eta: 0x0397,
18936  Etarmenian: 0x0538,
18937  Etatonos: 0x0389,
18938  Eth: 0x00D0,
18939  Ethsmall: 0xF7F0,
18940  Etilde: 0x1EBC,
18941  Etildebelow: 0x1E1A,
18942  Euro: 0x20AC,
18943  Ezh: 0x01B7,
18944  Ezhcaron: 0x01EE,
18945  Ezhreversed: 0x01B8,
18946  F: 0x0046,
18947  Fcircle: 0x24BB,
18948  Fdotaccent: 0x1E1E,
18949  Feharmenian: 0x0556,
18950  Feicoptic: 0x03E4,
18951  Fhook: 0x0191,
18952  Fitacyrillic: 0x0472,
18953  Fiveroman: 0x2164,
18954  Fmonospace: 0xFF26,
18955  Fourroman: 0x2163,
18956  Fsmall: 0xF766,
18957  G: 0x0047,
18958  GBsquare: 0x3387,
18959  Gacute: 0x01F4,
18960  Gamma: 0x0393,
18961  Gammaafrican: 0x0194,
18962  Gangiacoptic: 0x03EA,
18963  Gbreve: 0x011E,
18964  Gcaron: 0x01E6,
18965  Gcedilla: 0x0122,
18966  Gcircle: 0x24BC,
18967  Gcircumflex: 0x011C,
18968  Gcommaaccent: 0x0122,
18969  Gdot: 0x0120,
18970  Gdotaccent: 0x0120,
18971  Gecyrillic: 0x0413,
18972  Ghadarmenian: 0x0542,
18973  Ghemiddlehookcyrillic: 0x0494,
18974  Ghestrokecyrillic: 0x0492,
18975  Gheupturncyrillic: 0x0490,
18976  Ghook: 0x0193,
18977  Gimarmenian: 0x0533,
18978  Gjecyrillic: 0x0403,
18979  Gmacron: 0x1E20,
18980  Gmonospace: 0xFF27,
18981  Grave: 0xF6CE,
18982  Gravesmall: 0xF760,
18983  Gsmall: 0xF767,
18984  Gsmallhook: 0x029B,
18985  Gstroke: 0x01E4,
18986  H: 0x0048,
18987  H18533: 0x25CF,
18988  H18543: 0x25AA,
18989  H18551: 0x25AB,
18990  H22073: 0x25A1,
18991  HPsquare: 0x33CB,
18992  Haabkhasiancyrillic: 0x04A8,
18993  Hadescendercyrillic: 0x04B2,
18994  Hardsigncyrillic: 0x042A,
18995  Hbar: 0x0126,
18996  Hbrevebelow: 0x1E2A,
18997  Hcedilla: 0x1E28,
18998  Hcircle: 0x24BD,
18999  Hcircumflex: 0x0124,
19000  Hdieresis: 0x1E26,
19001  Hdotaccent: 0x1E22,
19002  Hdotbelow: 0x1E24,
19003  Hmonospace: 0xFF28,
19004  Hoarmenian: 0x0540,
19005  Horicoptic: 0x03E8,
19006  Hsmall: 0xF768,
19007  Hungarumlaut: 0xF6CF,
19008  Hungarumlautsmall: 0xF6F8,
19009  Hzsquare: 0x3390,
19010  I: 0x0049,
19011  IAcyrillic: 0x042F,
19012  IJ: 0x0132,
19013  IUcyrillic: 0x042E,
19014  Iacute: 0x00CD,
19015  Iacutesmall: 0xF7ED,
19016  Ibreve: 0x012C,
19017  Icaron: 0x01CF,
19018  Icircle: 0x24BE,
19019  Icircumflex: 0x00CE,
19020  Icircumflexsmall: 0xF7EE,
19021  Icyrillic: 0x0406,
19022  Idblgrave: 0x0208,
19023  Idieresis: 0x00CF,
19024  Idieresisacute: 0x1E2E,
19025  Idieresiscyrillic: 0x04E4,
19026  Idieresissmall: 0xF7EF,
19027  Idot: 0x0130,
19028  Idotaccent: 0x0130,
19029  Idotbelow: 0x1ECA,
19030  Iebrevecyrillic: 0x04D6,
19031  Iecyrillic: 0x0415,
19032  Ifraktur: 0x2111,
19033  Igrave: 0x00CC,
19034  Igravesmall: 0xF7EC,
19035  Ihookabove: 0x1EC8,
19036  Iicyrillic: 0x0418,
19037  Iinvertedbreve: 0x020A,
19038  Iishortcyrillic: 0x0419,
19039  Imacron: 0x012A,
19040  Imacroncyrillic: 0x04E2,
19041  Imonospace: 0xFF29,
19042  Iniarmenian: 0x053B,
19043  Iocyrillic: 0x0401,
19044  Iogonek: 0x012E,
19045  Iota: 0x0399,
19046  Iotaafrican: 0x0196,
19047  Iotadieresis: 0x03AA,
19048  Iotatonos: 0x038A,
19049  Ismall: 0xF769,
19050  Istroke: 0x0197,
19051  Itilde: 0x0128,
19052  Itildebelow: 0x1E2C,
19053  Izhitsacyrillic: 0x0474,
19054  Izhitsadblgravecyrillic: 0x0476,
19055  J: 0x004A,
19056  Jaarmenian: 0x0541,
19057  Jcircle: 0x24BF,
19058  Jcircumflex: 0x0134,
19059  Jecyrillic: 0x0408,
19060  Jheharmenian: 0x054B,
19061  Jmonospace: 0xFF2A,
19062  Jsmall: 0xF76A,
19063  K: 0x004B,
19064  KBsquare: 0x3385,
19065  KKsquare: 0x33CD,
19066  Kabashkircyrillic: 0x04A0,
19067  Kacute: 0x1E30,
19068  Kacyrillic: 0x041A,
19069  Kadescendercyrillic: 0x049A,
19070  Kahookcyrillic: 0x04C3,
19071  Kappa: 0x039A,
19072  Kastrokecyrillic: 0x049E,
19073  Kaverticalstrokecyrillic: 0x049C,
19074  Kcaron: 0x01E8,
19075  Kcedilla: 0x0136,
19076  Kcircle: 0x24C0,
19077  Kcommaaccent: 0x0136,
19078  Kdotbelow: 0x1E32,
19079  Keharmenian: 0x0554,
19080  Kenarmenian: 0x053F,
19081  Khacyrillic: 0x0425,
19082  Kheicoptic: 0x03E6,
19083  Khook: 0x0198,
19084  Kjecyrillic: 0x040C,
19085  Klinebelow: 0x1E34,
19086  Kmonospace: 0xFF2B,
19087  Koppacyrillic: 0x0480,
19088  Koppagreek: 0x03DE,
19089  Ksicyrillic: 0x046E,
19090  Ksmall: 0xF76B,
19091  L: 0x004C,
19092  LJ: 0x01C7,
19093  LL: 0xF6BF,
19094  Lacute: 0x0139,
19095  Lambda: 0x039B,
19096  Lcaron: 0x013D,
19097  Lcedilla: 0x013B,
19098  Lcircle: 0x24C1,
19099  Lcircumflexbelow: 0x1E3C,
19100  Lcommaaccent: 0x013B,
19101  Ldot: 0x013F,
19102  Ldotaccent: 0x013F,
19103  Ldotbelow: 0x1E36,
19104  Ldotbelowmacron: 0x1E38,
19105  Liwnarmenian: 0x053C,
19106  Lj: 0x01C8,
19107  Ljecyrillic: 0x0409,
19108  Llinebelow: 0x1E3A,
19109  Lmonospace: 0xFF2C,
19110  Lslash: 0x0141,
19111  Lslashsmall: 0xF6F9,
19112  Lsmall: 0xF76C,
19113  M: 0x004D,
19114  MBsquare: 0x3386,
19115  Macron: 0xF6D0,
19116  Macronsmall: 0xF7AF,
19117  Macute: 0x1E3E,
19118  Mcircle: 0x24C2,
19119  Mdotaccent: 0x1E40,
19120  Mdotbelow: 0x1E42,
19121  Menarmenian: 0x0544,
19122  Mmonospace: 0xFF2D,
19123  Msmall: 0xF76D,
19124  Mturned: 0x019C,
19125  Mu: 0x039C,
19126  N: 0x004E,
19127  NJ: 0x01CA,
19128  Nacute: 0x0143,
19129  Ncaron: 0x0147,
19130  Ncedilla: 0x0145,
19131  Ncircle: 0x24C3,
19132  Ncircumflexbelow: 0x1E4A,
19133  Ncommaaccent: 0x0145,
19134  Ndotaccent: 0x1E44,
19135  Ndotbelow: 0x1E46,
19136  Nhookleft: 0x019D,
19137  Nineroman: 0x2168,
19138  Nj: 0x01CB,
19139  Njecyrillic: 0x040A,
19140  Nlinebelow: 0x1E48,
19141  Nmonospace: 0xFF2E,
19142  Nowarmenian: 0x0546,
19143  Nsmall: 0xF76E,
19144  Ntilde: 0x00D1,
19145  Ntildesmall: 0xF7F1,
19146  Nu: 0x039D,
19147  O: 0x004F,
19148  OE: 0x0152,
19149  OEsmall: 0xF6FA,
19150  Oacute: 0x00D3,
19151  Oacutesmall: 0xF7F3,
19152  Obarredcyrillic: 0x04E8,
19153  Obarreddieresiscyrillic: 0x04EA,
19154  Obreve: 0x014E,
19155  Ocaron: 0x01D1,
19156  Ocenteredtilde: 0x019F,
19157  Ocircle: 0x24C4,
19158  Ocircumflex: 0x00D4,
19159  Ocircumflexacute: 0x1ED0,
19160  Ocircumflexdotbelow: 0x1ED8,
19161  Ocircumflexgrave: 0x1ED2,
19162  Ocircumflexhookabove: 0x1ED4,
19163  Ocircumflexsmall: 0xF7F4,
19164  Ocircumflextilde: 0x1ED6,
19165  Ocyrillic: 0x041E,
19166  Odblacute: 0x0150,
19167  Odblgrave: 0x020C,
19168  Odieresis: 0x00D6,
19169  Odieresiscyrillic: 0x04E6,
19170  Odieresissmall: 0xF7F6,
19171  Odotbelow: 0x1ECC,
19172  Ogoneksmall: 0xF6FB,
19173  Ograve: 0x00D2,
19174  Ogravesmall: 0xF7F2,
19175  Oharmenian: 0x0555,
19176  Ohm: 0x2126,
19177  Ohookabove: 0x1ECE,
19178  Ohorn: 0x01A0,
19179  Ohornacute: 0x1EDA,
19180  Ohorndotbelow: 0x1EE2,
19181  Ohorngrave: 0x1EDC,
19182  Ohornhookabove: 0x1EDE,
19183  Ohorntilde: 0x1EE0,
19184  Ohungarumlaut: 0x0150,
19185  Oi: 0x01A2,
19186  Oinvertedbreve: 0x020E,
19187  Omacron: 0x014C,
19188  Omacronacute: 0x1E52,
19189  Omacrongrave: 0x1E50,
19190  Omega: 0x2126,
19191  Omegacyrillic: 0x0460,
19192  Omegagreek: 0x03A9,
19193  Omegaroundcyrillic: 0x047A,
19194  Omegatitlocyrillic: 0x047C,
19195  Omegatonos: 0x038F,
19196  Omicron: 0x039F,
19197  Omicrontonos: 0x038C,
19198  Omonospace: 0xFF2F,
19199  Oneroman: 0x2160,
19200  Oogonek: 0x01EA,
19201  Oogonekmacron: 0x01EC,
19202  Oopen: 0x0186,
19203  Oslash: 0x00D8,
19204  Oslashacute: 0x01FE,
19205  Oslashsmall: 0xF7F8,
19206  Osmall: 0xF76F,
19207  Ostrokeacute: 0x01FE,
19208  Otcyrillic: 0x047E,
19209  Otilde: 0x00D5,
19210  Otildeacute: 0x1E4C,
19211  Otildedieresis: 0x1E4E,
19212  Otildesmall: 0xF7F5,
19213  P: 0x0050,
19214  Pacute: 0x1E54,
19215  Pcircle: 0x24C5,
19216  Pdotaccent: 0x1E56,
19217  Pecyrillic: 0x041F,
19218  Peharmenian: 0x054A,
19219  Pemiddlehookcyrillic: 0x04A6,
19220  Phi: 0x03A6,
19221  Phook: 0x01A4,
19222  Pi: 0x03A0,
19223  Piwrarmenian: 0x0553,
19224  Pmonospace: 0xFF30,
19225  Psi: 0x03A8,
19226  Psicyrillic: 0x0470,
19227  Psmall: 0xF770,
19228  Q: 0x0051,
19229  Qcircle: 0x24C6,
19230  Qmonospace: 0xFF31,
19231  Qsmall: 0xF771,
19232  R: 0x0052,
19233  Raarmenian: 0x054C,
19234  Racute: 0x0154,
19235  Rcaron: 0x0158,
19236  Rcedilla: 0x0156,
19237  Rcircle: 0x24C7,
19238  Rcommaaccent: 0x0156,
19239  Rdblgrave: 0x0210,
19240  Rdotaccent: 0x1E58,
19241  Rdotbelow: 0x1E5A,
19242  Rdotbelowmacron: 0x1E5C,
19243  Reharmenian: 0x0550,
19244  Rfraktur: 0x211C,
19245  Rho: 0x03A1,
19246  Ringsmall: 0xF6FC,
19247  Rinvertedbreve: 0x0212,
19248  Rlinebelow: 0x1E5E,
19249  Rmonospace: 0xFF32,
19250  Rsmall: 0xF772,
19251  Rsmallinverted: 0x0281,
19252  Rsmallinvertedsuperior: 0x02B6,
19253  S: 0x0053,
19254  SF010000: 0x250C,
19255  SF020000: 0x2514,
19256  SF030000: 0x2510,
19257  SF040000: 0x2518,
19258  SF050000: 0x253C,
19259  SF060000: 0x252C,
19260  SF070000: 0x2534,
19261  SF080000: 0x251C,
19262  SF090000: 0x2524,
19263  SF100000: 0x2500,
19264  SF110000: 0x2502,
19265  SF190000: 0x2561,
19266  SF200000: 0x2562,
19267  SF210000: 0x2556,
19268  SF220000: 0x2555,
19269  SF230000: 0x2563,
19270  SF240000: 0x2551,
19271  SF250000: 0x2557,
19272  SF260000: 0x255D,
19273  SF270000: 0x255C,
19274  SF280000: 0x255B,
19275  SF360000: 0x255E,
19276  SF370000: 0x255F,
19277  SF380000: 0x255A,
19278  SF390000: 0x2554,
19279  SF400000: 0x2569,
19280  SF410000: 0x2566,
19281  SF420000: 0x2560,
19282  SF430000: 0x2550,
19283  SF440000: 0x256C,
19284  SF450000: 0x2567,
19285  SF460000: 0x2568,
19286  SF470000: 0x2564,
19287  SF480000: 0x2565,
19288  SF490000: 0x2559,
19289  SF500000: 0x2558,
19290  SF510000: 0x2552,
19291  SF520000: 0x2553,
19292  SF530000: 0x256B,
19293  SF540000: 0x256A,
19294  Sacute: 0x015A,
19295  Sacutedotaccent: 0x1E64,
19296  Sampigreek: 0x03E0,
19297  Scaron: 0x0160,
19298  Scarondotaccent: 0x1E66,
19299  Scaronsmall: 0xF6FD,
19300  Scedilla: 0x015E,
19301  Schwa: 0x018F,
19302  Schwacyrillic: 0x04D8,
19303  Schwadieresiscyrillic: 0x04DA,
19304  Scircle: 0x24C8,
19305  Scircumflex: 0x015C,
19306  Scommaaccent: 0x0218,
19307  Sdotaccent: 0x1E60,
19308  Sdotbelow: 0x1E62,
19309  Sdotbelowdotaccent: 0x1E68,
19310  Seharmenian: 0x054D,
19311  Sevenroman: 0x2166,
19312  Shaarmenian: 0x0547,
19313  Shacyrillic: 0x0428,
19314  Shchacyrillic: 0x0429,
19315  Sheicoptic: 0x03E2,
19316  Shhacyrillic: 0x04BA,
19317  Shimacoptic: 0x03EC,
19318  Sigma: 0x03A3,
19319  Sixroman: 0x2165,
19320  Smonospace: 0xFF33,
19321  Softsigncyrillic: 0x042C,
19322  Ssmall: 0xF773,
19323  Stigmagreek: 0x03DA,
19324  T: 0x0054,
19325  Tau: 0x03A4,
19326  Tbar: 0x0166,
19327  Tcaron: 0x0164,
19328  Tcedilla: 0x0162,
19329  Tcircle: 0x24C9,
19330  Tcircumflexbelow: 0x1E70,
19331  Tcommaaccent: 0x0162,
19332  Tdotaccent: 0x1E6A,
19333  Tdotbelow: 0x1E6C,
19334  Tecyrillic: 0x0422,
19335  Tedescendercyrillic: 0x04AC,
19336  Tenroman: 0x2169,
19337  Tetsecyrillic: 0x04B4,
19338  Theta: 0x0398,
19339  Thook: 0x01AC,
19340  Thorn: 0x00DE,
19341  Thornsmall: 0xF7FE,
19342  Threeroman: 0x2162,
19343  Tildesmall: 0xF6FE,
19344  Tiwnarmenian: 0x054F,
19345  Tlinebelow: 0x1E6E,
19346  Tmonospace: 0xFF34,
19347  Toarmenian: 0x0539,
19348  Tonefive: 0x01BC,
19349  Tonesix: 0x0184,
19350  Tonetwo: 0x01A7,
19351  Tretroflexhook: 0x01AE,
19352  Tsecyrillic: 0x0426,
19353  Tshecyrillic: 0x040B,
19354  Tsmall: 0xF774,
19355  Twelveroman: 0x216B,
19356  Tworoman: 0x2161,
19357  U: 0x0055,
19358  Uacute: 0x00DA,
19359  Uacutesmall: 0xF7FA,
19360  Ubreve: 0x016C,
19361  Ucaron: 0x01D3,
19362  Ucircle: 0x24CA,
19363  Ucircumflex: 0x00DB,
19364  Ucircumflexbelow: 0x1E76,
19365  Ucircumflexsmall: 0xF7FB,
19366  Ucyrillic: 0x0423,
19367  Udblacute: 0x0170,
19368  Udblgrave: 0x0214,
19369  Udieresis: 0x00DC,
19370  Udieresisacute: 0x01D7,
19371  Udieresisbelow: 0x1E72,
19372  Udieresiscaron: 0x01D9,
19373  Udieresiscyrillic: 0x04F0,
19374  Udieresisgrave: 0x01DB,
19375  Udieresismacron: 0x01D5,
19376  Udieresissmall: 0xF7FC,
19377  Udotbelow: 0x1EE4,
19378  Ugrave: 0x00D9,
19379  Ugravesmall: 0xF7F9,
19380  Uhookabove: 0x1EE6,
19381  Uhorn: 0x01AF,
19382  Uhornacute: 0x1EE8,
19383  Uhorndotbelow: 0x1EF0,
19384  Uhorngrave: 0x1EEA,
19385  Uhornhookabove: 0x1EEC,
19386  Uhorntilde: 0x1EEE,
19387  Uhungarumlaut: 0x0170,
19388  Uhungarumlautcyrillic: 0x04F2,
19389  Uinvertedbreve: 0x0216,
19390  Ukcyrillic: 0x0478,
19391  Umacron: 0x016A,
19392  Umacroncyrillic: 0x04EE,
19393  Umacrondieresis: 0x1E7A,
19394  Umonospace: 0xFF35,
19395  Uogonek: 0x0172,
19396  Upsilon: 0x03A5,
19397  Upsilon1: 0x03D2,
19398  Upsilonacutehooksymbolgreek: 0x03D3,
19399  Upsilonafrican: 0x01B1,
19400  Upsilondieresis: 0x03AB,
19401  Upsilondieresishooksymbolgreek: 0x03D4,
19402  Upsilonhooksymbol: 0x03D2,
19403  Upsilontonos: 0x038E,
19404  Uring: 0x016E,
19405  Ushortcyrillic: 0x040E,
19406  Usmall: 0xF775,
19407  Ustraightcyrillic: 0x04AE,
19408  Ustraightstrokecyrillic: 0x04B0,
19409  Utilde: 0x0168,
19410  Utildeacute: 0x1E78,
19411  Utildebelow: 0x1E74,
19412  V: 0x0056,
19413  Vcircle: 0x24CB,
19414  Vdotbelow: 0x1E7E,
19415  Vecyrillic: 0x0412,
19416  Vewarmenian: 0x054E,
19417  Vhook: 0x01B2,
19418  Vmonospace: 0xFF36,
19419  Voarmenian: 0x0548,
19420  Vsmall: 0xF776,
19421  Vtilde: 0x1E7C,
19422  W: 0x0057,
19423  Wacute: 0x1E82,
19424  Wcircle: 0x24CC,
19425  Wcircumflex: 0x0174,
19426  Wdieresis: 0x1E84,
19427  Wdotaccent: 0x1E86,
19428  Wdotbelow: 0x1E88,
19429  Wgrave: 0x1E80,
19430  Wmonospace: 0xFF37,
19431  Wsmall: 0xF777,
19432  X: 0x0058,
19433  Xcircle: 0x24CD,
19434  Xdieresis: 0x1E8C,
19435  Xdotaccent: 0x1E8A,
19436  Xeharmenian: 0x053D,
19437  Xi: 0x039E,
19438  Xmonospace: 0xFF38,
19439  Xsmall: 0xF778,
19440  Y: 0x0059,
19441  Yacute: 0x00DD,
19442  Yacutesmall: 0xF7FD,
19443  Yatcyrillic: 0x0462,
19444  Ycircle: 0x24CE,
19445  Ycircumflex: 0x0176,
19446  Ydieresis: 0x0178,
19447  Ydieresissmall: 0xF7FF,
19448  Ydotaccent: 0x1E8E,
19449  Ydotbelow: 0x1EF4,
19450  Yericyrillic: 0x042B,
19451  Yerudieresiscyrillic: 0x04F8,
19452  Ygrave: 0x1EF2,
19453  Yhook: 0x01B3,
19454  Yhookabove: 0x1EF6,
19455  Yiarmenian: 0x0545,
19456  Yicyrillic: 0x0407,
19457  Yiwnarmenian: 0x0552,
19458  Ymonospace: 0xFF39,
19459  Ysmall: 0xF779,
19460  Ytilde: 0x1EF8,
19461  Yusbigcyrillic: 0x046A,
19462  Yusbigiotifiedcyrillic: 0x046C,
19463  Yuslittlecyrillic: 0x0466,
19464  Yuslittleiotifiedcyrillic: 0x0468,
19465  Z: 0x005A,
19466  Zaarmenian: 0x0536,
19467  Zacute: 0x0179,
19468  Zcaron: 0x017D,
19469  Zcaronsmall: 0xF6FF,
19470  Zcircle: 0x24CF,
19471  Zcircumflex: 0x1E90,
19472  Zdot: 0x017B,
19473  Zdotaccent: 0x017B,
19474  Zdotbelow: 0x1E92,
19475  Zecyrillic: 0x0417,
19476  Zedescendercyrillic: 0x0498,
19477  Zedieresiscyrillic: 0x04DE,
19478  Zeta: 0x0396,
19479  Zhearmenian: 0x053A,
19480  Zhebrevecyrillic: 0x04C1,
19481  Zhecyrillic: 0x0416,
19482  Zhedescendercyrillic: 0x0496,
19483  Zhedieresiscyrillic: 0x04DC,
19484  Zlinebelow: 0x1E94,
19485  Zmonospace: 0xFF3A,
19486  Zsmall: 0xF77A,
19487  Zstroke: 0x01B5,
19488  a: 0x0061,
19489  aabengali: 0x0986,
19490  aacute: 0x00E1,
19491  aadeva: 0x0906,
19492  aagujarati: 0x0A86,
19493  aagurmukhi: 0x0A06,
19494  aamatragurmukhi: 0x0A3E,
19495  aarusquare: 0x3303,
19496  aavowelsignbengali: 0x09BE,
19497  aavowelsigndeva: 0x093E,
19498  aavowelsigngujarati: 0x0ABE,
19499  abbreviationmarkarmenian: 0x055F,
19500  abbreviationsigndeva: 0x0970,
19501  abengali: 0x0985,
19502  abopomofo: 0x311A,
19503  abreve: 0x0103,
19504  abreveacute: 0x1EAF,
19505  abrevecyrillic: 0x04D1,
19506  abrevedotbelow: 0x1EB7,
19507  abrevegrave: 0x1EB1,
19508  abrevehookabove: 0x1EB3,
19509  abrevetilde: 0x1EB5,
19510  acaron: 0x01CE,
19511  acircle: 0x24D0,
19512  acircumflex: 0x00E2,
19513  acircumflexacute: 0x1EA5,
19514  acircumflexdotbelow: 0x1EAD,
19515  acircumflexgrave: 0x1EA7,
19516  acircumflexhookabove: 0x1EA9,
19517  acircumflextilde: 0x1EAB,
19518  acute: 0x00B4,
19519  acutebelowcmb: 0x0317,
19520  acutecmb: 0x0301,
19521  acutecomb: 0x0301,
19522  acutedeva: 0x0954,
19523  acutelowmod: 0x02CF,
19524  acutetonecmb: 0x0341,
19525  acyrillic: 0x0430,
19526  adblgrave: 0x0201,
19527  addakgurmukhi: 0x0A71,
19528  adeva: 0x0905,
19529  adieresis: 0x00E4,
19530  adieresiscyrillic: 0x04D3,
19531  adieresismacron: 0x01DF,
19532  adotbelow: 0x1EA1,
19533  adotmacron: 0x01E1,
19534  ae: 0x00E6,
19535  aeacute: 0x01FD,
19536  aekorean: 0x3150,
19537  aemacron: 0x01E3,
19538  afii00208: 0x2015,
19539  afii08941: 0x20A4,
19540  afii10017: 0x0410,
19541  afii10018: 0x0411,
19542  afii10019: 0x0412,
19543  afii10020: 0x0413,
19544  afii10021: 0x0414,
19545  afii10022: 0x0415,
19546  afii10023: 0x0401,
19547  afii10024: 0x0416,
19548  afii10025: 0x0417,
19549  afii10026: 0x0418,
19550  afii10027: 0x0419,
19551  afii10028: 0x041A,
19552  afii10029: 0x041B,
19553  afii10030: 0x041C,
19554  afii10031: 0x041D,
19555  afii10032: 0x041E,
19556  afii10033: 0x041F,
19557  afii10034: 0x0420,
19558  afii10035: 0x0421,
19559  afii10036: 0x0422,
19560  afii10037: 0x0423,
19561  afii10038: 0x0424,
19562  afii10039: 0x0425,
19563  afii10040: 0x0426,
19564  afii10041: 0x0427,
19565  afii10042: 0x0428,
19566  afii10043: 0x0429,
19567  afii10044: 0x042A,
19568  afii10045: 0x042B,
19569  afii10046: 0x042C,
19570  afii10047: 0x042D,
19571  afii10048: 0x042E,
19572  afii10049: 0x042F,
19573  afii10050: 0x0490,
19574  afii10051: 0x0402,
19575  afii10052: 0x0403,
19576  afii10053: 0x0404,
19577  afii10054: 0x0405,
19578  afii10055: 0x0406,
19579  afii10056: 0x0407,
19580  afii10057: 0x0408,
19581  afii10058: 0x0409,
19582  afii10059: 0x040A,
19583  afii10060: 0x040B,
19584  afii10061: 0x040C,
19585  afii10062: 0x040E,
19586  afii10063: 0xF6C4,
19587  afii10064: 0xF6C5,
19588  afii10065: 0x0430,
19589  afii10066: 0x0431,
19590  afii10067: 0x0432,
19591  afii10068: 0x0433,
19592  afii10069: 0x0434,
19593  afii10070: 0x0435,
19594  afii10071: 0x0451,
19595  afii10072: 0x0436,
19596  afii10073: 0x0437,
19597  afii10074: 0x0438,
19598  afii10075: 0x0439,
19599  afii10076: 0x043A,
19600  afii10077: 0x043B,
19601  afii10078: 0x043C,
19602  afii10079: 0x043D,
19603  afii10080: 0x043E,
19604  afii10081: 0x043F,
19605  afii10082: 0x0440,
19606  afii10083: 0x0441,
19607  afii10084: 0x0442,
19608  afii10085: 0x0443,
19609  afii10086: 0x0444,
19610  afii10087: 0x0445,
19611  afii10088: 0x0446,
19612  afii10089: 0x0447,
19613  afii10090: 0x0448,
19614  afii10091: 0x0449,
19615  afii10092: 0x044A,
19616  afii10093: 0x044B,
19617  afii10094: 0x044C,
19618  afii10095: 0x044D,
19619  afii10096: 0x044E,
19620  afii10097: 0x044F,
19621  afii10098: 0x0491,
19622  afii10099: 0x0452,
19623  afii10100: 0x0453,
19624  afii10101: 0x0454,
19625  afii10102: 0x0455,
19626  afii10103: 0x0456,
19627  afii10104: 0x0457,
19628  afii10105: 0x0458,
19629  afii10106: 0x0459,
19630  afii10107: 0x045A,
19631  afii10108: 0x045B,
19632  afii10109: 0x045C,
19633  afii10110: 0x045E,
19634  afii10145: 0x040F,
19635  afii10146: 0x0462,
19636  afii10147: 0x0472,
19637  afii10148: 0x0474,
19638  afii10192: 0xF6C6,
19639  afii10193: 0x045F,
19640  afii10194: 0x0463,
19641  afii10195: 0x0473,
19642  afii10196: 0x0475,
19643  afii10831: 0xF6C7,
19644  afii10832: 0xF6C8,
19645  afii10846: 0x04D9,
19646  afii299: 0x200E,
19647  afii300: 0x200F,
19648  afii301: 0x200D,
19649  afii57381: 0x066A,
19650  afii57388: 0x060C,
19651  afii57392: 0x0660,
19652  afii57393: 0x0661,
19653  afii57394: 0x0662,
19654  afii57395: 0x0663,
19655  afii57396: 0x0664,
19656  afii57397: 0x0665,
19657  afii57398: 0x0666,
19658  afii57399: 0x0667,
19659  afii57400: 0x0668,
19660  afii57401: 0x0669,
19661  afii57403: 0x061B,
19662  afii57407: 0x061F,
19663  afii57409: 0x0621,
19664  afii57410: 0x0622,
19665  afii57411: 0x0623,
19666  afii57412: 0x0624,
19667  afii57413: 0x0625,
19668  afii57414: 0x0626,
19669  afii57415: 0x0627,
19670  afii57416: 0x0628,
19671  afii57417: 0x0629,
19672  afii57418: 0x062A,
19673  afii57419: 0x062B,
19674  afii57420: 0x062C,
19675  afii57421: 0x062D,
19676  afii57422: 0x062E,
19677  afii57423: 0x062F,
19678  afii57424: 0x0630,
19679  afii57425: 0x0631,
19680  afii57426: 0x0632,
19681  afii57427: 0x0633,
19682  afii57428: 0x0634,
19683  afii57429: 0x0635,
19684  afii57430: 0x0636,
19685  afii57431: 0x0637,
19686  afii57432: 0x0638,
19687  afii57433: 0x0639,
19688  afii57434: 0x063A,
19689  afii57440: 0x0640,
19690  afii57441: 0x0641,
19691  afii57442: 0x0642,
19692  afii57443: 0x0643,
19693  afii57444: 0x0644,
19694  afii57445: 0x0645,
19695  afii57446: 0x0646,
19696  afii57448: 0x0648,
19697  afii57449: 0x0649,
19698  afii57450: 0x064A,
19699  afii57451: 0x064B,
19700  afii57452: 0x064C,
19701  afii57453: 0x064D,
19702  afii57454: 0x064E,
19703  afii57455: 0x064F,
19704  afii57456: 0x0650,
19705  afii57457: 0x0651,
19706  afii57458: 0x0652,
19707  afii57470: 0x0647,
19708  afii57505: 0x06A4,
19709  afii57506: 0x067E,
19710  afii57507: 0x0686,
19711  afii57508: 0x0698,
19712  afii57509: 0x06AF,
19713  afii57511: 0x0679,
19714  afii57512: 0x0688,
19715  afii57513: 0x0691,
19716  afii57514: 0x06BA,
19717  afii57519: 0x06D2,
19718  afii57534: 0x06D5,
19719  afii57636: 0x20AA,
19720  afii57645: 0x05BE,
19721  afii57658: 0x05C3,
19722  afii57664: 0x05D0,
19723  afii57665: 0x05D1,
19724  afii57666: 0x05D2,
19725  afii57667: 0x05D3,
19726  afii57668: 0x05D4,
19727  afii57669: 0x05D5,
19728  afii57670: 0x05D6,
19729  afii57671: 0x05D7,
19730  afii57672: 0x05D8,
19731  afii57673: 0x05D9,
19732  afii57674: 0x05DA,
19733  afii57675: 0x05DB,
19734  afii57676: 0x05DC,
19735  afii57677: 0x05DD,
19736  afii57678: 0x05DE,
19737  afii57679: 0x05DF,
19738  afii57680: 0x05E0,
19739  afii57681: 0x05E1,
19740  afii57682: 0x05E2,
19741  afii57683: 0x05E3,
19742  afii57684: 0x05E4,
19743  afii57685: 0x05E5,
19744  afii57686: 0x05E6,
19745  afii57687: 0x05E7,
19746  afii57688: 0x05E8,
19747  afii57689: 0x05E9,
19748  afii57690: 0x05EA,
19749  afii57694: 0xFB2A,
19750  afii57695: 0xFB2B,
19751  afii57700: 0xFB4B,
19752  afii57705: 0xFB1F,
19753  afii57716: 0x05F0,
19754  afii57717: 0x05F1,
19755  afii57718: 0x05F2,
19756  afii57723: 0xFB35,
19757  afii57793: 0x05B4,
19758  afii57794: 0x05B5,
19759  afii57795: 0x05B6,
19760  afii57796: 0x05BB,
19761  afii57797: 0x05B8,
19762  afii57798: 0x05B7,
19763  afii57799: 0x05B0,
19764  afii57800: 0x05B2,
19765  afii57801: 0x05B1,
19766  afii57802: 0x05B3,
19767  afii57803: 0x05C2,
19768  afii57804: 0x05C1,
19769  afii57806: 0x05B9,
19770  afii57807: 0x05BC,
19771  afii57839: 0x05BD,
19772  afii57841: 0x05BF,
19773  afii57842: 0x05C0,
19774  afii57929: 0x02BC,
19775  afii61248: 0x2105,
19776  afii61289: 0x2113,
19777  afii61352: 0x2116,
19778  afii61573: 0x202C,
19779  afii61574: 0x202D,
19780  afii61575: 0x202E,
19781  afii61664: 0x200C,
19782  afii63167: 0x066D,
19783  afii64937: 0x02BD,
19784  agrave: 0x00E0,
19785  agujarati: 0x0A85,
19786  agurmukhi: 0x0A05,
19787  ahiragana: 0x3042,
19788  ahookabove: 0x1EA3,
19789  aibengali: 0x0990,
19790  aibopomofo: 0x311E,
19791  aideva: 0x0910,
19792  aiecyrillic: 0x04D5,
19793  aigujarati: 0x0A90,
19794  aigurmukhi: 0x0A10,
19795  aimatragurmukhi: 0x0A48,
19796  ainarabic: 0x0639,
19797  ainfinalarabic: 0xFECA,
19798  aininitialarabic: 0xFECB,
19799  ainmedialarabic: 0xFECC,
19800  ainvertedbreve: 0x0203,
19801  aivowelsignbengali: 0x09C8,
19802  aivowelsigndeva: 0x0948,
19803  aivowelsigngujarati: 0x0AC8,
19804  akatakana: 0x30A2,
19805  akatakanahalfwidth: 0xFF71,
19806  akorean: 0x314F,
19807  alef: 0x05D0,
19808  alefarabic: 0x0627,
19809  alefdageshhebrew: 0xFB30,
19810  aleffinalarabic: 0xFE8E,
19811  alefhamzaabovearabic: 0x0623,
19812  alefhamzaabovefinalarabic: 0xFE84,
19813  alefhamzabelowarabic: 0x0625,
19814  alefhamzabelowfinalarabic: 0xFE88,
19815  alefhebrew: 0x05D0,
19816  aleflamedhebrew: 0xFB4F,
19817  alefmaddaabovearabic: 0x0622,
19818  alefmaddaabovefinalarabic: 0xFE82,
19819  alefmaksuraarabic: 0x0649,
19820  alefmaksurafinalarabic: 0xFEF0,
19821  alefmaksurainitialarabic: 0xFEF3,
19822  alefmaksuramedialarabic: 0xFEF4,
19823  alefpatahhebrew: 0xFB2E,
19824  alefqamatshebrew: 0xFB2F,
19825  aleph: 0x2135,
19826  allequal: 0x224C,
19827  alpha: 0x03B1,
19828  alphatonos: 0x03AC,
19829  amacron: 0x0101,
19830  amonospace: 0xFF41,
19831  ampersand: 0x0026,
19832  ampersandmonospace: 0xFF06,
19833  ampersandsmall: 0xF726,
19834  amsquare: 0x33C2,
19835  anbopomofo: 0x3122,
19836  angbopomofo: 0x3124,
19837  angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
19838  angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
19839  angkhankhuthai: 0x0E5A,
19840  angle: 0x2220,
19841  anglebracketleft: 0x3008,
19842  anglebracketleftvertical: 0xFE3F,
19843  anglebracketright: 0x3009,
19844  anglebracketrightvertical: 0xFE40,
19845  angleleft: 0x2329,
19846  angleright: 0x232A,
19847  angstrom: 0x212B,
19848  anoteleia: 0x0387,
19849  anudattadeva: 0x0952,
19850  anusvarabengali: 0x0982,
19851  anusvaradeva: 0x0902,
19852  anusvaragujarati: 0x0A82,
19853  aogonek: 0x0105,
19854  apaatosquare: 0x3300,
19855  aparen: 0x249C,
19856  apostrophearmenian: 0x055A,
19857  apostrophemod: 0x02BC,
19858  apple: 0xF8FF,
19859  approaches: 0x2250,
19860  approxequal: 0x2248,
19861  approxequalorimage: 0x2252,
19862  approximatelyequal: 0x2245,
19863  araeaekorean: 0x318E,
19864  araeakorean: 0x318D,
19865  arc: 0x2312,
19866  arighthalfring: 0x1E9A,
19867  aring: 0x00E5,
19868  aringacute: 0x01FB,
19869  aringbelow: 0x1E01,
19870  arrowboth: 0x2194,
19871  arrowdashdown: 0x21E3,
19872  arrowdashleft: 0x21E0,
19873  arrowdashright: 0x21E2,
19874  arrowdashup: 0x21E1,
19875  arrowdblboth: 0x21D4,
19876  arrowdbldown: 0x21D3,
19877  arrowdblleft: 0x21D0,
19878  arrowdblright: 0x21D2,
19879  arrowdblup: 0x21D1,
19880  arrowdown: 0x2193,
19881  arrowdownleft: 0x2199,
19882  arrowdownright: 0x2198,
19883  arrowdownwhite: 0x21E9,
19884  arrowheaddownmod: 0x02C5,
19885  arrowheadleftmod: 0x02C2,
19886  arrowheadrightmod: 0x02C3,
19887  arrowheadupmod: 0x02C4,
19888  arrowhorizex: 0xF8E7,
19889  arrowleft: 0x2190,
19890  arrowleftdbl: 0x21D0,
19891  arrowleftdblstroke: 0x21CD,
19892  arrowleftoverright: 0x21C6,
19893  arrowleftwhite: 0x21E6,
19894  arrowright: 0x2192,
19895  arrowrightdblstroke: 0x21CF,
19896  arrowrightheavy: 0x279E,
19897  arrowrightoverleft: 0x21C4,
19898  arrowrightwhite: 0x21E8,
19899  arrowtableft: 0x21E4,
19900  arrowtabright: 0x21E5,
19901  arrowup: 0x2191,
19902  arrowupdn: 0x2195,
19903  arrowupdnbse: 0x21A8,
19904  arrowupdownbase: 0x21A8,
19905  arrowupleft: 0x2196,
19906  arrowupleftofdown: 0x21C5,
19907  arrowupright: 0x2197,
19908  arrowupwhite: 0x21E7,
19909  arrowvertex: 0xF8E6,
19910  asciicircum: 0x005E,
19911  asciicircummonospace: 0xFF3E,
19912  asciitilde: 0x007E,
19913  asciitildemonospace: 0xFF5E,
19914  ascript: 0x0251,
19915  ascriptturned: 0x0252,
19916  asmallhiragana: 0x3041,
19917  asmallkatakana: 0x30A1,
19918  asmallkatakanahalfwidth: 0xFF67,
19919  asterisk: 0x002A,
19920  asteriskaltonearabic: 0x066D,
19921  asteriskarabic: 0x066D,
19922  asteriskmath: 0x2217,
19923  asteriskmonospace: 0xFF0A,
19924  asterisksmall: 0xFE61,
19925  asterism: 0x2042,
19926  asuperior: 0xF6E9,
19927  asymptoticallyequal: 0x2243,
19928  at: 0x0040,
19929  atilde: 0x00E3,
19930  atmonospace: 0xFF20,
19931  atsmall: 0xFE6B,
19932  aturned: 0x0250,
19933  aubengali: 0x0994,
19934  aubopomofo: 0x3120,
19935  audeva: 0x0914,
19936  augujarati: 0x0A94,
19937  augurmukhi: 0x0A14,
19938  aulengthmarkbengali: 0x09D7,
19939  aumatragurmukhi: 0x0A4C,
19940  auvowelsignbengali: 0x09CC,
19941  auvowelsigndeva: 0x094C,
19942  auvowelsigngujarati: 0x0ACC,
19943  avagrahadeva: 0x093D,
19944  aybarmenian: 0x0561,
19945  ayin: 0x05E2,
19946  ayinaltonehebrew: 0xFB20,
19947  ayinhebrew: 0x05E2,
19948  b: 0x0062,
19949  babengali: 0x09AC,
19950  backslash: 0x005C,
19951  backslashmonospace: 0xFF3C,
19952  badeva: 0x092C,
19953  bagujarati: 0x0AAC,
19954  bagurmukhi: 0x0A2C,
19955  bahiragana: 0x3070,
19956  bahtthai: 0x0E3F,
19957  bakatakana: 0x30D0,
19958  bar: 0x007C,
19959  barmonospace: 0xFF5C,
19960  bbopomofo: 0x3105,
19961  bcircle: 0x24D1,
19962  bdotaccent: 0x1E03,
19963  bdotbelow: 0x1E05,
19964  beamedsixteenthnotes: 0x266C,
19965  because: 0x2235,
19966  becyrillic: 0x0431,
19967  beharabic: 0x0628,
19968  behfinalarabic: 0xFE90,
19969  behinitialarabic: 0xFE91,
19970  behiragana: 0x3079,
19971  behmedialarabic: 0xFE92,
19972  behmeeminitialarabic: 0xFC9F,
19973  behmeemisolatedarabic: 0xFC08,
19974  behnoonfinalarabic: 0xFC6D,
19975  bekatakana: 0x30D9,
19976  benarmenian: 0x0562,
19977  bet: 0x05D1,
19978  beta: 0x03B2,
19979  betasymbolgreek: 0x03D0,
19980  betdagesh: 0xFB31,
19981  betdageshhebrew: 0xFB31,
19982  bethebrew: 0x05D1,
19983  betrafehebrew: 0xFB4C,
19984  bhabengali: 0x09AD,
19985  bhadeva: 0x092D,
19986  bhagujarati: 0x0AAD,
19987  bhagurmukhi: 0x0A2D,
19988  bhook: 0x0253,
19989  bihiragana: 0x3073,
19990  bikatakana: 0x30D3,
19991  bilabialclick: 0x0298,
19992  bindigurmukhi: 0x0A02,
19993  birusquare: 0x3331,
19994  blackcircle: 0x25CF,
19995  blackdiamond: 0x25C6,
19996  blackdownpointingtriangle: 0x25BC,
19997  blackleftpointingpointer: 0x25C4,
19998  blackleftpointingtriangle: 0x25C0,
19999  blacklenticularbracketleft: 0x3010,
20000  blacklenticularbracketleftvertical: 0xFE3B,
20001  blacklenticularbracketright: 0x3011,
20002  blacklenticularbracketrightvertical: 0xFE3C,
20003  blacklowerlefttriangle: 0x25E3,
20004  blacklowerrighttriangle: 0x25E2,
20005  blackrectangle: 0x25AC,
20006  blackrightpointingpointer: 0x25BA,
20007  blackrightpointingtriangle: 0x25B6,
20008  blacksmallsquare: 0x25AA,
20009  blacksmilingface: 0x263B,
20010  blacksquare: 0x25A0,
20011  blackstar: 0x2605,
20012  blackupperlefttriangle: 0x25E4,
20013  blackupperrighttriangle: 0x25E5,
20014  blackuppointingsmalltriangle: 0x25B4,
20015  blackuppointingtriangle: 0x25B2,
20016  blank: 0x2423,
20017  blinebelow: 0x1E07,
20018  block: 0x2588,
20019  bmonospace: 0xFF42,
20020  bobaimaithai: 0x0E1A,
20021  bohiragana: 0x307C,
20022  bokatakana: 0x30DC,
20023  bparen: 0x249D,
20024  bqsquare: 0x33C3,
20025  braceex: 0xF8F4,
20026  braceleft: 0x007B,
20027  braceleftbt: 0xF8F3,
20028  braceleftmid: 0xF8F2,
20029  braceleftmonospace: 0xFF5B,
20030  braceleftsmall: 0xFE5B,
20031  bracelefttp: 0xF8F1,
20032  braceleftvertical: 0xFE37,
20033  braceright: 0x007D,
20034  bracerightbt: 0xF8FE,
20035  bracerightmid: 0xF8FD,
20036  bracerightmonospace: 0xFF5D,
20037  bracerightsmall: 0xFE5C,
20038  bracerighttp: 0xF8FC,
20039  bracerightvertical: 0xFE38,
20040  bracketleft: 0x005B,
20041  bracketleftbt: 0xF8F0,
20042  bracketleftex: 0xF8EF,
20043  bracketleftmonospace: 0xFF3B,
20044  bracketlefttp: 0xF8EE,
20045  bracketright: 0x005D,
20046  bracketrightbt: 0xF8FB,
20047  bracketrightex: 0xF8FA,
20048  bracketrightmonospace: 0xFF3D,
20049  bracketrighttp: 0xF8F9,
20050  breve: 0x02D8,
20051  brevebelowcmb: 0x032E,
20052  brevecmb: 0x0306,
20053  breveinvertedbelowcmb: 0x032F,
20054  breveinvertedcmb: 0x0311,
20055  breveinverteddoublecmb: 0x0361,
20056  bridgebelowcmb: 0x032A,
20057  bridgeinvertedbelowcmb: 0x033A,
20058  brokenbar: 0x00A6,
20059  bstroke: 0x0180,
20060  bsuperior: 0xF6EA,
20061  btopbar: 0x0183,
20062  buhiragana: 0x3076,
20063  bukatakana: 0x30D6,
20064  bullet: 0x2022,
20065  bulletinverse: 0x25D8,
20066  bulletoperator: 0x2219,
20067  bullseye: 0x25CE,
20068  c: 0x0063,
20069  caarmenian: 0x056E,
20070  cabengali: 0x099A,
20071  cacute: 0x0107,
20072  cadeva: 0x091A,
20073  cagujarati: 0x0A9A,
20074  cagurmukhi: 0x0A1A,
20075  calsquare: 0x3388,
20076  candrabindubengali: 0x0981,
20077  candrabinducmb: 0x0310,
20078  candrabindudeva: 0x0901,
20079  candrabindugujarati: 0x0A81,
20080  capslock: 0x21EA,
20081  careof: 0x2105,
20082  caron: 0x02C7,
20083  caronbelowcmb: 0x032C,
20084  caroncmb: 0x030C,
20085  carriagereturn: 0x21B5,
20086  cbopomofo: 0x3118,
20087  ccaron: 0x010D,
20088  ccedilla: 0x00E7,
20089  ccedillaacute: 0x1E09,
20090  ccircle: 0x24D2,
20091  ccircumflex: 0x0109,
20092  ccurl: 0x0255,
20093  cdot: 0x010B,
20094  cdotaccent: 0x010B,
20095  cdsquare: 0x33C5,
20096  cedilla: 0x00B8,
20097  cedillacmb: 0x0327,
20098  cent: 0x00A2,
20099  centigrade: 0x2103,
20100  centinferior: 0xF6DF,
20101  centmonospace: 0xFFE0,
20102  centoldstyle: 0xF7A2,
20103  centsuperior: 0xF6E0,
20104  chaarmenian: 0x0579,
20105  chabengali: 0x099B,
20106  chadeva: 0x091B,
20107  chagujarati: 0x0A9B,
20108  chagurmukhi: 0x0A1B,
20109  chbopomofo: 0x3114,
20110  cheabkhasiancyrillic: 0x04BD,
20111  checkmark: 0x2713,
20112  checyrillic: 0x0447,
20113  chedescenderabkhasiancyrillic: 0x04BF,
20114  chedescendercyrillic: 0x04B7,
20115  chedieresiscyrillic: 0x04F5,
20116  cheharmenian: 0x0573,
20117  chekhakassiancyrillic: 0x04CC,
20118  cheverticalstrokecyrillic: 0x04B9,
20119  chi: 0x03C7,
20120  chieuchacirclekorean: 0x3277,
20121  chieuchaparenkorean: 0x3217,
20122  chieuchcirclekorean: 0x3269,
20123  chieuchkorean: 0x314A,
20124  chieuchparenkorean: 0x3209,
20125  chochangthai: 0x0E0A,
20126  chochanthai: 0x0E08,
20127  chochingthai: 0x0E09,
20128  chochoethai: 0x0E0C,
20129  chook: 0x0188,
20130  cieucacirclekorean: 0x3276,
20131  cieucaparenkorean: 0x3216,
20132  cieuccirclekorean: 0x3268,
20133  cieuckorean: 0x3148,
20134  cieucparenkorean: 0x3208,
20135  cieucuparenkorean: 0x321C,
20136  circle: 0x25CB,
20137  circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
20138  circlemultiply: 0x2297,
20139  circleot: 0x2299,
20140  circleplus: 0x2295,
20141  circlepostalmark: 0x3036,
20142  circlewithlefthalfblack: 0x25D0,
20143  circlewithrighthalfblack: 0x25D1,
20144  circumflex: 0x02C6,
20145  circumflexbelowcmb: 0x032D,
20146  circumflexcmb: 0x0302,
20147  clear: 0x2327,
20148  clickalveolar: 0x01C2,
20149  clickdental: 0x01C0,
20150  clicklateral: 0x01C1,
20151  clickretroflex: 0x01C3,
20152  club: 0x2663,
20153  clubsuitblack: 0x2663,
20154  clubsuitwhite: 0x2667,
20155  cmcubedsquare: 0x33A4,
20156  cmonospace: 0xFF43,
20157  cmsquaredsquare: 0x33A0,
20158  coarmenian: 0x0581,
20159  colon: 0x003A,
20160  colonmonetary: 0x20A1,
20161  colonmonospace: 0xFF1A,
20162  colonsign: 0x20A1,
20163  colonsmall: 0xFE55,
20164  colontriangularhalfmod: 0x02D1,
20165  colontriangularmod: 0x02D0,
20166  comma: 0x002C,
20167  commaabovecmb: 0x0313,
20168  commaaboverightcmb: 0x0315,
20169  commaaccent: 0xF6C3,
20170  commaarabic: 0x060C,
20171  commaarmenian: 0x055D,
20172  commainferior: 0xF6E1,
20173  commamonospace: 0xFF0C,
20174  commareversedabovecmb: 0x0314,
20175  commareversedmod: 0x02BD,
20176  commasmall: 0xFE50,
20177  commasuperior: 0xF6E2,
20178  commaturnedabovecmb: 0x0312,
20179  commaturnedmod: 0x02BB,
20180  compass: 0x263C,
20181  congruent: 0x2245,
20182  contourintegral: 0x222E,
20183  control: 0x2303,
20184  controlACK: 0x0006,
20185  controlBEL: 0x0007,
20186  controlBS: 0x0008,
20187  controlCAN: 0x0018,
20188  controlCR: 0x000D,
20189  controlDC1: 0x0011,
20190  controlDC2: 0x0012,
20191  controlDC3: 0x0013,
20192  controlDC4: 0x0014,
20193  controlDEL: 0x007F,
20194  controlDLE: 0x0010,
20195  controlEM: 0x0019,
20196  controlENQ: 0x0005,
20197  controlEOT: 0x0004,
20198  controlESC: 0x001B,
20199  controlETB: 0x0017,
20200  controlETX: 0x0003,
20201  controlFF: 0x000C,
20202  controlFS: 0x001C,
20203  controlGS: 0x001D,
20204  controlHT: 0x0009,
20205  controlLF: 0x000A,
20206  controlNAK: 0x0015,
20207  controlRS: 0x001E,
20208  controlSI: 0x000F,
20209  controlSO: 0x000E,
20210  controlSOT: 0x0002,
20211  controlSTX: 0x0001,
20212  controlSUB: 0x001A,
20213  controlSYN: 0x0016,
20214  controlUS: 0x001F,
20215  controlVT: 0x000B,
20216  copyright: 0x00A9,
20217  copyrightsans: 0xF8E9,
20218  copyrightserif: 0xF6D9,
20219  cornerbracketleft: 0x300C,
20220  cornerbracketlefthalfwidth: 0xFF62,
20221  cornerbracketleftvertical: 0xFE41,
20222  cornerbracketright: 0x300D,
20223  cornerbracketrighthalfwidth: 0xFF63,
20224  cornerbracketrightvertical: 0xFE42,
20225  corporationsquare: 0x337F,
20226  cosquare: 0x33C7,
20227  coverkgsquare: 0x33C6,
20228  cparen: 0x249E,
20229  cruzeiro: 0x20A2,
20230  cstretched: 0x0297,
20231  curlyand: 0x22CF,
20232  curlyor: 0x22CE,
20233  currency: 0x00A4,
20234  cyrBreve: 0xF6D1,
20235  cyrFlex: 0xF6D2,
20236  cyrbreve: 0xF6D4,
20237  cyrflex: 0xF6D5,
20238  d: 0x0064,
20239  daarmenian: 0x0564,
20240  dabengali: 0x09A6,
20241  dadarabic: 0x0636,
20242  dadeva: 0x0926,
20243  dadfinalarabic: 0xFEBE,
20244  dadinitialarabic: 0xFEBF,
20245  dadmedialarabic: 0xFEC0,
20246  dagesh: 0x05BC,
20247  dageshhebrew: 0x05BC,
20248  dagger: 0x2020,
20249  daggerdbl: 0x2021,
20250  dagujarati: 0x0AA6,
20251  dagurmukhi: 0x0A26,
20252  dahiragana: 0x3060,
20253  dakatakana: 0x30C0,
20254  dalarabic: 0x062F,
20255  dalet: 0x05D3,
20256  daletdagesh: 0xFB33,
20257  daletdageshhebrew: 0xFB33,
20258  dalethebrew: 0x05D3,
20259  dalfinalarabic: 0xFEAA,
20260  dammaarabic: 0x064F,
20261  dammalowarabic: 0x064F,
20262  dammatanaltonearabic: 0x064C,
20263  dammatanarabic: 0x064C,
20264  danda: 0x0964,
20265  dargahebrew: 0x05A7,
20266  dargalefthebrew: 0x05A7,
20267  dasiapneumatacyrilliccmb: 0x0485,
20268  dblGrave: 0xF6D3,
20269  dblanglebracketleft: 0x300A,
20270  dblanglebracketleftvertical: 0xFE3D,
20271  dblanglebracketright: 0x300B,
20272  dblanglebracketrightvertical: 0xFE3E,
20273  dblarchinvertedbelowcmb: 0x032B,
20274  dblarrowleft: 0x21D4,
20275  dblarrowright: 0x21D2,
20276  dbldanda: 0x0965,
20277  dblgrave: 0xF6D6,
20278  dblgravecmb: 0x030F,
20279  dblintegral: 0x222C,
20280  dbllowline: 0x2017,
20281  dbllowlinecmb: 0x0333,
20282  dbloverlinecmb: 0x033F,
20283  dblprimemod: 0x02BA,
20284  dblverticalbar: 0x2016,
20285  dblverticallineabovecmb: 0x030E,
20286  dbopomofo: 0x3109,
20287  dbsquare: 0x33C8,
20288  dcaron: 0x010F,
20289  dcedilla: 0x1E11,
20290  dcircle: 0x24D3,
20291  dcircumflexbelow: 0x1E13,
20292  dcroat: 0x0111,
20293  ddabengali: 0x09A1,
20294  ddadeva: 0x0921,
20295  ddagujarati: 0x0AA1,
20296  ddagurmukhi: 0x0A21,
20297  ddalarabic: 0x0688,
20298  ddalfinalarabic: 0xFB89,
20299  dddhadeva: 0x095C,
20300  ddhabengali: 0x09A2,
20301  ddhadeva: 0x0922,
20302  ddhagujarati: 0x0AA2,
20303  ddhagurmukhi: 0x0A22,
20304  ddotaccent: 0x1E0B,
20305  ddotbelow: 0x1E0D,
20306  decimalseparatorarabic: 0x066B,
20307  decimalseparatorpersian: 0x066B,
20308  decyrillic: 0x0434,
20309  degree: 0x00B0,
20310  dehihebrew: 0x05AD,
20311  dehiragana: 0x3067,
20312  deicoptic: 0x03EF,
20313  dekatakana: 0x30C7,
20314  deleteleft: 0x232B,
20315  deleteright: 0x2326,
20316  delta: 0x03B4,
20317  deltaturned: 0x018D,
20318  denominatorminusonenumeratorbengali: 0x09F8,
20319  dezh: 0x02A4,
20320  dhabengali: 0x09A7,
20321  dhadeva: 0x0927,
20322  dhagujarati: 0x0AA7,
20323  dhagurmukhi: 0x0A27,
20324  dhook: 0x0257,
20325  dialytikatonos: 0x0385,
20326  dialytikatonoscmb: 0x0344,
20327  diamond: 0x2666,
20328  diamondsuitwhite: 0x2662,
20329  dieresis: 0x00A8,
20330  dieresisacute: 0xF6D7,
20331  dieresisbelowcmb: 0x0324,
20332  dieresiscmb: 0x0308,
20333  dieresisgrave: 0xF6D8,
20334  dieresistonos: 0x0385,
20335  dihiragana: 0x3062,
20336  dikatakana: 0x30C2,
20337  dittomark: 0x3003,
20338  divide: 0x00F7,
20339  divides: 0x2223,
20340  divisionslash: 0x2215,
20341  djecyrillic: 0x0452,
20342  dkshade: 0x2593,
20343  dlinebelow: 0x1E0F,
20344  dlsquare: 0x3397,
20345  dmacron: 0x0111,
20346  dmonospace: 0xFF44,
20347  dnblock: 0x2584,
20348  dochadathai: 0x0E0E,
20349  dodekthai: 0x0E14,
20350  dohiragana: 0x3069,
20351  dokatakana: 0x30C9,
20352  dollar: 0x0024,
20353  dollarinferior: 0xF6E3,
20354  dollarmonospace: 0xFF04,
20355  dollaroldstyle: 0xF724,
20356  dollarsmall: 0xFE69,
20357  dollarsuperior: 0xF6E4,
20358  dong: 0x20AB,
20359  dorusquare: 0x3326,
20360  dotaccent: 0x02D9,
20361  dotaccentcmb: 0x0307,
20362  dotbelowcmb: 0x0323,
20363  dotbelowcomb: 0x0323,
20364  dotkatakana: 0x30FB,
20365  dotlessi: 0x0131,
20366  dotlessj: 0xF6BE,
20367  dotlessjstrokehook: 0x0284,
20368  dotmath: 0x22C5,
20369  dottedcircle: 0x25CC,
20370  doubleyodpatah: 0xFB1F,
20371  doubleyodpatahhebrew: 0xFB1F,
20372  downtackbelowcmb: 0x031E,
20373  downtackmod: 0x02D5,
20374  dparen: 0x249F,
20375  dsuperior: 0xF6EB,
20376  dtail: 0x0256,
20377  dtopbar: 0x018C,
20378  duhiragana: 0x3065,
20379  dukatakana: 0x30C5,
20380  dz: 0x01F3,
20381  dzaltone: 0x02A3,
20382  dzcaron: 0x01C6,
20383  dzcurl: 0x02A5,
20384  dzeabkhasiancyrillic: 0x04E1,
20385  dzecyrillic: 0x0455,
20386  dzhecyrillic: 0x045F,
20387  e: 0x0065,
20388  eacute: 0x00E9,
20389  earth: 0x2641,
20390  ebengali: 0x098F,
20391  ebopomofo: 0x311C,
20392  ebreve: 0x0115,
20393  ecandradeva: 0x090D,
20394  ecandragujarati: 0x0A8D,
20395  ecandravowelsigndeva: 0x0945,
20396  ecandravowelsigngujarati: 0x0AC5,
20397  ecaron: 0x011B,
20398  ecedillabreve: 0x1E1D,
20399  echarmenian: 0x0565,
20400  echyiwnarmenian: 0x0587,
20401  ecircle: 0x24D4,
20402  ecircumflex: 0x00EA,
20403  ecircumflexacute: 0x1EBF,
20404  ecircumflexbelow: 0x1E19,
20405  ecircumflexdotbelow: 0x1EC7,
20406  ecircumflexgrave: 0x1EC1,
20407  ecircumflexhookabove: 0x1EC3,
20408  ecircumflextilde: 0x1EC5,
20409  ecyrillic: 0x0454,
20410  edblgrave: 0x0205,
20411  edeva: 0x090F,
20412  edieresis: 0x00EB,
20413  edot: 0x0117,
20414  edotaccent: 0x0117,
20415  edotbelow: 0x1EB9,
20416  eegurmukhi: 0x0A0F,
20417  eematragurmukhi: 0x0A47,
20418  efcyrillic: 0x0444,
20419  egrave: 0x00E8,
20420  egujarati: 0x0A8F,
20421  eharmenian: 0x0567,
20422  ehbopomofo: 0x311D,
20423  ehiragana: 0x3048,
20424  ehookabove: 0x1EBB,
20425  eibopomofo: 0x311F,
20426  eight: 0x0038,
20427  eightarabic: 0x0668,
20428  eightbengali: 0x09EE,
20429  eightcircle: 0x2467,
20430  eightcircleinversesansserif: 0x2791,
20431  eightdeva: 0x096E,
20432  eighteencircle: 0x2471,
20433  eighteenparen: 0x2485,
20434  eighteenperiod: 0x2499,
20435  eightgujarati: 0x0AEE,
20436  eightgurmukhi: 0x0A6E,
20437  eighthackarabic: 0x0668,
20438  eighthangzhou: 0x3028,
20439  eighthnotebeamed: 0x266B,
20440  eightideographicparen: 0x3227,
20441  eightinferior: 0x2088,
20442  eightmonospace: 0xFF18,
20443  eightoldstyle: 0xF738,
20444  eightparen: 0x247B,
20445  eightperiod: 0x248F,
20446  eightpersian: 0x06F8,
20447  eightroman: 0x2177,
20448  eightsuperior: 0x2078,
20449  eightthai: 0x0E58,
20450  einvertedbreve: 0x0207,
20451  eiotifiedcyrillic: 0x0465,
20452  ekatakana: 0x30A8,
20453  ekatakanahalfwidth: 0xFF74,
20454  ekonkargurmukhi: 0x0A74,
20455  ekorean: 0x3154,
20456  elcyrillic: 0x043B,
20457  element: 0x2208,
20458  elevencircle: 0x246A,
20459  elevenparen: 0x247E,
20460  elevenperiod: 0x2492,
20461  elevenroman: 0x217A,
20462  ellipsis: 0x2026,
20463  ellipsisvertical: 0x22EE,
20464  emacron: 0x0113,
20465  emacronacute: 0x1E17,
20466  emacrongrave: 0x1E15,
20467  emcyrillic: 0x043C,
20468  emdash: 0x2014,
20469  emdashvertical: 0xFE31,
20470  emonospace: 0xFF45,
20471  emphasismarkarmenian: 0x055B,
20472  emptyset: 0x2205,
20473  enbopomofo: 0x3123,
20474  encyrillic: 0x043D,
20475  endash: 0x2013,
20476  endashvertical: 0xFE32,
20477  endescendercyrillic: 0x04A3,
20478  eng: 0x014B,
20479  engbopomofo: 0x3125,
20480  enghecyrillic: 0x04A5,
20481  enhookcyrillic: 0x04C8,
20482  enspace: 0x2002,
20483  eogonek: 0x0119,
20484  eokorean: 0x3153,
20485  eopen: 0x025B,
20486  eopenclosed: 0x029A,
20487  eopenreversed: 0x025C,
20488  eopenreversedclosed: 0x025E,
20489  eopenreversedhook: 0x025D,
20490  eparen: 0x24A0,
20491  epsilon: 0x03B5,
20492  epsilontonos: 0x03AD,
20493  equal: 0x003D,
20494  equalmonospace: 0xFF1D,
20495  equalsmall: 0xFE66,
20496  equalsuperior: 0x207C,
20497  equivalence: 0x2261,
20498  erbopomofo: 0x3126,
20499  ercyrillic: 0x0440,
20500  ereversed: 0x0258,
20501  ereversedcyrillic: 0x044D,
20502  escyrillic: 0x0441,
20503  esdescendercyrillic: 0x04AB,
20504  esh: 0x0283,
20505  eshcurl: 0x0286,
20506  eshortdeva: 0x090E,
20507  eshortvowelsigndeva: 0x0946,
20508  eshreversedloop: 0x01AA,
20509  eshsquatreversed: 0x0285,
20510  esmallhiragana: 0x3047,
20511  esmallkatakana: 0x30A7,
20512  esmallkatakanahalfwidth: 0xFF6A,
20513  estimated: 0x212E,
20514  esuperior: 0xF6EC,
20515  eta: 0x03B7,
20516  etarmenian: 0x0568,
20517  etatonos: 0x03AE,
20518  eth: 0x00F0,
20519  etilde: 0x1EBD,
20520  etildebelow: 0x1E1B,
20521  etnahtafoukhhebrew: 0x0591,
20522  etnahtafoukhlefthebrew: 0x0591,
20523  etnahtahebrew: 0x0591,
20524  etnahtalefthebrew: 0x0591,
20525  eturned: 0x01DD,
20526  eukorean: 0x3161,
20527  euro: 0x20AC,
20528  evowelsignbengali: 0x09C7,
20529  evowelsigndeva: 0x0947,
20530  evowelsigngujarati: 0x0AC7,
20531  exclam: 0x0021,
20532  exclamarmenian: 0x055C,
20533  exclamdbl: 0x203C,
20534  exclamdown: 0x00A1,
20535  exclamdownsmall: 0xF7A1,
20536  exclammonospace: 0xFF01,
20537  exclamsmall: 0xF721,
20538  existential: 0x2203,
20539  ezh: 0x0292,
20540  ezhcaron: 0x01EF,
20541  ezhcurl: 0x0293,
20542  ezhreversed: 0x01B9,
20543  ezhtail: 0x01BA,
20544  f: 0x0066,
20545  fadeva: 0x095E,
20546  fagurmukhi: 0x0A5E,
20547  fahrenheit: 0x2109,
20548  fathaarabic: 0x064E,
20549  fathalowarabic: 0x064E,
20550  fathatanarabic: 0x064B,
20551  fbopomofo: 0x3108,
20552  fcircle: 0x24D5,
20553  fdotaccent: 0x1E1F,
20554  feharabic: 0x0641,
20555  feharmenian: 0x0586,
20556  fehfinalarabic: 0xFED2,
20557  fehinitialarabic: 0xFED3,
20558  fehmedialarabic: 0xFED4,
20559  feicoptic: 0x03E5,
20560  female: 0x2640,
20561  ff: 0xFB00,
20562  ffi: 0xFB03,
20563  ffl: 0xFB04,
20564  fi: 0xFB01,
20565  fifteencircle: 0x246E,
20566  fifteenparen: 0x2482,
20567  fifteenperiod: 0x2496,
20568  figuredash: 0x2012,
20569  filledbox: 0x25A0,
20570  filledrect: 0x25AC,
20571  finalkaf: 0x05DA,
20572  finalkafdagesh: 0xFB3A,
20573  finalkafdageshhebrew: 0xFB3A,
20574  finalkafhebrew: 0x05DA,
20575  finalmem: 0x05DD,
20576  finalmemhebrew: 0x05DD,
20577  finalnun: 0x05DF,
20578  finalnunhebrew: 0x05DF,
20579  finalpe: 0x05E3,
20580  finalpehebrew: 0x05E3,
20581  finaltsadi: 0x05E5,
20582  finaltsadihebrew: 0x05E5,
20583  firsttonechinese: 0x02C9,
20584  fisheye: 0x25C9,
20585  fitacyrillic: 0x0473,
20586  five: 0x0035,
20587  fivearabic: 0x0665,
20588  fivebengali: 0x09EB,
20589  fivecircle: 0x2464,
20590  fivecircleinversesansserif: 0x278E,
20591  fivedeva: 0x096B,
20592  fiveeighths: 0x215D,
20593  fivegujarati: 0x0AEB,
20594  fivegurmukhi: 0x0A6B,
20595  fivehackarabic: 0x0665,
20596  fivehangzhou: 0x3025,
20597  fiveideographicparen: 0x3224,
20598  fiveinferior: 0x2085,
20599  fivemonospace: 0xFF15,
20600  fiveoldstyle: 0xF735,
20601  fiveparen: 0x2478,
20602  fiveperiod: 0x248C,
20603  fivepersian: 0x06F5,
20604  fiveroman: 0x2174,
20605  fivesuperior: 0x2075,
20606  fivethai: 0x0E55,
20607  fl: 0xFB02,
20608  florin: 0x0192,
20609  fmonospace: 0xFF46,
20610  fmsquare: 0x3399,
20611  fofanthai: 0x0E1F,
20612  fofathai: 0x0E1D,
20613  fongmanthai: 0x0E4F,
20614  forall: 0x2200,
20615  four: 0x0034,
20616  fourarabic: 0x0664,
20617  fourbengali: 0x09EA,
20618  fourcircle: 0x2463,
20619  fourcircleinversesansserif: 0x278D,
20620  fourdeva: 0x096A,
20621  fourgujarati: 0x0AEA,
20622  fourgurmukhi: 0x0A6A,
20623  fourhackarabic: 0x0664,
20624  fourhangzhou: 0x3024,
20625  fourideographicparen: 0x3223,
20626  fourinferior: 0x2084,
20627  fourmonospace: 0xFF14,
20628  fournumeratorbengali: 0x09F7,
20629  fouroldstyle: 0xF734,
20630  fourparen: 0x2477,
20631  fourperiod: 0x248B,
20632  fourpersian: 0x06F4,
20633  fourroman: 0x2173,
20634  foursuperior: 0x2074,
20635  fourteencircle: 0x246D,
20636  fourteenparen: 0x2481,
20637  fourteenperiod: 0x2495,
20638  fourthai: 0x0E54,
20639  fourthtonechinese: 0x02CB,
20640  fparen: 0x24A1,
20641  fraction: 0x2044,
20642  franc: 0x20A3,
20643  g: 0x0067,
20644  gabengali: 0x0997,
20645  gacute: 0x01F5,
20646  gadeva: 0x0917,
20647  gafarabic: 0x06AF,
20648  gaffinalarabic: 0xFB93,
20649  gafinitialarabic: 0xFB94,
20650  gafmedialarabic: 0xFB95,
20651  gagujarati: 0x0A97,
20652  gagurmukhi: 0x0A17,
20653  gahiragana: 0x304C,
20654  gakatakana: 0x30AC,
20655  gamma: 0x03B3,
20656  gammalatinsmall: 0x0263,
20657  gammasuperior: 0x02E0,
20658  gangiacoptic: 0x03EB,
20659  gbopomofo: 0x310D,
20660  gbreve: 0x011F,
20661  gcaron: 0x01E7,
20662  gcedilla: 0x0123,
20663  gcircle: 0x24D6,
20664  gcircumflex: 0x011D,
20665  gcommaaccent: 0x0123,
20666  gdot: 0x0121,
20667  gdotaccent: 0x0121,
20668  gecyrillic: 0x0433,
20669  gehiragana: 0x3052,
20670  gekatakana: 0x30B2,
20671  geometricallyequal: 0x2251,
20672  gereshaccenthebrew: 0x059C,
20673  gereshhebrew: 0x05F3,
20674  gereshmuqdamhebrew: 0x059D,
20675  germandbls: 0x00DF,
20676  gershayimaccenthebrew: 0x059E,
20677  gershayimhebrew: 0x05F4,
20678  getamark: 0x3013,
20679  ghabengali: 0x0998,
20680  ghadarmenian: 0x0572,
20681  ghadeva: 0x0918,
20682  ghagujarati: 0x0A98,
20683  ghagurmukhi: 0x0A18,
20684  ghainarabic: 0x063A,
20685  ghainfinalarabic: 0xFECE,
20686  ghaininitialarabic: 0xFECF,
20687  ghainmedialarabic: 0xFED0,
20688  ghemiddlehookcyrillic: 0x0495,
20689  ghestrokecyrillic: 0x0493,
20690  gheupturncyrillic: 0x0491,
20691  ghhadeva: 0x095A,
20692  ghhagurmukhi: 0x0A5A,
20693  ghook: 0x0260,
20694  ghzsquare: 0x3393,
20695  gihiragana: 0x304E,
20696  gikatakana: 0x30AE,
20697  gimarmenian: 0x0563,
20698  gimel: 0x05D2,
20699  gimeldagesh: 0xFB32,
20700  gimeldageshhebrew: 0xFB32,
20701  gimelhebrew: 0x05D2,
20702  gjecyrillic: 0x0453,
20703  glottalinvertedstroke: 0x01BE,
20704  glottalstop: 0x0294,
20705  glottalstopinverted: 0x0296,
20706  glottalstopmod: 0x02C0,
20707  glottalstopreversed: 0x0295,
20708  glottalstopreversedmod: 0x02C1,
20709  glottalstopreversedsuperior: 0x02E4,
20710  glottalstopstroke: 0x02A1,
20711  glottalstopstrokereversed: 0x02A2,
20712  gmacron: 0x1E21,
20713  gmonospace: 0xFF47,
20714  gohiragana: 0x3054,
20715  gokatakana: 0x30B4,
20716  gparen: 0x24A2,
20717  gpasquare: 0x33AC,
20718  gradient: 0x2207,
20719  grave: 0x0060,
20720  gravebelowcmb: 0x0316,
20721  gravecmb: 0x0300,
20722  gravecomb: 0x0300,
20723  gravedeva: 0x0953,
20724  gravelowmod: 0x02CE,
20725  gravemonospace: 0xFF40,
20726  gravetonecmb: 0x0340,
20727  greater: 0x003E,
20728  greaterequal: 0x2265,
20729  greaterequalorless: 0x22DB,
20730  greatermonospace: 0xFF1E,
20731  greaterorequivalent: 0x2273,
20732  greaterorless: 0x2277,
20733  greateroverequal: 0x2267,
20734  greatersmall: 0xFE65,
20735  gscript: 0x0261,
20736  gstroke: 0x01E5,
20737  guhiragana: 0x3050,
20738  guillemotleft: 0x00AB,
20739  guillemotright: 0x00BB,
20740  guilsinglleft: 0x2039,
20741  guilsinglright: 0x203A,
20742  gukatakana: 0x30B0,
20743  guramusquare: 0x3318,
20744  gysquare: 0x33C9,
20745  h: 0x0068,
20746  haabkhasiancyrillic: 0x04A9,
20747  haaltonearabic: 0x06C1,
20748  habengali: 0x09B9,
20749  hadescendercyrillic: 0x04B3,
20750  hadeva: 0x0939,
20751  hagujarati: 0x0AB9,
20752  hagurmukhi: 0x0A39,
20753  haharabic: 0x062D,
20754  hahfinalarabic: 0xFEA2,
20755  hahinitialarabic: 0xFEA3,
20756  hahiragana: 0x306F,
20757  hahmedialarabic: 0xFEA4,
20758  haitusquare: 0x332A,
20759  hakatakana: 0x30CF,
20760  hakatakanahalfwidth: 0xFF8A,
20761  halantgurmukhi: 0x0A4D,
20762  hamzaarabic: 0x0621,
20763  hamzalowarabic: 0x0621,
20764  hangulfiller: 0x3164,
20765  hardsigncyrillic: 0x044A,
20766  harpoonleftbarbup: 0x21BC,
20767  harpoonrightbarbup: 0x21C0,
20768  hasquare: 0x33CA,
20769  hatafpatah: 0x05B2,
20770  hatafpatah16: 0x05B2,
20771  hatafpatah23: 0x05B2,
20772  hatafpatah2f: 0x05B2,
20773  hatafpatahhebrew: 0x05B2,
20774  hatafpatahnarrowhebrew: 0x05B2,
20775  hatafpatahquarterhebrew: 0x05B2,
20776  hatafpatahwidehebrew: 0x05B2,
20777  hatafqamats: 0x05B3,
20778  hatafqamats1b: 0x05B3,
20779  hatafqamats28: 0x05B3,
20780  hatafqamats34: 0x05B3,
20781  hatafqamatshebrew: 0x05B3,
20782  hatafqamatsnarrowhebrew: 0x05B3,
20783  hatafqamatsquarterhebrew: 0x05B3,
20784  hatafqamatswidehebrew: 0x05B3,
20785  hatafsegol: 0x05B1,
20786  hatafsegol17: 0x05B1,
20787  hatafsegol24: 0x05B1,
20788  hatafsegol30: 0x05B1,
20789  hatafsegolhebrew: 0x05B1,
20790  hatafsegolnarrowhebrew: 0x05B1,
20791  hatafsegolquarterhebrew: 0x05B1,
20792  hatafsegolwidehebrew: 0x05B1,
20793  hbar: 0x0127,
20794  hbopomofo: 0x310F,
20795  hbrevebelow: 0x1E2B,
20796  hcedilla: 0x1E29,
20797  hcircle: 0x24D7,
20798  hcircumflex: 0x0125,
20799  hdieresis: 0x1E27,
20800  hdotaccent: 0x1E23,
20801  hdotbelow: 0x1E25,
20802  he: 0x05D4,
20803  heart: 0x2665,
20804  heartsuitblack: 0x2665,
20805  heartsuitwhite: 0x2661,
20806  hedagesh: 0xFB34,
20807  hedageshhebrew: 0xFB34,
20808  hehaltonearabic: 0x06C1,
20809  heharabic: 0x0647,
20810  hehebrew: 0x05D4,
20811  hehfinalaltonearabic: 0xFBA7,
20812  hehfinalalttwoarabic: 0xFEEA,
20813  hehfinalarabic: 0xFEEA,
20814  hehhamzaabovefinalarabic: 0xFBA5,
20815  hehhamzaaboveisolatedarabic: 0xFBA4,
20816  hehinitialaltonearabic: 0xFBA8,
20817  hehinitialarabic: 0xFEEB,
20818  hehiragana: 0x3078,
20819  hehmedialaltonearabic: 0xFBA9,
20820  hehmedialarabic: 0xFEEC,
20821  heiseierasquare: 0x337B,
20822  hekatakana: 0x30D8,
20823  hekatakanahalfwidth: 0xFF8D,
20824  hekutaarusquare: 0x3336,
20825  henghook: 0x0267,
20826  herutusquare: 0x3339,
20827  het: 0x05D7,
20828  hethebrew: 0x05D7,
20829  hhook: 0x0266,
20830  hhooksuperior: 0x02B1,
20831  hieuhacirclekorean: 0x327B,
20832  hieuhaparenkorean: 0x321B,
20833  hieuhcirclekorean: 0x326D,
20834  hieuhkorean: 0x314E,
20835  hieuhparenkorean: 0x320D,
20836  hihiragana: 0x3072,
20837  hikatakana: 0x30D2,
20838  hikatakanahalfwidth: 0xFF8B,
20839  hiriq: 0x05B4,
20840  hiriq14: 0x05B4,
20841  hiriq21: 0x05B4,
20842  hiriq2d: 0x05B4,
20843  hiriqhebrew: 0x05B4,
20844  hiriqnarrowhebrew: 0x05B4,
20845  hiriqquarterhebrew: 0x05B4,
20846  hiriqwidehebrew: 0x05B4,
20847  hlinebelow: 0x1E96,
20848  hmonospace: 0xFF48,
20849  hoarmenian: 0x0570,
20850  hohipthai: 0x0E2B,
20851  hohiragana: 0x307B,
20852  hokatakana: 0x30DB,
20853  hokatakanahalfwidth: 0xFF8E,
20854  holam: 0x05B9,
20855  holam19: 0x05B9,
20856  holam26: 0x05B9,
20857  holam32: 0x05B9,
20858  holamhebrew: 0x05B9,
20859  holamnarrowhebrew: 0x05B9,
20860  holamquarterhebrew: 0x05B9,
20861  holamwidehebrew: 0x05B9,
20862  honokhukthai: 0x0E2E,
20863  hookabovecomb: 0x0309,
20864  hookcmb: 0x0309,
20865  hookpalatalizedbelowcmb: 0x0321,
20866  hookretroflexbelowcmb: 0x0322,
20867  hoonsquare: 0x3342,
20868  horicoptic: 0x03E9,
20869  horizontalbar: 0x2015,
20870  horncmb: 0x031B,
20871  hotsprings: 0x2668,
20872  house: 0x2302,
20873  hparen: 0x24A3,
20874  hsuperior: 0x02B0,
20875  hturned: 0x0265,
20876  huhiragana: 0x3075,
20877  huiitosquare: 0x3333,
20878  hukatakana: 0x30D5,
20879  hukatakanahalfwidth: 0xFF8C,
20880  hungarumlaut: 0x02DD,
20881  hungarumlautcmb: 0x030B,
20882  hv: 0x0195,
20883  hyphen: 0x002D,
20884  hypheninferior: 0xF6E5,
20885  hyphenmonospace: 0xFF0D,
20886  hyphensmall: 0xFE63,
20887  hyphensuperior: 0xF6E6,
20888  hyphentwo: 0x2010,
20889  i: 0x0069,
20890  iacute: 0x00ED,
20891  iacyrillic: 0x044F,
20892  ibengali: 0x0987,
20893  ibopomofo: 0x3127,
20894  ibreve: 0x012D,
20895  icaron: 0x01D0,
20896  icircle: 0x24D8,
20897  icircumflex: 0x00EE,
20898  icyrillic: 0x0456,
20899  idblgrave: 0x0209,
20900  ideographearthcircle: 0x328F,
20901  ideographfirecircle: 0x328B,
20902  ideographicallianceparen: 0x323F,
20903  ideographiccallparen: 0x323A,
20904  ideographiccentrecircle: 0x32A5,
20905  ideographicclose: 0x3006,
20906  ideographiccomma: 0x3001,
20907  ideographiccommaleft: 0xFF64,
20908  ideographiccongratulationparen: 0x3237,
20909  ideographiccorrectcircle: 0x32A3,
20910  ideographicearthparen: 0x322F,
20911  ideographicenterpriseparen: 0x323D,
20912  ideographicexcellentcircle: 0x329D,
20913  ideographicfestivalparen: 0x3240,
20914  ideographicfinancialcircle: 0x3296,
20915  ideographicfinancialparen: 0x3236,
20916  ideographicfireparen: 0x322B,
20917  ideographichaveparen: 0x3232,
20918  ideographichighcircle: 0x32A4,
20919  ideographiciterationmark: 0x3005,
20920  ideographiclaborcircle: 0x3298,
20921  ideographiclaborparen: 0x3238,
20922  ideographicleftcircle: 0x32A7,
20923  ideographiclowcircle: 0x32A6,
20924  ideographicmedicinecircle: 0x32A9,
20925  ideographicmetalparen: 0x322E,
20926  ideographicmoonparen: 0x322A,
20927  ideographicnameparen: 0x3234,
20928  ideographicperiod: 0x3002,
20929  ideographicprintcircle: 0x329E,
20930  ideographicreachparen: 0x3243,
20931  ideographicrepresentparen: 0x3239,
20932  ideographicresourceparen: 0x323E,
20933  ideographicrightcircle: 0x32A8,
20934  ideographicsecretcircle: 0x3299,
20935  ideographicselfparen: 0x3242,
20936  ideographicsocietyparen: 0x3233,
20937  ideographicspace: 0x3000,
20938  ideographicspecialparen: 0x3235,
20939  ideographicstockparen: 0x3231,
20940  ideographicstudyparen: 0x323B,
20941  ideographicsunparen: 0x3230,
20942  ideographicsuperviseparen: 0x323C,
20943  ideographicwaterparen: 0x322C,
20944  ideographicwoodparen: 0x322D,
20945  ideographiczero: 0x3007,
20946  ideographmetalcircle: 0x328E,
20947  ideographmooncircle: 0x328A,
20948  ideographnamecircle: 0x3294,
20949  ideographsuncircle: 0x3290,
20950  ideographwatercircle: 0x328C,
20951  ideographwoodcircle: 0x328D,
20952  ideva: 0x0907,
20953  idieresis: 0x00EF,
20954  idieresisacute: 0x1E2F,
20955  idieresiscyrillic: 0x04E5,
20956  idotbelow: 0x1ECB,
20957  iebrevecyrillic: 0x04D7,
20958  iecyrillic: 0x0435,
20959  ieungacirclekorean: 0x3275,
20960  ieungaparenkorean: 0x3215,
20961  ieungcirclekorean: 0x3267,
20962  ieungkorean: 0x3147,
20963  ieungparenkorean: 0x3207,
20964  igrave: 0x00EC,
20965  igujarati: 0x0A87,
20966  igurmukhi: 0x0A07,
20967  ihiragana: 0x3044,
20968  ihookabove: 0x1EC9,
20969  iibengali: 0x0988,
20970  iicyrillic: 0x0438,
20971  iideva: 0x0908,
20972  iigujarati: 0x0A88,
20973  iigurmukhi: 0x0A08,
20974  iimatragurmukhi: 0x0A40,
20975  iinvertedbreve: 0x020B,
20976  iishortcyrillic: 0x0439,
20977  iivowelsignbengali: 0x09C0,
20978  iivowelsigndeva: 0x0940,
20979  iivowelsigngujarati: 0x0AC0,
20980  ij: 0x0133,
20981  ikatakana: 0x30A4,
20982  ikatakanahalfwidth: 0xFF72,
20983  ikorean: 0x3163,
20984  ilde: 0x02DC,
20985  iluyhebrew: 0x05AC,
20986  imacron: 0x012B,
20987  imacroncyrillic: 0x04E3,
20988  imageorapproximatelyequal: 0x2253,
20989  imatragurmukhi: 0x0A3F,
20990  imonospace: 0xFF49,
20991  increment: 0x2206,
20992  infinity: 0x221E,
20993  iniarmenian: 0x056B,
20994  integral: 0x222B,
20995  integralbottom: 0x2321,
20996  integralbt: 0x2321,
20997  integralex: 0xF8F5,
20998  integraltop: 0x2320,
20999  integraltp: 0x2320,
21000  intersection: 0x2229,
21001  intisquare: 0x3305,
21002  invbullet: 0x25D8,
21003  invcircle: 0x25D9,
21004  invsmileface: 0x263B,
21005  iocyrillic: 0x0451,
21006  iogonek: 0x012F,
21007  iota: 0x03B9,
21008  iotadieresis: 0x03CA,
21009  iotadieresistonos: 0x0390,
21010  iotalatin: 0x0269,
21011  iotatonos: 0x03AF,
21012  iparen: 0x24A4,
21013  irigurmukhi: 0x0A72,
21014  ismallhiragana: 0x3043,
21015  ismallkatakana: 0x30A3,
21016  ismallkatakanahalfwidth: 0xFF68,
21017  issharbengali: 0x09FA,
21018  istroke: 0x0268,
21019  isuperior: 0xF6ED,
21020  iterationhiragana: 0x309D,
21021  iterationkatakana: 0x30FD,
21022  itilde: 0x0129,
21023  itildebelow: 0x1E2D,
21024  iubopomofo: 0x3129,
21025  iucyrillic: 0x044E,
21026  ivowelsignbengali: 0x09BF,
21027  ivowelsigndeva: 0x093F,
21028  ivowelsigngujarati: 0x0ABF,
21029  izhitsacyrillic: 0x0475,
21030  izhitsadblgravecyrillic: 0x0477,
21031  j: 0x006A,
21032  jaarmenian: 0x0571,
21033  jabengali: 0x099C,
21034  jadeva: 0x091C,
21035  jagujarati: 0x0A9C,
21036  jagurmukhi: 0x0A1C,
21037  jbopomofo: 0x3110,
21038  jcaron: 0x01F0,
21039  jcircle: 0x24D9,
21040  jcircumflex: 0x0135,
21041  jcrossedtail: 0x029D,
21042  jdotlessstroke: 0x025F,
21043  jecyrillic: 0x0458,
21044  jeemarabic: 0x062C,
21045  jeemfinalarabic: 0xFE9E,
21046  jeeminitialarabic: 0xFE9F,
21047  jeemmedialarabic: 0xFEA0,
21048  jeharabic: 0x0698,
21049  jehfinalarabic: 0xFB8B,
21050  jhabengali: 0x099D,
21051  jhadeva: 0x091D,
21052  jhagujarati: 0x0A9D,
21053  jhagurmukhi: 0x0A1D,
21054  jheharmenian: 0x057B,
21055  jis: 0x3004,
21056  jmonospace: 0xFF4A,
21057  jparen: 0x24A5,
21058  jsuperior: 0x02B2,
21059  k: 0x006B,
21060  kabashkircyrillic: 0x04A1,
21061  kabengali: 0x0995,
21062  kacute: 0x1E31,
21063  kacyrillic: 0x043A,
21064  kadescendercyrillic: 0x049B,
21065  kadeva: 0x0915,
21066  kaf: 0x05DB,
21067  kafarabic: 0x0643,
21068  kafdagesh: 0xFB3B,
21069  kafdageshhebrew: 0xFB3B,
21070  kaffinalarabic: 0xFEDA,
21071  kafhebrew: 0x05DB,
21072  kafinitialarabic: 0xFEDB,
21073  kafmedialarabic: 0xFEDC,
21074  kafrafehebrew: 0xFB4D,
21075  kagujarati: 0x0A95,
21076  kagurmukhi: 0x0A15,
21077  kahiragana: 0x304B,
21078  kahookcyrillic: 0x04C4,
21079  kakatakana: 0x30AB,
21080  kakatakanahalfwidth: 0xFF76,
21081  kappa: 0x03BA,
21082  kappasymbolgreek: 0x03F0,
21083  kapyeounmieumkorean: 0x3171,
21084  kapyeounphieuphkorean: 0x3184,
21085  kapyeounpieupkorean: 0x3178,
21086  kapyeounssangpieupkorean: 0x3179,
21087  karoriisquare: 0x330D,
21088  kashidaautoarabic: 0x0640,
21089  kashidaautonosidebearingarabic: 0x0640,
21090  kasmallkatakana: 0x30F5,
21091  kasquare: 0x3384,
21092  kasraarabic: 0x0650,
21093  kasratanarabic: 0x064D,
21094  kastrokecyrillic: 0x049F,
21095  katahiraprolongmarkhalfwidth: 0xFF70,
21096  kaverticalstrokecyrillic: 0x049D,
21097  kbopomofo: 0x310E,
21098  kcalsquare: 0x3389,
21099  kcaron: 0x01E9,
21100  kcedilla: 0x0137,
21101  kcircle: 0x24DA,
21102  kcommaaccent: 0x0137,
21103  kdotbelow: 0x1E33,
21104  keharmenian: 0x0584,
21105  kehiragana: 0x3051,
21106  kekatakana: 0x30B1,
21107  kekatakanahalfwidth: 0xFF79,
21108  kenarmenian: 0x056F,
21109  kesmallkatakana: 0x30F6,
21110  kgreenlandic: 0x0138,
21111  khabengali: 0x0996,
21112  khacyrillic: 0x0445,
21113  khadeva: 0x0916,
21114  khagujarati: 0x0A96,
21115  khagurmukhi: 0x0A16,
21116  khaharabic: 0x062E,
21117  khahfinalarabic: 0xFEA6,
21118  khahinitialarabic: 0xFEA7,
21119  khahmedialarabic: 0xFEA8,
21120  kheicoptic: 0x03E7,
21121  khhadeva: 0x0959,
21122  khhagurmukhi: 0x0A59,
21123  khieukhacirclekorean: 0x3278,
21124  khieukhaparenkorean: 0x3218,
21125  khieukhcirclekorean: 0x326A,
21126  khieukhkorean: 0x314B,
21127  khieukhparenkorean: 0x320A,
21128  khokhaithai: 0x0E02,
21129  khokhonthai: 0x0E05,
21130  khokhuatthai: 0x0E03,
21131  khokhwaithai: 0x0E04,
21132  khomutthai: 0x0E5B,
21133  khook: 0x0199,
21134  khorakhangthai: 0x0E06,
21135  khzsquare: 0x3391,
21136  kihiragana: 0x304D,
21137  kikatakana: 0x30AD,
21138  kikatakanahalfwidth: 0xFF77,
21139  kiroguramusquare: 0x3315,
21140  kiromeetorusquare: 0x3316,
21141  kirosquare: 0x3314,
21142  kiyeokacirclekorean: 0x326E,
21143  kiyeokaparenkorean: 0x320E,
21144  kiyeokcirclekorean: 0x3260,
21145  kiyeokkorean: 0x3131,
21146  kiyeokparenkorean: 0x3200,
21147  kiyeoksioskorean: 0x3133,
21148  kjecyrillic: 0x045C,
21149  klinebelow: 0x1E35,
21150  klsquare: 0x3398,
21151  kmcubedsquare: 0x33A6,
21152  kmonospace: 0xFF4B,
21153  kmsquaredsquare: 0x33A2,
21154  kohiragana: 0x3053,
21155  kohmsquare: 0x33C0,
21156  kokaithai: 0x0E01,
21157  kokatakana: 0x30B3,
21158  kokatakanahalfwidth: 0xFF7A,
21159  kooposquare: 0x331E,
21160  koppacyrillic: 0x0481,
21161  koreanstandardsymbol: 0x327F,
21162  koroniscmb: 0x0343,
21163  kparen: 0x24A6,
21164  kpasquare: 0x33AA,
21165  ksicyrillic: 0x046F,
21166  ktsquare: 0x33CF,
21167  kturned: 0x029E,
21168  kuhiragana: 0x304F,
21169  kukatakana: 0x30AF,
21170  kukatakanahalfwidth: 0xFF78,
21171  kvsquare: 0x33B8,
21172  kwsquare: 0x33BE,
21173  l: 0x006C,
21174  labengali: 0x09B2,
21175  lacute: 0x013A,
21176  ladeva: 0x0932,
21177  lagujarati: 0x0AB2,
21178  lagurmukhi: 0x0A32,
21179  lakkhangyaothai: 0x0E45,
21180  lamaleffinalarabic: 0xFEFC,
21181  lamalefhamzaabovefinalarabic: 0xFEF8,
21182  lamalefhamzaaboveisolatedarabic: 0xFEF7,
21183  lamalefhamzabelowfinalarabic: 0xFEFA,
21184  lamalefhamzabelowisolatedarabic: 0xFEF9,
21185  lamalefisolatedarabic: 0xFEFB,
21186  lamalefmaddaabovefinalarabic: 0xFEF6,
21187  lamalefmaddaaboveisolatedarabic: 0xFEF5,
21188  lamarabic: 0x0644,
21189  lambda: 0x03BB,
21190  lambdastroke: 0x019B,
21191  lamed: 0x05DC,
21192  lameddagesh: 0xFB3C,
21193  lameddageshhebrew: 0xFB3C,
21194  lamedhebrew: 0x05DC,
21195  lamfinalarabic: 0xFEDE,
21196  lamhahinitialarabic: 0xFCCA,
21197  laminitialarabic: 0xFEDF,
21198  lamjeeminitialarabic: 0xFCC9,
21199  lamkhahinitialarabic: 0xFCCB,
21200  lamlamhehisolatedarabic: 0xFDF2,
21201  lammedialarabic: 0xFEE0,
21202  lammeemhahinitialarabic: 0xFD88,
21203  lammeeminitialarabic: 0xFCCC,
21204  largecircle: 0x25EF,
21205  lbar: 0x019A,
21206  lbelt: 0x026C,
21207  lbopomofo: 0x310C,
21208  lcaron: 0x013E,
21209  lcedilla: 0x013C,
21210  lcircle: 0x24DB,
21211  lcircumflexbelow: 0x1E3D,
21212  lcommaaccent: 0x013C,
21213  ldot: 0x0140,
21214  ldotaccent: 0x0140,
21215  ldotbelow: 0x1E37,
21216  ldotbelowmacron: 0x1E39,
21217  leftangleabovecmb: 0x031A,
21218  lefttackbelowcmb: 0x0318,
21219  less: 0x003C,
21220  lessequal: 0x2264,
21221  lessequalorgreater: 0x22DA,
21222  lessmonospace: 0xFF1C,
21223  lessorequivalent: 0x2272,
21224  lessorgreater: 0x2276,
21225  lessoverequal: 0x2266,
21226  lesssmall: 0xFE64,
21227  lezh: 0x026E,
21228  lfblock: 0x258C,
21229  lhookretroflex: 0x026D,
21230  lira: 0x20A4,
21231  liwnarmenian: 0x056C,
21232  lj: 0x01C9,
21233  ljecyrillic: 0x0459,
21234  ll: 0xF6C0,
21235  lladeva: 0x0933,
21236  llagujarati: 0x0AB3,
21237  llinebelow: 0x1E3B,
21238  llladeva: 0x0934,
21239  llvocalicbengali: 0x09E1,
21240  llvocalicdeva: 0x0961,
21241  llvocalicvowelsignbengali: 0x09E3,
21242  llvocalicvowelsigndeva: 0x0963,
21243  lmiddletilde: 0x026B,
21244  lmonospace: 0xFF4C,
21245  lmsquare: 0x33D0,
21246  lochulathai: 0x0E2C,
21247  logicaland: 0x2227,
21248  logicalnot: 0x00AC,
21249  logicalnotreversed: 0x2310,
21250  logicalor: 0x2228,
21251  lolingthai: 0x0E25,
21252  longs: 0x017F,
21253  lowlinecenterline: 0xFE4E,
21254  lowlinecmb: 0x0332,
21255  lowlinedashed: 0xFE4D,
21256  lozenge: 0x25CA,
21257  lparen: 0x24A7,
21258  lslash: 0x0142,
21259  lsquare: 0x2113,
21260  lsuperior: 0xF6EE,
21261  ltshade: 0x2591,
21262  luthai: 0x0E26,
21263  lvocalicbengali: 0x098C,
21264  lvocalicdeva: 0x090C,
21265  lvocalicvowelsignbengali: 0x09E2,
21266  lvocalicvowelsigndeva: 0x0962,
21267  lxsquare: 0x33D3,
21268  m: 0x006D,
21269  mabengali: 0x09AE,
21270  macron: 0x00AF,
21271  macronbelowcmb: 0x0331,
21272  macroncmb: 0x0304,
21273  macronlowmod: 0x02CD,
21274  macronmonospace: 0xFFE3,
21275  macute: 0x1E3F,
21276  madeva: 0x092E,
21277  magujarati: 0x0AAE,
21278  magurmukhi: 0x0A2E,
21279  mahapakhhebrew: 0x05A4,
21280  mahapakhlefthebrew: 0x05A4,
21281  mahiragana: 0x307E,
21282  maichattawalowleftthai: 0xF895,
21283  maichattawalowrightthai: 0xF894,
21284  maichattawathai: 0x0E4B,
21285  maichattawaupperleftthai: 0xF893,
21286  maieklowleftthai: 0xF88C,
21287  maieklowrightthai: 0xF88B,
21288  maiekthai: 0x0E48,
21289  maiekupperleftthai: 0xF88A,
21290  maihanakatleftthai: 0xF884,
21291  maihanakatthai: 0x0E31,
21292  maitaikhuleftthai: 0xF889,
21293  maitaikhuthai: 0x0E47,
21294  maitholowleftthai: 0xF88F,
21295  maitholowrightthai: 0xF88E,
21296  maithothai: 0x0E49,
21297  maithoupperleftthai: 0xF88D,
21298  maitrilowleftthai: 0xF892,
21299  maitrilowrightthai: 0xF891,
21300  maitrithai: 0x0E4A,
21301  maitriupperleftthai: 0xF890,
21302  maiyamokthai: 0x0E46,
21303  makatakana: 0x30DE,
21304  makatakanahalfwidth: 0xFF8F,
21305  male: 0x2642,
21306  mansyonsquare: 0x3347,
21307  maqafhebrew: 0x05BE,
21308  mars: 0x2642,
21309  masoracirclehebrew: 0x05AF,
21310  masquare: 0x3383,
21311  mbopomofo: 0x3107,
21312  mbsquare: 0x33D4,
21313  mcircle: 0x24DC,
21314  mcubedsquare: 0x33A5,
21315  mdotaccent: 0x1E41,
21316  mdotbelow: 0x1E43,
21317  meemarabic: 0x0645,
21318  meemfinalarabic: 0xFEE2,
21319  meeminitialarabic: 0xFEE3,
21320  meemmedialarabic: 0xFEE4,
21321  meemmeeminitialarabic: 0xFCD1,
21322  meemmeemisolatedarabic: 0xFC48,
21323  meetorusquare: 0x334D,
21324  mehiragana: 0x3081,
21325  meizierasquare: 0x337E,
21326  mekatakana: 0x30E1,
21327  mekatakanahalfwidth: 0xFF92,
21328  mem: 0x05DE,
21329  memdagesh: 0xFB3E,
21330  memdageshhebrew: 0xFB3E,
21331  memhebrew: 0x05DE,
21332  menarmenian: 0x0574,
21333  merkhahebrew: 0x05A5,
21334  merkhakefulahebrew: 0x05A6,
21335  merkhakefulalefthebrew: 0x05A6,
21336  merkhalefthebrew: 0x05A5,
21337  mhook: 0x0271,
21338  mhzsquare: 0x3392,
21339  middledotkatakanahalfwidth: 0xFF65,
21340  middot: 0x00B7,
21341  mieumacirclekorean: 0x3272,
21342  mieumaparenkorean: 0x3212,
21343  mieumcirclekorean: 0x3264,
21344  mieumkorean: 0x3141,
21345  mieumpansioskorean: 0x3170,
21346  mieumparenkorean: 0x3204,
21347  mieumpieupkorean: 0x316E,
21348  mieumsioskorean: 0x316F,
21349  mihiragana: 0x307F,
21350  mikatakana: 0x30DF,
21351  mikatakanahalfwidth: 0xFF90,
21352  minus: 0x2212,
21353  minusbelowcmb: 0x0320,
21354  minuscircle: 0x2296,
21355  minusmod: 0x02D7,
21356  minusplus: 0x2213,
21357  minute: 0x2032,
21358  miribaarusquare: 0x334A,
21359  mirisquare: 0x3349,
21360  mlonglegturned: 0x0270,
21361  mlsquare: 0x3396,
21362  mmcubedsquare: 0x33A3,
21363  mmonospace: 0xFF4D,
21364  mmsquaredsquare: 0x339F,
21365  mohiragana: 0x3082,
21366  mohmsquare: 0x33C1,
21367  mokatakana: 0x30E2,
21368  mokatakanahalfwidth: 0xFF93,
21369  molsquare: 0x33D6,
21370  momathai: 0x0E21,
21371  moverssquare: 0x33A7,
21372  moverssquaredsquare: 0x33A8,
21373  mparen: 0x24A8,
21374  mpasquare: 0x33AB,
21375  mssquare: 0x33B3,
21376  msuperior: 0xF6EF,
21377  mturned: 0x026F,
21378  mu: 0x00B5,
21379  mu1: 0x00B5,
21380  muasquare: 0x3382,
21381  muchgreater: 0x226B,
21382  muchless: 0x226A,
21383  mufsquare: 0x338C,
21384  mugreek: 0x03BC,
21385  mugsquare: 0x338D,
21386  muhiragana: 0x3080,
21387  mukatakana: 0x30E0,
21388  mukatakanahalfwidth: 0xFF91,
21389  mulsquare: 0x3395,
21390  multiply: 0x00D7,
21391  mumsquare: 0x339B,
21392  munahhebrew: 0x05A3,
21393  munahlefthebrew: 0x05A3,
21394  musicalnote: 0x266A,
21395  musicalnotedbl: 0x266B,
21396  musicflatsign: 0x266D,
21397  musicsharpsign: 0x266F,
21398  mussquare: 0x33B2,
21399  muvsquare: 0x33B6,
21400  muwsquare: 0x33BC,
21401  mvmegasquare: 0x33B9,
21402  mvsquare: 0x33B7,
21403  mwmegasquare: 0x33BF,
21404  mwsquare: 0x33BD,
21405  n: 0x006E,
21406  nabengali: 0x09A8,
21407  nabla: 0x2207,
21408  nacute: 0x0144,
21409  nadeva: 0x0928,
21410  nagujarati: 0x0AA8,
21411  nagurmukhi: 0x0A28,
21412  nahiragana: 0x306A,
21413  nakatakana: 0x30CA,
21414  nakatakanahalfwidth: 0xFF85,
21415  napostrophe: 0x0149,
21416  nasquare: 0x3381,
21417  nbopomofo: 0x310B,
21418  nbspace: 0x00A0,
21419  ncaron: 0x0148,
21420  ncedilla: 0x0146,
21421  ncircle: 0x24DD,
21422  ncircumflexbelow: 0x1E4B,
21423  ncommaaccent: 0x0146,
21424  ndotaccent: 0x1E45,
21425  ndotbelow: 0x1E47,
21426  nehiragana: 0x306D,
21427  nekatakana: 0x30CD,
21428  nekatakanahalfwidth: 0xFF88,
21429  newsheqelsign: 0x20AA,
21430  nfsquare: 0x338B,
21431  ngabengali: 0x0999,
21432  ngadeva: 0x0919,
21433  ngagujarati: 0x0A99,
21434  ngagurmukhi: 0x0A19,
21435  ngonguthai: 0x0E07,
21436  nhiragana: 0x3093,
21437  nhookleft: 0x0272,
21438  nhookretroflex: 0x0273,
21439  nieunacirclekorean: 0x326F,
21440  nieunaparenkorean: 0x320F,
21441  nieuncieuckorean: 0x3135,
21442  nieuncirclekorean: 0x3261,
21443  nieunhieuhkorean: 0x3136,
21444  nieunkorean: 0x3134,
21445  nieunpansioskorean: 0x3168,
21446  nieunparenkorean: 0x3201,
21447  nieunsioskorean: 0x3167,
21448  nieuntikeutkorean: 0x3166,
21449  nihiragana: 0x306B,
21450  nikatakana: 0x30CB,
21451  nikatakanahalfwidth: 0xFF86,
21452  nikhahitleftthai: 0xF899,
21453  nikhahitthai: 0x0E4D,
21454  nine: 0x0039,
21455  ninearabic: 0x0669,
21456  ninebengali: 0x09EF,
21457  ninecircle: 0x2468,
21458  ninecircleinversesansserif: 0x2792,
21459  ninedeva: 0x096F,
21460  ninegujarati: 0x0AEF,
21461  ninegurmukhi: 0x0A6F,
21462  ninehackarabic: 0x0669,
21463  ninehangzhou: 0x3029,
21464  nineideographicparen: 0x3228,
21465  nineinferior: 0x2089,
21466  ninemonospace: 0xFF19,
21467  nineoldstyle: 0xF739,
21468  nineparen: 0x247C,
21469  nineperiod: 0x2490,
21470  ninepersian: 0x06F9,
21471  nineroman: 0x2178,
21472  ninesuperior: 0x2079,
21473  nineteencircle: 0x2472,
21474  nineteenparen: 0x2486,
21475  nineteenperiod: 0x249A,
21476  ninethai: 0x0E59,
21477  nj: 0x01CC,
21478  njecyrillic: 0x045A,
21479  nkatakana: 0x30F3,
21480  nkatakanahalfwidth: 0xFF9D,
21481  nlegrightlong: 0x019E,
21482  nlinebelow: 0x1E49,
21483  nmonospace: 0xFF4E,
21484  nmsquare: 0x339A,
21485  nnabengali: 0x09A3,
21486  nnadeva: 0x0923,
21487  nnagujarati: 0x0AA3,
21488  nnagurmukhi: 0x0A23,
21489  nnnadeva: 0x0929,
21490  nohiragana: 0x306E,
21491  nokatakana: 0x30CE,
21492  nokatakanahalfwidth: 0xFF89,
21493  nonbreakingspace: 0x00A0,
21494  nonenthai: 0x0E13,
21495  nonuthai: 0x0E19,
21496  noonarabic: 0x0646,
21497  noonfinalarabic: 0xFEE6,
21498  noonghunnaarabic: 0x06BA,
21499  noonghunnafinalarabic: 0xFB9F,
21500  nooninitialarabic: 0xFEE7,
21501  noonjeeminitialarabic: 0xFCD2,
21502  noonjeemisolatedarabic: 0xFC4B,
21503  noonmedialarabic: 0xFEE8,
21504  noonmeeminitialarabic: 0xFCD5,
21505  noonmeemisolatedarabic: 0xFC4E,
21506  noonnoonfinalarabic: 0xFC8D,
21507  notcontains: 0x220C,
21508  notelement: 0x2209,
21509  notelementof: 0x2209,
21510  notequal: 0x2260,
21511  notgreater: 0x226F,
21512  notgreaternorequal: 0x2271,
21513  notgreaternorless: 0x2279,
21514  notidentical: 0x2262,
21515  notless: 0x226E,
21516  notlessnorequal: 0x2270,
21517  notparallel: 0x2226,
21518  notprecedes: 0x2280,
21519  notsubset: 0x2284,
21520  notsucceeds: 0x2281,
21521  notsuperset: 0x2285,
21522  nowarmenian: 0x0576,
21523  nparen: 0x24A9,
21524  nssquare: 0x33B1,
21525  nsuperior: 0x207F,
21526  ntilde: 0x00F1,
21527  nu: 0x03BD,
21528  nuhiragana: 0x306C,
21529  nukatakana: 0x30CC,
21530  nukatakanahalfwidth: 0xFF87,
21531  nuktabengali: 0x09BC,
21532  nuktadeva: 0x093C,
21533  nuktagujarati: 0x0ABC,
21534  nuktagurmukhi: 0x0A3C,
21535  numbersign: 0x0023,
21536  numbersignmonospace: 0xFF03,
21537  numbersignsmall: 0xFE5F,
21538  numeralsigngreek: 0x0374,
21539  numeralsignlowergreek: 0x0375,
21540  numero: 0x2116,
21541  nun: 0x05E0,
21542  nundagesh: 0xFB40,
21543  nundageshhebrew: 0xFB40,
21544  nunhebrew: 0x05E0,
21545  nvsquare: 0x33B5,
21546  nwsquare: 0x33BB,
21547  nyabengali: 0x099E,
21548  nyadeva: 0x091E,
21549  nyagujarati: 0x0A9E,
21550  nyagurmukhi: 0x0A1E,
21551  o: 0x006F,
21552  oacute: 0x00F3,
21553  oangthai: 0x0E2D,
21554  obarred: 0x0275,
21555  obarredcyrillic: 0x04E9,
21556  obarreddieresiscyrillic: 0x04EB,
21557  obengali: 0x0993,
21558  obopomofo: 0x311B,
21559  obreve: 0x014F,
21560  ocandradeva: 0x0911,
21561  ocandragujarati: 0x0A91,
21562  ocandravowelsigndeva: 0x0949,
21563  ocandravowelsigngujarati: 0x0AC9,
21564  ocaron: 0x01D2,
21565  ocircle: 0x24DE,
21566  ocircumflex: 0x00F4,
21567  ocircumflexacute: 0x1ED1,
21568  ocircumflexdotbelow: 0x1ED9,
21569  ocircumflexgrave: 0x1ED3,
21570  ocircumflexhookabove: 0x1ED5,
21571  ocircumflextilde: 0x1ED7,
21572  ocyrillic: 0x043E,
21573  odblacute: 0x0151,
21574  odblgrave: 0x020D,
21575  odeva: 0x0913,
21576  odieresis: 0x00F6,
21577  odieresiscyrillic: 0x04E7,
21578  odotbelow: 0x1ECD,
21579  oe: 0x0153,
21580  oekorean: 0x315A,
21581  ogonek: 0x02DB,
21582  ogonekcmb: 0x0328,
21583  ograve: 0x00F2,
21584  ogujarati: 0x0A93,
21585  oharmenian: 0x0585,
21586  ohiragana: 0x304A,
21587  ohookabove: 0x1ECF,
21588  ohorn: 0x01A1,
21589  ohornacute: 0x1EDB,
21590  ohorndotbelow: 0x1EE3,
21591  ohorngrave: 0x1EDD,
21592  ohornhookabove: 0x1EDF,
21593  ohorntilde: 0x1EE1,
21594  ohungarumlaut: 0x0151,
21595  oi: 0x01A3,
21596  oinvertedbreve: 0x020F,
21597  okatakana: 0x30AA,
21598  okatakanahalfwidth: 0xFF75,
21599  okorean: 0x3157,
21600  olehebrew: 0x05AB,
21601  omacron: 0x014D,
21602  omacronacute: 0x1E53,
21603  omacrongrave: 0x1E51,
21604  omdeva: 0x0950,
21605  omega: 0x03C9,
21606  omega1: 0x03D6,
21607  omegacyrillic: 0x0461,
21608  omegalatinclosed: 0x0277,
21609  omegaroundcyrillic: 0x047B,
21610  omegatitlocyrillic: 0x047D,
21611  omegatonos: 0x03CE,
21612  omgujarati: 0x0AD0,
21613  omicron: 0x03BF,
21614  omicrontonos: 0x03CC,
21615  omonospace: 0xFF4F,
21616  one: 0x0031,
21617  onearabic: 0x0661,
21618  onebengali: 0x09E7,
21619  onecircle: 0x2460,
21620  onecircleinversesansserif: 0x278A,
21621  onedeva: 0x0967,
21622  onedotenleader: 0x2024,
21623  oneeighth: 0x215B,
21624  onefitted: 0xF6DC,
21625  onegujarati: 0x0AE7,
21626  onegurmukhi: 0x0A67,
21627  onehackarabic: 0x0661,
21628  onehalf: 0x00BD,
21629  onehangzhou: 0x3021,
21630  oneideographicparen: 0x3220,
21631  oneinferior: 0x2081,
21632  onemonospace: 0xFF11,
21633  onenumeratorbengali: 0x09F4,
21634  oneoldstyle: 0xF731,
21635  oneparen: 0x2474,
21636  oneperiod: 0x2488,
21637  onepersian: 0x06F1,
21638  onequarter: 0x00BC,
21639  oneroman: 0x2170,
21640  onesuperior: 0x00B9,
21641  onethai: 0x0E51,
21642  onethird: 0x2153,
21643  oogonek: 0x01EB,
21644  oogonekmacron: 0x01ED,
21645  oogurmukhi: 0x0A13,
21646  oomatragurmukhi: 0x0A4B,
21647  oopen: 0x0254,
21648  oparen: 0x24AA,
21649  openbullet: 0x25E6,
21650  option: 0x2325,
21651  ordfeminine: 0x00AA,
21652  ordmasculine: 0x00BA,
21653  orthogonal: 0x221F,
21654  oshortdeva: 0x0912,
21655  oshortvowelsigndeva: 0x094A,
21656  oslash: 0x00F8,
21657  oslashacute: 0x01FF,
21658  osmallhiragana: 0x3049,
21659  osmallkatakana: 0x30A9,
21660  osmallkatakanahalfwidth: 0xFF6B,
21661  ostrokeacute: 0x01FF,
21662  osuperior: 0xF6F0,
21663  otcyrillic: 0x047F,
21664  otilde: 0x00F5,
21665  otildeacute: 0x1E4D,
21666  otildedieresis: 0x1E4F,
21667  oubopomofo: 0x3121,
21668  overline: 0x203E,
21669  overlinecenterline: 0xFE4A,
21670  overlinecmb: 0x0305,
21671  overlinedashed: 0xFE49,
21672  overlinedblwavy: 0xFE4C,
21673  overlinewavy: 0xFE4B,
21674  overscore: 0x00AF,
21675  ovowelsignbengali: 0x09CB,
21676  ovowelsigndeva: 0x094B,
21677  ovowelsigngujarati: 0x0ACB,
21678  p: 0x0070,
21679  paampssquare: 0x3380,
21680  paasentosquare: 0x332B,
21681  pabengali: 0x09AA,
21682  pacute: 0x1E55,
21683  padeva: 0x092A,
21684  pagedown: 0x21DF,
21685  pageup: 0x21DE,
21686  pagujarati: 0x0AAA,
21687  pagurmukhi: 0x0A2A,
21688  pahiragana: 0x3071,
21689  paiyannoithai: 0x0E2F,
21690  pakatakana: 0x30D1,
21691  palatalizationcyrilliccmb: 0x0484,
21692  palochkacyrillic: 0x04C0,
21693  pansioskorean: 0x317F,
21694  paragraph: 0x00B6,
21695  parallel: 0x2225,
21696  parenleft: 0x0028,
21697  parenleftaltonearabic: 0xFD3E,
21698  parenleftbt: 0xF8ED,
21699  parenleftex: 0xF8EC,
21700  parenleftinferior: 0x208D,
21701  parenleftmonospace: 0xFF08,
21702  parenleftsmall: 0xFE59,
21703  parenleftsuperior: 0x207D,
21704  parenlefttp: 0xF8EB,
21705  parenleftvertical: 0xFE35,
21706  parenright: 0x0029,
21707  parenrightaltonearabic: 0xFD3F,
21708  parenrightbt: 0xF8F8,
21709  parenrightex: 0xF8F7,
21710  parenrightinferior: 0x208E,
21711  parenrightmonospace: 0xFF09,
21712  parenrightsmall: 0xFE5A,
21713  parenrightsuperior: 0x207E,
21714  parenrighttp: 0xF8F6,
21715  parenrightvertical: 0xFE36,
21716  partialdiff: 0x2202,
21717  paseqhebrew: 0x05C0,
21718  pashtahebrew: 0x0599,
21719  pasquare: 0x33A9,
21720  patah: 0x05B7,
21721  patah11: 0x05B7,
21722  patah1d: 0x05B7,
21723  patah2a: 0x05B7,
21724  patahhebrew: 0x05B7,
21725  patahnarrowhebrew: 0x05B7,
21726  patahquarterhebrew: 0x05B7,
21727  patahwidehebrew: 0x05B7,
21728  pazerhebrew: 0x05A1,
21729  pbopomofo: 0x3106,
21730  pcircle: 0x24DF,
21731  pdotaccent: 0x1E57,
21732  pe: 0x05E4,
21733  pecyrillic: 0x043F,
21734  pedagesh: 0xFB44,
21735  pedageshhebrew: 0xFB44,
21736  peezisquare: 0x333B,
21737  pefinaldageshhebrew: 0xFB43,
21738  peharabic: 0x067E,
21739  peharmenian: 0x057A,
21740  pehebrew: 0x05E4,
21741  pehfinalarabic: 0xFB57,
21742  pehinitialarabic: 0xFB58,
21743  pehiragana: 0x307A,
21744  pehmedialarabic: 0xFB59,
21745  pekatakana: 0x30DA,
21746  pemiddlehookcyrillic: 0x04A7,
21747  perafehebrew: 0xFB4E,
21748  percent: 0x0025,
21749  percentarabic: 0x066A,
21750  percentmonospace: 0xFF05,
21751  percentsmall: 0xFE6A,
21752  period: 0x002E,
21753  periodarmenian: 0x0589,
21754  periodcentered: 0x00B7,
21755  periodhalfwidth: 0xFF61,
21756  periodinferior: 0xF6E7,
21757  periodmonospace: 0xFF0E,
21758  periodsmall: 0xFE52,
21759  periodsuperior: 0xF6E8,
21760  perispomenigreekcmb: 0x0342,
21761  perpendicular: 0x22A5,
21762  perthousand: 0x2030,
21763  peseta: 0x20A7,
21764  pfsquare: 0x338A,
21765  phabengali: 0x09AB,
21766  phadeva: 0x092B,
21767  phagujarati: 0x0AAB,
21768  phagurmukhi: 0x0A2B,
21769  phi: 0x03C6,
21770  phi1: 0x03D5,
21771  phieuphacirclekorean: 0x327A,
21772  phieuphaparenkorean: 0x321A,
21773  phieuphcirclekorean: 0x326C,
21774  phieuphkorean: 0x314D,
21775  phieuphparenkorean: 0x320C,
21776  philatin: 0x0278,
21777  phinthuthai: 0x0E3A,
21778  phisymbolgreek: 0x03D5,
21779  phook: 0x01A5,
21780  phophanthai: 0x0E1E,
21781  phophungthai: 0x0E1C,
21782  phosamphaothai: 0x0E20,
21783  pi: 0x03C0,
21784  pieupacirclekorean: 0x3273,
21785  pieupaparenkorean: 0x3213,
21786  pieupcieuckorean: 0x3176,
21787  pieupcirclekorean: 0x3265,
21788  pieupkiyeokkorean: 0x3172,
21789  pieupkorean: 0x3142,
21790  pieupparenkorean: 0x3205,
21791  pieupsioskiyeokkorean: 0x3174,
21792  pieupsioskorean: 0x3144,
21793  pieupsiostikeutkorean: 0x3175,
21794  pieupthieuthkorean: 0x3177,
21795  pieuptikeutkorean: 0x3173,
21796  pihiragana: 0x3074,
21797  pikatakana: 0x30D4,
21798  pisymbolgreek: 0x03D6,
21799  piwrarmenian: 0x0583,
21800  plus: 0x002B,
21801  plusbelowcmb: 0x031F,
21802  pluscircle: 0x2295,
21803  plusminus: 0x00B1,
21804  plusmod: 0x02D6,
21805  plusmonospace: 0xFF0B,
21806  plussmall: 0xFE62,
21807  plussuperior: 0x207A,
21808  pmonospace: 0xFF50,
21809  pmsquare: 0x33D8,
21810  pohiragana: 0x307D,
21811  pointingindexdownwhite: 0x261F,
21812  pointingindexleftwhite: 0x261C,
21813  pointingindexrightwhite: 0x261E,
21814  pointingindexupwhite: 0x261D,
21815  pokatakana: 0x30DD,
21816  poplathai: 0x0E1B,
21817  postalmark: 0x3012,
21818  postalmarkface: 0x3020,
21819  pparen: 0x24AB,
21820  precedes: 0x227A,
21821  prescription: 0x211E,
21822  primemod: 0x02B9,
21823  primereversed: 0x2035,
21824  product: 0x220F,
21825  projective: 0x2305,
21826  prolongedkana: 0x30FC,
21827  propellor: 0x2318,
21828  propersubset: 0x2282,
21829  propersuperset: 0x2283,
21830  proportion: 0x2237,
21831  proportional: 0x221D,
21832  psi: 0x03C8,
21833  psicyrillic: 0x0471,
21834  psilipneumatacyrilliccmb: 0x0486,
21835  pssquare: 0x33B0,
21836  puhiragana: 0x3077,
21837  pukatakana: 0x30D7,
21838  pvsquare: 0x33B4,
21839  pwsquare: 0x33BA,
21840  q: 0x0071,
21841  qadeva: 0x0958,
21842  qadmahebrew: 0x05A8,
21843  qafarabic: 0x0642,
21844  qaffinalarabic: 0xFED6,
21845  qafinitialarabic: 0xFED7,
21846  qafmedialarabic: 0xFED8,
21847  qamats: 0x05B8,
21848  qamats10: 0x05B8,
21849  qamats1a: 0x05B8,
21850  qamats1c: 0x05B8,
21851  qamats27: 0x05B8,
21852  qamats29: 0x05B8,
21853  qamats33: 0x05B8,
21854  qamatsde: 0x05B8,
21855  qamatshebrew: 0x05B8,
21856  qamatsnarrowhebrew: 0x05B8,
21857  qamatsqatanhebrew: 0x05B8,
21858  qamatsqatannarrowhebrew: 0x05B8,
21859  qamatsqatanquarterhebrew: 0x05B8,
21860  qamatsqatanwidehebrew: 0x05B8,
21861  qamatsquarterhebrew: 0x05B8,
21862  qamatswidehebrew: 0x05B8,
21863  qarneyparahebrew: 0x059F,
21864  qbopomofo: 0x3111,
21865  qcircle: 0x24E0,
21866  qhook: 0x02A0,
21867  qmonospace: 0xFF51,
21868  qof: 0x05E7,
21869  qofdagesh: 0xFB47,
21870  qofdageshhebrew: 0xFB47,
21871  qofhebrew: 0x05E7,
21872  qparen: 0x24AC,
21873  quarternote: 0x2669,
21874  qubuts: 0x05BB,
21875  qubuts18: 0x05BB,
21876  qubuts25: 0x05BB,
21877  qubuts31: 0x05BB,
21878  qubutshebrew: 0x05BB,
21879  qubutsnarrowhebrew: 0x05BB,
21880  qubutsquarterhebrew: 0x05BB,
21881  qubutswidehebrew: 0x05BB,
21882  question: 0x003F,
21883  questionarabic: 0x061F,
21884  questionarmenian: 0x055E,
21885  questiondown: 0x00BF,
21886  questiondownsmall: 0xF7BF,
21887  questiongreek: 0x037E,
21888  questionmonospace: 0xFF1F,
21889  questionsmall: 0xF73F,
21890  quotedbl: 0x0022,
21891  quotedblbase: 0x201E,
21892  quotedblleft: 0x201C,
21893  quotedblmonospace: 0xFF02,
21894  quotedblprime: 0x301E,
21895  quotedblprimereversed: 0x301D,
21896  quotedblright: 0x201D,
21897  quoteleft: 0x2018,
21898  quoteleftreversed: 0x201B,
21899  quotereversed: 0x201B,
21900  quoteright: 0x2019,
21901  quoterightn: 0x0149,
21902  quotesinglbase: 0x201A,
21903  quotesingle: 0x0027,
21904  quotesinglemonospace: 0xFF07,
21905  r: 0x0072,
21906  raarmenian: 0x057C,
21907  rabengali: 0x09B0,
21908  racute: 0x0155,
21909  radeva: 0x0930,
21910  radical: 0x221A,
21911  radicalex: 0xF8E5,
21912  radoverssquare: 0x33AE,
21913  radoverssquaredsquare: 0x33AF,
21914  radsquare: 0x33AD,
21915  rafe: 0x05BF,
21916  rafehebrew: 0x05BF,
21917  ragujarati: 0x0AB0,
21918  ragurmukhi: 0x0A30,
21919  rahiragana: 0x3089,
21920  rakatakana: 0x30E9,
21921  rakatakanahalfwidth: 0xFF97,
21922  ralowerdiagonalbengali: 0x09F1,
21923  ramiddlediagonalbengali: 0x09F0,
21924  ramshorn: 0x0264,
21925  ratio: 0x2236,
21926  rbopomofo: 0x3116,
21927  rcaron: 0x0159,
21928  rcedilla: 0x0157,
21929  rcircle: 0x24E1,
21930  rcommaaccent: 0x0157,
21931  rdblgrave: 0x0211,
21932  rdotaccent: 0x1E59,
21933  rdotbelow: 0x1E5B,
21934  rdotbelowmacron: 0x1E5D,
21935  referencemark: 0x203B,
21936  reflexsubset: 0x2286,
21937  reflexsuperset: 0x2287,
21938  registered: 0x00AE,
21939  registersans: 0xF8E8,
21940  registerserif: 0xF6DA,
21941  reharabic: 0x0631,
21942  reharmenian: 0x0580,
21943  rehfinalarabic: 0xFEAE,
21944  rehiragana: 0x308C,
21945  rekatakana: 0x30EC,
21946  rekatakanahalfwidth: 0xFF9A,
21947  resh: 0x05E8,
21948  reshdageshhebrew: 0xFB48,
21949  reshhebrew: 0x05E8,
21950  reversedtilde: 0x223D,
21951  reviahebrew: 0x0597,
21952  reviamugrashhebrew: 0x0597,
21953  revlogicalnot: 0x2310,
21954  rfishhook: 0x027E,
21955  rfishhookreversed: 0x027F,
21956  rhabengali: 0x09DD,
21957  rhadeva: 0x095D,
21958  rho: 0x03C1,
21959  rhook: 0x027D,
21960  rhookturned: 0x027B,
21961  rhookturnedsuperior: 0x02B5,
21962  rhosymbolgreek: 0x03F1,
21963  rhotichookmod: 0x02DE,
21964  rieulacirclekorean: 0x3271,
21965  rieulaparenkorean: 0x3211,
21966  rieulcirclekorean: 0x3263,
21967  rieulhieuhkorean: 0x3140,
21968  rieulkiyeokkorean: 0x313A,
21969  rieulkiyeoksioskorean: 0x3169,
21970  rieulkorean: 0x3139,
21971  rieulmieumkorean: 0x313B,
21972  rieulpansioskorean: 0x316C,
21973  rieulparenkorean: 0x3203,
21974  rieulphieuphkorean: 0x313F,
21975  rieulpieupkorean: 0x313C,
21976  rieulpieupsioskorean: 0x316B,
21977  rieulsioskorean: 0x313D,
21978  rieulthieuthkorean: 0x313E,
21979  rieultikeutkorean: 0x316A,
21980  rieulyeorinhieuhkorean: 0x316D,
21981  rightangle: 0x221F,
21982  righttackbelowcmb: 0x0319,
21983  righttriangle: 0x22BF,
21984  rihiragana: 0x308A,
21985  rikatakana: 0x30EA,
21986  rikatakanahalfwidth: 0xFF98,
21987  ring: 0x02DA,
21988  ringbelowcmb: 0x0325,
21989  ringcmb: 0x030A,
21990  ringhalfleft: 0x02BF,
21991  ringhalfleftarmenian: 0x0559,
21992  ringhalfleftbelowcmb: 0x031C,
21993  ringhalfleftcentered: 0x02D3,
21994  ringhalfright: 0x02BE,
21995  ringhalfrightbelowcmb: 0x0339,
21996  ringhalfrightcentered: 0x02D2,
21997  rinvertedbreve: 0x0213,
21998  rittorusquare: 0x3351,
21999  rlinebelow: 0x1E5F,
22000  rlongleg: 0x027C,
22001  rlonglegturned: 0x027A,
22002  rmonospace: 0xFF52,
22003  rohiragana: 0x308D,
22004  rokatakana: 0x30ED,
22005  rokatakanahalfwidth: 0xFF9B,
22006  roruathai: 0x0E23,
22007  rparen: 0x24AD,
22008  rrabengali: 0x09DC,
22009  rradeva: 0x0931,
22010  rragurmukhi: 0x0A5C,
22011  rreharabic: 0x0691,
22012  rrehfinalarabic: 0xFB8D,
22013  rrvocalicbengali: 0x09E0,
22014  rrvocalicdeva: 0x0960,
22015  rrvocalicgujarati: 0x0AE0,
22016  rrvocalicvowelsignbengali: 0x09C4,
22017  rrvocalicvowelsigndeva: 0x0944,
22018  rrvocalicvowelsigngujarati: 0x0AC4,
22019  rsuperior: 0xF6F1,
22020  rtblock: 0x2590,
22021  rturned: 0x0279,
22022  rturnedsuperior: 0x02B4,
22023  ruhiragana: 0x308B,
22024  rukatakana: 0x30EB,
22025  rukatakanahalfwidth: 0xFF99,
22026  rupeemarkbengali: 0x09F2,
22027  rupeesignbengali: 0x09F3,
22028  rupiah: 0xF6DD,
22029  ruthai: 0x0E24,
22030  rvocalicbengali: 0x098B,
22031  rvocalicdeva: 0x090B,
22032  rvocalicgujarati: 0x0A8B,
22033  rvocalicvowelsignbengali: 0x09C3,
22034  rvocalicvowelsigndeva: 0x0943,
22035  rvocalicvowelsigngujarati: 0x0AC3,
22036  s: 0x0073,
22037  sabengali: 0x09B8,
22038  sacute: 0x015B,
22039  sacutedotaccent: 0x1E65,
22040  sadarabic: 0x0635,
22041  sadeva: 0x0938,
22042  sadfinalarabic: 0xFEBA,
22043  sadinitialarabic: 0xFEBB,
22044  sadmedialarabic: 0xFEBC,
22045  sagujarati: 0x0AB8,
22046  sagurmukhi: 0x0A38,
22047  sahiragana: 0x3055,
22048  sakatakana: 0x30B5,
22049  sakatakanahalfwidth: 0xFF7B,
22050  sallallahoualayhewasallamarabic: 0xFDFA,
22051  samekh: 0x05E1,
22052  samekhdagesh: 0xFB41,
22053  samekhdageshhebrew: 0xFB41,
22054  samekhhebrew: 0x05E1,
22055  saraaathai: 0x0E32,
22056  saraaethai: 0x0E41,
22057  saraaimaimalaithai: 0x0E44,
22058  saraaimaimuanthai: 0x0E43,
22059  saraamthai: 0x0E33,
22060  saraathai: 0x0E30,
22061  saraethai: 0x0E40,
22062  saraiileftthai: 0xF886,
22063  saraiithai: 0x0E35,
22064  saraileftthai: 0xF885,
22065  saraithai: 0x0E34,
22066  saraothai: 0x0E42,
22067  saraueeleftthai: 0xF888,
22068  saraueethai: 0x0E37,
22069  saraueleftthai: 0xF887,
22070  sarauethai: 0x0E36,
22071  sarauthai: 0x0E38,
22072  sarauuthai: 0x0E39,
22073  sbopomofo: 0x3119,
22074  scaron: 0x0161,
22075  scarondotaccent: 0x1E67,
22076  scedilla: 0x015F,
22077  schwa: 0x0259,
22078  schwacyrillic: 0x04D9,
22079  schwadieresiscyrillic: 0x04DB,
22080  schwahook: 0x025A,
22081  scircle: 0x24E2,
22082  scircumflex: 0x015D,
22083  scommaaccent: 0x0219,
22084  sdotaccent: 0x1E61,
22085  sdotbelow: 0x1E63,
22086  sdotbelowdotaccent: 0x1E69,
22087  seagullbelowcmb: 0x033C,
22088  second: 0x2033,
22089  secondtonechinese: 0x02CA,
22090  section: 0x00A7,
22091  seenarabic: 0x0633,
22092  seenfinalarabic: 0xFEB2,
22093  seeninitialarabic: 0xFEB3,
22094  seenmedialarabic: 0xFEB4,
22095  segol: 0x05B6,
22096  segol13: 0x05B6,
22097  segol1f: 0x05B6,
22098  segol2c: 0x05B6,
22099  segolhebrew: 0x05B6,
22100  segolnarrowhebrew: 0x05B6,
22101  segolquarterhebrew: 0x05B6,
22102  segoltahebrew: 0x0592,
22103  segolwidehebrew: 0x05B6,
22104  seharmenian: 0x057D,
22105  sehiragana: 0x305B,
22106  sekatakana: 0x30BB,
22107  sekatakanahalfwidth: 0xFF7E,
22108  semicolon: 0x003B,
22109  semicolonarabic: 0x061B,
22110  semicolonmonospace: 0xFF1B,
22111  semicolonsmall: 0xFE54,
22112  semivoicedmarkkana: 0x309C,
22113  semivoicedmarkkanahalfwidth: 0xFF9F,
22114  sentisquare: 0x3322,
22115  sentosquare: 0x3323,
22116  seven: 0x0037,
22117  sevenarabic: 0x0667,
22118  sevenbengali: 0x09ED,
22119  sevencircle: 0x2466,
22120  sevencircleinversesansserif: 0x2790,
22121  sevendeva: 0x096D,
22122  seveneighths: 0x215E,
22123  sevengujarati: 0x0AED,
22124  sevengurmukhi: 0x0A6D,
22125  sevenhackarabic: 0x0667,
22126  sevenhangzhou: 0x3027,
22127  sevenideographicparen: 0x3226,
22128  seveninferior: 0x2087,
22129  sevenmonospace: 0xFF17,
22130  sevenoldstyle: 0xF737,
22131  sevenparen: 0x247A,
22132  sevenperiod: 0x248E,
22133  sevenpersian: 0x06F7,
22134  sevenroman: 0x2176,
22135  sevensuperior: 0x2077,
22136  seventeencircle: 0x2470,
22137  seventeenparen: 0x2484,
22138  seventeenperiod: 0x2498,
22139  seventhai: 0x0E57,
22140  sfthyphen: 0x00AD,
22141  shaarmenian: 0x0577,
22142  shabengali: 0x09B6,
22143  shacyrillic: 0x0448,
22144  shaddaarabic: 0x0651,
22145  shaddadammaarabic: 0xFC61,
22146  shaddadammatanarabic: 0xFC5E,
22147  shaddafathaarabic: 0xFC60,
22148  shaddakasraarabic: 0xFC62,
22149  shaddakasratanarabic: 0xFC5F,
22150  shade: 0x2592,
22151  shadedark: 0x2593,
22152  shadelight: 0x2591,
22153  shademedium: 0x2592,
22154  shadeva: 0x0936,
22155  shagujarati: 0x0AB6,
22156  shagurmukhi: 0x0A36,
22157  shalshelethebrew: 0x0593,
22158  shbopomofo: 0x3115,
22159  shchacyrillic: 0x0449,
22160  sheenarabic: 0x0634,
22161  sheenfinalarabic: 0xFEB6,
22162  sheeninitialarabic: 0xFEB7,
22163  sheenmedialarabic: 0xFEB8,
22164  sheicoptic: 0x03E3,
22165  sheqel: 0x20AA,
22166  sheqelhebrew: 0x20AA,
22167  sheva: 0x05B0,
22168  sheva115: 0x05B0,
22169  sheva15: 0x05B0,
22170  sheva22: 0x05B0,
22171  sheva2e: 0x05B0,
22172  shevahebrew: 0x05B0,
22173  shevanarrowhebrew: 0x05B0,
22174  shevaquarterhebrew: 0x05B0,
22175  shevawidehebrew: 0x05B0,
22176  shhacyrillic: 0x04BB,
22177  shimacoptic: 0x03ED,
22178  shin: 0x05E9,
22179  shindagesh: 0xFB49,
22180  shindageshhebrew: 0xFB49,
22181  shindageshshindot: 0xFB2C,
22182  shindageshshindothebrew: 0xFB2C,
22183  shindageshsindot: 0xFB2D,
22184  shindageshsindothebrew: 0xFB2D,
22185  shindothebrew: 0x05C1,
22186  shinhebrew: 0x05E9,
22187  shinshindot: 0xFB2A,
22188  shinshindothebrew: 0xFB2A,
22189  shinsindot: 0xFB2B,
22190  shinsindothebrew: 0xFB2B,
22191  shook: 0x0282,
22192  sigma: 0x03C3,
22193  sigma1: 0x03C2,
22194  sigmafinal: 0x03C2,
22195  sigmalunatesymbolgreek: 0x03F2,
22196  sihiragana: 0x3057,
22197  sikatakana: 0x30B7,
22198  sikatakanahalfwidth: 0xFF7C,
22199  siluqhebrew: 0x05BD,
22200  siluqlefthebrew: 0x05BD,
22201  similar: 0x223C,
22202  sindothebrew: 0x05C2,
22203  siosacirclekorean: 0x3274,
22204  siosaparenkorean: 0x3214,
22205  sioscieuckorean: 0x317E,
22206  sioscirclekorean: 0x3266,
22207  sioskiyeokkorean: 0x317A,
22208  sioskorean: 0x3145,
22209  siosnieunkorean: 0x317B,
22210  siosparenkorean: 0x3206,
22211  siospieupkorean: 0x317D,
22212  siostikeutkorean: 0x317C,
22213  six: 0x0036,
22214  sixarabic: 0x0666,
22215  sixbengali: 0x09EC,
22216  sixcircle: 0x2465,
22217  sixcircleinversesansserif: 0x278F,
22218  sixdeva: 0x096C,
22219  sixgujarati: 0x0AEC,
22220  sixgurmukhi: 0x0A6C,
22221  sixhackarabic: 0x0666,
22222  sixhangzhou: 0x3026,
22223  sixideographicparen: 0x3225,
22224  sixinferior: 0x2086,
22225  sixmonospace: 0xFF16,
22226  sixoldstyle: 0xF736,
22227  sixparen: 0x2479,
22228  sixperiod: 0x248D,
22229  sixpersian: 0x06F6,
22230  sixroman: 0x2175,
22231  sixsuperior: 0x2076,
22232  sixteencircle: 0x246F,
22233  sixteencurrencydenominatorbengali: 0x09F9,
22234  sixteenparen: 0x2483,
22235  sixteenperiod: 0x2497,
22236  sixthai: 0x0E56,
22237  slash: 0x002F,
22238  slashmonospace: 0xFF0F,
22239  slong: 0x017F,
22240  slongdotaccent: 0x1E9B,
22241  smileface: 0x263A,
22242  smonospace: 0xFF53,
22243  sofpasuqhebrew: 0x05C3,
22244  softhyphen: 0x00AD,
22245  softsigncyrillic: 0x044C,
22246  sohiragana: 0x305D,
22247  sokatakana: 0x30BD,
22248  sokatakanahalfwidth: 0xFF7F,
22249  soliduslongoverlaycmb: 0x0338,
22250  solidusshortoverlaycmb: 0x0337,
22251  sorusithai: 0x0E29,
22252  sosalathai: 0x0E28,
22253  sosothai: 0x0E0B,
22254  sosuathai: 0x0E2A,
22255  space: 0x0020,
22256  spacehackarabic: 0x0020,
22257  spade: 0x2660,
22258  spadesuitblack: 0x2660,
22259  spadesuitwhite: 0x2664,
22260  sparen: 0x24AE,
22261  squarebelowcmb: 0x033B,
22262  squarecc: 0x33C4,
22263  squarecm: 0x339D,
22264  squarediagonalcrosshatchfill: 0x25A9,
22265  squarehorizontalfill: 0x25A4,
22266  squarekg: 0x338F,
22267  squarekm: 0x339E,
22268  squarekmcapital: 0x33CE,
22269  squareln: 0x33D1,
22270  squarelog: 0x33D2,
22271  squaremg: 0x338E,
22272  squaremil: 0x33D5,
22273  squaremm: 0x339C,
22274  squaremsquared: 0x33A1,
22275  squareorthogonalcrosshatchfill: 0x25A6,
22276  squareupperlefttolowerrightfill: 0x25A7,
22277  squareupperrighttolowerleftfill: 0x25A8,
22278  squareverticalfill: 0x25A5,
22279  squarewhitewithsmallblack: 0x25A3,
22280  srsquare: 0x33DB,
22281  ssabengali: 0x09B7,
22282  ssadeva: 0x0937,
22283  ssagujarati: 0x0AB7,
22284  ssangcieuckorean: 0x3149,
22285  ssanghieuhkorean: 0x3185,
22286  ssangieungkorean: 0x3180,
22287  ssangkiyeokkorean: 0x3132,
22288  ssangnieunkorean: 0x3165,
22289  ssangpieupkorean: 0x3143,
22290  ssangsioskorean: 0x3146,
22291  ssangtikeutkorean: 0x3138,
22292  ssuperior: 0xF6F2,
22293  sterling: 0x00A3,
22294  sterlingmonospace: 0xFFE1,
22295  strokelongoverlaycmb: 0x0336,
22296  strokeshortoverlaycmb: 0x0335,
22297  subset: 0x2282,
22298  subsetnotequal: 0x228A,
22299  subsetorequal: 0x2286,
22300  succeeds: 0x227B,
22301  suchthat: 0x220B,
22302  suhiragana: 0x3059,
22303  sukatakana: 0x30B9,
22304  sukatakanahalfwidth: 0xFF7D,
22305  sukunarabic: 0x0652,
22306  summation: 0x2211,
22307  sun: 0x263C,
22308  superset: 0x2283,
22309  supersetnotequal: 0x228B,
22310  supersetorequal: 0x2287,
22311  svsquare: 0x33DC,
22312  syouwaerasquare: 0x337C,
22313  t: 0x0074,
22314  tabengali: 0x09A4,
22315  tackdown: 0x22A4,
22316  tackleft: 0x22A3,
22317  tadeva: 0x0924,
22318  tagujarati: 0x0AA4,
22319  tagurmukhi: 0x0A24,
22320  taharabic: 0x0637,
22321  tahfinalarabic: 0xFEC2,
22322  tahinitialarabic: 0xFEC3,
22323  tahiragana: 0x305F,
22324  tahmedialarabic: 0xFEC4,
22325  taisyouerasquare: 0x337D,
22326  takatakana: 0x30BF,
22327  takatakanahalfwidth: 0xFF80,
22328  tatweelarabic: 0x0640,
22329  tau: 0x03C4,
22330  tav: 0x05EA,
22331  tavdages: 0xFB4A,
22332  tavdagesh: 0xFB4A,
22333  tavdageshhebrew: 0xFB4A,
22334  tavhebrew: 0x05EA,
22335  tbar: 0x0167,
22336  tbopomofo: 0x310A,
22337  tcaron: 0x0165,
22338  tccurl: 0x02A8,
22339  tcedilla: 0x0163,
22340  tcheharabic: 0x0686,
22341  tchehfinalarabic: 0xFB7B,
22342  tchehinitialarabic: 0xFB7C,
22343  tchehmedialarabic: 0xFB7D,
22344  tcircle: 0x24E3,
22345  tcircumflexbelow: 0x1E71,
22346  tcommaaccent: 0x0163,
22347  tdieresis: 0x1E97,
22348  tdotaccent: 0x1E6B,
22349  tdotbelow: 0x1E6D,
22350  tecyrillic: 0x0442,
22351  tedescendercyrillic: 0x04AD,
22352  teharabic: 0x062A,
22353  tehfinalarabic: 0xFE96,
22354  tehhahinitialarabic: 0xFCA2,
22355  tehhahisolatedarabic: 0xFC0C,
22356  tehinitialarabic: 0xFE97,
22357  tehiragana: 0x3066,
22358  tehjeeminitialarabic: 0xFCA1,
22359  tehjeemisolatedarabic: 0xFC0B,
22360  tehmarbutaarabic: 0x0629,
22361  tehmarbutafinalarabic: 0xFE94,
22362  tehmedialarabic: 0xFE98,
22363  tehmeeminitialarabic: 0xFCA4,
22364  tehmeemisolatedarabic: 0xFC0E,
22365  tehnoonfinalarabic: 0xFC73,
22366  tekatakana: 0x30C6,
22367  tekatakanahalfwidth: 0xFF83,
22368  telephone: 0x2121,
22369  telephoneblack: 0x260E,
22370  telishagedolahebrew: 0x05A0,
22371  telishaqetanahebrew: 0x05A9,
22372  tencircle: 0x2469,
22373  tenideographicparen: 0x3229,
22374  tenparen: 0x247D,
22375  tenperiod: 0x2491,
22376  tenroman: 0x2179,
22377  tesh: 0x02A7,
22378  tet: 0x05D8,
22379  tetdagesh: 0xFB38,
22380  tetdageshhebrew: 0xFB38,
22381  tethebrew: 0x05D8,
22382  tetsecyrillic: 0x04B5,
22383  tevirhebrew: 0x059B,
22384  tevirlefthebrew: 0x059B,
22385  thabengali: 0x09A5,
22386  thadeva: 0x0925,
22387  thagujarati: 0x0AA5,
22388  thagurmukhi: 0x0A25,
22389  thalarabic: 0x0630,
22390  thalfinalarabic: 0xFEAC,
22391  thanthakhatlowleftthai: 0xF898,
22392  thanthakhatlowrightthai: 0xF897,
22393  thanthakhatthai: 0x0E4C,
22394  thanthakhatupperleftthai: 0xF896,
22395  theharabic: 0x062B,
22396  thehfinalarabic: 0xFE9A,
22397  thehinitialarabic: 0xFE9B,
22398  thehmedialarabic: 0xFE9C,
22399  thereexists: 0x2203,
22400  therefore: 0x2234,
22401  theta: 0x03B8,
22402  theta1: 0x03D1,
22403  thetasymbolgreek: 0x03D1,
22404  thieuthacirclekorean: 0x3279,
22405  thieuthaparenkorean: 0x3219,
22406  thieuthcirclekorean: 0x326B,
22407  thieuthkorean: 0x314C,
22408  thieuthparenkorean: 0x320B,
22409  thirteencircle: 0x246C,
22410  thirteenparen: 0x2480,
22411  thirteenperiod: 0x2494,
22412  thonangmonthothai: 0x0E11,
22413  thook: 0x01AD,
22414  thophuthaothai: 0x0E12,
22415  thorn: 0x00FE,
22416  thothahanthai: 0x0E17,
22417  thothanthai: 0x0E10,
22418  thothongthai: 0x0E18,
22419  thothungthai: 0x0E16,
22420  thousandcyrillic: 0x0482,
22421  thousandsseparatorarabic: 0x066C,
22422  thousandsseparatorpersian: 0x066C,
22423  three: 0x0033,
22424  threearabic: 0x0663,
22425  threebengali: 0x09E9,
22426  threecircle: 0x2462,
22427  threecircleinversesansserif: 0x278C,
22428  threedeva: 0x0969,
22429  threeeighths: 0x215C,
22430  threegujarati: 0x0AE9,
22431  threegurmukhi: 0x0A69,
22432  threehackarabic: 0x0663,
22433  threehangzhou: 0x3023,
22434  threeideographicparen: 0x3222,
22435  threeinferior: 0x2083,
22436  threemonospace: 0xFF13,
22437  threenumeratorbengali: 0x09F6,
22438  threeoldstyle: 0xF733,
22439  threeparen: 0x2476,
22440  threeperiod: 0x248A,
22441  threepersian: 0x06F3,
22442  threequarters: 0x00BE,
22443  threequartersemdash: 0xF6DE,
22444  threeroman: 0x2172,
22445  threesuperior: 0x00B3,
22446  threethai: 0x0E53,
22447  thzsquare: 0x3394,
22448  tihiragana: 0x3061,
22449  tikatakana: 0x30C1,
22450  tikatakanahalfwidth: 0xFF81,
22451  tikeutacirclekorean: 0x3270,
22452  tikeutaparenkorean: 0x3210,
22453  tikeutcirclekorean: 0x3262,
22454  tikeutkorean: 0x3137,
22455  tikeutparenkorean: 0x3202,
22456  tilde: 0x02DC,
22457  tildebelowcmb: 0x0330,
22458  tildecmb: 0x0303,
22459  tildecomb: 0x0303,
22460  tildedoublecmb: 0x0360,
22461  tildeoperator: 0x223C,
22462  tildeoverlaycmb: 0x0334,
22463  tildeverticalcmb: 0x033E,
22464  timescircle: 0x2297,
22465  tipehahebrew: 0x0596,
22466  tipehalefthebrew: 0x0596,
22467  tippigurmukhi: 0x0A70,
22468  titlocyrilliccmb: 0x0483,
22469  tiwnarmenian: 0x057F,
22470  tlinebelow: 0x1E6F,
22471  tmonospace: 0xFF54,
22472  toarmenian: 0x0569,
22473  tohiragana: 0x3068,
22474  tokatakana: 0x30C8,
22475  tokatakanahalfwidth: 0xFF84,
22476  tonebarextrahighmod: 0x02E5,
22477  tonebarextralowmod: 0x02E9,
22478  tonebarhighmod: 0x02E6,
22479  tonebarlowmod: 0x02E8,
22480  tonebarmidmod: 0x02E7,
22481  tonefive: 0x01BD,
22482  tonesix: 0x0185,
22483  tonetwo: 0x01A8,
22484  tonos: 0x0384,
22485  tonsquare: 0x3327,
22486  topatakthai: 0x0E0F,
22487  tortoiseshellbracketleft: 0x3014,
22488  tortoiseshellbracketleftsmall: 0xFE5D,
22489  tortoiseshellbracketleftvertical: 0xFE39,
22490  tortoiseshellbracketright: 0x3015,
22491  tortoiseshellbracketrightsmall: 0xFE5E,
22492  tortoiseshellbracketrightvertical: 0xFE3A,
22493  totaothai: 0x0E15,
22494  tpalatalhook: 0x01AB,
22495  tparen: 0x24AF,
22496  trademark: 0x2122,
22497  trademarksans: 0xF8EA,
22498  trademarkserif: 0xF6DB,
22499  tretroflexhook: 0x0288,
22500  triagdn: 0x25BC,
22501  triaglf: 0x25C4,
22502  triagrt: 0x25BA,
22503  triagup: 0x25B2,
22504  ts: 0x02A6,
22505  tsadi: 0x05E6,
22506  tsadidagesh: 0xFB46,
22507  tsadidageshhebrew: 0xFB46,
22508  tsadihebrew: 0x05E6,
22509  tsecyrillic: 0x0446,
22510  tsere: 0x05B5,
22511  tsere12: 0x05B5,
22512  tsere1e: 0x05B5,
22513  tsere2b: 0x05B5,
22514  tserehebrew: 0x05B5,
22515  tserenarrowhebrew: 0x05B5,
22516  tserequarterhebrew: 0x05B5,
22517  tserewidehebrew: 0x05B5,
22518  tshecyrillic: 0x045B,
22519  tsuperior: 0xF6F3,
22520  ttabengali: 0x099F,
22521  ttadeva: 0x091F,
22522  ttagujarati: 0x0A9F,
22523  ttagurmukhi: 0x0A1F,
22524  tteharabic: 0x0679,
22525  ttehfinalarabic: 0xFB67,
22526  ttehinitialarabic: 0xFB68,
22527  ttehmedialarabic: 0xFB69,
22528  tthabengali: 0x09A0,
22529  tthadeva: 0x0920,
22530  tthagujarati: 0x0AA0,
22531  tthagurmukhi: 0x0A20,
22532  tturned: 0x0287,
22533  tuhiragana: 0x3064,
22534  tukatakana: 0x30C4,
22535  tukatakanahalfwidth: 0xFF82,
22536  tusmallhiragana: 0x3063,
22537  tusmallkatakana: 0x30C3,
22538  tusmallkatakanahalfwidth: 0xFF6F,
22539  twelvecircle: 0x246B,
22540  twelveparen: 0x247F,
22541  twelveperiod: 0x2493,
22542  twelveroman: 0x217B,
22543  twentycircle: 0x2473,
22544  twentyhangzhou: 0x5344,
22545  twentyparen: 0x2487,
22546  twentyperiod: 0x249B,
22547  two: 0x0032,
22548  twoarabic: 0x0662,
22549  twobengali: 0x09E8,
22550  twocircle: 0x2461,
22551  twocircleinversesansserif: 0x278B,
22552  twodeva: 0x0968,
22553  twodotenleader: 0x2025,
22554  twodotleader: 0x2025,
22555  twodotleadervertical: 0xFE30,
22556  twogujarati: 0x0AE8,
22557  twogurmukhi: 0x0A68,
22558  twohackarabic: 0x0662,
22559  twohangzhou: 0x3022,
22560  twoideographicparen: 0x3221,
22561  twoinferior: 0x2082,
22562  twomonospace: 0xFF12,
22563  twonumeratorbengali: 0x09F5,
22564  twooldstyle: 0xF732,
22565  twoparen: 0x2475,
22566  twoperiod: 0x2489,
22567  twopersian: 0x06F2,
22568  tworoman: 0x2171,
22569  twostroke: 0x01BB,
22570  twosuperior: 0x00B2,
22571  twothai: 0x0E52,
22572  twothirds: 0x2154,
22573  u: 0x0075,
22574  uacute: 0x00FA,
22575  ubar: 0x0289,
22576  ubengali: 0x0989,
22577  ubopomofo: 0x3128,
22578  ubreve: 0x016D,
22579  ucaron: 0x01D4,
22580  ucircle: 0x24E4,
22581  ucircumflex: 0x00FB,
22582  ucircumflexbelow: 0x1E77,
22583  ucyrillic: 0x0443,
22584  udattadeva: 0x0951,
22585  udblacute: 0x0171,
22586  udblgrave: 0x0215,
22587  udeva: 0x0909,
22588  udieresis: 0x00FC,
22589  udieresisacute: 0x01D8,
22590  udieresisbelow: 0x1E73,
22591  udieresiscaron: 0x01DA,
22592  udieresiscyrillic: 0x04F1,
22593  udieresisgrave: 0x01DC,
22594  udieresismacron: 0x01D6,
22595  udotbelow: 0x1EE5,
22596  ugrave: 0x00F9,
22597  ugujarati: 0x0A89,
22598  ugurmukhi: 0x0A09,
22599  uhiragana: 0x3046,
22600  uhookabove: 0x1EE7,
22601  uhorn: 0x01B0,
22602  uhornacute: 0x1EE9,
22603  uhorndotbelow: 0x1EF1,
22604  uhorngrave: 0x1EEB,
22605  uhornhookabove: 0x1EED,
22606  uhorntilde: 0x1EEF,
22607  uhungarumlaut: 0x0171,
22608  uhungarumlautcyrillic: 0x04F3,
22609  uinvertedbreve: 0x0217,
22610  ukatakana: 0x30A6,
22611  ukatakanahalfwidth: 0xFF73,
22612  ukcyrillic: 0x0479,
22613  ukorean: 0x315C,
22614  umacron: 0x016B,
22615  umacroncyrillic: 0x04EF,
22616  umacrondieresis: 0x1E7B,
22617  umatragurmukhi: 0x0A41,
22618  umonospace: 0xFF55,
22619  underscore: 0x005F,
22620  underscoredbl: 0x2017,
22621  underscoremonospace: 0xFF3F,
22622  underscorevertical: 0xFE33,
22623  underscorewavy: 0xFE4F,
22624  union: 0x222A,
22625  universal: 0x2200,
22626  uogonek: 0x0173,
22627  uparen: 0x24B0,
22628  upblock: 0x2580,
22629  upperdothebrew: 0x05C4,
22630  upsilon: 0x03C5,
22631  upsilondieresis: 0x03CB,
22632  upsilondieresistonos: 0x03B0,
22633  upsilonlatin: 0x028A,
22634  upsilontonos: 0x03CD,
22635  uptackbelowcmb: 0x031D,
22636  uptackmod: 0x02D4,
22637  uragurmukhi: 0x0A73,
22638  uring: 0x016F,
22639  ushortcyrillic: 0x045E,
22640  usmallhiragana: 0x3045,
22641  usmallkatakana: 0x30A5,
22642  usmallkatakanahalfwidth: 0xFF69,
22643  ustraightcyrillic: 0x04AF,
22644  ustraightstrokecyrillic: 0x04B1,
22645  utilde: 0x0169,
22646  utildeacute: 0x1E79,
22647  utildebelow: 0x1E75,
22648  uubengali: 0x098A,
22649  uudeva: 0x090A,
22650  uugujarati: 0x0A8A,
22651  uugurmukhi: 0x0A0A,
22652  uumatragurmukhi: 0x0A42,
22653  uuvowelsignbengali: 0x09C2,
22654  uuvowelsigndeva: 0x0942,
22655  uuvowelsigngujarati: 0x0AC2,
22656  uvowelsignbengali: 0x09C1,
22657  uvowelsigndeva: 0x0941,
22658  uvowelsigngujarati: 0x0AC1,
22659  v: 0x0076,
22660  vadeva: 0x0935,
22661  vagujarati: 0x0AB5,
22662  vagurmukhi: 0x0A35,
22663  vakatakana: 0x30F7,
22664  vav: 0x05D5,
22665  vavdagesh: 0xFB35,
22666  vavdagesh65: 0xFB35,
22667  vavdageshhebrew: 0xFB35,
22668  vavhebrew: 0x05D5,
22669  vavholam: 0xFB4B,
22670  vavholamhebrew: 0xFB4B,
22671  vavvavhebrew: 0x05F0,
22672  vavyodhebrew: 0x05F1,
22673  vcircle: 0x24E5,
22674  vdotbelow: 0x1E7F,
22675  vecyrillic: 0x0432,
22676  veharabic: 0x06A4,
22677  vehfinalarabic: 0xFB6B,
22678  vehinitialarabic: 0xFB6C,
22679  vehmedialarabic: 0xFB6D,
22680  vekatakana: 0x30F9,
22681  venus: 0x2640,
22682  verticalbar: 0x007C,
22683  verticallineabovecmb: 0x030D,
22684  verticallinebelowcmb: 0x0329,
22685  verticallinelowmod: 0x02CC,
22686  verticallinemod: 0x02C8,
22687  vewarmenian: 0x057E,
22688  vhook: 0x028B,
22689  vikatakana: 0x30F8,
22690  viramabengali: 0x09CD,
22691  viramadeva: 0x094D,
22692  viramagujarati: 0x0ACD,
22693  visargabengali: 0x0983,
22694  visargadeva: 0x0903,
22695  visargagujarati: 0x0A83,
22696  vmonospace: 0xFF56,
22697  voarmenian: 0x0578,
22698  voicediterationhiragana: 0x309E,
22699  voicediterationkatakana: 0x30FE,
22700  voicedmarkkana: 0x309B,
22701  voicedmarkkanahalfwidth: 0xFF9E,
22702  vokatakana: 0x30FA,
22703  vparen: 0x24B1,
22704  vtilde: 0x1E7D,
22705  vturned: 0x028C,
22706  vuhiragana: 0x3094,
22707  vukatakana: 0x30F4,
22708  w: 0x0077,
22709  wacute: 0x1E83,
22710  waekorean: 0x3159,
22711  wahiragana: 0x308F,
22712  wakatakana: 0x30EF,
22713  wakatakanahalfwidth: 0xFF9C,
22714  wakorean: 0x3158,
22715  wasmallhiragana: 0x308E,
22716  wasmallkatakana: 0x30EE,
22717  wattosquare: 0x3357,
22718  wavedash: 0x301C,
22719  wavyunderscorevertical: 0xFE34,
22720  wawarabic: 0x0648,
22721  wawfinalarabic: 0xFEEE,
22722  wawhamzaabovearabic: 0x0624,
22723  wawhamzaabovefinalarabic: 0xFE86,
22724  wbsquare: 0x33DD,
22725  wcircle: 0x24E6,
22726  wcircumflex: 0x0175,
22727  wdieresis: 0x1E85,
22728  wdotaccent: 0x1E87,
22729  wdotbelow: 0x1E89,
22730  wehiragana: 0x3091,
22731  weierstrass: 0x2118,
22732  wekatakana: 0x30F1,
22733  wekorean: 0x315E,
22734  weokorean: 0x315D,
22735  wgrave: 0x1E81,
22736  whitebullet: 0x25E6,
22737  whitecircle: 0x25CB,
22738  whitecircleinverse: 0x25D9,
22739  whitecornerbracketleft: 0x300E,
22740  whitecornerbracketleftvertical: 0xFE43,
22741  whitecornerbracketright: 0x300F,
22742  whitecornerbracketrightvertical: 0xFE44,
22743  whitediamond: 0x25C7,
22744  whitediamondcontainingblacksmalldiamond: 0x25C8,
22745  whitedownpointingsmalltriangle: 0x25BF,
22746  whitedownpointingtriangle: 0x25BD,
22747  whiteleftpointingsmalltriangle: 0x25C3,
22748  whiteleftpointingtriangle: 0x25C1,
22749  whitelenticularbracketleft: 0x3016,
22750  whitelenticularbracketright: 0x3017,
22751  whiterightpointingsmalltriangle: 0x25B9,
22752  whiterightpointingtriangle: 0x25B7,
22753  whitesmallsquare: 0x25AB,
22754  whitesmilingface: 0x263A,
22755  whitesquare: 0x25A1,
22756  whitestar: 0x2606,
22757  whitetelephone: 0x260F,
22758  whitetortoiseshellbracketleft: 0x3018,
22759  whitetortoiseshellbracketright: 0x3019,
22760  whiteuppointingsmalltriangle: 0x25B5,
22761  whiteuppointingtriangle: 0x25B3,
22762  wihiragana: 0x3090,
22763  wikatakana: 0x30F0,
22764  wikorean: 0x315F,
22765  wmonospace: 0xFF57,
22766  wohiragana: 0x3092,
22767  wokatakana: 0x30F2,
22768  wokatakanahalfwidth: 0xFF66,
22769  won: 0x20A9,
22770  wonmonospace: 0xFFE6,
22771  wowaenthai: 0x0E27,
22772  wparen: 0x24B2,
22773  wring: 0x1E98,
22774  wsuperior: 0x02B7,
22775  wturned: 0x028D,
22776  wynn: 0x01BF,
22777  x: 0x0078,
22778  xabovecmb: 0x033D,
22779  xbopomofo: 0x3112,
22780  xcircle: 0x24E7,
22781  xdieresis: 0x1E8D,
22782  xdotaccent: 0x1E8B,
22783  xeharmenian: 0x056D,
22784  xi: 0x03BE,
22785  xmonospace: 0xFF58,
22786  xparen: 0x24B3,
22787  xsuperior: 0x02E3,
22788  y: 0x0079,
22789  yaadosquare: 0x334E,
22790  yabengali: 0x09AF,
22791  yacute: 0x00FD,
22792  yadeva: 0x092F,
22793  yaekorean: 0x3152,
22794  yagujarati: 0x0AAF,
22795  yagurmukhi: 0x0A2F,
22796  yahiragana: 0x3084,
22797  yakatakana: 0x30E4,
22798  yakatakanahalfwidth: 0xFF94,
22799  yakorean: 0x3151,
22800  yamakkanthai: 0x0E4E,
22801  yasmallhiragana: 0x3083,
22802  yasmallkatakana: 0x30E3,
22803  yasmallkatakanahalfwidth: 0xFF6C,
22804  yatcyrillic: 0x0463,
22805  ycircle: 0x24E8,
22806  ycircumflex: 0x0177,
22807  ydieresis: 0x00FF,
22808  ydotaccent: 0x1E8F,
22809  ydotbelow: 0x1EF5,
22810  yeharabic: 0x064A,
22811  yehbarreearabic: 0x06D2,
22812  yehbarreefinalarabic: 0xFBAF,
22813  yehfinalarabic: 0xFEF2,
22814  yehhamzaabovearabic: 0x0626,
22815  yehhamzaabovefinalarabic: 0xFE8A,
22816  yehhamzaaboveinitialarabic: 0xFE8B,
22817  yehhamzaabovemedialarabic: 0xFE8C,
22818  yehinitialarabic: 0xFEF3,
22819  yehmedialarabic: 0xFEF4,
22820  yehmeeminitialarabic: 0xFCDD,
22821  yehmeemisolatedarabic: 0xFC58,
22822  yehnoonfinalarabic: 0xFC94,
22823  yehthreedotsbelowarabic: 0x06D1,
22824  yekorean: 0x3156,
22825  yen: 0x00A5,
22826  yenmonospace: 0xFFE5,
22827  yeokorean: 0x3155,
22828  yeorinhieuhkorean: 0x3186,
22829  yerahbenyomohebrew: 0x05AA,
22830  yerahbenyomolefthebrew: 0x05AA,
22831  yericyrillic: 0x044B,
22832  yerudieresiscyrillic: 0x04F9,
22833  yesieungkorean: 0x3181,
22834  yesieungpansioskorean: 0x3183,
22835  yesieungsioskorean: 0x3182,
22836  yetivhebrew: 0x059A,
22837  ygrave: 0x1EF3,
22838  yhook: 0x01B4,
22839  yhookabove: 0x1EF7,
22840  yiarmenian: 0x0575,
22841  yicyrillic: 0x0457,
22842  yikorean: 0x3162,
22843  yinyang: 0x262F,
22844  yiwnarmenian: 0x0582,
22845  ymonospace: 0xFF59,
22846  yod: 0x05D9,
22847  yoddagesh: 0xFB39,
22848  yoddageshhebrew: 0xFB39,
22849  yodhebrew: 0x05D9,
22850  yodyodhebrew: 0x05F2,
22851  yodyodpatahhebrew: 0xFB1F,
22852  yohiragana: 0x3088,
22853  yoikorean: 0x3189,
22854  yokatakana: 0x30E8,
22855  yokatakanahalfwidth: 0xFF96,
22856  yokorean: 0x315B,
22857  yosmallhiragana: 0x3087,
22858  yosmallkatakana: 0x30E7,
22859  yosmallkatakanahalfwidth: 0xFF6E,
22860  yotgreek: 0x03F3,
22861  yoyaekorean: 0x3188,
22862  yoyakorean: 0x3187,
22863  yoyakthai: 0x0E22,
22864  yoyingthai: 0x0E0D,
22865  yparen: 0x24B4,
22866  ypogegrammeni: 0x037A,
22867  ypogegrammenigreekcmb: 0x0345,
22868  yr: 0x01A6,
22869  yring: 0x1E99,
22870  ysuperior: 0x02B8,
22871  ytilde: 0x1EF9,
22872  yturned: 0x028E,
22873  yuhiragana: 0x3086,
22874  yuikorean: 0x318C,
22875  yukatakana: 0x30E6,
22876  yukatakanahalfwidth: 0xFF95,
22877  yukorean: 0x3160,
22878  yusbigcyrillic: 0x046B,
22879  yusbigiotifiedcyrillic: 0x046D,
22880  yuslittlecyrillic: 0x0467,
22881  yuslittleiotifiedcyrillic: 0x0469,
22882  yusmallhiragana: 0x3085,
22883  yusmallkatakana: 0x30E5,
22884  yusmallkatakanahalfwidth: 0xFF6D,
22885  yuyekorean: 0x318B,
22886  yuyeokorean: 0x318A,
22887  yyabengali: 0x09DF,
22888  yyadeva: 0x095F,
22889  z: 0x007A,
22890  zaarmenian: 0x0566,
22891  zacute: 0x017A,
22892  zadeva: 0x095B,
22893  zagurmukhi: 0x0A5B,
22894  zaharabic: 0x0638,
22895  zahfinalarabic: 0xFEC6,
22896  zahinitialarabic: 0xFEC7,
22897  zahiragana: 0x3056,
22898  zahmedialarabic: 0xFEC8,
22899  zainarabic: 0x0632,
22900  zainfinalarabic: 0xFEB0,
22901  zakatakana: 0x30B6,
22902  zaqefgadolhebrew: 0x0595,
22903  zaqefqatanhebrew: 0x0594,
22904  zarqahebrew: 0x0598,
22905  zayin: 0x05D6,
22906  zayindagesh: 0xFB36,
22907  zayindageshhebrew: 0xFB36,
22908  zayinhebrew: 0x05D6,
22909  zbopomofo: 0x3117,
22910  zcaron: 0x017E,
22911  zcircle: 0x24E9,
22912  zcircumflex: 0x1E91,
22913  zcurl: 0x0291,
22914  zdot: 0x017C,
22915  zdotaccent: 0x017C,
22916  zdotbelow: 0x1E93,
22917  zecyrillic: 0x0437,
22918  zedescendercyrillic: 0x0499,
22919  zedieresiscyrillic: 0x04DF,
22920  zehiragana: 0x305C,
22921  zekatakana: 0x30BC,
22922  zero: 0x0030,
22923  zeroarabic: 0x0660,
22924  zerobengali: 0x09E6,
22925  zerodeva: 0x0966,
22926  zerogujarati: 0x0AE6,
22927  zerogurmukhi: 0x0A66,
22928  zerohackarabic: 0x0660,
22929  zeroinferior: 0x2080,
22930  zeromonospace: 0xFF10,
22931  zerooldstyle: 0xF730,
22932  zeropersian: 0x06F0,
22933  zerosuperior: 0x2070,
22934  zerothai: 0x0E50,
22935  zerowidthjoiner: 0xFEFF,
22936  zerowidthnonjoiner: 0x200C,
22937  zerowidthspace: 0x200B,
22938  zeta: 0x03B6,
22939  zhbopomofo: 0x3113,
22940  zhearmenian: 0x056A,
22941  zhebrevecyrillic: 0x04C2,
22942  zhecyrillic: 0x0436,
22943  zhedescendercyrillic: 0x0497,
22944  zhedieresiscyrillic: 0x04DD,
22945  zihiragana: 0x3058,
22946  zikatakana: 0x30B8,
22947  zinorhebrew: 0x05AE,
22948  zlinebelow: 0x1E95,
22949  zmonospace: 0xFF5A,
22950  zohiragana: 0x305E,
22951  zokatakana: 0x30BE,
22952  zparen: 0x24B5,
22953  zretroflexhook: 0x0290,
22954  zstroke: 0x01B6,
22955  zuhiragana: 0x305A,
22956  zukatakana: 0x30BA,
22957  '.notdef': 0x0000
22958};
22959
22960
22961/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
22962/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
22963
22964'use strict';
22965
22966var PDFImage = (function PDFImageClosure() {
22967  /**
22968   * Decode the image in the main thread if it supported. Resovles the promise
22969   * when the image data is ready.
22970   */
22971  function handleImageData(handler, xref, res, image, promise) {
22972    if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) {
22973      // For natively supported jpegs send them to the main thread for decoding.
22974      var dict = image.dict;
22975      var colorSpace = dict.get('ColorSpace', 'CS');
22976      colorSpace = ColorSpace.parse(colorSpace, xref, res);
22977      var numComps = colorSpace.numComps;
22978      handler.send('JpegDecode', [image.getIR(), numComps], function(message) {
22979        var data = message.data;
22980        var stream = new Stream(data, 0, data.length, image.dict);
22981        promise.resolve(stream);
22982      });
22983    } else {
22984      promise.resolve(image);
22985    }
22986  }
22987  /**
22988   * Decode and clamp a value. The formula is different from the spec because we
22989   * don't decode to float range [0,1], we decode it in the [0,max] range.
22990   */
22991  function decodeAndClamp(value, addend, coefficient, max) {
22992    value = addend + value * coefficient;
22993    // Clamp the value to the range
22994    return value < 0 ? 0 : value > max ? max : value;
22995  }
22996  function PDFImage(xref, res, image, inline, smask) {
22997    this.image = image;
22998    if (image.getParams) {
22999      // JPX/JPEG2000 streams directly contain bits per component
23000      // and color space mode information.
23001      TODO('get params from actual stream');
23002      // var bits = ...
23003      // var colorspace = ...
23004    }
23005    // TODO cache rendered images?
23006
23007    var dict = image.dict;
23008    this.width = dict.get('Width', 'W');
23009    this.height = dict.get('Height', 'H');
23010
23011    if (this.width < 1 || this.height < 1)
23012      error('Invalid image width: ' + this.width + ' or height: ' +
23013            this.height);
23014
23015    this.interpolate = dict.get('Interpolate', 'I') || false;
23016    this.imageMask = dict.get('ImageMask', 'IM') || false;
23017
23018    var bitsPerComponent = image.bitsPerComponent;
23019    if (!bitsPerComponent) {
23020      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
23021      if (!bitsPerComponent) {
23022        if (this.imageMask)
23023          bitsPerComponent = 1;
23024        else
23025          error('Bits per component missing in image: ' + this.imageMask);
23026      }
23027    }
23028    this.bpc = bitsPerComponent;
23029
23030    if (!this.imageMask) {
23031      var colorSpace = dict.get('ColorSpace', 'CS');
23032      if (!colorSpace) {
23033        TODO('JPX images (which don"t require color spaces');
23034        colorSpace = new Name('DeviceRGB');
23035      }
23036      this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
23037      this.numComps = this.colorSpace.numComps;
23038    }
23039
23040    this.decode = dict.get('Decode', 'D');
23041    this.needsDecode = false;
23042    if (this.decode && this.colorSpace &&
23043        !this.colorSpace.isDefaultDecode(this.decode)) {
23044      this.needsDecode = true;
23045      // Do some preprocessing to avoid more math.
23046      var max = (1 << bitsPerComponent) - 1;
23047      this.decodeCoefficients = [];
23048      this.decodeAddends = [];
23049      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
23050        var dmin = this.decode[i];
23051        var dmax = this.decode[i + 1];
23052        this.decodeCoefficients[j] = dmax - dmin;
23053        this.decodeAddends[j] = max * dmin;
23054      }
23055    }
23056
23057    var mask = dict.get('Mask');
23058
23059    if (mask) {
23060      TODO('masked images');
23061    } else if (smask) {
23062      this.smask = new PDFImage(xref, res, smask, false);
23063    }
23064  }
23065  /**
23066   * Handles processing of image data and calls the callback with an argument
23067   * of a PDFImage when the image is ready to be used.
23068   */
23069  PDFImage.buildImage = function PDFImage_buildImage(callback, handler, xref,
23070                                                     res, image, inline) {
23071    var imageDataPromise = new Promise();
23072    var smaskPromise = new Promise();
23073    // The image data and smask data may not be ready yet, wait till both are
23074    // resolved.
23075    Promise.all([imageDataPromise, smaskPromise]).then(function(results) {
23076      var imageData = results[0], smaskData = results[1];
23077      var image = new PDFImage(xref, res, imageData, inline, smaskData);
23078      callback(image);
23079    });
23080
23081    handleImageData(handler, xref, res, image, imageDataPromise);
23082
23083    var smask = image.dict.get('SMask');
23084    if (smask)
23085      handleImageData(handler, xref, res, smask, smaskPromise);
23086    else
23087      smaskPromise.resolve(null);
23088  };
23089
23090  /**
23091   * Resize an image using the nearest neighbor algorithm.  Currently only
23092   * supports one and three component images.
23093   * @param {TypedArray} pixels The original image with one component.
23094   * @param {Number} bpc Number of bits per component.
23095   * @param {Number} components Number of color components, 1 or 3 is supported.
23096   * @param {Number} w1 Original width.
23097   * @param {Number} h1 Original height.
23098   * @param {Number} w2 New width.
23099   * @param {Number} h2 New height.
23100   * @return {TypedArray} Resized image data.
23101   */
23102  PDFImage.resize = function PDFImage_resize(pixels, bpc, components,
23103                                             w1, h1, w2, h2) {
23104    var length = w2 * h2 * components;
23105    var temp = bpc <= 8 ? new Uint8Array(length) :
23106        bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
23107    var xRatio = w1 / w2;
23108    var yRatio = h1 / h2;
23109    var px, py, newIndex, oldIndex;
23110    for (var i = 0; i < h2; i++) {
23111      for (var j = 0; j < w2; j++) {
23112        px = Math.floor(j * xRatio);
23113        py = Math.floor(i * yRatio);
23114        newIndex = (i * w2) + j;
23115        oldIndex = ((py * w1) + px);
23116        if (components === 1) {
23117          temp[newIndex] = pixels[oldIndex];
23118        } else if (components === 3) {
23119          newIndex *= 3;
23120          oldIndex *= 3;
23121          temp[newIndex] = pixels[oldIndex];
23122          temp[newIndex + 1] = pixels[oldIndex + 1];
23123          temp[newIndex + 2] = pixels[oldIndex + 2];
23124        }
23125      }
23126    }
23127    return temp;
23128  };
23129
23130  PDFImage.prototype = {
23131    get drawWidth() {
23132      if (!this.smask)
23133        return this.width;
23134      return Math.max(this.width, this.smask.width);
23135    },
23136    get drawHeight() {
23137      if (!this.smask)
23138        return this.height;
23139      return Math.max(this.height, this.smask.height);
23140    },
23141    getComponents: function PDFImage_getComponents(buffer) {
23142      var bpc = this.bpc;
23143      var needsDecode = this.needsDecode;
23144      var decodeMap = this.decode;
23145
23146      // This image doesn't require any extra work.
23147      if (bpc == 8 && !needsDecode)
23148        return buffer;
23149
23150      var bufferLength = buffer.length;
23151      var width = this.width;
23152      var height = this.height;
23153      var numComps = this.numComps;
23154
23155      var length = width * height * numComps;
23156      var bufferPos = 0;
23157      var output = bpc <= 8 ? new Uint8Array(length) :
23158        bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
23159      var rowComps = width * numComps;
23160      var decodeAddends, decodeCoefficients;
23161      if (needsDecode) {
23162        decodeAddends = this.decodeAddends;
23163        decodeCoefficients = this.decodeCoefficients;
23164      }
23165      var max = (1 << bpc) - 1;
23166
23167      if (bpc == 8) {
23168        // Optimization for reading 8 bpc images that have a decode.
23169        for (var i = 0, ii = length; i < ii; ++i) {
23170          var compIndex = i % numComps;
23171          var value = buffer[i];
23172          value = decodeAndClamp(value, decodeAddends[compIndex],
23173                          decodeCoefficients[compIndex], max);
23174          output[i] = value;
23175        }
23176      } else if (bpc == 1) {
23177        // Optimization for reading 1 bpc images.
23178        var valueZero = 0, valueOne = 1;
23179        if (decodeMap) {
23180          valueZero = decodeMap[0] ? 1 : 0;
23181          valueOne = decodeMap[1] ? 1 : 0;
23182        }
23183        var mask = 0;
23184        var buf = 0;
23185
23186        for (var i = 0, ii = length; i < ii; ++i) {
23187          if (i % rowComps == 0) {
23188            mask = 0;
23189            buf = 0;
23190          } else {
23191            mask >>= 1;
23192          }
23193
23194          if (mask <= 0) {
23195            buf = buffer[bufferPos++];
23196            mask = 128;
23197          }
23198
23199          output[i] = !(buf & mask) ? valueZero : valueOne;
23200        }
23201      } else {
23202        // The general case that handles all other bpc values.
23203        var bits = 0, buf = 0;
23204        for (var i = 0, ii = length; i < ii; ++i) {
23205          if (i % rowComps == 0) {
23206            buf = 0;
23207            bits = 0;
23208          }
23209
23210          while (bits < bpc) {
23211            buf = (buf << 8) | buffer[bufferPos++];
23212            bits += 8;
23213          }
23214
23215          var remainingBits = bits - bpc;
23216          var value = buf >> remainingBits;
23217          if (needsDecode) {
23218            var compIndex = i % numComps;
23219            value = decodeAndClamp(value, decodeAddends[compIndex],
23220                            decodeCoefficients[compIndex], max);
23221          }
23222          output[i] = value;
23223          buf = buf & ((1 << remainingBits) - 1);
23224          bits = remainingBits;
23225        }
23226      }
23227      return output;
23228    },
23229    getOpacity: function PDFImage_getOpacity(width, height) {
23230      var smask = this.smask;
23231      var originalWidth = this.width;
23232      var originalHeight = this.height;
23233      var buf;
23234
23235      if (smask) {
23236        var sw = smask.width;
23237        var sh = smask.height;
23238        buf = new Uint8Array(sw * sh);
23239        smask.fillGrayBuffer(buf);
23240        if (sw != width || sh != height)
23241          buf = PDFImage.resize(buf, smask.bps, 1, sw, sh, width, height);
23242      } else {
23243        buf = new Uint8Array(width * height);
23244        for (var i = 0, ii = width * height; i < ii; ++i)
23245          buf[i] = 255;
23246      }
23247      return buf;
23248    },
23249    applyStencilMask: function PDFImage_applyStencilMask(buffer,
23250                                                         inverseDecode) {
23251      var width = this.width, height = this.height;
23252      var bitStrideLength = (width + 7) >> 3;
23253      var imgArray = this.getImageBytes(bitStrideLength * height);
23254      var imgArrayPos = 0;
23255      var i, j, mask, buf;
23256      // removing making non-masked pixels transparent
23257      var bufferPos = 3; // alpha component offset
23258      for (i = 0; i < height; i++) {
23259        mask = 0;
23260        for (j = 0; j < width; j++) {
23261          if (!mask) {
23262            buf = imgArray[imgArrayPos++];
23263            mask = 128;
23264          }
23265          if (!(buf & mask) == inverseDecode) {
23266            buffer[bufferPos] = 0;
23267          }
23268          bufferPos += 4;
23269          mask >>= 1;
23270        }
23271      }
23272    },
23273    fillRgbaBuffer: function PDFImage_fillRgbaBuffer(buffer, width, height) {
23274      var numComps = this.numComps;
23275      var originalWidth = this.width;
23276      var originalHeight = this.height;
23277      var bpc = this.bpc;
23278
23279      // rows start at byte boundary;
23280      var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;
23281      var imgArray = this.getImageBytes(originalHeight * rowBytes);
23282
23283      var comps = this.colorSpace.getRgbBuffer(
23284        this.getComponents(imgArray), bpc);
23285      if (originalWidth != width || originalHeight != height)
23286        comps = PDFImage.resize(comps, this.bpc, 3, originalWidth,
23287                                originalHeight, width, height);
23288      var compsPos = 0;
23289      var opacity = this.getOpacity(width, height);
23290      var opacityPos = 0;
23291      var length = width * height * 4;
23292
23293      for (var i = 0; i < length; i += 4) {
23294        buffer[i] = comps[compsPos++];
23295        buffer[i + 1] = comps[compsPos++];
23296        buffer[i + 2] = comps[compsPos++];
23297        buffer[i + 3] = opacity[opacityPos++];
23298      }
23299    },
23300    fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
23301      var numComps = this.numComps;
23302      if (numComps != 1)
23303        error('Reading gray scale from a color image: ' + numComps);
23304
23305      var width = this.width;
23306      var height = this.height;
23307      var bpc = this.bpc;
23308
23309      // rows start at byte boundary;
23310      var rowBytes = (width * numComps * bpc + 7) >> 3;
23311      var imgArray = this.getImageBytes(height * rowBytes);
23312
23313      var comps = this.getComponents(imgArray);
23314      var length = width * height;
23315      // we aren't using a colorspace so we need to scale the value
23316      var scale = 255 / ((1 << bpc) - 1);
23317      for (var i = 0; i < length; ++i)
23318        buffer[i] = (scale * comps[i]) | 0;
23319    },
23320    getImageBytes: function PDFImage_getImageBytes(length) {
23321      this.image.reset();
23322      return this.image.getBytes(length);
23323    }
23324  };
23325  return PDFImage;
23326})();
23327
23328function loadJpegStream(id, imageData, objs) {
23329  var img = new Image();
23330  img.onload = (function loadJpegStream_onloadClosure() {
23331    objs.resolve(id, img);
23332  });
23333  img.src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData);
23334}
23335
23336
23337/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
23338/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
23339
23340'use strict';
23341
23342// The Metrics object contains glyph widths (in glyph space units).
23343// As per PDF spec, for most fonts (Type 3 being an exception) a glyph
23344// space unit corresponds to 1/1000th of text space unit.
23345var Metrics = {
23346  'Courier': 600,
23347  'Courier-Bold': 600,
23348  'Courier-BoldOblique': 600,
23349  'Courier-Oblique': 600,
23350  'Helvetica' : {
23351    'space': 278,
23352    'exclam': 278,
23353    'quotedbl': 355,
23354    'numbersign': 556,
23355    'dollar': 556,
23356    'percent': 889,
23357    'ampersand': 667,
23358    'quoteright': 222,
23359    'parenleft': 333,
23360    'parenright': 333,
23361    'asterisk': 389,
23362    'plus': 584,
23363    'comma': 278,
23364    'hyphen': 333,
23365    'period': 278,
23366    'slash': 278,
23367    'zero': 556,
23368    'one': 556,
23369    'two': 556,
23370    'three': 556,
23371    'four': 556,
23372    'five': 556,
23373    'six': 556,
23374    'seven': 556,
23375    'eight': 556,
23376    'nine': 556,
23377    'colon': 278,
23378    'semicolon': 278,
23379    'less': 584,
23380    'equal': 584,
23381    'greater': 584,
23382    'question': 556,
23383    'at': 1015,
23384    'A': 667,
23385    'B': 667,
23386    'C': 722,
23387    'D': 722,
23388    'E': 667,
23389    'F': 611,
23390    'G': 778,
23391    'H': 722,
23392    'I': 278,
23393    'J': 500,
23394    'K': 667,
23395    'L': 556,
23396    'M': 833,
23397    'N': 722,
23398    'O': 778,
23399    'P': 667,
23400    'Q': 778,
23401    'R': 722,
23402    'S': 667,
23403    'T': 611,
23404    'U': 722,
23405    'V': 667,
23406    'W': 944,
23407    'X': 667,
23408    'Y': 667,
23409    'Z': 611,
23410    'bracketleft': 278,
23411    'backslash': 278,
23412    'bracketright': 278,
23413    'asciicircum': 469,
23414    'underscore': 556,
23415    'quoteleft': 222,
23416    'a': 556,
23417    'b': 556,
23418    'c': 500,
23419    'd': 556,
23420    'e': 556,
23421    'f': 278,
23422    'g': 556,
23423    'h': 556,
23424    'i': 222,
23425    'j': 222,
23426    'k': 500,
23427    'l': 222,
23428    'm': 833,
23429    'n': 556,
23430    'o': 556,
23431    'p': 556,
23432    'q': 556,
23433    'r': 333,
23434    's': 500,
23435    't': 278,
23436    'u': 556,
23437    'v': 500,
23438    'w': 722,
23439    'x': 500,
23440    'y': 500,
23441    'z': 500,
23442    'braceleft': 334,
23443    'bar': 260,
23444    'braceright': 334,
23445    'asciitilde': 584,
23446    'exclamdown': 333,
23447    'cent': 556,
23448    'sterling': 556,
23449    'fraction': 167,
23450    'yen': 556,
23451    'florin': 556,
23452    'section': 556,
23453    'currency': 556,
23454    'quotesingle': 191,
23455    'quotedblleft': 333,
23456    'guillemotleft': 556,
23457    'guilsinglleft': 333,
23458    'guilsinglright': 333,
23459    'fi': 500,
23460    'fl': 500,
23461    'endash': 556,
23462    'dagger': 556,
23463    'daggerdbl': 556,
23464    'periodcentered': 278,
23465    'paragraph': 537,
23466    'bullet': 350,
23467    'quotesinglbase': 222,
23468    'quotedblbase': 333,
23469    'quotedblright': 333,
23470    'guillemotright': 556,
23471    'ellipsis': 1000,
23472    'perthousand': 1000,
23473    'questiondown': 611,
23474    'grave': 333,
23475    'acute': 333,
23476    'circumflex': 333,
23477    'tilde': 333,
23478    'macron': 333,
23479    'breve': 333,
23480    'dotaccent': 333,
23481    'dieresis': 333,
23482    'ring': 333,
23483    'cedilla': 333,
23484    'hungarumlaut': 333,
23485    'ogonek': 333,
23486    'caron': 333,
23487    'emdash': 1000,
23488    'AE': 1000,
23489    'ordfeminine': 370,
23490    'Lslash': 556,
23491    'Oslash': 778,
23492    'OE': 1000,
23493    'ordmasculine': 365,
23494    'ae': 889,
23495    'dotlessi': 278,
23496    'lslash': 222,
23497    'oslash': 611,
23498    'oe': 944,
23499    'germandbls': 611,
23500    'Idieresis': 278,
23501    'eacute': 556,
23502    'abreve': 556,
23503    'uhungarumlaut': 556,
23504    'ecaron': 556,
23505    'Ydieresis': 667,
23506    'divide': 584,
23507    'Yacute': 667,
23508    'Acircumflex': 667,
23509    'aacute': 556,
23510    'Ucircumflex': 722,
23511    'yacute': 500,
23512    'scommaaccent': 500,
23513    'ecircumflex': 556,
23514    'Uring': 722,
23515    'Udieresis': 722,
23516    'aogonek': 556,
23517    'Uacute': 722,
23518    'uogonek': 556,
23519    'Edieresis': 667,
23520    'Dcroat': 722,
23521    'commaaccent': 250,
23522    'copyright': 737,
23523    'Emacron': 667,
23524    'ccaron': 500,
23525    'aring': 556,
23526    'Ncommaaccent': 722,
23527    'lacute': 222,
23528    'agrave': 556,
23529    'Tcommaaccent': 611,
23530    'Cacute': 722,
23531    'atilde': 556,
23532    'Edotaccent': 667,
23533    'scaron': 500,
23534    'scedilla': 500,
23535    'iacute': 278,
23536    'lozenge': 471,
23537    'Rcaron': 722,
23538    'Gcommaaccent': 778,
23539    'ucircumflex': 556,
23540    'acircumflex': 556,
23541    'Amacron': 667,
23542    'rcaron': 333,
23543    'ccedilla': 500,
23544    'Zdotaccent': 611,
23545    'Thorn': 667,
23546    'Omacron': 778,
23547    'Racute': 722,
23548    'Sacute': 667,
23549    'dcaron': 643,
23550    'Umacron': 722,
23551    'uring': 556,
23552    'threesuperior': 333,
23553    'Ograve': 778,
23554    'Agrave': 667,
23555    'Abreve': 667,
23556    'multiply': 584,
23557    'uacute': 556,
23558    'Tcaron': 611,
23559    'partialdiff': 476,
23560    'ydieresis': 500,
23561    'Nacute': 722,
23562    'icircumflex': 278,
23563    'Ecircumflex': 667,
23564    'adieresis': 556,
23565    'edieresis': 556,
23566    'cacute': 500,
23567    'nacute': 556,
23568    'umacron': 556,
23569    'Ncaron': 722,
23570    'Iacute': 278,
23571    'plusminus': 584,
23572    'brokenbar': 260,
23573    'registered': 737,
23574    'Gbreve': 778,
23575    'Idotaccent': 278,
23576    'summation': 600,
23577    'Egrave': 667,
23578    'racute': 333,
23579    'omacron': 556,
23580    'Zacute': 611,
23581    'Zcaron': 611,
23582    'greaterequal': 549,
23583    'Eth': 722,
23584    'Ccedilla': 722,
23585    'lcommaaccent': 222,
23586    'tcaron': 317,
23587    'eogonek': 556,
23588    'Uogonek': 722,
23589    'Aacute': 667,
23590    'Adieresis': 667,
23591    'egrave': 556,
23592    'zacute': 500,
23593    'iogonek': 222,
23594    'Oacute': 778,
23595    'oacute': 556,
23596    'amacron': 556,
23597    'sacute': 500,
23598    'idieresis': 278,
23599    'Ocircumflex': 778,
23600    'Ugrave': 722,
23601    'Delta': 612,
23602    'thorn': 556,
23603    'twosuperior': 333,
23604    'Odieresis': 778,
23605    'mu': 556,
23606    'igrave': 278,
23607    'ohungarumlaut': 556,
23608    'Eogonek': 667,
23609    'dcroat': 556,
23610    'threequarters': 834,
23611    'Scedilla': 667,
23612    'lcaron': 299,
23613    'Kcommaaccent': 667,
23614    'Lacute': 556,
23615    'trademark': 1000,
23616    'edotaccent': 556,
23617    'Igrave': 278,
23618    'Imacron': 278,
23619    'Lcaron': 556,
23620    'onehalf': 834,
23621    'lessequal': 549,
23622    'ocircumflex': 556,
23623    'ntilde': 556,
23624    'Uhungarumlaut': 722,
23625    'Eacute': 667,
23626    'emacron': 556,
23627    'gbreve': 556,
23628    'onequarter': 834,
23629    'Scaron': 667,
23630    'Scommaaccent': 667,
23631    'Ohungarumlaut': 778,
23632    'degree': 400,
23633    'ograve': 556,
23634    'Ccaron': 722,
23635    'ugrave': 556,
23636    'radical': 453,
23637    'Dcaron': 722,
23638    'rcommaaccent': 333,
23639    'Ntilde': 722,
23640    'otilde': 556,
23641    'Rcommaaccent': 722,
23642    'Lcommaaccent': 556,
23643    'Atilde': 667,
23644    'Aogonek': 667,
23645    'Aring': 667,
23646    'Otilde': 778,
23647    'zdotaccent': 500,
23648    'Ecaron': 667,
23649    'Iogonek': 278,
23650    'kcommaaccent': 500,
23651    'minus': 584,
23652    'Icircumflex': 278,
23653    'ncaron': 556,
23654    'tcommaaccent': 278,
23655    'logicalnot': 584,
23656    'odieresis': 556,
23657    'udieresis': 556,
23658    'notequal': 549,
23659    'gcommaaccent': 556,
23660    'eth': 556,
23661    'zcaron': 500,
23662    'ncommaaccent': 556,
23663    'onesuperior': 333,
23664    'imacron': 278,
23665    'Euro': 556
23666  },
23667  'Helvetica-Bold': {
23668    'space': 278,
23669    'exclam': 333,
23670    'quotedbl': 474,
23671    'numbersign': 556,
23672    'dollar': 556,
23673    'percent': 889,
23674    'ampersand': 722,
23675    'quoteright': 278,
23676    'parenleft': 333,
23677    'parenright': 333,
23678    'asterisk': 389,
23679    'plus': 584,
23680    'comma': 278,
23681    'hyphen': 333,
23682    'period': 278,
23683    'slash': 278,
23684    'zero': 556,
23685    'one': 556,
23686    'two': 556,
23687    'three': 556,
23688    'four': 556,
23689    'five': 556,
23690    'six': 556,
23691    'seven': 556,
23692    'eight': 556,
23693    'nine': 556,
23694    'colon': 333,
23695    'semicolon': 333,
23696    'less': 584,
23697    'equal': 584,
23698    'greater': 584,
23699    'question': 611,
23700    'at': 975,
23701    'A': 722,
23702    'B': 722,
23703    'C': 722,
23704    'D': 722,
23705    'E': 667,
23706    'F': 611,
23707    'G': 778,
23708    'H': 722,
23709    'I': 278,
23710    'J': 556,
23711    'K': 722,
23712    'L': 611,
23713    'M': 833,
23714    'N': 722,
23715    'O': 778,
23716    'P': 667,
23717    'Q': 778,
23718    'R': 722,
23719    'S': 667,
23720    'T': 611,
23721    'U': 722,
23722    'V': 667,
23723    'W': 944,
23724    'X': 667,
23725    'Y': 667,
23726    'Z': 611,
23727    'bracketleft': 333,
23728    'backslash': 278,
23729    'bracketright': 333,
23730    'asciicircum': 584,
23731    'underscore': 556,
23732    'quoteleft': 278,
23733    'a': 556,
23734    'b': 611,
23735    'c': 556,
23736    'd': 611,
23737    'e': 556,
23738    'f': 333,
23739    'g': 611,
23740    'h': 611,
23741    'i': 278,
23742    'j': 278,
23743    'k': 556,
23744    'l': 278,
23745    'm': 889,
23746    'n': 611,
23747    'o': 611,
23748    'p': 611,
23749    'q': 611,
23750    'r': 389,
23751    's': 556,
23752    't': 333,
23753    'u': 611,
23754    'v': 556,
23755    'w': 778,
23756    'x': 556,
23757    'y': 556,
23758    'z': 500,
23759    'braceleft': 389,
23760    'bar': 280,
23761    'braceright': 389,
23762    'asciitilde': 584,
23763    'exclamdown': 333,
23764    'cent': 556,
23765    'sterling': 556,
23766    'fraction': 167,
23767    'yen': 556,
23768    'florin': 556,
23769    'section': 556,
23770    'currency': 556,
23771    'quotesingle': 238,
23772    'quotedblleft': 500,
23773    'guillemotleft': 556,
23774    'guilsinglleft': 333,
23775    'guilsinglright': 333,
23776    'fi': 611,
23777    'fl': 611,
23778    'endash': 556,
23779    'dagger': 556,
23780    'daggerdbl': 556,
23781    'periodcentered': 278,
23782    'paragraph': 556,
23783    'bullet': 350,
23784    'quotesinglbase': 278,
23785    'quotedblbase': 500,
23786    'quotedblright': 500,
23787    'guillemotright': 556,
23788    'ellipsis': 1000,
23789    'perthousand': 1000,
23790    'questiondown': 611,
23791    'grave': 333,
23792    'acute': 333,
23793    'circumflex': 333,
23794    'tilde': 333,
23795    'macron': 333,
23796    'breve': 333,
23797    'dotaccent': 333,
23798    'dieresis': 333,
23799    'ring': 333,
23800    'cedilla': 333,
23801    'hungarumlaut': 333,
23802    'ogonek': 333,
23803    'caron': 333,
23804    'emdash': 1000,
23805    'AE': 1000,
23806    'ordfeminine': 370,
23807    'Lslash': 611,
23808    'Oslash': 778,
23809    'OE': 1000,
23810    'ordmasculine': 365,
23811    'ae': 889,
23812    'dotlessi': 278,
23813    'lslash': 278,
23814    'oslash': 611,
23815    'oe': 944,
23816    'germandbls': 611,
23817    'Idieresis': 278,
23818    'eacute': 556,
23819    'abreve': 556,
23820    'uhungarumlaut': 611,
23821    'ecaron': 556,
23822    'Ydieresis': 667,
23823    'divide': 584,
23824    'Yacute': 667,
23825    'Acircumflex': 722,
23826    'aacute': 556,
23827    'Ucircumflex': 722,
23828    'yacute': 556,
23829    'scommaaccent': 556,
23830    'ecircumflex': 556,
23831    'Uring': 722,
23832    'Udieresis': 722,
23833    'aogonek': 556,
23834    'Uacute': 722,
23835    'uogonek': 611,
23836    'Edieresis': 667,
23837    'Dcroat': 722,
23838    'commaaccent': 250,
23839    'copyright': 737,
23840    'Emacron': 667,
23841    'ccaron': 556,
23842    'aring': 556,
23843    'Ncommaaccent': 722,
23844    'lacute': 278,
23845    'agrave': 556,
23846    'Tcommaaccent': 611,
23847    'Cacute': 722,
23848    'atilde': 556,
23849    'Edotaccent': 667,
23850    'scaron': 556,
23851    'scedilla': 556,
23852    'iacute': 278,
23853    'lozenge': 494,
23854    'Rcaron': 722,
23855    'Gcommaaccent': 778,
23856    'ucircumflex': 611,
23857    'acircumflex': 556,
23858    'Amacron': 722,
23859    'rcaron': 389,
23860    'ccedilla': 556,
23861    'Zdotaccent': 611,
23862    'Thorn': 667,
23863    'Omacron': 778,
23864    'Racute': 722,
23865    'Sacute': 667,
23866    'dcaron': 743,
23867    'Umacron': 722,
23868    'uring': 611,
23869    'threesuperior': 333,
23870    'Ograve': 778,
23871    'Agrave': 722,
23872    'Abreve': 722,
23873    'multiply': 584,
23874    'uacute': 611,
23875    'Tcaron': 611,
23876    'partialdiff': 494,
23877    'ydieresis': 556,
23878    'Nacute': 722,
23879    'icircumflex': 278,
23880    'Ecircumflex': 667,
23881    'adieresis': 556,
23882    'edieresis': 556,
23883    'cacute': 556,
23884    'nacute': 611,
23885    'umacron': 611,
23886    'Ncaron': 722,
23887    'Iacute': 278,
23888    'plusminus': 584,
23889    'brokenbar': 280,
23890    'registered': 737,
23891    'Gbreve': 778,
23892    'Idotaccent': 278,
23893    'summation': 600,
23894    'Egrave': 667,
23895    'racute': 389,
23896    'omacron': 611,
23897    'Zacute': 611,
23898    'Zcaron': 611,
23899    'greaterequal': 549,
23900    'Eth': 722,
23901    'Ccedilla': 722,
23902    'lcommaaccent': 278,
23903    'tcaron': 389,
23904    'eogonek': 556,
23905    'Uogonek': 722,
23906    'Aacute': 722,
23907    'Adieresis': 722,
23908    'egrave': 556,
23909    'zacute': 500,
23910    'iogonek': 278,
23911    'Oacute': 778,
23912    'oacute': 611,
23913    'amacron': 556,
23914    'sacute': 556,
23915    'idieresis': 278,
23916    'Ocircumflex': 778,
23917    'Ugrave': 722,
23918    'Delta': 612,
23919    'thorn': 611,
23920    'twosuperior': 333,
23921    'Odieresis': 778,
23922    'mu': 611,
23923    'igrave': 278,
23924    'ohungarumlaut': 611,
23925    'Eogonek': 667,
23926    'dcroat': 611,
23927    'threequarters': 834,
23928    'Scedilla': 667,
23929    'lcaron': 400,
23930    'Kcommaaccent': 722,
23931    'Lacute': 611,
23932    'trademark': 1000,
23933    'edotaccent': 556,
23934    'Igrave': 278,
23935    'Imacron': 278,
23936    'Lcaron': 611,
23937    'onehalf': 834,
23938    'lessequal': 549,
23939    'ocircumflex': 611,
23940    'ntilde': 611,
23941    'Uhungarumlaut': 722,
23942    'Eacute': 667,
23943    'emacron': 556,
23944    'gbreve': 611,
23945    'onequarter': 834,
23946    'Scaron': 667,
23947    'Scommaaccent': 667,
23948    'Ohungarumlaut': 778,
23949    'degree': 400,
23950    'ograve': 611,
23951    'Ccaron': 722,
23952    'ugrave': 611,
23953    'radical': 549,
23954    'Dcaron': 722,
23955    'rcommaaccent': 389,
23956    'Ntilde': 722,
23957    'otilde': 611,
23958    'Rcommaaccent': 722,
23959    'Lcommaaccent': 611,
23960    'Atilde': 722,
23961    'Aogonek': 722,
23962    'Aring': 722,
23963    'Otilde': 778,
23964    'zdotaccent': 500,
23965    'Ecaron': 667,
23966    'Iogonek': 278,
23967    'kcommaaccent': 556,
23968    'minus': 584,
23969    'Icircumflex': 278,
23970    'ncaron': 611,
23971    'tcommaaccent': 333,
23972    'logicalnot': 584,
23973    'odieresis': 611,
23974    'udieresis': 611,
23975    'notequal': 549,
23976    'gcommaaccent': 611,
23977    'eth': 611,
23978    'zcaron': 500,
23979    'ncommaaccent': 611,
23980    'onesuperior': 333,
23981    'imacron': 278,
23982    'Euro': 556
23983  },
23984  'Helvetica-BoldOblique': {
23985    'space': 278,
23986    'exclam': 333,
23987    'quotedbl': 474,
23988    'numbersign': 556,
23989    'dollar': 556,
23990    'percent': 889,
23991    'ampersand': 722,
23992    'quoteright': 278,
23993    'parenleft': 333,
23994    'parenright': 333,
23995    'asterisk': 389,
23996    'plus': 584,
23997    'comma': 278,
23998    'hyphen': 333,
23999    'period': 278,
24000    'slash': 278,
24001    'zero': 556,
24002    'one': 556,
24003    'two': 556,
24004    'three': 556,
24005    'four': 556,
24006    'five': 556,
24007    'six': 556,
24008    'seven': 556,
24009    'eight': 556,
24010    'nine': 556,
24011    'colon': 333,
24012    'semicolon': 333,
24013    'less': 584,
24014    'equal': 584,
24015    'greater': 584,
24016    'question': 611,
24017    'at': 975,
24018    'A': 722,
24019    'B': 722,
24020    'C': 722,
24021    'D': 722,
24022    'E': 667,
24023    'F': 611,
24024    'G': 778,
24025    'H': 722,
24026    'I': 278,
24027    'J': 556,
24028    'K': 722,
24029    'L': 611,
24030    'M': 833,
24031    'N': 722,
24032    'O': 778,
24033    'P': 667,
24034    'Q': 778,
24035    'R': 722,
24036    'S': 667,
24037    'T': 611,
24038    'U': 722,
24039    'V': 667,
24040    'W': 944,
24041    'X': 667,
24042    'Y': 667,
24043    'Z': 611,
24044    'bracketleft': 333,
24045    'backslash': 278,
24046    'bracketright': 333,
24047    'asciicircum': 584,
24048    'underscore': 556,
24049    'quoteleft': 278,
24050    'a': 556,
24051    'b': 611,
24052    'c': 556,
24053    'd': 611,
24054    'e': 556,
24055    'f': 333,
24056    'g': 611,
24057    'h': 611,
24058    'i': 278,
24059    'j': 278,
24060    'k': 556,
24061    'l': 278,
24062    'm': 889,
24063    'n': 611,
24064    'o': 611,
24065    'p': 611,
24066    'q': 611,
24067    'r': 389,
24068    's': 556,
24069    't': 333,
24070    'u': 611,
24071    'v': 556,
24072    'w': 778,
24073    'x': 556,
24074    'y': 556,
24075    'z': 500,
24076    'braceleft': 389,
24077    'bar': 280,
24078    'braceright': 389,
24079    'asciitilde': 584,
24080    'exclamdown': 333,
24081    'cent': 556,
24082    'sterling': 556,
24083    'fraction': 167,
24084    'yen': 556,
24085    'florin': 556,
24086    'section': 556,
24087    'currency': 556,
24088    'quotesingle': 238,
24089    'quotedblleft': 500,
24090    'guillemotleft': 556,
24091    'guilsinglleft': 333,
24092    'guilsinglright': 333,
24093    'fi': 611,
24094    'fl': 611,
24095    'endash': 556,
24096    'dagger': 556,
24097    'daggerdbl': 556,
24098    'periodcentered': 278,
24099    'paragraph': 556,
24100    'bullet': 350,
24101    'quotesinglbase': 278,
24102    'quotedblbase': 500,
24103    'quotedblright': 500,
24104    'guillemotright': 556,
24105    'ellipsis': 1000,
24106    'perthousand': 1000,
24107    'questiondown': 611,
24108    'grave': 333,
24109    'acute': 333,
24110    'circumflex': 333,
24111    'tilde': 333,
24112    'macron': 333,
24113    'breve': 333,
24114    'dotaccent': 333,
24115    'dieresis': 333,
24116    'ring': 333,
24117    'cedilla': 333,
24118    'hungarumlaut': 333,
24119    'ogonek': 333,
24120    'caron': 333,
24121    'emdash': 1000,
24122    'AE': 1000,
24123    'ordfeminine': 370,
24124    'Lslash': 611,
24125    'Oslash': 778,
24126    'OE': 1000,
24127    'ordmasculine': 365,
24128    'ae': 889,
24129    'dotlessi': 278,
24130    'lslash': 278,
24131    'oslash': 611,
24132    'oe': 944,
24133    'germandbls': 611,
24134    'Idieresis': 278,
24135    'eacute': 556,
24136    'abreve': 556,
24137    'uhungarumlaut': 611,
24138    'ecaron': 556,
24139    'Ydieresis': 667,
24140    'divide': 584,
24141    'Yacute': 667,
24142    'Acircumflex': 722,
24143    'aacute': 556,
24144    'Ucircumflex': 722,
24145    'yacute': 556,
24146    'scommaaccent': 556,
24147    'ecircumflex': 556,
24148    'Uring': 722,
24149    'Udieresis': 722,
24150    'aogonek': 556,
24151    'Uacute': 722,
24152    'uogonek': 611,
24153    'Edieresis': 667,
24154    'Dcroat': 722,
24155    'commaaccent': 250,
24156    'copyright': 737,
24157    'Emacron': 667,
24158    'ccaron': 556,
24159    'aring': 556,
24160    'Ncommaaccent': 722,
24161    'lacute': 278,
24162    'agrave': 556,
24163    'Tcommaaccent': 611,
24164    'Cacute': 722,
24165    'atilde': 556,
24166    'Edotaccent': 667,
24167    'scaron': 556,
24168    'scedilla': 556,
24169    'iacute': 278,
24170    'lozenge': 494,
24171    'Rcaron': 722,
24172    'Gcommaaccent': 778,
24173    'ucircumflex': 611,
24174    'acircumflex': 556,
24175    'Amacron': 722,
24176    'rcaron': 389,
24177    'ccedilla': 556,
24178    'Zdotaccent': 611,
24179    'Thorn': 667,
24180    'Omacron': 778,
24181    'Racute': 722,
24182    'Sacute': 667,
24183    'dcaron': 743,
24184    'Umacron': 722,
24185    'uring': 611,
24186    'threesuperior': 333,
24187    'Ograve': 778,
24188    'Agrave': 722,
24189    'Abreve': 722,
24190    'multiply': 584,
24191    'uacute': 611,
24192    'Tcaron': 611,
24193    'partialdiff': 494,
24194    'ydieresis': 556,
24195    'Nacute': 722,
24196    'icircumflex': 278,
24197    'Ecircumflex': 667,
24198    'adieresis': 556,
24199    'edieresis': 556,
24200    'cacute': 556,
24201    'nacute': 611,
24202    'umacron': 611,
24203    'Ncaron': 722,
24204    'Iacute': 278,
24205    'plusminus': 584,
24206    'brokenbar': 280,
24207    'registered': 737,
24208    'Gbreve': 778,
24209    'Idotaccent': 278,
24210    'summation': 600,
24211    'Egrave': 667,
24212    'racute': 389,
24213    'omacron': 611,
24214    'Zacute': 611,
24215    'Zcaron': 611,
24216    'greaterequal': 549,
24217    'Eth': 722,
24218    'Ccedilla': 722,
24219    'lcommaaccent': 278,
24220    'tcaron': 389,
24221    'eogonek': 556,
24222    'Uogonek': 722,
24223    'Aacute': 722,
24224    'Adieresis': 722,
24225    'egrave': 556,
24226    'zacute': 500,
24227    'iogonek': 278,
24228    'Oacute': 778,
24229    'oacute': 611,
24230    'amacron': 556,
24231    'sacute': 556,
24232    'idieresis': 278,
24233    'Ocircumflex': 778,
24234    'Ugrave': 722,
24235    'Delta': 612,
24236    'thorn': 611,
24237    'twosuperior': 333,
24238    'Odieresis': 778,
24239    'mu': 611,
24240    'igrave': 278,
24241    'ohungarumlaut': 611,
24242    'Eogonek': 667,
24243    'dcroat': 611,
24244    'threequarters': 834,
24245    'Scedilla': 667,
24246    'lcaron': 400,
24247    'Kcommaaccent': 722,
24248    'Lacute': 611,
24249    'trademark': 1000,
24250    'edotaccent': 556,
24251    'Igrave': 278,
24252    'Imacron': 278,
24253    'Lcaron': 611,
24254    'onehalf': 834,
24255    'lessequal': 549,
24256    'ocircumflex': 611,
24257    'ntilde': 611,
24258    'Uhungarumlaut': 722,
24259    'Eacute': 667,
24260    'emacron': 556,
24261    'gbreve': 611,
24262    'onequarter': 834,
24263    'Scaron': 667,
24264    'Scommaaccent': 667,
24265    'Ohungarumlaut': 778,
24266    'degree': 400,
24267    'ograve': 611,
24268    'Ccaron': 722,
24269    'ugrave': 611,
24270    'radical': 549,
24271    'Dcaron': 722,
24272    'rcommaaccent': 389,
24273    'Ntilde': 722,
24274    'otilde': 611,
24275    'Rcommaaccent': 722,
24276    'Lcommaaccent': 611,
24277    'Atilde': 722,
24278    'Aogonek': 722,
24279    'Aring': 722,
24280    'Otilde': 778,
24281    'zdotaccent': 500,
24282    'Ecaron': 667,
24283    'Iogonek': 278,
24284    'kcommaaccent': 556,
24285    'minus': 584,
24286    'Icircumflex': 278,
24287    'ncaron': 611,
24288    'tcommaaccent': 333,
24289    'logicalnot': 584,
24290    'odieresis': 611,
24291    'udieresis': 611,
24292    'notequal': 549,
24293    'gcommaaccent': 611,
24294    'eth': 611,
24295    'zcaron': 500,
24296    'ncommaaccent': 611,
24297    'onesuperior': 333,
24298    'imacron': 278,
24299    'Euro': 556
24300  },
24301  'Helvetica-Oblique' : {
24302    'space': 278,
24303    'exclam': 278,
24304    'quotedbl': 355,
24305    'numbersign': 556,
24306    'dollar': 556,
24307    'percent': 889,
24308    'ampersand': 667,
24309    'quoteright': 222,
24310    'parenleft': 333,
24311    'parenright': 333,
24312    'asterisk': 389,
24313    'plus': 584,
24314    'comma': 278,
24315    'hyphen': 333,
24316    'period': 278,
24317    'slash': 278,
24318    'zero': 556,
24319    'one': 556,
24320    'two': 556,
24321    'three': 556,
24322    'four': 556,
24323    'five': 556,
24324    'six': 556,
24325    'seven': 556,
24326    'eight': 556,
24327    'nine': 556,
24328    'colon': 278,
24329    'semicolon': 278,
24330    'less': 584,
24331    'equal': 584,
24332    'greater': 584,
24333    'question': 556,
24334    'at': 1015,
24335    'A': 667,
24336    'B': 667,
24337    'C': 722,
24338    'D': 722,
24339    'E': 667,
24340    'F': 611,
24341    'G': 778,
24342    'H': 722,
24343    'I': 278,
24344    'J': 500,
24345    'K': 667,
24346    'L': 556,
24347    'M': 833,
24348    'N': 722,
24349    'O': 778,
24350    'P': 667,
24351    'Q': 778,
24352    'R': 722,
24353    'S': 667,
24354    'T': 611,
24355    'U': 722,
24356    'V': 667,
24357    'W': 944,
24358    'X': 667,
24359    'Y': 667,
24360    'Z': 611,
24361    'bracketleft': 278,
24362    'backslash': 278,
24363    'bracketright': 278,
24364    'asciicircum': 469,
24365    'underscore': 556,
24366    'quoteleft': 222,
24367    'a': 556,
24368    'b': 556,
24369    'c': 500,
24370    'd': 556,
24371    'e': 556,
24372    'f': 278,
24373    'g': 556,
24374    'h': 556,
24375    'i': 222,
24376    'j': 222,
24377    'k': 500,
24378    'l': 222,
24379    'm': 833,
24380    'n': 556,
24381    'o': 556,
24382    'p': 556,
24383    'q': 556,
24384    'r': 333,
24385    's': 500,
24386    't': 278,
24387    'u': 556,
24388    'v': 500,
24389    'w': 722,
24390    'x': 500,
24391    'y': 500,
24392    'z': 500,
24393    'braceleft': 334,
24394    'bar': 260,
24395    'braceright': 334,
24396    'asciitilde': 584,
24397    'exclamdown': 333,
24398    'cent': 556,
24399    'sterling': 556,
24400    'fraction': 167,
24401    'yen': 556,
24402    'florin': 556,
24403    'section': 556,
24404    'currency': 556,
24405    'quotesingle': 191,
24406    'quotedblleft': 333,
24407    'guillemotleft': 556,
24408    'guilsinglleft': 333,
24409    'guilsinglright': 333,
24410    'fi': 500,
24411    'fl': 500,
24412    'endash': 556,
24413    'dagger': 556,
24414    'daggerdbl': 556,
24415    'periodcentered': 278,
24416    'paragraph': 537,
24417    'bullet': 350,
24418    'quotesinglbase': 222,
24419    'quotedblbase': 333,
24420    'quotedblright': 333,
24421    'guillemotright': 556,
24422    'ellipsis': 1000,
24423    'perthousand': 1000,
24424    'questiondown': 611,
24425    'grave': 333,
24426    'acute': 333,
24427    'circumflex': 333,
24428    'tilde': 333,
24429    'macron': 333,
24430    'breve': 333,
24431    'dotaccent': 333,
24432    'dieresis': 333,
24433    'ring': 333,
24434    'cedilla': 333,
24435    'hungarumlaut': 333,
24436    'ogonek': 333,
24437    'caron': 333,
24438    'emdash': 1000,
24439    'AE': 1000,
24440    'ordfeminine': 370,
24441    'Lslash': 556,
24442    'Oslash': 778,
24443    'OE': 1000,
24444    'ordmasculine': 365,
24445    'ae': 889,
24446    'dotlessi': 278,
24447    'lslash': 222,
24448    'oslash': 611,
24449    'oe': 944,
24450    'germandbls': 611,
24451    'Idieresis': 278,
24452    'eacute': 556,
24453    'abreve': 556,
24454    'uhungarumlaut': 556,
24455    'ecaron': 556,
24456    'Ydieresis': 667,
24457    'divide': 584,
24458    'Yacute': 667,
24459    'Acircumflex': 667,
24460    'aacute': 556,
24461    'Ucircumflex': 722,
24462    'yacute': 500,
24463    'scommaaccent': 500,
24464    'ecircumflex': 556,
24465    'Uring': 722,
24466    'Udieresis': 722,
24467    'aogonek': 556,
24468    'Uacute': 722,
24469    'uogonek': 556,
24470    'Edieresis': 667,
24471    'Dcroat': 722,
24472    'commaaccent': 250,
24473    'copyright': 737,
24474    'Emacron': 667,
24475    'ccaron': 500,
24476    'aring': 556,
24477    'Ncommaaccent': 722,
24478    'lacute': 222,
24479    'agrave': 556,
24480    'Tcommaaccent': 611,
24481    'Cacute': 722,
24482    'atilde': 556,
24483    'Edotaccent': 667,
24484    'scaron': 500,
24485    'scedilla': 500,
24486    'iacute': 278,
24487    'lozenge': 471,
24488    'Rcaron': 722,
24489    'Gcommaaccent': 778,
24490    'ucircumflex': 556,
24491    'acircumflex': 556,
24492    'Amacron': 667,
24493    'rcaron': 333,
24494    'ccedilla': 500,
24495    'Zdotaccent': 611,
24496    'Thorn': 667,
24497    'Omacron': 778,
24498    'Racute': 722,
24499    'Sacute': 667,
24500    'dcaron': 643,
24501    'Umacron': 722,
24502    'uring': 556,
24503    'threesuperior': 333,
24504    'Ograve': 778,
24505    'Agrave': 667,
24506    'Abreve': 667,
24507    'multiply': 584,
24508    'uacute': 556,
24509    'Tcaron': 611,
24510    'partialdiff': 476,
24511    'ydieresis': 500,
24512    'Nacute': 722,
24513    'icircumflex': 278,
24514    'Ecircumflex': 667,
24515    'adieresis': 556,
24516    'edieresis': 556,
24517    'cacute': 500,
24518    'nacute': 556,
24519    'umacron': 556,
24520    'Ncaron': 722,
24521    'Iacute': 278,
24522    'plusminus': 584,
24523    'brokenbar': 260,
24524    'registered': 737,
24525    'Gbreve': 778,
24526    'Idotaccent': 278,
24527    'summation': 600,
24528    'Egrave': 667,
24529    'racute': 333,
24530    'omacron': 556,
24531    'Zacute': 611,
24532    'Zcaron': 611,
24533    'greaterequal': 549,
24534    'Eth': 722,
24535    'Ccedilla': 722,
24536    'lcommaaccent': 222,
24537    'tcaron': 317,
24538    'eogonek': 556,
24539    'Uogonek': 722,
24540    'Aacute': 667,
24541    'Adieresis': 667,
24542    'egrave': 556,
24543    'zacute': 500,
24544    'iogonek': 222,
24545    'Oacute': 778,
24546    'oacute': 556,
24547    'amacron': 556,
24548    'sacute': 500,
24549    'idieresis': 278,
24550    'Ocircumflex': 778,
24551    'Ugrave': 722,
24552    'Delta': 612,
24553    'thorn': 556,
24554    'twosuperior': 333,
24555    'Odieresis': 778,
24556    'mu': 556,
24557    'igrave': 278,
24558    'ohungarumlaut': 556,
24559    'Eogonek': 667,
24560    'dcroat': 556,
24561    'threequarters': 834,
24562    'Scedilla': 667,
24563    'lcaron': 299,
24564    'Kcommaaccent': 667,
24565    'Lacute': 556,
24566    'trademark': 1000,
24567    'edotaccent': 556,
24568    'Igrave': 278,
24569    'Imacron': 278,
24570    'Lcaron': 556,
24571    'onehalf': 834,
24572    'lessequal': 549,
24573    'ocircumflex': 556,
24574    'ntilde': 556,
24575    'Uhungarumlaut': 722,
24576    'Eacute': 667,
24577    'emacron': 556,
24578    'gbreve': 556,
24579    'onequarter': 834,
24580    'Scaron': 667,
24581    'Scommaaccent': 667,
24582    'Ohungarumlaut': 778,
24583    'degree': 400,
24584    'ograve': 556,
24585    'Ccaron': 722,
24586    'ugrave': 556,
24587    'radical': 453,
24588    'Dcaron': 722,
24589    'rcommaaccent': 333,
24590    'Ntilde': 722,
24591    'otilde': 556,
24592    'Rcommaaccent': 722,
24593    'Lcommaaccent': 556,
24594    'Atilde': 667,
24595    'Aogonek': 667,
24596    'Aring': 667,
24597    'Otilde': 778,
24598    'zdotaccent': 500,
24599    'Ecaron': 667,
24600    'Iogonek': 278,
24601    'kcommaaccent': 500,
24602    'minus': 584,
24603    'Icircumflex': 278,
24604    'ncaron': 556,
24605    'tcommaaccent': 278,
24606    'logicalnot': 584,
24607    'odieresis': 556,
24608    'udieresis': 556,
24609    'notequal': 549,
24610    'gcommaaccent': 556,
24611    'eth': 556,
24612    'zcaron': 500,
24613    'ncommaaccent': 556,
24614    'onesuperior': 333,
24615    'imacron': 278,
24616    'Euro': 556
24617  },
24618  'Symbol': {
24619    'space': 250,
24620    'exclam': 333,
24621    'universal': 713,
24622    'numbersign': 500,
24623    'existential': 549,
24624    'percent': 833,
24625    'ampersand': 778,
24626    'suchthat': 439,
24627    'parenleft': 333,
24628    'parenright': 333,
24629    'asteriskmath': 500,
24630    'plus': 549,
24631    'comma': 250,
24632    'minus': 549,
24633    'period': 250,
24634    'slash': 278,
24635    'zero': 500,
24636    'one': 500,
24637    'two': 500,
24638    'three': 500,
24639    'four': 500,
24640    'five': 500,
24641    'six': 500,
24642    'seven': 500,
24643    'eight': 500,
24644    'nine': 500,
24645    'colon': 278,
24646    'semicolon': 278,
24647    'less': 549,
24648    'equal': 549,
24649    'greater': 549,
24650    'question': 444,
24651    'congruent': 549,
24652    'Alpha': 722,
24653    'Beta': 667,
24654    'Chi': 722,
24655    'Delta': 612,
24656    'Epsilon': 611,
24657    'Phi': 763,
24658    'Gamma': 603,
24659    'Eta': 722,
24660    'Iota': 333,
24661    'theta1': 631,
24662    'Kappa': 722,
24663    'Lambda': 686,
24664    'Mu': 889,
24665    'Nu': 722,
24666    'Omicron': 722,
24667    'Pi': 768,
24668    'Theta': 741,
24669    'Rho': 556,
24670    'Sigma': 592,
24671    'Tau': 611,
24672    'Upsilon': 690,
24673    'sigma1': 439,
24674    'Omega': 768,
24675    'Xi': 645,
24676    'Psi': 795,
24677    'Zeta': 611,
24678    'bracketleft': 333,
24679    'therefore': 863,
24680    'bracketright': 333,
24681    'perpendicular': 658,
24682    'underscore': 500,
24683    'radicalex': 500,
24684    'alpha': 631,
24685    'beta': 549,
24686    'chi': 549,
24687    'delta': 494,
24688    'epsilon': 439,
24689    'phi': 521,
24690    'gamma': 411,
24691    'eta': 603,
24692    'iota': 329,
24693    'phi1': 603,
24694    'kappa': 549,
24695    'lambda': 549,
24696    'mu': 576,
24697    'nu': 521,
24698    'omicron': 549,
24699    'pi': 549,
24700    'theta': 521,
24701    'rho': 549,
24702    'sigma': 603,
24703    'tau': 439,
24704    'upsilon': 576,
24705    'omega1': 713,
24706    'omega': 686,
24707    'xi': 493,
24708    'psi': 686,
24709    'zeta': 494,
24710    'braceleft': 480,
24711    'bar': 200,
24712    'braceright': 480,
24713    'similar': 549,
24714    'Euro': 750,
24715    'Upsilon1': 620,
24716    'minute': 247,
24717    'lessequal': 549,
24718    'fraction': 167,
24719    'infinity': 713,
24720    'florin': 500,
24721    'club': 753,
24722    'diamond': 753,
24723    'heart': 753,
24724    'spade': 753,
24725    'arrowboth': 1042,
24726    'arrowleft': 987,
24727    'arrowup': 603,
24728    'arrowright': 987,
24729    'arrowdown': 603,
24730    'degree': 400,
24731    'plusminus': 549,
24732    'second': 411,
24733    'greaterequal': 549,
24734    'multiply': 549,
24735    'proportional': 713,
24736    'partialdiff': 494,
24737    'bullet': 460,
24738    'divide': 549,
24739    'notequal': 549,
24740    'equivalence': 549,
24741    'approxequal': 549,
24742    'ellipsis': 1000,
24743    'arrowvertex': 603,
24744    'arrowhorizex': 1000,
24745    'carriagereturn': 658,
24746    'aleph': 823,
24747    'Ifraktur': 686,
24748    'Rfraktur': 795,
24749    'weierstrass': 987,
24750    'circlemultiply': 768,
24751    'circleplus': 768,
24752    'emptyset': 823,
24753    'intersection': 768,
24754    'union': 768,
24755    'propersuperset': 713,
24756    'reflexsuperset': 713,
24757    'notsubset': 713,
24758    'propersubset': 713,
24759    'reflexsubset': 713,
24760    'element': 713,
24761    'notelement': 713,
24762    'angle': 768,
24763    'gradient': 713,
24764    'registerserif': 790,
24765    'copyrightserif': 790,
24766    'trademarkserif': 890,
24767    'product': 823,
24768    'radical': 549,
24769    'dotmath': 250,
24770    'logicalnot': 713,
24771    'logicaland': 603,
24772    'logicalor': 603,
24773    'arrowdblboth': 1042,
24774    'arrowdblleft': 987,
24775    'arrowdblup': 603,
24776    'arrowdblright': 987,
24777    'arrowdbldown': 603,
24778    'lozenge': 494,
24779    'angleleft': 329,
24780    'registersans': 790,
24781    'copyrightsans': 790,
24782    'trademarksans': 786,
24783    'summation': 713,
24784    'parenlefttp': 384,
24785    'parenleftex': 384,
24786    'parenleftbt': 384,
24787    'bracketlefttp': 384,
24788    'bracketleftex': 384,
24789    'bracketleftbt': 384,
24790    'bracelefttp': 494,
24791    'braceleftmid': 494,
24792    'braceleftbt': 494,
24793    'braceex': 494,
24794    'angleright': 329,
24795    'integral': 274,
24796    'integraltp': 686,
24797    'integralex': 686,
24798    'integralbt': 686,
24799    'parenrighttp': 384,
24800    'parenrightex': 384,
24801    'parenrightbt': 384,
24802    'bracketrighttp': 384,
24803    'bracketrightex': 384,
24804    'bracketrightbt': 384,
24805    'bracerighttp': 494,
24806    'bracerightmid': 494,
24807    'bracerightbt': 494,
24808    'apple': 790
24809  },
24810  'Times-Roman': {
24811    'space': 250,
24812    'exclam': 333,
24813    'quotedbl': 408,
24814    'numbersign': 500,
24815    'dollar': 500,
24816    'percent': 833,
24817    'ampersand': 778,
24818    'quoteright': 333,
24819    'parenleft': 333,
24820    'parenright': 333,
24821    'asterisk': 500,
24822    'plus': 564,
24823    'comma': 250,
24824    'hyphen': 333,
24825    'period': 250,
24826    'slash': 278,
24827    'zero': 500,
24828    'one': 500,
24829    'two': 500,
24830    'three': 500,
24831    'four': 500,
24832    'five': 500,
24833    'six': 500,
24834    'seven': 500,
24835    'eight': 500,
24836    'nine': 500,
24837    'colon': 278,
24838    'semicolon': 278,
24839    'less': 564,
24840    'equal': 564,
24841    'greater': 564,
24842    'question': 444,
24843    'at': 921,
24844    'A': 722,
24845    'B': 667,
24846    'C': 667,
24847    'D': 722,
24848    'E': 611,
24849    'F': 556,
24850    'G': 722,
24851    'H': 722,
24852    'I': 333,
24853    'J': 389,
24854    'K': 722,
24855    'L': 611,
24856    'M': 889,
24857    'N': 722,
24858    'O': 722,
24859    'P': 556,
24860    'Q': 722,
24861    'R': 667,
24862    'S': 556,
24863    'T': 611,
24864    'U': 722,
24865    'V': 722,
24866    'W': 944,
24867    'X': 722,
24868    'Y': 722,
24869    'Z': 611,
24870    'bracketleft': 333,
24871    'backslash': 278,
24872    'bracketright': 333,
24873    'asciicircum': 469,
24874    'underscore': 500,
24875    'quoteleft': 333,
24876    'a': 444,
24877    'b': 500,
24878    'c': 444,
24879    'd': 500,
24880    'e': 444,
24881    'f': 333,
24882    'g': 500,
24883    'h': 500,
24884    'i': 278,
24885    'j': 278,
24886    'k': 500,
24887    'l': 278,
24888    'm': 778,
24889    'n': 500,
24890    'o': 500,
24891    'p': 500,
24892    'q': 500,
24893    'r': 333,
24894    's': 389,
24895    't': 278,
24896    'u': 500,
24897    'v': 500,
24898    'w': 722,
24899    'x': 500,
24900    'y': 500,
24901    'z': 444,
24902    'braceleft': 480,
24903    'bar': 200,
24904    'braceright': 480,
24905    'asciitilde': 541,
24906    'exclamdown': 333,
24907    'cent': 500,
24908    'sterling': 500,
24909    'fraction': 167,
24910    'yen': 500,
24911    'florin': 500,
24912    'section': 500,
24913    'currency': 500,
24914    'quotesingle': 180,
24915    'quotedblleft': 444,
24916    'guillemotleft': 500,
24917    'guilsinglleft': 333,
24918    'guilsinglright': 333,
24919    'fi': 556,
24920    'fl': 556,
24921    'endash': 500,
24922    'dagger': 500,
24923    'daggerdbl': 500,
24924    'periodcentered': 250,
24925    'paragraph': 453,
24926    'bullet': 350,
24927    'quotesinglbase': 333,
24928    'quotedblbase': 444,
24929    'quotedblright': 444,
24930    'guillemotright': 500,
24931    'ellipsis': 1000,
24932    'perthousand': 1000,
24933    'questiondown': 444,
24934    'grave': 333,
24935    'acute': 333,
24936    'circumflex': 333,
24937    'tilde': 333,
24938    'macron': 333,
24939    'breve': 333,
24940    'dotaccent': 333,
24941    'dieresis': 333,
24942    'ring': 333,
24943    'cedilla': 333,
24944    'hungarumlaut': 333,
24945    'ogonek': 333,
24946    'caron': 333,
24947    'emdash': 1000,
24948    'AE': 889,
24949    'ordfeminine': 276,
24950    'Lslash': 611,
24951    'Oslash': 722,
24952    'OE': 889,
24953    'ordmasculine': 310,
24954    'ae': 667,
24955    'dotlessi': 278,
24956    'lslash': 278,
24957    'oslash': 500,
24958    'oe': 722,
24959    'germandbls': 500,
24960    'Idieresis': 333,
24961    'eacute': 444,
24962    'abreve': 444,
24963    'uhungarumlaut': 500,
24964    'ecaron': 444,
24965    'Ydieresis': 722,
24966    'divide': 564,
24967    'Yacute': 722,
24968    'Acircumflex': 722,
24969    'aacute': 444,
24970    'Ucircumflex': 722,
24971    'yacute': 500,
24972    'scommaaccent': 389,
24973    'ecircumflex': 444,
24974    'Uring': 722,
24975    'Udieresis': 722,
24976    'aogonek': 444,
24977    'Uacute': 722,
24978    'uogonek': 500,
24979    'Edieresis': 611,
24980    'Dcroat': 722,
24981    'commaaccent': 250,
24982    'copyright': 760,
24983    'Emacron': 611,
24984    'ccaron': 444,
24985    'aring': 444,
24986    'Ncommaaccent': 722,
24987    'lacute': 278,
24988    'agrave': 444,
24989    'Tcommaaccent': 611,
24990    'Cacute': 667,
24991    'atilde': 444,
24992    'Edotaccent': 611,
24993    'scaron': 389,
24994    'scedilla': 389,
24995    'iacute': 278,
24996    'lozenge': 471,
24997    'Rcaron': 667,
24998    'Gcommaaccent': 722,
24999    'ucircumflex': 500,
25000    'acircumflex': 444,
25001    'Amacron': 722,
25002    'rcaron': 333,
25003    'ccedilla': 444,
25004    'Zdotaccent': 611,
25005    'Thorn': 556,
25006    'Omacron': 722,
25007    'Racute': 667,
25008    'Sacute': 556,
25009    'dcaron': 588,
25010    'Umacron': 722,
25011    'uring': 500,
25012    'threesuperior': 300,
25013    'Ograve': 722,
25014    'Agrave': 722,
25015    'Abreve': 722,
25016    'multiply': 564,
25017    'uacute': 500,
25018    'Tcaron': 611,
25019    'partialdiff': 476,
25020    'ydieresis': 500,
25021    'Nacute': 722,
25022    'icircumflex': 278,
25023    'Ecircumflex': 611,
25024    'adieresis': 444,
25025    'edieresis': 444,
25026    'cacute': 444,
25027    'nacute': 500,
25028    'umacron': 500,
25029    'Ncaron': 722,
25030    'Iacute': 333,
25031    'plusminus': 564,
25032    'brokenbar': 200,
25033    'registered': 760,
25034    'Gbreve': 722,
25035    'Idotaccent': 333,
25036    'summation': 600,
25037    'Egrave': 611,
25038    'racute': 333,
25039    'omacron': 500,
25040    'Zacute': 611,
25041    'Zcaron': 611,
25042    'greaterequal': 549,
25043    'Eth': 722,
25044    'Ccedilla': 667,
25045    'lcommaaccent': 278,
25046    'tcaron': 326,
25047    'eogonek': 444,
25048    'Uogonek': 722,
25049    'Aacute': 722,
25050    'Adieresis': 722,
25051    'egrave': 444,
25052    'zacute': 444,
25053    'iogonek': 278,
25054    'Oacute': 722,
25055    'oacute': 500,
25056    'amacron': 444,
25057    'sacute': 389,
25058    'idieresis': 278,
25059    'Ocircumflex': 722,
25060    'Ugrave': 722,
25061    'Delta': 612,
25062    'thorn': 500,
25063    'twosuperior': 300,
25064    'Odieresis': 722,
25065    'mu': 500,
25066    'igrave': 278,
25067    'ohungarumlaut': 500,
25068    'Eogonek': 611,
25069    'dcroat': 500,
25070    'threequarters': 750,
25071    'Scedilla': 556,
25072    'lcaron': 344,
25073    'Kcommaaccent': 722,
25074    'Lacute': 611,
25075    'trademark': 980,
25076    'edotaccent': 444,
25077    'Igrave': 333,
25078    'Imacron': 333,
25079    'Lcaron': 611,
25080    'onehalf': 750,
25081    'lessequal': 549,
25082    'ocircumflex': 500,
25083    'ntilde': 500,
25084    'Uhungarumlaut': 722,
25085    'Eacute': 611,
25086    'emacron': 444,
25087    'gbreve': 500,
25088    'onequarter': 750,
25089    'Scaron': 556,
25090    'Scommaaccent': 556,
25091    'Ohungarumlaut': 722,
25092    'degree': 400,
25093    'ograve': 500,
25094    'Ccaron': 667,
25095    'ugrave': 500,
25096    'radical': 453,
25097    'Dcaron': 722,
25098    'rcommaaccent': 333,
25099    'Ntilde': 722,
25100    'otilde': 500,
25101    'Rcommaaccent': 667,
25102    'Lcommaaccent': 611,
25103    'Atilde': 722,
25104    'Aogonek': 722,
25105    'Aring': 722,
25106    'Otilde': 722,
25107    'zdotaccent': 444,
25108    'Ecaron': 611,
25109    'Iogonek': 333,
25110    'kcommaaccent': 500,
25111    'minus': 564,
25112    'Icircumflex': 333,
25113    'ncaron': 500,
25114    'tcommaaccent': 278,
25115    'logicalnot': 564,
25116    'odieresis': 500,
25117    'udieresis': 500,
25118    'notequal': 549,
25119    'gcommaaccent': 500,
25120    'eth': 500,
25121    'zcaron': 444,
25122    'ncommaaccent': 500,
25123    'onesuperior': 300,
25124    'imacron': 278,
25125    'Euro': 500
25126  },
25127  'Times-Bold': {
25128    'space': 250,
25129    'exclam': 333,
25130    'quotedbl': 555,
25131    'numbersign': 500,
25132    'dollar': 500,
25133    'percent': 1000,
25134    'ampersand': 833,
25135    'quoteright': 333,
25136    'parenleft': 333,
25137    'parenright': 333,
25138    'asterisk': 500,
25139    'plus': 570,
25140    'comma': 250,
25141    'hyphen': 333,
25142    'period': 250,
25143    'slash': 278,
25144    'zero': 500,
25145    'one': 500,
25146    'two': 500,
25147    'three': 500,
25148    'four': 500,
25149    'five': 500,
25150    'six': 500,
25151    'seven': 500,
25152    'eight': 500,
25153    'nine': 500,
25154    'colon': 333,
25155    'semicolon': 333,
25156    'less': 570,
25157    'equal': 570,
25158    'greater': 570,
25159    'question': 500,
25160    'at': 930,
25161    'A': 722,
25162    'B': 667,
25163    'C': 722,
25164    'D': 722,
25165    'E': 667,
25166    'F': 611,
25167    'G': 778,
25168    'H': 778,
25169    'I': 389,
25170    'J': 500,
25171    'K': 778,
25172    'L': 667,
25173    'M': 944,
25174    'N': 722,
25175    'O': 778,
25176    'P': 611,
25177    'Q': 778,
25178    'R': 722,
25179    'S': 556,
25180    'T': 667,
25181    'U': 722,
25182    'V': 722,
25183    'W': 1000,
25184    'X': 722,
25185    'Y': 722,
25186    'Z': 667,
25187    'bracketleft': 333,
25188    'backslash': 278,
25189    'bracketright': 333,
25190    'asciicircum': 581,
25191    'underscore': 500,
25192    'quoteleft': 333,
25193    'a': 500,
25194    'b': 556,
25195    'c': 444,
25196    'd': 556,
25197    'e': 444,
25198    'f': 333,
25199    'g': 500,
25200    'h': 556,
25201    'i': 278,
25202    'j': 333,
25203    'k': 556,
25204    'l': 278,
25205    'm': 833,
25206    'n': 556,
25207    'o': 500,
25208    'p': 556,
25209    'q': 556,
25210    'r': 444,
25211    's': 389,
25212    't': 333,
25213    'u': 556,
25214    'v': 500,
25215    'w': 722,
25216    'x': 500,
25217    'y': 500,
25218    'z': 444,
25219    'braceleft': 394,
25220    'bar': 220,
25221    'braceright': 394,
25222    'asciitilde': 520,
25223    'exclamdown': 333,
25224    'cent': 500,
25225    'sterling': 500,
25226    'fraction': 167,
25227    'yen': 500,
25228    'florin': 500,
25229    'section': 500,
25230    'currency': 500,
25231    'quotesingle': 278,
25232    'quotedblleft': 500,
25233    'guillemotleft': 500,
25234    'guilsinglleft': 333,
25235    'guilsinglright': 333,
25236    'fi': 556,
25237    'fl': 556,
25238    'endash': 500,
25239    'dagger': 500,
25240    'daggerdbl': 500,
25241    'periodcentered': 250,
25242    'paragraph': 540,
25243    'bullet': 350,
25244    'quotesinglbase': 333,
25245    'quotedblbase': 500,
25246    'quotedblright': 500,
25247    'guillemotright': 500,
25248    'ellipsis': 1000,
25249    'perthousand': 1000,
25250    'questiondown': 500,
25251    'grave': 333,
25252    'acute': 333,
25253    'circumflex': 333,
25254    'tilde': 333,
25255    'macron': 333,
25256    'breve': 333,
25257    'dotaccent': 333,
25258    'dieresis': 333,
25259    'ring': 333,
25260    'cedilla': 333,
25261    'hungarumlaut': 333,
25262    'ogonek': 333,
25263    'caron': 333,
25264    'emdash': 1000,
25265    'AE': 1000,
25266    'ordfeminine': 300,
25267    'Lslash': 667,
25268    'Oslash': 778,
25269    'OE': 1000,
25270    'ordmasculine': 330,
25271    'ae': 722,
25272    'dotlessi': 278,
25273    'lslash': 278,
25274    'oslash': 500,
25275    'oe': 722,
25276    'germandbls': 556,
25277    'Idieresis': 389,
25278    'eacute': 444,
25279    'abreve': 500,
25280    'uhungarumlaut': 556,
25281    'ecaron': 444,
25282    'Ydieresis': 722,
25283    'divide': 570,
25284    'Yacute': 722,
25285    'Acircumflex': 722,
25286    'aacute': 500,
25287    'Ucircumflex': 722,
25288    'yacute': 500,
25289    'scommaaccent': 389,
25290    'ecircumflex': 444,
25291    'Uring': 722,
25292    'Udieresis': 722,
25293    'aogonek': 500,
25294    'Uacute': 722,
25295    'uogonek': 556,
25296    'Edieresis': 667,
25297    'Dcroat': 722,
25298    'commaaccent': 250,
25299    'copyright': 747,
25300    'Emacron': 667,
25301    'ccaron': 444,
25302    'aring': 500,
25303    'Ncommaaccent': 722,
25304    'lacute': 278,
25305    'agrave': 500,
25306    'Tcommaaccent': 667,
25307    'Cacute': 722,
25308    'atilde': 500,
25309    'Edotaccent': 667,
25310    'scaron': 389,
25311    'scedilla': 389,
25312    'iacute': 278,
25313    'lozenge': 494,
25314    'Rcaron': 722,
25315    'Gcommaaccent': 778,
25316    'ucircumflex': 556,
25317    'acircumflex': 500,
25318    'Amacron': 722,
25319    'rcaron': 444,
25320    'ccedilla': 444,
25321    'Zdotaccent': 667,
25322    'Thorn': 611,
25323    'Omacron': 778,
25324    'Racute': 722,
25325    'Sacute': 556,
25326    'dcaron': 672,
25327    'Umacron': 722,
25328    'uring': 556,
25329    'threesuperior': 300,
25330    'Ograve': 778,
25331    'Agrave': 722,
25332    'Abreve': 722,
25333    'multiply': 570,
25334    'uacute': 556,
25335    'Tcaron': 667,
25336    'partialdiff': 494,
25337    'ydieresis': 500,
25338    'Nacute': 722,
25339    'icircumflex': 278,
25340    'Ecircumflex': 667,
25341    'adieresis': 500,
25342    'edieresis': 444,
25343    'cacute': 444,
25344    'nacute': 556,
25345    'umacron': 556,
25346    'Ncaron': 722,
25347    'Iacute': 389,
25348    'plusminus': 570,
25349    'brokenbar': 220,
25350    'registered': 747,
25351    'Gbreve': 778,
25352    'Idotaccent': 389,
25353    'summation': 600,
25354    'Egrave': 667,
25355    'racute': 444,
25356    'omacron': 500,
25357    'Zacute': 667,
25358    'Zcaron': 667,
25359    'greaterequal': 549,
25360    'Eth': 722,
25361    'Ccedilla': 722,
25362    'lcommaaccent': 278,
25363    'tcaron': 416,
25364    'eogonek': 444,
25365    'Uogonek': 722,
25366    'Aacute': 722,
25367    'Adieresis': 722,
25368    'egrave': 444,
25369    'zacute': 444,
25370    'iogonek': 278,
25371    'Oacute': 778,
25372    'oacute': 500,
25373    'amacron': 500,
25374    'sacute': 389,
25375    'idieresis': 278,
25376    'Ocircumflex': 778,
25377    'Ugrave': 722,
25378    'Delta': 612,
25379    'thorn': 556,
25380    'twosuperior': 300,
25381    'Odieresis': 778,
25382    'mu': 556,
25383    'igrave': 278,
25384    'ohungarumlaut': 500,
25385    'Eogonek': 667,
25386    'dcroat': 556,
25387    'threequarters': 750,
25388    'Scedilla': 556,
25389    'lcaron': 394,
25390    'Kcommaaccent': 778,
25391    'Lacute': 667,
25392    'trademark': 1000,
25393    'edotaccent': 444,
25394    'Igrave': 389,
25395    'Imacron': 389,
25396    'Lcaron': 667,
25397    'onehalf': 750,
25398    'lessequal': 549,
25399    'ocircumflex': 500,
25400    'ntilde': 556,
25401    'Uhungarumlaut': 722,
25402    'Eacute': 667,
25403    'emacron': 444,
25404    'gbreve': 500,
25405    'onequarter': 750,
25406    'Scaron': 556,
25407    'Scommaaccent': 556,
25408    'Ohungarumlaut': 778,
25409    'degree': 400,
25410    'ograve': 500,
25411    'Ccaron': 722,
25412    'ugrave': 556,
25413    'radical': 549,
25414    'Dcaron': 722,
25415    'rcommaaccent': 444,
25416    'Ntilde': 722,
25417    'otilde': 500,
25418    'Rcommaaccent': 722,
25419    'Lcommaaccent': 667,
25420    'Atilde': 722,
25421    'Aogonek': 722,
25422    'Aring': 722,
25423    'Otilde': 778,
25424    'zdotaccent': 444,
25425    'Ecaron': 667,
25426    'Iogonek': 389,
25427    'kcommaaccent': 556,
25428    'minus': 570,
25429    'Icircumflex': 389,
25430    'ncaron': 556,
25431    'tcommaaccent': 333,
25432    'logicalnot': 570,
25433    'odieresis': 500,
25434    'udieresis': 556,
25435    'notequal': 549,
25436    'gcommaaccent': 500,
25437    'eth': 500,
25438    'zcaron': 444,
25439    'ncommaaccent': 556,
25440    'onesuperior': 300,
25441    'imacron': 278,
25442    'Euro': 500
25443  },
25444  'Times-BoldItalic': {
25445    'space': 250,
25446    'exclam': 389,
25447    'quotedbl': 555,
25448    'numbersign': 500,
25449    'dollar': 500,
25450    'percent': 833,
25451    'ampersand': 778,
25452    'quoteright': 333,
25453    'parenleft': 333,
25454    'parenright': 333,
25455    'asterisk': 500,
25456    'plus': 570,
25457    'comma': 250,
25458    'hyphen': 333,
25459    'period': 250,
25460    'slash': 278,
25461    'zero': 500,
25462    'one': 500,
25463    'two': 500,
25464    'three': 500,
25465    'four': 500,
25466    'five': 500,
25467    'six': 500,
25468    'seven': 500,
25469    'eight': 500,
25470    'nine': 500,
25471    'colon': 333,
25472    'semicolon': 333,
25473    'less': 570,
25474    'equal': 570,
25475    'greater': 570,
25476    'question': 500,
25477    'at': 832,
25478    'A': 667,
25479    'B': 667,
25480    'C': 667,
25481    'D': 722,
25482    'E': 667,
25483    'F': 667,
25484    'G': 722,
25485    'H': 778,
25486    'I': 389,
25487    'J': 500,
25488    'K': 667,
25489    'L': 611,
25490    'M': 889,
25491    'N': 722,
25492    'O': 722,
25493    'P': 611,
25494    'Q': 722,
25495    'R': 667,
25496    'S': 556,
25497    'T': 611,
25498    'U': 722,
25499    'V': 667,
25500    'W': 889,
25501    'X': 667,
25502    'Y': 611,
25503    'Z': 611,
25504    'bracketleft': 333,
25505    'backslash': 278,
25506    'bracketright': 333,
25507    'asciicircum': 570,
25508    'underscore': 500,
25509    'quoteleft': 333,
25510    'a': 500,
25511    'b': 500,
25512    'c': 444,
25513    'd': 500,
25514    'e': 444,
25515    'f': 333,
25516    'g': 500,
25517    'h': 556,
25518    'i': 278,
25519    'j': 278,
25520    'k': 500,
25521    'l': 278,
25522    'm': 778,
25523    'n': 556,
25524    'o': 500,
25525    'p': 500,
25526    'q': 500,
25527    'r': 389,
25528    's': 389,
25529    't': 278,
25530    'u': 556,
25531    'v': 444,
25532    'w': 667,
25533    'x': 500,
25534    'y': 444,
25535    'z': 389,
25536    'braceleft': 348,
25537    'bar': 220,
25538    'braceright': 348,
25539    'asciitilde': 570,
25540    'exclamdown': 389,
25541    'cent': 500,
25542    'sterling': 500,
25543    'fraction': 167,
25544    'yen': 500,
25545    'florin': 500,
25546    'section': 500,
25547    'currency': 500,
25548    'quotesingle': 278,
25549    'quotedblleft': 500,
25550    'guillemotleft': 500,
25551    'guilsinglleft': 333,
25552    'guilsinglright': 333,
25553    'fi': 556,
25554    'fl': 556,
25555    'endash': 500,
25556    'dagger': 500,
25557    'daggerdbl': 500,
25558    'periodcentered': 250,
25559    'paragraph': 500,
25560    'bullet': 350,
25561    'quotesinglbase': 333,
25562    'quotedblbase': 500,
25563    'quotedblright': 500,
25564    'guillemotright': 500,
25565    'ellipsis': 1000,
25566    'perthousand': 1000,
25567    'questiondown': 500,
25568    'grave': 333,
25569    'acute': 333,
25570    'circumflex': 333,
25571    'tilde': 333,
25572    'macron': 333,
25573    'breve': 333,
25574    'dotaccent': 333,
25575    'dieresis': 333,
25576    'ring': 333,
25577    'cedilla': 333,
25578    'hungarumlaut': 333,
25579    'ogonek': 333,
25580    'caron': 333,
25581    'emdash': 1000,
25582    'AE': 944,
25583    'ordfeminine': 266,
25584    'Lslash': 611,
25585    'Oslash': 722,
25586    'OE': 944,
25587    'ordmasculine': 300,
25588    'ae': 722,
25589    'dotlessi': 278,
25590    'lslash': 278,
25591    'oslash': 500,
25592    'oe': 722,
25593    'germandbls': 500,
25594    'Idieresis': 389,
25595    'eacute': 444,
25596    'abreve': 500,
25597    'uhungarumlaut': 556,
25598    'ecaron': 444,
25599    'Ydieresis': 611,
25600    'divide': 570,
25601    'Yacute': 611,
25602    'Acircumflex': 667,
25603    'aacute': 500,
25604    'Ucircumflex': 722,
25605    'yacute': 444,
25606    'scommaaccent': 389,
25607    'ecircumflex': 444,
25608    'Uring': 722,
25609    'Udieresis': 722,
25610    'aogonek': 500,
25611    'Uacute': 722,
25612    'uogonek': 556,
25613    'Edieresis': 667,
25614    'Dcroat': 722,
25615    'commaaccent': 250,
25616    'copyright': 747,
25617    'Emacron': 667,
25618    'ccaron': 444,
25619    'aring': 500,
25620    'Ncommaaccent': 722,
25621    'lacute': 278,
25622    'agrave': 500,
25623    'Tcommaaccent': 611,
25624    'Cacute': 667,
25625    'atilde': 500,
25626    'Edotaccent': 667,
25627    'scaron': 389,
25628    'scedilla': 389,
25629    'iacute': 278,
25630    'lozenge': 494,
25631    'Rcaron': 667,
25632    'Gcommaaccent': 722,
25633    'ucircumflex': 556,
25634    'acircumflex': 500,
25635    'Amacron': 667,
25636    'rcaron': 389,
25637    'ccedilla': 444,
25638    'Zdotaccent': 611,
25639    'Thorn': 611,
25640    'Omacron': 722,
25641    'Racute': 667,
25642    'Sacute': 556,
25643    'dcaron': 608,
25644    'Umacron': 722,
25645    'uring': 556,
25646    'threesuperior': 300,
25647    'Ograve': 722,
25648    'Agrave': 667,
25649    'Abreve': 667,
25650    'multiply': 570,
25651    'uacute': 556,
25652    'Tcaron': 611,
25653    'partialdiff': 494,
25654    'ydieresis': 444,
25655    'Nacute': 722,
25656    'icircumflex': 278,
25657    'Ecircumflex': 667,
25658    'adieresis': 500,
25659    'edieresis': 444,
25660    'cacute': 444,
25661    'nacute': 556,
25662    'umacron': 556,
25663    'Ncaron': 722,
25664    'Iacute': 389,
25665    'plusminus': 570,
25666    'brokenbar': 220,
25667    'registered': 747,
25668    'Gbreve': 722,
25669    'Idotaccent': 389,
25670    'summation': 600,
25671    'Egrave': 667,
25672    'racute': 389,
25673    'omacron': 500,
25674    'Zacute': 611,
25675    'Zcaron': 611,
25676    'greaterequal': 549,
25677    'Eth': 722,
25678    'Ccedilla': 667,
25679    'lcommaaccent': 278,
25680    'tcaron': 366,
25681    'eogonek': 444,
25682    'Uogonek': 722,
25683    'Aacute': 667,
25684    'Adieresis': 667,
25685    'egrave': 444,
25686    'zacute': 389,
25687    'iogonek': 278,
25688    'Oacute': 722,
25689    'oacute': 500,
25690    'amacron': 500,
25691    'sacute': 389,
25692    'idieresis': 278,
25693    'Ocircumflex': 722,
25694    'Ugrave': 722,
25695    'Delta': 612,
25696    'thorn': 500,
25697    'twosuperior': 300,
25698    'Odieresis': 722,
25699    'mu': 576,
25700    'igrave': 278,
25701    'ohungarumlaut': 500,
25702    'Eogonek': 667,
25703    'dcroat': 500,
25704    'threequarters': 750,
25705    'Scedilla': 556,
25706    'lcaron': 382,
25707    'Kcommaaccent': 667,
25708    'Lacute': 611,
25709    'trademark': 1000,
25710    'edotaccent': 444,
25711    'Igrave': 389,
25712    'Imacron': 389,
25713    'Lcaron': 611,
25714    'onehalf': 750,
25715    'lessequal': 549,
25716    'ocircumflex': 500,
25717    'ntilde': 556,
25718    'Uhungarumlaut': 722,
25719    'Eacute': 667,
25720    'emacron': 444,
25721    'gbreve': 500,
25722    'onequarter': 750,
25723    'Scaron': 556,
25724    'Scommaaccent': 556,
25725    'Ohungarumlaut': 722,
25726    'degree': 400,
25727    'ograve': 500,
25728    'Ccaron': 667,
25729    'ugrave': 556,
25730    'radical': 549,
25731    'Dcaron': 722,
25732    'rcommaaccent': 389,
25733    'Ntilde': 722,
25734    'otilde': 500,
25735    'Rcommaaccent': 667,
25736    'Lcommaaccent': 611,
25737    'Atilde': 667,
25738    'Aogonek': 667,
25739    'Aring': 667,
25740    'Otilde': 722,
25741    'zdotaccent': 389,
25742    'Ecaron': 667,
25743    'Iogonek': 389,
25744    'kcommaaccent': 500,
25745    'minus': 606,
25746    'Icircumflex': 389,
25747    'ncaron': 556,
25748    'tcommaaccent': 278,
25749    'logicalnot': 606,
25750    'odieresis': 500,
25751    'udieresis': 556,
25752    'notequal': 549,
25753    'gcommaaccent': 500,
25754    'eth': 500,
25755    'zcaron': 389,
25756    'ncommaaccent': 556,
25757    'onesuperior': 300,
25758    'imacron': 278,
25759    'Euro': 500
25760  },
25761  'Times-Italic': {
25762    'space': 250,
25763    'exclam': 333,
25764    'quotedbl': 420,
25765    'numbersign': 500,
25766    'dollar': 500,
25767    'percent': 833,
25768    'ampersand': 778,
25769    'quoteright': 333,
25770    'parenleft': 333,
25771    'parenright': 333,
25772    'asterisk': 500,
25773    'plus': 675,
25774    'comma': 250,
25775    'hyphen': 333,
25776    'period': 250,
25777    'slash': 278,
25778    'zero': 500,
25779    'one': 500,
25780    'two': 500,
25781    'three': 500,
25782    'four': 500,
25783    'five': 500,
25784    'six': 500,
25785    'seven': 500,
25786    'eight': 500,
25787    'nine': 500,
25788    'colon': 333,
25789    'semicolon': 333,
25790    'less': 675,
25791    'equal': 675,
25792    'greater': 675,
25793    'question': 500,
25794    'at': 920,
25795    'A': 611,
25796    'B': 611,
25797    'C': 667,
25798    'D': 722,
25799    'E': 611,
25800    'F': 611,
25801    'G': 722,
25802    'H': 722,
25803    'I': 333,
25804    'J': 444,
25805    'K': 667,
25806    'L': 556,
25807    'M': 833,
25808    'N': 667,
25809    'O': 722,
25810    'P': 611,
25811    'Q': 722,
25812    'R': 611,
25813    'S': 500,
25814    'T': 556,
25815    'U': 722,
25816    'V': 611,
25817    'W': 833,
25818    'X': 611,
25819    'Y': 556,
25820    'Z': 556,
25821    'bracketleft': 389,
25822    'backslash': 278,
25823    'bracketright': 389,
25824    'asciicircum': 422,
25825    'underscore': 500,
25826    'quoteleft': 333,
25827    'a': 500,
25828    'b': 500,
25829    'c': 444,
25830    'd': 500,
25831    'e': 444,
25832    'f': 278,
25833    'g': 500,
25834    'h': 500,
25835    'i': 278,
25836    'j': 278,
25837    'k': 444,
25838    'l': 278,
25839    'm': 722,
25840    'n': 500,
25841    'o': 500,
25842    'p': 500,
25843    'q': 500,
25844    'r': 389,
25845    's': 389,
25846    't': 278,
25847    'u': 500,
25848    'v': 444,
25849    'w': 667,
25850    'x': 444,
25851    'y': 444,
25852    'z': 389,
25853    'braceleft': 400,
25854    'bar': 275,
25855    'braceright': 400,
25856    'asciitilde': 541,
25857    'exclamdown': 389,
25858    'cent': 500,
25859    'sterling': 500,
25860    'fraction': 167,
25861    'yen': 500,
25862    'florin': 500,
25863    'section': 500,
25864    'currency': 500,
25865    'quotesingle': 214,
25866    'quotedblleft': 556,
25867    'guillemotleft': 500,
25868    'guilsinglleft': 333,
25869    'guilsinglright': 333,
25870    'fi': 500,
25871    'fl': 500,
25872    'endash': 500,
25873    'dagger': 500,
25874    'daggerdbl': 500,
25875    'periodcentered': 250,
25876    'paragraph': 523,
25877    'bullet': 350,
25878    'quotesinglbase': 333,
25879    'quotedblbase': 556,
25880    'quotedblright': 556,
25881    'guillemotright': 500,
25882    'ellipsis': 889,
25883    'perthousand': 1000,
25884    'questiondown': 500,
25885    'grave': 333,
25886    'acute': 333,
25887    'circumflex': 333,
25888    'tilde': 333,
25889    'macron': 333,
25890    'breve': 333,
25891    'dotaccent': 333,
25892    'dieresis': 333,
25893    'ring': 333,
25894    'cedilla': 333,
25895    'hungarumlaut': 333,
25896    'ogonek': 333,
25897    'caron': 333,
25898    'emdash': 889,
25899    'AE': 889,
25900    'ordfeminine': 276,
25901    'Lslash': 556,
25902    'Oslash': 722,
25903    'OE': 944,
25904    'ordmasculine': 310,
25905    'ae': 667,
25906    'dotlessi': 278,
25907    'lslash': 278,
25908    'oslash': 500,
25909    'oe': 667,
25910    'germandbls': 500,
25911    'Idieresis': 333,
25912    'eacute': 444,
25913    'abreve': 500,
25914    'uhungarumlaut': 500,
25915    'ecaron': 444,
25916    'Ydieresis': 556,
25917    'divide': 675,
25918    'Yacute': 556,
25919    'Acircumflex': 611,
25920    'aacute': 500,
25921    'Ucircumflex': 722,
25922    'yacute': 444,
25923    'scommaaccent': 389,
25924    'ecircumflex': 444,
25925    'Uring': 722,
25926    'Udieresis': 722,
25927    'aogonek': 500,
25928    'Uacute': 722,
25929    'uogonek': 500,
25930    'Edieresis': 611,
25931    'Dcroat': 722,
25932    'commaaccent': 250,
25933    'copyright': 760,
25934    'Emacron': 611,
25935    'ccaron': 444,
25936    'aring': 500,
25937    'Ncommaaccent': 667,
25938    'lacute': 278,
25939    'agrave': 500,
25940    'Tcommaaccent': 556,
25941    'Cacute': 667,
25942    'atilde': 500,
25943    'Edotaccent': 611,
25944    'scaron': 389,
25945    'scedilla': 389,
25946    'iacute': 278,
25947    'lozenge': 471,
25948    'Rcaron': 611,
25949    'Gcommaaccent': 722,
25950    'ucircumflex': 500,
25951    'acircumflex': 500,
25952    'Amacron': 611,
25953    'rcaron': 389,
25954    'ccedilla': 444,
25955    'Zdotaccent': 556,
25956    'Thorn': 611,
25957    'Omacron': 722,
25958    'Racute': 611,
25959    'Sacute': 500,
25960    'dcaron': 544,
25961    'Umacron': 722,
25962    'uring': 500,
25963    'threesuperior': 300,
25964    'Ograve': 722,
25965    'Agrave': 611,
25966    'Abreve': 611,
25967    'multiply': 675,
25968    'uacute': 500,
25969    'Tcaron': 556,
25970    'partialdiff': 476,
25971    'ydieresis': 444,
25972    'Nacute': 667,
25973    'icircumflex': 278,
25974    'Ecircumflex': 611,
25975    'adieresis': 500,
25976    'edieresis': 444,
25977    'cacute': 444,
25978    'nacute': 500,
25979    'umacron': 500,
25980    'Ncaron': 667,
25981    'Iacute': 333,
25982    'plusminus': 675,
25983    'brokenbar': 275,
25984    'registered': 760,
25985    'Gbreve': 722,
25986    'Idotaccent': 333,
25987    'summation': 600,
25988    'Egrave': 611,
25989    'racute': 389,
25990    'omacron': 500,
25991    'Zacute': 556,
25992    'Zcaron': 556,
25993    'greaterequal': 549,
25994    'Eth': 722,
25995    'Ccedilla': 667,
25996    'lcommaaccent': 278,
25997    'tcaron': 300,
25998    'eogonek': 444,
25999    'Uogonek': 722,
26000    'Aacute': 611,
26001    'Adieresis': 611,
26002    'egrave': 444,
26003    'zacute': 389,
26004    'iogonek': 278,
26005    'Oacute': 722,
26006    'oacute': 500,
26007    'amacron': 500,
26008    'sacute': 389,
26009    'idieresis': 278,
26010    'Ocircumflex': 722,
26011    'Ugrave': 722,
26012    'Delta': 612,
26013    'thorn': 500,
26014    'twosuperior': 300,
26015    'Odieresis': 722,
26016    'mu': 500,
26017    'igrave': 278,
26018    'ohungarumlaut': 500,
26019    'Eogonek': 611,
26020    'dcroat': 500,
26021    'threequarters': 750,
26022    'Scedilla': 500,
26023    'lcaron': 300,
26024    'Kcommaaccent': 667,
26025    'Lacute': 556,
26026    'trademark': 980,
26027    'edotaccent': 444,
26028    'Igrave': 333,
26029    'Imacron': 333,
26030    'Lcaron': 611,
26031    'onehalf': 750,
26032    'lessequal': 549,
26033    'ocircumflex': 500,
26034    'ntilde': 500,
26035    'Uhungarumlaut': 722,
26036    'Eacute': 611,
26037    'emacron': 444,
26038    'gbreve': 500,
26039    'onequarter': 750,
26040    'Scaron': 500,
26041    'Scommaaccent': 500,
26042    'Ohungarumlaut': 722,
26043    'degree': 400,
26044    'ograve': 500,
26045    'Ccaron': 667,
26046    'ugrave': 500,
26047    'radical': 453,
26048    'Dcaron': 722,
26049    'rcommaaccent': 389,
26050    'Ntilde': 667,
26051    'otilde': 500,
26052    'Rcommaaccent': 611,
26053    'Lcommaaccent': 556,
26054    'Atilde': 611,
26055    'Aogonek': 611,
26056    'Aring': 611,
26057    'Otilde': 722,
26058    'zdotaccent': 389,
26059    'Ecaron': 611,
26060    'Iogonek': 333,
26061    'kcommaaccent': 444,
26062    'minus': 675,
26063    'Icircumflex': 333,
26064    'ncaron': 500,
26065    'tcommaaccent': 278,
26066    'logicalnot': 675,
26067    'odieresis': 500,
26068    'udieresis': 500,
26069    'notequal': 549,
26070    'gcommaaccent': 500,
26071    'eth': 500,
26072    'zcaron': 389,
26073    'ncommaaccent': 500,
26074    'onesuperior': 300,
26075    'imacron': 278,
26076    'Euro': 500
26077  },
26078  'ZapfDingbats': {
26079    'space': 278,
26080    'a1': 974,
26081    'a2': 961,
26082    'a202': 974,
26083    'a3': 980,
26084    'a4': 719,
26085    'a5': 789,
26086    'a119': 790,
26087    'a118': 791,
26088    'a117': 690,
26089    'a11': 960,
26090    'a12': 939,
26091    'a13': 549,
26092    'a14': 855,
26093    'a15': 911,
26094    'a16': 933,
26095    'a105': 911,
26096    'a17': 945,
26097    'a18': 974,
26098    'a19': 755,
26099    'a20': 846,
26100    'a21': 762,
26101    'a22': 761,
26102    'a23': 571,
26103    'a24': 677,
26104    'a25': 763,
26105    'a26': 760,
26106    'a27': 759,
26107    'a28': 754,
26108    'a6': 494,
26109    'a7': 552,
26110    'a8': 537,
26111    'a9': 577,
26112    'a10': 692,
26113    'a29': 786,
26114    'a30': 788,
26115    'a31': 788,
26116    'a32': 790,
26117    'a33': 793,
26118    'a34': 794,
26119    'a35': 816,
26120    'a36': 823,
26121    'a37': 789,
26122    'a38': 841,
26123    'a39': 823,
26124    'a40': 833,
26125    'a41': 816,
26126    'a42': 831,
26127    'a43': 923,
26128    'a44': 744,
26129    'a45': 723,
26130    'a46': 749,
26131    'a47': 790,
26132    'a48': 792,
26133    'a49': 695,
26134    'a50': 776,
26135    'a51': 768,
26136    'a52': 792,
26137    'a53': 759,
26138    'a54': 707,
26139    'a55': 708,
26140    'a56': 682,
26141    'a57': 701,
26142    'a58': 826,
26143    'a59': 815,
26144    'a60': 789,
26145    'a61': 789,
26146    'a62': 707,
26147    'a63': 687,
26148    'a64': 696,
26149    'a65': 689,
26150    'a66': 786,
26151    'a67': 787,
26152    'a68': 713,
26153    'a69': 791,
26154    'a70': 785,
26155    'a71': 791,
26156    'a72': 873,
26157    'a73': 761,
26158    'a74': 762,
26159    'a203': 762,
26160    'a75': 759,
26161    'a204': 759,
26162    'a76': 892,
26163    'a77': 892,
26164    'a78': 788,
26165    'a79': 784,
26166    'a81': 438,
26167    'a82': 138,
26168    'a83': 277,
26169    'a84': 415,
26170    'a97': 392,
26171    'a98': 392,
26172    'a99': 668,
26173    'a100': 668,
26174    'a89': 390,
26175    'a90': 390,
26176    'a93': 317,
26177    'a94': 317,
26178    'a91': 276,
26179    'a92': 276,
26180    'a205': 509,
26181    'a85': 509,
26182    'a206': 410,
26183    'a86': 410,
26184    'a87': 234,
26185    'a88': 234,
26186    'a95': 334,
26187    'a96': 334,
26188    'a101': 732,
26189    'a102': 544,
26190    'a103': 544,
26191    'a104': 910,
26192    'a106': 667,
26193    'a107': 760,
26194    'a108': 760,
26195    'a112': 776,
26196    'a111': 595,
26197    'a110': 694,
26198    'a109': 626,
26199    'a120': 788,
26200    'a121': 788,
26201    'a122': 788,
26202    'a123': 788,
26203    'a124': 788,
26204    'a125': 788,
26205    'a126': 788,
26206    'a127': 788,
26207    'a128': 788,
26208    'a129': 788,
26209    'a130': 788,
26210    'a131': 788,
26211    'a132': 788,
26212    'a133': 788,
26213    'a134': 788,
26214    'a135': 788,
26215    'a136': 788,
26216    'a137': 788,
26217    'a138': 788,
26218    'a139': 788,
26219    'a140': 788,
26220    'a141': 788,
26221    'a142': 788,
26222    'a143': 788,
26223    'a144': 788,
26224    'a145': 788,
26225    'a146': 788,
26226    'a147': 788,
26227    'a148': 788,
26228    'a149': 788,
26229    'a150': 788,
26230    'a151': 788,
26231    'a152': 788,
26232    'a153': 788,
26233    'a154': 788,
26234    'a155': 788,
26235    'a156': 788,
26236    'a157': 788,
26237    'a158': 788,
26238    'a159': 788,
26239    'a160': 894,
26240    'a161': 838,
26241    'a163': 1016,
26242    'a164': 458,
26243    'a196': 748,
26244    'a165': 924,
26245    'a192': 748,
26246    'a166': 918,
26247    'a167': 927,
26248    'a168': 928,
26249    'a169': 928,
26250    'a170': 834,
26251    'a171': 873,
26252    'a172': 828,
26253    'a173': 924,
26254    'a162': 924,
26255    'a174': 917,
26256    'a175': 930,
26257    'a176': 931,
26258    'a177': 463,
26259    'a178': 883,
26260    'a179': 836,
26261    'a193': 836,
26262    'a180': 867,
26263    'a199': 867,
26264    'a181': 696,
26265    'a200': 696,
26266    'a182': 874,
26267    'a201': 874,
26268    'a183': 760,
26269    'a184': 946,
26270    'a197': 771,
26271    'a185': 865,
26272    'a194': 771,
26273    'a198': 888,
26274    'a186': 967,
26275    'a195': 888,
26276    'a187': 831,
26277    'a188': 873,
26278    'a189': 927,
26279    'a190': 970,
26280    'a191': 918
26281  }
26282};
26283
26284
26285/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
26286/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
26287
26288'use strict';
26289
26290var EOF = {};
26291
26292function isEOF(v) {
26293  return v == EOF;
26294}
26295
26296var Parser = (function ParserClosure() {
26297  function Parser(lexer, allowStreams, xref) {
26298    this.lexer = lexer;
26299    this.allowStreams = allowStreams;
26300    this.xref = xref;
26301    this.inlineImg = 0;
26302    this.refill();
26303  }
26304
26305  Parser.prototype = {
26306    refill: function Parser_refill() {
26307      this.buf1 = this.lexer.getObj();
26308      this.buf2 = this.lexer.getObj();
26309    },
26310    shift: function Parser_shift() {
26311      if (isCmd(this.buf2, 'ID')) {
26312        this.buf1 = this.buf2;
26313        this.buf2 = null;
26314        // skip byte after ID
26315        this.lexer.skip();
26316      } else {
26317        this.buf1 = this.buf2;
26318        this.buf2 = this.lexer.getObj();
26319      }
26320    },
26321    getObj: function Parser_getObj(cipherTransform) {
26322      if (isCmd(this.buf1, 'BI')) { // inline image
26323        this.shift();
26324        return this.makeInlineImage(cipherTransform);
26325      }
26326      if (isCmd(this.buf1, '[')) { // array
26327        this.shift();
26328        var array = [];
26329        while (!isCmd(this.buf1, ']') && !isEOF(this.buf1))
26330          array.push(this.getObj());
26331        if (isEOF(this.buf1))
26332          error('End of file inside array');
26333        this.shift();
26334        return array;
26335      }
26336      if (isCmd(this.buf1, '<<')) { // dictionary or stream
26337        this.shift();
26338        var dict = new Dict(this.xref);
26339        while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
26340          if (!isName(this.buf1))
26341            error('Dictionary key must be a name object');
26342
26343          var key = this.buf1.name;
26344          this.shift();
26345          if (isEOF(this.buf1))
26346            break;
26347          dict.set(key, this.getObj(cipherTransform));
26348        }
26349        if (isEOF(this.buf1))
26350          error('End of file inside dictionary');
26351
26352        // stream objects are not allowed inside content streams or
26353        // object streams
26354        if (isCmd(this.buf2, 'stream')) {
26355          return this.allowStreams ?
26356            this.makeStream(dict, cipherTransform) : dict;
26357        }
26358        this.shift();
26359        return dict;
26360      }
26361      if (isInt(this.buf1)) { // indirect reference or integer
26362        var num = this.buf1;
26363        this.shift();
26364        if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
26365          var ref = new Ref(num, this.buf1);
26366          this.shift();
26367          this.shift();
26368          return ref;
26369        }
26370        return num;
26371      }
26372      if (isString(this.buf1)) { // string
26373        var str = this.buf1;
26374        this.shift();
26375        if (cipherTransform)
26376          str = cipherTransform.decryptString(str);
26377        return str;
26378      }
26379
26380      // simple object
26381      var obj = this.buf1;
26382      this.shift();
26383      return obj;
26384    },
26385    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
26386      var lexer = this.lexer;
26387      var stream = lexer.stream;
26388
26389      // parse dictionary
26390      var dict = new Dict();
26391      while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
26392        if (!isName(this.buf1))
26393          error('Dictionary key must be a name object');
26394
26395        var key = this.buf1.name;
26396        this.shift();
26397        if (isEOF(this.buf1))
26398          break;
26399        dict.set(key, this.getObj(cipherTransform));
26400      }
26401
26402      // parse image stream
26403      var startPos = stream.pos;
26404
26405      // searching for the /EI\s/
26406      var state = 0, ch;
26407      while (state != 4 && (ch = stream.getByte()) != null) {
26408        switch (ch) {
26409          case 0x20:
26410          case 0x0D:
26411          case 0x0A:
26412            state = state === 3 ? 4 : 0;
26413            break;
26414          case 0x45:
26415            state = 2;
26416            break;
26417          case 0x49:
26418            state = state === 2 ? 3 : 0;
26419            break;
26420          default:
26421            state = 0;
26422            break;
26423        }
26424      }
26425
26426      // TODO improve the small images performance to remove the limit
26427      var inlineImgLimit = 500;
26428      if (++this.inlineImg >= inlineImgLimit) {
26429        if (this.inlineImg === inlineImgLimit)
26430          warn('Too many inline images');
26431        this.shift();
26432        return null;
26433      }
26434
26435      var length = (stream.pos - 4) - startPos;
26436      var imageStream = stream.makeSubStream(startPos, length, dict);
26437      if (cipherTransform)
26438        imageStream = cipherTransform.createStream(imageStream);
26439      imageStream = this.filter(imageStream, dict, length);
26440      imageStream.parameters = dict;
26441
26442      this.buf2 = Cmd.get('EI');
26443      this.shift();
26444
26445      return imageStream;
26446    },
26447    fetchIfRef: function Parser_fetchIfRef(obj) {
26448      // not relying on the xref.fetchIfRef -- xref might not be set
26449      return isRef(obj) ? this.xref.fetch(obj) : obj;
26450    },
26451    makeStream: function Parser_makeStream(dict, cipherTransform) {
26452      var lexer = this.lexer;
26453      var stream = lexer.stream;
26454
26455      // get stream start position
26456      lexer.skipToNextLine();
26457      var pos = stream.pos;
26458
26459      // get length
26460      var length = this.fetchIfRef(dict.get('Length'));
26461      if (!isInt(length))
26462        error('Bad ' + length + ' attribute in stream');
26463
26464      // skip over the stream data
26465      stream.pos = pos + length;
26466      this.shift(); // '>>'
26467      this.shift(); // 'stream'
26468      if (!isCmd(this.buf1, 'endstream'))
26469        error('Missing endstream');
26470      this.shift();
26471
26472      stream = stream.makeSubStream(pos, length, dict);
26473      if (cipherTransform)
26474        stream = cipherTransform.createStream(stream);
26475      stream = this.filter(stream, dict, length);
26476      stream.parameters = dict;
26477      return stream;
26478    },
26479    filter: function Parser_filter(stream, dict, length) {
26480      var filter = this.fetchIfRef(dict.get('Filter', 'F'));
26481      var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));
26482      if (isName(filter))
26483        return this.makeFilter(stream, filter.name, length, params);
26484      if (isArray(filter)) {
26485        var filterArray = filter;
26486        var paramsArray = params;
26487        for (var i = 0, ii = filterArray.length; i < ii; ++i) {
26488          filter = filterArray[i];
26489          if (!isName(filter))
26490            error('Bad filter name: ' + filter);
26491
26492          params = null;
26493          if (isArray(paramsArray) && (i in paramsArray))
26494            params = paramsArray[i];
26495          stream = this.makeFilter(stream, filter.name, length, params);
26496          // after the first stream the length variable is invalid
26497          length = null;
26498        }
26499      }
26500      return stream;
26501    },
26502    makeFilter: function Parser_makeFilter(stream, name, length, params) {
26503      if (name == 'FlateDecode' || name == 'Fl') {
26504        if (params) {
26505          return new PredictorStream(new FlateStream(stream), params);
26506        }
26507        return new FlateStream(stream);
26508      }
26509      if (name == 'LZWDecode' || name == 'LZW') {
26510        var earlyChange = 1;
26511        if (params) {
26512          if (params.has('EarlyChange'))
26513            earlyChange = params.get('EarlyChange');
26514          return new PredictorStream(
26515            new LZWStream(stream, earlyChange), params);
26516        }
26517        return new LZWStream(stream, earlyChange);
26518      }
26519      if (name == 'DCTDecode' || name == 'DCT') {
26520        var bytes = stream.getBytes(length);
26521        return new JpegStream(bytes, stream.dict, this.xref);
26522      }
26523      if (name == 'JPXDecode' || name == 'JPX') {
26524        var bytes = stream.getBytes(length);
26525        return new JpxStream(bytes, stream.dict);
26526      }
26527      if (name == 'ASCII85Decode' || name == 'A85') {
26528        return new Ascii85Stream(stream);
26529      }
26530      if (name == 'ASCIIHexDecode' || name == 'AHx') {
26531        return new AsciiHexStream(stream);
26532      }
26533      if (name == 'CCITTFaxDecode' || name == 'CCF') {
26534        return new CCITTFaxStream(stream, params);
26535      }
26536      if (name == 'RunLengthDecode' || name == 'RL') {
26537        return new RunLengthStream(stream);
26538      }
26539      if (name == 'JBIG2Decode') {
26540        error('JBIG2 image format is not currently supprted.');
26541      }
26542      warn('filter "' + name + '" not supported yet');
26543      return stream;
26544    }
26545  };
26546
26547  return Parser;
26548})();
26549
26550var Lexer = (function LexerClosure() {
26551  function Lexer(stream) {
26552    this.stream = stream;
26553  }
26554
26555  Lexer.isSpace = function Lexer_isSpace(ch) {
26556    return ch == ' ' || ch == '\t' || ch == '\x0d' || ch == '\x0a';
26557  };
26558
26559  // A '1' in this array means the character is white space.  A '1' or
26560  // '2' means the character ends a name or command.
26561  var specialChars = [
26562    1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,   // 0x
26563    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 1x
26564    1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2,   // 2x
26565    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,   // 3x
26566    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 4x
26567    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 5x
26568    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 6x
26569    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 7x
26570    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 8x
26571    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 9x
26572    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ax
26573    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // bx
26574    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // cx
26575    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // dx
26576    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ex
26577    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0    // fx
26578  ];
26579
26580  function toHexDigit(ch) {
26581    if (ch >= '0' && ch <= '9')
26582      return ch.charCodeAt(0) - 48;
26583    ch = ch.toUpperCase();
26584    if (ch >= 'A' && ch <= 'F')
26585      return ch.charCodeAt(0) - 55;
26586    return -1;
26587  }
26588
26589  Lexer.prototype = {
26590    getNumber: function Lexer_getNumber(ch) {
26591      var floating = false;
26592      var str = ch;
26593      var stream = this.stream;
26594      for (;;) {
26595        ch = stream.lookChar();
26596        if (ch == '.' && !floating) {
26597          str += ch;
26598          floating = true;
26599        } else if (ch == '-') {
26600          // ignore minus signs in the middle of numbers to match
26601          // Adobe's behavior
26602          warn('Badly formated number');
26603        } else if (ch >= '0' && ch <= '9') {
26604          str += ch;
26605        } else if (ch == 'e' || ch == 'E') {
26606          floating = true;
26607        } else {
26608          // the last character doesn't belong to us
26609          break;
26610        }
26611        stream.skip();
26612      }
26613      var value = parseFloat(str);
26614      if (isNaN(value))
26615        error('Invalid floating point number: ' + value);
26616      return value;
26617    },
26618    getString: function Lexer_getString() {
26619      var numParen = 1;
26620      var done = false;
26621      var str = '';
26622      var stream = this.stream;
26623      var ch;
26624      do {
26625        ch = stream.getChar();
26626        switch (ch) {
26627          case undefined:
26628            warn('Unterminated string');
26629            done = true;
26630            break;
26631          case '(':
26632            ++numParen;
26633            str += ch;
26634            break;
26635          case ')':
26636            if (--numParen == 0) {
26637              done = true;
26638            } else {
26639              str += ch;
26640            }
26641            break;
26642          case '\\':
26643            ch = stream.getChar();
26644            switch (ch) {
26645              case undefined:
26646                warn('Unterminated string');
26647                done = true;
26648                break;
26649              case 'n':
26650                str += '\n';
26651                break;
26652              case 'r':
26653                str += '\r';
26654                break;
26655              case 't':
26656                str += '\t';
26657                break;
26658              case 'b':
26659                str += '\b';
26660                break;
26661              case 'f':
26662                str += '\f';
26663                break;
26664              case '\\':
26665              case '(':
26666              case ')':
26667                str += ch;
26668                break;
26669              case '0': case '1': case '2': case '3':
26670              case '4': case '5': case '6': case '7':
26671                var x = ch - '0';
26672                ch = stream.lookChar();
26673                if (ch >= '0' && ch <= '7') {
26674                  stream.skip();
26675                  x = (x << 3) + (ch - '0');
26676                  ch = stream.lookChar();
26677                  if (ch >= '0' && ch <= '7') {
26678                    stream.skip();
26679                    x = (x << 3) + (ch - '0');
26680                  }
26681                }
26682
26683                str += String.fromCharCode(x);
26684                break;
26685              case '\r':
26686                ch = stream.lookChar();
26687                if (ch == '\n')
26688                  stream.skip();
26689                break;
26690              case '\n':
26691                break;
26692              default:
26693                str += ch;
26694            }
26695            break;
26696          default:
26697            str += ch;
26698        }
26699      } while (!done);
26700      return str;
26701    },
26702    getName: function Lexer_getName(ch) {
26703      var str = '';
26704      var stream = this.stream;
26705      while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
26706        stream.skip();
26707        if (ch == '#') {
26708          ch = stream.lookChar();
26709          var x = toHexDigit(ch);
26710          if (x != -1) {
26711            stream.skip();
26712            var x2 = toHexDigit(stream.getChar());
26713            if (x2 == -1)
26714              error('Illegal digit in hex char in name: ' + x2);
26715            str += String.fromCharCode((x << 4) | x2);
26716          } else {
26717            str += '#';
26718            str += ch;
26719          }
26720        } else {
26721          str += ch;
26722        }
26723      }
26724      if (str.length > 128)
26725        error('Warning: name token is longer than allowed by the spec: ' +
26726              str.length);
26727      return new Name(str);
26728    },
26729    getHexString: function Lexer_getHexString(ch) {
26730      var str = '';
26731      var stream = this.stream;
26732      for (;;) {
26733        ch = stream.getChar();
26734        if (ch == '>') {
26735          break;
26736        }
26737        if (!ch) {
26738          warn('Unterminated hex string');
26739          break;
26740        }
26741        if (specialChars[ch.charCodeAt(0)] != 1) {
26742          var x, x2;
26743          if ((x = toHexDigit(ch)) == -1)
26744            error('Illegal character in hex string: ' + ch);
26745
26746          ch = stream.getChar();
26747          while (specialChars[ch.charCodeAt(0)] == 1)
26748            ch = stream.getChar();
26749
26750          if ((x2 = toHexDigit(ch)) == -1)
26751            error('Illegal character in hex string: ' + ch);
26752
26753          str += String.fromCharCode((x << 4) | x2);
26754        }
26755      }
26756      return str;
26757    },
26758    getObj: function Lexer_getObj() {
26759      // skip whitespace and comments
26760      var comment = false;
26761      var stream = this.stream;
26762      var ch;
26763      while (true) {
26764        if (!(ch = stream.getChar()))
26765          return EOF;
26766        if (comment) {
26767          if (ch == '\r' || ch == '\n')
26768            comment = false;
26769        } else if (ch == '%') {
26770          comment = true;
26771        } else if (specialChars[ch.charCodeAt(0)] != 1) {
26772          break;
26773        }
26774      }
26775
26776      // start reading token
26777      switch (ch) {
26778        case '0': case '1': case '2': case '3': case '4':
26779        case '5': case '6': case '7': case '8': case '9':
26780        case '+': case '-': case '.':
26781          return this.getNumber(ch);
26782        case '(':
26783          return this.getString();
26784        case '/':
26785          return this.getName(ch);
26786        // array punctuation
26787        case '[':
26788        case ']':
26789          return Cmd.get(ch);
26790        // hex string or dict punctuation
26791        case '<':
26792          ch = stream.lookChar();
26793          if (ch == '<') {
26794            // dict punctuation
26795            stream.skip();
26796            return Cmd.get('<<');
26797          }
26798          return this.getHexString(ch);
26799        // dict punctuation
26800        case '>':
26801          ch = stream.lookChar();
26802          if (ch == '>') {
26803            stream.skip();
26804            return Cmd.get('>>');
26805          }
26806        case '{':
26807        case '}':
26808          return Cmd.get(ch);
26809        // fall through
26810        case ')':
26811          error('Illegal character: ' + ch);
26812      }
26813
26814      // command
26815      var str = ch;
26816      while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
26817        stream.skip();
26818        if (str.length == 128)
26819          error('Command token too long: ' + str.length);
26820
26821        str += ch;
26822      }
26823      if (str == 'true')
26824        return true;
26825      if (str == 'false')
26826        return false;
26827      if (str == 'null')
26828        return null;
26829      return Cmd.get(str);
26830    },
26831    skipToNextLine: function Lexer_skipToNextLine() {
26832      var stream = this.stream;
26833      while (true) {
26834        var ch = stream.getChar();
26835        if (!ch || ch == '\n')
26836          return;
26837        if (ch == '\r') {
26838          if ((ch = stream.lookChar()) == '\n')
26839            stream.skip();
26840          return;
26841        }
26842      }
26843    },
26844    skip: function Lexer_skip() {
26845      this.stream.skip();
26846    }
26847  };
26848
26849  return Lexer;
26850})();
26851
26852var Linearization = (function LinearizationClosure() {
26853  function Linearization(stream) {
26854    this.parser = new Parser(new Lexer(stream), false, null);
26855    var obj1 = this.parser.getObj();
26856    var obj2 = this.parser.getObj();
26857    var obj3 = this.parser.getObj();
26858    this.linDict = this.parser.getObj();
26859    if (isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') &&
26860        isDict(this.linDict)) {
26861      var obj = this.linDict.get('Linearized');
26862      if (!(isNum(obj) && obj > 0))
26863        this.linDict = null;
26864    }
26865  }
26866
26867  Linearization.prototype = {
26868    getInt: function Linearization_getInt(name) {
26869      var linDict = this.linDict;
26870      var obj;
26871      if (isDict(linDict) &&
26872          isInt(obj = linDict.get(name)) &&
26873          obj > 0) {
26874        return obj;
26875      }
26876      error('"' + name + '" field in linearization table is invalid');
26877    },
26878    getHint: function Linearization_getHint(index) {
26879      var linDict = this.linDict;
26880      var obj1, obj2;
26881      if (isDict(linDict) &&
26882          isArray(obj1 = linDict.get('H')) &&
26883          obj1.length >= 2 &&
26884          isInt(obj2 = obj1[index]) &&
26885          obj2 > 0) {
26886        return obj2;
26887      }
26888      error('Hints table in linearization table is invalid: ' + index);
26889    },
26890    get length() {
26891      if (!isDict(this.linDict))
26892        return 0;
26893      return this.getInt('L');
26894    },
26895    get hintsOffset() {
26896      return this.getHint(0);
26897    },
26898    get hintsLength() {
26899      return this.getHint(1);
26900    },
26901    get hintsOffset2() {
26902      return this.getHint(2);
26903    },
26904    get hintsLenth2() {
26905      return this.getHint(3);
26906    },
26907    get objectNumberFirst() {
26908      return this.getInt('O');
26909    },
26910    get endFirst() {
26911      return this.getInt('E');
26912    },
26913    get numPages() {
26914      return this.getInt('N');
26915    },
26916    get mainXRefEntriesOffset() {
26917      return this.getInt('T');
26918    },
26919    get pageFirst() {
26920      return this.getInt('P');
26921    }
26922  };
26923
26924  return Linearization;
26925})();
26926
26927
26928/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
26929/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
26930
26931'use strict';
26932
26933var PatternType = {
26934  AXIAL: 2,
26935  RADIAL: 3
26936};
26937
26938var Pattern = (function PatternClosure() {
26939  // Constructor should define this.getPattern
26940  function Pattern() {
26941    error('should not call Pattern constructor');
26942  }
26943
26944  Pattern.prototype = {
26945    // Input: current Canvas context
26946    // Output: the appropriate fillStyle or strokeStyle
26947    getPattern: function Pattern_getPattern(ctx) {
26948      error('Should not call Pattern.getStyle: ' + ctx);
26949    }
26950  };
26951
26952  Pattern.shadingFromIR = function Pattern_shadingFromIR(raw) {
26953    return Shadings[raw[0]].fromIR(raw);
26954  };
26955
26956  Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,
26957                                                       res) {
26958
26959    var dict = isStream(shading) ? shading.dict : shading;
26960    var type = dict.get('ShadingType');
26961
26962    switch (type) {
26963      case PatternType.AXIAL:
26964      case PatternType.RADIAL:
26965        // Both radial and axial shadings are handled by RadialAxial shading.
26966        return new Shadings.RadialAxial(dict, matrix, xref, res);
26967      default:
26968        return new Shadings.Dummy();
26969    }
26970  };
26971  return Pattern;
26972})();
26973
26974var Shadings = {};
26975
26976// Radial and axial shading have very similar implementations
26977// If needed, the implementations can be broken into two classes
26978Shadings.RadialAxial = (function RadialAxialClosure() {
26979  function RadialAxial(dict, matrix, xref, res, ctx) {
26980    this.matrix = matrix;
26981    this.coordsArr = dict.get('Coords');
26982    this.shadingType = dict.get('ShadingType');
26983    this.type = 'Pattern';
26984
26985    this.ctx = ctx;
26986    var cs = dict.get('ColorSpace', 'CS');
26987    cs = ColorSpace.parse(cs, xref, res);
26988    this.cs = cs;
26989
26990    var t0 = 0.0, t1 = 1.0;
26991    if (dict.has('Domain')) {
26992      var domainArr = dict.get('Domain');
26993      t0 = domainArr[0];
26994      t1 = domainArr[1];
26995    }
26996
26997    var extendStart = false, extendEnd = false;
26998    if (dict.has('Extend')) {
26999      var extendArr = dict.get('Extend');
27000      extendStart = extendArr[0];
27001      extendEnd = extendArr[1];
27002      TODO('Support extend');
27003    }
27004
27005    this.extendStart = extendStart;
27006    this.extendEnd = extendEnd;
27007
27008    var fnObj = dict.get('Function');
27009    if (isArray(fnObj))
27010      error('No support for array of functions');
27011    if (!isPDFFunction(fnObj))
27012      error('Invalid function');
27013    var fn = PDFFunction.parse(xref, fnObj);
27014
27015    // 10 samples seems good enough for now, but probably won't work
27016    // if there are sharp color changes. Ideally, we would implement
27017    // the spec faithfully and add lossless optimizations.
27018    var step = (t1 - t0) / 10;
27019    var diff = t1 - t0;
27020
27021    var colorStops = [];
27022    for (var i = t0; i <= t1; i += step) {
27023      var rgbColor = cs.getRgb(fn([i]));
27024      var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
27025      colorStops.push([(i - t0) / diff, cssColor]);
27026    }
27027
27028    this.colorStops = colorStops;
27029  }
27030
27031  RadialAxial.fromIR = function RadialAxial_fromIR(raw) {
27032    var type = raw[1];
27033    var colorStops = raw[2];
27034    var p0 = raw[3];
27035    var p1 = raw[4];
27036    var r0 = raw[5];
27037    var r1 = raw[6];
27038    return {
27039      type: 'Pattern',
27040      getPattern: function RadialAxial_getPattern(ctx) {
27041        var curMatrix = ctx.mozCurrentTransform;
27042        if (curMatrix) {
27043          var userMatrix = ctx.mozCurrentTransformInverse;
27044
27045          p0 = Util.applyTransform(p0, curMatrix);
27046          p0 = Util.applyTransform(p0, userMatrix);
27047
27048          p1 = Util.applyTransform(p1, curMatrix);
27049          p1 = Util.applyTransform(p1, userMatrix);
27050        }
27051
27052        var grad;
27053        if (type == PatternType.AXIAL)
27054          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
27055        else if (type == PatternType.RADIAL)
27056          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
27057
27058        for (var i = 0, ii = colorStops.length; i < ii; ++i) {
27059          var c = colorStops[i];
27060          grad.addColorStop(c[0], c[1]);
27061        }
27062        return grad;
27063      }
27064    };
27065  };
27066
27067  RadialAxial.prototype = {
27068    getIR: function RadialAxial_getIR() {
27069      var coordsArr = this.coordsArr;
27070      var type = this.shadingType;
27071      if (type == PatternType.AXIAL) {
27072        var p0 = [coordsArr[0], coordsArr[1]];
27073        var p1 = [coordsArr[2], coordsArr[3]];
27074        var r0 = null;
27075        var r1 = null;
27076      } else if (type == PatternType.RADIAL) {
27077        var p0 = [coordsArr[0], coordsArr[1]];
27078        var p1 = [coordsArr[3], coordsArr[4]];
27079        var r0 = coordsArr[2];
27080        var r1 = coordsArr[5];
27081      } else {
27082        error('getPattern type unknown: ' + type);
27083      }
27084
27085      var matrix = this.matrix;
27086      if (matrix) {
27087        p0 = Util.applyTransform(p0, matrix);
27088        p1 = Util.applyTransform(p1, matrix);
27089      }
27090
27091      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
27092    }
27093  };
27094
27095  return RadialAxial;
27096})();
27097
27098Shadings.Dummy = (function DummyClosure() {
27099  function Dummy() {
27100    this.type = 'Pattern';
27101  }
27102
27103  Dummy.fromIR = function Dummy_fromIR() {
27104    return 'hotpink';
27105  };
27106
27107  Dummy.prototype = {
27108    getIR: function Dummy_getIR() {
27109      return ['Dummy'];
27110    }
27111  };
27112  return Dummy;
27113})();
27114
27115var TilingPattern = (function TilingPatternClosure() {
27116  var PaintType = {
27117    COLORED: 1,
27118    UNCOLORED: 2
27119  };
27120  var MAX_PATTERN_SIZE = 512;
27121
27122  function TilingPattern(IR, color, ctx, objs) {
27123    var operatorList = IR[2];
27124    this.matrix = IR[3];
27125    var bbox = IR[4];
27126    var xstep = IR[5];
27127    var ystep = IR[6];
27128    var paintType = IR[7];
27129
27130    TODO('TilingType');
27131
27132    this.curMatrix = ctx.mozCurrentTransform;
27133    this.invMatrix = ctx.mozCurrentTransformInverse;
27134    this.ctx = ctx;
27135    this.type = 'Pattern';
27136
27137    var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
27138
27139    var topLeft = [x0, y0];
27140    // we want the canvas to be as large as the step size
27141    var botRight = [x0 + xstep, y0 + ystep];
27142
27143    var width = botRight[0] - topLeft[0];
27144    var height = botRight[1] - topLeft[1];
27145
27146    // TODO: hack to avoid OOM, we would ideally compute the tiling
27147    // pattern to be only as large as the acual size in device space
27148    // This could be computed with .mozCurrentTransform, but still
27149    // needs to be implemented
27150    while (Math.abs(width) > MAX_PATTERN_SIZE ||
27151           Math.abs(height) > MAX_PATTERN_SIZE) {
27152      width = height = MAX_PATTERN_SIZE;
27153    }
27154
27155    var tmpCanvas = createScratchCanvas(width, height);
27156
27157    // set the new canvas element context as the graphics context
27158    var tmpCtx = tmpCanvas.getContext('2d');
27159    var graphics = new CanvasGraphics(tmpCtx, objs);
27160
27161    switch (paintType) {
27162      case PaintType.COLORED:
27163        tmpCtx.fillStyle = ctx.fillStyle;
27164        tmpCtx.strokeStyle = ctx.strokeStyle;
27165        break;
27166      case PaintType.UNCOLORED:
27167        var cssColor = Util.makeCssRgb(this, color[0], color[1], color[2]);
27168        tmpCtx.fillStyle = cssColor;
27169        tmpCtx.strokeStyle = cssColor;
27170        break;
27171      default:
27172        error('Unsupported paint type: ' + paintType);
27173    }
27174
27175    var scale = [width / xstep, height / ystep];
27176    this.scale = scale;
27177
27178    // transform coordinates to pattern space
27179    var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
27180    var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
27181    graphics.transform.apply(graphics, tmpScale);
27182    graphics.transform.apply(graphics, tmpTranslate);
27183
27184    if (bbox && isArray(bbox) && 4 == bbox.length) {
27185      var bboxWidth = x1 - x0;
27186      var bboxHeight = y1 - y0;
27187      graphics.rectangle(x0, y0, bboxWidth, bboxHeight);
27188      graphics.clip();
27189      graphics.endPath();
27190    }
27191
27192    graphics.executeOperatorList(operatorList);
27193
27194    this.canvas = tmpCanvas;
27195  }
27196
27197  TilingPattern.getIR = function TilingPattern_getIR(operatorList, dict, args) {
27198    var matrix = dict.get('Matrix');
27199    var bbox = dict.get('BBox');
27200    var xstep = dict.get('XStep');
27201    var ystep = dict.get('YStep');
27202    var paintType = dict.get('PaintType');
27203
27204    return [
27205      'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType
27206    ];
27207  };
27208
27209  TilingPattern.prototype = {
27210    getPattern: function TilingPattern_getPattern() {
27211      var matrix = this.matrix;
27212      var curMatrix = this.curMatrix;
27213      var ctx = this.ctx;
27214
27215      if (curMatrix)
27216        ctx.setTransform.apply(ctx, curMatrix);
27217
27218      if (matrix)
27219        ctx.transform.apply(ctx, matrix);
27220
27221      var scale = this.scale;
27222      ctx.scale(1 / scale[0], 1 / scale[1]);
27223
27224      return ctx.createPattern(this.canvas, 'repeat');
27225    }
27226  };
27227
27228  return TilingPattern;
27229})();
27230
27231
27232/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
27233/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
27234
27235'use strict';
27236
27237var Stream = (function StreamClosure() {
27238  function Stream(arrayBuffer, start, length, dict) {
27239    this.bytes = new Uint8Array(arrayBuffer);
27240    this.start = start || 0;
27241    this.pos = this.start;
27242    this.end = (start + length) || this.bytes.length;
27243    this.dict = dict;
27244  }
27245
27246  // required methods for a stream. if a particular stream does not
27247  // implement these, an error should be thrown
27248  Stream.prototype = {
27249    get length() {
27250      return this.end - this.start;
27251    },
27252    getByte: function Stream_getByte() {
27253      if (this.pos >= this.end)
27254        return null;
27255      return this.bytes[this.pos++];
27256    },
27257    // returns subarray of original buffer
27258    // should only be read
27259    getBytes: function Stream_getBytes(length) {
27260      var bytes = this.bytes;
27261      var pos = this.pos;
27262      var strEnd = this.end;
27263
27264      if (!length)
27265        return bytes.subarray(pos, strEnd);
27266
27267      var end = pos + length;
27268      if (end > strEnd)
27269        end = strEnd;
27270
27271      this.pos = end;
27272      return bytes.subarray(pos, end);
27273    },
27274    lookChar: function Stream_lookChar() {
27275      if (this.pos >= this.end)
27276        return null;
27277      return String.fromCharCode(this.bytes[this.pos]);
27278    },
27279    getChar: function Stream_getChar() {
27280      if (this.pos >= this.end)
27281        return null;
27282      return String.fromCharCode(this.bytes[this.pos++]);
27283    },
27284    skip: function Stream_skip(n) {
27285      if (!n)
27286        n = 1;
27287      this.pos += n;
27288    },
27289    reset: function Stream_reset() {
27290      this.pos = this.start;
27291    },
27292    moveStart: function Stream_moveStart() {
27293      this.start = this.pos;
27294    },
27295    makeSubStream: function Stream_makeSubStream(start, length, dict) {
27296      return new Stream(this.bytes.buffer, start, length, dict);
27297    },
27298    isStream: true
27299  };
27300
27301  return Stream;
27302})();
27303
27304var StringStream = (function StringStreamClosure() {
27305  function StringStream(str) {
27306    var length = str.length;
27307    var bytes = new Uint8Array(length);
27308    for (var n = 0; n < length; ++n)
27309      bytes[n] = str.charCodeAt(n);
27310    Stream.call(this, bytes);
27311  }
27312
27313  StringStream.prototype = Stream.prototype;
27314
27315  return StringStream;
27316})();
27317
27318// super class for the decoding streams
27319var DecodeStream = (function DecodeStreamClosure() {
27320  function DecodeStream() {
27321    this.pos = 0;
27322    this.bufferLength = 0;
27323    this.eof = false;
27324    this.buffer = null;
27325  }
27326
27327  DecodeStream.prototype = {
27328    ensureBuffer: function DecodeStream_ensureBuffer(requested) {
27329      var buffer = this.buffer;
27330      var current = buffer ? buffer.byteLength : 0;
27331      if (requested < current)
27332        return buffer;
27333      var size = 512;
27334      while (size < requested)
27335        size <<= 1;
27336      var buffer2 = new Uint8Array(size);
27337      for (var i = 0; i < current; ++i)
27338        buffer2[i] = buffer[i];
27339      return (this.buffer = buffer2);
27340    },
27341    getByte: function DecodeStream_getByte() {
27342      var pos = this.pos;
27343      while (this.bufferLength <= pos) {
27344        if (this.eof)
27345          return null;
27346        this.readBlock();
27347      }
27348      return this.buffer[this.pos++];
27349    },
27350    getBytes: function DecodeStream_getBytes(length) {
27351      var end, pos = this.pos;
27352
27353      if (length) {
27354        this.ensureBuffer(pos + length);
27355        end = pos + length;
27356
27357        while (!this.eof && this.bufferLength < end)
27358          this.readBlock();
27359
27360        var bufEnd = this.bufferLength;
27361        if (end > bufEnd)
27362          end = bufEnd;
27363      } else {
27364        while (!this.eof)
27365          this.readBlock();
27366
27367        end = this.bufferLength;
27368
27369        // checking if bufferLength is still 0 then
27370        // the buffer has to be initialized
27371        if (!end)
27372          this.buffer = new Uint8Array(0);
27373      }
27374
27375      this.pos = end;
27376      return this.buffer.subarray(pos, end);
27377    },
27378    lookChar: function DecodeStream_lookChar() {
27379      var pos = this.pos;
27380      while (this.bufferLength <= pos) {
27381        if (this.eof)
27382          return null;
27383        this.readBlock();
27384      }
27385      return String.fromCharCode(this.buffer[this.pos]);
27386    },
27387    getChar: function DecodeStream_getChar() {
27388      var pos = this.pos;
27389      while (this.bufferLength <= pos) {
27390        if (this.eof)
27391          return null;
27392        this.readBlock();
27393      }
27394      return String.fromCharCode(this.buffer[this.pos++]);
27395    },
27396    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
27397      var end = start + length;
27398      while (this.bufferLength <= end && !this.eof)
27399        this.readBlock();
27400      return new Stream(this.buffer, start, length, dict);
27401    },
27402    skip: function DecodeStream_skip(n) {
27403      if (!n)
27404        n = 1;
27405      this.pos += n;
27406    },
27407    reset: function DecodeStream_reset() {
27408      this.pos = 0;
27409    }
27410  };
27411
27412  return DecodeStream;
27413})();
27414
27415var FakeStream = (function FakeStreamClosure() {
27416  function FakeStream(stream) {
27417    this.dict = stream.dict;
27418    DecodeStream.call(this);
27419  }
27420
27421  FakeStream.prototype = Object.create(DecodeStream.prototype);
27422  FakeStream.prototype.readBlock = function FakeStream_readBlock() {
27423    var bufferLength = this.bufferLength;
27424    bufferLength += 1024;
27425    var buffer = this.ensureBuffer(bufferLength);
27426    this.bufferLength = bufferLength;
27427  };
27428
27429  FakeStream.prototype.getBytes = function FakeStream_getBytes(length) {
27430    var end, pos = this.pos;
27431
27432    if (length) {
27433      this.ensureBuffer(pos + length);
27434      end = pos + length;
27435
27436      while (!this.eof && this.bufferLength < end)
27437        this.readBlock();
27438
27439      var bufEnd = this.bufferLength;
27440      if (end > bufEnd)
27441        end = bufEnd;
27442    } else {
27443      this.eof = true;
27444      end = this.bufferLength;
27445    }
27446
27447    this.pos = end;
27448    return this.buffer.subarray(pos, end);
27449  };
27450
27451  return FakeStream;
27452})();
27453
27454var StreamsSequenceStream = (function StreamsSequenceStreamClosure() {
27455  function StreamsSequenceStream(streams) {
27456    this.streams = streams;
27457    DecodeStream.call(this);
27458  }
27459
27460  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
27461
27462  StreamsSequenceStream.prototype.readBlock =
27463    function streamSequenceStreamReadBlock() {
27464
27465    var streams = this.streams;
27466    if (streams.length == 0) {
27467      this.eof = true;
27468      return;
27469    }
27470    var stream = streams.shift();
27471    var chunk = stream.getBytes();
27472    var bufferLength = this.bufferLength;
27473    var newLength = bufferLength + chunk.length;
27474    var buffer = this.ensureBuffer(newLength);
27475    buffer.set(chunk, bufferLength);
27476    this.bufferLength = newLength;
27477  };
27478
27479  return StreamsSequenceStream;
27480})();
27481
27482var FlateStream = (function FlateStreamClosure() {
27483  var codeLenCodeMap = new Uint32Array([
27484    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
27485  ]);
27486
27487  var lengthDecode = new Uint32Array([
27488    0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
27489    0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
27490    0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
27491    0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
27492  ]);
27493
27494  var distDecode = new Uint32Array([
27495    0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
27496    0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
27497    0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
27498    0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
27499  ]);
27500
27501  var fixedLitCodeTab = [new Uint32Array([
27502    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
27503    0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
27504    0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
27505    0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
27506    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
27507    0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
27508    0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
27509    0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
27510    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
27511    0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
27512    0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
27513    0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
27514    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
27515    0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
27516    0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
27517    0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
27518    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
27519    0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
27520    0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
27521    0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
27522    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
27523    0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
27524    0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
27525    0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
27526    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
27527    0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
27528    0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
27529    0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
27530    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
27531    0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
27532    0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
27533    0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
27534    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
27535    0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
27536    0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
27537    0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
27538    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
27539    0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
27540    0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
27541    0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
27542    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
27543    0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
27544    0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
27545    0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
27546    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
27547    0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
27548    0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
27549    0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
27550    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
27551    0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
27552    0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
27553    0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
27554    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
27555    0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
27556    0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
27557    0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
27558    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
27559    0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
27560    0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
27561    0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
27562    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
27563    0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
27564    0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
27565    0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
27566  ]), 9];
27567
27568  var fixedDistCodeTab = [new Uint32Array([
27569    0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
27570    0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
27571    0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
27572    0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
27573  ]), 5];
27574
27575  function FlateStream(stream) {
27576    var bytes = stream.getBytes();
27577    var bytesPos = 0;
27578
27579    this.dict = stream.dict;
27580    var cmf = bytes[bytesPos++];
27581    var flg = bytes[bytesPos++];
27582    if (cmf == -1 || flg == -1)
27583      error('Invalid header in flate stream: ' + cmf + ', ' + flg);
27584    if ((cmf & 0x0f) != 0x08)
27585      error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
27586    if ((((cmf << 8) + flg) % 31) != 0)
27587      error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
27588    if (flg & 0x20)
27589      error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
27590
27591    this.bytes = bytes;
27592    this.bytesPos = bytesPos;
27593
27594    this.codeSize = 0;
27595    this.codeBuf = 0;
27596
27597    DecodeStream.call(this);
27598  }
27599
27600  FlateStream.prototype = Object.create(DecodeStream.prototype);
27601
27602  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
27603    var codeSize = this.codeSize;
27604    var codeBuf = this.codeBuf;
27605    var bytes = this.bytes;
27606    var bytesPos = this.bytesPos;
27607
27608    var b;
27609    while (codeSize < bits) {
27610      if (typeof (b = bytes[bytesPos++]) == 'undefined')
27611        error('Bad encoding in flate stream');
27612      codeBuf |= b << codeSize;
27613      codeSize += 8;
27614    }
27615    b = codeBuf & ((1 << bits) - 1);
27616    this.codeBuf = codeBuf >> bits;
27617    this.codeSize = codeSize -= bits;
27618    this.bytesPos = bytesPos;
27619    return b;
27620  };
27621
27622  FlateStream.prototype.getCode = function FlateStream_getCode(table) {
27623    var codes = table[0];
27624    var maxLen = table[1];
27625    var codeSize = this.codeSize;
27626    var codeBuf = this.codeBuf;
27627    var bytes = this.bytes;
27628    var bytesPos = this.bytesPos;
27629
27630    while (codeSize < maxLen) {
27631      var b;
27632      if (typeof (b = bytes[bytesPos++]) == 'undefined')
27633        error('Bad encoding in flate stream');
27634      codeBuf |= (b << codeSize);
27635      codeSize += 8;
27636    }
27637    var code = codes[codeBuf & ((1 << maxLen) - 1)];
27638    var codeLen = code >> 16;
27639    var codeVal = code & 0xffff;
27640    if (codeSize == 0 || codeSize < codeLen || codeLen == 0)
27641      error('Bad encoding in flate stream');
27642    this.codeBuf = (codeBuf >> codeLen);
27643    this.codeSize = (codeSize - codeLen);
27644    this.bytesPos = bytesPos;
27645    return codeVal;
27646  };
27647
27648  FlateStream.prototype.generateHuffmanTable =
27649    function flateStreamGenerateHuffmanTable(lengths) {
27650    var n = lengths.length;
27651
27652    // find max code length
27653    var maxLen = 0;
27654    for (var i = 0; i < n; ++i) {
27655      if (lengths[i] > maxLen)
27656        maxLen = lengths[i];
27657    }
27658
27659    // build the table
27660    var size = 1 << maxLen;
27661    var codes = new Uint32Array(size);
27662    for (var len = 1, code = 0, skip = 2;
27663         len <= maxLen;
27664         ++len, code <<= 1, skip <<= 1) {
27665      for (var val = 0; val < n; ++val) {
27666        if (lengths[val] == len) {
27667          // bit-reverse the code
27668          var code2 = 0;
27669          var t = code;
27670          for (var i = 0; i < len; ++i) {
27671            code2 = (code2 << 1) | (t & 1);
27672            t >>= 1;
27673          }
27674
27675          // fill the table entries
27676          for (var i = code2; i < size; i += skip)
27677            codes[i] = (len << 16) | val;
27678
27679          ++code;
27680        }
27681      }
27682    }
27683
27684    return [codes, maxLen];
27685  };
27686
27687  FlateStream.prototype.readBlock = function FlateStream_readBlock() {
27688    // read block header
27689    var hdr = this.getBits(3);
27690    if (hdr & 1)
27691      this.eof = true;
27692    hdr >>= 1;
27693
27694    if (hdr == 0) { // uncompressed block
27695      var bytes = this.bytes;
27696      var bytesPos = this.bytesPos;
27697      var b;
27698
27699      if (typeof (b = bytes[bytesPos++]) == 'undefined')
27700        error('Bad block header in flate stream');
27701      var blockLen = b;
27702      if (typeof (b = bytes[bytesPos++]) == 'undefined')
27703        error('Bad block header in flate stream');
27704      blockLen |= (b << 8);
27705      if (typeof (b = bytes[bytesPos++]) == 'undefined')
27706        error('Bad block header in flate stream');
27707      var check = b;
27708      if (typeof (b = bytes[bytesPos++]) == 'undefined')
27709        error('Bad block header in flate stream');
27710      check |= (b << 8);
27711      if (check != (~blockLen & 0xffff))
27712        error('Bad uncompressed block length in flate stream');
27713
27714      this.codeBuf = 0;
27715      this.codeSize = 0;
27716
27717      var bufferLength = this.bufferLength;
27718      var buffer = this.ensureBuffer(bufferLength + blockLen);
27719      var end = bufferLength + blockLen;
27720      this.bufferLength = end;
27721      for (var n = bufferLength; n < end; ++n) {
27722        if (typeof (b = bytes[bytesPos++]) == 'undefined') {
27723          this.eof = true;
27724          break;
27725        }
27726        buffer[n] = b;
27727      }
27728      this.bytesPos = bytesPos;
27729      return;
27730    }
27731
27732    var litCodeTable;
27733    var distCodeTable;
27734    if (hdr == 1) { // compressed block, fixed codes
27735      litCodeTable = fixedLitCodeTab;
27736      distCodeTable = fixedDistCodeTab;
27737    } else if (hdr == 2) { // compressed block, dynamic codes
27738      var numLitCodes = this.getBits(5) + 257;
27739      var numDistCodes = this.getBits(5) + 1;
27740      var numCodeLenCodes = this.getBits(4) + 4;
27741
27742      // build the code lengths code table
27743      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
27744
27745      for (var i = 0; i < numCodeLenCodes; ++i)
27746        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
27747      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
27748
27749      // build the literal and distance code tables
27750      var len = 0;
27751      var i = 0;
27752      var codes = numLitCodes + numDistCodes;
27753      var codeLengths = new Uint8Array(codes);
27754      while (i < codes) {
27755        var code = this.getCode(codeLenCodeTab);
27756        if (code == 16) {
27757          var bitsLength = 2, bitsOffset = 3, what = len;
27758        } else if (code == 17) {
27759          var bitsLength = 3, bitsOffset = 3, what = (len = 0);
27760        } else if (code == 18) {
27761          var bitsLength = 7, bitsOffset = 11, what = (len = 0);
27762        } else {
27763          codeLengths[i++] = len = code;
27764          continue;
27765        }
27766
27767        var repeatLength = this.getBits(bitsLength) + bitsOffset;
27768        while (repeatLength-- > 0)
27769          codeLengths[i++] = what;
27770      }
27771
27772      litCodeTable =
27773        this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
27774      distCodeTable =
27775        this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
27776    } else {
27777      error('Unknown block type in flate stream');
27778    }
27779
27780    var buffer = this.buffer;
27781    var limit = buffer ? buffer.length : 0;
27782    var pos = this.bufferLength;
27783    while (true) {
27784      var code1 = this.getCode(litCodeTable);
27785      if (code1 < 256) {
27786        if (pos + 1 >= limit) {
27787          buffer = this.ensureBuffer(pos + 1);
27788          limit = buffer.length;
27789        }
27790        buffer[pos++] = code1;
27791        continue;
27792      }
27793      if (code1 == 256) {
27794        this.bufferLength = pos;
27795        return;
27796      }
27797      code1 -= 257;
27798      code1 = lengthDecode[code1];
27799      var code2 = code1 >> 16;
27800      if (code2 > 0)
27801        code2 = this.getBits(code2);
27802      var len = (code1 & 0xffff) + code2;
27803      code1 = this.getCode(distCodeTable);
27804      code1 = distDecode[code1];
27805      code2 = code1 >> 16;
27806      if (code2 > 0)
27807        code2 = this.getBits(code2);
27808      var dist = (code1 & 0xffff) + code2;
27809      if (pos + len >= limit) {
27810        buffer = this.ensureBuffer(pos + len);
27811        limit = buffer.length;
27812      }
27813      for (var k = 0; k < len; ++k, ++pos)
27814        buffer[pos] = buffer[pos - dist];
27815    }
27816  };
27817
27818  return FlateStream;
27819})();
27820
27821var PredictorStream = (function PredictorStreamClosure() {
27822  function PredictorStream(stream, params) {
27823    var predictor = this.predictor = params.get('Predictor') || 1;
27824
27825    if (predictor <= 1)
27826      return stream; // no prediction
27827    if (predictor !== 2 && (predictor < 10 || predictor > 15))
27828      error('Unsupported predictor: ' + predictor);
27829
27830    if (predictor === 2)
27831      this.readBlock = this.readBlockTiff;
27832    else
27833      this.readBlock = this.readBlockPng;
27834
27835    this.stream = stream;
27836    this.dict = stream.dict;
27837
27838    var colors = this.colors = params.get('Colors') || 1;
27839    var bits = this.bits = params.get('BitsPerComponent') || 8;
27840    var columns = this.columns = params.get('Columns') || 1;
27841
27842    this.pixBytes = (colors * bits + 7) >> 3;
27843    this.rowBytes = (columns * colors * bits + 7) >> 3;
27844
27845    DecodeStream.call(this);
27846    return this;
27847  }
27848
27849  PredictorStream.prototype = Object.create(DecodeStream.prototype);
27850
27851  PredictorStream.prototype.readBlockTiff =
27852    function predictorStreamReadBlockTiff() {
27853    var rowBytes = this.rowBytes;
27854
27855    var bufferLength = this.bufferLength;
27856    var buffer = this.ensureBuffer(bufferLength + rowBytes);
27857
27858    var bits = this.bits;
27859    var colors = this.colors;
27860
27861    var rawBytes = this.stream.getBytes(rowBytes);
27862
27863    var inbuf = 0, outbuf = 0;
27864    var inbits = 0, outbits = 0;
27865    var pos = bufferLength;
27866
27867    if (bits === 1) {
27868      for (var i = 0; i < rowBytes; ++i) {
27869        var c = rawBytes[i];
27870        inbuf = (inbuf << 8) | c;
27871        // bitwise addition is exclusive or
27872        // first shift inbuf and then add
27873        buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF;
27874        // truncate inbuf (assumes colors < 16)
27875        inbuf &= 0xFFFF;
27876      }
27877    } else if (bits === 8) {
27878      for (var i = 0; i < colors; ++i)
27879        buffer[pos++] = rawBytes[i];
27880      for (; i < rowBytes; ++i) {
27881        buffer[pos] = buffer[pos - colors] + rawBytes[i];
27882        pos++;
27883      }
27884    } else {
27885      var compArray = new Uint8Array(colors + 1);
27886      var bitMask = (1 << bits) - 1;
27887      var j = 0, k = bufferLength;
27888      var columns = this.columns;
27889      for (var i = 0; i < columns; ++i) {
27890        for (var kk = 0; kk < colors; ++kk) {
27891          if (inbits < bits) {
27892            inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
27893            inbits += 8;
27894          }
27895          compArray[kk] = (compArray[kk] +
27896                           (inbuf >> (inbits - bits))) & bitMask;
27897          inbits -= bits;
27898          outbuf = (outbuf << bits) | compArray[kk];
27899          outbits += bits;
27900          if (outbits >= 8) {
27901            buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;
27902            outbits -= 8;
27903          }
27904        }
27905      }
27906      if (outbits > 0) {
27907        buffer[k++] = (outbuf << (8 - outbits)) +
27908        (inbuf & ((1 << (8 - outbits)) - 1));
27909      }
27910    }
27911    this.bufferLength += rowBytes;
27912  };
27913
27914  PredictorStream.prototype.readBlockPng =
27915    function predictorStreamReadBlockPng() {
27916
27917    var rowBytes = this.rowBytes;
27918    var pixBytes = this.pixBytes;
27919
27920    var predictor = this.stream.getByte();
27921    var rawBytes = this.stream.getBytes(rowBytes);
27922
27923    var bufferLength = this.bufferLength;
27924    var buffer = this.ensureBuffer(bufferLength + rowBytes);
27925
27926    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
27927    if (prevRow.length == 0)
27928      prevRow = new Uint8Array(rowBytes);
27929
27930    var j = bufferLength;
27931    switch (predictor) {
27932      case 0:
27933        for (var i = 0; i < rowBytes; ++i)
27934          buffer[j++] = rawBytes[i];
27935        break;
27936      case 1:
27937        for (var i = 0; i < pixBytes; ++i)
27938          buffer[j++] = rawBytes[i];
27939        for (; i < rowBytes; ++i) {
27940          buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;
27941          j++;
27942        }
27943        break;
27944      case 2:
27945        for (var i = 0; i < rowBytes; ++i)
27946          buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;
27947        break;
27948      case 3:
27949        for (var i = 0; i < pixBytes; ++i)
27950          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
27951        for (; i < rowBytes; ++i) {
27952          buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +
27953                           rawBytes[i]) & 0xFF;
27954          j++;
27955        }
27956        break;
27957      case 4:
27958        // we need to save the up left pixels values. the simplest way
27959        // is to create a new buffer
27960        for (var i = 0; i < pixBytes; ++i) {
27961          var up = prevRow[i];
27962          var c = rawBytes[i];
27963          buffer[j++] = up + c;
27964        }
27965        for (; i < rowBytes; ++i) {
27966          var up = prevRow[i];
27967          var upLeft = prevRow[i - pixBytes];
27968          var left = buffer[j - pixBytes];
27969          var p = left + up - upLeft;
27970
27971          var pa = p - left;
27972          if (pa < 0)
27973            pa = -pa;
27974          var pb = p - up;
27975          if (pb < 0)
27976            pb = -pb;
27977          var pc = p - upLeft;
27978          if (pc < 0)
27979            pc = -pc;
27980
27981          var c = rawBytes[i];
27982          if (pa <= pb && pa <= pc)
27983            buffer[j++] = left + c;
27984          else if (pb <= pc)
27985            buffer[j++] = up + c;
27986          else
27987            buffer[j++] = upLeft + c;
27988        }
27989        break;
27990      default:
27991        error('Unsupported predictor: ' + predictor);
27992    }
27993    this.bufferLength += rowBytes;
27994  };
27995
27996  return PredictorStream;
27997})();
27998
27999/**
28000 * Depending on the type of JPEG a JpegStream is handled in different ways. For
28001 * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
28002 * data is stored and then loaded by the browser.  For unsupported JPEG's we use
28003 * a library to decode these images and the stream behaves like all the other
28004 * DecodeStreams.
28005 */
28006var JpegStream = (function JpegStreamClosure() {
28007  function isAdobeImage(bytes) {
28008    var maxBytesScanned = Math.max(bytes.length - 16, 1024);
28009    // Looking for APP14, 'Adobe'
28010    for (var i = 0; i < maxBytesScanned; ++i) {
28011      if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE &&
28012          bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E &&
28013          bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 &&
28014          bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 &&
28015          bytes[i + 8] == 0x65 && bytes[i + 9] == 0x00)
28016          return true;
28017      // scanning until frame tag
28018      if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0)
28019        break;
28020    }
28021    return false;
28022  }
28023
28024  function fixAdobeImage(bytes) {
28025    // Inserting 'EMBED' marker after JPEG signature
28026    var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45,
28027                                      0x44, 0]);
28028    var newBytes = new Uint8Array(bytes.length + embedMarker.length);
28029    newBytes.set(bytes, embedMarker.length);
28030    // copy JPEG header
28031    newBytes[0] = bytes[0];
28032    newBytes[1] = bytes[1];
28033    newBytes.set(embedMarker, 2);
28034    return newBytes;
28035  }
28036
28037  function JpegStream(bytes, dict, xref) {
28038    // TODO: per poppler, some images may have 'junk' before that
28039    // need to be removed
28040    this.dict = dict;
28041
28042    this.isAdobeImage = false;
28043    this.colorTransform = dict.get('ColorTransform') || -1;
28044
28045    if (isAdobeImage(bytes)) {
28046      this.isAdobeImage = true;
28047      bytes = fixAdobeImage(bytes);
28048    }
28049
28050    this.bytes = bytes;
28051
28052    DecodeStream.call(this);
28053  }
28054
28055  JpegStream.prototype = Object.create(DecodeStream.prototype);
28056
28057  JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
28058    if (this.bufferLength)
28059      return;
28060    try {
28061      var jpegImage = new JpegImage();
28062      if (this.colorTransform != -1)
28063        jpegImage.colorTransform = this.colorTransform;
28064      jpegImage.parse(this.bytes);
28065      var width = jpegImage.width;
28066      var height = jpegImage.height;
28067      var data = jpegImage.getData(width, height);
28068      this.buffer = data;
28069      this.bufferLength = data.length;
28070    } catch (e) {
28071      error('JPEG error: ' + e);
28072    }
28073  };
28074  JpegStream.prototype.getIR = function JpegStream_getIR() {
28075    return bytesToString(this.bytes);
28076  };
28077  JpegStream.prototype.getChar = function JpegStream_getChar() {
28078    error('internal error: getChar is not valid on JpegStream');
28079  };
28080  /**
28081   * Checks if the image can be decoded and displayed by the browser without any
28082   * further processing such as color space conversions.
28083   */
28084  JpegStream.prototype.isNativelySupported =
28085    function JpegStream_isNativelySupported(xref, res) {
28086    var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res);
28087    // when bug 674619 lands, let's check if browser can do
28088    // normal cmyk and then we won't need to decode in JS
28089    if (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB')
28090      return true;
28091    if (cs.name === 'DeviceCMYK' && !this.isAdobeImage &&
28092        this.colorTransform < 1)
28093      return true;
28094    return false;
28095  };
28096  /**
28097   * Checks if the image can be decoded by the browser.
28098   */
28099  JpegStream.prototype.isNativelyDecodable =
28100    function JpegStream_isNativelyDecodable(xref, res) {
28101    var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res);
28102    var numComps = cs.numComps;
28103    if (numComps == 1 || numComps == 3)
28104      return true;
28105
28106    return false;
28107  };
28108
28109  return JpegStream;
28110})();
28111
28112/**
28113 * For JPEG 2000's we use a library to decode these images and
28114 * the stream behaves like all the other DecodeStreams.
28115 */
28116var JpxStream = (function JpxStreamClosure() {
28117  function JpxStream(bytes, dict) {
28118    this.dict = dict;
28119    this.bytes = bytes;
28120
28121    DecodeStream.call(this);
28122  }
28123
28124  JpxStream.prototype = Object.create(DecodeStream.prototype);
28125
28126  JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
28127    if (this.bufferLength)
28128      return;
28129
28130    var jpxImage = new JpxImage();
28131    jpxImage.parse(this.bytes);
28132
28133    var width = jpxImage.width;
28134    var height = jpxImage.height;
28135    var componentsCount = jpxImage.componentsCount;
28136    if (componentsCount != 1 && componentsCount != 3 && componentsCount != 4)
28137      error('JPX with ' + componentsCount + ' components is not supported');
28138
28139    var data = new Uint8Array(width * height * componentsCount);
28140
28141    for (var k = 0, kk = jpxImage.tiles.length; k < kk; k++) {
28142      var tileCompoments = jpxImage.tiles[k];
28143      var tileWidth = tileCompoments[0].width;
28144      var tileHeight = tileCompoments[0].height;
28145      var tileLeft = tileCompoments[0].left;
28146      var tileTop = tileCompoments[0].top;
28147
28148      var dataPosition, sourcePosition, data0, data1, data2, data3, rowFeed;
28149      switch (componentsCount) {
28150        case 1:
28151          data0 = tileCompoments[0].items;
28152
28153          dataPosition = width * tileTop + tileLeft;
28154          rowFeed = width - tileWidth;
28155          sourcePosition = 0;
28156          for (var j = 0; j < tileHeight; j++) {
28157            for (var i = 0; i < tileWidth; i++)
28158              data[dataPosition++] = data0[sourcePosition++];
28159            dataPosition += rowFeed;
28160          }
28161          break;
28162        case 3:
28163          data0 = tileCompoments[0].items;
28164          data1 = tileCompoments[1].items;
28165          data2 = tileCompoments[2].items;
28166
28167          dataPosition = (width * tileTop + tileLeft) * 3;
28168          rowFeed = (width - tileWidth) * 3;
28169          sourcePosition = 0;
28170          for (var j = 0; j < tileHeight; j++) {
28171            for (var i = 0; i < tileWidth; i++) {
28172              data[dataPosition++] = data0[sourcePosition];
28173              data[dataPosition++] = data1[sourcePosition];
28174              data[dataPosition++] = data2[sourcePosition];
28175              sourcePosition++;
28176            }
28177            dataPosition += rowFeed;
28178          }
28179          break;
28180        case 4:
28181          data0 = tileCompoments[0].items;
28182          data1 = tileCompoments[1].items;
28183          data2 = tileCompoments[2].items;
28184          data3 = tileCompoments[3].items;
28185
28186          dataPosition = (width * tileTop + tileLeft) * 4;
28187          rowFeed = (width - tileWidth) * 4;
28188          sourcePosition = 0;
28189          for (var j = 0; j < tileHeight; j++) {
28190            for (var i = 0; i < tileWidth; i++) {
28191              data[dataPosition++] = data0[sourcePosition];
28192              data[dataPosition++] = data1[sourcePosition];
28193              data[dataPosition++] = data2[sourcePosition];
28194              data[dataPosition++] = data3[sourcePosition];
28195              sourcePosition++;
28196            }
28197            dataPosition += rowFeed;
28198          }
28199          break;
28200      }
28201    }
28202
28203    this.buffer = data;
28204    this.bufferLength = data.length;
28205  };
28206  JpxStream.prototype.getChar = function JpxStream_getChar() {
28207    error('internal error: getChar is not valid on JpxStream');
28208  };
28209
28210  return JpxStream;
28211})();
28212
28213var DecryptStream = (function DecryptStreamClosure() {
28214  function DecryptStream(str, decrypt) {
28215    this.str = str;
28216    this.dict = str.dict;
28217    this.decrypt = decrypt;
28218
28219    DecodeStream.call(this);
28220  }
28221
28222  var chunkSize = 512;
28223
28224  DecryptStream.prototype = Object.create(DecodeStream.prototype);
28225
28226  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
28227    var chunk = this.str.getBytes(chunkSize);
28228    if (!chunk || chunk.length == 0) {
28229      this.eof = true;
28230      return;
28231    }
28232    var decrypt = this.decrypt;
28233    chunk = decrypt(chunk);
28234
28235    var bufferLength = this.bufferLength;
28236    var i, n = chunk.length;
28237    var buffer = this.ensureBuffer(bufferLength + n);
28238    for (i = 0; i < n; i++)
28239      buffer[bufferLength++] = chunk[i];
28240    this.bufferLength = bufferLength;
28241  };
28242
28243  return DecryptStream;
28244})();
28245
28246var Ascii85Stream = (function Ascii85StreamClosure() {
28247  function Ascii85Stream(str) {
28248    this.str = str;
28249    this.dict = str.dict;
28250    this.input = new Uint8Array(5);
28251
28252    DecodeStream.call(this);
28253  }
28254
28255  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
28256
28257  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
28258    var tildaCode = '~'.charCodeAt(0);
28259    var zCode = 'z'.charCodeAt(0);
28260    var str = this.str;
28261
28262    var c = str.getByte();
28263    while (Lexer.isSpace(String.fromCharCode(c)))
28264      c = str.getByte();
28265
28266    if (!c || c === tildaCode) {
28267      this.eof = true;
28268      return;
28269    }
28270
28271    var bufferLength = this.bufferLength, buffer;
28272
28273    // special code for z
28274    if (c == zCode) {
28275      buffer = this.ensureBuffer(bufferLength + 4);
28276      for (var i = 0; i < 4; ++i)
28277        buffer[bufferLength + i] = 0;
28278      this.bufferLength += 4;
28279    } else {
28280      var input = this.input;
28281      input[0] = c;
28282      for (var i = 1; i < 5; ++i) {
28283        c = str.getByte();
28284        while (Lexer.isSpace(String.fromCharCode(c)))
28285          c = str.getByte();
28286
28287        input[i] = c;
28288
28289        if (!c || c == tildaCode)
28290          break;
28291      }
28292      buffer = this.ensureBuffer(bufferLength + i - 1);
28293      this.bufferLength += i - 1;
28294
28295      // partial ending;
28296      if (i < 5) {
28297        for (; i < 5; ++i)
28298          input[i] = 0x21 + 84;
28299        this.eof = true;
28300      }
28301      var t = 0;
28302      for (var i = 0; i < 5; ++i)
28303        t = t * 85 + (input[i] - 0x21);
28304
28305      for (var i = 3; i >= 0; --i) {
28306        buffer[bufferLength + i] = t & 0xFF;
28307        t >>= 8;
28308      }
28309    }
28310  };
28311
28312  return Ascii85Stream;
28313})();
28314
28315var AsciiHexStream = (function AsciiHexStreamClosure() {
28316  function AsciiHexStream(str) {
28317    this.str = str;
28318    this.dict = str.dict;
28319
28320    DecodeStream.call(this);
28321  }
28322
28323  var hexvalueMap = {
28324      9: -1, // \t
28325      32: -1, // space
28326      48: 0,
28327      49: 1,
28328      50: 2,
28329      51: 3,
28330      52: 4,
28331      53: 5,
28332      54: 6,
28333      55: 7,
28334      56: 8,
28335      57: 9,
28336      65: 10,
28337      66: 11,
28338      67: 12,
28339      68: 13,
28340      69: 14,
28341      70: 15,
28342      97: 10,
28343      98: 11,
28344      99: 12,
28345      100: 13,
28346      101: 14,
28347      102: 15
28348  };
28349
28350  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
28351
28352  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
28353    var gtCode = '>'.charCodeAt(0), bytes = this.str.getBytes(), c, n,
28354        decodeLength, buffer, bufferLength, i, length;
28355
28356    decodeLength = (bytes.length + 1) >> 1;
28357    buffer = this.ensureBuffer(this.bufferLength + decodeLength);
28358    bufferLength = this.bufferLength;
28359
28360    for (i = 0, length = bytes.length; i < length; i++) {
28361      c = hexvalueMap[bytes[i]];
28362      while (c == -1 && (i + 1) < length) {
28363        c = hexvalueMap[bytes[++i]];
28364      }
28365
28366      if ((i + 1) < length && (bytes[i + 1] !== gtCode)) {
28367        n = hexvalueMap[bytes[++i]];
28368        buffer[bufferLength++] = c * 16 + n;
28369      } else {
28370        // EOD marker at an odd number, behave as if a 0 followed the last
28371        // digit.
28372        if (bytes[i] !== gtCode) {
28373          buffer[bufferLength++] = c * 16;
28374        }
28375      }
28376    }
28377
28378    this.bufferLength = bufferLength;
28379    this.eof = true;
28380  };
28381
28382  return AsciiHexStream;
28383})();
28384
28385var RunLengthStream = (function RunLengthStreamClosure() {
28386  function RunLengthStream(str) {
28387    this.str = str;
28388    this.dict = str.dict;
28389
28390    DecodeStream.call(this);
28391  }
28392
28393  RunLengthStream.prototype = Object.create(DecodeStream.prototype);
28394
28395  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
28396    // The repeatHeader has following format. The first byte defines type of run
28397    // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes
28398    // (in addition to the second byte from the header), n = 129 through 255 -
28399    // duplicate the second byte from the header (257 - n) times, n = 128 - end.
28400    var repeatHeader = this.str.getBytes(2);
28401    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] == 128) {
28402      this.eof = true;
28403      return;
28404    }
28405
28406    var bufferLength = this.bufferLength;
28407    var n = repeatHeader[0];
28408    if (n < 128) {
28409      // copy n bytes
28410      var buffer = this.ensureBuffer(bufferLength + n + 1);
28411      buffer[bufferLength++] = repeatHeader[1];
28412      if (n > 0) {
28413        var source = this.str.getBytes(n);
28414        buffer.set(source, bufferLength);
28415        bufferLength += n;
28416      }
28417    } else {
28418      n = 257 - n;
28419      var b = repeatHeader[1];
28420      var buffer = this.ensureBuffer(bufferLength + n + 1);
28421      for (var i = 0; i < n; i++)
28422        buffer[bufferLength++] = b;
28423    }
28424    this.bufferLength = bufferLength;
28425  };
28426
28427  return RunLengthStream;
28428})();
28429
28430var CCITTFaxStream = (function CCITTFaxStreamClosure() {
28431
28432  var ccittEOL = -2;
28433  var twoDimPass = 0;
28434  var twoDimHoriz = 1;
28435  var twoDimVert0 = 2;
28436  var twoDimVertR1 = 3;
28437  var twoDimVertL1 = 4;
28438  var twoDimVertR2 = 5;
28439  var twoDimVertL2 = 6;
28440  var twoDimVertR3 = 7;
28441  var twoDimVertL3 = 8;
28442
28443  var twoDimTable = [
28444    [-1, -1], [-1, -1],                   // 000000x
28445    [7, twoDimVertL3],                    // 0000010
28446    [7, twoDimVertR3],                    // 0000011
28447    [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
28448    [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
28449    [4, twoDimPass], [4, twoDimPass],     // 0001xxx
28450    [4, twoDimPass], [4, twoDimPass],
28451    [4, twoDimPass], [4, twoDimPass],
28452    [4, twoDimPass], [4, twoDimPass],
28453    [3, twoDimHoriz], [3, twoDimHoriz],   // 001xxxx
28454    [3, twoDimHoriz], [3, twoDimHoriz],
28455    [3, twoDimHoriz], [3, twoDimHoriz],
28456    [3, twoDimHoriz], [3, twoDimHoriz],
28457    [3, twoDimHoriz], [3, twoDimHoriz],
28458    [3, twoDimHoriz], [3, twoDimHoriz],
28459    [3, twoDimHoriz], [3, twoDimHoriz],
28460    [3, twoDimHoriz], [3, twoDimHoriz],
28461    [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
28462    [3, twoDimVertL1], [3, twoDimVertL1],
28463    [3, twoDimVertL1], [3, twoDimVertL1],
28464    [3, twoDimVertL1], [3, twoDimVertL1],
28465    [3, twoDimVertL1], [3, twoDimVertL1],
28466    [3, twoDimVertL1], [3, twoDimVertL1],
28467    [3, twoDimVertL1], [3, twoDimVertL1],
28468    [3, twoDimVertL1], [3, twoDimVertL1],
28469    [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
28470    [3, twoDimVertR1], [3, twoDimVertR1],
28471    [3, twoDimVertR1], [3, twoDimVertR1],
28472    [3, twoDimVertR1], [3, twoDimVertR1],
28473    [3, twoDimVertR1], [3, twoDimVertR1],
28474    [3, twoDimVertR1], [3, twoDimVertR1],
28475    [3, twoDimVertR1], [3, twoDimVertR1],
28476    [3, twoDimVertR1], [3, twoDimVertR1],
28477    [1, twoDimVert0], [1, twoDimVert0],   // 1xxxxxx
28478    [1, twoDimVert0], [1, twoDimVert0],
28479    [1, twoDimVert0], [1, twoDimVert0],
28480    [1, twoDimVert0], [1, twoDimVert0],
28481    [1, twoDimVert0], [1, twoDimVert0],
28482    [1, twoDimVert0], [1, twoDimVert0],
28483    [1, twoDimVert0], [1, twoDimVert0],
28484    [1, twoDimVert0], [1, twoDimVert0],
28485    [1, twoDimVert0], [1, twoDimVert0],
28486    [1, twoDimVert0], [1, twoDimVert0],
28487    [1, twoDimVert0], [1, twoDimVert0],
28488    [1, twoDimVert0], [1, twoDimVert0],
28489    [1, twoDimVert0], [1, twoDimVert0],
28490    [1, twoDimVert0], [1, twoDimVert0],
28491    [1, twoDimVert0], [1, twoDimVert0],
28492    [1, twoDimVert0], [1, twoDimVert0],
28493    [1, twoDimVert0], [1, twoDimVert0],
28494    [1, twoDimVert0], [1, twoDimVert0],
28495    [1, twoDimVert0], [1, twoDimVert0],
28496    [1, twoDimVert0], [1, twoDimVert0],
28497    [1, twoDimVert0], [1, twoDimVert0],
28498    [1, twoDimVert0], [1, twoDimVert0],
28499    [1, twoDimVert0], [1, twoDimVert0],
28500    [1, twoDimVert0], [1, twoDimVert0],
28501    [1, twoDimVert0], [1, twoDimVert0],
28502    [1, twoDimVert0], [1, twoDimVert0],
28503    [1, twoDimVert0], [1, twoDimVert0],
28504    [1, twoDimVert0], [1, twoDimVert0],
28505    [1, twoDimVert0], [1, twoDimVert0],
28506    [1, twoDimVert0], [1, twoDimVert0],
28507    [1, twoDimVert0], [1, twoDimVert0],
28508    [1, twoDimVert0], [1, twoDimVert0]
28509  ];
28510
28511  var whiteTable1 = [
28512    [-1, -1],                               // 00000
28513    [12, ccittEOL],                         // 00001
28514    [-1, -1], [-1, -1],                     // 0001x
28515    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
28516    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
28517    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
28518    [11, 1792], [11, 1792],                 // 1000x
28519    [12, 1984],                             // 10010
28520    [12, 2048],                             // 10011
28521    [12, 2112],                             // 10100
28522    [12, 2176],                             // 10101
28523    [12, 2240],                             // 10110
28524    [12, 2304],                             // 10111
28525    [11, 1856], [11, 1856],                 // 1100x
28526    [11, 1920], [11, 1920],                 // 1101x
28527    [12, 2368],                             // 11100
28528    [12, 2432],                             // 11101
28529    [12, 2496],                             // 11110
28530    [12, 2560]                              // 11111
28531  ];
28532
28533  var whiteTable2 = [
28534    [-1, -1], [-1, -1], [-1, -1], [-1, -1],     // 0000000xx
28535    [8, 29], [8, 29],                           // 00000010x
28536    [8, 30], [8, 30],                           // 00000011x
28537    [8, 45], [8, 45],                           // 00000100x
28538    [8, 46], [8, 46],                           // 00000101x
28539    [7, 22], [7, 22], [7, 22], [7, 22],         // 0000011xx
28540    [7, 23], [7, 23], [7, 23], [7, 23],         // 0000100xx
28541    [8, 47], [8, 47],                           // 00001010x
28542    [8, 48], [8, 48],                           // 00001011x
28543    [6, 13], [6, 13], [6, 13], [6, 13],         // 000011xxx
28544    [6, 13], [6, 13], [6, 13], [6, 13],
28545    [7, 20], [7, 20], [7, 20], [7, 20],         // 0001000xx
28546    [8, 33], [8, 33],                           // 00010010x
28547    [8, 34], [8, 34],                           // 00010011x
28548    [8, 35], [8, 35],                           // 00010100x
28549    [8, 36], [8, 36],                           // 00010101x
28550    [8, 37], [8, 37],                           // 00010110x
28551    [8, 38], [8, 38],                           // 00010111x
28552    [7, 19], [7, 19], [7, 19], [7, 19],         // 0001100xx
28553    [8, 31], [8, 31],                           // 00011010x
28554    [8, 32], [8, 32],                           // 00011011x
28555    [6, 1], [6, 1], [6, 1], [6, 1],             // 000111xxx
28556    [6, 1], [6, 1], [6, 1], [6, 1],
28557    [6, 12], [6, 12], [6, 12], [6, 12],         // 001000xxx
28558    [6, 12], [6, 12], [6, 12], [6, 12],
28559    [8, 53], [8, 53],                           // 00100100x
28560    [8, 54], [8, 54],                           // 00100101x
28561    [7, 26], [7, 26], [7, 26], [7, 26],         // 0010011xx
28562    [8, 39], [8, 39],                           // 00101000x
28563    [8, 40], [8, 40],                           // 00101001x
28564    [8, 41], [8, 41],                           // 00101010x
28565    [8, 42], [8, 42],                           // 00101011x
28566    [8, 43], [8, 43],                           // 00101100x
28567    [8, 44], [8, 44],                           // 00101101x
28568    [7, 21], [7, 21], [7, 21], [7, 21],         // 0010111xx
28569    [7, 28], [7, 28], [7, 28], [7, 28],         // 0011000xx
28570    [8, 61], [8, 61],                           // 00110010x
28571    [8, 62], [8, 62],                           // 00110011x
28572    [8, 63], [8, 63],                           // 00110100x
28573    [8, 0], [8, 0],                             // 00110101x
28574    [8, 320], [8, 320],                         // 00110110x
28575    [8, 384], [8, 384],                         // 00110111x
28576    [5, 10], [5, 10], [5, 10], [5, 10],         // 00111xxxx
28577    [5, 10], [5, 10], [5, 10], [5, 10],
28578    [5, 10], [5, 10], [5, 10], [5, 10],
28579    [5, 10], [5, 10], [5, 10], [5, 10],
28580    [5, 11], [5, 11], [5, 11], [5, 11],         // 01000xxxx
28581    [5, 11], [5, 11], [5, 11], [5, 11],
28582    [5, 11], [5, 11], [5, 11], [5, 11],
28583    [5, 11], [5, 11], [5, 11], [5, 11],
28584    [7, 27], [7, 27], [7, 27], [7, 27],         // 0100100xx
28585    [8, 59], [8, 59],                           // 01001010x
28586    [8, 60], [8, 60],                           // 01001011x
28587    [9, 1472],                                  // 010011000
28588    [9, 1536],                                  // 010011001
28589    [9, 1600],                                  // 010011010
28590    [9, 1728],                                  // 010011011
28591    [7, 18], [7, 18], [7, 18], [7, 18],         // 0100111xx
28592    [7, 24], [7, 24], [7, 24], [7, 24],         // 0101000xx
28593    [8, 49], [8, 49],                           // 01010010x
28594    [8, 50], [8, 50],                           // 01010011x
28595    [8, 51], [8, 51],                           // 01010100x
28596    [8, 52], [8, 52],                           // 01010101x
28597    [7, 25], [7, 25], [7, 25], [7, 25],         // 0101011xx
28598    [8, 55], [8, 55],                           // 01011000x
28599    [8, 56], [8, 56],                           // 01011001x
28600    [8, 57], [8, 57],                           // 01011010x
28601    [8, 58], [8, 58],                           // 01011011x
28602    [6, 192], [6, 192], [6, 192], [6, 192],     // 010111xxx
28603    [6, 192], [6, 192], [6, 192], [6, 192],
28604    [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
28605    [6, 1664], [6, 1664], [6, 1664], [6, 1664],
28606    [8, 448], [8, 448],                         // 01100100x
28607    [8, 512], [8, 512],                         // 01100101x
28608    [9, 704],                                   // 011001100
28609    [9, 768],                                   // 011001101
28610    [8, 640], [8, 640],                         // 01100111x
28611    [8, 576], [8, 576],                         // 01101000x
28612    [9, 832],                                   // 011010010
28613    [9, 896],                                   // 011010011
28614    [9, 960],                                   // 011010100
28615    [9, 1024],                                  // 011010101
28616    [9, 1088],                                  // 011010110
28617    [9, 1152],                                  // 011010111
28618    [9, 1216],                                  // 011011000
28619    [9, 1280],                                  // 011011001
28620    [9, 1344],                                  // 011011010
28621    [9, 1408],                                  // 011011011
28622    [7, 256], [7, 256], [7, 256], [7, 256],     // 0110111xx
28623    [4, 2], [4, 2], [4, 2], [4, 2],             // 0111xxxxx
28624    [4, 2], [4, 2], [4, 2], [4, 2],
28625    [4, 2], [4, 2], [4, 2], [4, 2],
28626    [4, 2], [4, 2], [4, 2], [4, 2],
28627    [4, 2], [4, 2], [4, 2], [4, 2],
28628    [4, 2], [4, 2], [4, 2], [4, 2],
28629    [4, 2], [4, 2], [4, 2], [4, 2],
28630    [4, 2], [4, 2], [4, 2], [4, 2],
28631    [4, 3], [4, 3], [4, 3], [4, 3],             // 1000xxxxx
28632    [4, 3], [4, 3], [4, 3], [4, 3],
28633    [4, 3], [4, 3], [4, 3], [4, 3],
28634    [4, 3], [4, 3], [4, 3], [4, 3],
28635    [4, 3], [4, 3], [4, 3], [4, 3],
28636    [4, 3], [4, 3], [4, 3], [4, 3],
28637    [4, 3], [4, 3], [4, 3], [4, 3],
28638    [4, 3], [4, 3], [4, 3], [4, 3],
28639    [5, 128], [5, 128], [5, 128], [5, 128],     // 10010xxxx
28640    [5, 128], [5, 128], [5, 128], [5, 128],
28641    [5, 128], [5, 128], [5, 128], [5, 128],
28642    [5, 128], [5, 128], [5, 128], [5, 128],
28643    [5, 8], [5, 8], [5, 8], [5, 8],             // 10011xxxx
28644    [5, 8], [5, 8], [5, 8], [5, 8],
28645    [5, 8], [5, 8], [5, 8], [5, 8],
28646    [5, 8], [5, 8], [5, 8], [5, 8],
28647    [5, 9], [5, 9], [5, 9], [5, 9],             // 10100xxxx
28648    [5, 9], [5, 9], [5, 9], [5, 9],
28649    [5, 9], [5, 9], [5, 9], [5, 9],
28650    [5, 9], [5, 9], [5, 9], [5, 9],
28651    [6, 16], [6, 16], [6, 16], [6, 16],         // 101010xxx
28652    [6, 16], [6, 16], [6, 16], [6, 16],
28653    [6, 17], [6, 17], [6, 17], [6, 17],         // 101011xxx
28654    [6, 17], [6, 17], [6, 17], [6, 17],
28655    [4, 4], [4, 4], [4, 4], [4, 4],             // 1011xxxxx
28656    [4, 4], [4, 4], [4, 4], [4, 4],
28657    [4, 4], [4, 4], [4, 4], [4, 4],
28658    [4, 4], [4, 4], [4, 4], [4, 4],
28659    [4, 4], [4, 4], [4, 4], [4, 4],
28660    [4, 4], [4, 4], [4, 4], [4, 4],
28661    [4, 4], [4, 4], [4, 4], [4, 4],
28662    [4, 4], [4, 4], [4, 4], [4, 4],
28663    [4, 5], [4, 5], [4, 5], [4, 5],             // 1100xxxxx
28664    [4, 5], [4, 5], [4, 5], [4, 5],
28665    [4, 5], [4, 5], [4, 5], [4, 5],
28666    [4, 5], [4, 5], [4, 5], [4, 5],
28667    [4, 5], [4, 5], [4, 5], [4, 5],
28668    [4, 5], [4, 5], [4, 5], [4, 5],
28669    [4, 5], [4, 5], [4, 5], [4, 5],
28670    [4, 5], [4, 5], [4, 5], [4, 5],
28671    [6, 14], [6, 14], [6, 14], [6, 14],         // 110100xxx
28672    [6, 14], [6, 14], [6, 14], [6, 14],
28673    [6, 15], [6, 15], [6, 15], [6, 15],         // 110101xxx
28674    [6, 15], [6, 15], [6, 15], [6, 15],
28675    [5, 64], [5, 64], [5, 64], [5, 64],         // 11011xxxx
28676    [5, 64], [5, 64], [5, 64], [5, 64],
28677    [5, 64], [5, 64], [5, 64], [5, 64],
28678    [5, 64], [5, 64], [5, 64], [5, 64],
28679    [4, 6], [4, 6], [4, 6], [4, 6],             // 1110xxxxx
28680    [4, 6], [4, 6], [4, 6], [4, 6],
28681    [4, 6], [4, 6], [4, 6], [4, 6],
28682    [4, 6], [4, 6], [4, 6], [4, 6],
28683    [4, 6], [4, 6], [4, 6], [4, 6],
28684    [4, 6], [4, 6], [4, 6], [4, 6],
28685    [4, 6], [4, 6], [4, 6], [4, 6],
28686    [4, 6], [4, 6], [4, 6], [4, 6],
28687    [4, 7], [4, 7], [4, 7], [4, 7],             // 1111xxxxx
28688    [4, 7], [4, 7], [4, 7], [4, 7],
28689    [4, 7], [4, 7], [4, 7], [4, 7],
28690    [4, 7], [4, 7], [4, 7], [4, 7],
28691    [4, 7], [4, 7], [4, 7], [4, 7],
28692    [4, 7], [4, 7], [4, 7], [4, 7],
28693    [4, 7], [4, 7], [4, 7], [4, 7],
28694    [4, 7], [4, 7], [4, 7], [4, 7]
28695  ];
28696
28697  var blackTable1 = [
28698    [-1, -1], [-1, -1],                             // 000000000000x
28699    [12, ccittEOL], [12, ccittEOL],                 // 000000000001x
28700    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000001xx
28701    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000010xx
28702    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000011xx
28703    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000100xx
28704    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000101xx
28705    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000110xx
28706    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000111xx
28707    [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
28708    [12, 1984], [12, 1984],                         // 000000010010x
28709    [12, 2048], [12, 2048],                         // 000000010011x
28710    [12, 2112], [12, 2112],                         // 000000010100x
28711    [12, 2176], [12, 2176],                         // 000000010101x
28712    [12, 2240], [12, 2240],                         // 000000010110x
28713    [12, 2304], [12, 2304],                         // 000000010111x
28714    [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
28715    [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
28716    [12, 2368], [12, 2368],                         // 000000011100x
28717    [12, 2432], [12, 2432],                         // 000000011101x
28718    [12, 2496], [12, 2496],                         // 000000011110x
28719    [12, 2560], [12, 2560],                         // 000000011111x
28720    [10, 18], [10, 18], [10, 18], [10, 18],         // 0000001000xxx
28721    [10, 18], [10, 18], [10, 18], [10, 18],
28722    [12, 52], [12, 52],                             // 000000100100x
28723    [13, 640],                                      // 0000001001010
28724    [13, 704],                                      // 0000001001011
28725    [13, 768],                                      // 0000001001100
28726    [13, 832],                                      // 0000001001101
28727    [12, 55], [12, 55],                             // 000000100111x
28728    [12, 56], [12, 56],                             // 000000101000x
28729    [13, 1280],                                     // 0000001010010
28730    [13, 1344],                                     // 0000001010011
28731    [13, 1408],                                     // 0000001010100
28732    [13, 1472],                                     // 0000001010101
28733    [12, 59], [12, 59],                             // 000000101011x
28734    [12, 60], [12, 60],                             // 000000101100x
28735    [13, 1536],                                     // 0000001011010
28736    [13, 1600],                                     // 0000001011011
28737    [11, 24], [11, 24], [11, 24], [11, 24],         // 00000010111xx
28738    [11, 25], [11, 25], [11, 25], [11, 25],         // 00000011000xx
28739    [13, 1664],                                     // 0000001100100
28740    [13, 1728],                                     // 0000001100101
28741    [12, 320], [12, 320],                           // 000000110011x
28742    [12, 384], [12, 384],                           // 000000110100x
28743    [12, 448], [12, 448],                           // 000000110101x
28744    [13, 512],                                      // 0000001101100
28745    [13, 576],                                      // 0000001101101
28746    [12, 53], [12, 53],                             // 000000110111x
28747    [12, 54], [12, 54],                             // 000000111000x
28748    [13, 896],                                      // 0000001110010
28749    [13, 960],                                      // 0000001110011
28750    [13, 1024],                                     // 0000001110100
28751    [13, 1088],                                     // 0000001110101
28752    [13, 1152],                                     // 0000001110110
28753    [13, 1216],                                     // 0000001110111
28754    [10, 64], [10, 64], [10, 64], [10, 64],         // 0000001111xxx
28755    [10, 64], [10, 64], [10, 64], [10, 64]
28756  ];
28757
28758  var blackTable2 = [
28759    [8, 13], [8, 13], [8, 13], [8, 13],     // 00000100xxxx
28760    [8, 13], [8, 13], [8, 13], [8, 13],
28761    [8, 13], [8, 13], [8, 13], [8, 13],
28762    [8, 13], [8, 13], [8, 13], [8, 13],
28763    [11, 23], [11, 23],                     // 00000101000x
28764    [12, 50],                               // 000001010010
28765    [12, 51],                               // 000001010011
28766    [12, 44],                               // 000001010100
28767    [12, 45],                               // 000001010101
28768    [12, 46],                               // 000001010110
28769    [12, 47],                               // 000001010111
28770    [12, 57],                               // 000001011000
28771    [12, 58],                               // 000001011001
28772    [12, 61],                               // 000001011010
28773    [12, 256],                              // 000001011011
28774    [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
28775    [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
28776    [12, 48],                               // 000001100100
28777    [12, 49],                               // 000001100101
28778    [12, 62],                               // 000001100110
28779    [12, 63],                               // 000001100111
28780    [12, 30],                               // 000001101000
28781    [12, 31],                               // 000001101001
28782    [12, 32],                               // 000001101010
28783    [12, 33],                               // 000001101011
28784    [12, 40],                               // 000001101100
28785    [12, 41],                               // 000001101101
28786    [11, 22], [11, 22],                     // 00000110111x
28787    [8, 14], [8, 14], [8, 14], [8, 14],     // 00000111xxxx
28788    [8, 14], [8, 14], [8, 14], [8, 14],
28789    [8, 14], [8, 14], [8, 14], [8, 14],
28790    [8, 14], [8, 14], [8, 14], [8, 14],
28791    [7, 10], [7, 10], [7, 10], [7, 10],     // 0000100xxxxx
28792    [7, 10], [7, 10], [7, 10], [7, 10],
28793    [7, 10], [7, 10], [7, 10], [7, 10],
28794    [7, 10], [7, 10], [7, 10], [7, 10],
28795    [7, 10], [7, 10], [7, 10], [7, 10],
28796    [7, 10], [7, 10], [7, 10], [7, 10],
28797    [7, 10], [7, 10], [7, 10], [7, 10],
28798    [7, 10], [7, 10], [7, 10], [7, 10],
28799    [7, 11], [7, 11], [7, 11], [7, 11],     // 0000101xxxxx
28800    [7, 11], [7, 11], [7, 11], [7, 11],
28801    [7, 11], [7, 11], [7, 11], [7, 11],
28802    [7, 11], [7, 11], [7, 11], [7, 11],
28803    [7, 11], [7, 11], [7, 11], [7, 11],
28804    [7, 11], [7, 11], [7, 11], [7, 11],
28805    [7, 11], [7, 11], [7, 11], [7, 11],
28806    [7, 11], [7, 11], [7, 11], [7, 11],
28807    [9, 15], [9, 15], [9, 15], [9, 15],     // 000011000xxx
28808    [9, 15], [9, 15], [9, 15], [9, 15],
28809    [12, 128],                              // 000011001000
28810    [12, 192],                              // 000011001001
28811    [12, 26],                               // 000011001010
28812    [12, 27],                               // 000011001011
28813    [12, 28],                               // 000011001100
28814    [12, 29],                               // 000011001101
28815    [11, 19], [11, 19],                     // 00001100111x
28816    [11, 20], [11, 20],                     // 00001101000x
28817    [12, 34],                               // 000011010010
28818    [12, 35],                               // 000011010011
28819    [12, 36],                               // 000011010100
28820    [12, 37],                               // 000011010101
28821    [12, 38],                               // 000011010110
28822    [12, 39],                               // 000011010111
28823    [11, 21], [11, 21],                     // 00001101100x
28824    [12, 42],                               // 000011011010
28825    [12, 43],                               // 000011011011
28826    [10, 0], [10, 0], [10, 0], [10, 0],     // 0000110111xx
28827    [7, 12], [7, 12], [7, 12], [7, 12],     // 0000111xxxxx
28828    [7, 12], [7, 12], [7, 12], [7, 12],
28829    [7, 12], [7, 12], [7, 12], [7, 12],
28830    [7, 12], [7, 12], [7, 12], [7, 12],
28831    [7, 12], [7, 12], [7, 12], [7, 12],
28832    [7, 12], [7, 12], [7, 12], [7, 12],
28833    [7, 12], [7, 12], [7, 12], [7, 12],
28834    [7, 12], [7, 12], [7, 12], [7, 12]
28835  ];
28836
28837  var blackTable3 = [
28838    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
28839    [6, 9],                                 // 000100
28840    [6, 8],                                 // 000101
28841    [5, 7], [5, 7],                         // 00011x
28842    [4, 6], [4, 6], [4, 6], [4, 6],         // 0010xx
28843    [4, 5], [4, 5], [4, 5], [4, 5],         // 0011xx
28844    [3, 1], [3, 1], [3, 1], [3, 1],         // 010xxx
28845    [3, 1], [3, 1], [3, 1], [3, 1],
28846    [3, 4], [3, 4], [3, 4], [3, 4],         // 011xxx
28847    [3, 4], [3, 4], [3, 4], [3, 4],
28848    [2, 3], [2, 3], [2, 3], [2, 3],         // 10xxxx
28849    [2, 3], [2, 3], [2, 3], [2, 3],
28850    [2, 3], [2, 3], [2, 3], [2, 3],
28851    [2, 3], [2, 3], [2, 3], [2, 3],
28852    [2, 2], [2, 2], [2, 2], [2, 2],         // 11xxxx
28853    [2, 2], [2, 2], [2, 2], [2, 2],
28854    [2, 2], [2, 2], [2, 2], [2, 2],
28855    [2, 2], [2, 2], [2, 2], [2, 2]
28856  ];
28857
28858  function CCITTFaxStream(str, params) {
28859    this.str = str;
28860    this.dict = str.dict;
28861
28862    params = params || new Dict();
28863
28864    this.encoding = params.get('K') || 0;
28865    this.eoline = params.get('EndOfLine') || false;
28866    this.byteAlign = params.get('EncodedByteAlign') || false;
28867    this.columns = params.get('Columns') || 1728;
28868    this.rows = params.get('Rows') || 0;
28869    var eoblock = params.get('EndOfBlock');
28870    if (eoblock == null)
28871      eoblock = true;
28872    this.eoblock = eoblock;
28873    this.black = params.get('BlackIs1') || false;
28874
28875    this.codingLine = new Uint32Array(this.columns + 1);
28876    this.refLine = new Uint32Array(this.columns + 2);
28877
28878    this.codingLine[0] = this.columns;
28879    this.codingPos = 0;
28880
28881    this.row = 0;
28882    this.nextLine2D = this.encoding < 0;
28883    this.inputBits = 0;
28884    this.inputBuf = 0;
28885    this.outputBits = 0;
28886    this.buf = EOF;
28887
28888    var code1;
28889    while ((code1 = this.lookBits(12)) == 0) {
28890      this.eatBits(1);
28891    }
28892    if (code1 == 1) {
28893      this.eatBits(12);
28894    }
28895    if (this.encoding > 0) {
28896      this.nextLine2D = !this.lookBits(1);
28897      this.eatBits(1);
28898    }
28899
28900    DecodeStream.call(this);
28901  }
28902
28903  CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);
28904
28905  CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {
28906    while (!this.eof) {
28907      var c = this.lookChar();
28908      this.buf = EOF;
28909      this.ensureBuffer(this.bufferLength + 1);
28910      this.buffer[this.bufferLength++] = c;
28911    }
28912  };
28913
28914  CCITTFaxStream.prototype.addPixels =
28915    function ccittFaxStreamAddPixels(a1, blackPixels) {
28916    var codingLine = this.codingLine;
28917    var codingPos = this.codingPos;
28918
28919    if (a1 > codingLine[codingPos]) {
28920      if (a1 > this.columns) {
28921        warn('row is wrong length');
28922        this.err = true;
28923        a1 = this.columns;
28924      }
28925      if ((codingPos & 1) ^ blackPixels) {
28926        ++codingPos;
28927      }
28928
28929      codingLine[codingPos] = a1;
28930    }
28931    this.codingPos = codingPos;
28932  };
28933
28934  CCITTFaxStream.prototype.addPixelsNeg =
28935    function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
28936    var codingLine = this.codingLine;
28937    var codingPos = this.codingPos;
28938
28939    if (a1 > codingLine[codingPos]) {
28940      if (a1 > this.columns) {
28941        warn('row is wrong length');
28942        this.err = true;
28943        a1 = this.columns;
28944      }
28945      if ((codingPos & 1) ^ blackPixels)
28946        ++codingPos;
28947
28948      codingLine[codingPos] = a1;
28949    } else if (a1 < codingLine[codingPos]) {
28950      if (a1 < 0) {
28951        warn('invalid code');
28952        this.err = true;
28953        a1 = 0;
28954      }
28955      while (codingPos > 0 && a1 < codingLine[codingPos - 1])
28956        --codingPos;
28957      codingLine[codingPos] = a1;
28958    }
28959
28960    this.codingPos = codingPos;
28961  };
28962
28963  CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {
28964    if (this.buf != EOF)
28965      return this.buf;
28966
28967    var refLine = this.refLine;
28968    var codingLine = this.codingLine;
28969    var columns = this.columns;
28970
28971    var refPos, blackPixels, bits;
28972
28973    if (this.outputBits == 0) {
28974      if (this.eof)
28975        return null;
28976
28977      this.err = false;
28978
28979      var code1, code2, code3;
28980      if (this.nextLine2D) {
28981        for (var i = 0; codingLine[i] < columns; ++i)
28982          refLine[i] = codingLine[i];
28983
28984        refLine[i++] = columns;
28985        refLine[i] = columns;
28986        codingLine[0] = 0;
28987        this.codingPos = 0;
28988        refPos = 0;
28989        blackPixels = 0;
28990
28991        while (codingLine[this.codingPos] < columns) {
28992          code1 = this.getTwoDimCode();
28993          switch (code1) {
28994            case twoDimPass:
28995              this.addPixels(refLine[refPos + 1], blackPixels);
28996              if (refLine[refPos + 1] < columns)
28997                refPos += 2;
28998              break;
28999            case twoDimHoriz:
29000              code1 = code2 = 0;
29001              if (blackPixels) {
29002                do {
29003                  code1 += (code3 = this.getBlackCode());
29004                } while (code3 >= 64);
29005                do {
29006                  code2 += (code3 = this.getWhiteCode());
29007                } while (code3 >= 64);
29008              } else {
29009                do {
29010                  code1 += (code3 = this.getWhiteCode());
29011                } while (code3 >= 64);
29012                do {
29013                  code2 += (code3 = this.getBlackCode());
29014                } while (code3 >= 64);
29015              }
29016              this.addPixels(codingLine[this.codingPos] +
29017                             code1, blackPixels);
29018              if (codingLine[this.codingPos] < columns) {
29019                this.addPixels(codingLine[this.codingPos] + code2,
29020                               blackPixels ^ 1);
29021              }
29022              while (refLine[refPos] <= codingLine[this.codingPos] &&
29023                     refLine[refPos] < columns) {
29024                refPos += 2;
29025              }
29026              break;
29027            case twoDimVertR3:
29028              this.addPixels(refLine[refPos] + 3, blackPixels);
29029              blackPixels ^= 1;
29030              if (codingLine[this.codingPos] < columns) {
29031                ++refPos;
29032                while (refLine[refPos] <= codingLine[this.codingPos] &&
29033                       refLine[refPos] < columns)
29034                  refPos += 2;
29035              }
29036              break;
29037            case twoDimVertR2:
29038              this.addPixels(refLine[refPos] + 2, blackPixels);
29039              blackPixels ^= 1;
29040              if (codingLine[this.codingPos] < columns) {
29041                ++refPos;
29042                while (refLine[refPos] <= codingLine[this.codingPos] &&
29043                       refLine[refPos] < columns) {
29044                  refPos += 2;
29045                }
29046              }
29047              break;
29048            case twoDimVertR1:
29049              this.addPixels(refLine[refPos] + 1, blackPixels);
29050              blackPixels ^= 1;
29051              if (codingLine[this.codingPos] < columns) {
29052                ++refPos;
29053                while (refLine[refPos] <= codingLine[this.codingPos] &&
29054                       refLine[refPos] < columns)
29055                  refPos += 2;
29056              }
29057              break;
29058            case twoDimVert0:
29059              this.addPixels(refLine[refPos], blackPixels);
29060              blackPixels ^= 1;
29061              if (codingLine[this.codingPos] < columns) {
29062                ++refPos;
29063                while (refLine[refPos] <= codingLine[this.codingPos] &&
29064                       refLine[refPos] < columns)
29065                  refPos += 2;
29066              }
29067              break;
29068            case twoDimVertL3:
29069              this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
29070              blackPixels ^= 1;
29071              if (codingLine[this.codingPos] < columns) {
29072                if (refPos > 0)
29073                  --refPos;
29074                else
29075                  ++refPos;
29076                while (refLine[refPos] <= codingLine[this.codingPos] &&
29077                       refLine[refPos] < columns)
29078                  refPos += 2;
29079              }
29080              break;
29081            case twoDimVertL2:
29082              this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
29083              blackPixels ^= 1;
29084              if (codingLine[this.codingPos] < columns) {
29085                if (refPos > 0)
29086                  --refPos;
29087                else
29088                  ++refPos;
29089                while (refLine[refPos] <= codingLine[this.codingPos] &&
29090                       refLine[refPos] < columns)
29091                  refPos += 2;
29092              }
29093              break;
29094            case twoDimVertL1:
29095              this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
29096              blackPixels ^= 1;
29097              if (codingLine[this.codingPos] < columns) {
29098                if (refPos > 0)
29099                  --refPos;
29100                else
29101                  ++refPos;
29102
29103                while (refLine[refPos] <= codingLine[this.codingPos] &&
29104                       refLine[refPos] < columns)
29105                  refPos += 2;
29106              }
29107              break;
29108            case EOF:
29109              this.addPixels(columns, 0);
29110              this.eof = true;
29111              break;
29112            default:
29113              warn('bad 2d code');
29114              this.addPixels(columns, 0);
29115              this.err = true;
29116          }
29117        }
29118      } else {
29119        codingLine[0] = 0;
29120        this.codingPos = 0;
29121        blackPixels = 0;
29122        while (codingLine[this.codingPos] < columns) {
29123          code1 = 0;
29124          if (blackPixels) {
29125            do {
29126              code1 += (code3 = this.getBlackCode());
29127            } while (code3 >= 64);
29128          } else {
29129            do {
29130              code1 += (code3 = this.getWhiteCode());
29131            } while (code3 >= 64);
29132          }
29133          this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
29134          blackPixels ^= 1;
29135        }
29136      }
29137
29138      if (this.byteAlign)
29139        this.inputBits &= ~7;
29140
29141      var gotEOL = false;
29142
29143      if (!this.eoblock && this.row == this.rows - 1) {
29144        this.eof = true;
29145      } else {
29146        code1 = this.lookBits(12);
29147        while (code1 == 0) {
29148          this.eatBits(1);
29149          code1 = this.lookBits(12);
29150        }
29151        if (code1 == 1) {
29152          this.eatBits(12);
29153          gotEOL = true;
29154        } else if (code1 == EOF) {
29155          this.eof = true;
29156        }
29157      }
29158
29159      if (!this.eof && this.encoding > 0) {
29160        this.nextLine2D = !this.lookBits(1);
29161        this.eatBits(1);
29162      }
29163
29164      if (this.eoblock && gotEOL) {
29165        code1 = this.lookBits(12);
29166        if (code1 == 1) {
29167          this.eatBits(12);
29168          if (this.encoding > 0) {
29169            this.lookBits(1);
29170            this.eatBits(1);
29171          }
29172          if (this.encoding >= 0) {
29173            for (var i = 0; i < 4; ++i) {
29174              code1 = this.lookBits(12);
29175              if (code1 != 1)
29176                warn('bad rtc code: ' + code1);
29177              this.eatBits(12);
29178              if (this.encoding > 0) {
29179                this.lookBits(1);
29180                this.eatBits(1);
29181              }
29182            }
29183          }
29184          this.eof = true;
29185        }
29186      } else if (this.err && this.eoline) {
29187        while (true) {
29188          code1 = this.lookBits(13);
29189          if (code1 == EOF) {
29190            this.eof = true;
29191            return null;
29192          }
29193          if ((code1 >> 1) == 1) {
29194            break;
29195          }
29196          this.eatBits(1);
29197        }
29198        this.eatBits(12);
29199        if (this.encoding > 0) {
29200          this.eatBits(1);
29201          this.nextLine2D = !(code1 & 1);
29202        }
29203      }
29204
29205      if (codingLine[0] > 0)
29206        this.outputBits = codingLine[this.codingPos = 0];
29207      else
29208        this.outputBits = codingLine[this.codingPos = 1];
29209      this.row++;
29210    }
29211
29212    if (this.outputBits >= 8) {
29213      this.buf = (this.codingPos & 1) ? 0 : 0xFF;
29214      this.outputBits -= 8;
29215      if (this.outputBits == 0 && codingLine[this.codingPos] < columns) {
29216        this.codingPos++;
29217        this.outputBits = (codingLine[this.codingPos] -
29218                           codingLine[this.codingPos - 1]);
29219      }
29220    } else {
29221      var bits = 8;
29222      this.buf = 0;
29223      do {
29224        if (this.outputBits > bits) {
29225          this.buf <<= bits;
29226          if (!(this.codingPos & 1)) {
29227            this.buf |= 0xFF >> (8 - bits);
29228          }
29229          this.outputBits -= bits;
29230          bits = 0;
29231        } else {
29232          this.buf <<= this.outputBits;
29233          if (!(this.codingPos & 1)) {
29234            this.buf |= 0xFF >> (8 - this.outputBits);
29235          }
29236          bits -= this.outputBits;
29237          this.outputBits = 0;
29238          if (codingLine[this.codingPos] < columns) {
29239            this.codingPos++;
29240            this.outputBits = (codingLine[this.codingPos] -
29241                               codingLine[this.codingPos - 1]);
29242          } else if (bits > 0) {
29243            this.buf <<= bits;
29244            bits = 0;
29245          }
29246        }
29247      } while (bits);
29248    }
29249    if (this.black) {
29250      this.buf ^= 0xFF;
29251    }
29252    return this.buf;
29253  };
29254
29255  // This functions returns the code found from the table.
29256  // The start and end parameters set the boundaries for searching the table.
29257  // The limit parameter is optional. Function returns an array with three
29258  // values. The first array element indicates whether a valid code is being
29259  // returned. The second array element is the actual code. The third array
29260  // element indicates whether EOF was reached.
29261  CCITTFaxStream.prototype.findTableCode =
29262    function ccittFaxStreamFindTableCode(start, end, table, limit) {
29263
29264    var limitValue = limit || 0;
29265    for (var i = start; i <= end; ++i) {
29266      var code = this.lookBits(i);
29267      if (code == EOF)
29268        return [true, 1, false];
29269      if (i < end)
29270        code <<= end - i;
29271      if (!limitValue || code >= limitValue) {
29272        var p = table[code - limitValue];
29273        if (p[0] == i) {
29274          this.eatBits(i);
29275          return [true, p[1], true];
29276        }
29277      }
29278    }
29279    return [false, 0, false];
29280  };
29281
29282  CCITTFaxStream.prototype.getTwoDimCode =
29283    function ccittFaxStreamGetTwoDimCode() {
29284
29285    var code = 0;
29286    var p;
29287    if (this.eoblock) {
29288      code = this.lookBits(7);
29289      p = twoDimTable[code];
29290      if (p && p[0] > 0) {
29291        this.eatBits(p[0]);
29292        return p[1];
29293      }
29294    } else {
29295      var result = this.findTableCode(1, 7, twoDimTable);
29296      if (result[0] && result[2])
29297        return result[1];
29298    }
29299    warn('Bad two dim code');
29300    return EOF;
29301  };
29302
29303  CCITTFaxStream.prototype.getWhiteCode =
29304    function ccittFaxStreamGetWhiteCode() {
29305
29306    var code = 0;
29307    var p;
29308    var n;
29309    if (this.eoblock) {
29310      code = this.lookBits(12);
29311      if (code == EOF)
29312        return 1;
29313
29314      if ((code >> 5) == 0)
29315        p = whiteTable1[code];
29316      else
29317        p = whiteTable2[code >> 3];
29318
29319      if (p[0] > 0) {
29320        this.eatBits(p[0]);
29321        return p[1];
29322      }
29323    } else {
29324      var result = this.findTableCode(1, 9, whiteTable2);
29325      if (result[0])
29326        return result[1];
29327
29328      result = this.findTableCode(11, 12, whiteTable1);
29329      if (result[0])
29330        return result[1];
29331    }
29332    warn('bad white code');
29333    this.eatBits(1);
29334    return 1;
29335  };
29336
29337  CCITTFaxStream.prototype.getBlackCode =
29338    function ccittFaxStreamGetBlackCode() {
29339
29340    var code, p;
29341    if (this.eoblock) {
29342      code = this.lookBits(13);
29343      if (code == EOF)
29344        return 1;
29345      if ((code >> 7) == 0)
29346        p = blackTable1[code];
29347      else if ((code >> 9) == 0 && (code >> 7) != 0)
29348        p = blackTable2[(code >> 1) - 64];
29349      else
29350        p = blackTable3[code >> 7];
29351
29352      if (p[0] > 0) {
29353        this.eatBits(p[0]);
29354        return p[1];
29355      }
29356    } else {
29357      var result = this.findTableCode(2, 6, blackTable3);
29358      if (result[0])
29359        return result[1];
29360
29361      result = this.findTableCode(7, 12, blackTable2, 64);
29362      if (result[0])
29363        return result[1];
29364
29365      result = this.findTableCode(10, 13, blackTable1);
29366      if (result[0])
29367        return result[1];
29368    }
29369    warn('bad black code');
29370    this.eatBits(1);
29371    return 1;
29372  };
29373
29374  CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {
29375    var c;
29376    while (this.inputBits < n) {
29377      if ((c = this.str.getByte()) == null) {
29378        if (this.inputBits == 0)
29379          return EOF;
29380        return ((this.inputBuf << (n - this.inputBits)) &
29381                (0xFFFF >> (16 - n)));
29382      }
29383      this.inputBuf = (this.inputBuf << 8) + c;
29384      this.inputBits += 8;
29385    }
29386    return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
29387  };
29388
29389  CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {
29390    if ((this.inputBits -= n) < 0)
29391      this.inputBits = 0;
29392  };
29393
29394  return CCITTFaxStream;
29395})();
29396
29397var LZWStream = (function LZWStreamClosure() {
29398  function LZWStream(str, earlyChange) {
29399    this.str = str;
29400    this.dict = str.dict;
29401    this.cachedData = 0;
29402    this.bitsCached = 0;
29403
29404    var maxLzwDictionarySize = 4096;
29405    var lzwState = {
29406      earlyChange: earlyChange,
29407      codeLength: 9,
29408      nextCode: 258,
29409      dictionaryValues: new Uint8Array(maxLzwDictionarySize),
29410      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
29411      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
29412      currentSequence: new Uint8Array(maxLzwDictionarySize),
29413      currentSequenceLength: 0
29414    };
29415    for (var i = 0; i < 256; ++i) {
29416      lzwState.dictionaryValues[i] = i;
29417      lzwState.dictionaryLengths[i] = 1;
29418    }
29419    this.lzwState = lzwState;
29420
29421    DecodeStream.call(this);
29422  }
29423
29424  LZWStream.prototype = Object.create(DecodeStream.prototype);
29425
29426  LZWStream.prototype.readBits = function LZWStream_readBits(n) {
29427    var bitsCached = this.bitsCached;
29428    var cachedData = this.cachedData;
29429    while (bitsCached < n) {
29430      var c = this.str.getByte();
29431      if (c == null) {
29432        this.eof = true;
29433        return null;
29434      }
29435      cachedData = (cachedData << 8) | c;
29436      bitsCached += 8;
29437    }
29438    this.bitsCached = (bitsCached -= n);
29439    this.cachedData = cachedData;
29440    this.lastCode = null;
29441    return (cachedData >>> bitsCached) & ((1 << n) - 1);
29442  };
29443
29444  LZWStream.prototype.readBlock = function LZWStream_readBlock() {
29445    var blockSize = 512;
29446    var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
29447    var i, j, q;
29448
29449    var lzwState = this.lzwState;
29450    if (!lzwState)
29451      return; // eof was found
29452
29453    var earlyChange = lzwState.earlyChange;
29454    var nextCode = lzwState.nextCode;
29455    var dictionaryValues = lzwState.dictionaryValues;
29456    var dictionaryLengths = lzwState.dictionaryLengths;
29457    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
29458    var codeLength = lzwState.codeLength;
29459    var prevCode = lzwState.prevCode;
29460    var currentSequence = lzwState.currentSequence;
29461    var currentSequenceLength = lzwState.currentSequenceLength;
29462
29463    var decodedLength = 0;
29464    var currentBufferLength = this.bufferLength;
29465    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
29466
29467    for (i = 0; i < blockSize; i++) {
29468      var code = this.readBits(codeLength);
29469      var hasPrev = currentSequenceLength > 0;
29470      if (code < 256) {
29471        currentSequence[0] = code;
29472        currentSequenceLength = 1;
29473      } else if (code >= 258) {
29474        if (code < nextCode) {
29475          currentSequenceLength = dictionaryLengths[code];
29476          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
29477            currentSequence[j] = dictionaryValues[q];
29478            q = dictionaryPrevCodes[q];
29479          }
29480        } else {
29481          currentSequence[currentSequenceLength++] = currentSequence[0];
29482        }
29483      } else if (code == 256) {
29484        codeLength = 9;
29485        nextCode = 258;
29486        currentSequenceLength = 0;
29487        continue;
29488      } else {
29489        this.eof = true;
29490        delete this.lzwState;
29491        break;
29492      }
29493
29494      if (hasPrev) {
29495        dictionaryPrevCodes[nextCode] = prevCode;
29496        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
29497        dictionaryValues[nextCode] = currentSequence[0];
29498        nextCode++;
29499        codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
29500          codeLength : Math.min(Math.log(nextCode + earlyChange) /
29501          0.6931471805599453 + 1, 12) | 0;
29502      }
29503      prevCode = code;
29504
29505      decodedLength += currentSequenceLength;
29506      if (estimatedDecodedSize < decodedLength) {
29507        do {
29508          estimatedDecodedSize += decodedSizeDelta;
29509        } while (estimatedDecodedSize < decodedLength);
29510        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
29511      }
29512      for (j = 0; j < currentSequenceLength; j++)
29513        buffer[currentBufferLength++] = currentSequence[j];
29514    }
29515    lzwState.nextCode = nextCode;
29516    lzwState.codeLength = codeLength;
29517    lzwState.prevCode = prevCode;
29518    lzwState.currentSequenceLength = currentSequenceLength;
29519
29520    this.bufferLength = currentBufferLength;
29521  };
29522
29523  return LZWStream;
29524})();
29525
29526
29527/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
29528/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
29529
29530'use strict';
29531
29532function MessageHandler(name, comObj) {
29533  this.name = name;
29534  this.comObj = comObj;
29535  this.callbackIndex = 1;
29536  var callbacks = this.callbacks = {};
29537  var ah = this.actionHandler = {};
29538
29539  ah['console_log'] = [function ahConsoleLog(data) {
29540      PdfJS_window.console.log.apply(PdfJS_window.console, data);
29541  }];
29542  ah['console_error'] = [function ahConsoleError(data) {
29543      PdfJS_window.console.error.apply(PdfJS_window.console, data);
29544  }];
29545
29546  comObj.onmessage = function messageHandlerComObjOnMessage(event) {
29547    var data = event.data;
29548    if (data.isReply) {
29549      var callbackId = data.callbackId;
29550      if (data.callbackId in callbacks) {
29551        var callback = callbacks[callbackId];
29552        delete callbacks[callbackId];
29553        callback(data.data);
29554      } else {
29555        error('Cannot resolve callback ' + callbackId);
29556      }
29557    } else if (data.action in ah) {
29558      var action = ah[data.action];
29559      if (data.callbackId) {
29560        var promise = new Promise();
29561        promise.then(function(resolvedData) {
29562          comObj.postMessage({
29563            isReply: true,
29564            callbackId: data.callbackId,
29565            data: resolvedData
29566          });
29567        });
29568        action[0].call(action[1], data.data, promise);
29569      } else {
29570        action[0].call(action[1], data.data);
29571      }
29572    } else {
29573      error('Unkown action from worker: ' + data.action);
29574    }
29575  };
29576}
29577
29578MessageHandler.prototype = {
29579  on: function messageHandlerOn(actionName, handler, scope) {
29580    var ah = this.actionHandler;
29581    if (ah[actionName]) {
29582      error('There is already an actionName called "' + actionName + '"');
29583    }
29584    ah[actionName] = [handler, scope];
29585  },
29586  /**
29587   * Sends a message to the comObj to invoke the action with the supplied data.
29588   * @param {String} actionName Action to call.
29589   * @param {JSON} data JSON data to send.
29590   * @param {function} [callback] Optional callback that will handle a reply.
29591   */
29592  send: function messageHandlerSend(actionName, data, callback) {
29593    var message = {
29594      action: actionName,
29595      data: data
29596    };
29597    if (callback) {
29598      var callbackId = this.callbackIndex++;
29599      this.callbacks[callbackId] = callback;
29600      message.callbackId = callbackId;
29601    }
29602    this.comObj.postMessage(message);
29603  }
29604};
29605
29606var WorkerMessageHandler = {
29607  setup: function wphSetup(handler) {
29608    var pdfModel = null;
29609
29610    handler.on('test', function wphSetupTest(data) {
29611      handler.send('test', data instanceof Uint8Array);
29612    });
29613
29614    handler.on('GetDocRequest', function wphSetupDoc(data) {
29615      // Create only the model of the PDFDoc, which is enough for
29616      // processing the content of the pdf.
29617      pdfModel = new PDFDocument(new Stream(data));
29618      var doc = {
29619        numPages: pdfModel.numPages,
29620        fingerprint: pdfModel.getFingerprint(),
29621        destinations: pdfModel.catalog.destinations,
29622        outline: pdfModel.catalog.documentOutline,
29623        info: pdfModel.getDocumentInfo(),
29624        metadata: pdfModel.catalog.metadata
29625      };
29626      handler.send('GetDoc', {pdfInfo: doc});
29627    });
29628
29629    handler.on('GetPageRequest', function wphSetupGetPage(data) {
29630      var pageNumber = data.pageIndex + 1;
29631      var pdfPage = pdfModel.getPage(pageNumber);
29632      var page = {
29633        pageIndex: data.pageIndex,
29634        rotate: pdfPage.rotate,
29635        ref: pdfPage.ref,
29636        view: pdfPage.view
29637      };
29638      handler.send('GetPage', {pageInfo: page});
29639    });
29640
29641    handler.on('GetAnnotationsRequest', function wphSetupGetAnnotations(data) {
29642      var pdfPage = pdfModel.getPage(data.pageIndex + 1);
29643      handler.send('GetAnnotations', {
29644        pageIndex: data.pageIndex,
29645        annotations: pdfPage.getAnnotations()
29646      });
29647    });
29648
29649    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
29650      var pageNum = data.pageIndex + 1;
29651
29652
29653      // The following code does quite the same as
29654      // Page.prototype.startRendering, but stops at one point and sends the
29655      // result back to the main thread.
29656      var gfx = new CanvasGraphics(null);
29657
29658      var start = Date.now();
29659
29660      var dependency = [];
29661      var operatorList = null;
29662      try {
29663        var page = pdfModel.getPage(pageNum);
29664        // Pre compile the pdf page and fetch the fonts/images.
29665        operatorList = page.getOperatorList(handler, dependency);
29666      } catch (e) {
29667        var minimumStackMessage =
29668            'worker.js: while trying to getPage() and getOperatorList()';
29669
29670        // Turn the error into an obj that can be serialized
29671        if (typeof e === 'string') {
29672          e = {
29673            message: e,
29674            stack: minimumStackMessage
29675          };
29676        } else if (typeof e === 'object') {
29677          e = {
29678            message: e.message || e.toString(),
29679            stack: e.stack || minimumStackMessage
29680          };
29681        } else {
29682          e = {
29683            message: 'Unknown exception type: ' + (typeof e),
29684            stack: minimumStackMessage
29685          };
29686        }
29687
29688        handler.send('PageError', {
29689          pageNum: pageNum,
29690          error: e
29691        });
29692        return;
29693      }
29694
29695      //comment out as it floods the logcat
29696      //PdfJS_window.console.log('page=%d - getOperatorList: time=%dms, len=%d', pageNum,
29697      //                        Date.now() - start, operatorList.fnArray.length);
29698
29699      // Filter the dependecies for fonts.
29700      var fonts = {};
29701      for (var i = 0, ii = dependency.length; i < ii; i++) {
29702        var dep = dependency[i];
29703        if (dep.indexOf('font_') == 0) {
29704          fonts[dep] = true;
29705        }
29706      }
29707      handler.send('RenderPage', {
29708        pageIndex: data.pageIndex,
29709        operatorList: operatorList,
29710        depFonts: Object.keys(fonts)
29711      });
29712    }, this);
29713  }
29714};
29715
29716var consoleTimer = {};
29717
29718var workerConsole = {
29719  log: function log() {
29720    var args = Array.prototype.slice.call(arguments);
29721    postMessage({
29722      action: 'console_log',
29723      data: args
29724    });
29725  },
29726
29727  error: function error() {
29728    var args = Array.prototype.slice.call(arguments);
29729    postMessage({
29730      action: 'console_error',
29731      data: args
29732    });
29733    throw 'pdf.js execution error';
29734  },
29735
29736  time: function time(name) {
29737    consoleTimer[name] = Date.now();
29738  },
29739
29740  timeEnd: function timeEnd(name) {
29741    var time = consoleTimer[name];
29742    if (time == null) {
29743      error('Unkown timer name ' + name);
29744    }
29745    this.log('Timer:', name, Date.now() - time);
29746  }
29747};
29748
29749// Worker thread?
29750if (typeof PdfJS_window.window === 'undefined') {
29751  globalScope.console = workerConsole;
29752
29753  var handler = new MessageHandler('worker_processor', this);
29754  WorkerMessageHandler.setup(handler);
29755}
29756
29757
29758/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
29759/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
29760
29761// - The JPEG specification can be found in the ITU CCITT Recommendation T.81
29762//   (www.w3.org/Graphics/JPEG/itu-t81.pdf)
29763// - The JFIF specification can be found in the JPEG File Interchange Format
29764//   (www.w3.org/Graphics/JPEG/jfif3.pdf)
29765// - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
29766//   in PostScript Level 2, Technical Note #5116
29767//   (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
29768
29769var JpegImage = (function jpegImage() {
29770  "use strict";
29771  var dctZigZag = new Int32Array([
29772     0,
29773     1,  8,
29774    16,  9,  2,
29775     3, 10, 17, 24,
29776    32, 25, 18, 11, 4,
29777     5, 12, 19, 26, 33, 40,
29778    48, 41, 34, 27, 20, 13,  6,
29779     7, 14, 21, 28, 35, 42, 49, 56,
29780    57, 50, 43, 36, 29, 22, 15,
29781    23, 30, 37, 44, 51, 58,
29782    59, 52, 45, 38, 31,
29783    39, 46, 53, 60,
29784    61, 54, 47,
29785    55, 62,
29786    63
29787  ]);
29788
29789  var dctCos1  =  4017   // cos(pi/16)
29790  var dctSin1  =   799   // sin(pi/16)
29791  var dctCos3  =  3406   // cos(3*pi/16)
29792  var dctSin3  =  2276   // sin(3*pi/16)
29793  var dctCos6  =  1567   // cos(6*pi/16)
29794  var dctSin6  =  3784   // sin(6*pi/16)
29795  var dctSqrt2 =  5793   // sqrt(2)
29796  var dctSqrt1d2 = 2896  // sqrt(2) / 2
29797
29798  function constructor() {
29799  }
29800
29801  function buildHuffmanTable(codeLengths, values) {
29802    var k = 0, code = [], i, j, length = 16;
29803    while (length > 0 && !codeLengths[length - 1])
29804      length--;
29805    code.push({children: [], index: 0});
29806    var p = code[0], q;
29807    for (i = 0; i < length; i++) {
29808      for (j = 0; j < codeLengths[i]; j++) {
29809        p = code.pop();
29810        p.children[p.index] = values[k];
29811        while (p.index > 0) {
29812          p = code.pop();
29813        }
29814        p.index++;
29815        code.push(p);
29816        while (code.length <= i) {
29817          code.push(q = {children: [], index: 0});
29818          p.children[p.index] = q.children;
29819          p = q;
29820        }
29821        k++;
29822      }
29823      if (i + 1 < length) {
29824        // p here points to last code
29825        code.push(q = {children: [], index: 0});
29826        p.children[p.index] = q.children;
29827        p = q;
29828      }
29829    }
29830    return code[0].children;
29831  }
29832
29833  function decodeScan(data, offset,
29834                      frame, components, resetInterval,
29835                      spectralStart, spectralEnd,
29836                      successivePrev, successive) {
29837    var precision = frame.precision;
29838    var samplesPerLine = frame.samplesPerLine;
29839    var scanLines = frame.scanLines;
29840    var mcusPerLine = frame.mcusPerLine;
29841    var progressive = frame.progressive;
29842    var maxH = frame.maxH, maxV = frame.maxV;
29843
29844    var startOffset = offset, bitsData = 0, bitsCount = 0;
29845    function readBit() {
29846      if (bitsCount > 0) {
29847        bitsCount--;
29848        return (bitsData >> bitsCount) & 1;
29849      }
29850      bitsData = data[offset++];
29851      if (bitsData == 0xFF) {
29852        var nextByte = data[offset++];
29853        if (nextByte) {
29854          throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16);
29855        }
29856        // unstuff 0
29857      }
29858      bitsCount = 7;
29859      return bitsData >>> 7;
29860    }
29861    function decodeHuffman(tree) {
29862      var node = tree, bit;
29863      while ((bit = readBit()) !== null) {
29864        node = node[bit];
29865        if (typeof node === 'number')
29866          return node;
29867        if (typeof node !== 'object')
29868          throw "invalid huffman sequence";
29869      }
29870      return null;
29871    }
29872    function receive(length) {
29873      var n = 0;
29874      while (length > 0) {
29875        var bit = readBit();
29876        if (bit === null) return;
29877        n = (n << 1) | bit;
29878        length--;
29879      }
29880      return n;
29881    }
29882    function receiveAndExtend(length) {
29883      var n = receive(length);
29884      if (n >= 1 << (length - 1))
29885        return n;
29886      return n + (-1 << length) + 1;
29887    }
29888    function decodeBaseline(component, zz) {
29889      var t = decodeHuffman(component.huffmanTableDC);
29890      var diff = t === 0 ? 0 : receiveAndExtend(t);
29891      zz[0]= (component.pred += diff);
29892      var k = 1;
29893      while (k < 64) {
29894        var rs = decodeHuffman(component.huffmanTableAC);
29895        var s = rs & 15, r = rs >> 4;
29896        if (s === 0) {
29897          if (r < 15)
29898            break;
29899          k += 16;
29900          continue;
29901        }
29902        k += r;
29903        var z = dctZigZag[k];
29904        zz[z] = receiveAndExtend(s);
29905        k++;
29906      }
29907    }
29908    function decodeDCFirst(component, zz) {
29909      var t = decodeHuffman(component.huffmanTableDC);
29910      var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
29911      zz[0] = (component.pred += diff);
29912    }
29913    function decodeDCSuccessive(component, zz) {
29914      zz[0] |= readBit() << successive;
29915    }
29916    var eobrun = 0;
29917    function decodeACFirst(component, zz) {
29918      if (eobrun > 0) {
29919        eobrun--;
29920        return;
29921      }
29922      var k = spectralStart, e = spectralEnd;
29923      while (k <= e) {
29924        var rs = decodeHuffman(component.huffmanTableAC);
29925        var s = rs & 15, r = rs >> 4;
29926        if (s === 0) {
29927          if (r < 15) {
29928            eobrun = receive(r) + (1 << r) - 1;
29929            break;
29930          }
29931          k += 16;
29932          continue;
29933        }
29934        k += r;
29935        var z = dctZigZag[k];
29936        zz[z] = receiveAndExtend(s) * (1 << successive);
29937        k++;
29938      }
29939    }
29940    var successiveACState = 0, successiveACNextValue;
29941    function decodeACSuccessive(component, zz) {
29942      var k = spectralStart, e = spectralEnd, r = 0;
29943      while (k <= e) {
29944        var z = dctZigZag[k];
29945        switch (successiveACState) {
29946        case 0: // initial state
29947          var rs = decodeHuffman(component.huffmanTableAC);
29948          var s = rs & 15, r = rs >> 4;
29949          if (s === 0) {
29950            if (r < 15) {
29951              eobrun = receive(r) + (1 << r);
29952              successiveACState = 4;
29953            } else {
29954              r = 16;
29955              successiveACState = 1;
29956            }
29957          } else {
29958            if (s !== 1)
29959              throw "invalid ACn encoding";
29960            successiveACNextValue = receiveAndExtend(s);
29961            successiveACState = r ? 2 : 3;
29962          }
29963          continue;
29964        case 1: // skipping r zero items
29965        case 2:
29966          if (zz[z])
29967            zz[z] += (readBit() << successive);
29968          else {
29969            r--;
29970            if (r === 0)
29971              successiveACState = successiveACState == 2 ? 3 : 0;
29972          }
29973          break;
29974        case 3: // set value for a zero item
29975          if (zz[z])
29976            zz[z] += (readBit() << successive);
29977          else {
29978            zz[z] = successiveACNextValue << successive;
29979            successiveACState = 0;
29980          }
29981          break;
29982        case 4: // eob
29983          if (zz[z])
29984            zz[z] += (readBit() << successive);
29985          break;
29986        }
29987        k++;
29988      }
29989      if (successiveACState === 4) {
29990        eobrun--;
29991        if (eobrun === 0)
29992          successiveACState = 0;
29993      }
29994    }
29995    function decodeMcu(component, decode, mcu, row, col) {
29996      var mcuRow = (mcu / mcusPerLine) | 0;
29997      var mcuCol = mcu % mcusPerLine;
29998      var blockRow = mcuRow * component.v + row;
29999      var blockCol = mcuCol * component.h + col;
30000      decode(component, component.blocks[blockRow][blockCol]);
30001    }
30002    function decodeBlock(component, decode, mcu) {
30003      var blockRow = (mcu / component.blocksPerLine) | 0;
30004      var blockCol = mcu % component.blocksPerLine;
30005      decode(component, component.blocks[blockRow][blockCol]);
30006    }
30007
30008    var componentsLength = components.length;
30009    var component, i, j, k, n;
30010    var decodeFn;
30011    if (progressive) {
30012      if (spectralStart === 0)
30013        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
30014      else
30015        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
30016    } else {
30017      decodeFn = decodeBaseline;
30018    }
30019
30020    var mcu = 0, marker;
30021    var mcuExpected;
30022    if (componentsLength == 1) {
30023      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
30024    } else {
30025      mcuExpected = mcusPerLine * frame.mcusPerColumn;
30026    }
30027    if (!resetInterval) resetInterval = mcuExpected;
30028
30029    var h, v;
30030    while (mcu < mcuExpected) {
30031      // reset interval stuff
30032      for (i = 0; i < componentsLength; i++)
30033        components[i].pred = 0;
30034      eobrun = 0;
30035
30036      if (componentsLength == 1) {
30037        component = components[0];
30038        for (n = 0; n < resetInterval; n++) {
30039          decodeBlock(component, decodeFn, mcu);
30040          mcu++;
30041        }
30042      } else {
30043        for (n = 0; n < resetInterval; n++) {
30044          for (i = 0; i < componentsLength; i++) {
30045            component = components[i];
30046            h = component.h;
30047            v = component.v;
30048            for (j = 0; j < v; j++) {
30049              for (k = 0; k < h; k++) {
30050                decodeMcu(component, decodeFn, mcu, j, k);
30051              }
30052            }
30053          }
30054          mcu++;
30055        }
30056      }
30057
30058      // find marker
30059      bitsCount = 0;
30060      marker = (data[offset] << 8) | data[offset + 1];
30061      if (marker <= 0xFF00) {
30062        throw "marker was not found";
30063      }
30064
30065      if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
30066        offset += 2;
30067      }
30068      else
30069        break;
30070    }
30071
30072    return offset - startOffset;
30073  }
30074
30075  function buildComponentData(frame, component) {
30076    var lines = [];
30077    var blocksPerLine = component.blocksPerLine;
30078    var blocksPerColumn = component.blocksPerColumn;
30079    var samplesPerLine = blocksPerLine << 3;
30080    var R = new Int32Array(64), r = new Uint8Array(64);
30081
30082    // A port of poppler's IDCT method which in turn is taken from:
30083    //   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
30084    //   "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
30085    //   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
30086    //   988-991.
30087    function quantizeAndInverse(zz, dataOut, dataIn) {
30088      var qt = component.quantizationTable;
30089      var v0, v1, v2, v3, v4, v5, v6, v7, t;
30090      var p = dataIn;
30091      var i;
30092
30093      // dequant
30094      for (i = 0; i < 64; i++)
30095        p[i] = zz[i] * qt[i];
30096
30097      // inverse DCT on rows
30098      for (i = 0; i < 8; ++i) {
30099        var row = 8 * i;
30100
30101        // check for all-zero AC coefficients
30102        if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&
30103            p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&
30104            p[7 + row] == 0) {
30105          t = (dctSqrt2 * p[0 + row] + 512) >> 10;
30106          p[0 + row] = t;
30107          p[1 + row] = t;
30108          p[2 + row] = t;
30109          p[3 + row] = t;
30110          p[4 + row] = t;
30111          p[5 + row] = t;
30112          p[6 + row] = t;
30113          p[7 + row] = t;
30114          continue;
30115        }
30116
30117        // stage 4
30118        v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
30119        v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
30120        v2 = p[2 + row];
30121        v3 = p[6 + row];
30122        v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;
30123        v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;
30124        v5 = p[3 + row] << 4;
30125        v6 = p[5 + row] << 4;
30126
30127        // stage 3
30128        t = (v0 - v1+ 1) >> 1;
30129        v0 = (v0 + v1 + 1) >> 1;
30130        v1 = t;
30131        t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
30132        v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
30133        v3 = t;
30134        t = (v4 - v6 + 1) >> 1;
30135        v4 = (v4 + v6 + 1) >> 1;
30136        v6 = t;
30137        t = (v7 + v5 + 1) >> 1;
30138        v5 = (v7 - v5 + 1) >> 1;
30139        v7 = t;
30140
30141        // stage 2
30142        t = (v0 - v3 + 1) >> 1;
30143        v0 = (v0 + v3 + 1) >> 1;
30144        v3 = t;
30145        t = (v1 - v2 + 1) >> 1;
30146        v1 = (v1 + v2 + 1) >> 1;
30147        v2 = t;
30148        t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
30149        v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
30150        v7 = t;
30151        t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
30152        v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
30153        v6 = t;
30154
30155        // stage 1
30156        p[0 + row] = v0 + v7;
30157        p[7 + row] = v0 - v7;
30158        p[1 + row] = v1 + v6;
30159        p[6 + row] = v1 - v6;
30160        p[2 + row] = v2 + v5;
30161        p[5 + row] = v2 - v5;
30162        p[3 + row] = v3 + v4;
30163        p[4 + row] = v3 - v4;
30164      }
30165
30166      // inverse DCT on columns
30167      for (i = 0; i < 8; ++i) {
30168        var col = i;
30169
30170        // check for all-zero AC coefficients
30171        if (p[1*8 + col] == 0 && p[2*8 + col] == 0 && p[3*8 + col] == 0 &&
30172            p[4*8 + col] == 0 && p[5*8 + col] == 0 && p[6*8 + col] == 0 &&
30173            p[7*8 + col] == 0) {
30174          t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14;
30175          p[0*8 + col] = t;
30176          p[1*8 + col] = t;
30177          p[2*8 + col] = t;
30178          p[3*8 + col] = t;
30179          p[4*8 + col] = t;
30180          p[5*8 + col] = t;
30181          p[6*8 + col] = t;
30182          p[7*8 + col] = t;
30183          continue;
30184        }
30185
30186        // stage 4
30187        v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12;
30188        v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12;
30189        v2 = p[2*8 + col];
30190        v3 = p[6*8 + col];
30191        v4 = (dctSqrt1d2 * (p[1*8 + col] - p[7*8 + col]) + 2048) >> 12;
30192        v7 = (dctSqrt1d2 * (p[1*8 + col] + p[7*8 + col]) + 2048) >> 12;
30193        v5 = p[3*8 + col];
30194        v6 = p[5*8 + col];
30195
30196        // stage 3
30197        t = (v0 - v1 + 1) >> 1;
30198        v0 = (v0 + v1 + 1) >> 1;
30199        v1 = t;
30200        t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
30201        v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
30202        v3 = t;
30203        t = (v4 - v6 + 1) >> 1;
30204        v4 = (v4 + v6 + 1) >> 1;
30205        v6 = t;
30206        t = (v7 + v5 + 1) >> 1;
30207        v5 = (v7 - v5 + 1) >> 1;
30208        v7 = t;
30209
30210        // stage 2
30211        t = (v0 - v3 + 1) >> 1;
30212        v0 = (v0 + v3 + 1) >> 1;
30213        v3 = t;
30214        t = (v1 - v2 + 1) >> 1;
30215        v1 = (v1 + v2 + 1) >> 1;
30216        v2 = t;
30217        t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
30218        v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
30219        v7 = t;
30220        t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
30221        v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
30222        v6 = t;
30223
30224        // stage 1
30225        p[0*8 + col] = v0 + v7;
30226        p[7*8 + col] = v0 - v7;
30227        p[1*8 + col] = v1 + v6;
30228        p[6*8 + col] = v1 - v6;
30229        p[2*8 + col] = v2 + v5;
30230        p[5*8 + col] = v2 - v5;
30231        p[3*8 + col] = v3 + v4;
30232        p[4*8 + col] = v3 - v4;
30233      }
30234
30235      // convert to 8-bit integers
30236      for (i = 0; i < 64; ++i) {
30237        var sample = 128 + ((p[i] + 8) >> 4);
30238        dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample;
30239      }
30240    }
30241
30242    var i, j;
30243    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
30244      var scanLine = blockRow << 3;
30245      for (i = 0; i < 8; i++)
30246        lines.push(new Uint8Array(samplesPerLine));
30247      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
30248        quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);
30249
30250        var offset = 0, sample = blockCol << 3;
30251        for (j = 0; j < 8; j++) {
30252          var line = lines[scanLine + j];
30253          for (i = 0; i < 8; i++)
30254            line[sample + i] = r[offset++];
30255        }
30256      }
30257    }
30258    return lines;
30259  }
30260
30261  constructor.prototype = {
30262    load: function load(path) {
30263      var xhr = new PdfJS_window.XMLHttpRequest();
30264      xhr.open("GET", path, true);
30265      xhr.responseType = "arraybuffer";
30266      xhr.onload = (function() {
30267        // TODO catch parse error
30268        var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
30269        this.parse(data);
30270        if (this.onload)
30271          this.onload();
30272      }).bind(this);
30273      xhr.send(null);
30274    },
30275    parse: function parse(data) {
30276      var offset = 0, length = data.length;
30277      function readUint16() {
30278        var value = (data[offset] << 8) | data[offset + 1];
30279        offset += 2;
30280        return value;
30281      }
30282      function readDataBlock() {
30283        var length = readUint16();
30284        var array = data.subarray(offset, offset + length - 2);
30285        offset += array.length;
30286        return array;
30287      }
30288      function prepareComponents(frame) {
30289        var maxH = 0, maxV = 0;
30290        var component, componentId;
30291        for (componentId in frame.components) {
30292          if (frame.components.hasOwnProperty(componentId)) {
30293            component = frame.components[componentId];
30294            if (maxH < component.h) maxH = component.h;
30295            if (maxV < component.v) maxV = component.v;
30296          }
30297        }
30298        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);
30299        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);
30300        for (componentId in frame.components) {
30301          if (frame.components.hasOwnProperty(componentId)) {
30302            component = frame.components[componentId];
30303            var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);
30304            var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines  / 8) * component.v / maxV);
30305            var blocksPerLineForMcu = mcusPerLine * component.h;
30306            var blocksPerColumnForMcu = mcusPerColumn * component.v;
30307            var blocks = [];
30308            for (var i = 0; i < blocksPerColumnForMcu; i++) {
30309              var row = [];
30310              for (var j = 0; j < blocksPerLineForMcu; j++)
30311                row.push(new Int32Array(64));
30312              blocks.push(row);
30313            }
30314            component.blocksPerLine = blocksPerLine;
30315            component.blocksPerColumn = blocksPerColumn;
30316            component.blocks = blocks;
30317          }
30318        }
30319        frame.maxH = maxH;
30320        frame.maxV = maxV;
30321        frame.mcusPerLine = mcusPerLine;
30322        frame.mcusPerColumn = mcusPerColumn;
30323      }
30324      var jfif = null;
30325      var adobe = null;
30326      var pixels = null;
30327      var frame, resetInterval;
30328      var quantizationTables = [], frames = [];
30329      var huffmanTablesAC = [], huffmanTablesDC = [];
30330      var fileMarker = readUint16();
30331      if (fileMarker != 0xFFD8) { // SOI (Start of Image)
30332        throw "SOI not found";
30333      }
30334
30335      fileMarker = readUint16();
30336      while (fileMarker != 0xFFD9) { // EOI (End of image)
30337        var i, j, l;
30338        switch(fileMarker) {
30339          case 0xFFE0: // APP0 (Application Specific)
30340          case 0xFFE1: // APP1
30341          case 0xFFE2: // APP2
30342          case 0xFFE3: // APP3
30343          case 0xFFE4: // APP4
30344          case 0xFFE5: // APP5
30345          case 0xFFE6: // APP6
30346          case 0xFFE7: // APP7
30347          case 0xFFE8: // APP8
30348          case 0xFFE9: // APP9
30349          case 0xFFEA: // APP10
30350          case 0xFFEB: // APP11
30351          case 0xFFEC: // APP12
30352          case 0xFFED: // APP13
30353          case 0xFFEE: // APP14
30354          case 0xFFEF: // APP15
30355          case 0xFFFE: // COM (Comment)
30356            var appData = readDataBlock();
30357
30358            if (fileMarker === 0xFFE0) {
30359              if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&
30360                appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00'
30361                jfif = {
30362                  version: { major: appData[5], minor: appData[6] },
30363                  densityUnits: appData[7],
30364                  xDensity: (appData[8] << 8) | appData[9],
30365                  yDensity: (appData[10] << 8) | appData[11],
30366                  thumbWidth: appData[12],
30367                  thumbHeight: appData[13],
30368                  thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
30369                };
30370              }
30371            }
30372            // TODO APP1 - Exif
30373            if (fileMarker === 0xFFEE) {
30374              if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&
30375                appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00'
30376                adobe = {
30377                  version: appData[6],
30378                  flags0: (appData[7] << 8) | appData[8],
30379                  flags1: (appData[9] << 8) | appData[10],
30380                  transformCode: appData[11]
30381                };
30382              }
30383            }
30384            break;
30385
30386          case 0xFFDB: // DQT (Define Quantization Tables)
30387            var quantizationTableCount = Math.floor((readUint16() - 2) / 65);
30388            for (i = 0; i < quantizationTableCount; i++) {
30389              var quantizationTableSpec = data[offset++];
30390              var tableData = new Int32Array(64);
30391              if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
30392                for (j = 0; j < 64; j++) {
30393                  var z = dctZigZag[j];
30394                  tableData[z] = data[offset++];
30395                }
30396              } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
30397                for (j = 0; j < 64; j++) {
30398                  var z = dctZigZag[j];
30399                  tableData[z] = readUint16();
30400                }
30401              } else
30402                throw "DQT: invalid table spec";
30403              quantizationTables[quantizationTableSpec & 15] = tableData;
30404            }
30405            break;
30406
30407          case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
30408          case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
30409            readUint16(); // skip data length
30410            frame = {};
30411            frame.progressive = (fileMarker === 0xFFC2);
30412            frame.precision = data[offset++];
30413            frame.scanLines = readUint16();
30414            frame.samplesPerLine = readUint16();
30415            frame.components = {};
30416            frame.componentsOrder = [];
30417            var componentsCount = data[offset++], componentId;
30418            var maxH = 0, maxV = 0;
30419            for (i = 0; i < componentsCount; i++) {
30420              componentId = data[offset];
30421              var h = data[offset + 1] >> 4;
30422              var v = data[offset + 1] & 15;
30423              var qId = data[offset + 2];
30424              frame.componentsOrder.push(componentId);
30425              frame.components[componentId] = {
30426                h: h,
30427                v: v,
30428                quantizationTable: quantizationTables[qId]
30429              };
30430              offset += 3;
30431            }
30432            prepareComponents(frame);
30433            frames.push(frame);
30434            break;
30435
30436          case 0xFFC4: // DHT (Define Huffman Tables)
30437            var huffmanLength = readUint16();
30438            for (i = 2; i < huffmanLength;) {
30439              var huffmanTableSpec = data[offset++];
30440              var codeLengths = new Uint8Array(16);
30441              var codeLengthSum = 0;
30442              for (j = 0; j < 16; j++, offset++)
30443                codeLengthSum += (codeLengths[j] = data[offset]);
30444              var huffmanValues = new Uint8Array(codeLengthSum);
30445              for (j = 0; j < codeLengthSum; j++, offset++)
30446                huffmanValues[j] = data[offset];
30447              i += 17 + codeLengthSum;
30448
30449              ((huffmanTableSpec >> 4) === 0 ?
30450                huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
30451                buildHuffmanTable(codeLengths, huffmanValues);
30452            }
30453            break;
30454
30455          case 0xFFDD: // DRI (Define Restart Interval)
30456            readUint16(); // skip data length
30457            resetInterval = readUint16();
30458            break;
30459
30460          case 0xFFDA: // SOS (Start of Scan)
30461            var scanLength = readUint16();
30462            var selectorsCount = data[offset++];
30463            var components = [], component;
30464            for (i = 0; i < selectorsCount; i++) {
30465              component = frame.components[data[offset++]];
30466              var tableSpec = data[offset++];
30467              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
30468              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
30469              components.push(component);
30470            }
30471            var spectralStart = data[offset++];
30472            var spectralEnd = data[offset++];
30473            var successiveApproximation = data[offset++];
30474            var processed = decodeScan(data, offset,
30475              frame, components, resetInterval,
30476              spectralStart, spectralEnd,
30477              successiveApproximation >> 4, successiveApproximation & 15);
30478            offset += processed;
30479            break;
30480          default:
30481            throw "unknown JPEG marker " + fileMarker.toString(16);
30482        }
30483        fileMarker = readUint16();
30484      }
30485      if (frames.length != 1)
30486        throw "only single frame JPEGs supported";
30487
30488      this.width = frame.samplesPerLine;
30489      this.height = frame.scanLines;
30490      this.jfif = jfif;
30491      this.adobe = adobe;
30492      this.components = [];
30493      for (var i = 0; i < frame.componentsOrder.length; i++) {
30494        var component = frame.components[frame.componentsOrder[i]];
30495        this.components.push({
30496          lines: buildComponentData(frame, component),
30497          scaleX: component.h / frame.maxH,
30498          scaleY: component.v / frame.maxV
30499        });
30500      }
30501    },
30502    getData: function getData(width, height) {
30503      function clampTo8bit(a) {
30504        return a < 0 ? 0 : a > 255 ? 255 : a;
30505      }
30506      var scaleX = this.width / width, scaleY = this.height / height;
30507
30508      var component1, component2, component3, component4;
30509      var component1Line, component2Line, component3Line, component4Line;
30510      var x, y;
30511      var offset = 0;
30512      var Y, Cb, Cr, K, C, M, Ye, R, G, B;
30513      var colorTransform;
30514      var dataLength = width * height * this.components.length;
30515      var data = new Uint8Array(dataLength);
30516      switch (this.components.length) {
30517        case 1:
30518          component1 = this.components[0];
30519          for (y = 0; y < height; y++) {
30520            component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
30521            for (x = 0; x < width; x++) {
30522              Y = component1Line[0 | (x * component1.scaleX * scaleX)];
30523
30524              data[offset++] = Y;
30525            }
30526          }
30527          break;
30528        case 3:
30529          // The default transform for three components is true
30530          colorTransform = true;
30531          // The adobe transform marker overrides any previous setting
30532          if (this.adobe && this.adobe.transformCode)
30533            colorTransform = true;
30534          else if (typeof this.colorTransform !== 'undefined')
30535            colorTransform = !!this.colorTransform;
30536
30537          component1 = this.components[0];
30538          component2 = this.components[1];
30539          component3 = this.components[2];
30540          for (y = 0; y < height; y++) {
30541            component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
30542            component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
30543            component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
30544            for (x = 0; x < width; x++) {
30545              if (!colorTransform) {
30546                R = component1Line[0 | (x * component1.scaleX * scaleX)];
30547                G = component2Line[0 | (x * component2.scaleX * scaleX)];
30548                B = component3Line[0 | (x * component3.scaleX * scaleX)];
30549              } else {
30550                Y = component1Line[0 | (x * component1.scaleX * scaleX)];
30551                Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
30552                Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
30553
30554                R = clampTo8bit(Y + 1.402 * (Cr - 128));
30555                G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
30556                B = clampTo8bit(Y + 1.772 * (Cb - 128));
30557              }
30558
30559              data[offset++] = R;
30560              data[offset++] = G;
30561              data[offset++] = B;
30562            }
30563          }
30564          break;
30565        case 4:
30566          if (!this.adobe)
30567            throw 'Unsupported color mode (4 components)';
30568          // The default transform for four components is false
30569          colorTransform = false;
30570          // The adobe transform marker overrides any previous setting
30571          if (this.adobe && this.adobe.transformCode)
30572            colorTransform = true;
30573          else if (typeof this.colorTransform !== 'undefined')
30574            colorTransform = !!this.colorTransform;
30575
30576          component1 = this.components[0];
30577          component2 = this.components[1];
30578          component3 = this.components[2];
30579          component4 = this.components[3];
30580          for (y = 0; y < height; y++) {
30581            component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
30582            component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
30583            component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
30584            component4Line = component4.lines[0 | (y * component4.scaleY * scaleY)];
30585            for (x = 0; x < width; x++) {
30586              if (!colorTransform) {
30587                C = component1Line[0 | (x * component1.scaleX * scaleX)];
30588                M = component2Line[0 | (x * component2.scaleX * scaleX)];
30589                Ye = component3Line[0 | (x * component3.scaleX * scaleX)];
30590                K = component4Line[0 | (x * component4.scaleX * scaleX)];
30591              } else {
30592                Y = component1Line[0 | (x * component1.scaleX * scaleX)];
30593                Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
30594                Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
30595                K = component4Line[0 | (x * component4.scaleX * scaleX)];
30596
30597                C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));
30598                M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
30599                Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));
30600              }
30601              data[offset++] = C;
30602              data[offset++] = M;
30603              data[offset++] = Ye;
30604              data[offset++] = K;
30605            }
30606          }
30607          break;
30608        default:
30609          throw 'Unsupported color mode';
30610      }
30611      return data;
30612    },
30613    copyToImageData: function copyToImageData(imageData) {
30614      var width = imageData.width, height = imageData.height;
30615      var imageDataArray = imageData.data;
30616      var data = this.getData(width, height);
30617      var i = 0, j = 0, x, y;
30618      var Y, K, C, M, R, G, B;
30619      switch (this.components.length) {
30620        case 1:
30621          for (y = 0; y < height; y++) {
30622            for (x = 0; x < width; x++) {
30623              Y = data[i++];
30624
30625              imageDataArray[j++] = Y;
30626              imageDataArray[j++] = Y;
30627              imageDataArray[j++] = Y;
30628              imageDataArray[j++] = 255;
30629            }
30630          }
30631          break;
30632        case 3:
30633          for (y = 0; y < height; y++) {
30634            for (x = 0; x < width; x++) {
30635              R = data[i++];
30636              G = data[i++];
30637              B = data[i++];
30638
30639              imageDataArray[j++] = R;
30640              imageDataArray[j++] = G;
30641              imageDataArray[j++] = B;
30642              imageDataArray[j++] = 255;
30643            }
30644          }
30645          break;
30646        case 4:
30647          for (y = 0; y < height; y++) {
30648            for (x = 0; x < width; x++) {
30649              C = data[i++];
30650              M = data[i++];
30651              Y = data[i++];
30652              K = data[i++];
30653
30654              R = 255 - clampTo8bit(C * (1 - K / 255) + K);
30655              G = 255 - clampTo8bit(M * (1 - K / 255) + K);
30656              B = 255 - clampTo8bit(Y * (1 - K / 255) + K);
30657
30658              imageDataArray[j++] = R;
30659              imageDataArray[j++] = G;
30660              imageDataArray[j++] = B;
30661              imageDataArray[j++] = 255;
30662            }
30663          }
30664          break;
30665        default:
30666          throw 'Unsupported color mode';
30667      }
30668    }
30669  };
30670
30671  return constructor;
30672})();
30673/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
30674/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
30675
30676'use strict';
30677
30678var JpxImage = (function JpxImageClosure() {
30679  // Table E.1
30680  var SubbandsGainLog2 = {
30681    'LL': 0,
30682    'LH': 1,
30683    'HL': 1,
30684    'HH': 2
30685  };
30686  function JpxImage() {
30687    this.failOnCorruptedImage = false;
30688  }
30689  JpxImage.prototype = {
30690    load: function JpxImage_load(url) {
30691      var xhr = new PdfJS_window.XMLHttpRequest();
30692      xhr.open('GET', url, true);
30693      xhr.responseType = 'arraybuffer';
30694      xhr.onload = (function() {
30695        // TODO catch parse error
30696        var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
30697        this.parse(data);
30698        if (this.onload)
30699          this.onload();
30700      }).bind(this);
30701      xhr.send(null);
30702    },
30703    parse: function JpxImage_parse(data) {
30704      function ReadUint(data, offset, bytes) {
30705        var n = 0;
30706        for (var i = 0; i < bytes; i++)
30707          n = n * 256 + (data[offset + i] & 0xFF);
30708        return n;
30709      }
30710      var position = 0, length = data.length;
30711      while (position < length) {
30712        var headerSize = 8;
30713        var lbox = ReadUint(data, position, 4);
30714        var tbox = ReadUint(data, position + 4, 4);
30715        position += headerSize;
30716        if (lbox == 1) {
30717          lbox = ReadUint(data, position, 8);
30718          position += 8;
30719          headerSize += 8;
30720        }
30721        if (lbox == 0)
30722          lbox = length - position + headerSize;
30723        if (lbox < headerSize)
30724          error('JPX error: Invalid box field size');
30725        var dataLength = lbox - headerSize;
30726        var jumpDataLength = true;
30727        switch (tbox) {
30728          case 0x6A501A1A: // 'jP\032\032'
30729            // TODO
30730            break;
30731          case 0x6A703268: // 'jp2h'
30732            jumpDataLength = false; // parsing child boxes
30733            break;
30734          case 0x636F6C72: // 'colr'
30735            // TODO
30736            break;
30737          case 0x6A703263: // 'jp2c'
30738            this.parseCodestream(data, position, position + dataLength);
30739            break;
30740        }
30741        if (jumpDataLength)
30742          position += dataLength;
30743      }
30744    },
30745    parseCodestream: function JpxImage_parseCodestream(data, start, end) {
30746      var context = {};
30747      try {
30748        var position = start;
30749        while (position < end) {
30750          var code = readUint16(data, position);
30751          position += 2;
30752
30753          var length = 0, j;
30754          switch (code) {
30755            case 0xFF4F: // Start of codestream (SOC)
30756              context.mainHeader = true;
30757              break;
30758            case 0xFFD9: // End of codestream (EOC)
30759              break;
30760            case 0xFF51: // Image and tile size (SIZ)
30761              length = readUint16(data, position);
30762              var siz = {};
30763              siz.Xsiz = readUint32(data, position + 4);
30764              siz.Ysiz = readUint32(data, position + 8);
30765              siz.XOsiz = readUint32(data, position + 12);
30766              siz.YOsiz = readUint32(data, position + 16);
30767              siz.XTsiz = readUint32(data, position + 20);
30768              siz.YTsiz = readUint32(data, position + 24);
30769              siz.XTOsiz = readUint32(data, position + 28);
30770              siz.YTOsiz = readUint32(data, position + 32);
30771              var componentsCount = readUint16(data, position + 36);
30772              siz.Csiz = componentsCount;
30773              var components = [];
30774              j = position + 38;
30775              for (var i = 0; i < componentsCount; i++) {
30776                var component = {
30777                  precision: (data[j] & 0x7F) + 1,
30778                  isSigned: !!(data[j] & 0x80),
30779                  XRsiz: data[j + 1],
30780                  YRsiz: data[j + 1]
30781                };
30782                calculateComponentDimensions(component, siz);
30783                components.push(component);
30784              }
30785              context.SIZ = siz;
30786              context.components = components;
30787              calculateTileGrids(context, components);
30788              context.QCC = [];
30789              context.COC = [];
30790              break;
30791            case 0xFF5C: // Quantization default (QCD)
30792              length = readUint16(data, position);
30793              var qcd = {};
30794              j = position + 2;
30795              var sqcd = data[j++];
30796              var spqcdSize, scalarExpounded;
30797              switch (sqcd & 0x1F) {
30798                case 0:
30799                  spqcdSize = 8;
30800                  scalarExpounded = true;
30801                  break;
30802                case 1:
30803                  spqcdSize = 16;
30804                  scalarExpounded = false;
30805                  break;
30806                case 2:
30807                  spqcdSize = 16;
30808                  scalarExpounded = true;
30809                  break;
30810                default:
30811                  throw 'Invalid SQcd value ' + sqcd;
30812              }
30813              qcd.noQuantization = spqcdSize == 8;
30814              qcd.scalarExpounded = scalarExpounded;
30815              qcd.guardBits = sqcd >> 5;
30816              var spqcds = [];
30817              while (j < length + position) {
30818                var spqcd = {};
30819                if (spqcdSize == 8) {
30820                  spqcd.epsilon = data[j++] >> 3;
30821                  spqcd.mu = 0;
30822                } else {
30823                  spqcd.epsilon = data[j] >> 3;
30824                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
30825                  j += 2;
30826                }
30827                spqcds.push(spqcd);
30828              }
30829              qcd.SPqcds = spqcds;
30830              if (context.mainHeader)
30831                context.QCD = qcd;
30832              else {
30833                context.currentTile.QCD = qcd;
30834                context.currentTile.QCC = [];
30835              }
30836              break;
30837            case 0xFF5D: // Quantization component (QCC)
30838              length = readUint16(data, position);
30839              var qcc = {};
30840              j = position + 2;
30841              var cqcc;
30842              if (context.SIZ.Csiz < 257)
30843                cqcc = data[j++];
30844              else {
30845                cqcc = readUint16(data, j);
30846                j += 2;
30847              }
30848              var sqcd = data[j++];
30849              var spqcdSize, scalarExpounded;
30850              switch (sqcd & 0x1F) {
30851                case 0:
30852                  spqcdSize = 8;
30853                  scalarExpounded = true;
30854                  break;
30855                case 1:
30856                  spqcdSize = 16;
30857                  scalarExpounded = false;
30858                  break;
30859                case 2:
30860                  spqcdSize = 16;
30861                  scalarExpounded = true;
30862                  break;
30863                default:
30864                  throw 'Invalid SQcd value ' + sqcd;
30865              }
30866              qcc.noQuantization = spqcdSize == 8;
30867              qcc.scalarExpounded = scalarExpounded;
30868              qcc.guardBits = sqcd >> 5;
30869              var spqcds = [];
30870              while (j < length + position) {
30871                var spqcd = {};
30872                if (spqcdSize == 8) {
30873                  spqcd.epsilon = data[j++] >> 3;
30874                  spqcd.mu = 0;
30875                } else {
30876                  spqcd.epsilon = data[j] >> 3;
30877                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
30878                  j += 2;
30879                }
30880                spqcds.push(spqcd);
30881              }
30882              qcc.SPqcds = spqcds;
30883              if (context.mainHeader)
30884                context.QCC[cqcc] = qcc;
30885              else
30886                context.currentTile.QCC[cqcc] = qcc;
30887              break;
30888            case 0xFF52: // Coding style default (COD)
30889              length = readUint16(data, position);
30890              var cod = {};
30891              j = position + 2;
30892              var scod = data[j++];
30893              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
30894              cod.sopMarkerUsed = !!(scod & 2);
30895              cod.ephMarkerUsed = !!(scod & 4);
30896              var codingStyle = {};
30897              cod.progressionOrder = data[j++];
30898              cod.layersCount = readUint16(data, j);
30899              j += 2;
30900              cod.multipleComponentTransform = data[j++];
30901
30902              cod.decompositionLevelsCount = data[j++];
30903              cod.xcb = (data[j++] & 0xF) + 2;
30904              cod.ycb = (data[j++] & 0xF) + 2;
30905              var blockStyle = data[j++];
30906              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
30907              cod.resetContextProbabilities = !!(blockStyle & 2);
30908              cod.terminationOnEachCodingPass = !!(blockStyle & 4);
30909              cod.verticalyStripe = !!(blockStyle & 8);
30910              cod.predictableTermination = !!(blockStyle & 16);
30911              cod.segmentationSymbolUsed = !!(blockStyle & 32);
30912              cod.transformation = data[j++];
30913              if (cod.entropyCoderWithCustomPrecincts) {
30914                var precinctsSizes = {};
30915                while (j < length + position) {
30916                  var precinctsSize = data[j];
30917                  precinctsSizes.push({
30918                    PPx: precinctsSize & 0xF,
30919                    PPy: precinctsSize >> 4
30920                  });
30921                }
30922                cod.precinctsSizes = precinctsSizes;
30923              }
30924
30925              if (cod.sopMarkerUsed || cod.ephMarkerUsed ||
30926                  cod.selectiveArithmeticCodingBypass ||
30927                  cod.resetContextProbabilities ||
30928                  cod.terminationOnEachCodingPass ||
30929                  cod.verticalyStripe || cod.predictableTermination ||
30930                  cod.segmentationSymbolUsed)
30931                throw 'Unsupported COD options: ' + uneval(cod);
30932
30933              if (context.mainHeader)
30934                context.COD = cod;
30935              else {
30936                context.currentTile.COD = cod;
30937                context.currentTile.COC = [];
30938              }
30939              break;
30940            case 0xFF90: // Start of tile-part (SOT)
30941              length = readUint16(data, position);
30942              var tile = {};
30943              tile.index = readUint16(data, position + 2);
30944              tile.length = readUint32(data, position + 4);
30945              tile.dataEnd = tile.length + position - 2;
30946              tile.partIndex = data[position + 8];
30947              tile.partsCount = data[position + 9];
30948
30949              context.mainHeader = false;
30950              if (tile.partIndex == 0) {
30951                // reset component specific settings
30952                tile.COD = context.COD;
30953                tile.COC = context.COC.slice(0); // clone of the global COC
30954                tile.QCD = context.QCD;
30955                tile.QCC = context.QCC.slice(0); // clone of the global COC
30956              }
30957              context.currentTile = tile;
30958              break;
30959            case 0xFF93: // Start of data (SOD)
30960              var tile = context.currentTile;
30961              if (tile.partIndex == 0) {
30962                initializeTile(context, tile.index);
30963                buildPackets(context);
30964              }
30965
30966              // moving to the end of the data
30967              length = tile.dataEnd - position;
30968
30969              parseTilePackets(context, data, position, length);
30970              break;
30971            case 0xFF64: // Comment (COM)
30972              length = readUint16(data, position);
30973              // skipping content
30974              break;
30975            default:
30976              throw 'Unknown codestream code: ' + code.toString(16);
30977          }
30978          position += length;
30979        }
30980      } catch (e) {
30981        if (this.failOnCorruptedImage)
30982          error('JPX error: ' + e);
30983        else
30984          warn('JPX error: ' + e + '. Trying to recover');
30985      }
30986      this.tiles = transformComponents(context);
30987      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
30988      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
30989      this.componentsCount = context.SIZ.Csiz;
30990    }
30991  };
30992  function readUint32(data, offset) {
30993    return (data[offset] << 24) | (data[offset + 1] << 16) |
30994      (data[offset + 2] << 8) | data[offset + 3];
30995  }
30996  function readUint16(data, offset) {
30997    return (data[offset] << 8) | data[offset + 1];
30998  }
30999  function log2(x) {
31000    var n = 1, i = 0;
31001    while (x > n) {
31002      n <<= 1;
31003      i++;
31004    }
31005    return i;
31006  }
31007  function calculateComponentDimensions(component, siz) {
31008    // Section B.2 Component mapping
31009    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
31010    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
31011    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
31012    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
31013    component.width = component.x1 - component.x0;
31014    component.height = component.y1 - component.y0;
31015  }
31016  function calculateTileGrids(context, components) {
31017    var siz = context.SIZ;
31018    // Section B.3 Division into tile and tile-components
31019    var tiles = [];
31020    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
31021    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
31022    for (var q = 0; q < numYtiles; q++) {
31023      for (var p = 0; p < numXtiles; p++) {
31024        var tile = {};
31025        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
31026        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
31027        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
31028        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
31029        tile.width = tile.tx1 - tile.tx0;
31030        tile.height = tile.ty1 - tile.ty0;
31031        tile.components = [];
31032        tiles.push(tile);
31033      }
31034    }
31035    context.tiles = tiles;
31036
31037    var componentsCount = siz.Csiz;
31038    for (var i = 0, ii = componentsCount; i < ii; i++) {
31039      var component = components[i];
31040      var tileComponents = [];
31041      for (var j = 0, jj = tiles.length; j < jj; j++) {
31042        var tileComponent = {}, tile = tiles[j];
31043        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
31044        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
31045        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
31046        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
31047        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
31048        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
31049        tile.components[i] = tileComponent;
31050      }
31051    }
31052  }
31053  function getBlocksDimensions(context, component, r) {
31054    var codOrCoc = component.codingStyleParameters;
31055    var result = {};
31056    if (!codOrCoc.entropyCoderWithCustomPrecincts) {
31057      result.PPx = 15;
31058      result.PPy = 15;
31059    } else {
31060      result.PPx = codOrCoc.precinctsSizes[r].PPx;
31061      result.PPy = codOrCoc.precinctsSizes[r].PPy;
31062    }
31063    // calculate codeblock size as described in section B.7
31064    result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :
31065      Math.min(codOrCoc.xcb, result.PPx);
31066    result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :
31067      Math.min(codOrCoc.ycb, result.PPy);
31068    return result;
31069  }
31070  function buildPrecincts(context, resolution, dimensions) {
31071    // Section B.6 Division resolution to precincts
31072    var precinctWidth = 1 << dimensions.PPx;
31073    var precinctHeight = 1 << dimensions.PPy;
31074    var numprecinctswide = resolution.trx1 > resolution.trx0 ?
31075      Math.ceil(resolution.trx1 / precinctWidth) -
31076      Math.floor(resolution.trx0 / precinctWidth) : 0;
31077    var numprecinctshigh = resolution.try1 > resolution.try0 ?
31078      Math.ceil(resolution.try1 / precinctHeight) -
31079      Math.floor(resolution.try0 / precinctHeight) : 0;
31080    var numprecincts = numprecinctswide * numprecinctshigh;
31081    var precinctXOffset = Math.floor(resolution.trx0 / precinctWidth) *
31082      precinctWidth;
31083    var precinctYOffset = Math.floor(resolution.try0 / precinctHeight) *
31084      precinctHeight;
31085    resolution.precinctParameters = {
31086      precinctXOffset: precinctXOffset,
31087      precinctYOffset: precinctYOffset,
31088      precinctWidth: precinctWidth,
31089      precinctHeight: precinctHeight,
31090      numprecinctswide: numprecinctswide,
31091      numprecinctshigh: numprecinctshigh,
31092      numprecincts: numprecincts
31093    };
31094  }
31095  function buildCodeblocks(context, subband, dimensions) {
31096    // Section B.7 Division sub-band into code-blocks
31097    var xcb_ = dimensions.xcb_;
31098    var ycb_ = dimensions.ycb_;
31099    var codeblockWidth = 1 << xcb_;
31100    var codeblockHeight = 1 << ycb_;
31101    var cbx0 = Math.floor(subband.tbx0 / codeblockWidth);
31102    var cby0 = Math.floor(subband.tby0 / codeblockHeight);
31103    var cbx1 = Math.ceil(subband.tbx1 / codeblockWidth);
31104    var cby1 = Math.ceil(subband.tby1 / codeblockHeight);
31105    var precinctParameters = subband.resolution.precinctParameters;
31106    var codeblocks = [];
31107    var precincts = [];
31108    for (var j = cby0; j < cby1; j++) {
31109      for (var i = cbx0; i < cbx1; i++) {
31110        var codeblock = {
31111          cbx: i,
31112          cby: j,
31113          tbx0: codeblockWidth * i,
31114          tby0: codeblockHeight * j,
31115          tbx1: codeblockWidth * (i + 1),
31116          tby1: codeblockHeight * (j + 1)
31117        };
31118        // calculate precinct number
31119        var pi = Math.floor((codeblock.tbx0 -
31120          precinctParameters.precinctXOffset) /
31121          precinctParameters.precinctWidth);
31122        var pj = Math.floor((codeblock.tby0 -
31123          precinctParameters.precinctYOffset) /
31124          precinctParameters.precinctHeight);
31125        var precinctNumber = pj +
31126          pi * precinctParameters.numprecinctswide;
31127        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
31128        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
31129        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
31130        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
31131        codeblock.precinctNumber = precinctNumber;
31132        codeblock.subbandType = subband.type;
31133        var coefficientsLength = (codeblock.tbx1_ - codeblock.tbx0_) *
31134          (codeblock.tby1_ - codeblock.tby0_);
31135        codeblock.Lblock = 3;
31136        codeblocks.push(codeblock);
31137        // building precinct for the sub-band
31138        var precinct;
31139        if (precinctNumber in precincts) {
31140          precinct = precincts[precinctNumber];
31141          precinct.cbxMin = Math.min(precinct.cbxMin, i);
31142          precinct.cbyMin = Math.min(precinct.cbyMin, j);
31143          precinct.cbxMax = Math.max(precinct.cbxMax, i);
31144          precinct.cbyMax = Math.max(precinct.cbyMax, j);
31145        } else {
31146          precincts[precinctNumber] = precinct = {
31147            cbxMin: i,
31148            cbyMin: j,
31149            cbxMax: i,
31150            cbyMax: j
31151          };
31152        }
31153        codeblock.precinct = precinct;
31154      }
31155    }
31156    subband.codeblockParameters = {
31157      codeblockWidth: xcb_,
31158      codeblockHeight: ycb_,
31159      numcodeblockwide: cbx1 - cbx0 + 1,
31160      numcodeblockhigh: cby1 - cby1 + 1
31161    };
31162    subband.codeblocks = codeblocks;
31163    for (var i = 0, ii = codeblocks.length; i < ii; i++) {
31164      var codeblock = codeblocks[i];
31165      var precinctNumber = codeblock.precinctNumber;
31166    }
31167    subband.precincts = precincts;
31168  }
31169  function createPacket(resolution, precinctNumber, layerNumber) {
31170    var precinctCodeblocks = [];
31171    // Section B.10.8 Order of info in packet
31172    var subbands = resolution.subbands;
31173    // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence
31174    for (var i = 0, ii = subbands.length; i < ii; i++) {
31175      var subband = subbands[i];
31176      var codeblocks = subband.codeblocks;
31177      for (var j = 0, jj = codeblocks.length; j < jj; j++) {
31178        var codeblock = codeblocks[j];
31179        if (codeblock.precinctNumber != precinctNumber)
31180          continue;
31181        precinctCodeblocks.push(codeblock);
31182      }
31183    }
31184    return {
31185      layerNumber: layerNumber,
31186      codeblocks: precinctCodeblocks
31187    };
31188  }
31189  function LayerResolutionComponentPositionIterator(context) {
31190    var siz = context.SIZ;
31191    var tileIndex = context.currentTile.index;
31192    var tile = context.tiles[tileIndex];
31193    var layersCount = tile.codingStyleDefaultParameters.layersCount;
31194    var componentsCount = siz.Csiz;
31195    var maxDecompositionLevelsCount = 0;
31196    for (var q = 0; q < componentsCount; q++) {
31197      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
31198        tile.components[q].codingStyleParameters.decompositionLevelsCount);
31199    }
31200
31201    var l = 0, r = 0, i = 0, k = 0;
31202
31203    this.nextPacket = function JpxImage_nextPacket() {
31204      // Section B.12.1.1 Layer-resolution-component-position
31205      for (; l < layersCount; l++) {
31206        for (; r <= maxDecompositionLevelsCount; r++) {
31207          for (; i < componentsCount; i++) {
31208            var component = tile.components[i];
31209            if (r > component.codingStyleParameters.decompositionLevelsCount)
31210              continue;
31211
31212            var resolution = component.resolutions[r];
31213            var numprecincts = resolution.precinctParameters.numprecincts;
31214            for (; k < numprecincts;) {
31215              var packet = createPacket(resolution, k, l);
31216              k++;
31217              return packet;
31218            }
31219            k = 0;
31220          }
31221          i = 0;
31222        }
31223        r = 0;
31224      }
31225      throw 'Out of packets';
31226    };
31227  }
31228  function ResolutionLayerComponentPositionIterator(context) {
31229    var siz = context.SIZ;
31230    var tileIndex = context.currentTile.index;
31231    var tile = context.tiles[tileIndex];
31232    var layersCount = tile.codingStyleDefaultParameters.layersCount;
31233    var componentsCount = siz.Csiz;
31234    var maxDecompositionLevelsCount = 0;
31235    for (var q = 0; q < componentsCount; q++) {
31236      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
31237        tile.components[q].codingStyleParameters.decompositionLevelsCount);
31238    }
31239
31240    var r = 0, l = 0, i = 0, k = 0;
31241
31242    this.nextPacket = function JpxImage_nextPacket() {
31243      // Section B.12.1.2 Resolution-layer-component-position
31244      for (; r <= maxDecompositionLevelsCount; r++) {
31245        for (; l < layersCount; l++) {
31246          for (; i < componentsCount; i++) {
31247            var component = tile.components[i];
31248            if (r > component.codingStyleParameters.decompositionLevelsCount)
31249              continue;
31250
31251            var resolution = component.resolutions[r];
31252            var numprecincts = resolution.precinctParameters.numprecincts;
31253            for (; k < numprecincts;) {
31254              var packet = createPacket(resolution, k, l);
31255              k++;
31256              return packet;
31257            }
31258            k = 0;
31259          }
31260          i = 0;
31261        }
31262        l = 0;
31263      }
31264      throw 'Out of packets';
31265    };
31266  }
31267  function buildPackets(context) {
31268    var siz = context.SIZ;
31269    var tileIndex = context.currentTile.index;
31270    var tile = context.tiles[tileIndex];
31271    var componentsCount = siz.Csiz;
31272    // Creating resolutions and sub-bands for each component
31273    for (var c = 0; c < componentsCount; c++) {
31274      var component = tile.components[c];
31275      var decompositionLevelsCount =
31276        component.codingStyleParameters.decompositionLevelsCount;
31277      // Section B.5 Resolution levels and sub-bands
31278      var resolutions = [];
31279      var subbands = [];
31280      for (var r = 0; r <= decompositionLevelsCount; r++) {
31281        var blocksDimensions = getBlocksDimensions(context, component, r);
31282        var resolution = {};
31283        var scale = 1 << (decompositionLevelsCount - r);
31284        resolution.trx0 = Math.ceil(component.tcx0 / scale);
31285        resolution.try0 = Math.ceil(component.tcy0 / scale);
31286        resolution.trx1 = Math.ceil(component.tcx1 / scale);
31287        resolution.try1 = Math.ceil(component.tcy1 / scale);
31288        buildPrecincts(context, resolution, blocksDimensions);
31289        resolutions.push(resolution);
31290
31291        var subband;
31292        if (r == 0) {
31293          // one sub-band (LL) with last decomposition
31294          subband = {};
31295          subband.type = 'LL';
31296          subband.tbx0 = Math.ceil(component.tcx0 / scale);
31297          subband.tby0 = Math.ceil(component.tcy0 / scale);
31298          subband.tbx1 = Math.ceil(component.tcx1 / scale);
31299          subband.tby1 = Math.ceil(component.tcy1 / scale);
31300          subband.resolution = resolution;
31301          buildCodeblocks(context, subband, blocksDimensions);
31302          subbands.push(subband);
31303          resolution.subbands = [subband];
31304        } else {
31305          var bscale = 1 << (decompositionLevelsCount - r + 1);
31306          var resolutionSubbands = [];
31307          // three sub-bands (HL, LH and HH) with rest of decompositions
31308          subband = {};
31309          subband.type = 'HL';
31310          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
31311          subband.tby0 = Math.ceil(component.tcy0 / bscale);
31312          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
31313          subband.tby1 = Math.ceil(component.tcy1 / bscale);
31314          subband.resolution = resolution;
31315          buildCodeblocks(context, subband, blocksDimensions);
31316          subbands.push(subband);
31317          resolutionSubbands.push(subband);
31318
31319          subband = {};
31320          subband.type = 'LH';
31321          subband.tbx0 = Math.ceil(component.tcx0 / bscale);
31322          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
31323          subband.tbx1 = Math.ceil(component.tcx1 / bscale);
31324          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
31325          subband.resolution = resolution;
31326          buildCodeblocks(context, subband, blocksDimensions);
31327          subbands.push(subband);
31328          resolutionSubbands.push(subband);
31329
31330          subband = {};
31331          subband.type = 'HH';
31332          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
31333          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
31334          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
31335          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
31336          subband.resolution = resolution;
31337          buildCodeblocks(context, subband, blocksDimensions);
31338          subbands.push(subband);
31339          resolutionSubbands.push(subband);
31340
31341          resolution.subbands = resolutionSubbands;
31342        }
31343      }
31344      component.resolutions = resolutions;
31345      component.subbands = subbands;
31346    }
31347    // Generate the packets sequence
31348    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
31349    var packetsIterator;
31350    switch (progressionOrder) {
31351      case 0:
31352        tile.packetsIterator =
31353          new LayerResolutionComponentPositionIterator(context);
31354        break;
31355      case 1:
31356        tile.packetsIterator =
31357          new ResolutionLayerComponentPositionIterator(context);
31358        break;
31359      default:
31360        throw 'Unsupported progression order ' + progressionOrder;
31361    }
31362  }
31363  function parseTilePackets(context, data, offset, dataLength) {
31364    var position = 0;
31365    var buffer, bufferSize = 0, skipNextBit = false;
31366    function readBits(count) {
31367      while (bufferSize < count) {
31368        var b = data[offset + position];
31369        position++;
31370        if (skipNextBit) {
31371          buffer = (buffer << 7) | b;
31372          bufferSize += 7;
31373          skipNextBit = false;
31374        } else {
31375          buffer = (buffer << 8) | b;
31376          bufferSize += 8;
31377        }
31378        if (b == 0xFF) {
31379          skipNextBit = true;
31380        }
31381      }
31382      bufferSize -= count;
31383      return (buffer >>> bufferSize) & ((1 << count) - 1);
31384    }
31385    function alignToByte() {
31386      bufferSize = 0;
31387      if (skipNextBit) {
31388        position++;
31389        skipNextBit = false;
31390      }
31391    }
31392    function readCodingpasses() {
31393      var value = readBits(1);
31394      if (value == 0)
31395        return 1;
31396      value = (value << 1) | readBits(1);
31397      if (value == 0x02)
31398        return 2;
31399      value = (value << 2) | readBits(2);
31400      if (value <= 0x0E)
31401        return (value & 0x03) + 3;
31402      value = (value << 5) | readBits(5);
31403      if (value <= 0x1FE)
31404        return (value & 0x1F) + 6;
31405      value = (value << 7) | readBits(7);
31406      return (value & 0x7F) + 37;
31407    }
31408    var tileIndex = context.currentTile.index;
31409    var tile = context.tiles[tileIndex];
31410    var packetsIterator = tile.packetsIterator;
31411    while (position < dataLength) {
31412      var packet = packetsIterator.nextPacket();
31413      if (!readBits(1)) {
31414        alignToByte();
31415        continue;
31416      }
31417      var layerNumber = packet.layerNumber;
31418      var queue = [];
31419      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
31420        var codeblock = packet.codeblocks[i];
31421        var precinct = codeblock.precinct;
31422        var codeblockColumn = codeblock.cbx - precinct.cbxMin;
31423        var codeblockRow = codeblock.cby - precinct.cbyMin;
31424        var codeblockIncluded = false;
31425        var firstTimeInclusion = false;
31426        if ('included' in codeblock) {
31427          codeblockIncluded = !!readBits(1);
31428        } else {
31429          // reading inclusion tree
31430          var precinct = codeblock.precinct;
31431          var inclusionTree, zeroBitPlanesTree;
31432          if ('inclusionTree' in precinct) {
31433            inclusionTree = precinct.inclusionTree;
31434          } else {
31435            // building inclusion and zero bit-planes trees
31436            var width = precinct.cbxMax - precinct.cbxMin + 1;
31437            var height = precinct.cbyMax - precinct.cbyMin + 1;
31438            inclusionTree = new InclusionTree(width, height, layerNumber);
31439            zeroBitPlanesTree = new TagTree(width, height);
31440            precinct.inclusionTree = inclusionTree;
31441            precinct.zeroBitPlanesTree = zeroBitPlanesTree;
31442          }
31443
31444          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
31445            while (true) {
31446              if (readBits(1)) {
31447                var valueReady = !inclusionTree.nextLevel();
31448                if (valueReady) {
31449                  codeblock.included = true;
31450                  codeblockIncluded = firstTimeInclusion = true;
31451                  break;
31452                }
31453              } else {
31454                inclusionTree.incrementValue(layerNumber);
31455                break;
31456              }
31457            }
31458          }
31459        }
31460        if (!codeblockIncluded)
31461          continue;
31462        if (firstTimeInclusion) {
31463          zeroBitPlanesTree = precinct.zeroBitPlanesTree;
31464          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
31465          while (true) {
31466            if (readBits(1)) {
31467              var valueReady = !zeroBitPlanesTree.nextLevel();
31468              if (valueReady)
31469                break;
31470            } else
31471              zeroBitPlanesTree.incrementValue();
31472          }
31473          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
31474        }
31475        var codingpasses = readCodingpasses();
31476        while (readBits(1))
31477          codeblock.Lblock++;
31478        var codingpassesLog2 = log2(codingpasses);
31479        // rounding down log2
31480        var bits = ((codingpasses < (1 << codingpassesLog2)) ?
31481          codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
31482        var codedDataLength = readBits(bits);
31483        queue.push({
31484          codeblock: codeblock,
31485          codingpasses: codingpasses,
31486          dataLength: codedDataLength
31487        });
31488      }
31489      alignToByte();
31490      while (queue.length > 0) {
31491        var packetItem = queue.shift();
31492        var codeblock = packetItem.codeblock;
31493        if (!('data' in codeblock))
31494          codeblock.data = [];
31495        codeblock.data.push({
31496          data: data,
31497          start: offset + position,
31498          end: offset + position + packetItem.dataLength,
31499          codingpasses: packetItem.codingpasses
31500        });
31501        position += packetItem.dataLength;
31502      }
31503    }
31504    return position;
31505  }
31506  function copyCoefficients(coefficients, x0, y0, width, height,
31507                            delta, mb, codeblocks, transformation) {
31508    var r = 0.5; // formula (E-6)
31509    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
31510      var codeblock = codeblocks[i];
31511      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
31512      var blockHeight = codeblock.tby1_ - codeblock.tby0_;
31513      if (blockWidth == 0 || blockHeight == 0)
31514        continue;
31515      if (!('data' in codeblock))
31516        continue;
31517
31518      var bitModel, currentCodingpassType;
31519      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,
31520        codeblock.zeroBitPlanes);
31521      currentCodingpassType = 2; // first bit plane starts from cleanup
31522
31523      // collect data
31524      var data = codeblock.data, totalLength = 0, codingpasses = 0;
31525      for (var q = 0, qq = data.length; q < qq; q++) {
31526        var dataItem = data[q];
31527        totalLength += dataItem.end - dataItem.start;
31528        codingpasses += dataItem.codingpasses;
31529      }
31530      var encodedData = new Uint8Array(totalLength), k = 0;
31531      for (var q = 0, qq = data.length; q < qq; q++) {
31532        var dataItem = data[q];
31533        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
31534        encodedData.set(chunk, k);
31535        k += chunk.length;
31536      }
31537      // decoding the item
31538      var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);
31539      bitModel.setDecoder(decoder);
31540
31541      for (var q = 0; q < codingpasses; q++) {
31542        switch (currentCodingpassType) {
31543          case 0:
31544            bitModel.runSignificancePropogationPass();
31545            break;
31546          case 1:
31547            bitModel.runMagnitudeRefinementPass();
31548            break;
31549          case 2:
31550            bitModel.runCleanupPass();
31551            break;
31552        }
31553        currentCodingpassType = (currentCodingpassType + 1) % 3;
31554      }
31555
31556      var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;
31557      var position = 0;
31558      for (var j = 0; j < blockHeight; j++) {
31559        for (var k = 0; k < blockWidth; k++) {
31560          var n = (bitModel.coefficentsSign[position] ? -1 : 1) *
31561            bitModel.coefficentsMagnitude[position];
31562          var nb = bitModel.bitsDecoded[position], correction;
31563          if (transformation == 0 || mb > nb) {
31564            // use r only if transformation is irreversible or
31565            // not all bitplanes were decoded for reversible transformation
31566            n += n < 0 ? n - r : n > 0 ? n + r : 0;
31567            correction = 1 << (mb - nb);
31568          } else
31569            correction = 1;
31570          coefficients[offset++] = n * correction * delta;
31571          position++;
31572        }
31573        offset += width - blockWidth;
31574      }
31575    }
31576  }
31577  function transformTile(context, tile, c) {
31578    var component = tile.components[c];
31579    var codingStyleParameters = component.codingStyleParameters;
31580    var quantizationParameters = component.quantizationParameters;
31581    var decompositionLevelsCount =
31582      codingStyleParameters.decompositionLevelsCount;
31583    var spqcds = quantizationParameters.SPqcds;
31584    var scalarExpounded = quantizationParameters.scalarExpounded;
31585    var guardBits = quantizationParameters.guardBits;
31586    var transformation = codingStyleParameters.transformation;
31587    var precision = context.components[c].precision;
31588
31589    var subbandCoefficients = [];
31590    var k = 0, b = 0;
31591    for (var i = 0; i <= decompositionLevelsCount; i++) {
31592      var resolution = component.resolutions[i];
31593
31594      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
31595        var mu, epsilon;
31596        if (!scalarExpounded) {
31597          // formula E-5
31598          mu = spqcds[0].mu;
31599          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
31600        } else {
31601          mu = spqcds[b].mu;
31602          epsilon = spqcds[b].epsilon;
31603        }
31604
31605        var subband = resolution.subbands[j];
31606        var width = subband.tbx1 - subband.tbx0;
31607        var height = subband.tby1 - subband.tby0;
31608        var gainLog2 = SubbandsGainLog2[subband.type];
31609
31610        // calulate quantization coefficient (Section E.1.1.1)
31611        var delta = Math.pow(2, (precision + gainLog2) - epsilon) *
31612          (1 + mu / 2048);
31613        var mb = (guardBits + epsilon - 1);
31614
31615        var coefficients = new Float32Array(width * height);
31616        copyCoefficients(coefficients, subband.tbx0, subband.tby0,
31617          width, height, delta, mb, subband.codeblocks, transformation);
31618
31619        subbandCoefficients.push({
31620          width: width,
31621          height: height,
31622          items: coefficients
31623        });
31624
31625        b++;
31626      }
31627    }
31628
31629    var transformation = codingStyleParameters.transformation;
31630    var transform = transformation == 0 ? new IrreversibleTransform() :
31631      new ReversibleTransform();
31632    var result = transform.calculate(subbandCoefficients,
31633      component.tcx0, component.tcy0);
31634    return {
31635      left: component.tcx0,
31636      top: component.tcy0,
31637      width: result.width,
31638      height: result.height,
31639      items: result.items
31640    };
31641  }
31642  function transformComponents(context) {
31643    var siz = context.SIZ;
31644    var components = context.components;
31645    var componentsCount = siz.Csiz;
31646    var resultImages = [];
31647    for (var i = 0, ii = context.tiles.length; i < ii; i++) {
31648      var tile = context.tiles[i];
31649      var result = [];
31650      for (var c = 0; c < componentsCount; c++) {
31651        var image = transformTile(context, tile, c);
31652        result.push(image);
31653      }
31654
31655      // Section G.2.2 Inverse multi component transform
31656      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
31657        var y0items = result[0].items;
31658        var y1items = result[1].items;
31659        var y2items = result[2].items;
31660        for (var j = 0, jj = y0items.length; j < jj; j++) {
31661          var y0 = y0items[j], y1 = y1items[j], y2 = y2items[j];
31662          var i1 = y0 - ((y2 + y1) >> 2);
31663          y1items[j] = i1;
31664          y0items[j] = y2 + i1;
31665          y2items[j] = y1 + i1;
31666        }
31667      }
31668
31669      // Section G.1 DC level shifting to unsigned component values
31670      for (var c = 0; c < componentsCount; c++) {
31671        var component = components[c];
31672        if (component.isSigned)
31673          continue;
31674
31675        var offset = 1 << (component.precision - 1);
31676        var tileImage = result[c];
31677        var items = tileImage.items;
31678        for (var j = 0, jj = items.length; j < jj; j++)
31679          items[j] += offset;
31680      }
31681
31682      // To simplify things: shift and clamp output to 8 bit unsigned
31683      for (var c = 0; c < componentsCount; c++) {
31684        var component = components[c];
31685        var offset = component.isSigned ? 128 : 0;
31686        var shift = component.precision - 8;
31687        var tileImage = result[c];
31688        var items = tileImage.items;
31689        var data = new Uint8Array(items.length);
31690        for (var j = 0, jj = items.length; j < jj; j++) {
31691          var value = (items[j] >> shift) + offset;
31692          data[j] = value < 0 ? 0 : value > 255 ? 255 : value;
31693        }
31694        result[c].items = data;
31695      }
31696
31697      resultImages.push(result);
31698    }
31699    return resultImages;
31700  }
31701  function initializeTile(context, tileIndex) {
31702    var siz = context.SIZ;
31703    var componentsCount = siz.Csiz;
31704    var tile = context.tiles[tileIndex];
31705    var resultTiles = [];
31706    for (var c = 0; c < componentsCount; c++) {
31707      var component = tile.components[c];
31708      var qcdOrQcc = c in context.currentTile.QCC ?
31709        context.currentTile.QCC[c] : context.currentTile.QCD;
31710      component.quantizationParameters = qcdOrQcc;
31711      var codOrCoc = c in context.currentTile.COC ?
31712        context.currentTile.COC[c] : context.currentTile.COD;
31713      component.codingStyleParameters = codOrCoc;
31714    }
31715    tile.codingStyleDefaultParameters = context.currentTile.COD;
31716  }
31717
31718  // Section B.10.2 Tag trees
31719  var TagTree = (function TagTreeClosure() {
31720    function TagTree(width, height) {
31721      var levelsLength = log2(Math.max(width, height)) + 1;
31722      this.levels = [];
31723      for (var i = 0; i < levelsLength; i++) {
31724        var level = {
31725          width: width,
31726          height: height,
31727          items: []
31728        };
31729        this.levels.push(level);
31730        width = Math.ceil(width / 2);
31731        height = Math.ceil(height / 2);
31732      }
31733    }
31734    TagTree.prototype = {
31735      reset: function TagTree_reset(i, j) {
31736        var currentLevel = 0, value = 0;
31737        while (currentLevel < this.levels.length) {
31738          var level = this.levels[currentLevel];
31739          var index = i + j * level.width;
31740          if (index in level.items) {
31741            value = level.items[index];
31742            break;
31743          }
31744          level.index = index;
31745          i >>= 1;
31746          j >>= 1;
31747          currentLevel++;
31748        }
31749        currentLevel--;
31750        var level = this.levels[currentLevel];
31751        level.items[level.index] = value;
31752        this.currentLevel = currentLevel;
31753        delete this.value;
31754      },
31755      incrementValue: function TagTree_incrementValue() {
31756        var level = this.levels[this.currentLevel];
31757        level.items[level.index]++;
31758      },
31759      nextLevel: function TagTree_nextLevel() {
31760        var currentLevel = this.currentLevel;
31761        var level = this.levels[currentLevel];
31762        var value = level.items[level.index];
31763        currentLevel--;
31764        if (currentLevel < 0) {
31765          this.value = value;
31766          return false;
31767        }
31768
31769        this.currentLevel = currentLevel;
31770        var level = this.levels[currentLevel];
31771        level.items[level.index] = value;
31772        return true;
31773      }
31774    };
31775    return TagTree;
31776  })();
31777
31778  var InclusionTree = (function InclusionTreeClosure() {
31779    function InclusionTree(width, height,  defaultValue) {
31780      var levelsLength = log2(Math.max(width, height)) + 1;
31781      this.levels = [];
31782      for (var i = 0; i < levelsLength; i++) {
31783        var items = new Uint8Array(width * height);
31784        for (var j = 0, jj = items.length; j < jj; j++)
31785          items[j] = defaultValue;
31786
31787        var level = {
31788          width: width,
31789          height: height,
31790          items: items
31791        };
31792        this.levels.push(level);
31793
31794        width = Math.ceil(width / 2);
31795        height = Math.ceil(height / 2);
31796      }
31797    }
31798    InclusionTree.prototype = {
31799      reset: function InclusionTree_reset(i, j, stopValue) {
31800        var currentLevel = 0;
31801        while (currentLevel < this.levels.length) {
31802          var level = this.levels[currentLevel];
31803          var index = i + j * level.width;
31804          level.index = index;
31805          var value = level.items[index];
31806
31807          if (value == 0xFF)
31808            break;
31809
31810          if (value > stopValue) {
31811            this.currentLevel = currentLevel;
31812            // already know about this one, propagating the value to top levels
31813            this.propagateValues();
31814            return false;
31815          }
31816
31817          i >>= 1;
31818          j >>= 1;
31819          currentLevel++;
31820        }
31821        this.currentLevel = currentLevel - 1;
31822        return true;
31823      },
31824      incrementValue: function InclusionTree_incrementValue(stopValue) {
31825        var level = this.levels[this.currentLevel];
31826        level.items[level.index] = stopValue + 1;
31827        this.propagateValues();
31828      },
31829      propagateValues: function InclusionTree_propagateValues() {
31830        var levelIndex = this.currentLevel;
31831        var level = this.levels[levelIndex];
31832        var currentValue = level.items[level.index];
31833        while (--levelIndex >= 0) {
31834          var level = this.levels[levelIndex];
31835          level.items[level.index] = currentValue;
31836        }
31837      },
31838      nextLevel: function InclusionTree_nextLevel() {
31839        var currentLevel = this.currentLevel;
31840        var level = this.levels[currentLevel];
31841        var value = level.items[level.index];
31842        level.items[level.index] = 0xFF;
31843        currentLevel--;
31844        if (currentLevel < 0)
31845          return false;
31846
31847        this.currentLevel = currentLevel;
31848        var level = this.levels[currentLevel];
31849        level.items[level.index] = value;
31850        return true;
31851      }
31852    };
31853    return InclusionTree;
31854  })();
31855
31856  // Implements C.3. Arithmetic decoding procedures
31857  var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
31858    var QeTable = [
31859      {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},
31860      {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},
31861      {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},
31862      {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},
31863      {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},
31864      {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},
31865      {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},
31866      {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},
31867      {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},
31868      {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},
31869      {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},
31870      {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},
31871      {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},
31872      {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},
31873      {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},
31874      {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},
31875      {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},
31876      {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},
31877      {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},
31878      {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},
31879      {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},
31880      {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},
31881      {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},
31882      {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},
31883      {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},
31884      {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},
31885      {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},
31886      {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},
31887      {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},
31888      {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},
31889      {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},
31890      {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},
31891      {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},
31892      {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},
31893      {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},
31894      {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},
31895      {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},
31896      {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},
31897      {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},
31898      {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},
31899      {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},
31900      {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},
31901      {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},
31902      {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},
31903      {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},
31904      {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},
31905      {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}
31906    ];
31907
31908    function ArithmeticDecoder(data, start, end) {
31909      this.data = data;
31910      this.bp = start;
31911      this.dataEnd = end;
31912
31913      this.chigh = data[start];
31914      this.clow = 0;
31915
31916      this.byteIn();
31917
31918      this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
31919      this.clow = (this.clow << 7) & 0xFFFF;
31920      this.ct -= 7;
31921      this.a = 0x8000;
31922    }
31923
31924    ArithmeticDecoder.prototype = {
31925      byteIn: function ArithmeticDecoder_byteIn() {
31926        var data = this.data;
31927        var bp = this.bp;
31928        if (data[bp] == 0xFF) {
31929          var b1 = data[bp + 1];
31930          if (b1 > 0x8F) {
31931            this.clow += 0xFF00;
31932            this.ct = 8;
31933          } else {
31934            bp++;
31935            this.clow += (data[bp] << 9);
31936            this.ct = 7;
31937            this.bp = bp;
31938          }
31939        } else {
31940          bp++;
31941          this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
31942          this.ct = 8;
31943          this.bp = bp;
31944        }
31945        if (this.clow > 0xFFFF) {
31946          this.chigh += (this.clow >> 16);
31947          this.clow &= 0xFFFF;
31948        }
31949      },
31950      readBit: function ArithmeticDecoder_readBit(cx) {
31951        var qeIcx = QeTable[cx.index].qe;
31952        this.a -= qeIcx;
31953
31954        if (this.chigh < qeIcx) {
31955          var d = this.exchangeLps(cx);
31956          this.renormD();
31957          return d;
31958        } else {
31959          this.chigh -= qeIcx;
31960          if ((this.a & 0x8000) == 0) {
31961            var d = this.exchangeMps(cx);
31962            this.renormD();
31963            return d;
31964          } else {
31965            return cx.mps;
31966          }
31967        }
31968      },
31969      renormD: function ArithmeticDecoder_renormD() {
31970        do {
31971          if (this.ct == 0)
31972            this.byteIn();
31973
31974          this.a <<= 1;
31975          this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
31976          this.clow = (this.clow << 1) & 0xFFFF;
31977          this.ct--;
31978        } while ((this.a & 0x8000) == 0);
31979      },
31980      exchangeMps: function ArithmeticDecoder_exchangeMps(cx) {
31981        var d;
31982        var qeTableIcx = QeTable[cx.index];
31983        if (this.a < qeTableIcx.qe) {
31984          d = 1 - cx.mps;
31985
31986          if (qeTableIcx.switchFlag == 1) {
31987            cx.mps = 1 - cx.mps;
31988          }
31989          cx.index = qeTableIcx.nlps;
31990        } else {
31991          d = cx.mps;
31992          cx.index = qeTableIcx.nmps;
31993        }
31994        return d;
31995      },
31996      exchangeLps: function ArithmeticDecoder_exchangeLps(cx) {
31997        var d;
31998        var qeTableIcx = QeTable[cx.index];
31999        if (this.a < qeTableIcx.qe) {
32000          this.a = qeTableIcx.qe;
32001          d = cx.mps;
32002          cx.index = qeTableIcx.nmps;
32003        } else {
32004          this.a = qeTableIcx.qe;
32005          d = 1 - cx.mps;
32006
32007          if (qeTableIcx.switchFlag == 1) {
32008            cx.mps = 1 - cx.mps;
32009          }
32010          cx.index = qeTableIcx.nlps;
32011        }
32012        return d;
32013      }
32014    };
32015
32016    return ArithmeticDecoder;
32017  })();
32018
32019  // Section D. Coefficient bit modeling
32020  var BitModel = (function BitModelClosure() {
32021    // Table D-1
32022    // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),
32023    // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)
32024    var LLAndLHContextsLabel = new Uint8Array([
32025      0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4,
32026      7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6,
32027      8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8
32028    ]);
32029    var HLContextLabel = new Uint8Array([
32030      0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8,
32031      8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3,
32032      4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8
32033    ]);
32034    var HHContextLabel = new Uint8Array([
32035      0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5,
32036      5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8,
32037      8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8
32038    ]);
32039
32040    // Table D-2
32041    function calcSignContribution(significance0, sign0, significance1, sign1) {
32042      if (significance1) {
32043        if (!sign1)
32044          return significance0 ? (!sign0 ? 1 : 0) : 1;
32045        else
32046          return significance0 ? (!sign0 ? 0 : -1) : -1;
32047      } else
32048        return significance0 ? (!sign0 ? 1 : -1) : 0;
32049    }
32050    // Table D-3
32051    var SignContextLabels = [
32052      {contextLabel: 13, xorBit: 0},
32053      {contextLabel: 12, xorBit: 0},
32054      {contextLabel: 11, xorBit: 0},
32055      {contextLabel: 10, xorBit: 0},
32056      {contextLabel: 9, xorBit: 0},
32057      {contextLabel: 10, xorBit: 1},
32058      {contextLabel: 11, xorBit: 1},
32059      {contextLabel: 12, xorBit: 1},
32060      {contextLabel: 13, xorBit: 1}
32061    ];
32062
32063    function BitModel(width, height, subband, zeroBitPlanes) {
32064      this.width = width;
32065      this.height = height;
32066
32067      this.contextLabelTable = subband == 'HH' ? HHContextLabel :
32068        subband == 'HL' ? HLContextLabel : LLAndLHContextsLabel;
32069
32070      var coefficientCount = width * height;
32071
32072      // coefficients outside the encoding region treated as insignificant
32073      // add border state cells for significanceState
32074      this.neighborsSignificance = new Uint8Array(coefficientCount);
32075      this.coefficentsSign = new Uint8Array(coefficientCount);
32076      this.coefficentsMagnitude = new Uint32Array(coefficientCount);
32077      this.processingFlags = new Uint8Array(coefficientCount);
32078
32079      var bitsDecoded = new Uint8Array(this.width * this.height);
32080      for (var i = 0, ii = bitsDecoded.length; i < ii; i++)
32081        bitsDecoded[i] = zeroBitPlanes;
32082      this.bitsDecoded = bitsDecoded;
32083
32084      this.reset();
32085    }
32086
32087    BitModel.prototype = {
32088      setDecoder: function BitModel_setDecoder(decoder) {
32089        this.decoder = decoder;
32090      },
32091      reset: function BitModel_reset() {
32092        this.uniformContext = {index: 46, mps: 0};
32093        this.runLengthContext = {index: 3, mps: 0};
32094        this.contexts = [];
32095        this.contexts.push({index: 4, mps: 0});
32096        for (var i = 1; i <= 16; i++)
32097          this.contexts.push({index: 0, mps: 0});
32098      },
32099      setNeighborsSignificance:
32100        function BitModel_setNeighborsSignificance(row, column) {
32101        var neighborsSignificance = this.neighborsSignificance;
32102        var width = this.width, height = this.height;
32103        var index = row * width + column;
32104        if (row > 0) {
32105          if (column > 0)
32106            neighborsSignificance[index - width - 1] += 0x10;
32107          if (column + 1 < width)
32108            neighborsSignificance[index - width + 1] += 0x10;
32109          neighborsSignificance[index - width] += 0x04;
32110        }
32111        if (row + 1 < height) {
32112          if (column > 0)
32113            neighborsSignificance[index + width - 1] += 0x10;
32114          if (column + 1 < width)
32115            neighborsSignificance[index + width + 1] += 0x10;
32116          neighborsSignificance[index + width] += 0x04;
32117        }
32118        if (column > 0)
32119          neighborsSignificance[index - 1] += 0x01;
32120        if (column + 1 < width)
32121          neighborsSignificance[index + 1] += 0x01;
32122        neighborsSignificance[index] |= 0x80;
32123      },
32124      runSignificancePropogationPass:
32125        function BitModel_runSignificancePropogationPass() {
32126        var decoder = this.decoder;
32127        var width = this.width, height = this.height;
32128        var coefficentsMagnitude = this.coefficentsMagnitude;
32129        var coefficentsSign = this.coefficentsSign;
32130        var contextLabels = this.contextLabels;
32131        var neighborsSignificance = this.neighborsSignificance;
32132        var processingFlags = this.processingFlags;
32133        var contexts = this.contexts;
32134        var labels = this.contextLabelTable;
32135        var bitsDecoded = this.bitsDecoded;
32136        // clear processed flag
32137        var processedInverseMask = ~1;
32138        var processedMask = 1;
32139        var firstMagnitudeBitMask = 2;
32140        for (var q = 0, qq = width * height; q < qq; q++)
32141          processingFlags[q] &= processedInverseMask;
32142
32143        for (var i0 = 0; i0 < height; i0 += 4) {
32144          for (var j = 0; j < width; j++) {
32145            var index = i0 * width + j;
32146            for (var i1 = 0; i1 < 4; i1++, index += width) {
32147              var i = i0 + i1;
32148              if (i >= height)
32149                break;
32150
32151              if (coefficentsMagnitude[index] || !neighborsSignificance[index])
32152                continue;
32153
32154              var contextLabel = labels[neighborsSignificance[index]];
32155              var cx = contexts[contextLabel];
32156              var decision = decoder.readBit(cx);
32157              if (decision) {
32158                var sign = this.decodeSignBit(i, j);
32159                coefficentsSign[index] = sign;
32160                coefficentsMagnitude[index] = 1;
32161                this.setNeighborsSignificance(i, j);
32162                processingFlags[index] |= firstMagnitudeBitMask;
32163              }
32164              bitsDecoded[index]++;
32165              processingFlags[index] |= processedMask;
32166            }
32167          }
32168        }
32169      },
32170      decodeSignBit: function BitModel_decodeSignBit(row, column) {
32171        var width = this.width, height = this.height;
32172        var index = row * width + column;
32173        var coefficentsMagnitude = this.coefficentsMagnitude;
32174        var coefficentsSign = this.coefficentsSign;
32175        var horizontalContribution = calcSignContribution(
32176          column > 0 && coefficentsMagnitude[index - 1],
32177          coefficentsSign[index - 1],
32178          column + 1 < width && coefficentsMagnitude[index + 1],
32179          coefficentsSign[index + 1]);
32180        var verticalContribution = calcSignContribution(
32181          row > 0 && coefficentsMagnitude[index - width],
32182          coefficentsSign[index - width],
32183          row + 1 < height && coefficentsMagnitude[index + width],
32184          coefficentsSign[index + width]);
32185
32186        var contextLabelAndXor = SignContextLabels[
32187          3 * (1 - horizontalContribution) + (1 - verticalContribution)];
32188        var contextLabel = contextLabelAndXor.contextLabel;
32189        var cx = this.contexts[contextLabel];
32190        var decoded = this.decoder.readBit(cx);
32191        return decoded ^ contextLabelAndXor.xorBit;
32192      },
32193      runMagnitudeRefinementPass:
32194        function BitModel_runMagnitudeRefinementPass() {
32195        var decoder = this.decoder;
32196        var width = this.width, height = this.height;
32197        var coefficentsMagnitude = this.coefficentsMagnitude;
32198        var neighborsSignificance = this.neighborsSignificance;
32199        var contexts = this.contexts;
32200        var bitsDecoded = this.bitsDecoded;
32201        var processingFlags = this.processingFlags;
32202        var processedMask = 1;
32203        var firstMagnitudeBitMask = 2;
32204        for (var i0 = 0; i0 < height; i0 += 4) {
32205          for (var j = 0; j < width; j++) {
32206            for (var i1 = 0; i1 < 4; i1++) {
32207              var i = i0 + i1;
32208              if (i >= height)
32209                break;
32210              var index = i * width + j;
32211
32212              // significant but not those that have just become
32213              if (!coefficentsMagnitude[index] ||
32214                (processingFlags[index] & processedMask) != 0)
32215                continue;
32216
32217              var contextLabel = 16;
32218              if ((processingFlags[index] &
32219                firstMagnitudeBitMask) != 0) {
32220                processingFlags[i * width + j] ^= firstMagnitudeBitMask;
32221                // first refinement
32222                var significance = neighborsSignificance[index];
32223                var sumOfSignificance = (significance & 3) +
32224                  ((significance >> 2) & 3) + ((significance >> 4) & 7);
32225                contextLabel = sumOfSignificance >= 1 ? 15 : 14;
32226              }
32227
32228              var cx = contexts[contextLabel];
32229              var bit = decoder.readBit(cx);
32230              coefficentsMagnitude[index] =
32231                (coefficentsMagnitude[index] << 1) | bit;
32232              bitsDecoded[index]++;
32233              processingFlags[index] |= processedMask;
32234            }
32235          }
32236        }
32237      },
32238      runCleanupPass: function BitModel_runCleanupPass() {
32239        var decoder = this.decoder;
32240        var width = this.width, height = this.height;
32241        var neighborsSignificance = this.neighborsSignificance;
32242        var significanceState = this.significanceState;
32243        var coefficentsMagnitude = this.coefficentsMagnitude;
32244        var coefficentsSign = this.coefficentsSign;
32245        var contexts = this.contexts;
32246        var labels = this.contextLabelTable;
32247        var bitsDecoded = this.bitsDecoded;
32248        var processingFlags = this.processingFlags;
32249        var processedMask = 1;
32250        var firstMagnitudeBitMask = 2;
32251        var oneRowDown = width;
32252        var twoRowsDown = width * 2;
32253        var threeRowsDown = width * 3;
32254        for (var i0 = 0; i0 < height; i0 += 4) {
32255          for (var j = 0; j < width; j++) {
32256            var index0 = i0 * width + j;
32257            // using the property: labels[neighborsSignificance[index]] == 0
32258            // when neighborsSignificance[index] == 0
32259            var allEmpty = i0 + 3 < height &&
32260              processingFlags[index0] == 0 &&
32261              processingFlags[index0 + oneRowDown] == 0 &&
32262              processingFlags[index0 + twoRowsDown] == 0 &&
32263              processingFlags[index0 + threeRowsDown] == 0 &&
32264              neighborsSignificance[index0] == 0 &&
32265              neighborsSignificance[index0 + oneRowDown] == 0 &&
32266              neighborsSignificance[index0 + twoRowsDown] == 0 &&
32267              neighborsSignificance[index0 + threeRowsDown] == 0;
32268            var i1 = 0, index = index0;
32269            var cx, i;
32270            if (allEmpty) {
32271              cx = this.runLengthContext;
32272              var hasSignificantCoefficent = decoder.readBit(cx);
32273              if (!hasSignificantCoefficent) {
32274                bitsDecoded[index0]++;
32275                bitsDecoded[index0 + oneRowDown]++;
32276                bitsDecoded[index0 + twoRowsDown]++;
32277                bitsDecoded[index0 + threeRowsDown]++;
32278                continue; // next column
32279              }
32280              cx = this.uniformContext;
32281              i1 = (decoder.readBit(cx) << 1) | decoder.readBit(cx);
32282              i = i0 + i1;
32283              index += i1 * width;
32284
32285              var sign = this.decodeSignBit(i, j);
32286              coefficentsSign[index] = sign;
32287              coefficentsMagnitude[index] = 1;
32288              this.setNeighborsSignificance(i, j);
32289              processingFlags[index] |= firstMagnitudeBitMask;
32290
32291              index = index0;
32292              for (var i2 = i0; i2 <= i; i2++, index += width)
32293                bitsDecoded[index]++;
32294
32295              i1++;
32296            }
32297            for (; i1 < 4; i1++, index += width) {
32298              i = i0 + i1;
32299              if (i >= height)
32300                break;
32301
32302              if (coefficentsMagnitude[index] ||
32303                (processingFlags[index] & processedMask) != 0)
32304                continue;
32305
32306              var contextLabel = labels[neighborsSignificance[index]];
32307              cx = contexts[contextLabel];
32308              var decision = decoder.readBit(cx);
32309              if (decision == 1) {
32310                var sign = this.decodeSignBit(i, j);
32311                coefficentsSign[index] = sign;
32312                coefficentsMagnitude[index] = 1;
32313                this.setNeighborsSignificance(i, j);
32314                processingFlags[index] |= firstMagnitudeBitMask;
32315              }
32316              bitsDecoded[index]++;
32317            }
32318          }
32319        }
32320      }
32321    };
32322
32323    return BitModel;
32324  })();
32325
32326  // Section F, Discrete wavelet transofrmation
32327  var Transform = (function TransformClosure() {
32328    function Transform() {
32329    }
32330    Transform.prototype.calculate =
32331      function transformCalculate(subbands, u0, v0) {
32332      var ll = subbands[0];
32333      for (var i = 1, ii = subbands.length, j = 1; i < ii; i += 3, j++) {
32334        ll = this.iterate(ll, subbands[i], subbands[i + 1],
32335                          subbands[i + 2], u0, v0);
32336      }
32337      return ll;
32338    };
32339    Transform.prototype.iterate = function Transform_iterate(ll, hl, lh, hh,
32340                                                            u0, v0) {
32341      var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;
32342      var hlWidth = hl.width, hlHeight = hl.height, hlItems = hl.items;
32343      var lhWidth = lh.width, lhHeight = lh.height, lhItems = lh.items;
32344      var hhWidth = hh.width, hhHeight = hh.height, hhItems = hh.items;
32345
32346      // Section F.3.3 interleave
32347      var width = llWidth + hlWidth;
32348      var height = llHeight + lhHeight;
32349      var items = new Float32Array(width * height);
32350      for (var i = 0, ii = llHeight; i < ii; i++) {
32351        var k = i * llWidth, l = i * 2 * width;
32352        for (var j = 0, jj = llWidth; j < jj; j++, k++, l += 2)
32353          items[l] = llItems[k];
32354      }
32355      for (var i = 0, ii = hlHeight; i < ii; i++) {
32356        var k = i * hlWidth, l = i * 2 * width + 1;
32357        for (var j = 0, jj = hlWidth; j < jj; j++, k++, l += 2)
32358          items[l] = hlItems[k];
32359      }
32360      for (var i = 0, ii = lhHeight; i < ii; i++) {
32361        var k = i * lhWidth, l = (i * 2 + 1) * width;
32362        for (var j = 0, jj = lhWidth; j < jj; j++, k++, l += 2)
32363          items[l] = lhItems[k];
32364      }
32365      for (var i = 0, ii = hhHeight; i < ii; i++) {
32366        var k = i * hhWidth, l = (i * 2 + 1) * width + 1;
32367        for (var j = 0, jj = hhWidth; j < jj; j++, k++, l += 2)
32368          items[l] = hhItems[k];
32369      }
32370
32371      var bufferPadding = 4;
32372      var bufferLength = new Float32Array(Math.max(width, height) +
32373        2 * bufferPadding);
32374      var buffer = new Float32Array(bufferLength);
32375      var bufferOut = new Float32Array(bufferLength);
32376
32377      // Section F.3.4 HOR_SR
32378      for (var v = 0; v < height; v++) {
32379        if (width == 1) {
32380          // if width = 1, when u0 even keep items as is, when odd divide by 2
32381          if ((u0 % 1) != 0) {
32382            items[v * width] /= 2;
32383          }
32384          continue;
32385        }
32386
32387        var k = v * width;
32388        var l = bufferPadding;
32389        for (var u = 0; u < width; u++, k++, l++)
32390          buffer[l] = items[k];
32391
32392        // Section F.3.7 extending... using max extension of 4
32393        var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
32394        var i2 = bufferPadding + width - 2, j2 = bufferPadding + width;
32395        buffer[i1--] = buffer[j1++];
32396        buffer[j2++] = buffer[i2--];
32397        buffer[i1--] = buffer[j1++];
32398        buffer[j2++] = buffer[i2--];
32399        buffer[i1--] = buffer[j1++];
32400        buffer[j2++] = buffer[i2--];
32401        buffer[i1--] = buffer[j1++];
32402        buffer[j2++] = buffer[i2--];
32403
32404        this.filter(buffer, bufferPadding, width, u0, bufferOut);
32405
32406        k = v * width;
32407        l = bufferPadding;
32408        for (var u = 0; u < width; u++, k++, l++)
32409          items[k] = bufferOut[l];
32410      }
32411
32412      // Section F.3.5 VER_SR
32413      for (var u = 0; u < width; u++) {
32414        if (height == 1) {
32415          // if height = 1, when v0 even keep items as is, when odd divide by 2
32416          if ((v0 % 1) != 0) {
32417            items[u] /= 2;
32418          }
32419          continue;
32420        }
32421
32422        var k = u;
32423        var l = bufferPadding;
32424        for (var v = 0; v < height; v++, k += width, l++)
32425          buffer[l] = items[k];
32426
32427        // Section F.3.7 extending... using max extension of 4
32428        var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
32429        var i2 = bufferPadding + height - 2, j2 = bufferPadding + height;
32430        buffer[i1--] = buffer[j1++];
32431        buffer[j2++] = buffer[i2--];
32432        buffer[i1--] = buffer[j1++];
32433        buffer[j2++] = buffer[i2--];
32434        buffer[i1--] = buffer[j1++];
32435        buffer[j2++] = buffer[i2--];
32436        buffer[i1--] = buffer[j1++];
32437        buffer[j2++] = buffer[i2--];
32438
32439        this.filter(buffer, bufferPadding, height, v0, bufferOut);
32440
32441        k = u;
32442        l = bufferPadding;
32443        for (var v = 0; v < height; v++, k += width, l++)
32444          items[k] = bufferOut[l];
32445      }
32446      return {
32447        width: width,
32448        height: height,
32449        items: items
32450      };
32451    };
32452    return Transform;
32453  })();
32454
32455  // Section 3.8.2 Irreversible 9-7 filter
32456  var IrreversibleTransform = (function IrreversibleTransformClosure() {
32457    function IrreversibleTransform() {
32458      Transform.call(this);
32459    }
32460
32461    IrreversibleTransform.prototype = Object.create(Transform.prototype);
32462    IrreversibleTransform.prototype.filter =
32463      function irreversibleTransformFilter(y, offset, length, i0, x) {
32464      var i0_ = Math.floor(i0 / 2);
32465      var i1_ = Math.floor((i0 + length) / 2);
32466      var offset_ = offset - (i0 % 1);
32467
32468      var alpha = -1.586134342059924;
32469      var beta = -0.052980118572961;
32470      var gamma = 0.882911075530934;
32471      var delta = 0.443506852043971;
32472      var K = 1.230174104914001;
32473      var K_ = 1 / K;
32474
32475      // step 1
32476      var j = offset_ - 2;
32477      for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
32478        x[j] = K * y[j];
32479
32480      // step 2
32481      var j = offset_ - 3;
32482      for (var n = i0_ - 2, nn = i1_ + 2; n < nn; n++, j += 2)
32483        x[j] = K_ * y[j];
32484
32485      // step 3
32486      var j = offset_ - 2;
32487      for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
32488        x[j] -= delta * (x[j - 1] + x[j + 1]);
32489
32490      // step 4
32491      var j = offset_ - 1;
32492      for (var n = i0_ - 1, nn = i1_ + 1; n < nn; n++, j += 2)
32493        x[j] -= gamma * (x[j - 1] + x[j + 1]);
32494
32495      // step 5
32496      var j = offset_;
32497      for (var n = i0_, nn = i1_ + 1; n < nn; n++, j += 2)
32498        x[j] -= beta * (x[j - 1] + x[j + 1]);
32499
32500      // step 6
32501      var j = offset_ + 1;
32502      for (var n = i0_, nn = i1_; n < nn; n++, j += 2)
32503        x[j] -= alpha * (x[j - 1] + x[j + 1]);
32504    };
32505
32506    return IrreversibleTransform;
32507  })();
32508
32509  // Section 3.8.1 Reversible 5-3 filter
32510  var ReversibleTransform = (function ReversibleTransformClosure() {
32511    function ReversibleTransform() {
32512      Transform.call(this);
32513    }
32514
32515    ReversibleTransform.prototype = Object.create(Transform.prototype);
32516    ReversibleTransform.prototype.filter =
32517      function reversibleTransformFilter(y, offset, length, i0, x) {
32518      var i0_ = Math.floor(i0 / 2);
32519      var i1_ = Math.floor((i0 + length) / 2);
32520      var offset_ = offset - (i0 % 1);
32521
32522      for (var n = i0_, nn = i1_ + 1, j = offset_; n < nn; n++, j += 2)
32523        x[j] = y[j] - Math.floor((y[j - 1] + y[j + 1] + 2) / 4);
32524
32525      for (var n = i0_, nn = i1_, j = offset_ + 1; n < nn; n++, j += 2)
32526        x[j] = y[j] + Math.floor((x[j - 1] + x[j + 1]) / 2);
32527    };
32528
32529    return ReversibleTransform;
32530  })();
32531
32532  return JpxImage;
32533})();
32534
32535
32536/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
32537/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
32538
32539'use strict';
32540
32541var bidi = PDFJS.bidi = (function bidiClosure() {
32542  // Character types for symbols from 0000 to 00FF.
32543  var baseTypes = [
32544    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',
32545    'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
32546    'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',
32547    'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',
32548    'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',
32549    'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32550    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',
32551    'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32552    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32553    'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',
32554    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
32555    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
32556    'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',
32557    'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',
32558    'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32559    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32560    'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32561    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32562    'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
32563  ];
32564
32565  // Character types for symbols from 0600 to 06FF
32566  var arabicTypes = [
32567    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32568    'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',
32569    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32570    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32571    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32572    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32573    'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
32574    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',
32575    'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',
32576    'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',
32577    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32578    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32579    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32580    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32581    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32582    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32583    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32584    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32585    'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
32586    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',
32587    'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32588    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'
32589  ];
32590
32591  function isOdd(i) {
32592    return (i & 1) != 0;
32593  }
32594
32595  function isEven(i) {
32596    return (i & 1) == 0;
32597  }
32598
32599  function findUnequal(arr, start, value) {
32600    var j;
32601    for (var j = start, jj = arr.length; j < jj; ++j) {
32602      if (arr[j] != value)
32603        return j;
32604    }
32605    return j;
32606  }
32607
32608  function setValues(arr, start, end, value) {
32609    for (var j = start; j < end; ++j) {
32610      arr[j] = value;
32611    }
32612  }
32613
32614  function reverseValues(arr, start, end) {
32615    for (var i = start, j = end - 1; i < j; ++i, --j) {
32616      var temp = arr[i];
32617      arr[i] = arr[j];
32618      arr[j] = temp;
32619    }
32620  }
32621
32622  function mirrorGlyphs(c) {
32623    /*
32624     # BidiMirroring-1.txt
32625     0028; 0029 # LEFT PARENTHESIS
32626     0029; 0028 # RIGHT PARENTHESIS
32627     003C; 003E # LESS-THAN SIGN
32628     003E; 003C # GREATER-THAN SIGN
32629     005B; 005D # LEFT SQUARE BRACKET
32630     005D; 005B # RIGHT SQUARE BRACKET
32631     007B; 007D # LEFT CURLY BRACKET
32632     007D; 007B # RIGHT CURLY BRACKET
32633     00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
32634     00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
32635     */
32636    switch (c) {
32637      case '(':
32638        return ')';
32639      case ')':
32640        return '(';
32641      case '<':
32642        return '>';
32643      case '>':
32644        return '<';
32645      case ']':
32646        return '[';
32647      case '[':
32648        return ']';
32649      case '}':
32650        return '{';
32651      case '{':
32652        return '}';
32653      case '\u00AB':
32654        return '\u00BB';
32655      case '\u00BB':
32656        return '\u00AB';
32657      default:
32658        return c;
32659    }
32660  }
32661
32662  function bidi(text, startLevel) {
32663    var str = text.str;
32664    var strLength = str.length;
32665    if (strLength == 0)
32666      return str;
32667
32668    // get types, fill arrays
32669
32670    var chars = [];
32671    var types = [];
32672    var oldtypes = [];
32673    var numBidi = 0;
32674
32675    for (var i = 0; i < strLength; ++i) {
32676      chars[i] = str.charAt(i);
32677
32678      var charCode = str.charCodeAt(i);
32679      var charType = 'L';
32680      if (charCode <= 0x00ff)
32681        charType = baseTypes[charCode];
32682      else if (0x0590 <= charCode && charCode <= 0x05f4)
32683        charType = 'R';
32684      else if (0x0600 <= charCode && charCode <= 0x06ff)
32685        charType = arabicTypes[charCode & 0xff];
32686      else if (0x0700 <= charCode && charCode <= 0x08AC)
32687        charType = 'AL';
32688
32689      if (charType == 'R' || charType == 'AL' || charType == 'AN')
32690        numBidi++;
32691
32692      oldtypes[i] = types[i] = charType;
32693    }
32694
32695    // detect the bidi method
32696    //  if there are no rtl characters then no bidi needed
32697    //  if less than 30% chars are rtl then string is primarily ltr
32698    //  if more than 30% chars are rtl then string is primarily rtl
32699    if (numBidi == 0) {
32700      text.direction = 'ltr';
32701      return str;
32702    }
32703
32704    if (startLevel == -1) {
32705      if ((strLength / numBidi) < 0.3) {
32706        text.direction = 'ltr';
32707        startLevel = 0;
32708      } else {
32709        text.direction = 'rtl';
32710        startLevel = 1;
32711      }
32712    }
32713
32714    var levels = [];
32715
32716    for (var i = 0; i < strLength; ++i) {
32717      levels[i] = startLevel;
32718    }
32719
32720    /*
32721     X1-X10: skip most of this, since we are NOT doing the embeddings.
32722     */
32723
32724    var e = isOdd(startLevel) ? 'R' : 'L';
32725    var sor = e;
32726    var eor = sor;
32727
32728    /*
32729     W1. Examine each non-spacing mark (NSM) in the level run, and change the
32730     type of the NSM to the type of the previous character. If the NSM is at the
32731     start of the level run, it will get the type of sor.
32732     */
32733
32734    var lastType = sor;
32735    for (var i = 0; i < strLength; ++i) {
32736      if (types[i] == 'NSM')
32737        types[i] = lastType;
32738      else
32739        lastType = types[i];
32740    }
32741
32742    /*
32743     W2. Search backwards from each instance of a European number until the
32744     first strong type (R, L, AL, or sor) is found.  If an AL is found, change
32745     the type of the European number to Arabic number.
32746     */
32747
32748    var lastType = sor;
32749    for (var i = 0; i < strLength; ++i) {
32750      var t = types[i];
32751      if (t == 'EN')
32752        types[i] = (lastType == 'AL') ? 'AN' : 'EN';
32753      else if (t == 'R' || t == 'L' || t == 'AL')
32754        lastType = t;
32755    }
32756
32757    /*
32758     W3. Change all ALs to R.
32759     */
32760
32761    for (var i = 0; i < strLength; ++i) {
32762      var t = types[i];
32763      if (t == 'AL')
32764        types[i] = 'R';
32765    }
32766
32767    /*
32768     W4. A single European separator between two European numbers changes to a
32769     European number. A single common separator between two numbers of the same
32770     type changes to that type:
32771     */
32772
32773    for (var i = 1; i < strLength - 1; ++i) {
32774      if (types[i] == 'ES' && types[i - 1] == 'EN' && types[i + 1] == 'EN')
32775        types[i] = 'EN';
32776      if (types[i] == 'CS' && (types[i - 1] == 'EN' || types[i - 1] == 'AN') &&
32777          types[i + 1] == types[i - 1])
32778        types[i] = types[i - 1];
32779    }
32780
32781    /*
32782     W5. A sequence of European terminators adjacent to European numbers changes
32783     to all European numbers:
32784     */
32785
32786    for (var i = 0; i < strLength; ++i) {
32787      if (types[i] == 'EN') {
32788        // do before
32789        for (var j = i - 1; j >= 0; --j) {
32790          if (types[j] != 'ET')
32791            break;
32792          types[j] = 'EN';
32793        }
32794        // do after
32795        for (var j = i + 1; j < strLength; --j) {
32796          if (types[j] != 'ET')
32797            break;
32798          types[j] = 'EN';
32799        }
32800      }
32801    }
32802
32803    /*
32804     W6. Otherwise, separators and terminators change to Other Neutral:
32805     */
32806
32807    for (var i = 0; i < strLength; ++i) {
32808      var t = types[i];
32809      if (t == 'WS' || t == 'ES' || t == 'ET' || t == 'CS')
32810        types[i] = 'ON';
32811    }
32812
32813    /*
32814     W7. Search backwards from each instance of a European number until the
32815     first strong type (R, L, or sor) is found. If an L is found,  then change
32816     the type of the European number to L.
32817     */
32818
32819    var lastType = sor;
32820    for (var i = 0; i < strLength; ++i) {
32821      var t = types[i];
32822      if (t == 'EN')
32823        types[i] = (lastType == 'L') ? 'L' : 'EN';
32824      else if (t == 'R' || t == 'L')
32825        lastType = t;
32826    }
32827
32828    /*
32829     N1. A sequence of neutrals takes the direction of the surrounding strong
32830     text if the text on both sides has the same direction. European and Arabic
32831     numbers are treated as though they were R. Start-of-level-run (sor) and
32832     end-of-level-run (eor) are used at level run boundaries.
32833     */
32834
32835    for (var i = 0; i < strLength; ++i) {
32836      if (types[i] == 'ON') {
32837        var end = findUnequal(types, i + 1, 'ON');
32838        var before = sor;
32839        if (i > 0)
32840          before = types[i - 1];
32841        var after = eor;
32842        if (end + 1 < strLength)
32843          after = types[end + 1];
32844        if (before != 'L')
32845          before = 'R';
32846        if (after != 'L')
32847          after = 'R';
32848        if (before == after)
32849          setValues(types, i, end, before);
32850        i = end - 1; // reset to end (-1 so next iteration is ok)
32851      }
32852    }
32853
32854    /*
32855     N2. Any remaining neutrals take the embedding direction.
32856     */
32857
32858    for (var i = 0; i < strLength; ++i) {
32859      if (types[i] == 'ON')
32860        types[i] = e;
32861    }
32862
32863    /*
32864     I1. For all characters with an even (left-to-right) embedding direction,
32865     those of type R go up one level and those of type AN or EN go up two
32866     levels.
32867     I2. For all characters with an odd (right-to-left) embedding direction,
32868     those of type L, EN or AN go up one level.
32869     */
32870
32871    for (var i = 0; i < strLength; ++i) {
32872      var t = types[i];
32873      if (isEven(levels[i])) {
32874        if (t == 'R') {
32875          levels[i] += 1;
32876        } else if (t == 'AN' || t == 'EN') {
32877          levels[i] += 2;
32878        }
32879      } else { // isOdd, so
32880        if (t == 'L' || t == 'AN' || t == 'EN') {
32881          levels[i] += 1;
32882        }
32883      }
32884    }
32885
32886    /*
32887     L1. On each line, reset the embedding level of the following characters to
32888     the paragraph embedding level:
32889
32890     segment separators,
32891     paragraph separators,
32892     any sequence of whitespace characters preceding a segment separator or
32893     paragraph separator, and any sequence of white space characters at the end
32894     of the line.
32895     */
32896
32897    // don't bother as text is only single line
32898
32899    /*
32900     L2. From the highest level found in the text to the lowest odd level on
32901     each line, reverse any contiguous sequence of characters that are at that
32902     level or higher.
32903     */
32904
32905    // find highest level & lowest odd level
32906
32907    var highestLevel = -1;
32908    var lowestOddLevel = 99;
32909    for (var i = 0, ii = levels.length; i < ii; ++i) {
32910      var level = levels[i];
32911      if (highestLevel < level)
32912        highestLevel = level;
32913      if (lowestOddLevel > level && isOdd(level))
32914        lowestOddLevel = level;
32915    }
32916
32917    // now reverse between those limits
32918
32919    for (var level = highestLevel; level >= lowestOddLevel; --level) {
32920      // find segments to reverse
32921      var start = -1;
32922      for (var i = 0, ii = levels.length; i < ii; ++i) {
32923        if (levels[i] < level) {
32924          if (start >= 0) {
32925            reverseValues(chars, start, i);
32926            start = -1;
32927          }
32928        } else if (start < 0) {
32929          start = i;
32930        }
32931      }
32932      if (start >= 0) {
32933        reverseValues(chars, start, levels.length);
32934      }
32935    }
32936
32937    /*
32938     L3. Combining marks applied to a right-to-left base character will at this
32939     point precede their base character. If the rendering engine expects them to
32940     follow the base characters in the final display process, then the ordering
32941     of the marks and the base character must be reversed.
32942     */
32943
32944    // don't bother for now
32945
32946    /*
32947     L4. A character that possesses the mirrored property as specified by
32948     Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved
32949     directionality of that character is R.
32950     */
32951
32952    // don't mirror as characters are already mirrored in the pdf
32953
32954    // Finally, return string
32955
32956    var result = '';
32957    for (var i = 0, ii = chars.length; i < ii; ++i) {
32958      var ch = chars[i];
32959      if (ch != '<' && ch != '>')
32960        result += ch;
32961    }
32962    return result;
32963  }
32964
32965  return bidi;
32966})();
32967
32968
32969/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
32970/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
32971
32972'use strict';
32973
32974var Metadata = PDFJS.Metadata = (function MetadataClosure() {
32975  function fixMetadata(meta) {
32976    return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) {
32977      var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g,
32978                                function(code, d1, d2, d3) {
32979        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
32980      });
32981      var chars = '';
32982      for (var i = 0; i < bytes.length; i += 2) {
32983        var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
32984        chars += code >= 32 && code < 127 && code != 60 && code != 62 &&
32985          code != 38 && false ? String.fromCharCode(code) :
32986          '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
32987      }
32988      return '>' + chars;
32989    });
32990  }
32991
32992  function Metadata(meta) {
32993    if (typeof meta === 'string') {
32994      // Ghostscript produces invalid metadata
32995      meta = fixMetadata(meta);
32996
32997      var parser = new DOMParser();
32998      meta = parser.parseFromString(meta, 'application/xml');
32999    } else if (!(meta instanceof Document)) {
33000      error('Metadata: Invalid metadata object');
33001    }
33002
33003    this.metaDocument = meta;
33004    this.metadata = {};
33005    this.parse();
33006  }
33007
33008  Metadata.prototype = {
33009    parse: function Metadata_parse() {
33010      var doc = this.metaDocument;
33011      var rdf = doc.documentElement;
33012
33013      if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>
33014        rdf = rdf.firstChild;
33015        while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf')
33016          rdf = rdf.nextSibling;
33017      }
33018
33019      var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;
33020      if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes())
33021        return;
33022
33023      var childNodes = rdf.childNodes, desc, namespace, entries, entry;
33024
33025      for (var i = 0, length = childNodes.length; i < length; i++) {
33026        desc = childNodes[i];
33027        if (desc.nodeName.toLowerCase() !== 'rdf:description')
33028          continue;
33029
33030        entries = [];
33031        for (var ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {
33032          if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text')
33033            entries.push(desc.childNodes[ii]);
33034        }
33035
33036        for (ii = 0, iLength = entries.length; ii < iLength; ii++) {
33037          var entry = entries[ii];
33038          var name = entry.nodeName.toLowerCase();
33039          this.metadata[name] = entry.textContent.trim();
33040        }
33041      }
33042    },
33043
33044    get: function Metadata_get(name) {
33045      return this.metadata[name] || null;
33046    },
33047
33048    has: function Metadata_has(name) {
33049      return typeof this.metadata[name] !== 'undefined';
33050    }
33051  };
33052
33053  return Metadata;
33054})();
33055
33056}).call((typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window);
33057