@baozi.bet/mcp-server 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +294 -0
  2. package/dist/__tests__/full-test.d.ts +1 -0
  3. package/dist/__tests__/full-test.js +291 -0
  4. package/dist/builders/affiliate-transaction.d.ts +41 -0
  5. package/dist/builders/affiliate-transaction.js +123 -0
  6. package/dist/builders/bet-transaction.d.ts +70 -0
  7. package/dist/builders/bet-transaction.js +323 -0
  8. package/dist/builders/claim-transaction.d.ts +57 -0
  9. package/dist/builders/claim-transaction.js +196 -0
  10. package/dist/builders/creator-transaction.d.ts +49 -0
  11. package/dist/builders/creator-transaction.js +177 -0
  12. package/dist/builders/dispute-transaction.d.ts +81 -0
  13. package/dist/builders/dispute-transaction.js +215 -0
  14. package/dist/builders/index.d.ts +14 -0
  15. package/dist/builders/index.js +15 -0
  16. package/dist/builders/market-creation-tx.d.ts +65 -0
  17. package/dist/builders/market-creation-tx.js +362 -0
  18. package/dist/builders/market-management-transaction.d.ts +85 -0
  19. package/dist/builders/market-management-transaction.js +239 -0
  20. package/dist/builders/race-transaction.d.ts +67 -0
  21. package/dist/builders/race-transaction.js +242 -0
  22. package/dist/builders/resolution-transaction.d.ts +108 -0
  23. package/dist/builders/resolution-transaction.js +250 -0
  24. package/dist/builders/whitelist-transaction.d.ts +72 -0
  25. package/dist/builders/whitelist-transaction.js +179 -0
  26. package/dist/config.d.ts +138 -0
  27. package/dist/config.js +307 -0
  28. package/dist/handlers/agent-network.d.ts +81 -0
  29. package/dist/handlers/agent-network.js +332 -0
  30. package/dist/handlers/claims.d.ts +47 -0
  31. package/dist/handlers/claims.js +218 -0
  32. package/dist/handlers/market-creation.d.ts +154 -0
  33. package/dist/handlers/market-creation.js +290 -0
  34. package/dist/handlers/markets.d.ts +41 -0
  35. package/dist/handlers/markets.js +319 -0
  36. package/dist/handlers/positions.d.ts +40 -0
  37. package/dist/handlers/positions.js +244 -0
  38. package/dist/handlers/quote.d.ts +33 -0
  39. package/dist/handlers/quote.js +144 -0
  40. package/dist/handlers/race-markets.d.ts +54 -0
  41. package/dist/handlers/race-markets.js +308 -0
  42. package/dist/handlers/resolution.d.ts +43 -0
  43. package/dist/handlers/resolution.js +194 -0
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.js +109 -0
  46. package/dist/resources.d.ts +13 -0
  47. package/dist/resources.js +336 -0
  48. package/dist/tools.d.ts +3109 -0
  49. package/dist/tools.js +1956 -0
  50. package/dist/validation/bet-rules.d.ts +82 -0
  51. package/dist/validation/bet-rules.js +276 -0
  52. package/dist/validation/creation-rules.d.ts +69 -0
  53. package/dist/validation/creation-rules.js +302 -0
  54. package/dist/validation/index.d.ts +6 -0
  55. package/dist/validation/index.js +7 -0
  56. package/dist/validation/market-rules.d.ts +60 -0
  57. package/dist/validation/market-rules.js +237 -0
  58. package/dist/validation/parimutuel-rules.d.ts +117 -0
  59. package/dist/validation/parimutuel-rules.js +270 -0
  60. package/package.json +52 -0
@@ -0,0 +1,239 @@
1
+ /**
2
+ * Market Management Transaction Builders
3
+ *
4
+ * Builds unsigned transactions for:
5
+ * - Closing markets (stopping betting)
6
+ * - Extending market deadlines
7
+ */
8
+ import { Connection, PublicKey, Transaction, TransactionInstruction, } from '@solana/web3.js';
9
+ import { PROGRAM_ID, CONFIG_PDA, RPC_ENDPOINT, } from '../config.js';
10
+ // =============================================================================
11
+ // DISCRIMINATORS
12
+ // =============================================================================
13
+ const DISCRIMINATORS = {
14
+ close_market: Buffer.from([88, 154, 248, 186, 48, 14, 123, 244]),
15
+ close_race_market: Buffer.from([39, 189, 166, 118, 134, 37, 102, 41]),
16
+ extend_market: Buffer.from([105, 89, 206, 205, 57, 31, 153, 252]),
17
+ extend_race_market: Buffer.from([242, 176, 227, 152, 79, 116, 110, 168]),
18
+ cancel_market: Buffer.from([205, 121, 84, 210, 222, 71, 150, 11]),
19
+ cancel_race: Buffer.from([28, 31, 113, 29, 126, 206, 39, 119]),
20
+ };
21
+ // =============================================================================
22
+ // BOOLEAN MARKET MANAGEMENT
23
+ // =============================================================================
24
+ /**
25
+ * Build close_market transaction
26
+ * Stops betting on a market (usually done by creator before resolution)
27
+ */
28
+ export async function buildCloseMarketTransaction(params) {
29
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
30
+ const marketPubkey = new PublicKey(params.marketPda);
31
+ const callerPubkey = new PublicKey(params.callerWallet);
32
+ const data = DISCRIMINATORS.close_market;
33
+ const keys = [
34
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
35
+ { pubkey: marketPubkey, isSigner: false, isWritable: true },
36
+ { pubkey: callerPubkey, isSigner: true, isWritable: false },
37
+ ];
38
+ const instruction = new TransactionInstruction({
39
+ programId: PROGRAM_ID,
40
+ keys,
41
+ data,
42
+ });
43
+ const transaction = new Transaction().add(instruction);
44
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
45
+ transaction.recentBlockhash = blockhash;
46
+ transaction.feePayer = callerPubkey;
47
+ return {
48
+ transaction,
49
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
50
+ };
51
+ }
52
+ /**
53
+ * Build extend_market transaction
54
+ * Extends the closing time and/or resolution time
55
+ */
56
+ export async function buildExtendMarketTransaction(params) {
57
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
58
+ const marketPubkey = new PublicKey(params.marketPda);
59
+ const callerPubkey = new PublicKey(params.callerWallet);
60
+ // Instruction data: discriminator + new_closing_time (i64) + Option<i64> new_resolution_time
61
+ const hasResolutionTime = params.newResolutionTime !== undefined;
62
+ const dataSize = 8 + 8 + 1 + (hasResolutionTime ? 8 : 0);
63
+ const data = Buffer.alloc(dataSize);
64
+ let offset = 0;
65
+ DISCRIMINATORS.extend_market.copy(data, offset);
66
+ offset += 8;
67
+ data.writeBigInt64LE(BigInt(params.newClosingTime), offset);
68
+ offset += 8;
69
+ if (hasResolutionTime) {
70
+ data.writeUInt8(1, offset); // Some
71
+ offset += 1;
72
+ data.writeBigInt64LE(BigInt(params.newResolutionTime), offset);
73
+ }
74
+ else {
75
+ data.writeUInt8(0, offset); // None
76
+ }
77
+ const keys = [
78
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
79
+ { pubkey: marketPubkey, isSigner: false, isWritable: true },
80
+ { pubkey: callerPubkey, isSigner: true, isWritable: false },
81
+ ];
82
+ const instruction = new TransactionInstruction({
83
+ programId: PROGRAM_ID,
84
+ keys,
85
+ data,
86
+ });
87
+ const transaction = new Transaction().add(instruction);
88
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
89
+ transaction.recentBlockhash = blockhash;
90
+ transaction.feePayer = callerPubkey;
91
+ return {
92
+ transaction,
93
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
94
+ };
95
+ }
96
+ // =============================================================================
97
+ // RACE MARKET MANAGEMENT
98
+ // =============================================================================
99
+ /**
100
+ * Build close_race_market transaction
101
+ */
102
+ export async function buildCloseRaceMarketTransaction(params) {
103
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
104
+ const raceMarketPubkey = new PublicKey(params.raceMarketPda);
105
+ const callerPubkey = new PublicKey(params.callerWallet);
106
+ const data = DISCRIMINATORS.close_race_market;
107
+ const keys = [
108
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
109
+ { pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
110
+ { pubkey: callerPubkey, isSigner: true, isWritable: false },
111
+ ];
112
+ const instruction = new TransactionInstruction({
113
+ programId: PROGRAM_ID,
114
+ keys,
115
+ data,
116
+ });
117
+ const transaction = new Transaction().add(instruction);
118
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
119
+ transaction.recentBlockhash = blockhash;
120
+ transaction.feePayer = callerPubkey;
121
+ return {
122
+ transaction,
123
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
124
+ };
125
+ }
126
+ /**
127
+ * Build extend_race_market transaction
128
+ */
129
+ export async function buildExtendRaceMarketTransaction(params) {
130
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
131
+ const raceMarketPubkey = new PublicKey(params.raceMarketPda);
132
+ const callerPubkey = new PublicKey(params.callerWallet);
133
+ const hasResolutionTime = params.newResolutionTime !== undefined;
134
+ const dataSize = 8 + 8 + 1 + (hasResolutionTime ? 8 : 0);
135
+ const data = Buffer.alloc(dataSize);
136
+ let offset = 0;
137
+ DISCRIMINATORS.extend_race_market.copy(data, offset);
138
+ offset += 8;
139
+ data.writeBigInt64LE(BigInt(params.newClosingTime), offset);
140
+ offset += 8;
141
+ if (hasResolutionTime) {
142
+ data.writeUInt8(1, offset); // Some
143
+ offset += 1;
144
+ data.writeBigInt64LE(BigInt(params.newResolutionTime), offset);
145
+ }
146
+ else {
147
+ data.writeUInt8(0, offset); // None
148
+ }
149
+ const keys = [
150
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
151
+ { pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
152
+ { pubkey: callerPubkey, isSigner: true, isWritable: false },
153
+ ];
154
+ const instruction = new TransactionInstruction({
155
+ programId: PROGRAM_ID,
156
+ keys,
157
+ data,
158
+ });
159
+ const transaction = new Transaction().add(instruction);
160
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
161
+ transaction.recentBlockhash = blockhash;
162
+ transaction.feePayer = callerPubkey;
163
+ return {
164
+ transaction,
165
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
166
+ };
167
+ }
168
+ // =============================================================================
169
+ // CANCEL MARKET (ADMIN/CREATOR)
170
+ // =============================================================================
171
+ /**
172
+ * Build cancel_market transaction
173
+ * Cancels a market and allows all bettors to claim refunds.
174
+ * Only callable by admin or creator (depending on market status).
175
+ */
176
+ export async function buildCancelMarketTransaction(params) {
177
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
178
+ const marketPubkey = new PublicKey(params.marketPda);
179
+ const authorityPubkey = new PublicKey(params.authorityWallet);
180
+ // Instruction data: discriminator + reason (string)
181
+ // String encoding: 4-byte length prefix + UTF-8 bytes
182
+ const reasonBytes = Buffer.from(params.reason, 'utf8');
183
+ const data = Buffer.alloc(8 + 4 + reasonBytes.length);
184
+ DISCRIMINATORS.cancel_market.copy(data, 0);
185
+ data.writeUInt32LE(reasonBytes.length, 8);
186
+ reasonBytes.copy(data, 12);
187
+ const keys = [
188
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
189
+ { pubkey: marketPubkey, isSigner: false, isWritable: true },
190
+ { pubkey: authorityPubkey, isSigner: true, isWritable: false },
191
+ ];
192
+ const instruction = new TransactionInstruction({
193
+ programId: PROGRAM_ID,
194
+ keys,
195
+ data,
196
+ });
197
+ const transaction = new Transaction().add(instruction);
198
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
199
+ transaction.recentBlockhash = blockhash;
200
+ transaction.feePayer = authorityPubkey;
201
+ return {
202
+ transaction,
203
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
204
+ };
205
+ }
206
+ /**
207
+ * Build cancel_race transaction
208
+ * Cancels a race market and allows all bettors to claim refunds.
209
+ */
210
+ export async function buildCancelRaceTransaction(params) {
211
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
212
+ const raceMarketPubkey = new PublicKey(params.raceMarketPda);
213
+ const authorityPubkey = new PublicKey(params.authorityWallet);
214
+ // Instruction data: discriminator + reason (string)
215
+ const reasonBytes = Buffer.from(params.reason, 'utf8');
216
+ const data = Buffer.alloc(8 + 4 + reasonBytes.length);
217
+ DISCRIMINATORS.cancel_race.copy(data, 0);
218
+ data.writeUInt32LE(reasonBytes.length, 8);
219
+ reasonBytes.copy(data, 12);
220
+ const keys = [
221
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
222
+ { pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
223
+ { pubkey: authorityPubkey, isSigner: true, isWritable: false },
224
+ ];
225
+ const instruction = new TransactionInstruction({
226
+ programId: PROGRAM_ID,
227
+ keys,
228
+ data,
229
+ });
230
+ const transaction = new Transaction().add(instruction);
231
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
232
+ transaction.recentBlockhash = blockhash;
233
+ transaction.feePayer = authorityPubkey;
234
+ return {
235
+ transaction,
236
+ serializedTx: transaction.serialize({ requireAllSignatures: false, verifySignatures: false }).toString('base64'),
237
+ };
238
+ }
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2V0LW1hbmFnZW1lbnQtdHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVpbGRlcnMvbWFya2V0LW1hbmFnZW1lbnQtdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsV0FBVyxFQUNYLHNCQUFzQixHQUN2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksR0FDYixNQUFNLGNBQWMsQ0FBQztBQUV0QixnRkFBZ0Y7QUFDaEYsaUJBQWlCO0FBQ2pCLGdGQUFnRjtBQUVoRixNQUFNLGNBQWMsR0FBRztJQUNyQixZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2pFLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEUsYUFBYSxFQUFFLE1BQU0s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TSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pFLFdBQVcsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO0lBQ3hDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDO0lBRXZDLE9BQU87UUFDTCxXQUFXO1FBQ1gsWUFBWSxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0tBQ2pILENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXJrZXQgTWFuYWdlbWVudCBUcmFuc2FjdGlvbiBCdWlsZGVyc1xuICpcbiAqIEJ1aWxkcyB1bnNpZ25lZCB0cmFuc2FjdGlvbnMgZm9yOlxuICogLSBDbG9zaW5nIG1hcmtldHMgKHN0b3BwaW5nIGJldHRpbmcpXG4gKiAtIEV4dGVuZGluZyBtYXJrZXQgZGVhZGxpbmVzXG4gKi9cbmltcG9ydCB7XG4gIENvbm5lY3Rpb24sXG4gIFB1YmxpY0tleSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQge1xuICBQUk9HUkFNX0lELFxuICBDT05GSUdfUERBLFxuICBSUENfRU5EUE9JTlQsXG59IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBESVNDUklNSU5BVE9SU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgRElTQ1JJTUlOQVRPUlMgPSB7XG4gIGNsb3NlX21hcmtldDogQnVmZmVyLmZyb20oWzg4LCAxNTQsIDI0OCwgMTg2LCA0OCwgMTQsIDEyMywgMjQ0XSksXG4gIGNsb3NlX3JhY2VfbWFya2V0OiBCdWZmZXIuZnJvbShbMzksIDE4OSwgMTY2LCAxMTgsIDEzNCwgMzcsIDEwMiwgNDFdKSxcbiAgZXh0ZW5kX21hcmtldDogQnVmZmVyLmZyb20oWzEwNSwgODksIDIwNiwgMjA1LCA1NywgMzEsIDE1MywgMjUyXSksXG4gIGV4dGVuZF9yYWNlX21hcmtldDogQnVmZmVyLmZyb20oWzI0MiwgMTc2LCAyMjcsIDE1MiwgNzksIDExNiwgMTEwLCAxNjhdKSxcbiAgY2FuY2VsX21hcmtldDogQnVmZmVyLmZyb20oWzIwNSwgMTIxLCA4NCwgMjEwLCAyMjIsIDcxLCAxNTAsIDExXSksXG4gIGNhbmNlbF9yYWNlOiBCdWZmZXIuZnJvbShbMjgsIDMxLCAxMTMsIDI5LCAxMjYsIDIwNiwgMzksIDExOV0pLFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJPT0xFQU4gTUFSS0VUIE1BTkFHRU1FTlRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQnVpbGQgY2xvc2VfbWFya2V0IHRyYW5zYWN0aW9uXG4gKiBTdG9wcyBiZXR0aW5nIG9uIGEgbWFya2V0ICh1c3VhbGx5IGRvbmUgYnkgY3JlYXRvciBiZWZvcmUgcmVzb2x1dGlvbilcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xvc2VNYXJrZXRUcmFuc2FjdGlvbihwYXJhbXM6IHtcbiAgbWFya2V0UGRhOiBzdHJpbmc7XG4gIGNhbGxlcldhbGxldDogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHsgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uOyBzZXJpYWxpemVkVHg6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNvbm4gPSBwYXJhbXMuY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcbiAgY29uc3QgbWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMubWFya2V0UGRhKTtcbiAgY29uc3QgY2FsbGVyUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuY2FsbGVyV2FsbGV0KTtcblxuICBjb25zdCBkYXRhID0gRElTQ1JJTUlOQVRPUlMuY2xvc2VfbWFya2V0O1xuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogbWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogY2FsbGVyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgXTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAga2V5cyxcbiAgICBkYXRhLFxuICB9KTtcblxuICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChpbnN0cnVjdGlvbik7XG4gIGNvbnN0IHsgYmxvY2toYXNoIH0gPSBhd2FpdCBjb25uLmdldExhdGVzdEJsb2NraGFzaCgnZmluYWxpemVkJyk7XG4gIHRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCA9IGJsb2NraGFzaDtcbiAgdHJhbnNhY3Rpb24uZmVlUGF5ZXIgPSBjYWxsZXJQdWJrZXk7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2FjdGlvbixcbiAgICBzZXJpYWxpemVkVHg6IHRyYW5zYWN0aW9uLnNlcmlhbGl6ZSh7IHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSwgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGV4dGVuZF9tYXJrZXQgdHJhbnNhY3Rpb25cbiAqIEV4dGVuZHMgdGhlIGNsb3NpbmcgdGltZSBhbmQvb3IgcmVzb2x1dGlvbiB0aW1lXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEV4dGVuZE1hcmtldFRyYW5zYWN0aW9uKHBhcmFtczoge1xuICBtYXJrZXRQZGE6IHN0cmluZztcbiAgbmV3Q2xvc2luZ1RpbWU6IG51bWJlcjsgLy8gVW5peCB0aW1lc3RhbXBcbiAgbmV3UmVzb2x1dGlvblRpbWU/OiBudW1iZXI7IC8vIFVuaXggdGltZXN0YW1wIChvcHRpb25hbClcbiAgY2FsbGVyV2FsbGV0OiBzdHJpbmc7XG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uO1xufSk6IFByb21pc2U8eyB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247IHNlcmlhbGl6ZWRUeDogc3RyaW5nIH0+IHtcbiAgY29uc3QgY29ubiA9IHBhcmFtcy5jb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCBtYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5tYXJrZXRQZGEpO1xuICBjb25zdCBjYWxsZXJQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5jYWxsZXJXYWxsZXQpO1xuXG4gIC8vIEluc3RydWN0aW9uIGRhdGE6IGRpc2NyaW1pbmF0b3IgKyBuZXdfY2xvc2luZ190aW1lIChpNjQpICsgT3B0aW9uPGk2ND4gbmV3X3Jlc29sdXRpb25fdGltZVxuICBjb25zdCBoYXNSZXNvbHV0aW9uVGltZSA9IHBhcmFtcy5uZXdSZXNvbHV0aW9uVGltZSAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBkYXRhU2l6ZSA9IDggKyA4ICsgMSArIChoYXNSZXNvbHV0aW9uVGltZSA/IDggOiAwKTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyhkYXRhU2l6ZSk7XG5cbiAgbGV0IG9mZnNldCA9IDA7XG4gIERJU0NSSU1JTkFUT1JTLmV4dGVuZF9tYXJrZXQuY29weShkYXRhLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gODtcblxuICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQocGFyYW1zLm5ld0Nsb3NpbmdUaW1lKSwgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDg7XG5cbiAgaWYgKGhhc1Jlc29sdXRpb25UaW1lKSB7XG4gICAgZGF0YS53cml0ZVVJbnQ4KDEsIG9mZnNldCk7IC8vIFNvbWVcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQocGFyYW1zLm5ld1Jlc29sdXRpb25UaW1lISksIG9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YS53cml0ZVVJbnQ4KDAsIG9mZnNldCk7IC8vIE5vbmVcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogbWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogY2FsbGVyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgXTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAga2V5cyxcbiAgICBkYXRhLFxuICB9KTtcblxuICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChpbnN0cnVjdGlvbik7XG4gIGNvbnN0IHsgYmxvY2toYXNoIH0gPSBhd2FpdCBjb25uLmdldExhdGVzdEJsb2NraGFzaCgnZmluYWxpemVkJyk7XG4gIHRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCA9IGJsb2NraGFzaDtcbiAgdHJhbnNhY3Rpb24uZmVlUGF5ZXIgPSBjYWxsZXJQdWJrZXk7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2FjdGlvbixcbiAgICBzZXJpYWxpemVkVHg6IHRyYW5zYWN0aW9uLnNlcmlhbGl6ZSh7IHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSwgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUkFDRSBNQVJLRVQgTUFOQUdFTUVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCdWlsZCBjbG9zZV9yYWNlX21hcmtldCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDbG9zZVJhY2VNYXJrZXRUcmFuc2FjdGlvbihwYXJhbXM6IHtcbiAgcmFjZU1hcmtldFBkYTogc3RyaW5nO1xuICBjYWxsZXJXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgc2VyaWFsaXplZFR4OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IHJhY2VNYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yYWNlTWFya2V0UGRhKTtcbiAgY29uc3QgY2FsbGVyUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuY2FsbGVyV2FsbGV0KTtcblxuICBjb25zdCBkYXRhID0gRElTQ1JJTUlOQVRPUlMuY2xvc2VfcmFjZV9tYXJrZXQ7XG5cbiAgY29uc3Qga2V5cyA9IFtcbiAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgIHsgcHVia2V5OiByYWNlTWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogY2FsbGVyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgXTtcblxuICBjb25zdCBpbnN0cnVjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAga2V5cyxcbiAgICBkYXRhLFxuICB9KTtcblxuICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZChpbnN0cnVjdGlvbik7XG4gIGNvbnN0IHsgYmxvY2toYXNoIH0gPSBhd2FpdCBjb25uLmdldExhdGVzdEJsb2NraGFzaCgnZmluYWxpemVkJyk7XG4gIHRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCA9IGJsb2NraGFzaDtcbiAgdHJhbnNhY3Rpb24uZmVlUGF5ZXIgPSBjYWxsZXJQdWJrZXk7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2FjdGlvbixcbiAgICBzZXJpYWxpemVkVHg6IHRyYW5zYWN0aW9uLnNlcmlhbGl6ZSh7IHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSwgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGV4dGVuZF9yYWNlX21hcmtldCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRFeHRlbmRSYWNlTWFya2V0VHJhbnNhY3Rpb24ocGFyYW1zOiB7XG4gIHJhY2VNYXJrZXRQZGE6IHN0cmluZztcbiAgbmV3Q2xvc2luZ1RpbWU6IG51bWJlcjsgLy8gVW5peCB0aW1lc3RhbXBcbiAgbmV3UmVzb2x1dGlvblRpbWU/OiBudW1iZXI7IC8vIFVuaXggdGltZXN0YW1wIChvcHRpb25hbClcbiAgY2FsbGVyV2FsbGV0OiBzdHJpbmc7XG4gIGNvbm5lY3Rpb24/OiBDb25uZWN0aW9uO1xufSk6IFByb21pc2U8eyB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247IHNlcmlhbGl6ZWRUeDogc3RyaW5nIH0+IHtcbiAgY29uc3QgY29ubiA9IHBhcmFtcy5jb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCByYWNlTWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMucmFjZU1hcmtldFBkYSk7XG4gIGNvbnN0IGNhbGxlclB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLmNhbGxlcldhbGxldCk7XG5cbiAgY29uc3QgaGFzUmVzb2x1dGlvblRpbWUgPSBwYXJhbXMubmV3UmVzb2x1dGlvblRpbWUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgZGF0YVNpemUgPSA4ICsgOCArIDEgKyAoaGFzUmVzb2x1dGlvblRpbWUgPyA4IDogMCk7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoZGF0YVNpemUpO1xuXG4gIGxldCBvZmZzZXQgPSAwO1xuICBESVNDUklNSU5BVE9SUy5leHRlbmRfcmFjZV9tYXJrZXQuY29weShkYXRhLCBvZmZzZXQpO1xuICBvZmZzZXQgKz0gODtcblxuICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQocGFyYW1zLm5ld0Nsb3NpbmdUaW1lKSwgb2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDg7XG5cbiAgaWYgKGhhc1Jlc29sdXRpb25UaW1lKSB7XG4gICAgZGF0YS53cml0ZVVJbnQ4KDEsIG9mZnNldCk7IC8vIFNvbWVcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQocGFyYW1zLm5ld1Jlc29sdXRpb25UaW1lISksIG9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YS53cml0ZVVJbnQ4KDAsIG9mZnNldCk7IC8vIE5vbmVcbiAgfVxuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogcmFjZU1hcmtldFB1YmtleSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IGNhbGxlclB1YmtleSwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gIF07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBQUk9HUkFNX0lELFxuICAgIGtleXMsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaW5zdHJ1Y3Rpb24pO1xuICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgY29ubi5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICB0cmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSBibG9ja2hhc2g7XG4gIHRyYW5zYWN0aW9uLmZlZVBheWVyID0gY2FsbGVyUHVia2V5O1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4OiB0cmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsIHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlIH0pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENBTkNFTCBNQVJLRVQgKEFETUlOL0NSRUFUT1IpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEJ1aWxkIGNhbmNlbF9tYXJrZXQgdHJhbnNhY3Rpb25cbiAqIENhbmNlbHMgYSBtYXJrZXQgYW5kIGFsbG93cyBhbGwgYmV0dG9ycyB0byBjbGFpbSByZWZ1bmRzLlxuICogT25seSBjYWxsYWJsZSBieSBhZG1pbiBvciBjcmVhdG9yIChkZXBlbmRpbmcgb24gbWFya2V0IHN0YXR1cykuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENhbmNlbE1hcmtldFRyYW5zYWN0aW9uKHBhcmFtczoge1xuICBtYXJrZXRQZGE6IHN0cmluZztcbiAgcmVhc29uOiBzdHJpbmc7XG4gIGF1dGhvcml0eVdhbGxldDogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHsgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uOyBzZXJpYWxpemVkVHg6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNvbm4gPSBwYXJhbXMuY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcbiAgY29uc3QgbWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMubWFya2V0UGRhKTtcbiAgY29uc3QgYXV0aG9yaXR5UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuYXV0aG9yaXR5V2FsbGV0KTtcblxuICAvLyBJbnN0cnVjdGlvbiBkYXRhOiBkaXNjcmltaW5hdG9yICsgcmVhc29uIChzdHJpbmcpXG4gIC8vIFN0cmluZyBlbmNvZGluZzogNC1ieXRlIGxlbmd0aCBwcmVmaXggKyBVVEYtOCBieXRlc1xuICBjb25zdCByZWFzb25CeXRlcyA9IEJ1ZmZlci5mcm9tKHBhcmFtcy5yZWFzb24sICd1dGY4Jyk7XG4gIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOCArIDQgKyByZWFzb25CeXRlcy5sZW5ndGgpO1xuICBESVNDUklNSU5BVE9SUy5jYW5jZWxfbWFya2V0LmNvcHkoZGF0YSwgMCk7XG4gIGRhdGEud3JpdGVVSW50MzJMRShyZWFzb25CeXRlcy5sZW5ndGgsIDgpO1xuICByZWFzb25CeXRlcy5jb3B5KGRhdGEsIDEyKTtcblxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBDT05GSUdfUERBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgeyBwdWJrZXk6IG1hcmtldFB1YmtleSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IGF1dGhvcml0eVB1YmtleSwgaXNTaWduZXI6IHRydWUsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gIF07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBQUk9HUkFNX0lELFxuICAgIGtleXMsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoaW5zdHJ1Y3Rpb24pO1xuICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgY29ubi5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICB0cmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSBibG9ja2hhc2g7XG4gIHRyYW5zYWN0aW9uLmZlZVBheWVyID0gYXV0aG9yaXR5UHVia2V5O1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4OiB0cmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsIHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlIH0pLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBjYW5jZWxfcmFjZSB0cmFuc2FjdGlvblxuICogQ2FuY2VscyBhIHJhY2UgbWFya2V0IGFuZCBhbGxvd3MgYWxsIGJldHRvcnMgdG8gY2xhaW0gcmVmdW5kcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2FuY2VsUmFjZVRyYW5zYWN0aW9uKHBhcmFtczoge1xuICByYWNlTWFya2V0UGRhOiBzdHJpbmc7XG4gIHJlYXNvbjogc3RyaW5nO1xuICBhdXRob3JpdHlXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjsgc2VyaWFsaXplZFR4OiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IHJhY2VNYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yYWNlTWFya2V0UGRhKTtcbiAgY29uc3QgYXV0aG9yaXR5UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuYXV0aG9yaXR5V2FsbGV0KTtcblxuICAvLyBJbnN0cnVjdGlvbiBkYXRhOiBkaXNjcmltaW5hdG9yICsgcmVhc29uIChzdHJpbmcpXG4gIGNvbnN0IHJlYXNvbkJ5dGVzID0gQnVmZmVyLmZyb20ocGFyYW1zLnJlYXNvbiwgJ3V0ZjgnKTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4ICsgNCArIHJlYXNvbkJ5dGVzLmxlbmd0aCk7XG4gIERJU0NSSU1JTkFUT1JTLmNhbmNlbF9yYWNlLmNvcHkoZGF0YSwgMCk7XG4gIGRhdGEud3JpdGVVSW50MzJMRShyZWFzb25CeXRlcy5sZW5ndGgsIDgpO1xuICByZWFzb25CeXRlcy5jb3B5KGRhdGEsIDEyKTtcblxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiBDT05GSUdfUERBLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgeyBwdWJrZXk6IHJhY2VNYXJrZXRQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBhdXRob3JpdHlQdWJrZXksIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRCxcbiAgICBrZXlzLFxuICAgIGRhdGEsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKGluc3RydWN0aW9uKTtcbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IGF1dGhvcml0eVB1YmtleTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeDogdHJhbnNhY3Rpb24uc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLCB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSB9KS50b1N0cmluZygnYmFzZTY0JyksXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Race Market Transaction Builders
3
+ *
4
+ * Builds unsigned transactions for:
5
+ * - Placing bets on race (multi-outcome) markets
6
+ * - Claiming race winnings
7
+ * - Claiming race refunds
8
+ */
9
+ import { Connection, Transaction } from '@solana/web3.js';
10
+ export interface RaceBetTransactionResult {
11
+ transaction: Transaction;
12
+ serializedTx: string;
13
+ positionPda: string;
14
+ marketId: bigint;
15
+ }
16
+ /**
17
+ * Build bet_on_race_outcome_sol transaction
18
+ */
19
+ export declare function buildRaceBetTransaction(params: {
20
+ raceMarketPda: string;
21
+ marketId: bigint;
22
+ outcomeIndex: number;
23
+ amountSol: number;
24
+ userWallet: string;
25
+ whitelistRequired?: boolean;
26
+ affiliatePda?: string;
27
+ connection?: Connection;
28
+ }): Promise<RaceBetTransactionResult>;
29
+ /**
30
+ * Fetch race market data and build bet transaction
31
+ */
32
+ export declare function fetchAndBuildRaceBetTransaction(params: {
33
+ raceMarketPda: string;
34
+ outcomeIndex: number;
35
+ amountSol: number;
36
+ userWallet: string;
37
+ affiliatePda?: string;
38
+ connection?: Connection;
39
+ }): Promise<{
40
+ transaction: RaceBetTransactionResult | null;
41
+ marketId: bigint;
42
+ error?: string;
43
+ }>;
44
+ /**
45
+ * Build claim_race_winnings_sol transaction
46
+ */
47
+ export declare function buildClaimRaceWinningsTransaction(params: {
48
+ raceMarketPda: string;
49
+ positionPda: string;
50
+ userWallet: string;
51
+ connection?: Connection;
52
+ }): Promise<{
53
+ transaction: Transaction;
54
+ serializedTx: string;
55
+ }>;
56
+ /**
57
+ * Build claim_race_refund transaction
58
+ */
59
+ export declare function buildClaimRaceRefundTransaction(params: {
60
+ raceMarketPda: string;
61
+ positionPda: string;
62
+ userWallet: string;
63
+ connection?: Connection;
64
+ }): Promise<{
65
+ transaction: Transaction;
66
+ serializedTx: string;
67
+ }>;
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Race Market Transaction Builders
3
+ *
4
+ * Builds unsigned transactions for:
5
+ * - Placing bets on race (multi-outcome) markets
6
+ * - Claiming race winnings
7
+ * - Claiming race refunds
8
+ */
9
+ import { Connection, PublicKey, Transaction, TransactionInstruction, SystemProgram, } from '@solana/web3.js';
10
+ import { PROGRAM_ID, CONFIG_PDA, SOL_TREASURY_PDA, SEEDS, RPC_ENDPOINT, solToLamports, } from '../config.js';
11
+ // =============================================================================
12
+ // INSTRUCTION DISCRIMINATORS
13
+ // =============================================================================
14
+ // Correct discriminators: sha256("global:<instruction_name>")[0..8]
15
+ const BET_ON_RACE_SOL_DISCRIMINATOR = Buffer.from([195, 181, 151, 159, 105, 100, 234, 244]);
16
+ const BET_ON_RACE_SOL_WITH_AFFILIATE_DISCRIMINATOR = Buffer.from([26, 224, 14, 181, 67, 52, 24, 0]);
17
+ const CLAIM_RACE_WINNINGS_SOL_DISCRIMINATOR = Buffer.from([46, 120, 202, 194, 126, 72, 22, 52]);
18
+ const CLAIM_RACE_REFUND_DISCRIMINATOR = Buffer.from([174, 101, 101, 227, 171, 69, 173, 243]);
19
+ // =============================================================================
20
+ // RACE POSITION PDA
21
+ // =============================================================================
22
+ function deriveRacePositionPda(marketId, user) {
23
+ const marketIdBuffer = Buffer.alloc(8);
24
+ marketIdBuffer.writeBigUInt64LE(marketId);
25
+ const [pda] = PublicKey.findProgramAddressSync([SEEDS.RACE_POSITION, marketIdBuffer, user.toBuffer()], PROGRAM_ID);
26
+ return pda;
27
+ }
28
+ function deriveRaceWhitelistPda(raceMarketPda) {
29
+ const [pda] = PublicKey.findProgramAddressSync([SEEDS.RACE_WHITELIST, raceMarketPda.toBuffer()], PROGRAM_ID);
30
+ return pda;
31
+ }
32
+ function deriveRaceReferralPda(user) {
33
+ const [pda] = PublicKey.findProgramAddressSync([Buffer.from('race_referral'), user.toBuffer()], PROGRAM_ID);
34
+ return pda;
35
+ }
36
+ // =============================================================================
37
+ // BET ON RACE OUTCOME
38
+ // =============================================================================
39
+ /**
40
+ * Build bet_on_race_outcome_sol transaction
41
+ */
42
+ export async function buildRaceBetTransaction(params) {
43
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
44
+ const raceMarketPubkey = new PublicKey(params.raceMarketPda);
45
+ const userPubkey = new PublicKey(params.userWallet);
46
+ // Derive position PDA
47
+ const positionPda = deriveRacePositionPda(params.marketId, userPubkey);
48
+ // Optional whitelist PDA
49
+ const whitelistPda = params.whitelistRequired
50
+ ? deriveRaceWhitelistPda(raceMarketPubkey)
51
+ : null;
52
+ // Amount in lamports
53
+ const amountLamports = solToLamports(params.amountSol);
54
+ let instruction;
55
+ if (params.affiliatePda) {
56
+ // With affiliate
57
+ const affiliatePubkey = new PublicKey(params.affiliatePda);
58
+ const raceReferralPda = deriveRaceReferralPda(userPubkey);
59
+ // Instruction data: discriminator + outcome_index (u8) + amount (u64)
60
+ const data = Buffer.alloc(17);
61
+ BET_ON_RACE_SOL_WITH_AFFILIATE_DISCRIMINATOR.copy(data, 0);
62
+ data.writeUInt8(params.outcomeIndex, 8);
63
+ data.writeBigUInt64LE(amountLamports, 9);
64
+ const keys = [
65
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
66
+ { pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
67
+ { pubkey: positionPda, isSigner: false, isWritable: true },
68
+ { pubkey: affiliatePubkey, isSigner: false, isWritable: true },
69
+ { pubkey: raceReferralPda, isSigner: false, isWritable: true },
70
+ ];
71
+ if (whitelistPda) {
72
+ keys.push({ pubkey: whitelistPda, isSigner: false, isWritable: false });
73
+ }
74
+ keys.push({ pubkey: userPubkey, isSigner: true, isWritable: true }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
75
+ instruction = new TransactionInstruction({
76
+ programId: PROGRAM_ID,
77
+ keys,
78
+ data,
79
+ });
80
+ }
81
+ else {
82
+ // Without affiliate
83
+ const data = Buffer.alloc(17);
84
+ BET_ON_RACE_SOL_DISCRIMINATOR.copy(data, 0);
85
+ data.writeUInt8(params.outcomeIndex, 8);
86
+ data.writeBigUInt64LE(amountLamports, 9);
87
+ const keys = [
88
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
89
+ { pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
90
+ { pubkey: positionPda, isSigner: false, isWritable: true },
91
+ ];
92
+ if (whitelistPda) {
93
+ keys.push({ pubkey: whitelistPda, isSigner: false, isWritable: false });
94
+ }
95
+ keys.push({ pubkey: userPubkey, isSigner: true, isWritable: true }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
96
+ instruction = new TransactionInstruction({
97
+ programId: PROGRAM_ID,
98
+ keys,
99
+ data,
100
+ });
101
+ }
102
+ const transaction = new Transaction();
103
+ transaction.add(instruction);
104
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
105
+ transaction.recentBlockhash = blockhash;
106
+ transaction.feePayer = userPubkey;
107
+ const serializedTx = transaction.serialize({
108
+ requireAllSignatures: false,
109
+ verifySignatures: false,
110
+ }).toString('base64');
111
+ return {
112
+ transaction,
113
+ serializedTx,
114
+ positionPda: positionPda.toBase58(),
115
+ marketId: params.marketId,
116
+ };
117
+ }
118
+ // =============================================================================
119
+ // FETCH AND BUILD RACE BET
120
+ // =============================================================================
121
+ /**
122
+ * Fetch race market data and build bet transaction
123
+ */
124
+ export async function fetchAndBuildRaceBetTransaction(params) {
125
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
126
+ try {
127
+ const raceMarketPubkey = new PublicKey(params.raceMarketPda);
128
+ const accountInfo = await conn.getAccountInfo(raceMarketPubkey);
129
+ if (!accountInfo) {
130
+ return {
131
+ transaction: null,
132
+ marketId: 0n,
133
+ error: 'Race market not found',
134
+ };
135
+ }
136
+ const data = accountInfo.data;
137
+ // Extract market_id (first field after discriminator)
138
+ const marketId = data.readBigUInt64LE(8);
139
+ // Check access_gate (need to navigate through struct)
140
+ // For now, assume public
141
+ const whitelistRequired = false;
142
+ const result = await buildRaceBetTransaction({
143
+ raceMarketPda: params.raceMarketPda,
144
+ marketId,
145
+ outcomeIndex: params.outcomeIndex,
146
+ amountSol: params.amountSol,
147
+ userWallet: params.userWallet,
148
+ whitelistRequired,
149
+ affiliatePda: params.affiliatePda,
150
+ connection: conn,
151
+ });
152
+ return {
153
+ transaction: result,
154
+ marketId,
155
+ };
156
+ }
157
+ catch (err) {
158
+ return {
159
+ transaction: null,
160
+ marketId: 0n,
161
+ error: err instanceof Error ? err.message : 'Unknown error',
162
+ };
163
+ }
164
+ }
165
+ // =============================================================================
166
+ // CLAIM RACE WINNINGS
167
+ // =============================================================================
168
+ /**
169
+ * Build claim_race_winnings_sol transaction
170
+ */
171
+ export async function buildClaimRaceWinningsTransaction(params) {
172
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
173
+ const raceMarketPubkey = new PublicKey(params.raceMarketPda);
174
+ const positionPubkey = new PublicKey(params.positionPda);
175
+ const userPubkey = new PublicKey(params.userWallet);
176
+ const data = CLAIM_RACE_WINNINGS_SOL_DISCRIMINATOR;
177
+ const keys = [
178
+ { pubkey: CONFIG_PDA, isSigner: false, isWritable: false },
179
+ { pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
180
+ { pubkey: positionPubkey, isSigner: false, isWritable: true },
181
+ { pubkey: SOL_TREASURY_PDA, isSigner: false, isWritable: true },
182
+ { pubkey: userPubkey, isSigner: true, isWritable: true },
183
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
184
+ ];
185
+ const instruction = new TransactionInstruction({
186
+ programId: PROGRAM_ID,
187
+ keys,
188
+ data,
189
+ });
190
+ const transaction = new Transaction();
191
+ transaction.add(instruction);
192
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
193
+ transaction.recentBlockhash = blockhash;
194
+ transaction.feePayer = userPubkey;
195
+ const serializedTx = transaction.serialize({
196
+ requireAllSignatures: false,
197
+ verifySignatures: false,
198
+ }).toString('base64');
199
+ return {
200
+ transaction,
201
+ serializedTx,
202
+ };
203
+ }
204
+ // =============================================================================
205
+ // CLAIM RACE REFUND
206
+ // =============================================================================
207
+ /**
208
+ * Build claim_race_refund transaction
209
+ */
210
+ export async function buildClaimRaceRefundTransaction(params) {
211
+ const conn = params.connection || new Connection(RPC_ENDPOINT, 'confirmed');
212
+ const raceMarketPubkey = new PublicKey(params.raceMarketPda);
213
+ const positionPubkey = new PublicKey(params.positionPda);
214
+ const userPubkey = new PublicKey(params.userWallet);
215
+ const data = CLAIM_RACE_REFUND_DISCRIMINATOR;
216
+ // IDL Accounts: race_market, position, user, system_program (NO config!)
217
+ const keys = [
218
+ { pubkey: raceMarketPubkey, isSigner: false, isWritable: true },
219
+ { pubkey: positionPubkey, isSigner: false, isWritable: true },
220
+ { pubkey: userPubkey, isSigner: true, isWritable: true },
221
+ { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
222
+ ];
223
+ const instruction = new TransactionInstruction({
224
+ programId: PROGRAM_ID,
225
+ keys,
226
+ data,
227
+ });
228
+ const transaction = new Transaction();
229
+ transaction.add(instruction);
230
+ const { blockhash } = await conn.getLatestBlockhash('finalized');
231
+ transaction.recentBlockhash = blockhash;
232
+ transaction.feePayer = userPubkey;
233
+ const serializedTx = transaction.serialize({
234
+ requireAllSignatures: false,
235
+ verifySignatures: false,
236
+ }).toString('base64');
237
+ return {
238
+ transaction,
239
+ serializedTx,
240
+ };
241
+ }
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFjZS10cmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9idWlsZGVycy9yYWNlLXRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxXQUFXLEVBQ1gsc0JBQXNCLEVBQ3RCLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixLQUFLLEVBQ0wsWUFBWSxFQUNaLGFBQWEsR0FDZCxNQUFNLGNBQWMsQ0FBQztBQUV0QixnRkFBZ0Y7QUFDaEYsNkJBQTZCO0FBQzdCLGdGQUFnRjtBQUVoRixvRUFBb0U7QUFDcEUsTUFBTSw2QkFBNkIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUYsTUFBTSw0Q0FBNEMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEcsTUFBTSxxQ0FBcUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEcsTUFBTSwrQkFBK0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVB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QUFJO0tBQ0wsQ0FBQyxDQUFDO0lBRUgsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUN0QyxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRSxXQUFXLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztJQUN4QyxXQUFXLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUVsQyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQ3pDLG9CQUFvQixFQUFFLEtBQUs7UUFDM0IsZ0JBQWdCLEVBQUUsS0FBSztLQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXRCLE9BQU87UUFDTCxXQUFXO1FBQ1gsWUFBWTtLQUNiLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSYWNlIE1hcmtldCBUcmFuc2FjdGlvbiBCdWlsZGVyc1xuICpcbiAqIEJ1aWxkcyB1bnNpZ25lZCB0cmFuc2FjdGlvbnMgZm9yOlxuICogLSBQbGFjaW5nIGJldHMgb24gcmFjZSAobXVsdGktb3V0Y29tZSkgbWFya2V0c1xuICogLSBDbGFpbWluZyByYWNlIHdpbm5pbmdzXG4gKiAtIENsYWltaW5nIHJhY2UgcmVmdW5kc1xuICovXG5pbXBvcnQge1xuICBDb25uZWN0aW9uLFxuICBQdWJsaWNLZXksXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBTeXN0ZW1Qcm9ncmFtLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgQ09ORklHX1BEQSxcbiAgU09MX1RSRUFTVVJZX1BEQSxcbiAgU0VFRFMsXG4gIFJQQ19FTkRQT0lOVCxcbiAgc29sVG9MYW1wb3J0cyxcbn0gZnJvbSAnLi4vY29uZmlnLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElOU1RSVUNUSU9OIERJU0NSSU1JTkFUT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBDb3JyZWN0IGRpc2NyaW1pbmF0b3JzOiBzaGEyNTYoXCJnbG9iYWw6PGluc3RydWN0aW9uX25hbWU+XCIpWzAuLjhdXG5jb25zdCBCRVRfT05fUkFDRV9TT0xfRElTQ1JJTUlOQVRPUiA9IEJ1ZmZlci5mcm9tKFsxOTUsIDE4MSwgMTUxLCAxNTksIDEwNSwgMTAwLCAyMzQsIDI0NF0pO1xuY29uc3QgQkVUX09OX1JBQ0VfU09MX1dJVEhfQUZGSUxJQVRFX0RJU0NSSU1JTkFUT1IgPSBCdWZmZXIuZnJvbShbMjYsIDIyNCwgMTQsIDE4MSwgNjcsIDUyLCAyNCwgMF0pO1xuY29uc3QgQ0xBSU1fUkFDRV9XSU5OSU5HU19TT0xfRElTQ1JJTUlOQVRPUiA9IEJ1ZmZlci5mcm9tKFs0NiwgMTIwLCAyMDIsIDE5NCwgMTI2LCA3MiwgMjIsIDUyXSk7XG5jb25zdCBDTEFJTV9SQUNFX1JFRlVORF9ESVNDUklNSU5BVE9SID0gQnVmZmVyLmZyb20oWzE3NCwgMTAxLCAxMDEsIDIyNywgMTcxLCA2OSwgMTczLCAyNDNdKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhY2VCZXRUcmFuc2FjdGlvblJlc3VsdCB7XG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjtcbiAgc2VyaWFsaXplZFR4OiBzdHJpbmc7XG4gIHBvc2l0aW9uUGRhOiBzdHJpbmc7XG4gIG1hcmtldElkOiBiaWdpbnQ7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSQUNFIFBPU0lUSU9OIFBEQVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gZGVyaXZlUmFjZVBvc2l0aW9uUGRhKG1hcmtldElkOiBiaWdpbnQsIHVzZXI6IFB1YmxpY0tleSk6IFB1YmxpY0tleSB7XG4gIGNvbnN0IG1hcmtldElkQnVmZmVyID0gQnVmZmVyLmFsbG9jKDgpO1xuICBtYXJrZXRJZEJ1ZmZlci53cml0ZUJpZ1VJbnQ2NExFKG1hcmtldElkKTtcbiAgY29uc3QgW3BkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuUkFDRV9QT1NJVElPTiwgbWFya2V0SWRCdWZmZXIsIHVzZXIudG9CdWZmZXIoKV0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xuICByZXR1cm4gcGRhO1xufVxuXG5mdW5jdGlvbiBkZXJpdmVSYWNlV2hpdGVsaXN0UGRhKHJhY2VNYXJrZXRQZGE6IFB1YmxpY0tleSk6IFB1YmxpY0tleSB7XG4gIGNvbnN0IFtwZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW1NFRURTLlJBQ0VfV0hJVEVMSVNULCByYWNlTWFya2V0UGRhLnRvQnVmZmVyKCldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcbiAgcmV0dXJuIHBkYTtcbn1cblxuZnVuY3Rpb24gZGVyaXZlUmFjZVJlZmVycmFsUGRhKHVzZXI6IFB1YmxpY0tleSk6IFB1YmxpY0tleSB7XG4gIGNvbnN0IFtwZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW0J1ZmZlci5mcm9tKCdyYWNlX3JlZmVycmFsJyksIHVzZXIudG9CdWZmZXIoKV0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xuICByZXR1cm4gcGRhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQkVUIE9OIFJBQ0UgT1VUQ09NRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCdWlsZCBiZXRfb25fcmFjZV9vdXRjb21lX3NvbCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRSYWNlQmV0VHJhbnNhY3Rpb24ocGFyYW1zOiB7XG4gIHJhY2VNYXJrZXRQZGE6IHN0cmluZztcbiAgbWFya2V0SWQ6IGJpZ2ludDtcbiAgb3V0Y29tZUluZGV4OiBudW1iZXI7XG4gIGFtb3VudFNvbDogbnVtYmVyO1xuICB1c2VyV2FsbGV0OiBzdHJpbmc7XG4gIHdoaXRlbGlzdFJlcXVpcmVkPzogYm9vbGVhbjtcbiAgYWZmaWxpYXRlUGRhPzogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPFJhY2VCZXRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG4gIGNvbnN0IHJhY2VNYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KHBhcmFtcy5yYWNlTWFya2V0UGRhKTtcbiAgY29uc3QgdXNlclB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLnVzZXJXYWxsZXQpO1xuXG4gIC8vIERlcml2ZSBwb3NpdGlvbiBQREFcbiAgY29uc3QgcG9zaXRpb25QZGEgPSBkZXJpdmVSYWNlUG9zaXRpb25QZGEocGFyYW1zLm1hcmtldElkLCB1c2VyUHVia2V5KTtcblxuICAvLyBPcHRpb25hbCB3aGl0ZWxpc3QgUERBXG4gIGNvbnN0IHdoaXRlbGlzdFBkYSA9IHBhcmFtcy53aGl0ZWxpc3RSZXF1aXJlZFxuICAgID8gZGVyaXZlUmFjZVdoaXRlbGlzdFBkYShyYWNlTWFya2V0UHVia2V5KVxuICAgIDogbnVsbDtcblxuICAvLyBBbW91bnQgaW4gbGFtcG9ydHNcbiAgY29uc3QgYW1vdW50TGFtcG9ydHMgPSBzb2xUb0xhbXBvcnRzKHBhcmFtcy5hbW91bnRTb2wpO1xuXG4gIGxldCBpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbjtcblxuICBpZiAocGFyYW1zLmFmZmlsaWF0ZVBkYSkge1xuICAgIC8vIFdpdGggYWZmaWxpYXRlXG4gICAgY29uc3QgYWZmaWxpYXRlUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMuYWZmaWxpYXRlUGRhKTtcbiAgICBjb25zdCByYWNlUmVmZXJyYWxQZGEgPSBkZXJpdmVSYWNlUmVmZXJyYWxQZGEodXNlclB1YmtleSk7XG5cbiAgICAvLyBJbnN0cnVjdGlvbiBkYXRhOiBkaXNjcmltaW5hdG9yICsgb3V0Y29tZV9pbmRleCAodTgpICsgYW1vdW50ICh1NjQpXG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxNyk7XG4gICAgQkVUX09OX1JBQ0VfU09MX1dJVEhfQUZGSUxJQVRFX0RJU0NSSU1JTkFUT1IuY29weShkYXRhLCAwKTtcbiAgICBkYXRhLndyaXRlVUludDgocGFyYW1zLm91dGNvbWVJbmRleCwgOCk7XG4gICAgZGF0YS53cml0ZUJpZ1VJbnQ2NExFKGFtb3VudExhbXBvcnRzLCA5KTtcblxuICAgIGNvbnN0IGtleXMgPSBbXG4gICAgICB7IHB1YmtleTogQ09ORklHX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgeyBwdWJrZXk6IHJhY2VNYXJrZXRQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IHBvc2l0aW9uUGRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBhZmZpbGlhdGVQdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IHJhY2VSZWZlcnJhbFBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgXTtcblxuICAgIGlmICh3aGl0ZWxpc3RQZGEpIHtcbiAgICAgIGtleXMucHVzaCh7IHB1YmtleTogd2hpdGVsaXN0UGRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGtleXMucHVzaChcbiAgICAgIHsgcHVia2V5OiB1c2VyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH1cbiAgICApO1xuXG4gICAgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAgICBrZXlzLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXaXRob3V0IGFmZmlsaWF0ZVxuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMTcpO1xuICAgIEJFVF9PTl9SQUNFX1NPTF9ESVNDUklNSU5BVE9SLmNvcHkoZGF0YSwgMCk7XG4gICAgZGF0YS53cml0ZVVJbnQ4KHBhcmFtcy5vdXRjb21lSW5kZXgsIDgpO1xuICAgIGRhdGEud3JpdGVCaWdVSW50NjRMRShhbW91bnRMYW1wb3J0cywgOSk7XG5cbiAgICBjb25zdCBrZXlzID0gW1xuICAgICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICAgIHsgcHVia2V5OiByYWNlTWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICAgIHsgcHVia2V5OiBwb3NpdGlvblBkYSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgXTtcblxuICAgIGlmICh3aGl0ZWxpc3RQZGEpIHtcbiAgICAgIGtleXMucHVzaCh7IHB1YmtleTogd2hpdGVsaXN0UGRhLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIGtleXMucHVzaChcbiAgICAgIHsgcHVia2V5OiB1c2VyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH1cbiAgICApO1xuXG4gICAgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICBwcm9ncmFtSWQ6IFBST0dSQU1fSUQsXG4gICAgICBrZXlzLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gIHRyYW5zYWN0aW9uLmFkZChpbnN0cnVjdGlvbik7XG5cbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IHVzZXJQdWJrZXk7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKHtcbiAgICByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsXG4gICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeCxcbiAgICBwb3NpdGlvblBkYTogcG9zaXRpb25QZGEudG9CYXNlNTgoKSxcbiAgICBtYXJrZXRJZDogcGFyYW1zLm1hcmtldElkLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRkVUQ0ggQU5EIEJVSUxEIFJBQ0UgQkVUXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZldGNoIHJhY2UgbWFya2V0IGRhdGEgYW5kIGJ1aWxkIGJldCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hBbmRCdWlsZFJhY2VCZXRUcmFuc2FjdGlvbihwYXJhbXM6IHtcbiAgcmFjZU1hcmtldFBkYTogc3RyaW5nO1xuICBvdXRjb21lSW5kZXg6IG51bWJlcjtcbiAgYW1vdW50U29sOiBudW1iZXI7XG4gIHVzZXJXYWxsZXQ6IHN0cmluZztcbiAgYWZmaWxpYXRlUGRhPzogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHtcbiAgdHJhbnNhY3Rpb246IFJhY2VCZXRUcmFuc2FjdGlvblJlc3VsdCB8IG51bGw7XG4gIG1hcmtldElkOiBiaWdpbnQ7XG4gIGVycm9yPzogc3RyaW5nO1xufT4ge1xuICBjb25zdCBjb25uID0gcGFyYW1zLmNvbm5lY3Rpb24gfHwgbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByYWNlTWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMucmFjZU1hcmtldFBkYSk7XG4gICAgY29uc3QgYWNjb3VudEluZm8gPSBhd2FpdCBjb25uLmdldEFjY291bnRJbmZvKHJhY2VNYXJrZXRQdWJrZXkpO1xuXG4gICAgaWYgKCFhY2NvdW50SW5mbykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNhY3Rpb246IG51bGwsXG4gICAgICAgIG1hcmtldElkOiAwbixcbiAgICAgICAgZXJyb3I6ICdSYWNlIG1hcmtldCBub3QgZm91bmQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYWNjb3VudEluZm8uZGF0YTtcblxuICAgIC8vIEV4dHJhY3QgbWFya2V0X2lkIChmaXJzdCBmaWVsZCBhZnRlciBkaXNjcmltaW5hdG9yKVxuICAgIGNvbnN0IG1hcmtldElkID0gZGF0YS5yZWFkQmlnVUludDY0TEUoOCk7XG5cbiAgICAvLyBDaGVjayBhY2Nlc3NfZ2F0ZSAobmVlZCB0byBuYXZpZ2F0ZSB0aHJvdWdoIHN0cnVjdClcbiAgICAvLyBGb3Igbm93LCBhc3N1bWUgcHVibGljXG4gICAgY29uc3Qgd2hpdGVsaXN0UmVxdWlyZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkUmFjZUJldFRyYW5zYWN0aW9uKHtcbiAgICAgIHJhY2VNYXJrZXRQZGE6IHBhcmFtcy5yYWNlTWFya2V0UGRhLFxuICAgICAgbWFya2V0SWQsXG4gICAgICBvdXRjb21lSW5kZXg6IHBhcmFtcy5vdXRjb21lSW5kZXgsXG4gICAgICBhbW91bnRTb2w6IHBhcmFtcy5hbW91bnRTb2wsXG4gICAgICB1c2VyV2FsbGV0OiBwYXJhbXMudXNlcldhbGxldCxcbiAgICAgIHdoaXRlbGlzdFJlcXVpcmVkLFxuICAgICAgYWZmaWxpYXRlUGRhOiBwYXJhbXMuYWZmaWxpYXRlUGRhLFxuICAgICAgY29ubmVjdGlvbjogY29ubixcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbjogcmVzdWx0LFxuICAgICAgbWFya2V0SWQsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zYWN0aW9uOiBudWxsLFxuICAgICAgbWFya2V0SWQ6IDBuLFxuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgfTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ0xBSU0gUkFDRSBXSU5OSU5HU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCdWlsZCBjbGFpbV9yYWNlX3dpbm5pbmdzX3NvbCB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDbGFpbVJhY2VXaW5uaW5nc1RyYW5zYWN0aW9uKHBhcmFtczoge1xuICByYWNlTWFya2V0UGRhOiBzdHJpbmc7XG4gIHBvc2l0aW9uUGRhOiBzdHJpbmc7XG4gIHVzZXJXYWxsZXQ6IHN0cmluZztcbiAgY29ubmVjdGlvbj86IENvbm5lY3Rpb247XG59KTogUHJvbWlzZTx7XG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjtcbiAgc2VyaWFsaXplZFR4OiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IGNvbm4gPSBwYXJhbXMuY29ubmVjdGlvbiB8fCBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcbiAgY29uc3QgcmFjZU1hcmtldFB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLnJhY2VNYXJrZXRQZGEpO1xuICBjb25zdCBwb3NpdGlvblB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLnBvc2l0aW9uUGRhKTtcbiAgY29uc3QgdXNlclB1YmtleSA9IG5ldyBQdWJsaWNLZXkocGFyYW1zLnVzZXJXYWxsZXQpO1xuXG4gIGNvbnN0IGRhdGEgPSBDTEFJTV9SQUNFX1dJTk5JTkdTX1NPTF9ESVNDUklNSU5BVE9SO1xuXG4gIGNvbnN0IGtleXMgPSBbXG4gICAgeyBwdWJrZXk6IENPTkZJR19QREEsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICB7IHB1YmtleTogcmFjZU1hcmtldFB1YmtleSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHBvc2l0aW9uUHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogU09MX1RSRUFTVVJZX1BEQSwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IHVzZXJQdWJrZXksIGlzU2lnbmVyOiB0cnVlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gIF07XG5cbiAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgcHJvZ3JhbUlkOiBQUk9HUkFNX0lELFxuICAgIGtleXMsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgdHJhbnNhY3Rpb24uYWRkKGluc3RydWN0aW9uKTtcblxuICBjb25zdCB7IGJsb2NraGFzaCB9ID0gYXdhaXQgY29ubi5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICB0cmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2ggPSBibG9ja2hhc2g7XG4gIHRyYW5zYWN0aW9uLmZlZVBheWVyID0gdXNlclB1YmtleTtcblxuICBjb25zdCBzZXJpYWxpemVkVHggPSB0cmFuc2FjdGlvbi5zZXJpYWxpemUoe1xuICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSxcbiAgICB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSxcbiAgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNhY3Rpb24sXG4gICAgc2VyaWFsaXplZFR4LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ0xBSU0gUkFDRSBSRUZVTkRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQnVpbGQgY2xhaW1fcmFjZV9yZWZ1bmQgdHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xhaW1SYWNlUmVmdW5kVHJhbnNhY3Rpb24ocGFyYW1zOiB7XG4gIHJhY2VNYXJrZXRQZGE6IHN0cmluZztcbiAgcG9zaXRpb25QZGE6IHN0cmluZztcbiAgdXNlcldhbGxldDogc3RyaW5nO1xuICBjb25uZWN0aW9uPzogQ29ubmVjdGlvbjtcbn0pOiBQcm9taXNlPHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBzZXJpYWxpemVkVHg6IHN0cmluZztcbn0+IHtcbiAgY29uc3QgY29ubiA9IHBhcmFtcy5jb25uZWN0aW9uIHx8IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuICBjb25zdCByYWNlTWFya2V0UHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMucmFjZU1hcmtldFBkYSk7XG4gIGNvbnN0IHBvc2l0aW9uUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMucG9zaXRpb25QZGEpO1xuICBjb25zdCB1c2VyUHVia2V5ID0gbmV3IFB1YmxpY0tleShwYXJhbXMudXNlcldhbGxldCk7XG5cbiAgY29uc3QgZGF0YSA9IENMQUlNX1JBQ0VfUkVGVU5EX0RJU0NSSU1JTkFUT1I7XG5cbiAgLy8gSURMIEFjY291bnRzOiByYWNlX21hcmtldCwgcG9zaXRpb24sIHVzZXIsIHN5c3RlbV9wcm9ncmFtIChOTyBjb25maWchKVxuICBjb25zdCBrZXlzID0gW1xuICAgIHsgcHVia2V5OiByYWNlTWFya2V0UHVia2V5LCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IHRydWUgfSxcbiAgICB7IHB1YmtleTogcG9zaXRpb25QdWJrZXksIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiB1c2VyUHVia2V5LCBpc1NpZ25lcjogdHJ1ZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgIHsgcHVia2V5OiBTeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCwgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICBdO1xuXG4gIGNvbnN0IGluc3RydWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIHByb2dyYW1JZDogUFJPR1JBTV9JRCxcbiAgICBrZXlzLFxuICAgIGRhdGEsXG4gIH0pO1xuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gIHRyYW5zYWN0aW9uLmFkZChpbnN0cnVjdGlvbik7XG5cbiAgY29uc3QgeyBibG9ja2hhc2ggfSA9IGF3YWl0IGNvbm4uZ2V0TGF0ZXN0QmxvY2toYXNoKCdmaW5hbGl6ZWQnKTtcbiAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IHVzZXJQdWJrZXk7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKHtcbiAgICByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UsXG4gICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIHNlcmlhbGl6ZWRUeCxcbiAgfTtcbn1cbiJdfQ==