textmode.js 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/textmode.esm.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
var F = Object.defineProperty;
|
|
2
|
-
var y = (s,
|
|
3
|
-
var Q = (s,
|
|
4
|
-
class
|
|
5
|
-
constructor(
|
|
6
|
-
const B =
|
|
2
|
+
var y = (s, A, e) => A in s ? F(s, A, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[A] = e;
|
|
3
|
+
var Q = (s, A, e) => y(s, typeof A != "symbol" ? A + "" : A, e);
|
|
4
|
+
class D extends Error {
|
|
5
|
+
constructor(e, t, r = {}) {
|
|
6
|
+
const B = D.createFormattedMessage(e, r);
|
|
7
7
|
super(B);
|
|
8
8
|
Q(this, "originalError");
|
|
9
9
|
Q(this, "context");
|
|
@@ -12,14 +12,14 @@ class l extends Error {
|
|
|
12
12
|
/**
|
|
13
13
|
* Create a formatted error message that includes context
|
|
14
14
|
*/
|
|
15
|
-
static createFormattedMessage(
|
|
16
|
-
let r =
|
|
15
|
+
static createFormattedMessage(e, t) {
|
|
16
|
+
let r = e;
|
|
17
17
|
if (t && Object.keys(t).length > 0) {
|
|
18
18
|
r += `
|
|
19
19
|
|
|
20
20
|
📋 Context:`;
|
|
21
21
|
for (const [B, E] of Object.entries(t)) {
|
|
22
|
-
const g =
|
|
22
|
+
const g = D.formatValue(E);
|
|
23
23
|
r += `
|
|
24
24
|
- ${B}: ${g}`;
|
|
25
25
|
}
|
|
@@ -32,22 +32,22 @@ class l extends Error {
|
|
|
32
32
|
/**
|
|
33
33
|
* Format values for better display in error messages
|
|
34
34
|
*/
|
|
35
|
-
static formatValue(
|
|
36
|
-
if (
|
|
37
|
-
if (
|
|
38
|
-
if (typeof
|
|
39
|
-
if (typeof
|
|
40
|
-
if (Array.isArray(
|
|
41
|
-
return
|
|
42
|
-
if (typeof
|
|
43
|
-
const t = Object.keys(
|
|
44
|
-
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((E) => `${E}: ${
|
|
35
|
+
static formatValue(e) {
|
|
36
|
+
if (e === null) return "null";
|
|
37
|
+
if (e === void 0) return "undefined";
|
|
38
|
+
if (typeof e == "string") return `"${e}"`;
|
|
39
|
+
if (typeof e == "number" || typeof e == "boolean") return String(e);
|
|
40
|
+
if (Array.isArray(e))
|
|
41
|
+
return e.length === 0 ? "[]" : e.length <= 5 ? `[${e.map((t) => D.formatValue(t)).join(", ")}]` : `[${e.slice(0, 3).map((t) => D.formatValue(t)).join(", ")}, ... +${e.length - 3} more]`;
|
|
42
|
+
if (typeof e == "object") {
|
|
43
|
+
const t = Object.keys(e);
|
|
44
|
+
return t.length === 0 ? "{}" : t.length <= 3 ? `{ ${t.map((E) => `${E}: ${D.formatValue(e[E])}`).join(", ")} }` : `{ ${t.slice(0, 2).map((B) => `${B}: ${D.formatValue(e[B])}`).join(", ")}, ... +${t.length - 2} more }`;
|
|
45
45
|
}
|
|
46
|
-
return String(
|
|
46
|
+
return String(e);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
var
|
|
50
|
-
const
|
|
49
|
+
var M = /* @__PURE__ */ ((s) => (s[s.SILENT = 0] = "SILENT", s[s.WARNING = 1] = "WARNING", s[s.ERROR = 2] = "ERROR", s[s.THROW = 3] = "THROW", s))(M || {});
|
|
50
|
+
const c = class c {
|
|
51
51
|
constructor() {
|
|
52
52
|
Q(this, "_options", {
|
|
53
53
|
globalLevel: 3
|
|
@@ -55,13 +55,13 @@ const D = class D {
|
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
static getInstance() {
|
|
58
|
-
return
|
|
58
|
+
return c._instance || (c._instance = new c()), c._instance;
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Handle an error based on the configured settings
|
|
62
62
|
* @returns true if execution should continue, false if error was handled
|
|
63
63
|
*/
|
|
64
|
-
_handle(
|
|
64
|
+
_handle(A, e, t) {
|
|
65
65
|
const r = "[textmode.js]";
|
|
66
66
|
switch (this._options.globalLevel) {
|
|
67
67
|
case 0:
|
|
@@ -71,15 +71,15 @@ const D = class D {
|
|
|
71
71
|
return console.group(
|
|
72
72
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
73
73
|
"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"
|
|
74
|
-
), console.warn(
|
|
74
|
+
), console.warn(D.createFormattedMessage(A, e)), console.groupEnd(), !1;
|
|
75
75
|
case 2:
|
|
76
76
|
return console.group(
|
|
77
77
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
78
78
|
"color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"
|
|
79
|
-
), console.error(
|
|
79
|
+
), console.error(D.createFormattedMessage(A, e)), console.groupEnd(), !1;
|
|
80
80
|
case 3:
|
|
81
81
|
default:
|
|
82
|
-
const B = new
|
|
82
|
+
const B = new D(A, t, e);
|
|
83
83
|
throw console.group(
|
|
84
84
|
`%c${r} Oops! (╯°□°)╯︵ Something went wrong in your code.`,
|
|
85
85
|
"color: #d32f2f; font-weight: bold; background: #ffcdd2; padding: 2px 6px; border-radius: 3px;"
|
|
@@ -93,133 +93,87 @@ const D = class D {
|
|
|
93
93
|
* @param context Additional context for debugging
|
|
94
94
|
* @returns true if validation passed, false if validation failed and was handled
|
|
95
95
|
*/
|
|
96
|
-
validate(
|
|
97
|
-
return
|
|
96
|
+
validate(A, e, t) {
|
|
97
|
+
return A ? !0 : (this._handle(e, t), !1);
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
100
|
* Set global error level
|
|
101
101
|
*/
|
|
102
|
-
setGlobalLevel(
|
|
103
|
-
this._options.globalLevel =
|
|
102
|
+
setGlobalLevel(A) {
|
|
103
|
+
this._options.globalLevel = A;
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
|
-
Q(
|
|
107
|
-
let I =
|
|
106
|
+
Q(c, "_instance", null);
|
|
107
|
+
let I = c;
|
|
108
108
|
const C = I.getInstance();
|
|
109
|
-
class
|
|
110
|
-
constructor(
|
|
109
|
+
class T {
|
|
110
|
+
constructor(A, e, t = e, r = {}) {
|
|
111
111
|
Q(this, "gl");
|
|
112
112
|
Q(this, "_framebuffer");
|
|
113
113
|
Q(this, "_texture");
|
|
114
114
|
Q(this, "_width");
|
|
115
115
|
Q(this, "_height");
|
|
116
116
|
Q(this, "options");
|
|
117
|
-
Q(this, "
|
|
118
|
-
|
|
119
|
-
this.gl = e, this._width = A, this._height = t, this.options = {
|
|
117
|
+
Q(this, "previousState", null);
|
|
118
|
+
this.gl = A, this._width = e, this._height = t, this.options = {
|
|
120
119
|
filter: "nearest",
|
|
121
120
|
wrap: "clamp",
|
|
122
121
|
format: "rgba",
|
|
123
122
|
type: "unsigned_byte",
|
|
124
123
|
...r
|
|
125
|
-
}, this._texture = this.createTexture(), this._framebuffer =
|
|
124
|
+
}, this._texture = this.createTexture(), this._framebuffer = A.createFramebuffer(), this.attachTexture();
|
|
126
125
|
}
|
|
127
126
|
createTexture() {
|
|
128
|
-
const e =
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
r,
|
|
137
|
-
this._width,
|
|
138
|
-
this._height,
|
|
139
|
-
0,
|
|
140
|
-
r,
|
|
141
|
-
B,
|
|
142
|
-
null
|
|
143
|
-
), this.gl.bindTexture(this.gl.TEXTURE_2D, null), e;
|
|
127
|
+
const { gl: A } = this, e = A.createTexture();
|
|
128
|
+
A.bindTexture(A.TEXTURE_2D, e);
|
|
129
|
+
const t = this.options.filter === "linear" ? A.LINEAR : A.NEAREST, r = this.options.wrap === "repeat" ? A.REPEAT : A.CLAMP_TO_EDGE;
|
|
130
|
+
return A.texParameteri(A.TEXTURE_2D, A.TEXTURE_MIN_FILTER, t), A.texParameteri(A.TEXTURE_2D, A.TEXTURE_MAG_FILTER, t), A.texParameteri(A.TEXTURE_2D, A.TEXTURE_WRAP_S, r), A.texParameteri(A.TEXTURE_2D, A.TEXTURE_WRAP_T, r), this.updateTextureSize(), e;
|
|
131
|
+
}
|
|
132
|
+
updateTextureSize() {
|
|
133
|
+
const { gl: A } = this, e = this.options.format === "rgb" ? A.RGB : A.RGBA, t = this.options.type === "float" ? A.FLOAT : A.UNSIGNED_BYTE;
|
|
134
|
+
A.texImage2D(A.TEXTURE_2D, 0, e, this._width, this._height, 0, e, t, null);
|
|
144
135
|
}
|
|
145
136
|
attachTexture() {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
this.gl.COLOR_ATTACHMENT0,
|
|
149
|
-
this.gl.TEXTURE_2D,
|
|
150
|
-
this._texture,
|
|
151
|
-
0
|
|
152
|
-
), this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);
|
|
137
|
+
const { gl: A } = this;
|
|
138
|
+
A.bindFramebuffer(A.FRAMEBUFFER, this._framebuffer), A.framebufferTexture2D(A.FRAMEBUFFER, A.COLOR_ATTACHMENT0, A.TEXTURE_2D, this._texture, 0), A.bindFramebuffer(A.FRAMEBUFFER, null);
|
|
153
139
|
}
|
|
154
140
|
/**
|
|
155
141
|
* Update the framebuffer texture with canvas content
|
|
156
142
|
*/
|
|
157
|
-
update(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
0,
|
|
161
|
-
this.gl.RGBA,
|
|
162
|
-
this.gl.RGBA,
|
|
163
|
-
this.gl.UNSIGNED_BYTE,
|
|
164
|
-
e
|
|
165
|
-
), this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
143
|
+
update(A) {
|
|
144
|
+
const { gl: e } = this;
|
|
145
|
+
e.bindTexture(e.TEXTURE_2D, this._texture), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, A), e.bindTexture(e.TEXTURE_2D, null);
|
|
166
146
|
}
|
|
167
147
|
/**
|
|
168
148
|
* Update the framebuffer texture with pixel data
|
|
169
149
|
*/
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
0,
|
|
174
|
-
this.gl.RGBA,
|
|
175
|
-
A,
|
|
176
|
-
t,
|
|
177
|
-
0,
|
|
178
|
-
this.gl.RGBA,
|
|
179
|
-
this.gl.UNSIGNED_BYTE,
|
|
180
|
-
e
|
|
181
|
-
), this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
150
|
+
updatePixels(A, e, t) {
|
|
151
|
+
const { gl: r } = this;
|
|
152
|
+
r.bindTexture(r.TEXTURE_2D, this._texture), r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, e, t, 0, r.RGBA, r.UNSIGNED_BYTE, A), r.bindTexture(r.TEXTURE_2D, null);
|
|
182
153
|
}
|
|
183
154
|
/**
|
|
184
155
|
* Resize the framebuffer
|
|
185
156
|
*/
|
|
186
|
-
resize(
|
|
187
|
-
this._width =
|
|
188
|
-
const t = this.options.format === "rgb" ? this.gl.RGB : this.gl.RGBA, r = this.options.type === "float" ? this.gl.FLOAT : this.gl.UNSIGNED_BYTE;
|
|
189
|
-
this.gl.texImage2D(
|
|
190
|
-
this.gl.TEXTURE_2D,
|
|
191
|
-
0,
|
|
192
|
-
t,
|
|
193
|
-
this._width,
|
|
194
|
-
this._height,
|
|
195
|
-
0,
|
|
196
|
-
t,
|
|
197
|
-
r,
|
|
198
|
-
null
|
|
199
|
-
);
|
|
157
|
+
resize(A, e) {
|
|
158
|
+
this._width = A, this._height = e, this.gl.bindTexture(this.gl.TEXTURE_2D, this._texture), this.updateTextureSize(), this.gl.bindTexture(this.gl.TEXTURE_2D, null);
|
|
200
159
|
}
|
|
201
160
|
/**
|
|
202
|
-
* Begin rendering to this framebuffer
|
|
161
|
+
* Begin rendering to this framebuffer
|
|
203
162
|
*/
|
|
204
163
|
begin() {
|
|
205
|
-
|
|
164
|
+
const { gl: A } = this;
|
|
165
|
+
this.previousState = {
|
|
166
|
+
framebuffer: A.getParameter(A.FRAMEBUFFER_BINDING),
|
|
167
|
+
viewport: A.getParameter(A.VIEWPORT)
|
|
168
|
+
}, A.bindFramebuffer(A.FRAMEBUFFER, this._framebuffer), A.viewport(0, 0, this._width, this._height);
|
|
206
169
|
}
|
|
207
170
|
/**
|
|
208
|
-
* End rendering to this framebuffer and restore previous state
|
|
171
|
+
* End rendering to this framebuffer and restore previous state
|
|
209
172
|
*/
|
|
210
173
|
end() {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
this.previousViewport[2],
|
|
215
|
-
this.previousViewport[3]
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Bind this framebuffer for rendering
|
|
220
|
-
*/
|
|
221
|
-
bind() {
|
|
222
|
-
this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this._framebuffer), this.gl.viewport(0, 0, this._width, this._height);
|
|
174
|
+
if (!this.previousState) return;
|
|
175
|
+
const { gl: A } = this;
|
|
176
|
+
A.bindFramebuffer(A.FRAMEBUFFER, this.previousState.framebuffer), A.viewport(...this.previousState.viewport), this.previousState = null;
|
|
223
177
|
}
|
|
224
178
|
// Getters
|
|
225
179
|
get framebuffer() {
|
|
@@ -236,20 +190,20 @@ class M {
|
|
|
236
190
|
}
|
|
237
191
|
}
|
|
238
192
|
class G {
|
|
239
|
-
constructor(
|
|
193
|
+
constructor(A, e, t, r, B) {
|
|
240
194
|
/** The WebGL rendering context */
|
|
241
195
|
Q(this, "gl");
|
|
242
196
|
/** The buffer containing the rectangle vertices */
|
|
243
197
|
Q(this, "buffer");
|
|
244
198
|
/** The number of vertices in the rectangle */
|
|
245
199
|
Q(this, "numVertices");
|
|
246
|
-
this.gl =
|
|
247
|
-
const E =
|
|
200
|
+
this.gl = A;
|
|
201
|
+
const E = A.getParameter(A.VIEWPORT), g = E[2], i = E[3];
|
|
248
202
|
if (g <= 0 || i <= 0)
|
|
249
203
|
throw new Error(`Invalid viewport dimensions: ${g}x${i}`);
|
|
250
|
-
const o =
|
|
204
|
+
const o = e / g * 2 - 1, n = 1 - t / i * 2, a = (e + r) / g * 2 - 1, h = 1 - (t + B) / i * 2;
|
|
251
205
|
(o < -1 || o > 1 || a < -1 || a > 1 || n < -1 || n > 1 || h < -1 || h > 1) && console.warn(`Rectangle coordinates outside NDC range: x1=${o}, y1=${n}, x2=${a}, y2=${h}`);
|
|
252
|
-
const
|
|
206
|
+
const u = A.getParameter(A.FRAMEBUFFER_BINDING) !== null ? new Float32Array([
|
|
253
207
|
o,
|
|
254
208
|
h,
|
|
255
209
|
0,
|
|
@@ -312,49 +266,49 @@ class G {
|
|
|
312
266
|
0
|
|
313
267
|
// top-right
|
|
314
268
|
]);
|
|
315
|
-
this.numVertices = 6, this.buffer =
|
|
269
|
+
this.numVertices = 6, this.buffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.buffer), A.bufferData(A.ARRAY_BUFFER, u, A.STATIC_DRAW);
|
|
316
270
|
}
|
|
317
271
|
/**
|
|
318
272
|
* Draw the quad using attribute locations from the current shader
|
|
319
273
|
*/
|
|
320
274
|
draw() {
|
|
321
275
|
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);
|
|
322
|
-
let
|
|
323
|
-
this.gl.enableVertexAttribArray(
|
|
276
|
+
let A = 0, e = 1;
|
|
277
|
+
this.gl.enableVertexAttribArray(A), this.gl.vertexAttribPointer(A, 2, this.gl.FLOAT, !1, 16, 0), this.gl.enableVertexAttribArray(e), this.gl.vertexAttribPointer(e, 2, this.gl.FLOAT, !1, 16, 8), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.numVertices), this.gl.disableVertexAttribArray(A), this.gl.disableVertexAttribArray(e);
|
|
324
278
|
}
|
|
325
279
|
}
|
|
326
|
-
class
|
|
327
|
-
constructor(
|
|
280
|
+
class l {
|
|
281
|
+
constructor(A, e, t) {
|
|
328
282
|
Q(this, "gl");
|
|
329
283
|
Q(this, "program");
|
|
330
284
|
Q(this, "uniformLocations", /* @__PURE__ */ new Map());
|
|
331
285
|
Q(this, "attributeLocations", /* @__PURE__ */ new Map());
|
|
332
286
|
Q(this, "textureUnitCounter", 0);
|
|
333
|
-
this.gl =
|
|
287
|
+
this.gl = A, this.program = this.createProgram(e, t), this.cacheLocations();
|
|
334
288
|
}
|
|
335
|
-
createProgram(
|
|
336
|
-
const t = this.createShader(this.gl.VERTEX_SHADER,
|
|
289
|
+
createProgram(A, e) {
|
|
290
|
+
const t = this.createShader(this.gl.VERTEX_SHADER, A), r = this.createShader(this.gl.FRAGMENT_SHADER, e), B = this.gl.createProgram();
|
|
337
291
|
if (this.gl.attachShader(B, t), this.gl.attachShader(B, r), this.gl.linkProgram(B), !this.gl.getProgramParameter(B, this.gl.LINK_STATUS)) {
|
|
338
292
|
const E = this.gl.getProgramInfoLog(B);
|
|
339
293
|
throw new Error(`Shader program link error: ${E}`);
|
|
340
294
|
}
|
|
341
295
|
return this.gl.deleteShader(t), this.gl.deleteShader(r), B;
|
|
342
296
|
}
|
|
343
|
-
createShader(
|
|
344
|
-
const t = this.gl.createShader(
|
|
345
|
-
return this.gl.shaderSource(t,
|
|
297
|
+
createShader(A, e) {
|
|
298
|
+
const t = this.gl.createShader(A);
|
|
299
|
+
return this.gl.shaderSource(t, e), this.gl.compileShader(t), t;
|
|
346
300
|
}
|
|
347
301
|
cacheLocations() {
|
|
348
|
-
const
|
|
349
|
-
for (let t = 0; t <
|
|
302
|
+
const A = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_UNIFORMS);
|
|
303
|
+
for (let t = 0; t < A; t++) {
|
|
350
304
|
const r = this.gl.getActiveUniform(this.program, t);
|
|
351
305
|
if (r) {
|
|
352
306
|
const B = this.gl.getUniformLocation(this.program, r.name);
|
|
353
307
|
B && this.uniformLocations.set(r.name, B);
|
|
354
308
|
}
|
|
355
309
|
}
|
|
356
|
-
const
|
|
357
|
-
for (let t = 0; t <
|
|
310
|
+
const e = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_ATTRIBUTES);
|
|
311
|
+
for (let t = 0; t < e; t++) {
|
|
358
312
|
const r = this.gl.getActiveAttrib(this.program, t);
|
|
359
313
|
if (r) {
|
|
360
314
|
const B = this.gl.getAttribLocation(this.program, r.name);
|
|
@@ -371,34 +325,34 @@ class c {
|
|
|
371
325
|
/**
|
|
372
326
|
* Set a single uniform value with automatic texture unit management
|
|
373
327
|
*/
|
|
374
|
-
setUniform(
|
|
375
|
-
const t = this.uniformLocations.get(
|
|
376
|
-
if (typeof
|
|
377
|
-
this.gl.uniform1f(t,
|
|
378
|
-
else if (typeof
|
|
379
|
-
this.gl.uniform1i(t,
|
|
380
|
-
else if (Array.isArray(
|
|
381
|
-
switch (
|
|
328
|
+
setUniform(A, e) {
|
|
329
|
+
const t = this.uniformLocations.get(A);
|
|
330
|
+
if (typeof e == "number")
|
|
331
|
+
this.gl.uniform1f(t, e);
|
|
332
|
+
else if (typeof e == "boolean")
|
|
333
|
+
this.gl.uniform1i(t, e ? 1 : 0);
|
|
334
|
+
else if (Array.isArray(e))
|
|
335
|
+
switch (e.length) {
|
|
382
336
|
case 2:
|
|
383
|
-
this.gl.uniform2f(t,
|
|
337
|
+
this.gl.uniform2f(t, e[0], e[1]);
|
|
384
338
|
break;
|
|
385
339
|
case 3:
|
|
386
|
-
this.gl.uniform3f(t,
|
|
340
|
+
this.gl.uniform3f(t, e[0], e[1], e[2]);
|
|
387
341
|
break;
|
|
388
342
|
case 4:
|
|
389
|
-
this.gl.uniform4f(t,
|
|
343
|
+
this.gl.uniform4f(t, e[0], e[1], e[2], e[3]);
|
|
390
344
|
break;
|
|
391
345
|
default:
|
|
392
|
-
console.warn(`Unsupported array length ${
|
|
346
|
+
console.warn(`Unsupported array length ${e.length} for uniform '${A}'`);
|
|
393
347
|
}
|
|
394
|
-
else if (
|
|
348
|
+
else if (e instanceof WebGLTexture) {
|
|
395
349
|
const r = this.getNextTextureUnit();
|
|
396
|
-
this.gl.uniform1i(t, r), this.gl.activeTexture(this.gl.TEXTURE0 + r), this.gl.bindTexture(this.gl.TEXTURE_2D,
|
|
397
|
-
} else if (
|
|
350
|
+
this.gl.uniform1i(t, r), this.gl.activeTexture(this.gl.TEXTURE0 + r), this.gl.bindTexture(this.gl.TEXTURE_2D, e);
|
|
351
|
+
} else if (e && typeof e == "object" && "texture" in e) {
|
|
398
352
|
const r = this.getNextTextureUnit();
|
|
399
|
-
this.gl.uniform1i(t, r), this.gl.activeTexture(this.gl.TEXTURE0 + r), this.gl.bindTexture(this.gl.TEXTURE_2D,
|
|
353
|
+
this.gl.uniform1i(t, r), this.gl.activeTexture(this.gl.TEXTURE0 + r), this.gl.bindTexture(this.gl.TEXTURE_2D, e.texture);
|
|
400
354
|
} else
|
|
401
|
-
console.warn(`Unsupported uniform type for '${
|
|
355
|
+
console.warn(`Unsupported uniform type for '${A}':`, typeof e);
|
|
402
356
|
}
|
|
403
357
|
getNextTextureUnit() {
|
|
404
358
|
return this.textureUnitCounter++;
|
|
@@ -410,55 +364,52 @@ class c {
|
|
|
410
364
|
this.textureUnitCounter = 0;
|
|
411
365
|
}
|
|
412
366
|
}
|
|
413
|
-
var
|
|
367
|
+
var P = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.0,1.0);}", U = "precision lowp float;uniform sampler2D u_texture;varying vec2 v_uv;void main(){gl_FragColor=texture2D(u_texture,v_uv);}";
|
|
414
368
|
class R {
|
|
415
|
-
constructor(
|
|
369
|
+
constructor(A) {
|
|
416
370
|
Q(this, "gl");
|
|
417
371
|
Q(this, "imageShader");
|
|
418
372
|
Q(this, "currentShader", null);
|
|
419
|
-
this.gl =
|
|
420
|
-
}
|
|
421
|
-
setupDefaultState() {
|
|
422
|
-
this.gl.enable(this.gl.BLEND), this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA), this.gl.disable(this.gl.DEPTH_TEST), this.gl.disable(this.gl.CULL_FACE), this.gl.disable(this.gl.STENCIL_TEST), this.gl.disable(this.gl.SCISSOR_TEST), this.gl.disable(this.gl.DITHER), this.gl.depthFunc(this.gl.ALWAYS), this.gl.depthMask(!1);
|
|
373
|
+
this.gl = A, this.imageShader = new l(this.gl, P, U), this.gl.enable(this.gl.BLEND), this.gl.blendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);
|
|
423
374
|
}
|
|
424
375
|
/**
|
|
425
376
|
* Set the current shader (p5.js-like API)
|
|
426
377
|
*/
|
|
427
|
-
shader(
|
|
428
|
-
this.currentShader =
|
|
378
|
+
shader(A) {
|
|
379
|
+
this.currentShader = A, A.use();
|
|
429
380
|
}
|
|
430
|
-
createShader(
|
|
431
|
-
return new
|
|
381
|
+
createShader(A, e) {
|
|
382
|
+
return new l(this.gl, A, e);
|
|
432
383
|
}
|
|
433
384
|
/**
|
|
434
385
|
* Set a uniform value for the current shader (p5.js-like API)
|
|
435
386
|
*/
|
|
436
|
-
setUniform(
|
|
437
|
-
this.currentShader.setUniform(
|
|
387
|
+
setUniform(A, e) {
|
|
388
|
+
this.currentShader.setUniform(A, e);
|
|
438
389
|
}
|
|
439
390
|
/**
|
|
440
391
|
* Draw a rectangle with the current shader (p5.js-like API)
|
|
441
392
|
*/
|
|
442
|
-
rect(
|
|
443
|
-
new G(this.gl,
|
|
393
|
+
rect(A, e, t, r) {
|
|
394
|
+
new G(this.gl, A, e, t, r).draw();
|
|
444
395
|
}
|
|
445
396
|
/**
|
|
446
397
|
* Create a new framebuffer
|
|
447
398
|
*/
|
|
448
|
-
createFramebuffer(
|
|
449
|
-
return new
|
|
399
|
+
createFramebuffer(A, e, t = {}) {
|
|
400
|
+
return new T(this.gl, A, e, t);
|
|
450
401
|
}
|
|
451
402
|
/**
|
|
452
403
|
* Fill the current framebuffer with a solid color (p5.js-like API)
|
|
453
404
|
*/
|
|
454
|
-
background(
|
|
455
|
-
this.clear(
|
|
405
|
+
background(A, e = A, t = A, r = 1) {
|
|
406
|
+
this.clear(A / 255, e / 255, t / 255, r);
|
|
456
407
|
}
|
|
457
408
|
/**
|
|
458
409
|
* Clear the current framebuffer
|
|
459
410
|
*/
|
|
460
|
-
clear(
|
|
461
|
-
this.gl.clearColor(
|
|
411
|
+
clear(A = 0, e = 0, t = 0, r = 0) {
|
|
412
|
+
this.gl.clearColor(A, e, t, r), this.gl.clear(this.gl.COLOR_BUFFER_BIT);
|
|
462
413
|
}
|
|
463
414
|
/**
|
|
464
415
|
* Ensure viewport matches canvas dimensions
|
|
@@ -475,8 +426,8 @@ class R {
|
|
|
475
426
|
/**
|
|
476
427
|
* Render a framebuffer at a specific position with optional scaling
|
|
477
428
|
*/
|
|
478
|
-
image(
|
|
479
|
-
this.shader(this.imageShader), this.setUniform("u_texture",
|
|
429
|
+
image(A, e, t, r, B) {
|
|
430
|
+
this.shader(this.imageShader), this.setUniform("u_texture", A.texture), this.rect(e, t, r ?? A.width, B ?? A.height);
|
|
480
431
|
}
|
|
481
432
|
}
|
|
482
433
|
class Y {
|
|
@@ -487,30 +438,30 @@ class Y {
|
|
|
487
438
|
/**
|
|
488
439
|
* Parse a font buffer and return font data
|
|
489
440
|
*/
|
|
490
|
-
parse(
|
|
491
|
-
const
|
|
441
|
+
parse(A) {
|
|
442
|
+
const e = new Uint8Array(A);
|
|
492
443
|
let t = 0;
|
|
493
|
-
if (this.bin.readASCII(
|
|
494
|
-
const B = this.bin.readUint(
|
|
444
|
+
if (this.bin.readASCII(e, t, 4) === "ttcf") {
|
|
445
|
+
const B = this.bin.readUint(e, t + 8);
|
|
495
446
|
t += 12;
|
|
496
447
|
const E = [];
|
|
497
448
|
for (let g = 0; g < B; g++) {
|
|
498
|
-
const i = this.bin.readUint(
|
|
499
|
-
t += 4, E.push(this.readFont(
|
|
449
|
+
const i = this.bin.readUint(e, t);
|
|
450
|
+
t += 4, E.push(this.readFont(e, g, i));
|
|
500
451
|
}
|
|
501
452
|
return E;
|
|
502
453
|
} else
|
|
503
|
-
return [this.readFont(
|
|
454
|
+
return [this.readFont(e, 0, 0)];
|
|
504
455
|
}
|
|
505
456
|
/**
|
|
506
457
|
* Find a table in the font data
|
|
507
458
|
*/
|
|
508
|
-
findTable(
|
|
509
|
-
const r = this.bin.readUshort(
|
|
459
|
+
findTable(A, e, t) {
|
|
460
|
+
const r = this.bin.readUshort(A, t + 4);
|
|
510
461
|
let B = t + 12;
|
|
511
462
|
for (let E = 0; E < r; E++) {
|
|
512
|
-
const g = this.bin.readASCII(
|
|
513
|
-
if (g ===
|
|
463
|
+
const g = this.bin.readASCII(A, B, 4), i = this.bin.readUint(A, B + 8), o = this.bin.readUint(A, B + 12);
|
|
464
|
+
if (g === e)
|
|
514
465
|
return [i, o];
|
|
515
466
|
B += 16;
|
|
516
467
|
}
|
|
@@ -519,18 +470,18 @@ class Y {
|
|
|
519
470
|
/**
|
|
520
471
|
* Read font data from buffer
|
|
521
472
|
*/
|
|
522
|
-
readFont(
|
|
473
|
+
readFont(A, e, t) {
|
|
523
474
|
const r = {
|
|
524
|
-
_data:
|
|
525
|
-
_index:
|
|
475
|
+
_data: A,
|
|
476
|
+
_index: e,
|
|
526
477
|
_offset: t
|
|
527
478
|
}, B = /* @__PURE__ */ new Map(), E = ["cmap", "head", "hhea", "maxp", "hmtx"];
|
|
528
479
|
for (const g of E) {
|
|
529
|
-
const i = this.findTable(
|
|
480
|
+
const i = this.findTable(A, g, t);
|
|
530
481
|
if (i) {
|
|
531
482
|
const [o, n] = i;
|
|
532
483
|
let a = B.get(o);
|
|
533
|
-
a || (a = this.parseTable(g,
|
|
484
|
+
a || (a = this.parseTable(g, A, o, n, r), B.set(o, a)), r[g] = a;
|
|
534
485
|
}
|
|
535
486
|
}
|
|
536
487
|
return r;
|
|
@@ -538,27 +489,27 @@ class Y {
|
|
|
538
489
|
/**
|
|
539
490
|
* Parse a specific table
|
|
540
491
|
*/
|
|
541
|
-
parseTable(
|
|
542
|
-
switch (
|
|
492
|
+
parseTable(A, e, t, r, B) {
|
|
493
|
+
switch (A) {
|
|
543
494
|
case "cmap":
|
|
544
|
-
return this.parseCmapTable(
|
|
495
|
+
return this.parseCmapTable(e, t, r);
|
|
545
496
|
case "head":
|
|
546
|
-
return this.parseHeadTable(
|
|
497
|
+
return this.parseHeadTable(e, t, r);
|
|
547
498
|
case "hhea":
|
|
548
|
-
return this.parseHheaTable(
|
|
499
|
+
return this.parseHheaTable(e, t, r);
|
|
549
500
|
case "hmtx":
|
|
550
|
-
return this.parseHmtxTable(
|
|
501
|
+
return this.parseHmtxTable(e, t, r, B);
|
|
551
502
|
case "maxp":
|
|
552
|
-
return this.parseMaxpTable(
|
|
503
|
+
return this.parseMaxpTable(e, t, r);
|
|
553
504
|
default:
|
|
554
|
-
throw new Error(`Unknown table: ${
|
|
505
|
+
throw new Error(`Unknown table: ${A}`);
|
|
555
506
|
}
|
|
556
507
|
}
|
|
557
508
|
/**
|
|
558
509
|
* Parse cmap table
|
|
559
510
|
*/
|
|
560
|
-
parseCmapTable(
|
|
561
|
-
const r = new Uint8Array(
|
|
511
|
+
parseCmapTable(A, e, t) {
|
|
512
|
+
const r = new Uint8Array(A.buffer, e, t);
|
|
562
513
|
let B = 0;
|
|
563
514
|
B += 2;
|
|
564
515
|
const E = this.bin.readUshort(r, B);
|
|
@@ -566,7 +517,7 @@ class Y {
|
|
|
566
517
|
const g = {
|
|
567
518
|
tables: [],
|
|
568
519
|
ids: {},
|
|
569
|
-
off:
|
|
520
|
+
off: e
|
|
570
521
|
}, i = /* @__PURE__ */ new Set();
|
|
571
522
|
for (let o = 0; o < E; o++) {
|
|
572
523
|
const n = this.bin.readUshort(r, B);
|
|
@@ -575,29 +526,29 @@ class Y {
|
|
|
575
526
|
B += 2;
|
|
576
527
|
const h = this.bin.readUint(r, B);
|
|
577
528
|
B += 4;
|
|
578
|
-
const
|
|
529
|
+
const u = `p${n}e${a}`;
|
|
579
530
|
if (!i.has(h)) {
|
|
580
531
|
const x = this.bin.readUshort(r, h), v = this.parseCmapSubtable(r, h, x);
|
|
581
532
|
g.tables.push(v), i.add(h);
|
|
582
533
|
}
|
|
583
|
-
g.ids[
|
|
534
|
+
g.ids[u] = Array.from(i).indexOf(h);
|
|
584
535
|
}
|
|
585
536
|
return g;
|
|
586
537
|
}
|
|
587
538
|
/**
|
|
588
539
|
* Parse cmap subtable based on format
|
|
589
540
|
*/
|
|
590
|
-
parseCmapSubtable(
|
|
541
|
+
parseCmapSubtable(A, e, t) {
|
|
591
542
|
const r = { format: t };
|
|
592
543
|
switch (t) {
|
|
593
544
|
case 0:
|
|
594
|
-
return this.parseCmapFormat0(
|
|
545
|
+
return this.parseCmapFormat0(A, e, r);
|
|
595
546
|
case 4:
|
|
596
|
-
return this.parseCmapFormat4(
|
|
547
|
+
return this.parseCmapFormat4(A, e, r);
|
|
597
548
|
case 6:
|
|
598
|
-
return this.parseCmapFormat6(
|
|
549
|
+
return this.parseCmapFormat6(A, e, r);
|
|
599
550
|
case 12:
|
|
600
|
-
return this.parseCmapFormat12(
|
|
551
|
+
return this.parseCmapFormat12(A, e, r);
|
|
601
552
|
default:
|
|
602
553
|
return r;
|
|
603
554
|
}
|
|
@@ -605,81 +556,81 @@ class Y {
|
|
|
605
556
|
/**
|
|
606
557
|
* Parse cmap format 0
|
|
607
558
|
*/
|
|
608
|
-
parseCmapFormat0(
|
|
609
|
-
let r =
|
|
610
|
-
const B = this.bin.readUshort(
|
|
559
|
+
parseCmapFormat0(A, e, t) {
|
|
560
|
+
let r = e + 2;
|
|
561
|
+
const B = this.bin.readUshort(A, r);
|
|
611
562
|
r += 2, r += 2, t.map = [];
|
|
612
563
|
for (let E = 0; E < B - 6; E++)
|
|
613
|
-
t.map.push(
|
|
564
|
+
t.map.push(A[r + E]);
|
|
614
565
|
return t;
|
|
615
566
|
}
|
|
616
567
|
/**
|
|
617
568
|
* Parse cmap format 4
|
|
618
569
|
*/
|
|
619
|
-
parseCmapFormat4(
|
|
620
|
-
const r =
|
|
621
|
-
let B =
|
|
622
|
-
const E = this.bin.readUshort(
|
|
570
|
+
parseCmapFormat4(A, e, t) {
|
|
571
|
+
const r = e;
|
|
572
|
+
let B = e + 2;
|
|
573
|
+
const E = this.bin.readUshort(A, B);
|
|
623
574
|
B += 2, B += 2;
|
|
624
|
-
const g = this.bin.readUshort(
|
|
575
|
+
const g = this.bin.readUshort(A, B);
|
|
625
576
|
B += 2;
|
|
626
577
|
const i = g >>> 1;
|
|
627
|
-
t.searchRange = this.bin.readUshort(
|
|
578
|
+
t.searchRange = this.bin.readUshort(A, B), B += 2, t.entrySelector = this.bin.readUshort(A, B), B += 2, t.rangeShift = this.bin.readUshort(A, B), B += 2, t.endCount = this.bin.readUshorts(A, B, i), B += i * 2, B += 2, t.startCount = this.bin.readUshorts(A, B, i), B += i * 2, t.idDelta = [];
|
|
628
579
|
for (let o = 0; o < i; o++)
|
|
629
|
-
t.idDelta.push(this.bin.readShort(
|
|
630
|
-
return t.idRangeOffset = this.bin.readUshorts(
|
|
580
|
+
t.idDelta.push(this.bin.readShort(A, B)), B += 2;
|
|
581
|
+
return t.idRangeOffset = this.bin.readUshorts(A, B, i), B += i * 2, t.glyphIdArray = this.bin.readUshorts(A, B, r + E - B >> 1), t;
|
|
631
582
|
}
|
|
632
583
|
/**
|
|
633
584
|
* Parse cmap format 6
|
|
634
585
|
*/
|
|
635
|
-
parseCmapFormat6(
|
|
636
|
-
let r =
|
|
637
|
-
r += 2, r += 2, t.firstCode = this.bin.readUshort(
|
|
638
|
-
const B = this.bin.readUshort(
|
|
586
|
+
parseCmapFormat6(A, e, t) {
|
|
587
|
+
let r = e + 2;
|
|
588
|
+
r += 2, r += 2, t.firstCode = this.bin.readUshort(A, r), r += 2;
|
|
589
|
+
const B = this.bin.readUshort(A, r);
|
|
639
590
|
r += 2, t.glyphIdArray = [];
|
|
640
591
|
for (let E = 0; E < B; E++)
|
|
641
|
-
t.glyphIdArray.push(this.bin.readUshort(
|
|
592
|
+
t.glyphIdArray.push(this.bin.readUshort(A, r)), r += 2;
|
|
642
593
|
return t;
|
|
643
594
|
}
|
|
644
595
|
/**
|
|
645
596
|
* Parse cmap format 12
|
|
646
597
|
*/
|
|
647
|
-
parseCmapFormat12(
|
|
648
|
-
let r =
|
|
598
|
+
parseCmapFormat12(A, e, t) {
|
|
599
|
+
let r = e + 4;
|
|
649
600
|
r += 4, r += 4;
|
|
650
|
-
const B = this.bin.readUint(
|
|
601
|
+
const B = this.bin.readUint(A, r) * 3;
|
|
651
602
|
r += 4, t.groups = new Uint32Array(B);
|
|
652
603
|
for (let E = 0; E < B; E += 3)
|
|
653
|
-
t.groups[E] = this.bin.readUint(
|
|
604
|
+
t.groups[E] = this.bin.readUint(A, r + (E << 2)), t.groups[E + 1] = this.bin.readUint(A, r + (E << 2) + 4), t.groups[E + 2] = this.bin.readUint(A, r + (E << 2) + 8);
|
|
654
605
|
return t;
|
|
655
606
|
}
|
|
656
607
|
/**
|
|
657
608
|
* Parse head table
|
|
658
609
|
*/
|
|
659
|
-
parseHeadTable(
|
|
660
|
-
let r =
|
|
610
|
+
parseHeadTable(A, e, t) {
|
|
611
|
+
let r = e;
|
|
661
612
|
return r += 4, {
|
|
662
|
-
fontRevision: this.bin.readFixed(
|
|
663
|
-
flags: this.bin.readUshort(
|
|
664
|
-
unitsPerEm: this.bin.readUshort(
|
|
665
|
-
created: this.bin.readUint64(
|
|
666
|
-
modified: this.bin.readUint64(
|
|
667
|
-
xMin: this.bin.readShort(
|
|
668
|
-
yMin: this.bin.readShort(
|
|
669
|
-
xMax: this.bin.readShort(
|
|
670
|
-
yMax: this.bin.readShort(
|
|
671
|
-
macStyle: this.bin.readUshort(
|
|
672
|
-
lowestRecPPEM: this.bin.readUshort(
|
|
673
|
-
fontDirectionHint: this.bin.readShort(
|
|
674
|
-
indexToLocFormat: this.bin.readShort(
|
|
675
|
-
glyphDataFormat: this.bin.readShort(
|
|
613
|
+
fontRevision: this.bin.readFixed(A, r + 0),
|
|
614
|
+
flags: this.bin.readUshort(A, r + 8),
|
|
615
|
+
unitsPerEm: this.bin.readUshort(A, r + 10),
|
|
616
|
+
created: this.bin.readUint64(A, r + 12),
|
|
617
|
+
modified: this.bin.readUint64(A, r + 20),
|
|
618
|
+
xMin: this.bin.readShort(A, r + 28),
|
|
619
|
+
yMin: this.bin.readShort(A, r + 30),
|
|
620
|
+
xMax: this.bin.readShort(A, r + 32),
|
|
621
|
+
yMax: this.bin.readShort(A, r + 34),
|
|
622
|
+
macStyle: this.bin.readUshort(A, r + 36),
|
|
623
|
+
lowestRecPPEM: this.bin.readUshort(A, r + 38),
|
|
624
|
+
fontDirectionHint: this.bin.readShort(A, r + 40),
|
|
625
|
+
indexToLocFormat: this.bin.readShort(A, r + 42),
|
|
626
|
+
glyphDataFormat: this.bin.readShort(A, r + 44)
|
|
676
627
|
};
|
|
677
628
|
}
|
|
678
629
|
/**
|
|
679
630
|
* Parse hhea table
|
|
680
631
|
*/
|
|
681
|
-
parseHheaTable(
|
|
682
|
-
let r =
|
|
632
|
+
parseHheaTable(A, e, t) {
|
|
633
|
+
let r = e;
|
|
683
634
|
r += 4;
|
|
684
635
|
const B = [
|
|
685
636
|
"ascender",
|
|
@@ -701,18 +652,18 @@ class Y {
|
|
|
701
652
|
], E = {};
|
|
702
653
|
for (let g = 0; g < B.length; g++) {
|
|
703
654
|
const i = B[g], n = i === "advanceWidthMax" || i === "numberOfHMetrics" ? this.bin.readUshort : this.bin.readShort;
|
|
704
|
-
E[i] = n(
|
|
655
|
+
E[i] = n(A, r + g * 2);
|
|
705
656
|
}
|
|
706
657
|
return E;
|
|
707
658
|
}
|
|
708
659
|
/**
|
|
709
660
|
* Parse hmtx table
|
|
710
661
|
*/
|
|
711
|
-
parseHmtxTable(
|
|
662
|
+
parseHmtxTable(A, e, t, r) {
|
|
712
663
|
const B = r.maxp.numGlyphs, E = r.hhea.numberOfHMetrics, g = [], i = [];
|
|
713
|
-
let o =
|
|
664
|
+
let o = e, n = 0, a = 0;
|
|
714
665
|
for (let h = 0; h < E; h++)
|
|
715
|
-
n = this.bin.readUshort(
|
|
666
|
+
n = this.bin.readUshort(A, o), a = this.bin.readShort(A, o + 2), g.push(n), i.push(a), o += 4;
|
|
716
667
|
for (let h = E; h < B; h++)
|
|
717
668
|
g.push(n), i.push(a);
|
|
718
669
|
return { aWidth: g, lsBearing: i };
|
|
@@ -720,29 +671,29 @@ class Y {
|
|
|
720
671
|
/**
|
|
721
672
|
* Parse maxp table
|
|
722
673
|
*/
|
|
723
|
-
parseMaxpTable(
|
|
724
|
-
let r =
|
|
674
|
+
parseMaxpTable(A, e, t) {
|
|
675
|
+
let r = e;
|
|
725
676
|
r += 4;
|
|
726
|
-
const B = this.bin.readUshort(
|
|
677
|
+
const B = this.bin.readUshort(A, r);
|
|
727
678
|
return r += 2, { numGlyphs: B };
|
|
728
679
|
}
|
|
729
680
|
/**
|
|
730
681
|
* Create optimized binary reader
|
|
731
682
|
*/
|
|
732
683
|
createBinaryReader() {
|
|
733
|
-
const
|
|
734
|
-
buff:
|
|
735
|
-
int8: new Int8Array(
|
|
736
|
-
uint8: new Uint8Array(
|
|
737
|
-
int16: new Int16Array(
|
|
738
|
-
uint16: new Uint16Array(
|
|
739
|
-
int32: new Int32Array(
|
|
740
|
-
uint32: new Uint32Array(
|
|
684
|
+
const A = new ArrayBuffer(8), e = {
|
|
685
|
+
buff: A,
|
|
686
|
+
int8: new Int8Array(A),
|
|
687
|
+
uint8: new Uint8Array(A),
|
|
688
|
+
int16: new Int16Array(A),
|
|
689
|
+
uint16: new Uint16Array(A),
|
|
690
|
+
int32: new Int32Array(A),
|
|
691
|
+
uint32: new Uint32Array(A)
|
|
741
692
|
};
|
|
742
693
|
return {
|
|
743
694
|
readFixed: (t, r) => (t[r] << 8 | t[r + 1]) + (t[r + 2] << 8 | t[r + 3]) / (256 * 256 + 4),
|
|
744
|
-
readInt: (t, r) => (
|
|
745
|
-
readShort: (t, r) => (
|
|
695
|
+
readInt: (t, r) => (e.uint8[0] = t[r + 3], e.uint8[1] = t[r + 2], e.uint8[2] = t[r + 1], e.uint8[3] = t[r], e.int32[0]),
|
|
696
|
+
readShort: (t, r) => (e.uint16[0] = t[r] << 8 | t[r + 1], e.int16[0]),
|
|
746
697
|
readUshort: (t, r) => t[r] << 8 | t[r + 1],
|
|
747
698
|
readUshorts: (t, r, B) => {
|
|
748
699
|
const E = new Array(B);
|
|
@@ -750,9 +701,9 @@ class Y {
|
|
|
750
701
|
E[g] = t[r + g * 2] << 8 | t[r + g * 2 + 1];
|
|
751
702
|
return E;
|
|
752
703
|
},
|
|
753
|
-
readUint: (t, r) => (
|
|
704
|
+
readUint: (t, r) => (e.uint8[3] = t[r], e.uint8[2] = t[r + 1], e.uint8[1] = t[r + 2], e.uint8[0] = t[r + 3], e.uint32[0]),
|
|
754
705
|
readUint64: (t, r) => {
|
|
755
|
-
const B =
|
|
706
|
+
const B = e.uint32[0] = t[r] << 24 | t[r + 1] << 16 | t[r + 2] << 8 | t[r + 3], E = e.uint32[0] = t[r + 4] << 24 | t[r + 5] << 16 | t[r + 6] << 8 | t[r + 7];
|
|
756
707
|
return B * 4294967296 + E;
|
|
757
708
|
},
|
|
758
709
|
readASCII: (t, r, B) => {
|
|
@@ -761,13 +712,13 @@ class Y {
|
|
|
761
712
|
E += String.fromCharCode(t[r + g]);
|
|
762
713
|
return E;
|
|
763
714
|
},
|
|
764
|
-
t:
|
|
715
|
+
t: e
|
|
765
716
|
};
|
|
766
717
|
}
|
|
767
718
|
}
|
|
768
719
|
const w = new Y(), m = {
|
|
769
720
|
parse: (s) => w.parse(s),
|
|
770
|
-
findTable: (s,
|
|
721
|
+
findTable: (s, A, e) => w.findTable(s, A, e)
|
|
771
722
|
}, S = `data:font/truetype;charset=utf-8;base64,AAEAAAAKAIAAAwAgT1MvMs+QEyQAAAEoAAAAYGNtYXAg7yVJAAAFjAAACSBnbHlmuHLTdAAAErQAAGi0aGVhZFvXdUwAAACsAAAANmhoZWELAQUCAAAA5AAAACRobXR4BACDgAAAAYgAAAQEbG9jYQAy54AAAA6sAAAECG1heHABIgCCAAABCAAAACBuYW1lVs/OSgAAe2gAAAOicG9zdABpADQAAH8MAAAAIAABAAAAAQAAzOWHqV8PPPUAAAQAAAAAAHxiGCcAAAAAfGIYJwAAAAAEAAQAAAAACAACAAEAAAAAAAEAAAQAAAAAAAQAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAEBAAEAAAEBAIAAIAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAZAABQAEAgACAAAAAAACAAIAAAACAAAzAMwAAAAABAAAAAAAAACAAACLAABw4wAAAAAAAAAAWUFMLgBAACAmawQAAAAAAAQAAAAAAAFRAAAAAAMABAAAAAAgAAAEAAAABAAAAAQAAAAEAAGABAABAAQAAIAEAACABAAAgAQAAIAEAAGABAABAAQAAQAEAACABAABAAQAAIAEAACABAABAAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABAAQAAIAEAAEABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAAGABAAAgAQAAIAEAAGABAAAgAQAAIAEAACABAAAgAQAAIAEAAEABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAAAgAQAAIAEAACABAABgAQAAQAEAACABAAAAAQAAgAEAACABAAAgAQAAIAEAACABAACAAQAAAAEAAIABAABgAQAAgAEAACABAAAgAQAAAAEAACABAAAAAQAAAAEAAAABAAAAAQAAAAEAAIABAADAAQAAAAEAAAABAAAgAQAAYAEAAAABAAAAAQAAIAEAAAA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AIAAAACA/YAAgAAAAIAAAP8AAoABAAAA/4AAAP+A/4AAgAAAAIAAAP8AA4AAAP8AAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAP+AAAD/gAAAAAAAAP8AAAAAgAAAAAAAAP+AAAD/gAAAAAAAAwCAAIAEAAQAABcAHQAjAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAACAAAAAgAAA/4AAAACAAAD9AAAA/4AAAACAAAD/gAAAAIAAgAAAAIAAAACAAAD/AAAAAQAAAP+AAAAEAAAA/4AAAP8AAAD/gAAAAIAAAP8AAAD/gAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAP+AAAD/gAAAAQD+gP8AAAAAgAAAAIAAAAABAYACgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAP6AAAAAAAABAQAAgAMABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/oAAAP+AAAD/gAAAAIAAAACAAAABgAAAAIAAAAAAAAEBAACAAwAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAAAgAAAAIAAAAGAAAAAgAAAAAAABQCAAYADgAQAAAMABwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAIAAAP+AAYAAgAAA/4D/AAEAAAABAAAA/wAAAP8AAAD/AAAAAQD/gACAAAD/gAGAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP+AAAAAAAABAQAAgAOAAwAACwAAAQEBAQEBAQEBAQEBAgAAgAAAAQAAAP8AAAD/gAAA/wAAAAEAAwAAAP8AAAD/gAAA/wAAAAEAAAAAgAAAAAAAAQCAAAACAAGAAAcAAAEBAQEBAQEBAQABAAAA/4AAAP8AAAAAgAGAAAD/AAAA/4AAAACAAAAAAAABAIABgAOAAgAAAwAAAQEBAQCAAwAAAP0AAgAAAP+AAAAAAAABAQAAgAIAAYAAAwAAAQEBAQEAAQAAAP8AAYAAAP8AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAwCAAIADgAQAAAsAEQAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAD/gAAAAIAAgAAAAIAAAACAAAD/gAAA/4AAAAEAAAAEAAAA/4AAAP2AAAD/gAAAAIAAAAKAAAAAAP8AAAAAgAAAAID/AP+AAAD/AAAAAYAAAAABAIAAgAOABAAADQAAAQEBAQEBAQEBAQEBAQEBgAEAAAABAAAA/QAAAAEAAAD/AAAAAIAAAACABAAAAP0AAAD/gAAAAIAAAAGAAAAAgAAAAIAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAAAIAAAACAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAA/wAAAAEAAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/wAAAAEAAAD/AAAA/wAAAACABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAA/4AAAACAAAAAAAABAIAAgAOABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAP+AAAABAAAAAQAAAP8AAAD+AAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAAEAAAD9gAAAAQAAAAGAAAAAgAAAAAEAgACAA4AEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP4AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/gAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAP+AAAABAAAAAAAAAgCAAIADgAQAABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAYAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAP+AAAAAgAAAAoAAAP6A/wAAAAEAAAEAgACAA4AEAAAPAAABAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AEAAAA/oAAAP+AAAD+gAAAAYAAAACAAAABAAAA/4AAAAAAAAMAgACAA4AEAAATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAAAIAAAP+AAAD+AAAA/4AAAACAAAD/gAAAAIAAgAAAAQAAAP8AAAABAAAABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAA/wAAAAEA/oD/AAAAAQAAAAACAIAAgAOABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD+gAAA/4AAAACAAIAAAAEAAAAEAAAA/4AAAP0AAAABAAAAAIAAAAGAAAAAAP6AAAABgAACAQABAAIAA4AAAwAHAAABAQEBAQEBAQEAAQAAAP8AAAABAAAA/wADgAAA/wAAAP+AAAD/AAAAAAIAgACAAgADgAADAAsAAAEBAQEBAQEBAQEBAQEAAQAAAP8AAAABAAAA/4AAAP8AAAAAgAOAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAABAQAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQKAAQAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAACAIABgAOAAwAAAwAHAAABAQEBAQEBAQCAAwAAAP0AAAADAAAA/QADAAAA/4AAAP+AAAD/gAAAAAEAgACAAwAEAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAIAgACAA4AEAAATABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP8AAAD/AAAAAIAAgAEAAAD/AAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAA/4AAAACAAAD+AAAA/wAAAAACAIAAgAOABAAAEQAVAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP6AAAAAgAAA/wAAAAGAAAD+AAAA/4AAAACAAgAAgAAA/4AEAAAA/4AAAP6AAAABAAAAAIAAAP2AAAD/gAAAAIAAAAKAAAD+AAAA/4AAAAAAAAIAgACAA4AEAAAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAAAIAAAACAAAD/AAAA/wAAAP8AAAAAgAAAAIAAAAAAAQAAAAQAAAD/gAAA/4AAAP2AAAABAAAA/wAAAAKAAAAAgAAA/4D/AAAAAQAAAwCAAIADgAQAAAsADwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAAAIAAAP+AAAD9gAEAAAABAAAA/wAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/wAAAP+AAAADAP8AAAABAP6A/wAAAAEAAAAAAQCAAIADgAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP8AAAD/AAAAAQAAAAEAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAACAIAAgAOABAAACwATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAEAAAAAgAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+gAAA/4AAAP+AAAADAP2AAAAAgAAAAYAAAACAAAEAgACAA4AEAAAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/wAAAAEAAAABAAAA/4AAAP4AAAD/gAAAAIAEAAAA/4AAAP+AAAAAgAAA/wAAAP+AAAD/AAAAAIAAAP+AAAD/gAAAAIAAAAKAAAAAAAABAIAAgAOABAAACQAAAQEBAQEBAQEBAQCAAwAAAP4AAAABAAAA/wAAAP8ABAAAAP+AAAD/AAAA/4AAAP6AAAAAAQCAAIADgAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAA/4AAAAGAAAD/gAAA/gAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD9gAAAAQAAAACAAAD+gAAA/4AAAACAAAACgAAAAAEAgACAA4AEAAALAAABAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP8AAAD/AAAA/wAEAAAA/gAAAAIAAAD8gAAAAQAAAP8AAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIADAAAA/wAAAAEAAAD9AAAAAQAAAP8ABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAAAAQCAAIAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAMAAAD/gAAA/4AAAP4AAAD/gAAAAQAAAAEAAAD+gAQAAAD/gAAA/YAAAP+AAAAAgAAAAQAAAP8AAAACgAAAAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAAEAAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAQAAAD/AAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAAAAAQCAAIADgAQAAAUAAAEBAQEBAQCAAQAAAAIAAAD9AAQAAAD9AAAA/4AAAAABAIAAgAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8ABAAAAP+AAAD/gAAAAIAAAACAAAD8gAAAAgAAAP+AAAAAgAAA/gAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAEAAAA/4AAAP+AAAD/gAAAAYAAAPyAAAABAAAAAIAAAACAAAD+AAAAAAAAAgCAAIADgAQAAAsADwAAAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAD/gAAA/gAAAP+AAAAAgACAAAABAAAABAAAAP+AAAD9gAAA/4AAAACAAAACgAAAAAD9gAAAAoAAAgCAAIADgAQAAAkADQAAAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP6AAAD/AAEAAAABAAAABAAAAP+AAAD+gAAA/4AAAP8AAAADAP6AAAABgAAAAAIAgACABAAEAAAPABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAD/gAAAAIAAAAQAAAD/gAAA/gAAAP8AAAAAgAAA/4AAAACAAAACgAAAAAD9gAAAAIAAAACAAAABgAACAIAAgAOABAAAEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAKAAAAAgAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AAQAAAAEAAAAEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAD/AAAAAwD/AAAAAQAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABgAAAAIAAAP+AAAD+AAAA/4AAAAEAAAABAAAA/oAAAP+AAAAAgAQAAAD/gAAA/4AAAACAAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAD/gAAAAQAAAACAAAABAAAAAAAAAQCAAIADgAQAAAcAAAEBAQEBAQEBAIADAAAA/wAAAP8AAAD/AAQAAAD/gAAA/QAAAAMAAAAAAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAP+ABAAAAP0AAAADAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIADgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAD/gAAA/wAAAP+AAAD/gAQAAAD+AAAAAgAAAP4AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAIAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAQAAAP8AAAD/gAAA/4AAAP+AAAD/AAQAAAD+AAAAAIAAAP+AAAACAAAA/IAAAACAAAAAgAAA/4AAAP+AAAAAAAABAIAAgAOABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/AAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP8AAAABAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAA/wAAAAEAAAAAgAAAAIAAAACAAAAAAAABAIAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAACAAAAAAAABAIAAgAOABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADAAAA/4AAAP+AAAD/gAAA/4AAAAIAAAD9AAAAAIAAAACAAAAAgAAAAIAAAP4ABAAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/wAAAAEAAAD+AAQAAAD/gAAA/YAAAP+AAAAAAAABAIAAgAQAA4AAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AA4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADAAQAAAcAAAEBAQEBAQEBAQACAAAA/gAAAAEAAAD/AAQAAAD8gAAAAIAAAAKAAAAAAAABAIACAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAEAAAMAAAEBAQEAgAMAAAD9AAEAAAD/gAAAAAAAAQEAAoACgAQAAAkAAAEBAQEBAQEBAQEBAAEAAAAAgAAA/4AAAP+AAAD/gAQAAAD/gAAA/wAAAACAAAAAgAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQACgAAA/4AAAP+AAAD/AAAAAQAAAP6AAAD/gAAAAIADAAAA/YAAAACAAAABgAAA/oAAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/gAAA/YABAAAAAQAAAAQAAAD/AAAA/4AAAP6AAAD/gAAAAgD+gAAAAYAAAAABAIAAgAOAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP8AAAABAAAAAQAAAP+AAAD+AAAA/4AAAACAAwAAAP+AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAAAAAAIAgACAA4AEAAAJAA0AAAEBAQEBAQEBAQEBAQEBAoABAAAA/YAAAP+AAAAAgAAAAYD/AAAAAQAAAAQAAAD8gAAAAIAAAAGAAAAAgAAA/4D+gAAAAYAAAAACAIAAgAOAAwAADQARAAABAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/gAAAAGAAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP8AAAD/gAAA/4AAAACAAAABgAAAAAD/gAAAAIAAAAABAQAAgAOAA4AACwAAAQEBAQEBAQEBAQEBAYACAAAA/oAAAAEAAAD/AAAA/wAAAACAA4AAAP+AAAD/AAAA/4AAAP8AAAACgAAAAAAAAgCAAIADgAOAAA8AEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP4AAAABgAAA/oAAAP+AAAAAgACAAAABAAAAA4AAAP+AAAD+AAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAAP8AAAABAAABAIAAgAOABAAACwAAAQEBAQEBAQEBAQEBAIABAAAAAYAAAACAAAD/AAAA/wAAAP8ABAAAAP8AAAD/gAAA/gAAAAIAAAD+AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP+AAAD/gAAA/YAAAAACAIAAgAOABAAAAwAPAAABAQEBAQEBAQEBAQEBAQEBAoABAAAA/wAAAAEAAAD/gAAA/gAAAP+AAAABAAAAAQAEAAAA/4AAAP+AAAD+AAAA/4AAAACAAAABAAAA/wAAAAABAIAAgAOAA4AAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAQAAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP8AA4AAAP8AAAAAgAAA/4AAAP8AAAD/gAAA/4AAAACAAAAAgAAA/wAAAAAAAAEBgACAAwAEAAAHAAABAQEBAQEBAQGAAQAAAACAAAD/AAAA/4AEAAAA/QAAAP+AAAAAgAAAAAAAAQCAAIAEAAMAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP8AAAAAgAMAAAD/gAAAAIAAAP+AAAD+AAAAAYAAAP+AAAAAgAAA/oAAAAIAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAABAAAAAIAAAP8AAAD/gAAA/4AAAP8AAwAAAP+AAAAAgAAA/4AAAP4AAAABgAAA/4AAAP8AAAAAAAACAIAAgAOAAwAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADAAAA/4AAAP6AAAD/gAAAAIAAAAGAAAAAAP6AAAABgAACAIAAgAOAAwAACQANAAABAQEBAQEBAQEBAQEBAQCAAoAAAACAAAD/gAAA/oAAAP8AAQAAAAEAAAADAAAA/4AAAP+AAAD/gAAA/wAAAAIA/4AAAACAAAAAAgCAAIAEAAMAAA0AEQAAAQEBAQEBAQEBAQEBAQEBAQEBAQACgAAAAIAAAP+AAAD/AAAA/oAAAP+AAAAAgACAAAABAAAAAwAAAP6AAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAA/4AAAACAAAAAAQEAAIADgAMAAAkAAAEBAQEBAQEBAQEBAAIAAAAAgAAA/wAAAP+AAAD/AAMAAAD/gAAA/wAAAAEAAAD+AAAAAAEAgACABAADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP6AAAABgAAAAIAAAP+AAAD9AAAAAgAAAP6AAAD/gAAAAIADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAP8AAAAAgAAAAQAAAP+AAAD+gAAA/4AAAP+AAAAAgAOAAAD/gAAA/4AAAP6AAAAAgAAA/4AAAP+AAAAAgAAAAYAAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAACAAAAAgAAAAQAAAP+AAAD/gAAA/oAAAP+AAwAAAP4AAAAAgAAAAYAAAP2AAAAAgAAA/4AAAACAAAAAAAABAIAAgAOAAwAADwAAAQEBAQEBAQEBAQEBAQEBAQCAAQAAAAEAAAABAAAA/4AAAP+AAAD/AAAA/4AAAP+AAwAAAP6AAAABgAAA/oAAAP+AAAD/gAAAAIAAAACAAAAAAAABAIAAgAQAAwAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAAAgAAAAIAAAACAAAABAAAA/4AAAP8AAAD/gAAA/wAAAP+AAwAAAP6AAAAAgAAA/4AAAAGAAAD+AAAA/4AAAACAAAD/gAAAAIAAAAAAAAEAgACAA4ADAAAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP8AAAD/AAAAAIAAAACAAAD/gAAA/4ADAAAA/4AAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAD/gAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAIABAAAAAQAAAAEAAAD/gAAA/gAAAAGAAAD+gAAA/4ADAAAA/wAAAAEAAAD+AAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAgACAA4ADAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQCAAwAAAP+AAAD/gAAA/4AAAAGAAAD9AAAAAIAAAACAAAAAgAAA/oADAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIADAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAA/wAAAP+AAAAAgAAAAQAAAP6AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAAAAAIAAAAEAAAAAAAABAYAAgAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPyAAAAAAAABAQAAgAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAGAAAAAgAAAAIAAAP+AAAD/gAAA/oAAAAEAAAAAgAAA/4AAAP8ABAAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAQAAAAAAAAEAgAGAA4ADAAAPAAABAQEBAQEBAQEBAQEBAQEBAQABAAAAAQAAAACAAAD/gAAA/wAAAP8AAAD/gAAAAIADAAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAYAAAAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/AAAA/wAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAABAAAAAQAAAACAAAAAgAAAAAAAAQIAAAAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD8AAAAAAAAAgCAAIADgAQAABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP8AAAABAAAA/4AAAP+AAAABgAAA/QAAAACAAAAAgAAA/wAAAACAAAAAgAGAAIAAAP+ABAAAAP+AAAD/AAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAABAAAAAAAAAP+AAAAAAQCAAIADgAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAEAAAABAAAAAQAAAP+AAAAAgAAA/wAAAAEAAAD/AAAA/wAAAP8AAAABAAAA/wAAAACAAAD/gAQAAAD+gAAAAYAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABACAAIAEAAQAABcAGwAfACMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAoAAAP4AAAABgAAAAIAAAACAAAD/gAAA/YAAAAIAAAD+gAAA/4AAAP+AAAAAgAEAAAAAgAAAAQAAgAAA/4D9AACAAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/wAAAP+AAAAAgAAAAIAAAACAAAAAgAAAAQAAAP8A/4AAAACAAQAAAP+AAAD+gAAA/4AAAAAEAIAAgAQAA4AAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAQIAAAAEAAQAAAkAAAEBAQEBAQEBAQEDgACAAAD+AAAAAIAAAACAAAAAgAQAAAD8AAAAAQAAAAEAAAABAAAAAAgAAAAABAAEAAADAAcACwAPABMAFwAbAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAA/wACAAEAAAD/AP8AAQAAAP8AAgABAAAA/wD9AAEAAAD/AAIAAQAAAP8A/wABAAAA/wACAAEAAAD/AAQAAAD/AAAAAQAAAP8AAAAAAAAA/wAAAAEAAAD/AAAAAAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQIAAAADAAQAAAMAAAEBAQECAAEAAAD/AAQAAAD8AAAAAAAAAgGAAIACgAQAAAMABwAAAQEBAQEBAQEBgAEAAAD/AAAAAQAAAP8ABAAAAP6AAAD/gAAA/oAAAAABAgAAAAQAAgAAAwAAAQEBAQIAAgAAAP4AAgAAAP4AAAAAAAAEAIAAAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+ABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAAABAAAAPwAAAAAAQCAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAoABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAD/gAOAAAD+AAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAA/wAAAAEAAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAAAEAAAA/gAAAP+AAAD/gAAA/4AAAP+ABAAAAPwAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQCAAIAEAAOAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAOAAAD/gAAAAIAAAP8AAAABAAAA/oAAAAGAAAD9AAAAAIAAAP+AAAABAAAA/wAAAAGAAAD+gAAAAAAAAQAAAAACAAQAAAkAAAEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD+AAQAAAD/AAAA/wAAAP8AAAD/AAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQKAAYAAAP8AAAD/AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAEAAAA/wAAAP+AAAD/gAAA/wAAAP8AAAABgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD8AAAAAIAAAACAAAAAgAIAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgAAAAAEAAQAAAMABwAAAQEBAQEBAQEAAAIAAAD+AAIAAgAAAP4ABAAAAP4AAAAAAAAA/gAAAAAEAAACAAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8ABAAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAABAIAAAAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQECAAEAAAD/AAEAAQAAAP8A/wABAAAA/wABAAEAAAD/AAQAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAEDAAAABAAEAAADAAABAQEBAwABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD9AAAA/wAEAAAA/wAAAP0AAAAAAQAAAAABAAQAAAMAAAEBAQEAAAEAAAD/AAQAAAD8AAAAAAAAAwCAAIADAAOAAAMABwALAAABAQEBAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AAQAAgAAA/4ADgAAA/QAAAAMAAAD9AAAAAwAAAP0AAAAAAAABAYABgAQABAAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAAEAAAD+gAAA/4AAAP+ABAAAAP8AAAD/gAAA/wAAAACAAAAAgAAAAAAAAQAAAYACgAQAAAsAAAEBAQEBAQEBAQEBAQGAAQAAAP+AAAD/gAAA/oAAAAEAAAAAgAQAAAD+gAAA/4AAAP+AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAwABAAAA/AAAAAEAAAABAAAAAQAEAAAA/AAAAAKAAAAAgAAAAIAAAAABAIAAgAMABAAACwAAAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP0AAAD/gAAAAIAAAAEAAAAAgAAAAAAAAQAAAAAEAAQAAAUAAAEBAQEBAQAAAQAAAAMAAAD8AAQAAAD9AAAA/wAAAAACAIAAgAMAAoAACwAPAAABAQEBAQEBAQEBAQEBAQEBAQABgAAAAIAAAP+AAAD+gAAAAQAAAP8A/4AAgAAA/4ACgAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAMABAAACwAPAAABAQEBAQEBAQEBAQEBAQEBAgABAAAA/4AAAP6AAAABAAAA/wAAAAEA/oAAgAAA/4AEAAAA/QAAAP+AAAAAgAAAAQAAAACAAAD/gAAA/wAAAAABAIAAgAQABAAADQAAAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAA/4AAAP6AAAD/gAAAAIAAAAEABAAAAP+AAAD9gAAA/4AAAACAAAABAAAAAIAAAAACAAAAAAQABAAAAwAHAAABAQEBAQEBAQAABAAAAPwAAQAAAAIAAAAEAAAA/AAAAAMA/gAAAAIAAAEAgACABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAD/gAAA/oAAAP+AAAAAgAAAAQAEAAAA/4AAAP+AAAD/gAAA/oAAAP+AAAAAgAAAAQAAAACAAAAAAQAAAAACgAKAAAsAAAEBAQEBAQEBAQEBAQAAAYAAAACAAAAAgAAA/wAAAP+AAAD/AAKAAAD/gAAA/4AAAP6AAAABAAAAAIAAAAAAAAEAAAAABAAEAAAFAAABAQEBAQEAAAQAAAD/AAAA/QAEAAAA/AAAAAMAAAAAAQCAAIAEAAQAABUAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAAIAAAD/AAAAAQAAAP8AAAABAAAA/wAAAP+AAAD+gAAA/4AAAACAAAABAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAAEAAAAAgAAAAAEBgAAABAACgAALAAABAQEBAQEBAQEBAQECgAGAAAD/AAAA/4AAAP8AAAAAgAAAAIACgAAA/wAAAP+AAAD/AAAAAYAAAACAAAAAAAABAAAAAAQABAAAEQAAAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAPwABAAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAABAAADAAABAQEBAAAEAAAA/AABAAAA/wAAAAAAAAEAAAAABAAEAAARAAABAQEBAQEBAQEBAQEBAQEBAQEDgACAAAD8AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAEAAAA/AAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAQAAAgAEAAQAAAMAAAEBAQEAAAQAAAD8AAQAAAD+AAAAAAAAAgCAAIACAAOAAAMABwAAAQEBAQEBAQEAgACAAAD/gAEAAIAAAP+AA4AAAP0AAAADAAAA/QAAAAAEAIAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAABAAAAPyAAAADAP+AAAAAgP8A/4AAAACA/wD/gAAAAIAAAQAAAAAEAAQAAAUAAAEBAQEBAQMAAQAAAPwAAAADAAQAAAD8AAAAAQAAAAACAIAAgAQABAAAAwAHAAABAQEBAQEBAQCAA4AAAPyAAYAAAACAAAAEAAAA/IAAAAIA/4AAAACAAAMAgACABAAEAAADAAcACwAAAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgP4A/4AAAACAAAAABAAAAIAEAAQAAAMABwALAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD8AAAABAAAAPwAAAAEAAAA/AAAAAQAAAD8AAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAAYAgACABAAEAAADAAcACwAPABMAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/oAAAACAAAD+gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAID/AP+AAAAAgAAA/4AAAACAAAEAgACAAQADgAADAAABAQEBAIAAgAAA/4ADgAAA/QAAAAAAAAUAgACABAAEAAADAAcACwAPABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAIADgAAA/IAAgAAAAIAAAAGAAAAAgAAA/YAAAACAAAABgAAAAIAAAAQAAAD8gAAAAwD/gAAAAIAAAP+AAAAAgP4A/4AAAACAAAD/gAAAAIAAAAABAAADAAQABAAAAwAAAQEBAQAABAAAAPwABAAAAP8AAAAAAAAHAIAAgAQABAAAAwAHAAsADwATABcAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQCAA4AAAPyAAIAAAACAAAABgAAAAIAAAP2AAAAAgAAAAYAAAACAAAD9gAAAAIAAAAGAAAAAgAAABAAAAPyAAAADAP+AAAAAgAAA/4AAAACA/wD/gAAAAIAAAP+AAAAAgP8A/4AAAACAAAD/gAAAAIAAAAAEAAAAAAQAAgAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAgABAAAA/wD/AAEAAAD/AAIAAQAAAP8AAgAAAP8AAAABAAAA/wAAAAAAAAD/AAAAAQAAAP8AAAAAAQAAAAAEAAQAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAQAAAD/gAAA/4AAAP+AAAD9gAAAAAEBAAAAAgAEAAADAAABAQEBAQABAAAA/wAEAAAA/AAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQECgAGAAAD8AAAAAIAAAACAAAAAgAAAAQAEAAAA/AAAAAGAAAABAAAAAIAAAACAAAAAAAABAAABAAQAAgAAAwAAAQEBAQAABAAAAPwAAgAAAP8AAAAAAAABAAAAAAQABAAACwAAAQEBAQEBAQEBAQEBAgACAAAA/AAAAACAAAAAgAAAAIAAAACABAAAAPwAAAACAAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEDAAEAAAD8AAAAAQAAAAEAAAABAAIAAAD+AAAAAIAAAACAAAAAgAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAIAAAAAgAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/4AAAP4AAAAAAAADAAAAAAQABAAAGwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAIAAYAAAACAAAD/gAAA/4AAAP+AAAD/gP4AAIAAAACAAAAAgAAAAIAAAP6AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAQAAAP+AAAD+gAAAAIAAAACAAAAAgAAA/oAAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAAAAAQAAAAAEAAIAAAkAAAEBAQEBAQEBAQEAAAEAAAABAAAAAQAAAAEAAAD8AAIAAAD/gAAA/4AAAP+AAAD/gAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAGAAAABAAAAAIAAAACAAAAAgAAA/AAEAAAA/4AAAP+AAAD/gAAA/wAAAP6AAAAAAAAEAAAAgAQABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQCAAYAAAP6AAgABgAAA/oD9gAGAAAD+gAIAAYAAAP6ABAAAAP6AAAABgAAA/oAAAP+AAAD+gAAAAYAAAP6AAAAAAQIAAgAEAAQAAAMAAAEBAQECAAIAAAD+AAQAAAD+AAAAAAAABACAAIAEAAQAAAMABwAjACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAD/AAGAAQAAAP8A/gAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4ABgACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAAAAA/wAAAP+AAAD/gAAAAIAAAACAAAABAAAA/oAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAGAAAD/gAAAAAQAAAAABAAEAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ADgACAAAD/gPyAAIAAAP+AA4AAgAAA/4AEAAAA/4AAAACAAAD/gAAA/QAAAP+AAAAAgAAA/4AAAAABAAAAAAIAAgAAAwAAAQEBAQAAAgAAAP4AAgAAAP4AAAAAAAAEAAAAAAIABAAAAwAHAAsADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAP8AAQABAAAA/wD/AAEAAAD/AAEAAQAAAP8ABAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAQCAAQADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAYABAAAA/4AAAAGAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAOAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAACAAAAAAAABAQABAAOABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACABAAAAP+AAAD/gAAA/wAAAACAAAD+gAAAAYAAAP+AAAABAAAAAIAAAAAAAAEBAAEABAADgAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQIAAQAAAACAAAAAgAAA/4AAAP+AAAD/AAAAAIAAAP6AAAABgAAA/4ADgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAOAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAOAAAD+gAAAAIAAAP8AAAD/gAAA/4AAAACAAAAAgAAAAQAAAP+AAAAAAAABAQAAgAOABAAADwAAAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAA/4AAAP6AAAD/gAAAAIAAAACABAAAAP8AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAAAACAIAAgAOAA4AAAwAJAAABAQEBAQEBAQEBAIADAAAA/QAAgAAAAgAAAP8AAAADgAAA/QAAAAKA/gAAAAEAAAABAAAAAAIAgACABAAEAAAbACcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAD/gAAAAIAAAACAAAAAgAAA/4AAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAA/4D/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAEAAAIABAADAAADAAABAQEBAAAEAAAA/AADAAAA/wAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/gAAA/gAEAAAA/gAAAP+AAAD/gAAA/4AAAP+AAAAAAAABAAACAAIABAAAAwAAAQEBAQAAAgAAAP4ABAAAAP4AAAAAAAACAQAAgAOAA4AAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP8AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAACAAAAAgAAA/wAAAACAAIAAAACAAAADgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgP+AAAAAgAADAAAAAAQABAAACwAnADMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAGAAAD/gAAA/4AAAP+AAAD/gAAAAIACgAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgACAAIAAAP+AAAD+gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAAAYAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAA/oAAAP6AAAD/gAAAAIAAAACAAAAAgAAAAAAAAgCAAIADgAQAAA8AHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAAABAAAAAIAAAP+AAAD/AAAA/wAAAP+AAAAAgAAAAQAAAAEAAAAAgAAA/4AAAP8AAAD/AAAA/4AAAACABAAAAP+AAAAAgAAA/wAAAP+AAAAAgAAA/4AAAAEAAAD+gAAA/4AAAACAAAD/AAAA/4AAAACAAAD/gAAAAQAAAAABAAAAAAQAA4AACwAAAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD8AAAAAIAAAACAA4AAAP+AAAD/gAAA/YAAAAKAAAAAgAAAAAAAAQAAAAACAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAAAAAQIAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDgACAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQCAAIAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP+AAAD/AAAA/4AAAP8AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/oAAAAEAAAD/AAAAAYAAAACAAAAAgAAAAIAAAAAAACAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMARwBLAE8AUwBXAFsAXwBjAGcAawBvAHMAdwB7AH8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gPyAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/YAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D8gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gP2AAIAAAP+AAQAAgAAA/4ABAACAAAD/gAEAAIAAAP+A/IAAgAAA/4ABAACAAAD/gAEAAIAAAP+AAQAAgAAA/4D9gACAAAD/gAEAAIAAAP+AAQAAgAAA/4ABAACAAAD/gAQAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAACAAAD/gAAAAIAAAP+AAAAAAQAAAAAEAAQAAAsAAAEBAQEBAQEBAQEBAQAABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAQAAAD8AAAAAIAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/oAEAAAA/oAAAP8AAAD/gAAA/4AAAP+AAAAAAAABAAABgAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAAAAAKABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP2AAAACAAAAAIAAAACAAAAAAAABAYAAAAQAAoAABQAAAQEBAQEBAYACgAAA/oAAAP8AAoAAAP8AAAD+gAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAAACgAAAAIAAAACAAAAAgAAA/AAEAAAA/wAAAP8AAAD/AAAA/wAAAAACAAAAAAQABAAAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAAAAAEAAAAEAAAA/4AAAP+AAAD/gAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAEAAAAAgAAAAIAAAP8A/wAAAAEAAAEBgAGABAAEAAAFAAABAQEBAQEBgAEAAAABgAAA/YAEAAAA/oAAAP8AAAAAAQAAAAACgAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD+AAAAAoAAAACAAAAAgAAAAAAAAQGAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQGAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAAEAAAAAgAAAAQAAAACAAAAAAAABAAABgAQABAAADwAAAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAgAAAP2AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAAAAAABAAABgAQAAoAAAwAAAQEBAQAABAAAAPwAAoAAAP8AAAAAAAABAYAAAAKABAAAAwAAAQEBAQGAAQAAAP8ABAAAAPwAAAAAAAABAYAAAAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACABAAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAQAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAKAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD+AAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAYAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD9gAAAAgAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQAAAgAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEAAAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAAAAAQAAAYACgAKAAAMAAAEBAQEAAAKAAAD9gAKAAAD/AAAAAAAAAQGAAAACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD9gAAAAAAAAQAAAYAEAAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAABAAAAAIAAAAEAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAQAAAD/gAAA/4AAAACAAAAAgAAA/wAAAP+AAAD/gAAA/4AAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAAJAAABAQEBAQEBAQEBAYACgAAA/AAAAACAAAAAgAAAAIAEAAAA/AAAAAEAAAABAAAAAQAAAAABAAAAAAQABAAAEwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/AAAA/oAAAAEAAAABAAAAAIAAAACABAAAAP6AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAQAAAAAAAAEAAAAABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAQAAAAEAAAD+gAAA/wAAAP+AAAD/gAAA/4AEAAAA/wAAAP8AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAACAAAABAAAAAAAAAQAAAAAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAAEAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQAAAAACgAQAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAP+AAAD/gAAA/4AAAP8AAAAAgAAAAIAAAP+AAAD/gAQAAAD/gAAA/4AAAP+AAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAABAAAAAIAAAAAAAAEAAAAABAAEAAAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAQAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQAAAAACgAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAQAAAD9gAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAAAEAAQAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAEAAAAAgAAAAIAAAACAAAD/AAAA/4AAAP+AAAD/gAQAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAAAAAAAAQAAAAAEAAKAAA8AAAEBAQEBAQEBAQEBAQEBAQEBgAKAAAD+AAAA/4AAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/AAAA/4AAAP+AAAD/gAAAAQAAAACAAAAAgAAAAAAAAQGAAYACgAQAAAMAAAEBAQEBgAEAAAD/AAQAAAD9gAAAAAAAAQGAAYAEAAKAAAMAAAEBAQEBgAKAAAD9gAKAAAD/AAAAAAAAAQAAAAAEAAQAAB8AAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAQAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAACAAAAAgAAAAIAAAACAAAAAAAABAAAAAAQABAAAIwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAAAAIAAAAEAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAA/4AAAP+AAAABAAAAAIAAAAEAAAAAgAAAAAAAAQGAAYACgAKAAAMAAAEBAQEBgAEAAAD/AAKAAAD/AAAAAAAAAQAAAAAEAAKAABcAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAQAAAACAAAAAgAAAAIAAAP8AAAD/gAAA/wAAAP+AAAD/AAAAAIAAAACAAAAAgAKAAAD/gAAA/4AAAP+AAAD/AAAAAIAAAACAAAD/gAAA/4AAAAEAAAAAgAAAAIAAAAAAAAEAAAGAAoAEAAAFAAABAQEBAQEBgAEAAAD9gAAAAYAEAAAA/YAAAAEAAAAAAQAAAAACgAKAAAUAAAEBAQEBAQAAAoAAAP8AAAD+gAKAAAD9gAAAAYAAAAABAAAAAAQABAAAHwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAEAAAAAgAAAAQAAAACAAAABAAAA/4AAAP+AAAAAgAAAAIAAAP8AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+ABAAAAP+AAAD/gAAAAIAAAACAAAD/AAAA/4AAAP8AAAD/gAAA/wAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAEAAAAABAAEAAALAAABAQEBAQEBAQEBAQEBgAEAAAABgAAA/oAAAP8AAAD+gAAAAYAEAAAA/oAAAP8AAAD+gAAAAYAAAAEAAAAAAAABAAAAAAQAAoAABwAAAQEBAQEBAQEAAAQAAAD+gAAA/wAAAP6AAoAAAP8AAAD+gAAAAYAAAAAAAAEBgAAABAAEAAAHAAABAQEBAQEBAQGAAQAAAAGAAAD+gAAA/wAEAAAA/oAAAP8AAAD+gAAAAAAAAQAAAAACgAQAAAcAAAEBAQEBAQEBAYABAAAA/wAAAP6AAAABgAQAAAD8AAAAAYAAAAEAAAAAAAABAAABgAQABAAABwAAAQEBAQEBAQEBgAEAAAABgAAA/AAAAAGABAAAAP6AAAD/AAAAAQAAAAAAAAQBAAEAAwADAAADAAcACwAPAAABAQEBAQEBAQEBAQEBAQEBAYABAAAA/wD/gACAAAD/gAGAAIAAAP+A/wABAAAA/wADAAAA/4AAAAAAAAD/AAAAAQAAAP8AAAAAAAAA/4AAAAACAIAAgAOAA4AACwAPAAABAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAP+AAAD+AAAA/4AAAACAAIAAAAEAAAADgAAA/4AAAP4AAAD/gAAAAIAAAAIAAAD/gP8AAAABAAACAAAAAAQABAAAEwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAgAAAACAAAAAgAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAgAAA/4AAAACAAAABAAAAAIAAAP+AAAAEAAAA/4AAAP+AAAD+AAAA/4AAAP+AAAAAgAAAAIAAAAIAAAAAgAAA/4D/gAAA/wAAAP+AAAAAgAAAAQAAAACAABAAAAAABAAEAAADAAcACwAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP+AAIAAAP+AAgAAgAAA/4D9gACAAAD/gAIAAIAAAP+A/YAAgAAA/4ACAACAAAD/gP2AAIAAAP+AAgAAgAAA/4AEAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAQAAAAAAQABAAAAwAHAAsADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D8gACAAAD/gAIAAIAAAP+A/oAAgAAA/4ACAACAAAD/gP6AAIAAAP+AAgAAgAAA/4D+gACAAAD/gAIAAIAAAP+ABAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAAAA/4AAAACAAAD/gAAAAAAAAP+AAAAAgAAA/4AAAAAAAAD/gAAAAIAAAP+AAAAAAwCAAIADgAQAABcAGwAfAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAAEAAAD/AAAAAIAAAP+AAAABAAAA/wAAAP+AAAD/AAAA/4AAAACAAAABAP+AAAAAgAAA/4AAAACAAAAEAAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACAAAAAgAAAAYAAAACAAAD/gP+AAAAAgP8A/4AAAACAAAAAAQCAAIADgAOAAA8AAAEBAQEBAQEBAQEBAQEBAQEBAAIAAAAAgAAA/4AAAP+AAAD/AAAA/4AAAP+AAAAAgAOAAAD/gAAA/wAAAP+AAAD/AAAAAQAAAACAAAABAAAAAAAAAgCAAIADgAOAAAMACQAAAQEBAQEBAQEBAQCAAwAAAP0AAYAAAP8AAAACAAAAA4AAAP0AAAACgP8AAAD/AAAAAgAAAAABAIAAgAOAA4AAAwAAAQEBAQCAAwAAAP0AA4AAAP0AAAAAAAACAIAAgAOAA4AAAwALAAABAQEBAQEBAQEBAQEAgAMAAAD9AACAAAACAAAA/4AAAP8AAAADgAAA/QAAAAKA/gAAAAIAAAD/AAAAAQAAAQAAAAAEAAQAABMAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQACAAAAAIAAAACAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAQAAAD/gAAA/4AAAP4AAAD/gAAA/4AAAACAAAAAgAAAAgAAAACAAAAAAAABAQABAAMAAwAACwAAAQEBAQEBAQEBAQEBAYABAAAAAIAAAP+AAAD/AAAA/4AAAACAAwAAAP+AAAD/AAAA/4AAAACAAAABAAAAAAAAAQCAAQAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAQAAAP+AAAD/gAAAAIAAAP8AAAD/gAAA/wAAAACAAAD/gAAA/4AAAAEAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAAAgAAA/4AAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+AAAAAIAAAAGAAAAAgAAA/gAAAAGAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgAAA/4AAAACA/4D/gAAAAIAABgCAAIAEAAQAAAMABwALAA8AEwAXAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAgAOAAAD8gAEAAAAAgAAAAIAAAACAAAD+gAAAAYAAAP4AAAAAgAAAAYAAAACAAAAEAAAA/IAAAAMA/wAAAAEAAAD/AAAAAQD+gP+AAAAAgP+A/4AAAACAAAD/gAAAAIAABgCAAIAEAAQAABMAFwAbAB8AIwAnAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgAAgAAAAIAAAAEAAAD/AAAA/4AAAP+AAAD/gAAA/wAAAAEAAAAAgAAAAAAAgAAA/oAAgAAA/4ACAACAAAD/gP4AAIAAAP+AAgAAgAAA/4AEAAAA/wAAAP+AAAD/gAAA/4AAAP8AAAABAAAAAIAAAACAAAAAgAAA/4D/gAAAAIABAAAA/4AAAACAAAD/gAAA/oAAAP+AAAAAgAAA/4AAAAACAQAAgAOABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYABgAAAAIAAAP+AAAD/gAAAAIAAAP+AAAD/gAAA/4AAAACAAAD/gAAAAQAAAP8A/4AAgAAA/4AEAAAA/4AAAP8AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAAEAAAAAAAAA/wAAAAACAIAAgAQABAAAFwAbAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAYACgAAA/4AAAP+AAAD/gAAAAIAAAP+AAAD+gAAAAQAAAP8AAAABAAAAAIAAAP8A/wAAgAAA/4AEAAAA/gAAAAEAAAD/gAAA/4AAAP8AAAD/gAAAAIAAAAEAAAAAgAAAAIAAAACAAAD+gAAA/wAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIAAIAAAACAAAAAgAAAAIAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAAAgAAAAIAAAACABAAAAP+AAAD/gAAA/4AAAP8AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABAAAAAIAAAACAAAAAAAABAIAAgAQABAAAGwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQGAAYAAAP+AAAAAgAAAAQAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/4AAAP8AAAABAAAAAIAAAP+ABAAAAP8AAAD/gAAAAIAAAP6AAAAAgAAA/wAAAP+AAAAAgAAAAQAAAP+AAAABgAAA/4AAAACAAAAAAAABAIAAgAQABAAAFwAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAAAAIAAAAEAAAAAgAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAA/4AAAACABAAAAP+AAAAAgAAA/4AAAP6AAAD/gAAA/4AAAP+AAAAAgAAAAIAAAACAAAABgAAAAAAAAQCAAIAEAAQAABsAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAACAAAAAgAAAAIAAAACAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAQAAAD/gAAA/4AAAP+AAAD/gAAA/4AAAP+AAAD/gAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAQEAAIADgAQAAAsAAAEBAQEBAQEBAQEBAQIAAYAAAP8AAAD/gAAA/wAAAACAAAAAgAQAAAD/AAAA/gAAAP+AAAABAAAAAIAAAAAAAAEAgACABAAEAAATAAABAQEBAQEBAQEBAQEBAQEBAQEBAQGAAoAAAP+AAAD/AAAAAIAAAACAAAD+gAAA/4AAAP8AAAAAgAAAAIAEAAAA/QAAAP+AAAABAAAAAIAAAAEAAAD+AAAA/4AAAAEAAAAAgAAAAAAAAAAYASYAAQAAAAAAAAAIAAAAAQAAAAAAAQAIAAgAAQAAAAAAAgAHABAAAQAAAAAAAwAIABcAAQAAAAAABAAQAB8AAQAAAAAABQALAC8AAQAAAAAABgAIADoAAQAAAAAACQAJAEIAAQAAAAAACgA6AEsAAQAAAAAADQARAIUAAQAAAAAADgAyAJYAAQAAAAAAEwAMAMgAAwABBAkAAAAQANQAAwABBAkAAQAQAOQAAwABBAkAAgAOAPQAAwABBAkAAwAQAQIAAwABBAkABAAgARIAAwABBAkABQAWATIAAwABBAkABgAQAUgAAwABBAkACQASAVgAAwABBAkACgB0AWoAAwABBAkADQAiAd4AAwABBAkADgBkAgAAAwABBAkAEwAYAmQoYykgMjAyMlVyc2FGb250UmVndWxhclVyc2FGb250VXJzYUZvbnQgUmVndWxhclZlcnNpb24gMS4wVXJzYUZvbnRVcnNhRnJhbmtBbiBvcGVuIGxpY2VuY2UgZ2VuZXJhbCBwdXJwb3NlIHRleHRtb2RlIGZvbnQgYnkgVXJzYUZyYW5rQ0MwIDEuMCBVbml2ZXJzYWxodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wL0hlbGxvIFdvcmxkIQAoAGMAKQAgADIAMAAyADIAVQByAHMAYQBGAG8AbgB0AFIAZQBnAHUAbABhAHIAVQByAHMAYQBGAG8AbgB0AFUAcgBzAGEARgBvAG4AdAAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAFUAcgBzAGEARgBvAG4AdABVAHIAcwBhAEYAcgBhAG4AawBBAG4AIABvAHAAZQBuACAAbABpAGMAZQBuAGMAZQAgAGcAZQBuAGUAcgBhAGwAIABwAHUAcgBwAG8AcwBlACAAdABlAHgAdABtAG8AZABlACAAZgBvAG4AdAAgAGIAeQAgAFUAcgBzAGEARgByAGEAbgBrAEMAQwAwACAAMQAuADAAIABVAG4AaQB2AGUAcgBzAGEAbABoAHQAdABwAHMAOgAvAC8AYwByAGUAYQB0AGkAdgBlAGMAbwBtAG0AbwBuAHMALgBvAHIAZwAvAHAAdQBiAGwAaQBjAGQAbwBtAGEAaQBuAC8AegBlAHIAbwAvADEALgAwAC8ASABlAGwAbABvACAAVwBvAHIAbABkACEAAAADAAAAAAAAAGYAMwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\r
|
|
772
723
|
`;
|
|
773
724
|
class O {
|
|
@@ -776,58 +727,58 @@ class O {
|
|
|
776
727
|
* @param font The parsed font object from Typr
|
|
777
728
|
* @returns Array of unique character strings
|
|
778
729
|
*/
|
|
779
|
-
extractCharacters(
|
|
730
|
+
extractCharacters(A) {
|
|
780
731
|
var t;
|
|
781
|
-
const
|
|
782
|
-
return (t =
|
|
732
|
+
const e = [];
|
|
733
|
+
return (t = A == null ? void 0 : A.cmap) != null && t.tables ? (A.cmap.tables.forEach((r) => {
|
|
783
734
|
if (r.format === 4) {
|
|
784
735
|
const B = this._extractCharactersFromFormat4Table(r);
|
|
785
|
-
|
|
736
|
+
e.push(...B);
|
|
786
737
|
} else if (r.format === 12) {
|
|
787
738
|
const B = this._extractCharactersFromFormat12Table(r);
|
|
788
|
-
|
|
739
|
+
e.push(...B);
|
|
789
740
|
}
|
|
790
|
-
}), [...new Set(
|
|
741
|
+
}), [...new Set(e)]) : [];
|
|
791
742
|
}
|
|
792
743
|
/**
|
|
793
744
|
* Extracts characters from a Format 4 cmap table (Basic Multilingual Plane).
|
|
794
745
|
* @param table The Format 4 cmap table
|
|
795
746
|
* @returns Array of character strings
|
|
796
747
|
*/
|
|
797
|
-
_extractCharactersFromFormat4Table(
|
|
798
|
-
const
|
|
799
|
-
if (!
|
|
800
|
-
return
|
|
801
|
-
for (let t = 0; t <
|
|
802
|
-
const r =
|
|
748
|
+
_extractCharactersFromFormat4Table(A) {
|
|
749
|
+
const e = [];
|
|
750
|
+
if (!A.startCount || !A.endCount || !A.idRangeOffset || !A.idDelta)
|
|
751
|
+
return e;
|
|
752
|
+
for (let t = 0; t < A.startCount.length; t++) {
|
|
753
|
+
const r = A.startCount[t], B = A.endCount[t];
|
|
803
754
|
if (!(r === 65535 && B === 65535)) {
|
|
804
755
|
for (let E = r; E <= B; E++)
|
|
805
|
-
if (this._calculateGlyphIndexFormat4(
|
|
756
|
+
if (this._calculateGlyphIndexFormat4(A, E, t) > 0) {
|
|
806
757
|
const i = String.fromCodePoint(E);
|
|
807
|
-
|
|
758
|
+
e.push(i);
|
|
808
759
|
}
|
|
809
760
|
}
|
|
810
761
|
}
|
|
811
|
-
return
|
|
762
|
+
return e;
|
|
812
763
|
}
|
|
813
764
|
/**
|
|
814
765
|
* Extracts characters from a Format 12 cmap table (Extended Unicode ranges).
|
|
815
766
|
* @param table The Format 12 cmap table
|
|
816
767
|
* @returns Array of character strings
|
|
817
768
|
*/
|
|
818
|
-
_extractCharactersFromFormat12Table(
|
|
819
|
-
const
|
|
820
|
-
if (!
|
|
821
|
-
return
|
|
822
|
-
for (let t = 0; t <
|
|
823
|
-
const r =
|
|
769
|
+
_extractCharactersFromFormat12Table(A) {
|
|
770
|
+
const e = [];
|
|
771
|
+
if (!A.groups)
|
|
772
|
+
return e;
|
|
773
|
+
for (let t = 0; t < A.groups.length; t += 3) {
|
|
774
|
+
const r = A.groups[t], B = A.groups[t + 1], E = A.groups[t + 2];
|
|
824
775
|
for (let g = r; g <= B; g++)
|
|
825
776
|
if (E + (g - r) > 0) {
|
|
826
777
|
const o = String.fromCodePoint(g);
|
|
827
|
-
|
|
778
|
+
e.push(o);
|
|
828
779
|
}
|
|
829
780
|
}
|
|
830
|
-
return
|
|
781
|
+
return e;
|
|
831
782
|
}
|
|
832
783
|
/**
|
|
833
784
|
* Calculates the glyph index for a character in a Format 4 cmap table.
|
|
@@ -836,15 +787,15 @@ class O {
|
|
|
836
787
|
* @param rangeIndex The index of the character range
|
|
837
788
|
* @returns The glyph index, or 0 if not found
|
|
838
789
|
*/
|
|
839
|
-
_calculateGlyphIndexFormat4(
|
|
840
|
-
if (
|
|
841
|
-
return
|
|
790
|
+
_calculateGlyphIndexFormat4(A, e, t) {
|
|
791
|
+
if (A.idRangeOffset[t] === 0)
|
|
792
|
+
return e + A.idDelta[t] & 65535;
|
|
842
793
|
{
|
|
843
|
-
const r =
|
|
844
|
-
if (r >= 0 &&
|
|
845
|
-
const B =
|
|
794
|
+
const r = A.idRangeOffset[t] / 2 + (e - A.startCount[t]) - (A.startCount.length - t);
|
|
795
|
+
if (r >= 0 && A.glyphIdArray && r < A.glyphIdArray.length) {
|
|
796
|
+
const B = A.glyphIdArray[r];
|
|
846
797
|
if (B !== 0)
|
|
847
|
-
return B +
|
|
798
|
+
return B + A.idDelta[t] & 65535;
|
|
848
799
|
}
|
|
849
800
|
}
|
|
850
801
|
return 0;
|
|
@@ -854,29 +805,29 @@ class O {
|
|
|
854
805
|
* @param characters Array of character strings to filter
|
|
855
806
|
* @returns Filtered array of character strings
|
|
856
807
|
*/
|
|
857
|
-
filterProblematicCharacters(
|
|
858
|
-
return
|
|
808
|
+
filterProblematicCharacters(A) {
|
|
809
|
+
return A.filter((e) => this._isValidCharacter(e));
|
|
859
810
|
}
|
|
860
811
|
/**
|
|
861
812
|
* Checks if a character is valid for rendering.
|
|
862
813
|
* @param char The character to check
|
|
863
814
|
* @returns True if the character is valid, false otherwise
|
|
864
815
|
*/
|
|
865
|
-
_isValidCharacter(
|
|
866
|
-
const
|
|
867
|
-
return !(
|
|
816
|
+
_isValidCharacter(A) {
|
|
817
|
+
const e = A.codePointAt(0) || 0;
|
|
818
|
+
return !(e >= 0 && e <= 31 && e !== 9 && e !== 10 && e !== 13 || e >= 127 && e <= 159);
|
|
868
819
|
}
|
|
869
820
|
}
|
|
870
|
-
class
|
|
821
|
+
class z {
|
|
871
822
|
/**
|
|
872
823
|
* Creates a new TextureAtlasCreation instance.
|
|
873
824
|
* @param renderer The WebGL renderer instance
|
|
874
825
|
*/
|
|
875
|
-
constructor(
|
|
826
|
+
constructor(A) {
|
|
876
827
|
Q(this, "_textureCanvas");
|
|
877
828
|
Q(this, "_textureContext");
|
|
878
829
|
Q(this, "_renderer");
|
|
879
|
-
this._renderer =
|
|
830
|
+
this._renderer = A, this._textureCanvas = document.createElement("canvas"), this._textureContext = this._textureCanvas.getContext("2d", { willReadFrequently: !0 });
|
|
880
831
|
}
|
|
881
832
|
/**
|
|
882
833
|
* Creates a texture atlas from the given characters.
|
|
@@ -886,9 +837,9 @@ class H {
|
|
|
886
837
|
* @param fontFamilyName Font family name to use
|
|
887
838
|
* @returns Object containing framebuffer, columns, and rows
|
|
888
839
|
*/
|
|
889
|
-
async createTextureAtlas(
|
|
890
|
-
const B =
|
|
891
|
-
this._setupCanvas(i, o, t, r), this._renderCharactersToCanvas(
|
|
840
|
+
async createTextureAtlas(A, e, t, r) {
|
|
841
|
+
const B = A.length, E = Math.ceil(Math.sqrt(B)), g = Math.ceil(B / E), i = e.width * E, o = e.height * g;
|
|
842
|
+
this._setupCanvas(i, o, t, r), this._renderCharactersToCanvas(A, e, E, t), this._applyBlackWhiteThreshold();
|
|
892
843
|
const n = this._renderer.createFramebuffer(i, o, { filter: "nearest" });
|
|
893
844
|
return n.update(this._textureCanvas), {
|
|
894
845
|
framebuffer: n,
|
|
@@ -903,8 +854,8 @@ class H {
|
|
|
903
854
|
* @param fontSize Font size
|
|
904
855
|
* @param fontFamilyName Font family name
|
|
905
856
|
*/
|
|
906
|
-
_setupCanvas(
|
|
907
|
-
this._textureCanvas.width =
|
|
857
|
+
_setupCanvas(A, e, t, r) {
|
|
858
|
+
this._textureCanvas.width = A, this._textureCanvas.height = e, this._textureContext.imageSmoothingEnabled = !0, this._textureContext.imageSmoothingQuality = "high", this._textureContext.fillStyle = "black", this._textureContext.fillRect(0, 0, A, e), this._textureContext.font = `${t}px ${r}`, this._textureContext.textBaseline = "top", this._textureContext.textAlign = "left", this._textureContext.fillStyle = "white";
|
|
908
859
|
}
|
|
909
860
|
/**
|
|
910
861
|
* Renders all characters to the canvas in a grid layout.
|
|
@@ -913,10 +864,10 @@ class H {
|
|
|
913
864
|
* @param textureColumns Number of columns in the texture
|
|
914
865
|
* @param fontSize Font size
|
|
915
866
|
*/
|
|
916
|
-
_renderCharactersToCanvas(
|
|
917
|
-
for (let B = 0; B <
|
|
918
|
-
const E = B % t, g = Math.floor(B / t), i = E *
|
|
919
|
-
this._textureContext.fillText(
|
|
867
|
+
_renderCharactersToCanvas(A, e, t, r) {
|
|
868
|
+
for (let B = 0; B < A.length; B++) {
|
|
869
|
+
const E = B % t, g = Math.floor(B / t), i = E * e.width + e.width / 2, o = g * e.height + e.height / 2, n = i - e.width / 2, a = o - r / 2;
|
|
870
|
+
this._textureContext.fillText(A[B].character, n, a);
|
|
920
871
|
}
|
|
921
872
|
}
|
|
922
873
|
/**
|
|
@@ -925,16 +876,16 @@ class H {
|
|
|
925
876
|
* ensuring crisp text rendering suitable for NEAREST texture filtering.
|
|
926
877
|
* @param threshold Threshold value (0-255) for black/white conversion
|
|
927
878
|
*/
|
|
928
|
-
_applyBlackWhiteThreshold(
|
|
929
|
-
const
|
|
879
|
+
_applyBlackWhiteThreshold(A = 128) {
|
|
880
|
+
const e = this._textureContext.getImageData(0, 0, this._textureCanvas.width, this._textureCanvas.height), t = e.data;
|
|
930
881
|
for (let r = 0; r < t.length; r += 4) {
|
|
931
|
-
const E = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2] >
|
|
882
|
+
const E = 0.299 * t[r] + 0.587 * t[r + 1] + 0.114 * t[r + 2] > A ? 255 : 0;
|
|
932
883
|
t[r] = E, t[r + 1] = E, t[r + 2] = E;
|
|
933
884
|
}
|
|
934
|
-
this._textureContext.putImageData(
|
|
885
|
+
this._textureContext.putImageData(e, 0, 0);
|
|
935
886
|
}
|
|
936
887
|
}
|
|
937
|
-
class
|
|
888
|
+
class H {
|
|
938
889
|
/**
|
|
939
890
|
* Creates a new MetricsCalculation instance.
|
|
940
891
|
*/
|
|
@@ -951,10 +902,10 @@ class z {
|
|
|
951
902
|
* @param fontFace FontFace object (optional, for validation)
|
|
952
903
|
* @returns Object containing width and height dimensions
|
|
953
904
|
*/
|
|
954
|
-
calculateMaxGlyphDimensions(
|
|
955
|
-
this._tempContext.font = `${
|
|
905
|
+
calculateMaxGlyphDimensions(A, e, t) {
|
|
906
|
+
this._tempContext.font = `${e}px ${t}`;
|
|
956
907
|
let r = 0, B = 0;
|
|
957
|
-
for (const E of
|
|
908
|
+
for (const E of A) {
|
|
958
909
|
const g = this._tempContext.measureText(E), i = g.width, o = g.actualBoundingBoxAscent + g.actualBoundingBoxDescent;
|
|
959
910
|
i > 0 && (r = Math.max(r, i), B = Math.max(B, o));
|
|
960
911
|
}
|
|
@@ -970,11 +921,11 @@ class L {
|
|
|
970
921
|
* @param characters Array of character strings
|
|
971
922
|
* @returns Array of TextmodeCharacter objects with colors
|
|
972
923
|
*/
|
|
973
|
-
createCharacterObjects(
|
|
974
|
-
return
|
|
975
|
-
const r =
|
|
924
|
+
createCharacterObjects(A) {
|
|
925
|
+
return A.map((e, t) => {
|
|
926
|
+
const r = e.codePointAt(0) || 0, B = this._generateCharacterColor(t);
|
|
976
927
|
return {
|
|
977
|
-
character:
|
|
928
|
+
character: e,
|
|
978
929
|
unicode: r,
|
|
979
930
|
color: B
|
|
980
931
|
};
|
|
@@ -985,9 +936,9 @@ class L {
|
|
|
985
936
|
* @param index The index of the character
|
|
986
937
|
* @returns RGB color as a tuple [r, g, b]
|
|
987
938
|
*/
|
|
988
|
-
_generateCharacterColor(
|
|
989
|
-
const
|
|
990
|
-
return [
|
|
939
|
+
_generateCharacterColor(A) {
|
|
940
|
+
const e = A % 256, t = Math.floor(A / 256) % 256, r = Math.floor(A / 65536) % 256;
|
|
941
|
+
return [e, t, r];
|
|
991
942
|
}
|
|
992
943
|
/**
|
|
993
944
|
* Gets the color for a specific character.
|
|
@@ -995,8 +946,8 @@ class L {
|
|
|
995
946
|
* @param characters Array of TextmodeCharacter objects
|
|
996
947
|
* @returns RGB color as a tuple [r, g, b], or [0, 0, 0] if not found
|
|
997
948
|
*/
|
|
998
|
-
getCharacterColor(
|
|
999
|
-
const t =
|
|
949
|
+
getCharacterColor(A, e) {
|
|
950
|
+
const t = e.find((r) => r.character === A);
|
|
1000
951
|
return t ? t.color : [0, 0, 0];
|
|
1001
952
|
}
|
|
1002
953
|
/**
|
|
@@ -1005,18 +956,18 @@ class L {
|
|
|
1005
956
|
* @param characters Array of TextmodeCharacter objects
|
|
1006
957
|
* @returns Array of RGB colors for each character
|
|
1007
958
|
*/
|
|
1008
|
-
getCharacterColors(
|
|
1009
|
-
return
|
|
959
|
+
getCharacterColors(A, e) {
|
|
960
|
+
return A.split("").map((t) => this.getCharacterColor(t, e) || [0, 0, 0]);
|
|
1010
961
|
}
|
|
1011
962
|
}
|
|
1012
|
-
class
|
|
963
|
+
class k {
|
|
1013
964
|
/**
|
|
1014
965
|
* Creates a new TextmodeFont instance.
|
|
1015
966
|
* @param renderer Renderer instance for texture creation
|
|
1016
967
|
* @param fontSize Font size to use for the texture atlas
|
|
1017
968
|
* @ignore
|
|
1018
969
|
*/
|
|
1019
|
-
constructor(
|
|
970
|
+
constructor(A, e = 16) {
|
|
1020
971
|
Q(this, "_font");
|
|
1021
972
|
Q(this, "_characters", []);
|
|
1022
973
|
Q(this, "_fontFramebuffer");
|
|
@@ -1031,7 +982,7 @@ class V {
|
|
|
1031
982
|
Q(this, "_textureAtlas");
|
|
1032
983
|
Q(this, "_metricsCalculator");
|
|
1033
984
|
Q(this, "_characterColorMapper");
|
|
1034
|
-
this._fontSize =
|
|
985
|
+
this._fontSize = e, this._characterExtractor = new O(), this._textureAtlas = new z(A), this._metricsCalculator = new H(), this._characterColorMapper = new L();
|
|
1035
986
|
}
|
|
1036
987
|
/**
|
|
1037
988
|
* Initializes the font manager by loading the font and creating the texture atlas.
|
|
@@ -1039,8 +990,8 @@ class V {
|
|
|
1039
990
|
* @ignore
|
|
1040
991
|
*/
|
|
1041
992
|
async initialize() {
|
|
1042
|
-
const
|
|
1043
|
-
await this._loadFontFace(
|
|
993
|
+
const e = await (await fetch(S)).arrayBuffer();
|
|
994
|
+
await this._loadFontFace(e), this._font = m.parse(e)[0], await this._initializeFont();
|
|
1044
995
|
}
|
|
1045
996
|
/**
|
|
1046
997
|
* Loads a new font from a file path.
|
|
@@ -1048,36 +999,36 @@ class V {
|
|
|
1048
999
|
* @returns Promise that resolves when font loading is complete
|
|
1049
1000
|
* @ignore
|
|
1050
1001
|
*/
|
|
1051
|
-
async loadFont(
|
|
1002
|
+
async loadFont(A) {
|
|
1052
1003
|
try {
|
|
1053
|
-
const
|
|
1054
|
-
if (!
|
|
1055
|
-
throw new
|
|
1056
|
-
const t = await
|
|
1004
|
+
const e = await fetch(A);
|
|
1005
|
+
if (!e.ok)
|
|
1006
|
+
throw new D(`Failed to load font file: ${e.status} ${e.statusText}`);
|
|
1007
|
+
const t = await e.arrayBuffer();
|
|
1057
1008
|
await this._loadFontFace(t);
|
|
1058
1009
|
const r = m.parse(t);
|
|
1059
1010
|
if (!r || r.length === 0)
|
|
1060
1011
|
throw new Error("Failed to parse font file");
|
|
1061
1012
|
this._font = r[0], await this._initializeFont();
|
|
1062
|
-
} catch (
|
|
1063
|
-
throw new
|
|
1013
|
+
} catch (e) {
|
|
1014
|
+
throw new D(`Failed to load font: ${e instanceof Error ? e.message : "Unknown error"}`, e);
|
|
1064
1015
|
}
|
|
1065
1016
|
}
|
|
1066
1017
|
/**
|
|
1067
1018
|
* Loads a FontFace from a font buffer.
|
|
1068
1019
|
* @param fontBuffer ArrayBuffer containing font data
|
|
1069
1020
|
*/
|
|
1070
|
-
async _loadFontFace(
|
|
1071
|
-
const
|
|
1072
|
-
this._fontFamilyName = this._fontFamilyName === "UrsaFont" ? "UrsaFont" : `CustomFont_${
|
|
1021
|
+
async _loadFontFace(A) {
|
|
1022
|
+
const e = Date.now();
|
|
1023
|
+
this._fontFamilyName = this._fontFamilyName === "UrsaFont" ? "UrsaFont" : `CustomFont_${e}`, this._fontFace = new FontFace(this._fontFamilyName, A), await this._fontFace.load(), document.fonts.add(this._fontFace);
|
|
1073
1024
|
}
|
|
1074
1025
|
/**
|
|
1075
1026
|
* Initializes all font-dependent properties using the component classes.
|
|
1076
1027
|
*/
|
|
1077
1028
|
async _initializeFont() {
|
|
1078
|
-
const
|
|
1079
|
-
this._characters = this._characterColorMapper.createCharacterObjects(
|
|
1080
|
-
|
|
1029
|
+
const A = this._characterExtractor.extractCharacters(this._font), e = this._characterExtractor.filterProblematicCharacters(A);
|
|
1030
|
+
this._characters = this._characterColorMapper.createCharacterObjects(e), this._maxGlyphDimensions = this._metricsCalculator.calculateMaxGlyphDimensions(
|
|
1031
|
+
e,
|
|
1081
1032
|
this._fontSize,
|
|
1082
1033
|
this._fontFamilyName
|
|
1083
1034
|
);
|
|
@@ -1094,12 +1045,12 @@ class V {
|
|
|
1094
1045
|
* @param character The character to get the color for.
|
|
1095
1046
|
* @returns The RGB color as an array `[r, g, b]`.
|
|
1096
1047
|
*/
|
|
1097
|
-
getCharacterColor(
|
|
1048
|
+
getCharacterColor(A) {
|
|
1098
1049
|
return C.validate(
|
|
1099
|
-
typeof
|
|
1050
|
+
typeof A == "string" && A.length === 1,
|
|
1100
1051
|
"Character must be a single character string.",
|
|
1101
|
-
{ providedValue:
|
|
1102
|
-
) ? this._characterColorMapper.getCharacterColor(
|
|
1052
|
+
{ providedValue: A, method: "getCharacterColor" }
|
|
1053
|
+
) ? this._characterColorMapper.getCharacterColor(A, this._characters) : [0, 0, 0];
|
|
1103
1054
|
}
|
|
1104
1055
|
/**
|
|
1105
1056
|
* Get the colors associated with a string of characters.
|
|
@@ -1107,23 +1058,23 @@ class V {
|
|
|
1107
1058
|
* @returns An array of RGB colors for each character in the string.
|
|
1108
1059
|
* Each color is represented as an array `[r, g, b]`.
|
|
1109
1060
|
*/
|
|
1110
|
-
getCharacterColors(
|
|
1061
|
+
getCharacterColors(A) {
|
|
1111
1062
|
return C.validate(
|
|
1112
|
-
typeof
|
|
1063
|
+
typeof A == "string" && A.length > 0,
|
|
1113
1064
|
"Characters must be a string with at least one character.",
|
|
1114
|
-
{ providedValue:
|
|
1115
|
-
) ? this._characterColorMapper.getCharacterColors(
|
|
1065
|
+
{ providedValue: A, method: "getCharacterColors" }
|
|
1066
|
+
) ? this._characterColorMapper.getCharacterColors(A, this._characters) : [[0, 0, 0]];
|
|
1116
1067
|
}
|
|
1117
1068
|
/**
|
|
1118
1069
|
* Checks if all characters in the given string exist in the font.
|
|
1119
1070
|
* @param str The string to check.
|
|
1120
1071
|
* @returns `true` if all characters exist in the font, `false` otherwise.
|
|
1121
1072
|
*/
|
|
1122
|
-
hasAllCharacters(
|
|
1123
|
-
if (typeof
|
|
1124
|
-
const
|
|
1125
|
-
for (const t of
|
|
1126
|
-
if (!
|
|
1073
|
+
hasAllCharacters(A) {
|
|
1074
|
+
if (typeof A != "string" || A.length === 0) return !1;
|
|
1075
|
+
const e = new Set(this._characters.map((t) => t.character));
|
|
1076
|
+
for (const t of A)
|
|
1077
|
+
if (!e.has(t)) return !1;
|
|
1127
1078
|
return !0;
|
|
1128
1079
|
}
|
|
1129
1080
|
/**
|
|
@@ -1139,7 +1090,7 @@ class V {
|
|
|
1139
1090
|
}
|
|
1140
1091
|
/** Returns a string representation of all characters in the font. */
|
|
1141
1092
|
get charactersString() {
|
|
1142
|
-
return this._characters.map((
|
|
1093
|
+
return this._characters.map((A) => A.character).join("");
|
|
1143
1094
|
}
|
|
1144
1095
|
/** Returns the number of columns in the texture atlas. */
|
|
1145
1096
|
get textureColumns() {
|
|
@@ -1158,7 +1109,7 @@ class V {
|
|
|
1158
1109
|
return this._fontSize;
|
|
1159
1110
|
}
|
|
1160
1111
|
}
|
|
1161
|
-
class
|
|
1112
|
+
class N {
|
|
1162
1113
|
/**
|
|
1163
1114
|
* Create a new grid instance.
|
|
1164
1115
|
* @param canvas The canvas element used to determine the grid dimensions.
|
|
@@ -1166,7 +1117,7 @@ class k {
|
|
|
1166
1117
|
* @param cellHeight The height of each cell in the grid.
|
|
1167
1118
|
* @ignore
|
|
1168
1119
|
*/
|
|
1169
|
-
constructor(
|
|
1120
|
+
constructor(A, e, t) {
|
|
1170
1121
|
/** The number of columns in the grid. */
|
|
1171
1122
|
Q(this, "_cols");
|
|
1172
1123
|
/** The number of rows in the grid. */
|
|
@@ -1187,20 +1138,25 @@ class k {
|
|
|
1187
1138
|
Q(this, "_cellWidth");
|
|
1188
1139
|
/** The height of each cell in the grid. */
|
|
1189
1140
|
Q(this, "_cellHeight");
|
|
1190
|
-
this._canvas =
|
|
1141
|
+
this._canvas = A, this._cellWidth = e, this._cellHeight = t, this.reset();
|
|
1191
1142
|
}
|
|
1192
1143
|
/**
|
|
1193
1144
|
* Reset the grid to the default number of columns and rows based on the current canvas dimensions, and the grid cell dimensions.
|
|
1194
1145
|
* @ignore
|
|
1195
1146
|
*/
|
|
1196
1147
|
reset() {
|
|
1197
|
-
|
|
1148
|
+
if (!this._fixedDimensions) {
|
|
1149
|
+
const A = this._canvas.getBoundingClientRect(), e = Math.round(A.width), t = Math.round(A.height);
|
|
1150
|
+
[this._cols, this._rows] = [Math.floor(e / this._cellWidth), Math.floor(t / this._cellHeight)];
|
|
1151
|
+
}
|
|
1152
|
+
this._resizeGrid();
|
|
1198
1153
|
}
|
|
1199
1154
|
/**
|
|
1200
1155
|
* Reset the total grid width & height, and the offset to the outer canvas.
|
|
1201
1156
|
*/
|
|
1202
1157
|
_resizeGrid() {
|
|
1203
|
-
|
|
1158
|
+
const A = this._canvas.getBoundingClientRect(), e = Math.round(A.width), t = Math.round(A.height);
|
|
1159
|
+
this._width = this._cols * this._cellWidth, this._height = this._rows * this._cellHeight, this._offsetX = Math.floor((e - this._width) / 2), this._offsetY = Math.floor((t - this._height) / 2);
|
|
1204
1160
|
}
|
|
1205
1161
|
/**
|
|
1206
1162
|
* Re-assign the grid cell dimensions and `reset()` the grid.
|
|
@@ -1208,8 +1164,8 @@ class k {
|
|
|
1208
1164
|
* @param newCellHeight The new cell height.
|
|
1209
1165
|
* @ignore
|
|
1210
1166
|
*/
|
|
1211
|
-
resizeCellPixelDimensions(
|
|
1212
|
-
[this._cellWidth, this._cellHeight] = [
|
|
1167
|
+
resizeCellPixelDimensions(A, e) {
|
|
1168
|
+
[this._cellWidth, this._cellHeight] = [A, e], this.reset();
|
|
1213
1169
|
}
|
|
1214
1170
|
/**
|
|
1215
1171
|
* Re-assign the grid dimensions and resize the grid.
|
|
@@ -1219,8 +1175,8 @@ class k {
|
|
|
1219
1175
|
* @param newRows The new number of rows.
|
|
1220
1176
|
* @ignore
|
|
1221
1177
|
*/
|
|
1222
|
-
resizeGridDimensions(
|
|
1223
|
-
this._fixedDimensions = !0, [this._cols, this._rows] = [
|
|
1178
|
+
resizeGridDimensions(A, e) {
|
|
1179
|
+
this._fixedDimensions = !0, [this._cols, this._rows] = [A, e], this._resizeGrid();
|
|
1224
1180
|
}
|
|
1225
1181
|
/**
|
|
1226
1182
|
* Make the grid dimensions flexible again, and `reset()` the grid.
|
|
@@ -1234,8 +1190,8 @@ class k {
|
|
|
1234
1190
|
* @param canvas The new canvas element to use for the grid.
|
|
1235
1191
|
* @ignore
|
|
1236
1192
|
*/
|
|
1237
|
-
|
|
1238
|
-
this.
|
|
1193
|
+
resize() {
|
|
1194
|
+
this._fixedDimensions ? this._resizeGrid() : this.reset();
|
|
1239
1195
|
}
|
|
1240
1196
|
/**
|
|
1241
1197
|
* Gets or sets whether the grid dimensions *(columns and rows)* are fixed or responsive based on the canvas dimensions.
|
|
@@ -1243,10 +1199,10 @@ class k {
|
|
|
1243
1199
|
* @returns If no parameter is provided, returns `true` if the grid dimensions are fixed, or `false` if they are responsive.
|
|
1244
1200
|
* @ignore
|
|
1245
1201
|
*/
|
|
1246
|
-
fixedDimensions(
|
|
1247
|
-
if (
|
|
1202
|
+
fixedDimensions(A) {
|
|
1203
|
+
if (A === void 0)
|
|
1248
1204
|
return this._fixedDimensions;
|
|
1249
|
-
this._fixedDimensions =
|
|
1205
|
+
this._fixedDimensions = A;
|
|
1250
1206
|
}
|
|
1251
1207
|
/** Returns the width of each cell in the grid. */
|
|
1252
1208
|
get cellWidth() {
|
|
@@ -1281,47 +1237,46 @@ class k {
|
|
|
1281
1237
|
return this._offsetY;
|
|
1282
1238
|
}
|
|
1283
1239
|
}
|
|
1284
|
-
class
|
|
1285
|
-
constructor(
|
|
1240
|
+
class V {
|
|
1241
|
+
constructor(A) {
|
|
1286
1242
|
Q(this, "webglCanvas");
|
|
1287
1243
|
Q(this, "captureCanvas");
|
|
1288
|
-
this.captureCanvas =
|
|
1244
|
+
this.captureCanvas = A, this.webglCanvas = this.createOverlayCanvas();
|
|
1289
1245
|
}
|
|
1290
1246
|
generateUniqueCanvasId() {
|
|
1291
|
-
let
|
|
1292
|
-
for (; document.getElementById(
|
|
1293
|
-
|
|
1294
|
-
return
|
|
1247
|
+
let A = 0, e = `textmodeCanvas${A}`;
|
|
1248
|
+
for (; document.getElementById(e); )
|
|
1249
|
+
A++, e = `textmodeCanvas${A}`;
|
|
1250
|
+
return e;
|
|
1295
1251
|
}
|
|
1296
1252
|
createOverlayCanvas() {
|
|
1297
|
-
var
|
|
1298
|
-
const
|
|
1299
|
-
|
|
1300
|
-
const
|
|
1301
|
-
let
|
|
1302
|
-
isNaN(
|
|
1303
|
-
const
|
|
1304
|
-
return
|
|
1305
|
-
}
|
|
1306
|
-
positionOverlayCanvas(
|
|
1307
|
-
const
|
|
1253
|
+
var i;
|
|
1254
|
+
const A = document.createElement("canvas"), e = this.captureCanvas.getBoundingClientRect(), t = Math.round(e.width), r = Math.round(e.height);
|
|
1255
|
+
A.width = t, A.height = r, A.className = "textmodeCanvas", A.id = this.generateUniqueCanvasId(), A.style.position = "absolute", A.style.pointerEvents = "none";
|
|
1256
|
+
const B = window.getComputedStyle(this.captureCanvas);
|
|
1257
|
+
let E = parseInt(B.zIndex || "0", 10);
|
|
1258
|
+
isNaN(E) && (E = 0), A.style.zIndex = (E + 1).toString();
|
|
1259
|
+
const g = this.captureCanvas.getBoundingClientRect();
|
|
1260
|
+
return A.style.width = g.width + "px", A.style.height = g.height + "px", this.positionOverlayCanvas(A), (i = this.captureCanvas.parentNode) == null || i.insertBefore(A, this.captureCanvas.nextSibling), A;
|
|
1261
|
+
}
|
|
1262
|
+
positionOverlayCanvas(A) {
|
|
1263
|
+
const e = this.captureCanvas.getBoundingClientRect();
|
|
1308
1264
|
let t = this.captureCanvas.offsetParent;
|
|
1309
1265
|
if (t && t !== document.body) {
|
|
1310
1266
|
const r = t.getBoundingClientRect();
|
|
1311
|
-
|
|
1267
|
+
A.style.top = e.top - r.top + "px", A.style.left = e.left - r.left + "px";
|
|
1312
1268
|
} else
|
|
1313
|
-
|
|
1269
|
+
A.style.top = e.top + window.scrollY + "px", A.style.left = e.left + window.scrollX + "px";
|
|
1314
1270
|
}
|
|
1315
1271
|
resize() {
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
this.webglCanvas.style.width = e.width + "px", this.webglCanvas.style.height = e.height + "px", this.positionOverlayCanvas(this.webglCanvas);
|
|
1272
|
+
const A = this.captureCanvas.getBoundingClientRect();
|
|
1273
|
+
this.webglCanvas.width = Math.round(A.width), this.webglCanvas.height = Math.round(A.height), this.webglCanvas.style.width = A.width + "px", this.webglCanvas.style.height = A.height + "px", this.positionOverlayCanvas(this.webglCanvas);
|
|
1319
1274
|
}
|
|
1320
1275
|
/**
|
|
1321
1276
|
* Get the WebGL context for the overlay canvas
|
|
1322
1277
|
*/
|
|
1323
1278
|
getWebGLContext() {
|
|
1324
|
-
const
|
|
1279
|
+
const A = {
|
|
1325
1280
|
alpha: !0,
|
|
1326
1281
|
premultipliedAlpha: !1,
|
|
1327
1282
|
preserveDrawingBuffer: !0,
|
|
@@ -1329,10 +1284,10 @@ class N {
|
|
|
1329
1284
|
depth: !1,
|
|
1330
1285
|
stencil: !1,
|
|
1331
1286
|
powerPreference: "high-performance"
|
|
1332
|
-
},
|
|
1333
|
-
if (!
|
|
1334
|
-
throw new
|
|
1335
|
-
return
|
|
1287
|
+
}, e = this.webglCanvas.getContext("webgl2", A) || this.webglCanvas.getContext("webgl", A);
|
|
1288
|
+
if (!e)
|
|
1289
|
+
throw new D("WebGL context could not be created. Ensure your browser supports WebGL.");
|
|
1290
|
+
return e;
|
|
1336
1291
|
}
|
|
1337
1292
|
// Getters
|
|
1338
1293
|
get canvas() {
|
|
@@ -1346,7 +1301,7 @@ class N {
|
|
|
1346
1301
|
}
|
|
1347
1302
|
}
|
|
1348
1303
|
class p {
|
|
1349
|
-
constructor(
|
|
1304
|
+
constructor(A, e, t, r = {}) {
|
|
1350
1305
|
Q(this, "renderer");
|
|
1351
1306
|
Q(this, "fontManager");
|
|
1352
1307
|
Q(this, "grid");
|
|
@@ -1356,7 +1311,7 @@ class p {
|
|
|
1356
1311
|
Q(this, "_rotationFramebuffer");
|
|
1357
1312
|
Q(this, "_transformFramebuffer");
|
|
1358
1313
|
Q(this, "options");
|
|
1359
|
-
this.renderer =
|
|
1314
|
+
this.renderer = A, this.fontManager = e, this.grid = t, this.options = r, this._characterFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._primaryColorFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._secondaryColorFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._rotationFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows), this._transformFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows);
|
|
1360
1315
|
}
|
|
1361
1316
|
/**
|
|
1362
1317
|
* Resizes all internal framebuffers to match the grid dimensions.
|
|
@@ -1387,12 +1342,12 @@ class J {
|
|
|
1387
1342
|
* @param renderer The renderer instance.
|
|
1388
1343
|
* @param colors The RGB colors to store as [r, g, b] arrays where values are 0-255.
|
|
1389
1344
|
*/
|
|
1390
|
-
constructor(
|
|
1345
|
+
constructor(A, e) {
|
|
1391
1346
|
/** The framebuffer used to store the color palette. */
|
|
1392
1347
|
Q(this, "_framebuffer");
|
|
1393
1348
|
Q(this, "_renderer");
|
|
1394
1349
|
Q(this, "_colors");
|
|
1395
|
-
this._renderer =
|
|
1350
|
+
this._renderer = A, this._colors = e;
|
|
1396
1351
|
const t = Math.max(this._colors.length, 1);
|
|
1397
1352
|
this._framebuffer = this._renderer.createFramebuffer(t, 1), this._updateFramebuffer();
|
|
1398
1353
|
}
|
|
@@ -1401,21 +1356,21 @@ class J {
|
|
|
1401
1356
|
*/
|
|
1402
1357
|
_updateFramebuffer() {
|
|
1403
1358
|
if (!this._framebuffer) return;
|
|
1404
|
-
const
|
|
1405
|
-
this._framebuffer.width !==
|
|
1406
|
-
const t = new Uint8Array(
|
|
1407
|
-
for (let r = 0; r <
|
|
1359
|
+
const A = Math.max(this._colors.length, 1), e = 1;
|
|
1360
|
+
this._framebuffer.width !== A && this._framebuffer.resize(A, e);
|
|
1361
|
+
const t = new Uint8Array(A * e * 4);
|
|
1362
|
+
for (let r = 0; r < A; r++) {
|
|
1408
1363
|
const B = r < this._colors.length ? this._colors[r] : [0, 0, 0], E = r * 4;
|
|
1409
1364
|
t[E] = B[0], t[E + 1] = B[1], t[E + 2] = B[2], t[E + 3] = 255;
|
|
1410
1365
|
}
|
|
1411
|
-
this._framebuffer.
|
|
1366
|
+
this._framebuffer.updatePixels(t, A, e);
|
|
1412
1367
|
}
|
|
1413
1368
|
/**
|
|
1414
1369
|
* Sets the colors of the palette and updates the framebuffer.
|
|
1415
1370
|
* @param newColors The new RGB colors to set as [r, g, b] arrays.
|
|
1416
1371
|
*/
|
|
1417
|
-
setColors(
|
|
1418
|
-
this._colors =
|
|
1372
|
+
setColors(A) {
|
|
1373
|
+
this._colors = A, this._updateFramebuffer();
|
|
1419
1374
|
}
|
|
1420
1375
|
/**
|
|
1421
1376
|
* Get the colors of the palette.
|
|
@@ -1437,8 +1392,8 @@ class J {
|
|
|
1437
1392
|
}
|
|
1438
1393
|
}
|
|
1439
1394
|
class _ extends p {
|
|
1440
|
-
constructor(
|
|
1441
|
-
super(
|
|
1395
|
+
constructor(e, t, r, B = {}) {
|
|
1396
|
+
super(e, t, r, B);
|
|
1442
1397
|
Q(this, "palette");
|
|
1443
1398
|
this.palette = new J(this.renderer, this.fontManager.getCharacterColors(" .:-=+*%@#"));
|
|
1444
1399
|
}
|
|
@@ -1446,12 +1401,12 @@ class _ extends p {
|
|
|
1446
1401
|
* Sets the characters used for brightness mapping.
|
|
1447
1402
|
* @param characters The characters to use for brightness mapping, ordered from darkest to brightest.
|
|
1448
1403
|
*/
|
|
1449
|
-
characters(
|
|
1404
|
+
characters(e) {
|
|
1450
1405
|
C.validate(
|
|
1451
|
-
this.fontManager.hasAllCharacters(
|
|
1406
|
+
this.fontManager.hasAllCharacters(e),
|
|
1452
1407
|
"One or more characters do not exist in the current font.",
|
|
1453
|
-
{ method: "characters", providedValue:
|
|
1454
|
-
) && (this.options.characters =
|
|
1408
|
+
{ method: "characters", providedValue: e }
|
|
1409
|
+
) && (this.options.characters = e, this.palette.setColors(this.fontManager.getCharacterColors(e)));
|
|
1455
1410
|
}
|
|
1456
1411
|
/**
|
|
1457
1412
|
* Sets a fixed color for characters if `characterColorMode` is `fixed`.
|
|
@@ -1460,12 +1415,12 @@ class _ extends p {
|
|
|
1460
1415
|
* @param b Blue component (0-255).
|
|
1461
1416
|
* @param a Alpha component (0-255).
|
|
1462
1417
|
*/
|
|
1463
|
-
characterColor(
|
|
1418
|
+
characterColor(e, t = e, r = e, B = 255) {
|
|
1464
1419
|
C.validate(
|
|
1465
|
-
[
|
|
1420
|
+
[e, t, r, B].every((E) => E >= 0 && E <= 255),
|
|
1466
1421
|
"Character color values must be between 0 and 255",
|
|
1467
|
-
{ method: "characterColor", providedValues: { r:
|
|
1468
|
-
) && (this.options.characterColor = [
|
|
1422
|
+
{ method: "characterColor", providedValues: { r: e, g: t, b: r, a: B } }
|
|
1423
|
+
) && (this.options.characterColor = [e, t, r, B]);
|
|
1469
1424
|
}
|
|
1470
1425
|
/**
|
|
1471
1426
|
* Sets the character color mode.
|
|
@@ -1473,12 +1428,12 @@ class _ extends p {
|
|
|
1473
1428
|
* - `'fixed'`: Uses a fixed color set by `characterColor()`.
|
|
1474
1429
|
* @param mode The color mode to use for characters.
|
|
1475
1430
|
*/
|
|
1476
|
-
characterColorMode(
|
|
1431
|
+
characterColorMode(e) {
|
|
1477
1432
|
C.validate(
|
|
1478
|
-
["sampled", "fixed"].includes(
|
|
1433
|
+
["sampled", "fixed"].includes(e),
|
|
1479
1434
|
"Invalid character color mode. Must be 'sampled' or 'fixed'.",
|
|
1480
|
-
{ method: "characterColorMode", providedValue:
|
|
1481
|
-
) && (this.options.characterColorMode =
|
|
1435
|
+
{ method: "characterColorMode", providedValue: e }
|
|
1436
|
+
) && (this.options.characterColorMode = e);
|
|
1482
1437
|
}
|
|
1483
1438
|
/**
|
|
1484
1439
|
* Sets the cell color if `backgroundColorMode` is `fixed`.
|
|
@@ -1487,12 +1442,12 @@ class _ extends p {
|
|
|
1487
1442
|
* @param b Blue component (0-255).
|
|
1488
1443
|
* @param a Alpha component (0-255).
|
|
1489
1444
|
*/
|
|
1490
|
-
cellColor(
|
|
1445
|
+
cellColor(e, t = e, r = e, B = 255) {
|
|
1491
1446
|
C.validate(
|
|
1492
|
-
[
|
|
1447
|
+
[e, t, r, B].every((E) => E >= 0 && E <= 255),
|
|
1493
1448
|
"Cell color values must be between 0 and 255",
|
|
1494
|
-
{ method: "cellColor", providedValues: { r:
|
|
1495
|
-
) && (this.options.backgroundColor = [
|
|
1449
|
+
{ method: "cellColor", providedValues: { r: e, g: t, b: r, a: B } }
|
|
1450
|
+
) && (this.options.backgroundColor = [e, t, r, B]);
|
|
1496
1451
|
}
|
|
1497
1452
|
/**
|
|
1498
1453
|
* Sets the background color mode.
|
|
@@ -1500,60 +1455,60 @@ class _ extends p {
|
|
|
1500
1455
|
* - `'fixed'`: Uses a fixed color set by `backgroundColor()`.
|
|
1501
1456
|
* @param mode The color mode to use for background cells.
|
|
1502
1457
|
*/
|
|
1503
|
-
cellColorMode(
|
|
1458
|
+
cellColorMode(e) {
|
|
1504
1459
|
C.validate(
|
|
1505
|
-
["sampled", "fixed"].includes(
|
|
1460
|
+
["sampled", "fixed"].includes(e),
|
|
1506
1461
|
"Invalid cell color mode. Must be 'sampled' or 'fixed'.",
|
|
1507
|
-
{ method: "cellColorMode", providedValue:
|
|
1508
|
-
) && (this.options.backgroundColorMode =
|
|
1462
|
+
{ method: "cellColorMode", providedValue: e }
|
|
1463
|
+
) && (this.options.backgroundColorMode = e);
|
|
1509
1464
|
}
|
|
1510
1465
|
/**
|
|
1511
1466
|
* Swaps the character and cell color.
|
|
1512
1467
|
* @param invert If `true`, the character color becomes the cell color and vice versa.
|
|
1513
1468
|
*/
|
|
1514
|
-
invert(
|
|
1469
|
+
invert(e) {
|
|
1515
1470
|
C.validate(
|
|
1516
|
-
typeof
|
|
1471
|
+
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
1517
1472
|
"Invert must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1518
|
-
{ method: "invert", providedValue:
|
|
1519
|
-
) && (this.options.invert = !!
|
|
1473
|
+
{ method: "invert", providedValue: e }
|
|
1474
|
+
) && (this.options.invert = !!e);
|
|
1520
1475
|
}
|
|
1521
1476
|
/**
|
|
1522
1477
|
* Sets the rotation angle for the characters.
|
|
1523
1478
|
* @param angle The rotation angle in degrees.
|
|
1524
1479
|
*/
|
|
1525
|
-
rotation(
|
|
1480
|
+
rotation(e) {
|
|
1526
1481
|
C.validate(
|
|
1527
|
-
typeof
|
|
1482
|
+
typeof e == "number",
|
|
1528
1483
|
"Rotation angle must be a number.",
|
|
1529
|
-
{ method: "rotation", providedValue:
|
|
1530
|
-
) && (this.options.rotation =
|
|
1484
|
+
{ method: "rotation", providedValue: e }
|
|
1485
|
+
) && (this.options.rotation = e);
|
|
1531
1486
|
}
|
|
1532
1487
|
/**
|
|
1533
1488
|
* Flips the characters horizontally.
|
|
1534
1489
|
* @param flip If `true`, characters are flipped horizontally. If `false`, no flip is applied.
|
|
1535
1490
|
*/
|
|
1536
|
-
flipHorizontally(
|
|
1491
|
+
flipHorizontally(e) {
|
|
1537
1492
|
C.validate(
|
|
1538
|
-
typeof
|
|
1493
|
+
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
1539
1494
|
"Flip horizontally must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1540
|
-
{ method: "flipHorizontally", providedValue:
|
|
1541
|
-
) && (this.options.flipHorizontally = !!
|
|
1495
|
+
{ method: "flipHorizontally", providedValue: e }
|
|
1496
|
+
) && (this.options.flipHorizontally = !!e);
|
|
1542
1497
|
}
|
|
1543
1498
|
/**
|
|
1544
1499
|
* Flips the characters vertically.
|
|
1545
1500
|
* @param flip If `true`, characters are flipped vertically. If `false`, no flip is applied.
|
|
1546
1501
|
*/
|
|
1547
|
-
flipVertically(
|
|
1502
|
+
flipVertically(e) {
|
|
1548
1503
|
C.validate(
|
|
1549
|
-
typeof
|
|
1504
|
+
typeof e == "boolean" || typeof e == "number" && Number.isInteger(e),
|
|
1550
1505
|
"Flip vertically must be a boolean value or an integer (0 for false, any other number for true).",
|
|
1551
|
-
{ method: "flipVertically", providedValue:
|
|
1552
|
-
) && (this.options.flipVertically = !!
|
|
1506
|
+
{ method: "flipVertically", providedValue: e }
|
|
1507
|
+
) && (this.options.flipVertically = !!e);
|
|
1553
1508
|
}
|
|
1554
1509
|
}
|
|
1555
|
-
var W = "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;gl_FragColor=texture2D(u_sketchTexture,cellCenter);}",
|
|
1556
|
-
const
|
|
1510
|
+
var W = "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;gl_FragColor=texture2D(u_sketchTexture,cellCenter);}", K = "precision lowp float;uniform sampler2D u_colorSampleFramebuffer;uniform sampler2D u_charPaletteTexture;uniform vec2 u_charPaletteSize;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec4 color=texture2D(u_colorSampleFramebuffer,v_uv);if(color.a==0.0){gl_FragColor=vec4(0.0);return;}float brightness=dot(color.rgb,vec3(0.299,0.587,0.114))*255.0;vec2 range=u_brightnessRange;if(brightness<range.x||brightness>range.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-range.x)/(range.y-range.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);vec3 charColor=texture2D(u_charPaletteTexture,vec2((idx+0.5)/u_charPaletteSize.x,0.0)).rgb;gl_FragColor=vec4(charColor,color.a);}";
|
|
1511
|
+
const X = {
|
|
1557
1512
|
/** Enable/disable the renderer */
|
|
1558
1513
|
enabled: !0,
|
|
1559
1514
|
/** Characters used for brightness mapping (from darkest to brightest) */
|
|
@@ -1578,15 +1533,15 @@ const K = {
|
|
|
1578
1533
|
brightnessRange: [0, 255]
|
|
1579
1534
|
};
|
|
1580
1535
|
class b extends _ {
|
|
1581
|
-
constructor(
|
|
1582
|
-
super(
|
|
1536
|
+
constructor(e, t, r) {
|
|
1537
|
+
super(e, t, r, { ...X });
|
|
1583
1538
|
Q(this, "sampleShader");
|
|
1584
1539
|
Q(this, "charMappingShader");
|
|
1585
1540
|
Q(this, "sampleFramebuffer");
|
|
1586
|
-
this.sampleShader = new
|
|
1541
|
+
this.sampleShader = new l(e.context, P, W), this.charMappingShader = new l(e.context, P, K), this.sampleFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows);
|
|
1587
1542
|
}
|
|
1588
|
-
convert(
|
|
1589
|
-
this.sampleFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.sampleShader), this.renderer.setUniform("u_sketchTexture",
|
|
1543
|
+
convert(e) {
|
|
1544
|
+
this.sampleFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.sampleShader), this.renderer.setUniform("u_sketchTexture", e), this.renderer.setUniform("u_gridCellDimensions", [this.grid.cols, this.grid.rows]), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this.sampleFramebuffer.end(), this._primaryColorFramebuffer.begin(), this.options.characterColorMode === "fixed" ? this.renderer.background(this.options.characterColor[0], this.options.characterColor[1], this.options.characterColor[2], this.options.characterColor[3]) : (this.renderer.clear(), this.renderer.image(this.sampleFramebuffer, 0, 0, this.grid.cols, this.grid.rows)), this._primaryColorFramebuffer.end(), this._secondaryColorFramebuffer.begin(), this.options.backgroundColorMode === "fixed" ? this.renderer.background(this.options.backgroundColor[0], this.options.backgroundColor[1], this.options.backgroundColor[2], this.options.backgroundColor[3]) : (this.renderer.clear(), this.renderer.image(this.sampleFramebuffer, 0, 0, this.grid.cols, this.grid.rows)), this._secondaryColorFramebuffer.end(), this._transformFramebuffer.begin(), this.renderer.background(
|
|
1590
1545
|
this.options.invert ? 255 : 0,
|
|
1591
1546
|
this.options.flipHorizontally ? 255 : 0,
|
|
1592
1547
|
this.options.flipVertically ? 255 : 0
|
|
@@ -1602,12 +1557,12 @@ class b extends _ {
|
|
|
1602
1557
|
*
|
|
1603
1558
|
* @param range Array of two numbers `[min, max]`, where `min` is darkest and `max` is brightest.
|
|
1604
1559
|
*/
|
|
1605
|
-
brightnessRange(
|
|
1560
|
+
brightnessRange(e) {
|
|
1606
1561
|
C.validate(
|
|
1607
|
-
Array.isArray(
|
|
1562
|
+
Array.isArray(e) && e.length === 2 && e.every((t) => typeof t == "number" && t >= 0 && t <= 255),
|
|
1608
1563
|
"Brightness range must be an array of two numbers between 0 and 255.",
|
|
1609
|
-
{ method: "brightnessRange", providedValue:
|
|
1610
|
-
) && (this.options.brightnessRange =
|
|
1564
|
+
{ method: "brightnessRange", providedValue: e }
|
|
1565
|
+
) && (this.options.brightnessRange = e);
|
|
1611
1566
|
}
|
|
1612
1567
|
}
|
|
1613
1568
|
const q = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
@@ -1616,41 +1571,43 @@ const q = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
1616
1571
|
TextmodeConverter: p,
|
|
1617
1572
|
TextmodeFeatureConverter: _
|
|
1618
1573
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
1619
|
-
var Z = "precision mediump float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_rotationTexture;uniform sampler2D u_captureTexture;uniform vec2 u_captureDimensions;uniform int u_backgroundMode;uniform vec2 u_gridCellDimensions;uniform vec2 u_gridPixelDimensions;uniform float u_pixelRatio;
|
|
1574
|
+
var Z = "precision mediump float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_rotationTexture;uniform sampler2D u_captureTexture;uniform vec2 u_captureDimensions;uniform int u_backgroundMode;uniform vec2 u_gridCellDimensions;uniform vec2 u_gridPixelDimensions;uniform float u_pixelRatio;void main(){vec2 logicalPos=gl_FragCoord.xy/u_pixelRatio;vec2 gridCoord=(logicalPos/u_gridPixelDimensions)*u_gridCellDimensions;vec2 cellCoord=floor(gridCoord);vec2 texCoord=(cellCoord+0.5)/u_gridCellDimensions;vec4 primaryColor=texture2D(u_primaryColorTexture,texCoord);vec4 secondaryColor=texture2D(u_secondaryColorTexture,texCoord);vec4 transform=texture2D(u_transformTexture,texCoord);vec4 charData=texture2D(u_asciiCharacterTexture,texCoord);if(charData.a<0.01){gl_FragColor=u_backgroundMode==0 ? vec4(0.0):texture2D(u_captureTexture,logicalPos/u_captureDimensions);return;}int charIndex=int(charData.r*255.0+0.5)+int(charData.g*255.0+0.5)*256;vec2 charPos=vec2(mod(float(charIndex),u_charsetDimensions.x),floor(float(charIndex)/u_charsetDimensions.x))/u_charsetDimensions;vec4 rotation=texture2D(u_rotationTexture,texCoord);float angle=((rotation.r*255.0+rotation.g)*360.0/255.0)*0.017453293;vec2 frac=fract(gridCoord)-0.5;frac.x*=transform.g>0.5 ?-1.0 : 1.0;frac.y*=transform.b>0.5 ?-1.0 : 1.0;float s=sin(angle),c=cos(angle);frac=mat2(c,-s,s,c)*frac+0.5;vec2 cellSize=1.0/u_charsetDimensions;vec2 finalTexCoord=charPos+frac*cellSize;if(any(lessThan(frac,vec2(0.0)))||any(greaterThan(frac,vec2(1.0)))){gl_FragColor=transform.r>0.5 ? primaryColor : secondaryColor;}else{vec4 charTexel=texture2D(u_characterTexture,finalTexCoord);float inv=transform.r>0.5 ? 1.0 : 0.0;charTexel.rgb=mix(charTexel.rgb,1.0-charTexel.rgb,inv);gl_FragColor=mix(secondaryColor,primaryColor,charTexel);}}";
|
|
1620
1575
|
class j {
|
|
1621
|
-
constructor(
|
|
1576
|
+
constructor(A, e, t) {
|
|
1622
1577
|
Q(this, "renderer");
|
|
1623
1578
|
Q(this, "font");
|
|
1624
1579
|
Q(this, "grid");
|
|
1625
1580
|
Q(this, "converters");
|
|
1626
1581
|
Q(this, "_resultFramebuffer");
|
|
1627
1582
|
Q(this, "_asciiShader");
|
|
1628
|
-
this.renderer =
|
|
1629
|
-
brightness: new b(
|
|
1583
|
+
this.renderer = A, this.font = e, this.grid = t, this._asciiShader = this.renderer.createShader(P, Z), this.converters = {
|
|
1584
|
+
brightness: new b(A, e, t)
|
|
1630
1585
|
}, this._resultFramebuffer = this.renderer.createFramebuffer(this.grid.width, this.grid.height);
|
|
1631
1586
|
}
|
|
1632
|
-
render(
|
|
1633
|
-
for (const
|
|
1634
|
-
|
|
1635
|
-
this._resultFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this._asciiShader), this.renderer.setUniform("u_characterTexture", this.font.fontFramebuffer), this.renderer.setUniform("u_charsetDimensions", [this.font.textureColumns, this.font.textureRows]), this.renderer.setUniform("u_asciiCharacterTexture", this.converters.brightness.characterFramebuffer.texture), this.renderer.setUniform("u_primaryColorTexture", this.converters.brightness.primaryColorFramebuffer.texture), this.renderer.setUniform("u_secondaryColorTexture", this.converters.brightness.secondaryColorFramebuffer.texture), this.renderer.setUniform("u_transformTexture", this.converters.brightness.transformFramebuffer.texture), this.renderer.setUniform("u_rotationTexture", this.converters.brightness.rotationFramebuffer.texture), this.renderer.setUniform("u_captureTexture",
|
|
1587
|
+
render(A) {
|
|
1588
|
+
for (const r of Object.values(this.converters))
|
|
1589
|
+
r.convert(A);
|
|
1590
|
+
this._resultFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this._asciiShader), this.renderer.setUniform("u_characterTexture", this.font.fontFramebuffer), this.renderer.setUniform("u_charsetDimensions", [this.font.textureColumns, this.font.textureRows]), this.renderer.setUniform("u_asciiCharacterTexture", this.converters.brightness.characterFramebuffer.texture), this.renderer.setUniform("u_primaryColorTexture", this.converters.brightness.primaryColorFramebuffer.texture), this.renderer.setUniform("u_secondaryColorTexture", this.converters.brightness.secondaryColorFramebuffer.texture), this.renderer.setUniform("u_transformTexture", this.converters.brightness.transformFramebuffer.texture), this.renderer.setUniform("u_rotationTexture", this.converters.brightness.rotationFramebuffer.texture), this.renderer.setUniform("u_captureTexture", A.texture), this.renderer.setUniform("u_backgroundMode", !1), this.renderer.setUniform("u_captureDimensions", [A.width, A.height]), this.renderer.setUniform("u_gridCellDimensions", [this.grid.cols, this.grid.rows]), this.renderer.setUniform("u_gridPixelDimensions", [this.grid.width, this.grid.height]);
|
|
1591
|
+
const e = this.renderer.context.canvas, t = e.width / e.offsetWidth;
|
|
1592
|
+
this.renderer.setUniform("u_pixelRatio", t), this.renderer.rect(0, 0, this._resultFramebuffer.width, this._resultFramebuffer.height), this._resultFramebuffer.end();
|
|
1636
1593
|
}
|
|
1637
|
-
get(
|
|
1638
|
-
const
|
|
1639
|
-
if (!
|
|
1640
|
-
throw new Error(`Converter "${
|
|
1641
|
-
return
|
|
1594
|
+
get(A) {
|
|
1595
|
+
const e = this.converters[A];
|
|
1596
|
+
if (!e)
|
|
1597
|
+
throw new Error(`Converter "${A}" not found in pipeline.`);
|
|
1598
|
+
return e;
|
|
1642
1599
|
}
|
|
1643
1600
|
get texture() {
|
|
1644
1601
|
return this._resultFramebuffer;
|
|
1645
1602
|
}
|
|
1646
1603
|
resize() {
|
|
1647
1604
|
this._resultFramebuffer.resize(this.grid.width, this.grid.height);
|
|
1648
|
-
for (const
|
|
1649
|
-
|
|
1605
|
+
for (const A of Object.values(this.converters))
|
|
1606
|
+
A.resize();
|
|
1650
1607
|
}
|
|
1651
1608
|
}
|
|
1652
|
-
class
|
|
1653
|
-
constructor(
|
|
1609
|
+
class f {
|
|
1610
|
+
constructor(A, e = {}) {
|
|
1654
1611
|
/** The canvas element to capture content from */
|
|
1655
1612
|
Q(this, "captureCanvas");
|
|
1656
1613
|
/** Our WebGL overlay canvas manager */
|
|
@@ -1670,7 +1627,7 @@ class d {
|
|
|
1670
1627
|
Q(this, "_frameRate", 0);
|
|
1671
1628
|
Q(this, "lastRenderTime", 0);
|
|
1672
1629
|
Q(this, "_pipeline");
|
|
1673
|
-
this.captureCanvas =
|
|
1630
|
+
this.captureCanvas = A, this.textmodeCanvas = new V(A), this._mode = e.renderMode ?? "auto", this._frameRateLimit = e.frameRate ?? 120, this.frameInterval = 1e3 / this._frameRateLimit, this.renderer = new R(this.textmodeCanvas.getWebGLContext()), this.canvasFramebuffer = this.renderer.createFramebuffer(this.textmodeCanvas.width, this.textmodeCanvas.height), this._font = new k(this.renderer, e.fontSize ?? 16);
|
|
1674
1631
|
}
|
|
1675
1632
|
/**
|
|
1676
1633
|
* Static factory method for creating and initializing a Textmodifier instance.
|
|
@@ -1678,11 +1635,11 @@ class d {
|
|
|
1678
1635
|
* @param opts Optional configuration options for the `Textmodifier` instance.
|
|
1679
1636
|
* @ignore
|
|
1680
1637
|
*/
|
|
1681
|
-
static async create(
|
|
1682
|
-
const t = new
|
|
1638
|
+
static async create(A, e = {}) {
|
|
1639
|
+
const t = new f(A, e);
|
|
1683
1640
|
await t._font.initialize();
|
|
1684
1641
|
const r = t._font.maxGlyphDimensions;
|
|
1685
|
-
return t._grid = new
|
|
1642
|
+
return t._grid = new N(t.captureCanvas, r.width, r.height), t._pipeline = new j(t.renderer, t._font, t._grid), t.setupEventListeners(), t.startAutoRendering(), t;
|
|
1686
1643
|
}
|
|
1687
1644
|
setupEventListeners() {
|
|
1688
1645
|
window.addEventListener("resize", this.resize.bind(this)), window.ResizeObserver && (this.resizeObserver = new ResizeObserver(() => {
|
|
@@ -1693,10 +1650,10 @@ class d {
|
|
|
1693
1650
|
* Update the font used for rendering.
|
|
1694
1651
|
* @param fontUrl The URL of the font to load.
|
|
1695
1652
|
*/
|
|
1696
|
-
async loadFont(
|
|
1697
|
-
return this._font.loadFont(
|
|
1698
|
-
const
|
|
1699
|
-
this._grid.resizeCellPixelDimensions(
|
|
1653
|
+
async loadFont(A) {
|
|
1654
|
+
return this._font.loadFont(A).then(() => {
|
|
1655
|
+
const e = this._font.maxGlyphDimensions;
|
|
1656
|
+
this._grid.resizeCellPixelDimensions(e.width, e.height), this._pipeline.resize();
|
|
1700
1657
|
});
|
|
1701
1658
|
}
|
|
1702
1659
|
/**
|
|
@@ -1709,28 +1666,28 @@ class d {
|
|
|
1709
1666
|
this.measureFrameRate(), this.canvasFramebuffer.update(this.captureCanvas), this._pipeline.render(this.canvasFramebuffer), this.renderer.background(0), this.renderer.image(this._pipeline.texture, this._grid.offsetX, this._grid.offsetY, this._pipeline.texture.width, this._pipeline.texture.height);
|
|
1710
1667
|
}
|
|
1711
1668
|
resize() {
|
|
1712
|
-
this.textmodeCanvas.resize(), this.canvasFramebuffer.resize(this.textmodeCanvas.width, this.textmodeCanvas.height), this._grid.
|
|
1669
|
+
this.textmodeCanvas.resize(), this.canvasFramebuffer.resize(this.textmodeCanvas.width, this.textmodeCanvas.height), this._grid.resize(), this._pipeline.resize(), this.renderer.resetViewport(), this._mode !== "manual" && this.render();
|
|
1713
1670
|
}
|
|
1714
1671
|
/**
|
|
1715
1672
|
* Start automatic rendering
|
|
1716
1673
|
*/
|
|
1717
1674
|
startAutoRendering() {
|
|
1718
1675
|
if (this._mode !== "auto") return;
|
|
1719
|
-
const
|
|
1720
|
-
|
|
1676
|
+
const A = (e) => {
|
|
1677
|
+
e - this.lastFrameTime >= this.frameInterval && (this.render(), this.lastFrameTime = e), this.animationFrameId = requestAnimationFrame(A);
|
|
1721
1678
|
};
|
|
1722
|
-
this.animationFrameId = requestAnimationFrame(
|
|
1679
|
+
this.animationFrameId = requestAnimationFrame(A);
|
|
1723
1680
|
}
|
|
1724
1681
|
/**
|
|
1725
1682
|
* Update FPS measurement - works for both auto and manual modes
|
|
1726
1683
|
*/
|
|
1727
1684
|
measureFrameRate() {
|
|
1728
|
-
const
|
|
1685
|
+
const A = performance.now();
|
|
1729
1686
|
if (this.lastRenderTime > 0) {
|
|
1730
|
-
const
|
|
1731
|
-
this._frameRate = 1e3 /
|
|
1687
|
+
const e = A - this.lastRenderTime;
|
|
1688
|
+
this._frameRate = 1e3 / e;
|
|
1732
1689
|
}
|
|
1733
|
-
this.lastRenderTime =
|
|
1690
|
+
this.lastRenderTime = A;
|
|
1734
1691
|
}
|
|
1735
1692
|
/**
|
|
1736
1693
|
* Stop automatic rendering
|
|
@@ -1741,21 +1698,21 @@ class d {
|
|
|
1741
1698
|
/**
|
|
1742
1699
|
* Change the rendering mode.
|
|
1743
1700
|
*/
|
|
1744
|
-
renderMode(
|
|
1745
|
-
if (this._mode !==
|
|
1746
|
-
if (
|
|
1701
|
+
renderMode(A) {
|
|
1702
|
+
if (this._mode !== A) {
|
|
1703
|
+
if (A === void 0)
|
|
1747
1704
|
return this._mode;
|
|
1748
|
-
this.stopAutoRendering(), this._mode =
|
|
1705
|
+
this.stopAutoRendering(), this._mode = A, A === "auto" && this.startAutoRendering();
|
|
1749
1706
|
}
|
|
1750
1707
|
}
|
|
1751
1708
|
/**
|
|
1752
1709
|
* Set the maximum frame rate for auto rendering. If called without arguments, returns the current measured frame rate.
|
|
1753
1710
|
* @param fps The maximum frames per second for auto rendering.
|
|
1754
1711
|
*/
|
|
1755
|
-
frameRate(
|
|
1756
|
-
if (
|
|
1712
|
+
frameRate(A) {
|
|
1713
|
+
if (A === void 0)
|
|
1757
1714
|
return this._frameRate;
|
|
1758
|
-
this._frameRateLimit =
|
|
1715
|
+
this._frameRateLimit = A, this.frameInterval = 1e3 / A;
|
|
1759
1716
|
}
|
|
1760
1717
|
converter() {
|
|
1761
1718
|
return this._pipeline.get("brightness");
|
|
@@ -1777,43 +1734,43 @@ class d {
|
|
|
1777
1734
|
return this._pipeline;
|
|
1778
1735
|
}
|
|
1779
1736
|
}
|
|
1780
|
-
class
|
|
1737
|
+
class d {
|
|
1781
1738
|
/**
|
|
1782
1739
|
* Create a {@link Textmodifier} instance to apply textmode rendering to a given canvas.
|
|
1783
1740
|
* @param canvas The HTML canvas element to capture content from.
|
|
1784
1741
|
* @param opts Optional configuration options for the Textmodifier instance.
|
|
1785
1742
|
* @returns A Promise that resolves to a Textmodifier instance.
|
|
1786
1743
|
*/
|
|
1787
|
-
static async create(
|
|
1788
|
-
return
|
|
1744
|
+
static async create(A, e = {}) {
|
|
1745
|
+
return f.create(A, e);
|
|
1789
1746
|
}
|
|
1790
1747
|
/**
|
|
1791
1748
|
* Set the global error handling level for the library. This applies to all `Textmodifier` instances.
|
|
1792
1749
|
* @param level The error handling level to set.
|
|
1793
1750
|
*/
|
|
1794
|
-
static setErrorLevel(
|
|
1795
|
-
C.setGlobalLevel(
|
|
1751
|
+
static setErrorLevel(A) {
|
|
1752
|
+
C.setGlobalLevel(A);
|
|
1796
1753
|
}
|
|
1797
1754
|
/**
|
|
1798
1755
|
* The current version of the library.
|
|
1799
1756
|
*/
|
|
1800
1757
|
static get version() {
|
|
1801
|
-
return "0.0.
|
|
1758
|
+
return "0.0.7";
|
|
1802
1759
|
}
|
|
1803
1760
|
constructor() {
|
|
1804
1761
|
throw new Error("Textmode is a static class and cannot be instantiated.");
|
|
1805
1762
|
}
|
|
1806
1763
|
}
|
|
1807
|
-
const AA =
|
|
1764
|
+
const AA = d.create, eA = d.setErrorLevel, tA = d.version;
|
|
1808
1765
|
export {
|
|
1809
|
-
|
|
1766
|
+
V as TextmodeCanvas,
|
|
1810
1767
|
q as TextmodeConverters,
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1768
|
+
M as TextmodeErrorLevel,
|
|
1769
|
+
k as TextmodeFont,
|
|
1770
|
+
N as TextmodeGrid,
|
|
1771
|
+
f as Textmodifier,
|
|
1815
1772
|
AA as create,
|
|
1816
1773
|
eA as setErrorLevel,
|
|
1817
|
-
|
|
1774
|
+
d as textmode,
|
|
1818
1775
|
tA as version
|
|
1819
1776
|
};
|