@opentabs-dev/opentabs-plugin-ynab 0.0.85 → 0.0.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/adapter.iife.js +870 -523
  2. package/dist/adapter.iife.js.map +4 -4
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +11 -16
  6. package/dist/index.js.map +1 -1
  7. package/dist/tools/create-transaction.d.ts +2 -2
  8. package/dist/tools/create-transaction.d.ts.map +1 -1
  9. package/dist/tools/create-transaction.js +63 -22
  10. package/dist/tools/create-transaction.js.map +1 -1
  11. package/dist/tools/delete-transaction.d.ts.map +1 -1
  12. package/dist/tools/delete-transaction.js +22 -7
  13. package/dist/tools/delete-transaction.js.map +1 -1
  14. package/dist/tools/get-account.d.ts.map +1 -1
  15. package/dist/tools/get-account.js +3 -3
  16. package/dist/tools/get-account.js.map +1 -1
  17. package/dist/tools/get-month.d.ts +2 -1
  18. package/dist/tools/get-month.d.ts.map +1 -1
  19. package/dist/tools/get-month.js +10 -33
  20. package/dist/tools/get-month.js.map +1 -1
  21. package/dist/tools/get-plan.d.ts.map +1 -1
  22. package/dist/tools/get-plan.js +12 -5
  23. package/dist/tools/get-plan.js.map +1 -1
  24. package/dist/tools/get-transaction.d.ts +2 -2
  25. package/dist/tools/get-transaction.d.ts.map +1 -1
  26. package/dist/tools/get-transaction.js +5 -4
  27. package/dist/tools/get-transaction.js.map +1 -1
  28. package/dist/tools/list-accounts.d.ts.map +1 -1
  29. package/dist/tools/list-accounts.js +4 -4
  30. package/dist/tools/list-accounts.js.map +1 -1
  31. package/dist/tools/list-categories.d.ts.map +1 -1
  32. package/dist/tools/list-categories.js +9 -29
  33. package/dist/tools/list-categories.js.map +1 -1
  34. package/dist/tools/list-months.d.ts +1 -1
  35. package/dist/tools/list-months.d.ts.map +1 -1
  36. package/dist/tools/list-months.js +5 -14
  37. package/dist/tools/list-months.js.map +1 -1
  38. package/dist/tools/list-payees.d.ts.map +1 -1
  39. package/dist/tools/list-payees.js +3 -3
  40. package/dist/tools/list-payees.js.map +1 -1
  41. package/dist/tools/list-scheduled-transactions.d.ts.map +1 -1
  42. package/dist/tools/list-scheduled-transactions.js +7 -5
  43. package/dist/tools/list-scheduled-transactions.js.map +1 -1
  44. package/dist/tools/list-transactions.d.ts +4 -2
  45. package/dist/tools/list-transactions.d.ts.map +1 -1
  46. package/dist/tools/list-transactions.js +40 -8
  47. package/dist/tools/list-transactions.js.map +1 -1
  48. package/dist/tools/move-category-budget.d.ts +24 -0
  49. package/dist/tools/move-category-budget.d.ts.map +1 -0
  50. package/dist/tools/move-category-budget.js +105 -0
  51. package/dist/tools/move-category-budget.js.map +1 -0
  52. package/dist/tools/schemas.d.ts +105 -27
  53. package/dist/tools/schemas.d.ts.map +1 -1
  54. package/dist/tools/schemas.js +176 -27
  55. package/dist/tools/schemas.js.map +1 -1
  56. package/dist/tools/update-category-budget.d.ts.map +1 -1
  57. package/dist/tools/update-category-budget.js +55 -27
  58. package/dist/tools/update-category-budget.js.map +1 -1
  59. package/dist/tools/update-transaction.d.ts +3 -2
  60. package/dist/tools/update-transaction.d.ts.map +1 -1
  61. package/dist/tools/update-transaction.js +84 -31
  62. package/dist/tools/update-transaction.js.map +1 -1
  63. package/dist/tools.json +192 -43
  64. package/dist/ynab-api.d.ts +4 -1
  65. package/dist/ynab-api.d.ts.map +1 -1
  66. package/dist/ynab-api.js +47 -26
  67. package/dist/ynab-api.js.map +1 -1
  68. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
- import { defineTool } from '@opentabs-dev/plugin-sdk';
1
+ import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
2
2
  import { z } from 'zod';
3
- import { getPlanId, syncWrite } from '../ynab-api.js';
4
- import { categorySchema, mapCategory } from './schemas.js';
3
+ import { getPlanId, getUserId, syncBudget, syncWrite } from '../ynab-api.js';
4
+ import { buildSubcategoryBudgetMap, buildSubcategoryCalcMap, categorySchema, formatMonthlyBudgetId, formatSubcategoryBudgetId, MONEY_MOVEMENT_SOURCE, mapCategoryForMonth, notTombstone, toMilliunits, toMonthKey, } from './schemas.js';
5
5
  export const updateCategoryBudget = defineTool({
6
6
  name: 'update_category_budget',
7
7
  displayName: 'Update Category Budget',
@@ -11,7 +11,10 @@ export const updateCategoryBudget = defineTool({
11
11
  group: 'Categories',
12
12
  input: z.object({
13
13
  category_id: z.string().min(1).describe('Category ID to budget'),
14
- month: z.string().min(1).describe('Month in YYYY-MM format (e.g. 2026-03)'),
14
+ month: z
15
+ .string()
16
+ .regex(/^\d{4}-\d{2}(-\d{2})?$/, 'Month must be YYYY-MM or YYYY-MM-DD')
17
+ .describe('Month in YYYY-MM format (e.g. 2026-03)'),
15
18
  budgeted: z.number().describe('Amount to budget in currency units (e.g. 500 for $500)'),
16
19
  }),
17
20
  output: z.object({
@@ -19,32 +22,57 @@ export const updateCategoryBudget = defineTool({
19
22
  }),
20
23
  handle: async (params) => {
21
24
  const planId = getPlanId();
22
- const milliunits = Math.round(params.budgeted * 1000);
23
- // Month in budget IDs uses YYYY-MM format
24
- const monthKey = params.month.substring(0, 7);
25
- const budgetId = `mcb/${monthKey}/${params.category_id}`;
26
- const monthlyBudgetId = `mb/${monthKey}/${planId}`;
27
- const result = await syncWrite(planId, {
28
- be_monthly_subcategory_budgets: [
25
+ const userId = getUserId();
26
+ const milliunits = toMilliunits(params.budgeted);
27
+ const monthKey = toMonthKey(params.month);
28
+ const budgetId = formatSubcategoryBudgetId(monthKey, params.category_id);
29
+ const monthlyBudgetId = formatMonthlyBudgetId(monthKey, planId);
30
+ const budget = await syncBudget(planId);
31
+ const serverKnowledge = budget.current_server_knowledge ?? 0;
32
+ const category = (budget.changed_entities?.be_subcategories ?? []).find(c => c.id === params.category_id && notTombstone(c));
33
+ if (!category) {
34
+ throw ToolError.notFound(`Category not found: ${params.category_id}`);
35
+ }
36
+ const existingBudget = (budget.changed_entities?.be_monthly_subcategory_budgets ?? []).find(b => b.id === budgetId && notTombstone(b));
37
+ const delta = milliunits - (existingBudget?.budgeted ?? 0);
38
+ const budgetEntry = {
39
+ id: budgetId,
40
+ is_tombstone: false,
41
+ entities_monthly_budget_id: monthlyBudgetId,
42
+ entities_subcategory_id: params.category_id,
43
+ budgeted: milliunits,
44
+ };
45
+ const changedEntities = { be_monthly_subcategory_budgets: [budgetEntry] };
46
+ // YNAB tracks budget changes as money movements; without this the write
47
+ // is silently rejected (the budget value reverts on the next sync).
48
+ // Direction is encoded via from/to (always positive amount).
49
+ if (delta !== 0) {
50
+ changedEntities.be_money_movements = [
29
51
  {
30
- id: budgetId,
31
- entities_monthly_budget_id: monthlyBudgetId,
32
- entities_subcategory_id: params.category_id,
33
- budgeted: milliunits,
34
- overspending_handling: 'AffectsBuffer',
52
+ id: crypto.randomUUID(),
35
53
  is_tombstone: false,
54
+ to_entities_monthly_subcategory_budget_id: delta > 0 ? budgetId : null,
55
+ from_entities_monthly_subcategory_budget_id: delta < 0 ? budgetId : null,
56
+ entities_money_movement_group_id: null,
57
+ amount: Math.abs(delta),
58
+ performed_by_user_id: userId,
59
+ note: null,
60
+ source: MONEY_MOVEMENT_SOURCE.ASSIGN,
61
+ move_started_at: new Date().toISOString(),
62
+ move_accepted_at: null,
36
63
  },
37
- ],
38
- });
39
- // The sync write returns the updated budget entity
40
- const budgets = result.changed_entities?.be_monthly_subcategory_budgets;
41
- const updatedBudget = budgets?.[0]?.budgeted ?? milliunits;
42
- return {
43
- category: mapCategory({
44
- id: params.category_id,
45
- budgeted: updatedBudget,
46
- }),
47
- };
64
+ ];
65
+ }
66
+ const result = await syncWrite(planId, changedEntities, serverKnowledge);
67
+ const calcMap = buildSubcategoryCalcMap(result.changed_entities?.be_monthly_subcategory_budget_calculations ?? []);
68
+ // Prefer the server's echoed values — if a concurrent update from another
69
+ // client merged in, that change shows up here. Fall back to our local entry
70
+ // if the server didn't echo (shouldn't happen in practice).
71
+ const budgetMap = buildSubcategoryBudgetMap(result.changed_entities?.be_monthly_subcategory_budgets ?? []);
72
+ const key = `${monthKey}/${params.category_id}`;
73
+ if (!budgetMap.has(key))
74
+ budgetMap.set(key, budgetEntry);
75
+ return { category: mapCategoryForMonth(category, budgetMap, calcMap, monthKey) };
48
76
  },
49
77
  });
50
78
  //# sourceMappingURL=update-category-budget.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-category-budget.js","sourceRoot":"","sources":["../../src/tools/update-category-budget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;IAC7C,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,wBAAwB;IACrC,WAAW,EACT,yLAAyL;IAC3L,OAAO,EAAE,oCAAoC;IAC7C,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAChE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QAC3E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;KACxF,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,cAAc;KACzB,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;QAEtD,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,OAAO,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACzD,MAAM,eAAe,GAAG,MAAM,QAAQ,IAAI,MAAM,EAAE,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE;YACrC,8BAA8B,EAAE;gBAC9B;oBACE,EAAE,EAAE,QAAQ;oBACZ,0BAA0B,EAAE,eAAe;oBAC3C,uBAAuB,EAAE,MAAM,CAAC,WAAW;oBAC3C,QAAQ,EAAE,UAAU;oBACpB,qBAAqB,EAAE,eAAe;oBACtC,YAAY,EAAE,KAAK;iBACpB;aACF;SACF,CAAC,CAAC;QAEH,mDAAmD;QACnD,MAAM,OAAO,GACX,MAOD,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;QAEnD,MAAM,aAAa,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,UAAU,CAAC;QAE3D,OAAO;YACL,QAAQ,EAAE,WAAW,CAAC;gBACpB,EAAE,EAAE,MAAM,CAAC,WAAW;gBACtB,QAAQ,EAAE,aAAa;aACxB,CAAC;SACH,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"update-category-budget.js","sourceRoot":"","sources":["../../src/tools/update-category-budget.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,7 @@ export declare const updateTransaction: import("@opentabs-dev/plugin-sdk").ToolD
21
21
  green: "green";
22
22
  blue: "blue";
23
23
  purple: "purple";
24
+ none: "none";
24
25
  }>>;
25
26
  }, z.core.$strip>, z.ZodObject<{
26
27
  transaction: z.ZodObject<{
@@ -32,7 +33,6 @@ export declare const updateTransaction: import("@opentabs-dev/plugin-sdk").ToolD
32
33
  cleared: z.ZodString;
33
34
  approved: z.ZodBoolean;
34
35
  flag_color: z.ZodString;
35
- flag_name: z.ZodString;
36
36
  account_id: z.ZodString;
37
37
  account_name: z.ZodString;
38
38
  payee_id: z.ZodString;
@@ -40,7 +40,8 @@ export declare const updateTransaction: import("@opentabs-dev/plugin-sdk").ToolD
40
40
  category_id: z.ZodString;
41
41
  category_name: z.ZodString;
42
42
  transfer_account_id: z.ZodString;
43
- import_id: z.ZodString;
43
+ imported_payee: z.ZodString;
44
+ original_imported_payee: z.ZodString;
44
45
  deleted: z.ZodBoolean;
45
46
  }, z.core.$strip>;
46
47
  }, z.core.$strip>>;
@@ -1 +1 @@
1
- {"version":3,"file":"update-transaction.d.ts","sourceRoot":"","sources":["../../src/tools/update-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAqD5B,CAAC"}
1
+ {"version":3,"file":"update-transaction.d.ts","sourceRoot":"","sources":["../../src/tools/update-transaction.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAwBxB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA+G5B,CAAC"}
@@ -1,11 +1,23 @@
1
1
  import { defineTool, ToolError } from '@opentabs-dev/plugin-sdk';
2
2
  import { z } from 'zod';
3
- import { getPlanId, syncWrite } from '../ynab-api.js';
4
- import { mapTransaction, transactionSchema } from './schemas.js';
3
+ import { getPlanId, syncBudget, syncWrite } from '../ynab-api.js';
4
+ import { buildLookups, CLEARED_MAP, FLAG_MAP, mapTransaction, resolvePayee, toMilliunits, transactionSchema, } from './schemas.js';
5
+ const resolveFlag = (requested, existing) => {
6
+ if (requested === 'none')
7
+ return null;
8
+ if (requested)
9
+ return FLAG_MAP[requested];
10
+ return existing ?? null;
11
+ };
12
+ const resolveCleared = (requested, existing) => {
13
+ if (requested)
14
+ return CLEARED_MAP[requested];
15
+ return existing ?? 'Uncleared';
16
+ };
5
17
  export const updateTransaction = defineTool({
6
18
  name: 'update_transaction',
7
19
  displayName: 'Update Transaction',
8
- description: 'Update an existing transaction in the active YNAB plan. Only specified fields are changed; omitted fields remain unchanged. Amount is in currency units (negative for expenses, positive for income).',
20
+ description: 'Update an existing transaction in the active YNAB plan. Only specified fields are changed; omitted fields remain unchanged. Amount is in currency units (negative for expenses, positive for income). Transfers and split transactions cannot be updated through this tool — edit them directly in YNAB.',
9
21
  summary: 'Update a transaction',
10
22
  icon: 'pencil',
11
23
  group: 'Transactions',
@@ -20,43 +32,84 @@ export const updateTransaction = defineTool({
20
32
  memo: z.string().optional().describe('New transaction memo'),
21
33
  cleared: z.enum(['cleared', 'uncleared', 'reconciled']).optional().describe('New cleared status'),
22
34
  approved: z.boolean().optional().describe('New approval status'),
23
- flag_color: z.enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple']).optional().describe('New flag color'),
35
+ flag_color: z
36
+ .enum(['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'none'])
37
+ .optional()
38
+ .describe('New flag color (pass "none" to clear)'),
24
39
  }),
25
40
  output: z.object({
26
41
  transaction: transactionSchema,
27
42
  }),
28
43
  handle: async (params) => {
29
44
  const planId = getPlanId();
30
- const transaction = {
31
- id: params.transaction_id,
32
- entities_account_id: params.account_id,
33
- };
34
- if (params.date !== undefined)
35
- transaction.date = params.date;
36
- if (params.amount !== undefined)
37
- transaction.amount = Math.round(params.amount * 1000);
38
- if (params.payee_name !== undefined)
39
- transaction.payee_name = params.payee_name;
40
- if (params.payee_id !== undefined)
41
- transaction.entities_payee_id = params.payee_id;
42
- if (params.category_id !== undefined)
43
- transaction.entities_subcategory_id = params.category_id;
44
- if (params.memo !== undefined)
45
- transaction.memo = params.memo;
46
- if (params.cleared !== undefined)
47
- transaction.cleared = params.cleared;
48
- if (params.approved !== undefined)
49
- transaction.approved = params.approved;
50
- if (params.flag_color !== undefined)
51
- transaction.flag_color = params.flag_color;
52
- const result = await syncWrite(planId, {
53
- be_transactions: [transaction],
54
- });
55
- const saved = result.changed_entities?.be_transactions?.[0];
45
+ const budget = await syncBudget(planId);
46
+ const serverKnowledge = budget.current_server_knowledge ?? 0;
47
+ const lookups = buildLookups(budget.changed_entities ?? {});
48
+ const existing = budget.changed_entities?.be_transactions?.find(t => t.id === params.transaction_id && !t.is_tombstone);
49
+ if (!existing) {
50
+ throw ToolError.notFound(`Transaction not found: ${params.transaction_id}`);
51
+ }
52
+ if (existing.transfer_account_id) {
53
+ throw ToolError.validation('Cannot update transfer transactions — edit them in YNAB directly.');
54
+ }
55
+ const hasSubtransactions = (budget.changed_entities?.be_subtransactions ?? []).some(s => s.entities_transaction_id === params.transaction_id && !s.is_tombstone);
56
+ if (hasSubtransactions) {
57
+ throw ToolError.validation('Cannot update split transactions — edit them in YNAB directly.');
58
+ }
59
+ const changedEntities = {};
60
+ let payeeId = params.payee_id ?? existing.entities_payee_id ?? null;
61
+ if (params.payee_name && !params.payee_id) {
62
+ const resolved = resolvePayee(budget.changed_entities?.be_payees ?? [], params.payee_name);
63
+ payeeId = resolved.payeeId;
64
+ if (resolved.newPayee) {
65
+ changedEntities.be_payees = [resolved.newPayee];
66
+ lookups.payees.set(resolved.payeeId, params.payee_name);
67
+ }
68
+ }
69
+ changedEntities.be_transaction_groups = [
70
+ {
71
+ id: params.transaction_id,
72
+ be_transaction: {
73
+ id: params.transaction_id,
74
+ is_tombstone: false,
75
+ entities_account_id: params.account_id,
76
+ entities_payee_id: payeeId,
77
+ entities_subcategory_id: params.category_id ?? existing.entities_subcategory_id ?? null,
78
+ entities_scheduled_transaction_id: existing.entities_scheduled_transaction_id ?? null,
79
+ date: params.date ?? existing.date ?? '',
80
+ date_entered_from_schedule: null,
81
+ amount: params.amount !== undefined ? toMilliunits(params.amount) : (existing.amount ?? 0),
82
+ cash_amount: 0,
83
+ credit_amount: 0,
84
+ credit_amount_adjusted: 0,
85
+ subcategory_credit_amount_preceding: 0,
86
+ memo: params.memo ?? existing.memo ?? null,
87
+ cleared: resolveCleared(params.cleared, existing.cleared),
88
+ // YNAB's wire format calls this "accepted"; the public tool surface uses "approved".
89
+ accepted: params.approved ?? existing.accepted ?? false,
90
+ check_number: null,
91
+ flag: resolveFlag(params.flag_color, existing.flag),
92
+ transfer_account_id: existing.transfer_account_id ?? null,
93
+ transfer_transaction_id: null,
94
+ transfer_subtransaction_id: null,
95
+ matched_transaction_id: null,
96
+ ynab_id: existing.ynab_id ?? null,
97
+ imported_payee: existing.imported_payee ?? null,
98
+ imported_date: null,
99
+ original_imported_payee: existing.original_imported_payee ?? null,
100
+ provider_cleansed_payee: null,
101
+ source: existing.source ?? null,
102
+ debt_transaction_type: null,
103
+ },
104
+ be_subtransactions: null,
105
+ },
106
+ ];
107
+ const result = await syncWrite(planId, changedEntities, serverKnowledge);
108
+ const saved = result.changed_entities?.be_transactions?.find(t => t.id === params.transaction_id);
56
109
  if (!saved) {
57
110
  throw ToolError.internal('Transaction was updated but no data was returned');
58
111
  }
59
- return { transaction: mapTransaction(saved) };
112
+ return { transaction: mapTransaction(saved, lookups) };
60
113
  },
61
114
  });
62
115
  //# sourceMappingURL=update-transaction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-transaction.js","sourceRoot":"","sources":["../../src/tools/update-transaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-transaction.js","sourceRoot":"","sources":["../../src/tools/update-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,GAAG,CAAC,SAAyC,EAAE,QAAmC,EAAiB,EAAE;IACpH,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,SAAS;QAAE,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1C,OAAO,QAAQ,IAAI,IAAI,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,SAAoC,EAAE,QAAmC,EAAU,EAAE;IAC3G,IAAI,SAAS;QAAE,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,QAAQ,IAAI,WAAW,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;IAC1C,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,oBAAoB;IACjC,WAAW,EACT,0SAA0S;IAC5S,OAAO,EAAE,sBAAsB;IAC/B,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,cAAc;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACtE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACjF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2EAA2E,CAAC;QACnH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC5D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACxD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC9D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC5D,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QACjG,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAChE,UAAU,EAAE,CAAC;aACV,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;aACpE,QAAQ,EAAE;aACV,QAAQ,CAAC,uCAAuC,CAAC;KACrD,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,WAAW,EAAE,iBAAiB;KAC/B,CAAC;IACF,MAAM,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAiB,MAAM,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,MAAM,CAAC,wBAAwB,IAAI,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,EAAE,eAAe,EAAE,IAAI,CAC7D,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,YAAY,CACvD,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,SAAS,CAAC,QAAQ,CAAC,0BAA0B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACjC,MAAM,SAAS,CAAC,UAAU,CAAC,mEAAmE,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,kBAAkB,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAC,IAAI,CACjF,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,KAAK,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,YAAY,CAC5E,CAAC;QACF,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,SAAS,CAAC,UAAU,CAAC,gEAAgE,CAAC,CAAC;QAC/F,CAAC;QAED,MAAM,eAAe,GAA4B,EAAE,CAAC;QAEpD,IAAI,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,IAAI,IAAI,CAAC;QACpE,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,SAAS,IAAI,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC3F,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC3B,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACtB,eAAe,CAAC,SAAS,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAChD,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,eAAe,CAAC,qBAAqB,GAAG;YACtC;gBACE,EAAE,EAAE,MAAM,CAAC,cAAc;gBACzB,cAAc,EAAE;oBACd,EAAE,EAAE,MAAM,CAAC,cAAc;oBACzB,YAAY,EAAE,KAAK;oBACnB,mBAAmB,EAAE,MAAM,CAAC,UAAU;oBACtC,iBAAiB,EAAE,OAAO;oBAC1B,uBAAuB,EAAE,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,uBAAuB,IAAI,IAAI;oBACvF,iCAAiC,EAAE,QAAQ,CAAC,iCAAiC,IAAI,IAAI;oBACrF,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,EAAE;oBACxC,0BAA0B,EAAE,IAAI;oBAChC,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;oBAC1F,WAAW,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;oBAChB,sBAAsB,EAAE,CAAC;oBACzB,mCAAmC,EAAE,CAAC;oBACtC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAI;oBAC1C,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC;oBACzD,qFAAqF;oBACrF,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,IAAI,KAAK;oBACvD,YAAY,EAAE,IAAI;oBAClB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC;oBACnD,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB,IAAI,IAAI;oBACzD,uBAAuB,EAAE,IAAI;oBAC7B,0BAA0B,EAAE,IAAI;oBAChC,sBAAsB,EAAE,IAAI;oBAC5B,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;oBACjC,cAAc,EAAE,QAAQ,CAAC,cAAc,IAAI,IAAI;oBAC/C,aAAa,EAAE,IAAI;oBACnB,uBAAuB,EAAE,QAAQ,CAAC,uBAAuB,IAAI,IAAI;oBACjE,uBAAuB,EAAE,IAAI;oBAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI;oBAC/B,qBAAqB,EAAE,IAAI;iBAC5B;gBACD,kBAAkB,EAAE,IAAI;aACzB;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAiB,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;QAEzF,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,cAAc,CAAC,CAAC;QAClG,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,SAAS,CAAC,QAAQ,CAAC,kDAAkD,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;IACzD,CAAC;CACF,CAAC,CAAC"}