@aztec/bb-prover 0.40.0 → 0.41.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/bb/execute.d.ts +7 -1
- package/dest/bb/execute.d.ts.map +1 -1
- package/dest/bb/execute.js +35 -26
- package/dest/prover/bb_native_proof_creator.d.ts +3 -2
- package/dest/prover/bb_native_proof_creator.d.ts.map +1 -1
- package/dest/prover/bb_native_proof_creator.js +53 -35
- package/dest/prover/bb_prover.d.ts +14 -3
- package/dest/prover/bb_prover.d.ts.map +1 -1
- package/dest/prover/bb_prover.js +67 -40
- package/dest/stats.d.ts +2 -5
- package/dest/stats.d.ts.map +1 -1
- package/dest/stats.js +20 -25
- package/package.json +6 -6
- package/src/bb/execute.ts +41 -26
- package/src/prover/bb_native_proof_creator.ts +104 -42
- package/src/prover/bb_prover.ts +122 -82
- package/src/stats.ts +23 -44
package/dest/prover/bb_prover.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable require-await */
|
|
2
2
|
import { PublicKernelType, makePublicInputsAndProof, } from '@aztec/circuit-types';
|
|
3
|
-
import { Fr, Proof, RecursiveProof, RollupTypes, RootParityInput, VerificationKeyAsFields, } from '@aztec/circuits.js';
|
|
3
|
+
import { Fr, NESTED_RECURSIVE_PROOF_LENGTH, Proof, RECURSIVE_PROOF_LENGTH, RecursiveProof, RollupTypes, RootParityInput, VerificationKeyAsFields, } from '@aztec/circuits.js';
|
|
4
4
|
import { randomBytes } from '@aztec/foundation/crypto';
|
|
5
5
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { Timer } from '@aztec/foundation/timer';
|
|
@@ -9,7 +9,7 @@ import { NativeACVMSimulator } from '@aztec/simulator';
|
|
|
9
9
|
import * as fs from 'fs/promises';
|
|
10
10
|
import { BB_RESULT, PROOF_FIELDS_FILENAME, PROOF_FILENAME, VK_FIELDS_FILENAME, VK_FILENAME, generateKeyForNoirCircuit, generateProof, verifyProof, } from '../bb/execute.js';
|
|
11
11
|
import { PublicKernelArtifactMapping } from '../mappings/mappings.js';
|
|
12
|
-
import {
|
|
12
|
+
import { mapProtocolArtifactNameToCircuitName } from '../stats.js';
|
|
13
13
|
import { AGGREGATION_OBJECT_SIZE, CIRCUIT_PUBLIC_INPUTS_INDEX, CIRCUIT_RECURSIVE_INDEX, CIRCUIT_SIZE_INDEX, } from './verification_key_data.js';
|
|
14
14
|
const logger = createDebugLogger('aztec:bb-prover');
|
|
15
15
|
const CIRCUITS_WITHOUT_AGGREGATION = new Set(['BaseParityArtifact']);
|
|
@@ -36,8 +36,7 @@ export class BBNativeRollupProver {
|
|
|
36
36
|
* @returns The public inputs of the parity circuit.
|
|
37
37
|
*/
|
|
38
38
|
async getBaseParityProof(inputs) {
|
|
39
|
-
const
|
|
40
|
-
const [circuitOutput, proof] = await this.createRecursiveProof(witnessMap, 'BaseParityArtifact', convertBaseParityOutputsFromWitnessMap);
|
|
39
|
+
const [circuitOutput, proof] = await this.createRecursiveProof(inputs, 'BaseParityArtifact', RECURSIVE_PROOF_LENGTH, convertBaseParityInputsToWitnessMap, convertBaseParityOutputsFromWitnessMap);
|
|
41
40
|
const verificationKey = await this.getVerificationKeyDataForCircuit('BaseParityArtifact');
|
|
42
41
|
const vk = new VerificationKeyAsFields(verificationKey.keyAsFields, verificationKey.hash);
|
|
43
42
|
return new RootParityInput(proof, vk, circuitOutput);
|
|
@@ -48,8 +47,7 @@ export class BBNativeRollupProver {
|
|
|
48
47
|
* @returns The public inputs of the parity circuit.
|
|
49
48
|
*/
|
|
50
49
|
async getRootParityProof(inputs) {
|
|
51
|
-
const
|
|
52
|
-
const [circuitOutput, proof] = await this.createRecursiveProof(witnessMap, 'RootParityArtifact', convertRootParityOutputsFromWitnessMap);
|
|
50
|
+
const [circuitOutput, proof] = await this.createRecursiveProof(inputs, 'RootParityArtifact', NESTED_RECURSIVE_PROOF_LENGTH, convertRootParityInputsToWitnessMap, convertRootParityOutputsFromWitnessMap);
|
|
53
51
|
const verificationKey = await this.getVerificationKeyDataForCircuit('RootParityArtifact');
|
|
54
52
|
const vk = new VerificationKeyAsFields(verificationKey.keyAsFields, verificationKey.hash);
|
|
55
53
|
return new RootParityInput(proof, vk, circuitOutput);
|
|
@@ -64,9 +62,7 @@ export class BBNativeRollupProver {
|
|
|
64
62
|
if (kernelOps === undefined) {
|
|
65
63
|
throw new Error(`Unable to prove kernel type ${PublicKernelType[kernelRequest.type]}`);
|
|
66
64
|
}
|
|
67
|
-
const
|
|
68
|
-
const [outputWitness, proof] = await this.createProof(witnessMap, kernelOps.artifact);
|
|
69
|
-
const result = kernelOps.convertOutputs(outputWitness);
|
|
65
|
+
const [result, proof] = await this.createProof(kernelRequest.inputs, kernelOps.artifact, kernelOps.convertInputs, kernelOps.convertOutputs);
|
|
70
66
|
return makePublicInputsAndProof(result, proof);
|
|
71
67
|
}
|
|
72
68
|
/**
|
|
@@ -75,9 +71,7 @@ export class BBNativeRollupProver {
|
|
|
75
71
|
* @returns The requested circuit's public inputs and proof
|
|
76
72
|
*/
|
|
77
73
|
async getPublicTailProof(kernelRequest) {
|
|
78
|
-
const
|
|
79
|
-
const [outputWitness, proof] = await this.createProof(witnessMap, 'PublicKernelTailArtifact');
|
|
80
|
-
const result = convertPublicTailOutputFromWitnessMap(outputWitness);
|
|
74
|
+
const [result, proof] = await this.createProof(kernelRequest.inputs, 'PublicKernelTailArtifact', convertPublicTailInputsToWitnessMap, convertPublicTailOutputFromWitnessMap);
|
|
81
75
|
return makePublicInputsAndProof(result, proof);
|
|
82
76
|
}
|
|
83
77
|
/**
|
|
@@ -86,9 +80,7 @@ export class BBNativeRollupProver {
|
|
|
86
80
|
* @returns The public inputs as outputs of the simulation.
|
|
87
81
|
*/
|
|
88
82
|
async getBaseRollupProof(input) {
|
|
89
|
-
const
|
|
90
|
-
const [outputWitness, proof] = await this.createProof(witnessMap, 'BaseRollupArtifact');
|
|
91
|
-
const result = convertBaseRollupOutputsFromWitnessMap(outputWitness);
|
|
83
|
+
const [result, proof] = await this.createProof(input, 'BaseRollupArtifact', convertBaseRollupInputsToWitnessMap, convertBaseRollupOutputsFromWitnessMap);
|
|
92
84
|
return makePublicInputsAndProof(result, proof);
|
|
93
85
|
}
|
|
94
86
|
/**
|
|
@@ -99,9 +91,7 @@ export class BBNativeRollupProver {
|
|
|
99
91
|
async getMergeRollupProof(input) {
|
|
100
92
|
// verify both inputs
|
|
101
93
|
await Promise.all(input.previousRollupData.map(prev => this.verifyPreviousRollupProof(prev)));
|
|
102
|
-
const
|
|
103
|
-
const [outputWitness, proof] = await this.createProof(witnessMap, 'MergeRollupArtifact');
|
|
104
|
-
const result = convertMergeRollupOutputsFromWitnessMap(outputWitness);
|
|
94
|
+
const [result, proof] = await this.createProof(input, 'MergeRollupArtifact', convertMergeRollupInputsToWitnessMap, convertMergeRollupOutputsFromWitnessMap);
|
|
105
95
|
return makePublicInputsAndProof(result, proof);
|
|
106
96
|
}
|
|
107
97
|
/**
|
|
@@ -112,14 +102,12 @@ export class BBNativeRollupProver {
|
|
|
112
102
|
async getRootRollupProof(input) {
|
|
113
103
|
// verify the inputs
|
|
114
104
|
await Promise.all(input.previousRollupData.map(prev => this.verifyPreviousRollupProof(prev)));
|
|
115
|
-
const
|
|
116
|
-
const [outputWitness, proof] = await this.createProof(witnessMap, 'RootRollupArtifact');
|
|
105
|
+
const [result, proof] = await this.createProof(input, 'RootRollupArtifact', convertRootRollupInputsToWitnessMap, convertRootRollupOutputsFromWitnessMap);
|
|
117
106
|
await this.verifyProof('RootRollupArtifact', proof);
|
|
118
|
-
const result = convertRootRollupOutputsFromWitnessMap(outputWitness);
|
|
119
107
|
return makePublicInputsAndProof(result, proof);
|
|
120
108
|
}
|
|
121
109
|
// TODO(@PhilWindle): Delete when no longer required
|
|
122
|
-
async createProof(
|
|
110
|
+
async createProof(input, circuitType, convertInput, convertOutput) {
|
|
123
111
|
// Create random directory to be used for temp files
|
|
124
112
|
const bbWorkingDirectory = `${this.config.bbWorkingDirectory}/${randomBytes(8).toString('hex')}`;
|
|
125
113
|
await fs.mkdir(bbWorkingDirectory, { recursive: true });
|
|
@@ -131,9 +119,16 @@ export class BBNativeRollupProver {
|
|
|
131
119
|
const simulator = new NativeACVMSimulator(this.config.acvmWorkingDirectory, this.config.acvmBinaryPath, outputWitnessFile);
|
|
132
120
|
const artifact = ServerCircuitArtifacts[circuitType];
|
|
133
121
|
logger.debug(`Generating witness data for ${circuitType}`);
|
|
122
|
+
const witnessMap = convertInput(input);
|
|
134
123
|
const timer = new Timer();
|
|
135
124
|
const outputWitness = await simulator.simulateCircuit(witnessMap, artifact);
|
|
136
|
-
|
|
125
|
+
logger.debug(`Generated witness`, {
|
|
126
|
+
circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
|
|
127
|
+
duration: timer.ms(),
|
|
128
|
+
inputSize: witnessMap.size * Fr.SIZE_IN_BYTES,
|
|
129
|
+
outputSize: outputWitness.size * Fr.SIZE_IN_BYTES,
|
|
130
|
+
eventName: 'circuit-witness-generation',
|
|
131
|
+
});
|
|
137
132
|
// Now prove the circuit from the generated witness
|
|
138
133
|
logger.debug(`Proving ${circuitType}...`);
|
|
139
134
|
const provingResult = await generateProof(this.config.bbBinaryPath, bbWorkingDirectory, circuitType, Buffer.from(artifact.bytecode, 'base64'), outputWitnessFile, logger.debug);
|
|
@@ -142,23 +137,35 @@ export class BBNativeRollupProver {
|
|
|
142
137
|
throw new Error(provingResult.reason);
|
|
143
138
|
}
|
|
144
139
|
// Ensure our vk cache is up to date
|
|
145
|
-
await this.updateVerificationKeyAfterProof(provingResult.vkPath, circuitType);
|
|
140
|
+
const vkData = await this.updateVerificationKeyAfterProof(provingResult.vkPath, circuitType);
|
|
146
141
|
// Read the proof and then cleanup up our temporary directory
|
|
147
|
-
const
|
|
148
|
-
// does not include reading the proof from disk above because duration comes from the bb wrapper
|
|
149
|
-
emitCircuitProvingStats(circuitTypeToCircuitName(circuitType), provingResult.duration, witnessMap.size * Fr.SIZE_IN_BYTES, outputWitness.size * Fr.SIZE_IN_BYTES, proof.length, logger);
|
|
142
|
+
const rawProof = await fs.readFile(`${provingResult.proofPath}/${PROOF_FILENAME}`);
|
|
150
143
|
await fs.rm(bbWorkingDirectory, { recursive: true, force: true });
|
|
151
|
-
|
|
152
|
-
|
|
144
|
+
const output = convertOutput(outputWitness);
|
|
145
|
+
const proof = new Proof(rawProof);
|
|
146
|
+
logger.info(`Generated proof for ${circuitType} in ${provingResult.duration} ms, size: ${proof.buffer.length} fields`, {
|
|
147
|
+
circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
|
|
148
|
+
// does not include reading the proof from disk
|
|
149
|
+
duration: provingResult.duration,
|
|
150
|
+
proofSize: proof.buffer.length,
|
|
151
|
+
eventName: 'circuit-proving',
|
|
152
|
+
inputSize: input.toBuffer().length,
|
|
153
|
+
outputSize: output.toBuffer().length,
|
|
154
|
+
circuitSize: vkData.circuitSize,
|
|
155
|
+
numPublicInputs: vkData.numPublicInputs,
|
|
156
|
+
});
|
|
157
|
+
return [output, proof];
|
|
153
158
|
}
|
|
154
159
|
/**
|
|
155
160
|
* Executes a circuit and returns it's outputs and corresponding proof with embedded aggregation object
|
|
156
161
|
* @param witnessMap - The input witness
|
|
157
162
|
* @param circuitType - The type of circuit to be executed
|
|
163
|
+
* @param proofLength - The length of the proof to be generated. This is a dummy parameter to aid in type checking
|
|
164
|
+
* @param convertInput - Function for mapping the input object to a witness map.
|
|
158
165
|
* @param convertOutput - Function for parsing the output witness to it's corresponding object
|
|
159
166
|
* @returns The circuits output object and it's proof
|
|
160
167
|
*/
|
|
161
|
-
async createRecursiveProof(
|
|
168
|
+
async createRecursiveProof(input, circuitType, proofLength, convertInput, convertOutput) {
|
|
162
169
|
// Create random directory to be used for temp files
|
|
163
170
|
const bbWorkingDirectory = `${this.config.bbWorkingDirectory}/${randomBytes(8).toString('hex')}`;
|
|
164
171
|
await fs.mkdir(bbWorkingDirectory, { recursive: true });
|
|
@@ -172,9 +179,18 @@ export class BBNativeRollupProver {
|
|
|
172
179
|
const artifact = ServerCircuitArtifacts[circuitType];
|
|
173
180
|
logger.debug(`Generating witness data for ${circuitType}`);
|
|
174
181
|
const timer = new Timer();
|
|
182
|
+
const witnessMap = convertInput(input);
|
|
175
183
|
const outputWitness = await simulator.simulateCircuit(witnessMap, artifact);
|
|
176
|
-
|
|
177
|
-
const
|
|
184
|
+
const output = convertOutput(outputWitness);
|
|
185
|
+
const inputSize = input.toBuffer().length;
|
|
186
|
+
const outputSize = output.toBuffer().length;
|
|
187
|
+
logger.debug(`Generated witness`, {
|
|
188
|
+
circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
|
|
189
|
+
duration: timer.ms(),
|
|
190
|
+
inputSize,
|
|
191
|
+
outputSize,
|
|
192
|
+
eventName: 'circuit-witness-generation',
|
|
193
|
+
});
|
|
178
194
|
// Now prove the circuit from the generated witness
|
|
179
195
|
logger.debug(`Proving ${circuitType}...`);
|
|
180
196
|
const provingResult = await generateProof(this.config.bbBinaryPath, bbWorkingDirectory, circuitType, Buffer.from(artifact.bytecode, 'base64'), outputWitnessFile, logger.debug);
|
|
@@ -183,12 +199,20 @@ export class BBNativeRollupProver {
|
|
|
183
199
|
throw new Error(provingResult.reason);
|
|
184
200
|
}
|
|
185
201
|
// Ensure our vk cache is up to date
|
|
186
|
-
await this.updateVerificationKeyAfterProof(provingResult.vkPath, circuitType);
|
|
202
|
+
const vkData = await this.updateVerificationKeyAfterProof(provingResult.vkPath, circuitType);
|
|
187
203
|
// Read the proof and then cleanup up our temporary directory
|
|
188
|
-
const proof = await this.readProofAsFields(provingResult.proofPath, circuitType);
|
|
189
|
-
logger.info(`Generated proof for ${circuitType} in ${provingResult.duration} ms, size: ${proof.proof.length} fields
|
|
190
|
-
|
|
191
|
-
|
|
204
|
+
const proof = await this.readProofAsFields(provingResult.proofPath, circuitType, proofLength);
|
|
205
|
+
logger.info(`Generated proof for ${circuitType} in ${provingResult.duration} ms, size: ${proof.proof.length} fields`, {
|
|
206
|
+
circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
|
|
207
|
+
circuitSize: vkData.circuitSize,
|
|
208
|
+
duration: provingResult.duration,
|
|
209
|
+
inputSize,
|
|
210
|
+
outputSize,
|
|
211
|
+
proofSize: proof.binaryProof.buffer.length,
|
|
212
|
+
eventName: 'circuit-proving',
|
|
213
|
+
numPublicInputs: vkData.numPublicInputs,
|
|
214
|
+
});
|
|
215
|
+
return [output, proof];
|
|
192
216
|
}
|
|
193
217
|
finally {
|
|
194
218
|
await fs.rm(bbWorkingDirectory, { recursive: true, force: true });
|
|
@@ -290,7 +314,7 @@ export class BBNativeRollupProver {
|
|
|
290
314
|
promise = this.convertVk(filePath);
|
|
291
315
|
this.verificationKeys.set(circuitType, promise);
|
|
292
316
|
}
|
|
293
|
-
|
|
317
|
+
return promise;
|
|
294
318
|
}
|
|
295
319
|
/**
|
|
296
320
|
* Parses and returns the proof data stored at the specified directory
|
|
@@ -298,7 +322,7 @@ export class BBNativeRollupProver {
|
|
|
298
322
|
* @param circuitType - The type of circuit proven
|
|
299
323
|
* @returns The proof
|
|
300
324
|
*/
|
|
301
|
-
async readProofAsFields(filePath, circuitType) {
|
|
325
|
+
async readProofAsFields(filePath, circuitType, proofLength) {
|
|
302
326
|
const [binaryProof, proofString] = await Promise.all([
|
|
303
327
|
fs.readFile(`${filePath}/${PROOF_FILENAME}`),
|
|
304
328
|
fs.readFile(`${filePath}/${PROOF_FIELDS_FILENAME}`, { encoding: 'utf-8' }),
|
|
@@ -315,7 +339,10 @@ export class BBNativeRollupProver {
|
|
|
315
339
|
const fieldsWithoutPublicInputs = fields.slice(numPublicInputs);
|
|
316
340
|
logger.debug(`Circuit type: ${circuitType}, complete proof length: ${fields.length}, without public inputs: ${fieldsWithoutPublicInputs.length}, num public inputs: ${numPublicInputs}, circuit size: ${vkData.circuitSize}, is recursive: ${vkData.isRecursive}, raw length: ${binaryProof.length}`);
|
|
317
341
|
const proof = new RecursiveProof(fieldsWithoutPublicInputs, new Proof(binaryProof));
|
|
342
|
+
if (proof.proof.length !== proofLength) {
|
|
343
|
+
throw new Error("Proof length doesn't match expected length");
|
|
344
|
+
}
|
|
318
345
|
return proof;
|
|
319
346
|
}
|
|
320
347
|
}
|
|
321
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfcHJvdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zlci9iYl9wcm92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0NBQWtDO0FBQ2xDLE9BQU8sRUFJTCxnQkFBZ0IsRUFFaEIsd0JBQXdCLEdBQ3pCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUlMLEVBQUUsRUFNRixLQUFLLEVBR0wsY0FBYyxFQUNkLFdBQVcsRUFDWCxlQUFlLEVBS2YsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsc0JBQXNCLEVBRXRCLG1DQUFtQyxFQUNuQyxzQ0FBc0MsRUFDdEMsbUNBQW1DLEVBQ25DLHNDQUFzQyxFQUN0QyxvQ0FBb0MsRUFDcEMsdUNBQXVDLEVBQ3ZDLG1DQUFtQyxFQUNuQyxxQ0FBcUMsRUFDckMsbUNBQW1DLEVBQ25DLHNDQUFzQyxFQUN0QyxtQ0FBbUMsRUFDbkMsc0NBQXNDLEdBQ3ZDLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbEMsT0FBTyxFQUNMLFNBQVMsRUFDVCxxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gseUJBQXlCLEVBQ3pCLGFBQWEsRUFDYixXQUFXLEdBQ1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkgsT0FBTyxFQUNMLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IsdUJBQXVCLEVBQ3ZCLGtCQUFrQixHQUVuQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFcEQsTUFBTSw0QkFBNEIsR0FBZ0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7QUFXbEc7O0dBRUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBSy9CLFlBQW9CLE1BQXNCO1FBQXRCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBSmxDLHFCQUFnQixHQUE4RCxJQUFJLEdBQUcsRUFHMUYsQ0FBQztJQUN5QyxDQUFDO0lBRTlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQXNCO1FBQ3JDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLE1BQU0sQ0FBQyxZQUFZLDBCQUEwQixNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLE1BQU0sQ0FBQyxjQUFjLDBCQUEwQixNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBRWxILE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUF3QjtRQUN0RCxNQUFNLFVBQVUsR0FBRyxtQ0FBbUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvRCxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUM1RCxVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLHNDQUFzQyxDQUN2QyxDQUFDO1FBRUYsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUUxRixNQUFNLEVBQUUsR0FBRyxJQUFJLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFGLE9BQU8sSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FDN0IsTUFBd0I7UUFFeEIsTUFBTSxVQUFVLEdBQUcsbUNBQW1DLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0QsTUFBTSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FHNUQsVUFBVSxFQUFFLG9CQUFvQixFQUFFLHNDQUFzQyxDQUFDLENBQUM7UUFFNUUsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUUxRixNQUFNLEVBQUUsR0FBRyxJQUFJLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFGLE9BQU8sSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxvQkFBb0IsQ0FDL0IsYUFBeUM7UUFFekMsTUFBTSxTQUFTLEdBQUcsMkJBQTJCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xFLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWpFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdEYsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RCxPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FDN0IsYUFBc0M7UUFFdEMsTUFBTSxVQUFVLEdBQUcsbUNBQW1DLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBRTlGLE1BQU0sTUFBTSxHQUFHLHFDQUFxQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sd0JBQXdCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLGtCQUFrQixDQUM3QixLQUF1QjtRQUV2QixNQUFNLFVBQVUsR0FBRyxtQ0FBbUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUV4RixNQUFNLE1BQU0sR0FBRyxzQ0FBc0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVyRSxPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxtQkFBbUIsQ0FDOUIsS0FBd0I7UUFFeEIscUJBQXFCO1FBQ3JCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RixNQUFNLFVBQVUsR0FBRyxvQ0FBb0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvRCxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUV6RixNQUFNLE1BQU0sR0FBRyx1Q0FBdUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0RSxPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUF1QjtRQUNyRCxvQkFBb0I7UUFDcEIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlGLE1BQU0sVUFBVSxHQUFHLG1DQUFtQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlELE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBRXhGLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwRCxNQUFNLE1BQU0sR0FBRyxzQ0FBc0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyRSxPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsb0RBQW9EO0lBQzdDLEtBQUssQ0FBQyxXQUFXLENBQUMsVUFBc0IsRUFBRSxXQUFtQztRQUNsRixvREFBb0Q7UUFDcEQsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pHLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXhELE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXBDLCtDQUErQztRQUMvQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsa0JBQWtCLHFCQUFxQixDQUFDO1FBRXJFLDhDQUE4QztRQUM5QyxnSkFBZ0o7UUFDaEosTUFBTSxTQUFTLEdBQUcsSUFBSSxtQkFBbUIsQ0FDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQzFCLGlCQUFpQixDQUNsQixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFckQsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUUzRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzFCLE1BQU0sYUFBYSxHQUFHLE1BQU0sU0FBUyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUUsaUNBQWlDLENBQy9CLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxFQUNyQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQ1YsVUFBVSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsYUFBYSxFQUNsQyxhQUFhLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQ3JDLE1BQU0sQ0FDUCxDQUFDO1FBRUYsbURBQW1EO1FBQ25ELE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxXQUFXLEtBQUssQ0FBQyxDQUFDO1FBRTFDLE1BQU0sYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFDeEIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQ3hDLGlCQUFpQixFQUNqQixNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7UUFFRixJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLFdBQVcsS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sSUFBSSxDQUFDLCtCQUErQixDQUFDLGFBQWEsQ0FBQyxNQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFL0UsNkRBQTZEO1FBQzdELE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxTQUFVLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQztRQUVqRixnR0FBZ0c7UUFDaEcsdUJBQXVCLENBQ3JCLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxFQUNyQyxhQUFhLENBQUMsUUFBUSxFQUN0QixVQUFVLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQ2xDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFDckMsS0FBSyxDQUFDLE1BQU0sRUFDWixNQUFNLENBQ1AsQ0FBQztRQUVGLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFbEUsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsV0FBVyxPQUFPLGFBQWEsQ0FBQyxRQUFRLGNBQWMsS0FBSyxDQUFDLE1BQU0sU0FBUyxDQUFDLENBQUM7UUFFaEgsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsb0JBQW9CLENBQy9CLFVBQXNCLEVBQ3RCLFdBQW1DLEVBQ25DLGFBQStEO1FBRS9ELG9EQUFvRDtRQUNwRCxNQUFNLGtCQUFrQixHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakcsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFeEQsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFcEMsSUFBSSxDQUFDO1lBQ0gsK0NBQStDO1lBQy9DLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxrQkFBa0IscUJBQXFCLENBQUM7WUFFckUsOENBQThDO1lBQzlDLGdKQUFnSjtZQUNoSixNQUFNLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixDQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFDMUIsaUJBQWlCLENBQ2xCLENBQUM7WUFFRixNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVyRCxNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBRTNELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDMUIsTUFBTSxhQUFhLEdBQUcsTUFBTSxTQUFTLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUU1RSxpQ0FBaUMsQ0FDL0Isd0JBQXdCLENBQUMsV0FBVyxDQUFDLEVBQ3JDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFDVixVQUFVLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQ2xDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFDckMsTUFBTSxDQUNQLENBQUM7WUFFRixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFaEQsbURBQW1EO1lBQ25ELE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxXQUFXLEtBQUssQ0FBQyxDQUFDO1lBRTFDLE1BQU0sYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFDeEIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQ3hDLGlCQUFpQixFQUNqQixNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7WUFFRixJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMvQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxXQUFXLEtBQUssYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3JGLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFFRCxvQ0FBb0M7WUFDcEMsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsYUFBYSxDQUFDLE1BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUUvRSw2REFBNkQ7WUFDN0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQWUsYUFBYSxDQUFDLFNBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUVoRyxNQUFNLENBQUMsSUFBSSxDQUNULHVCQUF1QixXQUFXLE9BQU8sYUFBYSxDQUFDLFFBQVEsY0FBYyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sU0FBUyxDQUN6RyxDQUFDO1lBRUYsdUJBQXVCLENBQ3JCLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxFQUNyQyxhQUFhLENBQUMsUUFBUSxFQUN0QixVQUFVLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQ2xDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFDckMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUMvQixNQUFNLENBQ1AsQ0FBQztZQUVGLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQW1DLEVBQUUsS0FBWTtRQUN4RSxvREFBb0Q7UUFDcEQsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pHLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXhELE1BQU0sYUFBYSxHQUFHLEdBQUcsa0JBQWtCLFFBQVEsQ0FBQztRQUNwRCxNQUFNLG1CQUFtQixHQUFHLEdBQUcsa0JBQWtCLEtBQUssQ0FBQztRQUN2RCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVqRixNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV2RSxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBFLE1BQU0sV0FBVyxHQUFHLENBQUMsT0FBZSxFQUFFLEVBQUU7WUFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLFdBQVcsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxtQkFBb0IsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUU3RyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLFdBQVcsU0FBUyxDQUFDO1lBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLFdBQVcsYUFBYSxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxXQUFtQztRQUMzRSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RSxPQUFPLElBQUksdUJBQXVCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxrQkFBc0M7UUFDNUUsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1FBQ3ZDLE1BQU0sV0FBVyxHQUNmLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsSUFBSTtZQUM5RSxDQUFDLENBQUMsb0JBQW9CO1lBQ3RCLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQztRQUM1QixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLGdDQUFnQyxDQUFDLFdBQW1DO1FBQ2hGLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxHQUFHLHlCQUF5QixDQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFDOUIsV0FBVyxFQUNYLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxFQUNuQyxJQUFJLEVBQ0osTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDZCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxXQUFXLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzlGLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFPLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLE1BQU0sT0FBTyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFnQjtRQUN0QyxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUMvQyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxJQUFJLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDdkUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsSUFBSSxXQUFXLEVBQUUsQ0FBQztTQUMxQyxDQUFDLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLGdFQUFnRTtRQUNoRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLEVBQUUsR0FBd0I7WUFDOUIsSUFBSSxFQUFFLE1BQU07WUFDWixXQUFXLEVBQUUsUUFBK0Q7WUFDNUUsVUFBVSxFQUFFLFNBQVM7WUFDckIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUM5RCxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2pELFdBQVcsRUFBRSxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRztTQUN6RCxDQUFDO1FBQ0YsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxRQUFnQixFQUFFLFdBQW1DO1FBQ2pHLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELE1BQU0sT0FBTyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxpQkFBaUIsQ0FDN0IsUUFBZ0IsRUFDaEIsV0FBbUM7UUFFbkMsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDbkQsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUM1QyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxJQUFJLHFCQUFxQixFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7U0FDM0UsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsNEJBQTRCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUNuRSxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWU7WUFDeEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsdUJBQXVCLENBQUM7UUFDckQsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxLQUFLLENBQ1YsaUJBQWlCLFdBQVcsNEJBQTRCLE1BQU0sQ0FBQyxNQUFNLDRCQUE0Qix5QkFBeUIsQ0FBQyxNQUFNLHdCQUF3QixlQUFlLG1CQUFtQixNQUFNLENBQUMsV0FBVyxtQkFBbUIsTUFBTSxDQUFDLFdBQVcsaUJBQWlCLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FDeFIsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksY0FBYyxDQUFlLHlCQUF5QixFQUFFLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbEcsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YifQ==
|
|
348
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfcHJvdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zlci9iYl9wcm92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0NBQWtDO0FBQ2xDLE9BQU8sRUFJTCxnQkFBZ0IsRUFFaEIsd0JBQXdCLEdBQ3pCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUlMLEVBQUUsRUFHRiw2QkFBNkIsRUFFN0IsS0FBSyxFQUVMLHNCQUFzQixFQUN0QixjQUFjLEVBQ2QsV0FBVyxFQUNYLGVBQWUsRUFLZix1QkFBdUIsR0FDeEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFDTCxzQkFBc0IsRUFFdEIsbUNBQW1DLEVBQ25DLHNDQUFzQyxFQUN0QyxtQ0FBbUMsRUFDbkMsc0NBQXNDLEVBQ3RDLG9DQUFvQyxFQUNwQyx1Q0FBdUMsRUFDdkMsbUNBQW1DLEVBQ25DLHFDQUFxQyxFQUNyQyxtQ0FBbUMsRUFDbkMsc0NBQXNDLEVBQ3RDLG1DQUFtQyxFQUNuQyxzQ0FBc0MsR0FDdkMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd2RCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsQyxPQUFPLEVBQ0wsU0FBUyxFQUNULHFCQUFxQixFQUNyQixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCx5QkFBeUIsRUFDekIsYUFBYSxFQUNiLFdBQVcsR0FDWixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLDJCQUEyQixFQUMzQix1QkFBdUIsRUFDdkIsa0JBQWtCLEdBRW5CLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUVwRCxNQUFNLDRCQUE0QixHQUFnQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztBQVdsRzs7R0FFRztBQUNILE1BQU0sT0FBTyxvQkFBb0I7SUFLL0IsWUFBb0IsTUFBc0I7UUFBdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFKbEMscUJBQWdCLEdBQThELElBQUksR0FBRyxFQUcxRixDQUFDO0lBQ3lDLENBQUM7SUFFOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBc0I7UUFDckMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakUsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsTUFBTSxDQUFDLFlBQVksMEJBQTBCLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDNUcsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsTUFBTSxDQUFDLGNBQWMsMEJBQTBCLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFFbEgsT0FBTyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQXdCO1FBQ3RELE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQzVELE1BQU0sRUFDTixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLG1DQUFtQyxFQUNuQyxzQ0FBc0MsQ0FDdkMsQ0FBQztRQUVGLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFMUYsTUFBTSxFQUFFLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxRixPQUFPLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQzdCLE1BQXdCO1FBRXhCLE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQzVELE1BQU0sRUFDTixvQkFBb0IsRUFDcEIsNkJBQTZCLEVBQzdCLG1DQUFtQyxFQUNuQyxzQ0FBc0MsQ0FDdkMsQ0FBQztRQUVGLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFMUYsTUFBTSxFQUFFLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxRixPQUFPLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsb0JBQW9CLENBQy9CLGFBQXlDO1FBRXpDLE1BQU0sU0FBUyxHQUFHLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRSxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FDNUMsYUFBYSxDQUFDLE1BQU0sRUFDcEIsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLGFBQWEsRUFDdkIsU0FBUyxDQUFDLGNBQWMsQ0FDekIsQ0FBQztRQUVGLE9BQU8sd0JBQXdCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLGtCQUFrQixDQUM3QixhQUFzQztRQUV0QyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FDNUMsYUFBYSxDQUFDLE1BQU0sRUFDcEIsMEJBQTBCLEVBQzFCLG1DQUFtQyxFQUNuQyxxQ0FBcUMsQ0FDdEMsQ0FBQztRQUVGLE9BQU8sd0JBQXdCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLGtCQUFrQixDQUM3QixLQUF1QjtRQUV2QixNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FDNUMsS0FBSyxFQUNMLG9CQUFvQixFQUNwQixtQ0FBbUMsRUFDbkMsc0NBQXNDLENBQ3ZDLENBQUM7UUFFRixPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxtQkFBbUIsQ0FDOUIsS0FBd0I7UUFFeEIscUJBQXFCO1FBQ3JCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RixNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FDNUMsS0FBSyxFQUNMLHFCQUFxQixFQUNyQixvQ0FBb0MsRUFDcEMsdUNBQXVDLENBQ3hDLENBQUM7UUFFRixPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUF1QjtRQUNyRCxvQkFBb0I7UUFDcEIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlGLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUM1QyxLQUFLLEVBQ0wsb0JBQW9CLEVBQ3BCLG1DQUFtQyxFQUNuQyxzQ0FBc0MsQ0FDdkMsQ0FBQztRQUVGLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwRCxPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsb0RBQW9EO0lBQzdDLEtBQUssQ0FBQyxXQUFXLENBQ3RCLEtBQVksRUFDWixXQUFtQyxFQUNuQyxZQUEwQyxFQUMxQyxhQUFvRDtRQUVwRCxvREFBb0Q7UUFDcEQsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pHLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXhELE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXBDLCtDQUErQztRQUMvQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsa0JBQWtCLHFCQUFxQixDQUFDO1FBRXJFLDhDQUE4QztRQUM5QyxnSkFBZ0o7UUFDaEosTUFBTSxTQUFTLEdBQUcsSUFBSSxtQkFBbUIsQ0FDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQzFCLGlCQUFpQixDQUNsQixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFckQsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUMxQixNQUFNLGFBQWEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUU7WUFDaEMsV0FBVyxFQUFFLG9DQUFvQyxDQUFDLFdBQVcsQ0FBQztZQUM5RCxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUNwQixTQUFTLEVBQUUsVUFBVSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsYUFBYTtZQUM3QyxVQUFVLEVBQUUsYUFBYSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsYUFBYTtZQUNqRCxTQUFTLEVBQUUsNEJBQTRCO1NBQ0EsQ0FBQyxDQUFDO1FBRTNDLG1EQUFtRDtRQUNuRCxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsV0FBVyxLQUFLLENBQUMsQ0FBQztRQUUxQyxNQUFNLGFBQWEsR0FBRyxNQUFNLGFBQWEsQ0FDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQ3hCLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUN4QyxpQkFBaUIsRUFDakIsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO1FBRUYsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxXQUFXLEtBQUssYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDckYsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUVELG9DQUFvQztRQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxhQUFhLENBQUMsTUFBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTlGLDZEQUE2RDtRQUM3RCxNQUFNLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxhQUFhLENBQUMsU0FBVSxJQUFJLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFFcEYsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVsRSxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FDVCx1QkFBdUIsV0FBVyxPQUFPLGFBQWEsQ0FBQyxRQUFRLGNBQWMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsRUFDekc7WUFDRSxXQUFXLEVBQUUsb0NBQW9DLENBQUMsV0FBVyxDQUFDO1lBQzlELCtDQUErQztZQUMvQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7WUFDaEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUM5QixTQUFTLEVBQUUsaUJBQWlCO1lBQzVCLFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTTtZQUNsQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU07WUFDcEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1lBQy9CLGVBQWUsRUFBRSxNQUFNLENBQUMsZUFBZTtTQUNWLENBQ2hDLENBQUM7UUFFRixPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLEtBQUssQ0FBQyxvQkFBb0IsQ0FLL0IsS0FBdUIsRUFDdkIsV0FBbUMsRUFDbkMsV0FBeUIsRUFDekIsWUFBcUQsRUFDckQsYUFBK0Q7UUFFL0Qsb0RBQW9EO1FBQ3BELE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV4RCxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUM7WUFDSCwrQ0FBK0M7WUFDL0MsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLGtCQUFrQixxQkFBcUIsQ0FBQztZQUVyRSw4Q0FBOEM7WUFDOUMsZ0pBQWdKO1lBQ2hKLE1BQU0sU0FBUyxHQUFHLElBQUksbUJBQW1CLENBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUMxQixpQkFBaUIsQ0FDbEIsQ0FBQztZQUVGLE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXJELE1BQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFFM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMxQixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsTUFBTSxhQUFhLEdBQUcsTUFBTSxTQUFTLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUU1RSxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFNUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ2hDLFdBQVcsRUFBRSxvQ0FBb0MsQ0FBQyxXQUFXLENBQUM7Z0JBQzlELFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO2dCQUNwQixTQUFTO2dCQUNULFVBQVU7Z0JBQ1YsU0FBUyxFQUFFLDRCQUE0QjthQUNBLENBQUMsQ0FBQztZQUUzQyxtREFBbUQ7WUFDbkQsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLFdBQVcsS0FBSyxDQUFDLENBQUM7WUFFMUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxhQUFhLENBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUN4QixrQkFBa0IsRUFDbEIsV0FBVyxFQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFDeEMsaUJBQWlCLEVBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQ2IsQ0FBQztZQUVGLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLFdBQVcsS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDckYsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUVELG9DQUFvQztZQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxhQUFhLENBQUMsTUFBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRTlGLDZEQUE2RDtZQUM3RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsU0FBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUUvRixNQUFNLENBQUMsSUFBSSxDQUNULHVCQUF1QixXQUFXLE9BQU8sYUFBYSxDQUFDLFFBQVEsY0FBYyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sU0FBUyxFQUN4RztnQkFDRSxXQUFXLEVBQUUsb0NBQW9DLENBQUMsV0FBVyxDQUFDO2dCQUM5RCxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7Z0JBQy9CLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtnQkFDaEMsU0FBUztnQkFDVCxVQUFVO2dCQUNWLFNBQVMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNO2dCQUMxQyxTQUFTLEVBQUUsaUJBQWlCO2dCQUM1QixlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7YUFDVixDQUNoQyxDQUFDO1lBRUYsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxXQUFXLENBQUMsV0FBbUMsRUFBRSxLQUFZO1FBQ3hFLG9EQUFvRDtRQUNwRCxNQUFNLGtCQUFrQixHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakcsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFeEQsTUFBTSxhQUFhLEdBQUcsR0FBRyxrQkFBa0IsUUFBUSxDQUFDO1FBQ3BELE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxrQkFBa0IsS0FBSyxDQUFDO1FBQ3ZELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpGLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXZFLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFcEUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRTtZQUN0QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsV0FBVyxhQUFhLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLG1CQUFvQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTdHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFbEUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QyxNQUFNLFlBQVksR0FBRyxvQkFBb0IsV0FBVyxTQUFTLENBQUM7WUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsV0FBVyxhQUFhLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLDRCQUE0QixDQUFDLFdBQW1DO1FBQzNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU8sS0FBSyxDQUFDLHlCQUF5QixDQUFDLGtCQUFzQztRQUM1RSxNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7UUFDdkMsTUFBTSxXQUFXLEdBQ2Ysa0JBQWtCLENBQUMsNkJBQTZCLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FBQyxJQUFJO1lBQzlFLENBQUMsQ0FBQyxvQkFBb0I7WUFDdEIsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO1FBQzVCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsV0FBbUM7UUFDaEYsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPLEdBQUcseUJBQXlCLENBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUM5QixXQUFXLEVBQ1gsc0JBQXNCLENBQUMsV0FBVyxDQUFDLEVBQ25DLElBQUksRUFDSixNQUFNLENBQUMsS0FBSyxDQUNiLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNkLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLFdBQVcsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDOUYsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU8sQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELE9BQU8sTUFBTSxPQUFPLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQWdCO1FBQ3RDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQy9DLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLElBQUksa0JBQWtCLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUN2RSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxJQUFJLFdBQVcsRUFBRSxDQUFDO1NBQzFDLENBQUMsQ0FBQztRQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDN0MsZ0VBQWdFO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sRUFBRSxHQUF3QjtZQUM5QixJQUFJLEVBQUUsTUFBTTtZQUNaLFdBQVcsRUFBRSxRQUErRDtZQUM1RSxVQUFVLEVBQUUsU0FBUztZQUNyQixlQUFlLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQzlELFdBQVcsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDakQsV0FBVyxFQUFFLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHO1NBQ3pELENBQUM7UUFDRixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLCtCQUErQixDQUMzQyxRQUFnQixFQUNoQixXQUFtQztRQUVuQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxLQUFLLENBQUMsaUJBQWlCLENBQzdCLFFBQWdCLEVBQ2hCLFdBQW1DLEVBQ25DLFdBQXlCO1FBRXpCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ25ELEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLElBQUksY0FBYyxFQUFFLENBQUM7WUFDNUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsSUFBSSxxQkFBcUIsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO1NBQzNFLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDbkUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlO1lBQ3hCLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLHVCQUF1QixDQUFDO1FBQ3JELE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoRSxNQUFNLENBQUMsS0FBSyxDQUNWLGlCQUFpQixXQUFXLDRCQUE0QixNQUFNLENBQUMsTUFBTSw0QkFBNEIseUJBQXlCLENBQUMsTUFBTSx3QkFBd0IsZUFBZSxtQkFBbUIsTUFBTSxDQUFDLFdBQVcsbUJBQW1CLE1BQU0sQ0FBQyxXQUFXLGlCQUFpQixXQUFXLENBQUMsTUFBTSxFQUFFLENBQ3hSLENBQUM7UUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLGNBQWMsQ0FBZSx5QkFBeUIsRUFBRSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ2xHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiJ9
|
package/dest/stats.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { type PublicKernelRequest } from '@aztec/circuit-types';
|
|
2
2
|
import type { CircuitName } from '@aztec/circuit-types/stats';
|
|
3
|
-
import { type
|
|
4
|
-
import { type ServerProtocolArtifact } from '@aztec/noir-protocol-circuits-types';
|
|
5
|
-
export declare function emitCircuitWitnessGenerationStats(circuitName: CircuitName, duration: number, inputSize: number, outputSize: number, logger: Logger): void;
|
|
6
|
-
export declare function emitCircuitProvingStats(circuitName: CircuitName, duration: number, inputSize: number, outputSize: number, proofSize: number, logger: Logger): void;
|
|
3
|
+
import { type ClientProtocolArtifact, type ServerProtocolArtifact } from '@aztec/noir-protocol-circuits-types';
|
|
7
4
|
export declare function mapPublicKernelToCircuitName(kernelType: PublicKernelRequest['type']): CircuitName;
|
|
8
|
-
export declare function
|
|
5
|
+
export declare function mapProtocolArtifactNameToCircuitName(artifact: ServerProtocolArtifact | ClientProtocolArtifact): CircuitName;
|
|
9
6
|
//# sourceMappingURL=stats.d.ts.map
|
package/dest/stats.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAE/G,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,WAAW,CAajG;AAED,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,sBAAsB,GAAG,sBAAsB,GACxD,WAAW,CAuCb"}
|
package/dest/stats.js
CHANGED
|
@@ -1,25 +1,4 @@
|
|
|
1
1
|
import { PublicKernelType } from '@aztec/circuit-types';
|
|
2
|
-
export function emitCircuitWitnessGenerationStats(circuitName, duration, inputSize, outputSize, logger) {
|
|
3
|
-
const stats = {
|
|
4
|
-
eventName: 'circuit-witness-generation',
|
|
5
|
-
circuitName,
|
|
6
|
-
inputSize,
|
|
7
|
-
outputSize,
|
|
8
|
-
duration,
|
|
9
|
-
};
|
|
10
|
-
logger.debug('Circuit witness generation stats', stats);
|
|
11
|
-
}
|
|
12
|
-
export function emitCircuitProvingStats(circuitName, duration, inputSize, outputSize, proofSize, logger) {
|
|
13
|
-
const stats = {
|
|
14
|
-
eventName: 'circuit-proving',
|
|
15
|
-
circuitName,
|
|
16
|
-
duration,
|
|
17
|
-
inputSize,
|
|
18
|
-
outputSize,
|
|
19
|
-
proofSize,
|
|
20
|
-
};
|
|
21
|
-
logger.debug('Circuit proving stats', stats);
|
|
22
|
-
}
|
|
23
2
|
export function mapPublicKernelToCircuitName(kernelType) {
|
|
24
3
|
switch (kernelType) {
|
|
25
4
|
case PublicKernelType.SETUP:
|
|
@@ -34,8 +13,8 @@ export function mapPublicKernelToCircuitName(kernelType) {
|
|
|
34
13
|
throw new Error(`Unknown kernel type: ${kernelType}`);
|
|
35
14
|
}
|
|
36
15
|
}
|
|
37
|
-
export function
|
|
38
|
-
switch (
|
|
16
|
+
export function mapProtocolArtifactNameToCircuitName(artifact) {
|
|
17
|
+
switch (artifact) {
|
|
39
18
|
case 'BaseParityArtifact':
|
|
40
19
|
return 'base-parity';
|
|
41
20
|
case 'RootParityArtifact':
|
|
@@ -54,8 +33,24 @@ export function circuitTypeToCircuitName(circuitType) {
|
|
|
54
33
|
return 'public-kernel-teardown';
|
|
55
34
|
case 'PublicKernelTailArtifact':
|
|
56
35
|
return 'public-kernel-tail';
|
|
36
|
+
case 'PrivateKernelInitArtifact':
|
|
37
|
+
return 'private-kernel-init';
|
|
38
|
+
case 'PrivateKernelInnerArtifact':
|
|
39
|
+
return 'private-kernel-inner';
|
|
40
|
+
case 'PrivateKernelTailArtifact':
|
|
41
|
+
return 'private-kernel-tail';
|
|
42
|
+
case 'PrivateKernelTailToPublicArtifact':
|
|
43
|
+
return 'private-kernel-tail-to-public';
|
|
44
|
+
case 'PrivateKernelResetFullArtifact':
|
|
45
|
+
return 'private-kernel-reset-full';
|
|
46
|
+
case 'PrivateKernelResetBigArtifact':
|
|
47
|
+
return 'private-kernel-reset-big';
|
|
48
|
+
case 'PrivateKernelResetMediumArtifact':
|
|
49
|
+
return 'private-kernel-reset-medium';
|
|
50
|
+
case 'PrivateKernelResetSmallArtifact':
|
|
51
|
+
return 'private-kernel-reset-small';
|
|
57
52
|
default:
|
|
58
|
-
throw new Error(`Unknown circuit type: ${
|
|
53
|
+
throw new Error(`Unknown circuit type: ${artifact}`);
|
|
59
54
|
}
|
|
60
55
|
}
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RhdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSWxGLE1BQU0sVUFBVSw0QkFBNEIsQ0FBQyxVQUF1QztJQUNsRixRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ25CLEtBQUssZ0JBQWdCLENBQUMsS0FBSztZQUN6QixPQUFPLHFCQUFxQixDQUFDO1FBQy9CLEtBQUssZ0JBQWdCLENBQUMsU0FBUztZQUM3QixPQUFPLHlCQUF5QixDQUFDO1FBQ25DLEtBQUssZ0JBQWdCLENBQUMsUUFBUTtZQUM1QixPQUFPLHdCQUF3QixDQUFDO1FBQ2xDLEtBQUssZ0JBQWdCLENBQUMsSUFBSTtZQUN4QixPQUFPLG9CQUFvQixDQUFDO1FBQzlCO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxvQ0FBb0MsQ0FDbEQsUUFBeUQ7SUFFekQsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLG9CQUFvQjtZQUN2QixPQUFPLGFBQWEsQ0FBQztRQUN2QixLQUFLLG9CQUFvQjtZQUN2QixPQUFPLGFBQWEsQ0FBQztRQUN2QixLQUFLLG9CQUFvQjtZQUN2QixPQUFPLGFBQWEsQ0FBQztRQUN2QixLQUFLLHFCQUFxQjtZQUN4QixPQUFPLGNBQWMsQ0FBQztRQUN4QixLQUFLLG9CQUFvQjtZQUN2QixPQUFPLGFBQWEsQ0FBQztRQUN2QixLQUFLLDJCQUEyQjtZQUM5QixPQUFPLHFCQUFxQixDQUFDO1FBQy9CLEtBQUssOEJBQThCO1lBQ2pDLE9BQU8seUJBQXlCLENBQUM7UUFDbkMsS0FBSyw4QkFBOEI7WUFDakMsT0FBTyx3QkFBd0IsQ0FBQztRQUNsQyxLQUFLLDBCQUEwQjtZQUM3QixPQUFPLG9CQUFvQixDQUFDO1FBQzlCLEtBQUssMkJBQTJCO1lBQzlCLE9BQU8scUJBQXFCLENBQUM7UUFDL0IsS0FBSyw0QkFBNEI7WUFDL0IsT0FBTyxzQkFBc0IsQ0FBQztRQUNoQyxLQUFLLDJCQUEyQjtZQUM5QixPQUFPLHFCQUFxQixDQUFDO1FBQy9CLEtBQUssbUNBQW1DO1lBQ3RDLE9BQU8sK0JBQStCLENBQUM7UUFDekMsS0FBSyxnQ0FBZ0M7WUFDbkMsT0FBTywyQkFBMkIsQ0FBQztRQUNyQyxLQUFLLCtCQUErQjtZQUNsQyxPQUFPLDBCQUEwQixDQUFDO1FBQ3BDLEtBQUssa0NBQWtDO1lBQ3JDLE9BQU8sNkJBQTZCLENBQUM7UUFDdkMsS0FBSyxpQ0FBaUM7WUFDcEMsT0FBTyw0QkFBNEIsQ0FBQztRQUN0QztZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztBQUNILENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/bb-prover",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.41.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js"
|
|
@@ -51,11 +51,11 @@
|
|
|
51
51
|
]
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@aztec/circuit-types": "0.
|
|
55
|
-
"@aztec/circuits.js": "0.
|
|
56
|
-
"@aztec/foundation": "0.
|
|
57
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
58
|
-
"@aztec/simulator": "0.
|
|
54
|
+
"@aztec/circuit-types": "0.41.0",
|
|
55
|
+
"@aztec/circuits.js": "0.41.0",
|
|
56
|
+
"@aztec/foundation": "0.41.0",
|
|
57
|
+
"@aztec/noir-protocol-circuits-types": "0.41.0",
|
|
58
|
+
"@aztec/simulator": "0.41.0",
|
|
59
59
|
"@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi",
|
|
60
60
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
61
61
|
"commander": "^9.0.0",
|
package/src/bb/execute.ts
CHANGED
|
@@ -32,6 +32,12 @@ export type BBFailure = {
|
|
|
32
32
|
|
|
33
33
|
export type BBResult = BBSuccess | BBFailure;
|
|
34
34
|
|
|
35
|
+
type BBExecResult = {
|
|
36
|
+
status: BB_RESULT;
|
|
37
|
+
exitCode: number;
|
|
38
|
+
signal: string | undefined;
|
|
39
|
+
};
|
|
40
|
+
|
|
35
41
|
/**
|
|
36
42
|
* Invokes the Barretenberg binary with the provided command and args
|
|
37
43
|
* @param pathToBB - The path to the BB binary
|
|
@@ -47,26 +53,20 @@ export function executeBB(
|
|
|
47
53
|
args: string[],
|
|
48
54
|
logger: LogFn,
|
|
49
55
|
resultParser = (code: number) => code === 0,
|
|
50
|
-
) {
|
|
51
|
-
return new Promise<
|
|
56
|
+
): Promise<BBExecResult> {
|
|
57
|
+
return new Promise<BBExecResult>(resolve => {
|
|
52
58
|
// spawn the bb process
|
|
53
|
-
const bb = proc.spawn(pathToBB, [command, ...args]
|
|
54
|
-
|
|
55
|
-
const message = data.toString('utf-8').replace(/\n$/, '');
|
|
56
|
-
logger(message);
|
|
59
|
+
const bb = proc.spawn(pathToBB, [command, ...args], {
|
|
60
|
+
stdio: 'pipe',
|
|
57
61
|
});
|
|
58
|
-
bb.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
});
|
|
62
|
-
bb.on('close', (code: number) => {
|
|
63
|
-
if (resultParser(code)) {
|
|
64
|
-
resolve(BB_RESULT.SUCCESS);
|
|
62
|
+
bb.on('close', (exitCode: number, signal?: string) => {
|
|
63
|
+
if (resultParser(exitCode)) {
|
|
64
|
+
resolve({ status: BB_RESULT.SUCCESS, exitCode, signal });
|
|
65
65
|
} else {
|
|
66
|
-
|
|
66
|
+
resolve({ status: BB_RESULT.FAILURE, exitCode, signal });
|
|
67
67
|
}
|
|
68
68
|
});
|
|
69
|
-
}).catch(_ => BB_RESULT.FAILURE);
|
|
69
|
+
}).catch(_ => ({ status: BB_RESULT.FAILURE, exitCode: -1, signal: undefined }));
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
const bytecodeHashFilename = 'bytecode_hash';
|
|
@@ -154,14 +154,14 @@ export async function generateKeyForNoirCircuit(
|
|
|
154
154
|
const timer = new Timer();
|
|
155
155
|
let result = await executeBB(pathToBB, `write_${key}`, args, log);
|
|
156
156
|
// If we succeeded and the type of key if verification, have bb write the 'fields' version too
|
|
157
|
-
if (result == BB_RESULT.SUCCESS && key === 'vk') {
|
|
157
|
+
if (result.status == BB_RESULT.SUCCESS && key === 'vk') {
|
|
158
158
|
const asFieldsArgs = ['-k', `${outputPath}/${VK_FILENAME}`, '-o', `${outputPath}/${VK_FIELDS_FILENAME}`, '-v'];
|
|
159
159
|
result = await executeBB(pathToBB, `vk_as_fields`, asFieldsArgs, log);
|
|
160
160
|
}
|
|
161
161
|
const duration = timer.ms();
|
|
162
162
|
// Cleanup the bytecode file
|
|
163
163
|
await fs.rm(bytecodePath, { force: true });
|
|
164
|
-
if (result == BB_RESULT.SUCCESS) {
|
|
164
|
+
if (result.status == BB_RESULT.SUCCESS) {
|
|
165
165
|
// Store the bytecode hash so we don't need to regenerate at a later time
|
|
166
166
|
await fs.writeFile(bytecodeHashPath, bytecodeHash);
|
|
167
167
|
return {
|
|
@@ -173,7 +173,10 @@ export async function generateKeyForNoirCircuit(
|
|
|
173
173
|
};
|
|
174
174
|
}
|
|
175
175
|
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
176
|
-
return {
|
|
176
|
+
return {
|
|
177
|
+
status: BB_RESULT.FAILURE,
|
|
178
|
+
reason: `Failed to generate key. Exit code: ${result.exitCode}. Signal ${result.signal}.`,
|
|
179
|
+
};
|
|
177
180
|
} catch (error) {
|
|
178
181
|
return { status: BB_RESULT.FAILURE, reason: `${error}` };
|
|
179
182
|
}
|
|
@@ -231,7 +234,7 @@ export async function generateProof(
|
|
|
231
234
|
const duration = timer.ms();
|
|
232
235
|
// cleanup the bytecode
|
|
233
236
|
await fs.rm(bytecodePath, { force: true });
|
|
234
|
-
if (result == BB_RESULT.SUCCESS) {
|
|
237
|
+
if (result.status == BB_RESULT.SUCCESS) {
|
|
235
238
|
return {
|
|
236
239
|
status: BB_RESULT.SUCCESS,
|
|
237
240
|
duration,
|
|
@@ -241,7 +244,10 @@ export async function generateProof(
|
|
|
241
244
|
};
|
|
242
245
|
}
|
|
243
246
|
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
244
|
-
return {
|
|
247
|
+
return {
|
|
248
|
+
status: BB_RESULT.FAILURE,
|
|
249
|
+
reason: `Failed to generate proof. Exit code ${result.exitCode}. Signal ${result.signal}.`,
|
|
250
|
+
};
|
|
245
251
|
} catch (error) {
|
|
246
252
|
return { status: BB_RESULT.FAILURE, reason: `${error}` };
|
|
247
253
|
}
|
|
@@ -274,11 +280,14 @@ export async function verifyProof(
|
|
|
274
280
|
const timer = new Timer();
|
|
275
281
|
const result = await executeBB(pathToBB, 'verify', args, log);
|
|
276
282
|
const duration = timer.ms();
|
|
277
|
-
if (result == BB_RESULT.SUCCESS) {
|
|
283
|
+
if (result.status == BB_RESULT.SUCCESS) {
|
|
278
284
|
return { status: BB_RESULT.SUCCESS, duration };
|
|
279
285
|
}
|
|
280
286
|
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
281
|
-
return {
|
|
287
|
+
return {
|
|
288
|
+
status: BB_RESULT.FAILURE,
|
|
289
|
+
reason: `Failed to verify proof. Exit code ${result.exitCode}. Signal ${result.signal}.`,
|
|
290
|
+
};
|
|
282
291
|
} catch (error) {
|
|
283
292
|
return { status: BB_RESULT.FAILURE, reason: `${error}` };
|
|
284
293
|
}
|
|
@@ -311,11 +320,14 @@ export async function writeVkAsFields(
|
|
|
311
320
|
const timer = new Timer();
|
|
312
321
|
const result = await executeBB(pathToBB, 'vk_as_fields', args, log);
|
|
313
322
|
const duration = timer.ms();
|
|
314
|
-
if (result == BB_RESULT.SUCCESS) {
|
|
323
|
+
if (result.status == BB_RESULT.SUCCESS) {
|
|
315
324
|
return { status: BB_RESULT.SUCCESS, duration, vkPath: verificationKeyPath };
|
|
316
325
|
}
|
|
317
326
|
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
318
|
-
return {
|
|
327
|
+
return {
|
|
328
|
+
status: BB_RESULT.FAILURE,
|
|
329
|
+
reason: `Failed to create vk as fields. Exit code ${result.exitCode}. Signal ${result.signal}.`,
|
|
330
|
+
};
|
|
319
331
|
} catch (error) {
|
|
320
332
|
return { status: BB_RESULT.FAILURE, reason: `${error}` };
|
|
321
333
|
}
|
|
@@ -348,11 +360,14 @@ export async function writeProofAsFields(
|
|
|
348
360
|
const timer = new Timer();
|
|
349
361
|
const result = await executeBB(pathToBB, 'proof_as_fields', args, log);
|
|
350
362
|
const duration = timer.ms();
|
|
351
|
-
if (result == BB_RESULT.SUCCESS) {
|
|
363
|
+
if (result.status == BB_RESULT.SUCCESS) {
|
|
352
364
|
return { status: BB_RESULT.SUCCESS, duration, proofPath: proofPath };
|
|
353
365
|
}
|
|
354
366
|
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
355
|
-
return {
|
|
367
|
+
return {
|
|
368
|
+
status: BB_RESULT.FAILURE,
|
|
369
|
+
reason: `Failed to create proof as fields. Exit code ${result.exitCode}. Signal ${result.signal}.`,
|
|
370
|
+
};
|
|
356
371
|
} catch (error) {
|
|
357
372
|
return { status: BB_RESULT.FAILURE, reason: `${error}` };
|
|
358
373
|
}
|