@reclaimprotocol/attestor-core 4.0.3 → 5.0.1-beta.2
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/LICENSE +660 -660
- package/README.md +1 -2
- package/lib/avs/abis/avsDirectoryABI.js +341 -342
- package/lib/avs/abis/delegationABI.js +4 -5
- package/lib/avs/abis/registryABI.js +722 -723
- package/lib/avs/client/create-claim-on-avs.d.ts +5 -5
- package/lib/avs/client/create-claim-on-avs.js +160 -139
- package/lib/avs/config.d.ts +1 -1
- package/lib/avs/config.js +25 -23
- package/lib/avs/contracts/ReclaimServiceManager.d.ts +436 -532
- package/lib/avs/contracts/ReclaimServiceManager.js +0 -3
- package/lib/avs/contracts/common.d.ts +40 -11
- package/lib/avs/contracts/common.js +0 -3
- package/lib/avs/contracts/factories/ReclaimServiceManager__factory.d.ts +13 -11
- package/lib/avs/contracts/factories/ReclaimServiceManager__factory.js +1157 -1148
- package/lib/avs/contracts/factories/index.d.ts +1 -1
- package/lib/avs/contracts/factories/index.js +4 -9
- package/lib/avs/contracts/index.d.ts +3 -3
- package/lib/avs/contracts/index.js +6 -40
- package/lib/avs/types/index.d.ts +6 -6
- package/lib/avs/types/index.js +0 -3
- package/lib/avs/utils/contracts.d.ts +14 -14
- package/lib/avs/utils/contracts.js +50 -35
- package/lib/avs/utils/register.d.ts +3 -3
- package/lib/avs/utils/register.js +71 -79
- package/lib/avs/utils/tasks.d.ts +4 -4
- package/lib/avs/utils/tasks.js +44 -41
- package/lib/client/create-claim.d.ts +2 -2
- package/lib/client/create-claim.js +437 -400
- package/lib/client/index.d.ts +3 -3
- package/lib/client/index.js +3 -20
- package/lib/client/tunnels/make-rpc-tcp-tunnel.d.ts +2 -2
- package/lib/client/tunnels/make-rpc-tcp-tunnel.js +49 -56
- package/lib/client/tunnels/make-rpc-tls-tunnel.d.ts +4 -3
- package/lib/client/tunnels/make-rpc-tls-tunnel.js +123 -131
- package/lib/client/utils/attestor-pool.d.ts +3 -1
- package/lib/client/utils/attestor-pool.js +21 -25
- package/lib/client/utils/client-socket.d.ts +4 -4
- package/lib/client/utils/client-socket.js +114 -94
- package/lib/client/utils/message-handler.d.ts +2 -2
- package/lib/client/utils/message-handler.js +89 -86
- package/lib/config/index.d.ts +6 -3
- package/lib/config/index.js +60 -37
- package/lib/external-rpc/benchmark.d.ts +1 -0
- package/lib/external-rpc/benchmark.js +82 -0
- package/lib/external-rpc/event-bus.d.ts +7 -0
- package/lib/external-rpc/event-bus.js +17 -0
- package/lib/external-rpc/global.d.js +0 -0
- package/lib/external-rpc/handle-incoming-msg.d.ts +2 -0
- package/lib/external-rpc/handle-incoming-msg.js +241 -0
- package/lib/external-rpc/index.d.ts +3 -0
- package/lib/external-rpc/index.js +3 -0
- package/lib/external-rpc/jsc-polyfills/1.d.ts +14 -0
- package/lib/external-rpc/jsc-polyfills/1.js +80 -0
- package/lib/external-rpc/jsc-polyfills/2.js +15 -0
- package/lib/external-rpc/jsc-polyfills/event.d.ts +10 -0
- package/lib/external-rpc/jsc-polyfills/event.js +19 -0
- package/lib/external-rpc/jsc-polyfills/index.d.ts +2 -0
- package/lib/external-rpc/jsc-polyfills/index.js +2 -0
- package/lib/external-rpc/jsc-polyfills/ws.d.ts +21 -0
- package/lib/external-rpc/jsc-polyfills/ws.js +83 -0
- package/lib/external-rpc/setup-browser.d.ts +6 -0
- package/lib/external-rpc/setup-browser.js +33 -0
- package/lib/external-rpc/setup-jsc.d.ts +24 -0
- package/lib/external-rpc/setup-jsc.js +22 -0
- package/lib/{window-rpc → external-rpc}/types.d.ts +56 -35
- package/lib/external-rpc/types.js +0 -0
- package/lib/external-rpc/utils.d.ts +20 -0
- package/lib/external-rpc/utils.js +100 -0
- package/lib/external-rpc/zk.d.ts +14 -0
- package/lib/external-rpc/zk.js +58 -0
- package/lib/index.d.ts +8 -9
- package/lib/index.js +12 -49
- package/lib/mechain/abis/governanceABI.js +460 -461
- package/lib/mechain/abis/taskABI.js +505 -506
- package/lib/mechain/client/create-claim-on-mechain.d.ts +3 -3
- package/lib/mechain/client/create-claim-on-mechain.js +31 -30
- package/lib/mechain/client/index.d.ts +1 -1
- package/lib/mechain/client/index.js +1 -18
- package/lib/mechain/constants/index.js +8 -7
- package/lib/mechain/index.d.ts +2 -2
- package/lib/mechain/index.js +2 -19
- package/lib/mechain/types/index.d.ts +2 -2
- package/lib/mechain/types/index.js +0 -3
- package/lib/proto/api.d.ts +182 -39
- package/lib/proto/api.js +4105 -3555
- package/lib/proto/tee-bundle.d.ts +156 -0
- package/lib/proto/tee-bundle.js +1296 -0
- package/lib/providers/http/index.d.ts +16 -1
- package/lib/providers/http/index.js +603 -576
- package/lib/providers/http/patch-parse5-tree.d.ts +6 -0
- package/lib/providers/http/patch-parse5-tree.js +34 -0
- package/lib/providers/http/utils.d.ts +7 -4
- package/lib/providers/http/utils.js +240 -317
- package/lib/providers/index.d.ts +1 -1
- package/lib/providers/index.js +5 -9
- package/lib/scripts/check-avs-registration.d.ts +1 -1
- package/lib/scripts/check-avs-registration.js +24 -25
- package/lib/scripts/fallbacks/crypto.d.ts +1 -0
- package/lib/scripts/fallbacks/crypto.js +4 -0
- package/lib/scripts/fallbacks/empty.d.ts +3 -0
- package/lib/scripts/fallbacks/empty.js +4 -0
- package/lib/scripts/fallbacks/re2.d.ts +1 -0
- package/lib/scripts/fallbacks/re2.js +7 -0
- package/lib/scripts/fallbacks/snarkjs.d.ts +1 -0
- package/lib/scripts/fallbacks/snarkjs.js +10 -0
- package/lib/scripts/fallbacks/stwo.d.ts +6 -0
- package/lib/scripts/fallbacks/stwo.js +159 -0
- package/lib/scripts/generate-provider-types.js +92 -73
- package/lib/scripts/generate-receipt.d.ts +2 -2
- package/lib/scripts/generate-receipt.js +94 -83
- package/lib/scripts/generate-toprf-keys.js +17 -16
- package/lib/scripts/jsc-cli-rpc.d.ts +1 -0
- package/lib/scripts/jsc-cli-rpc.js +35 -0
- package/lib/scripts/register-avs-operator.d.ts +1 -1
- package/lib/scripts/register-avs-operator.js +3 -7
- package/lib/scripts/start-server.d.ts +1 -1
- package/lib/scripts/start-server.js +9 -11
- package/lib/scripts/update-avs-metadata.d.ts +1 -1
- package/lib/scripts/update-avs-metadata.js +17 -19
- package/lib/scripts/utils.js +8 -9
- package/lib/scripts/whitelist-operator.d.ts +1 -1
- package/lib/scripts/whitelist-operator.js +13 -15
- package/lib/server/create-server.d.ts +3 -2
- package/lib/server/create-server.js +98 -85
- package/lib/server/handlers/claimTeeBundle.d.ts +6 -0
- package/lib/server/handlers/claimTeeBundle.js +232 -0
- package/lib/server/handlers/claimTunnel.d.ts +1 -1
- package/lib/server/handlers/claimTunnel.js +75 -73
- package/lib/server/handlers/completeClaimOnChain.d.ts +1 -1
- package/lib/server/handlers/completeClaimOnChain.js +27 -26
- package/lib/server/handlers/createClaimOnChain.d.ts +1 -1
- package/lib/server/handlers/createClaimOnChain.js +30 -29
- package/lib/server/handlers/createTaskOnMechain.d.ts +1 -1
- package/lib/server/handlers/createTaskOnMechain.js +54 -49
- package/lib/server/handlers/createTunnel.d.ts +1 -1
- package/lib/server/handlers/createTunnel.js +91 -94
- package/lib/server/handlers/disconnectTunnel.d.ts +1 -1
- package/lib/server/handlers/disconnectTunnel.js +6 -8
- package/lib/server/handlers/fetchCertificateBytes.d.ts +2 -0
- package/lib/server/handlers/fetchCertificateBytes.js +57 -0
- package/lib/server/handlers/index.d.ts +1 -1
- package/lib/server/handlers/index.js +24 -21
- package/lib/server/handlers/init.d.ts +1 -1
- package/lib/server/handlers/init.js +31 -34
- package/lib/server/handlers/toprf.d.ts +1 -1
- package/lib/server/handlers/toprf.js +17 -19
- package/lib/server/index.d.ts +4 -4
- package/lib/server/index.js +4 -21
- package/lib/server/socket.d.ts +7 -7
- package/lib/server/socket.js +104 -106
- package/lib/server/tunnels/make-tcp-tunnel.d.ts +5 -3
- package/lib/server/tunnels/make-tcp-tunnel.js +189 -162
- package/lib/server/utils/apm.d.ts +1 -1
- package/lib/server/utils/apm.js +26 -40
- package/lib/server/utils/assert-valid-claim-request.d.ts +6 -5
- package/lib/server/utils/assert-valid-claim-request.js +339 -185
- package/lib/server/utils/config-env.js +4 -7
- package/lib/server/utils/dns.js +18 -16
- package/lib/server/utils/gcp-attestation.d.ts +17 -0
- package/lib/server/utils/gcp-attestation.js +237 -0
- package/lib/server/utils/generics.d.ts +3 -3
- package/lib/server/utils/generics.js +37 -51
- package/lib/server/utils/iso.js +255 -256
- package/lib/server/utils/keep-alive.d.ts +2 -2
- package/lib/server/utils/keep-alive.js +36 -40
- package/lib/server/utils/nitro-attestation.d.ts +33 -0
- package/lib/server/utils/nitro-attestation.js +249 -0
- package/lib/server/utils/oprf-raw.d.ts +21 -0
- package/lib/server/utils/oprf-raw.js +61 -0
- package/lib/server/utils/process-handshake.d.ts +3 -3
- package/lib/server/utils/process-handshake.js +217 -175
- package/lib/server/utils/proxy-session.d.ts +1 -0
- package/lib/server/utils/proxy-session.js +6 -0
- package/lib/server/utils/tee-oprf-mpc-verification.d.ts +16 -0
- package/lib/server/utils/tee-oprf-mpc-verification.js +86 -0
- package/lib/server/utils/tee-oprf-verification.d.ts +24 -0
- package/lib/server/utils/tee-oprf-verification.js +151 -0
- package/lib/server/utils/tee-transcript-reconstruction.d.ts +24 -0
- package/lib/server/utils/tee-transcript-reconstruction.js +140 -0
- package/lib/server/utils/tee-verification.d.ts +28 -0
- package/lib/server/utils/tee-verification.js +358 -0
- package/lib/{utils → server/utils}/validation.d.ts +1 -1
- package/lib/server/utils/validation.js +45 -0
- package/lib/types/bgp.js +0 -3
- package/lib/types/claims.d.ts +7 -10
- package/lib/types/claims.js +0 -3
- package/lib/types/client.d.ts +5 -5
- package/lib/types/client.js +0 -3
- package/lib/types/general.d.ts +29 -4
- package/lib/types/general.js +0 -3
- package/lib/types/handlers.d.ts +3 -3
- package/lib/types/handlers.js +0 -3
- package/lib/types/index.d.ts +10 -10
- package/lib/types/index.js +10 -27
- package/lib/types/providers.d.ts +15 -4
- package/lib/types/providers.gen.d.ts +15 -1
- package/lib/types/providers.gen.js +15 -13
- package/lib/types/providers.js +0 -3
- package/lib/types/rpc.d.ts +2 -2
- package/lib/types/rpc.js +0 -3
- package/lib/types/signatures.js +0 -3
- package/lib/types/tunnel.d.ts +2 -2
- package/lib/types/tunnel.js +0 -3
- package/lib/types/zk.d.ts +17 -2
- package/lib/types/zk.js +0 -3
- package/lib/utils/auth.d.ts +2 -1
- package/lib/utils/auth.js +66 -59
- package/lib/utils/b64-json.js +13 -19
- package/lib/utils/bgp-listener.d.ts +1 -1
- package/lib/utils/bgp-listener.js +111 -114
- package/lib/utils/claims.d.ts +3 -3
- package/lib/utils/claims.js +78 -101
- package/lib/utils/env.js +15 -16
- package/lib/utils/error.d.ts +6 -7
- package/lib/utils/error.js +50 -39
- package/lib/utils/generics.d.ts +15 -13
- package/lib/utils/generics.js +217 -297
- package/lib/utils/http-parser.d.ts +1 -1
- package/lib/utils/http-parser.js +186 -237
- package/lib/utils/index.d.ts +13 -12
- package/lib/utils/index.js +13 -29
- package/lib/utils/logger.d.ts +1 -1
- package/lib/utils/logger.js +69 -87
- package/lib/utils/prepare-packets.d.ts +3 -3
- package/lib/utils/prepare-packets.js +66 -58
- package/lib/utils/redactions.d.ts +20 -1
- package/lib/utils/redactions.js +116 -129
- package/lib/utils/retries.d.ts +1 -1
- package/lib/utils/retries.js +24 -26
- package/lib/utils/signatures/eth.d.ts +1 -1
- package/lib/utils/signatures/eth.js +28 -30
- package/lib/utils/signatures/index.d.ts +3 -3
- package/lib/utils/signatures/index.js +11 -10
- package/lib/utils/socket-base.d.ts +6 -5
- package/lib/utils/socket-base.js +89 -88
- package/lib/utils/tls.d.ts +1 -1
- package/lib/utils/tls.js +54 -28
- package/lib/utils/ws.d.ts +1 -6
- package/lib/utils/ws.js +17 -33
- package/lib/utils/zk.d.ts +28 -12
- package/lib/utils/zk.js +587 -406
- package/package.json +72 -60
- package/lib/avs/tests/test.operator.d.ts +0 -11
- package/lib/avs/tests/test.operator.js +0 -313
- package/lib/avs/tests/utils.d.ts +0 -2
- package/lib/avs/tests/utils.js +0 -50
- package/lib/scripts/verify-root-ca.d.ts +0 -1
- package/lib/scripts/verify-root-ca.js +0 -51
- package/lib/tests/describe-with-server.d.ts +0 -20
- package/lib/tests/describe-with-server.js +0 -64
- package/lib/tests/mock-provider-server.d.ts +0 -13
- package/lib/tests/mock-provider-server.js +0 -65
- package/lib/tests/mocks.d.ts +0 -4
- package/lib/tests/mocks.js +0 -23
- package/lib/tests/test.auth.js +0 -75
- package/lib/tests/test.bgp-listener.js +0 -169
- package/lib/tests/test.claim-creation.js +0 -280
- package/lib/tests/test.http-parser.d.ts +0 -1
- package/lib/tests/test.http-parser.js +0 -120
- package/lib/tests/test.http-provider-utils.js +0 -2416
- package/lib/tests/test.http-provider.d.ts +0 -1
- package/lib/tests/test.http-provider.js +0 -114
- package/lib/tests/test.rpc-communication.d.ts +0 -1
- package/lib/tests/test.rpc-communication.js +0 -64
- package/lib/tests/test.rpc-tunnel.d.ts +0 -1
- package/lib/tests/test.rpc-tunnel.js +0 -172
- package/lib/tests/test.signatures.d.ts +0 -1
- package/lib/tests/test.signatures.js +0 -24
- package/lib/tests/test.tcp-tunnel.d.ts +0 -1
- package/lib/tests/test.tcp-tunnel.js +0 -64
- package/lib/tests/test.zk.d.ts +0 -1
- package/lib/tests/test.zk.js +0 -337
- package/lib/tests/utils.d.ts +0 -18
- package/lib/tests/utils.js +0 -64
- package/lib/utils/atomic-operations.d.ts +0 -24
- package/lib/utils/atomic-operations.js +0 -65
- package/lib/utils/benchmark.d.ts +0 -1
- package/lib/utils/benchmark.js +0 -70
- package/lib/utils/connection-state-machine.d.ts +0 -43
- package/lib/utils/connection-state-machine.js +0 -129
- package/lib/utils/resource-monitor.d.ts +0 -61
- package/lib/utils/resource-monitor.js +0 -107
- package/lib/utils/validation.js +0 -46
- package/lib/window-rpc/index.d.ts +0 -3
- package/lib/window-rpc/index.js +0 -20
- package/lib/window-rpc/setup-window-rpc.d.ts +0 -5
- package/lib/window-rpc/setup-window-rpc.js +0 -291
- package/lib/window-rpc/types.js +0 -3
- package/lib/window-rpc/utils.d.ts +0 -14
- package/lib/window-rpc/utils.js +0 -102
- package/lib/window-rpc/window-rpc-zk.d.ts +0 -15
- package/lib/window-rpc/window-rpc-zk.js +0 -85
- /package/lib/{tests/test.auth.d.ts → external-rpc/jsc-polyfills/2.d.ts} +0 -0
- /package/lib/{tests/test.bgp-listener.d.ts → scripts/build-browser.d.ts} +0 -0
- /package/lib/{tests/test.claim-creation.d.ts → scripts/build-jsc.d.ts} +0 -0
- /package/lib/{tests/test.http-provider-utils.d.ts → scripts/build-lib.d.ts} +0 -0
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tls_1 = require("@reclaimprotocol/tls");
|
|
4
|
-
const client_1 = require("../client");
|
|
5
|
-
const providers_1 = require("../providers");
|
|
6
|
-
const server_1 = require("../server");
|
|
7
|
-
const describe_with_server_1 = require("../tests/describe-with-server");
|
|
8
|
-
const mocks_1 = require("../tests/mocks");
|
|
9
|
-
const utils_1 = require("../tests/utils");
|
|
10
|
-
const utils_2 = require("../utils");
|
|
11
|
-
const TLS_VERSIONS = [
|
|
12
|
-
'TLS1_3',
|
|
13
|
-
'TLS1_2',
|
|
14
|
-
];
|
|
15
|
-
const OPRF_CIPHER_SUITES = [
|
|
16
|
-
'TLS_CHACHA20_POLY1305_SHA256',
|
|
17
|
-
'TLS_AES_256_GCM_SHA384',
|
|
18
|
-
'TLS_AES_128_GCM_SHA256',
|
|
19
|
-
];
|
|
20
|
-
jest.setTimeout(90000);
|
|
21
|
-
jest.mock('@reclaimprotocol/tls/lib/utils/parse-certificate', () => {
|
|
22
|
-
const actual = jest.requireActual('@reclaimprotocol/tls/lib/utils/parse-certificate');
|
|
23
|
-
return {
|
|
24
|
-
__esModule: true,
|
|
25
|
-
...actual,
|
|
26
|
-
verifyCertificateChain: jest.fn().mockImplementation()
|
|
27
|
-
};
|
|
28
|
-
});
|
|
29
|
-
(0, describe_with_server_1.describeWithServer)('Claim Creation', opts => {
|
|
30
|
-
const zkEngine = 'gnark';
|
|
31
|
-
let client;
|
|
32
|
-
let claimUrl;
|
|
33
|
-
beforeEach(() => {
|
|
34
|
-
client = opts.client;
|
|
35
|
-
claimUrl = `https://localhost:${opts.mockhttpsServerPort}/me`;
|
|
36
|
-
// we need to disable certificate verification
|
|
37
|
-
// for testing purposes
|
|
38
|
-
providers_1.providers.http.additionalClientOptions = {
|
|
39
|
-
verifyServerCertificate: false
|
|
40
|
-
};
|
|
41
|
-
});
|
|
42
|
-
it.each(TLS_VERSIONS)('should successfully create a claim (%s)', async (version) => {
|
|
43
|
-
var _a, _b, _c;
|
|
44
|
-
providers_1.providers.http.additionalClientOptions = {
|
|
45
|
-
...providers_1.providers.http.additionalClientOptions,
|
|
46
|
-
supportedProtocolVersions: [version]
|
|
47
|
-
};
|
|
48
|
-
const user = 'adhiraj';
|
|
49
|
-
const result = await (0, client_1.createClaimOnAttestor)({
|
|
50
|
-
name: 'http',
|
|
51
|
-
params: {
|
|
52
|
-
url: claimUrl,
|
|
53
|
-
method: 'GET',
|
|
54
|
-
responseRedactions: [],
|
|
55
|
-
responseMatches: [
|
|
56
|
-
{
|
|
57
|
-
type: 'contains',
|
|
58
|
-
value: `${user}@mock.com`
|
|
59
|
-
}
|
|
60
|
-
]
|
|
61
|
-
},
|
|
62
|
-
secretParams: {
|
|
63
|
-
authorisationHeader: `Bearer ${user}`
|
|
64
|
-
},
|
|
65
|
-
ownerPrivateKey: opts.privateKeyHex,
|
|
66
|
-
client,
|
|
67
|
-
zkEngine,
|
|
68
|
-
});
|
|
69
|
-
expect(result.error).toBeUndefined();
|
|
70
|
-
expect((_a = result.request) === null || _a === void 0 ? void 0 : _a.transcript).toBeTruthy();
|
|
71
|
-
// decrypt the transcript and check we didn't accidentally
|
|
72
|
-
// leak our secrets in the application data
|
|
73
|
-
const transcript = result.request.transcript;
|
|
74
|
-
const applMsgs = (0, utils_2.extractApplicationDataFromTranscript)(await (0, server_1.decryptTranscript)(transcript, utils_2.logger, zkEngine, (_b = result.request) === null || _b === void 0 ? void 0 : _b.fixedServerIV, (_c = result.request) === null || _c === void 0 ? void 0 : _c.fixedClientIV));
|
|
75
|
-
const requestData = applMsgs
|
|
76
|
-
.filter(m => m.sender === 'client')
|
|
77
|
-
.map(m => (0, tls_1.uint8ArrayToStr)(m.message))
|
|
78
|
-
.join('');
|
|
79
|
-
// ensure the secret authorisation header is not leaked
|
|
80
|
-
expect(requestData).not.toContain(user);
|
|
81
|
-
await expect((0, utils_2.assertValidClaimSignatures)(result, client.metadata)).resolves.toBeUndefined();
|
|
82
|
-
expect(mocks_1.SPY_PREPARER).toHaveBeenCalledTimes(1);
|
|
83
|
-
// check all direct message reveals and
|
|
84
|
-
// ensure we've not accidentally re-used a key
|
|
85
|
-
// for multiple application data messages that
|
|
86
|
-
// were not meant to be revealed.
|
|
87
|
-
await (0, utils_1.verifyNoDirectRevealLeaks)();
|
|
88
|
-
});
|
|
89
|
-
it('should not create a claim with invalid response', async () => {
|
|
90
|
-
await expect(async () => {
|
|
91
|
-
await (0, client_1.createClaimOnAttestor)({
|
|
92
|
-
name: 'http',
|
|
93
|
-
params: {
|
|
94
|
-
url: claimUrl,
|
|
95
|
-
method: 'GET',
|
|
96
|
-
responseRedactions: [],
|
|
97
|
-
responseMatches: [
|
|
98
|
-
{
|
|
99
|
-
type: 'contains',
|
|
100
|
-
value: 'something@mock.com'
|
|
101
|
-
}
|
|
102
|
-
]
|
|
103
|
-
},
|
|
104
|
-
secretParams: {
|
|
105
|
-
authorisationHeader: 'Fail'
|
|
106
|
-
},
|
|
107
|
-
ownerPrivateKey: opts.privateKeyHex,
|
|
108
|
-
client,
|
|
109
|
-
zkEngine,
|
|
110
|
-
});
|
|
111
|
-
}).rejects.toThrow('Provider returned error 401');
|
|
112
|
-
});
|
|
113
|
-
describe('OPRF via %s', () => {
|
|
114
|
-
const zkEngine = 'gnark';
|
|
115
|
-
it.each(OPRF_CIPHER_SUITES)('should create a claim with an OPRF redaction (%s)', async (cipherSuite) => {
|
|
116
|
-
var _a, _b;
|
|
117
|
-
// OPRF is only available on gnark & chacha20 right now
|
|
118
|
-
providers_1.providers.http.additionalClientOptions = {
|
|
119
|
-
...providers_1.providers.http.additionalClientOptions,
|
|
120
|
-
cipherSuites: [cipherSuite]
|
|
121
|
-
};
|
|
122
|
-
const user = '(?<test>adhiraj)';
|
|
123
|
-
const result = await (0, client_1.createClaimOnAttestor)({
|
|
124
|
-
name: 'http',
|
|
125
|
-
params: {
|
|
126
|
-
url: claimUrl,
|
|
127
|
-
method: 'GET',
|
|
128
|
-
responseRedactions: [
|
|
129
|
-
{
|
|
130
|
-
regex: user,
|
|
131
|
-
hash: 'oprf'
|
|
132
|
-
}
|
|
133
|
-
],
|
|
134
|
-
responseMatches: [
|
|
135
|
-
{
|
|
136
|
-
type: 'contains',
|
|
137
|
-
value: ''
|
|
138
|
-
}
|
|
139
|
-
]
|
|
140
|
-
},
|
|
141
|
-
secretParams: {
|
|
142
|
-
authorisationHeader: `Bearer ${user}`
|
|
143
|
-
},
|
|
144
|
-
ownerPrivateKey: opts.privateKeyHex,
|
|
145
|
-
client,
|
|
146
|
-
zkEngine,
|
|
147
|
-
});
|
|
148
|
-
expect(result.error).toBeUndefined();
|
|
149
|
-
// decrypt the transcript and check we didn't accidentally
|
|
150
|
-
// leak our secrets in the application data
|
|
151
|
-
const transcript = result.request.transcript;
|
|
152
|
-
expect(transcript).toBeTruthy();
|
|
153
|
-
const applMsgs = (0, utils_2.extractApplicationDataFromTranscript)(await (0, server_1.decryptTranscript)(transcript, utils_2.logger, zkEngine, (_a = result.request) === null || _a === void 0 ? void 0 : _a.fixedServerIV, (_b = result.request) === null || _b === void 0 ? void 0 : _b.fixedClientIV));
|
|
154
|
-
const serverPackets = applMsgs
|
|
155
|
-
.filter(m => m.sender === 'server')
|
|
156
|
-
.map(m => (0, tls_1.uint8ArrayToStr)(m.message))
|
|
157
|
-
.join('');
|
|
158
|
-
const toprf = (0, utils_1.getFirstTOprfBlock)(result.request);
|
|
159
|
-
expect(toprf).toBeTruthy();
|
|
160
|
-
// only the user's hash should be revealed
|
|
161
|
-
expect(serverPackets).not.toContain(user);
|
|
162
|
-
expect(serverPackets).toContain((0, utils_2.binaryHashToStr)(toprf.nullifier, toprf.dataLocation.length));
|
|
163
|
-
});
|
|
164
|
-
it('should produce the same hash for the same input', async () => {
|
|
165
|
-
let hash;
|
|
166
|
-
for (let i = 0; i < 2; i++) {
|
|
167
|
-
const user = '(?<su>some-user)';
|
|
168
|
-
const result = await (0, client_1.createClaimOnAttestor)({
|
|
169
|
-
name: 'http',
|
|
170
|
-
params: {
|
|
171
|
-
url: claimUrl,
|
|
172
|
-
method: 'GET',
|
|
173
|
-
responseRedactions: [
|
|
174
|
-
{
|
|
175
|
-
regex: user,
|
|
176
|
-
hash: 'oprf'
|
|
177
|
-
}
|
|
178
|
-
],
|
|
179
|
-
responseMatches: [
|
|
180
|
-
{
|
|
181
|
-
type: 'contains',
|
|
182
|
-
value: ''
|
|
183
|
-
}
|
|
184
|
-
]
|
|
185
|
-
},
|
|
186
|
-
secretParams: {
|
|
187
|
-
authorisationHeader: `Bearer ${user}`
|
|
188
|
-
},
|
|
189
|
-
ownerPrivateKey: opts.privateKeyHex,
|
|
190
|
-
client,
|
|
191
|
-
zkEngine,
|
|
192
|
-
});
|
|
193
|
-
const toprf = (0, utils_1.getFirstTOprfBlock)(result.request);
|
|
194
|
-
expect(toprf).toBeTruthy();
|
|
195
|
-
hash || (hash = toprf.nullifier);
|
|
196
|
-
expect(toprf.nullifier).toEqual(hash);
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
describe('Pool', () => {
|
|
201
|
-
it('should correctly throw error when tunnel creation fails', async () => {
|
|
202
|
-
await expect((0, client_1.createClaimOnAttestor)({
|
|
203
|
-
name: 'http',
|
|
204
|
-
params: {
|
|
205
|
-
url: 'https://some.dns.not.exist',
|
|
206
|
-
method: 'GET',
|
|
207
|
-
responseRedactions: [],
|
|
208
|
-
responseMatches: [
|
|
209
|
-
{
|
|
210
|
-
type: 'contains',
|
|
211
|
-
value: 'test'
|
|
212
|
-
}
|
|
213
|
-
]
|
|
214
|
-
},
|
|
215
|
-
secretParams: {
|
|
216
|
-
authorisationHeader: 'Bearer abcd'
|
|
217
|
-
},
|
|
218
|
-
ownerPrivateKey: opts.privateKeyHex,
|
|
219
|
-
client: { url: opts.serverUrl },
|
|
220
|
-
zkEngine
|
|
221
|
-
})).rejects.toMatchObject({
|
|
222
|
-
message: /ENOTFOUND/
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
it('should reconnect client when found disconnected', async () => {
|
|
226
|
-
await createClaim();
|
|
227
|
-
// since we're using a pool, we'll find the client
|
|
228
|
-
// disconnected and when we create the claim again
|
|
229
|
-
// we expect a new connection to be established
|
|
230
|
-
const client = (0, client_1.getAttestorClientFromPool)(opts.serverUrl);
|
|
231
|
-
await client.terminateConnection();
|
|
232
|
-
// ensure claim is still successful
|
|
233
|
-
const result2 = await createClaim();
|
|
234
|
-
expect(result2.claim).toBeTruthy();
|
|
235
|
-
const client2 = (0, client_1.getAttestorClientFromPool)(opts.serverUrl);
|
|
236
|
-
expect(client2).not.toBe(client);
|
|
237
|
-
});
|
|
238
|
-
it('should retry on network errors', async () => {
|
|
239
|
-
const client = (0, client_1.getAttestorClientFromPool)(opts.serverUrl);
|
|
240
|
-
client.sendMessage = async () => {
|
|
241
|
-
// @ts-ignore
|
|
242
|
-
client.sendMessage = () => { };
|
|
243
|
-
const err = new utils_2.AttestorError('ERROR_NETWORK_ERROR', 'F');
|
|
244
|
-
await client.terminateConnection(err);
|
|
245
|
-
throw err;
|
|
246
|
-
};
|
|
247
|
-
// first the client will mock disconnection when
|
|
248
|
-
// sending a message -- that should trigger a retry
|
|
249
|
-
// and result in a successful claim creation
|
|
250
|
-
await expect(createClaim()).resolves.toBeTruthy();
|
|
251
|
-
// ensure new client is created to replace
|
|
252
|
-
// the disconnected one
|
|
253
|
-
const client2 = (0, client_1.getAttestorClientFromPool)(opts.serverUrl);
|
|
254
|
-
expect(client2).not.toBe(client);
|
|
255
|
-
});
|
|
256
|
-
});
|
|
257
|
-
function createClaim() {
|
|
258
|
-
const user = 'testing-123';
|
|
259
|
-
return (0, client_1.createClaimOnAttestor)({
|
|
260
|
-
name: 'http',
|
|
261
|
-
params: {
|
|
262
|
-
url: claimUrl,
|
|
263
|
-
method: 'GET',
|
|
264
|
-
responseRedactions: [],
|
|
265
|
-
responseMatches: [
|
|
266
|
-
{
|
|
267
|
-
type: 'contains',
|
|
268
|
-
value: `${user}@mock.com`
|
|
269
|
-
}
|
|
270
|
-
]
|
|
271
|
-
},
|
|
272
|
-
secretParams: {
|
|
273
|
-
authorisationHeader: `Bearer ${user}`
|
|
274
|
-
},
|
|
275
|
-
ownerPrivateKey: opts.privateKeyHex,
|
|
276
|
-
client: { url: opts.serverUrl }
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5jbGFpbS1jcmVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0cy90ZXN0LmNsYWltLWNyZWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOENBQXVGO0FBR3ZGLHVDQUE2RTtBQUM3RSw2Q0FBeUM7QUFDekMsdUNBQThDO0FBQzlDLHlFQUFtRTtBQUNuRSwyQ0FBOEM7QUFDOUMsMkNBQStFO0FBQy9FLHFDQUswQjtBQUUxQixNQUFNLFlBQVksR0FBeUI7SUFDMUMsUUFBUTtJQUNSLFFBQVE7Q0FDUixDQUFBO0FBRUQsTUFBTSxrQkFBa0IsR0FBa0I7SUFDekMsOEJBQThCO0lBQzlCLHdCQUF3QjtJQUN4Qix3QkFBd0I7Q0FDeEIsQ0FBQTtBQUVELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBTSxDQUFDLENBQUE7QUFFdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxrREFBa0QsRUFBRSxHQUFHLEVBQUU7SUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrREFBa0QsQ0FBQyxDQUFBO0lBQ3JGLE9BQU87UUFDTixVQUFVLEVBQUUsSUFBSTtRQUNoQixHQUFHLE1BQU07UUFDVCxzQkFBc0IsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUU7S0FDdEQsQ0FBQTtBQUNGLENBQUMsQ0FBQyxDQUFBO0FBRUYsSUFBQSx5Q0FBa0IsRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsRUFBRTtJQUUzQyxNQUFNLFFBQVEsR0FBYSxPQUFPLENBQUE7SUFFbEMsSUFBSSxNQUFzQixDQUFBO0lBQzFCLElBQUksUUFBZ0IsQ0FBQTtJQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUE7UUFDcEIsUUFBUSxHQUFHLHFCQUFxQixJQUFJLENBQUMsbUJBQW1CLEtBQUssQ0FBQTtRQUU3RCw4Q0FBOEM7UUFDOUMs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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const RES_CHUNKED_PARTIAL_BODY: string;
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RES_CHUNKED_PARTIAL_BODY = void 0;
|
|
4
|
-
const tls_1 = require("@reclaimprotocol/tls");
|
|
5
|
-
const generics_1 = require("../utils/generics");
|
|
6
|
-
const http_parser_1 = require("../utils/http-parser");
|
|
7
|
-
describe.each(['complete', 'byte-by-byte'])('HTTP Parser tests (mode=%s)', (parseMode) => {
|
|
8
|
-
it('should parse a response', () => {
|
|
9
|
-
const res = parseHttpResponse(RES1, parseMode);
|
|
10
|
-
expect(RES1
|
|
11
|
-
.subarray(0, res.statusLineEndIndex)
|
|
12
|
-
.toString()).toEqual('HTTP/1.1 401 Unauthorized');
|
|
13
|
-
expect(res.complete).toEqual(true);
|
|
14
|
-
expect(res.statusCode).toEqual(401);
|
|
15
|
-
expect(res.body.length).toBeGreaterThan(0);
|
|
16
|
-
const json = JSON.parse((0, generics_1.uint8ArrayToStr)(res.body));
|
|
17
|
-
expect(json.error.code).toEqual(401);
|
|
18
|
-
});
|
|
19
|
-
it('should parse an empty body response', () => {
|
|
20
|
-
const res = parseHttpResponse((0, tls_1.strToUint8Array)(RES_EMPTY), parseMode);
|
|
21
|
-
expect(res.complete).toEqual(true);
|
|
22
|
-
expect(res.statusCode).toEqual(200);
|
|
23
|
-
expect(res.body.length).toEqual(0);
|
|
24
|
-
});
|
|
25
|
-
it('should parse an empty chunked response', () => {
|
|
26
|
-
const res = parseHttpResponse((0, tls_1.strToUint8Array)(RES_EMPTY_CHUNKED), parseMode);
|
|
27
|
-
expect(res.complete).toEqual(true);
|
|
28
|
-
expect(res.statusCode).toEqual(200);
|
|
29
|
-
expect(res.body.length).toEqual(0);
|
|
30
|
-
});
|
|
31
|
-
it('should read a set content-length', () => {
|
|
32
|
-
const buff = (0, tls_1.strToUint8Array)(RES_BODY);
|
|
33
|
-
const res = parseHttpResponse(buff, parseMode);
|
|
34
|
-
expect(res.complete).toEqual(true);
|
|
35
|
-
expect(res.bodyStartIndex).toBeTruthy();
|
|
36
|
-
expect(buff.slice(res.bodyStartIndex)).toEqual(res.body);
|
|
37
|
-
const json = JSON.parse((0, generics_1.uint8ArrayToStr)(res.body));
|
|
38
|
-
expect(json.name).toBeTruthy();
|
|
39
|
-
});
|
|
40
|
-
it('should correctly set chunk indices', () => {
|
|
41
|
-
var _a;
|
|
42
|
-
const buff = (0, tls_1.strToUint8Array)(exports.RES_CHUNKED_PARTIAL_BODY);
|
|
43
|
-
const res = parseHttpResponse(buff, parseMode);
|
|
44
|
-
expect(res.complete).toEqual(true);
|
|
45
|
-
// ensure all chunks are parsed correctly
|
|
46
|
-
const parsedChunks = (_a = res.chunks) === null || _a === void 0 ? void 0 : _a.map((chunk) => {
|
|
47
|
-
return (0, generics_1.uint8ArrayToStr)(buff.slice(chunk.fromIndex, chunk.toIndex));
|
|
48
|
-
});
|
|
49
|
-
expect(parsedChunks).toEqual(CHUNKS);
|
|
50
|
-
const json = JSON.parse((0, generics_1.uint8ArrayToStr)(res.body));
|
|
51
|
-
expect(json.name).toBeTruthy();
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
describe('General HTTP Parser Tests', () => {
|
|
55
|
-
it('should correctly parse an empty body response', () => {
|
|
56
|
-
const str = 'HTTP/1.1 302 \r\nset-cookie: JSESSIONID=X; Path=/; Secure; HttpOnly\r\nx-content-type-options: nosniff\r\nx-xss-protection: 1; mode=block\r\nstrict-transport-security: max-age=31536000 ; includeSubDomains\r\nlocation: https://xyz.com/abcd\r\ncontent-length: 0\r\ndate: Sun, 16 Jun 2024 07:12:03 GMT\r\nconnection: close\r\nSet-Cookie: XYZ; path=/; Httponly; Secure\r\nSet-Cookie: ROUTEID=.node-U01; Path=/; Httponly; Secure\r\n\r\n';
|
|
57
|
-
const buff = (0, tls_1.strToUint8Array)(str);
|
|
58
|
-
const parser = (0, http_parser_1.makeHttpResponseParser)();
|
|
59
|
-
parser.onChunk(buff);
|
|
60
|
-
expect(parser.res.complete).toEqual(true);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
function parseHttpResponse(buff, mode) {
|
|
64
|
-
const parser = (0, http_parser_1.makeHttpResponseParser)();
|
|
65
|
-
if (mode === 'complete') {
|
|
66
|
-
parser.onChunk(buff);
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
for (const byte of buff) {
|
|
70
|
-
parser.onChunk(new Uint8Array([byte]));
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
parser.streamEnded();
|
|
74
|
-
return parser.res;
|
|
75
|
-
}
|
|
76
|
-
const RES1 = Buffer.from('SFRUUC8xLjEgNDAxIFVuYXV0aG9yaXplZA0KV1dXLUF1dGhlbnRpY2F0ZTogQmVhcmVyIHJlYWxtPSJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20vIiwgZXJyb3I9ImludmFsaWRfdG9rZW4iDQpWYXJ5OiBYLU9yaWdpbg0KVmFyeTogUmVmZXJlcg0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04DQpEYXRlOiBUdWUsIDEzIERlYyAyMDIyIDAzOjU1OjM1IEdNVA0KU2VydmVyOiBFU0YNCkNhY2hlLUNvbnRyb2w6IHByaXZhdGUNClgtWFNTLVByb3RlY3Rpb246IDANClgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTg0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KQWNjZXB0LVJhbmdlczogbm9uZQ0KVmFyeTogT3JpZ2luLEFjY2VwdC1FbmNvZGluZw0KVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQNCkFsdC1TdmM6IGgzPSI6NDQzIjsgbWE9MjU5MjAwMCxoMy0yOT0iOjQ0MyI7IG1hPTI1OTIwMDAsaDMtUTA1MD0iOjQ0MyI7IG1hPTI1OTIwMDAsaDMtUTA0Nj0iOjQ0MyI7IG1hPTI1OTIwMDAsaDMtUTA0Mz0iOjQ0MyI7IG1hPTI1OTIwMDAscXVpYz0iOjQ0MyI7IG1hPTI1OTIwMDA7IHY9IjQ2LDQzIg0KQ29ubmVjdGlvbjogY2xvc2UNCg0KMTI5DQp7CiAgImVycm9yIjogewogICAgImNvZGUiOiA0MDEsCiAgICAibWVzc2FnZSI6ICJSZXF1ZXN0IGhhZCBpbnZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzLiBFeHBlY3RlZCBPQXV0aCAyIGFjY2VzcyB0b2tlbiwgbG9naW4gY29va2llIG9yIG90aGVyIHZhbGlkIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWwuIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9pZGVudGl0eS9zaWduLWluL3dlYi9kZXZjb25zb2xlLXByb2plY3QuIiwKICAgICJzdGF0dXMiOiAiVU5BVVRIRU5USUNBVEVEIgogIH0KfQoNCg==', 'base64');
|
|
77
|
-
const RES_EMPTY = [
|
|
78
|
-
'HTTP/1.1 200 OK',
|
|
79
|
-
'Content-Type: application/json',
|
|
80
|
-
'Content-Length: 0',
|
|
81
|
-
'', //empty line
|
|
82
|
-
'',
|
|
83
|
-
].join('\r\n');
|
|
84
|
-
const BODY_JSON = '{"name":"John","age":30,"car":null}';
|
|
85
|
-
const RES_BODY = [
|
|
86
|
-
'HTTP/1.1 200 OK',
|
|
87
|
-
'Content-Type: application/json',
|
|
88
|
-
'Content-Length: ' + BODY_JSON.length,
|
|
89
|
-
'',
|
|
90
|
-
BODY_JSON
|
|
91
|
-
].join('\r\n');
|
|
92
|
-
const RES_EMPTY_CHUNKED = [
|
|
93
|
-
'HTTP/1.1 200 OK',
|
|
94
|
-
'Content-Type: application/json',
|
|
95
|
-
'Transfer-Encoding: chunked',
|
|
96
|
-
'',
|
|
97
|
-
'0',
|
|
98
|
-
'',
|
|
99
|
-
].join('\r\n');
|
|
100
|
-
const CHUNKS = [
|
|
101
|
-
'{"name":"John",',
|
|
102
|
-
'"age":30,',
|
|
103
|
-
'"car":null,',
|
|
104
|
-
'"house":"some',
|
|
105
|
-
'where"}'
|
|
106
|
-
];
|
|
107
|
-
exports.RES_CHUNKED_PARTIAL_BODY = [
|
|
108
|
-
'HTTP/1.1 200 OK',
|
|
109
|
-
'Content-Type: application/json',
|
|
110
|
-
'Transfer-Encoding: chunked',
|
|
111
|
-
'',
|
|
112
|
-
...CHUNKS.flatMap((chunk) => {
|
|
113
|
-
const chunkSize = chunk.length.toString(16);
|
|
114
|
-
return [chunkSize, chunk];
|
|
115
|
-
}),
|
|
116
|
-
'0',
|
|
117
|
-
'',
|
|
118
|
-
''
|
|
119
|
-
].join('\r\n');
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5odHRwLXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0cy90ZXN0Lmh0dHAtcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDhDQUFzRDtBQUN0RCxpREFBb0Q7QUFDcEQsdURBQThEO0FBRTlELFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFVLENBQUMsQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFO0lBRWpHLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7UUFDbEMsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQzlDLE1BQU0sQ0FDTCxJQUFJO2FBQ0YsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsa0JBQWtCLENBQUM7YUFDbkMsUUFBUSxFQUFFLENBQ1osQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtRQUV0QyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLDBCQUFlLEVBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxDQUFBO0lBRUYsRUFBRSxDQUFDLHFDQUFxQyxFQUFF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
|