propline-cli 0.15.0 → 0.16.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
@@ -34,6 +34,9 @@ propline odds baseball_mlb 12345 --markets h2h,spreads,totals,player_points
34
34
  # First-quarter NBA totals only (game-period filter on every odds command)
35
35
  propline odds basketball_nba 12345 --markets totals --period q1
36
36
 
37
+ # Only DraftKings + FanDuel lines (bookmaker filter on every odds command)
38
+ propline odds baseball_mlb 12345 --markets pitcher_strikeouts --bookmakers draftkings,fanduel
39
+
37
40
  # Scores from the last 3 days
38
41
  propline scores basketball_nba
39
42
 
@@ -67,7 +70,7 @@ propline webhooks deliveries 42
67
70
  | --- | --- |
68
71
  | `propline sports` | List available sports |
69
72
  | `propline events <sport>` | List upcoming events for a sport |
70
- | `propline odds <sport> [event_id]` | Bulk odds (no event_id) or per-event (with). `--period q1` (or `h1`/`p1`/`f5`/…) filters to game-period markets. |
73
+ | `propline odds <sport> [event_id]` | Bulk odds (no event_id) or per-event (with). `--period q1` (or `h1`/`p1`/`f5`/…) filters to game-period markets; `--bookmakers draftkings,fanduel` filters to specific books. |
71
74
  | `propline history <sport> <event_id>` | Historical line movement; supports `--from`/`--to`, `--relative-from`/`--relative-to`, `--interval`, `--changes-only`, `--period` (Hobby+) |
72
75
  | `propline closing <sport> <event_id>` | Closing line per (book, market, outcome) — CLV helper. `--period` accepted (Hobby+) |
73
76
  | `propline scores <sport>` | Recent scores + status |
package/dist/index.js CHANGED
@@ -124,13 +124,14 @@ function cmdOdds(sport, eventId, flags) {
124
124
  const client = buildClient(flags);
125
125
  const markets = parseMarketsFlag(flags.markets);
126
126
  const period = flags.period;
127
+ const bookmakers = flags.bookmakers;
127
128
  if (eventId) {
128
- const resp2 = await client.getOdds(sport, { eventId, markets, period });
129
+ const resp2 = await client.getOdds(sport, { eventId, markets, period, bookmakers });
129
130
  if (flags.json) return printJson(resp2);
130
131
  printOddsResponse(resp2);
131
132
  return;
132
133
  }
133
- const resp = await client.getOdds(sport, { markets, period });
134
+ const resp = await client.getOdds(sport, { markets, period, bookmakers });
134
135
  if (flags.json) return printJson(resp);
135
136
  const rows = resp.map((ev) => {
136
137
  const books = ev.bookmakers ?? [];
@@ -296,6 +297,7 @@ function cmdMovement(sport, eventId, flags) {
296
297
  const client = buildClient(flags);
297
298
  const mv = await client.getMovement(sport, eventId, {
298
299
  markets: flags.markets ? flags.markets.split(",") : void 0,
300
+ bookmakers: flags.bookmakers,
299
301
  period: flags.period
300
302
  });
301
303
  if (flags.json) return printJson(mv);
@@ -773,6 +775,7 @@ function cmdHistory(sport, eventId, flags) {
773
775
  const markets = parseMarketsFlag(flags.markets);
774
776
  const hist = await client.getOddsHistory(sport, eventId, {
775
777
  markets,
778
+ bookmakers: flags.bookmakers,
776
779
  from: flags.from,
777
780
  to: flags.to,
778
781
  relativeFrom: flags.relativeFrom,
@@ -823,7 +826,11 @@ function cmdClosing(sport, eventId, flags) {
823
826
  return runCommand(async () => {
824
827
  const client = buildClient(flags);
825
828
  const markets = parseMarketsFlag(flags.markets);
826
- const closing = await client.getOddsClosing(sport, eventId, { markets, period: flags.period });
829
+ const closing = await client.getOddsClosing(sport, eventId, {
830
+ markets,
831
+ bookmakers: flags.bookmakers,
832
+ period: flags.period
833
+ });
827
834
  if (flags.json) return printJson(closing);
828
835
  const rows = [];
829
836
  for (const book of closing.bookmakers ?? []) {
@@ -870,7 +877,7 @@ function parseMarketsFlag(value) {
870
877
  }
871
878
 
872
879
  // src/index.ts
873
- var VERSION = "0.15.0";
880
+ var VERSION = "0.16.0";
874
881
  var program = new Command();
875
882
  program.name("propline").description(
876
883
  "PropLine CLI \u2014 query live odds, scores, +EV plays, prop resolution, and webhooks from the terminal."
@@ -901,6 +908,9 @@ program.command("events").argument("<sport>", "sport key (e.g. baseball_mlb)").d
901
908
  program.command("odds").argument("<sport>", "sport key (e.g. baseball_mlb)").argument("[event_id]", "specific event id (omit for bulk odds)").option(
902
909
  "-m, --markets <list>",
903
910
  "comma-separated market keys (e.g. h2h,spreads,totals or player_points)"
911
+ ).option(
912
+ "-b, --bookmakers <list>",
913
+ "comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books"
904
914
  ).option(
905
915
  "-p, --period <codes>",
906
916
  "game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only"
@@ -925,6 +935,9 @@ program.command("context").argument("<sport>", "sport key").argument("<event_id>
925
935
  return cmdContext(sport, eventId, gather(this));
926
936
  });
927
937
  program.command("movement").argument("<sport>", "sport key").argument("<event_id>", "event id").option("-m, --markets <list>", "comma-separated market keys (default h2h,spreads,totals)").option(
938
+ "-b, --bookmakers <list>",
939
+ "comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books"
940
+ ).option(
928
941
  "-p, --period <codes>",
929
942
  "game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only"
930
943
  ).description("Line movement + steam detection across books (Hobby+)").action(function(sport, eventId) {
@@ -978,12 +991,18 @@ program.command("history").argument("<sport>", "sport key").argument("<event_id>
978
991
  "--interval <bucket>",
979
992
  "downsample to one snapshot per bucket: 30s|1m|5m|15m|30m|1h"
980
993
  ).option("--changes-only", "drop snapshots whose (price, point) match the previous one", false).option(
994
+ "-b, --bookmakers <list>",
995
+ "comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books"
996
+ ).option(
981
997
  "-p, --period <codes>",
982
998
  "game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only"
983
999
  ).description("Historical line movement for an event with period filters (Hobby+)").action(function(sport, eventId) {
984
1000
  return cmdHistory(sport, eventId, gather(this));
985
1001
  });
986
1002
  program.command("closing").argument("<sport>", "sport key").argument("<event_id>", "event id").option("-m, --markets <list>", "comma-separated market keys (default h2h,spreads,totals)").option(
1003
+ "-b, --bookmakers <list>",
1004
+ "comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books"
1005
+ ).option(
987
1006
  "-p, --period <codes>",
988
1007
  "game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only"
989
1008
  ).description("Closing line per (book, market, outcome) \u2014 CLV helper (Hobby+)").action(function(sport, eventId) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/format.ts","../src/commands.ts"],"sourcesContent":["// PropLine CLI — terminal interface to the PropLine player props API.\n// Wraps the `propline` Node SDK; no API surface of its own. Add new\n// commands by importing a handler from ./commands.ts and registering\n// it on the matching `program.command(...)` below.\n\nimport { Command, Option } from \"commander\";\nimport {\n cmdSports,\n cmdEvents,\n cmdOdds,\n cmdScores,\n cmdFutures,\n cmdContext,\n cmdMovement,\n cmdGrandSalami,\n cmdDailyGoalsTotal,\n cmdDfsPayouts,\n cmdResolutionSummary,\n cmdLive,\n cmdEv,\n cmdPlayerHistory,\n cmdPlayerTrends,\n cmdExportResolvedProps,\n cmdExportOddsHistory,\n cmdHistory,\n cmdClosing,\n cmdWebhooksList,\n cmdWebhooksCreate,\n cmdWebhooksDelete,\n cmdWebhooksTest,\n cmdWebhooksDeliveries,\n} from \"./commands.js\";\n\nexport const VERSION = \"0.15.0\";\n\nconst program = new Command();\n\nprogram\n .name(\"propline\")\n .description(\n \"PropLine CLI — query live odds, scores, +EV plays, prop resolution, and webhooks from the terminal.\",\n )\n .version(VERSION)\n // Global flags. Each command resolves these via its own options object\n // (commander merges parent options into action callbacks for us via\n // .opts({ from: 'parent' }), but easier to just pull from this.parent\n // explicitly to stay strict-typed-friendly).\n .addOption(\n new Option(\"--api-key <key>\", \"PropLine API key\").env(\"PROPLINE_API_KEY\"),\n )\n .addOption(\n new Option(\n \"--base-url <url>\",\n \"API base URL (default https://api.prop-line.com/v1)\",\n ),\n )\n .addOption(\n new Option(\n \"--timeout <seconds>\",\n \"Request timeout in seconds (default 15)\",\n ).argParser((v) => parseInt(v, 10)),\n )\n .addOption(new Option(\"--json\", \"Emit raw JSON instead of a table\"))\n .showHelpAfterError();\n\n// Helper to merge global + command-local options into the flat shape\n// the handlers expect. Keeps each command call site terse.\nfunction gather(cmd: Command): Record<string, unknown> {\n const own = cmd.opts();\n const parent = cmd.parent?.opts() ?? {};\n return { ...parent, ...own };\n}\n\n/* ── sports ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"sports\")\n .description(\"List available sports\")\n .action(function (this: Command) {\n return cmdSports(gather(this));\n });\n\n/* ── events ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"events\")\n .argument(\"<sport>\", \"sport key (e.g. baseball_mlb)\")\n .description(\"List upcoming events for a sport\")\n .action(function (this: Command, sport: string) {\n return cmdEvents(sport, gather(this));\n });\n\n/* ── odds ───────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"odds\")\n .argument(\"<sport>\", \"sport key (e.g. baseball_mlb)\")\n .argument(\"[event_id]\", \"specific event id (omit for bulk odds)\")\n .option(\n \"-m, --markets <list>\",\n \"comma-separated market keys (e.g. h2h,spreads,totals or player_points)\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Get current odds across all books\")\n .action(function (this: Command, sport: string, eventId: string | undefined) {\n return cmdOdds(sport, eventId, gather(this));\n });\n\n/* ── scores ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"scores\")\n .argument(\"<sport>\", \"sport key\")\n .option(\n \"-d, --days-from <n>\",\n \"days back to include (default 3)\",\n (v) => parseInt(v, 10),\n )\n .description(\"Get game scores and status\")\n .action(function (this: Command, sport: string) {\n return cmdScores(sport, gather(this));\n });\n\n/* ── futures ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"futures\")\n .argument(\"<sport>\", \"sport key\")\n .description(\n \"Season-long futures — championship/division/conference winners, MVP + awards, season win totals across books (free)\",\n )\n .action(function (this: Command, sport: string) {\n return cmdFutures(sport, gather(this));\n });\n\n/* ── context ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"context\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .description(\n \"Game context an event plays under — probable pitchers, lineup, umpire, weather (free)\",\n )\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdContext(sport, eventId, gather(this));\n });\n\n/* ── movement ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"movement\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Line movement + steam detection across books (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdMovement(sport, eventId, gather(this));\n });\n\n/* ── grand-salami ────────────────────────────────────────────────────── */\n\nprogram\n .command(\"grand-salami\")\n .option(\n \"--date <YYYY-MM-DD>\",\n \"UTC date (defaults to today)\",\n )\n .description(\"MLB synthetic Grand Salami — total runs + per-book line\")\n .action(function (this: Command) {\n return cmdGrandSalami(gather(this));\n });\n\n/* ── daily-goals-total ───────────────────────────────────────────────── */\n\nprogram\n .command(\"daily-goals-total\")\n .option(\n \"--date <YYYY-MM-DD>\",\n \"UTC date (defaults to today)\",\n )\n .description(\"NHL synthetic Daily Goals Total — total goals + per-book line\")\n .action(function (this: Command) {\n return cmdDailyGoalsTotal(gather(this));\n });\n\n/* ── resolution-summary ──────────────────────────────────────────────── */\n\nprogram\n .command(\"resolution-summary\")\n .option(\n \"-d, --days <n>\",\n \"look-back window, 1-90 (default 30)\",\n (v) => parseInt(v, 10),\n )\n .description(\"Graded-prop volume + per-sport breakdown (free)\")\n .action(function (this: Command) {\n return cmdResolutionSummary(gather(this));\n });\n\n/* ── dfs-payouts ─────────────────────────────────────────────────────── */\n\nprogram\n .command(\"dfs-payouts\")\n .option(\n \"--leg-win-prob <p>\",\n \"assumed per-leg win prob 0-1 (adds expected return + +EV flag)\",\n (v) => parseFloat(v),\n )\n .description(\"PrizePicks Power/Flex payout schedule + per-leg breakeven (free)\")\n .action(function (this: Command) {\n return cmdDfsPayouts(gather(this));\n });\n\n/* ── live ───────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"live\")\n .description(\n \"Show every in-progress game across the major sports (score + period)\",\n )\n .action(function (this: Command) {\n return cmdLive(gather(this));\n });\n\n/* ── ev ─────────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"ev\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys\")\n .option(\n \"--plus\",\n \"show only +EV outcomes (filter rows where ev_pct > 0)\",\n false,\n )\n .description(\"Cross-book +EV against a sharp no-vig fair line (Pro tier)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdEv(sport, eventId, gather(this));\n });\n\n/* ── history ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"history\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\"--from <iso>\", \"ISO timestamp; only include snapshots at or after\")\n .option(\"--to <iso>\", \"ISO timestamp; only include snapshots at or before\")\n .option(\n \"--relative-from <offset>\",\n \"offset relative to commence_time, e.g. -3h, -30m, -90s\",\n )\n .option(\n \"--relative-to <offset>\",\n \"offset relative to commence_time, e.g. -1m, 0\",\n )\n .option(\n \"--interval <bucket>\",\n \"downsample to one snapshot per bucket: 30s|1m|5m|15m|30m|1h\",\n )\n .option(\"--changes-only\", \"drop snapshots whose (price, point) match the previous one\", false)\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Historical line movement for an event with period filters (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdHistory(sport, eventId, gather(this) as never);\n });\n\n/* ── closing ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"closing\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Closing line per (book, market, outcome) — CLV helper (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdClosing(sport, eventId, gather(this) as never);\n });\n\n/* ── player-history ─────────────────────────────────────────────────── */\n\nprogram\n .command(\"player-history\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<player>\", 'player name (quote if it contains spaces — e.g. \"Aaron Judge\")')\n .requiredOption(\n \"-m, --market <key>\",\n \"market key (required — e.g. pitcher_strikeouts)\",\n )\n .option(\"-b, --bookmaker <key>\", \"filter to a single book (e.g. draftkings)\")\n .option(\"-l, --limit <n>\", \"max entries (1-100, default 20)\", (v) =>\n parseInt(v, 10),\n )\n .description(\"Recent prop history for a player on a market (Pro full, Free redacted)\")\n .action(function (this: Command, sport: string, player: string) {\n return cmdPlayerHistory(sport, player, gather(this) as never);\n });\n\n/* ── player-trends ──────────────────────────────────────────────────── */\n\nprogram\n .command(\"player-trends\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<player>\", 'player name (quote if it contains spaces — e.g. \"Aaron Judge\")')\n .option(\n \"-m, --market <key>\",\n \"filter to a single market key (e.g. batter_total_bases)\",\n )\n .option(\n \"--dfs-odds-type <flavor>\",\n \"PrizePicks flavor to compute trends against (standard | goblin | demon)\",\n )\n .description(\n \"Aggregated hit-rate trends per market — L5/L10/L20/L50 over/under splits + current streak (Pro full, Free redacted)\",\n )\n .action(function (this: Command, sport: string, player: string) {\n return cmdPlayerTrends(sport, player, gather(this) as never);\n });\n\n/* ── export-resolved-props ──────────────────────────────────────────── */\n\nprogram\n .command(\"export-resolved-props\")\n .requiredOption(\"--sport <key>\", \"sport key (required)\")\n .option(\"--market <key>\", \"filter by market key\")\n .option(\"--bookmaker <key>\", \"filter by bookmaker key\")\n .option(\"--since <iso>\", \"ISO datetime lower bound on resolved_at\")\n .option(\"--until <iso>\", \"ISO datetime upper bound on resolved_at\")\n .option(\n \"--out <path>\",\n \"write CSV to this path (default: stream CSV to stdout)\",\n )\n .description(\"Bulk CSV export of resolved props (Pro tier)\")\n .action(function (this: Command) {\n return cmdExportResolvedProps(gather(this) as never);\n });\n\n/* ── export-odds-history ────────────────────────────────────────────── */\n\nprogram\n .command(\"export-odds-history\")\n .requiredOption(\"--sport <key>\", \"sport key (required)\")\n .option(\"--market <key>\", \"filter by market key\")\n .option(\"--bookmaker <key>\", \"filter by bookmaker key\")\n .option(\"--since <iso>\", \"ISO datetime lower bound on recorded_at\")\n .option(\"--until <iso>\", \"ISO datetime upper bound on recorded_at\")\n .option(\n \"--out <path>\",\n \"write CSV to this path (default: stream CSV to stdout)\",\n )\n .description(\n \"Bulk CSV export of the full line-movement tick history (Backfill pass / Enterprise). Large — page month-by-month with --since/--until.\",\n )\n .action(function (this: Command) {\n return cmdExportOddsHistory(gather(this) as never);\n });\n\n/* ── webhooks ───────────────────────────────────────────────────────── */\n\nconst webhooks = program.command(\"webhooks\").description(\"Manage webhook subscriptions (Streaming tier)\");\n\nwebhooks\n .command(\"list\")\n .description(\"List your webhook subscriptions\")\n .action(function (this: Command) {\n return cmdWebhooksList(gather(this));\n });\n\nwebhooks\n .command(\"create\")\n .requiredOption(\"--url <url>\", \"HTTPS endpoint that will receive POSTs\")\n .option(\n \"--events <list>\",\n \"comma-separated event types: line_movement,resolution,steam (default: all)\",\n )\n .option(\"--sport <key>\", \"filter to a single sport\")\n .option(\"--market <key>\", \"filter to a single market key\")\n .option(\"--player <name>\", \"filter to a player name (case-insensitive substring)\")\n .option(\n \"--event-id <id>\",\n \"filter to one event id (numeric)\",\n (v) => parseInt(v, 10),\n )\n .option(\n \"--min-price-change-pct <n>\",\n \"minimum % change in American odds to fire a line_movement\",\n (v) => parseFloat(v),\n )\n .option(\n \"--min-steam-score <n>\",\n \"minimum 0-100 steam score to fire a steam event\",\n (v) => parseFloat(v),\n )\n .description(\"Register a webhook subscription (returns the signing secret ONCE)\")\n .action(function (this: Command) {\n return cmdWebhooksCreate(gather(this) as never);\n });\n\nwebhooks\n .command(\"delete\")\n .argument(\"<id>\", \"webhook id\")\n .description(\"Delete a webhook (cascades its delivery history)\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksDelete(id, gather(this));\n });\n\nwebhooks\n .command(\"test\")\n .argument(\"<id>\", \"webhook id\")\n .description(\"Queue a sample test payload to the webhook URL\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksTest(id, gather(this));\n });\n\nwebhooks\n .command(\"deliveries\")\n .argument(\"<id>\", \"webhook id\")\n .option(\"-l, --limit <n>\", \"max deliveries (default 50)\", (v) =>\n parseInt(v, 10),\n )\n .description(\"Show recent delivery attempts for a webhook\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksDeliveries(id, gather(this) as never);\n });\n\nprogram.parseAsync().catch((err) => {\n process.stderr.write(`error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n});\n","// Thin wrapper around the propline SDK constructor. Resolves auth from\n// (in priority order): --api-key flag → PROPLINE_API_KEY env var → exit\n// with a friendly message. Also threads --base-url for self-hosted /\n// staging deployments and --timeout for slow networks.\n//\n// Pulled out of index.ts so every command resolves credentials the same\n// way — drift between commands is the most common source of \"works on\n// my machine\" CLI bugs.\n\nimport { PropLine, PropLineError } from \"propline\";\n\nexport interface ClientFlags {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n}\n\nexport function buildClient(flags: ClientFlags): PropLine {\n const apiKey = flags.apiKey ?? process.env.PROPLINE_API_KEY;\n if (!apiKey) {\n process.stderr.write(\n \"error: API key required.\\n\\n\" +\n \" Set PROPLINE_API_KEY in your environment, or pass --api-key.\\n\" +\n \" Get one free at https://prop-line.com\\n\",\n );\n process.exit(2);\n }\n return new PropLine(apiKey, {\n baseUrl: flags.baseUrl,\n timeoutMs: flags.timeout ? flags.timeout * 1000 : undefined,\n });\n}\n\n/** Wrap a command body with consistent error reporting. PropLine API\n * errors get a one-line summary; everything else surfaces the message\n * + exits non-zero so shell scripts can detect failure. */\nexport async function runCommand(fn: () => Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (err) {\n if (err instanceof PropLineError) {\n process.stderr.write(`error: ${err.message}\\n`);\n } else if (err instanceof Error) {\n process.stderr.write(`error: ${err.message}\\n`);\n } else {\n process.stderr.write(`error: ${String(err)}\\n`);\n }\n process.exit(1);\n }\n}\n","// Pretty-printing helpers — zero deps. Default output is a fixed-width\n// table with right-aligned numeric columns; pass --json on any command\n// to bypass and emit raw response JSON instead. Tables are streamed to\n// stdout via console.log so a downstream `| head` short-circuits cleanly.\n\nexport interface Column<T> {\n label: string;\n /** Stringified cell value. */\n value: (row: T) => string;\n /** Right-align (numeric) vs default left-align. */\n numeric?: boolean;\n}\n\nexport function printJson(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function printTable<T>(rows: T[], columns: Column<T>[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"(no rows)\\n\");\n return;\n }\n const cells: string[][] = rows.map((r) =>\n columns.map((c) => {\n const v = c.value(r);\n return v === undefined || v === null ? \"\" : String(v);\n }),\n );\n const headers = columns.map((c) => c.label);\n\n // Width = max(header, max cell). Capped at 60 chars so a long player\n // name or URL doesn't blow the layout open; the table is for skim\n // reading, full data is one --json away.\n const widths = headers.map((h, i) =>\n Math.min(60, Math.max(h.length, ...cells.map((row) => (row[i] ?? \"\").length))),\n );\n\n function pad(s: string, w: number, numeric: boolean): string {\n const truncated = s.length > w ? s.slice(0, w - 1) + \"…\" : s;\n if (numeric) return truncated.padStart(w);\n return truncated.padEnd(w);\n }\n\n // Header\n process.stdout.write(\n headers\n .map((h, i) => pad(h, widths[i] ?? 0, columns[i]?.numeric ?? false))\n .join(\" \") + \"\\n\",\n );\n // Underline\n process.stdout.write(widths.map((w) => \"─\".repeat(w)).join(\" \") + \"\\n\");\n // Rows\n for (const row of cells) {\n process.stdout.write(\n row\n .map((c, i) => pad(c, widths[i] ?? 0, columns[i]?.numeric ?? false))\n .join(\" \") + \"\\n\",\n );\n }\n}\n\nexport function formatPrice(price: number | null | undefined): string {\n if (price === null || price === undefined) return \"–\";\n if (price === 0) return \"EVEN\";\n return price > 0 ? `+${price}` : String(price);\n}\n\nexport function formatPoint(point: number | null | undefined): string {\n if (point === null || point === undefined) return \"\";\n if (Number.isInteger(point)) return String(point);\n return point.toFixed(1);\n}\n\nexport function formatTime(iso: string | null | undefined): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\n/** Truncate to N chars with ellipsis — used for long player/market names. */\nexport function truncate(s: string, n: number): string {\n if (s.length <= n) return s;\n return s.slice(0, n - 1) + \"…\";\n}\n","// Per-command handlers. Each one builds a PropLine client, calls the\n// SDK, and pretty-prints the result via format.ts (or dumps raw JSON\n// when --json is passed). Commands stay independent — no shared\n// per-call state — so future ones can be added without touching the\n// existing surface.\n\nimport type { PropLine, PlayerMarketTrend, HitRateSplit } from \"propline\";\nimport { buildClient, runCommand, type ClientFlags } from \"./client.js\";\nimport {\n printJson,\n printTable,\n formatPrice,\n formatPoint,\n formatTime,\n truncate,\n type Column,\n} from \"./format.js\";\n\ninterface CommonFlags extends ClientFlags {\n json?: boolean;\n}\n\n/* ── sports ─────────────────────────────────────────────────────────── */\n\nexport function cmdSports(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const sports = await client.getSports();\n if (flags.json) return printJson(sports);\n const cols: Column<(typeof sports)[number]>[] = [\n { label: \"KEY\", value: (r) => r.key },\n { label: \"TITLE\", value: (r) => r.title },\n { label: \"ACTIVE\", value: (r) => (r.active ? \"yes\" : \"no\") },\n ];\n printTable(sports, cols);\n });\n}\n\n/* ── events ─────────────────────────────────────────────────────────── */\n\nexport function cmdEvents(sport: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const events = await client.getEvents(sport);\n if (flags.json) return printJson(events);\n const cols: Column<(typeof events)[number]>[] = [\n { label: \"ID\", value: (r) => String(r.id) },\n { label: \"AWAY\", value: (r) => r.away_team },\n { label: \"HOME\", value: (r) => r.home_team },\n { label: \"COMMENCES\", value: (r) => formatTime(r.commence_time) },\n ];\n printTable(events, cols);\n });\n}\n\n/* ── odds (bulk and single-event) ───────────────────────────────────── */\n\nexport function cmdOdds(\n sport: string,\n eventId: string | undefined,\n flags: CommonFlags & { markets?: string; period?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const period = flags.period;\n\n if (eventId) {\n const resp = await client.getOdds(sport, { eventId, markets, period });\n if (flags.json) return printJson(resp);\n printOddsResponse(resp);\n return;\n }\n\n const resp = await client.getOdds(sport, { markets, period });\n if (flags.json) return printJson(resp);\n // Bulk: one row per (event, book, market, outcome) gets dense fast.\n // Collapse to a per-event summary row showing how many books / markets\n // each event has, so the user sees the slate at a glance.\n type Row = {\n id: string;\n teams: string;\n commence: string;\n books: number;\n markets: number;\n };\n const rows: Row[] = resp.map((ev) => {\n const books = ev.bookmakers ?? [];\n const markets = books.reduce((sum, b) => sum + (b.markets?.length ?? 0), 0);\n return {\n id: String(ev.id),\n teams: `${ev.away_team} @ ${ev.home_team}`,\n commence: formatTime(ev.commence_time),\n books: books.length,\n markets,\n };\n });\n const cols: Column<Row>[] = [\n { label: \"ID\", value: (r) => r.id },\n { label: \"MATCHUP\", value: (r) => r.teams },\n { label: \"COMMENCES\", value: (r) => r.commence },\n { label: \"BOOKS\", value: (r) => String(r.books), numeric: true },\n { label: \"MARKETS\", value: (r) => String(r.markets), numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\ninterface OddsResponseLike {\n id: number | string;\n home_team: string;\n away_team: string;\n bookmakers?: Array<{\n key: string;\n title: string;\n markets?: Array<{\n key: string;\n outcomes?: Array<{\n name: string;\n description?: string | null;\n price: number;\n point?: number | null;\n payout_multiplier?: number | null;\n }>;\n }>;\n }>;\n}\n\nfunction printOddsResponse(resp: OddsResponseLike): void {\n // Per-event detail view: one row per (book, market, outcome). Same\n // shape as `propline odds <sport> <event> --json` but flattened so the\n // table reads top-to-bottom by book → market → outcome.\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n point: string;\n price: string;\n mult: string;\n };\n const rows: Row[] = [];\n let anyMult = false;\n for (const book of resp.bookmakers ?? []) {\n for (const market of book.markets ?? []) {\n for (const o of market.outcomes ?? []) {\n const m = o.payout_multiplier;\n if (m !== null && m !== undefined) anyMult = true;\n rows.push({\n book: book.title,\n market: market.key,\n player: o.description ?? \"\",\n side: o.name,\n point: formatPoint(o.point ?? null),\n price: formatPrice(o.price),\n mult: m !== null && m !== undefined ? `${m}x` : \"\",\n });\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no markets returned — try --markets h2h,spreads,totals or the desired prop key)\\n`,\n );\n return;\n }\n const header = `${resp.away_team} @ ${resp.home_team} (event ${resp.id})\\n`;\n process.stdout.write(header);\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 28) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n // DFS boost/discount column — only shown when a book (Underdog) actually\n // returns a multiplier, so standard sportsbook output stays unchanged.\n if (anyMult) {\n cols.push({ label: \"MULT\", value: (r) => r.mult, numeric: true });\n }\n printTable(rows, cols);\n}\n\n/* ── scores ─────────────────────────────────────────────────────────── */\n\nexport function cmdScores(\n sport: string,\n flags: CommonFlags & { daysFrom?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const scores = await client.getScores(sport, { daysFrom: flags.daysFrom });\n if (flags.json) return printJson(scores);\n const cols: Column<(typeof scores)[number]>[] = [\n { label: \"ID\", value: (r) => String(r.id) },\n { label: \"STATUS\", value: (r) => String(r.status) },\n { label: \"AWAY\", value: (r) => r.away_team },\n {\n label: \"AS\",\n value: (r) => (r.away_score === null ? \"\" : String(r.away_score)),\n numeric: true,\n },\n { label: \"HOME\", value: (r) => r.home_team },\n {\n label: \"HS\",\n value: (r) => (r.home_score === null ? \"\" : String(r.home_score)),\n numeric: true,\n },\n { label: \"COMMENCED\", value: (r) => formatTime(r.commence_time) },\n ];\n printTable(scores, cols);\n });\n}\n\n/* ── futures ────────────────────────────────────────────────────────── */\n\nexport function cmdFutures(sport: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const futures = await client.getFutures(sport);\n if (flags.json) return printJson(futures);\n\n // One row per (futures market, book). The favorite is the\n // shortest-priced outcome (lowest American number = most favored).\n interface Row {\n title: string;\n market: string;\n book: string;\n outcomes: number;\n favorite: string;\n }\n const rows: Row[] = [];\n for (const ev of futures) {\n for (const m of ev.markets) {\n const priced = m.outcomes.filter((o) => o.price !== null);\n const fav = priced.reduce<(typeof priced)[number] | null>(\n (best, o) =>\n best === null || (o.price as number) < (best.price as number)\n ? o\n : best,\n null,\n );\n rows.push({\n title: ev.title,\n market: m.description,\n book: m.bookmaker_title || m.bookmaker,\n outcomes: m.outcomes.length,\n favorite: fav ? `${fav.name} ${formatPrice(fav.price)}` : \"—\",\n });\n }\n }\n const cols: Column<Row>[] = [\n { label: \"FUTURE\", value: (r) => truncate(r.title, 32) },\n { label: \"MARKET\", value: (r) => truncate(r.market, 30) },\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"N\", value: (r) => String(r.outcomes), numeric: true },\n { label: \"FAVORITE\", value: (r) => r.favorite },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── context ─────────────────────────────────────────────────────────── */\n\n/** \"Paul Skenes (R)\" — append the throwing hand when present. `hand` is typed\n * loosely so this works whether or not the installed SDK models the field. */\nfunction fmtPitcher(name: string | null, hand: unknown): string {\n if (!name) return \"—\";\n return typeof hand === \"string\" && hand ? `${name} (${hand})` : name;\n}\n\nexport function cmdContext(\n sport: string,\n eventId: string,\n flags: CommonFlags,\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const ctx = await client.getContext(sport, eventId);\n if (flags.json) return printJson(ctx);\n\n const roof = ctx.roof_type ? ` (${ctx.roof_type})` : \"\";\n process.stdout.write(\n `${ctx.away_team} @ ${ctx.home_team}\\n` +\n `${ctx.venue ?? \"venue TBD\"}${roof} · ${formatTime(ctx.commence_time)}\\n\\n` +\n `Probable pitchers : ${fmtPitcher(ctx.away_probable_pitcher, ctx.away_probable_pitcher_hand)} (away) vs ` +\n `${fmtPitcher(ctx.home_probable_pitcher, ctx.home_probable_pitcher_hand)} (home)\\n` +\n `Lineup confirmed : ${ctx.lineup_confirmed ? \"yes\" : \"no\"}\\n` +\n `Home-plate umpire : ${ctx.home_plate_umpire ?? \"—\"}\\n`,\n );\n const w = ctx.weather;\n if (ctx.is_indoor) {\n process.stdout.write(`Weather : indoor / climate-controlled\\n`);\n } else if (w) {\n const parts = [\n w.temperature_f === null ? null : `${w.temperature_f}°F`,\n w.wind_speed_mph === null\n ? null\n : `wind ${w.wind_speed_mph}mph ${w.wind_direction ?? \"\"}`.trim(),\n w.precip_probability_pct === null\n ? null\n : `precip ${w.precip_probability_pct}%`,\n w.conditions ?? null,\n ].filter(Boolean);\n process.stdout.write(`Weather : ${parts.join(\" · \")}\\n`);\n } else {\n process.stdout.write(`Weather : —\\n`);\n }\n });\n}\n\n/* ── movement ────────────────────────────────────────────────────────── */\n\nexport function cmdMovement(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; period?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const mv = await client.getMovement(sport, eventId, {\n markets: flags.markets ? flags.markets.split(\",\") : undefined,\n period: flags.period,\n });\n if (flags.json) return printJson(mv);\n\n process.stdout.write(\n `${mv.away_team} @ ${mv.home_team} — line movement & steam\\n` +\n `${mv.bookmakers.length} books\\n\\n`,\n );\n if (!mv.steam.length) {\n process.stdout.write(\"No steam moves detected.\\n\");\n return;\n }\n const cols: Column<(typeof mv.steam)[number]>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n {\n label: \"OUTCOME\",\n value: (r) => (r.description ? `${r.name} (${r.description})` : r.name),\n },\n { label: \"DIR\", value: (r) => r.consensus_direction },\n {\n label: \"BOOKS\",\n value: (r) => `${r.books_moved}/${r.books_quoting}`,\n numeric: true,\n },\n { label: \"SCORE\", value: (r) => r.steam_score.toFixed(1), numeric: true },\n {\n label: \"PROBΔ\",\n value: (r) => `${(r.avg_prob_shift * 100).toFixed(1)}%`,\n numeric: true,\n },\n ];\n printTable(mv.steam, cols);\n });\n}\n\n/* ── grand-salami ────────────────────────────────────────────────────── */\n\nexport function cmdGrandSalami(\n flags: CommonFlags & { date?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const gs = await client.getMlbGrandSalami({ date: flags.date });\n if (flags.json) return printJson(gs);\n process.stdout.write(\n `MLB Grand Salami — ${gs.date} (UTC)\\n` +\n `${gs.games_total} games · ${gs.games_completed} final · ` +\n `${gs.games_in_progress} live · ${gs.games_upcoming} upcoming\\n` +\n (gs.actual_total_runs === null\n ? `Actual total: pending\\n\\n`\n : `Actual total: ${gs.actual_total_runs} runs\\n\\n`),\n );\n const cols: Column<(typeof gs.bookmakers)[number]>[] = [\n { label: \"BOOK\", value: (r) => r.title },\n { label: \"GAMES\", value: (r) => String(r.games_priced), numeric: true },\n { label: \"LINE\", value: (r) => r.line.toFixed(1), numeric: true },\n { label: \"RESULT\", value: (r) => r.result ?? \"\" },\n ];\n printTable(gs.bookmakers, cols);\n });\n}\n\n/* ── daily-goals-total ───────────────────────────────────────────────── */\n\nexport function cmdDailyGoalsTotal(\n flags: CommonFlags & { date?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const dgt = await client.getNhlDailyGoalsTotal({ date: flags.date });\n if (flags.json) return printJson(dgt);\n process.stdout.write(\n `NHL Daily Goals Total — ${dgt.date} (UTC)\\n` +\n `${dgt.games_total} games · ${dgt.games_completed} final · ` +\n `${dgt.games_in_progress} live · ${dgt.games_upcoming} upcoming\\n` +\n (dgt.actual_total_goals === null\n ? `Actual total: pending\\n\\n`\n : `Actual total: ${dgt.actual_total_goals} goals\\n\\n`),\n );\n const cols: Column<(typeof dgt.bookmakers)[number]>[] = [\n { label: \"BOOK\", value: (r) => r.title },\n { label: \"GAMES\", value: (r) => String(r.games_priced), numeric: true },\n { label: \"LINE\", value: (r) => r.line.toFixed(1), numeric: true },\n { label: \"RESULT\", value: (r) => r.result ?? \"\" },\n ];\n printTable(dgt.bookmakers, cols);\n });\n}\n\n/* ── resolution-summary ──────────────────────────────────────────────── */\n\nexport function cmdResolutionSummary(\n flags: CommonFlags & { days?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const s = await client.getResolutionSummary(flags.days ?? 30);\n if (flags.json) return printJson(s);\n process.stdout.write(\n `${s.total_graded.toLocaleString()} props graded ` +\n `(${s.total_settled.toLocaleString()} settled) across ` +\n `${s.sports_covered} sports / ${s.events_graded.toLocaleString()} ` +\n `games — last ${s.days}d\\n\\n`,\n );\n const cols: Column<(typeof s.by_sport)[number]>[] = [\n { label: \"SPORT\", value: (r) => r.title },\n { label: \"KEY\", value: (r) => r.sport_key },\n { label: \"GRADED\", value: (r) => r.graded.toLocaleString(), numeric: true },\n { label: \"GAMES\", value: (r) => String(r.events), numeric: true },\n ];\n printTable(s.by_sport, cols);\n });\n}\n\n/* ── dfs-payouts ─────────────────────────────────────────────────────── */\n\nexport function cmdDfsPayouts(\n flags: CommonFlags & { legWinProb?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const t = await client.getDfsPayouts({ legWinProb: flags.legWinProb });\n if (flags.json) return printJson(t);\n const withEv = flags.legWinProb !== undefined;\n process.stdout.write(\n `PrizePicks payout schedule + per-leg breakeven` +\n (withEv ? ` @ ${(flags.legWinProb! * 100).toFixed(0)}% per leg` : \"\") +\n `\\n\\n`,\n );\n const cols: Column<(typeof t.plays)[number]>[] = [\n { label: \"PLAY\", value: (r) => r.play_type },\n { label: \"LEGS\", value: (r) => String(r.legs), numeric: true },\n {\n label: \"ALL-HIT\",\n value: (r) => `${r.all_correct_multiplier.toFixed(2)}x`,\n numeric: true,\n },\n {\n label: \"BREAKEVEN\",\n value: (r) => `${(r.breakeven_leg_win_prob * 100).toFixed(1)}%`,\n numeric: true,\n },\n ];\n if (withEv) {\n cols.push(\n {\n label: \"EV/$1\",\n value: (r) => (r.expected_return ?? 0).toFixed(3),\n numeric: true,\n },\n { label: \"+EV?\", value: (r) => (r.is_plus_ev ? \"yes\" : \"no\") },\n );\n }\n printTable(t.plays, cols);\n process.stdout.write(`\\n${t.disclaimer}\\n`);\n });\n}\n\n/* ── live (cross-sport in-progress games) ────────────────────────────── */\n\nconst LIVE_SPORTS = [\n \"baseball_mlb\",\n \"basketball_nba\",\n \"hockey_nhl\",\n \"basketball_ncaab\",\n \"football_nfl\",\n \"football_ncaaf\",\n \"soccer_epl\",\n \"soccer_la_liga\",\n \"soccer_serie_a\",\n \"soccer_bundesliga\",\n \"soccer_ligue_1\",\n \"soccer_mls\",\n \"tennis\",\n \"golf\",\n \"mma_ufc\",\n];\n\nexport function cmdLive(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n // Hit /scores per sport in parallel and keep only `in_progress` rows.\n // Tolerates per-sport failure so one 404 doesn't abort the whole\n // command — the CLI is meant for casual terminal use, not strict\n // pipelines.\n type LiveRow = {\n sport: string;\n id: string;\n teams: string;\n score: string;\n period: string;\n };\n const settled = await Promise.allSettled(\n LIVE_SPORTS.map(async (sportKey): Promise<LiveRow[]> => {\n const scores = await client.getScores(sportKey, { daysFrom: 1 });\n return scores\n .filter((sc) => sc.status === \"in_progress\")\n .map((sc) => ({\n sport: sportKey,\n id: String(sc.id),\n teams: `${sc.away_team} @ ${sc.home_team}`,\n score:\n sc.home_score !== null && sc.away_score !== null\n ? `${sc.away_score}-${sc.home_score}`\n : \"\",\n period: typeof sc.period === \"string\" ? sc.period : \"\",\n }));\n }),\n );\n const rows: LiveRow[] = [];\n for (const r of settled) {\n if (r.status !== \"fulfilled\") continue;\n rows.push(...r.value);\n }\n if (flags.json) return printJson(rows);\n if (rows.length === 0) {\n process.stdout.write(\"(no games in progress right now)\\n\");\n return;\n }\n const cols: Column<LiveRow>[] = [\n { label: \"SPORT\", value: (r) => r.sport },\n { label: \"ID\", value: (r) => r.id },\n { label: \"MATCHUP\", value: (r) => r.teams },\n { label: \"SCORE\", value: (r) => r.score },\n { label: \"PERIOD\", value: (r) => r.period },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── ev (cross-book +EV) ────────────────────────────────────────────── */\n\nexport function cmdEv(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; plus?: boolean },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getEventEv(sport, eventId, {\n markets: parseMarketsFlag(flags.markets),\n });\n if (flags.json) return printJson(resp);\n type Row = {\n market: string;\n player: string;\n point: string;\n side: string;\n book: string;\n price: string;\n ev: string;\n plus: boolean;\n };\n const rows: Row[] = [];\n for (const line of resp.lines) {\n for (const o of line.outcomes) {\n rows.push({\n market: line.market_key,\n player: line.description,\n point: formatPoint(line.point),\n side: o.name,\n book: o.book_title,\n price: formatPrice(o.price),\n ev: `${o.ev_pct >= 0 ? \"+\" : \"\"}${o.ev_pct.toFixed(2)}%`,\n plus: o.is_plus_ev,\n });\n }\n }\n const filtered = flags.plus ? rows.filter((r) => r.plus) : rows;\n // Sort +EV first regardless of filter — the most-actionable rows\n // should land at the top of the terminal, not the bottom.\n filtered.sort((a, b) => parseFloat(b.ev) - parseFloat(a.ev));\n process.stdout.write(\n `${resp.away_team} @ ${resp.home_team} · fair anchor: ${resp.fair_source_default}\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n { label: \"EV%\", value: (r) => r.ev, numeric: true },\n ];\n printTable(filtered, cols);\n });\n}\n\n/* ── player-history ─────────────────────────────────────────────────── */\n\nexport function cmdPlayerHistory(\n sport: string,\n player: string,\n flags: CommonFlags & {\n market: string;\n bookmaker?: string;\n limit?: number;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getPlayerHistory(sport, player, {\n market: flags.market,\n bookmaker: flags.bookmaker,\n limit: flags.limit,\n });\n if (flags.json) return printJson(resp);\n process.stdout.write(\n `${resp.player_name} · ${resp.market} (${resp.entries.length} entries)\\n`,\n );\n type Entry = (typeof resp.entries)[number];\n const cols: Column<Entry>[] = [\n { label: \"DATE\", value: (r) => formatTime(r.commence_time).slice(0, 10) },\n { label: \"MATCHUP\", value: (r) => `${r.away_team} @ ${r.home_team}` },\n { label: \"BOOK\", value: (r) => r.bookmaker_title },\n {\n label: \"LINE\",\n value: (r) => formatPoint(r.line),\n numeric: true,\n },\n { label: \"OVER\", value: (r) => formatPrice(r.over_price), numeric: true },\n {\n label: \"UNDER\",\n value: (r) => formatPrice(r.under_price),\n numeric: true,\n },\n {\n label: \"ACTUAL\",\n value: (r) => (r.actual_value === null ? \"\" : String(r.actual_value)),\n numeric: true,\n },\n {\n label: \"RESULT\",\n value: (r) => {\n if (r.over_result === \"won\") return \"OVER ✓\";\n if (r.under_result === \"won\") return \"UNDER ✓\";\n if (r.over_result === \"push\" || r.under_result === \"push\") return \"PUSH\";\n if (r.over_result === \"void\" || r.under_result === \"void\") return \"VOID\";\n return \"\";\n },\n },\n ];\n printTable(resp.entries, cols);\n });\n}\n\n/* ── player-trends ──────────────────────────────────────────────────── */\n\nfunction formatOverPct(w: HitRateSplit | null): string {\n if (!w || w.over_pct === null || w.over_pct === undefined) return \"\";\n return `${w.over_pct.toFixed(0)}%`;\n}\n\nexport function cmdPlayerTrends(\n sport: string,\n player: string,\n flags: CommonFlags & {\n market?: string;\n dfsOddsType?: \"standard\" | \"goblin\" | \"demon\";\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getPlayerTrends(sport, player, {\n market: flags.market,\n dfsOddsType: flags.dfsOddsType,\n });\n if (flags.json) return printJson(resp);\n process.stdout.write(\n `${resp.player_name} · ${resp.sport_key} (${resp.markets.length} markets)\\n`,\n );\n const cols: Column<PlayerMarketTrend>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n {\n label: \"GAMES\",\n value: (r) => String(r.games_graded),\n numeric: true,\n },\n { label: \"LINE\", value: (r) => formatPoint(r.recent_line), numeric: true },\n {\n label: \"AVG\",\n value: (r) =>\n r.avg_actual === null || r.avg_actual === undefined\n ? \"\"\n : r.avg_actual.toFixed(2),\n numeric: true,\n },\n { label: \"L5 O%\", value: (r) => formatOverPct(r.last_5), numeric: true },\n { label: \"L10 O%\", value: (r) => formatOverPct(r.last_10), numeric: true },\n { label: \"L20 O%\", value: (r) => formatOverPct(r.last_20), numeric: true },\n {\n label: \"STREAK\",\n value: (r) => {\n const s = r.current_streak;\n if (!s) return \"\";\n return `${s.length}× ${s.result}`;\n },\n },\n ];\n printTable(resp.markets, cols);\n });\n}\n\n/* ── export-resolved-props ──────────────────────────────────────────── */\n\nexport function cmdExportResolvedProps(\n flags: CommonFlags & {\n sport: string;\n market?: string;\n bookmaker?: string;\n since?: string;\n until?: string;\n out?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.out) {\n const path = await client.exportResolvedProps({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n outPath: flags.out,\n });\n process.stdout.write(`exported → ${path}\\n`);\n return;\n }\n // No --out: stream raw CSV bytes straight to stdout so a user can\n // pipe `propline export-resolved-props --sport mlb | head` to\n // sample. --json is meaningless here since the API only emits CSV;\n // we ignore it for this command.\n const buf = await client.exportResolvedProps({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n });\n process.stdout.write(buf);\n });\n}\n\n/* ── export-odds-history ────────────────────────────────────────────── */\n\nexport function cmdExportOddsHistory(\n flags: CommonFlags & {\n sport: string;\n market?: string;\n bookmaker?: string;\n since?: string;\n until?: string;\n out?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.out) {\n const path = await client.exportOddsHistory({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n outPath: flags.out,\n });\n process.stdout.write(`exported → ${path}\\n`);\n return;\n }\n // No --out: stream raw CSV bytes to stdout. The API only emits CSV,\n // so --json is meaningless here and ignored. This dataset is large —\n // pass --since/--until to page month-by-month.\n const buf = await client.exportOddsHistory({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n });\n process.stdout.write(buf);\n });\n}\n\n/* ── webhooks ───────────────────────────────────────────────────────── */\n\nexport function cmdWebhooksList(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const hooks = await client.listWebhooks();\n if (flags.json) return printJson(hooks);\n type H = (typeof hooks)[number];\n const cols: Column<H>[] = [\n { label: \"ID\", value: (r) => String(r.id), numeric: true },\n { label: \"URL\", value: (r) => truncate(r.url, 50) },\n { label: \"EVENTS\", value: (r) => (r.events ?? []).join(\",\") },\n { label: \"ACTIVE\", value: (r) => (r.active ? \"yes\" : \"no\") },\n { label: \"SPORT\", value: (r) => r.filter_sport_key ?? \"\" },\n { label: \"MARKET\", value: (r) => r.filter_market_key ?? \"\" },\n { label: \"CREATED\", value: (r) => formatTime(r.created_at) },\n ];\n printTable(hooks, cols);\n });\n}\n\nexport function cmdWebhooksCreate(\n flags: CommonFlags & {\n url: string;\n events?: string;\n sport?: string;\n market?: string;\n player?: string;\n eventId?: number;\n minPriceChangePct?: number;\n minSteamScore?: number;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const events = flags.events\n ? (flags.events.split(\",\").map((s) => s.trim()) as Array<\n \"line_movement\" | \"resolution\" | \"steam\"\n >)\n : undefined;\n const hook = await client.createWebhook({\n url: flags.url,\n events,\n filterSportKey: flags.sport,\n filterMarketKey: flags.market,\n filterPlayerName: flags.player,\n filterEventId: flags.eventId,\n minPriceChangePct: flags.minPriceChangePct,\n minSteamScore: flags.minSteamScore,\n });\n if (flags.json) return printJson(hook);\n process.stdout.write(\n `webhook ${hook.id} created.\\n` +\n `url: ${hook.url}\\n` +\n `events: ${(hook.events ?? []).join(\",\") || \"(all)\"}\\n` +\n `secret: ${hook.secret}\\n\\n` +\n `STORE THE SECRET NOW — it's only revealed once. Use it to verify\\n` +\n `the X-PropLine-Signature header on every delivery.\\n`,\n );\n });\n}\n\nexport function cmdWebhooksDelete(\n id: string,\n flags: CommonFlags,\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n await client.deleteWebhook(numeric);\n if (flags.json) return printJson({ ok: true, id: numeric });\n process.stdout.write(`webhook ${numeric} deleted.\\n`);\n });\n}\n\nexport function cmdWebhooksTest(id: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n const result = await client.testWebhook(numeric);\n if (flags.json) return printJson(result);\n process.stdout.write(`test payload queued for webhook ${numeric}.\\n`);\n });\n}\n\nexport function cmdWebhooksDeliveries(\n id: string,\n flags: CommonFlags & { limit?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n const deliveries = await client.listWebhookDeliveries(numeric, {\n limit: flags.limit,\n });\n if (flags.json) return printJson(deliveries);\n type D = (typeof deliveries)[number];\n const cols: Column<D>[] = [\n { label: \"ID\", value: (r) => String(r.id), numeric: true },\n { label: \"STATUS\", value: (r) => String(r.status) },\n {\n label: \"RESP\",\n value: (r) => (r.response_code === null ? \"\" : String(r.response_code)),\n numeric: true,\n },\n { label: \"ATTEMPTS\", value: (r) => String(r.attempts), numeric: true },\n { label: \"DELIVERED\", value: (r) => formatTime(r.delivered_at) },\n ];\n printTable(deliveries, cols);\n });\n}\n\n/* ── history ────────────────────────────────────────────────────────── */\n\nexport function cmdHistory(\n sport: string,\n eventId: string,\n flags: CommonFlags & {\n markets?: string;\n from?: string;\n to?: string;\n relativeFrom?: string;\n relativeTo?: string;\n interval?: string;\n changesOnly?: boolean;\n period?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const hist = await client.getOddsHistory(sport, eventId, {\n markets,\n from: flags.from,\n to: flags.to,\n relativeFrom: flags.relativeFrom,\n relativeTo: flags.relativeTo,\n interval: flags.interval as\n | \"30s\"\n | \"1m\"\n | \"5m\"\n | \"15m\"\n | \"30m\"\n | \"1h\"\n | undefined,\n changesOnly: flags.changesOnly,\n period: flags.period,\n });\n if (flags.json) return printJson(hist);\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n when: string;\n point: string;\n price: string;\n };\n const rows: Row[] = [];\n for (const book of hist.bookmakers ?? []) {\n for (const m of book.markets ?? []) {\n for (const o of m.outcomes ?? []) {\n for (const s of o.snapshots ?? []) {\n rows.push({\n book: book.title ?? book.key,\n market: m.key,\n player: o.description ?? \"\",\n side: o.name,\n when: formatTime(s.recorded_at),\n point: formatPoint(s.point ?? null),\n price: formatPrice(s.price),\n });\n }\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no snapshots returned — check tier access and the time window)\\n`,\n );\n return;\n }\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"WHEN\", value: (r) => r.when },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── closing ────────────────────────────────────────────────────────── */\n\nexport function cmdClosing(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; period?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const closing = await client.getOddsClosing(sport, eventId, { markets, period: flags.period });\n if (flags.json) return printJson(closing);\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n closingAt: string;\n point: string;\n price: string;\n };\n const rows: Row[] = [];\n for (const book of closing.bookmakers ?? []) {\n for (const m of book.markets ?? []) {\n for (const o of m.outcomes ?? []) {\n rows.push({\n book: book.title ?? book.key,\n market: m.key,\n player: o.description ?? \"\",\n side: o.name,\n closingAt: o.closing_at ? formatTime(o.closing_at) : \"\",\n point: formatPoint(o.point ?? null),\n price: o.price === null ? \"\" : formatPrice(o.price),\n });\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no closing lines returned — check tier access; free tier sees redacted structure)\\n`,\n );\n return;\n }\n process.stdout.write(\n `${closing.away_team} @ ${closing.home_team} (event ${closing.id})\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"CLOSED AT\", value: (r) => r.closingAt },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── helpers ────────────────────────────────────────────────────────── */\n\nfunction parseMarketsFlag(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Avoid an unused-import warning while still re-exporting the type\n * for downstream consumers who want to wire their own subcommands. */\nexport type { PropLine };\n"],"mappings":";;;AAKA,SAAS,SAAS,cAAc;;;ACIhC,SAAS,UAAU,qBAAqB;AAQjC,SAAS,YAAY,OAA8B;AACxD,QAAM,SAAS,MAAM,UAAU,QAAQ,IAAI;AAC3C,MAAI,CAAC,QAAQ;AACX,YAAQ,OAAO;AAAA,MACb;AAAA,IAGF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,SAAO,IAAI,SAAS,QAAQ;AAAA,IAC1B,SAAS,MAAM;AAAA,IACf,WAAW,MAAM,UAAU,MAAM,UAAU,MAAO;AAAA,EACpD,CAAC;AACH;AAKA,eAAsB,WAAW,IAAwC;AACvE,MAAI;AACF,UAAM,GAAG;AAAA,EACX,SAAS,KAAK;AACZ,QAAI,eAAe,eAAe;AAChC,cAAQ,OAAO,MAAM,UAAU,IAAI,OAAO;AAAA,CAAI;AAAA,IAChD,WAAW,eAAe,OAAO;AAC/B,cAAQ,OAAO,MAAM,UAAU,IAAI,OAAO;AAAA,CAAI;AAAA,IAChD,OAAO;AACL,cAAQ,OAAO,MAAM,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AAAA,IAChD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACpCO,SAAS,UAAU,MAAqB;AAC7C,UAAQ,OAAO,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI;AAC3D;AAEO,SAAS,WAAc,MAAW,SAA4B;AACnE,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,OAAO,MAAM,aAAa;AAClC;AAAA,EACF;AACA,QAAM,QAAoB,KAAK;AAAA,IAAI,CAAC,MAClC,QAAQ,IAAI,CAAC,MAAM;AACjB,YAAM,IAAI,EAAE,MAAM,CAAC;AACnB,aAAO,MAAM,UAAa,MAAM,OAAO,KAAK,OAAO,CAAC;AAAA,IACtD,CAAC;AAAA,EACH;AACA,QAAM,UAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK;AAK1C,QAAM,SAAS,QAAQ;AAAA,IAAI,CAAC,GAAG,MAC7B,KAAK,IAAI,IAAI,KAAK,IAAI,EAAE,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;AAAA,EAC/E;AAEA,WAAS,IAAI,GAAW,GAAW,SAA0B;AAC3D,UAAM,YAAY,EAAE,SAAS,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI,WAAM;AAC3D,QAAI,QAAS,QAAO,UAAU,SAAS,CAAC;AACxC,WAAO,UAAU,OAAO,CAAC;AAAA,EAC3B;AAGA,UAAQ,OAAO;AAAA,IACb,QACG,IAAI,CAAC,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,WAAW,KAAK,CAAC,EAClE,KAAK,IAAI,IAAI;AAAA,EAClB;AAEA,UAAQ,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM,SAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI;AAEvE,aAAW,OAAO,OAAO;AACvB,YAAQ,OAAO;AAAA,MACb,IACG,IAAI,CAAC,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,WAAW,KAAK,CAAC,EAClE,KAAK,IAAI,IAAI;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,YAAY,OAA0C;AACpE,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,QAAQ,IAAI,IAAI,KAAK,KAAK,OAAO,KAAK;AAC/C;AAEO,SAAS,YAAY,OAA0C;AACpE,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,KAAK,EAAG,QAAO,OAAO,KAAK;AAChD,SAAO,MAAM,QAAQ,CAAC;AACxB;AAEO,SAAS,WAAW,KAAwC;AACjE,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,IAAI,KAAK,GAAG;AACtB,MAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO;AACtC,SAAO,EAAE,YAAY,EAAE,QAAQ,aAAa,GAAG;AACjD;AAGO,SAAS,SAAS,GAAW,GAAmB;AACrD,MAAI,EAAE,UAAU,EAAG,QAAO;AAC1B,SAAO,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI;AAC7B;;;AC5DO,SAAS,UAAU,OAAmC;AAC3D,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,SAAS,MAAM,OAAO,UAAU;AACtC,QAAI,MAAM,KAAM,QAAO,UAAU,MAAM;AACvC,UAAM,OAA0C;AAAA,MAC9C,EAAE,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI;AAAA,MACpC,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,MAAM;AAAA,MACxC,EAAE,OAAO,UAAU,OAAO,CAAC,MAAO,EAAE,SAAS,QAAQ,KAAM;AAAA,IAC7D;AACA,eAAW,QAAQ,IAAI;AAAA,EACzB,CAAC;AACH;AAIO,SAAS,UAAU,OAAe,OAAmC;AAC1E,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,SAAS,MAAM,OAAO,UAAU,KAAK;AAC3C,QAAI,MAAM,KAAM,QAAO,UAAU,MAAM;AACvC,UAAM,OAA0C;AAAA,MAC9C,EAAE,OAAO,MAAM,OAAO,CAAC,MAAM,OAAO,EAAE,EAAE,EAAE;AAAA,MAC1C,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU;AAAA,MAC3C,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU;AAAA,MAC3C,EAAE,OAAO,aAAa,OAAO,CAAC,MAAM,WAAW,EAAE,aAAa,EAAE;AAAA,IAClE;AACA,eAAW,QAAQ,IAAI;AAAA,EACzB,CAAC;AACH;AAIO,SAAS,QACd,OACA,SACA,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,UAAU,iBAAiB,MAAM,OAAO;AAC9C,UAAM,SAAS,MAAM;AAErB,QAAI,SAAS;AACX,YAAMA,QAAO,MAAM,OAAO,QAAQ,OAAO,EAAE,SAAS,SAAS,OAAO,CAAC;AACrE,UAAI,MAAM,KAAM,QAAO,UAAUA,KAAI;AACrC,wBAAkBA,KAAI;AACtB;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,OAAO,QAAQ,OAAO,EAAE,SAAS,OAAO,CAAC;AAC5D,QAAI,MAAM,KAAM,QAAO,UAAU,IAAI;AAWrC,UAAM,OAAc,KAAK,IAAI,CAAC,OAAO;AACnC,YAAM,QAAQ,GAAG,cAAc,CAAC;AAChC,YAAMC,WAAU,MAAM,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,SAAS,UAAU,IAAI,CAAC;AAC1E,aAAO;AAAA,QACL,IAAI,OAAO,GAAG,EAAE;AAAA,QAChB,OAAO,GAAG,GAAG,SAAS,MAAM,GAAG,SAAS;AAAA,QACxC,UAAU,WAAW,GAAG,aAAa;AAAA,QACrC,OAAO,MAAM;AAAA,QACb,SAAAA;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,OAAsB;AAAA,MAC1B,EAAE,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,GAAG;AAAA,MAClC,EAAE,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,MAAM;AAAA,MAC1C,EAAE,OAAO,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS;AAAA,MAC/C,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,OAAO,EAAE,KAAK,GAAG,SAAS,KAAK;AAAA,MAC/D,EAAE,OAAO,WAAW,OAAO,CAAC,MAAM,OAAO,EAAE,OAAO,GAAG,SAAS,KAAK;AAAA,IACrE;AACA,eAAW,MAAM,IAAI;AAAA,EACvB,CAAC;AACH;AAsBA,SAAS,kBAAkB,MAA8B;AAavD,QAAM,OAAc,CAAC;AACrB,MAAI,UAAU;AACd,aAAW,QAAQ,KAAK,cAAc,CAAC,GAAG;AACxC,eAAW,UAAU,KAAK,WAAW,CAAC,GAAG;AACvC,iBAAW,KAAK,OAAO,YAAY,CAAC,GAAG;AACrC,cAAM,IAAI,EAAE;AACZ,YAAI,MAAM,QAAQ,MAAM,OAAW,WAAU;AAC7C,aAAK,KAAK;AAAA,UACR,MAAM,KAAK;AAAA,UACX,QAAQ,OAAO;AAAA,UACf,QAAQ,EAAE,eAAe;AAAA,UACzB,MAAM,EAAE;AAAA,UACR,OAAO,YAAY,EAAE,SAAS,IAAI;AAAA,UAClC,OAAO,YAAY,EAAE,KAAK;AAAA,UAC1B,MAAM,MAAM,QAAQ,MAAM,SAAY,GAAG,CAAC,MAAM;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,OAAO;AAAA,MACb;AAAA;AAAA,IACF;AACA;AAAA,EACF;AACA,QAAM,SAAS,GAAG,KAAK,SAAS,MAAM,KAAK,SAAS,WAAW,KAAK,EAAE;AAAA;AACtE,UAAQ,OAAO,MAAM,MAAM;AAC3B,QAAM,OAAsB;AAAA,IAC1B,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK;AAAA,IACtC,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,IAC1C,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,SAAS,EAAE,QAAQ,EAAE,EAAE;AAAA,IACxD,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK;AAAA,IACtC,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK;AAAA,IACtD,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK;AAAA,EACzD;AAGA,MAAI,SAAS;AACX,SAAK,KAAK,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,KAAK,CAAC;AAAA,EAClE;AACA,aAAW,MAAM,IAAI;AACvB;AAIO,SAAS,UACd,OACA,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,SAAS,MAAM,OAAO,UAAU,OAAO,EAAE,UAAU,MAAM,SAAS,CAAC;AACzE,QAAI,MAAM,KAAM,QAAO,UAAU,MAAM;AACvC,UAAM,OAA0C;AAAA,MAC9C,EAAE,OAAO,MAAM,OAAO,CAAC,MAAM,OAAO,EAAE,EAAE,EAAE;AAAA,MAC1C,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,EAAE;AAAA,MAClD,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU;AAAA,MAC3C;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAO,EAAE,eAAe,OAAO,KAAK,OAAO,EAAE,UAAU;AAAA,QAC/D,SAAS;AAAA,MACX;AAAA,MACA,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU;AAAA,MAC3C;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAO,EAAE,eAAe,OAAO,KAAK,OAAO,EAAE,UAAU;AAAA,QAC/D,SAAS;AAAA,MACX;AAAA,MACA,EAAE,OAAO,aAAa,OAAO,CAAC,MAAM,WAAW,EAAE,aAAa,EAAE;AAAA,IAClE;AACA,eAAW,QAAQ,IAAI;AAAA,EACzB,CAAC;AACH;AAIO,SAAS,WAAW,OAAe,OAAmC;AAC3E,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,UAAU,MAAM,OAAO,WAAW,KAAK;AAC7C,QAAI,MAAM,KAAM,QAAO,UAAU,OAAO;AAWxC,UAAM,OAAc,CAAC;AACrB,eAAW,MAAM,SAAS;AACxB,iBAAW,KAAK,GAAG,SAAS;AAC1B,cAAM,SAAS,EAAE,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,IAAI;AACxD,cAAM,MAAM,OAAO;AAAA,UACjB,CAAC,MAAM,MACL,SAAS,QAAS,EAAE,QAAoB,KAAK,QACzC,IACA;AAAA,UACN;AAAA,QACF;AACA,aAAK,KAAK;AAAA,UACR,OAAO,GAAG;AAAA,UACV,QAAQ,EAAE;AAAA,UACV,MAAM,EAAE,mBAAmB,EAAE;AAAA,UAC7B,UAAU,EAAE,SAAS;AAAA,UACrB,UAAU,MAAM,GAAG,IAAI,IAAI,IAAI,YAAY,IAAI,KAAK,CAAC,KAAK;AAAA,QAC5D,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,OAAsB;AAAA,MAC1B,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,SAAS,EAAE,OAAO,EAAE,EAAE;AAAA,MACvD,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,SAAS,EAAE,QAAQ,EAAE,EAAE;AAAA,MACxD,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK;AAAA,MACtC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,OAAO,EAAE,QAAQ,GAAG,SAAS,KAAK;AAAA,MAC9D,EAAE,OAAO,YAAY,OAAO,CAAC,MAAM,EAAE,SAAS;AAAA,IAChD;AACA,eAAW,MAAM,IAAI;AAAA,EACvB,CAAC;AACH;AAMA,SAAS,WAAW,MAAqB,MAAuB;AAC9D,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,OAAO,SAAS,YAAY,OAAO,GAAG,IAAI,KAAK,IAAI,MAAM;AAClE;AAEO,SAAS,WACd,OACA,SACA,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,MAAM,MAAM,OAAO,WAAW,OAAO,OAAO;AAClD,QAAI,MAAM,KAAM,QAAO,UAAU,GAAG;AAEpC,UAAM,OAAO,IAAI,YAAY,KAAK,IAAI,SAAS,MAAM;AACrD,YAAQ,OAAO;AAAA,MACb,GAAG,IAAI,SAAS,MAAM,IAAI,SAAS;AAAA,EAC9B,IAAI,SAAS,WAAW,GAAG,IAAI,SAAM,WAAW,IAAI,aAAa,CAAC;AAAA;AAAA,sBAC9C,WAAW,IAAI,uBAAuB,IAAI,0BAA0B,CAAC,cACzF,WAAW,IAAI,uBAAuB,IAAI,0BAA0B,CAAC;AAAA,sBACjD,IAAI,mBAAmB,QAAQ,IAAI;AAAA,sBACnC,IAAI,qBAAqB,QAAG;AAAA;AAAA,IACvD;AACA,UAAM,IAAI,IAAI;AACd,QAAI,IAAI,WAAW;AACjB,cAAQ,OAAO,MAAM;AAAA,CAAmD;AAAA,IAC1E,WAAW,GAAG;AACZ,YAAM,QAAQ;AAAA,QACZ,EAAE,kBAAkB,OAAO,OAAO,GAAG,EAAE,aAAa;AAAA,QACpD,EAAE,mBAAmB,OACjB,OACA,QAAQ,EAAE,cAAc,OAAO,EAAE,kBAAkB,EAAE,GAAG,KAAK;AAAA,QACjE,EAAE,2BAA2B,OACzB,OACA,UAAU,EAAE,sBAAsB;AAAA,QACtC,EAAE,cAAc;AAAA,MAClB,EAAE,OAAO,OAAO;AAChB,cAAQ,OAAO,MAAM,uBAAuB,MAAM,KAAK,QAAK,CAAC;AAAA,CAAI;AAAA,IACnE,OAAO;AACL,cAAQ,OAAO,MAAM;AAAA,CAAyB;AAAA,IAChD;AAAA,EACF,CAAC;AACH;AAIO,SAAS,YACd,OACA,SACA,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,KAAK,MAAM,OAAO,YAAY,OAAO,SAAS;AAAA,MAClD,SAAS,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,IAAI;AAAA,MACpD,QAAQ,MAAM;AAAA,IAChB,CAAC;AACD,QAAI,MAAM,KAAM,QAAO,UAAU,EAAE;AAEnC,YAAQ,OAAO;AAAA,MACb,GAAG,GAAG,SAAS,MAAM,GAAG,SAAS;AAAA,EAC5B,GAAG,WAAW,MAAM;AAAA;AAAA;AAAA,IAC3B;AACA,QAAI,CAAC,GAAG,MAAM,QAAQ;AACpB,cAAQ,OAAO,MAAM,4BAA4B;AACjD;AAAA,IACF;AACA,UAAM,OAA4C;AAAA,MAChD,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,MAC1C;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAO,EAAE,cAAc,GAAG,EAAE,IAAI,KAAK,EAAE,WAAW,MAAM,EAAE;AAAA,MACpE;AAAA,MACA,EAAE,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,oBAAoB;AAAA,MACpD;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAM,GAAG,EAAE,WAAW,IAAI,EAAE,aAAa;AAAA,QACjD,SAAS;AAAA,MACX;AAAA,MACA,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,YAAY,QAAQ,CAAC,GAAG,SAAS,KAAK;AAAA,MACxE;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAM,IAAI,EAAE,iBAAiB,KAAK,QAAQ,CAAC,CAAC;AAAA,QACpD,SAAS;AAAA,MACX;AAAA,IACF;AACA,eAAW,GAAG,OAAO,IAAI;AAAA,EAC3B,CAAC;AACH;AAIO,SAAS,eACd,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,KAAK,MAAM,OAAO,kBAAkB,EAAE,MAAM,MAAM,KAAK,CAAC;AAC9D,QAAI,MAAM,KAAM,QAAO,UAAU,EAAE;AACnC,YAAQ,OAAO;AAAA,MACb,2BAAsB,GAAG,IAAI;AAAA,EACxB,GAAG,WAAW,eAAY,GAAG,eAAe,eAC5C,GAAG,iBAAiB,cAAW,GAAG,cAAc;AAAA,KAClD,GAAG,sBAAsB,OACtB;AAAA;AAAA,IACA,iBAAiB,GAAG,iBAAiB;AAAA;AAAA;AAAA,IAC7C;AACA,UAAM,OAAiD;AAAA,MACrD,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM;AAAA,MACvC,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,OAAO,EAAE,YAAY,GAAG,SAAS,KAAK;AAAA,MACtE,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK,QAAQ,CAAC,GAAG,SAAS,KAAK;AAAA,MAChE,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG;AAAA,IAClD;AACA,eAAW,GAAG,YAAY,IAAI;AAAA,EAChC,CAAC;AACH;AAIO,SAAS,mBACd,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,MAAM,MAAM,OAAO,sBAAsB,EAAE,MAAM,MAAM,KAAK,CAAC;AACnE,QAAI,MAAM,KAAM,QAAO,UAAU,GAAG;AACpC,YAAQ,OAAO;AAAA,MACb,gCAA2B,IAAI,IAAI;AAAA,EAC9B,IAAI,WAAW,eAAY,IAAI,eAAe,eAC9C,IAAI,iBAAiB,cAAW,IAAI,cAAc;AAAA,KACpD,IAAI,uBAAuB,OACxB;AAAA;AAAA,IACA,iBAAiB,IAAI,kBAAkB;AAAA;AAAA;AAAA,IAC/C;AACA,UAAM,OAAkD;AAAA,MACtD,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM;AAAA,MACvC,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,OAAO,EAAE,YAAY,GAAG,SAAS,KAAK;AAAA,MACtE,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK,QAAQ,CAAC,GAAG,SAAS,KAAK;AAAA,MAChE,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG;AAAA,IAClD;AACA,eAAW,IAAI,YAAY,IAAI;AAAA,EACjC,CAAC;AACH;AAIO,SAAS,qBACd,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,IAAI,MAAM,OAAO,qBAAqB,MAAM,QAAQ,EAAE;AAC5D,QAAI,MAAM,KAAM,QAAO,UAAU,CAAC;AAClC,YAAQ,OAAO;AAAA,MACb,GAAG,EAAE,aAAa,eAAe,CAAC,kBAC5B,EAAE,cAAc,eAAe,CAAC,oBACjC,EAAE,cAAc,aAAa,EAAE,cAAc,eAAe,CAAC,sBAChD,EAAE,IAAI;AAAA;AAAA;AAAA,IAC1B;AACA,UAAM,OAA8C;AAAA,MAClD,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,MAAM;AAAA,MACxC,EAAE,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU;AAAA,MAC1C,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO,eAAe,GAAG,SAAS,KAAK;AAAA,MAC1E,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK;AAAA,IAClE;AACA,eAAW,EAAE,UAAU,IAAI;AAAA,EAC7B,CAAC;AACH;AAIO,SAAS,cACd,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,IAAI,MAAM,OAAO,cAAc,EAAE,YAAY,MAAM,WAAW,CAAC;AACrE,QAAI,MAAM,KAAM,QAAO,UAAU,CAAC;AAClC,UAAM,SAAS,MAAM,eAAe;AACpC,YAAQ,OAAO;AAAA,MACb,oDACG,SAAS,OAAO,MAAM,aAAc,KAAK,QAAQ,CAAC,CAAC,cAAc,MAClE;AAAA;AAAA;AAAA,IACJ;AACA,UAAM,OAA2C;AAAA,MAC/C,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU;AAAA,MAC3C,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,OAAO,EAAE,IAAI,GAAG,SAAS,KAAK;AAAA,MAC7D;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAM,GAAG,EAAE,uBAAuB,QAAQ,CAAC,CAAC;AAAA,QACpD,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAM,IAAI,EAAE,yBAAyB,KAAK,QAAQ,CAAC,CAAC;AAAA,QAC5D,SAAS;AAAA,MACX;AAAA,IACF;AACA,QAAI,QAAQ;AACV,WAAK;AAAA,QACH;AAAA,UACE,OAAO;AAAA,UACP,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,QAAQ,CAAC;AAAA,UAChD,SAAS;AAAA,QACX;AAAA,QACA,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAO,EAAE,aAAa,QAAQ,KAAM;AAAA,MAC/D;AAAA,IACF;AACA,eAAW,EAAE,OAAO,IAAI;AACxB,YAAQ,OAAO,MAAM;AAAA,EAAK,EAAE,UAAU;AAAA,CAAI;AAAA,EAC5C,CAAC;AACH;AAIA,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,QAAQ,OAAmC;AACzD,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAYhC,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,YAAY,IAAI,OAAO,aAAiC;AACtD,cAAM,SAAS,MAAM,OAAO,UAAU,UAAU,EAAE,UAAU,EAAE,CAAC;AAC/D,eAAO,OACJ,OAAO,CAAC,OAAO,GAAG,WAAW,aAAa,EAC1C,IAAI,CAAC,QAAQ;AAAA,UACZ,OAAO;AAAA,UACP,IAAI,OAAO,GAAG,EAAE;AAAA,UAChB,OAAO,GAAG,GAAG,SAAS,MAAM,GAAG,SAAS;AAAA,UACxC,OACE,GAAG,eAAe,QAAQ,GAAG,eAAe,OACxC,GAAG,GAAG,UAAU,IAAI,GAAG,UAAU,KACjC;AAAA,UACN,QAAQ,OAAO,GAAG,WAAW,WAAW,GAAG,SAAS;AAAA,QACtD,EAAE;AAAA,MACN,CAAC;AAAA,IACH;AACA,UAAM,OAAkB,CAAC;AACzB,eAAW,KAAK,SAAS;AACvB,UAAI,EAAE,WAAW,YAAa;AAC9B,WAAK,KAAK,GAAG,EAAE,KAAK;AAAA,IACtB;AACA,QAAI,MAAM,KAAM,QAAO,UAAU,IAAI;AACrC,QAAI,KAAK,WAAW,GAAG;AACrB,cAAQ,OAAO,MAAM,oCAAoC;AACzD;AAAA,IACF;AACA,UAAM,OAA0B;AAAA,MAC9B,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,MAAM;AAAA,MACxC,EAAE,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,GAAG;AAAA,MAClC,EAAE,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,MAAM;AAAA,MAC1C,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,MAAM;AAAA,MACxC,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,IAC5C;AACA,eAAW,MAAM,IAAI;AAAA,EACvB,CAAC;AACH;AAIO,SAAS,MACd,OACA,SACA,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,OAAO,MAAM,OAAO,WAAW,OAAO,SAAS;AAAA,MACnD,SAAS,iBAAiB,MAAM,OAAO;AAAA,IACzC,CAAC;AACD,QAAI,MAAM,KAAM,QAAO,UAAU,IAAI;AAWrC,UAAM,OAAc,CAAC;AACrB,eAAW,QAAQ,KAAK,OAAO;AAC7B,iBAAW,KAAK,KAAK,UAAU;AAC7B,aAAK,KAAK;AAAA,UACR,QAAQ,KAAK;AAAA,UACb,QAAQ,KAAK;AAAA,UACb,OAAO,YAAY,KAAK,KAAK;AAAA,UAC7B,MAAM,EAAE;AAAA,UACR,MAAM,EAAE;AAAA,UACR,OAAO,YAAY,EAAE,KAAK;AAAA,UAC1B,IAAI,GAAG,EAAE,UAAU,IAAI,MAAM,EAAE,GAAG,EAAE,OAAO,QAAQ,CAAC,CAAC;AAAA,UACrD,MAAM,EAAE;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,WAAW,MAAM,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,IAAI,IAAI;AAG3D,aAAS,KAAK,CAAC,GAAG,MAAM,WAAW,EAAE,EAAE,IAAI,WAAW,EAAE,EAAE,CAAC;AAC3D,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK,SAAS,MAAM,KAAK,SAAS,sBAAmB,KAAK,mBAAmB;AAAA;AAAA,IAClF;AACA,UAAM,OAAsB;AAAA,MAC1B,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,MAC1C,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,SAAS,EAAE,QAAQ,EAAE,EAAE;AAAA,MACxD,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK;AAAA,MACtD,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK;AAAA,MACtC,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK;AAAA,MACtC,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK;AAAA,MACvD,EAAE,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI,SAAS,KAAK;AAAA,IACpD;AACA,eAAW,UAAU,IAAI;AAAA,EAC3B,CAAC;AACH;AAIO,SAAS,iBACd,OACA,QACA,OAKe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,OAAO,MAAM,OAAO,iBAAiB,OAAO,QAAQ;AAAA,MACxD,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,IACf,CAAC;AACD,QAAI,MAAM,KAAM,QAAO,UAAU,IAAI;AACrC,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK,WAAW,SAAM,KAAK,MAAM,KAAK,KAAK,QAAQ,MAAM;AAAA;AAAA,IAC9D;AAEA,UAAM,OAAwB;AAAA,MAC5B,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,WAAW,EAAE,aAAa,EAAE,MAAM,GAAG,EAAE,EAAE;AAAA,MACxE,EAAE,OAAO,WAAW,OAAO,CAAC,MAAM,GAAG,EAAE,SAAS,MAAM,EAAE,SAAS,GAAG;AAAA,MACpE,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,gBAAgB;AAAA,MACjD;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAM,YAAY,EAAE,IAAI;AAAA,QAChC,SAAS;AAAA,MACX;AAAA,MACA,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,YAAY,EAAE,UAAU,GAAG,SAAS,KAAK;AAAA,MACxE;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAM,YAAY,EAAE,WAAW;AAAA,QACvC,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAO,EAAE,iBAAiB,OAAO,KAAK,OAAO,EAAE,YAAY;AAAA,QACnE,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAM;AACZ,cAAI,EAAE,gBAAgB,MAAO,QAAO;AACpC,cAAI,EAAE,iBAAiB,MAAO,QAAO;AACrC,cAAI,EAAE,gBAAgB,UAAU,EAAE,iBAAiB,OAAQ,QAAO;AAClE,cAAI,EAAE,gBAAgB,UAAU,EAAE,iBAAiB,OAAQ,QAAO;AAClE,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,eAAW,KAAK,SAAS,IAAI;AAAA,EAC/B,CAAC;AACH;AAIA,SAAS,cAAc,GAAgC;AACrD,MAAI,CAAC,KAAK,EAAE,aAAa,QAAQ,EAAE,aAAa,OAAW,QAAO;AAClE,SAAO,GAAG,EAAE,SAAS,QAAQ,CAAC,CAAC;AACjC;AAEO,SAAS,gBACd,OACA,QACA,OAIe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,OAAO,MAAM,OAAO,gBAAgB,OAAO,QAAQ;AAAA,MACvD,QAAQ,MAAM;AAAA,MACd,aAAa,MAAM;AAAA,IACrB,CAAC;AACD,QAAI,MAAM,KAAM,QAAO,UAAU,IAAI;AACrC,YAAQ,OAAO;AAAA,MACb,GAAG,KAAK,WAAW,SAAM,KAAK,SAAS,KAAK,KAAK,QAAQ,MAAM;AAAA;AAAA,IACjE;AACA,UAAM,OAAoC;AAAA,MACxC,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,MAC1C;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAM,OAAO,EAAE,YAAY;AAAA,QACnC,SAAS;AAAA,MACX;AAAA,MACA,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,YAAY,EAAE,WAAW,GAAG,SAAS,KAAK;AAAA,MACzE;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MACN,EAAE,eAAe,QAAQ,EAAE,eAAe,SACtC,KACA,EAAE,WAAW,QAAQ,CAAC;AAAA,QAC5B,SAAS;AAAA,MACX;AAAA,MACA,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,cAAc,EAAE,MAAM,GAAG,SAAS,KAAK;AAAA,MACvE,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,GAAG,SAAS,KAAK;AAAA,MACzE,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,GAAG,SAAS,KAAK;AAAA,MACzE;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAM;AACZ,gBAAM,IAAI,EAAE;AACZ,cAAI,CAAC,EAAG,QAAO;AACf,iBAAO,GAAG,EAAE,MAAM,QAAK,EAAE,MAAM;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AACA,eAAW,KAAK,SAAS,IAAI;AAAA,EAC/B,CAAC;AACH;AAIO,SAAS,uBACd,OAQe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,QAAI,MAAM,KAAK;AACb,YAAM,OAAO,MAAM,OAAO,oBAAoB;AAAA,QAC5C,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,QACb,SAAS,MAAM;AAAA,MACjB,CAAC;AACD,cAAQ,OAAO,MAAM,mBAAc,IAAI;AAAA,CAAI;AAC3C;AAAA,IACF;AAKA,UAAM,MAAM,MAAM,OAAO,oBAAoB;AAAA,MAC3C,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,IACf,CAAC;AACD,YAAQ,OAAO,MAAM,GAAG;AAAA,EAC1B,CAAC;AACH;AAIO,SAAS,qBACd,OAQe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,QAAI,MAAM,KAAK;AACb,YAAM,OAAO,MAAM,OAAO,kBAAkB;AAAA,QAC1C,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,QACb,SAAS,MAAM;AAAA,MACjB,CAAC;AACD,cAAQ,OAAO,MAAM,mBAAc,IAAI;AAAA,CAAI;AAC3C;AAAA,IACF;AAIA,UAAM,MAAM,MAAM,OAAO,kBAAkB;AAAA,MACzC,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,IACf,CAAC;AACD,YAAQ,OAAO,MAAM,GAAG;AAAA,EAC1B,CAAC;AACH;AAIO,SAAS,gBAAgB,OAAmC;AACjE,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,QAAQ,MAAM,OAAO,aAAa;AACxC,QAAI,MAAM,KAAM,QAAO,UAAU,KAAK;AAEtC,UAAM,OAAoB;AAAA,MACxB,EAAE,OAAO,MAAM,OAAO,CAAC,MAAM,OAAO,EAAE,EAAE,GAAG,SAAS,KAAK;AAAA,MACzD,EAAE,OAAO,OAAO,OAAO,CAAC,MAAM,SAAS,EAAE,KAAK,EAAE,EAAE;AAAA,MAClD,EAAE,OAAO,UAAU,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,GAAG,EAAE;AAAA,MAC5D,EAAE,OAAO,UAAU,OAAO,CAAC,MAAO,EAAE,SAAS,QAAQ,KAAM;AAAA,MAC3D,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,oBAAoB,GAAG;AAAA,MACzD,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,qBAAqB,GAAG;AAAA,MAC3D,EAAE,OAAO,WAAW,OAAO,CAAC,MAAM,WAAW,EAAE,UAAU,EAAE;AAAA,IAC7D;AACA,eAAW,OAAO,IAAI;AAAA,EACxB,CAAC;AACH;AAEO,SAAS,kBACd,OAUe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,SAAS,MAAM,SAChB,MAAM,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAG5C;AACJ,UAAM,OAAO,MAAM,OAAO,cAAc;AAAA,MACtC,KAAK,MAAM;AAAA,MACX;AAAA,MACA,gBAAgB,MAAM;AAAA,MACtB,iBAAiB,MAAM;AAAA,MACvB,kBAAkB,MAAM;AAAA,MACxB,eAAe,MAAM;AAAA,MACrB,mBAAmB,MAAM;AAAA,MACzB,eAAe,MAAM;AAAA,IACvB,CAAC;AACD,QAAI,MAAM,KAAM,QAAO,UAAU,IAAI;AACrC,YAAQ,OAAO;AAAA,MACb,WAAW,KAAK,EAAE;AAAA,UACL,KAAK,GAAG;AAAA,WACP,KAAK,UAAU,CAAC,GAAG,KAAK,GAAG,KAAK,OAAO;AAAA,UACxC,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAG1B;AAAA,EACF,CAAC;AACH;AAEO,SAAS,kBACd,IACA,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,UAAU,OAAO,EAAE;AACzB,QAAI,CAAC,OAAO,SAAS,OAAO,GAAG;AAC7B,YAAM,IAAI,MAAM,+BAA+B,EAAE,EAAE;AAAA,IACrD;AACA,UAAM,OAAO,cAAc,OAAO;AAClC,QAAI,MAAM,KAAM,QAAO,UAAU,EAAE,IAAI,MAAM,IAAI,QAAQ,CAAC;AAC1D,YAAQ,OAAO,MAAM,WAAW,OAAO;AAAA,CAAa;AAAA,EACtD,CAAC;AACH;AAEO,SAAS,gBAAgB,IAAY,OAAmC;AAC7E,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,UAAU,OAAO,EAAE;AACzB,QAAI,CAAC,OAAO,SAAS,OAAO,GAAG;AAC7B,YAAM,IAAI,MAAM,+BAA+B,EAAE,EAAE;AAAA,IACrD;AACA,UAAM,SAAS,MAAM,OAAO,YAAY,OAAO;AAC/C,QAAI,MAAM,KAAM,QAAO,UAAU,MAAM;AACvC,YAAQ,OAAO,MAAM,mCAAmC,OAAO;AAAA,CAAK;AAAA,EACtE,CAAC;AACH;AAEO,SAAS,sBACd,IACA,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,UAAU,OAAO,EAAE;AACzB,QAAI,CAAC,OAAO,SAAS,OAAO,GAAG;AAC7B,YAAM,IAAI,MAAM,+BAA+B,EAAE,EAAE;AAAA,IACrD;AACA,UAAM,aAAa,MAAM,OAAO,sBAAsB,SAAS;AAAA,MAC7D,OAAO,MAAM;AAAA,IACf,CAAC;AACD,QAAI,MAAM,KAAM,QAAO,UAAU,UAAU;AAE3C,UAAM,OAAoB;AAAA,MACxB,EAAE,OAAO,MAAM,OAAO,CAAC,MAAM,OAAO,EAAE,EAAE,GAAG,SAAS,KAAK;AAAA,MACzD,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,EAAE;AAAA,MAClD;AAAA,QACE,OAAO;AAAA,QACP,OAAO,CAAC,MAAO,EAAE,kBAAkB,OAAO,KAAK,OAAO,EAAE,aAAa;AAAA,QACrE,SAAS;AAAA,MACX;AAAA,MACA,EAAE,OAAO,YAAY,OAAO,CAAC,MAAM,OAAO,EAAE,QAAQ,GAAG,SAAS,KAAK;AAAA,MACrE,EAAE,OAAO,aAAa,OAAO,CAAC,MAAM,WAAW,EAAE,YAAY,EAAE;AAAA,IACjE;AACA,eAAW,YAAY,IAAI;AAAA,EAC7B,CAAC;AACH;AAIO,SAAS,WACd,OACA,SACA,OAUe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,UAAU,iBAAiB,MAAM,OAAO;AAC9C,UAAM,OAAO,MAAM,OAAO,eAAe,OAAO,SAAS;AAAA,MACvD;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,IAAI,MAAM;AAAA,MACV,cAAc,MAAM;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAQhB,aAAa,MAAM;AAAA,MACnB,QAAQ,MAAM;AAAA,IAChB,CAAC;AACD,QAAI,MAAM,KAAM,QAAO,UAAU,IAAI;AAUrC,UAAM,OAAc,CAAC;AACrB,eAAW,QAAQ,KAAK,cAAc,CAAC,GAAG;AACxC,iBAAW,KAAK,KAAK,WAAW,CAAC,GAAG;AAClC,mBAAW,KAAK,EAAE,YAAY,CAAC,GAAG;AAChC,qBAAW,KAAK,EAAE,aAAa,CAAC,GAAG;AACjC,iBAAK,KAAK;AAAA,cACR,MAAM,KAAK,SAAS,KAAK;AAAA,cACzB,QAAQ,EAAE;AAAA,cACV,QAAQ,EAAE,eAAe;AAAA,cACzB,MAAM,EAAE;AAAA,cACR,MAAM,WAAW,EAAE,WAAW;AAAA,cAC9B,OAAO,YAAY,EAAE,SAAS,IAAI;AAAA,cAClC,OAAO,YAAY,EAAE,KAAK;AAAA,YAC5B,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,WAAW,GAAG;AACrB,cAAQ,OAAO;AAAA,QACb;AAAA;AAAA,MACF;AACA;AAAA,IACF;AACA,UAAM,OAAsB;AAAA,MAC1B,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK;AAAA,MACtC,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,MAC1C,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,SAAS,EAAE,QAAQ,EAAE,EAAE;AAAA,MACxD,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK;AAAA,MACtC,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK;AAAA,MACtC,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK;AAAA,MACtD,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK;AAAA,IACzD;AACA,eAAW,MAAM,IAAI;AAAA,EACvB,CAAC;AACH;AAIO,SAAS,WACd,OACA,SACA,OACe;AACf,SAAO,WAAW,YAAY;AAC5B,UAAM,SAAS,YAAY,KAAK;AAChC,UAAM,UAAU,iBAAiB,MAAM,OAAO;AAC9C,UAAM,UAAU,MAAM,OAAO,eAAe,OAAO,SAAS,EAAE,SAAS,QAAQ,MAAM,OAAO,CAAC;AAC7F,QAAI,MAAM,KAAM,QAAO,UAAU,OAAO;AAUxC,UAAM,OAAc,CAAC;AACrB,eAAW,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAC3C,iBAAW,KAAK,KAAK,WAAW,CAAC,GAAG;AAClC,mBAAW,KAAK,EAAE,YAAY,CAAC,GAAG;AAChC,eAAK,KAAK;AAAA,YACR,MAAM,KAAK,SAAS,KAAK;AAAA,YACzB,QAAQ,EAAE;AAAA,YACV,QAAQ,EAAE,eAAe;AAAA,YACzB,MAAM,EAAE;AAAA,YACR,WAAW,EAAE,aAAa,WAAW,EAAE,UAAU,IAAI;AAAA,YACrD,OAAO,YAAY,EAAE,SAAS,IAAI;AAAA,YAClC,OAAO,EAAE,UAAU,OAAO,KAAK,YAAY,EAAE,KAAK;AAAA,UACpD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,WAAW,GAAG;AACrB,cAAQ,OAAO;AAAA,QACb;AAAA;AAAA,MACF;AACA;AAAA,IACF;AACA,YAAQ,OAAO;AAAA,MACb,GAAG,QAAQ,SAAS,MAAM,QAAQ,SAAS,WAAW,QAAQ,EAAE;AAAA;AAAA,IAClE;AACA,UAAM,OAAsB;AAAA,MAC1B,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK;AAAA,MACtC,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,EAAE,OAAO;AAAA,MAC1C,EAAE,OAAO,UAAU,OAAO,CAAC,MAAM,SAAS,EAAE,QAAQ,EAAE,EAAE;AAAA,MACxD,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK;AAAA,MACtC,EAAE,OAAO,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU;AAAA,MAChD,EAAE,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK;AAAA,MACtD,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK;AAAA,IACzD;AACA,eAAW,MAAM,IAAI;AAAA,EACvB,CAAC;AACH;AAIA,SAAS,iBAAiB,OAAiD;AACzE,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACnB;;;AHrhCO,IAAM,UAAU;AAEvB,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,UAAU,EACf;AAAA,EACC;AACF,EACC,QAAQ,OAAO,EAKf;AAAA,EACC,IAAI,OAAO,mBAAmB,kBAAkB,EAAE,IAAI,kBAAkB;AAC1E,EACC;AAAA,EACC,IAAI;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF,EACC;AAAA,EACC,IAAI;AAAA,IACF;AAAA,IACA;AAAA,EACF,EAAE,UAAU,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AACpC,EACC,UAAU,IAAI,OAAO,UAAU,kCAAkC,CAAC,EAClE,mBAAmB;AAItB,SAAS,OAAO,KAAuC;AACrD,QAAM,MAAM,IAAI,KAAK;AACrB,QAAM,SAAS,IAAI,QAAQ,KAAK,KAAK,CAAC;AACtC,SAAO,EAAE,GAAG,QAAQ,GAAG,IAAI;AAC7B;AAIA,QACG,QAAQ,QAAQ,EAChB,YAAY,uBAAuB,EACnC,OAAO,WAAyB;AAC/B,SAAO,UAAU,OAAO,IAAI,CAAC;AAC/B,CAAC;AAIH,QACG,QAAQ,QAAQ,EAChB,SAAS,WAAW,+BAA+B,EACnD,YAAY,kCAAkC,EAC9C,OAAO,SAAyB,OAAe;AAC9C,SAAO,UAAU,OAAO,OAAO,IAAI,CAAC;AACtC,CAAC;AAIH,QACG,QAAQ,MAAM,EACd,SAAS,WAAW,+BAA+B,EACnD,SAAS,cAAc,wCAAwC,EAC/D;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC,YAAY,mCAAmC,EAC/C,OAAO,SAAyB,OAAe,SAA6B;AAC3E,SAAO,QAAQ,OAAO,SAAS,OAAO,IAAI,CAAC;AAC7C,CAAC;AAIH,QACG,QAAQ,QAAQ,EAChB,SAAS,WAAW,WAAW,EAC/B;AAAA,EACC;AAAA,EACA;AAAA,EACA,CAAC,MAAM,SAAS,GAAG,EAAE;AACvB,EACC,YAAY,4BAA4B,EACxC,OAAO,SAAyB,OAAe;AAC9C,SAAO,UAAU,OAAO,OAAO,IAAI,CAAC;AACtC,CAAC;AAIH,QACG,QAAQ,SAAS,EACjB,SAAS,WAAW,WAAW,EAC/B;AAAA,EACC;AACF,EACC,OAAO,SAAyB,OAAe;AAC9C,SAAO,WAAW,OAAO,OAAO,IAAI,CAAC;AACvC,CAAC;AAIH,QACG,QAAQ,SAAS,EACjB,SAAS,WAAW,WAAW,EAC/B,SAAS,cAAc,UAAU,EACjC;AAAA,EACC;AACF,EACC,OAAO,SAAyB,OAAe,SAAiB;AAC/D,SAAO,WAAW,OAAO,SAAS,OAAO,IAAI,CAAC;AAChD,CAAC;AAIH,QACG,QAAQ,UAAU,EAClB,SAAS,WAAW,WAAW,EAC/B,SAAS,cAAc,UAAU,EACjC,OAAO,wBAAwB,0DAA0D,EACzF;AAAA,EACC;AAAA,EACA;AACF,EACC,YAAY,uDAAuD,EACnE,OAAO,SAAyB,OAAe,SAAiB;AAC/D,SAAO,YAAY,OAAO,SAAS,OAAO,IAAI,CAAC;AACjD,CAAC;AAIH,QACG,QAAQ,cAAc,EACtB;AAAA,EACC;AAAA,EACA;AACF,EACC,YAAY,8DAAyD,EACrE,OAAO,WAAyB;AAC/B,SAAO,eAAe,OAAO,IAAI,CAAC;AACpC,CAAC;AAIH,QACG,QAAQ,mBAAmB,EAC3B;AAAA,EACC;AAAA,EACA;AACF,EACC,YAAY,oEAA+D,EAC3E,OAAO,WAAyB;AAC/B,SAAO,mBAAmB,OAAO,IAAI,CAAC;AACxC,CAAC;AAIH,QACG,QAAQ,oBAAoB,EAC5B;AAAA,EACC;AAAA,EACA;AAAA,EACA,CAAC,MAAM,SAAS,GAAG,EAAE;AACvB,EACC,YAAY,iDAAiD,EAC7D,OAAO,WAAyB;AAC/B,SAAO,qBAAqB,OAAO,IAAI,CAAC;AAC1C,CAAC;AAIH,QACG,QAAQ,aAAa,EACrB;AAAA,EACC;AAAA,EACA;AAAA,EACA,CAAC,MAAM,WAAW,CAAC;AACrB,EACC,YAAY,kEAAkE,EAC9E,OAAO,WAAyB;AAC/B,SAAO,cAAc,OAAO,IAAI,CAAC;AACnC,CAAC;AAIH,QACG,QAAQ,MAAM,EACd;AAAA,EACC;AACF,EACC,OAAO,WAAyB;AAC/B,SAAO,QAAQ,OAAO,IAAI,CAAC;AAC7B,CAAC;AAIH,QACG,QAAQ,IAAI,EACZ,SAAS,WAAW,WAAW,EAC/B,SAAS,cAAc,UAAU,EACjC,OAAO,wBAAwB,6BAA6B,EAC5D;AAAA,EACC;AAAA,EACA;AAAA,EACA;AACF,EACC,YAAY,4DAA4D,EACxE,OAAO,SAAyB,OAAe,SAAiB;AAC/D,SAAO,MAAM,OAAO,SAAS,OAAO,IAAI,CAAC;AAC3C,CAAC;AAIH,QACG,QAAQ,SAAS,EACjB,SAAS,WAAW,WAAW,EAC/B,SAAS,cAAc,UAAU,EACjC,OAAO,wBAAwB,0DAA0D,EACzF,OAAO,gBAAgB,mDAAmD,EAC1E,OAAO,cAAc,oDAAoD,EACzE;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,kBAAkB,8DAA8D,KAAK,EAC5F;AAAA,EACC;AAAA,EACA;AACF,EACC,YAAY,oEAAoE,EAChF,OAAO,SAAyB,OAAe,SAAiB;AAC/D,SAAO,WAAW,OAAO,SAAS,OAAO,IAAI,CAAU;AACzD,CAAC;AAIH,QACG,QAAQ,SAAS,EACjB,SAAS,WAAW,WAAW,EAC/B,SAAS,cAAc,UAAU,EACjC,OAAO,wBAAwB,0DAA0D,EACzF;AAAA,EACC;AAAA,EACA;AACF,EACC,YAAY,qEAAgE,EAC5E,OAAO,SAAyB,OAAe,SAAiB;AAC/D,SAAO,WAAW,OAAO,SAAS,OAAO,IAAI,CAAU;AACzD,CAAC;AAIH,QACG,QAAQ,gBAAgB,EACxB,SAAS,WAAW,WAAW,EAC/B,SAAS,YAAY,qEAAgE,EACrF;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,yBAAyB,2CAA2C,EAC3E;AAAA,EAAO;AAAA,EAAmB;AAAA,EAAmC,CAAC,MAC7D,SAAS,GAAG,EAAE;AAChB,EACC,YAAY,wEAAwE,EACpF,OAAO,SAAyB,OAAe,QAAgB;AAC9D,SAAO,iBAAiB,OAAO,QAAQ,OAAO,IAAI,CAAU;AAC9D,CAAC;AAIH,QACG,QAAQ,eAAe,EACvB,SAAS,WAAW,WAAW,EAC/B,SAAS,YAAY,qEAAgE,EACrF;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AACF,EACC,OAAO,SAAyB,OAAe,QAAgB;AAC9D,SAAO,gBAAgB,OAAO,QAAQ,OAAO,IAAI,CAAU;AAC7D,CAAC;AAIH,QACG,QAAQ,uBAAuB,EAC/B,eAAe,iBAAiB,sBAAsB,EACtD,OAAO,kBAAkB,sBAAsB,EAC/C,OAAO,qBAAqB,yBAAyB,EACrD,OAAO,iBAAiB,yCAAyC,EACjE,OAAO,iBAAiB,yCAAyC,EACjE;AAAA,EACC;AAAA,EACA;AACF,EACC,YAAY,8CAA8C,EAC1D,OAAO,WAAyB;AAC/B,SAAO,uBAAuB,OAAO,IAAI,CAAU;AACrD,CAAC;AAIH,QACG,QAAQ,qBAAqB,EAC7B,eAAe,iBAAiB,sBAAsB,EACtD,OAAO,kBAAkB,sBAAsB,EAC/C,OAAO,qBAAqB,yBAAyB,EACrD,OAAO,iBAAiB,yCAAyC,EACjE,OAAO,iBAAiB,yCAAyC,EACjE;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AACF,EACC,OAAO,WAAyB;AAC/B,SAAO,qBAAqB,OAAO,IAAI,CAAU;AACnD,CAAC;AAIH,IAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,+CAA+C;AAExG,SACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,WAAyB;AAC/B,SAAO,gBAAgB,OAAO,IAAI,CAAC;AACrC,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,eAAe,eAAe,wCAAwC,EACtE;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,iBAAiB,0BAA0B,EAClD,OAAO,kBAAkB,+BAA+B,EACxD,OAAO,mBAAmB,sDAAsD,EAChF;AAAA,EACC;AAAA,EACA;AAAA,EACA,CAAC,MAAM,SAAS,GAAG,EAAE;AACvB,EACC;AAAA,EACC;AAAA,EACA;AAAA,EACA,CAAC,MAAM,WAAW,CAAC;AACrB,EACC;AAAA,EACC;AAAA,EACA;AAAA,EACA,CAAC,MAAM,WAAW,CAAC;AACrB,EACC,YAAY,mEAAmE,EAC/E,OAAO,WAAyB;AAC/B,SAAO,kBAAkB,OAAO,IAAI,CAAU;AAChD,CAAC;AAEH,SACG,QAAQ,QAAQ,EAChB,SAAS,QAAQ,YAAY,EAC7B,YAAY,kDAAkD,EAC9D,OAAO,SAAyB,IAAY;AAC3C,SAAO,kBAAkB,IAAI,OAAO,IAAI,CAAC;AAC3C,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,SAAS,QAAQ,YAAY,EAC7B,YAAY,gDAAgD,EAC5D,OAAO,SAAyB,IAAY;AAC3C,SAAO,gBAAgB,IAAI,OAAO,IAAI,CAAC;AACzC,CAAC;AAEH,SACG,QAAQ,YAAY,EACpB,SAAS,QAAQ,YAAY,EAC7B;AAAA,EAAO;AAAA,EAAmB;AAAA,EAA+B,CAAC,MACzD,SAAS,GAAG,EAAE;AAChB,EACC,YAAY,6CAA6C,EACzD,OAAO,SAAyB,IAAY;AAC3C,SAAO,sBAAsB,IAAI,OAAO,IAAI,CAAU;AACxD,CAAC;AAEH,QAAQ,WAAW,EAAE,MAAM,CAAC,QAAQ;AAClC,UAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["resp","markets"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/format.ts","../src/commands.ts"],"sourcesContent":["// PropLine CLI — terminal interface to the PropLine player props API.\n// Wraps the `propline` Node SDK; no API surface of its own. Add new\n// commands by importing a handler from ./commands.ts and registering\n// it on the matching `program.command(...)` below.\n\nimport { Command, Option } from \"commander\";\nimport {\n cmdSports,\n cmdEvents,\n cmdOdds,\n cmdScores,\n cmdFutures,\n cmdContext,\n cmdMovement,\n cmdGrandSalami,\n cmdDailyGoalsTotal,\n cmdDfsPayouts,\n cmdResolutionSummary,\n cmdLive,\n cmdEv,\n cmdPlayerHistory,\n cmdPlayerTrends,\n cmdExportResolvedProps,\n cmdExportOddsHistory,\n cmdHistory,\n cmdClosing,\n cmdWebhooksList,\n cmdWebhooksCreate,\n cmdWebhooksDelete,\n cmdWebhooksTest,\n cmdWebhooksDeliveries,\n} from \"./commands.js\";\n\nexport const VERSION = \"0.16.0\";\n\nconst program = new Command();\n\nprogram\n .name(\"propline\")\n .description(\n \"PropLine CLI — query live odds, scores, +EV plays, prop resolution, and webhooks from the terminal.\",\n )\n .version(VERSION)\n // Global flags. Each command resolves these via its own options object\n // (commander merges parent options into action callbacks for us via\n // .opts({ from: 'parent' }), but easier to just pull from this.parent\n // explicitly to stay strict-typed-friendly).\n .addOption(\n new Option(\"--api-key <key>\", \"PropLine API key\").env(\"PROPLINE_API_KEY\"),\n )\n .addOption(\n new Option(\n \"--base-url <url>\",\n \"API base URL (default https://api.prop-line.com/v1)\",\n ),\n )\n .addOption(\n new Option(\n \"--timeout <seconds>\",\n \"Request timeout in seconds (default 15)\",\n ).argParser((v) => parseInt(v, 10)),\n )\n .addOption(new Option(\"--json\", \"Emit raw JSON instead of a table\"))\n .showHelpAfterError();\n\n// Helper to merge global + command-local options into the flat shape\n// the handlers expect. Keeps each command call site terse.\nfunction gather(cmd: Command): Record<string, unknown> {\n const own = cmd.opts();\n const parent = cmd.parent?.opts() ?? {};\n return { ...parent, ...own };\n}\n\n/* ── sports ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"sports\")\n .description(\"List available sports\")\n .action(function (this: Command) {\n return cmdSports(gather(this));\n });\n\n/* ── events ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"events\")\n .argument(\"<sport>\", \"sport key (e.g. baseball_mlb)\")\n .description(\"List upcoming events for a sport\")\n .action(function (this: Command, sport: string) {\n return cmdEvents(sport, gather(this));\n });\n\n/* ── odds ───────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"odds\")\n .argument(\"<sport>\", \"sport key (e.g. baseball_mlb)\")\n .argument(\"[event_id]\", \"specific event id (omit for bulk odds)\")\n .option(\n \"-m, --markets <list>\",\n \"comma-separated market keys (e.g. h2h,spreads,totals or player_points)\",\n )\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Get current odds across all books\")\n .action(function (this: Command, sport: string, eventId: string | undefined) {\n return cmdOdds(sport, eventId, gather(this));\n });\n\n/* ── scores ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"scores\")\n .argument(\"<sport>\", \"sport key\")\n .option(\n \"-d, --days-from <n>\",\n \"days back to include (default 3)\",\n (v) => parseInt(v, 10),\n )\n .description(\"Get game scores and status\")\n .action(function (this: Command, sport: string) {\n return cmdScores(sport, gather(this));\n });\n\n/* ── futures ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"futures\")\n .argument(\"<sport>\", \"sport key\")\n .description(\n \"Season-long futures — championship/division/conference winners, MVP + awards, season win totals across books (free)\",\n )\n .action(function (this: Command, sport: string) {\n return cmdFutures(sport, gather(this));\n });\n\n/* ── context ─────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"context\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .description(\n \"Game context an event plays under — probable pitchers, lineup, umpire, weather (free)\",\n )\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdContext(sport, eventId, gather(this));\n });\n\n/* ── movement ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"movement\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Line movement + steam detection across books (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdMovement(sport, eventId, gather(this));\n });\n\n/* ── grand-salami ────────────────────────────────────────────────────── */\n\nprogram\n .command(\"grand-salami\")\n .option(\n \"--date <YYYY-MM-DD>\",\n \"UTC date (defaults to today)\",\n )\n .description(\"MLB synthetic Grand Salami — total runs + per-book line\")\n .action(function (this: Command) {\n return cmdGrandSalami(gather(this));\n });\n\n/* ── daily-goals-total ───────────────────────────────────────────────── */\n\nprogram\n .command(\"daily-goals-total\")\n .option(\n \"--date <YYYY-MM-DD>\",\n \"UTC date (defaults to today)\",\n )\n .description(\"NHL synthetic Daily Goals Total — total goals + per-book line\")\n .action(function (this: Command) {\n return cmdDailyGoalsTotal(gather(this));\n });\n\n/* ── resolution-summary ──────────────────────────────────────────────── */\n\nprogram\n .command(\"resolution-summary\")\n .option(\n \"-d, --days <n>\",\n \"look-back window, 1-90 (default 30)\",\n (v) => parseInt(v, 10),\n )\n .description(\"Graded-prop volume + per-sport breakdown (free)\")\n .action(function (this: Command) {\n return cmdResolutionSummary(gather(this));\n });\n\n/* ── dfs-payouts ─────────────────────────────────────────────────────── */\n\nprogram\n .command(\"dfs-payouts\")\n .option(\n \"--leg-win-prob <p>\",\n \"assumed per-leg win prob 0-1 (adds expected return + +EV flag)\",\n (v) => parseFloat(v),\n )\n .description(\"PrizePicks Power/Flex payout schedule + per-leg breakeven (free)\")\n .action(function (this: Command) {\n return cmdDfsPayouts(gather(this));\n });\n\n/* ── live ───────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"live\")\n .description(\n \"Show every in-progress game across the major sports (score + period)\",\n )\n .action(function (this: Command) {\n return cmdLive(gather(this));\n });\n\n/* ── ev ─────────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"ev\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys\")\n .option(\n \"--plus\",\n \"show only +EV outcomes (filter rows where ev_pct > 0)\",\n false,\n )\n .description(\"Cross-book +EV against a sharp no-vig fair line (Pro tier)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdEv(sport, eventId, gather(this));\n });\n\n/* ── history ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"history\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\"--from <iso>\", \"ISO timestamp; only include snapshots at or after\")\n .option(\"--to <iso>\", \"ISO timestamp; only include snapshots at or before\")\n .option(\n \"--relative-from <offset>\",\n \"offset relative to commence_time, e.g. -3h, -30m, -90s\",\n )\n .option(\n \"--relative-to <offset>\",\n \"offset relative to commence_time, e.g. -1m, 0\",\n )\n .option(\n \"--interval <bucket>\",\n \"downsample to one snapshot per bucket: 30s|1m|5m|15m|30m|1h\",\n )\n .option(\"--changes-only\", \"drop snapshots whose (price, point) match the previous one\", false)\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Historical line movement for an event with period filters (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdHistory(sport, eventId, gather(this) as never);\n });\n\n/* ── closing ────────────────────────────────────────────────────────── */\n\nprogram\n .command(\"closing\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<event_id>\", \"event id\")\n .option(\"-m, --markets <list>\", \"comma-separated market keys (default h2h,spreads,totals)\")\n .option(\n \"-b, --bookmakers <list>\",\n \"comma-separated bookmaker keys (e.g. draftkings,fanduel). Omit for all books\",\n )\n .option(\n \"-p, --period <codes>\",\n \"game-period filter: q1..q4, h1/h2, p1..p3, i1..i9, f3/f5/f7 (comma-separated, or 'all'). Omit for full-game only\",\n )\n .description(\"Closing line per (book, market, outcome) — CLV helper (Hobby+)\")\n .action(function (this: Command, sport: string, eventId: string) {\n return cmdClosing(sport, eventId, gather(this) as never);\n });\n\n/* ── player-history ─────────────────────────────────────────────────── */\n\nprogram\n .command(\"player-history\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<player>\", 'player name (quote if it contains spaces — e.g. \"Aaron Judge\")')\n .requiredOption(\n \"-m, --market <key>\",\n \"market key (required — e.g. pitcher_strikeouts)\",\n )\n .option(\"-b, --bookmaker <key>\", \"filter to a single book (e.g. draftkings)\")\n .option(\"-l, --limit <n>\", \"max entries (1-100, default 20)\", (v) =>\n parseInt(v, 10),\n )\n .description(\"Recent prop history for a player on a market (Pro full, Free redacted)\")\n .action(function (this: Command, sport: string, player: string) {\n return cmdPlayerHistory(sport, player, gather(this) as never);\n });\n\n/* ── player-trends ──────────────────────────────────────────────────── */\n\nprogram\n .command(\"player-trends\")\n .argument(\"<sport>\", \"sport key\")\n .argument(\"<player>\", 'player name (quote if it contains spaces — e.g. \"Aaron Judge\")')\n .option(\n \"-m, --market <key>\",\n \"filter to a single market key (e.g. batter_total_bases)\",\n )\n .option(\n \"--dfs-odds-type <flavor>\",\n \"PrizePicks flavor to compute trends against (standard | goblin | demon)\",\n )\n .description(\n \"Aggregated hit-rate trends per market — L5/L10/L20/L50 over/under splits + current streak (Pro full, Free redacted)\",\n )\n .action(function (this: Command, sport: string, player: string) {\n return cmdPlayerTrends(sport, player, gather(this) as never);\n });\n\n/* ── export-resolved-props ──────────────────────────────────────────── */\n\nprogram\n .command(\"export-resolved-props\")\n .requiredOption(\"--sport <key>\", \"sport key (required)\")\n .option(\"--market <key>\", \"filter by market key\")\n .option(\"--bookmaker <key>\", \"filter by bookmaker key\")\n .option(\"--since <iso>\", \"ISO datetime lower bound on resolved_at\")\n .option(\"--until <iso>\", \"ISO datetime upper bound on resolved_at\")\n .option(\n \"--out <path>\",\n \"write CSV to this path (default: stream CSV to stdout)\",\n )\n .description(\"Bulk CSV export of resolved props (Pro tier)\")\n .action(function (this: Command) {\n return cmdExportResolvedProps(gather(this) as never);\n });\n\n/* ── export-odds-history ────────────────────────────────────────────── */\n\nprogram\n .command(\"export-odds-history\")\n .requiredOption(\"--sport <key>\", \"sport key (required)\")\n .option(\"--market <key>\", \"filter by market key\")\n .option(\"--bookmaker <key>\", \"filter by bookmaker key\")\n .option(\"--since <iso>\", \"ISO datetime lower bound on recorded_at\")\n .option(\"--until <iso>\", \"ISO datetime upper bound on recorded_at\")\n .option(\n \"--out <path>\",\n \"write CSV to this path (default: stream CSV to stdout)\",\n )\n .description(\n \"Bulk CSV export of the full line-movement tick history (Backfill pass / Enterprise). Large — page month-by-month with --since/--until.\",\n )\n .action(function (this: Command) {\n return cmdExportOddsHistory(gather(this) as never);\n });\n\n/* ── webhooks ───────────────────────────────────────────────────────── */\n\nconst webhooks = program.command(\"webhooks\").description(\"Manage webhook subscriptions (Streaming tier)\");\n\nwebhooks\n .command(\"list\")\n .description(\"List your webhook subscriptions\")\n .action(function (this: Command) {\n return cmdWebhooksList(gather(this));\n });\n\nwebhooks\n .command(\"create\")\n .requiredOption(\"--url <url>\", \"HTTPS endpoint that will receive POSTs\")\n .option(\n \"--events <list>\",\n \"comma-separated event types: line_movement,resolution,steam (default: all)\",\n )\n .option(\"--sport <key>\", \"filter to a single sport\")\n .option(\"--market <key>\", \"filter to a single market key\")\n .option(\"--player <name>\", \"filter to a player name (case-insensitive substring)\")\n .option(\n \"--event-id <id>\",\n \"filter to one event id (numeric)\",\n (v) => parseInt(v, 10),\n )\n .option(\n \"--min-price-change-pct <n>\",\n \"minimum % change in American odds to fire a line_movement\",\n (v) => parseFloat(v),\n )\n .option(\n \"--min-steam-score <n>\",\n \"minimum 0-100 steam score to fire a steam event\",\n (v) => parseFloat(v),\n )\n .description(\"Register a webhook subscription (returns the signing secret ONCE)\")\n .action(function (this: Command) {\n return cmdWebhooksCreate(gather(this) as never);\n });\n\nwebhooks\n .command(\"delete\")\n .argument(\"<id>\", \"webhook id\")\n .description(\"Delete a webhook (cascades its delivery history)\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksDelete(id, gather(this));\n });\n\nwebhooks\n .command(\"test\")\n .argument(\"<id>\", \"webhook id\")\n .description(\"Queue a sample test payload to the webhook URL\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksTest(id, gather(this));\n });\n\nwebhooks\n .command(\"deliveries\")\n .argument(\"<id>\", \"webhook id\")\n .option(\"-l, --limit <n>\", \"max deliveries (default 50)\", (v) =>\n parseInt(v, 10),\n )\n .description(\"Show recent delivery attempts for a webhook\")\n .action(function (this: Command, id: string) {\n return cmdWebhooksDeliveries(id, gather(this) as never);\n });\n\nprogram.parseAsync().catch((err) => {\n process.stderr.write(`error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n});\n","// Thin wrapper around the propline SDK constructor. Resolves auth from\n// (in priority order): --api-key flag → PROPLINE_API_KEY env var → exit\n// with a friendly message. Also threads --base-url for self-hosted /\n// staging deployments and --timeout for slow networks.\n//\n// Pulled out of index.ts so every command resolves credentials the same\n// way — drift between commands is the most common source of \"works on\n// my machine\" CLI bugs.\n\nimport { PropLine, PropLineError } from \"propline\";\n\nexport interface ClientFlags {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n}\n\nexport function buildClient(flags: ClientFlags): PropLine {\n const apiKey = flags.apiKey ?? process.env.PROPLINE_API_KEY;\n if (!apiKey) {\n process.stderr.write(\n \"error: API key required.\\n\\n\" +\n \" Set PROPLINE_API_KEY in your environment, or pass --api-key.\\n\" +\n \" Get one free at https://prop-line.com\\n\",\n );\n process.exit(2);\n }\n return new PropLine(apiKey, {\n baseUrl: flags.baseUrl,\n timeoutMs: flags.timeout ? flags.timeout * 1000 : undefined,\n });\n}\n\n/** Wrap a command body with consistent error reporting. PropLine API\n * errors get a one-line summary; everything else surfaces the message\n * + exits non-zero so shell scripts can detect failure. */\nexport async function runCommand(fn: () => Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (err) {\n if (err instanceof PropLineError) {\n process.stderr.write(`error: ${err.message}\\n`);\n } else if (err instanceof Error) {\n process.stderr.write(`error: ${err.message}\\n`);\n } else {\n process.stderr.write(`error: ${String(err)}\\n`);\n }\n process.exit(1);\n }\n}\n","// Pretty-printing helpers — zero deps. Default output is a fixed-width\n// table with right-aligned numeric columns; pass --json on any command\n// to bypass and emit raw response JSON instead. Tables are streamed to\n// stdout via console.log so a downstream `| head` short-circuits cleanly.\n\nexport interface Column<T> {\n label: string;\n /** Stringified cell value. */\n value: (row: T) => string;\n /** Right-align (numeric) vs default left-align. */\n numeric?: boolean;\n}\n\nexport function printJson(data: unknown): void {\n process.stdout.write(JSON.stringify(data, null, 2) + \"\\n\");\n}\n\nexport function printTable<T>(rows: T[], columns: Column<T>[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"(no rows)\\n\");\n return;\n }\n const cells: string[][] = rows.map((r) =>\n columns.map((c) => {\n const v = c.value(r);\n return v === undefined || v === null ? \"\" : String(v);\n }),\n );\n const headers = columns.map((c) => c.label);\n\n // Width = max(header, max cell). Capped at 60 chars so a long player\n // name or URL doesn't blow the layout open; the table is for skim\n // reading, full data is one --json away.\n const widths = headers.map((h, i) =>\n Math.min(60, Math.max(h.length, ...cells.map((row) => (row[i] ?? \"\").length))),\n );\n\n function pad(s: string, w: number, numeric: boolean): string {\n const truncated = s.length > w ? s.slice(0, w - 1) + \"…\" : s;\n if (numeric) return truncated.padStart(w);\n return truncated.padEnd(w);\n }\n\n // Header\n process.stdout.write(\n headers\n .map((h, i) => pad(h, widths[i] ?? 0, columns[i]?.numeric ?? false))\n .join(\" \") + \"\\n\",\n );\n // Underline\n process.stdout.write(widths.map((w) => \"─\".repeat(w)).join(\" \") + \"\\n\");\n // Rows\n for (const row of cells) {\n process.stdout.write(\n row\n .map((c, i) => pad(c, widths[i] ?? 0, columns[i]?.numeric ?? false))\n .join(\" \") + \"\\n\",\n );\n }\n}\n\nexport function formatPrice(price: number | null | undefined): string {\n if (price === null || price === undefined) return \"–\";\n if (price === 0) return \"EVEN\";\n return price > 0 ? `+${price}` : String(price);\n}\n\nexport function formatPoint(point: number | null | undefined): string {\n if (point === null || point === undefined) return \"\";\n if (Number.isInteger(point)) return String(point);\n return point.toFixed(1);\n}\n\nexport function formatTime(iso: string | null | undefined): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return d.toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\n/** Truncate to N chars with ellipsis — used for long player/market names. */\nexport function truncate(s: string, n: number): string {\n if (s.length <= n) return s;\n return s.slice(0, n - 1) + \"…\";\n}\n","// Per-command handlers. Each one builds a PropLine client, calls the\n// SDK, and pretty-prints the result via format.ts (or dumps raw JSON\n// when --json is passed). Commands stay independent — no shared\n// per-call state — so future ones can be added without touching the\n// existing surface.\n\nimport type { PropLine, PlayerMarketTrend, HitRateSplit } from \"propline\";\nimport { buildClient, runCommand, type ClientFlags } from \"./client.js\";\nimport {\n printJson,\n printTable,\n formatPrice,\n formatPoint,\n formatTime,\n truncate,\n type Column,\n} from \"./format.js\";\n\ninterface CommonFlags extends ClientFlags {\n json?: boolean;\n}\n\n/* ── sports ─────────────────────────────────────────────────────────── */\n\nexport function cmdSports(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const sports = await client.getSports();\n if (flags.json) return printJson(sports);\n const cols: Column<(typeof sports)[number]>[] = [\n { label: \"KEY\", value: (r) => r.key },\n { label: \"TITLE\", value: (r) => r.title },\n { label: \"ACTIVE\", value: (r) => (r.active ? \"yes\" : \"no\") },\n ];\n printTable(sports, cols);\n });\n}\n\n/* ── events ─────────────────────────────────────────────────────────── */\n\nexport function cmdEvents(sport: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const events = await client.getEvents(sport);\n if (flags.json) return printJson(events);\n const cols: Column<(typeof events)[number]>[] = [\n { label: \"ID\", value: (r) => String(r.id) },\n { label: \"AWAY\", value: (r) => r.away_team },\n { label: \"HOME\", value: (r) => r.home_team },\n { label: \"COMMENCES\", value: (r) => formatTime(r.commence_time) },\n ];\n printTable(events, cols);\n });\n}\n\n/* ── odds (bulk and single-event) ───────────────────────────────────── */\n\nexport function cmdOdds(\n sport: string,\n eventId: string | undefined,\n flags: CommonFlags & { markets?: string; bookmakers?: string; period?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const period = flags.period;\n const bookmakers = flags.bookmakers;\n\n if (eventId) {\n const resp = await client.getOdds(sport, { eventId, markets, period, bookmakers });\n if (flags.json) return printJson(resp);\n printOddsResponse(resp);\n return;\n }\n\n const resp = await client.getOdds(sport, { markets, period, bookmakers });\n if (flags.json) return printJson(resp);\n // Bulk: one row per (event, book, market, outcome) gets dense fast.\n // Collapse to a per-event summary row showing how many books / markets\n // each event has, so the user sees the slate at a glance.\n type Row = {\n id: string;\n teams: string;\n commence: string;\n books: number;\n markets: number;\n };\n const rows: Row[] = resp.map((ev) => {\n const books = ev.bookmakers ?? [];\n const markets = books.reduce((sum, b) => sum + (b.markets?.length ?? 0), 0);\n return {\n id: String(ev.id),\n teams: `${ev.away_team} @ ${ev.home_team}`,\n commence: formatTime(ev.commence_time),\n books: books.length,\n markets,\n };\n });\n const cols: Column<Row>[] = [\n { label: \"ID\", value: (r) => r.id },\n { label: \"MATCHUP\", value: (r) => r.teams },\n { label: \"COMMENCES\", value: (r) => r.commence },\n { label: \"BOOKS\", value: (r) => String(r.books), numeric: true },\n { label: \"MARKETS\", value: (r) => String(r.markets), numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\ninterface OddsResponseLike {\n id: number | string;\n home_team: string;\n away_team: string;\n bookmakers?: Array<{\n key: string;\n title: string;\n markets?: Array<{\n key: string;\n outcomes?: Array<{\n name: string;\n description?: string | null;\n price: number;\n point?: number | null;\n payout_multiplier?: number | null;\n }>;\n }>;\n }>;\n}\n\nfunction printOddsResponse(resp: OddsResponseLike): void {\n // Per-event detail view: one row per (book, market, outcome). Same\n // shape as `propline odds <sport> <event> --json` but flattened so the\n // table reads top-to-bottom by book → market → outcome.\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n point: string;\n price: string;\n mult: string;\n };\n const rows: Row[] = [];\n let anyMult = false;\n for (const book of resp.bookmakers ?? []) {\n for (const market of book.markets ?? []) {\n for (const o of market.outcomes ?? []) {\n const m = o.payout_multiplier;\n if (m !== null && m !== undefined) anyMult = true;\n rows.push({\n book: book.title,\n market: market.key,\n player: o.description ?? \"\",\n side: o.name,\n point: formatPoint(o.point ?? null),\n price: formatPrice(o.price),\n mult: m !== null && m !== undefined ? `${m}x` : \"\",\n });\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no markets returned — try --markets h2h,spreads,totals or the desired prop key)\\n`,\n );\n return;\n }\n const header = `${resp.away_team} @ ${resp.home_team} (event ${resp.id})\\n`;\n process.stdout.write(header);\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 28) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n // DFS boost/discount column — only shown when a book (Underdog) actually\n // returns a multiplier, so standard sportsbook output stays unchanged.\n if (anyMult) {\n cols.push({ label: \"MULT\", value: (r) => r.mult, numeric: true });\n }\n printTable(rows, cols);\n}\n\n/* ── scores ─────────────────────────────────────────────────────────── */\n\nexport function cmdScores(\n sport: string,\n flags: CommonFlags & { daysFrom?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const scores = await client.getScores(sport, { daysFrom: flags.daysFrom });\n if (flags.json) return printJson(scores);\n const cols: Column<(typeof scores)[number]>[] = [\n { label: \"ID\", value: (r) => String(r.id) },\n { label: \"STATUS\", value: (r) => String(r.status) },\n { label: \"AWAY\", value: (r) => r.away_team },\n {\n label: \"AS\",\n value: (r) => (r.away_score === null ? \"\" : String(r.away_score)),\n numeric: true,\n },\n { label: \"HOME\", value: (r) => r.home_team },\n {\n label: \"HS\",\n value: (r) => (r.home_score === null ? \"\" : String(r.home_score)),\n numeric: true,\n },\n { label: \"COMMENCED\", value: (r) => formatTime(r.commence_time) },\n ];\n printTable(scores, cols);\n });\n}\n\n/* ── futures ────────────────────────────────────────────────────────── */\n\nexport function cmdFutures(sport: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const futures = await client.getFutures(sport);\n if (flags.json) return printJson(futures);\n\n // One row per (futures market, book). The favorite is the\n // shortest-priced outcome (lowest American number = most favored).\n interface Row {\n title: string;\n market: string;\n book: string;\n outcomes: number;\n favorite: string;\n }\n const rows: Row[] = [];\n for (const ev of futures) {\n for (const m of ev.markets) {\n const priced = m.outcomes.filter((o) => o.price !== null);\n const fav = priced.reduce<(typeof priced)[number] | null>(\n (best, o) =>\n best === null || (o.price as number) < (best.price as number)\n ? o\n : best,\n null,\n );\n rows.push({\n title: ev.title,\n market: m.description,\n book: m.bookmaker_title || m.bookmaker,\n outcomes: m.outcomes.length,\n favorite: fav ? `${fav.name} ${formatPrice(fav.price)}` : \"—\",\n });\n }\n }\n const cols: Column<Row>[] = [\n { label: \"FUTURE\", value: (r) => truncate(r.title, 32) },\n { label: \"MARKET\", value: (r) => truncate(r.market, 30) },\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"N\", value: (r) => String(r.outcomes), numeric: true },\n { label: \"FAVORITE\", value: (r) => r.favorite },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── context ─────────────────────────────────────────────────────────── */\n\n/** \"Paul Skenes (R)\" — append the throwing hand when present. `hand` is typed\n * loosely so this works whether or not the installed SDK models the field. */\nfunction fmtPitcher(name: string | null, hand: unknown): string {\n if (!name) return \"—\";\n return typeof hand === \"string\" && hand ? `${name} (${hand})` : name;\n}\n\nexport function cmdContext(\n sport: string,\n eventId: string,\n flags: CommonFlags,\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const ctx = await client.getContext(sport, eventId);\n if (flags.json) return printJson(ctx);\n\n const roof = ctx.roof_type ? ` (${ctx.roof_type})` : \"\";\n process.stdout.write(\n `${ctx.away_team} @ ${ctx.home_team}\\n` +\n `${ctx.venue ?? \"venue TBD\"}${roof} · ${formatTime(ctx.commence_time)}\\n\\n` +\n `Probable pitchers : ${fmtPitcher(ctx.away_probable_pitcher, ctx.away_probable_pitcher_hand)} (away) vs ` +\n `${fmtPitcher(ctx.home_probable_pitcher, ctx.home_probable_pitcher_hand)} (home)\\n` +\n `Lineup confirmed : ${ctx.lineup_confirmed ? \"yes\" : \"no\"}\\n` +\n `Home-plate umpire : ${ctx.home_plate_umpire ?? \"—\"}\\n`,\n );\n const w = ctx.weather;\n if (ctx.is_indoor) {\n process.stdout.write(`Weather : indoor / climate-controlled\\n`);\n } else if (w) {\n const parts = [\n w.temperature_f === null ? null : `${w.temperature_f}°F`,\n w.wind_speed_mph === null\n ? null\n : `wind ${w.wind_speed_mph}mph ${w.wind_direction ?? \"\"}`.trim(),\n w.precip_probability_pct === null\n ? null\n : `precip ${w.precip_probability_pct}%`,\n w.conditions ?? null,\n ].filter(Boolean);\n process.stdout.write(`Weather : ${parts.join(\" · \")}\\n`);\n } else {\n process.stdout.write(`Weather : —\\n`);\n }\n });\n}\n\n/* ── movement ────────────────────────────────────────────────────────── */\n\nexport function cmdMovement(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; bookmakers?: string; period?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const mv = await client.getMovement(sport, eventId, {\n markets: flags.markets ? flags.markets.split(\",\") : undefined,\n bookmakers: flags.bookmakers,\n period: flags.period,\n });\n if (flags.json) return printJson(mv);\n\n process.stdout.write(\n `${mv.away_team} @ ${mv.home_team} — line movement & steam\\n` +\n `${mv.bookmakers.length} books\\n\\n`,\n );\n if (!mv.steam.length) {\n process.stdout.write(\"No steam moves detected.\\n\");\n return;\n }\n const cols: Column<(typeof mv.steam)[number]>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n {\n label: \"OUTCOME\",\n value: (r) => (r.description ? `${r.name} (${r.description})` : r.name),\n },\n { label: \"DIR\", value: (r) => r.consensus_direction },\n {\n label: \"BOOKS\",\n value: (r) => `${r.books_moved}/${r.books_quoting}`,\n numeric: true,\n },\n { label: \"SCORE\", value: (r) => r.steam_score.toFixed(1), numeric: true },\n {\n label: \"PROBΔ\",\n value: (r) => `${(r.avg_prob_shift * 100).toFixed(1)}%`,\n numeric: true,\n },\n ];\n printTable(mv.steam, cols);\n });\n}\n\n/* ── grand-salami ────────────────────────────────────────────────────── */\n\nexport function cmdGrandSalami(\n flags: CommonFlags & { date?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const gs = await client.getMlbGrandSalami({ date: flags.date });\n if (flags.json) return printJson(gs);\n process.stdout.write(\n `MLB Grand Salami — ${gs.date} (UTC)\\n` +\n `${gs.games_total} games · ${gs.games_completed} final · ` +\n `${gs.games_in_progress} live · ${gs.games_upcoming} upcoming\\n` +\n (gs.actual_total_runs === null\n ? `Actual total: pending\\n\\n`\n : `Actual total: ${gs.actual_total_runs} runs\\n\\n`),\n );\n const cols: Column<(typeof gs.bookmakers)[number]>[] = [\n { label: \"BOOK\", value: (r) => r.title },\n { label: \"GAMES\", value: (r) => String(r.games_priced), numeric: true },\n { label: \"LINE\", value: (r) => r.line.toFixed(1), numeric: true },\n { label: \"RESULT\", value: (r) => r.result ?? \"\" },\n ];\n printTable(gs.bookmakers, cols);\n });\n}\n\n/* ── daily-goals-total ───────────────────────────────────────────────── */\n\nexport function cmdDailyGoalsTotal(\n flags: CommonFlags & { date?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const dgt = await client.getNhlDailyGoalsTotal({ date: flags.date });\n if (flags.json) return printJson(dgt);\n process.stdout.write(\n `NHL Daily Goals Total — ${dgt.date} (UTC)\\n` +\n `${dgt.games_total} games · ${dgt.games_completed} final · ` +\n `${dgt.games_in_progress} live · ${dgt.games_upcoming} upcoming\\n` +\n (dgt.actual_total_goals === null\n ? `Actual total: pending\\n\\n`\n : `Actual total: ${dgt.actual_total_goals} goals\\n\\n`),\n );\n const cols: Column<(typeof dgt.bookmakers)[number]>[] = [\n { label: \"BOOK\", value: (r) => r.title },\n { label: \"GAMES\", value: (r) => String(r.games_priced), numeric: true },\n { label: \"LINE\", value: (r) => r.line.toFixed(1), numeric: true },\n { label: \"RESULT\", value: (r) => r.result ?? \"\" },\n ];\n printTable(dgt.bookmakers, cols);\n });\n}\n\n/* ── resolution-summary ──────────────────────────────────────────────── */\n\nexport function cmdResolutionSummary(\n flags: CommonFlags & { days?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const s = await client.getResolutionSummary(flags.days ?? 30);\n if (flags.json) return printJson(s);\n process.stdout.write(\n `${s.total_graded.toLocaleString()} props graded ` +\n `(${s.total_settled.toLocaleString()} settled) across ` +\n `${s.sports_covered} sports / ${s.events_graded.toLocaleString()} ` +\n `games — last ${s.days}d\\n\\n`,\n );\n const cols: Column<(typeof s.by_sport)[number]>[] = [\n { label: \"SPORT\", value: (r) => r.title },\n { label: \"KEY\", value: (r) => r.sport_key },\n { label: \"GRADED\", value: (r) => r.graded.toLocaleString(), numeric: true },\n { label: \"GAMES\", value: (r) => String(r.events), numeric: true },\n ];\n printTable(s.by_sport, cols);\n });\n}\n\n/* ── dfs-payouts ─────────────────────────────────────────────────────── */\n\nexport function cmdDfsPayouts(\n flags: CommonFlags & { legWinProb?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const t = await client.getDfsPayouts({ legWinProb: flags.legWinProb });\n if (flags.json) return printJson(t);\n const withEv = flags.legWinProb !== undefined;\n process.stdout.write(\n `PrizePicks payout schedule + per-leg breakeven` +\n (withEv ? ` @ ${(flags.legWinProb! * 100).toFixed(0)}% per leg` : \"\") +\n `\\n\\n`,\n );\n const cols: Column<(typeof t.plays)[number]>[] = [\n { label: \"PLAY\", value: (r) => r.play_type },\n { label: \"LEGS\", value: (r) => String(r.legs), numeric: true },\n {\n label: \"ALL-HIT\",\n value: (r) => `${r.all_correct_multiplier.toFixed(2)}x`,\n numeric: true,\n },\n {\n label: \"BREAKEVEN\",\n value: (r) => `${(r.breakeven_leg_win_prob * 100).toFixed(1)}%`,\n numeric: true,\n },\n ];\n if (withEv) {\n cols.push(\n {\n label: \"EV/$1\",\n value: (r) => (r.expected_return ?? 0).toFixed(3),\n numeric: true,\n },\n { label: \"+EV?\", value: (r) => (r.is_plus_ev ? \"yes\" : \"no\") },\n );\n }\n printTable(t.plays, cols);\n process.stdout.write(`\\n${t.disclaimer}\\n`);\n });\n}\n\n/* ── live (cross-sport in-progress games) ────────────────────────────── */\n\nconst LIVE_SPORTS = [\n \"baseball_mlb\",\n \"basketball_nba\",\n \"hockey_nhl\",\n \"basketball_ncaab\",\n \"football_nfl\",\n \"football_ncaaf\",\n \"soccer_epl\",\n \"soccer_la_liga\",\n \"soccer_serie_a\",\n \"soccer_bundesliga\",\n \"soccer_ligue_1\",\n \"soccer_mls\",\n \"tennis\",\n \"golf\",\n \"mma_ufc\",\n];\n\nexport function cmdLive(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n // Hit /scores per sport in parallel and keep only `in_progress` rows.\n // Tolerates per-sport failure so one 404 doesn't abort the whole\n // command — the CLI is meant for casual terminal use, not strict\n // pipelines.\n type LiveRow = {\n sport: string;\n id: string;\n teams: string;\n score: string;\n period: string;\n };\n const settled = await Promise.allSettled(\n LIVE_SPORTS.map(async (sportKey): Promise<LiveRow[]> => {\n const scores = await client.getScores(sportKey, { daysFrom: 1 });\n return scores\n .filter((sc) => sc.status === \"in_progress\")\n .map((sc) => ({\n sport: sportKey,\n id: String(sc.id),\n teams: `${sc.away_team} @ ${sc.home_team}`,\n score:\n sc.home_score !== null && sc.away_score !== null\n ? `${sc.away_score}-${sc.home_score}`\n : \"\",\n period: typeof sc.period === \"string\" ? sc.period : \"\",\n }));\n }),\n );\n const rows: LiveRow[] = [];\n for (const r of settled) {\n if (r.status !== \"fulfilled\") continue;\n rows.push(...r.value);\n }\n if (flags.json) return printJson(rows);\n if (rows.length === 0) {\n process.stdout.write(\"(no games in progress right now)\\n\");\n return;\n }\n const cols: Column<LiveRow>[] = [\n { label: \"SPORT\", value: (r) => r.sport },\n { label: \"ID\", value: (r) => r.id },\n { label: \"MATCHUP\", value: (r) => r.teams },\n { label: \"SCORE\", value: (r) => r.score },\n { label: \"PERIOD\", value: (r) => r.period },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── ev (cross-book +EV) ────────────────────────────────────────────── */\n\nexport function cmdEv(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; plus?: boolean },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getEventEv(sport, eventId, {\n markets: parseMarketsFlag(flags.markets),\n });\n if (flags.json) return printJson(resp);\n type Row = {\n market: string;\n player: string;\n point: string;\n side: string;\n book: string;\n price: string;\n ev: string;\n plus: boolean;\n };\n const rows: Row[] = [];\n for (const line of resp.lines) {\n for (const o of line.outcomes) {\n rows.push({\n market: line.market_key,\n player: line.description,\n point: formatPoint(line.point),\n side: o.name,\n book: o.book_title,\n price: formatPrice(o.price),\n ev: `${o.ev_pct >= 0 ? \"+\" : \"\"}${o.ev_pct.toFixed(2)}%`,\n plus: o.is_plus_ev,\n });\n }\n }\n const filtered = flags.plus ? rows.filter((r) => r.plus) : rows;\n // Sort +EV first regardless of filter — the most-actionable rows\n // should land at the top of the terminal, not the bottom.\n filtered.sort((a, b) => parseFloat(b.ev) - parseFloat(a.ev));\n process.stdout.write(\n `${resp.away_team} @ ${resp.home_team} · fair anchor: ${resp.fair_source_default}\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n { label: \"EV%\", value: (r) => r.ev, numeric: true },\n ];\n printTable(filtered, cols);\n });\n}\n\n/* ── player-history ─────────────────────────────────────────────────── */\n\nexport function cmdPlayerHistory(\n sport: string,\n player: string,\n flags: CommonFlags & {\n market: string;\n bookmaker?: string;\n limit?: number;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getPlayerHistory(sport, player, {\n market: flags.market,\n bookmaker: flags.bookmaker,\n limit: flags.limit,\n });\n if (flags.json) return printJson(resp);\n process.stdout.write(\n `${resp.player_name} · ${resp.market} (${resp.entries.length} entries)\\n`,\n );\n type Entry = (typeof resp.entries)[number];\n const cols: Column<Entry>[] = [\n { label: \"DATE\", value: (r) => formatTime(r.commence_time).slice(0, 10) },\n { label: \"MATCHUP\", value: (r) => `${r.away_team} @ ${r.home_team}` },\n { label: \"BOOK\", value: (r) => r.bookmaker_title },\n {\n label: \"LINE\",\n value: (r) => formatPoint(r.line),\n numeric: true,\n },\n { label: \"OVER\", value: (r) => formatPrice(r.over_price), numeric: true },\n {\n label: \"UNDER\",\n value: (r) => formatPrice(r.under_price),\n numeric: true,\n },\n {\n label: \"ACTUAL\",\n value: (r) => (r.actual_value === null ? \"\" : String(r.actual_value)),\n numeric: true,\n },\n {\n label: \"RESULT\",\n value: (r) => {\n if (r.over_result === \"won\") return \"OVER ✓\";\n if (r.under_result === \"won\") return \"UNDER ✓\";\n if (r.over_result === \"push\" || r.under_result === \"push\") return \"PUSH\";\n if (r.over_result === \"void\" || r.under_result === \"void\") return \"VOID\";\n return \"\";\n },\n },\n ];\n printTable(resp.entries, cols);\n });\n}\n\n/* ── player-trends ──────────────────────────────────────────────────── */\n\nfunction formatOverPct(w: HitRateSplit | null): string {\n if (!w || w.over_pct === null || w.over_pct === undefined) return \"\";\n return `${w.over_pct.toFixed(0)}%`;\n}\n\nexport function cmdPlayerTrends(\n sport: string,\n player: string,\n flags: CommonFlags & {\n market?: string;\n dfsOddsType?: \"standard\" | \"goblin\" | \"demon\";\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const resp = await client.getPlayerTrends(sport, player, {\n market: flags.market,\n dfsOddsType: flags.dfsOddsType,\n });\n if (flags.json) return printJson(resp);\n process.stdout.write(\n `${resp.player_name} · ${resp.sport_key} (${resp.markets.length} markets)\\n`,\n );\n const cols: Column<PlayerMarketTrend>[] = [\n { label: \"MARKET\", value: (r) => r.market },\n {\n label: \"GAMES\",\n value: (r) => String(r.games_graded),\n numeric: true,\n },\n { label: \"LINE\", value: (r) => formatPoint(r.recent_line), numeric: true },\n {\n label: \"AVG\",\n value: (r) =>\n r.avg_actual === null || r.avg_actual === undefined\n ? \"\"\n : r.avg_actual.toFixed(2),\n numeric: true,\n },\n { label: \"L5 O%\", value: (r) => formatOverPct(r.last_5), numeric: true },\n { label: \"L10 O%\", value: (r) => formatOverPct(r.last_10), numeric: true },\n { label: \"L20 O%\", value: (r) => formatOverPct(r.last_20), numeric: true },\n {\n label: \"STREAK\",\n value: (r) => {\n const s = r.current_streak;\n if (!s) return \"\";\n return `${s.length}× ${s.result}`;\n },\n },\n ];\n printTable(resp.markets, cols);\n });\n}\n\n/* ── export-resolved-props ──────────────────────────────────────────── */\n\nexport function cmdExportResolvedProps(\n flags: CommonFlags & {\n sport: string;\n market?: string;\n bookmaker?: string;\n since?: string;\n until?: string;\n out?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.out) {\n const path = await client.exportResolvedProps({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n outPath: flags.out,\n });\n process.stdout.write(`exported → ${path}\\n`);\n return;\n }\n // No --out: stream raw CSV bytes straight to stdout so a user can\n // pipe `propline export-resolved-props --sport mlb | head` to\n // sample. --json is meaningless here since the API only emits CSV;\n // we ignore it for this command.\n const buf = await client.exportResolvedProps({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n });\n process.stdout.write(buf);\n });\n}\n\n/* ── export-odds-history ────────────────────────────────────────────── */\n\nexport function cmdExportOddsHistory(\n flags: CommonFlags & {\n sport: string;\n market?: string;\n bookmaker?: string;\n since?: string;\n until?: string;\n out?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n if (flags.out) {\n const path = await client.exportOddsHistory({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n outPath: flags.out,\n });\n process.stdout.write(`exported → ${path}\\n`);\n return;\n }\n // No --out: stream raw CSV bytes to stdout. The API only emits CSV,\n // so --json is meaningless here and ignored. This dataset is large —\n // pass --since/--until to page month-by-month.\n const buf = await client.exportOddsHistory({\n sport: flags.sport,\n market: flags.market,\n bookmaker: flags.bookmaker,\n since: flags.since,\n until: flags.until,\n });\n process.stdout.write(buf);\n });\n}\n\n/* ── webhooks ───────────────────────────────────────────────────────── */\n\nexport function cmdWebhooksList(flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const hooks = await client.listWebhooks();\n if (flags.json) return printJson(hooks);\n type H = (typeof hooks)[number];\n const cols: Column<H>[] = [\n { label: \"ID\", value: (r) => String(r.id), numeric: true },\n { label: \"URL\", value: (r) => truncate(r.url, 50) },\n { label: \"EVENTS\", value: (r) => (r.events ?? []).join(\",\") },\n { label: \"ACTIVE\", value: (r) => (r.active ? \"yes\" : \"no\") },\n { label: \"SPORT\", value: (r) => r.filter_sport_key ?? \"\" },\n { label: \"MARKET\", value: (r) => r.filter_market_key ?? \"\" },\n { label: \"CREATED\", value: (r) => formatTime(r.created_at) },\n ];\n printTable(hooks, cols);\n });\n}\n\nexport function cmdWebhooksCreate(\n flags: CommonFlags & {\n url: string;\n events?: string;\n sport?: string;\n market?: string;\n player?: string;\n eventId?: number;\n minPriceChangePct?: number;\n minSteamScore?: number;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const events = flags.events\n ? (flags.events.split(\",\").map((s) => s.trim()) as Array<\n \"line_movement\" | \"resolution\" | \"steam\"\n >)\n : undefined;\n const hook = await client.createWebhook({\n url: flags.url,\n events,\n filterSportKey: flags.sport,\n filterMarketKey: flags.market,\n filterPlayerName: flags.player,\n filterEventId: flags.eventId,\n minPriceChangePct: flags.minPriceChangePct,\n minSteamScore: flags.minSteamScore,\n });\n if (flags.json) return printJson(hook);\n process.stdout.write(\n `webhook ${hook.id} created.\\n` +\n `url: ${hook.url}\\n` +\n `events: ${(hook.events ?? []).join(\",\") || \"(all)\"}\\n` +\n `secret: ${hook.secret}\\n\\n` +\n `STORE THE SECRET NOW — it's only revealed once. Use it to verify\\n` +\n `the X-PropLine-Signature header on every delivery.\\n`,\n );\n });\n}\n\nexport function cmdWebhooksDelete(\n id: string,\n flags: CommonFlags,\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n await client.deleteWebhook(numeric);\n if (flags.json) return printJson({ ok: true, id: numeric });\n process.stdout.write(`webhook ${numeric} deleted.\\n`);\n });\n}\n\nexport function cmdWebhooksTest(id: string, flags: CommonFlags): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n const result = await client.testWebhook(numeric);\n if (flags.json) return printJson(result);\n process.stdout.write(`test payload queued for webhook ${numeric}.\\n`);\n });\n}\n\nexport function cmdWebhooksDeliveries(\n id: string,\n flags: CommonFlags & { limit?: number },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const numeric = Number(id);\n if (!Number.isFinite(numeric)) {\n throw new Error(`webhook id must be numeric: ${id}`);\n }\n const deliveries = await client.listWebhookDeliveries(numeric, {\n limit: flags.limit,\n });\n if (flags.json) return printJson(deliveries);\n type D = (typeof deliveries)[number];\n const cols: Column<D>[] = [\n { label: \"ID\", value: (r) => String(r.id), numeric: true },\n { label: \"STATUS\", value: (r) => String(r.status) },\n {\n label: \"RESP\",\n value: (r) => (r.response_code === null ? \"\" : String(r.response_code)),\n numeric: true,\n },\n { label: \"ATTEMPTS\", value: (r) => String(r.attempts), numeric: true },\n { label: \"DELIVERED\", value: (r) => formatTime(r.delivered_at) },\n ];\n printTable(deliveries, cols);\n });\n}\n\n/* ── history ────────────────────────────────────────────────────────── */\n\nexport function cmdHistory(\n sport: string,\n eventId: string,\n flags: CommonFlags & {\n markets?: string;\n bookmakers?: string;\n from?: string;\n to?: string;\n relativeFrom?: string;\n relativeTo?: string;\n interval?: string;\n changesOnly?: boolean;\n period?: string;\n },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const hist = await client.getOddsHistory(sport, eventId, {\n markets,\n bookmakers: flags.bookmakers,\n from: flags.from,\n to: flags.to,\n relativeFrom: flags.relativeFrom,\n relativeTo: flags.relativeTo,\n interval: flags.interval as\n | \"30s\"\n | \"1m\"\n | \"5m\"\n | \"15m\"\n | \"30m\"\n | \"1h\"\n | undefined,\n changesOnly: flags.changesOnly,\n period: flags.period,\n });\n if (flags.json) return printJson(hist);\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n when: string;\n point: string;\n price: string;\n };\n const rows: Row[] = [];\n for (const book of hist.bookmakers ?? []) {\n for (const m of book.markets ?? []) {\n for (const o of m.outcomes ?? []) {\n for (const s of o.snapshots ?? []) {\n rows.push({\n book: book.title ?? book.key,\n market: m.key,\n player: o.description ?? \"\",\n side: o.name,\n when: formatTime(s.recorded_at),\n point: formatPoint(s.point ?? null),\n price: formatPrice(s.price),\n });\n }\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no snapshots returned — check tier access and the time window)\\n`,\n );\n return;\n }\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"WHEN\", value: (r) => r.when },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── closing ────────────────────────────────────────────────────────── */\n\nexport function cmdClosing(\n sport: string,\n eventId: string,\n flags: CommonFlags & { markets?: string; bookmakers?: string; period?: string },\n): Promise<void> {\n return runCommand(async () => {\n const client = buildClient(flags);\n const markets = parseMarketsFlag(flags.markets);\n const closing = await client.getOddsClosing(sport, eventId, {\n markets,\n bookmakers: flags.bookmakers,\n period: flags.period,\n });\n if (flags.json) return printJson(closing);\n type Row = {\n book: string;\n market: string;\n player: string;\n side: string;\n closingAt: string;\n point: string;\n price: string;\n };\n const rows: Row[] = [];\n for (const book of closing.bookmakers ?? []) {\n for (const m of book.markets ?? []) {\n for (const o of m.outcomes ?? []) {\n rows.push({\n book: book.title ?? book.key,\n market: m.key,\n player: o.description ?? \"\",\n side: o.name,\n closingAt: o.closing_at ? formatTime(o.closing_at) : \"\",\n point: formatPoint(o.point ?? null),\n price: o.price === null ? \"\" : formatPrice(o.price),\n });\n }\n }\n }\n if (rows.length === 0) {\n process.stdout.write(\n `(no closing lines returned — check tier access; free tier sees redacted structure)\\n`,\n );\n return;\n }\n process.stdout.write(\n `${closing.away_team} @ ${closing.home_team} (event ${closing.id})\\n`,\n );\n const cols: Column<Row>[] = [\n { label: \"BOOK\", value: (r) => r.book },\n { label: \"MARKET\", value: (r) => r.market },\n { label: \"PLAYER\", value: (r) => truncate(r.player, 24) },\n { label: \"SIDE\", value: (r) => r.side },\n { label: \"CLOSED AT\", value: (r) => r.closingAt },\n { label: \"LINE\", value: (r) => r.point, numeric: true },\n { label: \"PRICE\", value: (r) => r.price, numeric: true },\n ];\n printTable(rows, cols);\n });\n}\n\n/* ── helpers ────────────────────────────────────────────────────────── */\n\nfunction parseMarketsFlag(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Avoid an unused-import warning while still re-exporting the type\n * for downstream consumers who want to wire their own subcommands. */\nexport type { PropLine };\n"],"mappings":"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","names":["resp","markets"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "propline-cli",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "Command-line interface for the PropLine player props betting odds API. Wraps the propline SDK with pretty-printed tables and JSON output.",
5
5
  "keywords": [
6
6
  "cli",
@@ -52,7 +52,7 @@
52
52
  },
53
53
  "dependencies": {
54
54
  "commander": "^12.1.0",
55
- "propline": "^0.19.0"
55
+ "propline": "^0.21.0"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/node": "^20.19.39",