textmode.js 0.0.1

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.
@@ -0,0 +1,1381 @@
1
+ var _ = Object.defineProperty;
2
+ var x = (h, A, t) => A in h ? _(h, A, { enumerable: !0, configurable: !0, writable: !0, value: t }) : h[A] = t;
3
+ var E = (h, A, t) => x(h, typeof A != "symbol" ? A + "" : A, t);
4
+ class v {
5
+ constructor() {
6
+ E(this, "bin");
7
+ this.bin = this.createBinaryReader();
8
+ }
9
+ /**
10
+ * Parse a font buffer and return font data
11
+ */
12
+ parse(A) {
13
+ const t = new Uint8Array(A);
14
+ let B = 0;
15
+ if (this.bin.readASCII(t, B, 4) === "ttcf") {
16
+ const r = this.bin.readUint(t, B + 8);
17
+ B += 12;
18
+ const Q = [];
19
+ for (let g = 0; g < r; g++) {
20
+ const i = this.bin.readUint(t, B);
21
+ B += 4, Q.push(this.readFont(t, g, i));
22
+ }
23
+ return Q;
24
+ } else
25
+ return [this.readFont(t, 0, 0)];
26
+ }
27
+ /**
28
+ * Find a table in the font data
29
+ */
30
+ findTable(A, t, B) {
31
+ const e = this.bin.readUshort(A, B + 4);
32
+ let r = B + 12;
33
+ for (let Q = 0; Q < e; Q++) {
34
+ const g = this.bin.readASCII(A, r, 4), i = this.bin.readUint(A, r + 8), s = this.bin.readUint(A, r + 12);
35
+ if (g === t)
36
+ return [i, s];
37
+ r += 16;
38
+ }
39
+ return null;
40
+ }
41
+ /**
42
+ * Read font data from buffer
43
+ */
44
+ readFont(A, t, B) {
45
+ const e = {
46
+ _data: A,
47
+ _index: t,
48
+ _offset: B
49
+ }, r = /* @__PURE__ */ new Map(), Q = ["cmap", "head", "hhea", "maxp", "hmtx"];
50
+ for (const g of Q) {
51
+ const i = this.findTable(A, g, B);
52
+ if (i) {
53
+ const [s, n] = i;
54
+ let o = r.get(s);
55
+ o || (o = this.parseTable(g, A, s, n, e), r.set(s, o)), e[g] = o;
56
+ }
57
+ }
58
+ return e;
59
+ }
60
+ /**
61
+ * Parse a specific table
62
+ */
63
+ parseTable(A, t, B, e, r) {
64
+ switch (A) {
65
+ case "cmap":
66
+ return this.parseCmapTable(t, B, e);
67
+ case "head":
68
+ return this.parseHeadTable(t, B, e);
69
+ case "hhea":
70
+ return this.parseHheaTable(t, B, e);
71
+ case "hmtx":
72
+ return this.parseHmtxTable(t, B, e, r);
73
+ case "maxp":
74
+ return this.parseMaxpTable(t, B, e);
75
+ default:
76
+ throw new Error(`Unknown table: ${A}`);
77
+ }
78
+ }
79
+ /**
80
+ * Parse cmap table
81
+ */
82
+ parseCmapTable(A, t, B) {
83
+ const e = new Uint8Array(A.buffer, t, B);
84
+ let r = 0;
85
+ r += 2;
86
+ const Q = this.bin.readUshort(e, r);
87
+ r += 2;
88
+ const g = {
89
+ tables: [],
90
+ ids: {},
91
+ off: t
92
+ }, i = /* @__PURE__ */ new Set();
93
+ for (let s = 0; s < Q; s++) {
94
+ const n = this.bin.readUshort(e, r);
95
+ r += 2;
96
+ const o = this.bin.readUshort(e, r);
97
+ r += 2;
98
+ const a = this.bin.readUint(e, r);
99
+ r += 4;
100
+ const C = `p${n}e${o}`;
101
+ if (!i.has(a)) {
102
+ const p = this.bin.readUshort(e, a), b = this.parseCmapSubtable(e, a, p);
103
+ g.tables.push(b), i.add(a);
104
+ }
105
+ g.ids[C] = Array.from(i).indexOf(a);
106
+ }
107
+ return g;
108
+ }
109
+ /**
110
+ * Parse cmap subtable based on format
111
+ */
112
+ parseCmapSubtable(A, t, B) {
113
+ const e = { format: B };
114
+ switch (B) {
115
+ case 0:
116
+ return this.parseCmapFormat0(A, t, e);
117
+ case 4:
118
+ return this.parseCmapFormat4(A, t, e);
119
+ case 6:
120
+ return this.parseCmapFormat6(A, t, e);
121
+ case 12:
122
+ return this.parseCmapFormat12(A, t, e);
123
+ default:
124
+ return e;
125
+ }
126
+ }
127
+ /**
128
+ * Parse cmap format 0
129
+ */
130
+ parseCmapFormat0(A, t, B) {
131
+ let e = t + 2;
132
+ const r = this.bin.readUshort(A, e);
133
+ e += 2, e += 2, B.map = [];
134
+ for (let Q = 0; Q < r - 6; Q++)
135
+ B.map.push(A[e + Q]);
136
+ return B;
137
+ }
138
+ /**
139
+ * Parse cmap format 4
140
+ */
141
+ parseCmapFormat4(A, t, B) {
142
+ const e = t;
143
+ let r = t + 2;
144
+ const Q = this.bin.readUshort(A, r);
145
+ r += 2, r += 2;
146
+ const g = this.bin.readUshort(A, r);
147
+ r += 2;
148
+ const i = g >>> 1;
149
+ B.searchRange = this.bin.readUshort(A, r), r += 2, B.entrySelector = this.bin.readUshort(A, r), r += 2, B.rangeShift = this.bin.readUshort(A, r), r += 2, B.endCount = this.bin.readUshorts(A, r, i), r += i * 2, r += 2, B.startCount = this.bin.readUshorts(A, r, i), r += i * 2, B.idDelta = [];
150
+ for (let s = 0; s < i; s++)
151
+ B.idDelta.push(this.bin.readShort(A, r)), r += 2;
152
+ return B.idRangeOffset = this.bin.readUshorts(A, r, i), r += i * 2, B.glyphIdArray = this.bin.readUshorts(A, r, e + Q - r >> 1), B;
153
+ }
154
+ /**
155
+ * Parse cmap format 6
156
+ */
157
+ parseCmapFormat6(A, t, B) {
158
+ let e = t + 2;
159
+ e += 2, e += 2, B.firstCode = this.bin.readUshort(A, e), e += 2;
160
+ const r = this.bin.readUshort(A, e);
161
+ e += 2, B.glyphIdArray = [];
162
+ for (let Q = 0; Q < r; Q++)
163
+ B.glyphIdArray.push(this.bin.readUshort(A, e)), e += 2;
164
+ return B;
165
+ }
166
+ /**
167
+ * Parse cmap format 12
168
+ */
169
+ parseCmapFormat12(A, t, B) {
170
+ let e = t + 4;
171
+ e += 4, e += 4;
172
+ const r = this.bin.readUint(A, e) * 3;
173
+ e += 4, B.groups = new Uint32Array(r);
174
+ for (let Q = 0; Q < r; Q += 3)
175
+ B.groups[Q] = this.bin.readUint(A, e + (Q << 2)), B.groups[Q + 1] = this.bin.readUint(A, e + (Q << 2) + 4), B.groups[Q + 2] = this.bin.readUint(A, e + (Q << 2) + 8);
176
+ return B;
177
+ }
178
+ /**
179
+ * Parse head table
180
+ */
181
+ parseHeadTable(A, t, B) {
182
+ let e = t;
183
+ return e += 4, {
184
+ fontRevision: this.bin.readFixed(A, e + 0),
185
+ flags: this.bin.readUshort(A, e + 8),
186
+ unitsPerEm: this.bin.readUshort(A, e + 10),
187
+ created: this.bin.readUint64(A, e + 12),
188
+ modified: this.bin.readUint64(A, e + 20),
189
+ xMin: this.bin.readShort(A, e + 28),
190
+ yMin: this.bin.readShort(A, e + 30),
191
+ xMax: this.bin.readShort(A, e + 32),
192
+ yMax: this.bin.readShort(A, e + 34),
193
+ macStyle: this.bin.readUshort(A, e + 36),
194
+ lowestRecPPEM: this.bin.readUshort(A, e + 38),
195
+ fontDirectionHint: this.bin.readShort(A, e + 40),
196
+ indexToLocFormat: this.bin.readShort(A, e + 42),
197
+ glyphDataFormat: this.bin.readShort(A, e + 44)
198
+ };
199
+ }
200
+ /**
201
+ * Parse hhea table
202
+ */
203
+ parseHheaTable(A, t, B) {
204
+ let e = t;
205
+ e += 4;
206
+ const r = [
207
+ "ascender",
208
+ "descender",
209
+ "lineGap",
210
+ "advanceWidthMax",
211
+ "minLeftSideBearing",
212
+ "minRightSideBearing",
213
+ "xMaxExtent",
214
+ "caretSlopeRise",
215
+ "caretSlopeRun",
216
+ "caretOffset",
217
+ "res0",
218
+ "res1",
219
+ "res2",
220
+ "res3",
221
+ "metricDataFormat",
222
+ "numberOfHMetrics"
223
+ ], Q = {};
224
+ for (let g = 0; g < r.length; g++) {
225
+ const i = r[g], n = i === "advanceWidthMax" || i === "numberOfHMetrics" ? this.bin.readUshort : this.bin.readShort;
226
+ Q[i] = n(A, e + g * 2);
227
+ }
228
+ return Q;
229
+ }
230
+ /**
231
+ * Parse hmtx table
232
+ */
233
+ parseHmtxTable(A, t, B, e) {
234
+ const r = e.maxp.numGlyphs, Q = e.hhea.numberOfHMetrics, g = [], i = [];
235
+ let s = t, n = 0, o = 0;
236
+ for (let a = 0; a < Q; a++)
237
+ n = this.bin.readUshort(A, s), o = this.bin.readShort(A, s + 2), g.push(n), i.push(o), s += 4;
238
+ for (let a = Q; a < r; a++)
239
+ g.push(n), i.push(o);
240
+ return { aWidth: g, lsBearing: i };
241
+ }
242
+ /**
243
+ * Parse maxp table
244
+ */
245
+ parseMaxpTable(A, t, B) {
246
+ let e = t;
247
+ e += 4;
248
+ const r = this.bin.readUshort(A, e);
249
+ return e += 2, { numGlyphs: r };
250
+ }
251
+ /**
252
+ * Create optimized binary reader
253
+ */
254
+ createBinaryReader() {
255
+ const A = new ArrayBuffer(8), t = {
256
+ buff: A,
257
+ int8: new Int8Array(A),
258
+ uint8: new Uint8Array(A),
259
+ int16: new Int16Array(A),
260
+ uint16: new Uint16Array(A),
261
+ int32: new Int32Array(A),
262
+ uint32: new Uint32Array(A)
263
+ };
264
+ return {
265
+ readFixed: (B, e) => (B[e] << 8 | B[e + 1]) + (B[e + 2] << 8 | B[e + 3]) / (256 * 256 + 4),
266
+ readInt: (B, e) => (t.uint8[0] = B[e + 3], t.uint8[1] = B[e + 2], t.uint8[2] = B[e + 1], t.uint8[3] = B[e], t.int32[0]),
267
+ readShort: (B, e) => (t.uint16[0] = B[e] << 8 | B[e + 1], t.int16[0]),
268
+ readUshort: (B, e) => B[e] << 8 | B[e + 1],
269
+ readUshorts: (B, e, r) => {
270
+ const Q = new Array(r);
271
+ for (let g = 0; g < r; g++)
272
+ Q[g] = B[e + g * 2] << 8 | B[e + g * 2 + 1];
273
+ return Q;
274
+ },
275
+ readUint: (B, e) => (t.uint8[3] = B[e], t.uint8[2] = B[e + 1], t.uint8[1] = B[e + 2], t.uint8[0] = B[e + 3], t.uint32[0]),
276
+ readUint64: (B, e) => {
277
+ const r = t.uint32[0] = B[e] << 24 | B[e + 1] << 16 | B[e + 2] << 8 | B[e + 3], Q = t.uint32[0] = B[e + 4] << 24 | B[e + 5] << 16 | B[e + 6] << 8 | B[e + 7];
278
+ return r * 4294967296 + Q;
279
+ },
280
+ readASCII: (B, e, r) => {
281
+ let Q = "";
282
+ for (let g = 0; g < r; g++)
283
+ Q += String.fromCharCode(B[e + g]);
284
+ return Q;
285
+ },
286
+ t
287
+ };
288
+ }
289
+ }
290
+ const f = new v(), w = {
291
+ parse: (h) => f.parse(h),
292
+ findTable: (h, A, t) => f.findTable(h, A, t)
293
+ }, F = `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
294
+ `;
295
+ class c extends Error {
296
+ constructor(t, B, e = {}) {
297
+ super(t);
298
+ E(this, "originalError");
299
+ E(this, "context");
300
+ this.name = "TextmodeError", this.originalError = B, this.context = e;
301
+ }
302
+ /**
303
+ * Returns a formatted error message with context for console output
304
+ */
305
+ getFormattedMessage() {
306
+ let t = this.message;
307
+ if (this.context && Object.keys(this.context).length > 0) {
308
+ t += `
309
+
310
+ 📋 Context:`;
311
+ for (const [B, e] of Object.entries(this.context))
312
+ t += `
313
+ • ${B}: ${JSON.stringify(e)}`;
314
+ }
315
+ return this.originalError && (t += `
316
+
317
+ 🔗 Original Error: ${this.originalError.message}`), t;
318
+ }
319
+ }
320
+ const l = {
321
+ /**
322
+ * Suppress all error output.
323
+ * Validation failures are handled silently without any console messages.
324
+ */
325
+ SILENT: 0,
326
+ /**
327
+ * Log validation failures as warnings.
328
+ * Execution continues normally, but issues are reported to the console.
329
+ */
330
+ WARNING: 1,
331
+ /**
332
+ * Log validation failures as errors.
333
+ * Execution continues, but errors are prominently displayed in the console.
334
+ */
335
+ ERROR: 2,
336
+ /**
337
+ * Throw exceptions on validation failures.
338
+ * Stops execution immediately when errors occur (default behavior).
339
+ */
340
+ THROW: 3
341
+ }, D = class D {
342
+ constructor() {
343
+ E(this, "_options", {
344
+ globalLevel: l.THROW,
345
+ consolePrefix: "[textmode.js]"
346
+ });
347
+ }
348
+ static getInstance() {
349
+ return D._instance || (D._instance = new D()), D._instance;
350
+ }
351
+ /**
352
+ * Handle an error based on the configured settings
353
+ * @returns true if execution should continue, false if error was handled
354
+ */
355
+ _handle(A, t, B) {
356
+ const e = this._options.consolePrefix;
357
+ switch (this._options.globalLevel) {
358
+ case l.SILENT:
359
+ return !1;
360
+ // Validation failed, handled silently
361
+ case l.WARNING:
362
+ return console.warn(`${this._options.consolePrefix} ${A}`, t), !1;
363
+ // Validation failed, warning logged
364
+ case l.ERROR:
365
+ return console.error(`${this._options.consolePrefix} ${A}`, t), !1;
366
+ // Validation failed, error logged
367
+ case l.THROW:
368
+ default:
369
+ const r = new c(A, B, t);
370
+ throw console.group(
371
+ `%c${e} 💥 Oops! Something went wrong in your code.`,
372
+ "color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;"
373
+ ), console.error(r.getFormattedMessage()), console.groupEnd(), r;
374
+ }
375
+ }
376
+ /**
377
+ * Validate a condition and handle errors if validation fails
378
+ * @param condition The condition to validate
379
+ * @param message Error message if validation fails
380
+ * @param context Additional context for debugging
381
+ * @returns true if validation passed, false if validation failed and was handled
382
+ */
383
+ validate(A, t, B) {
384
+ return A ? !0 : (this._handle(t, B), !1);
385
+ }
386
+ /**
387
+ * Set global error level
388
+ */
389
+ setGlobalLevel(A) {
390
+ this._options.globalLevel = A;
391
+ }
392
+ };
393
+ E(D, "_instance", null);
394
+ let u = D;
395
+ const d = u.getInstance();
396
+ class G {
397
+ /**
398
+ * Creates a new FontManager instance
399
+ * @param renderer Renderer instance for texture creation
400
+ * @param fontSize Font size to use for the texture atlas
401
+ */
402
+ constructor(A, t = 16) {
403
+ E(this, "_font");
404
+ E(this, "_characters", []);
405
+ E(this, "_fontFramebuffer");
406
+ E(this, "_textureCanvas");
407
+ E(this, "_textureContext");
408
+ E(this, "_fontSize", 16);
409
+ E(this, "_textureColumns", 0);
410
+ E(this, "_textureRows", 0);
411
+ E(this, "_maxGlyphDimensions", { width: 0, height: 0 });
412
+ E(this, "_renderer");
413
+ E(this, "_fontFace");
414
+ E(this, "_fontFamilyName", "UrsaFont");
415
+ this._renderer = A, this._fontSize = t, this._textureCanvas = document.createElement("canvas"), this._textureContext = this._textureCanvas.getContext("2d");
416
+ }
417
+ /**
418
+ * Initializes the font manager by loading the font and creating the texture atlas
419
+ * @returns Promise that resolves when initialization is complete
420
+ */
421
+ async initialize() {
422
+ const t = await (await fetch(F)).arrayBuffer();
423
+ this._fontFace = new FontFace(this._fontFamilyName, t), await this._fontFace.load(), document.fonts.add(this._fontFace), this._font = w.parse(t)[0], this._initializeCharacters(), this._calculateMaxGlyphDimensions(), await this._createTextureAtlas();
424
+ }
425
+ /**
426
+ * Initializes the characters array from the font's cmap table
427
+ */
428
+ _initializeCharacters() {
429
+ const A = [], t = /* @__PURE__ */ new Map();
430
+ this._font && this._font.cmap && this._font.cmap.tables && this._font.cmap.tables.forEach((r) => {
431
+ if (r.format === 4 && r.startCount && r.endCount && r.idRangeOffset && r.idDelta)
432
+ for (let Q = 0; Q < r.startCount.length; Q++) {
433
+ const g = r.startCount[Q], i = r.endCount[Q];
434
+ if (!(g === 65535 && i === 65535))
435
+ for (let s = g; s <= i; s++) {
436
+ const n = String.fromCodePoint(s);
437
+ let o = 0;
438
+ if (r.idRangeOffset[Q] === 0)
439
+ o = s + r.idDelta[Q] & 65535;
440
+ else {
441
+ const a = r.idRangeOffset[Q] / 2 + (s - r.startCount[Q]) - (r.startCount.length - Q);
442
+ if (a >= 0 && r.glyphIdArray && a < r.glyphIdArray.length) {
443
+ const C = r.glyphIdArray[a];
444
+ C !== 0 && (o = C + r.idDelta[Q] & 65535);
445
+ }
446
+ }
447
+ o && o > 0 && (A.push(n), t.set(n, o));
448
+ }
449
+ }
450
+ else if (r.format === 12 && r.groups)
451
+ for (let Q = 0; Q < r.groups.length; Q += 3) {
452
+ const g = r.groups[Q], i = r.groups[Q + 1], s = r.groups[Q + 2];
453
+ for (let n = g; n <= i; n++) {
454
+ const o = String.fromCodePoint(n), a = s + (n - g);
455
+ a > 0 && (A.push(o), t.set(o, a));
456
+ }
457
+ }
458
+ });
459
+ const e = [...new Set(A)].filter((r) => {
460
+ const Q = r.codePointAt(0) || 0;
461
+ return !(Q >= 0 && Q <= 31 && Q !== 9 && Q !== 10 && Q !== 13 || Q >= 127 && Q <= 159);
462
+ });
463
+ this._characters = e.map((r, Q) => {
464
+ const g = r.codePointAt(0) || 0, i = Q % 256, s = Math.floor(Q / 256) % 256, n = Math.floor(Q / 65536) % 256;
465
+ return {
466
+ character: r,
467
+ unicode: g,
468
+ color: [i, s, n]
469
+ };
470
+ });
471
+ }
472
+ /**
473
+ * Calculates the maximum glyph dimensions for the given font size
474
+ */
475
+ _calculateMaxGlyphDimensions() {
476
+ if (this._fontFace && this._fontFace.status !== "loaded") {
477
+ this._maxGlyphDimensions = { width: this._fontSize, height: this._fontSize };
478
+ return;
479
+ }
480
+ this._textureContext.font = `${this._fontSize}px ${this._fontFamilyName}`;
481
+ let A = 0, t = 0;
482
+ for (const { character: B } of this._characters) {
483
+ const e = this._textureContext.measureText(B), r = e.width, Q = e.actualBoundingBoxAscent !== void 0 && e.actualBoundingBoxDescent !== void 0 ? e.actualBoundingBoxAscent + e.actualBoundingBoxDescent : this._fontSize;
484
+ r > 0 && (A = Math.max(A, r), t = Math.max(t, Q));
485
+ }
486
+ this._maxGlyphDimensions = {
487
+ width: Math.ceil(A),
488
+ height: Math.ceil(t)
489
+ };
490
+ }
491
+ /**
492
+ * Creates the texture atlas containing all characters
493
+ */
494
+ async _createTextureAtlas() {
495
+ const A = this._characters.length;
496
+ this._textureColumns = Math.ceil(Math.sqrt(A)), this._textureRows = Math.ceil(A / this._textureColumns);
497
+ const t = this._maxGlyphDimensions.width * this._textureColumns, B = this._maxGlyphDimensions.height * this._textureRows;
498
+ this._textureCanvas.width = t, this._textureCanvas.height = B, this._textureCanvas.style.imageRendering = "pixelated", this._textureContext.imageSmoothingEnabled = !1, this._textureContext.fillStyle = "black", this._textureContext.fillRect(0, 0, t, B), this._textureContext.font = `${this._fontSize}px ${this._fontFamilyName}`, this._textureContext.textBaseline = "top", this._textureContext.textAlign = "left", this._textureContext.fillStyle = "white";
499
+ for (let e = 0; e < this._characters.length; e++) {
500
+ const r = e % this._textureColumns, Q = Math.floor(e / this._textureColumns), g = r * this._maxGlyphDimensions.width + this._maxGlyphDimensions.width / 2, i = Q * this._maxGlyphDimensions.height + this._maxGlyphDimensions.height / 2, s = this._characters[e].character, n = g - this.maxGlyphDimensions.width / 2, o = i - this._fontSize / 2;
501
+ this._textureContext.fillText(s, n, o);
502
+ }
503
+ this._fontFramebuffer = this._renderer.createFramebuffer(this._textureCanvas.width, this._textureCanvas.height), this._fontFramebuffer.update(this._textureCanvas);
504
+ }
505
+ getCharacterColor(A) {
506
+ if (!d.validate(
507
+ typeof A == "string" && A.length === 1,
508
+ "Character must be a single character string.",
509
+ { providedValue: A, method: "getCharacterColor" }
510
+ ))
511
+ return [0, 0, 0];
512
+ const B = this._characters.find((e) => e.character === A);
513
+ return B ? B.color : [0, 0, 0];
514
+ }
515
+ getCharacterColors(A) {
516
+ return d.validate(
517
+ typeof A == "string" && A.length > 0,
518
+ "Characters must be a string with at least one character.",
519
+ { providedValue: A, method: "getCharacterColors" }
520
+ ) ? A.split("").map((B) => this.getCharacterColor(B) || [0, 0, 0]) : [[0, 0, 0]];
521
+ }
522
+ /**
523
+ * Updates the font by loading a new font file and regenerating all related properties
524
+ * @param fontPath Path to the .otf or .ttf font file
525
+ * @param fontSize Optional new font size (defaults to current fontSize)
526
+ * @returns Promise that resolves when font update is complete
527
+ */
528
+ async loadFont(A) {
529
+ try {
530
+ const t = await fetch(A);
531
+ if (!t.ok)
532
+ throw new c(`Failed to load font file: ${t.status} ${t.statusText}`);
533
+ const B = await t.arrayBuffer(), e = Date.now();
534
+ this._fontFamilyName = `CustomFont_${e}`, this._fontFace = new FontFace(this._fontFamilyName, B), await this._fontFace.load(), document.fonts.add(this._fontFace);
535
+ const r = w.parse(B);
536
+ if (!r || r.length === 0)
537
+ throw new Error("Failed to parse font file");
538
+ this._font = r[0], this._initializeCharacters(), this._calculateMaxGlyphDimensions(), await this._createTextureAtlas();
539
+ } catch (t) {
540
+ throw new c(`Failed to load font: ${t instanceof Error ? t.message : "Unknown error"}`, t);
541
+ }
542
+ }
543
+ // Getters
544
+ get fontFramebuffer() {
545
+ return this._fontFramebuffer;
546
+ }
547
+ get textureWidth() {
548
+ return this._textureCanvas.width;
549
+ }
550
+ get textureHeight() {
551
+ return this._textureCanvas.height;
552
+ }
553
+ get textureCanvas() {
554
+ return this._textureCanvas;
555
+ }
556
+ get characters() {
557
+ return this._characters;
558
+ }
559
+ get charactersString() {
560
+ return this._characters.map((A) => A.character).join("");
561
+ }
562
+ get textureColumns() {
563
+ return this._textureColumns;
564
+ }
565
+ get textureRows() {
566
+ return this._textureRows;
567
+ }
568
+ get maxGlyphDimensions() {
569
+ return this._maxGlyphDimensions;
570
+ }
571
+ get fontSize() {
572
+ return this._fontSize;
573
+ }
574
+ get textureDimensions() {
575
+ return {
576
+ width: this._textureCanvas.width,
577
+ height: this._textureCanvas.height
578
+ };
579
+ }
580
+ }
581
+ class y {
582
+ constructor(A, t, B, e = {}) {
583
+ E(this, "gl");
584
+ E(this, "_framebuffer");
585
+ E(this, "_texture");
586
+ E(this, "_width");
587
+ E(this, "_height");
588
+ E(this, "options");
589
+ E(this, "previousFramebuffer", null);
590
+ E(this, "previousViewport", [0, 0, 0, 0]);
591
+ this.gl = A, this._width = t, this._height = B, this.options = {
592
+ filter: "nearest",
593
+ wrap: "clamp",
594
+ format: "rgba",
595
+ type: "unsigned_byte",
596
+ ...e
597
+ }, this._texture = this.createTexture(), this._framebuffer = this.gl.createFramebuffer(), this.attachTexture();
598
+ }
599
+ createTexture() {
600
+ const A = this.gl.createTexture();
601
+ this.gl.bindTexture(this.gl.TEXTURE_2D, A);
602
+ const t = this.options.filter === "linear" ? this.gl.LINEAR : this.gl.NEAREST, B = this.options.wrap === "repeat" ? this.gl.REPEAT : this.gl.CLAMP_TO_EDGE;
603
+ this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, t), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, t), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, B), this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, B);
604
+ const e = this.options.format === "rgb" ? this.gl.RGB : this.gl.RGBA, r = this.options.type === "float" ? this.gl.FLOAT : this.gl.UNSIGNED_BYTE;
605
+ return this.gl.texImage2D(
606
+ this.gl.TEXTURE_2D,
607
+ 0,
608
+ e,
609
+ this._width,
610
+ this._height,
611
+ 0,
612
+ e,
613
+ r,
614
+ null
615
+ ), this.gl.bindTexture(this.gl.TEXTURE_2D, null), A;
616
+ }
617
+ attachTexture() {
618
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this._framebuffer), this.gl.framebufferTexture2D(
619
+ this.gl.FRAMEBUFFER,
620
+ this.gl.COLOR_ATTACHMENT0,
621
+ this.gl.TEXTURE_2D,
622
+ this._texture,
623
+ 0
624
+ ), this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);
625
+ }
626
+ /**
627
+ * Update the framebuffer texture with canvas content
628
+ */
629
+ update(A) {
630
+ this.gl.bindTexture(this.gl.TEXTURE_2D, this._texture), this.gl.texImage2D(
631
+ this.gl.TEXTURE_2D,
632
+ 0,
633
+ this.gl.RGBA,
634
+ this.gl.RGBA,
635
+ this.gl.UNSIGNED_BYTE,
636
+ A
637
+ ), this.gl.bindTexture(this.gl.TEXTURE_2D, null);
638
+ }
639
+ /**
640
+ * Resize the framebuffer
641
+ */
642
+ resize(A, t) {
643
+ this._width = A, this._height = t, this.gl.bindTexture(this.gl.TEXTURE_2D, this._texture);
644
+ const B = this.options.format === "rgb" ? this.gl.RGB : this.gl.RGBA, e = this.options.type === "float" ? this.gl.FLOAT : this.gl.UNSIGNED_BYTE;
645
+ this.gl.texImage2D(
646
+ this.gl.TEXTURE_2D,
647
+ 0,
648
+ B,
649
+ this._width,
650
+ this._height,
651
+ 0,
652
+ B,
653
+ e,
654
+ null
655
+ );
656
+ }
657
+ /**
658
+ * Begin rendering to this framebuffer (p5.js-like API)
659
+ */
660
+ begin() {
661
+ this.previousFramebuffer = this.gl.getParameter(this.gl.FRAMEBUFFER_BINDING), this.previousViewport = this.gl.getParameter(this.gl.VIEWPORT), this.bind();
662
+ }
663
+ /**
664
+ * End rendering to this framebuffer and restore previous state (p5.js-like API)
665
+ */
666
+ end() {
667
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this.previousFramebuffer), this.gl.viewport(
668
+ this.previousViewport[0],
669
+ this.previousViewport[1],
670
+ this.previousViewport[2],
671
+ this.previousViewport[3]
672
+ );
673
+ }
674
+ /**
675
+ * Bind this framebuffer for rendering
676
+ */
677
+ bind() {
678
+ this.gl.bindFramebuffer(this.gl.FRAMEBUFFER, this._framebuffer), this.gl.viewport(0, 0, this._width, this._height);
679
+ }
680
+ // Getters
681
+ get framebuffer() {
682
+ return this._framebuffer;
683
+ }
684
+ get texture() {
685
+ return this._texture;
686
+ }
687
+ get width() {
688
+ return this._width;
689
+ }
690
+ get height() {
691
+ return this._height;
692
+ }
693
+ }
694
+ class M {
695
+ constructor(A, t, B, e, r) {
696
+ /** The WebGL rendering context */
697
+ E(this, "gl");
698
+ /** The buffer containing the rectangle vertices */
699
+ E(this, "buffer");
700
+ /** The number of vertices in the rectangle */
701
+ E(this, "numVertices");
702
+ this.gl = A;
703
+ const Q = A.getParameter(A.VIEWPORT), g = Q[2], i = Q[3];
704
+ if (g <= 0 || i <= 0)
705
+ throw new Error(`Invalid viewport dimensions: ${g}x${i}`);
706
+ const s = t / g * 2 - 1, n = 1 - B / i * 2, o = (t + e) / g * 2 - 1, a = 1 - (B + r) / i * 2;
707
+ (s < -1 || s > 1 || o < -1 || o > 1 || n < -1 || n > 1 || a < -1 || a > 1) && console.warn(`Rectangle coordinates outside NDC range: x1=${s}, y1=${n}, x2=${o}, y2=${a}`);
708
+ const C = A.getParameter(A.FRAMEBUFFER_BINDING) !== null ? new Float32Array([
709
+ s,
710
+ a,
711
+ 0,
712
+ 0,
713
+ // bottom-left
714
+ o,
715
+ a,
716
+ 1,
717
+ 0,
718
+ // bottom-right
719
+ s,
720
+ n,
721
+ 0,
722
+ 1,
723
+ // top-left
724
+ s,
725
+ n,
726
+ 0,
727
+ 1,
728
+ // top-left
729
+ o,
730
+ a,
731
+ 1,
732
+ 0,
733
+ // bottom-right
734
+ o,
735
+ n,
736
+ 1,
737
+ 1
738
+ // top-right
739
+ ]) : new Float32Array([
740
+ s,
741
+ a,
742
+ 0,
743
+ 1,
744
+ // bottom-left
745
+ o,
746
+ a,
747
+ 1,
748
+ 1,
749
+ // bottom-right
750
+ s,
751
+ n,
752
+ 0,
753
+ 0,
754
+ // top-left
755
+ s,
756
+ n,
757
+ 0,
758
+ 0,
759
+ // top-left
760
+ o,
761
+ a,
762
+ 1,
763
+ 1,
764
+ // bottom-right
765
+ o,
766
+ n,
767
+ 1,
768
+ 0
769
+ // top-right
770
+ ]);
771
+ this.numVertices = 6, this.buffer = A.createBuffer(), A.bindBuffer(A.ARRAY_BUFFER, this.buffer), A.bufferData(A.ARRAY_BUFFER, C, A.STATIC_DRAW);
772
+ }
773
+ /**
774
+ * Draw the quad using attribute locations from the current shader
775
+ */
776
+ draw() {
777
+ this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.buffer);
778
+ let A = 0, t = 1;
779
+ this.gl.enableVertexAttribArray(A), this.gl.vertexAttribPointer(A, 2, this.gl.FLOAT, !1, 16, 0), this.gl.enableVertexAttribArray(t), this.gl.vertexAttribPointer(t, 2, this.gl.FLOAT, !1, 16, 8), this.gl.drawArrays(this.gl.TRIANGLES, 0, this.numVertices), this.gl.disableVertexAttribArray(A), this.gl.disableVertexAttribArray(t);
780
+ }
781
+ }
782
+ class P {
783
+ constructor(A, t, B) {
784
+ E(this, "gl");
785
+ E(this, "program");
786
+ E(this, "uniformLocations", /* @__PURE__ */ new Map());
787
+ E(this, "attributeLocations", /* @__PURE__ */ new Map());
788
+ E(this, "textureUnitCounter", 0);
789
+ this.gl = A, this.program = this.createProgram(t, B), this.cacheLocations();
790
+ }
791
+ createProgram(A, t) {
792
+ const B = this.createShader(this.gl.VERTEX_SHADER, A), e = this.createShader(this.gl.FRAGMENT_SHADER, t), r = this.gl.createProgram();
793
+ if (this.gl.attachShader(r, B), this.gl.attachShader(r, e), this.gl.linkProgram(r), !this.gl.getProgramParameter(r, this.gl.LINK_STATUS)) {
794
+ const Q = this.gl.getProgramInfoLog(r);
795
+ throw new Error(`Shader program link error: ${Q}`);
796
+ }
797
+ return this.gl.deleteShader(B), this.gl.deleteShader(e), r;
798
+ }
799
+ createShader(A, t) {
800
+ const B = this.gl.createShader(A);
801
+ return this.gl.shaderSource(B, t), this.gl.compileShader(B), B;
802
+ }
803
+ cacheLocations() {
804
+ const A = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_UNIFORMS);
805
+ for (let B = 0; B < A; B++) {
806
+ const e = this.gl.getActiveUniform(this.program, B);
807
+ if (e) {
808
+ const r = this.gl.getUniformLocation(this.program, e.name);
809
+ r && this.uniformLocations.set(e.name, r);
810
+ }
811
+ }
812
+ const t = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_ATTRIBUTES);
813
+ for (let B = 0; B < t; B++) {
814
+ const e = this.gl.getActiveAttrib(this.program, B);
815
+ if (e) {
816
+ const r = this.gl.getAttribLocation(this.program, e.name);
817
+ this.attributeLocations.set(e.name, r);
818
+ }
819
+ }
820
+ }
821
+ /**
822
+ * Use this shader program
823
+ */
824
+ use() {
825
+ this.gl.useProgram(this.program), this.resetTextureUnits();
826
+ }
827
+ /**
828
+ * Set a single uniform value with automatic texture unit management
829
+ */
830
+ setUniform(A, t) {
831
+ const B = this.uniformLocations.get(A);
832
+ if (typeof t == "number")
833
+ this.gl.uniform1f(B, t);
834
+ else if (typeof t == "boolean")
835
+ this.gl.uniform1i(B, t ? 1 : 0);
836
+ else if (Array.isArray(t))
837
+ switch (t.length) {
838
+ case 2:
839
+ this.gl.uniform2f(B, t[0], t[1]);
840
+ break;
841
+ case 3:
842
+ this.gl.uniform3f(B, t[0], t[1], t[2]);
843
+ break;
844
+ case 4:
845
+ this.gl.uniform4f(B, t[0], t[1], t[2], t[3]);
846
+ break;
847
+ default:
848
+ console.warn(`Unsupported array length ${t.length} for uniform '${A}'`);
849
+ }
850
+ else if (t instanceof WebGLTexture) {
851
+ const e = this.getNextTextureUnit();
852
+ this.gl.uniform1i(B, e), this.gl.activeTexture(this.gl.TEXTURE0 + e), this.gl.bindTexture(this.gl.TEXTURE_2D, t);
853
+ } else if (t && typeof t == "object" && "texture" in t) {
854
+ const e = this.getNextTextureUnit();
855
+ this.gl.uniform1i(B, e), this.gl.activeTexture(this.gl.TEXTURE0 + e), this.gl.bindTexture(this.gl.TEXTURE_2D, t.texture);
856
+ } else
857
+ console.warn(`Unsupported uniform type for '${A}':`, typeof t);
858
+ }
859
+ getNextTextureUnit() {
860
+ return this.textureUnitCounter++;
861
+ }
862
+ /**
863
+ * Reset texture unit counter (useful when starting a new frame)
864
+ */
865
+ resetTextureUnits() {
866
+ this.textureUnitCounter = 0;
867
+ }
868
+ }
869
+ var I = "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);}";
870
+ class T {
871
+ constructor(A) {
872
+ E(this, "gl");
873
+ E(this, "imageShader");
874
+ E(this, "currentShader", null);
875
+ this.gl = A, this.imageShader = new P(this.gl, I, U), this.setupDefaultState();
876
+ }
877
+ setupDefaultState() {
878
+ this.gl.enable(this.gl.BLEND), this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA), this.gl.disable(this.gl.DEPTH_TEST);
879
+ }
880
+ /**
881
+ * Set the current shader (p5.js-like API)
882
+ */
883
+ shader(A) {
884
+ this.currentShader = A, A.use();
885
+ }
886
+ /**
887
+ * Set a uniform value for the current shader (p5.js-like API)
888
+ */
889
+ setUniform(A, t) {
890
+ this.currentShader.setUniform(A, t);
891
+ }
892
+ /**
893
+ * Draw a rectangle with the current shader (p5.js-like API)
894
+ */
895
+ rect(A, t, B, e) {
896
+ new M(this.gl, A, t, B, e).draw();
897
+ }
898
+ /**
899
+ * Create a new framebuffer
900
+ */
901
+ createFramebuffer(A, t, B = {}) {
902
+ return new y(this.gl, A, t, B);
903
+ }
904
+ /**
905
+ * Fill the current framebuffer with a solid color (p5.js-like API)
906
+ */
907
+ background(A, t = A, B = A, e = 1) {
908
+ this.clear(A / 255, t / 255, B / 255, e);
909
+ }
910
+ /**
911
+ * Clear the current framebuffer
912
+ */
913
+ clear(A = 0, t = 0, B = 0, e = 0) {
914
+ this.gl.clearColor(A, t, B, e), this.gl.clear(this.gl.COLOR_BUFFER_BIT);
915
+ }
916
+ /**
917
+ * Ensure viewport matches canvas dimensions
918
+ */
919
+ resetViewport() {
920
+ this.gl.viewport(0, 0, this.gl.canvas.width, this.gl.canvas.height);
921
+ }
922
+ /**
923
+ * Get the WebGL context
924
+ */
925
+ get context() {
926
+ return this.gl;
927
+ }
928
+ /**
929
+ * Render a framebuffer at a specific position with optional scaling
930
+ */
931
+ image(A, t, B, e, r) {
932
+ this.shader(this.imageShader), this.setUniform("u_texture", A.texture), this.rect(t, B, e ?? A.width, r ?? A.height);
933
+ }
934
+ }
935
+ class Y {
936
+ /**
937
+ * Create a new grid instance.
938
+ * @param canvas The canvas element used to determine the grid dimensions.
939
+ * @param cellWidth The width of each cell in the grid.
940
+ * @param cellHeight The height of each cell in the grid.
941
+ * @ignore
942
+ */
943
+ constructor(A, t, B) {
944
+ /** The number of columns in the grid. */
945
+ E(this, "_cols");
946
+ /** The number of rows in the grid. */
947
+ E(this, "_rows");
948
+ /** The total width of the grid in pixels. */
949
+ E(this, "_width");
950
+ /** The total height of the grid in pixels. */
951
+ E(this, "_height");
952
+ /** The offset to the outer canvas on the x-axis when centering the grid. */
953
+ E(this, "_offsetX");
954
+ /** The offset to the outer canvas on the y-axis when centering the grid. */
955
+ E(this, "_offsetY");
956
+ /** Whether the grid dimensions are fixed, or responsive based on the canvas dimensions. */
957
+ E(this, "_fixedDimensions", !1);
958
+ /** The canvas element used to determine the grid dimensions. */
959
+ E(this, "_canvas");
960
+ /** The width of each cell in the grid. */
961
+ E(this, "_cellWidth");
962
+ /** The height of each cell in the grid. */
963
+ E(this, "_cellHeight");
964
+ this._canvas = A, this._cellWidth = t, this._cellHeight = B, this.reset();
965
+ }
966
+ /**
967
+ * Reset the grid to the default number of columns and rows based on the current canvas dimensions, and the grid cell dimensions.
968
+ * @ignore
969
+ */
970
+ reset() {
971
+ this._fixedDimensions || ([this._cols, this._rows] = [Math.floor(this._canvas.width / this._cellWidth), Math.floor(this._canvas.height / this._cellHeight)]), this._resizeGrid();
972
+ }
973
+ /**
974
+ * Reset the total grid width & height, and the offset to the outer canvas.
975
+ */
976
+ _resizeGrid() {
977
+ this._width = this._cols * this._cellWidth, this._height = this._rows * this._cellHeight, this._offsetX = Math.floor((this._canvas.width - this._width) / 2), this._offsetY = Math.floor((this._canvas.height - this._height) / 2);
978
+ }
979
+ /**
980
+ * Re-assign the grid cell dimensions and `reset()` the grid.
981
+ * @param newCellWidth The new cell width.
982
+ * @param newCellHeight The new cell height.
983
+ * @ignore
984
+ */
985
+ resizeCellPixelDimensions(A, t) {
986
+ [this._cellWidth, this._cellHeight] = [A, t], this.reset();
987
+ }
988
+ /**
989
+ * Re-assign the grid dimensions and resize the grid.
990
+ *
991
+ * Calling this method makes the grid dimensions fixed, meaning they will not automatically resize based on the canvas dimensions.
992
+ * @param newCols The new number of columns.
993
+ * @param newRows The new number of rows.
994
+ * @ignore
995
+ */
996
+ resizeGridDimensions(A, t) {
997
+ this._fixedDimensions = !0, [this._cols, this._rows] = [A, t], this._resizeGrid();
998
+ }
999
+ /**
1000
+ * Make the grid dimensions flexible again, and `reset()` the grid.
1001
+ * @ignore
1002
+ */
1003
+ resetGridDimensions() {
1004
+ this._fixedDimensions = !1, this.reset();
1005
+ }
1006
+ /**
1007
+ * Update the canvas used by the grid, and reset the grid dimensions.
1008
+ * @param canvas The new canvas element to use for the grid.
1009
+ * @ignore
1010
+ */
1011
+ updateCanvas(A) {
1012
+ this._canvas = A, this._fixedDimensions ? this._resizeGrid() : this.reset();
1013
+ }
1014
+ /**
1015
+ * Returns the width of each cell in the grid.
1016
+ */
1017
+ get cellWidth() {
1018
+ return this._cellWidth;
1019
+ }
1020
+ /**
1021
+ * Returns the height of each cell in the grid.
1022
+ */
1023
+ get cellHeight() {
1024
+ return this._cellHeight;
1025
+ }
1026
+ /**
1027
+ * Returns the number of columns in the grid.
1028
+ */
1029
+ get cols() {
1030
+ return this._cols;
1031
+ }
1032
+ /**
1033
+ * Returns the number of rows in the grid.
1034
+ */
1035
+ get rows() {
1036
+ return this._rows;
1037
+ }
1038
+ /**
1039
+ * Returns the total width of the grid.
1040
+ */
1041
+ get width() {
1042
+ return this._width;
1043
+ }
1044
+ /**
1045
+ * Returns the total height of the grid.
1046
+ */
1047
+ get height() {
1048
+ return this._height;
1049
+ }
1050
+ /**
1051
+ * Returns the offset to the outer canvas borders on the x-axis when centering the grid.
1052
+ */
1053
+ get offsetX() {
1054
+ return this._offsetX;
1055
+ }
1056
+ /**
1057
+ * Returns the offset to the outer canvas borders on the y-axis when centering the grid.
1058
+ */
1059
+ get offsetY() {
1060
+ return this._offsetY;
1061
+ }
1062
+ /**
1063
+ * Returns `true` if the grid dimensions *(columns and rows)* are fixed, or `false` if they are responsive based on the canvas dimensions.
1064
+ */
1065
+ get fixedDimensions() {
1066
+ return this._fixedDimensions;
1067
+ }
1068
+ /**
1069
+ * Sets whether the grid dimensions *(columns and rows)* are fixed or responsive based on the canvas dimensions.
1070
+ * @param value `true` to make the grid dimensions fixed, or `false` to make them responsive.
1071
+ * @ignore
1072
+ */
1073
+ set fixedDimensions(A) {
1074
+ this._fixedDimensions = A;
1075
+ }
1076
+ }
1077
+ class R {
1078
+ constructor(A) {
1079
+ E(this, "webglCanvas");
1080
+ E(this, "captureCanvas");
1081
+ this.captureCanvas = A, this.webglCanvas = this.createOverlayCanvas();
1082
+ }
1083
+ generateUniqueCanvasId() {
1084
+ let A = 0, t = `textmodeCanvas${A}`;
1085
+ for (; document.getElementById(t); )
1086
+ A++, t = `textmodeCanvas${A}`;
1087
+ return t;
1088
+ }
1089
+ createOverlayCanvas() {
1090
+ var r;
1091
+ const A = document.createElement("canvas");
1092
+ A.width = this.captureCanvas.width, A.height = this.captureCanvas.height, A.className = "textmodeCanvas", A.id = this.generateUniqueCanvasId(), A.style.position = "absolute", A.style.pointerEvents = "none";
1093
+ const t = window.getComputedStyle(this.captureCanvas);
1094
+ let B = parseInt(t.zIndex || "0", 10);
1095
+ isNaN(B) && (B = 0), A.style.zIndex = (B + 1).toString();
1096
+ const e = this.captureCanvas.getBoundingClientRect();
1097
+ return A.style.width = e.width + "px", A.style.height = e.height + "px", this.positionOverlayCanvas(A), (r = this.captureCanvas.parentNode) == null || r.insertBefore(A, this.captureCanvas.nextSibling), A;
1098
+ }
1099
+ positionOverlayCanvas(A) {
1100
+ const t = this.captureCanvas.getBoundingClientRect();
1101
+ let B = this.captureCanvas.offsetParent;
1102
+ if (B && B !== document.body) {
1103
+ const e = B.getBoundingClientRect();
1104
+ A.style.top = t.top - e.top + "px", A.style.left = t.left - e.left + "px";
1105
+ } else
1106
+ A.style.top = t.top + window.scrollY + "px", A.style.left = t.left + window.scrollX + "px";
1107
+ }
1108
+ resize() {
1109
+ this.webglCanvas.width = this.captureCanvas.width, this.webglCanvas.height = this.captureCanvas.height;
1110
+ const A = this.captureCanvas.getBoundingClientRect();
1111
+ this.webglCanvas.style.width = A.width + "px", this.webglCanvas.style.height = A.height + "px", this.positionOverlayCanvas(this.webglCanvas);
1112
+ }
1113
+ /**
1114
+ * Get the WebGL context for the overlay canvas
1115
+ */
1116
+ getWebGLContext() {
1117
+ const A = { alpha: !0, premultipliedAlpha: !1, preserveDrawingBuffer: !0 }, t = this.webglCanvas.getContext("webgl2", A) || this.webglCanvas.getContext("webgl", A);
1118
+ if (!t)
1119
+ throw new c("WebGL context could not be created. Ensure your browser supports WebGL.");
1120
+ return t;
1121
+ }
1122
+ // Getters
1123
+ get canvas() {
1124
+ return this.webglCanvas;
1125
+ }
1126
+ get width() {
1127
+ return this.webglCanvas.width;
1128
+ }
1129
+ get height() {
1130
+ return this.webglCanvas.height;
1131
+ }
1132
+ }
1133
+ var S = "precision lowp float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;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;varying vec2 v_uv;mat2 rotate2D(float a){float s=sin(a),c=cos(a);return mat2(c,-s,s,c);}void main(){vec2 screen=v_uv*u_captureDimensions;vec2 cellSize=u_gridPixelDimensions/u_gridCellDimensions;vec2 cell=floor(screen/cellSize);vec2 frac=fract(screen/cellSize);vec2 charUV=(cell+0.5)/u_gridCellDimensions;vec4 charMap=texture2D(u_asciiCharacterTexture,charUV);if(charMap.a<0.01){gl_FragColor=u_backgroundMode==0? vec4(0,0,0,1): texture2D(u_captureTexture,v_uv);return;}vec4 fg=texture2D(u_primaryColorTexture,charUV);vec4 bg=texture2D(u_secondaryColorTexture,charUV);vec4 tf=texture2D(u_transformTexture,charUV);bool inv=tf.r>0.5,flipX=tf.g>0.5,flipY=tf.b>0.5;int idx=int(charMap.r*255.0+0.5)+int(charMap.g*255.0+0.5)*256;int col=int(mod(float(idx),u_charsetDimensions.x));int row=idx/int(u_charsetDimensions.x);vec2 base=vec2(float(col),float(row))/u_charsetDimensions;vec2 cellSz=1.0/u_charsetDimensions;vec2 f=frac;if(flipX)f.x=1.0-f.x;if(flipY)f.y=1.0-f.y;vec4 rot=texture2D(u_rotationTexture,charUV);float angle=((rot.r*255.0+rot.g)*360.0)/255.0*0.01745329252;if(abs(angle)>0.01){f=rotate2D(angle)*(f-0.5)+0.5;}if(f.x<0.0||f.x>1.0||f.y<0.0||f.y>1.0){gl_FragColor=inv ? fg : bg;return;}vec4 charTex=texture2D(u_characterTexture,base+f*cellSz);gl_FragColor=charTex.r>0.5? vec4(inv ? bg.rgb : fg.rgb,1.0): vec4(inv ? fg.rgb : bg.rgb,1.0);}", O = "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;void main(){vec2 cell=floor(gl_FragCoord.xy);vec2 texel=(cell+0.5)/u_gridCellDimensions;gl_FragColor=texture2D(u_sketchTexture,texel);}", z = "precision lowp float;uniform sampler2D u_colorSampleFramebuffer;uniform sampler2D u_charPaletteTexture;uniform vec2 u_charPaletteSize;uniform vec2 u_textureSize;uniform vec2 u_brightnessRange;void main(){vec2 uv=(floor(gl_FragCoord.xy)+0.5)/u_textureSize;vec4 color=texture2D(u_colorSampleFramebuffer,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;if(brightness<u_brightnessRange.x||brightness>u_brightnessRange.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-u_brightnessRange.x)/(u_brightnessRange.y-u_brightnessRange.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);float u=(idx+0.5)/u_charPaletteSize.x;vec3 charColor=texture2D(u_charPaletteTexture,vec2(u,0.0)).rgb;gl_FragColor=vec4(charColor,color.a);}";
1134
+ class H {
1135
+ /**
1136
+ * Create a new color palette instance.
1137
+ * @param renderer The renderer instance.
1138
+ * @param colors The RGB colors to store as [r, g, b] arrays where values are 0-255.
1139
+ */
1140
+ constructor(A, t) {
1141
+ /** The framebuffer used to store the color palette. */
1142
+ E(this, "_framebuffer");
1143
+ E(this, "_renderer");
1144
+ E(this, "_colors");
1145
+ this._renderer = A, this._colors = t;
1146
+ const B = Math.max(this._colors.length, 1);
1147
+ this._framebuffer = this._renderer.createFramebuffer(B, 1, {
1148
+ filter: "nearest",
1149
+ wrap: "clamp",
1150
+ format: "rgba"
1151
+ }), this._updateFramebuffer();
1152
+ }
1153
+ /**
1154
+ * Update the framebuffer with the currently selected colors.
1155
+ */
1156
+ _updateFramebuffer() {
1157
+ if (!this._framebuffer || !this._renderer) return;
1158
+ const A = Math.max(this._colors.length, 1), t = 1;
1159
+ this._framebuffer.width !== A && this._framebuffer.resize(A, t);
1160
+ const B = new Uint8Array(A * t * 4);
1161
+ for (let r = 0; r < A; r++) {
1162
+ const Q = r < this._colors.length ? this._colors[r] : [0, 0, 0], g = r * 4;
1163
+ B[g] = Q[0], B[g + 1] = Q[1], B[g + 2] = Q[2], B[g + 3] = 255;
1164
+ }
1165
+ const e = this._renderer.context;
1166
+ e.bindTexture(e.TEXTURE_2D, this._framebuffer.texture), e.texImage2D(
1167
+ e.TEXTURE_2D,
1168
+ 0,
1169
+ e.RGBA,
1170
+ A,
1171
+ t,
1172
+ 0,
1173
+ e.RGBA,
1174
+ e.UNSIGNED_BYTE,
1175
+ B
1176
+ ), e.bindTexture(e.TEXTURE_2D, null);
1177
+ }
1178
+ /**
1179
+ * Sets the colors of the palette and updates the framebuffer.
1180
+ * @param newColors The new RGB colors to set as [r, g, b] arrays.
1181
+ */
1182
+ setColors(A) {
1183
+ this._colors = A, this._updateFramebuffer();
1184
+ }
1185
+ /**
1186
+ * Get the colors of the palette.
1187
+ */
1188
+ get colors() {
1189
+ return this._colors;
1190
+ }
1191
+ /**
1192
+ * Get the framebuffer containing the colors of the palette.
1193
+ */
1194
+ get framebuffer() {
1195
+ return this._framebuffer;
1196
+ }
1197
+ /**
1198
+ * Get the texture from the framebuffer for use in shaders.
1199
+ */
1200
+ get texture() {
1201
+ return this._framebuffer.texture;
1202
+ }
1203
+ }
1204
+ class L {
1205
+ constructor(A, t, B) {
1206
+ E(this, "renderer");
1207
+ E(this, "fontManager");
1208
+ E(this, "grid");
1209
+ E(this, "_characterFramebuffer");
1210
+ E(this, "_primaryColorFramebuffer");
1211
+ E(this, "_secondaryColorFramebuffer");
1212
+ E(this, "_rotationFramebuffer");
1213
+ E(this, "_transformFramebuffer");
1214
+ this.renderer = A, this.fontManager = t, this.grid = B, 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);
1215
+ }
1216
+ resize() {
1217
+ this._characterFramebuffer.resize(this.grid.cols, this.grid.rows), this._primaryColorFramebuffer.resize(this.grid.cols, this.grid.rows), this._secondaryColorFramebuffer.resize(this.grid.cols, this.grid.rows), this._rotationFramebuffer.resize(this.grid.cols, this.grid.rows), this._transformFramebuffer.resize(this.grid.cols, this.grid.rows);
1218
+ }
1219
+ get characterFramebuffer() {
1220
+ return this._characterFramebuffer;
1221
+ }
1222
+ get primaryColorFramebuffer() {
1223
+ return this._primaryColorFramebuffer;
1224
+ }
1225
+ get secondaryColorFramebuffer() {
1226
+ return this._secondaryColorFramebuffer;
1227
+ }
1228
+ get rotationFramebuffer() {
1229
+ return this._rotationFramebuffer;
1230
+ }
1231
+ get transformFramebuffer() {
1232
+ return this._transformFramebuffer;
1233
+ }
1234
+ }
1235
+ const k = {
1236
+ /** Enable/disable the renderer */
1237
+ enabled: !0,
1238
+ /** Characters used for brightness mapping (from darkest to brightest) */
1239
+ characters: " .:-=+*%@#",
1240
+ /** Color of the ASCII characters. Only used when `characterColorMode` is set to `fixed` */
1241
+ characterColor: [255, 255, 255, 255],
1242
+ /** Character color mode */
1243
+ characterColorMode: "sampled",
1244
+ /** Cell background color. Only used when `characterColorMode` is set to `fixed` */
1245
+ backgroundColor: [0, 0, 0, 255],
1246
+ /** Background color mode */
1247
+ backgroundColorMode: "fixed",
1248
+ /** Swap the cells ASCII character colors with it's cell background colors */
1249
+ invert: !1,
1250
+ /** Rotation angle of all characters in the grid in degrees */
1251
+ rotation: 0,
1252
+ /** Flip the ASCII characters horizontally */
1253
+ flipHorizontally: !1,
1254
+ /** Flip the ASCII characters vertically */
1255
+ flipVertically: !1,
1256
+ /** Range of brightness values to map to ASCII characters */
1257
+ brightnessRange: [0, 255]
1258
+ };
1259
+ class N extends L {
1260
+ constructor(t, B, e) {
1261
+ super(t, B, e);
1262
+ E(this, "sampleShader");
1263
+ E(this, "charMappingShader");
1264
+ E(this, "sampleFramebuffer");
1265
+ E(this, "palette");
1266
+ E(this, "options");
1267
+ this.options = {
1268
+ ...k
1269
+ }, this.sampleShader = new P(t.context, I, O), this.charMappingShader = new P(t.context, I, z), this.sampleFramebuffer = this.renderer.createFramebuffer(this.grid.cols, this.grid.rows, {
1270
+ filter: "nearest",
1271
+ wrap: "clamp",
1272
+ format: "rgba"
1273
+ }), this.palette = new H(this.renderer, this.fontManager.getCharacterColors("0123456789"));
1274
+ }
1275
+ convert(t) {
1276
+ this.sampleFramebuffer.begin(), this.renderer.clear(0, 0, 0, 0), this.renderer.shader(this.sampleShader), this.renderer.setUniform("u_sketchTexture", t), 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(0, 0, 0, 0), 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(0, 0, 0, 0), this.renderer.image(this.sampleFramebuffer, 0, 0, this.grid.cols, this.grid.rows)), this._secondaryColorFramebuffer.end(), this._transformFramebuffer.begin(), this.renderer.background(
1277
+ this.options.invert ? 255 : 0,
1278
+ this.options.flipHorizontally ? 255 : 0,
1279
+ this.options.flipVertically ? 255 : 0
1280
+ ), this._transformFramebuffer.end(), this._rotationFramebuffer.begin(), this.renderer.background(this.options.rotation, this.options.rotation, this.options.rotation), this._rotationFramebuffer.end(), this._characterFramebuffer.begin(), this.renderer.clear(0, 0, 0, 0), this.renderer.shader(this.charMappingShader), this.renderer.setUniform("u_colorSampleFramebuffer", this.sampleFramebuffer.texture), this.renderer.setUniform("u_charPaletteTexture", this.palette.texture), this.renderer.setUniform("u_charPaletteSize", [this.palette.colors.length, 1]), this.renderer.setUniform("u_textureSize", [this.grid.cols, this.grid.rows]), this.renderer.setUniform("u_brightnessRange", this.options.brightnessRange), this.renderer.rect(0, 0, this.grid.cols, this.grid.rows), this._characterFramebuffer.end();
1281
+ }
1282
+ resize() {
1283
+ super.resize(), this.sampleFramebuffer.resize(this.grid.cols, this.grid.rows);
1284
+ }
1285
+ characters(t) {
1286
+ this.options.characters = t, this.palette.setColors(this.fontManager.getCharacterColors(t));
1287
+ }
1288
+ characterColor(t, B = t, e = t, r = 255) {
1289
+ this.options.characterColor = [t, B, e, r];
1290
+ }
1291
+ characterColorMode(t) {
1292
+ this.options.characterColorMode = t;
1293
+ }
1294
+ backgroundColor(t, B = t, e = t, r = 255) {
1295
+ this.options.backgroundColor = [t, B, e, r];
1296
+ }
1297
+ backgroundColorMode(t) {
1298
+ this.options.backgroundColorMode = t;
1299
+ }
1300
+ invert(t) {
1301
+ this.options.invert = t;
1302
+ }
1303
+ rotation(t) {
1304
+ this.options.rotation = t;
1305
+ }
1306
+ flipHorizontally(t) {
1307
+ this.options.flipHorizontally = t;
1308
+ }
1309
+ flipVertically(t) {
1310
+ this.options.flipVertically = t;
1311
+ }
1312
+ brightnessRange(t) {
1313
+ this.options.brightnessRange = t;
1314
+ }
1315
+ }
1316
+ class m {
1317
+ constructor(A, t = {}) {
1318
+ /** The canvas element to capture content from */
1319
+ E(this, "captureCanvas");
1320
+ /** Our WebGL overlay canvas manager */
1321
+ E(this, "textmodeCanvas");
1322
+ /** Core WebGL renderer */
1323
+ E(this, "renderer");
1324
+ E(this, "asciiShader");
1325
+ E(this, "canvasFramebuffer");
1326
+ E(this, "brightnessConverter");
1327
+ E(this, "fontManager");
1328
+ E(this, "grid");
1329
+ E(this, "resizeObserver");
1330
+ E(this, "resultFramebuffer");
1331
+ E(this, "initialized", !1);
1332
+ this.captureCanvas = A, this.textmodeCanvas = new R(A);
1333
+ const B = this.textmodeCanvas.getWebGLContext();
1334
+ this.renderer = new T(B), this.asciiShader = new P(B, I, S), this.canvasFramebuffer = this.renderer.createFramebuffer(A.width, A.height), this.fontManager = new G(this.renderer, t.fontSize ?? 16);
1335
+ }
1336
+ /**
1337
+ * Initialize the textmodifier. Must be called before using render().
1338
+ */
1339
+ async initialize() {
1340
+ await this.fontManager.initialize();
1341
+ const A = this.fontManager.maxGlyphDimensions;
1342
+ this.grid = new Y(this.captureCanvas, A.width, A.height), this.brightnessConverter = new N(this.renderer, this.fontManager, this.grid), this.resultFramebuffer = this.renderer.createFramebuffer(this.grid.width, this.grid.height), this.setupEventListeners(), this.initialized = !0;
1343
+ }
1344
+ /**
1345
+ * Check if the textmodifier is ready for use
1346
+ */
1347
+ isInitialized() {
1348
+ return this.initialized;
1349
+ }
1350
+ /**
1351
+ * Static factory method for creating and initializing a Textmodifier instance
1352
+ */
1353
+ static async create(A, t = {}) {
1354
+ const B = new m(A, t);
1355
+ return await B.initialize(), B;
1356
+ }
1357
+ setupEventListeners() {
1358
+ window.addEventListener("resize", this.resize.bind(this)), window.ResizeObserver && (this.resizeObserver = new ResizeObserver(() => {
1359
+ this.resize();
1360
+ }), this.resizeObserver.observe(this.captureCanvas));
1361
+ }
1362
+ async loadFont(A) {
1363
+ return this.fontManager.loadFont(A).then(() => {
1364
+ if (!this.initialized) return;
1365
+ const t = this.fontManager.maxGlyphDimensions;
1366
+ this.grid.resizeCellPixelDimensions(t.width, t.height), this.brightnessConverter.resize(), this.renderer.resetViewport();
1367
+ });
1368
+ }
1369
+ render() {
1370
+ this.canvasFramebuffer.update(this.captureCanvas), this.brightnessConverter.convert(this.canvasFramebuffer), this.resultFramebuffer.begin(), this.renderer.clear(), this.renderer.shader(this.asciiShader), this.renderer.setUniform("u_characterTexture", this.fontManager.fontFramebuffer), this.renderer.setUniform("u_charsetDimensions", [this.fontManager.textureColumns, this.fontManager.textureRows]), this.renderer.setUniform("u_asciiCharacterTexture", this.brightnessConverter.characterFramebuffer.texture), this.renderer.setUniform("u_primaryColorTexture", this.brightnessConverter.primaryColorFramebuffer.texture), this.renderer.setUniform("u_secondaryColorTexture", this.brightnessConverter.secondaryColorFramebuffer.texture), this.renderer.setUniform("u_transformTexture", this.brightnessConverter.transformFramebuffer.texture), this.renderer.setUniform("u_rotationTexture", this.brightnessConverter.rotationFramebuffer.texture), this.renderer.setUniform("u_captureTexture", this.canvasFramebuffer.texture), this.renderer.setUniform("u_backgroundMode", !1), this.renderer.setUniform("u_captureDimensions", [this.resultFramebuffer.width, this.resultFramebuffer.height]), this.renderer.setUniform("u_gridCellDimensions", [this.grid.cols, this.grid.rows]), this.renderer.setUniform("u_gridPixelDimensions", [this.grid.width, this.grid.height]), this.renderer.setUniform("u_pixelRatio", 1), this.renderer.rect(0, 0, this.resultFramebuffer.width, this.resultFramebuffer.height), this.resultFramebuffer.end(), this.renderer.clear(), this.renderer.image(this.resultFramebuffer, this.grid.offsetX, this.grid.offsetY, this.resultFramebuffer.width, this.resultFramebuffer.height);
1371
+ }
1372
+ resize() {
1373
+ this.textmodeCanvas.resize(), this.canvasFramebuffer.resize(this.textmodeCanvas.width, this.textmodeCanvas.height), this.grid.updateCanvas(this.textmodeCanvas.canvas), this.resultFramebuffer.resize(this.grid.width, this.grid.height), this.brightnessConverter.resize(), this.renderer.resetViewport();
1374
+ }
1375
+ }
1376
+ export {
1377
+ G as FontManager,
1378
+ Y as Grid,
1379
+ R as TextmodeCanvas,
1380
+ m as Textmodifier
1381
+ };