@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.462 → 8.2.1-alpha.463
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/dist/src/tss/index.d.ts +0 -1
- package/dist/src/tss/index.d.ts.map +1 -1
- package/dist/src/tss/index.js +1 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/dist/src/tss/schnorr-dkls/dsg.d.ts +0 -118
- package/dist/src/tss/schnorr-dkls/dsg.d.ts.map +0 -1
- package/dist/src/tss/schnorr-dkls/dsg.js +0 -374
- package/dist/src/tss/schnorr-dkls/index.d.ts +0 -4
- package/dist/src/tss/schnorr-dkls/index.d.ts.map +0 -1
- package/dist/src/tss/schnorr-dkls/index.js +0 -40
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/sdk-lib-mpc",
|
|
3
|
-
"version": "8.2.1-alpha.
|
|
3
|
+
"version": "8.2.1-alpha.463",
|
|
4
4
|
"description": "library functions for BitGo's MPC solution",
|
|
5
5
|
"main": "./dist/src/index.js",
|
|
6
6
|
"types": "./dist/src/index.d.ts",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"secp256k1": "5.0.1"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@bitgo-beta/sdk-opensslbytes": "1.0.1-alpha.
|
|
57
|
-
"@bitgo-beta/sjcl": "1.0.1-alpha.
|
|
56
|
+
"@bitgo-beta/sdk-opensslbytes": "1.0.1-alpha.327",
|
|
57
|
+
"@bitgo-beta/sjcl": "1.0.1-alpha.457",
|
|
58
58
|
"@silencelaboratories/dkls-wasm-ll-bundler": "1.2.0-pre.4",
|
|
59
59
|
"@types/lodash": "^4.14.151",
|
|
60
60
|
"@types/node": "^24.10.9",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"files": [
|
|
72
72
|
"dist"
|
|
73
73
|
],
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "518f0e3015b1b16d38f9859e1cf6966514686608"
|
|
75
75
|
}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Two-party BIP-340 Schnorr threshold signing (SchnorrDsg).
|
|
3
|
-
*
|
|
4
|
-
* Works with the Shamir keyshares produced by `DklsDkg` (DKLS23 key generation).
|
|
5
|
-
* No new WASM is required: key material is read directly from the CBOR-encoded
|
|
6
|
-
* keyshare, Lagrange interpolation is computed in TypeScript, and BIP-340 Schnorr
|
|
7
|
-
* algebra is performed with `@noble/curves/secp256k1`.
|
|
8
|
-
*
|
|
9
|
-
* Protocol (2 broadcast rounds):
|
|
10
|
-
*
|
|
11
|
-
* Round 1 init()
|
|
12
|
-
* • Each party generates a random nonce scalar k_i.
|
|
13
|
-
* • Broadcasts the nonce point R_i = k_i * G (33-byte compressed).
|
|
14
|
-
*
|
|
15
|
-
* Round 2 handleIncomingMessages([R_j])
|
|
16
|
-
* • Compute combined nonce R = R_i + R_j.
|
|
17
|
-
* • If R.y is odd, negate k_i (BIP-340 requires even-y R).
|
|
18
|
-
* • Compute BIP-340 challenge e = H("BIP0340/challenge", R.x ‖ P.x ‖ msg).
|
|
19
|
-
* • Compute partial signature s_i = k_i + e · λ_i · priv_i (mod n).
|
|
20
|
-
* • Broadcasts s_i as 32-byte big-endian scalar.
|
|
21
|
-
*
|
|
22
|
-
* Combine handleIncomingMessages([s_j])
|
|
23
|
-
* • s = s_i + s_j mod n.
|
|
24
|
-
* • signature = Buffer.concat([R.x_32, s_32]) — 64-byte BIP-340 Schnorr.
|
|
25
|
-
*
|
|
26
|
-
* BIP-32 non-hardened derivation is supported. For path `m/a/b/...`, the total
|
|
27
|
-
* IL scalar (sum of per-level HMAC-SHA512 left halves) is computed from the
|
|
28
|
-
* shared public key / chaincode. The party with the smallest index in
|
|
29
|
-
* `signingPartyIndices` absorbs the entire IL adjustment so that Lagrange
|
|
30
|
-
* interpolation still reconstructs the correct child private key.
|
|
31
|
-
*
|
|
32
|
-
* References:
|
|
33
|
-
* BIP-340 https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
|
|
34
|
-
* FROST https://eprint.iacr.org/2020/852
|
|
35
|
-
*/
|
|
36
|
-
import { DeserializedBroadcastMessage, DeserializedMessages } from '../ecdsa-dkls/types';
|
|
37
|
-
/** 64-byte BIP-340 Schnorr signature `(R.x_32 ‖ s_32)`. */
|
|
38
|
-
export type SchnorrDklsSignature = {
|
|
39
|
-
/** 32-byte x-coordinate of the nonce point R. */
|
|
40
|
-
R: Uint8Array;
|
|
41
|
-
/** 32-byte Schnorr scalar s. */
|
|
42
|
-
S: Uint8Array;
|
|
43
|
-
};
|
|
44
|
-
export declare enum SchnorrDsgState {
|
|
45
|
-
Uninitialized = 0,
|
|
46
|
-
Round1 = 1,// waiting to receive the other party's nonce point R_j
|
|
47
|
-
Round2 = 2,// waiting to receive the other party's partial scalar s_j
|
|
48
|
-
Complete = 3
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Two-party BIP-340 Schnorr threshold signing session.
|
|
52
|
-
*
|
|
53
|
-
* Compatible with keyshares produced by `DklsDkg.Dkg` (DKLS23 key generation).
|
|
54
|
-
*
|
|
55
|
-
* @example
|
|
56
|
-
* ```ts
|
|
57
|
-
* // Party 0 (HSM / BitGo) and party 1 (user), 2-of-2 DKG keyshares.
|
|
58
|
-
* const party0 = new SchnorrDsg(ks0, 0, [0, 1], 'm/0', hash32);
|
|
59
|
-
* const party1 = new SchnorrDsg(ks1, 1, [0, 1], 'm/0', hash32);
|
|
60
|
-
*
|
|
61
|
-
* const r0 = await party0.init(); // Round 1
|
|
62
|
-
* const r1 = await party1.init();
|
|
63
|
-
*
|
|
64
|
-
* const s0 = party0.handleIncomingMessages({ broadcastMessages: [r1], p2pMessages: [] }); // Round 2
|
|
65
|
-
* const s1 = party1.handleIncomingMessages({ broadcastMessages: [r0], p2pMessages: [] });
|
|
66
|
-
*
|
|
67
|
-
* party0.handleIncomingMessages({ broadcastMessages: s1.broadcastMessages, p2pMessages: [] }); // Combine
|
|
68
|
-
* // party0.signature ← 64-byte BIP-340 Schnorr sig
|
|
69
|
-
* ```
|
|
70
|
-
*/
|
|
71
|
-
export declare class SchnorrDsg {
|
|
72
|
-
private readonly partyIdx;
|
|
73
|
-
private readonly signingPartyIndices;
|
|
74
|
-
private readonly messageHash;
|
|
75
|
-
private readonly derivationPath;
|
|
76
|
-
private state;
|
|
77
|
-
private _signature;
|
|
78
|
-
private readonly effectivePriv;
|
|
79
|
-
private readonly pubKeyX;
|
|
80
|
-
private ki;
|
|
81
|
-
private Ri;
|
|
82
|
-
private R_combined;
|
|
83
|
-
private si;
|
|
84
|
-
/**
|
|
85
|
-
* @param keyShare CBOR-encoded DKLS keyshare (full or reduced format).
|
|
86
|
-
* @param partyIdx This party's index in the DKG (0-based, must be in `signingPartyIndices`).
|
|
87
|
-
* @param signingPartyIndices Indices of ALL parties participating in this signing session.
|
|
88
|
-
* Must contain `partyIdx`. The Lagrange coefficients are computed
|
|
89
|
-
* for this subset.
|
|
90
|
-
* @param derivationPath BIP-32 non-hardened path (e.g. `'m/0'`). Defaults to root `'m'`.
|
|
91
|
-
* @param messageHash 32-byte message hash to sign.
|
|
92
|
-
*/
|
|
93
|
-
constructor(keyShare: Buffer, partyIdx: number, signingPartyIndices: number[], derivationPath: string, messageHash: Buffer);
|
|
94
|
-
/** The combined 64-byte BIP-340 Schnorr signature `(R.x_32 ‖ s_32)`. Available after `Complete`. */
|
|
95
|
-
get signature(): SchnorrDklsSignature;
|
|
96
|
-
get dsgState(): SchnorrDsgState;
|
|
97
|
-
/**
|
|
98
|
-
* Round 1: generate a fresh ephemeral nonce and broadcast the nonce point R_i.
|
|
99
|
-
* @returns Broadcast message containing the 33-byte compressed nonce point.
|
|
100
|
-
*/
|
|
101
|
-
init(): Promise<DeserializedBroadcastMessage>;
|
|
102
|
-
/**
|
|
103
|
-
* Process incoming messages for the current round:
|
|
104
|
-
*
|
|
105
|
-
* - Round 1 → receives nonce point `R_j` → returns partial scalar `s_i`.
|
|
106
|
-
* - Round 2 → receives partial scalar `s_j` → produces final signature.
|
|
107
|
-
*/
|
|
108
|
-
handleIncomingMessages(messages: DeserializedMessages): DeserializedMessages;
|
|
109
|
-
/**
|
|
110
|
-
* Round 1: receive R_j, compute combined R, apply BIP-340 parity, compute s_i.
|
|
111
|
-
*/
|
|
112
|
-
private _handleRound1;
|
|
113
|
-
/**
|
|
114
|
-
* Round 2 (combine): receive s_j, produce the final BIP-340 Schnorr signature.
|
|
115
|
-
*/
|
|
116
|
-
private _handleRound2;
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=dsg.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dsg.d.ts","sourceRoot":"","sources":["../../../../src/tss/schnorr-dkls/dsg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAKH,OAAO,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AA+IzF,2DAA2D;AAC3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,iDAAiD;IACjD,CAAC,EAAE,UAAU,CAAC;IACd,gCAAgC;IAChC,CAAC,EAAE,UAAU,CAAC;CACf,CAAC;AAEF,oBAAY,eAAe;IACzB,aAAa,IAAI;IACjB,MAAM,IAAA,CAAE,uDAAuD;IAC/D,MAAM,IAAA,CAAE,0DAA0D;IAClE,QAAQ,IAAA;CACT;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,KAAK,CAAkD;IAC/D,OAAO,CAAC,UAAU,CAAmC;IAGrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAGjC,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,EAAE,CAAmE;IAG7E,OAAO,CAAC,UAAU,CAAmE;IACrF,OAAO,CAAC,EAAE,CAAa;IAEvB;;;;;;;;OAQG;gBAED,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,EAAE,EAC7B,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM;IA8ErB,oGAAoG;IACpG,IAAI,SAAS,IAAI,oBAAoB,CAKpC;IAED,IAAI,QAAQ,IAAI,eAAe,CAE9B;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAqBnD;;;;;OAKG;IACH,sBAAsB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,oBAAoB;IAY5E;;OAEG;IACH,OAAO,CAAC,aAAa;IAuCrB;;OAEG;IACH,OAAO,CAAC,aAAa;CAiBtB"}
|
|
@@ -1,374 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Two-party BIP-340 Schnorr threshold signing (SchnorrDsg).
|
|
4
|
-
*
|
|
5
|
-
* Works with the Shamir keyshares produced by `DklsDkg` (DKLS23 key generation).
|
|
6
|
-
* No new WASM is required: key material is read directly from the CBOR-encoded
|
|
7
|
-
* keyshare, Lagrange interpolation is computed in TypeScript, and BIP-340 Schnorr
|
|
8
|
-
* algebra is performed with `@noble/curves/secp256k1`.
|
|
9
|
-
*
|
|
10
|
-
* Protocol (2 broadcast rounds):
|
|
11
|
-
*
|
|
12
|
-
* Round 1 init()
|
|
13
|
-
* • Each party generates a random nonce scalar k_i.
|
|
14
|
-
* • Broadcasts the nonce point R_i = k_i * G (33-byte compressed).
|
|
15
|
-
*
|
|
16
|
-
* Round 2 handleIncomingMessages([R_j])
|
|
17
|
-
* • Compute combined nonce R = R_i + R_j.
|
|
18
|
-
* • If R.y is odd, negate k_i (BIP-340 requires even-y R).
|
|
19
|
-
* • Compute BIP-340 challenge e = H("BIP0340/challenge", R.x ‖ P.x ‖ msg).
|
|
20
|
-
* • Compute partial signature s_i = k_i + e · λ_i · priv_i (mod n).
|
|
21
|
-
* • Broadcasts s_i as 32-byte big-endian scalar.
|
|
22
|
-
*
|
|
23
|
-
* Combine handleIncomingMessages([s_j])
|
|
24
|
-
* • s = s_i + s_j mod n.
|
|
25
|
-
* • signature = Buffer.concat([R.x_32, s_32]) — 64-byte BIP-340 Schnorr.
|
|
26
|
-
*
|
|
27
|
-
* BIP-32 non-hardened derivation is supported. For path `m/a/b/...`, the total
|
|
28
|
-
* IL scalar (sum of per-level HMAC-SHA512 left halves) is computed from the
|
|
29
|
-
* shared public key / chaincode. The party with the smallest index in
|
|
30
|
-
* `signingPartyIndices` absorbs the entire IL adjustment so that Lagrange
|
|
31
|
-
* interpolation still reconstructs the correct child private key.
|
|
32
|
-
*
|
|
33
|
-
* References:
|
|
34
|
-
* BIP-340 https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
|
|
35
|
-
* FROST https://eprint.iacr.org/2020/852
|
|
36
|
-
*/
|
|
37
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
exports.SchnorrDsg = exports.SchnorrDsgState = void 0;
|
|
39
|
-
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
40
|
-
const crypto_1 = require("crypto");
|
|
41
|
-
const cbor_x_1 = require("cbor-x");
|
|
42
|
-
// ── Curve constants ────────────────────────────────────────────────────────────
|
|
43
|
-
const N = secp256k1_1.secp256k1.CURVE.n; // secp256k1 order
|
|
44
|
-
const G = secp256k1_1.secp256k1.ProjectivePoint.BASE;
|
|
45
|
-
// ── Scalar arithmetic helpers ──────────────────────────────────────────────────
|
|
46
|
-
/** Reduce `x` into [0, N). */
|
|
47
|
-
function scalarMod(x) {
|
|
48
|
-
return ((x % N) + N) % N;
|
|
49
|
-
}
|
|
50
|
-
/** Modular inverse via extended Euclidean algorithm. */
|
|
51
|
-
function scalarInvert(a) {
|
|
52
|
-
let [r, rp] = [N, scalarMod(a)];
|
|
53
|
-
let [s, sp] = [BigInt(0), BigInt(1)];
|
|
54
|
-
while (rp !== BigInt(0)) {
|
|
55
|
-
const q = r / rp;
|
|
56
|
-
[r, rp] = [rp, r - q * rp];
|
|
57
|
-
[s, sp] = [sp, s - q * sp];
|
|
58
|
-
}
|
|
59
|
-
if (r !== BigInt(1))
|
|
60
|
-
throw new Error('scalarInvert: input has no inverse mod N');
|
|
61
|
-
return scalarMod(s);
|
|
62
|
-
}
|
|
63
|
-
/** Big-endian `Buffer | Uint8Array` → `bigint`. */
|
|
64
|
-
function bigFromBuf(b) {
|
|
65
|
-
const hex = Buffer.from(b).toString('hex');
|
|
66
|
-
return hex ? BigInt('0x' + hex) : BigInt(0);
|
|
67
|
-
}
|
|
68
|
-
/** `bigint` → 32-byte big-endian `Buffer`. */
|
|
69
|
-
function buf32(n) {
|
|
70
|
-
return Buffer.from(scalarMod(n).toString(16).padStart(64, '0'), 'hex');
|
|
71
|
-
}
|
|
72
|
-
// ── BIP-340 tagged hash ────────────────────────────────────────────────────────
|
|
73
|
-
/**
|
|
74
|
-
* H_tag(data...) = SHA256( SHA256(tag) ‖ SHA256(tag) ‖ data... )
|
|
75
|
-
* as specified in BIP-340.
|
|
76
|
-
*/
|
|
77
|
-
function taggedHash(tag, ...data) {
|
|
78
|
-
const tagHash = (0, crypto_1.createHash)('sha256').update(tag).digest();
|
|
79
|
-
const h = (0, crypto_1.createHash)('sha256');
|
|
80
|
-
h.update(tagHash);
|
|
81
|
-
h.update(tagHash);
|
|
82
|
-
for (const d of data)
|
|
83
|
-
h.update(d);
|
|
84
|
-
return h.digest();
|
|
85
|
-
}
|
|
86
|
-
// ── Lagrange coefficient ────────────────────────────────────────────────────────
|
|
87
|
-
/**
|
|
88
|
-
* Compute the Lagrange coefficient λ_i for party `partyIdx` evaluated at x=0,
|
|
89
|
-
* using only the x-coordinates of the parties in `signingPartyIndices`.
|
|
90
|
-
*
|
|
91
|
-
* λ_i = ∏_{j≠i, j∈S} x_j / (x_j − x_i) mod N
|
|
92
|
-
*
|
|
93
|
-
* @param xList Full `x_i_list` from the DKLS keyshare (one 32-byte array per party).
|
|
94
|
-
* @param partyIdx This party's index (0-based in the global party list).
|
|
95
|
-
* @param signingPartyIndices Indices of ALL parties participating in this signing session.
|
|
96
|
-
*/
|
|
97
|
-
function computeLagrangeCoeff(xList, partyIdx, signingPartyIndices) {
|
|
98
|
-
const xi = bigFromBuf(Buffer.from(xList[partyIdx]));
|
|
99
|
-
let num = BigInt(1);
|
|
100
|
-
let den = BigInt(1);
|
|
101
|
-
for (const j of signingPartyIndices) {
|
|
102
|
-
if (j === partyIdx)
|
|
103
|
-
continue;
|
|
104
|
-
const xj = bigFromBuf(Buffer.from(xList[j]));
|
|
105
|
-
num = scalarMod(num * xj);
|
|
106
|
-
den = scalarMod(den * scalarMod(xj - xi));
|
|
107
|
-
}
|
|
108
|
-
return scalarMod(num * scalarInvert(den));
|
|
109
|
-
}
|
|
110
|
-
// ── BIP-32 non-hardened derivation ─────────────────────────────────────────────
|
|
111
|
-
/**
|
|
112
|
-
* Parse a derivation path string (`'m/0/1/2'`) into an array of child indices.
|
|
113
|
-
* Hardened paths (`'m/44'/0'`) are not supported.
|
|
114
|
-
*/
|
|
115
|
-
function parsePath(path) {
|
|
116
|
-
if (path === 'm' || path === '')
|
|
117
|
-
return [];
|
|
118
|
-
const parts = path.replace(/^m\/?/, '').split('/');
|
|
119
|
-
return parts.map((p) => {
|
|
120
|
-
if (p.endsWith("'"))
|
|
121
|
-
throw new Error('Hardened derivation is not supported for Schnorr threshold signing.');
|
|
122
|
-
const idx = parseInt(p, 10);
|
|
123
|
-
if (isNaN(idx) || idx < 0 || idx >= 0x80000000)
|
|
124
|
-
throw new Error(`Invalid path component: ${p}`);
|
|
125
|
-
return idx;
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Derive the total IL scalar and final chaincode for a non-hardened BIP-32 path.
|
|
130
|
-
*
|
|
131
|
-
* BIP-32 non-hardened child key update:
|
|
132
|
-
* I = HMAC-SHA512(key=chainCode, data=compressedPubKey ‖ ser32(index))
|
|
133
|
-
* childPriv = parentPriv + IL (mod N)
|
|
134
|
-
* childPubKey = parentPubKey + IL * G
|
|
135
|
-
* childChainCode = IR
|
|
136
|
-
*
|
|
137
|
-
* For threshold signing, the IL scalars are additive, so the total private-key
|
|
138
|
-
* adjustment is `totalIL = Σ IL_k`. The caller is responsible for applying this
|
|
139
|
-
* to the right party's share.
|
|
140
|
-
*
|
|
141
|
-
* @returns `{ totalIL, finalChainCode, finalPubKey }` for the derived child.
|
|
142
|
-
*/
|
|
143
|
-
function derivePath(rootPubKey, rootChainCode, path) {
|
|
144
|
-
let pub = rootPubKey; // 33-byte compressed
|
|
145
|
-
let cc = rootChainCode; // 32-byte chaincode
|
|
146
|
-
let totalIL = BigInt(0);
|
|
147
|
-
for (const index of path) {
|
|
148
|
-
const indexBuf = Buffer.alloc(4);
|
|
149
|
-
indexBuf.writeUInt32BE(index, 0);
|
|
150
|
-
const I = Buffer.from((0, crypto_1.createHmac)('sha512', cc).update(pub).update(indexBuf).digest());
|
|
151
|
-
const IL = bigFromBuf(I.slice(0, 32));
|
|
152
|
-
const IR = I.slice(32);
|
|
153
|
-
if (IL >= N)
|
|
154
|
-
throw new Error('BIP-32 derived IL >= N; this path is invalid (astronomically unlikely).');
|
|
155
|
-
totalIL = scalarMod(totalIL + IL);
|
|
156
|
-
cc = IR;
|
|
157
|
-
// Advance the public key to the child level.
|
|
158
|
-
const pubPoint = secp256k1_1.secp256k1.ProjectivePoint.fromHex(pub.toString('hex'));
|
|
159
|
-
const childPoint = pubPoint.add(G.multiply(IL));
|
|
160
|
-
pub = Buffer.from(childPoint.toRawBytes(true));
|
|
161
|
-
}
|
|
162
|
-
return { totalIL, finalChainCode: cc, finalPubKey: pub };
|
|
163
|
-
}
|
|
164
|
-
var SchnorrDsgState;
|
|
165
|
-
(function (SchnorrDsgState) {
|
|
166
|
-
SchnorrDsgState[SchnorrDsgState["Uninitialized"] = 0] = "Uninitialized";
|
|
167
|
-
SchnorrDsgState[SchnorrDsgState["Round1"] = 1] = "Round1";
|
|
168
|
-
SchnorrDsgState[SchnorrDsgState["Round2"] = 2] = "Round2";
|
|
169
|
-
SchnorrDsgState[SchnorrDsgState["Complete"] = 3] = "Complete";
|
|
170
|
-
})(SchnorrDsgState || (exports.SchnorrDsgState = SchnorrDsgState = {}));
|
|
171
|
-
// ── SchnorrDsg ─────────────────────────────────────────────────────────────────
|
|
172
|
-
/**
|
|
173
|
-
* Two-party BIP-340 Schnorr threshold signing session.
|
|
174
|
-
*
|
|
175
|
-
* Compatible with keyshares produced by `DklsDkg.Dkg` (DKLS23 key generation).
|
|
176
|
-
*
|
|
177
|
-
* @example
|
|
178
|
-
* ```ts
|
|
179
|
-
* // Party 0 (HSM / BitGo) and party 1 (user), 2-of-2 DKG keyshares.
|
|
180
|
-
* const party0 = new SchnorrDsg(ks0, 0, [0, 1], 'm/0', hash32);
|
|
181
|
-
* const party1 = new SchnorrDsg(ks1, 1, [0, 1], 'm/0', hash32);
|
|
182
|
-
*
|
|
183
|
-
* const r0 = await party0.init(); // Round 1
|
|
184
|
-
* const r1 = await party1.init();
|
|
185
|
-
*
|
|
186
|
-
* const s0 = party0.handleIncomingMessages({ broadcastMessages: [r1], p2pMessages: [] }); // Round 2
|
|
187
|
-
* const s1 = party1.handleIncomingMessages({ broadcastMessages: [r0], p2pMessages: [] });
|
|
188
|
-
*
|
|
189
|
-
* party0.handleIncomingMessages({ broadcastMessages: s1.broadcastMessages, p2pMessages: [] }); // Combine
|
|
190
|
-
* // party0.signature ← 64-byte BIP-340 Schnorr sig
|
|
191
|
-
* ```
|
|
192
|
-
*/
|
|
193
|
-
class SchnorrDsg {
|
|
194
|
-
/**
|
|
195
|
-
* @param keyShare CBOR-encoded DKLS keyshare (full or reduced format).
|
|
196
|
-
* @param partyIdx This party's index in the DKG (0-based, must be in `signingPartyIndices`).
|
|
197
|
-
* @param signingPartyIndices Indices of ALL parties participating in this signing session.
|
|
198
|
-
* Must contain `partyIdx`. The Lagrange coefficients are computed
|
|
199
|
-
* for this subset.
|
|
200
|
-
* @param derivationPath BIP-32 non-hardened path (e.g. `'m/0'`). Defaults to root `'m'`.
|
|
201
|
-
* @param messageHash 32-byte message hash to sign.
|
|
202
|
-
*/
|
|
203
|
-
constructor(keyShare, partyIdx, signingPartyIndices, derivationPath, messageHash) {
|
|
204
|
-
this.state = SchnorrDsgState.Uninitialized;
|
|
205
|
-
// Set in init()
|
|
206
|
-
this.ki = BigInt(0); // ephemeral nonce scalar
|
|
207
|
-
this.si = BigInt(0); // partial signature scalar
|
|
208
|
-
if (messageHash.length !== 32) {
|
|
209
|
-
throw new Error(`messageHash must be 32 bytes, got ${messageHash.length}`);
|
|
210
|
-
}
|
|
211
|
-
if (!signingPartyIndices.includes(partyIdx)) {
|
|
212
|
-
throw new Error(`partyIdx ${partyIdx} must be included in signingPartyIndices`);
|
|
213
|
-
}
|
|
214
|
-
if (signingPartyIndices.length < 2) {
|
|
215
|
-
throw new Error('signingPartyIndices must contain at least 2 parties');
|
|
216
|
-
}
|
|
217
|
-
this.partyIdx = partyIdx;
|
|
218
|
-
this.signingPartyIndices = signingPartyIndices;
|
|
219
|
-
this.messageHash = messageHash;
|
|
220
|
-
this.derivationPath = derivationPath;
|
|
221
|
-
const ks = (0, cbor_x_1.decode)(keyShare);
|
|
222
|
-
// Support both full keyshare (s_i / x_i_list / public_key / root_chain_code)
|
|
223
|
-
// and reduced keyshare (prv / xList / pub) as produced by Dkg.getReducedKeyShare().
|
|
224
|
-
const privBytes = ks.s_i ?? ks.prv;
|
|
225
|
-
const pubBytes = ks.public_key ?? ks.pub;
|
|
226
|
-
const ccBytes = ks.root_chain_code ?? ks.rootChainCode;
|
|
227
|
-
const xList = ks.x_i_list ?? ks.xList;
|
|
228
|
-
const si = bigFromBuf(Buffer.from(privBytes));
|
|
229
|
-
const rootPub = Buffer.from(pubBytes); // 33-byte compressed
|
|
230
|
-
const rootCC = Buffer.from(ccBytes); // 32-byte chaincode
|
|
231
|
-
// ── BIP-32 derivation ──────────────────────────────────────────────────
|
|
232
|
-
const path = parsePath(derivationPath);
|
|
233
|
-
let finalPubKey = rootPub;
|
|
234
|
-
let totalIL = BigInt(0);
|
|
235
|
-
if (path.length > 0) {
|
|
236
|
-
const derived = derivePath(rootPub, rootCC, path);
|
|
237
|
-
totalIL = derived.totalIL;
|
|
238
|
-
finalPubKey = derived.finalPubKey;
|
|
239
|
-
}
|
|
240
|
-
// ── Lagrange coefficient ───────────────────────────────────────────────
|
|
241
|
-
const li = computeLagrangeCoeff(xList, partyIdx, signingPartyIndices);
|
|
242
|
-
// ── BIP-340 public key parity adjustment ───────────────────────────────
|
|
243
|
-
// BIP-340 uses the x-only public key; the "canonical" key has even y.
|
|
244
|
-
// If the final derived public key has odd y, negate the private key.
|
|
245
|
-
const pYIsOdd = finalPubKey[0] === 0x03;
|
|
246
|
-
this.pubKeyX = finalPubKey.slice(1); // 32-byte x-only
|
|
247
|
-
// ── Effective private share ────────────────────────────────────────────
|
|
248
|
-
// Base share contribution: λ_i · s_i
|
|
249
|
-
let eff = scalarMod(li * si);
|
|
250
|
-
// BIP-32 IL adjustment: the party with the smallest index in the signing
|
|
251
|
-
// set absorbs the entire totalIL so that Lagrange interpolation over the
|
|
252
|
-
// adjusted shares reconstructs the correct child private key.
|
|
253
|
-
//
|
|
254
|
-
// sum_{k∈S} λ_k · s_k_adj = d_root + totalIL (= d_child)
|
|
255
|
-
//
|
|
256
|
-
// where s_min_adj = s_min + totalIL · λ_min^{-1}, s_k_adj = s_k (k≠min).
|
|
257
|
-
//
|
|
258
|
-
// From this party's perspective, the effective contribution is:
|
|
259
|
-
// if this is the min party: λ_min · s_min_adj = λ_min·s_min + totalIL
|
|
260
|
-
// otherwise: λ_k · s_k (unchanged)
|
|
261
|
-
const isMinParty = partyIdx === Math.min(...signingPartyIndices);
|
|
262
|
-
if (isMinParty && totalIL !== BigInt(0)) {
|
|
263
|
-
eff = scalarMod(eff + totalIL);
|
|
264
|
-
}
|
|
265
|
-
// If P.y is odd, negate the effective contribution.
|
|
266
|
-
if (pYIsOdd) {
|
|
267
|
-
eff = scalarMod(N - eff);
|
|
268
|
-
}
|
|
269
|
-
this.effectivePriv = eff;
|
|
270
|
-
}
|
|
271
|
-
/** The combined 64-byte BIP-340 Schnorr signature `(R.x_32 ‖ s_32)`. Available after `Complete`. */
|
|
272
|
-
get signature() {
|
|
273
|
-
if (!this._signature) {
|
|
274
|
-
throw new Error('Signature not produced yet.');
|
|
275
|
-
}
|
|
276
|
-
return this._signature;
|
|
277
|
-
}
|
|
278
|
-
get dsgState() {
|
|
279
|
-
return this.state;
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Round 1: generate a fresh ephemeral nonce and broadcast the nonce point R_i.
|
|
283
|
-
* @returns Broadcast message containing the 33-byte compressed nonce point.
|
|
284
|
-
*/
|
|
285
|
-
async init() {
|
|
286
|
-
if (this.state !== SchnorrDsgState.Uninitialized) {
|
|
287
|
-
throw new Error('SchnorrDsg session already initialized.');
|
|
288
|
-
}
|
|
289
|
-
// Sample a random nonce scalar k_i in [1, N).
|
|
290
|
-
let kiBuf;
|
|
291
|
-
do {
|
|
292
|
-
kiBuf = Buffer.from((0, crypto_1.randomBytes)(32));
|
|
293
|
-
this.ki = bigFromBuf(kiBuf);
|
|
294
|
-
} while (this.ki === BigInt(0) || this.ki >= N);
|
|
295
|
-
this.Ri = G.multiply(this.ki);
|
|
296
|
-
this.state = SchnorrDsgState.Round1;
|
|
297
|
-
return {
|
|
298
|
-
payload: new Uint8Array(Buffer.from(this.Ri.toRawBytes(true))), // 33 bytes compressed
|
|
299
|
-
from: this.partyIdx,
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* Process incoming messages for the current round:
|
|
304
|
-
*
|
|
305
|
-
* - Round 1 → receives nonce point `R_j` → returns partial scalar `s_i`.
|
|
306
|
-
* - Round 2 → receives partial scalar `s_j` → produces final signature.
|
|
307
|
-
*/
|
|
308
|
-
handleIncomingMessages(messages) {
|
|
309
|
-
if (this.state === SchnorrDsgState.Round1) {
|
|
310
|
-
return this._handleRound1(messages);
|
|
311
|
-
}
|
|
312
|
-
if (this.state === SchnorrDsgState.Round2) {
|
|
313
|
-
return this._handleRound2(messages);
|
|
314
|
-
}
|
|
315
|
-
throw new Error(`handleIncomingMessages called in unexpected state: ${SchnorrDsgState[this.state]}`);
|
|
316
|
-
}
|
|
317
|
-
// ── Private round handlers ────────────────────────────────────────────────────
|
|
318
|
-
/**
|
|
319
|
-
* Round 1: receive R_j, compute combined R, apply BIP-340 parity, compute s_i.
|
|
320
|
-
*/
|
|
321
|
-
_handleRound1(messages) {
|
|
322
|
-
if (messages.broadcastMessages.length !== 1) {
|
|
323
|
-
throw new Error(`Round 1: expected 1 broadcast message (R_j), got ${messages.broadcastMessages.length}`);
|
|
324
|
-
}
|
|
325
|
-
if (!this.Ri)
|
|
326
|
-
throw new Error('Nonce point not set — call init() first.');
|
|
327
|
-
const Rj = secp256k1_1.secp256k1.ProjectivePoint.fromHex(Buffer.from(messages.broadcastMessages[0].payload).toString('hex'));
|
|
328
|
-
// Combine: R = R_i + R_j
|
|
329
|
-
const R_raw = this.Ri.add(Rj);
|
|
330
|
-
// BIP-340: R.y must be even. If odd, negate k_i (both parties will agree on
|
|
331
|
-
// the sign since they both see the same R = R_i + R_j).
|
|
332
|
-
const R_yIsOdd = R_raw.y % BigInt(2) === BigInt(1);
|
|
333
|
-
if (R_yIsOdd) {
|
|
334
|
-
this.ki = scalarMod(N - this.ki);
|
|
335
|
-
}
|
|
336
|
-
// Store the parity-normalised R (even y).
|
|
337
|
-
this.R_combined = R_yIsOdd ? R_raw.negate() : R_raw;
|
|
338
|
-
// BIP-340 challenge: e = H_tag("BIP0340/challenge", R.x_32 ‖ P.x_32 ‖ msg)
|
|
339
|
-
const Rx = buf32(this.R_combined.x);
|
|
340
|
-
const e = bigFromBuf(taggedHash('BIP0340/challenge', Rx, this.pubKeyX, this.messageHash));
|
|
341
|
-
// Partial signature: s_i = k_i + e · effectivePriv_i (mod N)
|
|
342
|
-
this.si = scalarMod(this.ki + scalarMod(e * this.effectivePriv));
|
|
343
|
-
this.state = SchnorrDsgState.Round2;
|
|
344
|
-
return {
|
|
345
|
-
broadcastMessages: [
|
|
346
|
-
{
|
|
347
|
-
payload: new Uint8Array(buf32(this.si)), // 32 bytes
|
|
348
|
-
from: this.partyIdx,
|
|
349
|
-
},
|
|
350
|
-
],
|
|
351
|
-
p2pMessages: [],
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* Round 2 (combine): receive s_j, produce the final BIP-340 Schnorr signature.
|
|
356
|
-
*/
|
|
357
|
-
_handleRound2(messages) {
|
|
358
|
-
if (messages.broadcastMessages.length !== 1) {
|
|
359
|
-
throw new Error(`Round 2: expected 1 broadcast message (s_j), got ${messages.broadcastMessages.length}`);
|
|
360
|
-
}
|
|
361
|
-
if (!this.R_combined)
|
|
362
|
-
throw new Error('R_combined not set — handleRound1 must run first.');
|
|
363
|
-
const sj = bigFromBuf(Buffer.from(messages.broadcastMessages[0].payload));
|
|
364
|
-
const s = scalarMod(this.si + sj);
|
|
365
|
-
this._signature = {
|
|
366
|
-
R: new Uint8Array(buf32(this.R_combined.x)),
|
|
367
|
-
S: new Uint8Array(buf32(s)),
|
|
368
|
-
};
|
|
369
|
-
this.state = SchnorrDsgState.Complete;
|
|
370
|
-
return { broadcastMessages: [], p2pMessages: [] };
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
exports.SchnorrDsg = SchnorrDsg;
|
|
374
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHNnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rzcy9zY2hub3JyLWRrbHMvZHNnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRzs7O0FBRUgsdURBQWlFO0FBQ2pFLG1DQUE2RDtBQUM3RCxtQ0FBZ0M7QUFHaEMsa0ZBQWtGO0FBRWxGLE1BQU0sQ0FBQyxHQUFHLHFCQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQjtBQUMvQyxNQUFNLENBQUMsR0FBRyxxQkFBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7QUFFekMsa0ZBQWtGO0FBRWxGLDhCQUE4QjtBQUM5QixTQUFTLFNBQVMsQ0FBQyxDQUFTO0lBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELHdEQUF3RDtBQUN4RCxTQUFTLFlBQVksQ0FBQyxDQUFTO0lBQzdCLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxPQUFPLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxD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LENBQUMsQ0FBQztRQUVsQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxDQUFDLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFFdEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBck9ELGdDQXFPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHdvLXBhcnR5IEJJUC0zNDAgU2Nobm9yciB0aHJlc2hvbGQgc2lnbmluZyAoU2Nobm9yckRzZykuXG4gKlxuICogV29ya3Mgd2l0aCB0aGUgU2hhbWlyIGtleXNoYXJlcyBwcm9kdWNlZCBieSBgRGtsc0RrZ2AgKERLTFMyMyBrZXkgZ2VuZXJhdGlvbikuXG4gKiBObyBuZXcgV0FTTSBpcyByZXF1aXJlZDoga2V5IG1hdGVyaWFsIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgQ0JPUi1lbmNvZGVkXG4gKiBrZXlzaGFyZSwgTGFncmFuZ2UgaW50ZXJwb2xhdGlvbiBpcyBjb21wdXRlZCBpbiBUeXBlU2NyaXB0LCBhbmQgQklQLTM0MCBTY2hub3JyXG4gKiBhbGdlYnJhIGlzIHBlcmZvcm1lZCB3aXRoIGBAbm9ibGUvY3VydmVzL3NlY3AyNTZrMWAuXG4gKlxuICogUHJvdG9jb2wgKDIgYnJvYWRjYXN0IHJvdW5kcyk6XG4gKlxuICogICBSb3VuZCAxICBpbml0KClcbiAqICAgICDigKIgRWFjaCBwYXJ0eSBnZW5lcmF0ZXMgYSByYW5kb20gbm9uY2Ugc2NhbGFyIGtfaS5cbiAqICAgICDigKIgQnJvYWRjYXN0cyB0aGUgbm9uY2UgcG9pbnQgUl9pID0ga19pICogRyAgKDMzLWJ5dGUgY29tcHJlc3NlZCkuXG4gKlxuICogICBSb3VuZCAyICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtSX2pdKVxuICogICAgIOKAoiBDb21wdXRlIGNvbWJpbmVkIG5vbmNlIFIgPSBSX2kgKyBSX2ouXG4gKiAgICAg4oCiIElmIFIueSBpcyBvZGQsIG5lZ2F0ZSBrX2kgIChCSVAtMzQwIHJlcXVpcmVzIGV2ZW4teSBSKS5cbiAqICAgICDigKIgQ29tcHV0ZSBCSVAtMzQwIGNoYWxsZW5nZSAgZSA9IEgoXCJCSVAwMzQwL2NoYWxsZW5nZVwiLCBSLngg4oCWIFAueCDigJYgbXNnKS5cbiAqICAgICDigKIgQ29tcHV0ZSBwYXJ0aWFsIHNpZ25hdHVyZSAgc19pID0ga19pICsgZSDCtyDOu19pIMK3IHByaXZfaSAgIChtb2QgbikuXG4gKiAgICAg4oCiIEJyb2FkY2FzdHMgc19pIGFzIDMyLWJ5dGUgYmlnLWVuZGlhbiBzY2FsYXIuXG4gKlxuICogICBDb21iaW5lICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFtzX2pdKVxuICogICAgIOKAoiBzID0gc19pICsgc19qICBtb2Qgbi5cbiAqICAgICDigKIgc2lnbmF0dXJlID0gQnVmZmVyLmNvbmNhdChbUi54XzMyLCBzXzMyXSkgIOKAlCA2NC1ieXRlIEJJUC0zNDAgU2Nobm9yci5cbiAqXG4gKiBCSVAtMzIgbm9uLWhhcmRlbmVkIGRlcml2YXRpb24gaXMgc3VwcG9ydGVkLiAgRm9yIHBhdGggYG0vYS9iLy4uLmAsIHRoZSB0b3RhbFxuICogSUwgc2NhbGFyIChzdW0gb2YgcGVyLWxldmVsIEhNQUMtU0hBNTEyIGxlZnQgaGFsdmVzKSBpcyBjb21wdXRlZCBmcm9tIHRoZVxuICogc2hhcmVkIHB1YmxpYyBrZXkgLyBjaGFpbmNvZGUuICBUaGUgcGFydHkgd2l0aCB0aGUgc21hbGxlc3QgaW5kZXggaW5cbiAqIGBzaWduaW5nUGFydHlJbmRpY2VzYCBhYnNvcmJzIHRoZSBlbnRpcmUgSUwgYWRqdXN0bWVudCBzbyB0aGF0IExhZ3JhbmdlXG4gKiBpbnRlcnBvbGF0aW9uIHN0aWxsIHJlY29uc3RydWN0cyB0aGUgY29ycmVjdCBjaGlsZCBwcml2YXRlIGtleS5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICogICBCSVAtMzQwICBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQwLm1lZGlhd2lraVxuICogICBGUk9TVCAgICBodHRwczovL2VwcmludC5pYWNyLm9yZy8yMDIwLzg1MlxuICovXG5cbmltcG9ydCB7IHNlY3AyNTZrMSBhcyBub2JsZVNlY3AgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBjcmVhdGVIbWFjLCByYW5kb21CeXRlcywgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0IHsgRGVzZXJpYWxpemVkQnJvYWRjYXN0TWVzc2FnZSwgRGVzZXJpYWxpemVkTWVzc2FnZXMgfSBmcm9tICcuLi9lY2RzYS1ka2xzL3R5cGVzJztcblxuLy8g4pSA4pSAIEN1cnZlIGNvbnN0YW50cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgTiA9IG5vYmxlU2VjcC5DVVJWRS5uOyAvLyBzZWNwMjU2azEgb3JkZXJcbmNvbnN0IEcgPSBub2JsZVNlY3AuUHJvamVjdGl2ZVBvaW50LkJBU0U7XG5cbi8vIOKUgOKUgCBTY2FsYXIgYXJpdGhtZXRpYyBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogUmVkdWNlIGB4YCBpbnRvIFswLCBOKS4gKi9cbmZ1bmN0aW9uIHNjYWxhck1vZCh4OiBiaWdpbnQpOiBiaWdpbnQge1xuICByZXR1cm4gKCh4ICUgTikgKyBOKSAlIE47XG59XG5cbi8qKiBNb2R1bGFyIGludmVyc2UgdmlhIGV4dGVuZGVkIEV1Y2xpZGVhbiBhbGdvcml0aG0uICovXG5mdW5jdGlvbiBzY2FsYXJJbnZlcnQoYTogYmlnaW50KTogYmlnaW50IHtcbiAgbGV0IFtyLCBycF0gPSBbTiwgc2NhbGFyTW9kKGEpXTtcbiAgbGV0IFtzLCBzcF0gPSBbQmlnSW50KDApLCBCaWdJbnQoMSldO1xuICB3aGlsZSAocnAgIT09IEJpZ0ludCgwKSkge1xuICAgIGNvbnN0IHEgPSByIC8gcnA7XG4gICAgW3IsIHJwXSA9IFtycCwgciAtIHEgKiBycF07XG4gICAgW3MsIHNwXSA9IFtzcCwgcyAtIHEgKiBzcF07XG4gIH1cbiAgaWYgKHIgIT09IEJpZ0ludCgxKSkgdGhyb3cgbmV3IEVycm9yKCdzY2FsYXJJbnZlcnQ6IGlucHV0IGhhcyBubyBpbnZlcnNlIG1vZCBOJyk7XG4gIHJldHVybiBzY2FsYXJNb2Qocyk7XG59XG5cbi8qKiBCaWctZW5kaWFuIGBCdWZmZXIgfCBVaW50OEFycmF5YCDihpIgYGJpZ2ludGAuICovXG5mdW5jdGlvbiBiaWdGcm9tQnVmKGI6IEJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICBjb25zdCBoZXggPSBCdWZmZXIuZnJvbShiKS50b1N0cmluZygnaGV4Jyk7XG4gIHJldHVybiBoZXggPyBCaWdJbnQoJzB4JyArIGhleCkgOiBCaWdJbnQoMCk7XG59XG5cbi8qKiBgYmlnaW50YCDihpIgMzItYnl0ZSBiaWctZW5kaWFuIGBCdWZmZXJgLiAqL1xuZnVuY3Rpb24gYnVmMzIobjogYmlnaW50KTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNjYWxhck1vZChuKS50b1N0cmluZygxNikucGFkU3RhcnQoNjQsICcwJyksICdoZXgnKTtcbn1cblxuLy8g4pSA4pSAIEJJUC0zNDAgdGFnZ2VkIGhhc2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSF90YWcoZGF0YS4uLikgPSBTSEEyNTYoIFNIQTI1Nih0YWcpIOKAliBTSEEyNTYodGFnKSDigJYgZGF0YS4uLiApXG4gKiBhcyBzcGVjaWZpZWQgaW4gQklQLTM0MC5cbiAqL1xuZnVuY3Rpb24gdGFnZ2VkSGFzaCh0YWc6IHN0cmluZywgLi4uZGF0YTogQnVmZmVyW10pOiBCdWZmZXIge1xuICBjb25zdCB0YWdIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHRhZykuZGlnZXN0KCk7XG4gIGNvbnN0IGggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgaC51cGRhdGUodGFnSGFzaCk7XG4gIGgudXBkYXRlKHRhZ0hhc2gpO1xuICBmb3IgKGNvbnN0IGQgb2YgZGF0YSkgaC51cGRhdGUoZCk7XG4gIHJldHVybiBoLmRpZ2VzdCgpO1xufVxuXG4vLyDilIDilIAgTGFncmFuZ2UgY29lZmZpY2llbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgTGFncmFuZ2UgY29lZmZpY2llbnQgzrtfaSBmb3IgcGFydHkgYHBhcnR5SWR4YCBldmFsdWF0ZWQgYXQgeD0wLFxuICogdXNpbmcgb25seSB0aGUgeC1jb29yZGluYXRlcyBvZiB0aGUgcGFydGllcyBpbiBgc2lnbmluZ1BhcnR5SW5kaWNlc2AuXG4gKlxuICogzrtfaSA9IOKIj197auKJoGksIGriiIhTfSAgeF9qIC8gKHhfaiDiiJIgeF9pKSAgIG1vZCBOXG4gKlxuICogQHBhcmFtIHhMaXN0ICAgICAgIEZ1bGwgYHhfaV9saXN0YCBmcm9tIHRoZSBES0xTIGtleXNoYXJlIChvbmUgMzItYnl0ZSBhcnJheSBwZXIgcGFydHkpLlxuICogQHBhcmFtIHBhcnR5SWR4ICAgIFRoaXMgcGFydHkncyBpbmRleCAoMC1iYXNlZCBpbiB0aGUgZ2xvYmFsIHBhcnR5IGxpc3QpLlxuICogQHBhcmFtIHNpZ25pbmdQYXJ0eUluZGljZXMgIEluZGljZXMgb2YgQUxMIHBhcnRpZXMgcGFydGljaXBhdGluZyBpbiB0aGlzIHNpZ25pbmcgc2Vzc2lvbi5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUxhZ3JhbmdlQ29lZmYoeExpc3Q6IG51bWJlcltdW10sIHBhcnR5SWR4OiBudW1iZXIsIHNpZ25pbmdQYXJ0eUluZGljZXM6IG51bWJlcltdKTogYmlnaW50IHtcbiAgY29uc3QgeGkgPSBiaWdGcm9tQnVmKEJ1ZmZlci5mcm9tKHhMaXN0W3BhcnR5SWR4XSkpO1xuICBsZXQgbnVtID0gQmlnSW50KDEpO1xuICBsZXQgZGVuID0gQmlnSW50KDEpO1xuICBmb3IgKGNvbnN0IGogb2Ygc2lnbmluZ1BhcnR5SW5kaWNlcykge1xuICAgIGlmIChqID09PSBwYXJ0eUlkeCkgY29udGludWU7XG4gICAgY29uc3QgeGogPSBiaWdGcm9tQnVmKEJ1ZmZlci5mcm9tKHhMaXN0W2pdKSk7XG4gICAgbnVtID0gc2NhbGFyTW9kKG51bSAqIHhqKTtcbiAgICBkZW4gPSBzY2FsYXJNb2QoZGVuICogc2NhbGFyTW9kKHhqIC0geGkpKTtcbiAgfVxuICByZXR1cm4gc2NhbGFyTW9kKG51bSAqIHNjYWxhckludmVydChkZW4pKTtcbn1cblxuLy8g4pSA4pSAIEJJUC0zMiBub24taGFyZGVuZWQgZGVyaXZhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBQYXJzZSBhIGRlcml2YXRpb24gcGF0aCBzdHJpbmcgKGAnbS8wLzEvMidgKSBpbnRvIGFuIGFycmF5IG9mIGNoaWxkIGluZGljZXMuXG4gKiBIYXJkZW5lZCBwYXRocyAoYCdtLzQ0Jy8wJ2ApIGFyZSBub3Qgc3VwcG9ydGVkLlxuICovXG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aDogc3RyaW5nKTogbnVtYmVyW10ge1xuICBpZiAocGF0aCA9PT0gJ20nIHx8IHBhdGggPT09ICcnKSByZXR1cm4gW107XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5yZXBsYWNlKC9ebVxcLz8vLCAnJykuc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHBhcnRzLm1hcCgocCkgPT4ge1xuICAgIGlmIChwLmVuZHNXaXRoKFwiJ1wiKSkgdGhyb3cgbmV3IEVycm9yKCdIYXJkZW5lZCBkZXJpdmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNjaG5vcnIgdGhyZXNob2xkIHNpZ25pbmcuJyk7XG4gICAgY29uc3QgaWR4ID0gcGFyc2VJbnQocCwgMTApO1xuICAgIGlmIChpc05hTihpZHgpIHx8IGlkeCA8IDAgfHwgaWR4ID49IDB4ODAwMDAwMDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXRoIGNvbXBvbmVudDogJHtwfWApO1xuICAgIHJldHVybiBpZHg7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlcml2ZSB0aGUgdG90YWwgSUwgc2NhbGFyIGFuZCBmaW5hbCBjaGFpbmNvZGUgZm9yIGEgbm9uLWhhcmRlbmVkIEJJUC0zMiBwYXRoLlxuICpcbiAqIEJJUC0zMiBub24taGFyZGVuZWQgY2hpbGQga2V5IHVwZGF0ZTpcbiAqICAgSSA9IEhNQUMtU0hBNTEyKGtleT1jaGFpbkNvZGUsIGRhdGE9Y29tcHJlc3NlZFB1YktleSDigJYgc2VyMzIoaW5kZXgpKVxuICogICBjaGlsZFByaXYgICAgPSBwYXJlbnRQcml2ICsgSUwgICAobW9kIE4pXG4gKiAgIGNoaWxkUHViS2V5ICA9IHBhcmVudFB1YktleSArIElMICogR1xuICogICBjaGlsZENoYWluQ29kZSA9IElSXG4gKlxuICogRm9yIHRocmVzaG9sZCBzaWduaW5nLCB0aGUgSUwgc2NhbGFycyBhcmUgYWRkaXRpdmUsIHNvIHRoZSB0b3RhbCBwcml2YXRlLWtleVxuICogYWRqdXN0bWVudCBpcyBgdG90YWxJTCA9IM6jIElMX2tgLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYXBwbHlpbmcgdGhpc1xuICogdG8gdGhlIHJpZ2h0IHBhcnR5J3Mgc2hhcmUuXG4gKlxuICogQHJldHVybnMgYHsgdG90YWxJTCwgZmluYWxDaGFpbkNvZGUsIGZpbmFsUHViS2V5IH1gIGZvciB0aGUgZGVyaXZlZCBjaGlsZC5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlUGF0aChcbiAgcm9vdFB1YktleTogQnVmZmVyLFxuICByb290Q2hhaW5Db2RlOiBCdWZmZXIsXG4gIHBhdGg6IG51bWJlcltdXG4pOiB7IHRvdGFsSUw6IGJpZ2ludDsgZmluYWxDaGFpbkNvZGU6IEJ1ZmZlcjsgZmluYWxQdWJLZXk6IEJ1ZmZlciB9IHtcbiAgbGV0IHB1YiA9IHJvb3RQdWJLZXk7IC8vIDMzLWJ5dGUgY29tcHJlc3NlZFxuICBsZXQgY2MgPSByb290Q2hhaW5Db2RlOyAvLyAzMi1ieXRlIGNoYWluY29kZVxuICBsZXQgdG90YWxJTCA9IEJpZ0ludCgwKTtcblxuICBmb3IgKGNvbnN0IGluZGV4IG9mIHBhdGgpIHtcbiAgICBjb25zdCBpbmRleEJ1ZiA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBpbmRleEJ1Zi53cml0ZVVJbnQzMkJFKGluZGV4LCAwKTtcblxuICAgIGNvbnN0IEkgPSBCdWZmZXIuZnJvbShjcmVhdGVIbWFjKCdzaGE1MTInLCBjYykudXBkYXRlKHB1YikudXBkYXRlKGluZGV4QnVmKS5kaWdlc3QoKSk7XG4gICAgY29uc3QgSUwgPSBiaWdGcm9tQnVmKEkuc2xpY2UoMCwgMzIpKTtcbiAgICBjb25zdCBJUiA9IEkuc2xpY2UoMzIpO1xuXG4gICAgaWYgKElMID49IE4pIHRocm93IG5ldyBFcnJvcignQklQLTMyIGRlcml2ZWQgSUwgPj0gTjsgdGhpcyBwYXRoIGlzIGludmFsaWQgKGFzdHJvbm9taWNhbGx5IHVubGlrZWx5KS4nKTtcblxuICAgIHRvdGFsSUwgPSBzY2FsYXJNb2QodG90YWxJTCArIElMKTtcbiAgICBjYyA9IElSO1xuXG4gICAgLy8gQWR2YW5jZSB0aGUgcHVibGljIGtleSB0byB0aGUgY2hpbGQgbGV2ZWwuXG4gICAgY29uc3QgcHViUG9pbnQgPSBub2JsZVNlY3AuUHJvamVjdGl2ZVBvaW50LmZyb21IZXgocHViLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgY29uc3QgY2hpbGRQb2ludCA9IHB1YlBvaW50LmFkZChHLm11bHRpcGx5KElMKSk7XG4gICAgcHViID0gQnVmZmVyLmZyb20oY2hpbGRQb2ludC50b1Jhd0J5dGVzKHRydWUpKTtcbiAgfVxuXG4gIHJldHVybiB7IHRvdGFsSUwsIGZpbmFsQ2hhaW5Db2RlOiBjYywgZmluYWxQdWJLZXk6IHB1YiB9O1xufVxuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiA2NC1ieXRlIEJJUC0zNDAgU2Nobm9yciBzaWduYXR1cmUgYChSLnhfMzIg4oCWIHNfMzIpYC4gKi9cbmV4cG9ydCB0eXBlIFNjaG5vcnJEa2xzU2lnbmF0dXJlID0ge1xuICAvKiogMzItYnl0ZSB4LWNvb3JkaW5hdGUgb2YgdGhlIG5vbmNlIHBvaW50IFIuICovXG4gIFI6IFVpbnQ4QXJyYXk7XG4gIC8qKiAzMi1ieXRlIFNjaG5vcnIgc2NhbGFyIHMuICovXG4gIFM6IFVpbnQ4QXJyYXk7XG59O1xuXG5leHBvcnQgZW51bSBTY2hub3JyRHNnU3RhdGUge1xuICBVbmluaXRpYWxpemVkID0gMCxcbiAgUm91bmQxLCAvLyB3YWl0aW5nIHRvIHJlY2VpdmUgdGhlIG90aGVyIHBhcnR5J3Mgbm9uY2UgcG9pbnQgUl9qXG4gIFJvdW5kMiwgLy8gd2FpdGluZyB0byByZWNlaXZlIHRoZSBvdGhlciBwYXJ0eSdzIHBhcnRpYWwgc2NhbGFyIHNfalxuICBDb21wbGV0ZSxcbn1cblxuLy8g4pSA4pSAIFNjaG5vcnJEc2cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVHdvLXBhcnR5IEJJUC0zNDAgU2Nobm9yciB0aHJlc2hvbGQgc2lnbmluZyBzZXNzaW9uLlxuICpcbiAqIENvbXBhdGlibGUgd2l0aCBrZXlzaGFyZXMgcHJvZHVjZWQgYnkgYERrbHNEa2cuRGtnYCAoREtMUzIzIGtleSBnZW5lcmF0aW9uKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFBhcnR5IDAgKEhTTSAvIEJpdEdvKSBhbmQgcGFydHkgMSAodXNlciksIDItb2YtMiBES0cga2V5c2hhcmVzLlxuICogY29uc3QgcGFydHkwID0gbmV3IFNjaG5vcnJEc2coa3MwLCAwLCBbMCwgMV0sICdtLzAnLCBoYXNoMzIpO1xuICogY29uc3QgcGFydHkxID0gbmV3IFNjaG5vcnJEc2coa3MxLCAxLCBbMCwgMV0sICdtLzAnLCBoYXNoMzIpO1xuICpcbiAqIGNvbnN0IHIwID0gYXdhaXQgcGFydHkwLmluaXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUm91bmQgMVxuICogY29uc3QgcjEgPSBhd2FpdCBwYXJ0eTEuaW5pdCgpO1xuICpcbiAqIGNvbnN0IHMwID0gcGFydHkwLmhhbmRsZUluY29taW5nTWVzc2FnZXMoeyBicm9hZGNhc3RNZXNzYWdlczogW3IxXSwgcDJwTWVzc2FnZXM6IFtdIH0pOyAvLyBSb3VuZCAyXG4gKiBjb25zdCBzMSA9IHBhcnR5MS5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtyMF0sIHAycE1lc3NhZ2VzOiBbXSB9KTtcbiAqXG4gKiBwYXJ0eTAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7IGJyb2FkY2FzdE1lc3NhZ2VzOiBzMS5icm9hZGNhc3RNZXNzYWdlcywgcDJwTWVzc2FnZXM6IFtdIH0pOyAvLyBDb21iaW5lXG4gKiAvLyBwYXJ0eTAuc2lnbmF0dXJlICDihpAgNjQtYnl0ZSBCSVAtMzQwIFNjaG5vcnIgc2lnXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNjaG5vcnJEc2cge1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcnR5SWR4OiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2lnbmluZ1BhcnR5SW5kaWNlczogbnVtYmVyW107XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUhhc2g6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXJpdmF0aW9uUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRlOiBTY2hub3JyRHNnU3RhdGUgPSBTY2hub3JyRHNnU3RhdGUuVW5pbml0aWFsaXplZDtcbiAgcHJpdmF0ZSBfc2lnbmF0dXJlOiBTY2hub3JyRGtsc1NpZ25hdHVyZSB8IHVuZGVmaW5lZDtcblxuICAvLyBDb21wdXRlZCBpbiBjb25zdHJ1Y3RvclxuICBwcml2YXRlIHJlYWRvbmx5IGVmZmVjdGl2ZVByaXY6IGJpZ2ludDsgLy8gzrtfaSDCtyBwcml2X2kgKHBhcml0eS1hZGp1c3RlZCwgZGVyaXZhdGlvbi1hZGp1c3RlZClcbiAgcHJpdmF0ZSByZWFkb25seSBwdWJLZXlYOiBCdWZmZXI7IC8vIDMyLWJ5dGUgeC1vbmx5IGZpbmFsIHB1YmxpYyBrZXkgKGZvciBjaGFsbGVuZ2UgaGFzaClcblxuICAvLyBTZXQgaW4gaW5pdCgpXG4gIHByaXZhdGUga2kgPSBCaWdJbnQoMCk7IC8vIGVwaGVtZXJhbCBub25jZSBzY2FsYXJcbiAgcHJpdmF0ZSBSaTogUmV0dXJuVHlwZTx0eXBlb2Ygbm9ibGVTZWNwLlByb2plY3RpdmVQb2ludC5mcm9tSGV4PiB8IHVuZGVmaW5lZDtcblxuICAvLyBTZXQgaW4gcm91bmQtMSBoYW5kbGVyXG4gIHByaXZhdGUgUl9jb21iaW5lZDogUmV0dXJuVHlwZTx0eXBlb2Ygbm9ibGVTZWNwLlByb2plY3RpdmVQb2ludC5mcm9tSGV4PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzaSA9IEJpZ0ludCgwKTsgLy8gcGFydGlhbCBzaWduYXR1cmUgc2NhbGFyXG5cbiAgLyoqXG4gICAqIEBwYXJhbSBrZXlTaGFyZSAgICAgICAgICAgIENCT1ItZW5jb2RlZCBES0xTIGtleXNoYXJlIChmdWxsIG9yIHJlZHVjZWQgZm9ybWF0KS5cbiAgICogQHBhcmFtIHBhcnR5SWR4ICAgICAgICAgICAgVGhpcyBwYXJ0eSdzIGluZGV4IGluIHRoZSBES0cgKDAtYmFzZWQsIG11c3QgYmUgaW4gYHNpZ25pbmdQYXJ0eUluZGljZXNgKS5cbiAgICogQHBhcmFtIHNpZ25pbmdQYXJ0eUluZGljZXMgSW5kaWNlcyBvZiBBTEwgcGFydGllcyBwYXJ0aWNpcGF0aW5nIGluIHRoaXMgc2lnbmluZyBzZXNzaW9uLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGNvbnRhaW4gYHBhcnR5SWR4YC4gIFRoZSBMYWdyYW5nZSBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIHN1YnNldC5cbiAgICogQHBhcmFtIGRlcml2YXRpb25QYXRoICAgICAgQklQLTMyIG5vbi1oYXJkZW5lZCBwYXRoIChlLmcuIGAnbS8wJ2ApLiAgRGVmYXVsdHMgdG8gcm9vdCBgJ20nYC5cbiAgICogQHBhcmFtIG1lc3NhZ2VIYXNoICAgICAgICAgMzItYnl0ZSBtZXNzYWdlIGhhc2ggdG8gc2lnbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGtleVNoYXJlOiBCdWZmZXIsXG4gICAgcGFydHlJZHg6IG51bWJlcixcbiAgICBzaWduaW5nUGFydHlJbmRpY2VzOiBudW1iZXJbXSxcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIG1lc3NhZ2VIYXNoOiBCdWZmZXJcbiAgKSB7XG4gICAgaWYgKG1lc3NhZ2VIYXNoLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbWVzc2FnZUhhc2ggbXVzdCBiZSAzMiBieXRlcywgZ290ICR7bWVzc2FnZUhhc2gubGVuZ3RofWApO1xuICAgIH1cbiAgICBpZiAoIXNpZ25pbmdQYXJ0eUluZGljZXMuaW5jbHVkZXMocGFydHlJZHgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHBhcnR5SWR4ICR7cGFydHlJZHh9IG11c3QgYmUgaW5jbHVkZWQgaW4gc2lnbmluZ1BhcnR5SW5kaWNlc2ApO1xuICAgIH1cbiAgICBpZiAoc2lnbmluZ1BhcnR5SW5kaWNlcy5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25pbmdQYXJ0eUluZGljZXMgbXVzdCBjb250YWluIGF0IGxlYXN0IDIgcGFydGllcycpO1xuICAgIH1cblxuICAgIHRoaXMucGFydHlJZHggPSBwYXJ0eUlkeDtcbiAgICB0aGlzLnNpZ25pbmdQYXJ0eUluZGljZXMgPSBzaWduaW5nUGFydHlJbmRpY2VzO1xuICAgIHRoaXMubWVzc2FnZUhhc2ggPSBtZXNzYWdlSGFzaDtcbiAgICB0aGlzLmRlcml2YXRpb25QYXRoID0gZGVyaXZhdGlvblBhdGg7XG5cbiAgICBjb25zdCBrcyA9IGRlY29kZShrZXlTaGFyZSk7XG5cbiAgICAvLyBTdXBwb3J0IGJvdGggZnVsbCBrZXlzaGFyZSAoc19pIC8geF9pX2xpc3QgLyBwdWJsaWNfa2V5IC8gcm9vdF9jaGFpbl9jb2RlKVxuICAgIC8vIGFuZCByZWR1Y2VkIGtleXNoYXJlIChwcnYgLyB4TGlzdCAvIHB1YikgYXMgcHJvZHVjZWQgYnkgRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpLlxuICAgIGNvbnN0IHByaXZCeXRlczogbnVtYmVyW10gPSBrcy5zX2kgPz8ga3MucHJ2O1xuICAgIGNvbnN0IHB1YkJ5dGVzOiBudW1iZXJbXSA9IGtzLnB1YmxpY19rZXkgPz8ga3MucHViO1xuICAgIGNvbnN0IGNjQnl0ZXM6IG51bWJlcltdID0ga3Mucm9vdF9jaGFpbl9jb2RlID8/IGtzLnJvb3RDaGFpbkNvZGU7XG4gICAgY29uc3QgeExpc3Q6IG51bWJlcltdW10gPSBrcy54X2lfbGlzdCA/PyBrcy54TGlzdDtcblxuICAgIGNvbnN0IHNpID0gYmlnRnJvbUJ1ZihCdWZmZXIuZnJvbShwcml2Qnl0ZXMpKTtcbiAgICBjb25zdCByb290UHViID0gQnVmZmVyLmZyb20ocHViQnl0ZXMpOyAvLyAzMy1ieXRlIGNvbXByZXNzZWRcbiAgICBjb25zdCByb290Q0MgPSBCdWZmZXIuZnJvbShjY0J5dGVzKTsgLy8gMzItYnl0ZSBjaGFpbmNvZGVcblxuICAgIC8vIOKUgOKUgCBCSVAtMzIgZGVyaXZhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBwYXRoID0gcGFyc2VQYXRoKGRlcml2YXRpb25QYXRoKTtcbiAgICBsZXQgZmluYWxQdWJLZXkgPSByb290UHViO1xuICAgIGxldCB0b3RhbElMID0gQmlnSW50KDApO1xuXG4gICAgaWYgKHBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGVyaXZlZCA9IGRlcml2ZVBhdGgocm9vdFB1Yiwgcm9vdENDLCBwYXRoKTtcbiAgICAgIHRvdGFsSUwgPSBkZXJpdmVkLnRvdGFsSUw7XG4gICAgICBmaW5hbFB1YktleSA9IGRlcml2ZWQuZmluYWxQdWJLZXk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIExhZ3JhbmdlIGNvZWZmaWNpZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IGxpID0gY29tcHV0ZUxhZ3JhbmdlQ29lZmYoeExpc3QsIHBhcnR5SWR4LCBzaWduaW5nUGFydHlJbmRpY2VzKTtcblxuICAgIC8vIOKUgOKUgCBCSVAtMzQwIHB1YmxpYyBrZXkgcGFyaXR5IGFkanVzdG1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gQklQLTM0MCB1c2VzIHRoZSB4LW9ubHkgcHVibGljIGtleTsgdGhlIFwiY2Fub25pY2FsXCIga2V5IGhhcyBldmVuIHkuXG4gICAgLy8gSWYgdGhlIGZpbmFsIGRlcml2ZWQgcHVibGljIGtleSBoYXMgb2RkIHksIG5lZ2F0ZSB0aGUgcHJpdmF0ZSBrZXkuXG4gICAgY29uc3QgcFlJc09kZCA9IGZpbmFsUHViS2V5WzBdID09PSAweDAzO1xuICAgIHRoaXMucHViS2V5WCA9IGZpbmFsUHViS2V5LnNsaWNlKDEpOyAvLyAzMi1ieXRlIHgtb25seVxuXG4gICAgLy8g4pSA4pSAIEVmZmVjdGl2ZSBwcml2YXRlIHNoYXJlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIC8vIEJhc2Ugc2hhcmUgY29udHJpYnV0aW9uOiDOu19pIMK3IHNfaVxuICAgIGxldCBlZmYgPSBzY2FsYXJNb2QobGkgKiBzaSk7XG5cbiAgICAvLyBCSVAtMzIgSUwgYWRqdXN0bWVudDogdGhlIHBhcnR5IHdpdGggdGhlIHNtYWxsZXN0IGluZGV4IGluIHRoZSBzaWduaW5nXG4gICAgLy8gc2V0IGFic29yYnMgdGhlIGVudGlyZSB0b3RhbElMIHNvIHRoYXQgTGFncmFuZ2UgaW50ZXJwb2xhdGlvbiBvdmVyIHRoZVxuICAgIC8vIGFkanVzdGVkIHNoYXJlcyByZWNvbnN0cnVjdHMgdGhlIGNvcnJlY3QgY2hpbGQgcHJpdmF0ZSBrZXkuXG4gICAgLy9cbiAgICAvLyAgIHN1bV97a+KIiFN9IM67X2sgwrcgc19rX2FkaiA9IGRfcm9vdCArIHRvdGFsSUwgICg9IGRfY2hpbGQpXG4gICAgLy9cbiAgICAvLyB3aGVyZSBzX21pbl9hZGogPSBzX21pbiArIHRvdGFsSUwgwrcgzrtfbWluXnstMX0sICBzX2tfYWRqID0gc19rICAoa+KJoG1pbikuXG4gICAgLy9cbiAgICAvLyBGcm9tIHRoaXMgcGFydHkncyBwZXJzcGVjdGl2ZSwgdGhlIGVmZmVjdGl2ZSBjb250cmlidXRpb24gaXM6XG4gICAgLy8gICBpZiB0aGlzIGlzIHRoZSBtaW4gcGFydHk6IM67X21pbiDCtyBzX21pbl9hZGogPSDOu19taW7Ct3NfbWluICsgdG90YWxJTFxuICAgIC8vICAgb3RoZXJ3aXNlOiAgICAgICAgICAgICAgICDOu19rIMK3IHNfayAgICAgICAgICh1bmNoYW5nZWQpXG4gICAgY29uc3QgaXNNaW5QYXJ0eSA9IHBhcnR5SWR4ID09PSBNYXRoLm1pbiguLi5zaWduaW5nUGFydHlJbmRpY2VzKTtcbiAgICBpZiAoaXNNaW5QYXJ0eSAmJiB0b3RhbElMICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgIGVmZiA9IHNjYWxhck1vZChlZmYgKyB0b3RhbElMKTtcbiAgICB9XG5cbiAgICAvLyBJZiBQLnkgaXMgb2RkLCBuZWdhdGUgdGhlIGVmZmVjdGl2ZSBjb250cmlidXRpb24uXG4gICAgaWYgKHBZSXNPZGQpIHtcbiAgICAgIGVmZiA9IHNjYWxhck1vZChOIC0gZWZmKTtcbiAgICB9XG5cbiAgICB0aGlzLmVmZmVjdGl2ZVByaXYgPSBlZmY7XG4gIH1cblxuICAvKiogVGhlIGNvbWJpbmVkIDY0LWJ5dGUgQklQLTM0MCBTY2hub3JyIHNpZ25hdHVyZSBgKFIueF8zMiDigJYgc18zMilgLiBBdmFpbGFibGUgYWZ0ZXIgYENvbXBsZXRlYC4gKi9cbiAgZ2V0IHNpZ25hdHVyZSgpOiBTY2hub3JyRGtsc1NpZ25hdHVyZSB7XG4gICAgaWYgKCF0aGlzLl9zaWduYXR1cmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2lnbmF0dXJlIG5vdCBwcm9kdWNlZCB5ZXQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmU7XG4gIH1cblxuICBnZXQgZHNnU3RhdGUoKTogU2Nobm9yckRzZ1N0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3VuZCAxOiBnZW5lcmF0ZSBhIGZyZXNoIGVwaGVtZXJhbCBub25jZSBhbmQgYnJvYWRjYXN0IHRoZSBub25jZSBwb2ludCBSX2kuXG4gICAqIEByZXR1cm5zIEJyb2FkY2FzdCBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIDMzLWJ5dGUgY29tcHJlc3NlZCBub25jZSBwb2ludC5cbiAgICovXG4gIGFzeW5jIGluaXQoKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlPiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IFNjaG5vcnJEc2dTdGF0ZS5VbmluaXRpYWxpemVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjaG5vcnJEc2cgc2Vzc2lvbiBhbHJlYWR5IGluaXRpYWxpemVkLicpO1xuICAgIH1cblxuICAgIC8vIFNhbXBsZSBhIHJhbmRvbSBub25jZSBzY2FsYXIga19pIGluIFsxLCBOKS5cbiAgICBsZXQga2lCdWY6IEJ1ZmZlcjtcbiAgICBkbyB7XG4gICAgICBraUJ1ZiA9IEJ1ZmZlci5mcm9tKHJhbmRvbUJ5dGVzKDMyKSk7XG4gICAgICB0aGlzLmtpID0gYmlnRnJvbUJ1ZihraUJ1Zik7XG4gICAgfSB3aGlsZSAodGhpcy5raSA9PT0gQmlnSW50KDApIHx8IHRoaXMua2kgPj0gTik7XG5cbiAgICB0aGlzLlJpID0gRy5tdWx0aXBseSh0aGlzLmtpKTtcbiAgICB0aGlzLnN0YXRlID0gU2Nobm9yckRzZ1N0YXRlLlJvdW5kMTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0aGlzLlJpLnRvUmF3Qnl0ZXModHJ1ZSkpKSwgLy8gMzMgYnl0ZXMgY29tcHJlc3NlZFxuICAgICAgZnJvbTogdGhpcy5wYXJ0eUlkeCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IHJvdW5kOlxuICAgKlxuICAgKiAtIFJvdW5kIDEg4oaSIHJlY2VpdmVzIG5vbmNlIHBvaW50IGBSX2pgIOKGkiByZXR1cm5zIHBhcnRpYWwgc2NhbGFyIGBzX2lgLlxuICAgKiAtIFJvdW5kIDIg4oaSIHJlY2VpdmVzIHBhcnRpYWwgc2NhbGFyIGBzX2pgIOKGkiBwcm9kdWNlcyBmaW5hbCBzaWduYXR1cmUuXG4gICAqL1xuICBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2VzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gU2Nobm9yckRzZ1N0YXRlLlJvdW5kMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZVJvdW5kMShtZXNzYWdlcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID09PSBTY2hub3JyRHNnU3RhdGUuUm91bmQyKSB7XG4gICAgICByZXR1cm4gdGhpcy5faGFuZGxlUm91bmQyKG1lc3NhZ2VzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzIGNhbGxlZCBpbiB1bmV4cGVjdGVkIHN0YXRlOiAke1NjaG5vcnJEc2dTdGF0ZVt0aGlzLnN0YXRlXX1gKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIHJvdW5kIGhhbmRsZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSb3VuZCAxOiByZWNlaXZlIFJfaiwgY29tcHV0ZSBjb21iaW5lZCBSLCBhcHBseSBCSVAtMzQwIHBhcml0eSwgY29tcHV0ZSBzX2kuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVSb3VuZDEobWVzc2FnZXM6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICAgIGlmIChtZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUm91bmQgMTogZXhwZWN0ZWQgMSBicm9hZGNhc3QgbWVzc2FnZSAoUl9qKSwgZ290ICR7bWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RofWApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuUmkpIHRocm93IG5ldyBFcnJvcignTm9uY2UgcG9pbnQgbm90IHNldCDigJQgY2FsbCBpbml0KCkgZmlyc3QuJyk7XG5cbiAgICBjb25zdCBSaiA9IG5vYmxlU2VjcC5Qcm9qZWN0aXZlUG9pbnQuZnJvbUhleChCdWZmZXIuZnJvbShtZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlc1swXS5wYXlsb2FkKS50b1N0cmluZygnaGV4JykpO1xuXG4gICAgLy8gQ29tYmluZTogUiA9IFJfaSArIFJfalxuICAgIGNvbnN0IFJfcmF3ID0gdGhpcy5SaS5hZGQoUmopO1xuXG4gICAgLy8gQklQLTM0MDogUi55IG11c3QgYmUgZXZlbi4gSWYgb2RkLCBuZWdhdGUga19pICAoYm90aCBwYXJ0aWVzIHdpbGwgYWdyZWUgb25cbiAgICAvLyB0aGUgc2lnbiBzaW5jZSB0aGV5IGJvdGggc2VlIHRoZSBzYW1lIFIgPSBSX2kgKyBSX2opLlxuICAgIGNvbnN0IFJfeUlzT2RkID0gUl9yYXcueSAlIEJpZ0ludCgyKSA9PT0gQmlnSW50KDEpO1xuICAgIGlmIChSX3lJc09kZCkge1xuICAgICAgdGhpcy5raSA9IHNjYWxhck1vZChOIC0gdGhpcy5raSk7XG4gICAgfVxuICAgIC8vIFN0b3JlIHRoZSBwYXJpdHktbm9ybWFsaXNlZCBSIChldmVuIHkpLlxuICAgIHRoaXMuUl9jb21iaW5lZCA9IFJfeUlzT2RkID8gUl9yYXcubmVnYXRlKCkgOiBSX3JhdztcblxuICAgIC8vIEJJUC0zNDAgY2hhbGxlbmdlOiBlID0gSF90YWcoXCJCSVAwMzQwL2NoYWxsZW5nZVwiLCBSLnhfMzIg4oCWIFAueF8zMiDigJYgbXNnKVxuICAgIGNvbnN0IFJ4ID0gYnVmMzIodGhpcy5SX2NvbWJpbmVkLngpO1xuICAgIGNvbnN0IGUgPSBiaWdGcm9tQnVmKHRhZ2dlZEhhc2goJ0JJUDAzNDAvY2hhbGxlbmdlJywgUngsIHRoaXMucHViS2V5WCwgdGhpcy5tZXNzYWdlSGFzaCkpO1xuXG4gICAgLy8gUGFydGlhbCBzaWduYXR1cmU6IHNfaSA9IGtfaSArIGUgwrcgZWZmZWN0aXZlUHJpdl9pICAobW9kIE4pXG4gICAgdGhpcy5zaSA9IHNjYWxhck1vZCh0aGlzLmtpICsgc2NhbGFyTW9kKGUgKiB0aGlzLmVmZmVjdGl2ZVByaXYpKTtcbiAgICB0aGlzLnN0YXRlID0gU2Nobm9yckRzZ1N0YXRlLlJvdW5kMjtcblxuICAgIHJldHVybiB7XG4gICAgICBicm9hZGNhc3RNZXNzYWdlczogW1xuICAgICAgICB7XG4gICAgICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoYnVmMzIodGhpcy5zaSkpLCAvLyAzMiBieXRlc1xuICAgICAgICAgIGZyb206IHRoaXMucGFydHlJZHgsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUm91bmQgMiAoY29tYmluZSk6IHJlY2VpdmUgc19qLCBwcm9kdWNlIHRoZSBmaW5hbCBCSVAtMzQwIFNjaG5vcnIgc2lnbmF0dXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlUm91bmQyKG1lc3NhZ2VzOiBEZXNlcmlhbGl6ZWRNZXNzYWdlcyk6IERlc2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgICBpZiAobWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdW5kIDI6IGV4cGVjdGVkIDEgYnJvYWRjYXN0IG1lc3NhZ2UgKHNfaiksIGdvdCAke21lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLlJfY29tYmluZWQpIHRocm93IG5ldyBFcnJvcignUl9jb21iaW5lZCBub3Qgc2V0IOKAlCBoYW5kbGVSb3VuZDEgbXVzdCBydW4gZmlyc3QuJyk7XG5cbiAgICBjb25zdCBzaiA9IGJpZ0Zyb21CdWYoQnVmZmVyLmZyb20obWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCkpO1xuICAgIGNvbnN0IHMgPSBzY2FsYXJNb2QodGhpcy5zaSArIHNqKTtcblxuICAgIHRoaXMuX3NpZ25hdHVyZSA9IHtcbiAgICAgIFI6IG5ldyBVaW50OEFycmF5KGJ1ZjMyKHRoaXMuUl9jb21iaW5lZC54KSksXG4gICAgICBTOiBuZXcgVWludDhBcnJheShidWYzMihzKSksXG4gICAgfTtcbiAgICB0aGlzLnN0YXRlID0gU2Nobm9yckRzZ1N0YXRlLkNvbXBsZXRlO1xuXG4gICAgcmV0dXJuIHsgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLCBwMnBNZXNzYWdlczogW10gfTtcbiAgfVxufVxuIl19
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/tss/schnorr-dkls/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.SchnorrDsgState = exports.SchnorrDsg = void 0;
|
|
37
|
-
exports.SchnorrDsg = __importStar(require("./dsg"));
|
|
38
|
-
var dsg_1 = require("./dsg");
|
|
39
|
-
Object.defineProperty(exports, "SchnorrDsgState", { enumerable: true, get: function () { return dsg_1.SchnorrDsgState; } });
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL3NjaG5vcnItZGtscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBb0M7QUFDcEMsNkJBQXdDO0FBQS9CLHNHQUFBLGVBQWUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIFNjaG5vcnJEc2cgZnJvbSAnLi9kc2cnO1xuZXhwb3J0IHsgU2Nobm9yckRzZ1N0YXRlIH0gZnJvbSAnLi9kc2cnO1xuZXhwb3J0IHR5cGUgeyBTY2hub3JyRGtsc1NpZ25hdHVyZSB9IGZyb20gJy4vZHNnJztcbiJdfQ==
|