smol-string 0.0.0
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/browser.vitest.config.ts +18 -0
- package/dist/common.d.ts +8 -0
- package/dist/smol-string-packed.d.ts +2 -0
- package/dist/smol-string-packed.js +42 -0
- package/dist/smol-string-worker-packed.d.ts +2 -0
- package/dist/smol-string-worker-packed.js +37 -0
- package/dist/smol-string-worker.d.ts +2 -0
- package/dist/smol-string-worker.js +37 -0
- package/dist/smol-string.d.ts +2 -0
- package/dist/smol-string.js +42 -0
- package/dist/wasm-helper-6790be72.js +45 -0
- package/dist/worker-packed.d.ts +5 -0
- package/dist/worker.d.ts +5 -0
- package/package.json +62 -0
- package/src/common.ts +25 -0
- package/src/module-packed.wasm +0 -0
- package/src/module.wasm +0 -0
- package/src/smol-string-packed.ts +83 -0
- package/src/smol-string-worker-packed.ts +32 -0
- package/src/smol-string-worker.ts +32 -0
- package/src/smol-string.ts +76 -0
- package/src/wasm.d.ts +6 -0
- package/src/worker-packed.ts +21 -0
- package/src/worker.ts +21 -0
- package/test/basic.test.ts +29 -0
- package/test/common.ts +15 -0
- package/test/json.bench.ts +51 -0
- package/test/localStorage.test.browser.ts +39 -0
- package/test/sessionStorage.test.browser.ts +39 -0
- package/tsconfig.json +23 -0
- package/vite.config.ts +33 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineConfig, mergeConfig } from "vitest/config";
|
|
2
|
+
import viteConfig from "./vite.config";
|
|
3
|
+
|
|
4
|
+
// Config for tests ran only in browsers.
|
|
5
|
+
// Currently use to tests that interacts with localStorage.
|
|
6
|
+
|
|
7
|
+
export default mergeConfig(
|
|
8
|
+
viteConfig,
|
|
9
|
+
defineConfig({
|
|
10
|
+
test: {
|
|
11
|
+
browser: {
|
|
12
|
+
enabled: true,
|
|
13
|
+
name: "chrome",
|
|
14
|
+
},
|
|
15
|
+
include: ["test/*.test.ts", "test/*.test.browser.ts"],
|
|
16
|
+
},
|
|
17
|
+
})
|
|
18
|
+
);
|
package/dist/common.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { i as w, c as k, U as h } from "./wasm-helper-6790be72.js";
|
|
2
|
+
const a = (I) => w(I, "data:application/wasm;base64,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IBItAARFDQQgEigCACEPCyAOQXRqKAIAIA9BAnRqIQ0LIA0gCTsBACANQQJqIAlBgIA8cUEQdjoAAAJAAkAgDA0AIAstAAAhDQwBCyACQfAAaiACQTBqIAsgDEEBahCNgICAACACLwFwIAItAHJBEHRyIQ0LIAJByABqIA0Qh4CAgABB//8DcQ0BIAogDGpBAWohCiAJQQFqIglB//8/cUH//z9HDQAgDkEAIA5BfGooAgAiDBCkgICAABogAkEANgI0IAIgDK1C0AB+QuQAgD4COCACQcgAakH//z8Qh4CAgABB//8DcQ0BIAJBADYCYCACQQk6AGRBgAIhCQwACwsgAkEwahCLgICAAAwBCyACQTBqEIuAgIAAC0EAIRALIAJB8AFqJICAgIAAIBALPwEBfyOAgICAAEEQayIBJICAgIAAIAEgACkCDDcDCCABQQhqIAAoAgAgACgCCBCSgICAACABQRBqJICAgIAACzcBAX8CQCACQQF0QQAgAhsiA0UNACAAKAIAIAFBAiACGyADQQFBACAAKAIEKAIIEYGAgIAAAAsLPwEBfyOAgICAAEEQayIBJICAgIAAIAEgACkCDDcDCCABQQhqIAAoAgAgACgCCBCUgICAACABQRBqJICAgIAACzcBAX8CQCACQQN0QQAgAhsiA0UNACAAKAIAIAFBBCACGyADQQJBACAAKAIEKAIIEYGAgIAAAAsL3wsDAX8Bfgt/I4CAgIAAQdAAayIDJICAgIAAIANBADYCPCADQqrVqtUKNwI0IAMjgYCAgABBmIDAgABqKQMAIgQ3AkACQAJAAkACQCACDQBBqtWq1XohBUEAIQYMAQtBqtWq1XohBSACIQYgA0HAAGoiB0Gq1arVekEAIAIQloCAgABBAXENACADQSBqIAcgAhCXgICAACADLwEoDQEgAygCJCEGIAMoAiAhBQtBCSEIQQAhCUEAIQpBACELQQAhDANAAkACQAJAAkAgDCACRg0AIAhB/wFxIgdBFEkNAQwDCyADIAQ3A0gCQAJAIANByABqIAUgBiACEJaAgIAAQQFxRQ0AIAUhCAwBCyADQTRqIANByABqIAIQl4CAgAAgAy8BPA0FIAMoAjQiCCAFIAMoAjgiAkECdBClgICAABogAyAENwMgIANBIGogBSAGEJiAgIAACyADQQA2AiggA0Kq1arV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AkAgAUGBgHxPDQACQCOBgICAAEGogMCAAGogAUH//wNqQRB2IgEgAhCcgICAACIEQX9HDQACQCOBgICAAEGggMCAAGogASACEJyAgIAAIgRBf0YNACAEQYAQaiEEDAELQQAhBEEBIAJ0IgU/ACIGQRB0IgJqQX9qQQAgBWtxIgUgAmtBEHYiByABakAAQQFIDQEgByAGaiEEIAUgAkYNACAGIAQQnoCAgAALIARBEHQhBAsgBAtPAQF/AkAgAkH//wNqIgZBgIB8cSAETyICRQ0AIARB//8DakEQdiIEIAZBEHYiBkYNACAEIAFB//8DakEQdiIBaiABIAZqEJ6AgIAACyACCyEAIAFB//8DakEQdiIBIAEgAkH//wNqQRB2ahCegICAAAt1AQF+IAAgBCABfiACIAN+fCADQiCIIgIgAUIgiCIEfnwgA0L/////D4MiAyABQv////8PgyIBfiIFQiCIIAMgBH58IgNCIIh8IANC/////w+DIAIgAX58IgFCIIh8NwMIIAAgAUIghiAFQv////8Pg4Q3AwALLAEBfwJAIAJFDQAgACEDA0AgAyABOgAAIANBAWohAyACQX9qIgINAAsLIAALQgEBfwJAIAJFDQAgAkF/aiECIAAhAwNAIAMgAS0AADoAACACRQ0BIAJBf2ohAiABQQFqIQEgA0EBaiEDDAALCyAACwtBAgBBgIDAAAsIAAAAAAAAAAAAQYiAwAALKAEAAAACAAAAAwAAAAAAAAAAAAAACAAQAKqqqqoAAAAAMAAQABAAAAA="), N = await a(), A = N.exports;
|
|
3
|
+
function F(I) {
|
|
4
|
+
const { ptr: E, length: g } = k(I, A), Q = A.compressPacked(E, g);
|
|
5
|
+
A.free(E, g);
|
|
6
|
+
const C = new Uint16Array(
|
|
7
|
+
A.memory.buffer.slice(
|
|
8
|
+
Q,
|
|
9
|
+
Q + (A.memory.buffer.byteLength - Q)
|
|
10
|
+
)
|
|
11
|
+
), B = (C.at(0) << 16) + C.at(1), D = C.slice(2, B), o = h(D);
|
|
12
|
+
return A.free(Q, B), o;
|
|
13
|
+
}
|
|
14
|
+
function y(I) {
|
|
15
|
+
const E = (I.charCodeAt(0) << 16) + I.charCodeAt(1);
|
|
16
|
+
let g = A.allocUint16(I.length - 2), Q = new Uint16Array(
|
|
17
|
+
A.memory.buffer,
|
|
18
|
+
g,
|
|
19
|
+
I.length - 2
|
|
20
|
+
);
|
|
21
|
+
for (let i = 2; i < I.length; i++)
|
|
22
|
+
Q[i - 2] = I.charCodeAt(i);
|
|
23
|
+
const C = A.decompressPacked(
|
|
24
|
+
g,
|
|
25
|
+
I.length,
|
|
26
|
+
E
|
|
27
|
+
);
|
|
28
|
+
A.free(g, I.length);
|
|
29
|
+
const B = new Uint8Array(
|
|
30
|
+
A.memory.buffer.slice(
|
|
31
|
+
C,
|
|
32
|
+
C + (A.memory.buffer.byteLength - C)
|
|
33
|
+
)
|
|
34
|
+
), D = B.indexOf(0), o = new TextDecoder().decode(
|
|
35
|
+
B.slice(0, D)
|
|
36
|
+
);
|
|
37
|
+
return A.free(C, D + 1), o;
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
F as compressPacked,
|
|
41
|
+
y as decompressPacked
|
|
42
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const l = "ZnVuY3Rpb24gYShJLCBRKSB7CiAgY29uc3QgQSA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShJKSwgZyA9IFEuYWxsb2NVaW50OChBLmxlbmd0aCArIDEpLCBDID0gbmV3IFVpbnQ4QXJyYXkoCiAgICBRLm1lbW9yeS5idWZmZXIsCiAgICBnLAogICAgQS5sZW5ndGggKyAxCiAgKTsKICByZXR1cm4gQy5zZXQoQSksIENbQS5sZW5ndGhdID0gMCwgeyBwdHI6IGcsIGxlbmd0aDogQS5sZW5ndGggKyAxIH07Cn0KZnVuY3Rpb24gdChJKSB7CiAgY29uc3QgUSA9IG5ldyBBcnJheShJLmxlbmd0aCk7CiAgZm9yIChsZXQgQSA9IDA7IEEgPCBJLmxlbmd0aDsgQSsrKQogICAgUVtBXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoSVtBXSk7CiAgcmV0dXJuIFEuam9pbigiIik7Cn0KdmFyIHcgPSBhc3luYyAoSSA9IHt9LCBRKSA9PiB7CiAgbGV0IEE7CiAgaWYgKFEuc3RhcnRzV2l0aCgiZGF0YToiKSkgewogICAgY29uc3QgZyA9IFEucmVwbGFjZSgvXmRhdGE6Lio/YmFzZTY0LC8sICIiKTsKICAgIGxldCBDOwogICAgaWYgKHR5cGVvZiBCdWZmZXIgPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgQnVmZmVyLmZyb20gPT0gImZ1bmN0aW9uIikKICAgICAgQyA9IEJ1ZmZlci5mcm9tKGcsICJiYXNlNjQiKTsKICAgIGVsc2UgaWYgKHR5cGVvZiBhdG9iID09ICJmdW5jdGlvbiIpIHsKICAgICAgY29uc3QgRSA9IGF0b2IoZyk7CiAgICAgIEMgPSBuZXcgVWludDhBcnJheShFLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IEQgPSAwOyBEIDwgRS5sZW5ndGg7IEQrKykKICAgICAgICBDW0RdID0gRS5jaGFyQ29kZUF0KEQpOwogICAgfSBlbHNlCiAgICAgIHRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGRlY29kZSBiYXNlNjQtZW5jb2RlZCBkYXRhIFVSTCwgQnVmZmVyIGFuZCBhdG9iIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICBBID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoQywgSSk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IGcgPSBhd2FpdCBmZXRjaChRKSwgQyA9IGcuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpIHx8ICIiOwogICAgaWYgKCJpbnN0YW50aWF0ZVN0cmVhbWluZyIgaW4gV2ViQXNzZW1ibHkgJiYgQy5zdGFydHNXaXRoKCJhcHBsaWNhdGlvbi93YXNtIikpCiAgICAgIEEgPSBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhnLCBJKTsKICAgIGVsc2UgewogICAgICBjb25zdCBFID0gYXdhaXQgZy5hcnJheUJ1ZmZlcigpOwogICAgICBBID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoRSwgSSk7CiAgICB9CiAgfQogIHJldHVybiBBLmluc3RhbmNlOwp9LCBoID0gKEkpID0+IHcoSSwgImRhdGE6YXBwbGljYXRpb24vd2FzbTtiYXNlNjQsQUdGemJRRUFBQUFCVVF4Z0JIOS9mMzhCZjJBRmYzOS9mMzhBWUFaL2YzOS9mMzhCZjJBQmZ3Ri9ZQU4vZjM4QVlBSi9md0JnQW45L0FYOWdBWDhBWUFSL2YzOS9BR0FDZjM4QmZtQURmMzkvQVg5Z0JYOStmbjUrQUFNbkpnTUVBd1FFQlFRR0F3WUdCd1VJQ1FBR0J3UUhCQW9BQkFRR0FBUUtDQVVFQUFJQkN3b0tCQVVCY0FFRUJBVURBUUFSQmc0Q2Z3RkJnSURBQUF0L0FFRUFDd2RRQmdadFpXMXZjbmtDQUFwaGJHeHZZMVZwYm5RNEFBQUxZV3hzYjJOVmFXNTBNVFlBQWdSbWNtVmxBQVVPWTI5dGNISmxjM05RWVdOclpXUUFFQkJrWldOdmJYQnlaWE56VUdGamEyVmtBQlVKQ1FFQVFRRUxBeUFoSWdxMlNDWmVBUUYvSTRDQWdJQUFRUkJySWdFa2dJQ0FnQUFnQVNPQmdJQ0FBRUdZZ01DQUFHb3BBd0EzQXdBZ0FVRUlhaUFCSUFBUWdZQ0FnQUFDUUNBQkx3RU1EUUFnQVNnQ0NDRUFJQUZCRUdva2dJQ0FnQUFnQUE4TEEzOEFEQUFMQzNFQ0FYOEJmaU9BZ0lDQUFFRVFheUlESklDQWdJQUFRb0NBZ0lBUUlRUUNRRUVCUlEwQUFrQWdBZzBBUXYvLy8vOFBJUVFNQVFzZ0FTZ0NBQ0FDUVFCQkFDQUJLQUlFS0FJQUVZQ0FnSUFBQUNJQ1JhMUNJSVlnQXEyRUlRUUxJQUFnQkRjQ0FDQURRUkJxSklDQWdJQUFDMVFCQVg4amdJQ0FnQUJCRUdzaUFTU0FnSUNBQUNBQlFRUnFJNEdBZ0lBQVFaaUF3SUFBYWlBQUVJT0FnSUFBQWtBZ0FTOEJEQTBBSUFFb0FnUWhBQ0FCUVJCcUpJQ0FnSUFBSUFBUEN3Ti9BQXdBQ3d1VkFRRUJmeU9BZ0lDQUFFRXdheUlESklDQWdJQUFJQU1nQVNrQ0FEY0RDQ0FEUVJCcUlBTkJDR29nQWhDRWdJQ0FBQUpBQWtBZ0F5OEJGQ0lCUlEwQUlBTWdBVHNCSUNBRFFSaHFJUUlNQVFzZ0EwRUFPd0VzSUFNZ0FqWUNLQ0FESUFNb0FoQTJBaVFnQTBFa2FpRUNDeUFBSUFJcEFnQTNBZ0FnQUVFSWFpQUNRUWhxS0FJQU5nSUFJQU5CTUdva2dJQ0FnQUFMaHdFQ0FYOEJmaU9BZ0lDQUFFRVFheUlESklDQWdJQUFJQU1nQWtFQVNEb0FEQUpBQWtBZ0FrRi9TZzBBUW9DQWdJQVFJUVFNQVFzQ1FDQUNRUUYwSWdJTkFFTCsvLy8vRHlFRURBRUxJQUVvQWdBZ0FrRUJRUUFnQVNnQ0JDZ0NBQkdBZ0lDQUFBQWlBa1d0UWlDR0lBS3RoQ0VFQ3lBQUlBUTNBZ0FnQTBFUWFpU0FnSUNBQUFzWkFDT0JnSUNBQUVHWWdNQ0FBR29nQUNBQkVJYUFnSUFBQ3pnQkFYOENRQ0FDUVFBZ0Foc2lBMFVOQUNBQUtBSUFJQUZCcXRXcTFYb2dBaHNnQTBFQVFRQWdBQ2dDQkNnQ0NCR0JnSUNBQUFBTEM4QUNBUVIvQWtBZ0FDMEFIQ0lDUVJSUERRQWdBQ2dDR0VHQUFtb2dBaENJZ0lDQUFFRi9ha2tOQUNBQUlBSkJBV29pQWpvQUhBc0NRQUpBQTBBZ0FrSC9BWEVpQTBVTkFTQUFLQUlFSVFRQ1FBSkFJQUF0QUIwaUJVRVFSZzBBSUFRTkFRc0NRQ0FBS0FJSUlnVWdCRXNOQUNBQUlBVWdCRUVCYWhDSmdJQ0FBQkNLZ0lDQUFDSUVRZi8vQTNFTkJDQUFLQUlFSVFRTElBQWdCRUVCYWpZQ0JFRUFJUVVnQUNnQ0FDQUVRUUYwYWtFQU93RUFJQUJCQURvQUhTQUFLQUlFSVFRTElBUkJBWFFnQUNnQ0FHcEJmbW9pQkNBRUx3RUFJQUZCRkNBQ2EwSC9BWEYwUWYvL1AzRWdCVUVFYW5aeU93RUFJQUFnQUMwQUhTQURRUkFnQld0Qi93RnhJZ1FnQXlBRVNSc2lCR282QUIwZ0FpQUVheUVDREFBTEN5QUFJQUFvQWhSQkFXbzJBaFFnQUNBQUtBSVlRUUZxTmdJWVFRQWhCQXNnQkF2TEFRSUVmd0YrSTRDQWdJQUFRUkJySWdFa2dJQ0FnQUFDUUFKQUlBQU5BRUVCSVFJTUFRdEJBU0VEUVFJaEJBTkFBa0FDUUNBQVFRSkpEUUFnQUVFQmNVVU5BVUVBSVFJZ0FTQURyU0FFclg0aUJVSWdpS2NpQTBFQVJ6b0FCQ0FERFFNZ0JhY2hBd3dCQ3lBQklBT3RJQVN0ZmlJRlFpQ0lweUlBUVFCSE9nQU1RUUFnQmFjZ0FCc2hBZ3dDQzBFQUlRSWdBU0FFclNJRklBVitJZ1ZDSUlpbklnUkJBRWM2QUFnZ0JBMEJJQVduSVFRZ0FFRUJkaUVBREFBTEN5QUJRUkJxSklDQWdJQUFJQUlMSlFFQmZ3TkFRWDhnQUVFQmRpQUFha0VJYWlJQ0lBSWdBRWtiSWdBZ0FVa05BQXNnQUF2dEFRRUZmeU9BZ0lDQUFFRVFheUlDSklDQWdJQUFRUUFoQXdKQUlBQW9BZ2dpQkNBQlR3MEFJQUFvQWdBaEJRSkFBa0FnQkVVTkFDQUNJQUZCQUVnNkFBZ2dBVUYvVEEwQUlBQW9BZ3dnQlNBRVFRRjBRUUVnQVVFQmRFRUFJQUJCRUdvb0FnQW9BZ1FSZ29DQWdBQUFRUUZ4UlEwQUlBQWdBVFlDQ0F3QkN5QUNJQUJCREdvaUJpa0NBRGNEQUNBQ1FRaHFJQUlnQVJDRWdJQ0FBQ0FDTHdFTUlnTU5BU0FDS0FJSUlBQW9BZ0FnQUNnQ0JFRUJkQkNsZ0lDQUFDRURJQVlnQlNBRUVKS0FnSUFBSUFBZ0FUWUNDQ0FBSUFNMkFnQUxRUUFoQXdzZ0FrRVFhaVNBZ0lDQUFDQURDdzhBSUFBZ0FFRU1haENNZ0lDQUFBdGxBUU4vQWtBZ0FDZ0NBQ0lDUlEwQUFrQWdBa0YwYWlJRFFRaHFLQUlBUVExc1FROXFRWHh4SWdKQkFDQUNHeUlFUlEwQUlBRW9BZ0FnQTBFRUlBSWJJQVJCQWtFQUlBRW9BZ1FvQWdnUmdZQ0FnQUFBQ3lBQVFRQTJBZ2dnQUVFQU5nSUFDd3VCQXdRRWZ3RitCSDhCZmlPQWdJQ0FBRUVRYXlJRUpJQ0FnSUFBSTRHQWdJQUFJUVVnQVNnQ0FDRUdBa0FDUUNBQktBSUVEUUFnQlVHQWdNQ0FBR29oQnd3QkN5QUNJQU1Ram9DQWdBQWhDQUpBQWtBZ0JnMEFRUUFoQlVGL0lRa01BUXNnQmtGOGFpZ0NBQ0lGUVg5cUlRa0xJQVpCZUdvaENpQUpJQWluY1NFQklBaENPWWluSVFzRFFDT0JnSUNBQUVHQWdNQ0FBR29oQnlBR0lBRnFMQUFBSWd4RkRRRWdCVVVOQVFKQUlBeEJmMG9OQUNBTElBeEIvd0J4UncwQUlBSWdBeUFLS0FJQUlBRkJBM1JxSWd3b0FnQWdEQ2dDQkJDUGdJQ0FBRUVCY1VVTkFDQUVRUUU2QUF3Z0JDQUJOZ0lJSUFSQkNHb2hCd3dDQ3lBRlFYOXFJUVVnQVVFQmFpQUpjU0VCREFBTEN3SkFBa0FnQnkwQUJBMEFRZ0FoQ0VJQUlRME1BUXNnQkNBR1FYUnFLQUlBSUFjb0FnQkJBblJxSWdGQkFtb3RBQUJCRDNFNkFBSWdCQ0FCTHdFQU93RUFJQVF6QVFBZ0JERUFBa0lRaG9RaENFS0FnSUNBRUNFTkN5QUFJQTBnQ0lRM0FnQWdCRUVRYWlTQWdJQ0FBQXZzQlFVQ2Z3RitBWDhDZmdKL0k0Q0FnSUFBUWVBQWF5SUNKSUNBZ0lBQUFrQUNRQUpBQWtBQ1FDQUJRUkJMRFFBZ0FVRURUUTBCSUFBMUFBQkNJSVlnQUNBQlFRRjJRZnovLy84SGNTSURhalVBQUlRaEJDQUFJQUZCZkdvaUJXbzFBQUJDSUlZZ0FDQUZJQU5yYWpVQUFJUWhCa0tzbXVMVG85THcraDhoQnd3RUMwRUFJUU5DckpyaTA2UFM4UG9mSVFkQkFDRUZJQUZCTUVrTkFrRUFJUVZDckpyaTA2UFM4UG9mSVFkQ3JKcmkwNlBTOFBvZklRUkNySnJpMDZQUzhQb2ZJUVlEUUNBRlFUQnFJZ2dnQVU4TkFpQUNRY0FBYWlBQUlBVnFJZ1VwQUFnZ0JvVkNBQ0FGS1FBQVF0dlIwSVdhMnQrQlo0VkNBQkNqZ0lDQUFDQUNRVEJxSUFWQkdHb3BBQUFnQklWQ0FDQUZRUkJxS1FBQVF1T05vK1NKM3ByZWpuK0ZRZ0FRbzRDQWdBQWdBa0VnYWlBRlFTaHFLUUFBSUFlRlFnQWdCVUVnYWlrQUFFTERtZDJweDduWnpOZ0FoVUlBRUtPQWdJQUFJQUpCd0FCcVFRaHFLUU1BSUFJcEEwQ0ZJUVlnQWtFZ2FrRUlhaWtEQUNBQ0tRTWdoU0VISUFKQk1HcEJDR29wQXdBZ0Fpa0RNSVVoQkNBSUlRVU1BQXNMUWdBaEJrS3NtdUxUbzlMdytoOGhCd0pBSUFFTkFFSUFJUVFNQXdzZ0FDQUJRUUYyYWpFQUFFSUloaUFBTVFBQVFoQ0doQ0FCSUFCcVFYOXFNUUFBaENFRURBSUxJQVFnQjRVZ0JvVWhCd3NnQUNBRmFpRUpJQUVnQldzaENBSkFBMEFnQTBFUWFpSUZJQWhQRFFFZ0FrSFFBR29nQ1NBRGFpSURRUWhxS1FBQUlBZUZRZ0FnQXlrQUFFTGIwZENGbXRyZmdXZUZRZ0FRbzRDQWdBQWdBa0hRQUdwQkNHb3BBd0FnQWlrRFVJVWhCeUFGSVFNTUFBc0xJQUVnQUdvaUEwRjRhaWtBQUNFR0lBTkJjR29wQUFBaEJBc2dBa0VRYWlBRVF0dlIwSVdhMnQrQlo0VkNBQ0FHSUFlRlFnQVFvNENBZ0FBZ0FpQUNRUkJxUVFocUtRTUFRdHZSMElXYTJ0K0JaNFZDQUNBQnJTQUNLUU1RaFVLdnlQWEZ4NnlIdTZCL2hVSUFFS09BZ0lBQUlBSkJDR29wQXdBaEJ5QUNLUU1BSVFRZ0FrSGdBR29rZ0lDQWdBQWdCeUFFaFF0WUFRSi9RUUFoQkFKQUlBRWdBMGNOQUFKQUlBQWdBa2NOQUVFQkR3c0RRQ0FCUlNFRUlBRkZEUUVnQVVGL2FpRUJJQUl0QUFBaEF5QUFMUUFBSVFVZ0FFRUJhaUVBSUFKQkFXb2hBaUFGSUFOR0RRQUxDeUFFQzhjVUJBSi9BWDRlZndGK0k0Q0FnSUFBUWZBQmF5SUNKSUNBZ0lBQUlBSkJNR3BCQ0dvaUEwRUFOZ0lBSUFKQ0FEY0RNQ0FDSTRHQWdJQUFRWmlBd0lBQWFpa0RBQ0lFTndJOElBSWdCRGNDeEFFZ0FrRUFOZ0xBQVNBQ1FxclZxdFVLTndLNEFRSkFBa0FDUUFKQUlBSkJ1QUZxSUFFUWlvQ0FnQUJCLy84RGNRMEFJQUpCTUdwQkRHb2hCU0FDUWNnQWFrRVFhaUFDUWJnQmFrRVFhaWdDQURZQ0FDQUNRY2dBYWtFSWFpQUNRYmdCYWtFSWFpSUdLUUlBTndNQUlBSWdBaWtDdUFFM0EwZ2dBa0VKT3dGa0lBSkNBRGNDWENBRVFpQ0lweUVISUFTbklRaEJnQUloQ1VFQUlRb0RRQ0FBSUFwcUlRdEJBQ0VNQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQTBBQ1FBSkFJQXhCQW1vaURTQUthaUFCVHcwQUlBSkI2QUJxSUFKQk1Hb2dDeUFORUkyQWdJQUFJQUl0QUd3TkFTQUNLQUl3SVE0Z0FpZ0NPQTBHQWtBQ1FDQU9EUUJCQVNFUERBRUxJQTVCZkdvb0FnQ3RRdEFBZmlJRUlBUkM1QUNDZlVMa0FIeEMwQUNBcHlFUEMwRUFJUkFnQmtFQU5nSUFJQUpDQURjRHVBRkJBQTBGQWtBQ1FFSUJRU0FnRDJkcnJVTC8vd09EaHFjaUQwRUlJQTlCQ0VzYkloRkJEMm9pRWlBUlFRTjBhaUlUSUJGQkFuUnFRWHh4SWc4TkFFRjhJUThNQVF0QkFDRVFJQWdnRDBFQ1FRQWdCeWdDQUJHQWdJQ0FBQUFpRDBVTkJnc2dEMEVJYWlJVUlCRTJBZ0FnRHlBUElCSkJmSEZxTmdJRUlBOGdEeUFUUVh4eGFqWUNBQ0FDSUE5QkRHb2lEellDdUFFZ0QwRUFJQkVRcElDQWdBQWhFQ0FDSUJHdFF0QUFma0xrQUlDbkloVTJBc0FCSUFJb0FqUWlGa1VOQkVFQUlSZEJBQ0VZQWtBZ0RrVU5BQ0FPUVh4cUtBSUFJUmdMSUJCQmRHb2hHU0FRUVhocUlSb2dEa0YwYWlJUEtBSUFJUnNnRDBFRWFpZ0NBQ0VjUVFBaEhRTkFJQjBnR0VZTkJBSkFJQTRnSFdvc0FBQkJBRTROQUNBYklCMUJBblJxSWc5QkFtb3RBQUJCRUhRaEhpQVBMd0VBSVI4Z0hDQWRRUU4wYWlJUEtBSUVJU0FnRHlnQ0FDRWhBa0FnRjBVTkFDQWhJQ0FRam9DQWdBQWhCQ0FVS0FJQUloRkJmMm9pRXlBRXAzRWhEeUFFUWptSXB5RWlBMEFnRUNBUGFpd0FBQ0lTUlEwQklCRkZEUUVDUUNBU1FYOUtEUUFnSWlBU1FmOEFjVWNOQUNBaElDQWdHaWdDQUNBUFFRTjBhaUlTS0FJQUlCSW9BZ1FRajRDQWdBQkJBWEZGRFFBZ0FrRUJPZ0RzQVF3Q0N5QVJRWDlxSVJFZ0QwRUJhaUFUY1NFUERBQUxDeUFmSUI1eUlSTWdJU0FnRUk2QWdJQUFJUVFnRkNnQ0FFRi9haUlTSUFTbmNTRVBBa0FEUUNBUUlBOXFJaEVzQUFCQmYwb05BU0FQUVFGcUlCSnhJUThNQUFzTElCRWdCRUk1aUtkQmdBRnlPZ0FBSUJvb0FnQWdEMEVEZEdvaUVTQWdOZ0lFSUJFZ0lUWUNBQ0FaS0FJQUlBOUJBblJxSWc4Z0V6c0JBQ0FQUVFKcUlCTkJnSUE4Y1VFUWRqb0FBQ0FWUVg5cUlSVWdGMEVCYWlJWElCWkhEUUFnRmlFWERBVUxJQjFCQVdvaEhRd0FDd3NDUUFKQUlBcEJBV29nQVVrTkFDQUNRY2dBYWlBTExRQUFFSWVBZ0lBQVFmLy9BM0VORGd3QkN5QUNRZmdBYWtFUWFpQUNRVEJxUVJCcUtBSUFOZ0lBSUFKQitBQnFRUWhxSUFKQk1HcEJDR29wQXdBM0F3QWdBaUFDS1FNd053TjRJQUpCa0FGcUlBSkIrQUJxSUFzZ0RFRUNhaENOZ0lDQUFBSkFJQUl0QUpRQkRRQUNRQUpBSUF3TkFDQUxMUUFBSVEwTUFRc2dBa0dZQVdwQkVHb2dBa0V3YWtFUWFpZ0NBRFlDQUNBQ1FaZ0Jha0VJYWlBQ1FUQnFRUWhxS1FNQU53TUFJQUlnQWlrRE1EY0RtQUVnQWtHd0FXb2dBa0dZQVdvZ0N5QU1RUUZxRUkyQWdJQUFJQUl2QWJBQklBSXRBTElCUVJCMGNpRU5DeUFDUWNnQWFpQU5FSWVBZ0lBQVFmLy9BM0VORGlBQ1FjZ0FhaUFMSUF4cVFRRnFMUUFBRUllQWdJQUFRZi8vQTNGRkRRRU1EZ3NnQWtISUFHb2dBaThCa0FFZ0FpMEFrZ0ZCRUhSeUVJZUFnSUFBUWYvL0EzRU5EUXNnQWtFd2FoQ0xnSUNBQUNBQ1FSaHFJQUpCeUFCcVFSaHFLUU1BTndNQUlBSkJFR29nQWtISUFHcEJFR29wQXdBM0F3QWdBa0VJYWlBQ1FjZ0Fha0VJYWlrREFEY0RBQ0FDSUFJcEEwZzNBd0FnQWtFa2FpT0JnSUNBQUVHWWdNQ0FBR29nQWlnQ0JDSU1RUVJxRUlPQWdJQUFBa0FnQWk4QkxBMEFJQUlvQWlRaUVDQUNLQUlvUVJCNE5nRUFJQkFnQWlnQ0ZFRVFlRFlCQkNBUVFRaHFJUTBnQWlnQ0FDRVBBa0FEUUNBTVJRMEJJQTBnRHk4QkFEc0JBQ0FNUVg5cUlRd2dEVUVDYWlFTklBOUJBbW9oRHd3QUN3c2dBaENSZ0lDQUFBd1FDeUFDRUpHQWdJQUFEQTRMSUF4QkFXb2hEQXdBQ3dzZ0FpQVZOZ0xBQVNBQ0lCYzJBcndCQ3lBREtBSUFJUThnQXlBR0tBSUFOZ0lBSUFZZ0R6WUNBQ0FDUVFBMkFqUWdBaWtETUNFRUlBSWdBaWtEdUFFaUl6Y0RNQ0FDSUFRM0E3Z0JJQ09uSVE1QkFTRVFDeUFDUWJnQmFpQUZFSXlBZ0lBQUlCQU5BQ09CZ0lDQUFDRVBJQUlvQWpRTkFTQVBRWUNBd0lBQWFpRVNEQU1MSUFzZ0RSQ09nSUNBQUNFRUFrQUNRQ0FPRFFBZ0JLY2hEMEVBSVJKQmZ5RWREQUVMSUE1QmZHb29BZ0FpRWtGL2FpSWRJQVNuY1NFUEN5QU9RWGhxSVNBZ0RrRjhhaUVoSUFSQ09ZaW5JU0lnRWlFUUEwQWdEaUFQYWlJVExBQUFJaEZGRFFJZ0VFRUFSZzBDQWtBQ1FDQVJRWDlLRFFBZ0lpQVJRZjhBY1VjTkFDQUxJQTBnSUNnQ0FDQVBRUU4wYWlJUktBSUFJQkVvQWdRUWo0Q0FnQUJCQVhGRkRRRU1CZ3NnRWlBaEtBSUFSdzBBSUE4Z0VpQVJRUUZHR3lFU0N5QVFRWDlxSVJBZ0QwRUJhaUFkY1NFUERBQUxDeUFMSUEwUWpvQ0FnQUFoQkFKQUFrQWdEZzBBUVFBaEVFRi9JUk1NQVFzZ0RrRjhhaWdDQUNJUVFYOXFJUk1MSUE1QmVHb2hJaUFUSUFTbmNTRVBJQVJDT1lpbklSMERRQ09CZ0lDQUFFR0FnTUNBQUdvaEVpQU9JQTlxTEFBQUloRkZEUUlnRUVVTkFnSkFJQkZCZjBvTkFDQWRJQkZCL3dCeFJ3MEFJQXNnRFNBaUtBSUFJQTlCQTNScUloRW9BZ0FnRVNnQ0JCQ1BnSUNBQUVFQmNVVU5BQ0FDUVFFNkFOQUJJQUlnRHpZQ3pBRWdBa0hNQVdvaEVnd0RDeUFRUVg5cUlSQWdEMEVCYWlBVGNTRVBEQUFMQ3lBaEtBSUFJUkFnQWlBQ0tBSTRRWDlxTmdJNElBNGdFbW9nRXlBU0lCQkpJaEFiSUNKQmdBRnlPZ0FBSUE1QmRHb29BZ0FoRVNBZ0tBSUFJUk1nQWlBQ0tBSTBRUUZxTmdJMElCTWdFaUFQSUJBYklnOUJBM1JxSWhBZ0RUWUNCQ0FRSUFzMkFnQWdFU0FQUVFKMGFpRU5EQUlMSUJJdEFBUkZEUVFnRWlnQ0FDRVBDeUFPUVhScUtBSUFJQTlCQW5ScUlRMExJQTBnQ1RzQkFDQU5RUUpxSUFsQmdJQThjVUVRZGpvQUFBSkFBa0FnREEwQUlBc3RBQUFoRFF3QkN5QUNRZkFBYWlBQ1FUQnFJQXNnREVFQmFoQ05nSUNBQUNBQ0x3RndJQUl0QUhKQkVIUnlJUTBMSUFKQnlBQnFJQTBRaDRDQWdBQkIvLzhEY1EwQklBb2dER3BCQVdvaENpQUpRUUZxSWdsQi8vOC9jVUgvL3o5SERRQWdEa0VBSUE1QmZHb29BZ0FpREJDa2dJQ0FBQm9nQWtFQU5nSTBJQUlnREsxQzBBQitRdVFBZ0Q0Q09DQUNRY2dBYWtILy96OFFoNENBZ0FCQi8vOERjUTBCSUFKQkFEWUNZQ0FDUVFrNkFHUkJnQUloQ1F3QUN3c2dBa0V3YWhDTGdJQ0FBQXdCQ3lBQ1FUQnFFSXVBZ0lBQUMwRUFJUkFMSUFKQjhBRnFKSUNBZ0lBQUlCQUxQd0VCZnlPQWdJQ0FBRUVRYXlJQkpJQ0FnSUFBSUFFZ0FDa0NERGNEQ0NBQlFRaHFJQUFvQWdBZ0FDZ0NDQkNTZ0lDQUFDQUJRUkJxSklDQWdJQUFDemNCQVg4Q1FDQUNRUUYwUVFBZ0Foc2lBMFVOQUNBQUtBSUFJQUZCQWlBQ0d5QURRUUZCQUNBQUtBSUVLQUlJRVlHQWdJQUFBQXNMUHdFQmZ5T0FnSUNBQUVFUWF5SUJKSUNBZ0lBQUlBRWdBQ2tDRERjRENDQUJRUWhxSUFBb0FnQWdBQ2dDQ0JDVWdJQ0FBQ0FCUVJCcUpJQ0FnSUFBQ3pjQkFYOENRQ0FDUVFOMFFRQWdBaHNpQTBVTkFDQUFLQUlBSUFGQkJDQUNHeUFEUVFKQkFDQUFLQUlFS0FJSUVZR0FnSUFBQUFzTDN3c0RBWDhCZmd0L0k0Q0FnSUFBUWRBQWF5SURKSUNBZ0lBQUlBTkJBRFlDUENBRFFxclZxdFVLTndJMElBTWpnWUNBZ0FCQm1JREFnQUJxS1FNQUlnUTNBa0FDUUFKQUFrQUNRQ0FDRFFCQnF0V3ExWG9oQlVFQUlRWU1BUXRCcXRXcTFYb2hCU0FDSVFZZ0EwSEFBR29pQjBHcTFhclZla0VBSUFJUWxvQ0FnQUJCQVhFTkFDQURRU0JxSUFjZ0FoQ1hnSUNBQUNBREx3RW9EUUVnQXlnQ0pDRUdJQU1vQWlBaEJRdEJDU0VJUVFBaENVRUFJUXBCQUNFTFFRQWhEQU5BQWtBQ1FBSkFBa0FnRENBQ1JnMEFJQWhCL3dGeElnZEJGRWtOQVF3REN5QURJQVEzQTBnQ1FBSkFJQU5CeUFCcUlBVWdCaUFDRUphQWdJQUFRUUZ4UlEwQUlBVWhDQXdCQ3lBRFFUUnFJQU5CeUFCcUlBSVFsNENBZ0FBZ0F5OEJQQTBGSUFNb0FqUWlDQ0FGSUFNb0FqZ2lBa0VDZEJDbGdJQ0FBQm9nQXlBRU53TWdJQU5CSUdvZ0JTQUdFSmlBZ0lBQUN5QURRUUEyQWlnZ0EwS3ExYXJWQ2pjQ0lDQURJQVEzQWl3Z0EwRUFRZi8vUHhDSmdJQ0FBQ0lIUWYvLy8vOEJTem9BTkNBSFFZQ0FnSUFDVHcwQkFrQUNRQ0FIUVFOMElnME5BRUY4SVEwTUFRc2dCS2NnRFVFQ1FRQWdCRUlnaUtjb0FnQVJnSUNBZ0FBQUlnMUZEUUlMSUFNZ0J6WUNLQ0FESUEwMkFpQkJBQ0VIQWtBRFFDQUhRZmovL3dOR0RRRWdEU0FIYWtJQU53SUFJQWRCQ0dvaEJ3d0FDd3NnQTBILy96ODJBaVFnQXlBRU53SkFRUUFoQnlBRFFRQTJBandnQTBLcTFhclZDamNDTkNBRFFUUnFJQUpCRkd3UW1ZQ0FnQUJCLy84RGNRMEJJQU1wQWtBaEJDQURLQUk4SVFzZ0F5Z0NOQ0lBSUFNb0FqZ2lDV29nQ0MwQUFEb0FBQ0FOSUFndkFRQWdDRUVDYWkwQUFFRVFkSEpCQTNScUlnNUJBVFlDQkNBT0lBQTJBZ0FnQ1VFQmFpRVBRWUFDSVFwQkFTRUpBMEFnRHlFT0FrQUNRQUpBQWtBZ0NTQUNUdzBBQWtBZ0NDQUpRUUowYWlJUEx3RUFJQTlCQW1vdEFBQkJFSFJ5SWc5Qi8vOC9SdzBBSUFsQkFXb2lDU0FDVHcwQlFRQWhCd0pBQTBBZ0IwSDQvLzhEUmcwQklBMGdCMnBDQURjQ0FDQUhRUWhxSVFjTUFBc0xBa0FnQ0NBSlFRSjBhaUlITHdFQUlBZEJBbW90QUFCQkVIUnlJZ2RCZ0FKSkRRQWdBMEgvL3o4MkFpUU1DQXNnQUNBT2FpQUhPZ0FBSUE1QkFXb2hEMEdBQWlFS0RBUUxJQTlCZ0FKSkRRRUNRQ0FOSUE5QkEzUnFJZzhvQWdBaURBMEFJQUFnRG1vZ0FDQUhhaUlQSUE0Z0Iyc2lEQkNsZ0lDQUFCb2dBQ0FNSUE1cUlneHFJQTh0QUFBNkFBQWdERUVCYWlFUERBTUxJQUFnRG1vZ0RDQVBLQUlFSWc4UXBZQ0FnQUFhSUE4Z0Rtb2hEd3dDQ3lBRFFmLy9QellDSkNBRFFTQnFFSk9BZ0lBQUlBTWdCRGNDR0NBRElBczJBaFFnQXlBQU5nSU1JQU1nRGpZQ0VFRUFJUWNnQTBFTWFpQU9RUUZxRUptQWdJQUFRZi8vQTNFTkNTQURLQUlNSWcwZ0F5Z0NFQ0lIYWtFQU9nQUFJQU1vQWhRaENTQURJQU1wQWhnaUJEY0RTQUpBSUFOQnlBQnFJQTBnQ1NBSFFRRnFJZ2NRbW9DQWdBQkJBWEZGRFFBZ0RTRUhEQW9MSUFOQk5Hb2dBMEhJQUdvZ0J4Q2JnSUNBQUNBREx3RThEUWdnQXlnQ05DSUhJQTBnQXlnQ09CQ2xnSUNBQUJvZ0F5QUVOd01nSUFOQklHb2dEU0FKRUlhQWdJQUFEQWtMSUFBZ0Rtb2dEem9BQUNBT1FRRnFJUThMSUEwZ0NrSC8vejl4UVFOMGFpSU1JQTRnQjJ0QkFXbzJBZ1FnRENBQUlBZHFOZ0lBSUFwQkFXb2hDZ3NnQ1VFQmFpRUpJQTRoQnd3QUN3c2dDQ0FMUVlBQ2FpQUhFSWlBZ0lBQVFYOXFUMm9oQ0F3QkN5QURRU0JxRUpPQWdJQUFEQUlMUVFBaERpQUlJUWNDUUFOQUlBZEIvd0Z4SWcxRkRRRWdBQ0FLSUFsQi93RnhRUkJHSWc5cUlncEJBWFJxTHdFQVFRQWdDU0FQR3lJSlFROXhkRUgvL3dOeFFRQWdEVUVRSUFsclFmOEJjU0lQSUEwZ0Qwa2JJZzFyUVE5eGRpQUhJQTFySWdkMElBNXlJUTRnRFNBSmFpRUpEQUFMQ3lBRklBeEJBblJxSWdjZ0Rqc0JBQ0FIUVFKcUlBNUIvLzgvY1NJSFFSQjJPZ0FBUVFBZ0MwRUJhaUFIUWYvL1AwWWlCeHNoQzBFSklBZ2dCeHNoQ0NBTVFRRnFJUXdNQUFzTFFRQWhCd3NnQTBIUUFHb2tnSUNBZ0FBZ0J3dVFBUUVDZnlPQWdJQ0FBRUVRYXlJRUpJQ0FnSUFBQWtBQ1FDQUREUUFnQkNBQUtRSUFOd01BSUFRZ0FTQUNFSmlBZ0lBQVFRRWhCUXdCQzBFQUlRVWdBa1VOQUNBRUlBTkIvLy8vL3dOTE9nQU1JQU5CZ0lDQWdBUlBEUUFnQUNnQ0FDQUJJQUpCQW5SQkFpQURRUUowUVFBZ0FDZ0NCQ2dDQkJHQ2dJQ0FBQUFoQlFzZ0JFRVFhaVNBZ0lDQUFDQUZDOEVCQWdGL0FYNGpnSUNBZ0FCQklHc2lBeVNBZ0lDQUFDQUJLUUlBSVFRZ0F5QUNRZi8vLy84RFN6b0FIQUpBQWtBZ0FrR0FnSUNBQkU4TkFBSkFBa0FnQWtFQ2RDSUJEUUJCZkNFQkRBRUxJQVNuSUFGQkFrRUFJQVJDSUlpbktBSUFFWUNBZ0lBQUFDSUJSUTBCQ3lBRElBSTJBaFFnQXlBQk5nSVFJQU5CQURzQkdDQURRUkJxSVFJTUFRc2dBMEVCT3dFTUlBTkJCR29oQWdzZ0FDQUNLUUlBTndJQUlBQkJDR29nQWtFSWFpZ0NBRFlDQUNBRFFTQnFKSUNBZ0lBQUN6Y0JBWDhDUUNBQ1FRSjBRUUFnQWhzaUEwVU5BQ0FBS0FJQUlBRkJCQ0FDR3lBRFFRSkJBQ0FBS0FJRUtBSUlFWUdBZ0lBQUFBc0xxUUVCQlg4amdJQ0FnQUJCRUdzaUFpU0FnSUNBQUVFQUlRTUNRQ0FBS0FJSUlnUWdBVThOQUFKQUlBQkJER29pQlNBQUtBSUFJZ1lnQkNBQkVKcUFnSUFBUVFGeERRQWdBa0VFYWlBRklBRVFtNENBZ0FBZ0FpOEJEQ0lERFFFZ0FpZ0NDQ0VCSUFJb0FnUWdBQ2dDQUNBQUtBSUVFS1dBZ0lBQUlRTWdCU0FHSUFRUWhvQ0FnQUFnQUNBRE5nSUFDeUFBSUFFMkFnaEJBQ0VEQ3lBQ1FSQnFKSUNBZ0lBQUlBTUxkUUVDZnlPQWdJQ0FBRUVRYXlJRUpJQ0FnSUFBQWtBQ1FDQUREUUFnQkNBQUtRSUFOd01BSUFRZ0FTQUNFSWFBZ0lBQVFRRWhCUXdCQzBFQUlRVWdBa1VOQUVFQURRQWdBQ2dDQUNBQklBSkJBQ0FEUVFBZ0FDZ0NCQ2dDQkJHQ2dJQ0FBQUFoQlFzZ0JFRVFhaVNBZ0lDQUFDQUZDNVVCQVFGL0k0Q0FnSUFBUVRCcklnTWtnSUNBZ0FBZ0F5QUJLUUlBTndNSUlBTkJFR29nQTBFSWFpQUNFSUdBZ0lBQUFrQUNRQ0FETHdFVUlnRkZEUUFnQXlBQk93RWdJQU5CR0dvaEFnd0JDeUFEUVFBN0FTd2dBeUFDTmdJb0lBTWdBeWdDRURZQ0pDQURRU1JxSVFJTElBQWdBaWtDQURjQ0FDQUFRUWhxSUFKQkNHb29BZ0EyQWdBZ0EwRXdhaVNBZ0lDQUFBdlNBZ01HZndGK0IzOGpnSUNBZ0FCQkVHc2lBeVNBZ0lDQUFDQUFLQUlFSVFRZ0FDZ0NBQ0VGUVFBaEJpQUNRZjhCY1NFSEEzOENRQUpBQWtBZ0JpQUVSdzBBUVg4aENBd0JDd0pBSUFVZ0JrRUVkR29pQWtFSWFpa0RBQ0lKUWdCVERRQWdBaWtEQUhzZ0NYdDhweUFCU1EwQ0N5QUdRUWQwSWdoQmdBRnFJUW9EUUNBSUlBcFBEUUlnQ0NBQUtRSUFJZ2xDR1lpblFZQi9jU0lDSUFnZ0Frc2JJZ3NnQ0dzaERDQUpwMEVJSUFsQ0lJaW5HeUVOSUFoQkVIUm9JUTVCQUNFQ0FrQURRQUpBSUF3Z0FrY05BQ0FMSVE4TUFndEIvd0VnQ0NBQ2FpSVBRUWR4SWhCQkIzTjJRUUVnRUhSeElBMGdEMEVEZG1vdEFBQnhSUTBCSUFKQkFXb2lBaUFCU1EwQUlBNGdCMGtOQUFzZ0F5QUpOd01JSUFOQkNHb2dDQ0FCUVFBUW5ZQ0FnQUFNQWdzZ0QwRUJhaUVJREFBTEN5QURRUkJxSklDQWdJQUFJQWdQQ3lBR1FRRnFJUVlNQUFzTFZBRUJmeUFEUVFGeElRUUNRQU5BSUFKRkRRRWdBQ2dDQUVFSUlBQW9BZ1FiSUFGQkEzWnFJZ01nQXkwQUFFRitJQUZCQjNFaUEzZHhJQVFnQTNSeU9nQUFJQUZCQVdvaEFTQUNRWDlxSVFJTUFBc0xDOXNCQVFOL0k0Q0FnSUFBUVJCcklnSWtnSUNBZ0FBQ1FDQUFRWUFRVHcwQUk0R0FnSUFBUWFpQXdJQUFhaUFBSUFGQmdCQWdBVUdBRUVrYklBQnJFSitBZ0lBQUN3SkFJQUZCZ0JCTkRRQUNRQ09CZ0lDQUFFR2dnTUNBQUdvb0FnUU5BQ09CZ0lDQUFFR2dnTUNBQUdvaUEwR0FJRFlDQkNBRElBRkJmMm9pQVVFUWRDSUVOZ0lBSUFSQkFFR0FnQVFRcElDQWdBQWFDeUFDSTRHQWdJQUFRYUNBd0lBQWFpa0RBRGNEQ0NBQ1FRaHFJQUJCZ0JBZ0FFR0FFRXNiSWdCQmdIQnFJQUVnQUdzUW40Q0FnQUFMSUFKQkVHb2tnSUNBZ0FBTE93RUJmeU9BZ0lDQUFFRVFheUlESklDQWdJQUFJQU1nQUNrQ0FEY0RDQ0FEUVFocUlBRWdBa0VCRUoyQWdJQUFJQU5CRUdva2dJQ0FnQUFMdlFFQkJIOUJBQ0VFQWtBZ0FVR0JnSHhQRFFBQ1FDT0JnSUNBQUVHb2dNQ0FBR29nQVVILy93TnFRUkIySWdFZ0FoQ2NnSUNBQUNJRVFYOUhEUUFDUUNPQmdJQ0FBRUdnZ01DQUFHb2dBU0FDRUp5QWdJQUFJZ1JCZjBZTkFDQUVRWUFRYWlFRURBRUxRUUFoQkVFQklBSjBJZ1UvQUNJR1FSQjBJZ0pxUVg5cVFRQWdCV3R4SWdVZ0FtdEJFSFlpQnlBQmFrQUFRUUZJRFFFZ0J5QUdhaUVFSUFVZ0FrWU5BQ0FHSUFRUW5vQ0FnQUFMSUFSQkVIUWhCQXNnQkF0UEFRRi9Ba0FnQWtILy93TnFJZ1pCZ0lCOGNTQUVUeUlDUlEwQUlBUkIvLzhEYWtFUWRpSUVJQVpCRUhZaUJrWU5BQ0FFSUFGQi8vOERha0VRZGlJQmFpQUJJQVpxRUo2QWdJQUFDeUFDQ3lFQUlBRkIvLzhEYWtFUWRpSUJJQUVnQWtILy93TnFRUkIyYWhDZWdJQ0FBQXQxQVFGK0lBQWdCQ0FCZmlBQ0lBTitmQ0FEUWlDSUlnSWdBVUlnaUNJRWZud2dBMEwvLy8vL0Q0TWlBeUFCUXYvLy8vOFBneUlCZmlJRlFpQ0lJQU1nQkg1OElnTkNJSWg4SUFOQy8vLy8vdytESUFJZ0FYNThJZ0ZDSUloOE53TUlJQUFnQVVJZ2hpQUZRdi8vLy84UGc0UTNBd0FMTEFFQmZ3SkFJQUpGRFFBZ0FDRURBMEFnQXlBQk9nQUFJQU5CQVdvaEF5QUNRWDlxSWdJTkFBc0xJQUFMUWdFQmZ3SkFJQUpGRFFBZ0FrRi9haUVDSUFBaEF3TkFJQU1nQVMwQUFEb0FBQ0FDUlEwQklBSkJmMm9oQWlBQlFRRnFJUUVnQTBFQmFpRUREQUFMQ3lBQUN3dEJBZ0JCZ0lEQUFBc0lBQUFBQUFBQUFBQUFRWWlBd0FBTEtBRUFBQUFDQUFBQUF3QUFBQUFBQUFBQUFBQUFDQUFRQUtxcXFxb0FBQUFBTUFBUUFCQUFBQUE9Iik7CmNvbnN0IGUgPSBhd2FpdCBoKCksIEIgPSBlLmV4cG9ydHM7CmZ1bmN0aW9uIGsoSSkgewogIGNvbnN0IHsgcHRyOiBRLCBsZW5ndGg6IEEgfSA9IGEoSSwgQiksIGcgPSBCLmNvbXByZXNzUGFja2VkKFEsIEEpOwogIEIuZnJlZShRLCBBKTsKICBjb25zdCBDID0gbmV3IFVpbnQxNkFycmF5KAogICAgQi5tZW1vcnkuYnVmZmVyLnNsaWNlKAogICAgICBnLAogICAgICBnICsgKEIubWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoIC0gZykKICAgICkKICApLCBFID0gKEMuYXQoMCkgPDwgMTYpICsgQy5hdCgxKSwgRCA9IEMuc2xpY2UoMiwgRSksIG8gPSB0KEQpOwogIHJldHVybiBCLmZyZWUoZywgRSksIG87Cn0KZnVuY3Rpb24gcyhJKSB7CiAgY29uc3QgUSA9IChJLmNoYXJDb2RlQXQoMCkgPDwgMTYpICsgSS5jaGFyQ29kZUF0KDEpOwogIGxldCBBID0gQi5hbGxvY1VpbnQxNihJLmxlbmd0aCAtIDIpLCBnID0gbmV3IFVpbnQxNkFycmF5KAogICAgQi5tZW1vcnkuYnVmZmVyLAogICAgQSwKICAgIEkubGVuZ3RoIC0gMgogICk7CiAgZm9yIChsZXQgaSA9IDI7IGkgPCBJLmxlbmd0aDsgaSsrKQogICAgZ1tpIC0gMl0gPSBJLmNoYXJDb2RlQXQoaSk7CiAgY29uc3QgQyA9IEIuZGVjb21wcmVzc1BhY2tlZCgKICAgIEEsCiAgICBJLmxlbmd0aCwKICAgIFEKICApOwogIEIuZnJlZShBLCBJLmxlbmd0aCk7CiAgY29uc3QgRSA9IG5ldyBVaW50OEFycmF5KAogICAgQi5tZW1vcnkuYnVmZmVyLnNsaWNlKAogICAgICBDLAogICAgICBDICsgKEIubWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoIC0gQykKICAgICkKICApLCBEID0gRS5pbmRleE9mKDApLCBvID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKAogICAgRS5zbGljZSgwLCBEKQogICk7CiAgcmV0dXJuIEIuZnJlZShDLCBEICsgMSksIG87Cn0Kb25tZXNzYWdlID0gYXN5bmMgZnVuY3Rpb24oSSkgewogIGNvbnN0IHsgY29tbWFuZDogUSwgaWQ6IEEsIGRhdGE6IGcgfSA9IEkuZGF0YTsKICBzd2l0Y2ggKFEpIHsKICAgIGNhc2UgImRlY29tcHJlc3MiOiB7CiAgICAgIHBvc3RNZXNzYWdlKHsgaWQ6IEEsIGRhdGE6IHMoZykgfSk7CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAiY29tcHJlc3MiOiB7CiAgICAgIHBvc3RNZXNzYWdlKHsgaWQ6IEEsIGRhdGE6IGsoZykgfSk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfTsK", J = typeof window < "u" && window.Blob && new Blob([atob(l)], { type: "text/javascript;charset=utf-8" });
|
|
2
|
+
function S() {
|
|
3
|
+
let U;
|
|
4
|
+
try {
|
|
5
|
+
if (U = J && (window.URL || window.webkitURL).createObjectURL(J), !U)
|
|
6
|
+
throw "";
|
|
7
|
+
return new Worker(U);
|
|
8
|
+
} catch {
|
|
9
|
+
return new Worker("data:application/javascript;base64," + l, { type: "module" });
|
|
10
|
+
} finally {
|
|
11
|
+
U && (window.URL || window.webkitURL).revokeObjectURL(U);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const R = new S();
|
|
15
|
+
let V = 0;
|
|
16
|
+
const Q = {};
|
|
17
|
+
R.onmessage = function(U) {
|
|
18
|
+
console.log("onmessage", U);
|
|
19
|
+
const F = U.data.id;
|
|
20
|
+
Q[F](U.data.data), delete Q[F];
|
|
21
|
+
};
|
|
22
|
+
async function d(U) {
|
|
23
|
+
const F = V++;
|
|
24
|
+
return console.log("compress", F), new Promise((B) => {
|
|
25
|
+
Q[F] = B, R.postMessage({ command: "compress", id: F, data: U });
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async function W(U) {
|
|
29
|
+
const F = V++;
|
|
30
|
+
return console.log("decompress", F), new Promise((B) => {
|
|
31
|
+
Q[F] = B, R.postMessage({ command: "decompress", id: F, data: U });
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
d as compress,
|
|
36
|
+
W as decompress
|
|
37
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const J = "ZnVuY3Rpb24gRChJLCBDKSB7CiAgY29uc3QgQSA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShJKSwgZyA9IEMuYWxsb2NVaW50OChBLmxlbmd0aCArIDEpLCBRID0gbmV3IFVpbnQ4QXJyYXkoCiAgICBDLm1lbW9yeS5idWZmZXIsCiAgICBnLAogICAgQS5sZW5ndGggKyAxCiAgKTsKICByZXR1cm4gUS5zZXQoQSksIFFbQS5sZW5ndGhdID0gMCwgeyBwdHI6IGcsIGxlbmd0aDogQS5sZW5ndGggKyAxIH07Cn0KZnVuY3Rpb24gYShJKSB7CiAgY29uc3QgQyA9IG5ldyBBcnJheShJLmxlbmd0aCk7CiAgZm9yIChsZXQgQSA9IDA7IEEgPCBJLmxlbmd0aDsgQSsrKQogICAgQ1tBXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoSVtBXSk7CiAgcmV0dXJuIEMuam9pbigiIik7Cn0KdmFyIGUgPSBhc3luYyAoSSA9IHt9LCBDKSA9PiB7CiAgbGV0IEE7CiAgaWYgKEMuc3RhcnRzV2l0aCgiZGF0YToiKSkgewogICAgY29uc3QgZyA9IEMucmVwbGFjZSgvXmRhdGE6Lio/YmFzZTY0LC8sICIiKTsKICAgIGxldCBROwogICAgaWYgKHR5cGVvZiBCdWZmZXIgPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgQnVmZmVyLmZyb20gPT0gImZ1bmN0aW9uIikKICAgICAgUSA9IEJ1ZmZlci5mcm9tKGcsICJiYXNlNjQiKTsKICAgIGVsc2UgaWYgKHR5cGVvZiBhdG9iID09ICJmdW5jdGlvbiIpIHsKICAgICAgY29uc3QgRSA9IGF0b2IoZyk7CiAgICAgIFEgPSBuZXcgVWludDhBcnJheShFLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRS5sZW5ndGg7IGkrKykKICAgICAgICBRW2ldID0gRS5jaGFyQ29kZUF0KGkpOwogICAgfSBlbHNlCiAgICAgIHRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGRlY29kZSBiYXNlNjQtZW5jb2RlZCBkYXRhIFVSTCwgQnVmZmVyIGFuZCBhdG9iIGFyZSBub3Qgc3VwcG9ydGVkIik7CiAgICBBID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoUSwgSSk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IGcgPSBhd2FpdCBmZXRjaChDKSwgUSA9IGcuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpIHx8ICIiOwogICAgaWYgKCJpbnN0YW50aWF0ZVN0cmVhbWluZyIgaW4gV2ViQXNzZW1ibHkgJiYgUS5zdGFydHNXaXRoKCJhcHBsaWNhdGlvbi93YXNtIikpCiAgICAgIEEgPSBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhnLCBJKTsKICAgIGVsc2UgewogICAgICBjb25zdCBFID0gYXdhaXQgZy5hcnJheUJ1ZmZlcigpOwogICAgICBBID0gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoRSwgSSk7CiAgICB9CiAgfQogIHJldHVybiBBLmluc3RhbmNlOwp9LCB0ID0gKEkpID0+IGUoSSwgImRhdGE6YXBwbGljYXRpb24vd2FzbTtiYXNlNjQsQUdGemJRRUFBQUFCVVF4Z0JIOS9mMzhCZjJBRmYzOS9mMzhBWUFaL2YzOS9mMzhCZjJBQmZ3Ri9ZQU4vZjM4QVlBSi9md0JnQVg4QVlBUi9mMzkvQUdBQ2YzOEJmbUFDZjM4QmYyQURmMzkvQVg5Z0JYOStmbjUrQUFNaElBTUVBd1FGQkFZRkJ3Z0FBd2tBQkFRR0JBTUpBQVFLQndVRUFBSUJDd29LQkFVQmNBRUVCQVVEQVFBUkJnNENmd0ZCZ0lEQUFBdC9BRUVBQ3dkRUJnWnRaVzF2Y25rQ0FBcGhiR3h2WTFWcGJuUTRBQUFMWVd4c2IyTlZhVzUwTVRZQUFnUm1jbVZsQUFRSVkyOXRjSEpsYzNNQUN3cGtaV052YlhCeVpYTnpBQklKQ1FFQVFRRUxBeG9iSEFxak95QmVBUUYvSTRDQWdJQUFRUkJySWdFa2dJQ0FnQUFnQVNPQmdJQ0FBRUdZZ01DQUFHb3BBd0EzQXdBZ0FVRUlhaUFCSUFBUWdZQ0FnQUFDUUNBQkx3RU1EUUFnQVNnQ0NDRUFJQUZCRUdva2dJQ0FnQUFnQUE4TEEzOEFEQUFMQzNFQ0FYOEJmaU9BZ0lDQUFFRVFheUlESklDQWdJQUFRb0NBZ0lBUUlRUUNRRUVCUlEwQUFrQWdBZzBBUXYvLy8vOFBJUVFNQVFzZ0FTZ0NBQ0FDUVFCQkFDQUJLQUlFS0FJQUVZQ0FnSUFBQUNJQ1JhMUNJSVlnQXEyRUlRUUxJQUFnQkRjQ0FDQURRUkJxSklDQWdJQUFDMTRCQVg4amdJQ0FnQUJCRUdzaUFTU0FnSUNBQUNBQkk0R0FnSUFBUVppQXdJQUFhaWtEQURjREFDQUJRUWhxSUFFZ0FCQ0RnSUNBQUFKQUlBRXZBUXdOQUNBQktBSUlJUUFnQVVFUWFpU0FnSUNBQUNBQUR3c0Rmd0FNQUFzTGh3RUNBWDhCZmlPQWdJQ0FBRUVRYXlJREpJQ0FnSUFBSUFNZ0FrRUFTRG9BREFKQUFrQWdBa0YvU2cwQVFvQ0FnSUFRSVFRTUFRc0NRQ0FDUVFGMElnSU5BRUwrLy8vL0R5RUVEQUVMSUFFb0FnQWdBa0VCUVFBZ0FTZ0NCQ2dDQUJHQWdJQ0FBQUFpQWtXdFFpQ0dJQUt0aENFRUN5QUFJQVEzQWdBZ0EwRVFhaVNBZ0lDQUFBc1pBQ09CZ0lDQUFFR1lnTUNBQUdvZ0FDQUJFSVdBZ0lBQUN6Z0JBWDhDUUNBQ1FRQWdBaHNpQTBVTkFDQUFLQUlBSUFGQnF0V3ExWG9nQWhzZ0EwRUFRUUFnQUNnQ0JDZ0NDQkdCZ0lDQUFBQUxDdzhBSUFBZ0FFRU1haENIZ0lDQUFBdHdBUU4vQWtBZ0FDZ0NBQ0lDUlEwQUFrQWdBa0YwYWlJRFFRaHFLQUlBSWdKQkNtd2dBa0VQYWtGOGNXcEJBMnBCZkhFaUFrRUFJQUliSWdSRkRRQWdBU2dDQUNBRFFRUWdBaHNnQkVFQ1FRQWdBU2dDQkNnQ0NCR0JnSUNBQUFBTElBQkJBRFlDQ0NBQVFRQTJBZ0FMQzlnQ0F3Ui9BWDRFZnlPQWdJQ0FBRUVRYXlJRUpJQ0FnSUFBSTRHQWdJQUFJUVVnQVNnQ0FDRUdBa0FDUUNBQktBSUVEUUFnQlVHQWdNQ0FBR29oQnd3QkN5QUNJQU1RaVlDQWdBQWhDQUpBQWtBZ0JnMEFRUUFoQlVGL0lRa01BUXNnQmtGOGFpZ0NBQ0lGUVg5cUlRa0xJQVpCZUdvaENpQUpJQWluY1NFQklBaENPWWluSVFzRFFDT0JnSUNBQUVHQWdNQ0FBR29oQnlBR0lBRnFMQUFBSWd4RkRRRWdCVVVOQVFKQUlBeEJmMG9OQUNBTElBeEIvd0J4UncwQUlBSWdBeUFLS0FJQUlBRkJBM1JxSWd3b0FnQWdEQ2dDQkJDS2dJQ0FBRUVCY1VVTkFDQUVRUUU2QUF3Z0JDQUJOZ0lJSUFSQkNHb2hCd3dDQ3lBRlFYOXFJUVVnQVVFQmFpQUpjU0VCREFBTEN3SkFBa0FnQnkwQUJBMEFRUUFoQVVFQUlRVU1BUXNnQmtGMGFpZ0NBQ0FIS0FJQVFRRjBhaThCQUNFQlFZQ0FCQ0VGQ3lBQUlBVWdBWEkyQVFBZ0JFRVFhaVNBZ0lDQUFBdnNCUVVDZndGK0FYOENmZ0ovSTRDQWdJQUFRZUFBYXlJQ0pJQ0FnSUFBQWtBQ1FBSkFBa0FDUUNBQlFSQkxEUUFnQVVFRFRRMEJJQUExQUFCQ0lJWWdBQ0FCUVFGMlFmei8vLzhIY1NJRGFqVUFBSVFoQkNBQUlBRkJmR29pQldvMUFBQkNJSVlnQUNBRklBTnJhalVBQUlRaEJrS3NtdUxUbzlMdytoOGhCd3dFQzBFQUlRTkNySnJpMDZQUzhQb2ZJUWRCQUNFRklBRkJNRWtOQWtFQUlRVkNySnJpMDZQUzhQb2ZJUWRDckpyaTA2UFM4UG9mSVFSQ3JKcmkwNlBTOFBvZklRWURRQ0FGUVRCcUlnZ2dBVThOQWlBQ1FjQUFhaUFBSUFWcUlnVXBBQWdnQm9WQ0FDQUZLUUFBUXR2UjBJV2EydCtCWjRWQ0FCQ2RnSUNBQUNBQ1FUQnFJQVZCR0dvcEFBQWdCSVZDQUNBRlFSQnFLUUFBUXVPTm8rU0ozcHJlam4rRlFnQVFuWUNBZ0FBZ0FrRWdhaUFGUVNocUtRQUFJQWVGUWdBZ0JVRWdhaWtBQUVMRG1kMnB4N25aek5nQWhVSUFFSjJBZ0lBQUlBSkJ3QUJxUVFocUtRTUFJQUlwQTBDRklRWWdBa0VnYWtFSWFpa0RBQ0FDS1FNZ2hTRUhJQUpCTUdwQkNHb3BBd0FnQWlrRE1JVWhCQ0FJSVFVTUFBc0xRZ0FoQmtLc211TFRvOUx3K2g4aEJ3SkFJQUVOQUVJQUlRUU1Bd3NnQUNBQlFRRjJhakVBQUVJSWhpQUFNUUFBUWhDR2hDQUJJQUJxUVg5cU1RQUFoQ0VFREFJTElBUWdCNFVnQm9VaEJ3c2dBQ0FGYWlFSklBRWdCV3NoQ0FKQUEwQWdBMEVRYWlJRklBaFBEUUVnQWtIUUFHb2dDU0FEYWlJRFFRaHFLUUFBSUFlRlFnQWdBeWtBQUVMYjBkQ0ZtdHJmZ1dlRlFnQVFuWUNBZ0FBZ0FrSFFBR3BCQ0dvcEF3QWdBaWtEVUlVaEJ5QUZJUU1NQUFzTElBRWdBR29pQTBGNGFpa0FBQ0VHSUFOQmNHb3BBQUFoQkFzZ0FrRVFhaUFFUXR2UjBJV2EydCtCWjRWQ0FDQUdJQWVGUWdBUW5ZQ0FnQUFnQWlBQ1FSQnFRUWhxS1FNQVF0dlIwSVdhMnQrQlo0VkNBQ0FCclNBQ0tRTVFoVUt2eVBYRng2eUh1NkIvaFVJQUVKMkFnSUFBSUFKQkNHb3BBd0FoQnlBQ0tRTUFJUVFnQWtIZ0FHb2tnSUNBZ0FBZ0J5QUVoUXRZQVFKL1FRQWhCQUpBSUFFZ0EwY05BQUpBSUFBZ0FrY05BRUVCRHdzRFFDQUJSU0VFSUFGRkRRRWdBVUYvYWlFQklBSXRBQUFoQXlBQUxRQUFJUVVnQUVFQmFpRUFJQUpCQVdvaEFpQUZJQU5HRFFBTEN5QUVDNnNUQmdWL0FYNERmd0YrRzM4QmZpT0FnSUNBQUVHZ0FXc2lBU1NBZ0lDQUFFRUFJUUlEUUNBQUlBSnFJUU1nQWtFQmFpSUVJUUlnQXkwQUFBMEFDMEVBSVFJZ0FVRVlha0VJYWlJRlFRQTJBZ0FnQVVJQU53TVlJQUVqZ1lDQWdBQkJtSURBZ0FCcUtRTUFJZ1kzQWlRZ0FTQUdOd0owSUFGQkFEWUNjQ0FCUXFyVnF0VUtOd0pvQWtBQ1FDQUJRZWdBYWlBRVFYOXFJZ2NRaklDQWdBQkIvLzhEY1VVTkFDQUJRUmhxRUlhQWdJQUFEQUVMSUFGQkdHcEJER29oQ0NBR1FpQ0lweUVKSUFFcEFuUWhDaUFCS0FKd0lRc2dBU2dDYkNFQ0lBRW9BbWdoRENBR3B5RU5RWUFDSVE1QkFDRVBBa0FEUUNBQ0lSQWdEMEVDYWlFRElBQWdEMm9oRVVFQUlRSUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQU5BQWtBQ1FDQURJQUpxSUFkUERRQWdBVUV3YWlBQlFSaHFJQkVnQWtFQ2FpSVNFSWlBZ0lBQUlBRXRBRElOQVNBQktBSVlJUk1nQVNnQ0lBMEdBa0FDUUNBVERRQkJBU0VEREFFTElCTkJmR29vQWdDdFF0QUFmaUlHSUFaQzVBQ0NmVUxrQUh4QzBBQ0FweUVEQzBFQUlRUWdBVUhvQUdwQkNHb2lGRUVBTmdJQUlBRkNBRGNEYUVFQURRVUNRQUpBUWdGQklDQURaMnV0UXYvL0E0T0dweUlEUVFnZ0EwRUlTeHNpRlVFQmRDQVZRUTlxUVh4eEloWWdGVUVEZEdvaUYycEJBMnBCZkhFaUF3MEFRWHdoQXd3QkMwRUFJUVFnRFNBRFFRSkJBQ0FKS0FJQUVZQ0FnSUFBQUNJRFJRMEdDeUFEUVFocUloZ2dGVFlDQUNBRElBTWdGbW8yQWdRZ0F5QURJQmRxTmdJQUlBRWdBMEVNYWlJRE5nSm9JQU5CQUNBVkVKNkFnSUFBSVFRZ0FTQVZyVUxRQUg1QzVBQ0FweUlaTmdKd0lBRW9BaHdpR2tVTkJFRUFJUnRCQUNFY0FrQWdFMFVOQUNBVFFYeHFLQUlBSVJ3TElBUkJkR29oSFNBRVFYaHFJUjRnRTBGMGFpSURLQUlBSVI4Z0EwRUVhaWdDQUNFZ1FRQWhJUU5BSUNFZ0hFWU5CQUpBSUJNZ0lXb3NBQUJCQUU0TkFDQWZJQ0ZCQVhScUx3RUFJU0lnSUNBaFFRTjBhaUlES0FJRUlTTWdBeWdDQUNFa0FrQWdHMFVOQUNBa0lDTVFpWUNBZ0FBaEJpQVlLQUlBSWhWQmYyb2lGeUFHcDNFaEF5QUdRam1JcHlFbEEwQWdCQ0FEYWl3QUFDSVdSUTBCSUJWRkRRRUNRQ0FXUVg5S0RRQWdKU0FXUWY4QWNVY05BQ0FrSUNNZ0hpZ0NBQ0FEUVFOMGFpSVdLQUlBSUJZb0FnUVFpb0NBZ0FCQkFYRkZEUUFnQVVFQk9nQ2NBUXdDQ3lBVlFYOXFJUlVnQTBFQmFpQVhjU0VEREFBTEN5QWtJQ01RaVlDQWdBQWhCaUFZS0FJQVFYOXFJaFlnQnFkeElRTUNRQU5BSUFRZ0Eyb2lGU3dBQUVGL1NnMEJJQU5CQVdvZ0ZuRWhBd3dBQ3dzZ0ZTQUdRam1JcDBHQUFYSTZBQUFnSGlnQ0FDQURRUU4wYWlJVklDTTJBZ1FnRlNBa05nSUFJQjBvQWdBZ0EwRUJkR29nSWpzQkFDQVpRWDlxSVJrZ0cwRUJhaUliSUJwSERRQWdHaUViREFVTElDRkJBV29oSVF3QUN3c0NRQUpBSUE5QkFXb2dCMGtOQUNBUkxRQUFJUUlNQVFzZ0FVRTRha0VRYWlBQlFSaHFRUkJxS0FJQU5nSUFJQUZCT0dwQkNHb2dBVUVZYWtFSWFpa0RBRGNEQUNBQklBRXBBeGczQXpnZ0FVSE1BR29nQVVFNGFpQVJJQUpCQW1vUWlJQ0FnQUFDUUNBQkxRQk9EUUFDUUFKQUlBSU5BQ0FSTFFBQUlRTU1BUXNnQVVIUUFHcEJFR29nQVVFWWFrRVFhaWdDQURZQ0FDQUJRZEFBYWtFSWFpQUJRUmhxUVFocUtRTUFOd01BSUFFZ0FTa0RHRGNEVUNBQlFlUUFhaUFCUWRBQWFpQVJJQUpCQVdvUWlJQ0FnQUFnQVM4QlpDRURDeUFNSUJCQkFYUnFJQU03QVFBZ0VFRUJhaUVRSUJFZ0FtcEJBV290QUFBaEFnd0JDeUFCTHdGTUlRSUxJQXdnRUVFQmRHb2dBanNCQUNBQlFSaHFFSWFBZ0lBQUlBRWdDamNDRUNBQklBczJBZ3dnQVNBUVFRRnFOZ0lJSUFFZ0REWUNCRUVBSVFJZ0FVRUVhaUFRUVFKcUVJeUFnSUFBUWYvL0EzRU5EaUFCS0FJRUlnTWdBU2dDQ0NJQ1FRRjBha0VBT3dFQUlBRW9BZ3doQUNBQklBRXBBaEFpQmpjRE9BSkFJQUZCT0dvZ0F5QUFJQUpCQVdvaUFoQ05nSUNBQUVFQmNVVU5BQ0FESVFJTUR3c2dBVUhvQUdvZ0FVRTRhaUFDRUk2QWdJQUFJQUV2QVhBTkRTQUJLQUpvSWdJZ0F5QUJLQUpzUVFGMEVKK0FnSUFBR2lBQklBWTNBMUFnQVVIUUFHb2dBeUFBRUkrQWdJQUFEQTRMSUFKQkFXb2hBZ3dBQ3dzZ0FTQVpOZ0p3SUFFZ0d6WUNiQXNnQlNnQ0FDRURJQVVnRkNnQ0FEWUNBQ0FVSUFNMkFnQWdBVUVBTmdJY0lBRXBBeGdoQmlBQklBRXBBMmdpSmpjREdDQUJJQVkzQTJnZ0pxY2hFMEVCSVFRTElBRkI2QUJxSUFnUWg0Q0FnQUFnQkEwQUk0R0FnSUFBSVFNZ0FTZ0NIQTBCSUFOQmdJREFnQUJxSVJZTUF3c2dFU0FTRUltQWdJQUFJUVlDUUFKQUlCTU5BQ0FHcHlFRFFRQWhGa0YvSVNFTUFRc2dFMEY4YWlnQ0FDSVdRWDlxSWlFZ0JxZHhJUU1MSUJOQmVHb2hJeUFUUVh4cUlTUWdCa0k1aUtjaEpTQVdJUVFEUUNBVElBTnFJaGNzQUFBaUZVVU5BaUFFUVFCR0RRSUNRQUpBSUJWQmYwb05BQ0FsSUJWQi93QnhSdzBBSUJFZ0VpQWpLQUlBSUFOQkEzUnFJaFVvQWdBZ0ZTZ0NCQkNLZ0lDQUFFRUJjVVVOQVF3R0N5QVdJQ1FvQWdCSERRQWdBeUFXSUJWQkFVWWJJUllMSUFSQmYyb2hCQ0FEUVFGcUlDRnhJUU1NQUFzTElCRWdFaENKZ0lDQUFDRUdBa0FDUUNBVERRQkJBQ0VFUVg4aEZ3d0JDeUFUUVh4cUtBSUFJZ1JCZjJvaEZ3c2dFMEY0YWlFbElCY2dCcWR4SVFNZ0JrSTVpS2NoSVFOQUk0R0FnSUFBUVlDQXdJQUFhaUVXSUJNZ0Eyb3NBQUFpRlVVTkFpQUVSUTBDQWtBZ0ZVRi9TZzBBSUNFZ0ZVSC9BSEZIRFFBZ0VTQVNJQ1VvQWdBZ0EwRURkR29pRlNnQ0FDQVZLQUlFRUlxQWdJQUFRUUZ4UlEwQUlBRkJBVG9BZ0FFZ0FTQUROZ0o4SUFGQi9BQnFJUllNQXdzZ0JFRi9haUVFSUFOQkFXb2dGM0VoQXd3QUN3c2dKQ2dDQUNFRUlBRWdBU2dDSUVGL2FqWUNJQ0FUSUJacUlCY2dGaUFFU1NJRUd5QWxRWUFCY2pvQUFDQVRRWFJxS0FJQUlSVWdJeWdDQUNFWElBRWdBU2dDSEVFQmFqWUNIQ0FYSUJZZ0F5QUVHeUlEUVFOMGFpSUVJQkkyQWdRZ0JDQVJOZ0lBSUJVZ0EwRUJkR29oQXd3Q0N5QVdMUUFFUlEwQ0lCWW9BZ0FoQXdzZ0UwRjBhaWdDQUNBRFFRRjBhaUVEQ3lBRElBNDdBUUFDUUFKQUlBSU5BQ0FSTFFBQUlRSkJBU0VEREFFTElBRkJOR29nQVVFWWFpQVJJQUpCQVdvaUF4Q0lnSUNBQUNBQkx3RTBJUUlMSUF3Z0VFRUJkR29nQWpzQkFDQURJQTlxSVE4Z0VFRUJhaUVDSUE1QkFXb2lEa0gvL3dOeFFmLy9BMGNOQVNBVFFRQWdFMEY4YWlnQ0FDSURFSjZBZ0lBQUdpQU1JQUpCQVhScVFmNy9BenNCQUNBQlFRQTJBaHdnQVNBRHJVTFFBSDVDNUFDQVBnSWdJQkJCQW1vaEFrR0FBaUVPREFFTEN5QUJRUmhxRUlhQWdJQUFDMEVBSVFJTElBRkJvQUZxSklDQWdJQUFJQUlMckFFQkJYOGpnSUNBZ0FCQkVHc2lBaVNBZ0lDQUFFRUFJUU1DUUNBQUtBSUlJZ1FnQVU4TkFBSkFJQUJCREdvaUJTQUFLQUlBSWdZZ0JDQUJFSTJBZ0lBQVFRRnhEUUFnQWtFRWFpQUZJQUVRam9DQWdBQWdBaThCRENJRERRRWdBaWdDQ0NFQklBSW9BZ1FnQUNnQ0FDQUFLQUlFUVFGMEVKK0FnSUFBSVFNZ0JTQUdJQVFRajRDQWdBQWdBQ0FETmdJQUN5QUFJQUUyQWdoQkFDRURDeUFDUVJCcUpJQ0FnSUFBSUFNTGlBRUJBbjhqZ0lDQWdBQkJFR3NpQkNTQWdJQ0FBQUpBQWtBZ0F3MEFJQVFnQUNrQ0FEY0RBQ0FFSUFFZ0FoQ1BnSUNBQUVFQklRVU1BUXRCQUNFRklBSkZEUUFnQkNBRFFRQklPZ0FNSUFOQmYwd05BQ0FBS0FJQUlBRWdBa0VCZEVFQklBTkJBWFJCQUNBQUtBSUVLQUlFRVlLQWdJQUFBQ0VGQ3lBRVFSQnFKSUNBZ0lBQUlBVUxsUUVCQVg4amdJQ0FnQUJCTUdzaUF5U0FnSUNBQUNBRElBRXBBZ0EzQXdnZ0EwRVFhaUFEUVFocUlBSVFnNENBZ0FBQ1FBSkFJQU12QVJRaUFVVU5BQ0FESUFFN0FTQWdBMEVZYWlFQ0RBRUxJQU5CQURzQkxDQURJQUkyQWlnZ0F5QURLQUlRTmdJa0lBTkJKR29oQWdzZ0FDQUNLUUlBTndJQUlBQkJDR29nQWtFSWFpZ0NBRFlDQUNBRFFUQnFKSUNBZ0lBQUN6Y0JBWDhDUUNBQ1FRRjBRUUFnQWhzaUEwVU5BQ0FBS0FJQUlBRkJBaUFDR3lBRFFRRkJBQ0FBS0FJRUtBSUlFWUdBZ0lBQUFBc0xQd0VCZnlPQWdJQ0FBRUVRYXlJQkpJQ0FnSUFBSUFFZ0FDa0NERGNEQ0NBQlFRaHFJQUFvQWdBZ0FDZ0NDQkNSZ0lDQUFDQUJRUkJxSklDQWdJQUFDemNCQVg4Q1FDQUNRUU4wUVFBZ0Foc2lBMFVOQUNBQUtBSUFJQUZCQkNBQ0d5QURRUUpCQUNBQUtBSUVLQUlJRVlHQWdJQUFBQXNMdFFjREJYOEJmZ1ovSTRDQWdJQUFRZEFBYXlJQkpJQ0FnSUFBUVd3aEFrRi9JUU1nQUNFRUEwQWdBMEVCYWlFRElBSkJGR29oQWlBRUx3RUFJUVVnQkVFQ2FpRUVJQVVOQUFzZ0FVRUFOZ0lvSUFGQ3F0V3ExUW8zQWlBZ0FTT0JnSUNBQUVHWWdNQ0FBR29wQXdBaUJqY0NMQ0FCUVFBNkFEUUNRQUpBQWtCQkFVVU5BQ0FHcDBINHdTWkJBa0VBSUFaQ0lJaW5LQUlBRVlDQWdJQUFBQ0lGUlEwQUlBRkJuK2dFTmdJb0lBRWdCVFlDSUVFQUlRUUNRQU5BSUFSQitQOGZSZzBCSUFVZ0JHcENBRGNDQUNBRVFRaHFJUVFNQUFzTElBRkIvLzhETmdJa0lBRWdCamNDUUVFQUlRUWdBVUVBTmdJOElBRkNxdFdxMVFvM0FqUWdBVUUwYWlBQ0VKT0FnSUFBUWYvL0EzRU5BQ0FCS1FKQUlRWWdBU2dDUENFSElBRW9BalFpQ0NBQktBSTRJZ0pxSUFBdEFBQTZBQUFnQlNBQUx3RUFRUU4wYWlJSlFRRTJBZ1FnQ1NBSU5nSUFJQUpCQVdvaENrRUJJUUpCZ0FJaEN3TkFJQW9oQ1FKQUFrQUNRQUpBSUFJZ0EwOE5BQUpBSUFBZ0FrRUJkR292QVFBaUNrSCsvd05IRFFBZ0FrRUJhaUlDSUFOUERRRkJBQ0VFQWtBRFFDQUVRZmovSDBZTkFTQUZJQVJxUWdBM0FnQWdCRUVJYWlFRURBQUxDd0pBSUFBZ0FrRUJkR292QVFBaUJFR0FBa2tOQUNBQlFmLy9BellDSkF3SEN5QUlJQWxxSUFRNkFBQWdDVUVCYWlFS1FZQUNJUXNNQkFzZ0NrR0FBa2tOQVFKQUlBVWdDa0VEZEdvaUNpZ0NBQ0lNRFFBZ0NDQUphaUFJSUFScUlnb2dDU0FFYXlJTUVKK0FnSUFBR2lBSUlBd2dDV29pREdvZ0NpMEFBRG9BQUNBTVFRRnFJUW9NQXdzZ0NDQUphaUFNSUFvb0FnUWlDaENmZ0lDQUFCb2dDaUFKYWlFS0RBSUxJQUZCLy84RE5nSWtJQUZCSUdvUWtJQ0FnQUFnQVNBR053SVlJQUVnQnpZQ0ZDQUJJQWcyQWd3Z0FTQUpOZ0lRUVFBaEJDQUJRUXhxSUFsQkFXb1FrNENBZ0FCQi8vOERjUTBHSUFFb0Fnd2lBeUFCS0FJUUlnUnFRUUE2QUFBZ0FTZ0NGQ0VDSUFFZ0FTa0NHQ0lHTndOSUFrQWdBVUhJQUdvZ0F5QUNJQVJCQVdvaUJCQ1VnSUNBQUVFQmNVVU5BQ0FESVFRTUJ3c2dBVUUwYWlBQlFjZ0FhaUFFRUpXQWdJQUFJQUV2QVR3TkJTQUJLQUkwSWdRZ0F5QUJLQUk0RUorQWdJQUFHaUFCSUFZM0F5QWdBVUVnYWlBRElBSVFoWUNBZ0FBTUJnc2dDQ0FKYWlBS09nQUFJQWxCQVdvaENnc2dCU0FMUWYvL0EzRkJBM1JxSWd3Z0NTQUVhMEVCYWpZQ0JDQU1JQWdnQkdvMkFnQWdDMEVCYWlFTEN5QUNRUUZxSVFJZ0NTRUVEQUFMQ3lBQlFTQnFFSkNBZ0lBQUMwRUFJUVFMSUFGQjBBQnFKSUNBZ0lBQUlBUUxxUUVCQlg4amdJQ0FnQUJCRUdzaUFpU0FnSUNBQUVFQUlRTUNRQ0FBS0FJSUlnUWdBVThOQUFKQUlBQkJER29pQlNBQUtBSUFJZ1lnQkNBQkVKU0FnSUFBUVFGeERRQWdBa0VFYWlBRklBRVFsWUNBZ0FBZ0FpOEJEQ0lERFFFZ0FpZ0NDQ0VCSUFJb0FnUWdBQ2dDQUNBQUtBSUVFSitBZ0lBQUlRTWdCU0FHSUFRUWhZQ0FnQUFnQUNBRE5nSUFDeUFBSUFFMkFnaEJBQ0VEQ3lBQ1FSQnFKSUNBZ0lBQUlBTUxkUUVDZnlPQWdJQ0FBRUVRYXlJRUpJQ0FnSUFBQWtBQ1FDQUREUUFnQkNBQUtRSUFOd01BSUFRZ0FTQUNFSVdBZ0lBQVFRRWhCUXdCQzBFQUlRVWdBa1VOQUVFQURRQWdBQ2dDQUNBQklBSkJBQ0FEUVFBZ0FDZ0NCQ2dDQkJHQ2dJQ0FBQUFoQlFzZ0JFRVFhaVNBZ0lDQUFDQUZDNVVCQVFGL0k0Q0FnSUFBUVRCcklnTWtnSUNBZ0FBZ0F5QUJLUUlBTndNSUlBTkJFR29nQTBFSWFpQUNFSUdBZ0lBQUFrQUNRQ0FETHdFVUlnRkZEUUFnQXlBQk93RWdJQU5CR0dvaEFnd0JDeUFEUVFBN0FTd2dBeUFDTmdJb0lBTWdBeWdDRURZQ0pDQURRU1JxSVFJTElBQWdBaWtDQURjQ0FDQUFRUWhxSUFKQkNHb29BZ0EyQWdBZ0EwRXdhaVNBZ0lDQUFBdlNBZ01HZndGK0IzOGpnSUNBZ0FCQkVHc2lBeVNBZ0lDQUFDQUFLQUlFSVFRZ0FDZ0NBQ0VGUVFBaEJpQUNRZjhCY1NFSEEzOENRQUpBQWtBZ0JpQUVSdzBBUVg4aENBd0JDd0pBSUFVZ0JrRUVkR29pQWtFSWFpa0RBQ0lKUWdCVERRQWdBaWtEQUhzZ0NYdDhweUFCU1EwQ0N5QUdRUWQwSWdoQmdBRnFJUW9EUUNBSUlBcFBEUUlnQ0NBQUtRSUFJZ2xDR1lpblFZQi9jU0lDSUFnZ0Frc2JJZ3NnQ0dzaERDQUpwMEVJSUFsQ0lJaW5HeUVOSUFoQkVIUm9JUTVCQUNFQ0FrQURRQUpBSUF3Z0FrY05BQ0FMSVE4TUFndEIvd0VnQ0NBQ2FpSVBRUWR4SWhCQkIzTjJRUUVnRUhSeElBMGdEMEVEZG1vdEFBQnhSUTBCSUFKQkFXb2lBaUFCU1EwQUlBNGdCMGtOQUFzZ0F5QUpOd01JSUFOQkNHb2dDQ0FCUVFBUWw0Q0FnQUFNQWdzZ0QwRUJhaUVJREFBTEN5QURRUkJxSklDQWdJQUFJQWdQQ3lBR1FRRnFJUVlNQUFzTFZBRUJmeUFEUVFGeElRUUNRQU5BSUFKRkRRRWdBQ2dDQUVFSUlBQW9BZ1FiSUFGQkEzWnFJZ01nQXkwQUFFRitJQUZCQjNFaUEzZHhJQVFnQTNSeU9nQUFJQUZCQVdvaEFTQUNRWDlxSVFJTUFBc0xDOXNCQVFOL0k0Q0FnSUFBUVJCcklnSWtnSUNBZ0FBQ1FDQUFRWUFRVHcwQUk0R0FnSUFBUWFpQXdJQUFhaUFBSUFGQmdCQWdBVUdBRUVrYklBQnJFSm1BZ0lBQUN3SkFJQUZCZ0JCTkRRQUNRQ09CZ0lDQUFFR2dnTUNBQUdvb0FnUU5BQ09CZ0lDQUFFR2dnTUNBQUdvaUEwR0FJRFlDQkNBRElBRkJmMm9pQVVFUWRDSUVOZ0lBSUFSQkFFR0FnQVFRbm9DQWdBQWFDeUFDSTRHQWdJQUFRYUNBd0lBQWFpa0RBRGNEQ0NBQ1FRaHFJQUJCZ0JBZ0FFR0FFRXNiSWdCQmdIQnFJQUVnQUdzUW1ZQ0FnQUFMSUFKQkVHb2tnSUNBZ0FBTE93RUJmeU9BZ0lDQUFFRVFheUlESklDQWdJQUFJQU1nQUNrQ0FEY0RDQ0FEUVFocUlBRWdBa0VCRUplQWdJQUFJQU5CRUdva2dJQ0FnQUFMdlFFQkJIOUJBQ0VFQWtBZ0FVR0JnSHhQRFFBQ1FDT0JnSUNBQUVHb2dNQ0FBR29nQVVILy93TnFRUkIySWdFZ0FoQ1dnSUNBQUNJRVFYOUhEUUFDUUNPQmdJQ0FBRUdnZ01DQUFHb2dBU0FDRUphQWdJQUFJZ1JCZjBZTkFDQUVRWUFRYWlFRURBRUxRUUFoQkVFQklBSjBJZ1UvQUNJR1FSQjBJZ0pxUVg5cVFRQWdCV3R4SWdVZ0FtdEJFSFlpQnlBQmFrQUFRUUZJRFFFZ0J5QUdhaUVFSUFVZ0FrWU5BQ0FHSUFRUW1JQ0FnQUFMSUFSQkVIUWhCQXNnQkF0UEFRRi9Ba0FnQWtILy93TnFJZ1pCZ0lCOGNTQUVUeUlDUlEwQUlBUkIvLzhEYWtFUWRpSUVJQVpCRUhZaUJrWU5BQ0FFSUFGQi8vOERha0VRZGlJQmFpQUJJQVpxRUppQWdJQUFDeUFDQ3lFQUlBRkIvLzhEYWtFUWRpSUJJQUVnQWtILy93TnFRUkIyYWhDWWdJQ0FBQXQxQVFGK0lBQWdCQ0FCZmlBQ0lBTitmQ0FEUWlDSUlnSWdBVUlnaUNJRWZud2dBMEwvLy8vL0Q0TWlBeUFCUXYvLy8vOFBneUlCZmlJRlFpQ0lJQU1nQkg1OElnTkNJSWg4SUFOQy8vLy8vdytESUFJZ0FYNThJZ0ZDSUloOE53TUlJQUFnQVVJZ2hpQUZRdi8vLy84UGc0UTNBd0FMTEFFQmZ3SkFJQUpGRFFBZ0FDRURBMEFnQXlBQk9nQUFJQU5CQVdvaEF5QUNRWDlxSWdJTkFBc0xJQUFMUWdFQmZ3SkFJQUpGRFFBZ0FrRi9haUVDSUFBaEF3TkFJQU1nQVMwQUFEb0FBQ0FDUlEwQklBSkJmMm9oQWlBQlFRRnFJUUVnQTBFQmFpRUREQUFMQ3lBQUN3dEJBZ0JCZ0lEQUFBc0lBQUFBQUFBQUFBQUFRWWlBd0FBTEtBRUFBQUFDQUFBQUF3QUFBQUFBQUFBQUFBQUFDQUFRQUtxcXFxb0FBQUFBTUFBUUFCQUFBQUE9Iik7CmNvbnN0IHMgPSBhd2FpdCB0KCksIEIgPSBzLmV4cG9ydHM7CmZ1bmN0aW9uIHcoSSkgewogIGNvbnN0IHsgcHRyOiBDLCBsZW5ndGg6IEEgfSA9IEQoSSwgQiksIGcgPSBCLmNvbXByZXNzKEMpOwogIEIuZnJlZShDLCBBKTsKICBjb25zdCBRID0gbmV3IFVpbnQxNkFycmF5KAogICAgQi5tZW1vcnkuYnVmZmVyLnNsaWNlKAogICAgICBnLAogICAgICBnICsgKEIubWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoIC0gZykKICAgICkKICApLCBFID0gUS5pbmRleE9mKDApLCBpID0gUS5zbGljZSgwLCBFKSwgbyA9IGEoaSk7CiAgcmV0dXJuIEIuZnJlZShnLCBFICsgMSksIG87Cn0KZnVuY3Rpb24gRihJKSB7CiAgY29uc3QgQyA9IEIuYWxsb2NVaW50MTYoCiAgICBJLmxlbmd0aCArIDEKICApLCBBID0gbmV3IFVpbnQxNkFycmF5KAogICAgQi5tZW1vcnkuYnVmZmVyLAogICAgQywKICAgIEkubGVuZ3RoICsgMQogICk7CiAgZm9yIChsZXQgbyA9IDA7IG8gPCBJLmxlbmd0aDsgbysrKQogICAgQVtvXSA9IEkuY2hhckNvZGVBdChvKTsKICBBW0kubGVuZ3RoXSA9IDA7CiAgY29uc3QgZyA9IEIuZGVjb21wcmVzcygKICAgIEMKICApOwogIEIuZnJlZShDLCBJLmxlbmd0aCArIDEpOwogIGNvbnN0IFEgPSBuZXcgVWludDhBcnJheSgKICAgIEIubWVtb3J5LmJ1ZmZlci5zbGljZSgKICAgICAgZywKICAgICAgZyArIChCLm1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCAtIGcpCiAgICApCiAgKSwgRSA9IFEuaW5kZXhPZigwKTsKICByZXR1cm4gQi5mcmVlKGcsIEUgKyAxKSwgbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKAogICAgUS5zbGljZSgwLCBFKQogICk7Cn0Kb25tZXNzYWdlID0gYXN5bmMgZnVuY3Rpb24oSSkgewogIGNvbnN0IHsgY29tbWFuZDogQywgaWQ6IEEsIGRhdGE6IGcgfSA9IEkuZGF0YTsKICBzd2l0Y2ggKEMpIHsKICAgIGNhc2UgImRlY29tcHJlc3MiOiB7CiAgICAgIHBvc3RNZXNzYWdlKHsgaWQ6IEEsIGRhdGE6IEYoZykgfSk7CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAiY29tcHJlc3MiOiB7CiAgICAgIHBvc3RNZXNzYWdlKHsgaWQ6IEEsIGRhdGE6IHcoZykgfSk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfTsK", V = typeof window < "u" && window.Blob && new Blob([atob(J)], { type: "text/javascript;charset=utf-8" });
|
|
2
|
+
function d() {
|
|
3
|
+
let U;
|
|
4
|
+
try {
|
|
5
|
+
if (U = V && (window.URL || window.webkitURL).createObjectURL(V), !U)
|
|
6
|
+
throw "";
|
|
7
|
+
return new Worker(U);
|
|
8
|
+
} catch {
|
|
9
|
+
return new Worker("data:application/javascript;base64," + J, { type: "module" });
|
|
10
|
+
} finally {
|
|
11
|
+
U && (window.URL || window.webkitURL).revokeObjectURL(U);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const R = new d();
|
|
15
|
+
let l = 0;
|
|
16
|
+
const Q = {};
|
|
17
|
+
R.onmessage = function(U) {
|
|
18
|
+
console.log("onmessage", U);
|
|
19
|
+
const F = U.data.id;
|
|
20
|
+
Q[F](U.data.data), delete Q[F];
|
|
21
|
+
};
|
|
22
|
+
async function S(U) {
|
|
23
|
+
const F = l++;
|
|
24
|
+
return console.log("compress", F), new Promise((B) => {
|
|
25
|
+
Q[F] = B, R.postMessage({ command: "compress", id: F, data: U });
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async function Z(U) {
|
|
29
|
+
const F = l++;
|
|
30
|
+
return console.log("decompress", F), new Promise((B) => {
|
|
31
|
+
Q[F] = B, R.postMessage({ command: "decompress", id: F, data: U });
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
S as compress,
|
|
36
|
+
Z as decompress
|
|
37
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { i as o, c as F, U as G } from "./wasm-helper-6790be72.js";
|
|
2
|
+
const w = (I) => o(I, "data:application/wasm;base64,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IgBBgHBqIAEgAGsQmYCAgAALIAJBEGokgICAgAALOwEBfyOAgICAAEEQayIDJICAgIAAIAMgACkCADcDCCADQQhqIAEgAkEBEJeAgIAAIANBEGokgICAgAALvQEBBH9BACEEAkAgAUGBgHxPDQACQCOBgICAAEGogMCAAGogAUH//wNqQRB2IgEgAhCWgICAACIEQX9HDQACQCOBgICAAEGggMCAAGogASACEJaAgIAAIgRBf0YNACAEQYAQaiEEDAELQQAhBEEBIAJ0IgU/ACIGQRB0IgJqQX9qQQAgBWtxIgUgAmtBEHYiByABakAAQQFIDQEgByAGaiEEIAUgAkYNACAGIAQQmICAgAALIARBEHQhBAsgBAtPAQF/AkAgAkH//wNqIgZBgIB8cSAETyICRQ0AIARB//8DakEQdiIEIAZBEHYiBkYNACAEIAFB//8DakEQdiIBaiABIAZqEJiAgIAACyACCyEAIAFB//8DakEQdiIBIAEgAkH//wNqQRB2ahCYgICAAAt1AQF+IAAgBCABfiACIAN+fCADQiCIIgIgAUIgiCIEfnwgA0L/////D4MiAyABQv////8PgyIBfiIFQiCIIAMgBH58IgNCIIh8IANC/////w+DIAIgAX58IgFCIIh8NwMIIAAgAUIghiAFQv////8Pg4Q3AwALLAEBfwJAIAJFDQAgACEDA0AgAyABOgAAIANBAWohAyACQX9qIgINAAsLIAALQgEBfwJAIAJFDQAgAkF/aiECIAAhAwNAIAMgAS0AADoAACACRQ0BIAJBf2ohAiABQQFqIQEgA0EBaiEDDAALCyAACwtBAgBBgIDAAAsIAAAAAAAAAAAAQYiAwAALKAEAAAACAAAAAwAAAAAAAAAAAAAACAAQAKqqqqoAAAAAMAAQABAAAAA="), a = await w(), A = a.exports;
|
|
3
|
+
function h(I) {
|
|
4
|
+
const { ptr: C, length: i } = F(I, A), g = A.compress(C);
|
|
5
|
+
A.free(C, i);
|
|
6
|
+
const B = new Uint16Array(
|
|
7
|
+
A.memory.buffer.slice(
|
|
8
|
+
g,
|
|
9
|
+
g + (A.memory.buffer.byteLength - g)
|
|
10
|
+
)
|
|
11
|
+
), E = B.indexOf(0), D = B.slice(0, E), Q = G(D);
|
|
12
|
+
return A.free(g, E + 1), Q;
|
|
13
|
+
}
|
|
14
|
+
function J(I) {
|
|
15
|
+
const C = A.allocUint16(
|
|
16
|
+
I.length + 1
|
|
17
|
+
), i = new Uint16Array(
|
|
18
|
+
A.memory.buffer,
|
|
19
|
+
C,
|
|
20
|
+
I.length + 1
|
|
21
|
+
);
|
|
22
|
+
for (let Q = 0; Q < I.length; Q++)
|
|
23
|
+
i[Q] = I.charCodeAt(Q);
|
|
24
|
+
i[I.length] = 0;
|
|
25
|
+
const g = A.decompress(
|
|
26
|
+
C
|
|
27
|
+
);
|
|
28
|
+
A.free(C, I.length + 1);
|
|
29
|
+
const B = new Uint8Array(
|
|
30
|
+
A.memory.buffer.slice(
|
|
31
|
+
g,
|
|
32
|
+
g + (A.memory.buffer.byteLength - g)
|
|
33
|
+
)
|
|
34
|
+
), E = B.indexOf(0);
|
|
35
|
+
return A.free(g, E + 1), new TextDecoder().decode(
|
|
36
|
+
B.slice(0, E)
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
h as compress,
|
|
41
|
+
J as decompress
|
|
42
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
function s(e, n) {
|
|
2
|
+
const t = new TextEncoder().encode(e), a = n.allocUint8(t.length + 1), r = new Uint8Array(
|
|
3
|
+
n.memory.buffer,
|
|
4
|
+
a,
|
|
5
|
+
t.length + 1
|
|
6
|
+
);
|
|
7
|
+
return r.set(t), r[t.length] = 0, { ptr: a, length: t.length + 1 };
|
|
8
|
+
}
|
|
9
|
+
function f(e) {
|
|
10
|
+
const n = new Array(e.length);
|
|
11
|
+
for (let t = 0; t < e.length; t++)
|
|
12
|
+
n[t] = String.fromCharCode(e[t]);
|
|
13
|
+
return n.join("");
|
|
14
|
+
}
|
|
15
|
+
const c = async (e = {}, n) => {
|
|
16
|
+
let t;
|
|
17
|
+
if (n.startsWith("data:")) {
|
|
18
|
+
const a = n.replace(/^data:.*?base64,/, "");
|
|
19
|
+
let r;
|
|
20
|
+
if (typeof Buffer == "function" && typeof Buffer.from == "function")
|
|
21
|
+
r = Buffer.from(a, "base64");
|
|
22
|
+
else if (typeof atob == "function") {
|
|
23
|
+
const i = atob(a);
|
|
24
|
+
r = new Uint8Array(i.length);
|
|
25
|
+
for (let o = 0; o < i.length; o++)
|
|
26
|
+
r[o] = i.charCodeAt(o);
|
|
27
|
+
} else
|
|
28
|
+
throw new Error("Failed to decode base64-encoded data URL, Buffer and atob are not supported");
|
|
29
|
+
t = await WebAssembly.instantiate(r, e);
|
|
30
|
+
} else {
|
|
31
|
+
const a = await fetch(n), r = a.headers.get("Content-Type") || "";
|
|
32
|
+
if ("instantiateStreaming" in WebAssembly && r.startsWith("application/wasm"))
|
|
33
|
+
t = await WebAssembly.instantiateStreaming(a, e);
|
|
34
|
+
else {
|
|
35
|
+
const i = await a.arrayBuffer();
|
|
36
|
+
t = await WebAssembly.instantiate(i, e);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return t.instance;
|
|
40
|
+
};
|
|
41
|
+
export {
|
|
42
|
+
f as U,
|
|
43
|
+
s as c,
|
|
44
|
+
c as i
|
|
45
|
+
};
|
package/dist/worker.d.ts
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "smol-string",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Compression for browser localStorage",
|
|
5
|
+
"author": "Senryoku <maretverdant@gmail.com>",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/Senryoku/smol-string.git"
|
|
9
|
+
},
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"compression",
|
|
13
|
+
"browser",
|
|
14
|
+
"localStorage",
|
|
15
|
+
"zig",
|
|
16
|
+
"typescript"
|
|
17
|
+
],
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/Senryoku/smol-string/issues"
|
|
20
|
+
},
|
|
21
|
+
"homepage": "https://github.com/Senryoku/smol-string",
|
|
22
|
+
"type": "module",
|
|
23
|
+
"scripts": {
|
|
24
|
+
"dev": "vite",
|
|
25
|
+
"build": "tsc && vite build",
|
|
26
|
+
"preview": "vite preview",
|
|
27
|
+
"test": "vitest",
|
|
28
|
+
"test:chrome": "vitest --browser.name=chrome --browser.headless --config browser.vitest.config.ts",
|
|
29
|
+
"test:firefox": "vitest --browser.name=firefox --browser.headless --config browser.vitest.config.ts",
|
|
30
|
+
"test:edge": "vitest --browser.name=edge --browser.headless --config browser.vitest.config.ts",
|
|
31
|
+
"test:safari": "vitest --browser.name=safari --browser.headless --config browser.vitest.config.ts",
|
|
32
|
+
"bench": "vitest bench"
|
|
33
|
+
},
|
|
34
|
+
"main": "./dist/smol-string.js",
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./dist/smol-string.d.ts",
|
|
38
|
+
"import": "./dist/smol-string.js"
|
|
39
|
+
},
|
|
40
|
+
"./packed": {
|
|
41
|
+
"types": "./dist/smol-string-packed.d.ts",
|
|
42
|
+
"import": "./dist/smol-string-packed.js"
|
|
43
|
+
},
|
|
44
|
+
"./worker": {
|
|
45
|
+
"types": "./dist/smol-string-worker.d.ts",
|
|
46
|
+
"import": "./dist/smol-string-worker.js"
|
|
47
|
+
},
|
|
48
|
+
"./worker/packed": {
|
|
49
|
+
"types": "./dist/smol-string-worker-packed.d.ts",
|
|
50
|
+
"import": "./dist/smol-string-worker-packed.js"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@vitest/browser": "^0.34.6",
|
|
55
|
+
"typescript": "^5.2.2",
|
|
56
|
+
"vite": "^4.4.5",
|
|
57
|
+
"vitest": "^0.34.6",
|
|
58
|
+
"webdriverio": "^8.20.4",
|
|
59
|
+
"vite-plugin-dts": "^3.6.2"
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {}
|
|
62
|
+
}
|
package/src/common.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function copyToWasmBuffer(
|
|
2
|
+
str: string,
|
|
3
|
+
exports: { allocUint8: (size: number) => number; memory: any }
|
|
4
|
+
) {
|
|
5
|
+
// There's also an 'encodeInto' method to avoid a copy, but by encoding first, we con allocate only exactly what we need.
|
|
6
|
+
const utf8Str = new TextEncoder().encode(str);
|
|
7
|
+
const ptrToStr = exports.allocUint8(utf8Str.length + 1);
|
|
8
|
+
const inBuffer = new Uint8Array(
|
|
9
|
+
exports.memory.buffer,
|
|
10
|
+
ptrToStr,
|
|
11
|
+
utf8Str.length + 1
|
|
12
|
+
);
|
|
13
|
+
inBuffer.set(utf8Str); // Copy to WASM buffer.
|
|
14
|
+
inBuffer[utf8Str.length] = 0; // null terminate it.
|
|
15
|
+
|
|
16
|
+
return { ptr: ptrToStr, length: utf8Str.length + 1 };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Horrible. Surely we can do better...
|
|
20
|
+
export function Uint16ArraytoString(buf: Uint16Array) {
|
|
21
|
+
const strBuilder = new Array(buf.length);
|
|
22
|
+
for (let i = 0; i < buf.length; i++)
|
|
23
|
+
strBuilder[i] = String.fromCharCode(buf[i]);
|
|
24
|
+
return strBuilder.join("");
|
|
25
|
+
}
|
|
Binary file
|
package/src/module.wasm
ADDED
|
Binary file
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Uint16ArraytoString, copyToWasmBuffer } from "./common.js";
|
|
2
|
+
import init from "./module-packed.wasm?init";
|
|
3
|
+
|
|
4
|
+
type exportsType = {
|
|
5
|
+
allocUint8: (size: number) => number;
|
|
6
|
+
allocUint16: (size: number) => number;
|
|
7
|
+
compressPacked: (ptr: number, length: number) => number;
|
|
8
|
+
decompressPacked: (
|
|
9
|
+
ptr: number,
|
|
10
|
+
length: number,
|
|
11
|
+
tokenCount: number
|
|
12
|
+
) => number;
|
|
13
|
+
free: (ptr: number, length: number) => void;
|
|
14
|
+
memory: any;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const instance = await init();
|
|
18
|
+
const exports = instance.exports as exportsType;
|
|
19
|
+
|
|
20
|
+
export function compressPacked(str: string) {
|
|
21
|
+
const { ptr, length } = copyToWasmBuffer(str, exports);
|
|
22
|
+
|
|
23
|
+
const ptrToCompressed = exports.compressPacked(ptr, length);
|
|
24
|
+
|
|
25
|
+
exports.free(ptr, length);
|
|
26
|
+
|
|
27
|
+
const buffer = new Uint16Array(
|
|
28
|
+
exports.memory.buffer.slice(
|
|
29
|
+
ptrToCompressed,
|
|
30
|
+
ptrToCompressed +
|
|
31
|
+
(exports.memory.buffer.byteLength - ptrToCompressed)
|
|
32
|
+
)
|
|
33
|
+
);
|
|
34
|
+
const streamLength = (buffer.at(0)! << 16) + buffer.at(1)!;
|
|
35
|
+
// Includes the tokenCount at the start of the stream (2 * u16).
|
|
36
|
+
const compressedBuffer = buffer.slice(2, streamLength);
|
|
37
|
+
|
|
38
|
+
const compressed = Uint16ArraytoString(compressedBuffer);
|
|
39
|
+
|
|
40
|
+
exports.free(ptrToCompressed, streamLength);
|
|
41
|
+
|
|
42
|
+
return compressed;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function decompressPacked(compressedStr: string) {
|
|
46
|
+
const tokenCount =
|
|
47
|
+
(compressedStr.charCodeAt(0)! << 16) + compressedStr.charCodeAt(1);
|
|
48
|
+
|
|
49
|
+
let ptrToCompressed = exports.allocUint16(compressedStr.length - 2);
|
|
50
|
+
let compressed_buffer = new Uint16Array(
|
|
51
|
+
exports.memory.buffer,
|
|
52
|
+
ptrToCompressed,
|
|
53
|
+
compressedStr.length - 2
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
for (let i = 2; i < compressedStr.length; i++)
|
|
57
|
+
compressed_buffer[i - 2] = compressedStr.charCodeAt(i);
|
|
58
|
+
|
|
59
|
+
const ptrToDecompressedNullTerminated = exports.decompressPacked(
|
|
60
|
+
ptrToCompressed,
|
|
61
|
+
compressedStr.length,
|
|
62
|
+
tokenCount
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
exports.free(ptrToCompressed, compressedStr.length);
|
|
66
|
+
|
|
67
|
+
const decompressed_buffer = new Uint8Array(
|
|
68
|
+
exports.memory.buffer.slice(
|
|
69
|
+
ptrToDecompressedNullTerminated,
|
|
70
|
+
ptrToDecompressedNullTerminated +
|
|
71
|
+
(exports.memory.buffer.byteLength -
|
|
72
|
+
ptrToDecompressedNullTerminated)
|
|
73
|
+
)
|
|
74
|
+
);
|
|
75
|
+
const decompressed_end = decompressed_buffer.indexOf(0);
|
|
76
|
+
const r = new TextDecoder().decode(
|
|
77
|
+
decompressed_buffer.slice(0, decompressed_end)
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
exports.free(ptrToDecompressedNullTerminated, decompressed_end + 1);
|
|
81
|
+
|
|
82
|
+
return r;
|
|
83
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// @ts-expect-error
|
|
2
|
+
import Worker from "./worker-packed.js?worker&inline";
|
|
3
|
+
|
|
4
|
+
const worker = new Worker();
|
|
5
|
+
|
|
6
|
+
let nextID = 0;
|
|
7
|
+
const resolver: Record<number, (str: string) => void> = {};
|
|
8
|
+
|
|
9
|
+
worker.onmessage = function (e: { data: { id: number; data: string } }) {
|
|
10
|
+
console.log("onmessage", e);
|
|
11
|
+
const id = e.data.id;
|
|
12
|
+
resolver[id](e.data.data);
|
|
13
|
+
delete resolver[id];
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export async function compress(data: string) {
|
|
17
|
+
const id = nextID++;
|
|
18
|
+
console.log("compress", id);
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
resolver[id] = resolve;
|
|
21
|
+
worker.postMessage({ command: "compress", id, data });
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export async function decompress(data: string) {
|
|
26
|
+
const id = nextID++;
|
|
27
|
+
console.log("decompress", id);
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
resolver[id] = resolve;
|
|
30
|
+
worker.postMessage({ command: "decompress", id, data });
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// @ts-expect-error
|
|
2
|
+
import Worker from "./worker.js?worker&inline";
|
|
3
|
+
|
|
4
|
+
const worker = new Worker();
|
|
5
|
+
|
|
6
|
+
let nextID = 0;
|
|
7
|
+
const resolver: Record<number, (str: string) => void> = {};
|
|
8
|
+
|
|
9
|
+
worker.onmessage = function (e: { data: { id: number; data: string } }) {
|
|
10
|
+
console.log("onmessage", e);
|
|
11
|
+
const id = e.data.id;
|
|
12
|
+
resolver[id](e.data.data);
|
|
13
|
+
delete resolver[id];
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export async function compress(data: string) {
|
|
17
|
+
const id = nextID++;
|
|
18
|
+
console.log("compress", id);
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
resolver[id] = resolve;
|
|
21
|
+
worker.postMessage({ command: "compress", id, data });
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export async function decompress(data: string) {
|
|
26
|
+
const id = nextID++;
|
|
27
|
+
console.log("decompress", id);
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
resolver[id] = resolve;
|
|
30
|
+
worker.postMessage({ command: "decompress", id, data });
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Uint16ArraytoString, copyToWasmBuffer } from "./common.js";
|
|
2
|
+
import init from "./module.wasm?init";
|
|
3
|
+
|
|
4
|
+
type exportsType = {
|
|
5
|
+
allocUint8: (size: number) => number;
|
|
6
|
+
allocUint16: (size: number) => number;
|
|
7
|
+
compress: (ptr: number) => number;
|
|
8
|
+
decompress: (ptr: number) => number;
|
|
9
|
+
free: (ptr: number, length: number) => void;
|
|
10
|
+
memory: any;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const instance = await init();
|
|
14
|
+
const exports = instance.exports as exportsType;
|
|
15
|
+
|
|
16
|
+
export function compress(str: string) {
|
|
17
|
+
const { ptr, length } = copyToWasmBuffer(str, exports);
|
|
18
|
+
|
|
19
|
+
const ptrToCompressed = exports.compress(ptr);
|
|
20
|
+
|
|
21
|
+
exports.free(ptr, length);
|
|
22
|
+
|
|
23
|
+
const buffer = new Uint16Array(
|
|
24
|
+
exports.memory.buffer.slice(
|
|
25
|
+
ptrToCompressed,
|
|
26
|
+
ptrToCompressed +
|
|
27
|
+
(exports.memory.buffer.byteLength - ptrToCompressed)
|
|
28
|
+
)
|
|
29
|
+
);
|
|
30
|
+
const end = buffer.indexOf(0);
|
|
31
|
+
const compressed = buffer.slice(0, end);
|
|
32
|
+
|
|
33
|
+
const r = Uint16ArraytoString(compressed);
|
|
34
|
+
|
|
35
|
+
exports.free(ptrToCompressed, end + 1);
|
|
36
|
+
|
|
37
|
+
return r;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function decompress(compressedStr: string) {
|
|
41
|
+
const ptrToCompressedNullTerminated = exports.allocUint16(
|
|
42
|
+
compressedStr.length + 1
|
|
43
|
+
);
|
|
44
|
+
const compressed_buffer = new Uint16Array(
|
|
45
|
+
exports.memory.buffer,
|
|
46
|
+
ptrToCompressedNullTerminated,
|
|
47
|
+
compressedStr.length + 1
|
|
48
|
+
);
|
|
49
|
+
for (let i = 0; i < compressedStr.length; i++)
|
|
50
|
+
compressed_buffer[i] = compressedStr.charCodeAt(i);
|
|
51
|
+
compressed_buffer[compressedStr.length] = 0;
|
|
52
|
+
|
|
53
|
+
const ptrToDecompressedNullTerminated = exports.decompress(
|
|
54
|
+
ptrToCompressedNullTerminated
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
exports.free(ptrToCompressedNullTerminated, compressedStr.length + 1);
|
|
58
|
+
|
|
59
|
+
const decompressed_buffer = new Uint8Array(
|
|
60
|
+
exports.memory.buffer.slice(
|
|
61
|
+
ptrToDecompressedNullTerminated,
|
|
62
|
+
ptrToDecompressedNullTerminated +
|
|
63
|
+
(exports.memory.buffer.byteLength -
|
|
64
|
+
ptrToDecompressedNullTerminated)
|
|
65
|
+
)
|
|
66
|
+
);
|
|
67
|
+
const decompressed_end = decompressed_buffer.indexOf(0);
|
|
68
|
+
|
|
69
|
+
exports.free(ptrToDecompressedNullTerminated, decompressed_end + 1);
|
|
70
|
+
|
|
71
|
+
const r = new TextDecoder().decode(
|
|
72
|
+
decompressed_buffer.slice(0, decompressed_end)
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
return r;
|
|
76
|
+
}
|
package/src/wasm.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { compressPacked, decompressPacked } from "./smol-string-packed.js";
|
|
2
|
+
|
|
3
|
+
export type Message = {
|
|
4
|
+
command: string;
|
|
5
|
+
id: number;
|
|
6
|
+
data: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
onmessage = async function (e: { data: Message }) {
|
|
10
|
+
const { command, id, data } = e.data;
|
|
11
|
+
switch (command) {
|
|
12
|
+
case "decompress": {
|
|
13
|
+
postMessage({ id, data: decompressPacked(data) });
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
case "compress": {
|
|
17
|
+
postMessage({ id, data: compressPacked(data) });
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
package/src/worker.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { compress, decompress } from "./smol-string.js";
|
|
2
|
+
|
|
3
|
+
export type Message = {
|
|
4
|
+
command: string;
|
|
5
|
+
id: number;
|
|
6
|
+
data: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
onmessage = async function (e: { data: Message }) {
|
|
10
|
+
const { command, id, data } = e.data;
|
|
11
|
+
switch (command) {
|
|
12
|
+
case "decompress": {
|
|
13
|
+
postMessage({ id, data: decompress(data) });
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
case "compress": {
|
|
17
|
+
postMessage({ id, data: compress(data) });
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { TestData } from "./common.js";
|
|
4
|
+
|
|
5
|
+
import { compress, decompress } from "../dist/smol-string.js";
|
|
6
|
+
import {
|
|
7
|
+
compressPacked,
|
|
8
|
+
decompressPacked,
|
|
9
|
+
} from "../dist/smol-string-packed.js";
|
|
10
|
+
|
|
11
|
+
describe("compress and decompress", () => {
|
|
12
|
+
for (const { name, input } of TestData) {
|
|
13
|
+
test(name, async () => {
|
|
14
|
+
const compressed = compress(input);
|
|
15
|
+
const decompressed = decompress(compressed);
|
|
16
|
+
expect(decompressed).toBe(input);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
describe("compressPacked and decompressPacked", () => {
|
|
22
|
+
for (const { name, input } of TestData) {
|
|
23
|
+
test(name, async () => {
|
|
24
|
+
const compressed = compressPacked(input);
|
|
25
|
+
const decompressed = decompressPacked(compressed);
|
|
26
|
+
expect(decompressed).toBe(input);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
});
|
package/test/common.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const json_512kb = import("../../test/data/512KB.json");
|
|
2
|
+
export const json_1mb = import("../../test/data/1MB.json");
|
|
3
|
+
export const rw_medium = import("../../test/data/rw_medium.json");
|
|
4
|
+
export const rw_large = import("../../test/data/rw_large.json");
|
|
5
|
+
|
|
6
|
+
export const TestData = [
|
|
7
|
+
{
|
|
8
|
+
name: "Simple String",
|
|
9
|
+
input: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum",
|
|
10
|
+
},
|
|
11
|
+
{ name: "json_512kb", input: JSON.stringify(await json_512kb) },
|
|
12
|
+
{ name: "json_1mb", input: JSON.stringify(await json_1mb) },
|
|
13
|
+
{ name: "rw_medium", input: JSON.stringify(await rw_medium) },
|
|
14
|
+
{ name: "rw_large", input: JSON.stringify(await rw_large) },
|
|
15
|
+
];
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { describe, bench, expect, test, beforeAll } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { TestData } from "./common.js";
|
|
4
|
+
|
|
5
|
+
import { compress, decompress } from "../dist/smol-string.js";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
compressPacked,
|
|
9
|
+
decompressPacked,
|
|
10
|
+
} from "../dist/smol-string-packed.js";
|
|
11
|
+
|
|
12
|
+
const options = { iterations: 5 };
|
|
13
|
+
|
|
14
|
+
describe.each(TestData)("Compression: $name", ({ name, input }) => {
|
|
15
|
+
bench(
|
|
16
|
+
"compress",
|
|
17
|
+
async () => {
|
|
18
|
+
compress(input);
|
|
19
|
+
},
|
|
20
|
+
options
|
|
21
|
+
);
|
|
22
|
+
bench(
|
|
23
|
+
"compressPacked",
|
|
24
|
+
async () => {
|
|
25
|
+
compressPacked(input);
|
|
26
|
+
},
|
|
27
|
+
options
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe.each(TestData)("Decompression: $name", ({ name, input }) => {
|
|
32
|
+
let compressed = compress(input);
|
|
33
|
+
let compressedPacked = compressPacked(input);
|
|
34
|
+
|
|
35
|
+
bench(
|
|
36
|
+
"decompress",
|
|
37
|
+
async () => {
|
|
38
|
+
const decompressed = decompress(compressed);
|
|
39
|
+
expect(decompressed).toBe(input);
|
|
40
|
+
},
|
|
41
|
+
options
|
|
42
|
+
);
|
|
43
|
+
bench(
|
|
44
|
+
"decompressPacked",
|
|
45
|
+
async () => {
|
|
46
|
+
const decompressed = decompressPacked(compressedPacked);
|
|
47
|
+
expect(decompressed).toBe(input);
|
|
48
|
+
},
|
|
49
|
+
options
|
|
50
|
+
);
|
|
51
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { TestData } from "./common.js";
|
|
4
|
+
|
|
5
|
+
import { compress, decompress } from "../dist/smol-string.js";
|
|
6
|
+
import {
|
|
7
|
+
compressPacked,
|
|
8
|
+
decompressPacked,
|
|
9
|
+
} from "../dist/smol-string-packed.js";
|
|
10
|
+
|
|
11
|
+
describe("compress and decompress via localStorage", async () => {
|
|
12
|
+
for (const { name, input } of TestData) {
|
|
13
|
+
test(name, async () => {
|
|
14
|
+
const compressed = await compress(input);
|
|
15
|
+
|
|
16
|
+
localStorage.setItem("compressed", compressed);
|
|
17
|
+
const restored = localStorage.getItem("compressed")!;
|
|
18
|
+
|
|
19
|
+
const decompressed = await decompress(restored);
|
|
20
|
+
|
|
21
|
+
expect(decompressed).toBe(input);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe("compressPacked and decompressPacked via localStorage", async () => {
|
|
27
|
+
for (const { name, input } of TestData) {
|
|
28
|
+
test(name, async () => {
|
|
29
|
+
const compressed = await compressPacked(input);
|
|
30
|
+
|
|
31
|
+
localStorage.setItem("compressed", compressed);
|
|
32
|
+
const restored = localStorage.getItem("compressed")!;
|
|
33
|
+
|
|
34
|
+
const decompressed = await decompressPacked(restored);
|
|
35
|
+
|
|
36
|
+
expect(decompressed).toBe(input);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { TestData } from "./common.js";
|
|
4
|
+
|
|
5
|
+
import { compress, decompress } from "../dist/smol-string.js";
|
|
6
|
+
import {
|
|
7
|
+
compressPacked,
|
|
8
|
+
decompressPacked,
|
|
9
|
+
} from "../dist/smol-string-packed.js";
|
|
10
|
+
|
|
11
|
+
describe("compress and decompress via sessionStorage", () => {
|
|
12
|
+
for (const { name, input } of TestData) {
|
|
13
|
+
test(name, async () => {
|
|
14
|
+
const compressed = compress(input);
|
|
15
|
+
|
|
16
|
+
sessionStorage.setItem("compressed", compressed);
|
|
17
|
+
const restored = sessionStorage.getItem("compressed")!;
|
|
18
|
+
|
|
19
|
+
const decompressed = decompress(restored);
|
|
20
|
+
|
|
21
|
+
expect(decompressed).toBe(input);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe("compressPacked and decompressPacked via sessionStorage", () => {
|
|
27
|
+
for (const { name, input } of TestData) {
|
|
28
|
+
test(name, async () => {
|
|
29
|
+
const compressed = compressPacked(input);
|
|
30
|
+
|
|
31
|
+
sessionStorage.setItem("compressed", compressed);
|
|
32
|
+
const restored = sessionStorage.getItem("compressed")!;
|
|
33
|
+
|
|
34
|
+
const decompressed = decompressPacked(restored);
|
|
35
|
+
|
|
36
|
+
expect(decompressed).toBe(input);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"lib": ["ESNext", "DOM", "DOM.Iterable"],
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
|
|
9
|
+
/* Bundler mode */
|
|
10
|
+
"moduleResolution": "bundler",
|
|
11
|
+
"allowImportingTsExtensions": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"noEmit": true,
|
|
15
|
+
|
|
16
|
+
/* Linting */
|
|
17
|
+
"strict": true,
|
|
18
|
+
"noUnusedLocals": true,
|
|
19
|
+
"noUnusedParameters": true,
|
|
20
|
+
"noFallthroughCasesInSwitch": true
|
|
21
|
+
},
|
|
22
|
+
"include": ["src"]
|
|
23
|
+
}
|
package/vite.config.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/// <reference types="vitest" />
|
|
2
|
+
import { defineConfig } from "vite";
|
|
3
|
+
import dts from "vite-plugin-dts";
|
|
4
|
+
import pkg from "./package.json" assert { type: "json" };
|
|
5
|
+
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
build: {
|
|
8
|
+
lib: {
|
|
9
|
+
entry: {
|
|
10
|
+
"smol-string": "./src/smol-string.ts",
|
|
11
|
+
"smol-string-packed": "./src/smol-string-packed.ts",
|
|
12
|
+
"smol-string-worker": "./src/smol-string-worker.ts",
|
|
13
|
+
"smol-string-worker-packed":
|
|
14
|
+
"./src/smol-string-worker-packed.ts",
|
|
15
|
+
},
|
|
16
|
+
formats: ["es"],
|
|
17
|
+
},
|
|
18
|
+
rollupOptions: {
|
|
19
|
+
external: [
|
|
20
|
+
...Object.keys(pkg.dependencies), // don't bundle dependencies
|
|
21
|
+
/^node:.*/, // don't bundle built-in Node.js modules (use protocol imports!)
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
target: "esnext",
|
|
25
|
+
},
|
|
26
|
+
worker: {
|
|
27
|
+
format: "es",
|
|
28
|
+
},
|
|
29
|
+
plugins: [
|
|
30
|
+
dts(), // emit TS declaration files
|
|
31
|
+
],
|
|
32
|
+
test: {},
|
|
33
|
+
});
|