ag-psd 15.0.1 → 15.0.3

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.
Files changed (102) hide show
  1. package/TODO +0 -2
  2. package/clean.js +3 -0
  3. package/dist/abr.d.ts +132 -132
  4. package/dist/abr.js +270 -271
  5. package/dist/abr.js.map +1 -0
  6. package/dist/additionalInfo.d.ts +25 -25
  7. package/dist/additionalInfo.js +2026 -2045
  8. package/dist/additionalInfo.js.map +1 -0
  9. package/dist/bundle.js +9164 -8725
  10. package/dist/csh.d.ts +10 -10
  11. package/dist/csh.js +48 -49
  12. package/dist/csh.js.map +1 -0
  13. package/dist/descriptor.d.ts +411 -390
  14. package/dist/descriptor.js +1689 -1644
  15. package/dist/descriptor.js.map +1 -0
  16. package/dist/effectsHelpers.d.ts +5 -5
  17. package/dist/effectsHelpers.js +309 -310
  18. package/dist/effectsHelpers.js.map +1 -0
  19. package/dist/engineData.d.ts +2 -2
  20. package/dist/engineData.js +337 -338
  21. package/dist/engineData.js.map +1 -0
  22. package/dist/helpers.d.ts +93 -93
  23. package/dist/helpers.js +332 -333
  24. package/dist/helpers.js.map +1 -0
  25. package/dist/imageResources.d.ts +13 -13
  26. package/dist/imageResources.js +1007 -788
  27. package/dist/imageResources.js.map +1 -0
  28. package/dist/index.d.ts +20 -20
  29. package/dist/index.js +53 -54
  30. package/dist/index.js.map +1 -0
  31. package/dist/initializeCanvas.d.ts +1 -1
  32. package/dist/initializeCanvas.js +26 -27
  33. package/dist/initializeCanvas.js.map +1 -0
  34. package/dist/jpeg.d.ts +1 -1
  35. package/dist/jpeg.js +1019 -1020
  36. package/dist/jpeg.js.map +1 -0
  37. package/dist/psd.d.ts +1200 -1147
  38. package/dist/psd.js +22 -23
  39. package/dist/psd.js.map +1 -0
  40. package/dist/psdReader.d.ts +36 -36
  41. package/dist/psdReader.js +974 -959
  42. package/dist/psdReader.js.map +1 -0
  43. package/dist/psdWriter.d.ts +27 -27
  44. package/dist/psdWriter.js +709 -690
  45. package/dist/psdWriter.js.map +1 -0
  46. package/dist/text.d.ts +168 -168
  47. package/dist/text.js +557 -558
  48. package/dist/text.js.map +1 -0
  49. package/dist/utf8.d.ts +5 -5
  50. package/dist/utf8.js +152 -153
  51. package/dist/utf8.js.map +1 -0
  52. package/dist-es/abr.d.ts +132 -132
  53. package/dist-es/abr.js +266 -267
  54. package/dist-es/abr.js.map +1 -0
  55. package/dist-es/additionalInfo.d.ts +25 -25
  56. package/dist-es/additionalInfo.js +2020 -2039
  57. package/dist-es/additionalInfo.js.map +1 -0
  58. package/dist-es/csh.d.ts +10 -10
  59. package/dist-es/csh.js +44 -45
  60. package/dist-es/csh.js.map +1 -0
  61. package/dist-es/descriptor.d.ts +411 -390
  62. package/dist-es/descriptor.js +1661 -1616
  63. package/dist-es/descriptor.js.map +1 -0
  64. package/dist-es/effectsHelpers.d.ts +5 -5
  65. package/dist-es/effectsHelpers.js +304 -305
  66. package/dist-es/effectsHelpers.js.map +1 -0
  67. package/dist-es/engineData.d.ts +2 -2
  68. package/dist-es/engineData.js +332 -333
  69. package/dist-es/engineData.js.map +1 -0
  70. package/dist-es/helpers.d.ts +93 -93
  71. package/dist-es/helpers.js +315 -316
  72. package/dist-es/helpers.js.map +1 -0
  73. package/dist-es/imageResources.d.ts +13 -13
  74. package/dist-es/imageResources.js +1004 -785
  75. package/dist-es/imageResources.js.map +1 -0
  76. package/dist-es/index.d.ts +20 -20
  77. package/dist-es/index.js +31 -32
  78. package/dist-es/index.js.map +1 -0
  79. package/dist-es/initializeCanvas.d.ts +1 -1
  80. package/dist-es/initializeCanvas.js +22 -23
  81. package/dist-es/initializeCanvas.js.map +1 -0
  82. package/dist-es/jpeg.d.ts +1 -1
  83. package/dist-es/jpeg.js +1015 -1016
  84. package/dist-es/jpeg.js.map +1 -0
  85. package/dist-es/psd.d.ts +1200 -1147
  86. package/dist-es/psd.js +19 -20
  87. package/dist-es/psd.js.map +1 -0
  88. package/dist-es/psdReader.d.ts +36 -36
  89. package/dist-es/psdReader.js +944 -929
  90. package/dist-es/psdReader.js.map +1 -0
  91. package/dist-es/psdWriter.d.ts +27 -27
  92. package/dist-es/psdWriter.js +685 -666
  93. package/dist-es/psdWriter.js.map +1 -0
  94. package/dist-es/text.d.ts +168 -168
  95. package/dist-es/text.js +552 -553
  96. package/dist-es/text.js.map +1 -0
  97. package/dist-es/utf8.d.ts +5 -5
  98. package/dist-es/utf8.js +145 -146
  99. package/dist-es/utf8.js.map +1 -0
  100. package/package.json +11 -17
  101. package/tsconfig-es6.json +7 -0
  102. package/tsconfig.json +7 -1
@@ -1,333 +1,332 @@
1
- function isWhitespace(char) {
2
- // ' ', '\n', '\r', '\t'
3
- return char === 32 || char === 10 || char === 13 || char === 9;
4
- }
5
- function isNumber(char) {
6
- // 0123456789.-
7
- return (char >= 48 && char <= 57) || char === 46 || char === 45;
8
- }
9
- export function parseEngineData(data) {
10
- var index = 0;
11
- function skipWhitespace() {
12
- while (index < data.length && isWhitespace(data[index])) {
13
- index++;
14
- }
15
- }
16
- function getTextByte() {
17
- var byte = data[index];
18
- index++;
19
- if (byte === 92) { // \
20
- byte = data[index];
21
- index++;
22
- }
23
- return byte;
24
- }
25
- function getText() {
26
- var result = '';
27
- if (data[index] === 41) { // )
28
- index++;
29
- return result;
30
- }
31
- // Strings start with utf-16 BOM
32
- if (data[index] !== 0xFE || data[index + 1] !== 0xFF) {
33
- throw new Error('Invalid utf-16 BOM');
34
- }
35
- index += 2;
36
- // ), ( and \ characters are escaped in ascii manner, remove the escapes before interpreting
37
- // the bytes as utf-16
38
- while (index < data.length && data[index] !== 41) { // )
39
- var high = getTextByte();
40
- var low = getTextByte();
41
- var char = (high << 8) | low;
42
- result += String.fromCharCode(char);
43
- }
44
- index++;
45
- return result;
46
- }
47
- var root = null;
48
- var stack = [];
49
- function pushContainer(value) {
50
- if (!stack.length) {
51
- stack.push(value);
52
- root = value;
53
- }
54
- else {
55
- pushValue(value);
56
- stack.push(value);
57
- }
58
- }
59
- function pushValue(value) {
60
- if (!stack.length)
61
- throw new Error('Invalid data');
62
- var top = stack[stack.length - 1];
63
- if (typeof top === 'string') {
64
- stack[stack.length - 2][top] = value;
65
- pop();
66
- }
67
- else if (Array.isArray(top)) {
68
- top.push(value);
69
- }
70
- else {
71
- throw new Error('Invalid data');
72
- }
73
- }
74
- function pushProperty(name) {
75
- if (!stack.length)
76
- pushContainer({});
77
- var top = stack[stack.length - 1];
78
- if (top && typeof top === 'string') {
79
- if (name === 'nil') {
80
- pushValue(null);
81
- }
82
- else {
83
- pushValue("/".concat(name));
84
- }
85
- }
86
- else if (top && typeof top === 'object') {
87
- stack.push(name);
88
- }
89
- else {
90
- throw new Error('Invalid data');
91
- }
92
- }
93
- function pop() {
94
- if (!stack.length)
95
- throw new Error('Invalid data');
96
- stack.pop();
97
- }
98
- skipWhitespace();
99
- while (index < data.length) {
100
- var i = index;
101
- var char = data[i];
102
- if (char === 60 && data[i + 1] === 60) { // <<
103
- index += 2;
104
- pushContainer({});
105
- }
106
- else if (char === 62 && data[i + 1] === 62) { // >>
107
- index += 2;
108
- pop();
109
- }
110
- else if (char === 47) { // /
111
- index += 1;
112
- var start = index;
113
- while (index < data.length && !isWhitespace(data[index])) {
114
- index++;
115
- }
116
- var name_1 = '';
117
- for (var i_1 = start; i_1 < index; i_1++) {
118
- name_1 += String.fromCharCode(data[i_1]);
119
- }
120
- pushProperty(name_1);
121
- }
122
- else if (char === 40) { // (
123
- index += 1;
124
- pushValue(getText());
125
- }
126
- else if (char === 91) { // [
127
- index += 1;
128
- pushContainer([]);
129
- }
130
- else if (char === 93) { // ]
131
- index += 1;
132
- pop();
133
- }
134
- else if (char === 110 && data[i + 1] === 117 && data[i + 2] === 108 && data[i + 3] === 108) { // null
135
- index += 4;
136
- pushValue(null);
137
- }
138
- else if (char === 116 && data[i + 1] === 114 && data[i + 2] === 117 && data[i + 3] === 101) { // true
139
- index += 4;
140
- pushValue(true);
141
- }
142
- else if (char === 102 && data[i + 1] === 97 && data[i + 2] === 108 && data[i + 3] === 115 && data[i + 4] === 101) { // false
143
- index += 5;
144
- pushValue(false);
145
- }
146
- else if (isNumber(char)) {
147
- var value = '';
148
- while (index < data.length && isNumber(data[index])) {
149
- value += String.fromCharCode(data[index]);
150
- index++;
151
- }
152
- pushValue(parseFloat(value));
153
- }
154
- else {
155
- index += 1;
156
- console.log("Invalid token ".concat(String.fromCharCode(char), " at ").concat(index));
157
- // ` near ${String.fromCharCode.apply(null, data.slice(index - 10, index + 20) as any)}` +
158
- // `data [${Array.from(data.slice(index - 10, index + 20)).join(', ')}]`
159
- }
160
- skipWhitespace();
161
- }
162
- return root;
163
- }
164
- var floatKeys = [
165
- 'Axis', 'XY', 'Zone', 'WordSpacing', 'FirstLineIndent', 'GlyphSpacing', 'StartIndent', 'EndIndent', 'SpaceBefore',
166
- 'SpaceAfter', 'LetterSpacing', 'Values', 'GridSize', 'GridLeading', 'PointBase', 'BoxBounds', 'TransformPoint0', 'TransformPoint1',
167
- 'TransformPoint2', 'FontSize', 'Leading', 'HorizontalScale', 'VerticalScale', 'BaselineShift', 'Tsume',
168
- 'OutlineWidth', 'AutoLeading',
169
- ];
170
- var intArrays = ['RunLengthArray'];
171
- // TODO: handle /nil
172
- export function serializeEngineData(data, condensed) {
173
- if (condensed === void 0) { condensed = false; }
174
- var buffer = new Uint8Array(1024);
175
- var offset = 0;
176
- var indent = 0;
177
- function write(value) {
178
- if (offset >= buffer.length) {
179
- var newBuffer = new Uint8Array(buffer.length * 2);
180
- newBuffer.set(buffer);
181
- buffer = newBuffer;
182
- }
183
- buffer[offset] = value;
184
- offset++;
185
- }
186
- function writeString(value) {
187
- for (var i = 0; i < value.length; i++) {
188
- write(value.charCodeAt(i));
189
- }
190
- }
191
- function writeIndent() {
192
- if (condensed) {
193
- writeString(' ');
194
- }
195
- else {
196
- for (var i = 0; i < indent; i++) {
197
- writeString('\t');
198
- }
199
- }
200
- }
201
- function writeProperty(key, value) {
202
- writeIndent();
203
- writeString("/".concat(key));
204
- writeValue(value, key, true);
205
- if (!condensed)
206
- writeString('\n');
207
- }
208
- function serializeInt(value) {
209
- return value.toString();
210
- }
211
- function serializeFloat(value) {
212
- return value.toFixed(5)
213
- .replace(/(\d)0+$/g, '$1')
214
- .replace(/^0+\.([1-9])/g, '.$1')
215
- .replace(/^-0+\.0(\d)/g, '-.0$1');
216
- }
217
- function serializeNumber(value, key) {
218
- var isFloat = (key && floatKeys.indexOf(key) !== -1) || (value | 0) !== value;
219
- return isFloat ? serializeFloat(value) : serializeInt(value);
220
- }
221
- function getKeys(value) {
222
- var keys = Object.keys(value);
223
- if (keys.indexOf('98') !== -1)
224
- keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));
225
- if (keys.indexOf('99') !== -1)
226
- keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));
227
- return keys;
228
- }
229
- function writeStringByte(value) {
230
- if (value === 40 || value === 41 || value === 92) { // ( ) \
231
- write(92); // \
232
- }
233
- write(value);
234
- }
235
- function writeValue(value, key, inProperty) {
236
- if (inProperty === void 0) { inProperty = false; }
237
- function writePrefix() {
238
- if (inProperty) {
239
- writeString(' ');
240
- }
241
- else {
242
- writeIndent();
243
- }
244
- }
245
- if (value === null) {
246
- writePrefix();
247
- writeString(condensed ? '/nil' : 'null');
248
- }
249
- else if (typeof value === 'number') {
250
- writePrefix();
251
- writeString(serializeNumber(value, key));
252
- }
253
- else if (typeof value === 'boolean') {
254
- writePrefix();
255
- writeString(value ? 'true' : 'false');
256
- }
257
- else if (typeof value === 'string') {
258
- writePrefix();
259
- if ((key === '99' || key === '98') && value.charAt(0) === '/') {
260
- writeString(value);
261
- }
262
- else {
263
- writeString('(');
264
- write(0xfe);
265
- write(0xff);
266
- for (var i = 0; i < value.length; i++) {
267
- var code = value.charCodeAt(i);
268
- writeStringByte((code >> 8) & 0xff);
269
- writeStringByte(code & 0xff);
270
- }
271
- writeString(')');
272
- }
273
- }
274
- else if (Array.isArray(value)) {
275
- writePrefix();
276
- if (value.every(function (x) { return typeof x === 'number'; })) {
277
- writeString('[');
278
- var intArray = intArrays.indexOf(key) !== -1;
279
- for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {
280
- var x = value_1[_i];
281
- writeString(' ');
282
- writeString(intArray ? serializeNumber(x) : serializeFloat(x));
283
- }
284
- writeString(' ]');
285
- }
286
- else {
287
- writeString('[');
288
- if (!condensed)
289
- writeString('\n');
290
- for (var _a = 0, value_2 = value; _a < value_2.length; _a++) {
291
- var x = value_2[_a];
292
- writeValue(x, key);
293
- if (!condensed)
294
- writeString('\n');
295
- }
296
- writeIndent();
297
- writeString(']');
298
- }
299
- }
300
- else if (typeof value === 'object') {
301
- if (inProperty && !condensed)
302
- writeString('\n');
303
- writeIndent();
304
- writeString('<<');
305
- if (!condensed)
306
- writeString('\n');
307
- indent++;
308
- for (var _b = 0, _c = getKeys(value); _b < _c.length; _b++) {
309
- var key_1 = _c[_b];
310
- writeProperty(key_1, value[key_1]);
311
- }
312
- indent--;
313
- writeIndent();
314
- writeString('>>');
315
- }
316
- return undefined;
317
- }
318
- if (condensed) {
319
- if (typeof data === 'object') {
320
- for (var _i = 0, _a = getKeys(data); _i < _a.length; _i++) {
321
- var key = _a[_i];
322
- writeProperty(key, data[key]);
323
- }
324
- }
325
- }
326
- else {
327
- writeString('\n\n');
328
- writeValue(data);
329
- }
330
- return buffer.slice(0, offset);
331
- }
332
-
333
- //# sourceMappingURL=data:application/json;charset=utf8;base64,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bEIsSUFBSSxDQUFDLFNBQVM7Z0JBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWxDLE1BQU0sRUFBRSxDQUFDO1lBRVQsS0FBa0IsVUFBYyxFQUFkLEtBQUEsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFkLGNBQWMsRUFBZCxJQUFjLEVBQUU7Z0JBQTdCLElBQU0sS0FBRyxTQUFBO2dCQUNiLGFBQWEsQ0FBQyxLQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUcsQ0FBQyxDQUFDLENBQUM7YUFDL0I7WUFFRCxNQUFNLEVBQUUsQ0FBQztZQUNULFdBQVcsRUFBRSxDQUFDO1lBQ2QsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xCO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksU0FBUyxFQUFFO1FBQ2QsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDN0IsS0FBa0IsVUFBYSxFQUFiLEtBQUEsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFiLGNBQWEsRUFBYixJQUFhLEVBQUU7Z0JBQTVCLElBQU0sR0FBRyxTQUFBO2dCQUNiLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDOUI7U0FDRDtLQUNEO1NBQU07UUFDTixXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2pCO0lBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwiZmlsZSI6ImVuZ2luZURhdGEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBpc1doaXRlc3BhY2UoY2hhcjogbnVtYmVyKSB7XHJcblx0Ly8gJyAnLCAnXFxuJywgJ1xccicsICdcXHQnXHJcblx0cmV0dXJuIGNoYXIgPT09IDMyIHx8IGNoYXIgPT09IDEwIHx8IGNoYXIgPT09IDEzIHx8IGNoYXIgPT09IDk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzTnVtYmVyKGNoYXI6IG51bWJlcikge1xyXG5cdC8vIDAxMjM0NTY3ODkuLVxyXG5cdHJldHVybiAoY2hhciA+PSA0OCAmJiBjaGFyIDw9IDU3KSB8fCBjaGFyID09PSA0NiB8fCBjaGFyID09PSA0NTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRW5naW5lRGF0YShkYXRhOiBudW1iZXJbXSB8IFVpbnQ4QXJyYXkpIHtcclxuXHRsZXQgaW5kZXggPSAwO1xyXG5cclxuXHRmdW5jdGlvbiBza2lwV2hpdGVzcGFjZSgpIHtcclxuXHRcdHdoaWxlIChpbmRleCA8IGRhdGEubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShkYXRhW2luZGV4XSkpIHtcclxuXHRcdFx0aW5kZXgrKztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFRleHRCeXRlKCkge1xyXG5cdFx0bGV0IGJ5dGUgPSBkYXRhW2luZGV4XTtcclxuXHRcdGluZGV4Kys7XHJcblxyXG5cdFx0aWYgKGJ5dGUgPT09IDkyKSB7IC8vIFxcXHJcblx0XHRcdGJ5dGUgPSBkYXRhW2luZGV4XTtcclxuXHRcdFx0aW5kZXgrKztcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYnl0ZTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFRleHQoKSB7XHJcblx0XHRsZXQgcmVzdWx0ID0gJyc7XHJcblxyXG5cdFx0aWYgKGRhdGFbaW5kZXhdID09PSA0MSkgeyAvLyApXHJcblx0XHRcdGluZGV4Kys7XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU3RyaW5ncyBzdGFydCB3aXRoIHV0Zi0xNiBCT01cclxuXHRcdGlmIChkYXRhW2luZGV4XSAhPT0gMHhGRSB8fCBkYXRhW2luZGV4ICsgMV0gIT09IDB4RkYpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHV0Zi0xNiBCT00nKTtcclxuXHRcdH1cclxuXHJcblx0XHRpbmRleCArPSAyO1xyXG5cclxuXHRcdC8vICksICggYW5kIFxcIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgaW4gYXNjaWkgbWFubmVyLCByZW1vdmUgdGhlIGVzY2FwZXMgYmVmb3JlIGludGVycHJldGluZ1xyXG5cdFx0Ly8gdGhlIGJ5dGVzIGFzIHV0Zi0xNlxyXG5cdFx0d2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGggJiYgZGF0YVtpbmRleF0gIT09IDQxKSB7IC8vIClcclxuXHRcdFx0Y29uc3QgaGlnaCA9IGdldFRleHRCeXRlKCk7XHJcblx0XHRcdGNvbnN0IGxvdyA9IGdldFRleHRCeXRlKCk7XHJcblx0XHRcdGNvbnN0IGNoYXIgPSAoaGlnaCA8PCA4KSB8IGxvdztcclxuXHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhcik7XHJcblx0XHR9XHJcblxyXG5cdFx0aW5kZXgrKztcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRsZXQgcm9vdDogYW55ID0gbnVsbDtcclxuXHRjb25zdCBzdGFjazogYW55W10gPSBbXTtcclxuXHJcblx0ZnVuY3Rpb24gcHVzaENvbnRhaW5lcih2YWx1ZTogYW55KSB7XHJcblx0XHRpZiAoIXN0YWNrLmxlbmd0aCkge1xyXG5cdFx0XHRzdGFjay5wdXNoKHZhbHVlKTtcclxuXHRcdFx0cm9vdCA9IHZhbHVlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHVzaFZhbHVlKHZhbHVlKTtcclxuXHRcdFx0c3RhY2sucHVzaCh2YWx1ZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwdXNoVmFsdWUodmFsdWU6IGFueSkge1xyXG5cdFx0aWYgKCFzdGFjay5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRhJyk7XHJcblxyXG5cdFx0Y29uc3QgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XHJcblxyXG5cdFx0aWYgKHR5cGVvZiB0b3AgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdHN0YWNrW3N0YWNrLmxlbmd0aCAtIDJdW3RvcF0gPSB2YWx1ZTtcclxuXHRcdFx0cG9wKCk7XHJcblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodG9wKSkge1xyXG5cdFx0XHR0b3AucHVzaCh2YWx1ZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YScpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcHVzaFByb3BlcnR5KG5hbWU6IHN0cmluZykge1xyXG5cdFx0aWYgKCFzdGFjay5sZW5ndGgpIHB1c2hDb250YWluZXIoe30pO1xyXG5cclxuXHRcdGNvbnN0IHRvcCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xyXG5cclxuXHRcdGlmICh0b3AgJiYgdHlwZW9mIHRvcCA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0aWYgKG5hbWUgPT09ICduaWwnKSB7XHJcblx0XHRcdFx0cHVzaFZhbHVlKG51bGwpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHB1c2hWYWx1ZShgLyR7bmFtZX1gKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0b3AgJiYgdHlwZW9mIHRvcCA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0c3RhY2sucHVzaChuYW1lKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRhJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwb3AoKSB7XHJcblx0XHRpZiAoIXN0YWNrLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEnKTtcclxuXHRcdHN0YWNrLnBvcCgpO1xyXG5cdH1cclxuXHJcblx0c2tpcFdoaXRlc3BhY2UoKTtcclxuXHJcblx0d2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGgpIHtcclxuXHRcdGNvbnN0IGkgPSBpbmRleDtcclxuXHRcdGNvbnN0IGNoYXIgPSBkYXRhW2ldO1xyXG5cclxuXHRcdGlmIChjaGFyID09PSA2MCAmJiBkYXRhW2kgKyAxXSA9PT0gNjApIHsgLy8gPDxcclxuXHRcdFx0aW5kZXggKz0gMjtcclxuXHRcdFx0cHVzaENvbnRhaW5lcih7fSk7XHJcblx0XHR9IGVsc2UgaWYgKGNoYXIgPT09IDYyICYmIGRhdGFbaSArIDFdID09PSA2MikgeyAvLyA+PlxyXG5cdFx0XHRpbmRleCArPSAyO1xyXG5cdFx0XHRwb3AoKTtcclxuXHRcdH0gZWxzZSBpZiAoY2hhciA9PT0gNDcpIHsgLy8gL1xyXG5cdFx0XHRpbmRleCArPSAxO1xyXG5cdFx0XHRjb25zdCBzdGFydCA9IGluZGV4O1xyXG5cclxuXHRcdFx0d2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGggJiYgIWlzV2hpdGVzcGFjZShkYXRhW2luZGV4XSkpIHtcclxuXHRcdFx0XHRpbmRleCsrO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgbmFtZSA9ICcnO1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgaW5kZXg7IGkrKykge1xyXG5cdFx0XHRcdG5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2ldKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cHVzaFByb3BlcnR5KG5hbWUpO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSA0MCkgeyAvLyAoXHJcblx0XHRcdGluZGV4ICs9IDE7XHJcblx0XHRcdHB1c2hWYWx1ZShnZXRUZXh0KCkpO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSA5MSkgeyAvLyBbXHJcblx0XHRcdGluZGV4ICs9IDE7XHJcblx0XHRcdHB1c2hDb250YWluZXIoW10pO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSA5MykgeyAvLyBdXHJcblx0XHRcdGluZGV4ICs9IDE7XHJcblx0XHRcdHBvcCgpO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSAxMTAgJiYgZGF0YVtpICsgMV0gPT09IDExNyAmJiBkYXRhW2kgKyAyXSA9PT0gMTA4ICYmIGRhdGFbaSArIDNdID09PSAxMDgpIHsgLy8gbnVsbFxyXG5cdFx0XHRpbmRleCArPSA0O1xyXG5cdFx0XHRwdXNoVmFsdWUobnVsbCk7XHJcblx0XHR9IGVsc2UgaWYgKGNoYXIgPT09IDExNiAmJiBkYXRhW2kgKyAxXSA9PT0gMTE0ICYmIGRhdGFbaSArIDJdID09PSAxMTcgJiYgZGF0YVtpICsgM10gPT09IDEwMSkgeyAvLyB0cnVlXHJcblx0XHRcdGluZGV4ICs9IDQ7XHJcblx0XHRcdHB1c2hWYWx1ZSh0cnVlKTtcclxuXHRcdH0gZWxzZSBpZiAoY2hhciA9PT0gMTAyICYmIGRhdGFbaSArIDFdID09PSA5NyAmJiBkYXRhW2kgKyAyXSA9PT0gMTA4ICYmIGRhdGFbaSArIDNdID09PSAxMTUgJiYgZGF0YVtpICsgNF0gPT09IDEwMSkgeyAvLyBmYWxzZVxyXG5cdFx0XHRpbmRleCArPSA1O1xyXG5cdFx0XHRwdXNoVmFsdWUoZmFsc2UpO1xyXG5cdFx0fSBlbHNlIGlmIChpc051bWJlcihjaGFyKSkge1xyXG5cdFx0XHRsZXQgdmFsdWUgPSAnJztcclxuXHJcblx0XHRcdHdoaWxlIChpbmRleCA8IGRhdGEubGVuZ3RoICYmIGlzTnVtYmVyKGRhdGFbaW5kZXhdKSkge1xyXG5cdFx0XHRcdHZhbHVlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZGF0YVtpbmRleF0pO1xyXG5cdFx0XHRcdGluZGV4Kys7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHB1c2hWYWx1ZShwYXJzZUZsb2F0KHZhbHVlKSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpbmRleCArPSAxO1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgSW52YWxpZCB0b2tlbiAke1N0cmluZy5mcm9tQ2hhckNvZGUoY2hhcil9IGF0ICR7aW5kZXh9YCk7XHJcblx0XHRcdC8vIGAgbmVhciAke1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgZGF0YS5zbGljZShpbmRleCAtIDEwLCBpbmRleCArIDIwKSBhcyBhbnkpfWAgK1xyXG5cdFx0XHQvLyBgZGF0YSBbJHtBcnJheS5mcm9tKGRhdGEuc2xpY2UoaW5kZXggLSAxMCwgaW5kZXggKyAyMCkpLmpvaW4oJywgJyl9XWBcclxuXHRcdH1cclxuXHJcblx0XHRza2lwV2hpdGVzcGFjZSgpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJvb3Q7XHJcbn1cclxuXHJcbmNvbnN0IGZsb2F0S2V5cyA9IFtcclxuXHQnQXhpcycsICdYWScsICdab25lJywgJ1dvcmRTcGFjaW5nJywgJ0ZpcnN0TGluZUluZGVudCcsICdHbHlwaFNwYWNpbmcnLCAnU3RhcnRJbmRlbnQnLCAnRW5kSW5kZW50JywgJ1NwYWNlQmVmb3JlJyxcclxuXHQnU3BhY2VBZnRlcicsICdMZXR0ZXJTcGFjaW5nJywgJ1ZhbHVlcycsICdHcmlkU2l6ZScsICdHcmlkTGVhZGluZycsICdQb2ludEJhc2UnLCAnQm94Qm91bmRzJywgJ1RyYW5zZm9ybVBvaW50MCcsICdUcmFuc2Zvcm1Qb2ludDEnLFxyXG5cdCdUcmFuc2Zvcm1Qb2ludDInLCAnRm9udFNpemUnLCAnTGVhZGluZycsICdIb3Jpem9udGFsU2NhbGUnLCAnVmVydGljYWxTY2FsZScsICdCYXNlbGluZVNoaWZ0JywgJ1RzdW1lJyxcclxuXHQnT3V0bGluZVdpZHRoJywgJ0F1dG9MZWFkaW5nJyxcclxuXTtcclxuXHJcbmNvbnN0IGludEFycmF5cyA9IFsnUnVuTGVuZ3RoQXJyYXknXTtcclxuXHJcbi8vIFRPRE86IGhhbmRsZSAvbmlsXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFbmdpbmVEYXRhKGRhdGE6IGFueSwgY29uZGVuc2VkID0gZmFsc2UpIHtcclxuXHRsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTAyNCk7XHJcblx0bGV0IG9mZnNldCA9IDA7XHJcblx0bGV0IGluZGVudCA9IDA7XHJcblxyXG5cdGZ1bmN0aW9uIHdyaXRlKHZhbHVlOiBudW1iZXIpIHtcclxuXHRcdGlmIChvZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xyXG5cdFx0XHRjb25zdCBuZXdCdWZmZXIgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICogMik7XHJcblx0XHRcdG5ld0J1ZmZlci5zZXQoYnVmZmVyKTtcclxuXHRcdFx0YnVmZmVyID0gbmV3QnVmZmVyO1xyXG5cdFx0fVxyXG5cclxuXHRcdGJ1ZmZlcltvZmZzZXRdID0gdmFsdWU7XHJcblx0XHRvZmZzZXQrKztcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcpIHtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0d3JpdGUodmFsdWUuY2hhckNvZGVBdChpKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB3cml0ZUluZGVudCgpIHtcclxuXHRcdGlmIChjb25kZW5zZWQpIHtcclxuXHRcdFx0d3JpdGVTdHJpbmcoJyAnKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnXFx0Jyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHdyaXRlUHJvcGVydHkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuXHRcdHdyaXRlSW5kZW50KCk7XHJcblx0XHR3cml0ZVN0cmluZyhgLyR7a2V5fWApO1xyXG5cdFx0d3JpdGVWYWx1ZSh2YWx1ZSwga2V5LCB0cnVlKTtcclxuXHRcdGlmICghY29uZGVuc2VkKSB3cml0ZVN0cmluZygnXFxuJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXJpYWxpemVJbnQodmFsdWU6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXJpYWxpemVGbG9hdCh2YWx1ZTogbnVtYmVyKSB7XHJcblx0XHRyZXR1cm4gdmFsdWUudG9GaXhlZCg1KVxyXG5cdFx0XHQucmVwbGFjZSgvKFxcZCkwKyQvZywgJyQxJylcclxuXHRcdFx0LnJlcGxhY2UoL14wK1xcLihbMS05XSkvZywgJy4kMScpXHJcblx0XHRcdC5yZXBsYWNlKC9eLTArXFwuMChcXGQpL2csICctLjAkMScpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2VyaWFsaXplTnVtYmVyKHZhbHVlOiBudW1iZXIsIGtleT86IHN0cmluZykge1xyXG5cdFx0Y29uc3QgaXNGbG9hdCA9IChrZXkgJiYgZmxvYXRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHx8ICh2YWx1ZSB8IDApICE9PSB2YWx1ZTtcclxuXHRcdHJldHVybiBpc0Zsb2F0ID8gc2VyaWFsaXplRmxvYXQodmFsdWUpIDogc2VyaWFsaXplSW50KHZhbHVlKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldEtleXModmFsdWU6IGFueSkge1xyXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcclxuXHJcblx0XHRpZiAoa2V5cy5pbmRleE9mKCc5OCcpICE9PSAtMSlcclxuXHRcdFx0a2V5cy51bnNoaWZ0KC4uLmtleXMuc3BsaWNlKGtleXMuaW5kZXhPZignOTknKSwgMSkpO1xyXG5cclxuXHRcdGlmIChrZXlzLmluZGV4T2YoJzk5JykgIT09IC0xKVxyXG5cdFx0XHRrZXlzLnVuc2hpZnQoLi4ua2V5cy5zcGxpY2Uoa2V5cy5pbmRleE9mKCc5OScpLCAxKSk7XHJcblxyXG5cdFx0cmV0dXJuIGtleXM7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB3cml0ZVN0cmluZ0J5dGUodmFsdWU6IG51bWJlcikge1xyXG5cdFx0aWYgKHZhbHVlID09PSA0MCB8fCB2YWx1ZSA9PT0gNDEgfHwgdmFsdWUgPT09IDkyKSB7IC8vICggKSBcXFxyXG5cdFx0XHR3cml0ZSg5Mik7IC8vIFxcXHJcblx0XHR9XHJcblxyXG5cdFx0d3JpdGUodmFsdWUpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gd3JpdGVWYWx1ZSh2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcsIGluUHJvcGVydHkgPSBmYWxzZSkge1xyXG5cdFx0ZnVuY3Rpb24gd3JpdGVQcmVmaXgoKSB7XHJcblx0XHRcdGlmIChpblByb3BlcnR5KSB7XHJcblx0XHRcdFx0d3JpdGVTdHJpbmcoJyAnKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR3cml0ZUluZGVudCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHZhbHVlID09PSBudWxsKSB7XHJcblx0XHRcdHdyaXRlUHJlZml4KCk7XHJcblx0XHRcdHdyaXRlU3RyaW5nKGNvbmRlbnNlZCA/ICcvbmlsJyA6ICdudWxsJyk7XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuXHRcdFx0d3JpdGVQcmVmaXgoKTtcclxuXHRcdFx0d3JpdGVTdHJpbmcoc2VyaWFsaXplTnVtYmVyKHZhbHVlLCBrZXkpKTtcclxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuXHRcdFx0d3JpdGVQcmVmaXgoKTtcclxuXHRcdFx0d3JpdGVTdHJpbmcodmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKTtcclxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHR3cml0ZVByZWZpeCgpO1xyXG5cclxuXHRcdFx0aWYgKChrZXkgPT09ICc5OScgfHwga2V5ID09PSAnOTgnKSAmJiB2YWx1ZS5jaGFyQXQoMCkgPT09ICcvJykge1xyXG5cdFx0XHRcdHdyaXRlU3RyaW5nKHZhbHVlKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnKCcpO1xyXG5cdFx0XHRcdHdyaXRlKDB4ZmUpO1xyXG5cdFx0XHRcdHdyaXRlKDB4ZmYpO1xyXG5cclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChpKTtcclxuXHRcdFx0XHRcdHdyaXRlU3RyaW5nQnl0ZSgoY29kZSA+PiA4KSAmIDB4ZmYpO1xyXG5cdFx0XHRcdFx0d3JpdGVTdHJpbmdCeXRlKGNvZGUgJiAweGZmKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHdyaXRlU3RyaW5nKCcpJyk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuXHRcdFx0d3JpdGVQcmVmaXgoKTtcclxuXHJcblx0XHRcdGlmICh2YWx1ZS5ldmVyeSh4ID0+IHR5cGVvZiB4ID09PSAnbnVtYmVyJykpIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnWycpO1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRBcnJheSA9IGludEFycmF5cy5pbmRleE9mKGtleSEpICE9PSAtMTtcclxuXHJcblx0XHRcdFx0Zm9yIChjb25zdCB4IG9mIHZhbHVlKSB7XHJcblx0XHRcdFx0XHR3cml0ZVN0cmluZygnICcpO1xyXG5cdFx0XHRcdFx0d3JpdGVTdHJpbmcoaW50QXJyYXkgPyBzZXJpYWxpemVOdW1iZXIoeCkgOiBzZXJpYWxpemVGbG9hdCh4KSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR3cml0ZVN0cmluZygnIF0nKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnWycpO1xyXG5cdFx0XHRcdGlmICghY29uZGVuc2VkKSB3cml0ZVN0cmluZygnXFxuJyk7XHJcblxyXG5cdFx0XHRcdGZvciAoY29uc3QgeCBvZiB2YWx1ZSkge1xyXG5cdFx0XHRcdFx0d3JpdGVWYWx1ZSh4LCBrZXkpO1xyXG5cdFx0XHRcdFx0aWYgKCFjb25kZW5zZWQpIHdyaXRlU3RyaW5nKCdcXG4nKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHdyaXRlSW5kZW50KCk7XHJcblx0XHRcdFx0d3JpdGVTdHJpbmcoJ10nKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcblx0XHRcdGlmIChpblByb3BlcnR5ICYmICFjb25kZW5zZWQpIHdyaXRlU3RyaW5nKCdcXG4nKTtcclxuXHJcblx0XHRcdHdyaXRlSW5kZW50KCk7XHJcblx0XHRcdHdyaXRlU3RyaW5nKCc8PCcpO1xyXG5cclxuXHRcdFx0aWYgKCFjb25kZW5zZWQpIHdyaXRlU3RyaW5nKCdcXG4nKTtcclxuXHJcblx0XHRcdGluZGVudCsrO1xyXG5cclxuXHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgZ2V0S2V5cyh2YWx1ZSkpIHtcclxuXHRcdFx0XHR3cml0ZVByb3BlcnR5KGtleSwgdmFsdWVba2V5XSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGluZGVudC0tO1xyXG5cdFx0XHR3cml0ZUluZGVudCgpO1xyXG5cdFx0XHR3cml0ZVN0cmluZygnPj4nKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0aWYgKGNvbmRlbnNlZCkge1xyXG5cdFx0aWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRmb3IgKGNvbnN0IGtleSBvZiBnZXRLZXlzKGRhdGEpKSB7XHJcblx0XHRcdFx0d3JpdGVQcm9wZXJ0eShrZXksIGRhdGFba2V5XSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9IGVsc2Uge1xyXG5cdFx0d3JpdGVTdHJpbmcoJ1xcblxcbicpO1xyXG5cdFx0d3JpdGVWYWx1ZShkYXRhKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBidWZmZXIuc2xpY2UoMCwgb2Zmc2V0KTtcclxufVxyXG4iXSwic291cmNlUm9vdCI6IkM6XFxQcm9qZWN0c1xcZ2l0aHViXFxhZy1wc2RcXHNyYyJ9
1
+ function isWhitespace(char) {
2
+ // ' ', '\n', '\r', '\t'
3
+ return char === 32 || char === 10 || char === 13 || char === 9;
4
+ }
5
+ function isNumber(char) {
6
+ // 0123456789.-
7
+ return (char >= 48 && char <= 57) || char === 46 || char === 45;
8
+ }
9
+ export function parseEngineData(data) {
10
+ var index = 0;
11
+ function skipWhitespace() {
12
+ while (index < data.length && isWhitespace(data[index])) {
13
+ index++;
14
+ }
15
+ }
16
+ function getTextByte() {
17
+ var byte = data[index];
18
+ index++;
19
+ if (byte === 92) { // \
20
+ byte = data[index];
21
+ index++;
22
+ }
23
+ return byte;
24
+ }
25
+ function getText() {
26
+ var result = '';
27
+ if (data[index] === 41) { // )
28
+ index++;
29
+ return result;
30
+ }
31
+ // Strings start with utf-16 BOM
32
+ if (data[index] !== 0xFE || data[index + 1] !== 0xFF) {
33
+ throw new Error('Invalid utf-16 BOM');
34
+ }
35
+ index += 2;
36
+ // ), ( and \ characters are escaped in ascii manner, remove the escapes before interpreting
37
+ // the bytes as utf-16
38
+ while (index < data.length && data[index] !== 41) { // )
39
+ var high = getTextByte();
40
+ var low = getTextByte();
41
+ var char = (high << 8) | low;
42
+ result += String.fromCharCode(char);
43
+ }
44
+ index++;
45
+ return result;
46
+ }
47
+ var root = null;
48
+ var stack = [];
49
+ function pushContainer(value) {
50
+ if (!stack.length) {
51
+ stack.push(value);
52
+ root = value;
53
+ }
54
+ else {
55
+ pushValue(value);
56
+ stack.push(value);
57
+ }
58
+ }
59
+ function pushValue(value) {
60
+ if (!stack.length)
61
+ throw new Error('Invalid data');
62
+ var top = stack[stack.length - 1];
63
+ if (typeof top === 'string') {
64
+ stack[stack.length - 2][top] = value;
65
+ pop();
66
+ }
67
+ else if (Array.isArray(top)) {
68
+ top.push(value);
69
+ }
70
+ else {
71
+ throw new Error('Invalid data');
72
+ }
73
+ }
74
+ function pushProperty(name) {
75
+ if (!stack.length)
76
+ pushContainer({});
77
+ var top = stack[stack.length - 1];
78
+ if (top && typeof top === 'string') {
79
+ if (name === 'nil') {
80
+ pushValue(null);
81
+ }
82
+ else {
83
+ pushValue("/".concat(name));
84
+ }
85
+ }
86
+ else if (top && typeof top === 'object') {
87
+ stack.push(name);
88
+ }
89
+ else {
90
+ throw new Error('Invalid data');
91
+ }
92
+ }
93
+ function pop() {
94
+ if (!stack.length)
95
+ throw new Error('Invalid data');
96
+ stack.pop();
97
+ }
98
+ skipWhitespace();
99
+ while (index < data.length) {
100
+ var i = index;
101
+ var char = data[i];
102
+ if (char === 60 && data[i + 1] === 60) { // <<
103
+ index += 2;
104
+ pushContainer({});
105
+ }
106
+ else if (char === 62 && data[i + 1] === 62) { // >>
107
+ index += 2;
108
+ pop();
109
+ }
110
+ else if (char === 47) { // /
111
+ index += 1;
112
+ var start = index;
113
+ while (index < data.length && !isWhitespace(data[index])) {
114
+ index++;
115
+ }
116
+ var name_1 = '';
117
+ for (var i_1 = start; i_1 < index; i_1++) {
118
+ name_1 += String.fromCharCode(data[i_1]);
119
+ }
120
+ pushProperty(name_1);
121
+ }
122
+ else if (char === 40) { // (
123
+ index += 1;
124
+ pushValue(getText());
125
+ }
126
+ else if (char === 91) { // [
127
+ index += 1;
128
+ pushContainer([]);
129
+ }
130
+ else if (char === 93) { // ]
131
+ index += 1;
132
+ pop();
133
+ }
134
+ else if (char === 110 && data[i + 1] === 117 && data[i + 2] === 108 && data[i + 3] === 108) { // null
135
+ index += 4;
136
+ pushValue(null);
137
+ }
138
+ else if (char === 116 && data[i + 1] === 114 && data[i + 2] === 117 && data[i + 3] === 101) { // true
139
+ index += 4;
140
+ pushValue(true);
141
+ }
142
+ else if (char === 102 && data[i + 1] === 97 && data[i + 2] === 108 && data[i + 3] === 115 && data[i + 4] === 101) { // false
143
+ index += 5;
144
+ pushValue(false);
145
+ }
146
+ else if (isNumber(char)) {
147
+ var value = '';
148
+ while (index < data.length && isNumber(data[index])) {
149
+ value += String.fromCharCode(data[index]);
150
+ index++;
151
+ }
152
+ pushValue(parseFloat(value));
153
+ }
154
+ else {
155
+ index += 1;
156
+ console.log("Invalid token ".concat(String.fromCharCode(char), " at ").concat(index));
157
+ // ` near ${String.fromCharCode.apply(null, data.slice(index - 10, index + 20) as any)}` +
158
+ // `data [${Array.from(data.slice(index - 10, index + 20)).join(', ')}]`
159
+ }
160
+ skipWhitespace();
161
+ }
162
+ return root;
163
+ }
164
+ var floatKeys = [
165
+ 'Axis', 'XY', 'Zone', 'WordSpacing', 'FirstLineIndent', 'GlyphSpacing', 'StartIndent', 'EndIndent', 'SpaceBefore',
166
+ 'SpaceAfter', 'LetterSpacing', 'Values', 'GridSize', 'GridLeading', 'PointBase', 'BoxBounds', 'TransformPoint0', 'TransformPoint1',
167
+ 'TransformPoint2', 'FontSize', 'Leading', 'HorizontalScale', 'VerticalScale', 'BaselineShift', 'Tsume',
168
+ 'OutlineWidth', 'AutoLeading',
169
+ ];
170
+ var intArrays = ['RunLengthArray'];
171
+ // TODO: handle /nil
172
+ export function serializeEngineData(data, condensed) {
173
+ if (condensed === void 0) { condensed = false; }
174
+ var buffer = new Uint8Array(1024);
175
+ var offset = 0;
176
+ var indent = 0;
177
+ function write(value) {
178
+ if (offset >= buffer.length) {
179
+ var newBuffer = new Uint8Array(buffer.length * 2);
180
+ newBuffer.set(buffer);
181
+ buffer = newBuffer;
182
+ }
183
+ buffer[offset] = value;
184
+ offset++;
185
+ }
186
+ function writeString(value) {
187
+ for (var i = 0; i < value.length; i++) {
188
+ write(value.charCodeAt(i));
189
+ }
190
+ }
191
+ function writeIndent() {
192
+ if (condensed) {
193
+ writeString(' ');
194
+ }
195
+ else {
196
+ for (var i = 0; i < indent; i++) {
197
+ writeString('\t');
198
+ }
199
+ }
200
+ }
201
+ function writeProperty(key, value) {
202
+ writeIndent();
203
+ writeString("/".concat(key));
204
+ writeValue(value, key, true);
205
+ if (!condensed)
206
+ writeString('\n');
207
+ }
208
+ function serializeInt(value) {
209
+ return value.toString();
210
+ }
211
+ function serializeFloat(value) {
212
+ return value.toFixed(5)
213
+ .replace(/(\d)0+$/g, '$1')
214
+ .replace(/^0+\.([1-9])/g, '.$1')
215
+ .replace(/^-0+\.0(\d)/g, '-.0$1');
216
+ }
217
+ function serializeNumber(value, key) {
218
+ var isFloat = (key && floatKeys.indexOf(key) !== -1) || (value | 0) !== value;
219
+ return isFloat ? serializeFloat(value) : serializeInt(value);
220
+ }
221
+ function getKeys(value) {
222
+ var keys = Object.keys(value);
223
+ if (keys.indexOf('98') !== -1)
224
+ keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));
225
+ if (keys.indexOf('99') !== -1)
226
+ keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));
227
+ return keys;
228
+ }
229
+ function writeStringByte(value) {
230
+ if (value === 40 || value === 41 || value === 92) { // ( ) \
231
+ write(92); // \
232
+ }
233
+ write(value);
234
+ }
235
+ function writeValue(value, key, inProperty) {
236
+ if (inProperty === void 0) { inProperty = false; }
237
+ function writePrefix() {
238
+ if (inProperty) {
239
+ writeString(' ');
240
+ }
241
+ else {
242
+ writeIndent();
243
+ }
244
+ }
245
+ if (value === null) {
246
+ writePrefix();
247
+ writeString(condensed ? '/nil' : 'null');
248
+ }
249
+ else if (typeof value === 'number') {
250
+ writePrefix();
251
+ writeString(serializeNumber(value, key));
252
+ }
253
+ else if (typeof value === 'boolean') {
254
+ writePrefix();
255
+ writeString(value ? 'true' : 'false');
256
+ }
257
+ else if (typeof value === 'string') {
258
+ writePrefix();
259
+ if ((key === '99' || key === '98') && value.charAt(0) === '/') {
260
+ writeString(value);
261
+ }
262
+ else {
263
+ writeString('(');
264
+ write(0xfe);
265
+ write(0xff);
266
+ for (var i = 0; i < value.length; i++) {
267
+ var code = value.charCodeAt(i);
268
+ writeStringByte((code >> 8) & 0xff);
269
+ writeStringByte(code & 0xff);
270
+ }
271
+ writeString(')');
272
+ }
273
+ }
274
+ else if (Array.isArray(value)) {
275
+ writePrefix();
276
+ if (value.every(function (x) { return typeof x === 'number'; })) {
277
+ writeString('[');
278
+ var intArray = intArrays.indexOf(key) !== -1;
279
+ for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {
280
+ var x = value_1[_i];
281
+ writeString(' ');
282
+ writeString(intArray ? serializeNumber(x) : serializeFloat(x));
283
+ }
284
+ writeString(' ]');
285
+ }
286
+ else {
287
+ writeString('[');
288
+ if (!condensed)
289
+ writeString('\n');
290
+ for (var _a = 0, value_2 = value; _a < value_2.length; _a++) {
291
+ var x = value_2[_a];
292
+ writeValue(x, key);
293
+ if (!condensed)
294
+ writeString('\n');
295
+ }
296
+ writeIndent();
297
+ writeString(']');
298
+ }
299
+ }
300
+ else if (typeof value === 'object') {
301
+ if (inProperty && !condensed)
302
+ writeString('\n');
303
+ writeIndent();
304
+ writeString('<<');
305
+ if (!condensed)
306
+ writeString('\n');
307
+ indent++;
308
+ for (var _b = 0, _c = getKeys(value); _b < _c.length; _b++) {
309
+ var key_1 = _c[_b];
310
+ writeProperty(key_1, value[key_1]);
311
+ }
312
+ indent--;
313
+ writeIndent();
314
+ writeString('>>');
315
+ }
316
+ return undefined;
317
+ }
318
+ if (condensed) {
319
+ if (typeof data === 'object') {
320
+ for (var _i = 0, _a = getKeys(data); _i < _a.length; _i++) {
321
+ var key = _a[_i];
322
+ writeProperty(key, data[key]);
323
+ }
324
+ }
325
+ }
326
+ else {
327
+ writeString('\n\n');
328
+ writeValue(data);
329
+ }
330
+ return buffer.slice(0, offset);
331
+ }
332
+ //# sourceMappingURL=engineData.js.map