@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,332 @@
1
+ /**
2
+ * AI Agent Affiliate Network
3
+ *
4
+ * Enables AI agents to participate in Baozi's affiliate system:
5
+ * - Register as affiliates with unique codes
6
+ * - Share affiliate codes with other agents/users
7
+ * - Track referrals and earnings
8
+ * - Build networks of AI agents referring users
9
+ *
10
+ * Protocol: 1% affiliate commission on winning bet profits
11
+ */
12
+ import { Connection, PublicKey } from '@solana/web3.js';
13
+ import bs58 from 'bs58';
14
+ import { PROGRAM_ID, RPC_ENDPOINT, DISCRIMINATORS, SEEDS, lamportsToSol, FEES, } from '../config.js';
15
+ // =============================================================================
16
+ // AFFILIATE REGISTRATION
17
+ // =============================================================================
18
+ /**
19
+ * Check if an affiliate code is available
20
+ */
21
+ export async function isAffiliateCodeAvailable(code) {
22
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
23
+ // Validate code format
24
+ if (!isValidAffiliateCode(code)) {
25
+ return false;
26
+ }
27
+ // Derive affiliate PDA
28
+ const [affiliatePda] = PublicKey.findProgramAddressSync([SEEDS.AFFILIATE, Buffer.from(code)], PROGRAM_ID);
29
+ try {
30
+ const account = await connection.getAccountInfo(affiliatePda);
31
+ return account === null; // Available if doesn't exist
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ /**
38
+ * Validate affiliate code format
39
+ * - 3-16 characters
40
+ * - Alphanumeric + underscore
41
+ * - No spaces or special chars
42
+ */
43
+ function isValidAffiliateCode(code) {
44
+ if (code.length < 3 || code.length > 16)
45
+ return false;
46
+ return /^[a-zA-Z0-9_]+$/.test(code);
47
+ }
48
+ /**
49
+ * Generate suggested affiliate codes for an agent
50
+ */
51
+ export async function suggestAffiliateCodes(agentName, count = 5) {
52
+ const suggestions = [];
53
+ // Clean agent name for code generation
54
+ const base = agentName
55
+ .toLowerCase()
56
+ .replace(/[^a-z0-9]/g, '')
57
+ .slice(0, 10);
58
+ const candidates = [
59
+ base,
60
+ `${base}_ai`,
61
+ `${base}_bot`,
62
+ `ai_${base}`,
63
+ `${base}${Math.floor(Math.random() * 1000)}`,
64
+ `${base}_agent`,
65
+ `${base.slice(0, 6)}${Date.now().toString(36).slice(-4)}`,
66
+ ];
67
+ for (const candidate of candidates) {
68
+ if (suggestions.length >= count)
69
+ break;
70
+ if (isValidAffiliateCode(candidate)) {
71
+ const available = await isAffiliateCodeAvailable(candidate);
72
+ suggestions.push({
73
+ code: candidate,
74
+ available,
75
+ reason: available ? undefined : 'Already taken',
76
+ });
77
+ }
78
+ }
79
+ return suggestions;
80
+ }
81
+ // =============================================================================
82
+ // AFFILIATE LOOKUP
83
+ // =============================================================================
84
+ /**
85
+ * Get affiliate profile by code
86
+ */
87
+ export async function getAffiliateByCode(code) {
88
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
89
+ const [affiliatePda] = PublicKey.findProgramAddressSync([SEEDS.AFFILIATE, Buffer.from(code)], PROGRAM_ID);
90
+ try {
91
+ const account = await connection.getAccountInfo(affiliatePda);
92
+ if (!account)
93
+ return null;
94
+ return decodeAffiliateAccount(account.data, affiliatePda, code);
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ /**
101
+ * Get affiliate profile(s) by owner wallet
102
+ */
103
+ export async function getAffiliatesByOwner(walletAddress) {
104
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
105
+ const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
106
+ filters: [
107
+ {
108
+ memcmp: {
109
+ offset: 0,
110
+ bytes: bs58.encode(DISCRIMINATORS.AFFILIATE),
111
+ },
112
+ },
113
+ {
114
+ memcmp: {
115
+ offset: 8, // After discriminator, owner pubkey
116
+ bytes: walletAddress,
117
+ },
118
+ },
119
+ ],
120
+ });
121
+ const affiliates = [];
122
+ for (const { account, pubkey } of accounts) {
123
+ const affiliate = decodeAffiliateAccount(account.data, pubkey);
124
+ if (affiliate) {
125
+ affiliates.push(affiliate);
126
+ }
127
+ }
128
+ return affiliates;
129
+ }
130
+ /**
131
+ * Decode Affiliate account data
132
+ *
133
+ * Affiliate struct:
134
+ * - discriminator (8)
135
+ * - owner (Pubkey, 32)
136
+ * - code (String: 4 + len)
137
+ * - total_earned (u64, 8)
138
+ * - total_claimed (u64, 8)
139
+ * - referral_count (u64, 8)
140
+ * - is_active (bool, 1)
141
+ * - bump (u8, 1)
142
+ */
143
+ function decodeAffiliateAccount(data, pubkey, knownCode) {
144
+ try {
145
+ let offset = 8; // Skip discriminator
146
+ const owner = new PublicKey(data.slice(offset, offset + 32));
147
+ offset += 32;
148
+ const codeLen = data.readUInt32LE(offset);
149
+ offset += 4;
150
+ const code = data.slice(offset, offset + codeLen).toString('utf8');
151
+ offset += codeLen;
152
+ const totalEarned = data.readBigUInt64LE(offset);
153
+ offset += 8;
154
+ const totalClaimed = data.readBigUInt64LE(offset);
155
+ offset += 8;
156
+ const referralCount = data.readBigUInt64LE(offset);
157
+ offset += 8;
158
+ const isActive = data.readUInt8(offset) === 1;
159
+ return {
160
+ affiliatePda: pubkey.toBase58(),
161
+ ownerWallet: owner.toBase58(),
162
+ affiliateCode: knownCode || code,
163
+ isActive,
164
+ isVerified: false, // Would need additional check
165
+ totalEarnedSol: round4(lamportsToSol(totalEarned)),
166
+ unclaimedSol: round4(lamportsToSol(totalEarned - totalClaimed)),
167
+ totalClaimedSol: round4(lamportsToSol(totalClaimed)),
168
+ totalReferrals: Number(referralCount),
169
+ activeReferrals: 0, // Would need to count
170
+ };
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ }
176
+ // =============================================================================
177
+ // REFERRAL TRACKING
178
+ // =============================================================================
179
+ /**
180
+ * Get all users referred by an affiliate
181
+ */
182
+ export async function getReferralsByAffiliate(affiliateCode) {
183
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
184
+ // Get affiliate PDA first
185
+ const [affiliatePda] = PublicKey.findProgramAddressSync([SEEDS.AFFILIATE, Buffer.from(affiliateCode)], PROGRAM_ID);
186
+ // Get all ReferredUser accounts linked to this affiliate
187
+ const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
188
+ filters: [
189
+ {
190
+ memcmp: {
191
+ offset: 0,
192
+ bytes: bs58.encode(DISCRIMINATORS.REFERRED_USER),
193
+ },
194
+ },
195
+ {
196
+ memcmp: {
197
+ offset: 40, // After discriminator + user pubkey
198
+ bytes: affiliatePda.toBase58(),
199
+ },
200
+ },
201
+ ],
202
+ });
203
+ const referrals = [];
204
+ for (const { account, pubkey } of accounts) {
205
+ try {
206
+ const data = account.data;
207
+ let offset = 8;
208
+ const user = new PublicKey(data.slice(offset, offset + 32));
209
+ offset += 32;
210
+ // affiliate PDA at offset 40
211
+ offset += 32;
212
+ const totalBets = data.readBigUInt64LE(offset);
213
+ offset += 8;
214
+ const totalCommission = data.readBigUInt64LE(offset);
215
+ offset += 8;
216
+ const firstBetAt = data.readBigInt64LE(offset);
217
+ offset += 8;
218
+ const lastBetAt = data.readBigInt64LE(offset);
219
+ referrals.push({
220
+ referredUserPda: pubkey.toBase58(),
221
+ userWallet: user.toBase58(),
222
+ affiliateCode,
223
+ totalBetsSol: round4(lamportsToSol(totalBets)),
224
+ totalCommissionSol: round4(lamportsToSol(totalCommission)),
225
+ firstBetAt: new Date(Number(firstBetAt) * 1000).toISOString(),
226
+ lastBetAt: new Date(Number(lastBetAt) * 1000).toISOString(),
227
+ });
228
+ }
229
+ catch {
230
+ // Skip malformed
231
+ }
232
+ }
233
+ return referrals;
234
+ }
235
+ // =============================================================================
236
+ // NETWORK STATS
237
+ // =============================================================================
238
+ /**
239
+ * Get overall agent affiliate network statistics
240
+ */
241
+ export async function getAgentNetworkStats() {
242
+ const connection = new Connection(RPC_ENDPOINT, 'confirmed');
243
+ // Get all affiliate accounts
244
+ const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
245
+ filters: [
246
+ {
247
+ memcmp: {
248
+ offset: 0,
249
+ bytes: bs58.encode(DISCRIMINATORS.AFFILIATE),
250
+ },
251
+ },
252
+ ],
253
+ });
254
+ const affiliates = [];
255
+ let totalNetworkEarnings = 0n;
256
+ let totalReferrals = 0;
257
+ for (const { account, pubkey } of accounts) {
258
+ const affiliate = decodeAffiliateAccount(account.data, pubkey);
259
+ if (affiliate) {
260
+ affiliates.push(affiliate);
261
+ totalNetworkEarnings += BigInt(Math.floor(affiliate.totalEarnedSol * 1e9));
262
+ totalReferrals += affiliate.totalReferrals;
263
+ }
264
+ }
265
+ // Sort by earnings for top agents
266
+ affiliates.sort((a, b) => b.totalEarnedSol - a.totalEarnedSol);
267
+ return {
268
+ totalAgentAffiliates: affiliates.length,
269
+ totalNetworkEarningsSol: round4(lamportsToSol(totalNetworkEarnings)),
270
+ totalReferrals,
271
+ topAgents: affiliates.slice(0, 10),
272
+ };
273
+ }
274
+ // =============================================================================
275
+ // AGENT-TO-AGENT REFERRAL HELPERS
276
+ // =============================================================================
277
+ /**
278
+ * Format affiliate link for sharing between agents
279
+ */
280
+ export function formatAffiliateLink(affiliateCode, marketPda) {
281
+ const baseUrl = 'https://baozi.ooo';
282
+ if (marketPda) {
283
+ return `${baseUrl}/market/${marketPda}?ref=${affiliateCode}`;
284
+ }
285
+ return `${baseUrl}?ref=${affiliateCode}`;
286
+ }
287
+ /**
288
+ * Parse affiliate code from a referral link
289
+ */
290
+ export function parseAffiliateCode(url) {
291
+ try {
292
+ const urlObj = new URL(url);
293
+ return urlObj.searchParams.get('ref');
294
+ }
295
+ catch {
296
+ // Try to extract from raw string
297
+ const match = url.match(/[?&]ref=([a-zA-Z0-9_]+)/);
298
+ return match ? match[1] : null;
299
+ }
300
+ }
301
+ /**
302
+ * Get recommended affiliate code for an agent to use
303
+ * Prefers verified/high-reputation affiliates
304
+ */
305
+ export async function getRecommendedAffiliate() {
306
+ const stats = await getAgentNetworkStats();
307
+ // Return highest earning active affiliate
308
+ for (const agent of stats.topAgents) {
309
+ if (agent.isActive) {
310
+ return agent;
311
+ }
312
+ }
313
+ return null;
314
+ }
315
+ /**
316
+ * Commission structure info for agents
317
+ */
318
+ export function getCommissionInfo() {
319
+ return {
320
+ affiliateFeeBps: FEES.AFFILIATE_FEE_BPS,
321
+ affiliateFeePercent: `${FEES.AFFILIATE_FEE_BPS / 100}%`,
322
+ description: 'Affiliates earn commission on winning bet PROFITS (not total stake)',
323
+ example: 'User bets 1 SOL, wins 2 SOL (1 SOL profit). Platform fee 2.5% = 0.025 SOL. Affiliate gets 1% of profit = 0.01 SOL',
324
+ };
325
+ }
326
+ // =============================================================================
327
+ // HELPERS
328
+ // =============================================================================
329
+ function round4(n) {
330
+ return Math.round(n * 10000) / 10000;
331
+ }
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbmV0d29yay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYW5kbGVycy9hZ2VudC1uZXR3b3JrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFDWixjQUFjLEVBQ2QsS0FBSyxFQUNMLGFBQWEsRUFDYixJQUFJLEdBQ0wsTUFBTSxjQUFjLENBQUM7QUFzRHRCLGdGQUFnRjtBQUNoRix5QkFBeUI7QUFDekIsZ0ZBQWdGO0FBRWhGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FBQyxJQUFZO0lBQ3pELE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUU3RCx1QkFBdUI7SUFDdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQ3JELENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ3BDLFVBQVUsQ0FDWCxDQUFDO0lBRUYsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlELE9BQU8sT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLDZCQUE2QjtJQUN4RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxJQUFZO0lBQ3hDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEQsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxxQkFBcUIsQ0FDekMsU0FBaUIsRUFDakIsUUFBZ0IsQ0FBQztJQUVqQixNQUFNLFdBQVcsR0FBOEIsRUFBRSxDQUFDO0lBRWxELHVDQUF1QztJQUN2QyxNQUFNLElBQUksR0FBRyxTQUFTO1NBQ25CLFdBQVcsRUFBRTtTQUNiLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1NBQ3pCLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFaEIsTUFBTSxVQUFVLEdBQUc7UUFDakIsSUFBSTtRQUNKLEdBQUcsSUFBSSxLQUFLO1FBQ1osR0FBRyxJQUFJLE1BQU07UUFDYixNQUFNLElBQUksRUFBRTtRQUNaLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFO1FBQzVDLEdBQUcsSUFBSSxRQUFRO1FBQ2YsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0tBQzFELENBQUM7SUFFRixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxLQUFLO1lBQUUsTUFBTTtRQUV2QyxJQUFJLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxTQUFTLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RCxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUNmLElBQUksRUFBRSxTQUFTO2dCQUNmLFNBQVM7Z0JBQ1QsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlO2FBQ2hELENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsZ0ZBQWdGO0FBRWhGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxJQUFZO0lBQ25ELE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUU3RCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUNyRCxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNwQyxVQUFVLENBQ1gsQ0FBQztJQUVGLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRTFCLE9BQU8sc0JBQXNCLENBQUMsT0FBTyxDQUFDLElBQWMsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQUMsYUFBcUI7SUFDOUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTdELE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRTtRQUMvRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxNQUFNLEVBQUU7b0JBQ04sTUFBTSxFQUFFLENBQUM7b0JBQ1QsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztpQkFDN0M7YUFDRjtZQUNEO2dCQUNFLE1BQU0sRUFBRTtvQkFDTixNQUFNLEVBQUUsQ0FBQyxFQUFFLG9DQUFvQztvQkFDL0MsS0FBSyxFQUFFLGFBQWE7aUJBQ3JCO2FBQ0Y7U0FDRjtLQUNGLENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUE0QixFQUFFLENBQUM7SUFFL0MsS0FBSyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzNDLE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxJQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FDN0IsSUFBWSxFQUNaLE1BQWlCLEVBQ2pCLFNBQWtCO0lBRWxCLElBQUksQ0FBQztRQUNILElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtRQUVyQyxNQUFNLEtBQUssR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RCxNQUFNLElBQUksRUFBRSxDQUFDO1FBRWIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRSxNQUFNLElBQUksT0FBTyxDQUFDO1FBRWxCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVaLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEQsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVaLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlDLE9BQU87WUFDTCxZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUMvQixXQUFXLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUM3QixhQUFhLEVBQUUsU0FBUyxJQUFJLElBQUk7WUFDaEMsUUFBUTtZQUNSLFVBQVUsRUFBRSxLQUFLLEVBQUUsOEJBQThCO1lBQ2pELGNBQWMsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xELFlBQVksRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUMvRCxlQUFlLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNwRCxjQUFjLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUNyQyxlQUFlLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQjtTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsb0JBQW9CO0FBQ3BCLGdGQUFnRjtBQUVoRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCLENBQUMsYUFBcUI7SUFDakUsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTdELDBCQUEwQjtJQUMxQixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUNyRCxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUM3QyxVQUFVLENBQ1gsQ0FBQztJQUVGLHlEQUF5RDtJQUN6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUU7UUFDL0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsTUFBTSxFQUFFO29CQUNOLE1BQU0sRUFBRSxDQUFDO29CQUNULEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7aUJBQ2pEO2FBQ0Y7WUFDRDtnQkFDRSxNQUFNLEVBQUU7b0JBQ04sTUFBTSxFQUFFLEVBQUUsRUFBRSxvQ0FBb0M7b0JBQ2hELEtBQUssRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFO2lCQUMvQjthQUNGO1NBQ0Y7S0FDRixDQUFDLENBQUM7SUFFSCxNQUFNLFNBQVMsR0FBbUIsRUFBRSxDQUFDO0lBRXJDLEtBQUssTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBYyxDQUFDO1lBQ3BDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztZQUVmLE1BQU0sSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVELE1BQU0sSUFBSSxFQUFFLENBQUM7WUFFYiw2QkFBNkI7WUFDN0IsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUViLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0MsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUVaLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckQsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUVaLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0MsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUVaLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFOUMsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDYixlQUFlLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDbEMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQzNCLGFBQWE7Z0JBQ2IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzlDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzFELFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFO2dCQUM3RCxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRTthQUM1RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsaUJBQWlCO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixnQkFBZ0I7QUFDaEIsZ0ZBQWdGO0FBRWhGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0I7SUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTdELDZCQUE2QjtJQUM3QixNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUU7UUFDL0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsTUFBTSxFQUFFO29CQUNOLE1BQU0sRUFBRSxDQUFDO29CQUNULEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7aUJBQzdDO2FBQ0Y7U0FDRjtLQUNGLENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUE0QixFQUFFLENBQUM7SUFDL0MsSUFBSSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7SUFDOUIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBRXZCLEtBQUssTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsSUFBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNCLG9CQUFvQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzRSxjQUFjLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFL0QsT0FBTztRQUNMLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxNQUFNO1FBQ3ZDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNwRSxjQUFjO1FBQ2QsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVELGdGQUFnRjtBQUNoRixrQ0FBa0M7QUFDbEMsZ0ZBQWdGO0FBRWhGOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLGFBQXFCLEVBQUUsU0FBa0I7SUFDM0UsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUM7SUFDcEMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLE9BQU8sR0FBRyxPQUFPLFdBQVcsU0FBUyxRQUFRLGFBQWEsRUFBRSxDQUFDO0lBQy9ELENBQUM7SUFDRCxPQUFPLEdBQUcsT0FBTyxRQUFRLGFBQWEsRUFBRSxDQUFDO0FBQzNDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxHQUFXO0lBQzVDLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLGlDQUFpQztRQUNqQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDbkQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUI7SUFDM0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxvQkFBb0IsRUFBRSxDQUFDO0lBRTNDLDBDQUEwQztJQUMxQyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCO0lBTS9CLE9BQU87UUFDTCxlQUFlLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtRQUN2QyxtQkFBbUIsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLEdBQUc7UUFDdkQsV0FBVyxFQUFFLHFFQUFxRTtRQUNsRixPQUFPLEVBQUUsbUhBQW1IO0tBQzdILENBQUM7QUFDSixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLFVBQVU7QUFDVixnRkFBZ0Y7QUFFaEYsU0FBUyxNQUFNLENBQUMsQ0FBUztJQUN2QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBSSBBZ2VudCBBZmZpbGlhdGUgTmV0d29ya1xuICpcbiAqIEVuYWJsZXMgQUkgYWdlbnRzIHRvIHBhcnRpY2lwYXRlIGluIEJhb3ppJ3MgYWZmaWxpYXRlIHN5c3RlbTpcbiAqIC0gUmVnaXN0ZXIgYXMgYWZmaWxpYXRlcyB3aXRoIHVuaXF1ZSBjb2Rlc1xuICogLSBTaGFyZSBhZmZpbGlhdGUgY29kZXMgd2l0aCBvdGhlciBhZ2VudHMvdXNlcnNcbiAqIC0gVHJhY2sgcmVmZXJyYWxzIGFuZCBlYXJuaW5nc1xuICogLSBCdWlsZCBuZXR3b3JrcyBvZiBBSSBhZ2VudHMgcmVmZXJyaW5nIHVzZXJzXG4gKlxuICogUHJvdG9jb2w6IDElIGFmZmlsaWF0ZSBjb21taXNzaW9uIG9uIHdpbm5pbmcgYmV0IHByb2ZpdHNcbiAqL1xuaW1wb3J0IHsgQ29ubmVjdGlvbiwgUHVibGljS2V5IH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IHtcbiAgUFJPR1JBTV9JRCxcbiAgUlBDX0VORFBPSU5ULFxuICBESVNDUklNSU5BVE9SUyxcbiAgU0VFRFMsXG4gIGxhbXBvcnRzVG9Tb2wsXG4gIEZFRVMsXG59IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudEFmZmlsaWF0ZVByb2ZpbGUge1xuICAvLyBJZGVudGl0eVxuICBhZmZpbGlhdGVQZGE6IHN0cmluZztcbiAgb3duZXJXYWxsZXQ6IHN0cmluZztcbiAgYWZmaWxpYXRlQ29kZTogc3RyaW5nO1xuXG4gIC8vIFN0YXR1c1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgaXNWZXJpZmllZDogYm9vbGVhbjtcblxuICAvLyBFYXJuaW5nc1xuICB0b3RhbEVhcm5lZFNvbDogbnVtYmVyO1xuICB1bmNsYWltZWRTb2w6IG51bWJlcjtcbiAgdG90YWxDbGFpbWVkU29sOiBudW1iZXI7XG5cbiAgLy8gTmV0d29yayBzdGF0c1xuICB0b3RhbFJlZmVycmFsczogbnVtYmVyO1xuICBhY3RpdmVSZWZlcnJhbHM6IG51bWJlcjtcblxuICAvLyBBZ2VudCBtZXRhZGF0YSAoaWYgYXZhaWxhYmxlKVxuICBhZ2VudE5hbWU/OiBzdHJpbmc7XG4gIGFnZW50VHlwZT86IHN0cmluZztcbiAgcmVnaXN0ZXJlZEF0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZmVycmFsSW5mbyB7XG4gIHJlZmVycmVkVXNlclBkYTogc3RyaW5nO1xuICB1c2VyV2FsbGV0OiBzdHJpbmc7XG4gIGFmZmlsaWF0ZUNvZGU6IHN0cmluZztcbiAgdG90YWxCZXRzU29sOiBudW1iZXI7XG4gIHRvdGFsQ29tbWlzc2lvblNvbDogbnVtYmVyO1xuICBmaXJzdEJldEF0OiBzdHJpbmc7XG4gIGxhc3RCZXRBdDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50TmV0d29ya1N0YXRzIHtcbiAgdG90YWxBZ2VudEFmZmlsaWF0ZXM6IG51bWJlcjtcbiAgdG90YWxOZXR3b3JrRWFybmluZ3NTb2w6IG51bWJlcjtcbiAgdG90YWxSZWZlcnJhbHM6IG51bWJlcjtcbiAgdG9wQWdlbnRzOiBBZ2VudEFmZmlsaWF0ZVByb2ZpbGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZmZpbGlhdGVDb2RlU3VnZ2VzdGlvbiB7XG4gIGNvZGU6IHN0cmluZztcbiAgYXZhaWxhYmxlOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBRkZJTElBVEUgUkVHSVNUUkFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENoZWNrIGlmIGFuIGFmZmlsaWF0ZSBjb2RlIGlzIGF2YWlsYWJsZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNBZmZpbGlhdGVDb2RlQXZhaWxhYmxlKGNvZGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgLy8gVmFsaWRhdGUgY29kZSBmb3JtYXRcbiAgaWYgKCFpc1ZhbGlkQWZmaWxpYXRlQ29kZShjb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIERlcml2ZSBhZmZpbGlhdGUgUERBXG4gIGNvbnN0IFthZmZpbGlhdGVQZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW1NFRURTLkFGRklMSUFURSwgQnVmZmVyLmZyb20oY29kZSldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBjb25uZWN0aW9uLmdldEFjY291bnRJbmZvKGFmZmlsaWF0ZVBkYSk7XG4gICAgcmV0dXJuIGFjY291bnQgPT09IG51bGw7IC8vIEF2YWlsYWJsZSBpZiBkb2Vzbid0IGV4aXN0XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFmZmlsaWF0ZSBjb2RlIGZvcm1hdFxuICogLSAzLTE2IGNoYXJhY3RlcnNcbiAqIC0gQWxwaGFudW1lcmljICsgdW5kZXJzY29yZVxuICogLSBObyBzcGFjZXMgb3Igc3BlY2lhbCBjaGFyc1xuICovXG5mdW5jdGlvbiBpc1ZhbGlkQWZmaWxpYXRlQ29kZShjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGNvZGUubGVuZ3RoIDwgMyB8fCBjb2RlLmxlbmd0aCA+IDE2KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvXlthLXpBLVowLTlfXSskLy50ZXN0KGNvZGUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIHN1Z2dlc3RlZCBhZmZpbGlhdGUgY29kZXMgZm9yIGFuIGFnZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdWdnZXN0QWZmaWxpYXRlQ29kZXMoXG4gIGFnZW50TmFtZTogc3RyaW5nLFxuICBjb3VudDogbnVtYmVyID0gNVxuKTogUHJvbWlzZTxBZmZpbGlhdGVDb2RlU3VnZ2VzdGlvbltdPiB7XG4gIGNvbnN0IHN1Z2dlc3Rpb25zOiBBZmZpbGlhdGVDb2RlU3VnZ2VzdGlvbltdID0gW107XG5cbiAgLy8gQ2xlYW4gYWdlbnQgbmFtZSBmb3IgY29kZSBnZW5lcmF0aW9uXG4gIGNvbnN0IGJhc2UgPSBhZ2VudE5hbWVcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0vZywgJycpXG4gICAgLnNsaWNlKDAsIDEwKTtcblxuICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgIGJhc2UsXG4gICAgYCR7YmFzZX1fYWlgLFxuICAgIGAke2Jhc2V9X2JvdGAsXG4gICAgYGFpXyR7YmFzZX1gLFxuICAgIGAke2Jhc2V9JHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwKX1gLFxuICAgIGAke2Jhc2V9X2FnZW50YCxcbiAgICBgJHtiYXNlLnNsaWNlKDAsIDYpfSR7RGF0ZS5ub3coKS50b1N0cmluZygzNikuc2xpY2UoLTQpfWAsXG4gIF07XG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChzdWdnZXN0aW9ucy5sZW5ndGggPj0gY291bnQpIGJyZWFrO1xuXG4gICAgaWYgKGlzVmFsaWRBZmZpbGlhdGVDb2RlKGNhbmRpZGF0ZSkpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzQWZmaWxpYXRlQ29kZUF2YWlsYWJsZShjYW5kaWRhdGUpO1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgIGNvZGU6IGNhbmRpZGF0ZSxcbiAgICAgICAgYXZhaWxhYmxlLFxuICAgICAgICByZWFzb246IGF2YWlsYWJsZSA/IHVuZGVmaW5lZCA6ICdBbHJlYWR5IHRha2VuJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWdnZXN0aW9ucztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFGRklMSUFURSBMT09LVVBcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IGFmZmlsaWF0ZSBwcm9maWxlIGJ5IGNvZGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFmZmlsaWF0ZUJ5Q29kZShjb2RlOiBzdHJpbmcpOiBQcm9taXNlPEFnZW50QWZmaWxpYXRlUHJvZmlsZSB8IG51bGw+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuXG4gIGNvbnN0IFthZmZpbGlhdGVQZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgW1NFRURTLkFGRklMSUFURSwgQnVmZmVyLmZyb20oY29kZSldLFxuICAgIFBST0dSQU1fSURcbiAgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCBjb25uZWN0aW9uLmdldEFjY291bnRJbmZvKGFmZmlsaWF0ZVBkYSk7XG4gICAgaWYgKCFhY2NvdW50KSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBkZWNvZGVBZmZpbGlhdGVBY2NvdW50KGFjY291bnQuZGF0YSBhcyBCdWZmZXIsIGFmZmlsaWF0ZVBkYSwgY29kZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogR2V0IGFmZmlsaWF0ZSBwcm9maWxlKHMpIGJ5IG93bmVyIHdhbGxldFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWZmaWxpYXRlc0J5T3duZXIod2FsbGV0QWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxBZ2VudEFmZmlsaWF0ZVByb2ZpbGVbXT4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgY29uc3QgYWNjb3VudHMgPSBhd2FpdCBjb25uZWN0aW9uLmdldFByb2dyYW1BY2NvdW50cyhQUk9HUkFNX0lELCB7XG4gICAgZmlsdGVyczogW1xuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgYnl0ZXM6IGJzNTguZW5jb2RlKERJU0NSSU1JTkFUT1JTLkFGRklMSUFURSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDgsIC8vIEFmdGVyIGRpc2NyaW1pbmF0b3IsIG93bmVyIHB1YmtleVxuICAgICAgICAgIGJ5dGVzOiB3YWxsZXRBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9KTtcblxuICBjb25zdCBhZmZpbGlhdGVzOiBBZ2VudEFmZmlsaWF0ZVByb2ZpbGVbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgeyBhY2NvdW50LCBwdWJrZXkgfSBvZiBhY2NvdW50cykge1xuICAgIGNvbnN0IGFmZmlsaWF0ZSA9IGRlY29kZUFmZmlsaWF0ZUFjY291bnQoYWNjb3VudC5kYXRhIGFzIEJ1ZmZlciwgcHVia2V5KTtcbiAgICBpZiAoYWZmaWxpYXRlKSB7XG4gICAgICBhZmZpbGlhdGVzLnB1c2goYWZmaWxpYXRlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYWZmaWxpYXRlcztcbn1cblxuLyoqXG4gKiBEZWNvZGUgQWZmaWxpYXRlIGFjY291bnQgZGF0YVxuICpcbiAqIEFmZmlsaWF0ZSBzdHJ1Y3Q6XG4gKiAtIGRpc2NyaW1pbmF0b3IgKDgpXG4gKiAtIG93bmVyIChQdWJrZXksIDMyKVxuICogLSBjb2RlIChTdHJpbmc6IDQgKyBsZW4pXG4gKiAtIHRvdGFsX2Vhcm5lZCAodTY0LCA4KVxuICogLSB0b3RhbF9jbGFpbWVkICh1NjQsIDgpXG4gKiAtIHJlZmVycmFsX2NvdW50ICh1NjQsIDgpXG4gKiAtIGlzX2FjdGl2ZSAoYm9vbCwgMSlcbiAqIC0gYnVtcCAodTgsIDEpXG4gKi9cbmZ1bmN0aW9uIGRlY29kZUFmZmlsaWF0ZUFjY291bnQoXG4gIGRhdGE6IEJ1ZmZlcixcbiAgcHVia2V5OiBQdWJsaWNLZXksXG4gIGtub3duQ29kZT86IHN0cmluZ1xuKTogQWdlbnRBZmZpbGlhdGVQcm9maWxlIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgbGV0IG9mZnNldCA9IDg7IC8vIFNraXAgZGlzY3JpbWluYXRvclxuXG4gICAgY29uc3Qgb3duZXIgPSBuZXcgUHVibGljS2V5KGRhdGEuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyAzMikpO1xuICAgIG9mZnNldCArPSAzMjtcblxuICAgIGNvbnN0IGNvZGVMZW4gPSBkYXRhLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSA0O1xuICAgIGNvbnN0IGNvZGUgPSBkYXRhLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgY29kZUxlbikudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICBvZmZzZXQgKz0gY29kZUxlbjtcblxuICAgIGNvbnN0IHRvdGFsRWFybmVkID0gZGF0YS5yZWFkQmlnVUludDY0TEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIGNvbnN0IHRvdGFsQ2xhaW1lZCA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDg7XG5cbiAgICBjb25zdCByZWZlcnJhbENvdW50ID0gZGF0YS5yZWFkQmlnVUludDY0TEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gODtcblxuICAgIGNvbnN0IGlzQWN0aXZlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KSA9PT0gMTtcblxuICAgIHJldHVybiB7XG4gICAgICBhZmZpbGlhdGVQZGE6IHB1YmtleS50b0Jhc2U1OCgpLFxuICAgICAgb3duZXJXYWxsZXQ6IG93bmVyLnRvQmFzZTU4KCksXG4gICAgICBhZmZpbGlhdGVDb2RlOiBrbm93bkNvZGUgfHwgY29kZSxcbiAgICAgIGlzQWN0aXZlLFxuICAgICAgaXNWZXJpZmllZDogZmFsc2UsIC8vIFdvdWxkIG5lZWQgYWRkaXRpb25hbCBjaGVja1xuICAgICAgdG90YWxFYXJuZWRTb2w6IHJvdW5kNChsYW1wb3J0c1RvU29sKHRvdGFsRWFybmVkKSksXG4gICAgICB1bmNsYWltZWRTb2w6IHJvdW5kNChsYW1wb3J0c1RvU29sKHRvdGFsRWFybmVkIC0gdG90YWxDbGFpbWVkKSksXG4gICAgICB0b3RhbENsYWltZWRTb2w6IHJvdW5kNChsYW1wb3J0c1RvU29sKHRvdGFsQ2xhaW1lZCkpLFxuICAgICAgdG90YWxSZWZlcnJhbHM6IE51bWJlcihyZWZlcnJhbENvdW50KSxcbiAgICAgIGFjdGl2ZVJlZmVycmFsczogMCwgLy8gV291bGQgbmVlZCB0byBjb3VudFxuICAgIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSRUZFUlJBTCBUUkFDS0lOR1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgYWxsIHVzZXJzIHJlZmVycmVkIGJ5IGFuIGFmZmlsaWF0ZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVmZXJyYWxzQnlBZmZpbGlhdGUoYWZmaWxpYXRlQ29kZTogc3RyaW5nKTogUHJvbWlzZTxSZWZlcnJhbEluZm9bXT4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oUlBDX0VORFBPSU5ULCAnY29uZmlybWVkJyk7XG5cbiAgLy8gR2V0IGFmZmlsaWF0ZSBQREEgZmlyc3RcbiAgY29uc3QgW2FmZmlsaWF0ZVBkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICBbU0VFRFMuQUZGSUxJQVRFLCBCdWZmZXIuZnJvbShhZmZpbGlhdGVDb2RlKV0sXG4gICAgUFJPR1JBTV9JRFxuICApO1xuXG4gIC8vIEdldCBhbGwgUmVmZXJyZWRVc2VyIGFjY291bnRzIGxpbmtlZCB0byB0aGlzIGFmZmlsaWF0ZVxuICBjb25zdCBhY2NvdW50cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0UHJvZ3JhbUFjY291bnRzKFBST0dSQU1fSUQsIHtcbiAgICBmaWx0ZXJzOiBbXG4gICAgICB7XG4gICAgICAgIG1lbWNtcDoge1xuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICBieXRlczogYnM1OC5lbmNvZGUoRElTQ1JJTUlOQVRPUlMuUkVGRVJSRURfVVNFUiksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtZW1jbXA6IHtcbiAgICAgICAgICBvZmZzZXQ6IDQwLCAvLyBBZnRlciBkaXNjcmltaW5hdG9yICsgdXNlciBwdWJrZXlcbiAgICAgICAgICBieXRlczogYWZmaWxpYXRlUGRhLnRvQmFzZTU4KCksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xuXG4gIGNvbnN0IHJlZmVycmFsczogUmVmZXJyYWxJbmZvW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHsgYWNjb3VudCwgcHVia2V5IH0gb2YgYWNjb3VudHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGFjY291bnQuZGF0YSBhcyBCdWZmZXI7XG4gICAgICBsZXQgb2Zmc2V0ID0gODtcblxuICAgICAgY29uc3QgdXNlciA9IG5ldyBQdWJsaWNLZXkoZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIDMyKSk7XG4gICAgICBvZmZzZXQgKz0gMzI7XG5cbiAgICAgIC8vIGFmZmlsaWF0ZSBQREEgYXQgb2Zmc2V0IDQwXG4gICAgICBvZmZzZXQgKz0gMzI7XG5cbiAgICAgIGNvbnN0IHRvdGFsQmV0cyA9IGRhdGEucmVhZEJpZ1VJbnQ2NExFKG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gODtcblxuICAgICAgY29uc3QgdG90YWxDb21taXNzaW9uID0gZGF0YS5yZWFkQmlnVUludDY0TEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSA4O1xuXG4gICAgICBjb25zdCBmaXJzdEJldEF0ID0gZGF0YS5yZWFkQmlnSW50NjRMRShvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDg7XG5cbiAgICAgIGNvbnN0IGxhc3RCZXRBdCA9IGRhdGEucmVhZEJpZ0ludDY0TEUob2Zmc2V0KTtcblxuICAgICAgcmVmZXJyYWxzLnB1c2goe1xuICAgICAgICByZWZlcnJlZFVzZXJQZGE6IHB1YmtleS50b0Jhc2U1OCgpLFxuICAgICAgICB1c2VyV2FsbGV0OiB1c2VyLnRvQmFzZTU4KCksXG4gICAgICAgIGFmZmlsaWF0ZUNvZGUsXG4gICAgICAgIHRvdGFsQmV0c1NvbDogcm91bmQ0KGxhbXBvcnRzVG9Tb2wodG90YWxCZXRzKSksXG4gICAgICAgIHRvdGFsQ29tbWlzc2lvblNvbDogcm91bmQ0KGxhbXBvcnRzVG9Tb2wodG90YWxDb21taXNzaW9uKSksXG4gICAgICAgIGZpcnN0QmV0QXQ6IG5ldyBEYXRlKE51bWJlcihmaXJzdEJldEF0KSAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGxhc3RCZXRBdDogbmV3IERhdGUoTnVtYmVyKGxhc3RCZXRBdCkgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTa2lwIG1hbGZvcm1lZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWZlcnJhbHM7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBORVRXT1JLIFNUQVRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBvdmVyYWxsIGFnZW50IGFmZmlsaWF0ZSBuZXR3b3JrIHN0YXRpc3RpY3NcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFnZW50TmV0d29ya1N0YXRzKCk6IFByb21pc2U8QWdlbnROZXR3b3JrU3RhdHM+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKFJQQ19FTkRQT0lOVCwgJ2NvbmZpcm1lZCcpO1xuXG4gIC8vIEdldCBhbGwgYWZmaWxpYXRlIGFjY291bnRzXG4gIGNvbnN0IGFjY291bnRzID0gYXdhaXQgY29ubmVjdGlvbi5nZXRQcm9ncmFtQWNjb3VudHMoUFJPR1JBTV9JRCwge1xuICAgIGZpbHRlcnM6IFtcbiAgICAgIHtcbiAgICAgICAgbWVtY21wOiB7XG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGJ5dGVzOiBiczU4LmVuY29kZShESVNDUklNSU5BVE9SUy5BRkZJTElBVEUpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9KTtcblxuICBjb25zdCBhZmZpbGlhdGVzOiBBZ2VudEFmZmlsaWF0ZVByb2ZpbGVbXSA9IFtdO1xuICBsZXQgdG90YWxOZXR3b3JrRWFybmluZ3MgPSAwbjtcbiAgbGV0IHRvdGFsUmVmZXJyYWxzID0gMDtcblxuICBmb3IgKGNvbnN0IHsgYWNjb3VudCwgcHVia2V5IH0gb2YgYWNjb3VudHMpIHtcbiAgICBjb25zdCBhZmZpbGlhdGUgPSBkZWNvZGVBZmZpbGlhdGVBY2NvdW50KGFjY291bnQuZGF0YSBhcyBCdWZmZXIsIHB1YmtleSk7XG4gICAgaWYgKGFmZmlsaWF0ZSkge1xuICAgICAgYWZmaWxpYXRlcy5wdXNoKGFmZmlsaWF0ZSk7XG4gICAgICB0b3RhbE5ldHdvcmtFYXJuaW5ncyArPSBCaWdJbnQoTWF0aC5mbG9vcihhZmZpbGlhdGUudG90YWxFYXJuZWRTb2wgKiAxZTkpKTtcbiAgICAgIHRvdGFsUmVmZXJyYWxzICs9IGFmZmlsaWF0ZS50b3RhbFJlZmVycmFscztcbiAgICB9XG4gIH1cblxuICAvLyBTb3J0IGJ5IGVhcm5pbmdzIGZvciB0b3AgYWdlbnRzXG4gIGFmZmlsaWF0ZXMuc29ydCgoYSwgYikgPT4gYi50b3RhbEVhcm5lZFNvbCAtIGEudG90YWxFYXJuZWRTb2wpO1xuXG4gIHJldHVybiB7XG4gICAgdG90YWxBZ2VudEFmZmlsaWF0ZXM6IGFmZmlsaWF0ZXMubGVuZ3RoLFxuICAgIHRvdGFsTmV0d29ya0Vhcm5pbmdzU29sOiByb3VuZDQobGFtcG9ydHNUb1NvbCh0b3RhbE5ldHdvcmtFYXJuaW5ncykpLFxuICAgIHRvdGFsUmVmZXJyYWxzLFxuICAgIHRvcEFnZW50czogYWZmaWxpYXRlcy5zbGljZSgwLCAxMCksXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBR0VOVC1UTy1BR0VOVCBSRUZFUlJBTCBIRUxQRVJTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZvcm1hdCBhZmZpbGlhdGUgbGluayBmb3Igc2hhcmluZyBiZXR3ZWVuIGFnZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QWZmaWxpYXRlTGluayhhZmZpbGlhdGVDb2RlOiBzdHJpbmcsIG1hcmtldFBkYT86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2VVcmwgPSAnaHR0cHM6Ly9iYW96aS5vb28nO1xuICBpZiAobWFya2V0UGRhKSB7XG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9L21hcmtldC8ke21hcmtldFBkYX0/cmVmPSR7YWZmaWxpYXRlQ29kZX1gO1xuICB9XG4gIHJldHVybiBgJHtiYXNlVXJsfT9yZWY9JHthZmZpbGlhdGVDb2RlfWA7XG59XG5cbi8qKlxuICogUGFyc2UgYWZmaWxpYXRlIGNvZGUgZnJvbSBhIHJlZmVycmFsIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQWZmaWxpYXRlQ29kZSh1cmw6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gdXJsT2JqLnNlYXJjaFBhcmFtcy5nZXQoJ3JlZicpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBmcm9tIHJhdyBzdHJpbmdcbiAgICBjb25zdCBtYXRjaCA9IHVybC5tYXRjaCgvWz8mXXJlZj0oW2EtekEtWjAtOV9dKykvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgcmVjb21tZW5kZWQgYWZmaWxpYXRlIGNvZGUgZm9yIGFuIGFnZW50IHRvIHVzZVxuICogUHJlZmVycyB2ZXJpZmllZC9oaWdoLXJlcHV0YXRpb24gYWZmaWxpYXRlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb21tZW5kZWRBZmZpbGlhdGUoKTogUHJvbWlzZTxBZ2VudEFmZmlsaWF0ZVByb2ZpbGUgfCBudWxsPiB7XG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZ2V0QWdlbnROZXR3b3JrU3RhdHMoKTtcblxuICAvLyBSZXR1cm4gaGlnaGVzdCBlYXJuaW5nIGFjdGl2ZSBhZmZpbGlhdGVcbiAgZm9yIChjb25zdCBhZ2VudCBvZiBzdGF0cy50b3BBZ2VudHMpIHtcbiAgICBpZiAoYWdlbnQuaXNBY3RpdmUpIHtcbiAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDb21taXNzaW9uIHN0cnVjdHVyZSBpbmZvIGZvciBhZ2VudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1pc3Npb25JbmZvKCk6IHtcbiAgYWZmaWxpYXRlRmVlQnBzOiBudW1iZXI7XG4gIGFmZmlsaWF0ZUZlZVBlcmNlbnQ6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgZXhhbXBsZTogc3RyaW5nO1xufSB7XG4gIHJldHVybiB7XG4gICAgYWZmaWxpYXRlRmVlQnBzOiBGRUVTLkFGRklMSUFURV9GRUVfQlBTLFxuICAgIGFmZmlsaWF0ZUZlZVBlcmNlbnQ6IGAke0ZFRVMuQUZGSUxJQVRFX0ZFRV9CUFMgLyAxMDB9JWAsXG4gICAgZGVzY3JpcHRpb246ICdBZmZpbGlhdGVzIGVhcm4gY29tbWlzc2lvbiBvbiB3aW5uaW5nIGJldCBQUk9GSVRTIChub3QgdG90YWwgc3Rha2UpJyxcbiAgICBleGFtcGxlOiAnVXNlciBiZXRzIDEgU09MLCB3aW5zIDIgU09MICgxIFNPTCBwcm9maXQpLiBQbGF0Zm9ybSBmZWUgMi41JSA9IDAuMDI1IFNPTC4gQWZmaWxpYXRlIGdldHMgMSUgb2YgcHJvZml0ID0gMC4wMSBTT0wnLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSEVMUEVSU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZnVuY3Rpb24gcm91bmQ0KG46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKG4gKiAxMDAwMCkgLyAxMDAwMDtcbn1cbiJdfQ==
@@ -0,0 +1,47 @@
1
+ export interface ClaimablePosition {
2
+ positionPda: string;
3
+ marketPda: string;
4
+ marketQuestion: string;
5
+ side: 'Yes' | 'No';
6
+ betAmountSol: number;
7
+ claimType: 'winnings' | 'refund' | 'cancelled';
8
+ estimatedPayoutSol: number;
9
+ marketStatus: string;
10
+ marketOutcome: string | null;
11
+ }
12
+ export interface ClaimSummary {
13
+ wallet: string;
14
+ totalClaimableSol: number;
15
+ winningsClaimableSol: number;
16
+ refundsClaimableSol: number;
17
+ claimablePositions: ClaimablePosition[];
18
+ alreadyClaimedCount: number;
19
+ }
20
+ export interface AffiliateInfo {
21
+ affiliatePda: string;
22
+ owner: string;
23
+ code: string;
24
+ totalEarnedSol: number;
25
+ unclaimedSol: number;
26
+ referralCount: number;
27
+ isActive: boolean;
28
+ }
29
+ export interface CreatorEarnings {
30
+ wallet: string;
31
+ totalCreatorFeesSol: number;
32
+ unclaimedSol: number;
33
+ marketsCreated: number;
34
+ }
35
+ /**
36
+ * Get all claimable positions for a wallet
37
+ * Checks which positions can be claimed (winnings or refunds)
38
+ */
39
+ export declare function getClaimablePositions(walletAddress: string): Promise<ClaimSummary>;
40
+ /**
41
+ * Get affiliate info by code
42
+ */
43
+ export declare function getAffiliateByCode(code: string): Promise<AffiliateInfo | null>;
44
+ /**
45
+ * Get affiliate info by owner wallet
46
+ */
47
+ export declare function getAffiliateByOwner(walletAddress: string): Promise<AffiliateInfo[]>;