crypull-cli 0.0.0-stage → 1.0.2

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/dist/cli.js ADDED
@@ -0,0 +1,373 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli.ts
4
+ import { Command } from "commander";
5
+ import pc from "picocolors";
6
+ import * as asciichart from "asciichart";
7
+ import { crypull } from "crypull";
8
+ import { intro, outro, select, text, isCancel } from "@clack/prompts";
9
+ var program = new Command();
10
+ program.name("crypull").description("A human-friendly CLI to fetch crypto prices and info from multiple providers").version("1.0.2");
11
+ var handlePrice = async (query, network) => {
12
+ console.log(pc.cyan(`
13
+ Fetching price for ${pc.bold(query)}...`));
14
+ const data = await crypull.price(query, network);
15
+ if (!data) {
16
+ console.log(pc.red(`
17
+ \u2716 Could not find price for "${query}".`));
18
+ return;
19
+ }
20
+ console.log(pc.green(`
21
+ \u2714 Success! Found via ${pc.bold(data.source)}`));
22
+ console.log(pc.white(`----------------------------------------`));
23
+ console.log(`${pc.gray("Symbol:")} ${pc.yellow(pc.bold(data.symbol))}`);
24
+ console.log(`${pc.gray("Price:")} ${pc.green("$" + data.priceUsd.toLocaleString(void 0, { maximumFractionDigits: 6 }))}`);
25
+ console.log(`${pc.gray("Updated:")} ${new Date(data.lastUpdated).toLocaleTimeString()}`);
26
+ console.log(pc.white(`----------------------------------------
27
+ `));
28
+ };
29
+ var handleInfo = async (query, network) => {
30
+ console.log(pc.cyan(`
31
+ Fetching detailed info for ${pc.bold(query)}...`));
32
+ const data = await crypull.info(query, network);
33
+ if (!data) {
34
+ console.log(pc.red(`
35
+ \u2716 Could not find info for "${query}".`));
36
+ return;
37
+ }
38
+ console.log(pc.green(`
39
+ \u2714 Success! Found via ${pc.bold(data.source)}`));
40
+ console.log(pc.white(`----------------------------------------`));
41
+ console.log(`${pc.gray("Name:")} ${pc.white(pc.bold(data.name))}`);
42
+ console.log(`${pc.gray("Symbol:")} ${pc.yellow(pc.bold(data.symbol))}`);
43
+ console.log(`${pc.gray("Price:")} ${pc.green("$" + data.priceUsd.toLocaleString(void 0, { maximumFractionDigits: 6 }))}`);
44
+ if (data.marketCap) {
45
+ console.log(`${pc.gray("MarketCap:")} ${pc.white("$" + data.marketCap.toLocaleString())}`);
46
+ }
47
+ if (data.marketCapRank) {
48
+ console.log(`${pc.gray("Rank:")} ${pc.magenta("#" + data.marketCapRank)}`);
49
+ }
50
+ if (data.fdv) {
51
+ console.log(`${pc.gray("FDV:")} ${pc.white("$" + data.fdv.toLocaleString())}`);
52
+ }
53
+ if (data.circulatingSupply) {
54
+ console.log(`${pc.gray("Circ. Sup:")} ${pc.white(data.circulatingSupply.toLocaleString())}`);
55
+ }
56
+ if (data.totalSupply) {
57
+ console.log(`${pc.gray("Total Sup:")} ${pc.white(data.totalSupply.toLocaleString())}`);
58
+ }
59
+ if (data.maxSupply) {
60
+ console.log(`${pc.gray("Max Sup:")} ${pc.white(data.maxSupply.toLocaleString())}`);
61
+ }
62
+ if (data.volume24h) {
63
+ console.log(`${pc.gray("24h Vol:")} ${pc.white("$" + data.volume24h.toLocaleString())}`);
64
+ }
65
+ if (data.priceChangePercentage24h !== void 0) {
66
+ const pc24 = data.priceChangePercentage24h;
67
+ const color = pc24 >= 0 ? pc.green : pc.red;
68
+ console.log(`${pc.gray("24h %:")} ${color(pc24.toFixed(2) + "%")}`);
69
+ }
70
+ if (data.liquidityUsd) {
71
+ console.log(`${pc.gray("Liquidity:")} ${pc.white("$" + data.liquidityUsd.toLocaleString())}`);
72
+ }
73
+ if (data.ath) {
74
+ console.log(`${pc.gray("ATH:")} ${pc.green("$" + data.ath.toLocaleString())} ${data.athDate ? pc.gray(`(${new Date(data.athDate).toLocaleDateString()})`) : ""}`);
75
+ }
76
+ if (data.atl) {
77
+ console.log(`${pc.gray("ATL:")} ${pc.red("$" + data.atl.toLocaleString())} ${data.atlDate ? pc.gray(`(${new Date(data.atlDate).toLocaleDateString()})`) : ""}`);
78
+ }
79
+ if (data.network) {
80
+ console.log(`${pc.gray("Network:")} ${pc.magenta(data.network)}`);
81
+ }
82
+ if (data.address) {
83
+ console.log(`${pc.gray("Address:")} ${pc.gray(data.address)}`);
84
+ }
85
+ if (data.links && Object.values(data.links).some((l) => !!l)) {
86
+ console.log(pc.white(`
87
+ --- Links ---`));
88
+ if (data.links.website) console.log(`${pc.gray("Website:")} ${pc.blue(data.links.website)}`);
89
+ if (data.links.twitter) console.log(`${pc.gray("Twitter:")} ${pc.blue(data.links.twitter)}`);
90
+ if (data.links.telegram) console.log(`${pc.gray("Telegram:")} ${pc.blue(data.links.telegram)}`);
91
+ if (data.links.discord) console.log(`${pc.gray("Discord:")} ${pc.blue(data.links.discord)}`);
92
+ if (data.links.github) console.log(`${pc.gray("GitHub:")} ${pc.blue(data.links.github)}`);
93
+ }
94
+ if (data.description && data.description.length > 0) {
95
+ console.log(pc.white(`
96
+ --- Description ---`));
97
+ const desc = data.description.replace(/(<([^>]+)>)/gi, "");
98
+ const truncated = desc.length > 300 ? desc.substring(0, 300) + "..." : desc;
99
+ console.log(pc.gray(truncated));
100
+ }
101
+ if (data.pairs && data.pairs.length > 0) {
102
+ console.log(pc.white(`
103
+ --- Top Trading Pairs ---`));
104
+ data.pairs.slice(0, 5).forEach((p, i) => {
105
+ const title = `${p.baseTokenSymbol}/${p.quoteTokenSymbol}`;
106
+ const priceStr = p.priceUsd ? `$${p.priceUsd.toLocaleString(void 0, { maximumFractionDigits: 6 })}` : "N/A";
107
+ const volStr = p.volume24h ? `$${p.volume24h.toLocaleString(void 0, { maximumFractionDigits: 0 })}` : "N/A";
108
+ console.log(`${pc.blue(String(i + 1) + ".")} ${pc.yellow(title.padEnd(12, " "))} | ${pc.green(priceStr.padEnd(12, " "))} | Vol: ${pc.white(volStr)} | DEX: ${pc.magenta(p.dexId)}`);
109
+ });
110
+ }
111
+ console.log(pc.white(`
112
+ ----------------------------------------`));
113
+ console.log(`${pc.gray("Updated:")} ${new Date(data.lastUpdated).toLocaleTimeString()}`);
114
+ console.log(pc.white(`----------------------------------------
115
+ `));
116
+ };
117
+ var handleTop = async () => {
118
+ console.log(pc.cyan(`
119
+ Fetching top 50 cryptocurrencies...`));
120
+ const results = await crypull.top();
121
+ if (!results || results.length === 0) {
122
+ console.log(pc.red(`
123
+ \u2716 Could not fetch top coins at this time.`));
124
+ return;
125
+ }
126
+ console.log(pc.green(`
127
+ \u2714 Top 50 Cryptocurrencies:`));
128
+ console.log(pc.white(`----------------------------------------`));
129
+ results.forEach((res, i) => {
130
+ const priceStr = res.priceUsd ? `$${res.priceUsd.toLocaleString(void 0, { maximumFractionDigits: 6 })}` : "N/A";
131
+ const mcapStr = res.marketCap ? `$${res.marketCap.toLocaleString()}` : "N/A";
132
+ let changeStr = "";
133
+ if (res.priceChange24h !== void 0 && res.priceChange24h !== null) {
134
+ const color = res.priceChange24h >= 0 ? pc.green : pc.red;
135
+ changeStr = color(`(${res.priceChange24h >= 0 ? "+" : ""}${res.priceChange24h.toFixed(2)}%)`);
136
+ }
137
+ console.log(`${pc.blue(String(i + 1).padStart(2, " "))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, " ")))} | ${pc.green(priceStr.padEnd(12, " "))} ${changeStr.padEnd(15, " ")} | Mcap: ${pc.white(mcapStr)}`);
138
+ });
139
+ console.log(pc.white(`----------------------------------------
140
+ `));
141
+ };
142
+ var handleSearch = async (query) => {
143
+ console.log(pc.cyan(`
144
+ Searching for ${pc.bold(query)}...`));
145
+ const results = await crypull.search(query);
146
+ if (!results || results.length === 0) {
147
+ console.log(pc.red(`
148
+ \u2716 No results found for "${query}".`));
149
+ return;
150
+ }
151
+ console.log(pc.green(`
152
+ \u2714 Found ${results.length} results:`));
153
+ console.log(pc.white(`----------------------------------------`));
154
+ results.forEach((res, i) => {
155
+ console.log(`${pc.blue(String(i + 1).padStart(2, " "))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, " ")))} | ${pc.white(res.name)} ${pc.gray(`(via ${res.source})`)}`);
156
+ if (res.network) {
157
+ console.log(` ${pc.gray("Network:")} ${pc.magenta(res.network)}`);
158
+ }
159
+ if (res.id && res.id.length > 20) {
160
+ console.log(` ${pc.gray("Address:")} ${pc.gray(res.id)}`);
161
+ }
162
+ });
163
+ console.log(pc.white(`----------------------------------------
164
+ `));
165
+ };
166
+ var handleTrending = async () => {
167
+ console.log(pc.cyan(`
168
+ Fetching top trending coins...`));
169
+ const results = await crypull.trending();
170
+ if (!results || results.length === 0) {
171
+ console.log(pc.red(`
172
+ \u2716 Could not fetch trending data at this time.`));
173
+ return;
174
+ }
175
+ console.log(pc.green(`
176
+ \u2714 Top 10 Trending Coins:`));
177
+ console.log(pc.white(`----------------------------------------`));
178
+ results.forEach((res, i) => {
179
+ const priceStr = res.priceUsd ? `$${res.priceUsd.toLocaleString(void 0, { maximumFractionDigits: 6 })}` : "N/A";
180
+ let changeStr = "";
181
+ if (res.priceChange24h !== void 0) {
182
+ const color = res.priceChange24h >= 0 ? pc.green : pc.red;
183
+ changeStr = color(`(${res.priceChange24h >= 0 ? "+" : ""}${res.priceChange24h.toFixed(2)}%)`);
184
+ }
185
+ const rankStr = res.marketCapRank ? pc.magenta(`#${res.marketCapRank}`) : "";
186
+ console.log(`${pc.blue(String(i + 1).padStart(2, " "))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, " ")))} | ${pc.green(priceStr.padEnd(12, " "))} ${changeStr.padEnd(15, " ")} | ${rankStr}`);
187
+ });
188
+ console.log(pc.white(`----------------------------------------
189
+ `));
190
+ };
191
+ var handleMarket = async () => {
192
+ console.log(pc.cyan(`
193
+ Fetching global market data...`));
194
+ const data = await crypull.market();
195
+ if (!data) {
196
+ console.log(pc.red(`
197
+ \u2716 Could not fetch global market data at this time.`));
198
+ return;
199
+ }
200
+ console.log(pc.green(`
201
+ \u2714 Global Market Overview:`));
202
+ console.log(pc.white(`----------------------------------------`));
203
+ console.log(`${pc.gray("Total Market Cap:")} ${pc.white("$" + data.totalMarketCapUsd.toLocaleString())}`);
204
+ console.log(`${pc.gray("24h Volume:")} ${pc.white("$" + data.totalVolume24hUsd.toLocaleString())}`);
205
+ console.log(`${pc.gray("BTC Dominance:")} ${pc.yellow(data.bitcoinDominancePercentage.toFixed(2) + "%")}`);
206
+ console.log(`${pc.gray("ETH Dominance:")} ${pc.blue(data.ethereumDominancePercentage.toFixed(2) + "%")}`);
207
+ console.log(`${pc.gray("Active Coins:")} ${pc.white(data.activeCryptocurrencies.toLocaleString())}`);
208
+ console.log(pc.white(`----------------------------------------`));
209
+ console.log(`${pc.gray("Updated:")} ${new Date(data.lastUpdated).toLocaleTimeString()}`);
210
+ console.log(pc.white(`----------------------------------------
211
+ `));
212
+ };
213
+ var handleSentiment = async () => {
214
+ console.log(pc.cyan(`
215
+ Fetching Fear & Greed Index...`));
216
+ const data = await crypull.sentiment();
217
+ if (!data) {
218
+ console.log(pc.red(`
219
+ \u2716 Could not fetch sentiment data at this time.`));
220
+ return;
221
+ }
222
+ const value = data.value;
223
+ let color = pc.white;
224
+ if (value <= 25) color = pc.red;
225
+ else if (value <= 45) color = pc.yellow;
226
+ else if (value <= 55) color = pc.white;
227
+ else if (value <= 75) color = pc.green;
228
+ else color = pc.blue;
229
+ console.log(pc.green(`
230
+ \u2714 Current Market Sentiment:`));
231
+ console.log(pc.white(`----------------------------------------`));
232
+ console.log(`${pc.gray("Score:")} ${color(pc.bold(value.toString()) + " / 100")}`);
233
+ console.log(`${pc.gray("Classification:")} ${color(pc.bold(data.classification))}`);
234
+ console.log(pc.white(`----------------------------------------
235
+ `));
236
+ };
237
+ var handleGas = async () => {
238
+ console.log(pc.cyan(`
239
+ Fetching network gas prices...`));
240
+ const data = await crypull.gas();
241
+ if (!data) {
242
+ console.log(pc.red(`
243
+ \u2716 Could not fetch gas prices at this time.`));
244
+ return;
245
+ }
246
+ console.log(pc.green(`
247
+ \u2714 ${data.network} Gas Tracker (Gwei):`));
248
+ console.log(pc.white(`----------------------------------------`));
249
+ console.log(`${pc.gray("Low (Safe):")} ${pc.green(data.low + " gwei")}`);
250
+ console.log(`${pc.gray("Average:")} ${pc.yellow(data.average + " gwei")}`);
251
+ console.log(`${pc.gray("High (Fast):")} ${pc.red(data.high + " gwei")}`);
252
+ if (data.baseFee) {
253
+ console.log(`${pc.gray("Base Fee:")} ${pc.white(data.baseFee + " gwei")}`);
254
+ }
255
+ console.log(pc.white(`----------------------------------------
256
+ `));
257
+ };
258
+ var handleChart = async (query, options) => {
259
+ const days = parseInt(options.days, 10) || 7;
260
+ console.log(pc.cyan(`
261
+ Fetching ${days}-day chart data for ${pc.bold(query)}...`));
262
+ const data = await crypull.chart(query, days);
263
+ if (!data || !data.prices || data.prices.length === 0) {
264
+ console.log(pc.red(`
265
+ \u2716 Could not fetch chart data for "${query}". Note: Charts may only be available for major coins.`));
266
+ return;
267
+ }
268
+ const firstPrice = data.prices[0];
269
+ const lastPrice = data.prices[data.prices.length - 1];
270
+ const isUp = lastPrice >= firstPrice;
271
+ const chartConfig = {
272
+ colors: [isUp ? asciichart.lightgreen : asciichart.lightred],
273
+ height: 10
274
+ };
275
+ console.log(pc.green(`
276
+ \u2714 ${days}-Day Chart for ${query.toUpperCase()}:`));
277
+ console.log(pc.gray(`Min: $${data.minPrice.toLocaleString(void 0, { maximumFractionDigits: 6 })} | Max: $${data.maxPrice.toLocaleString(void 0, { maximumFractionDigits: 6 })}`));
278
+ console.log(pc.white(`
279
+ ` + asciichart.plot(data.prices, chartConfig) + `
280
+ `));
281
+ };
282
+ var handleDonate = () => {
283
+ console.log(pc.cyan(`
284
+ \u{1F496} Support the development of crypull:`));
285
+ console.log(pc.white(`----------------------------------------`));
286
+ console.log(`${pc.yellow("BTC:")} ${pc.white("bc1qj4zt3lva4r68xspayg0p8s4hyg40nhjz8fuhqq")}`);
287
+ console.log(`${pc.blue("EVM (All):")} ${pc.white("0x63a875d0c4Dad8E18B95D844caE6FF915dF0a2BD")}`);
288
+ console.log(`${pc.green("Solana:")} ${pc.white("8J5VvZu6ayQa4XnSAAzx4YX3QsXYyyNrP4Zr7JEx1KFY")}`);
289
+ console.log(`${pc.red("TRX:")} ${pc.white("TPgZSrHUhKdjyMwaGd15utJvsbk85oBbit")}`);
290
+ console.log(pc.white(`----------------------------------------
291
+ `));
292
+ };
293
+ program.command("price <query>").description("Get the current price of a cryptocurrency (symbol or contract address)").option("-n, --network <network>", "DEX network for contract addresses (e.g. eth, bsc, solana)").action((query, opts) => handlePrice(query, opts.network));
294
+ program.command("info <query>").description("Get detailed info about a cryptocurrency (market cap, volume, FDV, etc.)").option("-n, --network <network>", "DEX network for contract addresses (e.g. eth, bsc, solana)").action((query, opts) => handleInfo(query, opts.network));
295
+ program.command("top").description("Show top 50 cryptocurrencies by market cap").action(handleTop);
296
+ program.command("search <query>").description("Search for tokens or coins across multiple providers").action(handleSearch);
297
+ program.command("trending").description("Show top 10 trending coins/tokens right now").action(handleTrending);
298
+ program.command("market").description("Show global cryptocurrency market overview").action(handleMarket);
299
+ program.command("sentiment").description("Show current Crypto Fear & Greed Index").action(handleSentiment);
300
+ program.command("gas").description("Show current Ethereum network gas prices").action(handleGas);
301
+ program.command("chart <query>").description("Draw a terminal ASCII chart of historical prices").option("-d, --days <days>", "Number of days to chart", "7").action(handleChart);
302
+ program.command("donate").description("Show donation addresses to support development").action(handleDonate);
303
+ async function interactiveMode() {
304
+ console.clear();
305
+ intro(pc.bgCyan(pc.black(" crypull CLI ")));
306
+ while (true) {
307
+ const action = await select({
308
+ message: "What would you like to do?",
309
+ options: [
310
+ { value: "price", label: "\u{1F4B0} Get token price" },
311
+ { value: "info", label: "\u2139\uFE0F Get detailed token info" },
312
+ { value: "top", label: "\u{1F3C6} Show top 50 cryptocurrencies" },
313
+ { value: "search", label: "\u{1F50D} Search for a token" },
314
+ { value: "trending", label: "\u{1F525} Show trending coins" },
315
+ { value: "market", label: "\u{1F30D} Show global market overview" },
316
+ { value: "sentiment", label: "\u{1F3AD} Show Fear & Greed Index" },
317
+ { value: "gas", label: "\u26FD Show ETH gas prices" },
318
+ { value: "chart", label: "\u{1F4C8} Show historical price chart" },
319
+ { value: "donate", label: "\u{1F496} Donate / Support" },
320
+ { value: "exit", label: "\u274C Exit" }
321
+ ]
322
+ });
323
+ if (isCancel(action) || action === "exit") {
324
+ outro("Goodbye!");
325
+ process.exit(0);
326
+ }
327
+ if (["price", "info", "search", "chart"].includes(action)) {
328
+ const query = await text({
329
+ message: "Enter token symbol or contract address:",
330
+ placeholder: "e.g., btc, ethereum, 0x...",
331
+ validate: (value) => {
332
+ if (!value) return "Please enter a valid query.";
333
+ }
334
+ });
335
+ if (isCancel(query)) {
336
+ outro("Goodbye!");
337
+ process.exit(0);
338
+ }
339
+ if (action === "price") await handlePrice(query);
340
+ else if (action === "info") await handleInfo(query);
341
+ else if (action === "search") await handleSearch(query);
342
+ else if (action === "chart") {
343
+ const days = await text({
344
+ message: "Enter number of days for the chart (default 7):",
345
+ placeholder: "7",
346
+ defaultValue: "7"
347
+ });
348
+ if (isCancel(days)) {
349
+ outro("Goodbye!");
350
+ process.exit(0);
351
+ }
352
+ await handleChart(query, { days });
353
+ }
354
+ } else {
355
+ if (action === "top") await handleTop();
356
+ else if (action === "trending") await handleTrending();
357
+ else if (action === "market") await handleMarket();
358
+ else if (action === "sentiment") await handleSentiment();
359
+ else if (action === "gas") await handleGas();
360
+ else if (action === "donate") handleDonate();
361
+ }
362
+ console.log(pc.gray("\n---\n"));
363
+ }
364
+ }
365
+ if (process.argv.length <= 2) {
366
+ interactiveMode().catch((err) => {
367
+ console.error(pc.red("An error occurred:"), err);
368
+ process.exit(1);
369
+ });
370
+ } else {
371
+ program.parse(process.argv);
372
+ }
373
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\r\nimport { Command } from 'commander';\r\nimport pc from 'picocolors';\r\nimport * as asciichart from 'asciichart';\r\nimport { crypull } from 'crypull';\r\nimport { intro, outro, select, text, isCancel } from '@clack/prompts';\r\n\r\ndeclare const __CRYPULL_VERSION__: string;\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .name('crypull')\r\n .description('A human-friendly CLI to fetch crypto prices and info from multiple providers')\r\n .version(__CRYPULL_VERSION__);\r\n\r\nconst handlePrice = async (query: string, network?: string) => {\r\n console.log(pc.cyan(`\\nFetching price for ${pc.bold(query)}...`));\r\n\r\n const data = await crypull.price(query, network);\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not find price for \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Success! Found via ${pc.bold(data.source)}`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Symbol:')} ${pc.yellow(pc.bold(data.symbol))}`);\r\n console.log(`${pc.gray('Price:')} ${pc.green('$' + data.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 }))}`);\r\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleInfo = async (query: string, network?: string) => {\r\n console.log(pc.cyan(`\\nFetching detailed info for ${pc.bold(query)}...`));\r\n\r\n const data = await crypull.info(query, network);\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not find info for \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Success! Found via ${pc.bold(data.source)}`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Name:')} ${pc.white(pc.bold(data.name))}`);\r\n console.log(`${pc.gray('Symbol:')} ${pc.yellow(pc.bold(data.symbol))}`);\r\n console.log(`${pc.gray('Price:')} ${pc.green('$' + data.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 }))}`);\r\n\r\n if (data.marketCap) {\r\n console.log(`${pc.gray('MarketCap:')} ${pc.white('$' + data.marketCap.toLocaleString())}`);\r\n }\r\n if (data.marketCapRank) {\r\n console.log(`${pc.gray('Rank:')} ${pc.magenta('#' + data.marketCapRank)}`);\r\n }\r\n if (data.fdv) {\r\n console.log(`${pc.gray('FDV:')} ${pc.white('$' + data.fdv.toLocaleString())}`);\r\n }\r\n if (data.circulatingSupply) {\r\n console.log(`${pc.gray('Circ. Sup:')} ${pc.white(data.circulatingSupply.toLocaleString())}`);\r\n }\r\n if (data.totalSupply) {\r\n console.log(`${pc.gray('Total Sup:')} ${pc.white(data.totalSupply.toLocaleString())}`);\r\n }\r\n if (data.maxSupply) {\r\n console.log(`${pc.gray('Max Sup:')} ${pc.white(data.maxSupply.toLocaleString())}`);\r\n }\r\n if (data.volume24h) {\r\n console.log(`${pc.gray('24h Vol:')} ${pc.white('$' + data.volume24h.toLocaleString())}`);\r\n }\r\n if (data.priceChangePercentage24h !== undefined) {\r\n const pc24 = data.priceChangePercentage24h;\r\n const color = pc24 >= 0 ? pc.green : pc.red;\r\n console.log(`${pc.gray('24h %:')} ${color(pc24.toFixed(2) + '%')}`);\r\n }\r\n if (data.liquidityUsd) {\r\n console.log(`${pc.gray('Liquidity:')} ${pc.white('$' + data.liquidityUsd.toLocaleString())}`);\r\n }\r\n if (data.ath) {\r\n console.log(`${pc.gray('ATH:')} ${pc.green('$' + data.ath.toLocaleString())} ${data.athDate ? pc.gray(`(${new Date(data.athDate).toLocaleDateString()})`) : ''}`);\r\n }\r\n if (data.atl) {\r\n console.log(`${pc.gray('ATL:')} ${pc.red('$' + data.atl.toLocaleString())} ${data.atlDate ? pc.gray(`(${new Date(data.atlDate).toLocaleDateString()})`) : ''}`);\r\n }\r\n if (data.network) {\r\n console.log(`${pc.gray('Network:')} ${pc.magenta(data.network)}`);\r\n }\r\n if (data.address) {\r\n console.log(`${pc.gray('Address:')} ${pc.gray(data.address)}`);\r\n }\r\n\r\n if (data.links && Object.values(data.links).some((l) => !!l)) {\r\n console.log(pc.white(`\\n--- Links ---`));\r\n if (data.links.website) console.log(`${pc.gray('Website:')} ${pc.blue(data.links.website)}`);\r\n if (data.links.twitter) console.log(`${pc.gray('Twitter:')} ${pc.blue(data.links.twitter)}`);\r\n if (data.links.telegram) console.log(`${pc.gray('Telegram:')} ${pc.blue(data.links.telegram)}`);\r\n if (data.links.discord) console.log(`${pc.gray('Discord:')} ${pc.blue(data.links.discord)}`);\r\n if (data.links.github) console.log(`${pc.gray('GitHub:')} ${pc.blue(data.links.github)}`);\r\n }\r\n\r\n if (data.description && data.description.length > 0) {\r\n console.log(pc.white(`\\n--- Description ---`));\r\n const desc = data.description.replace(/(<([^>]+)>)/gi, '');\r\n const truncated = desc.length > 300 ? desc.substring(0, 300) + '...' : desc;\r\n console.log(pc.gray(truncated));\r\n }\r\n\r\n if (data.pairs && data.pairs.length > 0) {\r\n console.log(pc.white(`\\n--- Top Trading Pairs ---`));\r\n data.pairs.slice(0, 5).forEach((p, i) => {\r\n const title = `${p.baseTokenSymbol}/${p.quoteTokenSymbol}`;\r\n const priceStr = p.priceUsd ? `$${p.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\r\n const volStr = p.volume24h ? `$${p.volume24h.toLocaleString(undefined, { maximumFractionDigits: 0 })}` : 'N/A';\r\n console.log(`${pc.blue(String(i + 1) + '.')} ${pc.yellow(title.padEnd(12, ' '))} | ${pc.green(priceStr.padEnd(12, ' '))} | Vol: ${pc.white(volStr)} | DEX: ${pc.magenta(p.dexId)}`);\r\n });\r\n }\r\n\r\n console.log(pc.white(`\\n----------------------------------------`));\r\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleTop = async () => {\r\n console.log(pc.cyan(`\\nFetching top 50 cryptocurrencies...`));\r\n\r\n const results = await crypull.top();\r\n\r\n if (!results || results.length === 0) {\r\n console.log(pc.red(`\\n✖ Could not fetch top coins at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Top 50 Cryptocurrencies:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n\r\n results.forEach((res, i) => {\r\n const priceStr = res.priceUsd ? `$${res.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\r\n const mcapStr = res.marketCap ? `$${res.marketCap.toLocaleString()}` : 'N/A';\r\n\r\n let changeStr = '';\r\n if (res.priceChange24h !== undefined && res.priceChange24h !== null) {\r\n const color = res.priceChange24h >= 0 ? pc.green : pc.red;\r\n changeStr = color(`(${res.priceChange24h >= 0 ? '+' : ''}${res.priceChange24h.toFixed(2)}%)`);\r\n }\r\n\r\n console.log(`${pc.blue(String(i + 1).padStart(2, ' '))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, ' ')))} | ${pc.green(priceStr.padEnd(12, ' '))} ${changeStr.padEnd(15, ' ')} | Mcap: ${pc.white(mcapStr)}`);\r\n });\r\n\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleSearch = async (query: string) => {\r\n console.log(pc.cyan(`\\nSearching for ${pc.bold(query)}...`));\r\n\r\n const results = await crypull.search(query);\r\n\r\n if (!results || results.length === 0) {\r\n console.log(pc.red(`\\n✖ No results found for \"${query}\".`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Found ${results.length} results:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n\r\n results.forEach((res, i) => {\r\n console.log(`${pc.blue(String(i + 1).padStart(2, ' '))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, ' ')))} | ${pc.white(res.name)} ${pc.gray(`(via ${res.source})`)}`);\r\n if (res.network) {\r\n console.log(` ${pc.gray('Network:')} ${pc.magenta(res.network)}`);\r\n }\r\n if (res.id && res.id.length > 20) {\r\n console.log(` ${pc.gray('Address:')} ${pc.gray(res.id)}`);\r\n }\r\n });\r\n\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleTrending = async () => {\r\n console.log(pc.cyan(`\\nFetching top trending coins...`));\r\n\r\n const results = await crypull.trending();\r\n\r\n if (!results || results.length === 0) {\r\n console.log(pc.red(`\\n✖ Could not fetch trending data at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Top 10 Trending Coins:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n\r\n results.forEach((res, i) => {\r\n const priceStr = res.priceUsd ? `$${res.priceUsd.toLocaleString(undefined, { maximumFractionDigits: 6 })}` : 'N/A';\r\n let changeStr = '';\r\n if (res.priceChange24h !== undefined) {\r\n const color = res.priceChange24h >= 0 ? pc.green : pc.red;\r\n changeStr = color(`(${res.priceChange24h >= 0 ? '+' : ''}${res.priceChange24h.toFixed(2)}%)`);\r\n }\r\n const rankStr = res.marketCapRank ? pc.magenta(`#${res.marketCapRank}`) : '';\r\n\r\n console.log(`${pc.blue(String(i + 1).padStart(2, ' '))}. ${pc.yellow(pc.bold(res.symbol.padEnd(8, ' ')))} | ${pc.green(priceStr.padEnd(12, ' '))} ${changeStr.padEnd(15, ' ')} | ${rankStr}`);\r\n });\r\n\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleMarket = async () => {\r\n console.log(pc.cyan(`\\nFetching global market data...`));\r\n\r\n const data = await crypull.market();\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not fetch global market data at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ Global Market Overview:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Total Market Cap:')} ${pc.white('$' + data.totalMarketCapUsd.toLocaleString())}`);\r\n console.log(`${pc.gray('24h Volume:')} ${pc.white('$' + data.totalVolume24hUsd.toLocaleString())}`);\r\n console.log(`${pc.gray('BTC Dominance:')} ${pc.yellow(data.bitcoinDominancePercentage.toFixed(2) + '%')}`);\r\n console.log(`${pc.gray('ETH Dominance:')} ${pc.blue(data.ethereumDominancePercentage.toFixed(2) + '%')}`);\r\n console.log(`${pc.gray('Active Coins:')} ${pc.white(data.activeCryptocurrencies.toLocaleString())}`);\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Updated:')} ${new Date(data.lastUpdated).toLocaleTimeString()}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleSentiment = async () => {\r\n console.log(pc.cyan(`\\nFetching Fear & Greed Index...`));\r\n\r\n const data = await crypull.sentiment();\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not fetch sentiment data at this time.`));\r\n return;\r\n }\r\n\r\n const value = data.value;\r\n let color = pc.white;\r\n if (value <= 25) color = pc.red;\r\n else if (value <= 45) color = pc.yellow;\r\n else if (value <= 55) color = pc.white;\r\n else if (value <= 75) color = pc.green;\r\n else color = pc.blue;\r\n\r\n console.log(pc.green(`\\n✔ Current Market Sentiment:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Score:')} ${color(pc.bold(value.toString()) + ' / 100')}`);\r\n console.log(`${pc.gray('Classification:')} ${color(pc.bold(data.classification))}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleGas = async () => {\r\n console.log(pc.cyan(`\\nFetching network gas prices...`));\r\n\r\n const data = await crypull.gas();\r\n\r\n if (!data) {\r\n console.log(pc.red(`\\n✖ Could not fetch gas prices at this time.`));\r\n return;\r\n }\r\n\r\n console.log(pc.green(`\\n✔ ${data.network} Gas Tracker (Gwei):`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.gray('Low (Safe):')} ${pc.green(data.low + ' gwei')}`);\r\n console.log(`${pc.gray('Average:')} ${pc.yellow(data.average + ' gwei')}`);\r\n console.log(`${pc.gray('High (Fast):')} ${pc.red(data.high + ' gwei')}`);\r\n if (data.baseFee) {\r\n console.log(`${pc.gray('Base Fee:')} ${pc.white(data.baseFee + ' gwei')}`);\r\n }\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nconst handleChart = async (query: string, options: { days: string }) => {\r\n const days = parseInt(options.days, 10) || 7;\r\n console.log(pc.cyan(`\\nFetching ${days}-day chart data for ${pc.bold(query)}...`));\r\n\r\n const data = await crypull.chart(query, days);\r\n\r\n if (!data || !data.prices || data.prices.length === 0) {\r\n console.log(pc.red(`\\n✖ Could not fetch chart data for \"${query}\". Note: Charts may only be available for major coins.`));\r\n return;\r\n }\r\n\r\n const firstPrice = data.prices[0];\r\n const lastPrice = data.prices[data.prices.length - 1];\r\n const isUp = lastPrice >= firstPrice;\r\n\r\n const chartConfig = {\r\n colors: [isUp ? asciichart.lightgreen : asciichart.lightred],\r\n height: 10,\r\n };\r\n\r\n console.log(pc.green(`\\n✔ ${days}-Day Chart for ${query.toUpperCase()}:`));\r\n console.log(pc.gray(`Min: $${data.minPrice.toLocaleString(undefined, { maximumFractionDigits: 6 })} | Max: $${data.maxPrice.toLocaleString(undefined, { maximumFractionDigits: 6 })}`));\r\n console.log(pc.white(`\\n` + asciichart.plot(data.prices, chartConfig) + `\\n`));\r\n};\r\n\r\nconst handleDonate = () => {\r\n console.log(pc.cyan(`\\n💖 Support the development of crypull:`));\r\n console.log(pc.white(`----------------------------------------`));\r\n console.log(`${pc.yellow('BTC:')} ${pc.white('bc1qj4zt3lva4r68xspayg0p8s4hyg40nhjz8fuhqq')}`);\r\n console.log(`${pc.blue('EVM (All):')} ${pc.white('0x63a875d0c4Dad8E18B95D844caE6FF915dF0a2BD')}`);\r\n console.log(`${pc.green('Solana:')} ${pc.white('8J5VvZu6ayQa4XnSAAzx4YX3QsXYyyNrP4Zr7JEx1KFY')}`);\r\n console.log(`${pc.red('TRX:')} ${pc.white('TPgZSrHUhKdjyMwaGd15utJvsbk85oBbit')}`);\r\n console.log(pc.white(`----------------------------------------\\n`));\r\n};\r\n\r\nprogram\r\n .command('price <query>')\r\n .description('Get the current price of a cryptocurrency (symbol or contract address)')\r\n .option('-n, --network <network>', 'DEX network for contract addresses (e.g. eth, bsc, solana)')\r\n .action((query: string, opts: { network?: string }) => handlePrice(query, opts.network));\r\n\r\nprogram\r\n .command('info <query>')\r\n .description('Get detailed info about a cryptocurrency (market cap, volume, FDV, etc.)')\r\n .option('-n, --network <network>', 'DEX network for contract addresses (e.g. eth, bsc, solana)')\r\n .action((query: string, opts: { network?: string }) => handleInfo(query, opts.network));\r\n\r\nprogram\r\n .command('top')\r\n .description('Show top 50 cryptocurrencies by market cap')\r\n .action(handleTop);\r\n\r\nprogram\r\n .command('search <query>')\r\n .description('Search for tokens or coins across multiple providers')\r\n .action(handleSearch);\r\n\r\nprogram\r\n .command('trending')\r\n .description('Show top 10 trending coins/tokens right now')\r\n .action(handleTrending);\r\n\r\nprogram\r\n .command('market')\r\n .description('Show global cryptocurrency market overview')\r\n .action(handleMarket);\r\n\r\nprogram\r\n .command('sentiment')\r\n .description('Show current Crypto Fear & Greed Index')\r\n .action(handleSentiment);\r\n\r\nprogram\r\n .command('gas')\r\n .description('Show current Ethereum network gas prices')\r\n .action(handleGas);\r\n\r\nprogram\r\n .command('chart <query>')\r\n .description('Draw a terminal ASCII chart of historical prices')\r\n .option('-d, --days <days>', 'Number of days to chart', '7')\r\n .action(handleChart);\r\n\r\nprogram\r\n .command('donate')\r\n .description('Show donation addresses to support development')\r\n .action(handleDonate);\r\n\r\nasync function interactiveMode() {\r\n console.clear();\r\n intro(pc.bgCyan(pc.black(' crypull CLI ')));\r\n\r\n while (true) {\r\n const action = await select({\r\n message: 'What would you like to do?',\r\n options: [\r\n { value: 'price', label: '💰 Get token price' },\r\n { value: 'info', label: 'ℹ️ Get detailed token info' },\r\n { value: 'top', label: '🏆 Show top 50 cryptocurrencies' },\r\n { value: 'search', label: '🔍 Search for a token' },\r\n { value: 'trending', label: '🔥 Show trending coins' },\r\n { value: 'market', label: '🌍 Show global market overview' },\r\n { value: 'sentiment', label: '🎭 Show Fear & Greed Index' },\r\n { value: 'gas', label: '⛽ Show ETH gas prices' },\r\n { value: 'chart', label: '📈 Show historical price chart' },\r\n { value: 'donate', label: '💖 Donate / Support' },\r\n { value: 'exit', label: '❌ Exit' },\r\n ],\r\n });\r\n\r\n if (isCancel(action) || action === 'exit') {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n\r\n if (['price', 'info', 'search', 'chart'].includes(action as string)) {\r\n const query = await text({\r\n message: 'Enter token symbol or contract address:',\r\n placeholder: 'e.g., btc, ethereum, 0x...',\r\n validate: (value) => {\r\n if (!value) return 'Please enter a valid query.';\r\n },\r\n });\r\n\r\n if (isCancel(query)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n\r\n if (action === 'price') await handlePrice(query as string);\r\n else if (action === 'info') await handleInfo(query as string);\r\n else if (action === 'search') await handleSearch(query as string);\r\n else if (action === 'chart') {\r\n const days = await text({\r\n message: 'Enter number of days for the chart (default 7):',\r\n placeholder: '7',\r\n defaultValue: '7',\r\n });\r\n if (isCancel(days)) {\r\n outro('Goodbye!');\r\n process.exit(0);\r\n }\r\n await handleChart(query as string, { days: days as string });\r\n }\r\n } else {\r\n if (action === 'top') await handleTop();\r\n else if (action === 'trending') await handleTrending();\r\n else if (action === 'market') await handleMarket();\r\n else if (action === 'sentiment') await handleSentiment();\r\n else if (action === 'gas') await handleGas();\r\n else if (action === 'donate') handleDonate();\r\n }\r\n\r\n console.log(pc.gray('\\n---\\n'));\r\n }\r\n}\r\n\r\nif (process.argv.length <= 2) {\r\n interactiveMode().catch((err) => {\r\n console.error(pc.red('An error occurred:'), err);\r\n process.exit(1);\r\n });\r\n} else {\r\n program.parse(process.argv);\r\n}\r\n"],"mappings":";;;AACA,SAAS,eAAe;AACxB,OAAO,QAAQ;AACf,YAAY,gBAAgB;AAC5B,SAAS,eAAe;AACxB,SAAS,OAAO,OAAO,QAAQ,MAAM,gBAAgB;AAIrD,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,SAAS,EACd,YAAY,8EAA8E,EAC1F,QAAQ,OAAmB;AAE9B,IAAM,cAAc,OAAO,OAAe,YAAqB;AAC7D,UAAQ,IAAI,GAAG,KAAK;AAAA,qBAAwB,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC;AAEhE,QAAM,OAAO,MAAM,QAAQ,MAAM,OAAO,OAAO;AAE/C,MAAI,CAAC,MAAM;AACT,YAAQ,IAAI,GAAG,IAAI;AAAA,mCAAiC,KAAK,IAAI,CAAC;AAC9D;AAAA,EACF;AAEA,UAAQ,IAAI,GAAG,MAAM;AAAA,4BAA0B,GAAG,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;AACtE,UAAQ,IAAI,GAAG,MAAM,0CAA0C,CAAC;AAChE,UAAQ,IAAI,GAAG,GAAG,KAAK,SAAS,CAAC,OAAO,GAAG,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,EAAE;AACzE,UAAQ,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC,QAAQ,GAAG,MAAM,MAAM,KAAK,SAAS,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,EAAE;AAC/H,UAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,MAAM,IAAI,KAAK,KAAK,WAAW,EAAE,mBAAmB,CAAC,EAAE;AACzF,UAAQ,IAAI,GAAG,MAAM;AAAA,CAA4C,CAAC;AACpE;AAEA,IAAM,aAAa,OAAO,OAAe,YAAqB;AAC5D,UAAQ,IAAI,GAAG,KAAK;AAAA,6BAAgC,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC;AAExE,QAAM,OAAO,MAAM,QAAQ,KAAK,OAAO,OAAO;AAE9C,MAAI,CAAC,MAAM;AACT,YAAQ,IAAI,GAAG,IAAI;AAAA,kCAAgC,KAAK,IAAI,CAAC;AAC7D;AAAA,EACF;AAEA,UAAQ,IAAI,GAAG,MAAM;AAAA,4BAA0B,GAAG,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;AACtE,UAAQ,IAAI,GAAG,MAAM,0CAA0C,CAAC;AAChE,UAAQ,IAAI,GAAG,GAAG,KAAK,OAAO,CAAC,SAAS,GAAG,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE;AACtE,UAAQ,IAAI,GAAG,GAAG,KAAK,SAAS,CAAC,OAAO,GAAG,OAAO,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,EAAE;AACzE,UAAQ,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC,QAAQ,GAAG,MAAM,MAAM,KAAK,SAAS,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,EAAE;AAE/H,MAAI,KAAK,WAAW;AAClB,YAAQ,IAAI,GAAG,GAAG,KAAK,YAAY,CAAC,IAAI,GAAG,MAAM,MAAM,KAAK,UAAU,eAAe,CAAC,CAAC,EAAE;AAAA,EAC3F;AACA,MAAI,KAAK,eAAe;AACtB,YAAQ,IAAI,GAAG,GAAG,KAAK,OAAO,CAAC,SAAS,GAAG,QAAQ,MAAM,KAAK,aAAa,CAAC,EAAE;AAAA,EAChF;AACA,MAAI,KAAK,KAAK;AACZ,YAAQ,IAAI,GAAG,GAAG,KAAK,MAAM,CAAC,UAAU,GAAG,MAAM,MAAM,KAAK,IAAI,eAAe,CAAC,CAAC,EAAE;AAAA,EACrF;AACA,MAAI,KAAK,mBAAmB;AAC1B,YAAQ,IAAI,GAAG,GAAG,KAAK,YAAY,CAAC,IAAI,GAAG,MAAM,KAAK,kBAAkB,eAAe,CAAC,CAAC,EAAE;AAAA,EAC7F;AACA,MAAI,KAAK,aAAa;AACpB,YAAQ,IAAI,GAAG,GAAG,KAAK,YAAY,CAAC,IAAI,GAAG,MAAM,KAAK,YAAY,eAAe,CAAC,CAAC,EAAE;AAAA,EACvF;AACA,MAAI,KAAK,WAAW;AAClB,YAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,MAAM,GAAG,MAAM,KAAK,UAAU,eAAe,CAAC,CAAC,EAAE;AAAA,EACrF;AACA,MAAI,KAAK,WAAW;AAClB,YAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,MAAM,GAAG,MAAM,MAAM,KAAK,UAAU,eAAe,CAAC,CAAC,EAAE;AAAA,EAC3F;AACA,MAAI,KAAK,6BAA6B,QAAW;AAC/C,UAAM,OAAO,KAAK;AAClB,UAAM,QAAQ,QAAQ,IAAI,GAAG,QAAQ,GAAG;AACxC,YAAQ,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC,QAAQ,MAAM,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;AAAA,EACxE;AACA,MAAI,KAAK,cAAc;AACrB,YAAQ,IAAI,GAAG,GAAG,KAAK,YAAY,CAAC,IAAI,GAAG,MAAM,MAAM,KAAK,aAAa,eAAe,CAAC,CAAC,EAAE;AAAA,EAC9F;AACA,MAAI,KAAK,KAAK;AACZ,YAAQ,IAAI,GAAG,GAAG,KAAK,MAAM,CAAC,UAAU,GAAG,MAAM,MAAM,KAAK,IAAI,eAAe,CAAC,CAAC,IAAI,KAAK,UAAU,GAAG,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO,EAAE,mBAAmB,CAAC,GAAG,IAAI,EAAE,EAAE;AAAA,EACxK;AACA,MAAI,KAAK,KAAK;AACZ,YAAQ,IAAI,GAAG,GAAG,KAAK,MAAM,CAAC,UAAU,GAAG,IAAI,MAAM,KAAK,IAAI,eAAe,CAAC,CAAC,IAAI,KAAK,UAAU,GAAG,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO,EAAE,mBAAmB,CAAC,GAAG,IAAI,EAAE,EAAE;AAAA,EACtK;AACA,MAAI,KAAK,SAAS;AAChB,YAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,MAAM,GAAG,QAAQ,KAAK,OAAO,CAAC,EAAE;AAAA,EACpE;AACA,MAAI,KAAK,SAAS;AAChB,YAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,MAAM,GAAG,KAAK,KAAK,OAAO,CAAC,EAAE;AAAA,EACjE;AAEA,MAAI,KAAK,SAAS,OAAO,OAAO,KAAK,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;AAC5D,YAAQ,IAAI,GAAG,MAAM;AAAA,cAAiB,CAAC;AACvC,QAAI,KAAK,MAAM,QAAS,SAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,MAAM,GAAG,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE;AAC7F,QAAI,KAAK,MAAM,QAAS,SAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,MAAM,GAAG,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE;AAC7F,QAAI,KAAK,MAAM,SAAU,SAAQ,IAAI,GAAG,GAAG,KAAK,WAAW,CAAC,KAAK,GAAG,KAAK,KAAK,MAAM,QAAQ,CAAC,EAAE;AAC/F,QAAI,KAAK,MAAM,QAAS,SAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,MAAM,GAAG,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE;AAC7F,QAAI,KAAK,MAAM,OAAQ,SAAQ,IAAI,GAAG,GAAG,KAAK,SAAS,CAAC,OAAO,GAAG,KAAK,KAAK,MAAM,MAAM,CAAC,EAAE;AAAA,EAC7F;AAEA,MAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;AACnD,YAAQ,IAAI,GAAG,MAAM;AAAA,oBAAuB,CAAC;AAC7C,UAAM,OAAO,KAAK,YAAY,QAAQ,iBAAiB,EAAE;AACzD,UAAM,YAAY,KAAK,SAAS,MAAM,KAAK,UAAU,GAAG,GAAG,IAAI,QAAQ;AACvE,YAAQ,IAAI,GAAG,KAAK,SAAS,CAAC;AAAA,EAChC;AAEA,MAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AACvC,YAAQ,IAAI,GAAG,MAAM;AAAA,0BAA6B,CAAC;AACnD,SAAK,MAAM,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM;AACvC,YAAM,QAAQ,GAAG,EAAE,eAAe,IAAI,EAAE,gBAAgB;AACxD,YAAM,WAAW,EAAE,WAAW,IAAI,EAAE,SAAS,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC,KAAK;AACzG,YAAM,SAAS,EAAE,YAAY,IAAI,EAAE,UAAU,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC,KAAK;AACzG,cAAQ,IAAI,GAAG,GAAG,KAAK,OAAO,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,OAAO,MAAM,OAAO,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,MAAM,SAAS,OAAO,IAAI,GAAG,CAAC,CAAC,WAAW,GAAG,MAAM,MAAM,CAAC,WAAW,GAAG,QAAQ,EAAE,KAAK,CAAC,EAAE;AAAA,IACpL,CAAC;AAAA,EACH;AAEA,UAAQ,IAAI,GAAG,MAAM;AAAA,yCAA4C,CAAC;AAClE,UAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,MAAM,IAAI,KAAK,KAAK,WAAW,EAAE,mBAAmB,CAAC,EAAE;AACzF,UAAQ,IAAI,GAAG,MAAM;AAAA,CAA4C,CAAC;AACpE;AAEA,IAAM,YAAY,YAAY;AAC5B,UAAQ,IAAI,GAAG,KAAK;AAAA,oCAAuC,CAAC;AAE5D,QAAM,UAAU,MAAM,QAAQ,IAAI;AAElC,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,YAAQ,IAAI,GAAG,IAAI;AAAA,+CAA6C,CAAC;AACjE;AAAA,EACF;AAEA,UAAQ,IAAI,GAAG,MAAM;AAAA,gCAA8B,CAAC;AACpD,UAAQ,IAAI,GAAG,MAAM,0CAA0C,CAAC;AAEhE,UAAQ,QAAQ,CAAC,KAAK,MAAM;AAC1B,UAAM,WAAW,IAAI,WAAW,IAAI,IAAI,SAAS,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC,KAAK;AAC7G,UAAM,UAAU,IAAI,YAAY,IAAI,IAAI,UAAU,eAAe,CAAC,KAAK;AAEvE,QAAI,YAAY;AAChB,QAAI,IAAI,mBAAmB,UAAa,IAAI,mBAAmB,MAAM;AACnE,YAAM,QAAQ,IAAI,kBAAkB,IAAI,GAAG,QAAQ,GAAG;AACtD,kBAAY,MAAM,IAAI,IAAI,kBAAkB,IAAI,MAAM,EAAE,GAAG,IAAI,eAAe,QAAQ,CAAC,CAAC,IAAI;AAAA,IAC9F;AAEA,YAAQ,IAAI,GAAG,GAAG,KAAK,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,OAAO,GAAG,KAAK,IAAI,OAAO,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,SAAS,OAAO,IAAI,GAAG,CAAC,CAAC,IAAI,UAAU,OAAO,IAAI,GAAG,CAAC,YAAY,GAAG,MAAM,OAAO,CAAC,EAAE;AAAA,EAC9M,CAAC;AAED,UAAQ,IAAI,GAAG,MAAM;AAAA,CAA4C,CAAC;AACpE;AAEA,IAAM,eAAe,OAAO,UAAkB;AAC5C,UAAQ,IAAI,GAAG,KAAK;AAAA,gBAAmB,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC;AAE3D,QAAM,UAAU,MAAM,QAAQ,OAAO,KAAK;AAE1C,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,YAAQ,IAAI,GAAG,IAAI;AAAA,+BAA6B,KAAK,IAAI,CAAC;AAC1D;AAAA,EACF;AAEA,UAAQ,IAAI,GAAG,MAAM;AAAA,eAAa,QAAQ,MAAM,WAAW,CAAC;AAC5D,UAAQ,IAAI,GAAG,MAAM,0CAA0C,CAAC;AAEhE,UAAQ,QAAQ,CAAC,KAAK,MAAM;AAC1B,YAAQ,IAAI,GAAG,GAAG,KAAK,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,OAAO,GAAG,KAAK,IAAI,OAAO,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE;AACpK,QAAI,IAAI,SAAS;AACf,cAAQ,IAAI,OAAO,GAAG,KAAK,UAAU,CAAC,IAAI,GAAG,QAAQ,IAAI,OAAO,CAAC,EAAE;AAAA,IACrE;AACA,QAAI,IAAI,MAAM,IAAI,GAAG,SAAS,IAAI;AAChC,cAAQ,IAAI,OAAO,GAAG,KAAK,UAAU,CAAC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IAC7D;AAAA,EACF,CAAC;AAED,UAAQ,IAAI,GAAG,MAAM;AAAA,CAA4C,CAAC;AACpE;AAEA,IAAM,iBAAiB,YAAY;AACjC,UAAQ,IAAI,GAAG,KAAK;AAAA,+BAAkC,CAAC;AAEvD,QAAM,UAAU,MAAM,QAAQ,SAAS;AAEvC,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,YAAQ,IAAI,GAAG,IAAI;AAAA,mDAAiD,CAAC;AACrE;AAAA,EACF;AAEA,UAAQ,IAAI,GAAG,MAAM;AAAA,8BAA4B,CAAC;AAClD,UAAQ,IAAI,GAAG,MAAM,0CAA0C,CAAC;AAEhE,UAAQ,QAAQ,CAAC,KAAK,MAAM;AAC1B,UAAM,WAAW,IAAI,WAAW,IAAI,IAAI,SAAS,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC,KAAK;AAC7G,QAAI,YAAY;AAChB,QAAI,IAAI,mBAAmB,QAAW;AACpC,YAAM,QAAQ,IAAI,kBAAkB,IAAI,GAAG,QAAQ,GAAG;AACtD,kBAAY,MAAM,IAAI,IAAI,kBAAkB,IAAI,MAAM,EAAE,GAAG,IAAI,eAAe,QAAQ,CAAC,CAAC,IAAI;AAAA,IAC9F;AACA,UAAM,UAAU,IAAI,gBAAgB,GAAG,QAAQ,IAAI,IAAI,aAAa,EAAE,IAAI;AAE1E,YAAQ,IAAI,GAAG,GAAG,KAAK,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,OAAO,GAAG,KAAK,IAAI,OAAO,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,SAAS,OAAO,IAAI,GAAG,CAAC,CAAC,IAAI,UAAU,OAAO,IAAI,GAAG,CAAC,MAAM,OAAO,EAAE;AAAA,EAC9L,CAAC;AAED,UAAQ,IAAI,GAAG,MAAM;AAAA,CAA4C,CAAC;AACpE;AAEA,IAAM,eAAe,YAAY;AAC/B,UAAQ,IAAI,GAAG,KAAK;AAAA,+BAAkC,CAAC;AAEvD,QAAM,OAAO,MAAM,QAAQ,OAAO;AAElC,MAAI,CAAC,MAAM;AACT,YAAQ,IAAI,GAAG,IAAI;AAAA,wDAAsD,CAAC;AAC1E;AAAA,EACF;AAEA,UAAQ,IAAI,GAAG,MAAM;AAAA,+BAA6B,CAAC;AACnD,UAAQ,IAAI,GAAG,MAAM,0CAA0C,CAAC;AAChE,UAAQ,IAAI,GAAG,GAAG,KAAK,mBAAmB,CAAC,IAAI,GAAG,MAAM,MAAM,KAAK,kBAAkB,eAAe,CAAC,CAAC,EAAE;AACxG,UAAQ,IAAI,GAAG,GAAG,KAAK,aAAa,CAAC,UAAU,GAAG,MAAM,MAAM,KAAK,kBAAkB,eAAe,CAAC,CAAC,EAAE;AACxG,UAAQ,IAAI,GAAG,GAAG,KAAK,gBAAgB,CAAC,OAAO,GAAG,OAAO,KAAK,2BAA2B,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;AAC5G,UAAQ,IAAI,GAAG,GAAG,KAAK,gBAAgB,CAAC,OAAO,GAAG,KAAK,KAAK,4BAA4B,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;AAC3G,UAAQ,IAAI,GAAG,GAAG,KAAK,eAAe,CAAC,QAAQ,GAAG,MAAM,KAAK,uBAAuB,eAAe,CAAC,CAAC,EAAE;AACvG,UAAQ,IAAI,GAAG,MAAM,0CAA0C,CAAC;AAChE,UAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,aAAa,IAAI,KAAK,KAAK,WAAW,EAAE,mBAAmB,CAAC,EAAE;AAChG,UAAQ,IAAI,GAAG,MAAM;AAAA,CAA4C,CAAC;AACpE;AAEA,IAAM,kBAAkB,YAAY;AAClC,UAAQ,IAAI,GAAG,KAAK;AAAA,+BAAkC,CAAC;AAEvD,QAAM,OAAO,MAAM,QAAQ,UAAU;AAErC,MAAI,CAAC,MAAM;AACT,YAAQ,IAAI,GAAG,IAAI;AAAA,oDAAkD,CAAC;AACtE;AAAA,EACF;AAEA,QAAM,QAAQ,KAAK;AACnB,MAAI,QAAQ,GAAG;AACf,MAAI,SAAS,GAAI,SAAQ,GAAG;AAAA,WACnB,SAAS,GAAI,SAAQ,GAAG;AAAA,WACxB,SAAS,GAAI,SAAQ,GAAG;AAAA,WACxB,SAAS,GAAI,SAAQ,GAAG;AAAA,MAC5B,SAAQ,GAAG;AAEhB,UAAQ,IAAI,GAAG,MAAM;AAAA,iCAA+B,CAAC;AACrD,UAAQ,IAAI,GAAG,MAAM,0CAA0C,CAAC;AAChE,UAAQ,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC,aAAa,MAAM,GAAG,KAAK,MAAM,SAAS,CAAC,IAAI,QAAQ,CAAC,EAAE;AAC1F,UAAQ,IAAI,GAAG,GAAG,KAAK,iBAAiB,CAAC,IAAI,MAAM,GAAG,KAAK,KAAK,cAAc,CAAC,CAAC,EAAE;AAClF,UAAQ,IAAI,GAAG,MAAM;AAAA,CAA4C,CAAC;AACpE;AAEA,IAAM,YAAY,YAAY;AAC5B,UAAQ,IAAI,GAAG,KAAK;AAAA,+BAAkC,CAAC;AAEvD,QAAM,OAAO,MAAM,QAAQ,IAAI;AAE/B,MAAI,CAAC,MAAM;AACT,YAAQ,IAAI,GAAG,IAAI;AAAA,gDAA8C,CAAC;AAClE;AAAA,EACF;AAEA,UAAQ,IAAI,GAAG,MAAM;AAAA,SAAO,KAAK,OAAO,sBAAsB,CAAC;AAC/D,UAAQ,IAAI,GAAG,MAAM,0CAA0C,CAAC;AAChE,UAAQ,IAAI,GAAG,GAAG,KAAK,aAAa,CAAC,QAAQ,GAAG,MAAM,KAAK,MAAM,OAAO,CAAC,EAAE;AAC3E,UAAQ,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC,WAAW,GAAG,OAAO,KAAK,UAAU,OAAO,CAAC,EAAE;AAChF,UAAQ,IAAI,GAAG,GAAG,KAAK,cAAc,CAAC,OAAO,GAAG,IAAI,KAAK,OAAO,OAAO,CAAC,EAAE;AAC1E,MAAI,KAAK,SAAS;AAChB,YAAQ,IAAI,GAAG,GAAG,KAAK,WAAW,CAAC,UAAU,GAAG,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,EACjF;AACA,UAAQ,IAAI,GAAG,MAAM;AAAA,CAA4C,CAAC;AACpE;AAEA,IAAM,cAAc,OAAO,OAAe,YAA8B;AACtE,QAAM,OAAO,SAAS,QAAQ,MAAM,EAAE,KAAK;AAC3C,UAAQ,IAAI,GAAG,KAAK;AAAA,WAAc,IAAI,uBAAuB,GAAG,KAAK,KAAK,CAAC,KAAK,CAAC;AAEjF,QAAM,OAAO,MAAM,QAAQ,MAAM,OAAO,IAAI;AAE5C,MAAI,CAAC,QAAQ,CAAC,KAAK,UAAU,KAAK,OAAO,WAAW,GAAG;AACrD,YAAQ,IAAI,GAAG,IAAI;AAAA,yCAAuC,KAAK,wDAAwD,CAAC;AACxH;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,OAAO,CAAC;AAChC,QAAM,YAAY,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC;AACpD,QAAM,OAAO,aAAa;AAE1B,QAAM,cAAc;AAAA,IAClB,QAAQ,CAAC,OAAkB,wBAAwB,mBAAQ;AAAA,IAC3D,QAAQ;AAAA,EACV;AAEA,UAAQ,IAAI,GAAG,MAAM;AAAA,SAAO,IAAI,kBAAkB,MAAM,YAAY,CAAC,GAAG,CAAC;AACzE,UAAQ,IAAI,GAAG,KAAK,SAAS,KAAK,SAAS,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC,YAAY,KAAK,SAAS,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC,EAAE,CAAC;AACtL,UAAQ,IAAI,GAAG,MAAM;AAAA,IAAkB,gBAAK,KAAK,QAAQ,WAAW,IAAI;AAAA,CAAI,CAAC;AAC/E;AAEA,IAAM,eAAe,MAAM;AACzB,UAAQ,IAAI,GAAG,KAAK;AAAA,8CAA0C,CAAC;AAC/D,UAAQ,IAAI,GAAG,MAAM,0CAA0C,CAAC;AAChE,UAAQ,IAAI,GAAG,GAAG,OAAO,MAAM,CAAC,WAAW,GAAG,MAAM,4CAA4C,CAAC,EAAE;AACnG,UAAQ,IAAI,GAAG,GAAG,KAAK,YAAY,CAAC,KAAK,GAAG,MAAM,4CAA4C,CAAC,EAAE;AACjG,UAAQ,IAAI,GAAG,GAAG,MAAM,SAAS,CAAC,QAAQ,GAAG,MAAM,8CAA8C,CAAC,EAAE;AACpG,UAAQ,IAAI,GAAG,GAAG,IAAI,MAAM,CAAC,WAAW,GAAG,MAAM,oCAAoC,CAAC,EAAE;AACxF,UAAQ,IAAI,GAAG,MAAM;AAAA,CAA4C,CAAC;AACpE;AAEA,QACG,QAAQ,eAAe,EACvB,YAAY,wEAAwE,EACpF,OAAO,2BAA2B,4DAA4D,EAC9F,OAAO,CAAC,OAAe,SAA+B,YAAY,OAAO,KAAK,OAAO,CAAC;AAEzF,QACG,QAAQ,cAAc,EACtB,YAAY,0EAA0E,EACtF,OAAO,2BAA2B,4DAA4D,EAC9F,OAAO,CAAC,OAAe,SAA+B,WAAW,OAAO,KAAK,OAAO,CAAC;AAExF,QACG,QAAQ,KAAK,EACb,YAAY,4CAA4C,EACxD,OAAO,SAAS;AAEnB,QACG,QAAQ,gBAAgB,EACxB,YAAY,sDAAsD,EAClE,OAAO,YAAY;AAEtB,QACG,QAAQ,UAAU,EAClB,YAAY,6CAA6C,EACzD,OAAO,cAAc;AAExB,QACG,QAAQ,QAAQ,EAChB,YAAY,4CAA4C,EACxD,OAAO,YAAY;AAEtB,QACG,QAAQ,WAAW,EACnB,YAAY,wCAAwC,EACpD,OAAO,eAAe;AAEzB,QACG,QAAQ,KAAK,EACb,YAAY,0CAA0C,EACtD,OAAO,SAAS;AAEnB,QACG,QAAQ,eAAe,EACvB,YAAY,kDAAkD,EAC9D,OAAO,qBAAqB,2BAA2B,GAAG,EAC1D,OAAO,WAAW;AAErB,QACG,QAAQ,QAAQ,EAChB,YAAY,gDAAgD,EAC5D,OAAO,YAAY;AAEtB,eAAe,kBAAkB;AAC/B,UAAQ,MAAM;AACd,QAAM,GAAG,OAAO,GAAG,MAAM,eAAe,CAAC,CAAC;AAE1C,SAAO,MAAM;AACX,UAAM,SAAS,MAAM,OAAO;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,OAAO,SAAS,OAAO,4BAAqB;AAAA,QAC9C,EAAE,OAAO,QAAQ,OAAO,wCAA8B;AAAA,QACtD,EAAE,OAAO,OAAO,OAAO,yCAAkC;AAAA,QACzD,EAAE,OAAO,UAAU,OAAO,+BAAwB;AAAA,QAClD,EAAE,OAAO,YAAY,OAAO,gCAAyB;AAAA,QACrD,EAAE,OAAO,UAAU,OAAO,wCAAiC;AAAA,QAC3D,EAAE,OAAO,aAAa,OAAO,oCAA6B;AAAA,QAC1D,EAAE,OAAO,OAAO,OAAO,6BAAwB;AAAA,QAC/C,EAAE,OAAO,SAAS,OAAO,wCAAiC;AAAA,QAC1D,EAAE,OAAO,UAAU,OAAO,6BAAsB;AAAA,QAChD,EAAE,OAAO,QAAQ,OAAO,cAAS;AAAA,MACnC;AAAA,IACF,CAAC;AAED,QAAI,SAAS,MAAM,KAAK,WAAW,QAAQ;AACzC,YAAM,UAAU;AAChB,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,CAAC,SAAS,QAAQ,UAAU,OAAO,EAAE,SAAS,MAAgB,GAAG;AACnE,YAAM,QAAQ,MAAM,KAAK;AAAA,QACvB,SAAS;AAAA,QACT,aAAa;AAAA,QACb,UAAU,CAAC,UAAU;AACnB,cAAI,CAAC,MAAO,QAAO;AAAA,QACrB;AAAA,MACF,CAAC;AAED,UAAI,SAAS,KAAK,GAAG;AACnB,cAAM,UAAU;AAChB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI,WAAW,QAAS,OAAM,YAAY,KAAe;AAAA,eAChD,WAAW,OAAQ,OAAM,WAAW,KAAe;AAAA,eACnD,WAAW,SAAU,OAAM,aAAa,KAAe;AAAA,eACvD,WAAW,SAAS;AAC3B,cAAM,OAAO,MAAM,KAAK;AAAA,UACtB,SAAS;AAAA,UACT,aAAa;AAAA,UACb,cAAc;AAAA,QAChB,CAAC;AACD,YAAI,SAAS,IAAI,GAAG;AAClB,gBAAM,UAAU;AAChB,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,cAAM,YAAY,OAAiB,EAAE,KAAqB,CAAC;AAAA,MAC7D;AAAA,IACF,OAAO;AACL,UAAI,WAAW,MAAO,OAAM,UAAU;AAAA,eAC7B,WAAW,WAAY,OAAM,eAAe;AAAA,eAC5C,WAAW,SAAU,OAAM,aAAa;AAAA,eACxC,WAAW,YAAa,OAAM,gBAAgB;AAAA,eAC9C,WAAW,MAAO,OAAM,UAAU;AAAA,eAClC,WAAW,SAAU,cAAa;AAAA,IAC7C;AAEA,YAAQ,IAAI,GAAG,KAAK,SAAS,CAAC;AAAA,EAChC;AACF;AAEA,IAAI,QAAQ,KAAK,UAAU,GAAG;AAC5B,kBAAgB,EAAE,MAAM,CAAC,QAAQ;AAC/B,YAAQ,MAAM,GAAG,IAAI,oBAAoB,GAAG,GAAG;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH,OAAO;AACL,UAAQ,MAAM,QAAQ,IAAI;AAC5B;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,47 @@
1
1
  {
2
2
  "name": "crypull-cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.2",
4
+ "description": "Terminal UI for crypull. Fetch crypto prices, charts, and market data from the command line.",
5
+ "type": "module",
6
+ "bin": {
7
+ "crypull": "./dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsup",
14
+ "start": "node dist/cli.js"
15
+ },
16
+ "keywords": [
17
+ "crypull",
18
+ "crypto",
19
+ "cli",
20
+ "terminal",
21
+ "price",
22
+ "bitcoin"
23
+ ],
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "https://github.com/Foisalislambd/crypull.git",
27
+ "directory": "packages/crypull-cli"
28
+ },
29
+ "author": "Md Foisal Islam <https://github.com/Foisalislambd>",
30
+ "license": "MIT",
31
+ "engines": {
32
+ "node": ">=18.0.0"
33
+ },
34
+ "dependencies": {
35
+ "@clack/prompts": "^1.0.1",
36
+ "asciichart": "^1.5.25",
37
+ "commander": "^14.0.3",
38
+ "crypull": "^1.0.3",
39
+ "picocolors": "^1.1.1"
40
+ },
41
+ "devDependencies": {
42
+ "@types/asciichart": "^1.5.8",
43
+ "@types/node": "^20.19.33",
44
+ "tsup": "^8.5.1",
45
+ "typescript": "^5.9.3"
46
+ }
47
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.