fibx 0.1.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 +159 -0
- package/dist/chain/chains.d.ts +14 -0
- package/dist/chain/chains.d.ts.map +1 -0
- package/dist/chain/chains.js +21 -0
- package/dist/chain/chains.js.map +1 -0
- package/dist/chain/erc20.d.ts +6 -0
- package/dist/chain/erc20.d.ts.map +1 -0
- package/dist/chain/erc20.js +72 -0
- package/dist/chain/erc20.js.map +1 -0
- package/dist/chain/viem.d.ts +24029 -0
- package/dist/chain/viem.d.ts.map +1 -0
- package/dist/chain/viem.js +74 -0
- package/dist/chain/viem.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +85 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/address.d.ts +3 -0
- package/dist/commands/address.d.ts.map +1 -0
- package/dist/commands/address.js +15 -0
- package/dist/commands/address.js.map +1 -0
- package/dist/commands/auth-login.d.ts +3 -0
- package/dist/commands/auth-login.d.ts.map +1 -0
- package/dist/commands/auth-login.js +34 -0
- package/dist/commands/auth-login.js.map +1 -0
- package/dist/commands/auth-verify.d.ts +3 -0
- package/dist/commands/auth-verify.d.ts.map +1 -0
- package/dist/commands/auth-verify.js +64 -0
- package/dist/commands/auth-verify.js.map +1 -0
- package/dist/commands/balance.d.ts +3 -0
- package/dist/commands/balance.d.ts.map +1 -0
- package/dist/commands/balance.js +36 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +58 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +31 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/trade.d.ts +7 -0
- package/dist/commands/trade.d.ts.map +1 -0
- package/dist/commands/trade.js +69 -0
- package/dist/commands/trade.js.map +1 -0
- package/dist/commands/wallets.d.ts +3 -0
- package/dist/commands/wallets.d.ts.map +1 -0
- package/dist/commands/wallets.js +39 -0
- package/dist/commands/wallets.js.map +1 -0
- package/dist/fibrous/abi/base.d.ts +768 -0
- package/dist/fibrous/abi/base.d.ts.map +1 -0
- package/dist/fibrous/abi/base.js +984 -0
- package/dist/fibrous/abi/base.js.map +1 -0
- package/dist/fibrous/health.d.ts +11 -0
- package/dist/fibrous/health.d.ts.map +1 -0
- package/dist/fibrous/health.js +18 -0
- package/dist/fibrous/health.js.map +1 -0
- package/dist/fibrous/route.d.ts +47 -0
- package/dist/fibrous/route.d.ts.map +1 -0
- package/dist/fibrous/route.js +60 -0
- package/dist/fibrous/route.js.map +1 -0
- package/dist/fibrous/tokens.d.ts +10 -0
- package/dist/fibrous/tokens.d.ts.map +1 -0
- package/dist/fibrous/tokens.js +37 -0
- package/dist/fibrous/tokens.js.map +1 -0
- package/dist/format/output.d.ts +8 -0
- package/dist/format/output.d.ts.map +1 -0
- package/dist/format/output.js +69 -0
- package/dist/format/output.js.map +1 -0
- package/dist/utils/cache.d.ts +3 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +23 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config.d.ts +7 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +8 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/errors.d.ts +22 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +29 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/parseAmount.d.ts +3 -0
- package/dist/utils/parseAmount.d.ts.map +1 -0
- package/dist/utils/parseAmount.js +10 -0
- package/dist/utils/parseAmount.js.map +1 -0
- package/dist/utils/validation.d.ts +6 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +24 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/wallet/policy.d.ts +2 -0
- package/dist/wallet/policy.d.ts.map +1 -0
- package/dist/wallet/policy.js +3 -0
- package/dist/wallet/policy.js.map +1 -0
- package/dist/wallet/privy.d.ts +15 -0
- package/dist/wallet/privy.d.ts.map +1 -0
- package/dist/wallet/privy.js +63 -0
- package/dist/wallet/privy.js.map +1 -0
- package/dist/wallet/session.d.ts +15 -0
- package/dist/wallet/session.d.ts.map +1 -0
- package/dist/wallet/session.js +47 -0
- package/dist/wallet/session.js.map +1 -0
- package/package.json +57 -0
package/README.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# fibx
|
|
2
|
+
|
|
3
|
+
A command-line tool for specialized DeFi operations on **Base**, powered by [Fibrous Finance](https://fibrous.finance) aggregation and [Privy](https://privy.io) Server Wallets.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Privy Server Wallets**: Uses "Agentic" server-side wallets (ownerless) for seamless, automated signing without user interaction.
|
|
8
|
+
- **ETH & Token Transfers**: Send ETH or any ERC-20 token with a simple command.
|
|
9
|
+
- **Fibrous Aggregation**: Execute token swaps with optimal routing and auto-slippage protection.
|
|
10
|
+
- **Automated Auth Flow**: One-time email OTP login provisions a persistent server wallet linked to your user profile.
|
|
11
|
+
- **JSON Output**: All commands support `--json` for easy integration into scripts and pipelines.
|
|
12
|
+
|
|
13
|
+
## Requirements
|
|
14
|
+
|
|
15
|
+
- Node.js ≥ 20
|
|
16
|
+
- pnpm
|
|
17
|
+
- Privy App ID and Secret (from [dashboard.privy.io](https://dashboard.privy.io))
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
### 1. Install Dependencies
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pnpm install
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 2. Configure Environment
|
|
28
|
+
|
|
29
|
+
Copy the example environment file and add your Privy credentials:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
cp .env.example .env
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Edit `.env`:
|
|
36
|
+
|
|
37
|
+
```env
|
|
38
|
+
PRIVY_APP_ID=your_app_id
|
|
39
|
+
PRIVY_APP_SECRET=your_app_secret
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 3. Authenticate & Provision Wallet
|
|
43
|
+
|
|
44
|
+
This two-step process links your email to a server-side wallet.
|
|
45
|
+
|
|
46
|
+
**Step 1: Request OTP**
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pnpm dev auth login <email>
|
|
50
|
+
# Example:
|
|
51
|
+
pnpm dev auth login user@example.com
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Step 2: Verify & Create Session**
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
pnpm dev auth verify <email> <code>
|
|
58
|
+
# Example:
|
|
59
|
+
pnpm dev auth verify user@example.com 123456
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
_Successfully verifying will create a local session file and provision a Server Wallet if one doesn't exist._
|
|
63
|
+
|
|
64
|
+
### 4. Check Status
|
|
65
|
+
|
|
66
|
+
Verify that you are authenticated and the API is healthy:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pnpm dev status
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Usage
|
|
73
|
+
|
|
74
|
+
### Check Balance
|
|
75
|
+
|
|
76
|
+
View your ETH and USDC balances on Base:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pnpm dev balance
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Send Tokens
|
|
83
|
+
|
|
84
|
+
Transfer ETH or ERC-20 tokens to another address.
|
|
85
|
+
|
|
86
|
+
**Send ETH (Default):**
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
pnpm dev send 0.001 0xRecipientAddress
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Send ERC-20 (e.g., USDC):**
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
pnpm dev send 10 0xRecipientAddress USDC
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Swap Tokens
|
|
99
|
+
|
|
100
|
+
Swap tokens using Fibrous Finance's aggregator.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
pnpm dev trade <amount> <from_token> <to_token>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Examples:**
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Swap 0.0001 ETH to USDC
|
|
110
|
+
pnpm dev trade 0.0001 ETH USDC
|
|
111
|
+
|
|
112
|
+
# Swap 20 USDC to DAI
|
|
113
|
+
pnpm dev trade 20 USDC DAI
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Options:**
|
|
117
|
+
|
|
118
|
+
- `--slippage <number>`: Set slippage tolerance (default: 0.5%)
|
|
119
|
+
- `--json`: Output result as JSON
|
|
120
|
+
|
|
121
|
+
### View Wallet Address
|
|
122
|
+
|
|
123
|
+
Print your connected server wallet address:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
pnpm dev address
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
# Architecture
|
|
130
|
+
|
|
131
|
+
This CLI uses a **Server Wallet** architecture:
|
|
132
|
+
|
|
133
|
+
1. **Privy**: Manages the embedded wallets. We use "Ownerless" wallets (Agents) that are controlled via the Privy App Secret, allowing the CLI to sign transactions programmatically without requiring a user-side browser or JWT.
|
|
134
|
+
2. **Viem**: Handles all blockchain interactions (RPC calls, transaction signing) using a custom Privy-backed account.
|
|
135
|
+
3. **Fibrous**: Provides the routing and calldata for optimal token swaps on Base.
|
|
136
|
+
|
|
137
|
+
## Project Structure
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
src/
|
|
141
|
+
├── cli.ts # Entry point & Command definitions
|
|
142
|
+
├── commands/ # Command implementation logic
|
|
143
|
+
│ ├── auth-login.ts # Step 1: Request OTP
|
|
144
|
+
│ ├── auth-verify.ts # Step 2: Verify & Provision Wallet
|
|
145
|
+
│ ├── trade.ts # Swap logic via Fibrous
|
|
146
|
+
│ ├── send.ts # ETH/ERC20 transfer logic
|
|
147
|
+
│ └── ...
|
|
148
|
+
├── chain/ # Blockchain layer
|
|
149
|
+
│ └── viem.ts # Viem client & Custom Privy Account
|
|
150
|
+
├── wallet/ # Wallet management
|
|
151
|
+
│ ├── privy.ts # Privy SDK integration (Server Wallets)
|
|
152
|
+
│ └── session.ts # Local session management
|
|
153
|
+
├── fibrous/ # Fibrous API integration
|
|
154
|
+
└── utils/ # Config, validation, and helpers
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## License
|
|
158
|
+
|
|
159
|
+
MIT
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Abi } from "viem";
|
|
2
|
+
import { base } from "viem/chains";
|
|
3
|
+
export interface ChainConfig {
|
|
4
|
+
id: number;
|
|
5
|
+
name: string;
|
|
6
|
+
viemChain: typeof base;
|
|
7
|
+
rpcUrl: string;
|
|
8
|
+
nativeTokenAddress: string;
|
|
9
|
+
fibrousNetwork: string;
|
|
10
|
+
routerAbi: Abi;
|
|
11
|
+
}
|
|
12
|
+
export declare const SUPPORTED_CHAINS: Record<string, ChainConfig>;
|
|
13
|
+
export declare function getChainConfig(network: string): ChainConfig;
|
|
14
|
+
//# sourceMappingURL=chains.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../src/chain/chains.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,GAAG,CAAC;CACf;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAUxD,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAQ3D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { base } from "viem/chains";
|
|
2
|
+
import { baseRouterAbi } from "../fibrous/abi/base.js";
|
|
3
|
+
export const SUPPORTED_CHAINS = {
|
|
4
|
+
base: {
|
|
5
|
+
id: 8453,
|
|
6
|
+
name: "base",
|
|
7
|
+
viemChain: base,
|
|
8
|
+
rpcUrl: "https://mainnet.base.org",
|
|
9
|
+
nativeTokenAddress: "0x0000000000000000000000000000000000000000",
|
|
10
|
+
fibrousNetwork: "base",
|
|
11
|
+
routerAbi: baseRouterAbi,
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
export function getChainConfig(network) {
|
|
15
|
+
const config = SUPPORTED_CHAINS[network];
|
|
16
|
+
if (!config) {
|
|
17
|
+
throw new Error(`Unsupported chain: ${network}. Supported: ${Object.keys(SUPPORTED_CHAINS).join(", ")}`);
|
|
18
|
+
}
|
|
19
|
+
return config;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=chains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/chain/chains.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAYvD,MAAM,CAAC,MAAM,gBAAgB,GAAgC;IAC5D,IAAI,EAAE;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,0BAA0B;QAClC,kBAAkB,EAAE,4CAA4C;QAChE,cAAc,EAAE,MAAM;QACtB,SAAS,EAAE,aAAoB;KAC/B;CACD,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,sBAAsB,OAAO,gBAAgB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Address } from "viem";
|
|
2
|
+
export declare function getERC20Balance(tokenAddress: Address, walletAddress: Address): Promise<bigint>;
|
|
3
|
+
export declare function encodeTransfer(to: Address, amount: bigint): `0x${string}`;
|
|
4
|
+
export declare function encodeApprove(spender: Address, amount: bigint): `0x${string}`;
|
|
5
|
+
export declare function getAllowance(tokenAddress: Address, owner: Address, spender: Address): Promise<bigint>;
|
|
6
|
+
//# sourceMappingURL=erc20.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc20.d.ts","sourceRoot":"","sources":["../../src/chain/erc20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AA2CxD,wBAAsB,eAAe,CACpC,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,OAAO,GACpB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAMzE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAM7E;AAED,wBAAsB,YAAY,CACjC,YAAY,EAAE,OAAO,EACrB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,MAAM,CAAC,CAOjB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { encodeFunctionData } from "viem";
|
|
2
|
+
import { publicClient } from "./viem.js";
|
|
3
|
+
const ERC20_ABI = [
|
|
4
|
+
{
|
|
5
|
+
name: "balanceOf",
|
|
6
|
+
type: "function",
|
|
7
|
+
stateMutability: "view",
|
|
8
|
+
inputs: [{ name: "account", type: "address" }],
|
|
9
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: "transfer",
|
|
13
|
+
type: "function",
|
|
14
|
+
stateMutability: "nonpayable",
|
|
15
|
+
inputs: [
|
|
16
|
+
{ name: "to", type: "address" },
|
|
17
|
+
{ name: "amount", type: "uint256" },
|
|
18
|
+
],
|
|
19
|
+
outputs: [{ name: "", type: "bool" }],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: "approve",
|
|
23
|
+
type: "function",
|
|
24
|
+
stateMutability: "nonpayable",
|
|
25
|
+
inputs: [
|
|
26
|
+
{ name: "spender", type: "address" },
|
|
27
|
+
{ name: "amount", type: "uint256" },
|
|
28
|
+
],
|
|
29
|
+
outputs: [{ name: "", type: "bool" }],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "allowance",
|
|
33
|
+
type: "function",
|
|
34
|
+
stateMutability: "view",
|
|
35
|
+
inputs: [
|
|
36
|
+
{ name: "owner", type: "address" },
|
|
37
|
+
{ name: "spender", type: "address" },
|
|
38
|
+
],
|
|
39
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
export async function getERC20Balance(tokenAddress, walletAddress) {
|
|
43
|
+
return publicClient.readContract({
|
|
44
|
+
address: tokenAddress,
|
|
45
|
+
abi: ERC20_ABI,
|
|
46
|
+
functionName: "balanceOf",
|
|
47
|
+
args: [walletAddress],
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
export function encodeTransfer(to, amount) {
|
|
51
|
+
return encodeFunctionData({
|
|
52
|
+
abi: ERC20_ABI,
|
|
53
|
+
functionName: "transfer",
|
|
54
|
+
args: [to, amount],
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
export function encodeApprove(spender, amount) {
|
|
58
|
+
return encodeFunctionData({
|
|
59
|
+
abi: ERC20_ABI,
|
|
60
|
+
functionName: "approve",
|
|
61
|
+
args: [spender, amount],
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export async function getAllowance(tokenAddress, owner, spender) {
|
|
65
|
+
return publicClient.readContract({
|
|
66
|
+
address: tokenAddress,
|
|
67
|
+
abi: ERC20_ABI,
|
|
68
|
+
functionName: "allowance",
|
|
69
|
+
args: [owner, spender],
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=erc20.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../src/chain/erc20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,MAAM,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,SAAS,GAAG;IACjB;QACC,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACxC;IACD;QACC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE;YACP,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;YAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACnC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACrC;IACD;QACC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE;YACP,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACnC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACrC;IACD;QACC,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE;YACP,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;YAClC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;SACpC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACxC;CACQ,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,YAAqB,EACrB,aAAsB;IAEtB,OAAO,YAAY,CAAC,YAAY,CAAC;QAChC,OAAO,EAAE,YAAY;QACrB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE,CAAC,aAAa,CAAC;KACrB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAW,EAAE,MAAc;IACzD,OAAO,kBAAkB,CAAC;QACzB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,UAAU;QACxB,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,MAAc;IAC7D,OAAO,kBAAkB,CAAC;QACzB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,SAAS;QACvB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,YAAqB,EACrB,KAAc,EACd,OAAgB;IAEhB,OAAO,YAAY,CAAC,YAAY,CAAC;QAChC,OAAO,EAAE,YAAY;QACrB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;KACtB,CAAC,CAAC;AACJ,CAAC"}
|