@payai/x402-solana-react 1.0.4 → 2.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 CHANGED
@@ -1,13 +1,88 @@
1
1
  # x402 Solana React Paywall
2
2
 
3
- A reusable React component library that provides drop-in paywall functionality for Solana-based applications using the x402 payment protocol.
3
+ A reusable React component library that provides drop-in paywall functionality for Solana-based applications using the x402 payment protocol v2.
4
+
5
+ > **x402 Protocol v2**: This package uses `x402-solana` which implements the x402 v2 specification with CAIP-2 network identifiers, `PAYMENT-SIGNATURE` headers, and improved payload structure. See the [CHANGELOG](./CHANGELOG.md) for details.
6
+
7
+ ## Classic theme
8
+
9
+ <table>
10
+ <tr>
11
+ <td width="50%">
12
+
13
+ <img src="./example-images/light.png" alt="Classic Light Theme Preview" style="width: 100%; height: auto;">
14
+
15
+ </td>
16
+ <td width="50%">
17
+
18
+ <img src="./example-images/dark.png" alt="Classic Dark Theme Preview" style="width: 100%; height: auto;">
19
+
20
+ </td>
21
+ </tr>
22
+ </table>
23
+
24
+ ## Solana theme
25
+
26
+ <table>
27
+ <tr>
28
+ <td width="50%">
29
+
30
+ <img src="./example-images/solana-light.png" alt="Solana Light Theme Preview" style="width: 100%; height: auto;">
31
+
32
+ </td>
33
+ <td width="50%">
34
+
35
+ <img src="./example-images/solana-dark.png" alt="Solana Dark Theme Preview" style="width: 100%; height: auto;">
36
+
37
+ </td>
38
+ </tr>
39
+ </table>
40
+
41
+ ## Seeker theme
42
+
43
+ <table>
44
+ <tr>
45
+ <td width="33.33%">
46
+
47
+ <img src="./example-images/seeker-light.png" alt="Seeker Light Theme Preview" style="width: 100%; height: auto;">
48
+
49
+ </td>
50
+ <td width="33.33%">
51
+
52
+ <img src="./example-images/seeker.png" alt="Seeker Theme Preview" style="width: 100%; height: auto;">
53
+
54
+ </td>
55
+ <td width="33.33%">
56
+
57
+ <img src="./example-images/seeker-2.png" alt="Seeker-2 Theme Preview" style="width: 100%; height: auto;">
58
+
59
+ </td>
60
+ </tr>
61
+ </table>
62
+
63
+ ## Terminal theme
64
+
65
+ <table>
66
+ <tr>
67
+ <td width="50%">
68
+
69
+ <img src="./example-images/terminal-light.png" alt="Terminal Light Theme Preview" style="width: 100%; height: auto;">
70
+
71
+ </td>
72
+ <td width="50%">
73
+
74
+ <img src="./example-images/terminal-dark.png" alt="Terminal Dark Theme Preview" style="width: 100%; height: auto;">
75
+
76
+ </td>
77
+ </tr>
78
+ </table>
4
79
 
5
80
  ## 🚀 Features
6
81
 
7
82
  - ✅ **Drop-in React Components**: Easy integration with existing apps
8
83
  - ✅ **Auto-Setup Providers**: Automatically configures wallet providers (or use your own)
9
84
  - ✅ **Solana Native**: Built specifically for Solana blockchain
10
- - ✅ **Multi-Wallet Support**: Works with Phantom, Solflare, and more
85
+ - ✅ **Multi-Wallet Support**: Works with Phantom, Solflare, and more
11
86
  - ✅ **Multiple Themes**: Light, Dark, Solana, Seeker, Terminal themes
12
87
  - ✅ **Tailwind CSS**: Utility-first styling with customization
13
88
  - ✅ **shadcn/ui**: Accessible, beautiful components
@@ -27,7 +102,7 @@ A reusable React component library that provides drop-in paywall functionality f
27
102
  npm install @payai/x402-solana-react
28
103
  # or
29
104
  yarn add @payai/x402-solana-react
30
- # or
105
+ # or
31
106
  pnpm add @payai/x402-solana-react
32
107
  ```
33
108
 
@@ -99,10 +174,7 @@ import { clusterApiUrl } from '@solana/web3.js';
99
174
  function App() {
100
175
  const network = WalletAdapterNetwork.Mainnet;
101
176
  const endpoint = clusterApiUrl(network);
102
- const wallets = [
103
- new PhantomWalletAdapter(),
104
- new SolflareWalletAdapter(),
105
- ];
177
+ const wallets = [new PhantomWalletAdapter(), new SolflareWalletAdapter()];
106
178
 
107
179
  return (
108
180
  <ConnectionProvider endpoint={endpoint}>
@@ -138,7 +210,7 @@ function PremiumPage() {
138
210
  amount={0.02}
139
211
  description="Premium AI Chat Access"
140
212
  network="solana" // Use 'solana' for mainnet, 'solana-devnet' for testing
141
- onPaymentSuccess={(txId) => console.log('Payment successful!', txId)}
213
+ onPaymentSuccess={txId => console.log('Payment successful!', txId)}
142
214
  >
143
215
  <PremiumContent />
144
216
  </X402Paywall>
@@ -161,11 +233,11 @@ function PremiumPage() {
161
233
  description="Premium Content"
162
234
  network="solana"
163
235
  rpcUrl={rpcUrl} // Avoids rate limiting on public RPCs
164
- onPaymentSuccess={(txId) => {
236
+ onPaymentSuccess={txId => {
165
237
  console.log('Payment successful!', txId);
166
238
  // Update your backend, show success message, etc.
167
239
  }}
168
- onPaymentError={(error) => {
240
+ onPaymentError={error => {
169
241
  console.error('Payment failed:', error);
170
242
  }}
171
243
  >
@@ -204,7 +276,7 @@ function PremiumPage() {
204
276
  description="Premium Features"
205
277
  network="solana"
206
278
  theme={theme} // Try: 'light', 'dark', 'solana-light', 'solana-dark', etc.
207
- onPaymentSuccess={(txId) => console.log('Paid!', txId)}
279
+ onPaymentSuccess={txId => console.log('Paid!', txId)}
208
280
  >
209
281
  <AdvancedFeatures />
210
282
  </X402Paywall>
@@ -218,16 +290,16 @@ You can customize further using `classNames` and `customStyles` props:
218
290
 
219
291
  ```tsx
220
292
  <X402Paywall
221
- amount={5.00}
293
+ amount={5.0}
222
294
  description="Premium Features"
223
295
  network="solana"
224
296
  theme="dark"
225
297
  classNames={{
226
- container: "bg-gradient-to-r from-purple-600 to-blue-600",
227
- button: "bg-white text-purple-600 hover:bg-gray-50 font-bold"
298
+ container: 'bg-gradient-to-r from-purple-600 to-blue-600',
299
+ button: 'bg-white text-purple-600 hover:bg-gray-50 font-bold',
228
300
  }}
229
301
  customStyles={{
230
- button: { boxShadow: '0 10px 30px rgba(153, 69, 255, 0.4)' }
302
+ button: { boxShadow: '0 10px 30px rgba(153, 69, 255, 0.4)' },
231
303
  }}
232
304
  >
233
305
  <AdvancedFeatures />
@@ -238,31 +310,32 @@ You can customize further using `classNames` and `customStyles` props:
238
310
 
239
311
  ### X402Paywall Props
240
312
 
241
- | Prop | Type | Required | Default | Description |
242
- |------|------|----------|---------|-------------|
243
- | `amount` | `number` | ✅ | - | Payment amount in USDC |
244
- | `description` | `string` | ✅ | - | Payment description |
245
- | `children` | `ReactNode` | ✅ | - | Protected content to show after payment |
246
- | `network` | `'solana' \| 'solana-devnet'` | ❌ | `'solana-devnet'` | Solana network to use |
247
- | `wallet` | `WalletAdapter` | ❌ | - | Optional wallet adapter (auto-uses context if not provided) |
248
- | `rpcUrl` | `string` | ❌ | - | Custom RPC URL (recommended to avoid rate limits) |
249
- | `autoSetupProviders` | `boolean` | ❌ | `true` | Automatically setup wallet providers |
250
- | `providerNetwork` | `WalletAdapterNetwork` | ❌ | Auto-detected | Network for auto-setup providers |
251
- | `providerEndpoint` | `string` | ❌ | - | Custom endpoint for auto-setup providers |
252
- | `treasuryAddress` | `string` | ❌ | - | Custom treasury address |
253
- | `facilitatorUrl` | `string` | ❌ | - | Custom facilitator URL |
254
- | `theme` | `ThemePreset` | ❌ | `'solana-light'` | Visual theme (see Themes section) |
255
- | `showBalance` | `boolean` | ❌ | `true` | Show wallet USDC balance |
256
- | `showNetworkInfo` | `boolean` | ❌ | `true` | Show network information |
257
- | `showPaymentDetails` | `boolean` | ❌ | `true` | Show payment details section |
258
- | `maxPaymentAmount` | `number` | ❌ | - | Maximum allowed payment amount |
259
- | `classNames` | `ComponentClassNames` | ❌ | - | Custom CSS classes for components |
260
- | `customStyles` | `ComponentStyles` | ❌ | - | Custom inline styles for components |
261
- | `onPaymentStart` | `() => void` | ❌ | - | Callback when payment starts |
262
- | `onPaymentSuccess` | `(txId: string) => void` | ❌ | - | Callback on successful payment |
263
- | `onPaymentError` | `(error: Error) => void` | ❌ | - | Callback on payment error |
264
- | `onWalletConnect` | `(publicKey: string) => void` | ❌ | - | Callback when wallet connects |
265
- | `onDisconnect` | `() => void` | ❌ | - | Callback when wallet disconnects |
313
+ | Prop | Type | Required | Default | Description |
314
+ | -------------------- | ----------------------------- | -------- | ---------------------------------------------------- | ----------------------------------------------------------- |
315
+ | `amount` | `number` | ✅ | - | Payment amount in USDC |
316
+ | `description` | `string` | ✅ | - | Payment description |
317
+ | `children` | `ReactNode` | ✅ | - | Protected content to show after payment |
318
+ | `network` | `'solana' \| 'solana-devnet'` | ❌ | `'solana-devnet'` | Solana network to use |
319
+ | `wallet` | `WalletAdapter` | ❌ | - | Optional wallet adapter (auto-uses context if not provided) |
320
+ | `rpcUrl` | `string` | ❌ | - | Custom RPC URL (recommended to avoid rate limits) |
321
+ | `autoSetupProviders` | `boolean` | ❌ | `true` | Automatically setup wallet providers |
322
+ | `providerNetwork` | `WalletAdapterNetwork` | ❌ | Auto-detected | Network for auto-setup providers |
323
+ | `providerEndpoint` | `string` | ❌ | - | Custom endpoint for auto-setup providers |
324
+ | `apiEndpoint` | `string` | ❌ | `https://x402.payai.network/api/solana/paid-content` | Custom API endpoint |
325
+ | `facilitatorUrl` | `string` | ❌ | - | Custom facilitator URL |
326
+ | `theme` | `ThemePreset` | ❌ | `'solana-light'` | Visual theme (see Themes section) |
327
+ | `logoUrl` | `string` | ❌ | - | Custom logo URL to display |
328
+ | `showBalance` | `boolean` | ❌ | `true` | Show wallet USDC balance |
329
+ | `showNetworkInfo` | `boolean` | ❌ | `true` | Show network information |
330
+ | `showPaymentDetails` | `boolean` | ❌ | `true` | Show payment details section |
331
+ | `maxPaymentAmount` | `number` | ❌ | - | Maximum allowed payment amount |
332
+ | `classNames` | `ComponentClassNames` | ❌ | - | Custom CSS classes for components |
333
+ | `customStyles` | `ComponentStyles` | ❌ | - | Custom inline styles for components |
334
+ | `onPaymentStart` | `() => void` | ❌ | - | Callback when payment starts |
335
+ | `onPaymentSuccess` | `(txId: string) => void` | ❌ | - | Callback on successful payment |
336
+ | `onPaymentError` | `(error: Error) => void` | ❌ | - | Callback on payment error |
337
+ | `onWalletConnect` | `(publicKey: string) => void` | ❌ | - | Callback when wallet connects |
338
+ | `onDisconnect` | `() => void` | ❌ | - | Callback when wallet disconnects |
266
339
 
267
340
  See [full API documentation](./docs/API_REFERENCE.md) for complete reference.
268
341
 
@@ -305,27 +378,32 @@ npm run lint
305
378
  ### Common Issues
306
379
 
307
380
  **"Wallet not connected"**
381
+
308
382
  - Ensure wallet provider is properly configured
309
383
  - Check that wallet extension is installed and unlocked
310
384
  - Verify network matches (mainnet vs devnet)
311
385
 
312
386
  **"Insufficient USDC balance"**
387
+
313
388
  - Check wallet has enough USDC for payment + gas
314
389
  - On devnet: Use [Solana Faucet](https://faucet.solana.com/) for SOL
315
390
  - Get devnet USDC from test token faucets like [Circle](https://faucet.circle.com/)
316
391
 
317
392
  **"RPC rate limit exceeded"**
393
+
318
394
  - Use a custom RPC provider (Helius, QuickNode, Alchemy)
319
395
  - Set `VITE_SOLANA_RPC_URL` in `.env` file
320
396
  - Pass via `rpcUrl` prop: `rpcUrl={import.meta.env.VITE_SOLANA_RPC_URL}`
321
397
  - For production, always use a paid RPC endpoint
322
398
 
323
399
  **"Transaction failed"**
400
+
324
401
  - Verify network connectivity
325
402
  - Check Solana network status
326
403
  - Ensure sufficient SOL for transaction fees
327
404
 
328
405
  **Styling not working**
406
+
329
407
  - Make sure you imported both required stylesheets:
330
408
  ```tsx
331
409
  import '@payai/x402-solana-react/styles';
@@ -335,6 +413,7 @@ npm run lint
335
413
  - Verify Tailwind CSS is configured if using custom classes
336
414
 
337
415
  **"process is not defined" error**
416
+
338
417
  - Use Vite's `import.meta.env` instead of `process.env`
339
418
  - Example: `import.meta.env.VITE_SOLANA_RPC_URL`
340
419
 
@@ -343,7 +422,9 @@ npm run lint
343
422
  **Ready for Production** - Fully functional x402 paywall components with PayAI facilitator integration.
344
423
 
345
424
  ### Features Complete
425
+
346
426
  - ✅ Core paywall component with Solana integration
427
+ - ✅ **x402 Protocol v2** - Full support via `x402-solana`
347
428
  - ✅ Payment processing via x402 protocol
348
429
  - ✅ Multi-wallet support (Phantom, Solflare, etc.)
349
430
  - ✅ Beautiful Solana-themed UI with Tailwind CSS
@@ -351,6 +432,18 @@ npm run lint
351
432
  - ✅ Devnet integration with PayAI facilitator
352
433
  - ✅ Responsive design and accessibility
353
434
 
435
+ ### x402 v2 Protocol
436
+
437
+ This package supports the x402 v2 specification which includes:
438
+
439
+ | Feature | v1 | v2 |
440
+ | ------------------ | ------------------------- | ------------------------------ |
441
+ | **Network Format** | `solana`, `solana-devnet` | CAIP-2 format (auto-converted) |
442
+ | **Payment Header** | `X-PAYMENT` | `PAYMENT-SIGNATURE` |
443
+ | **Amount Field** | `maxAmountRequired` | `amount` |
444
+
445
+ **Note**: You can still use simple network names (`solana`, `solana-devnet`) in your code - the library automatically converts them to CAIP-2 format internally.
446
+
354
447
  ## 🤝 Contributing
355
448
 
356
449
  This project is currently in early development. Contributions welcome!
@@ -361,10 +454,10 @@ MIT License
361
454
 
362
455
  ## 🔗 Related Projects
363
456
 
364
- - [x402-solana](https://github.com/payainetwork/x402-solana) - Base Solana payment protocol implementation
365
- - [x402](https://github.com/payainetwork/x402) - Core x402 payment protocol
366
- - [PayAI Network](https://payai.network) - x402 payment infrastructure
457
+ - [x402-solana](https://www.npmjs.com/package/x402-solana) - Base Solana payment protocol implementation (x402 v2)
458
+ - [x402](https://github.com/coinbase/x402) - Core x402 payment protocol specification
459
+ - [PayAI Network](https://payai.network) - x402 payment infrastructure and facilitator
367
460
 
368
461
  ---
369
462
 
370
- Built with ❤️ for the Solana ecosystem
463
+ Built with ❤️ for the Solana ecosystem
@@ -1 +1 @@
1
- {"version":3,"file":"WalletSection.d.ts","sourceRoot":"","sources":["../../src/components/WalletSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAG7C,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAkHtD,CAAC"}
1
+ {"version":3,"file":"WalletSection.d.ts","sourceRoot":"","sources":["../../src/components/WalletSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAG7C,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAqMtD,CAAC"}
@@ -1,4 +1,4 @@
1
1
  import { X402PaywallProps } from '../types';
2
- import * as React from "react";
2
+ import * as React from 'react';
3
3
  export declare const X402Paywall: React.FC<X402PaywallProps>;
4
4
  //# sourceMappingURL=X402Paywall.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"X402Paywall.d.ts","sourceRoot":"","sources":["../../src/components/X402Paywall.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA4B/B,OAAO,EAAE,gBAAgB,EAAiB,MAAM,SAAS,CAAC;AA0oD1D,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA2ClD,CAAC"}
1
+ {"version":3,"file":"X402Paywall.d.ts","sourceRoot":"","sources":["../../src/components/X402Paywall.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAY/B,OAAO,EAAE,gBAAgB,EAA8B,MAAM,SAAS,CAAC;AA20EvE,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAkClD,CAAC"}
@@ -1,4 +1,3 @@
1
-
2
1
  declare function App(): import("react/jsx-runtime").JSX.Element;
3
2
  export default App;
4
3
  //# sourceMappingURL=App.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/demo/App.tsx"],"names":[],"mappings":"AAYA,OAAO,4CAA4C,CAAC;AA0HpD,iBAAS,GAAG,4CAEX;AAED,eAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/demo/App.tsx"],"names":[],"mappings":"AAYA,OAAO,4CAA4C,CAAC;AA8HpD,iBAAS,GAAG,4CAEX;AAED,eAAe,GAAG,CAAC"}
@@ -1,2 +1 @@
1
-
2
1
  //# sourceMappingURL=main.d.ts.map
@@ -1,18 +1,21 @@
1
1
  import { WalletAdapter, SolanaNetwork, PaymentStatus } from '../types';
2
-
3
2
  export interface PaymentConfig {
4
3
  wallet: WalletAdapter;
5
4
  network: SolanaNetwork;
6
5
  rpcUrl?: string;
7
6
  apiEndpoint?: string;
8
- treasuryAddress?: string;
9
7
  facilitatorUrl?: string;
10
- maxPaymentAmount?: number;
8
+ /** Maximum payment amount in USDC (V2 protocol) */
9
+ amount?: number;
10
+ /** Enable verbose logging for debugging (default: false) */
11
+ verbose?: boolean;
11
12
  }
12
13
  export interface PaymentResult {
13
14
  transactionId: string | null;
14
15
  status: PaymentStatus;
15
16
  error: Error | null;
17
+ /** The response content from the server (HTML or JSON) */
18
+ responseContent: string | null;
16
19
  }
17
20
  export interface UseX402PaymentReturn {
18
21
  pay: (amount: number, description: string) => Promise<string | null>;
@@ -20,6 +23,8 @@ export interface UseX402PaymentReturn {
20
23
  status: PaymentStatus;
21
24
  error: Error | null;
22
25
  transactionId: string | null;
26
+ /** The response content from the server (HTML or JSON) */
27
+ responseContent: string | null;
23
28
  reset: () => void;
24
29
  }
25
30
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"useX402Payment.d.ts","sourceRoot":"","sources":["../../src/hooks/useX402Payment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,oBAAoB,CAqI1E"}
1
+ {"version":3,"file":"useX402Payment.d.ts","sourceRoot":"","sources":["../../src/hooks/useX402Payment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,0DAA0D;IAC1D,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,oBAAoB,CAyJ1E"}