@dcl/sdk 7.24.5 → 7.24.6-29580060460.commit-06f0b7e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/composite-provider.js +4 -9
- package/internal/utf8.d.ts +15 -0
- package/internal/utf8.js +172 -0
- package/package.json +6 -7
- package/src/composite-provider.ts +3 -10
- package/src/internal/utf8.ts +167 -0
- package/src/text-codec.ts +59 -12
- package/text-codec.d.ts +23 -8
- package/text-codec.js +55 -13
- package/src/ethereum-provider/text-encoding.d.ts +0 -4
package/composite-provider.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { compositeFromLoader } from '~sdk/all-composites';
|
|
2
2
|
import { readFile } from '~system/Runtime';
|
|
3
|
-
import { Composite
|
|
3
|
+
import { Composite } from '@dcl/ecs';
|
|
4
|
+
import { decodeUtf8 } from './internal/utf8';
|
|
4
5
|
const composites = new Map();
|
|
5
6
|
function findCached(src) {
|
|
6
7
|
return composites.get(src) ?? null;
|
|
@@ -27,14 +28,8 @@ function decodeFromBytes(content) {
|
|
|
27
28
|
// The first-byte check is a fast path; a JSON.parse failure falls back to fromBinary
|
|
28
29
|
// because a protobuf message can also begin with 0x7b.
|
|
29
30
|
if (content[0] === 0x7b /* '{' */) {
|
|
30
|
-
const TD = getGlobal('TextDecoder');
|
|
31
|
-
if (!TD) {
|
|
32
|
-
throw new Error('loadComposite: TextDecoder is not available in this runtime. ' +
|
|
33
|
-
'Use a .composite.bin file, or import `@dcl/sdk/ethereum-provider` ' +
|
|
34
|
-
'to install the TextEncoder/TextDecoder polyfill.');
|
|
35
|
-
}
|
|
36
31
|
try {
|
|
37
|
-
return Composite.fromJson(JSON.parse(
|
|
32
|
+
return Composite.fromJson(JSON.parse(decodeUtf8(content, { fatal: true })));
|
|
38
33
|
}
|
|
39
34
|
catch {
|
|
40
35
|
return Composite.fromBinary(content);
|
|
@@ -69,4 +64,4 @@ export const compositeProvider = {
|
|
|
69
64
|
return cache(src, composite);
|
|
70
65
|
}
|
|
71
66
|
};
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zaXRlLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3JjL2NvbXBvc2l0ZS1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUE7QUFFeEQsU0FBUyxVQUFVLENBQUMsR0FBVztJQUM3QixPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFBO0FBQ3BDLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxHQUFXLEVBQUUsU0FBK0I7SUFDekQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2hDLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFBO0lBQzdCLE1BQU0sUUFBUSxHQUF1QixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQTtJQUN2RCxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUM3QixPQUFPLFFBQVEsQ0FBQTtBQUNqQixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsVUFBbUI7SUFDeEQsSUFBSSxVQUFVLFlBQVksVUFBVTtRQUFFLE9BQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM3RSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBQ3JGLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsS0FBSyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ2hHLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE9BQW1CO0lBQzFDLCtFQUErRTtJQUMvRSxxRkFBcUY7SUFDckYsdURBQXVEO0lBQ3ZELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDakMsSUFBSTtZQUNGLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDNUU7UUFBQyxNQUFNO1lBQ04sT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1NBQ3JDO0tBQ0Y7SUFDRCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDdEMsQ0FBQztBQUVELFVBQVU7QUFDVixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBdUI7SUFDbkQsT0FBTyxFQUFFLEVBQUU7SUFDWCxrQkFBa0IsQ0FBQyxHQUFXO1FBQzVCLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzNDLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSTtnQkFDRixNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUE7Z0JBQ25ELElBQUksU0FBUztvQkFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO2FBQ3JDO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxrREFBa0QsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUE7YUFDN0U7WUFDRCxPQUFPLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQ2hDO1FBRUQsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBVztRQUM3QixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDOUIsSUFBSSxNQUFNO1lBQUUsT0FBTyxNQUFNLENBQUE7UUFFekIsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDckQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzFDLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUM5QixDQUFDO0NBQ0YsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXBvc2l0ZUZyb21Mb2FkZXIgfSBmcm9tICd+c2RrL2FsbC1jb21wb3NpdGVzJ1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICd+c3lzdGVtL1J1bnRpbWUnXG5pbXBvcnQgeyBDb21wb3NpdGUgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IGRlY29kZVV0ZjggfSBmcm9tICcuL2ludGVybmFsL3V0ZjgnXG5cbmNvbnN0IGNvbXBvc2l0ZXMgPSBuZXcgTWFwPHN0cmluZywgQ29tcG9zaXRlLlJlc291cmNlPigpXG5cbmZ1bmN0aW9uIGZpbmRDYWNoZWQoc3JjOiBzdHJpbmcpOiBDb21wb3NpdGUuUmVzb3VyY2UgfCBudWxsIHtcbiAgcmV0dXJuIGNvbXBvc2l0ZXMuZ2V0KHNyYykgPz8gbnVsbFxufVxuXG5mdW5jdGlvbiBjYWNoZShzcmM6IHN0cmluZywgY29tcG9zaXRlOiBDb21wb3NpdGUuRGVmaW5pdGlvbik6IENvbXBvc2l0ZS5SZXNvdXJjZSB7XG4gIGNvbnN0IGV4aXN0aW5nID0gZmluZENhY2hlZChzcmMpXG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nXG4gIGNvbnN0IHJlc291cmNlOiBDb21wb3NpdGUuUmVzb3VyY2UgPSB7IHNyYywgY29tcG9zaXRlIH1cbiAgY29tcG9zaXRlcy5zZXQoc3JjLCByZXNvdXJjZSlcbiAgcmV0dXJuIHJlc291cmNlXG59XG5cbmZ1bmN0aW9uIGRlY29kZUZyb21Mb2FkZXIoc3JjOiBzdHJpbmcsIGZyb21Mb2FkZXI6IHVua25vd24pOiBDb21wb3NpdGUuRGVmaW5pdGlvbiB8IG51bGwge1xuICBpZiAoZnJvbUxvYWRlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBDb21wb3NpdGUuZnJvbUJpbmFyeShmcm9tTG9hZGVyKVxuICBpZiAodHlwZW9mIGZyb21Mb2FkZXIgPT09ICdzdHJpbmcnKSByZXR1cm4gQ29tcG9zaXRlLmZyb21Kc29uKEpTT04ucGFyc2UoZnJvbUxvYWRlcikpXG4gIGlmICh0eXBlb2YgZnJvbUxvYWRlciA9PT0gJ29iamVjdCcgJiYgZnJvbUxvYWRlciAhPT0gbnVsbCkgcmV0dXJuIENvbXBvc2l0ZS5mcm9tSnNvbihmcm9tTG9hZGVyKVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBkZWNvZGVGcm9tQnl0ZXMoY29udGVudDogVWludDhBcnJheSk6IENvbXBvc2l0ZS5EZWZpbml0aW9uIHtcbiAgLy8gLmNvbXBvc2l0ZSBmaWxlcyBhcmUgSlNPTiAoVVRGLTgpOyAuY29tcG9zaXRlLmJpbiBmaWxlcyBhcmUgcHJvdG9idWYgYmluYXJ5LlxuICAvLyBUaGUgZmlyc3QtYnl0ZSBjaGVjayBpcyBhIGZhc3QgcGF0aDsgYSBKU09OLnBhcnNlIGZhaWx1cmUgZmFsbHMgYmFjayB0byBmcm9tQmluYXJ5XG4gIC8vIGJlY2F1c2UgYSBwcm90b2J1ZiBtZXNzYWdlIGNhbiBhbHNvIGJlZ2luIHdpdGggMHg3Yi5cbiAgaWYgKGNvbnRlbnRbMF0gPT09IDB4N2IgLyogJ3snICovKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBDb21wb3NpdGUuZnJvbUpzb24oSlNPTi5wYXJzZShkZWNvZGVVdGY4KGNvbnRlbnQsIHsgZmF0YWw6IHRydWUgfSkpKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIENvbXBvc2l0ZS5mcm9tQmluYXJ5KGNvbnRlbnQpXG4gICAgfVxuICB9XG4gIHJldHVybiBDb21wb3NpdGUuZnJvbUJpbmFyeShjb250ZW50KVxufVxuXG4vLyBAcHVibGljXG5leHBvcnQgY29uc3QgY29tcG9zaXRlUHJvdmlkZXI6IENvbXBvc2l0ZS5Qcm92aWRlciA9IHtcbiAgc2NoZW1hczogW10sXG4gIGdldENvbXBvc2l0ZU9yTnVsbChzcmM6IHN0cmluZykge1xuICAgIGNvbnN0IGZyb21Mb2FkZXIgPSBjb21wb3NpdGVGcm9tTG9hZGVyW3NyY11cbiAgICBpZiAoZnJvbUxvYWRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlID0gZGVjb2RlRnJvbUxvYWRlcihzcmMsIGZyb21Mb2FkZXIpXG4gICAgICAgIGlmIChjb21wb3NpdGUpIGNhY2hlKHNyYywgY29tcG9zaXRlKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvbXBvc2l0ZVByb3ZpZGVyOiBmYWlsZWQgdG8gZGVjb2RlIGNvbXBvc2l0ZSBcIiR7c3JjfVwiYCwgZXJyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGNvbXBvc2l0ZUZyb21Mb2FkZXJbc3JjXVxuICAgIH1cblxuICAgIHJldHVybiBmaW5kQ2FjaGVkKHNyYylcbiAgfSxcblxuICBhc3luYyBsb2FkQ29tcG9zaXRlKHNyYzogc3RyaW5nKTogUHJvbWlzZTxDb21wb3NpdGUuUmVzb3VyY2U+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBmaW5kQ2FjaGVkKHNyYylcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkXG5cbiAgICBjb25zdCB7IGNvbnRlbnQgfSA9IGF3YWl0IHJlYWRGaWxlKHsgZmlsZU5hbWU6IHNyYyB9KVxuICAgIGNvbnN0IGNvbXBvc2l0ZSA9IGRlY29kZUZyb21CeXRlcyhjb250ZW50KVxuICAgIHJldHVybiBjYWNoZShzcmMsIGNvbXBvc2l0ZSlcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained UTF-8 codec implementing the WHATWG Encoding Standard
|
|
3
|
+
* algorithms (https://encoding.spec.whatwg.org/), so SDK code never depends
|
|
4
|
+
* on the host providing `TextEncoder` / `TextDecoder` globals.
|
|
5
|
+
*/
|
|
6
|
+
export type DecodeUtf8Options = {
|
|
7
|
+
fatal?: boolean;
|
|
8
|
+
ignoreBOM?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function decodeUtf8(input: Uint8Array, options?: DecodeUtf8Options): string;
|
|
11
|
+
export declare function encodeUtf8(input: string): Uint8Array;
|
|
12
|
+
export declare function encodeUtf8Into(source: string, destination: Uint8Array): {
|
|
13
|
+
read: number;
|
|
14
|
+
written: number;
|
|
15
|
+
};
|
package/internal/utf8.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained UTF-8 codec implementing the WHATWG Encoding Standard
|
|
3
|
+
* algorithms (https://encoding.spec.whatwg.org/), so SDK code never depends
|
|
4
|
+
* on the host providing `TextEncoder` / `TextDecoder` globals.
|
|
5
|
+
*/
|
|
6
|
+
const REPLACEMENT_CHARACTER = 0xfffd;
|
|
7
|
+
export function decodeUtf8(input, options = {}) {
|
|
8
|
+
const fatal = options.fatal === true;
|
|
9
|
+
const start = !options.ignoreBOM && input.length >= 3 && input[0] === 0xef && input[1] === 0xbb && input[2] === 0xbf ? 3 : 0;
|
|
10
|
+
let result = '';
|
|
11
|
+
let pending = [];
|
|
12
|
+
let codePoint = 0;
|
|
13
|
+
let bytesNeeded = 0;
|
|
14
|
+
let bytesSeen = 0;
|
|
15
|
+
let lowerBoundary = 0x80;
|
|
16
|
+
let upperBoundary = 0xbf;
|
|
17
|
+
function emit(value) {
|
|
18
|
+
if (value <= 0xffff) {
|
|
19
|
+
pending.push(value);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const offset = value - 0x10000;
|
|
23
|
+
pending.push(0xd800 + (offset >> 10), 0xdc00 + (offset & 0x3ff));
|
|
24
|
+
}
|
|
25
|
+
if (pending.length >= 4096) {
|
|
26
|
+
result += String.fromCharCode(...pending);
|
|
27
|
+
pending = [];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function malformed() {
|
|
31
|
+
if (fatal)
|
|
32
|
+
throw new TypeError('decodeUtf8: the encoded data is not valid utf-8');
|
|
33
|
+
emit(REPLACEMENT_CHARACTER);
|
|
34
|
+
}
|
|
35
|
+
for (let i = start; i < input.length; i++) {
|
|
36
|
+
const byte = input[i];
|
|
37
|
+
if (bytesNeeded === 0) {
|
|
38
|
+
if (byte <= 0x7f) {
|
|
39
|
+
emit(byte);
|
|
40
|
+
}
|
|
41
|
+
else if (byte >= 0xc2 && byte <= 0xdf) {
|
|
42
|
+
bytesNeeded = 1;
|
|
43
|
+
codePoint = byte & 0x1f;
|
|
44
|
+
}
|
|
45
|
+
else if (byte >= 0xe0 && byte <= 0xef) {
|
|
46
|
+
if (byte === 0xe0)
|
|
47
|
+
lowerBoundary = 0xa0;
|
|
48
|
+
if (byte === 0xed)
|
|
49
|
+
upperBoundary = 0x9f;
|
|
50
|
+
bytesNeeded = 2;
|
|
51
|
+
codePoint = byte & 0xf;
|
|
52
|
+
}
|
|
53
|
+
else if (byte >= 0xf0 && byte <= 0xf4) {
|
|
54
|
+
if (byte === 0xf0)
|
|
55
|
+
lowerBoundary = 0x90;
|
|
56
|
+
if (byte === 0xf4)
|
|
57
|
+
upperBoundary = 0x8f;
|
|
58
|
+
bytesNeeded = 3;
|
|
59
|
+
codePoint = byte & 0x7;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
malformed();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (byte < lowerBoundary || byte > upperBoundary) {
|
|
66
|
+
codePoint = 0;
|
|
67
|
+
bytesNeeded = 0;
|
|
68
|
+
bytesSeen = 0;
|
|
69
|
+
lowerBoundary = 0x80;
|
|
70
|
+
upperBoundary = 0xbf;
|
|
71
|
+
malformed();
|
|
72
|
+
// the spec prepends the byte back to the stream: it starts a new sequence
|
|
73
|
+
i--;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
lowerBoundary = 0x80;
|
|
77
|
+
upperBoundary = 0xbf;
|
|
78
|
+
codePoint = (codePoint << 6) | (byte & 0x3f);
|
|
79
|
+
if (++bytesSeen === bytesNeeded) {
|
|
80
|
+
emit(codePoint);
|
|
81
|
+
codePoint = 0;
|
|
82
|
+
bytesNeeded = 0;
|
|
83
|
+
bytesSeen = 0;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (bytesNeeded !== 0)
|
|
88
|
+
malformed();
|
|
89
|
+
if (pending.length > 0)
|
|
90
|
+
result += String.fromCharCode(...pending);
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
export function encodeUtf8(input) {
|
|
94
|
+
const output = new Uint8Array(utf8ByteLength(input));
|
|
95
|
+
let offset = 0;
|
|
96
|
+
for (let i = 0; i < input.length; i++) {
|
|
97
|
+
const codePoint = codePointAt(input, i);
|
|
98
|
+
if (codePoint > 0xffff)
|
|
99
|
+
i++;
|
|
100
|
+
offset = writeCodePoint(output, offset, codePoint);
|
|
101
|
+
}
|
|
102
|
+
return output;
|
|
103
|
+
}
|
|
104
|
+
export function encodeUtf8Into(source, destination) {
|
|
105
|
+
let read = 0;
|
|
106
|
+
let written = 0;
|
|
107
|
+
for (let i = 0; i < source.length; i++) {
|
|
108
|
+
const codePoint = codePointAt(source, i);
|
|
109
|
+
const size = byteSize(codePoint);
|
|
110
|
+
if (written + size > destination.length)
|
|
111
|
+
break;
|
|
112
|
+
written = writeCodePoint(destination, written, codePoint);
|
|
113
|
+
if (codePoint > 0xffff) {
|
|
114
|
+
i++;
|
|
115
|
+
read += 2;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
read += 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return { read, written };
|
|
122
|
+
}
|
|
123
|
+
// Reads the code point at index, replacing unpaired surrogates with U+FFFD
|
|
124
|
+
// (the USVString conversion `TextEncoder` mandates).
|
|
125
|
+
function codePointAt(input, index) {
|
|
126
|
+
const first = input.charCodeAt(index);
|
|
127
|
+
if (first >= 0xd800 && first <= 0xdbff) {
|
|
128
|
+
const second = index + 1 < input.length ? input.charCodeAt(index + 1) : 0;
|
|
129
|
+
if (second >= 0xdc00 && second <= 0xdfff)
|
|
130
|
+
return 0x10000 + ((first - 0xd800) << 10) + (second - 0xdc00);
|
|
131
|
+
return REPLACEMENT_CHARACTER;
|
|
132
|
+
}
|
|
133
|
+
if (first >= 0xdc00 && first <= 0xdfff)
|
|
134
|
+
return REPLACEMENT_CHARACTER;
|
|
135
|
+
return first;
|
|
136
|
+
}
|
|
137
|
+
function byteSize(codePoint) {
|
|
138
|
+
return codePoint <= 0x7f ? 1 : codePoint <= 0x7ff ? 2 : codePoint <= 0xffff ? 3 : 4;
|
|
139
|
+
}
|
|
140
|
+
function utf8ByteLength(input) {
|
|
141
|
+
let length = 0;
|
|
142
|
+
for (let i = 0; i < input.length; i++) {
|
|
143
|
+
const codePoint = codePointAt(input, i);
|
|
144
|
+
if (codePoint > 0xffff)
|
|
145
|
+
i++;
|
|
146
|
+
length += byteSize(codePoint);
|
|
147
|
+
}
|
|
148
|
+
return length;
|
|
149
|
+
}
|
|
150
|
+
function writeCodePoint(output, offset, codePoint) {
|
|
151
|
+
let next = offset;
|
|
152
|
+
if (codePoint <= 0x7f) {
|
|
153
|
+
output[next++] = codePoint;
|
|
154
|
+
}
|
|
155
|
+
else if (codePoint <= 0x7ff) {
|
|
156
|
+
output[next++] = 0xc0 | (codePoint >> 6);
|
|
157
|
+
output[next++] = 0x80 | (codePoint & 0x3f);
|
|
158
|
+
}
|
|
159
|
+
else if (codePoint <= 0xffff) {
|
|
160
|
+
output[next++] = 0xe0 | (codePoint >> 12);
|
|
161
|
+
output[next++] = 0x80 | ((codePoint >> 6) & 0x3f);
|
|
162
|
+
output[next++] = 0x80 | (codePoint & 0x3f);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
output[next++] = 0xf0 | (codePoint >> 18);
|
|
166
|
+
output[next++] = 0x80 | ((codePoint >> 12) & 0x3f);
|
|
167
|
+
output[next++] = 0x80 | ((codePoint >> 6) & 0x3f);
|
|
168
|
+
output[next++] = 0x80 | (codePoint & 0x3f);
|
|
169
|
+
}
|
|
170
|
+
return next;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRmOC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnRlcm5hbC91dGY4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQTtBQU9wQyxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWlCLEVBQUUsVUFBNkIsRUFBRTtJQUMzRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQTtJQUNwQyxNQUFNLEtBQUssR0FDVCxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRWhILElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQTtJQUNmLElBQUksT0FBTyxHQUFhLEVBQUUsQ0FBQTtJQUMxQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUE7SUFDakIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFBO0lBQ25CLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQTtJQUNqQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUE7SUFDeEIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFBO0lBRXhCLFNBQVMsSUFBSSxDQUFDLEtBQWE7UUFDekIsSUFBSSxLQUFLLElBQUksTUFBTSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDcEI7YUFBTTtZQUNMLE1BQU0sTUFBTSxHQUFHLEtBQUssR0FBRyxPQUFPLENBQUE7WUFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEVB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R0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUE7S0FDM0M7U0FBTTtRQUNMLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUN6QyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUNsRCxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUNqRCxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUE7S0FDM0M7SUFDRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlbGYtY29udGFpbmVkIFVURi04IGNvZGVjIGltcGxlbWVudGluZyB0aGUgV0hBVFdHIEVuY29kaW5nIFN0YW5kYXJkXG4gKiBhbGdvcml0aG1zIChodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8pLCBzbyBTREsgY29kZSBuZXZlciBkZXBlbmRzXG4gKiBvbiB0aGUgaG9zdCBwcm92aWRpbmcgYFRleHRFbmNvZGVyYCAvIGBUZXh0RGVjb2RlcmAgZ2xvYmFscy5cbiAqL1xuXG5jb25zdCBSRVBMQUNFTUVOVF9DSEFSQUNURVIgPSAweGZmZmRcblxuZXhwb3J0IHR5cGUgRGVjb2RlVXRmOE9wdGlvbnMgPSB7XG4gIGZhdGFsPzogYm9vbGVhblxuICBpZ25vcmVCT00/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVVdGY4KGlucHV0OiBVaW50OEFycmF5LCBvcHRpb25zOiBEZWNvZGVVdGY4T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgY29uc3QgZmF0YWwgPSBvcHRpb25zLmZhdGFsID09PSB0cnVlXG4gIGNvbnN0IHN0YXJ0ID1cbiAgICAhb3B0aW9ucy5pZ25vcmVCT00gJiYgaW5wdXQubGVuZ3RoID49IDMgJiYgaW5wdXRbMF0gPT09IDB4ZWYgJiYgaW5wdXRbMV0gPT09IDB4YmIgJiYgaW5wdXRbMl0gPT09IDB4YmYgPyAzIDogMFxuXG4gIGxldCByZXN1bHQgPSAnJ1xuICBsZXQgcGVuZGluZzogbnVtYmVyW10gPSBbXVxuICBsZXQgY29kZVBvaW50ID0gMFxuICBsZXQgYnl0ZXNOZWVkZWQgPSAwXG4gIGxldCBieXRlc1NlZW4gPSAwXG4gIGxldCBsb3dlckJvdW5kYXJ5ID0gMHg4MFxuICBsZXQgdXBwZXJCb3VuZGFyeSA9IDB4YmZcblxuICBmdW5jdGlvbiBlbWl0KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPD0gMHhmZmZmKSB7XG4gICAgICBwZW5kaW5nLnB1c2godmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IHZhbHVlIC0gMHgxMDAwMFxuICAgICAgcGVuZGluZy5wdXNoKDB4ZDgwMCArIChvZmZzZXQgPj4gMTApLCAweGRjMDAgKyAob2Zmc2V0ICYgMHgzZmYpKVxuICAgIH1cbiAgICBpZiAocGVuZGluZy5sZW5ndGggPj0gNDA5Nikge1xuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoLi4ucGVuZGluZylcbiAgICAgIHBlbmRpbmcgPSBbXVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1hbGZvcm1lZCgpIHtcbiAgICBpZiAoZmF0YWwpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RlY29kZVV0Zjg6IHRoZSBlbmNvZGVkIGRhdGEgaXMgbm90IHZhbGlkIHV0Zi04JylcbiAgICBlbWl0KFJFUExBQ0VNRU5UX0NIQVJBQ1RFUilcbiAgfVxuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYnl0ZSA9IGlucHV0W2ldXG4gICAgaWYgKGJ5dGVzTmVlZGVkID09PSAwKSB7XG4gICAgICBpZiAoYnl0ZSA8PSAweDdmKSB7XG4gICAgICAgIGVtaXQoYnl0ZSlcbiAgICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSAweGMyICYmIGJ5dGUgPD0gMHhkZikge1xuICAgICAgICBieXRlc05lZWRlZCA9IDFcbiAgICAgICAgY29kZVBvaW50ID0gYnl0ZSAmIDB4MWZcbiAgICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSAweGUwICYmIGJ5dGUgPD0gMHhlZikge1xuICAgICAgICBpZiAoYnl0ZSA9PT0gMHhlMCkgbG93ZXJCb3VuZGFyeSA9IDB4YTBcbiAgICAgICAgaWYgKGJ5dGUgPT09IDB4ZWQpIHVwcGVyQm91bmRhcnkgPSAweDlmXG4gICAgICAgIGJ5dGVzTmVlZGVkID0gMlxuICAgICAgICBjb2RlUG9pbnQgPSBieXRlICYgMHhmXG4gICAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gMHhmMCAmJiBieXRlIDw9IDB4ZjQpIHtcbiAgICAgICAgaWYgKGJ5dGUgPT09IDB4ZjApIGxvd2VyQm91bmRhcnkgPSAweDkwXG4gICAgICAgIGlmIChieXRlID09PSAweGY0KSB1cHBlckJvdW5kYXJ5ID0gMHg4ZlxuICAgICAgICBieXRlc05lZWRlZCA9IDNcbiAgICAgICAgY29kZVBvaW50ID0gYnl0ZSAmIDB4N1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFsZm9ybWVkKClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGJ5dGUgPCBsb3dlckJvdW5kYXJ5IHx8IGJ5dGUgPiB1cHBlckJvdW5kYXJ5KSB7XG4gICAgICBjb2RlUG9pbnQgPSAwXG4gICAgICBieXRlc05lZWRlZCA9IDBcbiAgICAgIGJ5dGVzU2VlbiA9IDBcbiAgICAgIGxvd2VyQm91bmRhcnkgPSAweDgwXG4gICAgICB1cHBlckJvdW5kYXJ5ID0gMHhiZlxuICAgICAgbWFsZm9ybWVkKClcbiAgICAgIC8vIHRoZSBzcGVjIHByZXBlbmRzIHRoZSBieXRlIGJhY2sgdG8gdGhlIHN0cmVhbTogaXQgc3RhcnRzIGEgbmV3IHNlcXVlbmNlXG4gICAgICBpLS1cbiAgICB9IGVsc2Uge1xuICAgICAgbG93ZXJCb3VuZGFyeSA9IDB4ODBcbiAgICAgIHVwcGVyQm91bmRhcnkgPSAweGJmXG4gICAgICBjb2RlUG9pbnQgPSAoY29kZVBvaW50IDw8IDYpIHwgKGJ5dGUgJiAweDNmKVxuICAgICAgaWYgKCsrYnl0ZXNTZWVuID09PSBieXRlc05lZWRlZCkge1xuICAgICAgICBlbWl0KGNvZGVQb2ludClcbiAgICAgICAgY29kZVBvaW50ID0gMFxuICAgICAgICBieXRlc05lZWRlZCA9IDBcbiAgICAgICAgYnl0ZXNTZWVuID0gMFxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoYnl0ZXNOZWVkZWQgIT09IDApIG1hbGZvcm1lZCgpXG5cbiAgaWYgKHBlbmRpbmcubGVuZ3RoID4gMCkgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoLi4ucGVuZGluZylcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVXRmOChpbnB1dDogc3RyaW5nKTogVWludDhBcnJheSB7XG4gIGNvbnN0IG91dHB1dCA9IG5ldyBVaW50OEFycmF5KHV0ZjhCeXRlTGVuZ3RoKGlucHV0KSlcbiAgbGV0IG9mZnNldCA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGVQb2ludCA9IGNvZGVQb2ludEF0KGlucHV0LCBpKVxuICAgIGlmIChjb2RlUG9pbnQgPiAweGZmZmYpIGkrK1xuICAgIG9mZnNldCA9IHdyaXRlQ29kZVBvaW50KG91dHB1dCwgb2Zmc2V0LCBjb2RlUG9pbnQpXG4gIH1cbiAgcmV0dXJuIG91dHB1dFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVXRmOEludG8oc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBVaW50OEFycmF5KTogeyByZWFkOiBudW1iZXI7IHdyaXR0ZW46IG51bWJlciB9IHtcbiAgbGV0IHJlYWQgPSAwXG4gIGxldCB3cml0dGVuID0gMFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGVQb2ludCA9IGNvZGVQb2ludEF0KHNvdXJjZSwgaSlcbiAgICBjb25zdCBzaXplID0gYnl0ZVNpemUoY29kZVBvaW50KVxuICAgIGlmICh3cml0dGVuICsgc2l6ZSA+IGRlc3RpbmF0aW9uLmxlbmd0aCkgYnJlYWtcbiAgICB3cml0dGVuID0gd3JpdGVDb2RlUG9pbnQoZGVzdGluYXRpb24sIHdyaXR0ZW4sIGNvZGVQb2ludClcbiAgICBpZiAoY29kZVBvaW50ID4gMHhmZmZmKSB7XG4gICAgICBpKytcbiAgICAgIHJlYWQgKz0gMlxuICAgIH0gZWxzZSB7XG4gICAgICByZWFkICs9IDFcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcmVhZCwgd3JpdHRlbiB9XG59XG5cbi8vIFJlYWRzIHRoZSBjb2RlIHBvaW50IGF0IGluZGV4LCByZXBsYWNpbmcgdW5wYWlyZWQgc3Vycm9nYXRlcyB3aXRoIFUrRkZGRFxuLy8gKHRoZSBVU1ZTdHJpbmcgY29udmVyc2lvbiBgVGV4dEVuY29kZXJgIG1hbmRhdGVzKS5cbmZ1bmN0aW9uIGNvZGVQb2ludEF0KGlucHV0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBmaXJzdCA9IGlucHV0LmNoYXJDb2RlQXQoaW5kZXgpXG4gIGlmIChmaXJzdCA+PSAweGQ4MDAgJiYgZmlyc3QgPD0gMHhkYmZmKSB7XG4gICAgY29uc3Qgc2Vjb25kID0gaW5kZXggKyAxIDwgaW5wdXQubGVuZ3RoID8gaW5wdXQuY2hhckNvZGVBdChpbmRleCArIDEpIDogMFxuICAgIGlmIChzZWNvbmQgPj0gMHhkYzAwICYmIHNlY29uZCA8PSAweGRmZmYpIHJldHVybiAweDEwMDAwICsgKChmaXJzdCAtIDB4ZDgwMCkgPDwgMTApICsgKHNlY29uZCAtIDB4ZGMwMClcbiAgICByZXR1cm4gUkVQTEFDRU1FTlRfQ0hBUkFDVEVSXG4gIH1cbiAgaWYgKGZpcnN0ID49IDB4ZGMwMCAmJiBmaXJzdCA8PSAweGRmZmYpIHJldHVybiBSRVBMQUNFTUVOVF9DSEFSQUNURVJcbiAgcmV0dXJuIGZpcnN0XG59XG5cbmZ1bmN0aW9uIGJ5dGVTaXplKGNvZGVQb2ludDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGNvZGVQb2ludCA8PSAweDdmID8gMSA6IGNvZGVQb2ludCA8PSAweDdmZiA/IDIgOiBjb2RlUG9pbnQgPD0gMHhmZmZmID8gMyA6IDRcbn1cblxuZnVuY3Rpb24gdXRmOEJ5dGVMZW5ndGgoaW5wdXQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGxldCBsZW5ndGggPSAwXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSBjb2RlUG9pbnRBdChpbnB1dCwgaSlcbiAgICBpZiAoY29kZVBvaW50ID4gMHhmZmZmKSBpKytcbiAgICBsZW5ndGggKz0gYnl0ZVNpemUoY29kZVBvaW50KVxuICB9XG4gIHJldHVybiBsZW5ndGhcbn1cblxuZnVuY3Rpb24gd3JpdGVDb2RlUG9pbnQob3V0cHV0OiBVaW50OEFycmF5LCBvZmZzZXQ6IG51bWJlciwgY29kZVBvaW50OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgbmV4dCA9IG9mZnNldFxuICBpZiAoY29kZVBvaW50IDw9IDB4N2YpIHtcbiAgICBvdXRwdXRbbmV4dCsrXSA9IGNvZGVQb2ludFxuICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8PSAweDdmZikge1xuICAgIG91dHB1dFtuZXh0KytdID0gMHhjMCB8IChjb2RlUG9pbnQgPj4gNilcbiAgICBvdXRwdXRbbmV4dCsrXSA9IDB4ODAgfCAoY29kZVBvaW50ICYgMHgzZilcbiAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPD0gMHhmZmZmKSB7XG4gICAgb3V0cHV0W25leHQrK10gPSAweGUwIHwgKGNvZGVQb2ludCA+PiAxMilcbiAgICBvdXRwdXRbbmV4dCsrXSA9IDB4ODAgfCAoKGNvZGVQb2ludCA+PiA2KSAmIDB4M2YpXG4gICAgb3V0cHV0W25leHQrK10gPSAweDgwIHwgKGNvZGVQb2ludCAmIDB4M2YpXG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0W25leHQrK10gPSAweGYwIHwgKGNvZGVQb2ludCA+PiAxOClcbiAgICBvdXRwdXRbbmV4dCsrXSA9IDB4ODAgfCAoKGNvZGVQb2ludCA+PiAxMikgJiAweDNmKVxuICAgIG91dHB1dFtuZXh0KytdID0gMHg4MCB8ICgoY29kZVBvaW50ID4+IDYpICYgMHgzZilcbiAgICBvdXRwdXRbbmV4dCsrXSA9IDB4ODAgfCAoY29kZVBvaW50ICYgMHgzZilcbiAgfVxuICByZXR1cm4gbmV4dFxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl/sdk",
|
|
3
3
|
"description": "",
|
|
4
|
-
"version": "7.24.
|
|
4
|
+
"version": "7.24.6-29580060460.commit-06f0b7e",
|
|
5
5
|
"author": "Decentraland",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@dcl/ecs": "7.24.
|
|
7
|
+
"@dcl/ecs": "7.24.6-29580060460.commit-06f0b7e",
|
|
8
8
|
"@dcl/ecs-math": "2.1.0",
|
|
9
9
|
"@dcl/explorer": "1.0.164509-20240802172549.commit-fb95b9b",
|
|
10
|
-
"@dcl/js-runtime": "7.24.
|
|
11
|
-
"@dcl/react-ecs": "7.24.
|
|
12
|
-
"@dcl/sdk-commands": "7.24.
|
|
13
|
-
"text-encoding": "0.7.0"
|
|
10
|
+
"@dcl/js-runtime": "7.24.6-29580060460.commit-06f0b7e",
|
|
11
|
+
"@dcl/react-ecs": "7.24.6-29580060460.commit-06f0b7e",
|
|
12
|
+
"@dcl/sdk-commands": "7.24.6-29580060460.commit-06f0b7e"
|
|
14
13
|
},
|
|
15
14
|
"keywords": [],
|
|
16
15
|
"license": "Apache-2.0",
|
|
@@ -35,5 +34,5 @@
|
|
|
35
34
|
},
|
|
36
35
|
"types": "./index.d.ts",
|
|
37
36
|
"typings": "./index.d.ts",
|
|
38
|
-
"commit": "
|
|
37
|
+
"commit": "06f0b7e70e2b43e9189a7f87de2a30db16ccb8e7"
|
|
39
38
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { compositeFromLoader } from '~sdk/all-composites'
|
|
2
2
|
import { readFile } from '~system/Runtime'
|
|
3
|
-
import { Composite
|
|
3
|
+
import { Composite } from '@dcl/ecs'
|
|
4
|
+
import { decodeUtf8 } from './internal/utf8'
|
|
4
5
|
|
|
5
6
|
const composites = new Map<string, Composite.Resource>()
|
|
6
7
|
|
|
@@ -28,16 +29,8 @@ function decodeFromBytes(content: Uint8Array): Composite.Definition {
|
|
|
28
29
|
// The first-byte check is a fast path; a JSON.parse failure falls back to fromBinary
|
|
29
30
|
// because a protobuf message can also begin with 0x7b.
|
|
30
31
|
if (content[0] === 0x7b /* '{' */) {
|
|
31
|
-
const TD = getGlobal<new () => { decode(input: Uint8Array): string }>('TextDecoder')
|
|
32
|
-
if (!TD) {
|
|
33
|
-
throw new Error(
|
|
34
|
-
'loadComposite: TextDecoder is not available in this runtime. ' +
|
|
35
|
-
'Use a .composite.bin file, or import `@dcl/sdk/ethereum-provider` ' +
|
|
36
|
-
'to install the TextEncoder/TextDecoder polyfill.'
|
|
37
|
-
)
|
|
38
|
-
}
|
|
39
32
|
try {
|
|
40
|
-
return Composite.fromJson(JSON.parse(
|
|
33
|
+
return Composite.fromJson(JSON.parse(decodeUtf8(content, { fatal: true })))
|
|
41
34
|
} catch {
|
|
42
35
|
return Composite.fromBinary(content)
|
|
43
36
|
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-contained UTF-8 codec implementing the WHATWG Encoding Standard
|
|
3
|
+
* algorithms (https://encoding.spec.whatwg.org/), so SDK code never depends
|
|
4
|
+
* on the host providing `TextEncoder` / `TextDecoder` globals.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const REPLACEMENT_CHARACTER = 0xfffd
|
|
8
|
+
|
|
9
|
+
export type DecodeUtf8Options = {
|
|
10
|
+
fatal?: boolean
|
|
11
|
+
ignoreBOM?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function decodeUtf8(input: Uint8Array, options: DecodeUtf8Options = {}): string {
|
|
15
|
+
const fatal = options.fatal === true
|
|
16
|
+
const start =
|
|
17
|
+
!options.ignoreBOM && input.length >= 3 && input[0] === 0xef && input[1] === 0xbb && input[2] === 0xbf ? 3 : 0
|
|
18
|
+
|
|
19
|
+
let result = ''
|
|
20
|
+
let pending: number[] = []
|
|
21
|
+
let codePoint = 0
|
|
22
|
+
let bytesNeeded = 0
|
|
23
|
+
let bytesSeen = 0
|
|
24
|
+
let lowerBoundary = 0x80
|
|
25
|
+
let upperBoundary = 0xbf
|
|
26
|
+
|
|
27
|
+
function emit(value: number) {
|
|
28
|
+
if (value <= 0xffff) {
|
|
29
|
+
pending.push(value)
|
|
30
|
+
} else {
|
|
31
|
+
const offset = value - 0x10000
|
|
32
|
+
pending.push(0xd800 + (offset >> 10), 0xdc00 + (offset & 0x3ff))
|
|
33
|
+
}
|
|
34
|
+
if (pending.length >= 4096) {
|
|
35
|
+
result += String.fromCharCode(...pending)
|
|
36
|
+
pending = []
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function malformed() {
|
|
41
|
+
if (fatal) throw new TypeError('decodeUtf8: the encoded data is not valid utf-8')
|
|
42
|
+
emit(REPLACEMENT_CHARACTER)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
for (let i = start; i < input.length; i++) {
|
|
46
|
+
const byte = input[i]
|
|
47
|
+
if (bytesNeeded === 0) {
|
|
48
|
+
if (byte <= 0x7f) {
|
|
49
|
+
emit(byte)
|
|
50
|
+
} else if (byte >= 0xc2 && byte <= 0xdf) {
|
|
51
|
+
bytesNeeded = 1
|
|
52
|
+
codePoint = byte & 0x1f
|
|
53
|
+
} else if (byte >= 0xe0 && byte <= 0xef) {
|
|
54
|
+
if (byte === 0xe0) lowerBoundary = 0xa0
|
|
55
|
+
if (byte === 0xed) upperBoundary = 0x9f
|
|
56
|
+
bytesNeeded = 2
|
|
57
|
+
codePoint = byte & 0xf
|
|
58
|
+
} else if (byte >= 0xf0 && byte <= 0xf4) {
|
|
59
|
+
if (byte === 0xf0) lowerBoundary = 0x90
|
|
60
|
+
if (byte === 0xf4) upperBoundary = 0x8f
|
|
61
|
+
bytesNeeded = 3
|
|
62
|
+
codePoint = byte & 0x7
|
|
63
|
+
} else {
|
|
64
|
+
malformed()
|
|
65
|
+
}
|
|
66
|
+
} else if (byte < lowerBoundary || byte > upperBoundary) {
|
|
67
|
+
codePoint = 0
|
|
68
|
+
bytesNeeded = 0
|
|
69
|
+
bytesSeen = 0
|
|
70
|
+
lowerBoundary = 0x80
|
|
71
|
+
upperBoundary = 0xbf
|
|
72
|
+
malformed()
|
|
73
|
+
// the spec prepends the byte back to the stream: it starts a new sequence
|
|
74
|
+
i--
|
|
75
|
+
} else {
|
|
76
|
+
lowerBoundary = 0x80
|
|
77
|
+
upperBoundary = 0xbf
|
|
78
|
+
codePoint = (codePoint << 6) | (byte & 0x3f)
|
|
79
|
+
if (++bytesSeen === bytesNeeded) {
|
|
80
|
+
emit(codePoint)
|
|
81
|
+
codePoint = 0
|
|
82
|
+
bytesNeeded = 0
|
|
83
|
+
bytesSeen = 0
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (bytesNeeded !== 0) malformed()
|
|
88
|
+
|
|
89
|
+
if (pending.length > 0) result += String.fromCharCode(...pending)
|
|
90
|
+
return result
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function encodeUtf8(input: string): Uint8Array {
|
|
94
|
+
const output = new Uint8Array(utf8ByteLength(input))
|
|
95
|
+
let offset = 0
|
|
96
|
+
for (let i = 0; i < input.length; i++) {
|
|
97
|
+
const codePoint = codePointAt(input, i)
|
|
98
|
+
if (codePoint > 0xffff) i++
|
|
99
|
+
offset = writeCodePoint(output, offset, codePoint)
|
|
100
|
+
}
|
|
101
|
+
return output
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function encodeUtf8Into(source: string, destination: Uint8Array): { read: number; written: number } {
|
|
105
|
+
let read = 0
|
|
106
|
+
let written = 0
|
|
107
|
+
for (let i = 0; i < source.length; i++) {
|
|
108
|
+
const codePoint = codePointAt(source, i)
|
|
109
|
+
const size = byteSize(codePoint)
|
|
110
|
+
if (written + size > destination.length) break
|
|
111
|
+
written = writeCodePoint(destination, written, codePoint)
|
|
112
|
+
if (codePoint > 0xffff) {
|
|
113
|
+
i++
|
|
114
|
+
read += 2
|
|
115
|
+
} else {
|
|
116
|
+
read += 1
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { read, written }
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Reads the code point at index, replacing unpaired surrogates with U+FFFD
|
|
123
|
+
// (the USVString conversion `TextEncoder` mandates).
|
|
124
|
+
function codePointAt(input: string, index: number): number {
|
|
125
|
+
const first = input.charCodeAt(index)
|
|
126
|
+
if (first >= 0xd800 && first <= 0xdbff) {
|
|
127
|
+
const second = index + 1 < input.length ? input.charCodeAt(index + 1) : 0
|
|
128
|
+
if (second >= 0xdc00 && second <= 0xdfff) return 0x10000 + ((first - 0xd800) << 10) + (second - 0xdc00)
|
|
129
|
+
return REPLACEMENT_CHARACTER
|
|
130
|
+
}
|
|
131
|
+
if (first >= 0xdc00 && first <= 0xdfff) return REPLACEMENT_CHARACTER
|
|
132
|
+
return first
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function byteSize(codePoint: number): number {
|
|
136
|
+
return codePoint <= 0x7f ? 1 : codePoint <= 0x7ff ? 2 : codePoint <= 0xffff ? 3 : 4
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function utf8ByteLength(input: string): number {
|
|
140
|
+
let length = 0
|
|
141
|
+
for (let i = 0; i < input.length; i++) {
|
|
142
|
+
const codePoint = codePointAt(input, i)
|
|
143
|
+
if (codePoint > 0xffff) i++
|
|
144
|
+
length += byteSize(codePoint)
|
|
145
|
+
}
|
|
146
|
+
return length
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function writeCodePoint(output: Uint8Array, offset: number, codePoint: number): number {
|
|
150
|
+
let next = offset
|
|
151
|
+
if (codePoint <= 0x7f) {
|
|
152
|
+
output[next++] = codePoint
|
|
153
|
+
} else if (codePoint <= 0x7ff) {
|
|
154
|
+
output[next++] = 0xc0 | (codePoint >> 6)
|
|
155
|
+
output[next++] = 0x80 | (codePoint & 0x3f)
|
|
156
|
+
} else if (codePoint <= 0xffff) {
|
|
157
|
+
output[next++] = 0xe0 | (codePoint >> 12)
|
|
158
|
+
output[next++] = 0x80 | ((codePoint >> 6) & 0x3f)
|
|
159
|
+
output[next++] = 0x80 | (codePoint & 0x3f)
|
|
160
|
+
} else {
|
|
161
|
+
output[next++] = 0xf0 | (codePoint >> 18)
|
|
162
|
+
output[next++] = 0x80 | ((codePoint >> 12) & 0x3f)
|
|
163
|
+
output[next++] = 0x80 | ((codePoint >> 6) & 0x3f)
|
|
164
|
+
output[next++] = 0x80 | (codePoint & 0x3f)
|
|
165
|
+
}
|
|
166
|
+
return next
|
|
167
|
+
}
|
package/src/text-codec.ts
CHANGED
|
@@ -1,23 +1,70 @@
|
|
|
1
|
-
import TextEncodingPolyfill from 'text-encoding'
|
|
2
1
|
import { setGlobalPolyfill } from '@dcl/ecs'
|
|
2
|
+
import { decodeUtf8, encodeUtf8, encodeUtf8Into } from './internal/utf8'
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* WHATWG-shaped `TextEncoder` / `TextDecoder` over the SDK's own UTF-8 codec.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
* UTF-8 is the only supported encoding: the decoder throws a `RangeError` for
|
|
8
|
+
* any other label instead of silently mis-decoding, and rejects `{ stream: true }`.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// Labels the WHATWG Encoding Standard maps to utf-8.
|
|
12
|
+
const UTF8_LABELS = ['unicode-1-1-utf-8', 'unicode11utf8', 'unicode20utf8', 'utf-8', 'utf8', 'x-unicode20utf8']
|
|
13
|
+
|
|
14
|
+
function toUint8Array(input?: ArrayBuffer | ArrayBufferView): Uint8Array {
|
|
15
|
+
if (input === undefined) return new Uint8Array(0)
|
|
16
|
+
if (input instanceof Uint8Array) return input
|
|
17
|
+
if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength)
|
|
18
|
+
return new Uint8Array(input)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class TextEncoder {
|
|
22
|
+
readonly encoding = 'utf-8'
|
|
23
|
+
|
|
24
|
+
encode(input: string = ''): Uint8Array {
|
|
25
|
+
return encodeUtf8(String(input))
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
encodeInto(source: string, destination: Uint8Array): { read: number; written: number } {
|
|
29
|
+
return encodeUtf8Into(String(source), destination)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class TextDecoder {
|
|
34
|
+
readonly encoding = 'utf-8'
|
|
35
|
+
readonly fatal: boolean
|
|
36
|
+
readonly ignoreBOM: boolean
|
|
37
|
+
|
|
38
|
+
constructor(label: string = 'utf-8', options: { fatal?: boolean; ignoreBOM?: boolean } = {}) {
|
|
39
|
+
// the spec strips ASCII whitespace only, so String.prototype.trim is too wide
|
|
40
|
+
const normalized = String(label)
|
|
41
|
+
.replace(/^[\t\n\f\r ]+|[\t\n\f\r ]+$/g, '')
|
|
42
|
+
.toLowerCase()
|
|
43
|
+
if (!UTF8_LABELS.includes(normalized)) {
|
|
44
|
+
throw new RangeError(`TextDecoder: only utf-8 is supported, got "${label}"`)
|
|
45
|
+
}
|
|
46
|
+
this.fatal = options.fatal === true
|
|
47
|
+
this.ignoreBOM = options.ignoreBOM === true
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
decode(input?: ArrayBuffer | ArrayBufferView, options: { stream?: boolean } = {}): string {
|
|
51
|
+
if (options.stream) throw new TypeError('TextDecoder: streaming is not supported')
|
|
52
|
+
return decodeUtf8(toUint8Array(input), { fatal: this.fatal, ignoreBOM: this.ignoreBOM })
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Install `TextEncoder` / `TextDecoder` on `globalThis` where the runtime does
|
|
58
|
+
* not provide them (native implementations always win over these polyfills).
|
|
11
59
|
*
|
|
12
60
|
* Exposed from the lean `@dcl/sdk/text-codec` subpath so consumers can install
|
|
13
|
-
* the polyfill without pulling in the ethereum provider
|
|
14
|
-
* `text-encoding` into scenes that never reach this module.
|
|
61
|
+
* the polyfill without pulling in the ethereum provider.
|
|
15
62
|
*/
|
|
16
63
|
// NOTE: this function mutates globalThis — it is NOT pure. Do not annotate
|
|
17
64
|
// with /* @__PURE__ */; minifiers would treat the call as dead code and drop
|
|
18
|
-
// the polyfill installation, breaking
|
|
19
|
-
//
|
|
65
|
+
// the polyfill installation, breaking third-party code that relies on
|
|
66
|
+
// globalThis.TextDecoder.
|
|
20
67
|
export function polyfillTextEncoder() {
|
|
21
|
-
setGlobalPolyfill('TextEncoder',
|
|
22
|
-
setGlobalPolyfill('TextDecoder',
|
|
68
|
+
setGlobalPolyfill('TextEncoder', TextEncoder)
|
|
69
|
+
setGlobalPolyfill('TextDecoder', TextDecoder)
|
|
23
70
|
}
|
package/text-codec.d.ts
CHANGED
|
@@ -1,13 +1,28 @@
|
|
|
1
|
+
export declare class TextEncoder {
|
|
2
|
+
readonly encoding = "utf-8";
|
|
3
|
+
encode(input?: string): Uint8Array;
|
|
4
|
+
encodeInto(source: string, destination: Uint8Array): {
|
|
5
|
+
read: number;
|
|
6
|
+
written: number;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export declare class TextDecoder {
|
|
10
|
+
readonly encoding = "utf-8";
|
|
11
|
+
readonly fatal: boolean;
|
|
12
|
+
readonly ignoreBOM: boolean;
|
|
13
|
+
constructor(label?: string, options?: {
|
|
14
|
+
fatal?: boolean;
|
|
15
|
+
ignoreBOM?: boolean;
|
|
16
|
+
});
|
|
17
|
+
decode(input?: ArrayBuffer | ArrayBufferView, options?: {
|
|
18
|
+
stream?: boolean;
|
|
19
|
+
}): string;
|
|
20
|
+
}
|
|
1
21
|
/**
|
|
2
|
-
* Install
|
|
3
|
-
*
|
|
4
|
-
* The QuickJS scene runtime ships no native `TextEncoder` / `TextDecoder`, yet
|
|
5
|
-
* `compositeProvider.loadComposite` decodes `.composite` JSON file bytes via
|
|
6
|
-
* `TextDecoder`. Callers that load composites at runtime (e.g. `@dcl/asset-packs`'
|
|
7
|
-
* `SPAWN_ENTITY`) must install this first.
|
|
22
|
+
* Install `TextEncoder` / `TextDecoder` on `globalThis` where the runtime does
|
|
23
|
+
* not provide them (native implementations always win over these polyfills).
|
|
8
24
|
*
|
|
9
25
|
* Exposed from the lean `@dcl/sdk/text-codec` subpath so consumers can install
|
|
10
|
-
* the polyfill without pulling in the ethereum provider
|
|
11
|
-
* `text-encoding` into scenes that never reach this module.
|
|
26
|
+
* the polyfill without pulling in the ethereum provider.
|
|
12
27
|
*/
|
|
13
28
|
export declare function polyfillTextEncoder(): void;
|
package/text-codec.js
CHANGED
|
@@ -1,23 +1,65 @@
|
|
|
1
|
-
import TextEncodingPolyfill from 'text-encoding';
|
|
2
1
|
import { setGlobalPolyfill } from '@dcl/ecs';
|
|
2
|
+
import { decodeUtf8, encodeUtf8, encodeUtf8Into } from './internal/utf8';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* WHATWG-shaped `TextEncoder` / `TextDecoder` over the SDK's own UTF-8 codec.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
* UTF-8 is the only supported encoding: the decoder throws a `RangeError` for
|
|
7
|
+
* any other label instead of silently mis-decoding, and rejects `{ stream: true }`.
|
|
8
|
+
*/
|
|
9
|
+
// Labels the WHATWG Encoding Standard maps to utf-8.
|
|
10
|
+
const UTF8_LABELS = ['unicode-1-1-utf-8', 'unicode11utf8', 'unicode20utf8', 'utf-8', 'utf8', 'x-unicode20utf8'];
|
|
11
|
+
function toUint8Array(input) {
|
|
12
|
+
if (input === undefined)
|
|
13
|
+
return new Uint8Array(0);
|
|
14
|
+
if (input instanceof Uint8Array)
|
|
15
|
+
return input;
|
|
16
|
+
if (ArrayBuffer.isView(input))
|
|
17
|
+
return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
|
|
18
|
+
return new Uint8Array(input);
|
|
19
|
+
}
|
|
20
|
+
export class TextEncoder {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.encoding = 'utf-8';
|
|
23
|
+
}
|
|
24
|
+
encode(input = '') {
|
|
25
|
+
return encodeUtf8(String(input));
|
|
26
|
+
}
|
|
27
|
+
encodeInto(source, destination) {
|
|
28
|
+
return encodeUtf8Into(String(source), destination);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class TextDecoder {
|
|
32
|
+
constructor(label = 'utf-8', options = {}) {
|
|
33
|
+
this.encoding = 'utf-8';
|
|
34
|
+
// the spec strips ASCII whitespace only, so String.prototype.trim is too wide
|
|
35
|
+
const normalized = String(label)
|
|
36
|
+
.replace(/^[\t\n\f\r ]+|[\t\n\f\r ]+$/g, '')
|
|
37
|
+
.toLowerCase();
|
|
38
|
+
if (!UTF8_LABELS.includes(normalized)) {
|
|
39
|
+
throw new RangeError(`TextDecoder: only utf-8 is supported, got "${label}"`);
|
|
40
|
+
}
|
|
41
|
+
this.fatal = options.fatal === true;
|
|
42
|
+
this.ignoreBOM = options.ignoreBOM === true;
|
|
43
|
+
}
|
|
44
|
+
decode(input, options = {}) {
|
|
45
|
+
if (options.stream)
|
|
46
|
+
throw new TypeError('TextDecoder: streaming is not supported');
|
|
47
|
+
return decodeUtf8(toUint8Array(input), { fatal: this.fatal, ignoreBOM: this.ignoreBOM });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Install `TextEncoder` / `TextDecoder` on `globalThis` where the runtime does
|
|
52
|
+
* not provide them (native implementations always win over these polyfills).
|
|
10
53
|
*
|
|
11
54
|
* Exposed from the lean `@dcl/sdk/text-codec` subpath so consumers can install
|
|
12
|
-
* the polyfill without pulling in the ethereum provider
|
|
13
|
-
* `text-encoding` into scenes that never reach this module.
|
|
55
|
+
* the polyfill without pulling in the ethereum provider.
|
|
14
56
|
*/
|
|
15
57
|
// NOTE: this function mutates globalThis — it is NOT pure. Do not annotate
|
|
16
58
|
// with /* @__PURE__ */; minifiers would treat the call as dead code and drop
|
|
17
|
-
// the polyfill installation, breaking
|
|
18
|
-
//
|
|
59
|
+
// the polyfill installation, breaking third-party code that relies on
|
|
60
|
+
// globalThis.TextDecoder.
|
|
19
61
|
export function polyfillTextEncoder() {
|
|
20
|
-
setGlobalPolyfill('TextEncoder',
|
|
21
|
-
setGlobalPolyfill('TextDecoder',
|
|
62
|
+
setGlobalPolyfill('TextEncoder', TextEncoder);
|
|
63
|
+
setGlobalPolyfill('TextDecoder', TextDecoder);
|
|
22
64
|
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1jb2RlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNyYy90ZXh0LWNvZGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUV4RTs7Ozs7R0FLRztBQUVILHFEQUFxRDtBQUNyRCxNQUFNLFdBQVcsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0FBRS9HLFNBQVMsWUFBWSxDQUFDLEtBQXFDO0lBQ3pELElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pELElBQUksS0FBSyxZQUFZLFVBQVU7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUM3QyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3RHLE9BQU8sSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUVELE1BQU0sT0FBTyxXQUFXO0lBQXhCO1FBQ1csYUFBUSxHQUFHLE9BQU8sQ0FBQTtJQVM3QixDQUFDO0lBUEMsTUFBTSxDQUFDLFFBQWdCLEVBQUU7UUFDdkIsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFjLEVBQUUsV0FBdUI7UUFDaEQsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3BELENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxXQUFXO0lBS3RCLFlBQVksUUFBZ0IsT0FBTyxFQUFFLFVBQW9ELEVBQUU7UUFKbEYsYUFBUSxHQUFHLE9BQU8sQ0FBQTtRQUt6Qiw4RUFBOEU7UUFDOUUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUM3QixPQUFPLENBQUMsOEJBQThCLEVBQUUsRUFBRSxDQUFDO2FBQzNDLFdBQVcsRUFBRSxDQUFBO1FBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxVQUFVLENBQUMsOENBQThDLEtBQUssR0FBRyxDQUFDLENBQUE7U0FDN0U7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFBO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUE7SUFDN0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFxQyxFQUFFLFVBQWdDLEVBQUU7UUFDOUUsSUFBSSxPQUFPLENBQUMsTUFBTTtZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMseUNBQXlDLENBQUMsQ0FBQTtRQUNsRixPQUFPLFVBQVUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7SUFDMUYsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSxzRUFBc0U7QUFDdEUsMEJBQTBCO0FBQzFCLE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzdDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQTtBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2V0R2xvYmFsUG9seWZpbGwgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IGRlY29kZVV0ZjgsIGVuY29kZVV0ZjgsIGVuY29kZVV0ZjhJbnRvIH0gZnJvbSAnLi9pbnRlcm5hbC91dGY4J1xuXG4vKipcbiAqIFdIQVRXRy1zaGFwZWQgYFRleHRFbmNvZGVyYCAvIGBUZXh0RGVjb2RlcmAgb3ZlciB0aGUgU0RLJ3Mgb3duIFVURi04IGNvZGVjLlxuICpcbiAqIFVURi04IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBlbmNvZGluZzogdGhlIGRlY29kZXIgdGhyb3dzIGEgYFJhbmdlRXJyb3JgIGZvclxuICogYW55IG90aGVyIGxhYmVsIGluc3RlYWQgb2Ygc2lsZW50bHkgbWlzLWRlY29kaW5nLCBhbmQgcmVqZWN0cyBgeyBzdHJlYW06IHRydWUgfWAuXG4gKi9cblxuLy8gTGFiZWxzIHRoZSBXSEFUV0cgRW5jb2RpbmcgU3RhbmRhcmQgbWFwcyB0byB1dGYtOC5cbmNvbnN0IFVURjhfTEFCRUxTID0gWyd1bmljb2RlLTEtMS11dGYtOCcsICd1bmljb2RlMTF1dGY4JywgJ3VuaWNvZGUyMHV0ZjgnLCAndXRmLTgnLCAndXRmOCcsICd4LXVuaWNvZGUyMHV0ZjgnXVxuXG5mdW5jdGlvbiB0b1VpbnQ4QXJyYXkoaW5wdXQ/OiBBcnJheUJ1ZmZlciB8IEFycmF5QnVmZmVyVmlldyk6IFVpbnQ4QXJyYXkge1xuICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBpbnB1dFxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSkgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0LmJ1ZmZlciwgaW5wdXQuYnl0ZU9mZnNldCwgaW5wdXQuYnl0ZUxlbmd0aClcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0KVxufVxuXG5leHBvcnQgY2xhc3MgVGV4dEVuY29kZXIge1xuICByZWFkb25seSBlbmNvZGluZyA9ICd1dGYtOCdcblxuICBlbmNvZGUoaW5wdXQ6IHN0cmluZyA9ICcnKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIGVuY29kZVV0ZjgoU3RyaW5nKGlucHV0KSlcbiAgfVxuXG4gIGVuY29kZUludG8oc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBVaW50OEFycmF5KTogeyByZWFkOiBudW1iZXI7IHdyaXR0ZW46IG51bWJlciB9IHtcbiAgICByZXR1cm4gZW5jb2RlVXRmOEludG8oU3RyaW5nKHNvdXJjZSksIGRlc3RpbmF0aW9uKVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUZXh0RGVjb2RlciB7XG4gIHJlYWRvbmx5IGVuY29kaW5nID0gJ3V0Zi04J1xuICByZWFkb25seSBmYXRhbDogYm9vbGVhblxuICByZWFkb25seSBpZ25vcmVCT006IGJvb2xlYW5cblxuICBjb25zdHJ1Y3RvcihsYWJlbDogc3RyaW5nID0gJ3V0Zi04Jywgb3B0aW9uczogeyBmYXRhbD86IGJvb2xlYW47IGlnbm9yZUJPTT86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgLy8gdGhlIHNwZWMgc3RyaXBzIEFTQ0lJIHdoaXRlc3BhY2Ugb25seSwgc28gU3RyaW5nLnByb3RvdHlwZS50cmltIGlzIHRvbyB3aWRlXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IFN0cmluZyhsYWJlbClcbiAgICAgIC5yZXBsYWNlKC9eW1xcdFxcblxcZlxcciBdK3xbXFx0XFxuXFxmXFxyIF0rJC9nLCAnJylcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKCFVVEY4X0xBQkVMUy5pbmNsdWRlcyhub3JtYWxpemVkKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRleHREZWNvZGVyOiBvbmx5IHV0Zi04IGlzIHN1cHBvcnRlZCwgZ290IFwiJHtsYWJlbH1cImApXG4gICAgfVxuICAgIHRoaXMuZmF0YWwgPSBvcHRpb25zLmZhdGFsID09PSB0cnVlXG4gICAgdGhpcy5pZ25vcmVCT00gPSBvcHRpb25zLmlnbm9yZUJPTSA9PT0gdHJ1ZVxuICB9XG5cbiAgZGVjb2RlKGlucHV0PzogQXJyYXlCdWZmZXIgfCBBcnJheUJ1ZmZlclZpZXcsIG9wdGlvbnM6IHsgc3RyZWFtPzogYm9vbGVhbiB9ID0ge30pOiBzdHJpbmcge1xuICAgIGlmIChvcHRpb25zLnN0cmVhbSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVGV4dERlY29kZXI6IHN0cmVhbWluZyBpcyBub3Qgc3VwcG9ydGVkJylcbiAgICByZXR1cm4gZGVjb2RlVXRmOCh0b1VpbnQ4QXJyYXkoaW5wdXQpLCB7IGZhdGFsOiB0aGlzLmZhdGFsLCBpZ25vcmVCT006IHRoaXMuaWdub3JlQk9NIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBJbnN0YWxsIGBUZXh0RW5jb2RlcmAgLyBgVGV4dERlY29kZXJgIG9uIGBnbG9iYWxUaGlzYCB3aGVyZSB0aGUgcnVudGltZSBkb2VzXG4gKiBub3QgcHJvdmlkZSB0aGVtIChuYXRpdmUgaW1wbGVtZW50YXRpb25zIGFsd2F5cyB3aW4gb3ZlciB0aGVzZSBwb2x5ZmlsbHMpLlxuICpcbiAqIEV4cG9zZWQgZnJvbSB0aGUgbGVhbiBgQGRjbC9zZGsvdGV4dC1jb2RlY2Agc3VicGF0aCBzbyBjb25zdW1lcnMgY2FuIGluc3RhbGxcbiAqIHRoZSBwb2x5ZmlsbCB3aXRob3V0IHB1bGxpbmcgaW4gdGhlIGV0aGVyZXVtIHByb3ZpZGVyLlxuICovXG4vLyBOT1RFOiB0aGlzIGZ1bmN0aW9uIG11dGF0ZXMgZ2xvYmFsVGhpcyDigJQgaXQgaXMgTk9UIHB1cmUuIERvIG5vdCBhbm5vdGF0ZVxuLy8gd2l0aCAvKiBAX19QVVJFX18gKi87IG1pbmlmaWVycyB3b3VsZCB0cmVhdCB0aGUgY2FsbCBhcyBkZWFkIGNvZGUgYW5kIGRyb3Bcbi8vIHRoZSBwb2x5ZmlsbCBpbnN0YWxsYXRpb24sIGJyZWFraW5nIHRoaXJkLXBhcnR5IGNvZGUgdGhhdCByZWxpZXMgb25cbi8vIGdsb2JhbFRoaXMuVGV4dERlY29kZXIuXG5leHBvcnQgZnVuY3Rpb24gcG9seWZpbGxUZXh0RW5jb2RlcigpIHtcbiAgc2V0R2xvYmFsUG9seWZpbGwoJ1RleHRFbmNvZGVyJywgVGV4dEVuY29kZXIpXG4gIHNldEdsb2JhbFBvbHlmaWxsKCdUZXh0RGVjb2RlcicsIFRleHREZWNvZGVyKVxufVxuIl19
|