@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.
- package/README.md +294 -0
- package/dist/__tests__/full-test.d.ts +1 -0
- package/dist/__tests__/full-test.js +291 -0
- package/dist/builders/affiliate-transaction.d.ts +41 -0
- package/dist/builders/affiliate-transaction.js +123 -0
- package/dist/builders/bet-transaction.d.ts +70 -0
- package/dist/builders/bet-transaction.js +323 -0
- package/dist/builders/claim-transaction.d.ts +57 -0
- package/dist/builders/claim-transaction.js +196 -0
- package/dist/builders/creator-transaction.d.ts +49 -0
- package/dist/builders/creator-transaction.js +177 -0
- package/dist/builders/dispute-transaction.d.ts +81 -0
- package/dist/builders/dispute-transaction.js +215 -0
- package/dist/builders/index.d.ts +14 -0
- package/dist/builders/index.js +15 -0
- package/dist/builders/market-creation-tx.d.ts +65 -0
- package/dist/builders/market-creation-tx.js +362 -0
- package/dist/builders/market-management-transaction.d.ts +85 -0
- package/dist/builders/market-management-transaction.js +239 -0
- package/dist/builders/race-transaction.d.ts +67 -0
- package/dist/builders/race-transaction.js +242 -0
- package/dist/builders/resolution-transaction.d.ts +108 -0
- package/dist/builders/resolution-transaction.js +250 -0
- package/dist/builders/whitelist-transaction.d.ts +72 -0
- package/dist/builders/whitelist-transaction.js +179 -0
- package/dist/config.d.ts +138 -0
- package/dist/config.js +307 -0
- package/dist/handlers/agent-network.d.ts +81 -0
- package/dist/handlers/agent-network.js +332 -0
- package/dist/handlers/claims.d.ts +47 -0
- package/dist/handlers/claims.js +218 -0
- package/dist/handlers/market-creation.d.ts +154 -0
- package/dist/handlers/market-creation.js +290 -0
- package/dist/handlers/markets.d.ts +41 -0
- package/dist/handlers/markets.js +319 -0
- package/dist/handlers/positions.d.ts +40 -0
- package/dist/handlers/positions.js +244 -0
- package/dist/handlers/quote.d.ts +33 -0
- package/dist/handlers/quote.js +144 -0
- package/dist/handlers/race-markets.d.ts +54 -0
- package/dist/handlers/race-markets.js +308 -0
- package/dist/handlers/resolution.d.ts +43 -0
- package/dist/handlers/resolution.js +194 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +109 -0
- package/dist/resources.d.ts +13 -0
- package/dist/resources.js +336 -0
- package/dist/tools.d.ts +3109 -0
- package/dist/tools.js +1956 -0
- package/dist/validation/bet-rules.d.ts +82 -0
- package/dist/validation/bet-rules.js +276 -0
- package/dist/validation/creation-rules.d.ts +69 -0
- package/dist/validation/creation-rules.js +302 -0
- package/dist/validation/index.d.ts +6 -0
- package/dist/validation/index.js +7 -0
- package/dist/validation/market-rules.d.ts +60 -0
- package/dist/validation/market-rules.js +237 -0
- package/dist/validation/parimutuel-rules.d.ts +117 -0
- package/dist/validation/parimutuel-rules.js +270 -0
- package/package.json +52 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Race Markets Handler - Multi-Outcome Prediction Markets
|
|
3
|
+
*/
|
|
4
|
+
import { Connection, PublicKey } from '@solana/web3.js';
|
|
5
|
+
import bs58 from 'bs58';
|
|
6
|
+
import { PROGRAM_ID, RPC_ENDPOINT, DISCRIMINATORS, MARKET_STATUS_NAMES, MARKET_LAYER_NAMES, lamportsToSol, } from '../config.js';
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// RACE MARKET DECODER
|
|
9
|
+
// =============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Decode RaceMarket account data
|
|
12
|
+
*
|
|
13
|
+
* RaceMarket struct layout (from IDL v4.7.6):
|
|
14
|
+
* - discriminator (8)
|
|
15
|
+
* - market_id (u64, 8)
|
|
16
|
+
* - question (String: 4 + len)
|
|
17
|
+
* - closing_time (i64, 8)
|
|
18
|
+
* - resolution_time (i64, 8)
|
|
19
|
+
* - auto_stop_buffer (i64, 8)
|
|
20
|
+
* - outcome_count (u8, 1)
|
|
21
|
+
* - outcome_labels ([[u8; 32]; 10], 320 bytes FIXED)
|
|
22
|
+
* - outcome_pools ([u64; 10], 80 bytes FIXED)
|
|
23
|
+
* - total_pool (u64, 8)
|
|
24
|
+
* - snapshot_pools ([u64; 10], 80 bytes)
|
|
25
|
+
* - snapshot_total (u64, 8)
|
|
26
|
+
* - status (enum, 1)
|
|
27
|
+
* - winning_outcome (Option<u8>: 1 + 0/1)
|
|
28
|
+
* - currency_type (enum, 1)
|
|
29
|
+
* - platform_fee_collected (u64, 8)
|
|
30
|
+
* - creator_fee_collected (u64, 8)
|
|
31
|
+
* - total_claimed (u64, 8)
|
|
32
|
+
* - last_bet_time (i64, 8)
|
|
33
|
+
* - bump (u8, 1)
|
|
34
|
+
* - layer (enum, 1)
|
|
35
|
+
* - resolution_mode (enum, 1)
|
|
36
|
+
* - access_gate (enum, 1)
|
|
37
|
+
* - creator (Pubkey, 32)
|
|
38
|
+
* - platform_fee_bps_at_creation (u16, 2)
|
|
39
|
+
* - affiliate_fee_bps_at_creation (u16, 2)
|
|
40
|
+
* - betting_freeze_seconds_at_creation (i64, 8)
|
|
41
|
+
* - dust_swept (bool, 1)
|
|
42
|
+
* - reserved ([u8; 19], 19)
|
|
43
|
+
*/
|
|
44
|
+
function decodeRaceMarket(data, pubkey) {
|
|
45
|
+
try {
|
|
46
|
+
// Minimum expected size for a RaceMarket account
|
|
47
|
+
// 8 (disc) + 8 (id) + 4 (qlen) + 8*3 (times) + 1 (count) + 320 (labels) + 80 (pools) + ...
|
|
48
|
+
if (data.length < 500) {
|
|
49
|
+
return null; // Account too small to be a RaceMarket
|
|
50
|
+
}
|
|
51
|
+
let offset = 8; // Skip discriminator
|
|
52
|
+
// market_id (u64)
|
|
53
|
+
const marketId = data.readBigUInt64LE(offset);
|
|
54
|
+
offset += 8;
|
|
55
|
+
// question (String: 4 bytes length + UTF-8 bytes)
|
|
56
|
+
const questionLen = data.readUInt32LE(offset);
|
|
57
|
+
offset += 4;
|
|
58
|
+
// Sanity check: question length should be reasonable (max 200 chars)
|
|
59
|
+
if (questionLen > 500 || questionLen + offset > data.length) {
|
|
60
|
+
return null; // Invalid question length - not a valid RaceMarket
|
|
61
|
+
}
|
|
62
|
+
const question = data.slice(offset, offset + questionLen).toString('utf8');
|
|
63
|
+
offset += questionLen;
|
|
64
|
+
// closing_time (i64)
|
|
65
|
+
const closingTime = data.readBigInt64LE(offset);
|
|
66
|
+
offset += 8;
|
|
67
|
+
// resolution_time (i64)
|
|
68
|
+
const resolutionTime = data.readBigInt64LE(offset);
|
|
69
|
+
offset += 8;
|
|
70
|
+
// auto_stop_buffer (i64)
|
|
71
|
+
offset += 8; // Skip for now
|
|
72
|
+
// outcome_count (u8)
|
|
73
|
+
const outcomeCount = data.readUInt8(offset);
|
|
74
|
+
offset += 1;
|
|
75
|
+
// outcome_labels: [[u8; 32]; 10] = 320 bytes FIXED
|
|
76
|
+
// Each label is 32 bytes, padded with zeros
|
|
77
|
+
const outcomeLabels = [];
|
|
78
|
+
for (let i = 0; i < 10; i++) {
|
|
79
|
+
const labelBytes = data.slice(offset, offset + 32);
|
|
80
|
+
// Find null terminator or end of string
|
|
81
|
+
let labelEnd = 32;
|
|
82
|
+
for (let j = 0; j < 32; j++) {
|
|
83
|
+
if (labelBytes[j] === 0) {
|
|
84
|
+
labelEnd = j;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (i < outcomeCount) {
|
|
89
|
+
outcomeLabels.push(labelBytes.slice(0, labelEnd).toString('utf8'));
|
|
90
|
+
}
|
|
91
|
+
offset += 32;
|
|
92
|
+
}
|
|
93
|
+
// outcome_pools: [u64; 10] = 80 bytes FIXED
|
|
94
|
+
const outcomePools = [];
|
|
95
|
+
for (let i = 0; i < 10; i++) {
|
|
96
|
+
const pool = data.readBigUInt64LE(offset);
|
|
97
|
+
if (i < outcomeCount) {
|
|
98
|
+
outcomePools.push(pool);
|
|
99
|
+
}
|
|
100
|
+
offset += 8;
|
|
101
|
+
}
|
|
102
|
+
// total_pool (u64)
|
|
103
|
+
const totalPoolLamports = data.readBigUInt64LE(offset);
|
|
104
|
+
offset += 8;
|
|
105
|
+
// snapshot_pools: [u64; 10] = 80 bytes - skip
|
|
106
|
+
offset += 80;
|
|
107
|
+
// snapshot_total (u64) - skip
|
|
108
|
+
offset += 8;
|
|
109
|
+
// status (enum, 1 byte)
|
|
110
|
+
const statusCode = data.readUInt8(offset);
|
|
111
|
+
offset += 1;
|
|
112
|
+
// winning_outcome (Option<u8>: 1 byte discriminant + optional 1 byte value)
|
|
113
|
+
const hasWinningOutcome = data.readUInt8(offset);
|
|
114
|
+
offset += 1;
|
|
115
|
+
let winningOutcomeIndex = null;
|
|
116
|
+
if (hasWinningOutcome === 1) {
|
|
117
|
+
winningOutcomeIndex = data.readUInt8(offset);
|
|
118
|
+
offset += 1;
|
|
119
|
+
}
|
|
120
|
+
// currency_type (enum, 1 byte)
|
|
121
|
+
offset += 1;
|
|
122
|
+
// platform_fee_collected (u64)
|
|
123
|
+
offset += 8;
|
|
124
|
+
// creator_fee_collected (u64)
|
|
125
|
+
offset += 8;
|
|
126
|
+
// total_claimed (u64)
|
|
127
|
+
offset += 8;
|
|
128
|
+
// last_bet_time (i64)
|
|
129
|
+
offset += 8;
|
|
130
|
+
// bump (u8)
|
|
131
|
+
offset += 1;
|
|
132
|
+
// layer (enum, 1 byte)
|
|
133
|
+
const layerCode = data.readUInt8(offset);
|
|
134
|
+
offset += 1;
|
|
135
|
+
// resolution_mode (enum, 1 byte)
|
|
136
|
+
offset += 1;
|
|
137
|
+
// access_gate (enum, 1 byte)
|
|
138
|
+
const accessGateCode = data.readUInt8(offset);
|
|
139
|
+
offset += 1;
|
|
140
|
+
// creator (Pubkey, 32 bytes)
|
|
141
|
+
const creator = new PublicKey(data.slice(offset, offset + 32));
|
|
142
|
+
offset += 32;
|
|
143
|
+
// oracle_host (Option<Pubkey>: 1 + 0/32)
|
|
144
|
+
const hasOracleHost = data.readUInt8(offset);
|
|
145
|
+
offset += 1;
|
|
146
|
+
if (hasOracleHost === 1) {
|
|
147
|
+
offset += 32;
|
|
148
|
+
}
|
|
149
|
+
// council: [Pubkey; 5] = 160 bytes - skip
|
|
150
|
+
offset += 160;
|
|
151
|
+
// council_size (u8)
|
|
152
|
+
offset += 1;
|
|
153
|
+
// council_votes: [u8; 10] = 10 bytes - skip
|
|
154
|
+
offset += 10;
|
|
155
|
+
// council_threshold (u8)
|
|
156
|
+
offset += 1;
|
|
157
|
+
// creator_fee_bps (u16)
|
|
158
|
+
offset += 2;
|
|
159
|
+
// creator_profile (Option<Pubkey>: 1 + 0/32)
|
|
160
|
+
const hasCreatorProfile = data.readUInt8(offset);
|
|
161
|
+
offset += 1;
|
|
162
|
+
if (hasCreatorProfile === 1) {
|
|
163
|
+
offset += 32;
|
|
164
|
+
}
|
|
165
|
+
// platform_fee_bps_at_creation (u16)
|
|
166
|
+
const platformFeeBps = data.readUInt16LE(offset);
|
|
167
|
+
offset += 2;
|
|
168
|
+
// Calculate derived fields
|
|
169
|
+
const totalPoolSol = lamportsToSol(totalPoolLamports);
|
|
170
|
+
const outcomes = outcomeLabels.map((label, i) => {
|
|
171
|
+
const poolSol = lamportsToSol(outcomePools[i] || 0n);
|
|
172
|
+
const percent = totalPoolSol > 0 ? (poolSol / totalPoolSol) * 100 : 100 / outcomeLabels.length;
|
|
173
|
+
return {
|
|
174
|
+
index: i,
|
|
175
|
+
label,
|
|
176
|
+
poolSol: round4(poolSol),
|
|
177
|
+
percent: round2(percent),
|
|
178
|
+
};
|
|
179
|
+
});
|
|
180
|
+
// Betting open check
|
|
181
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
182
|
+
const freezeTime = closingTime - 300n; // 5 min freeze
|
|
183
|
+
const isBettingOpen = statusCode === 0 && now < freezeTime;
|
|
184
|
+
return {
|
|
185
|
+
publicKey: pubkey.toBase58(),
|
|
186
|
+
marketId: marketId.toString(),
|
|
187
|
+
question,
|
|
188
|
+
outcomes,
|
|
189
|
+
closingTime: new Date(Number(closingTime) * 1000).toISOString(),
|
|
190
|
+
resolutionTime: new Date(Number(resolutionTime) * 1000).toISOString(),
|
|
191
|
+
status: MARKET_STATUS_NAMES[statusCode] || 'Unknown',
|
|
192
|
+
statusCode,
|
|
193
|
+
winningOutcomeIndex,
|
|
194
|
+
totalPoolSol: round4(totalPoolSol),
|
|
195
|
+
layer: MARKET_LAYER_NAMES[layerCode] || 'Unknown',
|
|
196
|
+
layerCode,
|
|
197
|
+
accessGate: accessGateCode === 0 ? 'Public' : 'Whitelist',
|
|
198
|
+
creator: creator.toBase58(),
|
|
199
|
+
platformFeeBps,
|
|
200
|
+
isBettingOpen,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
console.error('Error decoding race market:', err);
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// =============================================================================
|
|
209
|
+
// PUBLIC API
|
|
210
|
+
// =============================================================================
|
|
211
|
+
/**
|
|
212
|
+
* List all race markets
|
|
213
|
+
*/
|
|
214
|
+
export async function listRaceMarkets(status) {
|
|
215
|
+
const connection = new Connection(RPC_ENDPOINT, 'confirmed');
|
|
216
|
+
const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
|
|
217
|
+
filters: [
|
|
218
|
+
{
|
|
219
|
+
memcmp: {
|
|
220
|
+
offset: 0,
|
|
221
|
+
bytes: bs58.encode(DISCRIMINATORS.RACE_MARKET),
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
],
|
|
225
|
+
});
|
|
226
|
+
const markets = [];
|
|
227
|
+
for (const { account, pubkey } of accounts) {
|
|
228
|
+
const market = decodeRaceMarket(account.data, pubkey);
|
|
229
|
+
if (market) {
|
|
230
|
+
if (!status || market.status.toLowerCase() === status.toLowerCase()) {
|
|
231
|
+
markets.push(market);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Sort by closing time
|
|
236
|
+
markets.sort((a, b) => {
|
|
237
|
+
if (a.status === 'Active' && b.status !== 'Active')
|
|
238
|
+
return -1;
|
|
239
|
+
if (a.status !== 'Active' && b.status === 'Active')
|
|
240
|
+
return 1;
|
|
241
|
+
return new Date(a.closingTime).getTime() - new Date(b.closingTime).getTime();
|
|
242
|
+
});
|
|
243
|
+
return markets;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get a specific race market
|
|
247
|
+
*/
|
|
248
|
+
export async function getRaceMarket(publicKey) {
|
|
249
|
+
const connection = new Connection(RPC_ENDPOINT, 'confirmed');
|
|
250
|
+
try {
|
|
251
|
+
const pubkey = new PublicKey(publicKey);
|
|
252
|
+
const account = await connection.getAccountInfo(pubkey);
|
|
253
|
+
if (!account)
|
|
254
|
+
return null;
|
|
255
|
+
return decodeRaceMarket(account.data, pubkey);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get race quote for a potential bet
|
|
263
|
+
*/
|
|
264
|
+
export function getRaceQuote(market, outcomeIndex, betAmountSol) {
|
|
265
|
+
if (outcomeIndex < 0 || outcomeIndex >= market.outcomes.length) {
|
|
266
|
+
return {
|
|
267
|
+
valid: false,
|
|
268
|
+
error: `Invalid outcome index. Must be 0-${market.outcomes.length - 1}`,
|
|
269
|
+
outcomeLabel: '',
|
|
270
|
+
betAmountSol,
|
|
271
|
+
expectedPayoutSol: 0,
|
|
272
|
+
impliedOdds: 0,
|
|
273
|
+
newOutcomePercent: 0,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
const outcome = market.outcomes[outcomeIndex];
|
|
277
|
+
const currentPool = outcome.poolSol;
|
|
278
|
+
const totalPool = market.totalPoolSol;
|
|
279
|
+
// New pools after bet
|
|
280
|
+
const newOutcomePool = currentPool + betAmountSol;
|
|
281
|
+
const newTotalPool = totalPool + betAmountSol;
|
|
282
|
+
// Share of outcome pool
|
|
283
|
+
const share = betAmountSol / newOutcomePool;
|
|
284
|
+
const grossPayout = share * newTotalPool;
|
|
285
|
+
const profit = grossPayout - betAmountSol;
|
|
286
|
+
const fee = profit > 0 ? (profit * market.platformFeeBps) / 10000 : 0;
|
|
287
|
+
const expectedPayout = grossPayout - fee;
|
|
288
|
+
// Implied odds
|
|
289
|
+
const impliedOdds = newOutcomePool / newTotalPool * 100;
|
|
290
|
+
return {
|
|
291
|
+
valid: true,
|
|
292
|
+
outcomeLabel: outcome.label,
|
|
293
|
+
betAmountSol,
|
|
294
|
+
expectedPayoutSol: round4(expectedPayout),
|
|
295
|
+
impliedOdds: round2(impliedOdds),
|
|
296
|
+
newOutcomePercent: round2((newOutcomePool / newTotalPool) * 100),
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
// =============================================================================
|
|
300
|
+
// HELPERS
|
|
301
|
+
// =============================================================================
|
|
302
|
+
function round2(n) {
|
|
303
|
+
return Math.round(n * 100) / 100;
|
|
304
|
+
}
|
|
305
|
+
function round4(n) {
|
|
306
|
+
return Math.round(n * 10000) / 10000;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFjZS1tYXJrZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL3JhY2UtbWFya2V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGFBQWEsR0FDZCxNQUFNLGNBQWMsQ0FBQztBQTJDdEIsZ0ZBQWdGO0FBQ2hGLHNCQUFzQjtBQUN0QixnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLE1BQWlCO0lBQ3ZELElBQUksQ0FBQztRQUNILGlEQUFpRDtRQUNqRCwyRkFBMkY7UUFDM0YsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLENBQUMsdUNBQXVDO1FBQ3RELENBQUM7UUFFRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxxQkFBcUI7UUFFckMsa0JBQWtCO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVaLGtEQUFrRDtRQUNsRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFFWixxRUFBcUU7UUFDckUsSUFBSSxXQUFXLEdBQUcsR0FBRyxJQUFJLFdBQVcsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVELE9BQU8s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R0FBRyxHQUFHLENBQUM7S0FDakUsQ0FBQztBQUNKLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsVUFBVTtBQUNWLGdGQUFnRjtBQUVoRixTQUFTLE1BQU0sQ0FBQyxDQUFTO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25DLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxDQUFTO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJhY2UgTWFya2V0cyBIYW5kbGVyIC0gTXVsdGktT3V0Y29tZSBQcmVkaWN0aW9uIE1hcmtldHNcbiAqL1xuaW1wb3J0IHsgQ29ubmVjdGlvbiwgUHVibGljS2V5IH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgUlBDX0VORFBPSU5ULFxuICBESVNDUklNSU5BVE9SUyxcbiAgTUFSS0VUX1NUQVRVU19OQU1FUyxcbiAgTUFSS0VUX0xBWUVSX05BTUVTLFxuICBsYW1wb3J0c1RvU29sLFxufSBmcm9tICcuLi9jb25maWcuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFjZU91dGNvbWUge1xuICBpbmRleDogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xuICBwb29sU29sOiBudW1iZXI7XG4gIHBlcmNlbnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYWNlTWFya2V0IHtcbiAgcHVibGljS2V5OiBzdHJpbmc7XG4gIG1hcmtldElkOiBzdHJpbmc7XG4gIHF1ZXN0aW9uOiBzdHJpbmc7XG4gIG91dGNvbWVzOiBSYWNlT3V0Y29tZVtdO1xuICBjbG9zaW5nVGltZTogc3RyaW5nO1xuICByZXNvbHV0aW9uVGltZTogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICB3aW5uaW5nT3V0Y29tZUluZGV4OiBudW1iZXIgfCBudWxsO1xuICB0b3RhbFBvb2xTb2w6IG51bWJlcjtcbiAgbGF5ZXI6IHN0cmluZztcbiAgbGF5ZXJDb2RlOiBudW1iZXI7XG4gIGFjY2Vzc0dhdGU6IHN0cmluZztcbiAgY3JlYXRvcjogc3RyaW5nO1xuICBwbGF0Zm9ybUZlZUJwczogbnVtYmVyO1xuICBpc0JldHRpbmdPcGVuOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhY2VQb3NpdGlvbiB7XG4gIHB1YmxpY0tleTogc3RyaW5nO1xuICB1c2VyOiBzdHJpbmc7XG4gIHJhY2VNYXJrZXRQZGE6IHN0cmluZztcbiAgbWFya2V0SWQ6IHN0cmluZztcbiAgb3V0Y29tZUluZGV4OiBudW1iZXI7XG4gIGFtb3VudFNvbDogbnVtYmVyO1xuICBjbGFpbWVkOiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJBQ0UgTUFSS0VUIERFQ09ERVJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRGVjb2RlIFJhY2VNYXJrZXQgYWNjb3VudCBkYXRhXG4gKlxuICogUmFjZU1hcmtldCBzdHJ1Y3QgbGF5b3V0IChmcm9tIElETCB2NC43LjYpOlxuICogLSBkaXNjcmltaW5hdG9yICg4KVxuICogLSBtYXJrZXRfaWQgKHU2NCwgOClcbiAqIC0gcXVlc3Rpb24gKFN0cmluZzogNCArIGxlbilcbiAqIC0gY2xvc2luZ190aW1lIChpNjQsIDgpXG4gKiAtIHJlc29sdXRpb25fdGltZSAoaTY0LCA4KVxuICogLSBhdXRvX3N0b3BfYnVmZmVyIChpNjQsIDgpXG4gKiAtIG91dGNvbWVfY291bnQgKHU4LCAxKVxuICogLSBvdXRjb21lX2xhYmVscyAoW1t1ODsgMzJdOyAxMF0sIDMyMCBieXRlcyBGSVhFRClcbiAqIC0gb3V0Y29tZV9wb29scyAoW3U2NDsgMTBdLCA4MCBieXRlcyBGSVhFRClcbiAqIC0gdG90YWxfcG9vbCAodTY0LCA4KVxuICogLSBzbmFwc2hvdF9wb29scyAoW3U2NDsgMTBdLCA4MCBieXRlcylcbiAqIC0gc25hcHNob3RfdG90YWwgKHU2NCwgOClcbiAqIC0gc3RhdHVzIChlbnVtLCAxKVxuICogLSB3aW5uaW5nX291dGNvbWUgKE9wdGlvbjx1OD46IDEgKyAwLzEpXG4gKiAtIGN1cnJlbmN5X3R5cGUgKGVudW0sIDEpXG4gKiAtIHBsYXRmb3JtX2ZlZV9jb2xsZWN0ZWQgKHU2NCwgOClcbiAqIC0gY3JlYXRvcl9mZWVfY29sbGVjdGVkICh1NjQsIDgpXG4gKiAtIHRvdGFsX2NsYWltZWQgKHU2NCwgOClcbiAqIC0gbGFzdF9iZXRfdGltZSAoaTY0LCA4KVxuICogLSBidW1wICh1OCwgMSlcbiAqIC0gbGF5ZXIgKGVudW0sIDEpXG4gKiAtIHJlc29sdXRpb25fbW9kZSAoZW51bSwgMSlcbiAqIC0gYWNjZXNzX2dhdGUgKGVudW0sIDEpXG4gKiAtIGNyZWF0b3IgKFB1YmtleSwgMzIpXG4gKiAtIHBsYXRmb3JtX2ZlZV9icHNfYXRfY3JlYXRpb24gKHUxNiwgMilcbiAqIC0gYWZmaWxpYXRlX2ZlZV9icHNfYXRfY3JlYXRpb24gKHUxNiwgMilcbiAqIC0gYmV0dGluZ19mcmVlemVfc2Vjb25kc19hdF9jcmVhdGlvbiAoaTY0LCA4KVxuICogLSBkdXN0X3N3ZXB0IChib29sLCAxKVxuICogLSByZXNlcnZlZCAoW3U4OyAxOV0sIDE5KVxuICovXG5mdW5jdGlvbiBkZWNvZGVSYWNlTWFya2V0KGRhdGE6IEJ1ZmZlciwgcHVia2V5OiBQdWJsaWNLZXkpOiBSYWNlTWFya2V0IHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgLy8gTWluaW11bSBleHBlY3RlZCBzaXplIGZvciBhIFJhY2VNYXJrZXQgYWNjb3VudFxuICAgIC8vIDggKGRpc2MpICsgOCAoaWQpICsgNCAocWxlbikgKyA4KjMgKHRpbWVzKSArIDEgKGNvdW50KSArIDMyMCAobGFiZWxzKSArIDgwIChwb29scykgKyAuLi5cbiAgICBpZiAoZGF0YS5sZW5ndGggPCA1MDApIHtcbiAgICAgIHJldHVybiBudWxsOyAvLyBBY2NvdW50IHRvbyBzbWFsbCB0byBiZSBhIFJhY2VNYXJrZXRcbiAgICB9XG5cbiAgICBsZXQgb2Zmc2V0ID0gODsgLy8gU2tpcCBkaXNjcmltaW5hdG9yXG5cbiAgICAvLyBtYXJrZXRfaWQgKHU2NClcbiAgICBjb25zdCBtYXJrZXRJZCA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBxdWVzdGlvbiAoU3RyaW5nOiA0IGJ5dGVzIGxlbmd0aCArIFVURi04IGJ5dGVzKVxuICAgIGNvbnN0IHF1ZXN0aW9uTGVuID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gNDtcblxuICAgIC8vIFNhbml0eSBjaGVjazogcXVlc3Rpb24gbGVuZ3RoIHNob3VsZCBiZSByZWFzb25hYmxlIChtYXggMjAwIGNoYXJzKVxuICAgIGlmIChxdWVzdGlvbkxlbiA+IDUwMCB8fCBxdWVzdGlvbkxlbiArIG9mZnNldCA+IGRhdGEubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDsgLy8gSW52YWxpZCBxdWVzdGlvbiBsZW5ndGggLSBub3QgYSB2YWxpZCBSYWNlTWFya2V0XG4gICAgfVxuXG4gICAgY29uc3QgcXVlc3Rpb24gPSBkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgcXVlc3Rpb25MZW4pLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgb2Zmc2V0ICs9IHF1ZXN0aW9uTGVuO1xuXG4gICAgLy8gY2xvc2luZ190aW1lIChpNjQpXG4gICAgY29uc3QgY2xvc2luZ1RpbWUgPSBkYXRhLnJlYWRCaWdJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyByZXNvbHV0aW9uX3RpbWUgKGk2NClcbiAgICBjb25zdCByZXNvbHV0aW9uVGltZSA9IGRhdGEucmVhZEJpZ0ludDY0TEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIGF1dG9fc3RvcF9idWZmZXIgKGk2NClcbiAgICBvZmZzZXQgKz0gODsgLy8gU2tpcCBmb3Igbm93XG5cbiAgICAvLyBvdXRjb21lX2NvdW50ICh1OClcbiAgICBjb25zdCBvdXRjb21lQ291bnQgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpO1xuICAgIG9mZnNldCArPSAxO1xuXG4gICAgLy8gb3V0Y29tZV9sYWJlbHM6IFtbdTg7IDMyXTsgMTBdID0gMzIwIGJ5dGVzIEZJWEVEXG4gICAgLy8gRWFjaCBsYWJlbCBpcyAzMiBieXRlcywgcGFkZGVkIHdpdGggemVyb3NcbiAgICBjb25zdCBvdXRjb21lTGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgY29uc3QgbGFiZWxCeXRlcyA9IGRhdGEuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyAzMik7XG4gICAgICAvLyBGaW5kIG51bGwgdGVybWluYXRvciBvciBlbmQgb2Ygc3RyaW5nXG4gICAgICBsZXQgbGFiZWxFbmQgPSAzMjtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzI7IGorKykge1xuICAgICAgICBpZiAobGFiZWxCeXRlc1tqXSA9PT0gMCkge1xuICAgICAgICAgIGxhYmVsRW5kID0gajtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPCBvdXRjb21lQ291bnQpIHtcbiAgICAgICAgb3V0Y29tZUxhYmVscy5wdXNoKGxhYmVsQnl0ZXMuc2xpY2UoMCwgbGFiZWxFbmQpLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IDMyO1xuICAgIH1cblxuICAgIC8vIG91dGNvbWVfcG9vbHM6IFt1NjQ7IDEwXSA9IDgwIGJ5dGVzIEZJWEVEXG4gICAgY29uc3Qgb3V0Y29tZVBvb2xzOiBiaWdpbnRbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgY29uc3QgcG9vbCA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgICBpZiAoaSA8IG91dGNvbWVDb3VudCkge1xuICAgICAgICBvdXRjb21lUG9vbHMucHVzaChwb29sKTtcbiAgICAgIH1cbiAgICAgIG9mZnNldCArPSA4O1xuICAgIH1cblxuICAgIC8vIHRvdGFsX3Bvb2wgKHU2NClcbiAgICBjb25zdCB0b3RhbFBvb2xMYW1wb3J0cyA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBzbmFwc2hvdF9wb29sczogW3U2NDsgMTBdID0gODAgYnl0ZXMgLSBza2lwXG4gICAgb2Zmc2V0ICs9IDgwO1xuXG4gICAgLy8gc25hcHNob3RfdG90YWwgKHU2NCkgLSBza2lwXG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBzdGF0dXMgKGVudW0sIDEgYnl0ZSlcbiAgICBjb25zdCBzdGF0dXNDb2RlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcblxuICAgIC8vIHdpbm5pbmdfb3V0Y29tZSAoT3B0aW9uPHU4PjogMSBieXRlIGRpc2NyaW1pbmFudCArIG9wdGlvbmFsIDEgYnl0ZSB2YWx1ZSlcbiAgICBjb25zdCBoYXNXaW5uaW5nT3V0Y29tZSA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDE7XG4gICAgbGV0IHdpbm5pbmdPdXRjb21lSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGlmIChoYXNXaW5uaW5nT3V0Y29tZSA9PT0gMSkge1xuICAgICAgd2lubmluZ091dGNvbWVJbmRleCA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gMTtcbiAgICB9XG5cbiAgICAvLyBjdXJyZW5jeV90eXBlIChlbnVtLCAxIGJ5dGUpXG4gICAgb2Zmc2V0ICs9IDE7XG5cbiAgICAvLyBwbGF0Zm9ybV9mZWVfY29sbGVjdGVkICh1NjQpXG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAvLyBjcmVhdG9yX2ZlZV9jb2xsZWN0ZWQgKHU2NClcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIHRvdGFsX2NsYWltZWQgKHU2NClcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIGxhc3RfYmV0X3RpbWUgKGk2NClcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIC8vIGJ1bXAgKHU4KVxuICAgIG9mZnNldCArPSAxO1xuXG4gICAgLy8gbGF5ZXIgKGVudW0sIDEgYnl0ZSlcbiAgICBjb25zdCBsYXllckNvZGUgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpO1xuICAgIG9mZnNldCArPSAxO1xuXG4gICAgLy8gcmVzb2x1dGlvbl9tb2RlIChlbnVtLCAxIGJ5dGUpXG4gICAgb2Zmc2V0ICs9IDE7XG5cbiAgICAvLyBhY2Nlc3NfZ2F0ZSAoZW51bSwgMSBieXRlKVxuICAgIGNvbnN0IGFjY2Vzc0dhdGVDb2RlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcblxuICAgIC8vIGNyZWF0b3IgKFB1YmtleSwgMzIgYnl0ZXMpXG4gICAgY29uc3QgY3JlYXRvciA9IG5ldyBQdWJsaWNLZXkoZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIDMyKSk7XG4gICAgb2Zmc2V0ICs9IDMyO1xuXG4gICAgLy8gb3JhY2xlX2hvc3QgKE9wdGlvbjxQdWJrZXk+OiAxICsgMC8zMilcbiAgICBjb25zdCBoYXNPcmFjbGVIb3N0ID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBpZiAoaGFzT3JhY2xlSG9zdCA9PT0gMSkge1xuICAgICAgb2Zmc2V0ICs9IDMyO1xuICAgIH1cblxuICAgIC8vIGNvdW5jaWw6IFtQdWJrZXk7IDVdID0gMTYwIGJ5dGVzIC0gc2tpcFxuICAgIG9mZnNldCArPSAxNjA7XG5cbiAgICAvLyBjb3VuY2lsX3NpemUgKHU4KVxuICAgIG9mZnNldCArPSAxO1xuXG4gICAgLy8gY291bmNpbF92b3RlczogW3U4OyAxMF0gPSAxMCBieXRlcyAtIHNraXBcbiAgICBvZmZzZXQgKz0gMTA7XG5cbiAgICAvLyBjb3VuY2lsX3RocmVzaG9sZCAodTgpXG4gICAgb2Zmc2V0ICs9IDE7XG5cbiAgICAvLyBjcmVhdG9yX2ZlZV9icHMgKHUxNilcbiAgICBvZmZzZXQgKz0gMjtcblxuICAgIC8vIGNyZWF0b3JfcHJvZmlsZSAoT3B0aW9uPFB1YmtleT46IDEgKyAwLzMyKVxuICAgIGNvbnN0IGhhc0NyZWF0b3JQcm9maWxlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMTtcbiAgICBpZiAoaGFzQ3JlYXRvclByb2ZpbGUgPT09IDEpIHtcbiAgICAgIG9mZnNldCArPSAzMjtcbiAgICB9XG5cbiAgICAvLyBwbGF0Zm9ybV9mZWVfYnBzX2F0X2NyZWF0aW9uICh1MTYpXG4gICAgY29uc3QgcGxhdGZvcm1GZWVCcHMgPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSAyO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGRlcml2ZWQgZmllbGRzXG4gICAgY29uc3QgdG90YWxQb29sU29sID0gbGFtcG9ydHNUb1NvbCh0b3RhbFBvb2xMYW1wb3J0cyk7XG5cbiAgICBjb25zdCBvdXRjb21lczogUmFjZU91dGNvbWVbXSA9IG91dGNvbWVMYWJlbHMubWFwKChsYWJlbCwgaSkgPT4ge1xuICAgICAgY29uc3QgcG9vbFNvbCA9IGxhbXBvcnRzVG9Tb2wob3V0Y29tZVBvb2xzW2ldIHx8IDBuKTtcbiAgICAgIGNvbnN0IHBlcmNlbnQgPSB0b3RhbFBvb2xTb2wgPiAwID8gKHBvb2xTb2wgLyB0b3RhbFBvb2xTb2wpICogMTAwIDogMTAwIC8gb3V0Y29tZUxhYmVscy5sZW5ndGg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogaSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHBvb2xTb2w6IHJvdW5kNChwb29sU29sKSxcbiAgICAgICAgcGVyY2VudDogcm91bmQyKHBlcmNlbnQpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEJldHRpbmcgb3BlbiBjaGVja1xuICAgIGNvbnN0IG5vdyA9IEJpZ0ludChNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSk7XG4gICAgY29uc3QgZnJlZXplVGltZSA9IGNsb3NpbmdUaW1lIC0gMzAwbjsgLy8gNSBtaW4gZnJlZXplXG4gICAgY29uc3QgaXNCZXR0aW5nT3BlbiA9IHN0YXR1c0NvZGUgPT09IDAgJiYgbm93IDwgZnJlZXplVGltZTtcblxuICAgIHJldHVybiB7XG4gICAgICBwdWJsaWNLZXk6IHB1YmtleS50b0Jhc2U1OCgpLFxuICAgICAgbWFya2V0SWQ6IG1hcmtldElkLnRvU3RyaW5nKCksXG4gICAgICBxdWVzdGlvbixcbiAgICAgIG91dGNvbWVzLFxuICAgICAgY2xvc2luZ1RpbWU6IG5ldyBEYXRlKE51bWJlcihjbG9zaW5nVGltZSkgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgcmVzb2x1dGlvblRpbWU6IG5ldyBEYXRlKE51bWJlcihyZXNvbHV0aW9uVGltZSkgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgc3RhdHVzOiBNQVJLRVRfU1RBVFVTX05BTUVTW3N0YXR1c0NvZGVdIHx8ICdVbmtub3duJyxcbiAgICAgIHN0YXR1c0NvZGUsXG4gICAgICB3aW5uaW5nT3V0Y29tZUluZGV4LFxuICAgICAgdG90YWxQb29sU29sOiByb3VuZDQodG90YWxQb29sU29sKSxcbiAgICAgIGxheWVyOiBNQVJLRVRfTEFZRVJfTkFNRVNbbGF5ZXJDb2RlXSB8fCAnVW5rbm93bicsXG4gICAgICBsYXllckNvZGUsXG4gICAgICBhY2Nlc3NHYXRlOiBhY2Nlc3NHYXRlQ29kZSA9PT0gMCA/ICdQdWJsaWMnIDogJ1doaXRlbGlzdCcsXG4gICAgICBjcmVhdG9yOiBjcmVhdG9yLnRvQmFzZTU4KCksXG4gICAgICBwbGF0Zm9ybUZlZUJwcyxcbiAgICAgIGlzQmV0dGluZ09wZW4sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVjb2RpbmcgcmFjZSBtYXJrZXQ6JywgZXJyKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUFVCTElDIEFQSVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBMaXN0IGFsbCByYWNlIG1hcmtldHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RSYWNlTWFya2V0cyhzdGF0dXM/OiBzdHJpbmcpOiBQcm9taXNlPFJhY2VNYXJrZXRbXT4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBjb25uZWN0aW9uLmdldFByb2dyYW1BY2NvdW50cyhQUk9HUkFNX0lELCB7XG4gICAgZmlsdGVyczogW1xuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgYnl0ZXM6IGJzNTguZW5jb2RlKERJU0NSSU1JTkFUT1JTLlJBQ0VfTUFSS0VUKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSk7XG5cbiAgY29uc3QgbWFya2V0czogUmFjZU1hcmtldFtdID0gW107XG5cbiAgZm9yIChjb25zdCB7IGFjY291bnQsIHB1YmtleSB9IG9mIGFjY291bnRzKSB7XG4gICAgY29uc3QgbWFya2V0ID0gZGVjb2RlUmFjZU1hcmtldChhY2NvdW50LmRhdGEgYXMgQnVmZmVyLCBwdWJrZXkpO1xuICAgIGlmIChtYXJrZXQpIHtcbiAgICAgIGlmICghc3RhdHVzIHx8IG1hcmtldC5zdGF0dXMudG9Mb3dlckNhc2UoKSA9PT0gc3RhdHVzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgbWFya2V0cy5wdXNoKG1hcmtldCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU29ydCBieSBjbG9zaW5nIHRpbWVcbiAgbWFya2V0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGEuc3RhdHVzID09PSAnQWN0aXZlJyAmJiBiLnN0YXR1cyAhPT0gJ0FjdGl2ZScpIHJldHVybiAtMTtcbiAgICBpZiAoYS5zdGF0dXMgIT09ICdBY3RpdmUnICYmIGIuc3RhdHVzID09PSAnQWN0aXZlJykgcmV0dXJuIDE7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGEuY2xvc2luZ1RpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIuY2xvc2luZ1RpbWUpLmdldFRpbWUoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIG1hcmtldHM7XG59XG5cbi8qKlxuICogR2V0IGEgc3BlY2lmaWMgcmFjZSBtYXJrZXRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJhY2VNYXJrZXQocHVibGljS2V5OiBzdHJpbmcpOiBQcm9taXNlPFJhY2VNYXJrZXQgfCBudWxsPiB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihSUENfRU5EUE9JTlQsICdjb25maXJtZWQnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHB1YmtleSA9IG5ldyBQdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgY29ubmVjdGlvbi5nZXRBY2NvdW50SW5mbyhwdWJrZXkpO1xuICAgIGlmICghYWNjb3VudCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVJhY2VNYXJrZXQoYWNjb3VudC5kYXRhIGFzIEJ1ZmZlciwgcHVia2V5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgcmFjZSBxdW90ZSBmb3IgYSBwb3RlbnRpYWwgYmV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYWNlUXVvdGUoXG4gIG1hcmtldDogUmFjZU1hcmtldCxcbiAgb3V0Y29tZUluZGV4OiBudW1iZXIsXG4gIGJldEFtb3VudFNvbDogbnVtYmVyXG4pOiB7XG4gIHZhbGlkOiBib29sZWFuO1xuICBlcnJvcj86IHN0cmluZztcbiAgb3V0Y29tZUxhYmVsOiBzdHJpbmc7XG4gIGJldEFtb3VudFNvbDogbnVtYmVyO1xuICBleHBlY3RlZFBheW91dFNvbDogbnVtYmVyO1xuICBpbXBsaWVkT2RkczogbnVtYmVyO1xuICBuZXdPdXRjb21lUGVyY2VudDogbnVtYmVyO1xufSB7XG4gIGlmIChvdXRjb21lSW5kZXggPCAwIHx8IG91dGNvbWVJbmRleCA+PSBtYXJrZXQub3V0Y29tZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIGVycm9yOiBgSW52YWxpZCBvdXRjb21lIGluZGV4LiBNdXN0IGJlIDAtJHttYXJrZXQub3V0Y29tZXMubGVuZ3RoIC0gMX1gLFxuICAgICAgb3V0Y29tZUxhYmVsOiAnJyxcbiAgICAgIGJldEFtb3VudFNvbCxcbiAgICAgIGV4cGVjdGVkUGF5b3V0U29sOiAwLFxuICAgICAgaW1wbGllZE9kZHM6IDAsXG4gICAgICBuZXdPdXRjb21lUGVyY2VudDogMCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgb3V0Y29tZSA9IG1hcmtldC5vdXRjb21lc1tvdXRjb21lSW5kZXhdO1xuICBjb25zdCBjdXJyZW50UG9vbCA9IG91dGNvbWUucG9vbFNvbDtcbiAgY29uc3QgdG90YWxQb29sID0gbWFya2V0LnRvdGFsUG9vbFNvbDtcblxuICAvLyBOZXcgcG9vbHMgYWZ0ZXIgYmV0XG4gIGNvbnN0IG5ld091dGNvbWVQb29sID0gY3VycmVudFBvb2wgKyBiZXRBbW91bnRTb2w7XG4gIGNvbnN0IG5ld1RvdGFsUG9vbCA9IHRvdGFsUG9vbCArIGJldEFtb3VudFNvbDtcblxuICAvLyBTaGFyZSBvZiBvdXRjb21lIHBvb2xcbiAgY29uc3Qgc2hhcmUgPSBiZXRBbW91bnRTb2wgLyBuZXdPdXRjb21lUG9vbDtcbiAgY29uc3QgZ3Jvc3NQYXlvdXQgPSBzaGFyZSAqIG5ld1RvdGFsUG9vbDtcbiAgY29uc3QgcHJvZml0ID0gZ3Jvc3NQYXlvdXQgLSBiZXRBbW91bnRTb2w7XG4gIGNvbnN0IGZlZSA9IHByb2ZpdCA+IDAgPyAocHJvZml0ICogbWFya2V0LnBsYXRmb3JtRmVlQnBzKSAvIDEwMDAwIDogMDtcbiAgY29uc3QgZXhwZWN0ZWRQYXlvdXQgPSBncm9zc1BheW91dCAtIGZlZTtcblxuICAvLyBJbXBsaWVkIG9kZHNcbiAgY29uc3QgaW1wbGllZE9kZHMgPSBuZXdPdXRjb21lUG9vbCAvIG5ld1RvdGFsUG9vbCAqIDEwMDtcblxuICByZXR1cm4ge1xuICAgIHZhbGlkOiB0cnVlLFxuICAgIG91dGNvbWVMYWJlbDogb3V0Y29tZS5sYWJlbCxcbiAgICBiZXRBbW91bnRTb2wsXG4gICAgZXhwZWN0ZWRQYXlvdXRTb2w6IHJvdW5kNChleHBlY3RlZFBheW91dCksXG4gICAgaW1wbGllZE9kZHM6IHJvdW5kMihpbXBsaWVkT2RkcyksXG4gICAgbmV3T3V0Y29tZVBlcmNlbnQ6IHJvdW5kMigobmV3T3V0Y29tZVBvb2wgLyBuZXdUb3RhbFBvb2wpICogMTAwKSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhFTFBFUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIHJvdW5kMihuOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5yb3VuZChuICogMTAwKSAvIDEwMDtcbn1cblxuZnVuY3Rpb24gcm91bmQ0KG46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKG4gKiAxMDAwMCkgLyAxMDAwMDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Market } from './markets.js';
|
|
2
|
+
export interface ResolutionStatus {
|
|
3
|
+
marketPda: string;
|
|
4
|
+
marketQuestion: string;
|
|
5
|
+
status: string;
|
|
6
|
+
isResolved: boolean;
|
|
7
|
+
winningOutcome: string | null;
|
|
8
|
+
proposedOutcome: string | null;
|
|
9
|
+
closingTime: string;
|
|
10
|
+
resolutionTime: string;
|
|
11
|
+
canBeResolved: boolean;
|
|
12
|
+
resolutionWindowOpen: boolean;
|
|
13
|
+
isDisputed: boolean;
|
|
14
|
+
disputeDeadline: string | null;
|
|
15
|
+
disputeReason: string | null;
|
|
16
|
+
councilSize: number;
|
|
17
|
+
councilVotesYes: number;
|
|
18
|
+
councilVotesNo: number;
|
|
19
|
+
councilThreshold: number;
|
|
20
|
+
resolutionMode: 'Creator' | 'Oracle' | 'Council' | 'Admin';
|
|
21
|
+
}
|
|
22
|
+
export interface DisputeMeta {
|
|
23
|
+
publicKey: string;
|
|
24
|
+
marketPda: string;
|
|
25
|
+
disputer: string;
|
|
26
|
+
reason: string;
|
|
27
|
+
proposedOutcome: boolean | null;
|
|
28
|
+
createdAt: string;
|
|
29
|
+
deadline: string;
|
|
30
|
+
resolved: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get detailed resolution status for a market
|
|
34
|
+
*/
|
|
35
|
+
export declare function getResolutionStatus(marketPda: string): Promise<ResolutionStatus | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Get all disputed markets
|
|
38
|
+
*/
|
|
39
|
+
export declare function getDisputedMarkets(): Promise<DisputeMeta[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Get markets pending resolution (closed but not resolved)
|
|
42
|
+
*/
|
|
43
|
+
export declare function getMarketsAwaitingResolution(): Promise<Market[]>;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolution Handler - Market Resolution Status & Disputes
|
|
3
|
+
*/
|
|
4
|
+
import { Connection, PublicKey } from '@solana/web3.js';
|
|
5
|
+
import bs58 from 'bs58';
|
|
6
|
+
import { PROGRAM_ID, RPC_ENDPOINT, DISCRIMINATORS, SEEDS, } from '../config.js';
|
|
7
|
+
import { getMarket } from './markets.js';
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// RESOLUTION STATUS
|
|
10
|
+
// =============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Get detailed resolution status for a market
|
|
13
|
+
*/
|
|
14
|
+
export async function getResolutionStatus(marketPda) {
|
|
15
|
+
const market = await getMarket(marketPda);
|
|
16
|
+
if (!market)
|
|
17
|
+
return null;
|
|
18
|
+
const now = new Date();
|
|
19
|
+
const closingTime = new Date(market.closingTime);
|
|
20
|
+
const resolutionTime = new Date(market.resolutionTime);
|
|
21
|
+
// Check resolution window
|
|
22
|
+
const canBeResolved = now > closingTime && market.status === 'Closed';
|
|
23
|
+
const resolutionWindowOpen = now > closingTime && now < resolutionTime;
|
|
24
|
+
// Check dispute status
|
|
25
|
+
const disputeMeta = await getDisputeMeta(marketPda);
|
|
26
|
+
const isDisputed = disputeMeta !== null && !disputeMeta.resolved;
|
|
27
|
+
// Determine resolution mode from market data
|
|
28
|
+
let resolutionMode = 'Creator';
|
|
29
|
+
// This would need to be parsed from market data
|
|
30
|
+
return {
|
|
31
|
+
marketPda,
|
|
32
|
+
marketQuestion: market.question,
|
|
33
|
+
status: market.status,
|
|
34
|
+
isResolved: market.status === 'Resolved',
|
|
35
|
+
winningOutcome: market.winningOutcome,
|
|
36
|
+
proposedOutcome: null, // Would need to track proposed but not finalized
|
|
37
|
+
closingTime: market.closingTime,
|
|
38
|
+
resolutionTime: market.resolutionTime,
|
|
39
|
+
canBeResolved,
|
|
40
|
+
resolutionWindowOpen,
|
|
41
|
+
isDisputed,
|
|
42
|
+
disputeDeadline: disputeMeta?.deadline || null,
|
|
43
|
+
disputeReason: disputeMeta?.reason || null,
|
|
44
|
+
councilSize: 0, // Would parse from market
|
|
45
|
+
councilVotesYes: 0,
|
|
46
|
+
councilVotesNo: 0,
|
|
47
|
+
councilThreshold: 0,
|
|
48
|
+
resolutionMode,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get dispute meta for a market (if exists)
|
|
53
|
+
*/
|
|
54
|
+
async function getDisputeMeta(marketPda) {
|
|
55
|
+
const connection = new Connection(RPC_ENDPOINT, 'confirmed');
|
|
56
|
+
try {
|
|
57
|
+
const marketPubkey = new PublicKey(marketPda);
|
|
58
|
+
// Derive dispute_meta PDA
|
|
59
|
+
const [disputeMetaPda] = PublicKey.findProgramAddressSync([SEEDS.DISPUTE_META, marketPubkey.toBuffer()], PROGRAM_ID);
|
|
60
|
+
const account = await connection.getAccountInfo(disputeMetaPda);
|
|
61
|
+
if (!account)
|
|
62
|
+
return null;
|
|
63
|
+
// Decode DisputeMeta
|
|
64
|
+
// DisputeMeta struct:
|
|
65
|
+
// - discriminator (8)
|
|
66
|
+
// - market (Pubkey, 32)
|
|
67
|
+
// - disputer (Pubkey, 32)
|
|
68
|
+
// - reason (String: 4 + len)
|
|
69
|
+
// - proposed_outcome (Option<bool>: 1 + 0/1)
|
|
70
|
+
// - created_at (i64, 8)
|
|
71
|
+
// - deadline (i64, 8)
|
|
72
|
+
// - resolved (bool, 1)
|
|
73
|
+
const data = account.data;
|
|
74
|
+
let offset = 8;
|
|
75
|
+
const market = new PublicKey(data.slice(offset, offset + 32));
|
|
76
|
+
offset += 32;
|
|
77
|
+
const disputer = new PublicKey(data.slice(offset, offset + 32));
|
|
78
|
+
offset += 32;
|
|
79
|
+
const reasonLen = data.readUInt32LE(offset);
|
|
80
|
+
offset += 4;
|
|
81
|
+
const reason = data.slice(offset, offset + reasonLen).toString('utf8');
|
|
82
|
+
offset += reasonLen;
|
|
83
|
+
const hasProposedOutcome = data.readUInt8(offset);
|
|
84
|
+
offset += 1;
|
|
85
|
+
let proposedOutcome = null;
|
|
86
|
+
if (hasProposedOutcome === 1) {
|
|
87
|
+
proposedOutcome = data.readUInt8(offset) === 1;
|
|
88
|
+
offset += 1;
|
|
89
|
+
}
|
|
90
|
+
const createdAt = data.readBigInt64LE(offset);
|
|
91
|
+
offset += 8;
|
|
92
|
+
const deadline = data.readBigInt64LE(offset);
|
|
93
|
+
offset += 8;
|
|
94
|
+
const resolved = data.readUInt8(offset) === 1;
|
|
95
|
+
return {
|
|
96
|
+
publicKey: disputeMetaPda.toBase58(),
|
|
97
|
+
marketPda: market.toBase58(),
|
|
98
|
+
disputer: disputer.toBase58(),
|
|
99
|
+
reason,
|
|
100
|
+
proposedOutcome,
|
|
101
|
+
createdAt: new Date(Number(createdAt) * 1000).toISOString(),
|
|
102
|
+
deadline: new Date(Number(deadline) * 1000).toISOString(),
|
|
103
|
+
resolved,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get all disputed markets
|
|
112
|
+
*/
|
|
113
|
+
export async function getDisputedMarkets() {
|
|
114
|
+
const connection = new Connection(RPC_ENDPOINT, 'confirmed');
|
|
115
|
+
const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
|
|
116
|
+
filters: [
|
|
117
|
+
{
|
|
118
|
+
memcmp: {
|
|
119
|
+
offset: 0,
|
|
120
|
+
bytes: bs58.encode(DISCRIMINATORS.DISPUTE_META),
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
});
|
|
125
|
+
const disputes = [];
|
|
126
|
+
for (const { account, pubkey } of accounts) {
|
|
127
|
+
try {
|
|
128
|
+
const data = account.data;
|
|
129
|
+
let offset = 8;
|
|
130
|
+
const market = new PublicKey(data.slice(offset, offset + 32));
|
|
131
|
+
offset += 32;
|
|
132
|
+
const disputer = new PublicKey(data.slice(offset, offset + 32));
|
|
133
|
+
offset += 32;
|
|
134
|
+
const reasonLen = data.readUInt32LE(offset);
|
|
135
|
+
offset += 4;
|
|
136
|
+
const reason = data.slice(offset, offset + reasonLen).toString('utf8');
|
|
137
|
+
offset += reasonLen;
|
|
138
|
+
const hasProposedOutcome = data.readUInt8(offset);
|
|
139
|
+
offset += 1;
|
|
140
|
+
let proposedOutcome = null;
|
|
141
|
+
if (hasProposedOutcome === 1) {
|
|
142
|
+
proposedOutcome = data.readUInt8(offset) === 1;
|
|
143
|
+
offset += 1;
|
|
144
|
+
}
|
|
145
|
+
const createdAt = data.readBigInt64LE(offset);
|
|
146
|
+
offset += 8;
|
|
147
|
+
const deadline = data.readBigInt64LE(offset);
|
|
148
|
+
offset += 8;
|
|
149
|
+
const resolved = data.readUInt8(offset) === 1;
|
|
150
|
+
if (!resolved) {
|
|
151
|
+
disputes.push({
|
|
152
|
+
publicKey: pubkey.toBase58(),
|
|
153
|
+
marketPda: market.toBase58(),
|
|
154
|
+
disputer: disputer.toBase58(),
|
|
155
|
+
reason,
|
|
156
|
+
proposedOutcome,
|
|
157
|
+
createdAt: new Date(Number(createdAt) * 1000).toISOString(),
|
|
158
|
+
deadline: new Date(Number(deadline) * 1000).toISOString(),
|
|
159
|
+
resolved,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Skip malformed
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return disputes;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get markets pending resolution (closed but not resolved)
|
|
171
|
+
*/
|
|
172
|
+
export async function getMarketsAwaitingResolution() {
|
|
173
|
+
const connection = new Connection(RPC_ENDPOINT, 'confirmed');
|
|
174
|
+
// Get all markets with status = Closed (1)
|
|
175
|
+
const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
|
|
176
|
+
filters: [
|
|
177
|
+
{
|
|
178
|
+
memcmp: {
|
|
179
|
+
offset: 0,
|
|
180
|
+
bytes: bs58.encode(DISCRIMINATORS.MARKET),
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
});
|
|
185
|
+
const markets = [];
|
|
186
|
+
for (const { account, pubkey } of accounts) {
|
|
187
|
+
const market = await getMarket(pubkey.toBase58());
|
|
188
|
+
if (market && market.status === 'Closed') {
|
|
189
|
+
markets.push(market);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return markets;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYW5kbGVycy9yZXNvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUNMLFVBQVUsRUFDVixZQUFZLEVBQ1osY0FBYyxFQUNkLEtBQUssR0FDTixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sY0FBYyxDQUFDO0FBZ0RqRCxnRkFBZ0Y7QUFDaEYsb0JBQW9CO0FBQ3BCLGdGQUFnRjtBQUVoRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CLENBQUMsU0FBaUI7SUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUV6QixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRCxNQUFNLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFdkQsMEJBQTBCO0lBQzFCLE1BQU0sYUFBYSxHQUFHLEdBQUcsR0FBRyxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUM7SUFDdEUsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLEdBQUcsV0FBVyxJQUFJLEdBQUcsR0FBRyxjQUFjLENBQUM7SUFFdkUsdUJBQXVCO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLE1BQU0sY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sVUFBVSxHQUFHLFdBQVcsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO0lBRWpFLDZDQUE2QztJQUM3QyxJQUFJLGNBQWMsR0FBK0MsU0FBUyxDQUFDO0lBQzNFLGdEQUFnRDtJQUVoRCxPQUFPO1FBQ0wsU0FBUztRQUNULGNBQWMsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUMvQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFFckIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEtBQUssVUFBVTtRQUN4QyxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWM7UUFDckMsZUFBZSxFQUFFLElBQUksRUFBRSxpREFBaUQ7UUFFeEUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYztRQUNyQyxhQUFhO1FBQ2Isb0JBQW9CO1FBRXBCLFVBQVU7UUFDVixlQUFlLEVBQUUsV0FBVyxFQUFFLFFBQVEsSUFBSSxJQUFJO1FBQzlDLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxJQUFJLElBQUk7UUFFMUMsV0FBVyxFQUFFLENBQUMsRUFBRSwwQkFBMEI7UUFDMUMsZUFBZSxFQUFFLENBQUM7UUFDbEIsY0FBYyxFQUFFLENBQUM7UUFDakIsZ0JBQWdCLEVBQUUsQ0FBQztRQUVuQixjQUFjO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSxjQUFjLENBQUMsU0FBaUI7SUFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTdELElBQUksQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTlDLDBCQUEwQjtRQUMxQixNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUN2RCxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQzdDLFVBQVUsQ0FDWCxDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFMUIscUJBQXFCO1FBQ3JCLHNCQUFzQjtRQUN0QixzQkFBc0I7UUFDdEIsd0JBQXdCO1FBQ3hCLDBCQUEwQjtRQUMxQiw2QkFBNkI7UUFDN0IsNkNBQTZDO1FBQzdDLHdCQUF3QjtRQUN4QixzQkFBc0I7UUFDdEIsdUJBQXVCO1FBRXZCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFjLENBQUM7UUFDcEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRWYsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUViLE1BQU0sUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFYixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDWixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sSUFBSSxTQUFTLENBQUM7UUFFcEIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLGVBQWUsR0FBbUIsSUFBSSxDQUFDO1FBQzNDLElBQUksa0JBQWtCLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBRVosTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBRVosTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUMsT0FBTztZQUNMLFNBQVMsRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFO1lBQ3BDLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQzVCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQzdCLE1BQU07WUFDTixlQUFlO1lBQ2YsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDM0QsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDekQsUUFBUTtTQUNULENBQUM7SUFDSixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0I7SUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTdELE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRTtRQUMvRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxNQUFNLEVBQUU7b0JBQ04sTUFBTSxFQUFFLENBQUM7b0JBQ1QsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQztpQkFDaEQ7YUFDRjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxRQUFRLEdBQWtCLEVBQUUsQ0FBQztJQUVuQyxLQUFLLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksUUFBUSxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQWMsQ0FBQztZQUNwQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFFZixNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5RCxNQUFNLElBQUksRUFBRSxDQUFDO1lBRWIsTUFBTSxRQUFRLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEUsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUViLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUNaLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkUsTUFBTSxJQUFJLFNBQVMsQ0FBQztZQUVwQixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEQsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUNaLElBQUksZUFBZSxHQUFtQixJQUFJLENBQUM7WUFDM0MsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUVaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUVaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxRQUFRLENBQUMsSUFBSSxDQUFDO29CQUNaLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO29CQUM1QixTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtvQkFDNUIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUU7b0JBQzdCLE1BQU07b0JBQ04sZUFBZTtvQkFDZixTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRTtvQkFDM0QsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUU7b0JBQ3pELFFBQVE7aUJBQ1QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxpQkFBaUI7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDRCQUE0QjtJQUNoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFN0QsMkNBQTJDO0lBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRTtRQUMvRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxNQUFNLEVBQUU7b0JBQ04sTUFBTSxFQUFFLENBQUM7b0JBQ1QsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztpQkFDMUM7YUFDRjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBRTdCLEtBQUssTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNsRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvbHV0aW9uIEhhbmRsZXIgLSBNYXJrZXQgUmVzb2x1dGlvbiBTdGF0dXMgJiBEaXNwdXRlc1xuICovXG5pbXBvcnQgeyBDb25uZWN0aW9uLCBQdWJsaWNLZXkgfSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQge1xuICBQUk9HUkFNX0lELFxuICBSUENfRU5EUE9JTlQsXG4gIERJU0NSSU1JTkFUT1JTLFxuICBTRUVEUyxcbn0gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7IGdldE1hcmtldCwgTWFya2V0IH0gZnJvbSAnLi9tYXJrZXRzLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdXRpb25TdGF0dXMge1xuICBtYXJrZXRQZGE6IHN0cmluZztcbiAgbWFya2V0UXVlc3Rpb246IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG5cbiAgLy8gUmVzb2x1dGlvbiBzdGF0ZVxuICBpc1Jlc29sdmVkOiBib29sZWFuO1xuICB3aW5uaW5nT3V0Y29tZTogc3RyaW5nIHwgbnVsbDtcbiAgcHJvcG9zZWRPdXRjb21lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8vIFRpbWluZ1xuICBjbG9zaW5nVGltZTogc3RyaW5nO1xuICByZXNvbHV0aW9uVGltZTogc3RyaW5nO1xuICBjYW5CZVJlc29sdmVkOiBib29sZWFuO1xuICByZXNvbHV0aW9uV2luZG93T3BlbjogYm9vbGVhbjtcblxuICAvLyBEaXNwdXRlIHN0YXRlXG4gIGlzRGlzcHV0ZWQ6IGJvb2xlYW47XG4gIGRpc3B1dGVEZWFkbGluZTogc3RyaW5nIHwgbnVsbDtcbiAgZGlzcHV0ZVJlYXNvbjogc3RyaW5nIHwgbnVsbDtcblxuICAvLyBDb3VuY2lsIHZvdGluZyAoaWYgZGlzcHV0ZWQpXG4gIGNvdW5jaWxTaXplOiBudW1iZXI7XG4gIGNvdW5jaWxWb3Rlc1llczogbnVtYmVyO1xuICBjb3VuY2lsVm90ZXNObzogbnVtYmVyO1xuICBjb3VuY2lsVGhyZXNob2xkOiBudW1iZXI7XG5cbiAgLy8gUmVzb2x1dGlvbiBtb2RlXG4gIHJlc29sdXRpb25Nb2RlOiAnQ3JlYXRvcicgfCAnT3JhY2xlJyB8ICdDb3VuY2lsJyB8ICdBZG1pbic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcHV0ZU1ldGEge1xuICBwdWJsaWNLZXk6IHN0cmluZztcbiAgbWFya2V0UGRhOiBzdHJpbmc7XG4gIGRpc3B1dGVyOiBzdHJpbmc7XG4gIHJlYXNvbjogc3RyaW5nO1xuICBwcm9wb3NlZE91dGNvbWU6IGJvb2xlYW4gfCBudWxsO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgZGVhZGxpbmU6IHN0cmluZztcbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSRVNPTFVUSU9OIFNUQVRVU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgZGV0YWlsZWQgcmVzb2x1dGlvbiBzdGF0dXMgZm9yIGEgbWFya2V0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZXNvbHV0aW9uU3RhdHVzKG1hcmtldFBkYTogc3RyaW5nKTogUHJvbWlzZTxSZXNvbHV0aW9uU3RhdHVzIHwgbnVsbD4ge1xuICBjb25zdCBtYXJrZXQgPSBhd2FpdCBnZXRNYXJrZXQobWFya2V0UGRhKTtcbiAgaWYgKCFtYXJrZXQpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGNsb3NpbmdUaW1lID0gbmV3IERhdGUobWFya2V0LmNsb3NpbmdUaW1lKTtcbiAgY29uc3QgcmVzb2x1dGlvblRpbWUgPSBuZXcgRGF0ZShtYXJrZXQucmVzb2x1dGlvblRpbWUpO1xuXG4gIC8vIENoZWNrIHJlc29sdXRpb24gd2luZG93XG4gIGNvbnN0IGNhbkJlUmVzb2x2ZWQgPSBub3cgPiBjbG9zaW5nVGltZSAmJiBtYXJrZXQuc3RhdHVzID09PSAnQ2xvc2VkJztcbiAgY29uc3QgcmVzb2x1dGlvbldpbmRvd09wZW4gPSBub3cgPiBjbG9zaW5nVGltZSAmJiBub3cgPCByZXNvbHV0aW9uVGltZTtcblxuICAvLyBDaGVjayBkaXNwdXRlIHN0YXR1c1xuICBjb25zdCBkaXNwdXRlTWV0YSA9IGF3YWl0IGdldERpc3B1dGVNZXRhKG1hcmtldFBkYSk7XG4gIGNvbnN0IGlzRGlzcHV0ZWQgPSBkaXNwdXRlTWV0YSAhPT0gbnVsbCAmJiAhZGlzcHV0ZU1ldGEucmVzb2x2ZWQ7XG5cbiAgLy8gRGV0ZXJtaW5lIHJlc29sdXRpb24gbW9kZSBmcm9tIG1hcmtldCBkYXRhXG4gIGxldCByZXNvbHV0aW9uTW9kZTogJ0NyZWF0b3InIHwgJ09yYWNsZScgfCAnQ291bmNpbCcgfCAnQWRtaW4nID0gJ0NyZWF0b3InO1xuICAvLyBUaGlzIHdvdWxkIG5lZWQgdG8gYmUgcGFyc2VkIGZyb20gbWFya2V0IGRhdGFcblxuICByZXR1cm4ge1xuICAgIG1hcmtldFBkYSxcbiAgICBtYXJrZXRRdWVzdGlvbjogbWFya2V0LnF1ZXN0aW9uLFxuICAgIHN0YXR1czogbWFya2V0LnN0YXR1cyxcblxuICAgIGlzUmVzb2x2ZWQ6IG1hcmtldC5zdGF0dXMgPT09ICdSZXNvbHZlZCcsXG4gICAgd2lubmluZ091dGNvbWU6IG1hcmtldC53aW5uaW5nT3V0Y29tZSxcbiAgICBwcm9wb3NlZE91dGNvbWU6IG51bGwsIC8vIFdvdWxkIG5lZWQgdG8gdHJhY2sgcHJvcG9zZWQgYnV0IG5vdCBmaW5hbGl6ZWRcblxuICAgIGNsb3NpbmdUaW1lOiBtYXJrZXQuY2xvc2luZ1RpbWUsXG4gICAgcmVzb2x1dGlvblRpbWU6IG1hcmtldC5yZXNvbHV0aW9uVGltZSxcbiAgICBjYW5CZVJlc29sdmVkLFxuICAgIHJlc29sdXRpb25XaW5kb3dPcGVuLFxuXG4gICAgaXNEaXNwdXRlZCxcbiAgICBkaXNwdXRlRGVhZGxpbmU6IGRpc3B1dGVNZXRhPy5kZWFkbGluZSB8fCBudWxsLFxuICAgIGRpc3B1dGVSZWFzb246IGRpc3B1dGVNZXRhPy5yZWFzb24gfHwgbnVsbCxcblxuICAgIGNvdW5jaWxTaXplOiAwLCAvLyBXb3VsZCBwYXJzZSBmcm9tIG1hcmtldFxuICAgIGNvdW5jaWxWb3Rlc1llczogMCxcbiAgICBjb3VuY2lsVm90ZXNObzogMCxcbiAgICBjb3VuY2lsVGhyZXNob2xkOiAwLFxuXG4gICAgcmVzb2x1dGlvbk1vZGUsXG4gIH07XG59XG5cbi8qKlxuICogR2V0IGRpc3B1dGUgbWV0YSBmb3IgYSBtYXJrZXQgKGlmIGV4aXN0cylcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcHV0ZU1ldGEobWFya2V0UGRhOiBzdHJpbmcpOiBQcm9taXNlPERpc3B1dGVNZXRhIHwgbnVsbD4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtYXJrZXRQdWJrZXkgPSBuZXcgUHVibGljS2V5KG1hcmtldFBkYSk7XG5cbiAgICAvLyBEZXJpdmUgZGlzcHV0ZV9tZXRhIFBEQVxuICAgIGNvbnN0IFtkaXNwdXRlTWV0YVBkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtTRUVEUy5ESVNQVVRFX01FVEEsIG1hcmtldFB1YmtleS50b0J1ZmZlcigpXSxcbiAgICAgIFBST0dSQU1fSURcbiAgICApO1xuXG4gICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0QWNjb3VudEluZm8oZGlzcHV0ZU1ldGFQZGEpO1xuICAgIGlmICghYWNjb3VudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBEZWNvZGUgRGlzcHV0ZU1ldGFcbiAgICAvLyBEaXNwdXRlTWV0YSBzdHJ1Y3Q6XG4gICAgLy8gLSBkaXNjcmltaW5hdG9yICg4KVxuICAgIC8vIC0gbWFya2V0IChQdWJrZXksIDMyKVxuICAgIC8vIC0gZGlzcHV0ZXIgKFB1YmtleSwgMzIpXG4gICAgLy8gLSByZWFzb24gKFN0cmluZzogNCArIGxlbilcbiAgICAvLyAtIHByb3Bvc2VkX291dGNvbWUgKE9wdGlvbjxib29sPjogMSArIDAvMSlcbiAgICAvLyAtIGNyZWF0ZWRfYXQgKGk2NCwgOClcbiAgICAvLyAtIGRlYWRsaW5lIChpNjQsIDgpXG4gICAgLy8gLSByZXNvbHZlZCAoYm9vbCwgMSlcblxuICAgIGNvbnN0IGRhdGEgPSBhY2NvdW50LmRhdGEgYXMgQnVmZmVyO1xuICAgIGxldCBvZmZzZXQgPSA4O1xuXG4gICAgY29uc3QgbWFya2V0ID0gbmV3IFB1YmxpY0tleShkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgMzIpKTtcbiAgICBvZmZzZXQgKz0gMzI7XG5cbiAgICBjb25zdCBkaXNwdXRlciA9IG5ldyBQdWJsaWNLZXkoZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIDMyKSk7XG4gICAgb2Zmc2V0ICs9IDMyO1xuXG4gICAgY29uc3QgcmVhc29uTGVuID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gNDtcbiAgICBjb25zdCByZWFzb24gPSBkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgcmVhc29uTGVuKS50b1N0cmluZygndXRmOCcpO1xuICAgIG9mZnNldCArPSByZWFzb25MZW47XG5cbiAgICBjb25zdCBoYXNQcm9wb3NlZE91dGNvbWUgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpO1xuICAgIG9mZnNldCArPSAxO1xuICAgIGxldCBwcm9wb3NlZE91dGNvbWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgICBpZiAoaGFzUHJvcG9zZWRPdXRjb21lID09PSAxKSB7XG4gICAgICBwcm9wb3NlZE91dGNvbWUgPSBkYXRhLnJlYWRVSW50OChvZmZzZXQpID09PSAxO1xuICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gZGF0YS5yZWFkQmlnSW50NjRMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSA4O1xuXG4gICAgY29uc3QgZGVhZGxpbmUgPSBkYXRhLnJlYWRCaWdJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICBjb25zdCByZXNvbHZlZCA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCkgPT09IDE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHVibGljS2V5OiBkaXNwdXRlTWV0YVBkYS50b0Jhc2U1OCgpLFxuICAgICAgbWFya2V0UGRhOiBtYXJrZXQudG9CYXNlNTgoKSxcbiAgICAgIGRpc3B1dGVyOiBkaXNwdXRlci50b0Jhc2U1OCgpLFxuICAgICAgcmVhc29uLFxuICAgICAgcHJvcG9zZWRPdXRjb21lLFxuICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShOdW1iZXIoY3JlYXRlZEF0KSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICBkZWFkbGluZTogbmV3IERhdGUoTnVtYmVyKGRlYWRsaW5lKSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXNvbHZlZCxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBhbGwgZGlzcHV0ZWQgbWFya2V0c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGlzcHV0ZWRNYXJrZXRzKCk6IFByb21pc2U8RGlzcHV0ZU1ldGFbXT4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBjb25uZWN0aW9uLmdldFByb2dyYW1BY2NvdW50cyhQUk9HUkFNX0lELCB7XG4gICAgZmlsdGVyczogW1xuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgYnl0ZXM6IGJzNTguZW5jb2RlKERJU0NSSU1JTkFUT1JTLkRJU1BVVEVfTUVUQSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIGNvbnN0IGRpc3B1dGVzOiBEaXNwdXRlTWV0YVtdID0gW107XG5cbiAgZm9yIChjb25zdCB7IGFjY291bnQsIHB1YmtleSB9IG9mIGFjY291bnRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhY2NvdW50LmRhdGEgYXMgQnVmZmVyO1xuICAgICAgbGV0IG9mZnNldCA9IDg7XG5cbiAgICAgIGNvbnN0IG1hcmtldCA9IG5ldyBQdWJsaWNLZXkoZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIDMyKSk7XG4gICAgICBvZmZzZXQgKz0gMzI7XG5cbiAgICAgIGNvbnN0IGRpc3B1dGVyID0gbmV3IFB1YmxpY0tleShkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgMzIpKTtcbiAgICAgIG9mZnNldCArPSAzMjtcblxuICAgICAgY29uc3QgcmVhc29uTGVuID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA0O1xuICAgICAgY29uc3QgcmVhc29uID0gZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlYXNvbkxlbikudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgIG9mZnNldCArPSByZWFzb25MZW47XG5cbiAgICAgIGNvbnN0IGhhc1Byb3Bvc2VkT3V0Y29tZSA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gMTtcbiAgICAgIGxldCBwcm9wb3NlZE91dGNvbWU6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgICAgIGlmIChoYXNQcm9wb3NlZE91dGNvbWUgPT09IDEpIHtcbiAgICAgICAgcHJvcG9zZWRPdXRjb21lID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KSA9PT0gMTtcbiAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IGRhdGEucmVhZEJpZ0ludDY0TEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA4O1xuXG4gICAgICBjb25zdCBkZWFkbGluZSA9IGRhdGEucmVhZEJpZ0ludDY0TEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA4O1xuXG4gICAgICBjb25zdCByZXNvbHZlZCA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCkgPT09IDE7XG5cbiAgICAgIGlmICghcmVzb2x2ZWQpIHtcbiAgICAgICAgZGlzcHV0ZXMucHVzaCh7XG4gICAgICAgICAgcHVibGljS2V5OiBwdWJrZXkudG9CYXNlNTgoKSxcbiAgICAgICAgICBtYXJrZXRQZGE6IG1hcmtldC50b0Jhc2U1OCgpLFxuICAgICAgICAgIGRpc3B1dGVyOiBkaXNwdXRlci50b0Jhc2U1OCgpLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBwcm9wb3NlZE91dGNvbWUsXG4gICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZShOdW1iZXIoY3JlYXRlZEF0KSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgZGVhZGxpbmU6IG5ldyBEYXRlKE51bWJlcihkZWFkbGluZSkgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHJlc29sdmVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNraXAgbWFsZm9ybWVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3B1dGVzO1xufVxuXG4vKipcbiAqIEdldCBtYXJrZXRzIHBlbmRpbmcgcmVzb2x1dGlvbiAoY2xvc2VkIGJ1dCBub3QgcmVzb2x2ZWQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNYXJrZXRzQXdhaXRpbmdSZXNvbHV0aW9uKCk6IFByb21pc2U8TWFya2V0W10+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuXG4gIC8vIEdldCBhbGwgbWFya2V0cyB3aXRoIHN0YXR1cyA9IENsb3NlZCAoMSlcbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBjb25uZWN0aW9uLmdldFByb2dyYW1BY2NvdW50cyhQUk9HUkFNX0lELCB7XG4gICAgZmlsdGVyczogW1xuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgYnl0ZXM6IGJzNTguZW5jb2RlKERJU0NSSU1JTkFUT1JTLk1BUktFVCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIGNvbnN0IG1hcmtldHM6IE1hcmtldFtdID0gW107XG5cbiAgZm9yIChjb25zdCB7IGFjY291bnQsIHB1YmtleSB9IG9mIGFjY291bnRzKSB7XG4gICAgY29uc3QgbWFya2V0ID0gYXdhaXQgZ2V0TWFya2V0KHB1YmtleS50b0Jhc2U1OCgpKTtcbiAgICBpZiAobWFya2V0ICYmIG1hcmtldC5zdGF0dXMgPT09ICdDbG9zZWQnKSB7XG4gICAgICBtYXJrZXRzLnB1c2gobWFya2V0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWFya2V0cztcbn1cbiJdfQ==
|
package/dist/index.d.ts
ADDED