Update circuits to calculate path internally

This commit is contained in:
ashpect
2024-08-05 20:47:39 +05:30
parent 07804923ef
commit 096bad129d
8 changed files with 158 additions and 150 deletions

View File

@@ -17,13 +17,10 @@ template ProveNameDobNotInOfac(nLevels) {
signal input path[nLevels];
signal input siblings[nLevels];
signal input current_date[6];
signal input closest_leaf;
signal input smt_root;
signal input smt_size;
signal input smt_path[256];
signal input smt_siblings[256];
signal input path_to_match[256];
signal output proofType;
signal output proofLevel;
@@ -49,24 +46,31 @@ template ProveNameDobNotInOfac(nLevels) {
// NameDob hash
signal name_dob_hash <== Poseidon(2)([pos_dob.out, name_hash]);
signal smtleaf_hash <== Poseidon(3)([name_dob_hash, 1,1]);
signal computedRoot <== BinaryMerkleRoot(256)(closest_leaf, smt_size, smt_path, smt_siblings);
signal sibLength <== SiblingsLength()(smt_siblings);
signal smt_path_new[256];
signal path_in_bits_reversed[256] <== Num2Bits(256)(name_dob_hash);
var path_in_bits[256];
for (var i = 0; i < 256; i++) {
path_in_bits[i] = path_in_bits_reversed[255-i];
}
component ct1 = VarShiftLeft(256,256);
ct1.in <== path_in_bits;
ct1.shift <== (256-sibLength);
smt_path_new <== ct1.out;
signal closest_hash <== Poseidon(3)([closest_leaf, 1,1]);
signal isClosestZero <== IsEqual()([closest_leaf,0]);
signal closest <== IsEqual()([isClosestZero,0]);
signal closestleaf_hash <== closest_hash * closest;
signal computedRoot <== BinaryMerkleRoot(256)(closestleaf_hash, sibLength, smt_path_new, smt_siblings);
computedRoot === smt_root;
proofType <== IsEqual()([closest_leaf,smtleaf_hash]);
proofType <== IsEqual()([closestleaf_hash,smtleaf_hash]);
proofType === 0; // Uncomment this line to make circuit handle both membership and non-membership proof and returns the type of proof (0 for non-membership, 1 for membership)
signal sibLength <== SiblingsLength()(smt_siblings); // If someone tries to bypass the next test by deliberately passing in smt_size < commonLength
sibLength === smt_size;
// Common length
component ct = CommonBitsLengthFromEnd();
ct.bits1 <== path_to_match;
ct.bits2 <== Num2Bits(256)(name_dob_hash);
signal commonLength <== ct.out;
signal closestLeafValid <== LessEqThan(9)([smt_size,commonLength]);
signal check <== IsZero()(proofType+closestLeafValid);
check === 0; // Assert the culminated condition
proofLevel <== 2;
}

View File

@@ -19,10 +19,7 @@ template ProveNameNotInOfac(nLevels) {
signal input closest_leaf;
signal input smt_root;
signal input smt_size;
signal input smt_path[256];
signal input smt_siblings[256];
signal input path_to_match[256];
signal output proofType;
signal output proofLevel;
@@ -40,24 +37,31 @@ template ProveNameNotInOfac(nLevels) {
signal name_hash <== Poseidon(3)([poseidon_hasher[0].out, poseidon_hasher[1].out, poseidon_hasher[2].out]);
signal smtleaf_hash <== Poseidon(3)([name_hash, 1,1]);
signal computedRoot <== BinaryMerkleRoot(256)(closest_leaf, smt_size, smt_path, smt_siblings);
signal sibLength <== SiblingsLength()(smt_siblings);
signal smt_path_new[256];
signal path_in_bits_reversed[256] <== Num2Bits(256)(name_hash);
var path_in_bits[256];
for (var i = 0; i < 256; i++) {
path_in_bits[i] = path_in_bits_reversed[255-i];
}
component ct1 = VarShiftLeft(256,256);
ct1.in <== path_in_bits;
ct1.shift <== (256-sibLength);
smt_path_new <== ct1.out;
signal closest_hash <== Poseidon(3)([closest_leaf, 1,1]);
signal isClosestZero <== IsEqual()([closest_leaf,0]);
signal closest <== IsEqual()([isClosestZero,0]);
signal closestleaf_hash <== closest_hash * closest;
signal computedRoot <== BinaryMerkleRoot(256)(closestleaf_hash, sibLength, smt_path_new, smt_siblings);
computedRoot === smt_root;
proofType <== IsEqual()([closest_leaf,smtleaf_hash]);
proofType <== IsEqual()([closestleaf_hash,smtleaf_hash]);
proofType === 0; // Uncomment this line to make circuit handle both membership and non-membership proof and returns the type of proof (0 for non-membership, 1 for membership)
signal sibLength <== SiblingsLength()(smt_siblings); // If someone tries to bypass the next test by deliberately passing in smt_size < commonLength
sibLength === smt_size;
// Common length
component ct = CommonBitsLengthFromEnd();
ct.bits1 <== path_to_match;
ct.bits2 <== Num2Bits(256)(name_hash);
signal commonLength <== ct.out;
signal closestLeafValid <== LessEqThan(9)([smt_size,commonLength]);
signal check <== IsZero()(proofType+closestLeafValid);
check === 0; // Assert the culminated condition
proofLevel <== 1;
}

View File

@@ -3,6 +3,7 @@ pragma circom 2.1.5;
include "circomlib/circuits/poseidon.circom";
include "circomlib/circuits/comparators.circom";
include "circomlib/circuits/bitify.circom";
include "@zk-email/circuits/utils/array.circom";
include "binary-merkle-root.circom";
include "../utils/getCommonLength.circom";
include "../utils/validatePassport.circom";
@@ -20,56 +21,51 @@ template ProvePassportNotInOfac(nLevels) {
signal input closest_leaf;
signal input smt_root;
signal input smt_size;
signal input smt_path[256];
signal input smt_siblings[256];
signal input path_to_match[256];
signal output proofType;
signal output proofLevel;
// Validate passport
ValidatePassport(nLevels)(secret, attestation_id, pubkey_leaf, mrz, merkle_root, merkletree_size, path, siblings, current_date);
// PassportNoHash
// PassportNo Hash
component poseidon_hasher = Poseidon(9);
for (var i = 0; i < 9; i++) {
poseidon_hasher.inputs[i] <== mrz[49 + i];
}
signal smtleaf_hash <== Poseidon(3)([poseidon_hasher.out, 1,1]);
// If computedRoot != smt_root; the below assertion fails as path and siblings do not compute to root and proof is not generated.
// If computedRoot == smt_root; path and siblings are true but the proof could be membership or non-membership and then furthur checks are made.
signal computedRoot <== BinaryMerkleRoot(256)(closest_leaf, smt_size, smt_path, smt_siblings);
// Caclulate the depth needed
signal sibLength <== SiblingsLength()(smt_siblings);
// Calulate the path needed
signal smt_path_new[256];
signal path_in_bits_reversed[256] <== Num2Bits(256)(poseidon_hasher.out);
var path_in_bits[256];
for (var i = 0; i < 256; i++) {
path_in_bits[i] = path_in_bits_reversed[255-i];
}
// Shift the path to the left by sibLength to make it compatible for BinaryMerkleRoot function
component ct1 = VarShiftLeft(256,256);
ct1.in <== path_in_bits;
ct1.shift <== (256-sibLength);
smt_path_new <== ct1.out;
// Closest_leaf hash
signal closest_hash <== Poseidon(3)([closest_leaf, 1,1]);
signal isClosestZero <== IsEqual()([closest_leaf,0]);
signal closest <== IsEqual()([isClosestZero,0]); // Because zk-kit/smt stores a 0 leaf as itself and not as Hash(0,value,1)
signal closestleaf_hash <== closest_hash * closest;
// Verification
signal computedRoot <== BinaryMerkleRoot(256)(closestleaf_hash, sibLength, smt_path_new, smt_siblings);
computedRoot === smt_root;
// If leaf given = leaf calulated ; then membership proof
proofType <== IsEqual()([closest_leaf,smtleaf_hash]); // 1 for membership proof, 0 for non-membership proof
proofType <== IsEqual()([closestleaf_hash,smtleaf_hash]); // 1 for membership proof, 0 for non-membership proof
proofType === 0; // Uncomment this line to make circuit handle both membership and non-membership proof and returns the type of proof (0 for non-membership, 1 for membership)
// If proofType if 0, then the given path and siblings are correct but for closest leaf (non-membership proof) or a 0 leaf (non-membership proof)
// now we need to prove that if it is the closest leaf, than first common bits of hashes >= siblings length
// if it is , then proof == true or it is invalid.
// Just an edge case verification if someone tries to bypass the next test by deliberately passing in smt_size < commonLength
signal sibLength <== SiblingsLength()(smt_siblings); //gives the siblings length
sibLength === smt_size;
// Common length
component ct = CommonBitsLengthFromEnd();
ct.bits1 <== path_to_match;
ct.bits2 <== Num2Bits(256)(poseidon_hasher.out);
signal commonLength <== ct.out;
signal closestLeafValid <== LessEqThan(9)([smt_size,commonLength]); // out1 = 1 if first common bits of hashes >= siblings length
// out1 = 1 if first common bits of hashes >= siblings length
// out1 = 0 if first common bits of hashes < siblings length
// Now assert that
// Membership condn ; bits < siblings length
// 1,any = valid (membership proof, hence no need of other conditions)
// 0,1 = valid (non-membership proof, closest sibling)
// 0,0 = invalid (non-membership proof, but not closest sibling, i.e : user gave a random correct smt_path and smt_siblings)
signal check <== IsZero()(proofType+closestLeafValid); // if 0,0,0 then invalid
check === 0; // Assert the culminated condition
proofLevel <== 3;
}

View File

@@ -3,7 +3,7 @@ pragma circom 2.1.5;
include "circomlib/circuits/comparators.circom";
include "circomlib/circuits/bitify.circom";
// computes the first n common bits of the hashes
// Computes the first n common bits of the hashes
template CommonBitsLengthFromEnd() {
signal input bits1[256];
@@ -32,6 +32,7 @@ template CommonBitsLengthFromEnd() {
}
// Computes length of an array when array is padded with 0;s from end and the last element after which padding starts is not 0, 0's might come in between.
template SiblingsLength() {
signal input siblings[256];
signal output length;
@@ -39,8 +40,12 @@ template SiblingsLength() {
// Siblings can be like (1,2,3,0,0,4,5,0,0...all 0 till 256[the padded 0 ones])
// We need to get the length , i.e 7 in this case
var foo[256];
for(var i = 0; i<256; i++){
foo[i] = 0;
}
foo[255] = siblings[255];
for(var i = 256-2; i>=0; i--){
foo[i] = foo[i] + foo[i+1];
foo[i] = siblings[i] + foo[i+1];
}
// convert to (15,14,12,9,9,9,5,0,0,0..), this takes out the middle 0's
@@ -50,7 +55,7 @@ template SiblingsLength() {
for(var i = 0; i<256; i++){
iszero[i] = IsZero();
siblings[i] ==> iszero[i].in;
foo[i] ==> iszero[i].in;
pop[i] <== iszero[i].out;
}

View File

@@ -217,13 +217,13 @@ export function generateCircuitInputsOfac(
const namedob_leaf = getNameDobLeaf(mrz_bytes.slice(10,49), mrz_bytes.slice(62, 68)) // [57-62] + 5 shift
const name_leaf = getNameLeaf(mrz_bytes.slice(10,49)) // [6-44] + 5 shift
let root, depth, closestleaf, indices, siblings, pathToMatch;
let root,closestleaf,siblings;
if(proofLevel == 3){
({root, depth, closestleaf, indices, siblings, pathToMatch} = generateSMTProof(sparsemerkletree, passport_leaf));
({root, closestleaf, siblings} = generateSMTProof(sparsemerkletree, passport_leaf));
} else if(proofLevel == 2){
({root, depth, closestleaf, indices, siblings, pathToMatch} = generateSMTProof(sparsemerkletree, namedob_leaf));
({root, closestleaf, siblings} = generateSMTProof(sparsemerkletree, namedob_leaf));
} else if (proofLevel == 1){
({root, depth, closestleaf, indices, siblings, pathToMatch} = generateSMTProof(sparsemerkletree, name_leaf));
({root, closestleaf, siblings} = generateSMTProof(sparsemerkletree, name_leaf));
} else {
throw new Error("Invalid proof level")
}
@@ -232,10 +232,7 @@ export function generateCircuitInputsOfac(
...finalResult,
closest_leaf: [BigInt(closestleaf).toString()],
smt_root: [BigInt(root).toString()],
smt_size: [BigInt(depth).toString()],
smt_path : indices.map(index => BigInt(index).toString()),
smt_siblings: siblings.map(index => BigInt(index).toString()),
path_to_match: pathToMatch.map(index => BigInt(index).toString())
};
}

View File

@@ -3,7 +3,6 @@ import { sha256 } from 'js-sha256';
import { sha1 } from 'js-sha1';
import { sha384 } from 'js-sha512';
import { SMT } from '@ashpect/smt';
import { poseidon3 } from 'poseidon-lite';
import forge from 'node-forge';
export function formatMrz(mrz: string) {
@@ -310,26 +309,28 @@ export function generateSMTProof(smt: SMT, leaf: bigint) {
// then check if entry[1] exists
if(!entry[1]){
// non membership proof
console.log("entry[1] is 0")
closestleaf = BigInt(0); // 0 leaf
} else {
closestleaf = poseidon3(entry); // leaf itself (memb proof)
closestleaf = BigInt(entry[0]); // leaf itself (memb proof)
}
} else {
closestleaf = poseidon3(matchingEntry); // actual closest
// non membership proof
closestleaf = BigInt(matchingEntry[0]); // actual closest
}
const binary = entry[0].toString(2)
const bits = binary.slice(-depth);
let indices = bits.padEnd(256, "0").split("").map(Number)
siblings.reverse()
const pathToMatch = num2Bits(256,BigInt(entry[0])) //no need to pad actually as poseidon hashes are 256 onli
while(indices.length < 256) indices.push(0);
while(siblings.length < 256) siblings.push(BigInt(0));
// // CALCULATED ROOT FOR TESTING -- // Useful for debugging hence leaving as comments
// closestleaf, depth, siblings, indices, root : needed
// let calculatedNode = closestleaf;
// PATH, SIBLINGS manipulation as per binary tree in the circuit
siblings.reverse()
while(siblings.length < 256) siblings.push(BigInt(0));
// ----- Useful for debugging hence leaving as comments -----
// const binary = entry[0].toString(2)
// const bits = binary.slice(-depth);
// let indices = bits.padEnd(256, "0").split("").map(Number)
// const pathToMatch = num2Bits(256,BigInt(entry[0]))
// while(indices.length < 256) indices.push(0);
// // CALCULATED ROOT FOR TESTING
// // closestleaf, depth, siblings, indices, root : needed
// let calculatedNode = poseidon3([closestleaf,1,1]);
// console.log("Initial node while calculating",calculatedNode)
// console.log(smt.verifyProof(smt.createProof(leaf)))
// for (let i= 0; i < depth ; i++) {
@@ -339,14 +340,13 @@ export function generateSMTProof(smt: SMT, leaf: bigint) {
// }
// console.log("Actual node", root)
// console.log("calculated node", calculatedNode)
// -----------------------------------------------------------
return {
root,
depth,
closestleaf,
indices,
siblings,
pathToMatch
};
}

View File

@@ -102,6 +102,11 @@ asn1.js@^5.4.1:
minimalistic-assert "^1.0.0"
safer-buffer "^2.1.0"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
available-typed-arrays@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
@@ -109,6 +114,15 @@ available-typed-arrays@^1.0.7:
dependencies:
possible-typed-array-names "^1.0.0"
axios@^1.7.2:
version "1.7.3"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.3.tgz#a1125f2faf702bc8e8f2104ec3a76fab40257d85"
integrity sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==
dependencies:
follow-redirects "^1.15.6"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
@@ -143,6 +157,13 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bin
get-intrinsic "^1.2.4"
set-function-length "^1.2.1"
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
data-view-buffer@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
@@ -188,6 +209,11 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
elliptic@^6.5.5:
version "6.5.5"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded"
@@ -310,6 +336,11 @@ es7-shim@^6.0.0:
string.prototype.trimleft "^2.0.0"
string.prototype.trimright "^2.0.0"
follow-redirects@^1.15.6:
version "1.15.6"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
for-each@^0.3.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
@@ -317,6 +348,15 @@ for-each@^0.3.3:
dependencies:
is-callable "^1.1.3"
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
fs@^0.0.1-security:
version "0.0.1-security"
resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4"
@@ -595,6 +635,18 @@ lodash@^4.17.10:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
@@ -688,6 +740,11 @@ process@^0.11.1:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
regenerator-runtime@^0.14.0:
version "0.14.0"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"

View File

@@ -2,51 +2,6 @@
# yarn lockfile v1
"@cspotcode/source-map-support@^0.8.0":
version "0.8.1"
resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz"
integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
dependencies:
"@jridgewell/trace-mapping" "0.3.9"
"@jridgewell/resolve-uri@^3.0.3":
version "3.1.2"
resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
"@jridgewell/sourcemap-codec@^1.4.10":
version "1.4.15"
resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@jridgewell/trace-mapping@0.3.9":
version "0.3.9"
resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz"
integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
dependencies:
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@tsconfig/node10@^1.0.7":
version "1.0.11"
resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz"
integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
"@tsconfig/node12@^1.0.7":
version "1.0.11"
resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz"
integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
"@tsconfig/node14@^1.0.0":
version "1.0.3"
resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz"
integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
"@tsconfig/node16@^1.0.2":
version "1.0.4"
resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz"
integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
"@types/node@^20.11.20":
version "20.11.20"
resolved "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz"
@@ -114,13 +69,3 @@ undici-types@~5.26.4:
version "5.26.5"
resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz"
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
v8-compile-cache-lib@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz"
integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
yn@3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==