@bitgo-beta/sdk-lib-mpc 8.2.0-beta.211 → 8.2.0-beta.2111

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.
Files changed (147) hide show
  1. package/dist/src/curves/ed25519.d.ts +0 -1
  2. package/dist/src/curves/ed25519.d.ts.map +1 -1
  3. package/dist/src/curves/ed25519.js +12 -12
  4. package/dist/src/curves/ed25519Bip32HdTree.js +14 -14
  5. package/dist/src/curves/index.js +6 -2
  6. package/dist/src/curves/secp256k1.d.ts +0 -1
  7. package/dist/src/curves/secp256k1.d.ts.map +1 -1
  8. package/dist/src/curves/secp256k1.js +22 -38
  9. package/dist/src/curves/secp256k1Bip32HdTree.js +10 -10
  10. package/dist/src/curves/types.d.ts +2 -3
  11. package/dist/src/curves/types.d.ts.map +1 -1
  12. package/dist/src/curves/util.d.ts +2 -0
  13. package/dist/src/curves/util.d.ts.map +1 -1
  14. package/dist/src/curves/util.js +34 -3
  15. package/dist/src/hashCommitment.d.ts +0 -1
  16. package/dist/src/hashCommitment.d.ts.map +1 -1
  17. package/dist/src/hashCommitment.js +7 -8
  18. package/dist/src/index.d.ts +1 -1
  19. package/dist/src/index.d.ts.map +1 -1
  20. package/dist/src/index.js +24 -10
  21. package/dist/src/openssl/index.js +6 -2
  22. package/dist/src/openssl/openssl.d.ts +1 -2
  23. package/dist/src/openssl/openssl.d.ts.map +1 -1
  24. package/dist/src/openssl/openssl.js +4 -12
  25. package/dist/src/safePrime.d.ts +3 -0
  26. package/dist/src/safePrime.d.ts.map +1 -0
  27. package/dist/src/safePrime.js +19 -0
  28. package/dist/src/schnorrProof.d.ts +0 -1
  29. package/dist/src/schnorrProof.d.ts.map +1 -1
  30. package/dist/src/schnorrProof.js +8 -9
  31. package/dist/src/shamir/index.js +6 -2
  32. package/dist/src/shamir/shamir.js +2 -2
  33. package/dist/src/shamir/types.d.ts +1 -1
  34. package/dist/src/shamir/types.d.ts.map +1 -1
  35. package/dist/src/tss/dkls-vrf/dkg.d.ts +91 -0
  36. package/dist/src/tss/dkls-vrf/dkg.d.ts.map +1 -0
  37. package/dist/src/tss/dkls-vrf/dkg.js +278 -0
  38. package/dist/src/tss/dkls-vrf/index.d.ts +4 -0
  39. package/dist/src/tss/dkls-vrf/index.d.ts.map +1 -0
  40. package/dist/src/tss/dkls-vrf/index.js +40 -0
  41. package/dist/src/tss/dkls-vrf/types.d.ts +28 -0
  42. package/dist/src/tss/dkls-vrf/types.d.ts.map +1 -0
  43. package/dist/src/tss/dkls-vrf/types.js +23 -0
  44. package/dist/src/tss/dkls-vrf/util.d.ts +61 -0
  45. package/dist/src/tss/dkls-vrf/util.d.ts.map +1 -0
  46. package/dist/src/tss/dkls-vrf/util.js +199 -0
  47. package/dist/src/tss/ecdsa/index.js +23 -9
  48. package/dist/src/tss/ecdsa/paillierproof.js +10 -10
  49. package/dist/src/tss/ecdsa/rangeproof.d.ts +1 -2
  50. package/dist/src/tss/ecdsa/rangeproof.d.ts.map +1 -1
  51. package/dist/src/tss/ecdsa/rangeproof.js +108 -118
  52. package/dist/src/tss/ecdsa/types.d.ts +28 -17
  53. package/dist/src/tss/ecdsa/types.d.ts.map +1 -1
  54. package/dist/src/tss/ecdsa/types.js +29 -31
  55. package/dist/src/tss/ecdsa/zkVProof.d.ts +0 -1
  56. package/dist/src/tss/ecdsa/zkVProof.d.ts.map +1 -1
  57. package/dist/src/tss/ecdsa/zkVProof.js +9 -10
  58. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts +69 -0
  59. package/dist/src/tss/ecdsa-dkls/commsLayer.d.ts.map +1 -0
  60. package/dist/src/tss/ecdsa-dkls/commsLayer.js +268 -0
  61. package/dist/src/tss/ecdsa-dkls/derive.d.ts +111 -0
  62. package/dist/src/tss/ecdsa-dkls/derive.d.ts.map +1 -0
  63. package/dist/src/tss/ecdsa-dkls/derive.js +329 -0
  64. package/dist/src/tss/ecdsa-dkls/dkg.d.ts +64 -0
  65. package/dist/src/tss/ecdsa-dkls/dkg.d.ts.map +1 -0
  66. package/dist/src/tss/ecdsa-dkls/dkg.js +309 -0
  67. package/dist/src/tss/ecdsa-dkls/dsg.d.ts +47 -0
  68. package/dist/src/tss/ecdsa-dkls/dsg.d.ts.map +1 -0
  69. package/dist/src/tss/ecdsa-dkls/dsg.js +271 -0
  70. package/dist/src/tss/ecdsa-dkls/index.d.ts +7 -0
  71. package/dist/src/tss/ecdsa-dkls/index.d.ts.map +1 -0
  72. package/dist/src/tss/ecdsa-dkls/index.js +43 -0
  73. package/dist/src/tss/ecdsa-dkls/types.d.ts +163 -0
  74. package/dist/src/tss/ecdsa-dkls/types.d.ts.map +1 -0
  75. package/dist/src/tss/ecdsa-dkls/types.js +215 -0
  76. package/dist/src/tss/ecdsa-dkls/util.d.ts +26 -0
  77. package/dist/src/tss/ecdsa-dkls/util.d.ts.map +1 -0
  78. package/dist/src/tss/ecdsa-dkls/util.js +276 -0
  79. package/dist/src/tss/eddsa-mps/commsLayer.d.ts +30 -0
  80. package/dist/src/tss/eddsa-mps/commsLayer.d.ts.map +1 -0
  81. package/dist/src/tss/eddsa-mps/commsLayer.js +96 -0
  82. package/dist/src/tss/eddsa-mps/derive.d.ts +34 -0
  83. package/dist/src/tss/eddsa-mps/derive.d.ts.map +1 -0
  84. package/dist/src/tss/eddsa-mps/derive.js +198 -0
  85. package/dist/src/tss/eddsa-mps/dkg.d.ts +109 -0
  86. package/dist/src/tss/eddsa-mps/dkg.d.ts.map +1 -0
  87. package/dist/src/tss/eddsa-mps/dkg.js +304 -0
  88. package/dist/src/tss/eddsa-mps/dsg.d.ts +96 -0
  89. package/dist/src/tss/eddsa-mps/dsg.d.ts.map +1 -0
  90. package/dist/src/tss/eddsa-mps/dsg.js +346 -0
  91. package/dist/src/tss/eddsa-mps/index.d.ts +8 -0
  92. package/dist/src/tss/eddsa-mps/index.d.ts.map +1 -0
  93. package/dist/src/tss/eddsa-mps/index.js +43 -0
  94. package/dist/src/tss/eddsa-mps/types.d.ts +76 -0
  95. package/dist/src/tss/eddsa-mps/types.d.ts.map +1 -0
  96. package/dist/src/tss/eddsa-mps/types.js +105 -0
  97. package/dist/src/tss/eddsa-mps/util.d.ts +33 -0
  98. package/dist/src/tss/eddsa-mps/util.d.ts.map +1 -0
  99. package/dist/src/tss/eddsa-mps/util.js +94 -0
  100. package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts +65 -0
  101. package/dist/src/tss/eddsa-mps-vrf/dkg.d.ts.map +1 -0
  102. package/dist/src/tss/eddsa-mps-vrf/dkg.js +246 -0
  103. package/dist/src/tss/eddsa-mps-vrf/index.d.ts +4 -0
  104. package/dist/src/tss/eddsa-mps-vrf/index.d.ts.map +1 -0
  105. package/dist/src/tss/eddsa-mps-vrf/index.js +40 -0
  106. package/dist/src/tss/eddsa-mps-vrf/types.d.ts +31 -0
  107. package/dist/src/tss/eddsa-mps-vrf/types.d.ts.map +1 -0
  108. package/dist/src/tss/eddsa-mps-vrf/types.js +97 -0
  109. package/dist/src/tss/eddsa-mps-vrf/util.d.ts +9 -0
  110. package/dist/src/tss/eddsa-mps-vrf/util.d.ts.map +1 -0
  111. package/dist/src/tss/eddsa-mps-vrf/util.js +36 -0
  112. package/dist/src/tss/index.d.ts +5 -0
  113. package/dist/src/tss/index.d.ts.map +1 -1
  114. package/dist/src/tss/index.js +11 -2
  115. package/dist/src/tss/redpallas-mps/commsLayer.d.ts +34 -0
  116. package/dist/src/tss/redpallas-mps/commsLayer.d.ts.map +1 -0
  117. package/dist/src/tss/redpallas-mps/commsLayer.js +100 -0
  118. package/dist/src/tss/redpallas-mps/dkg.d.ts +103 -0
  119. package/dist/src/tss/redpallas-mps/dkg.d.ts.map +1 -0
  120. package/dist/src/tss/redpallas-mps/dkg.js +285 -0
  121. package/dist/src/tss/redpallas-mps/dsg.d.ts +130 -0
  122. package/dist/src/tss/redpallas-mps/dsg.d.ts.map +1 -0
  123. package/dist/src/tss/redpallas-mps/dsg.js +376 -0
  124. package/dist/src/tss/redpallas-mps/index.d.ts +8 -0
  125. package/dist/src/tss/redpallas-mps/index.d.ts.map +1 -0
  126. package/dist/src/tss/redpallas-mps/index.js +43 -0
  127. package/dist/src/tss/redpallas-mps/rerand.d.ts +110 -0
  128. package/dist/src/tss/redpallas-mps/rerand.d.ts.map +1 -0
  129. package/dist/src/tss/redpallas-mps/rerand.js +330 -0
  130. package/dist/src/tss/redpallas-mps/types.d.ts +120 -0
  131. package/dist/src/tss/redpallas-mps/types.d.ts.map +1 -0
  132. package/dist/src/tss/redpallas-mps/types.js +133 -0
  133. package/dist/src/tss/redpallas-mps/util.d.ts +56 -0
  134. package/dist/src/tss/redpallas-mps/util.d.ts.map +1 -0
  135. package/dist/src/tss/redpallas-mps/util.js +173 -0
  136. package/dist/src/types.d.ts +0 -1
  137. package/dist/src/types.d.ts.map +1 -1
  138. package/dist/src/util.d.ts +0 -1
  139. package/dist/src/util.d.ts.map +1 -1
  140. package/dist/src/util.js +21 -22
  141. package/dist/tsconfig.tsbuildinfo +1 -1
  142. package/package.json +42 -5
  143. package/.eslintignore +0 -5
  144. package/CHANGELOG.md +0 -340
  145. package/dist/src/openssl/opensslbytes.d.ts +0 -4
  146. package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
  147. package/dist/src/openssl/opensslbytes.js +0 -20
@@ -0,0 +1,215 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.ReducedKeyShareType = exports.DsgState = exports.DkgState = void 0;
40
+ exports.serializeMessages = serializeMessages;
41
+ exports.deserializeMessages = deserializeMessages;
42
+ exports.deserializeP2PMessage = deserializeP2PMessage;
43
+ exports.deserializeBroadcastMessage = deserializeBroadcastMessage;
44
+ exports.serializeP2PMessage = serializeP2PMessage;
45
+ exports.serializeBroadcastMessage = serializeBroadcastMessage;
46
+ exports.getCommonKeychain = getCommonKeychain;
47
+ exports.getDecodedReducedKeyShare = getDecodedReducedKeyShare;
48
+ exports.buildDklsKeyShare = buildDklsKeyShare;
49
+ const assert_1 = __importDefault(require("assert"));
50
+ const crypto_1 = require("crypto");
51
+ const cbor_x_1 = require("cbor-x");
52
+ const t = __importStar(require("io-ts"));
53
+ const curves_1 = require("../../curves");
54
+ const util_1 = require("../../util");
55
+ const Either_1 = require("fp-ts/Either");
56
+ var DkgState;
57
+ (function (DkgState) {
58
+ DkgState[DkgState["Uninitialized"] = 0] = "Uninitialized";
59
+ DkgState[DkgState["Round1"] = 1] = "Round1";
60
+ DkgState[DkgState["Round2"] = 2] = "Round2";
61
+ DkgState[DkgState["Round3"] = 3] = "Round3";
62
+ DkgState[DkgState["Round4"] = 4] = "Round4";
63
+ DkgState[DkgState["Complete"] = 5] = "Complete";
64
+ DkgState[DkgState["InvalidState"] = 6] = "InvalidState";
65
+ })(DkgState || (exports.DkgState = DkgState = {}));
66
+ var DsgState;
67
+ (function (DsgState) {
68
+ DsgState[DsgState["Uninitialized"] = 0] = "Uninitialized";
69
+ DsgState[DsgState["Round1"] = 1] = "Round1";
70
+ DsgState[DsgState["Round2"] = 2] = "Round2";
71
+ DsgState[DsgState["Round3"] = 3] = "Round3";
72
+ DsgState[DsgState["Round4"] = 4] = "Round4";
73
+ DsgState[DsgState["Complete"] = 5] = "Complete";
74
+ DsgState[DsgState["InvalidState"] = 6] = "InvalidState";
75
+ })(DsgState || (exports.DsgState = DsgState = {}));
76
+ /**
77
+ * A CBOR-encoded subset of an MPCv2 (DKLS) key share stored on the key card.
78
+ *
79
+ * @property bigSList - Public commitments S_i = s_i * G for each party.
80
+ * @property xList - Evaluation points (x-coordinates for Lagrange interpolation).
81
+ * @property rootChainCode - Root chain code for HD derivation.
82
+ * @property prv - The party's private scalar s_i. This is private key material;
83
+ * possession of this value allows the holder to act as this party in signing.
84
+ * @property pub - The party's public key.
85
+ */
86
+ exports.ReducedKeyShareType = t.type({
87
+ bigSList: t.array(t.array(t.number)),
88
+ xList: t.array(t.array(t.number)),
89
+ rootChainCode: t.array(t.number),
90
+ prv: t.array(t.number),
91
+ pub: t.array(t.number),
92
+ });
93
+ /**
94
+ * Serializes messages payloads to base64 strings.
95
+ * @param messages
96
+ */
97
+ function serializeMessages(messages) {
98
+ return {
99
+ p2pMessages: messages.p2pMessages.map(serializeP2PMessage),
100
+ broadcastMessages: messages.broadcastMessages.map(serializeBroadcastMessage),
101
+ };
102
+ }
103
+ /**
104
+ * Deserialize messages payloads to Uint8Array.
105
+ * @param messages
106
+ */
107
+ function deserializeMessages(messages) {
108
+ return {
109
+ p2pMessages: messages.p2pMessages.map(deserializeP2PMessage),
110
+ broadcastMessages: messages.broadcastMessages.map(deserializeBroadcastMessage),
111
+ };
112
+ }
113
+ /**
114
+ * Deserializes a P2P message.
115
+ * @param message
116
+ */
117
+ function deserializeP2PMessage(message) {
118
+ return {
119
+ to: message.to,
120
+ from: message.from,
121
+ payload: new Uint8Array(Buffer.from(message.payload, 'base64')),
122
+ commitment: message.commitment ? new Uint8Array(Buffer.from(message.commitment, 'hex')) : undefined,
123
+ };
124
+ }
125
+ /**
126
+ * Deserializes a Broadcast message.
127
+ * @param message
128
+ */
129
+ function deserializeBroadcastMessage(message) {
130
+ return {
131
+ from: message.from,
132
+ payload: new Uint8Array(Buffer.from(message.payload, 'base64')),
133
+ signatureR: message.signatureR ? new Uint8Array(Buffer.from(message.signatureR, 'base64')) : undefined,
134
+ };
135
+ }
136
+ /**
137
+ * Serializes a P2P message.
138
+ * @param message
139
+ */
140
+ function serializeP2PMessage(message) {
141
+ return {
142
+ to: message.to,
143
+ from: message.from,
144
+ payload: Buffer.from(message.payload).toString('base64'),
145
+ commitment: message.commitment ? Buffer.from(message.commitment).toString('hex') : undefined,
146
+ };
147
+ }
148
+ /**
149
+ * Serializes a Broadcast message.
150
+ * @param message
151
+ */
152
+ function serializeBroadcastMessage(message) {
153
+ return {
154
+ from: message.from,
155
+ payload: Buffer.from(message.payload).toString('base64'),
156
+ signatureR: message.signatureR ? Buffer.from(message.signatureR).toString('base64') : undefined,
157
+ };
158
+ }
159
+ /**
160
+ * Gets commonkeyChain from DKLS keyShare
161
+ * @param {Buffer} keyShare - DKLS keyShare
162
+ * @returns {string} commonKeychain in hex format
163
+ */
164
+ function getCommonKeychain(keyShare) {
165
+ const parsedKeyShare = (0, cbor_x_1.decode)(keyShare);
166
+ (0, assert_1.default)(parsedKeyShare.public_key, 'public_key not found in keyShare');
167
+ (0, assert_1.default)(parsedKeyShare.root_chain_code, 'root_chain_code not found in public_key');
168
+ const publicKey = Buffer.from(parsedKeyShare.public_key).toString('hex');
169
+ const rootChainCode = Buffer.from(parsedKeyShare.root_chain_code).toString('hex');
170
+ return publicKey + rootChainCode;
171
+ }
172
+ function getDecodedReducedKeyShare(reducedKeyShare) {
173
+ const decoded = exports.ReducedKeyShareType.decode((0, cbor_x_1.decode)(reducedKeyShare));
174
+ if ((0, Either_1.isLeft)(decoded)) {
175
+ throw new Error(`Unable to parse reducedKeyShare: ${decoded.left}`);
176
+ }
177
+ return decoded.right;
178
+ }
179
+ /**
180
+ * Builds a plain (CBOR-encodable) DKLS key share object from a retrofit x-share,
181
+ * without running a DKG ceremony. This is the pure core of `Dkg._createDKLsRetrofitKeyShare`:
182
+ * the party's secret scalar and public key are copied verbatim, the OT seeds are zeroed
183
+ * (a retrofit/derived share cannot sign directly), and the session id is `sha256(pub || chaincode)`
184
+ * so every party of the same key rebuilds the same id.
185
+ */
186
+ function buildDklsKeyShare(params) {
187
+ const { xShare, n, t, partyIdx, xiList } = params;
188
+ if (!xShare.y || !xShare.chaincode || !xShare.x) {
189
+ throw Error('xShare must have a public key, private share value, and a chaincode.');
190
+ }
191
+ const defaultXiList = [];
192
+ for (let i = 0; i < n; i++) {
193
+ defaultXiList.push(Array.from((0, util_1.bigIntToBufferBE)(BigInt(i + 1), 32)));
194
+ }
195
+ const secp256k1 = new curves_1.Secp256k1Curve();
196
+ return {
197
+ total_parties: n,
198
+ threshold: t,
199
+ rank_list: new Array(n).fill(0),
200
+ party_id: partyIdx,
201
+ public_key: Array.from(Buffer.from(xShare.y, 'hex')),
202
+ root_chain_code: Array.from(Buffer.from(xShare.chaincode, 'hex')),
203
+ final_session_id: Array.from((0, crypto_1.createHash)('sha256').update(Buffer.from(xShare.y, 'hex')).update(Buffer.from(xShare.chaincode, 'hex')).digest()),
204
+ seed_ot_receivers: new Array(n - 1).fill(Array(32832).fill(0)),
205
+ seed_ot_senders: new Array(n - 1).fill(Array(32768).fill(0)),
206
+ sent_seed_list: [Array(32).fill(0)],
207
+ rec_seed_list: [Array(32).fill(0)],
208
+ s_i: Array.from(Buffer.from(xShare.x, 'hex')),
209
+ // big_s_list is now created internally during the protocol so isn't needed here, however a valid KeyShare object needs to have it.
210
+ // a dummy public key is used to fill big_s_list.
211
+ big_s_list: new Array(n).fill(Array.from((0, util_1.bigIntToBufferBE)(secp256k1.basePointMult(BigInt('0x' + xShare.x))))),
212
+ x_i_list: xiList ? xiList : defaultXiList,
213
+ };
214
+ }
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHNzL2VjZHNhLWRrbHMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEdBLDhDQUtDO0FBTUQsa0RBS0M7QUFNRCxzREFPQztBQU1ELGtFQU1DO0FBTUQsa0RBT0M7QUFNRCw4REFNQztBQU9ELDhDQU9DO0FBRUQsOERBTUM7QUErQkQsOENBb0NDO0FBelFELG9EQUE0QjtBQUM1QixtQ0FBb0M7QUFDcEMsbUNBQWdDO0FBQ2hDLHlDQUEyQjtBQUUzQix5Q0FBOEM7QUFDOUMscUNBQThDO0FBQzlDLHlDQUFzQztBQWlCdEMsSUFBWSxRQVFYO0FBUkQsV0FBWSxRQUFRO0lBQ2xCLHlEQUFpQixDQUFBO0lBQ2pCLDJDQUFNLENBQUE7SUFDTiwyQ0FBTSxDQUFBO0lBQ04sMkNBQU0sQ0FBQTtJQUNOLDJDQUFNLENBQUE7SUFDTiwrQ0FBUSxDQUFBO0lBQ1IsdURBQVksQ0FBQTtBQUNkLENBQUMsRUFSVyxRQUFRLHdCQUFSLFFBQVEsUUFRbkI7QUFFRCxJQUFZLFFBUVg7QUFSRCxXQUFZLFFBQVE7SUFDbEIseURBQWEsQ0FBQTtJQUNiLDJDQUFNLENBQUE7SUFDTiwyQ0FBTSxDQUFBO0lBQ04sMkNBQU0sQ0FBQTtJQUNOLDJDQUFNLENBQUE7SUFDTiwrQ0FBUSxDQUFBO0lBQ1IsdURBQVksQ0FBQTtBQUNkLENBQUMsRUFSVyxRQUFRLHdCQUFSLFFBQVEsUUFRbkI7QUF1QkQ7Ozs7Ozs7OztHQVNHO0FBQ1UsUUFBQSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3hDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLGFBQWEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0QixHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0NBQ3ZCLENBQUMsQ0FBQztBQXlCSDs7O0dBR0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxRQUE4QjtJQUM5RCxPQUFPO1FBQ0wsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO1FBQzFELGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7S0FDN0UsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxRQUE0QjtJQUM5RCxPQUFPO1FBQ0wsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQzVELGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUM7S0FDL0UsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxPQUE2QjtJQUNqRSxPQUFPO1FBQ0wsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDL0QsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ3BHLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsMkJBQTJCLENBQUMsT0FBbUM7SUFDN0UsT0FBTztRQUNMLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUN2RyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLE9BQStCO0lBQ2pFLE9BQU87UUFDTCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDeEQsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUM3RixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLHlCQUF5QixDQUFDLE9BQXFDO0lBQzdFLE9BQU87UUFDTCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7UUFDbEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDeEQsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUNoRyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxRQUFnQjtJQUNoRCxNQUFNLGNBQWMsR0FBRyxJQUFBLGVBQU0sRUFBQyxRQUFRLENBQUMsQ0FBQztJQUN4QyxJQUFBLGdCQUFNLEVBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3RFLElBQUEsZ0JBQU0sRUFBQyxjQUFjLENBQUMsZUFBZSxFQUFFLHlDQUF5QyxDQUFDLENBQUM7SUFDbEYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRixPQUFPLFNBQVMsR0FBRyxhQUFhLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQWdCLHlCQUF5QixDQUFDLGVBQW9DO0lBQzVFLE1BQU0sT0FBTyxHQUFHLDJCQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQU0sRUFBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLElBQUksSUFBQSxlQUFNLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ3ZCLENBQUM7QUF3QkQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsTUFNakM7SUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxLQUFLLENBQUMsc0VBQXNFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBQ0QsTUFBTSxhQUFhLEdBQXlCLEVBQUUsQ0FBQztJQUMvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUEsdUJBQWdCLEVBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLElBQUksdUJBQWMsRUFBRSxDQUFDO0lBQ3ZDLE9BQU87UUFDTCxhQUFhLEVBQUUsQ0FBQztRQUNoQixTQUFTLEVBQUUsQ0FBQztRQUNaLFNBQVMsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9CLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxlQUFlLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FDMUIsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQ2hIO1FBQ0QsaUJBQWlCLEVBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELGVBQWUsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsY0FBYyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxtSUFBbUk7UUFDbkksaURBQWlEO1FBQ2pELFVBQVUsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFBLHVCQUFnQixFQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0csUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhO0tBQzFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5pbXBvcnQgeyBYU2hhcmUgfSBmcm9tICcuLi9lY2RzYS90eXBlcyc7XG5pbXBvcnQgeyBTZWNwMjU2azFDdXJ2ZSB9IGZyb20gJy4uLy4uL2N1cnZlcyc7XG5pbXBvcnQgeyBiaWdJbnRUb0J1ZmZlckJFIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBpc0xlZnQgfSBmcm9tICdmcC10cy9FaXRoZXInO1xuXG4vLyBCcm9hZGNhc3QgbWVzc2FnZSBtZWFudCB0byBiZSBzZW50IHRvIG11bHRpcGxlIHBhcnRpZXNcbmludGVyZmFjZSBCcm9hZGNhc3RNZXNzYWdlPFQ+IHtcbiAgcGF5bG9hZDogVDtcbiAgZnJvbTogbnVtYmVyO1xuICBzaWduYXR1cmVSPzogVDtcbn1cblxuLy8gUDJQIG1lc3NhZ2UgbWVhbnQgdG8gYmUgc2VudCB0byBhIHNwZWNpZmljIHBhcnR5XG5pbnRlcmZhY2UgUDJQTWVzc2FnZTxULCBHPiB7XG4gIHBheWxvYWQ6IFQ7XG4gIGZyb206IG51bWJlcjtcbiAgY29tbWl0bWVudD86IEc7XG4gIHRvOiBudW1iZXI7XG59XG5cbmV4cG9ydCBlbnVtIERrZ1N0YXRlIHtcbiAgVW5pbml0aWFsaXplZCA9IDAsXG4gIFJvdW5kMSxcbiAgUm91bmQyLFxuICBSb3VuZDMsXG4gIFJvdW5kNCxcbiAgQ29tcGxldGUsXG4gIEludmFsaWRTdGF0ZSxcbn1cblxuZXhwb3J0IGVudW0gRHNnU3RhdGUge1xuICBVbmluaXRpYWxpemVkLFxuICBSb3VuZDEsXG4gIFJvdW5kMixcbiAgUm91bmQzLFxuICBSb3VuZDQsXG4gIENvbXBsZXRlLFxuICBJbnZhbGlkU3RhdGUsXG59XG5cbmV4cG9ydCB0eXBlIEF1dGhFbmNNZXNzYWdlID0ge1xuICBlbmNyeXB0ZWRNZXNzYWdlOiBzdHJpbmc7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEF1dGhNZXNzYWdlID0ge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFBhcnR5R3BnS2V5ID0ge1xuICBwYXJ0eUlkOiBudW1iZXI7XG4gIGdwZ0tleTogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIERrbHNTaWduYXR1cmU8VD4gPSB7XG4gIFI6IFQ7XG4gIFM6IFQ7XG59O1xuZXhwb3J0IHR5cGUgUmV0cm9maXREYXRhID0ge1xuICB4U2hhcmU6IFBhcnRpYWw8WFNoYXJlPjtcbiAgeGlMaXN0PzogbnVtYmVyW11bXTtcbn07XG5cbi8qKlxuICogQSBDQk9SLWVuY29kZWQgc3Vic2V0IG9mIGFuIE1QQ3YyIChES0xTKSBrZXkgc2hhcmUgc3RvcmVkIG9uIHRoZSBrZXkgY2FyZC5cbiAqXG4gKiBAcHJvcGVydHkgYmlnU0xpc3QgLSBQdWJsaWMgY29tbWl0bWVudHMgU19pID0gc19pICogRyBmb3IgZWFjaCBwYXJ0eS5cbiAqIEBwcm9wZXJ0eSB4TGlzdCAtIEV2YWx1YXRpb24gcG9pbnRzICh4LWNvb3JkaW5hdGVzIGZvciBMYWdyYW5nZSBpbnRlcnBvbGF0aW9uKS5cbiAqIEBwcm9wZXJ0eSByb290Q2hhaW5Db2RlIC0gUm9vdCBjaGFpbiBjb2RlIGZvciBIRCBkZXJpdmF0aW9uLlxuICogQHByb3BlcnR5IHBydiAtIFRoZSBwYXJ0eSdzIHByaXZhdGUgc2NhbGFyIHNfaS4gVGhpcyBpcyBwcml2YXRlIGtleSBtYXRlcmlhbDtcbiAqICAgcG9zc2Vzc2lvbiBvZiB0aGlzIHZhbHVlIGFsbG93cyB0aGUgaG9sZGVyIHRvIGFjdCBhcyB0aGlzIHBhcnR5IGluIHNpZ25pbmcuXG4gKiBAcHJvcGVydHkgcHViIC0gVGhlIHBhcnR5J3MgcHVibGljIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJlZHVjZWRLZXlTaGFyZVR5cGUgPSB0LnR5cGUoe1xuICBiaWdTTGlzdDogdC5hcnJheSh0LmFycmF5KHQubnVtYmVyKSksXG4gIHhMaXN0OiB0LmFycmF5KHQuYXJyYXkodC5udW1iZXIpKSxcbiAgcm9vdENoYWluQ29kZTogdC5hcnJheSh0Lm51bWJlciksXG4gIHBydjogdC5hcnJheSh0Lm51bWJlciksXG4gIHB1YjogdC5hcnJheSh0Lm51bWJlciksXG59KTtcblxuZXhwb3J0IHR5cGUgUmVkdWNlZEtleVNoYXJlID0gdC5UeXBlT2Y8dHlwZW9mIFJlZHVjZWRLZXlTaGFyZVR5cGU+O1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkQnJvYWRjYXN0TWVzc2FnZSA9IEJyb2FkY2FzdE1lc3NhZ2U8c3RyaW5nPjtcbmV4cG9ydCB0eXBlIERlc2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2UgPSBCcm9hZGNhc3RNZXNzYWdlPFVpbnQ4QXJyYXk+O1xuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFAyUE1lc3NhZ2UgPSBQMlBNZXNzYWdlPHN0cmluZywgc3RyaW5nPjtcbmV4cG9ydCB0eXBlIERlc2VyaWFsaXplZFAyUE1lc3NhZ2UgPSBQMlBNZXNzYWdlPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXk+O1xuZXhwb3J0IHR5cGUgU2VyaWFsaXplZERrbHNTaWduYXR1cmUgPSBEa2xzU2lnbmF0dXJlPHN0cmluZz47XG5leHBvcnQgdHlwZSBEZXNlcmlhbGl6ZWREa2xzU2lnbmF0dXJlID0gRGtsc1NpZ25hdHVyZTxVaW50OEFycmF5PjtcbmV4cG9ydCB0eXBlIEF1dGhFbmNQMlBNZXNzYWdlID0gUDJQTWVzc2FnZTxBdXRoRW5jTWVzc2FnZSwgc3RyaW5nPjtcbmV4cG9ydCB0eXBlIEF1dGhCcm9hZGNhc3RNZXNzYWdlID0gQnJvYWRjYXN0TWVzc2FnZTxBdXRoTWVzc2FnZT47XG5leHBvcnQgdHlwZSBTZXJpYWxpemVkTWVzc2FnZXMgPSB7XG4gIHAycE1lc3NhZ2VzOiBTZXJpYWxpemVkUDJQTWVzc2FnZVtdO1xuICBicm9hZGNhc3RNZXNzYWdlczogU2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2VbXTtcbn07XG5leHBvcnQgdHlwZSBBdXRoRW5jTWVzc2FnZXMgPSB7XG4gIHAycE1lc3NhZ2VzOiBBdXRoRW5jUDJQTWVzc2FnZVtdO1xuICBicm9hZGNhc3RNZXNzYWdlczogQXV0aEJyb2FkY2FzdE1lc3NhZ2VbXTtcbn07XG5leHBvcnQgdHlwZSBEZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IHtcbiAgcDJwTWVzc2FnZXM6IERlc2VyaWFsaXplZFAyUE1lc3NhZ2VbXTtcbiAgYnJvYWRjYXN0TWVzc2FnZXM6IERlc2VyaWFsaXplZEJyb2FkY2FzdE1lc3NhZ2VbXTtcbn07XG5cbi8qKlxuICogU2VyaWFsaXplcyBtZXNzYWdlcyBwYXlsb2FkcyB0byBiYXNlNjQgc3RyaW5ncy5cbiAqIEBwYXJhbSBtZXNzYWdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTWVzc2FnZXMobWVzc2FnZXM6IERlc2VyaWFsaXplZE1lc3NhZ2VzKTogU2VyaWFsaXplZE1lc3NhZ2VzIHtcbiAgcmV0dXJuIHtcbiAgICBwMnBNZXNzYWdlczogbWVzc2FnZXMucDJwTWVzc2FnZXMubWFwKHNlcmlhbGl6ZVAyUE1lc3NhZ2UpLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBtZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5tYXAoc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZSksXG4gIH07XG59XG5cbi8qKlxuICogRGVzZXJpYWxpemUgbWVzc2FnZXMgcGF5bG9hZHMgdG8gVWludDhBcnJheS5cbiAqIEBwYXJhbSBtZXNzYWdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVNZXNzYWdlcyhtZXNzYWdlczogU2VyaWFsaXplZE1lc3NhZ2VzKTogRGVzZXJpYWxpemVkTWVzc2FnZXMge1xuICByZXR1cm4ge1xuICAgIHAycE1lc3NhZ2VzOiBtZXNzYWdlcy5wMnBNZXNzYWdlcy5tYXAoZGVzZXJpYWxpemVQMlBNZXNzYWdlKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogbWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMubWFwKGRlc2VyaWFsaXplQnJvYWRjYXN0TWVzc2FnZSksXG4gIH07XG59XG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGEgUDJQIG1lc3NhZ2UuXG4gKiBAcGFyYW0gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVQMlBNZXNzYWdlKG1lc3NhZ2U6IFNlcmlhbGl6ZWRQMlBNZXNzYWdlKTogRGVzZXJpYWxpemVkUDJQTWVzc2FnZSB7XG4gIHJldHVybiB7XG4gICAgdG86IG1lc3NhZ2UudG8sXG4gICAgZnJvbTogbWVzc2FnZS5mcm9tLFxuICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKG1lc3NhZ2UucGF5bG9hZCwgJ2Jhc2U2NCcpKSxcbiAgICBjb21taXRtZW50OiBtZXNzYWdlLmNvbW1pdG1lbnQgPyBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShtZXNzYWdlLmNvbW1pdG1lbnQsICdoZXgnKSkgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogRGVzZXJpYWxpemVzIGEgQnJvYWRjYXN0IG1lc3NhZ2UuXG4gKiBAcGFyYW0gbWVzc2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVCcm9hZGNhc3RNZXNzYWdlKG1lc3NhZ2U6IFNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlKTogRGVzZXJpYWxpemVkQnJvYWRjYXN0TWVzc2FnZSB7XG4gIHJldHVybiB7XG4gICAgZnJvbTogbWVzc2FnZS5mcm9tLFxuICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKG1lc3NhZ2UucGF5bG9hZCwgJ2Jhc2U2NCcpKSxcbiAgICBzaWduYXR1cmVSOiBtZXNzYWdlLnNpZ25hdHVyZVIgPyBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShtZXNzYWdlLnNpZ25hdHVyZVIsICdiYXNlNjQnKSkgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogU2VyaWFsaXplcyBhIFAyUCBtZXNzYWdlLlxuICogQHBhcmFtIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVAyUE1lc3NhZ2UobWVzc2FnZTogRGVzZXJpYWxpemVkUDJQTWVzc2FnZSk6IFNlcmlhbGl6ZWRQMlBNZXNzYWdlIHtcbiAgcmV0dXJuIHtcbiAgICB0bzogbWVzc2FnZS50byxcbiAgICBmcm9tOiBtZXNzYWdlLmZyb20sXG4gICAgcGF5bG9hZDogQnVmZmVyLmZyb20obWVzc2FnZS5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgY29tbWl0bWVudDogbWVzc2FnZS5jb21taXRtZW50ID8gQnVmZmVyLmZyb20obWVzc2FnZS5jb21taXRtZW50KS50b1N0cmluZygnaGV4JykgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogU2VyaWFsaXplcyBhIEJyb2FkY2FzdCBtZXNzYWdlLlxuICogQHBhcmFtIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUJyb2FkY2FzdE1lc3NhZ2UobWVzc2FnZTogRGVzZXJpYWxpemVkQnJvYWRjYXN0TWVzc2FnZSk6IFNlcmlhbGl6ZWRCcm9hZGNhc3RNZXNzYWdlIHtcbiAgcmV0dXJuIHtcbiAgICBmcm9tOiBtZXNzYWdlLmZyb20sXG4gICAgcGF5bG9hZDogQnVmZmVyLmZyb20obWVzc2FnZS5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgc2lnbmF0dXJlUjogbWVzc2FnZS5zaWduYXR1cmVSID8gQnVmZmVyLmZyb20obWVzc2FnZS5zaWduYXR1cmVSKS50b1N0cmluZygnYmFzZTY0JykgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogR2V0cyBjb21tb25rZXlDaGFpbiBmcm9tIERLTFMga2V5U2hhcmVcbiAqIEBwYXJhbSB7QnVmZmVyfSBrZXlTaGFyZSAtIERLTFMga2V5U2hhcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbW1vbktleWNoYWluIGluIGhleCBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vbktleWNoYWluKGtleVNoYXJlOiBCdWZmZXIpOiBzdHJpbmcge1xuICBjb25zdCBwYXJzZWRLZXlTaGFyZSA9IGRlY29kZShrZXlTaGFyZSk7XG4gIGFzc2VydChwYXJzZWRLZXlTaGFyZS5wdWJsaWNfa2V5LCAncHVibGljX2tleSBub3QgZm91bmQgaW4ga2V5U2hhcmUnKTtcbiAgYXNzZXJ0KHBhcnNlZEtleVNoYXJlLnJvb3RfY2hhaW5fY29kZSwgJ3Jvb3RfY2hhaW5fY29kZSBub3QgZm91bmQgaW4gcHVibGljX2tleScpO1xuICBjb25zdCBwdWJsaWNLZXkgPSBCdWZmZXIuZnJvbShwYXJzZWRLZXlTaGFyZS5wdWJsaWNfa2V5KS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IHJvb3RDaGFpbkNvZGUgPSBCdWZmZXIuZnJvbShwYXJzZWRLZXlTaGFyZS5yb290X2NoYWluX2NvZGUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgcmV0dXJuIHB1YmxpY0tleSArIHJvb3RDaGFpbkNvZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKHJlZHVjZWRLZXlTaGFyZTogQnVmZmVyIHwgVWludDhBcnJheSk6IFJlZHVjZWRLZXlTaGFyZSB7XG4gIGNvbnN0IGRlY29kZWQgPSBSZWR1Y2VkS2V5U2hhcmVUeXBlLmRlY29kZShkZWNvZGUocmVkdWNlZEtleVNoYXJlKSk7XG4gIGlmIChpc0xlZnQoZGVjb2RlZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBwYXJzZSByZWR1Y2VkS2V5U2hhcmU6ICR7ZGVjb2RlZC5sZWZ0fWApO1xuICB9XG4gIHJldHVybiBkZWNvZGVkLnJpZ2h0O1xufVxuXG4vKipcbiAqIFBsYWluLW9iamVjdCBmb3JtIG9mIGEgREtMUyBrZXlzaGFyZSwgbWF0Y2hpbmcgd2hhdCB0aGUgd2FzbSBgS2V5c2hhcmVgIHNlcmlhbGl6ZXMgdG9cbiAqIChzbmFrZV9jYXNlIGZpZWxkcykuIGBidWlsZERrbHNLZXlTaGFyZWAgcHJvZHVjZXMgdGhpczsgaXQgaXMgYGVuY29kZWBkIHRvIENCT1IgYW5kIHRoZW5cbiAqIHBhcnNlZCBieSBgS2V5c2hhcmUuZnJvbUJ5dGVzYC5cbiAqL1xuZXhwb3J0IHR5cGUgRGtsc0tleVNoYXJlID0ge1xuICB0b3RhbF9wYXJ0aWVzOiBudW1iZXI7XG4gIHRocmVzaG9sZDogbnVtYmVyO1xuICByYW5rX2xpc3Q6IG51bWJlcltdO1xuICBwYXJ0eV9pZDogbnVtYmVyO1xuICBwdWJsaWNfa2V5OiBudW1iZXJbXTtcbiAgcm9vdF9jaGFpbl9jb2RlOiBudW1iZXJbXTtcbiAgZmluYWxfc2Vzc2lvbl9pZDogbnVtYmVyW107XG4gIHNlZWRfb3RfcmVjZWl2ZXJzOiBudW1iZXJbXVtdO1xuICBzZWVkX290X3NlbmRlcnM6IG51bWJlcltdW107XG4gIHNlbnRfc2VlZF9saXN0OiBudW1iZXJbXVtdO1xuICByZWNfc2VlZF9saXN0OiBudW1iZXJbXVtdO1xuICBzX2k6IG51bWJlcltdO1xuICBiaWdfc19saXN0OiBudW1iZXJbXVtdO1xuICB4X2lfbGlzdDogbnVtYmVyW11bXTtcbn07XG5cbi8qKlxuICogQnVpbGRzIGEgcGxhaW4gKENCT1ItZW5jb2RhYmxlKSBES0xTIGtleSBzaGFyZSBvYmplY3QgZnJvbSBhIHJldHJvZml0IHgtc2hhcmUsXG4gKiB3aXRob3V0IHJ1bm5pbmcgYSBES0cgY2VyZW1vbnkuIFRoaXMgaXMgdGhlIHB1cmUgY29yZSBvZiBgRGtnLl9jcmVhdGVES0xzUmV0cm9maXRLZXlTaGFyZWA6XG4gKiB0aGUgcGFydHkncyBzZWNyZXQgc2NhbGFyIGFuZCBwdWJsaWMga2V5IGFyZSBjb3BpZWQgdmVyYmF0aW0sIHRoZSBPVCBzZWVkcyBhcmUgemVyb2VkXG4gKiAoYSByZXRyb2ZpdC9kZXJpdmVkIHNoYXJlIGNhbm5vdCBzaWduIGRpcmVjdGx5KSwgYW5kIHRoZSBzZXNzaW9uIGlkIGlzIGBzaGEyNTYocHViIHx8IGNoYWluY29kZSlgXG4gKiBzbyBldmVyeSBwYXJ0eSBvZiB0aGUgc2FtZSBrZXkgcmVidWlsZHMgdGhlIHNhbWUgaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERrbHNLZXlTaGFyZShwYXJhbXM6IHtcbiAgeFNoYXJlOiBQYXJ0aWFsPFhTaGFyZT47XG4gIG46IG51bWJlcjtcbiAgdDogbnVtYmVyO1xuICBwYXJ0eUlkeDogbnVtYmVyO1xuICB4aUxpc3Q/OiBudW1iZXJbXVtdO1xufSk6IERrbHNLZXlTaGFyZSB7XG4gIGNvbnN0IHsgeFNoYXJlLCBuLCB0LCBwYXJ0eUlkeCwgeGlMaXN0IH0gPSBwYXJhbXM7XG4gIGlmICgheFNoYXJlLnkgfHwgIXhTaGFyZS5jaGFpbmNvZGUgfHwgIXhTaGFyZS54KSB7XG4gICAgdGhyb3cgRXJyb3IoJ3hTaGFyZSBtdXN0IGhhdmUgYSBwdWJsaWMga2V5LCBwcml2YXRlIHNoYXJlIHZhbHVlLCBhbmQgYSBjaGFpbmNvZGUuJyk7XG4gIH1cbiAgY29uc3QgZGVmYXVsdFhpTGlzdDogQXJyYXk8QXJyYXk8bnVtYmVyPj4gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBkZWZhdWx0WGlMaXN0LnB1c2goQXJyYXkuZnJvbShiaWdJbnRUb0J1ZmZlckJFKEJpZ0ludChpICsgMSksIDMyKSkpO1xuICB9XG4gIGNvbnN0IHNlY3AyNTZrMSA9IG5ldyBTZWNwMjU2azFDdXJ2ZSgpO1xuICByZXR1cm4ge1xuICAgIHRvdGFsX3BhcnRpZXM6IG4sXG4gICAgdGhyZXNob2xkOiB0LFxuICAgIHJhbmtfbGlzdDogbmV3IEFycmF5KG4pLmZpbGwoMCksXG4gICAgcGFydHlfaWQ6IHBhcnR5SWR4LFxuICAgIHB1YmxpY19rZXk6IEFycmF5LmZyb20oQnVmZmVyLmZyb20oeFNoYXJlLnksICdoZXgnKSksXG4gICAgcm9vdF9jaGFpbl9jb2RlOiBBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKHhTaGFyZS5jaGFpbmNvZGUsICdoZXgnKSksXG4gICAgZmluYWxfc2Vzc2lvbl9pZDogQXJyYXkuZnJvbShcbiAgICAgIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShCdWZmZXIuZnJvbSh4U2hhcmUueSwgJ2hleCcpKS51cGRhdGUoQnVmZmVyLmZyb20oeFNoYXJlLmNoYWluY29kZSwgJ2hleCcpKS5kaWdlc3QoKVxuICAgICksXG4gICAgc2VlZF9vdF9yZWNlaXZlcnM6IG5ldyBBcnJheShuIC0gMSkuZmlsbChBcnJheSgzMjgzMikuZmlsbCgwKSksXG4gICAgc2VlZF9vdF9zZW5kZXJzOiBuZXcgQXJyYXkobiAtIDEpLmZpbGwoQXJyYXkoMzI3NjgpLmZpbGwoMCkpLFxuICAgIHNlbnRfc2VlZF9saXN0OiBbQXJyYXkoMzIpLmZpbGwoMCldLFxuICAgIHJlY19zZWVkX2xpc3Q6IFtBcnJheSgzMikuZmlsbCgwKV0sXG4gICAgc19pOiBBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKHhTaGFyZS54LCAnaGV4JykpLFxuICAgIC8vIGJpZ19zX2xpc3QgaXMgbm93IGNyZWF0ZWQgaW50ZXJuYWxseSBkdXJpbmcgdGhlIHByb3RvY29sIHNvIGlzbid0IG5lZWRlZCBoZXJlLCBob3dldmVyIGEgdmFsaWQgS2V5U2hhcmUgb2JqZWN0IG5lZWRzIHRvIGhhdmUgaXQuXG4gICAgLy8gYSBkdW1teSBwdWJsaWMga2V5IGlzIHVzZWQgdG8gZmlsbCBiaWdfc19saXN0LlxuICAgIGJpZ19zX2xpc3Q6IG5ldyBBcnJheShuKS5maWxsKEFycmF5LmZyb20oYmlnSW50VG9CdWZmZXJCRShzZWNwMjU2azEuYmFzZVBvaW50TXVsdChCaWdJbnQoJzB4JyArIHhTaGFyZS54KSkpKSksXG4gICAgeF9pX2xpc3Q6IHhpTGlzdCA/IHhpTGlzdCA6IGRlZmF1bHRYaUxpc3QsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,26 @@
1
+ import { DeserializedDklsSignature, DeserializedMessages, RetrofitData } from './types';
2
+ import { Hash } from 'crypto';
3
+ import { Dsg } from './dsg';
4
+ import { Dkg } from './dkg';
5
+ /**
6
+ * Combines partial signatures from parties participating in DSG.
7
+ * @param round4MessagePayloads - round 4 message payloads from participating parties
8
+ * @param rHex - hex representation of the r value in the signature
9
+ * @returns {DeserializedMessages} - messages to send to other parties for the next round
10
+ */
11
+ export declare function combinePartialSignatures(round4MessagePayloads: Uint8Array[], rHex: string): DeserializedDklsSignature;
12
+ /**
13
+ * Verify a DKLs Signature and serialize it to recid:r:s:publickey format.
14
+ * @param message - message that was signed.
15
+ * @param dklsSignature - R and S values of the ECDSA signature.
16
+ * @param commonKeychain - public key appended to chaincode in hex.
17
+ * @param derivationPath - optional derivation path to derive on the commonkeychain before verification.
18
+ * @param hash - optional hash function to apply on message before verifying. Default is sha256.
19
+ * @param shouldHash - flag to determine whether message should be hashed before verifying.
20
+ * @returns {string} - serialized signature in `recid:r:s:publickey` format
21
+ */
22
+ export declare function verifyAndConvertDklsSignature(message: Buffer, dklsSignature: DeserializedDklsSignature, commonKeychain: string, derivationPath?: string, hash?: Hash, shouldHash?: boolean): string;
23
+ export declare function executeTillRound(round: number, party1Dsg: Dsg, party2Dsg: Dsg): Promise<DeserializedMessages[] | DeserializedDklsSignature>;
24
+ export declare function generateDKGKeyShares(retrofitDataA?: RetrofitData, retrofitDataB?: RetrofitData, retrofitDataC?: RetrofitData, seedUser?: Buffer, seedBackup?: Buffer, seedBitgo?: Buffer): Promise<[Dkg, Dkg, Dkg]>;
25
+ export declare function generate2of2KeyShares(retrofitDataA?: RetrofitData, retrofitDataB?: RetrofitData): Promise<[Dkg, Dkg]>;
26
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/tss/ecdsa-dkls/util.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGxF,OAAO,EAAc,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAK5B;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,qBAAqB,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,yBAAyB,CAgBrH;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,yBAAyB,EACxC,cAAc,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,EACvB,IAAI,CAAC,EAAE,IAAI,EACX,UAAU,UAAO,GAChB,MAAM,CA6BR;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,GAAG,EACd,SAAS,EAAE,GAAG,GACb,OAAO,CAAC,oBAAoB,EAAE,GAAG,yBAAyB,CAAC,CAgD7D;AAED,wBAAsB,oBAAoB,CACxC,aAAa,CAAC,EAAE,YAAY,EAC5B,aAAa,CAAC,EAAE,YAAY,EAC5B,aAAa,CAAC,EAAE,YAAY,EAC5B,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CA6E1B;AAED,wBAAsB,qBAAqB,CACzC,aAAa,CAAC,EAAE,YAAY,EAC5B,aAAa,CAAC,EAAE,YAAY,GAC3B,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAsCrB"}
@@ -0,0 +1,276 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.combinePartialSignatures = combinePartialSignatures;
40
+ exports.verifyAndConvertDklsSignature = verifyAndConvertDklsSignature;
41
+ exports.executeTillRound = executeTillRound;
42
+ exports.generateDKGKeyShares = generateDKGKeyShares;
43
+ exports.generate2of2KeyShares = generate2of2KeyShares;
44
+ const secp256k1_1 = require("@noble/curves/secp256k1");
45
+ const curves_1 = require("../../curves");
46
+ const util_1 = require("../../util");
47
+ const cbor_x_1 = require("cbor-x");
48
+ const secp256k1 = __importStar(require("secp256k1"));
49
+ const crypto_1 = require("crypto");
50
+ const dkg_1 = require("./dkg");
51
+ const assert_1 = __importDefault(require("assert"));
52
+ const delimeter = ':';
53
+ /**
54
+ * Combines partial signatures from parties participating in DSG.
55
+ * @param round4MessagePayloads - round 4 message payloads from participating parties
56
+ * @param rHex - hex representation of the r value in the signature
57
+ * @returns {DeserializedMessages} - messages to send to other parties for the next round
58
+ */
59
+ function combinePartialSignatures(round4MessagePayloads, rHex) {
60
+ const r = (0, util_1.bigIntFromBufferBE)(Buffer.from(rHex, 'hex').subarray(1));
61
+ const s0Arr = round4MessagePayloads.map((p) => (0, cbor_x_1.decode)(p).s_0);
62
+ const s1Arr = round4MessagePayloads.map((p) => (0, cbor_x_1.decode)(p).s_1);
63
+ const s0BigInts = s0Arr.map((s0) => (0, util_1.bigIntFromBufferBE)(Buffer.from(s0)));
64
+ const s1BigInts = s1Arr.map((s1) => (0, util_1.bigIntFromBufferBE)(Buffer.from(s1)));
65
+ const secp256k1Curve = new curves_1.Secp256k1Curve();
66
+ const s0Sum = s0BigInts.slice(1).reduce((sumSoFar, s0) => secp256k1Curve.scalarAdd(sumSoFar, s0), s0BigInts[0]);
67
+ const s1Sum = s1BigInts.slice(1).reduce((sumSoFar, s1) => secp256k1Curve.scalarAdd(sumSoFar, s1), s1BigInts[0]);
68
+ const s = secp256k1Curve.scalarMult(s0Sum, secp256k1Curve.scalarInvert(s1Sum));
69
+ const sig = new secp256k1_1.secp256k1.Signature(r, s);
70
+ const normalizedSig = sig.normalizeS();
71
+ return {
72
+ R: new Uint8Array((0, util_1.bigIntToBufferBE)(normalizedSig.r, 32)),
73
+ S: new Uint8Array((0, util_1.bigIntToBufferBE)(normalizedSig.s, 32)),
74
+ };
75
+ }
76
+ /**
77
+ * Verify a DKLs Signature and serialize it to recid:r:s:publickey format.
78
+ * @param message - message that was signed.
79
+ * @param dklsSignature - R and S values of the ECDSA signature.
80
+ * @param commonKeychain - public key appended to chaincode in hex.
81
+ * @param derivationPath - optional derivation path to derive on the commonkeychain before verification.
82
+ * @param hash - optional hash function to apply on message before verifying. Default is sha256.
83
+ * @param shouldHash - flag to determine whether message should be hashed before verifying.
84
+ * @returns {string} - serialized signature in `recid:r:s:publickey` format
85
+ */
86
+ function verifyAndConvertDklsSignature(message, dklsSignature, commonKeychain, derivationPath, hash, shouldHash = true) {
87
+ let truePub = '';
88
+ if (derivationPath && derivationPath !== 'm') {
89
+ const hdTree = new curves_1.Secp256k1Bip32HdTree();
90
+ const derivedPub = hdTree.publicDerive({
91
+ pk: (0, util_1.bigIntFromBufferBE)(Buffer.from(commonKeychain.slice(0, 66), 'hex')),
92
+ chaincode: (0, util_1.bigIntFromBufferBE)(Buffer.from(commonKeychain.slice(66), 'hex')),
93
+ }, derivationPath);
94
+ truePub = (0, util_1.bigIntToBufferBE)(derivedPub.pk).toString('hex');
95
+ }
96
+ else {
97
+ truePub = commonKeychain.slice(0, 66);
98
+ }
99
+ const messageToVerify = shouldHash ? (hash || (0, crypto_1.createHash)('sha256')).update(message).digest() : message;
100
+ const pub0 = secp256k1.ecdsaRecover(Buffer.concat([dklsSignature.R, dklsSignature.S]), 0, messageToVerify, true);
101
+ const pub1 = secp256k1.ecdsaRecover(Buffer.concat([dklsSignature.R, dklsSignature.S]), 1, messageToVerify, true);
102
+ let recId;
103
+ if (truePub === Buffer.from(pub0).toString('hex')) {
104
+ recId = 0;
105
+ }
106
+ else if (truePub === Buffer.from(pub1).toString('hex')) {
107
+ recId = 1;
108
+ }
109
+ else {
110
+ throw Error('Invalid Signature');
111
+ }
112
+ return `${recId}${delimeter}${Buffer.from(dklsSignature.R).toString('hex')}${delimeter}${Buffer.from(dklsSignature.S).toString('hex')}${delimeter}${truePub}`;
113
+ }
114
+ async function executeTillRound(round, party1Dsg, party2Dsg) {
115
+ if (round < 1 || round > 5) {
116
+ throw Error('Invalid round number');
117
+ }
118
+ const party1Round1Message = await party1Dsg.init();
119
+ const party2Round1Message = await party2Dsg.init();
120
+ const party2Round2Messages = party2Dsg.handleIncomingMessages({
121
+ p2pMessages: [],
122
+ broadcastMessages: [party1Round1Message],
123
+ });
124
+ const party1Round2Messages = party1Dsg.handleIncomingMessages({
125
+ p2pMessages: [],
126
+ broadcastMessages: [party2Round1Message],
127
+ });
128
+ if (round === 2)
129
+ return [party1Round2Messages, party2Round2Messages];
130
+ const party1Round3Messages = party1Dsg.handleIncomingMessages({
131
+ p2pMessages: party2Round2Messages.p2pMessages,
132
+ broadcastMessages: [],
133
+ });
134
+ const party2Round3Messages = party2Dsg.handleIncomingMessages({
135
+ p2pMessages: party1Round2Messages.p2pMessages,
136
+ broadcastMessages: [],
137
+ });
138
+ if (round === 3)
139
+ return [party1Round3Messages, party2Round3Messages];
140
+ const party2Round4Messages = party2Dsg.handleIncomingMessages({
141
+ p2pMessages: party1Round3Messages.p2pMessages,
142
+ broadcastMessages: [],
143
+ });
144
+ const party1Round4Messages = party1Dsg.handleIncomingMessages({
145
+ p2pMessages: party2Round3Messages.p2pMessages,
146
+ broadcastMessages: [],
147
+ });
148
+ if (round === 4)
149
+ return [party1Round4Messages, party2Round4Messages];
150
+ party1Dsg.handleIncomingMessages({
151
+ p2pMessages: [],
152
+ broadcastMessages: party2Round4Messages.broadcastMessages,
153
+ });
154
+ party2Dsg.handleIncomingMessages({
155
+ p2pMessages: [],
156
+ broadcastMessages: party1Round4Messages.broadcastMessages,
157
+ });
158
+ (0, assert_1.default)(Buffer.from(party1Dsg.signature.R).toString('hex') === Buffer.from(party2Dsg.signature.R).toString('hex'));
159
+ (0, assert_1.default)(Buffer.from(party1Dsg.signature.S).toString('hex') === Buffer.from(party2Dsg.signature.S).toString('hex'));
160
+ return party1Dsg.signature;
161
+ }
162
+ async function generateDKGKeyShares(retrofitDataA, retrofitDataB, retrofitDataC, seedUser, seedBackup, seedBitgo) {
163
+ const user = new dkg_1.Dkg(3, 2, 0, seedUser, retrofitDataA);
164
+ const backup = new dkg_1.Dkg(3, 2, 1, seedBackup, retrofitDataB);
165
+ const bitgo = new dkg_1.Dkg(3, 2, 2, seedBitgo, retrofitDataC);
166
+ // #region round 1
167
+ const userRound1Message = await user.initDkg();
168
+ const backupRound1Message = await backup.initDkg();
169
+ const bitgoRound1Message = await bitgo.initDkg();
170
+ const bitgoRound2Messages = bitgo.handleIncomingMessages({
171
+ p2pMessages: [],
172
+ broadcastMessages: [userRound1Message, backupRound1Message],
173
+ });
174
+ // #endregion
175
+ // #region round 2
176
+ const userRound2Messages = user.handleIncomingMessages({
177
+ p2pMessages: [],
178
+ broadcastMessages: [bitgoRound1Message, backupRound1Message],
179
+ });
180
+ const backupRound2Messages = backup.handleIncomingMessages({
181
+ p2pMessages: [],
182
+ broadcastMessages: [userRound1Message, bitgoRound1Message],
183
+ });
184
+ const bitgoRound3Messages = bitgo.handleIncomingMessages({
185
+ p2pMessages: backupRound2Messages.p2pMessages
186
+ .filter((m) => m.to === 2)
187
+ .concat(userRound2Messages.p2pMessages.filter((m) => m.to === 2)),
188
+ broadcastMessages: [],
189
+ });
190
+ // #endregion
191
+ // #region round 3
192
+ const userRound3Messages = user.handleIncomingMessages({
193
+ p2pMessages: backupRound2Messages.p2pMessages
194
+ .filter((m) => m.to === 0)
195
+ .concat(bitgoRound2Messages.p2pMessages.filter((m) => m.to === 0)),
196
+ broadcastMessages: [],
197
+ });
198
+ const backupRound3Messages = backup.handleIncomingMessages({
199
+ p2pMessages: bitgoRound2Messages.p2pMessages
200
+ .filter((m) => m.to === 1)
201
+ .concat(userRound2Messages.p2pMessages.filter((m) => m.to === 1)),
202
+ broadcastMessages: [],
203
+ });
204
+ const userRound4Messages = user.handleIncomingMessages({
205
+ p2pMessages: backupRound3Messages.p2pMessages
206
+ .filter((m) => m.to === 0)
207
+ .concat(bitgoRound3Messages.p2pMessages.filter((m) => m.to === 0)),
208
+ broadcastMessages: [],
209
+ });
210
+ const backupRound4Messages = backup.handleIncomingMessages({
211
+ p2pMessages: bitgoRound3Messages.p2pMessages
212
+ .filter((m) => m.to === 1)
213
+ .concat(userRound3Messages.p2pMessages.filter((m) => m.to === 1)),
214
+ broadcastMessages: [],
215
+ });
216
+ const bitgoRound4Messages = bitgo.handleIncomingMessages({
217
+ p2pMessages: backupRound3Messages.p2pMessages
218
+ .filter((m) => m.to === 2)
219
+ .concat(userRound3Messages.p2pMessages.filter((m) => m.to === 2)),
220
+ broadcastMessages: [],
221
+ });
222
+ // #endregion
223
+ user.handleIncomingMessages({
224
+ p2pMessages: [],
225
+ broadcastMessages: bitgoRound4Messages.broadcastMessages.concat(backupRound4Messages.broadcastMessages),
226
+ });
227
+ bitgo.handleIncomingMessages({
228
+ p2pMessages: [],
229
+ broadcastMessages: backupRound4Messages.broadcastMessages.concat(userRound4Messages.broadcastMessages),
230
+ });
231
+ backup.handleIncomingMessages({
232
+ p2pMessages: [],
233
+ broadcastMessages: bitgoRound4Messages.broadcastMessages.concat(userRound4Messages.broadcastMessages),
234
+ });
235
+ return [user, backup, bitgo];
236
+ }
237
+ async function generate2of2KeyShares(retrofitDataA, retrofitDataB) {
238
+ const partyA = new dkg_1.Dkg(2, 2, 0, undefined, retrofitDataA);
239
+ const partyB = new dkg_1.Dkg(2, 2, 1, undefined, retrofitDataB);
240
+ const partyARound1Message = await partyA.initDkg();
241
+ const partyBRound1Message = await partyB.initDkg();
242
+ const partyARound2Messages = partyA.handleIncomingMessages({
243
+ p2pMessages: [],
244
+ broadcastMessages: [partyBRound1Message],
245
+ });
246
+ const partyBRound2Messages = partyB.handleIncomingMessages({
247
+ p2pMessages: [],
248
+ broadcastMessages: [partyARound1Message],
249
+ });
250
+ const partyARound3Messages = partyA.handleIncomingMessages({
251
+ p2pMessages: partyBRound2Messages.p2pMessages.filter((m) => m.to === 0),
252
+ broadcastMessages: [],
253
+ });
254
+ const partyBRound3Messages = partyB.handleIncomingMessages({
255
+ p2pMessages: partyARound2Messages.p2pMessages.filter((m) => m.to === 1),
256
+ broadcastMessages: [],
257
+ });
258
+ const partyARound4Messages = partyA.handleIncomingMessages({
259
+ p2pMessages: partyBRound3Messages.p2pMessages.filter((m) => m.to === 0),
260
+ broadcastMessages: [],
261
+ });
262
+ const partyBRound4Messages = partyB.handleIncomingMessages({
263
+ p2pMessages: partyARound3Messages.p2pMessages.filter((m) => m.to === 1),
264
+ broadcastMessages: [],
265
+ });
266
+ partyA.handleIncomingMessages({
267
+ p2pMessages: [],
268
+ broadcastMessages: partyBRound4Messages.broadcastMessages,
269
+ });
270
+ partyB.handleIncomingMessages({
271
+ p2pMessages: [],
272
+ broadcastMessages: partyARound4Messages.broadcastMessages,
273
+ });
274
+ return [partyA, partyB];
275
+ }
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90c3MvZWNkc2EtZGtscy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLDREQWdCQztBQVlELHNFQW9DQztBQUVELDRDQW9EQztBQUVELG9EQW9GQztBQUVELHNEQXlDQztBQTFRRCx1REFBNEQ7QUFDNUQseUNBQTRFO0FBQzVFLHFDQUFrRTtBQUVsRSxtQ0FBZ0M7QUFDaEMscURBQXVDO0FBQ3ZDLG1DQUEwQztBQUUxQywrQkFBNEI7QUFDNUIsb0RBQTRCO0FBRTVCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUV0Qjs7Ozs7R0FLRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLHFCQUFtQyxFQUFFLElBQVk7SUFDeEYsTUFBTSxDQUFDLEdBQUcsSUFBQSx5QkFBa0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUEsZUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlELE1BQU0sS0FBSyxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBQSxlQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBQSx5QkFBa0IsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLFNBQVMsR0FBRyxL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Q0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1FBQzVCLFdBQVcsRUFBRSxFQUFFO1FBQ2YsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsaUJBQWlCO0tBQzFELENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNlY3AyNTZrMSBhcyBzZWNwIH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9zZWNwMjU2azEnO1xuaW1wb3J0IHsgSERUcmVlLCBTZWNwMjU2azFCaXAzMkhkVHJlZSwgU2VjcDI1NmsxQ3VydmUgfSBmcm9tICcuLi8uLi9jdXJ2ZXMnO1xuaW1wb3J0IHsgYmlnSW50RnJvbUJ1ZmZlckJFLCBiaWdJbnRUb0J1ZmZlckJFIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZWREa2xzU2lnbmF0dXJlLCBEZXNlcmlhbGl6ZWRNZXNzYWdlcywgUmV0cm9maXREYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdjYm9yLXgnO1xuaW1wb3J0ICogYXMgc2VjcDI1NmsxIGZyb20gJ3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCBIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IERzZyB9IGZyb20gJy4vZHNnJztcbmltcG9ydCB7IERrZyB9IGZyb20gJy4vZGtnJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuY29uc3QgZGVsaW1ldGVyID0gJzonO1xuXG4vKipcbiAqIENvbWJpbmVzIHBhcnRpYWwgc2lnbmF0dXJlcyBmcm9tIHBhcnRpZXMgcGFydGljaXBhdGluZyBpbiBEU0cuXG4gKiBAcGFyYW0gcm91bmQ0TWVzc2FnZVBheWxvYWRzIC0gcm91bmQgNCBtZXNzYWdlIHBheWxvYWRzIGZyb20gcGFydGljaXBhdGluZyBwYXJ0aWVzXG4gKiBAcGFyYW0gckhleCAtIGhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgciB2YWx1ZSBpbiB0aGUgc2lnbmF0dXJlXG4gKiBAcmV0dXJucyB7RGVzZXJpYWxpemVkTWVzc2FnZXN9IC0gbWVzc2FnZXMgdG8gc2VuZCB0byBvdGhlciBwYXJ0aWVzIGZvciB0aGUgbmV4dCByb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZVBhcnRpYWxTaWduYXR1cmVzKHJvdW5kNE1lc3NhZ2VQYXlsb2FkczogVWludDhBcnJheVtdLCBySGV4OiBzdHJpbmcpOiBEZXNlcmlhbGl6ZWREa2xzU2lnbmF0dXJlIHtcbiAgY29uc3QgciA9IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShySGV4LCAnaGV4Jykuc3ViYXJyYXkoMSkpO1xuICBjb25zdCBzMEFyciA9IHJvdW5kNE1lc3NhZ2VQYXlsb2Fkcy5tYXAoKHApID0+IGRlY29kZShwKS5zXzApO1xuICBjb25zdCBzMUFyciA9IHJvdW5kNE1lc3NhZ2VQYXlsb2Fkcy5tYXAoKHApID0+IGRlY29kZShwKS5zXzEpO1xuICBjb25zdCBzMEJpZ0ludHMgPSBzMEFyci5tYXAoKHMwKSA9PiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oczApKSk7XG4gIGNvbnN0IHMxQmlnSW50cyA9IHMxQXJyLm1hcCgoczEpID0+IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShzMSkpKTtcbiAgY29uc3Qgc2VjcDI1NmsxQ3VydmUgPSBuZXcgU2VjcDI1NmsxQ3VydmUoKTtcbiAgY29uc3QgczBTdW0gPSBzMEJpZ0ludHMuc2xpY2UoMSkucmVkdWNlKChzdW1Tb0ZhciwgczApID0+IHNlY3AyNTZrMUN1cnZlLnNjYWxhckFkZChzdW1Tb0ZhciwgczApLCBzMEJpZ0ludHNbMF0pO1xuICBjb25zdCBzMVN1bSA9IHMxQmlnSW50cy5zbGljZSgxKS5yZWR1Y2UoKHN1bVNvRmFyLCBzMSkgPT4gc2VjcDI1NmsxQ3VydmUuc2NhbGFyQWRkKHN1bVNvRmFyLCBzMSksIHMxQmlnSW50c1swXSk7XG4gIGNvbnN0IHMgPSBzZWNwMjU2azFDdXJ2ZS5zY2FsYXJNdWx0KHMwU3VtLCBzZWNwMjU2azFDdXJ2ZS5zY2FsYXJJbnZlcnQoczFTdW0pKTtcbiAgY29uc3Qgc2lnID0gbmV3IHNlY3AuU2lnbmF0dXJlKHIsIHMpO1xuICBjb25zdCBub3JtYWxpemVkU2lnID0gc2lnLm5vcm1hbGl6ZVMoKTtcbiAgcmV0dXJuIHtcbiAgICBSOiBuZXcgVWludDhBcnJheShiaWdJbnRUb0J1ZmZlckJFKG5vcm1hbGl6ZWRTaWcuciwgMzIpKSxcbiAgICBTOiBuZXcgVWludDhBcnJheShiaWdJbnRUb0J1ZmZlckJFKG5vcm1hbGl6ZWRTaWcucywgMzIpKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYSBES0xzIFNpZ25hdHVyZSBhbmQgc2VyaWFsaXplIGl0IHRvIHJlY2lkOnI6czpwdWJsaWNrZXkgZm9ybWF0LlxuICogQHBhcmFtIG1lc3NhZ2UgLSBtZXNzYWdlIHRoYXQgd2FzIHNpZ25lZC5cbiAqIEBwYXJhbSBka2xzU2lnbmF0dXJlIC0gUiBhbmQgUyB2YWx1ZXMgb2YgdGhlIEVDRFNBIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSBjb21tb25LZXljaGFpbiAtIHB1YmxpYyBrZXkgYXBwZW5kZWQgdG8gY2hhaW5jb2RlIGluIGhleC5cbiAqIEBwYXJhbSBkZXJpdmF0aW9uUGF0aCAtIG9wdGlvbmFsIGRlcml2YXRpb24gcGF0aCB0byBkZXJpdmUgb24gdGhlIGNvbW1vbmtleWNoYWluIGJlZm9yZSB2ZXJpZmljYXRpb24uXG4gKiBAcGFyYW0gaGFzaCAtIG9wdGlvbmFsIGhhc2ggZnVuY3Rpb24gdG8gYXBwbHkgb24gbWVzc2FnZSBiZWZvcmUgdmVyaWZ5aW5nLiBEZWZhdWx0IGlzIHNoYTI1Ni5cbiAqIEBwYXJhbSBzaG91bGRIYXNoIC0gZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciBtZXNzYWdlIHNob3VsZCBiZSBoYXNoZWQgYmVmb3JlIHZlcmlmeWluZy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gc2VyaWFsaXplZCBzaWduYXR1cmUgaW4gYHJlY2lkOnI6czpwdWJsaWNrZXlgIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5QW5kQ29udmVydERrbHNTaWduYXR1cmUoXG4gIG1lc3NhZ2U6IEJ1ZmZlcixcbiAgZGtsc1NpZ25hdHVyZTogRGVzZXJpYWxpemVkRGtsc1NpZ25hdHVyZSxcbiAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgZGVyaXZhdGlvblBhdGg/OiBzdHJpbmcsXG4gIGhhc2g/OiBIYXNoLFxuICBzaG91bGRIYXNoID0gdHJ1ZVxuKTogc3RyaW5nIHtcbiAgbGV0IHRydWVQdWIgPSAnJztcbiAgaWYgKGRlcml2YXRpb25QYXRoICYmIGRlcml2YXRpb25QYXRoICE9PSAnbScpIHtcbiAgICBjb25zdCBoZFRyZWU6IEhEVHJlZSA9IG5ldyBTZWNwMjU2azFCaXAzMkhkVHJlZSgpO1xuICAgIGNvbnN0IGRlcml2ZWRQdWIgPSBoZFRyZWUucHVibGljRGVyaXZlKFxuICAgICAge1xuICAgICAgICBwazogYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKGNvbW1vbktleWNoYWluLnNsaWNlKDAsIDY2KSwgJ2hleCcpKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oY29tbW9uS2V5Y2hhaW4uc2xpY2UoNjYpLCAnaGV4JykpLFxuICAgICAgfSxcbiAgICAgIGRlcml2YXRpb25QYXRoXG4gICAgKTtcbiAgICB0cnVlUHViID0gYmlnSW50VG9CdWZmZXJCRShkZXJpdmVkUHViLnBrKS50b1N0cmluZygnaGV4Jyk7XG4gIH0gZWxzZSB7XG4gICAgdHJ1ZVB1YiA9IGNvbW1vbktleWNoYWluLnNsaWNlKDAsIDY2KTtcbiAgfVxuICBjb25zdCBtZXNzYWdlVG9WZXJpZnkgPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKSA6IG1lc3NhZ2U7XG4gIGNvbnN0IHB1YjAgPSBzZWNwMjU2azEuZWNkc2FSZWNvdmVyKEJ1ZmZlci5jb25jYXQoW2RrbHNTaWduYXR1cmUuUiwgZGtsc1NpZ25hdHVyZS5TXSksIDAsIG1lc3NhZ2VUb1ZlcmlmeSwgdHJ1ZSk7XG4gIGNvbnN0IHB1YjEgPSBzZWNwMjU2azEuZWNkc2FSZWNvdmVyKEJ1ZmZlci5jb25jYXQoW2RrbHNTaWduYXR1cmUuUiwgZGtsc1NpZ25hdHVyZS5TXSksIDEsIG1lc3NhZ2VUb1ZlcmlmeSwgdHJ1ZSk7XG4gIGxldCByZWNJZDogbnVtYmVyO1xuICBpZiAodHJ1ZVB1YiA9PT0gQnVmZmVyLmZyb20ocHViMCkudG9TdHJpbmcoJ2hleCcpKSB7XG4gICAgcmVjSWQgPSAwO1xuICB9IGVsc2UgaWYgKHRydWVQdWIgPT09IEJ1ZmZlci5mcm9tKHB1YjEpLnRvU3RyaW5nKCdoZXgnKSkge1xuICAgIHJlY0lkID0gMTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcignSW52YWxpZCBTaWduYXR1cmUnKTtcbiAgfVxuICByZXR1cm4gYCR7cmVjSWR9JHtkZWxpbWV0ZXJ9JHtCdWZmZXIuZnJvbShka2xzU2lnbmF0dXJlLlIpLnRvU3RyaW5nKCdoZXgnKX0ke2RlbGltZXRlcn0ke0J1ZmZlci5mcm9tKFxuICAgIGRrbHNTaWduYXR1cmUuU1xuICApLnRvU3RyaW5nKCdoZXgnKX0ke2RlbGltZXRlcn0ke3RydWVQdWJ9YDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVUaWxsUm91bmQoXG4gIHJvdW5kOiBudW1iZXIsXG4gIHBhcnR5MURzZzogRHNnLFxuICBwYXJ0eTJEc2c6IERzZ1xuKTogUHJvbWlzZTxEZXNlcmlhbGl6ZWRNZXNzYWdlc1tdIHwgRGVzZXJpYWxpemVkRGtsc1NpZ25hdHVyZT4ge1xuICBpZiAocm91bmQgPCAxIHx8IHJvdW5kID4gNSkge1xuICAgIHRocm93IEVycm9yKCdJbnZhbGlkIHJvdW5kIG51bWJlcicpO1xuICB9XG4gIGNvbnN0IHBhcnR5MVJvdW5kMU1lc3NhZ2UgPSBhd2FpdCBwYXJ0eTFEc2cuaW5pdCgpO1xuICBjb25zdCBwYXJ0eTJSb3VuZDFNZXNzYWdlID0gYXdhaXQgcGFydHkyRHNnLmluaXQoKTtcblxuICBjb25zdCBwYXJ0eTJSb3VuZDJNZXNzYWdlcyA9IHBhcnR5MkRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtwYXJ0eTFSb3VuZDFNZXNzYWdlXSxcbiAgfSk7XG4gIGNvbnN0IHBhcnR5MVJvdW5kMk1lc3NhZ2VzID0gcGFydHkxRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW3BhcnR5MlJvdW5kMU1lc3NhZ2VdLFxuICB9KTtcbiAgaWYgKHJvdW5kID09PSAyKSByZXR1cm4gW3BhcnR5MVJvdW5kMk1lc3NhZ2VzLCBwYXJ0eTJSb3VuZDJNZXNzYWdlc107XG5cbiAgY29uc3QgcGFydHkxUm91bmQzTWVzc2FnZXMgPSBwYXJ0eTFEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5MlJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGNvbnN0IHBhcnR5MlJvdW5kM01lc3NhZ2VzID0gcGFydHkyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBwYXJ0eTFSb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcyxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBpZiAocm91bmQgPT09IDMpIHJldHVybiBbcGFydHkxUm91bmQzTWVzc2FnZXMsIHBhcnR5MlJvdW5kM01lc3NhZ2VzXTtcblxuICBjb25zdCBwYXJ0eTJSb3VuZDRNZXNzYWdlcyA9IHBhcnR5MkRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogcGFydHkxUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMsXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHkxUm91bmQ0TWVzc2FnZXMgPSBwYXJ0eTFEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5MlJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGlmIChyb3VuZCA9PT0gNCkgcmV0dXJuIFtwYXJ0eTFSb3VuZDRNZXNzYWdlcywgcGFydHkyUm91bmQ0TWVzc2FnZXNdO1xuXG4gIHBhcnR5MURzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IHBhcnR5MlJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLFxuICB9KTtcbiAgcGFydHkyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogcGFydHkxUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gIH0pO1xuICBhc3NlcnQoQnVmZmVyLmZyb20ocGFydHkxRHNnLnNpZ25hdHVyZS5SKS50b1N0cmluZygnaGV4JykgPT09IEJ1ZmZlci5mcm9tKHBhcnR5MkRzZy5zaWduYXR1cmUuUikudG9TdHJpbmcoJ2hleCcpKTtcbiAgYXNzZXJ0KEJ1ZmZlci5mcm9tKHBhcnR5MURzZy5zaWduYXR1cmUuUykudG9TdHJpbmcoJ2hleCcpID09PSBCdWZmZXIuZnJvbShwYXJ0eTJEc2cuc2lnbmF0dXJlLlMpLnRvU3RyaW5nKCdoZXgnKSk7XG4gIHJldHVybiBwYXJ0eTFEc2cuc2lnbmF0dXJlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVES0dLZXlTaGFyZXMoXG4gIHJldHJvZml0RGF0YUE/OiBSZXRyb2ZpdERhdGEsXG4gIHJldHJvZml0RGF0YUI/OiBSZXRyb2ZpdERhdGEsXG4gIHJldHJvZml0RGF0YUM/OiBSZXRyb2ZpdERhdGEsXG4gIHNlZWRVc2VyPzogQnVmZmVyLFxuICBzZWVkQmFja3VwPzogQnVmZmVyLFxuICBzZWVkQml0Z28/OiBCdWZmZXJcbik6IFByb21pc2U8W0RrZywgRGtnLCBEa2ddPiB7XG4gIGNvbnN0IHVzZXIgPSBuZXcgRGtnKDMsIDIsIDAsIHNlZWRVc2VyLCByZXRyb2ZpdERhdGFBKTtcbiAgY29uc3QgYmFja3VwID0gbmV3IERrZygzLCAyLCAxLCBzZWVkQmFja3VwLCByZXRyb2ZpdERhdGFCKTtcbiAgY29uc3QgYml0Z28gPSBuZXcgRGtnKDMsIDIsIDIsIHNlZWRCaXRnbywgcmV0cm9maXREYXRhQyk7XG4gIC8vICNyZWdpb24gcm91bmQgMVxuICBjb25zdCB1c2VyUm91bmQxTWVzc2FnZSA9IGF3YWl0IHVzZXIuaW5pdERrZygpO1xuICBjb25zdCBiYWNrdXBSb3VuZDFNZXNzYWdlID0gYXdhaXQgYmFja3VwLmluaXREa2coKTtcbiAgY29uc3QgYml0Z29Sb3VuZDFNZXNzYWdlID0gYXdhaXQgYml0Z28uaW5pdERrZygpO1xuICBjb25zdCBiaXRnb1JvdW5kMk1lc3NhZ2VzID0gYml0Z28uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbdXNlclJvdW5kMU1lc3NhZ2UsIGJhY2t1cFJvdW5kMU1lc3NhZ2VdLFxuICB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gcm91bmQgMlxuICBjb25zdCB1c2VyUm91bmQyTWVzc2FnZXMgPSB1c2VyLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW2JpdGdvUm91bmQxTWVzc2FnZSwgYmFja3VwUm91bmQxTWVzc2FnZV0sXG4gIH0pO1xuICBjb25zdCBiYWNrdXBSb3VuZDJNZXNzYWdlcyA9IGJhY2t1cC5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFt1c2VyUm91bmQxTWVzc2FnZSwgYml0Z29Sb3VuZDFNZXNzYWdlXSxcbiAgfSk7XG4gIGNvbnN0IGJpdGdvUm91bmQzTWVzc2FnZXMgPSBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogYmFja3VwUm91bmQyTWVzc2FnZXMucDJwTWVzc2FnZXNcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpXG4gICAgICAuY29uY2F0KHVzZXJSb3VuZDJNZXNzYWdlcy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IDIpKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiByb3VuZCAzXG4gIGNvbnN0IHVzZXJSb3VuZDNNZXNzYWdlcyA9IHVzZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IGJhY2t1cFJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAwKVxuICAgICAgLmNvbmNhdChiaXRnb1JvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMCkpLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbXSxcbiAgfSk7XG4gIGNvbnN0IGJhY2t1cFJvdW5kM01lc3NhZ2VzID0gYmFja3VwLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBiaXRnb1JvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAxKVxuICAgICAgLmNvbmNhdCh1c2VyUm91bmQyTWVzc2FnZXMucDJwTWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnRvID09PSAxKSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgdXNlclJvdW5kNE1lc3NhZ2VzID0gdXNlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogYmFja3VwUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXNcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0udG8gPT09IDApXG4gICAgICAuY29uY2F0KGJpdGdvUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnRvID09PSAwKSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgYmFja3VwUm91bmQ0TWVzc2FnZXMgPSBiYWNrdXAuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IGJpdGdvUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXNcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0udG8gPT09IDEpXG4gICAgICAuY29uY2F0KHVzZXJSb3VuZDNNZXNzYWdlcy5wMnBNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0udG8gPT09IDEpKSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW10sXG4gIH0pO1xuICBjb25zdCBiaXRnb1JvdW5kNE1lc3NhZ2VzID0gYml0Z28uaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IGJhY2t1cFJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzXG4gICAgICAuZmlsdGVyKChtKSA9PiBtLnRvID09PSAyKVxuICAgICAgLmNvbmNhdCh1c2VyUm91bmQzTWVzc2FnZXMucDJwTWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnRvID09PSAyKSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgLy8gI2VuZHJlZ2lvblxuXG4gIHVzZXIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBiaXRnb1JvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmNvbmNhdChiYWNrdXBSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcyksXG4gIH0pO1xuICBiaXRnby5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IGJhY2t1cFJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzLmNvbmNhdCh1c2VyUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMpLFxuICB9KTtcbiAgYmFja3VwLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogYml0Z29Sb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcy5jb25jYXQodXNlclJvdW5kNE1lc3NhZ2VzLmJyb2FkY2FzdE1lc3NhZ2VzKSxcbiAgfSk7XG4gIHJldHVybiBbdXNlciwgYmFja3VwLCBiaXRnb107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZTJvZjJLZXlTaGFyZXMoXG4gIHJldHJvZml0RGF0YUE/OiBSZXRyb2ZpdERhdGEsXG4gIHJldHJvZml0RGF0YUI/OiBSZXRyb2ZpdERhdGFcbik6IFByb21pc2U8W0RrZywgRGtnXT4ge1xuICBjb25zdCBwYXJ0eUEgPSBuZXcgRGtnKDIsIDIsIDAsIHVuZGVmaW5lZCwgcmV0cm9maXREYXRhQSk7XG4gIGNvbnN0IHBhcnR5QiA9IG5ldyBEa2coMiwgMiwgMSwgdW5kZWZpbmVkLCByZXRyb2ZpdERhdGFCKTtcbiAgY29uc3QgcGFydHlBUm91bmQxTWVzc2FnZSA9IGF3YWl0IHBhcnR5QS5pbml0RGtnKCk7XG4gIGNvbnN0IHBhcnR5QlJvdW5kMU1lc3NhZ2UgPSBhd2FpdCBwYXJ0eUIuaW5pdERrZygpO1xuICBjb25zdCBwYXJ0eUFSb3VuZDJNZXNzYWdlcyA9IHBhcnR5QS5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHtcbiAgICBwMnBNZXNzYWdlczogW10sXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtwYXJ0eUJSb3VuZDFNZXNzYWdlXSxcbiAgfSk7XG4gIGNvbnN0IHBhcnR5QlJvdW5kMk1lc3NhZ2VzID0gcGFydHlCLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogW3BhcnR5QVJvdW5kMU1lc3NhZ2VdLFxuICB9KTtcbiAgY29uc3QgcGFydHlBUm91bmQzTWVzc2FnZXMgPSBwYXJ0eUEuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QlJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMCksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHlCUm91bmQzTWVzc2FnZXMgPSBwYXJ0eUIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QVJvdW5kMk1lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHlBUm91bmQ0TWVzc2FnZXMgPSBwYXJ0eUEuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QlJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMCksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGFydHlCUm91bmQ0TWVzc2FnZXMgPSBwYXJ0eUIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IHBhcnR5QVJvdW5kM01lc3NhZ2VzLnAycE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS50byA9PT0gMSksXG4gICAgYnJvYWRjYXN0TWVzc2FnZXM6IFtdLFxuICB9KTtcbiAgcGFydHlBLmhhbmRsZUluY29taW5nTWVzc2FnZXMoe1xuICAgIHAycE1lc3NhZ2VzOiBbXSxcbiAgICBicm9hZGNhc3RNZXNzYWdlczogcGFydHlCUm91bmQ0TWVzc2FnZXMuYnJvYWRjYXN0TWVzc2FnZXMsXG4gIH0pO1xuICBwYXJ0eUIuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyh7XG4gICAgcDJwTWVzc2FnZXM6IFtdLFxuICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBwYXJ0eUFSb3VuZDRNZXNzYWdlcy5icm9hZGNhc3RNZXNzYWdlcyxcbiAgfSk7XG4gIHJldHVybiBbcGFydHlBLCBwYXJ0eUJdO1xufVxuIl19
@@ -0,0 +1,30 @@
1
+ import * as pgp from 'openpgp';
2
+ import { MPSSignedMessage } from './types';
3
+ /**
4
+ * PGP detached-signs raw WASM bytes with the given private key.
5
+ * Returns an MPSSignedMessage with the base64-encoded payload and armored signature.
6
+ */
7
+ export declare function detachSignMpsMessage(rawBytes: Buffer | Uint8Array, signingKey: pgp.PrivateKey): Promise<MPSSignedMessage>;
8
+ /**
9
+ * Verifies a PGP detached signature on an MPSSignedMessage and returns the decoded raw bytes.
10
+ * Throws if the signature is invalid or not present.
11
+ */
12
+ export declare function verifyMpsMessage(msg: MPSSignedMessage, verificationKey: pgp.Key): Promise<Buffer>;
13
+ /**
14
+ * Extracts the X25519 public key bytes from a GPG key's encryption subkey.
15
+ * Works for both public-only and private keys — use this for third-party keys (e.g. BitGo's).
16
+ *
17
+ * @param key - A GPG key with an X25519 encryption subkey.
18
+ * @returns 32-byte X25519 public key.
19
+ */
20
+ export declare function extractEd25519PublicKey(key: pgp.Key): Promise<Buffer>;
21
+ /**
22
+ * Extracts the X25519 public and private key bytes from a GPG ed25519 private key's
23
+ * encryption subkey. Encapsulates the keyPacket internals and the little-endian scalar
24
+ * reversal in one place so sdk-core only deals with plain Buffers.
25
+ *
26
+ * @param privateKey - An ed25519 GPG private key with an X25519 encryption subkey.
27
+ * @returns [pk, sk] — 32-byte X25519 public key and private scalar.
28
+ */
29
+ export declare function extractEd25519KeyPair(privateKey: pgp.PrivateKey): Promise<[Buffer, Buffer]>;
30
+ //# sourceMappingURL=commsLayer.d.ts.map