@aztec/prover-client 0.69.1 → 0.71.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/dest/bin/get-proof-inputs.d.ts +2 -0
- package/dest/bin/get-proof-inputs.d.ts.map +1 -0
- package/dest/bin/get-proof-inputs.js +50 -0
- package/dest/block_builder/light.d.ts +3 -5
- package/dest/block_builder/light.d.ts.map +1 -1
- package/dest/block_builder/light.js +9 -22
- package/dest/config.d.ts +2 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +3 -2
- package/dest/mocks/fixtures.d.ts +1 -1
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +2 -2
- package/dest/mocks/test_context.d.ts +1 -1
- package/dest/mocks/test_context.d.ts.map +1 -1
- package/dest/mocks/test_context.js +11 -12
- package/dest/orchestrator/block-building-helpers.d.ts +15 -29
- package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
- package/dest/orchestrator/block-building-helpers.js +51 -58
- package/dest/orchestrator/block-proving-state.d.ts +40 -44
- package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/block-proving-state.js +149 -85
- package/dest/orchestrator/epoch-proving-state.d.ts +23 -30
- package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/epoch-proving-state.js +92 -65
- package/dest/orchestrator/orchestrator.d.ts +17 -48
- package/dest/orchestrator/orchestrator.d.ts.map +1 -1
- package/dest/orchestrator/orchestrator.js +208 -351
- package/dest/orchestrator/tx-proving-state.d.ts +10 -6
- package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
- package/dest/orchestrator/tx-proving-state.js +57 -46
- package/dest/prover-agent/memory-proving-queue.d.ts +4 -4
- package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
- package/dest/prover-agent/memory-proving-queue.js +5 -5
- package/dest/prover-agent/prover-agent.d.ts +0 -2
- package/dest/prover-agent/prover-agent.d.ts.map +1 -1
- package/dest/prover-agent/prover-agent.js +7 -9
- package/dest/prover-client/factory.d.ts.map +1 -1
- package/dest/prover-client/factory.js +3 -3
- package/dest/prover-client/prover-client.d.ts +4 -2
- package/dest/prover-client/prover-client.d.ts.map +1 -1
- package/dest/prover-client/prover-client.js +16 -15
- package/dest/prover-client/server-epoch-prover.d.ts +25 -0
- package/dest/prover-client/server-epoch-prover.d.ts.map +1 -0
- package/dest/prover-client/server-epoch-prover.js +40 -0
- package/dest/proving_broker/broker_prover_facade.d.ts +19 -7
- package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
- package/dest/proving_broker/broker_prover_facade.js +271 -49
- package/dest/proving_broker/config.d.ts +61 -0
- package/dest/proving_broker/config.d.ts.map +1 -0
- package/dest/proving_broker/config.js +83 -0
- package/dest/proving_broker/factory.d.ts +1 -1
- package/dest/proving_broker/factory.d.ts.map +1 -1
- package/dest/proving_broker/factory.js +4 -7
- package/dest/proving_broker/fixtures.d.ts +5 -0
- package/dest/proving_broker/fixtures.d.ts.map +1 -0
- package/dest/proving_broker/fixtures.js +12 -0
- package/dest/proving_broker/index.d.ts +2 -1
- package/dest/proving_broker/index.d.ts.map +1 -1
- package/dest/proving_broker/index.js +3 -2
- package/dest/proving_broker/proof_store/factory.d.ts +6 -0
- package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/factory.js +39 -0
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +13 -0
- package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/gcs_proof_store.js +46 -0
- package/dest/proving_broker/proof_store/index.d.ts +4 -0
- package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/index.js +4 -0
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts +14 -0
- package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/inline_proof_store.js +37 -0
- package/dest/proving_broker/{proof_store.d.ts → proof_store/proof_store.d.ts} +1 -12
- package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
- package/dest/proving_broker/proof_store/proof_store.js +2 -0
- package/dest/proving_broker/proving_agent.d.ts +4 -4
- package/dest/proving_broker/proving_agent.d.ts.map +1 -1
- package/dest/proving_broker/proving_agent.js +5 -5
- package/dest/proving_broker/proving_broker.d.ts +16 -12
- package/dest/proving_broker/proving_broker.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker.js +307 -274
- package/dest/proving_broker/proving_broker_database/memory.d.ts +4 -2
- package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/memory.js +17 -4
- package/dest/proving_broker/proving_broker_database/persisted.d.ts +10 -6
- package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
- package/dest/proving_broker/proving_broker_database/persisted.js +106 -14
- package/dest/proving_broker/proving_broker_database.d.ts +7 -3
- package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
- package/dest/proving_broker/proving_job_controller.js +4 -4
- package/dest/proving_broker/rpc.d.ts.map +1 -1
- package/dest/proving_broker/rpc.js +4 -4
- package/dest/test/mock_prover.d.ts +8 -8
- package/dest/test/mock_prover.d.ts.map +1 -1
- package/dest/test/mock_prover.js +9 -10
- package/package.json +14 -12
- package/src/bin/get-proof-inputs.ts +60 -0
- package/src/block_builder/light.ts +7 -31
- package/src/config.ts +4 -4
- package/src/mocks/fixtures.ts +1 -1
- package/src/mocks/test_context.ts +9 -11
- package/src/orchestrator/block-building-helpers.ts +360 -402
- package/src/orchestrator/block-proving-state.ts +251 -121
- package/src/orchestrator/epoch-proving-state.ts +159 -88
- package/src/orchestrator/orchestrator.ts +262 -542
- package/src/orchestrator/tx-proving-state.ts +30 -18
- package/src/prover-agent/memory-proving-queue.ts +12 -16
- package/src/prover-agent/prover-agent.ts +14 -8
- package/src/prover-client/factory.ts +2 -3
- package/src/prover-client/prover-client.ts +17 -20
- package/src/prover-client/server-epoch-prover.ts +44 -0
- package/src/proving_broker/broker_prover_facade.ts +347 -67
- package/src/proving_broker/config.ts +93 -0
- package/src/proving_broker/factory.ts +11 -10
- package/src/proving_broker/fixtures.ts +14 -0
- package/src/proving_broker/index.ts +2 -1
- package/src/proving_broker/proof_store/factory.ts +42 -0
- package/src/proving_broker/proof_store/gcs_proof_store.ts +72 -0
- package/src/proving_broker/proof_store/index.ts +3 -0
- package/src/proving_broker/{proof_store.ts → proof_store/inline_proof_store.ts} +1 -44
- package/src/proving_broker/proof_store/proof_store.ts +54 -0
- package/src/proving_broker/proving_agent.ts +11 -5
- package/src/proving_broker/proving_broker.ts +122 -73
- package/src/proving_broker/proving_broker_database/memory.ts +24 -4
- package/src/proving_broker/proving_broker_database/persisted.ts +142 -20
- package/src/proving_broker/proving_broker_database.ts +8 -3
- package/src/proving_broker/proving_job_controller.ts +5 -5
- package/src/proving_broker/rpc.ts +2 -3
- package/src/test/mock_prover.ts +12 -18
- package/dest/proving_broker/proof_store.d.ts.map +0 -1
- package/dest/proving_broker/proof_store.js +0 -37
|
@@ -42,13 +42,13 @@ export class ProvingJobController {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
this.status = ProvingJobControllerStatus.PROVING;
|
|
45
|
+
|
|
45
46
|
this.promise = this.generateProof()
|
|
46
47
|
.then(
|
|
47
48
|
result => {
|
|
48
49
|
if (this.status === ProvingJobControllerStatus.ABORTED) {
|
|
49
50
|
return;
|
|
50
51
|
}
|
|
51
|
-
|
|
52
52
|
this.status = ProvingJobControllerStatus.DONE;
|
|
53
53
|
return this.onComplete(this.jobId, this.inputs.type, undefined, result);
|
|
54
54
|
},
|
|
@@ -124,6 +124,10 @@ export class ProvingJobController {
|
|
|
124
124
|
return await this.circuitProver.getBlockRootRollupProof(inputs, signal, this.epochNumber);
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
+
case ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP: {
|
|
128
|
+
return await this.circuitProver.getSingleTxBlockRootRollupProof(inputs, signal, this.epochNumber);
|
|
129
|
+
}
|
|
130
|
+
|
|
127
131
|
case ProvingRequestType.BLOCK_MERGE_ROLLUP: {
|
|
128
132
|
return await this.circuitProver.getBlockMergeRollupProof(inputs, signal, this.epochNumber);
|
|
129
133
|
}
|
|
@@ -140,10 +144,6 @@ export class ProvingJobController {
|
|
|
140
144
|
return await this.circuitProver.getRootParityProof(inputs, signal, this.epochNumber);
|
|
141
145
|
}
|
|
142
146
|
|
|
143
|
-
case ProvingRequestType.PRIVATE_KERNEL_EMPTY: {
|
|
144
|
-
return await this.circuitProver.getEmptyPrivateKernelProof(inputs, signal, this.epochNumber);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
147
|
case ProvingRequestType.TUBE_PROOF: {
|
|
148
148
|
return await this.circuitProver.getTubeProof(inputs, signal, this.epochNumber);
|
|
149
149
|
}
|
|
@@ -6,7 +6,6 @@ import {
|
|
|
6
6
|
type ProvingJobConsumer,
|
|
7
7
|
ProvingJobId,
|
|
8
8
|
type ProvingJobProducer,
|
|
9
|
-
ProvingJobSettledResult,
|
|
10
9
|
ProvingJobStatus,
|
|
11
10
|
ProvingRequestType,
|
|
12
11
|
} from '@aztec/circuit-types';
|
|
@@ -26,10 +25,10 @@ const GetProvingJobResponse = z.object({
|
|
|
26
25
|
});
|
|
27
26
|
|
|
28
27
|
export const ProvingJobProducerSchema: ApiSchemaFor<ProvingJobProducer> = {
|
|
29
|
-
enqueueProvingJob: z.function().args(ProvingJob).returns(
|
|
28
|
+
enqueueProvingJob: z.function().args(ProvingJob).returns(ProvingJobStatus),
|
|
30
29
|
getProvingJobStatus: z.function().args(ProvingJobId).returns(ProvingJobStatus),
|
|
31
30
|
cancelProvingJob: z.function().args(ProvingJobId).returns(z.void()),
|
|
32
|
-
|
|
31
|
+
getCompletedJobs: z.function().args(z.array(ProvingJobId)).returns(z.array(ProvingJobId)),
|
|
33
32
|
};
|
|
34
33
|
|
|
35
34
|
export const ProvingJobConsumerSchema: ApiSchemaFor<ProvingJobConsumer> = {
|
package/src/test/mock_prover.ts
CHANGED
|
@@ -3,7 +3,6 @@ import {
|
|
|
3
3
|
type ProvingJob,
|
|
4
4
|
type ProvingJobId,
|
|
5
5
|
type ProvingJobProducer,
|
|
6
|
-
type ProvingJobSettledResult,
|
|
7
6
|
type ProvingJobStatus,
|
|
8
7
|
type PublicInputsAndRecursiveProof,
|
|
9
8
|
type ServerCircuitProver,
|
|
@@ -17,8 +16,6 @@ import {
|
|
|
17
16
|
type BaseParityInputs,
|
|
18
17
|
NESTED_RECURSIVE_PROOF_LENGTH,
|
|
19
18
|
NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
|
|
20
|
-
type PrivateKernelEmptyInputData,
|
|
21
|
-
type PrivateToRollupKernelCircuitPublicInputs,
|
|
22
19
|
RECURSIVE_PROOF_LENGTH,
|
|
23
20
|
type RootParityInputs,
|
|
24
21
|
TUBE_PROOF_LENGTH,
|
|
@@ -37,24 +34,23 @@ import {
|
|
|
37
34
|
type PublicBaseRollupInputs,
|
|
38
35
|
type RootRollupInputs,
|
|
39
36
|
type RootRollupPublicInputs,
|
|
37
|
+
type SingleTxBlockRootRollupInputs,
|
|
40
38
|
} from '@aztec/circuits.js/rollup';
|
|
41
39
|
import {
|
|
42
40
|
makeBaseOrMergeRollupPublicInputs,
|
|
43
41
|
makeBlockRootOrBlockMergeRollupPublicInputs,
|
|
44
42
|
makeParityPublicInputs,
|
|
45
|
-
makePrivateToRollupKernelCircuitPublicInputs,
|
|
46
43
|
makeRootRollupPublicInputs,
|
|
47
44
|
} from '@aztec/circuits.js/testing';
|
|
48
45
|
import { times } from '@aztec/foundation/collection';
|
|
49
|
-
import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
|
|
50
46
|
|
|
51
|
-
import { InlineProofStore, type ProofStore } from '../proving_broker/proof_store.js';
|
|
47
|
+
import { InlineProofStore, type ProofStore } from '../proving_broker/proof_store/index.js';
|
|
52
48
|
import { ProvingAgent } from '../proving_broker/proving_agent.js';
|
|
53
49
|
import { ProvingBroker } from '../proving_broker/proving_broker.js';
|
|
54
50
|
import { InMemoryBrokerDatabase } from '../proving_broker/proving_broker_database/memory.js';
|
|
55
51
|
|
|
56
52
|
export class TestBroker implements ProvingJobProducer {
|
|
57
|
-
private broker = new ProvingBroker(new InMemoryBrokerDatabase()
|
|
53
|
+
private broker = new ProvingBroker(new InMemoryBrokerDatabase());
|
|
58
54
|
private agents: ProvingAgent[];
|
|
59
55
|
|
|
60
56
|
constructor(
|
|
@@ -65,7 +61,7 @@ export class TestBroker implements ProvingJobProducer {
|
|
|
65
61
|
) {
|
|
66
62
|
this.agents = times(
|
|
67
63
|
agentCount,
|
|
68
|
-
() => new ProvingAgent(this.broker, proofStore, prover,
|
|
64
|
+
() => new ProvingAgent(this.broker, proofStore, prover, undefined, agentPollInterval),
|
|
69
65
|
);
|
|
70
66
|
}
|
|
71
67
|
|
|
@@ -83,7 +79,7 @@ export class TestBroker implements ProvingJobProducer {
|
|
|
83
79
|
return this.proofStore;
|
|
84
80
|
}
|
|
85
81
|
|
|
86
|
-
enqueueProvingJob(job: ProvingJob): Promise<
|
|
82
|
+
enqueueProvingJob(job: ProvingJob): Promise<ProvingJobStatus> {
|
|
87
83
|
return this.broker.enqueueProvingJob(job);
|
|
88
84
|
}
|
|
89
85
|
getProvingJobStatus(id: ProvingJobId): Promise<ProvingJobStatus> {
|
|
@@ -92,8 +88,9 @@ export class TestBroker implements ProvingJobProducer {
|
|
|
92
88
|
cancelProvingJob(id: string): Promise<void> {
|
|
93
89
|
return this.broker.cancelProvingJob(id);
|
|
94
90
|
}
|
|
95
|
-
|
|
96
|
-
|
|
91
|
+
|
|
92
|
+
getCompletedJobs(ids: ProvingJobId[]): Promise<ProvingJobId[]> {
|
|
93
|
+
return this.broker.getCompletedJobs(ids);
|
|
97
94
|
}
|
|
98
95
|
}
|
|
99
96
|
|
|
@@ -219,19 +216,16 @@ export class MockProver implements ServerCircuitProver {
|
|
|
219
216
|
);
|
|
220
217
|
}
|
|
221
218
|
|
|
222
|
-
|
|
223
|
-
|
|
219
|
+
getSingleTxBlockRootRollupProof(
|
|
220
|
+
_input: SingleTxBlockRootRollupInputs,
|
|
224
221
|
_signal?: AbortSignal,
|
|
225
222
|
_epochNumber?: number,
|
|
226
223
|
): Promise<
|
|
227
|
-
PublicInputsAndRecursiveProof<
|
|
228
|
-
PrivateToRollupKernelCircuitPublicInputs,
|
|
229
|
-
typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
|
|
230
|
-
>
|
|
224
|
+
PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
|
|
231
225
|
> {
|
|
232
226
|
return Promise.resolve(
|
|
233
227
|
makePublicInputsAndRecursiveProof(
|
|
234
|
-
|
|
228
|
+
makeBlockRootOrBlockMergeRollupPublicInputs(),
|
|
235
229
|
makeRecursiveProof(NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH),
|
|
236
230
|
VerificationKeyData.makeFakeHonk(),
|
|
237
231
|
),
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proof_store.d.ts","sourceRoot":"","sources":["../../src/proving_broker/proof_store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAI9B;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;OAMG;IACH,cAAc,CAAC,CAAC,SAAS,kBAAkB,EACzC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB;;;;;;OAMG;IACH,eAAe,CAAC,CAAC,SAAS,kBAAkB,EAC1C,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB;;;;OAIG;IACH,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAExD;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC1D;AAOD;;GAEG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,cAAc,CAAC,CAAC,SAAS,kBAAkB,EACzC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,QAAQ,CAAC;IAKpB,eAAe,CAAC,CAAC,SAAS,kBAAkB,EAC1C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,QAAQ,CAAC;IAKpB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIvD,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIxD,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,MAAM;CAQf"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { ProvingJobInputs, ProvingJobResult, } from '@aztec/circuit-types';
|
|
2
|
-
import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
|
|
3
|
-
// use an ASCII encoded data uri https://datatracker.ietf.org/doc/html/rfc2397#section-2
|
|
4
|
-
// we do this to avoid double encoding to base64 (since the inputs already serialize to a base64 string)
|
|
5
|
-
const PREFIX = 'data:application/json;charset=utf-8';
|
|
6
|
-
const SEPARATOR = ',';
|
|
7
|
-
/**
|
|
8
|
-
* An implementation of a proof input/output database that stores data inline in the URI.
|
|
9
|
-
*/
|
|
10
|
-
export class InlineProofStore {
|
|
11
|
-
saveProofInput(_id, type, inputs) {
|
|
12
|
-
const jobInputs = { type, inputs };
|
|
13
|
-
return Promise.resolve(this.encode(jobInputs));
|
|
14
|
-
}
|
|
15
|
-
saveProofOutput(_id, type, result) {
|
|
16
|
-
const jobResult = { type, result };
|
|
17
|
-
return Promise.resolve(this.encode(jobResult));
|
|
18
|
-
}
|
|
19
|
-
getProofInput(uri) {
|
|
20
|
-
return Promise.resolve(this.decode(uri, ProvingJobInputs));
|
|
21
|
-
}
|
|
22
|
-
getProofOutput(uri) {
|
|
23
|
-
return Promise.resolve(this.decode(uri, ProvingJobResult));
|
|
24
|
-
}
|
|
25
|
-
encode(obj) {
|
|
26
|
-
const encoded = encodeURIComponent(jsonStringify(obj));
|
|
27
|
-
return (PREFIX + SEPARATOR + encoded);
|
|
28
|
-
}
|
|
29
|
-
decode(uri, schema) {
|
|
30
|
-
const [prefix, data] = uri.split(SEPARATOR);
|
|
31
|
-
if (prefix !== PREFIX) {
|
|
32
|
-
throw new Error('Invalid proof input URI: ' + prefix);
|
|
33
|
-
}
|
|
34
|
-
return jsonParseWithSchema(decodeURIComponent(data), schema);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvb2Zfc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmluZ19icm9rZXIvcHJvb2Zfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLGdCQUFnQixFQUVoQixnQkFBZ0IsR0FHakIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFnRGhGLHdGQUF3RjtBQUN4Rix3R0FBd0c7QUFDeEcsTUFBTSxNQUFNLEdBQUcscUNBQXFDLENBQUM7QUFDckQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO0FBRXRCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixjQUFjLENBQ1osR0FBaUIsRUFDakIsSUFBTyxFQUNQLE1BQThCO1FBRTlCLE1BQU0sU0FBUyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBc0IsQ0FBQztRQUN2RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxlQUFlLENBQ2IsR0FBaUIsRUFDakIsSUFBTyxFQUNQLE1BQStCO1FBRS9CLE1BQU0sU0FBUyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBc0IsQ0FBQztRQUN2RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxhQUFhLENBQUMsR0FBYTtRQUN6QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxjQUFjLENBQUMsR0FBYTtRQUMxQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxNQUFNLENBQUMsR0FBVztRQUN4QixNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RCxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQWEsQ0FBQztJQUNwRCxDQUFDO0lBRU8sTUFBTSxDQUFJLEdBQWEsRUFBRSxNQUFpQjtRQUNoRCxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0YifQ==
|