@finos/legend-application-marketplace 0.2.19 → 0.2.21

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 (71) hide show
  1. package/lib/application/LegendMarketplaceApplicationConfig.d.ts +6 -3
  2. package/lib/application/LegendMarketplaceApplicationConfig.d.ts.map +1 -1
  3. package/lib/application/LegendMarketplaceApplicationConfig.js +13 -4
  4. package/lib/application/LegendMarketplaceApplicationConfig.js.map +1 -1
  5. package/lib/components/Pagination/PaginationControls.d.ts.map +1 -1
  6. package/lib/components/Pagination/PaginationControls.js +2 -2
  7. package/lib/components/Pagination/PaginationControls.js.map +1 -1
  8. package/lib/components/ProviderCard/LegendMarketplaceOrderProfileCard.d.ts +23 -0
  9. package/lib/components/ProviderCard/LegendMarketplaceOrderProfileCard.d.ts.map +1 -0
  10. package/lib/components/ProviderCard/LegendMarketplaceOrderProfileCard.js +93 -0
  11. package/lib/components/ProviderCard/LegendMarketplaceOrderProfileCard.js.map +1 -0
  12. package/lib/components/ProviderCard/LegendMarketplaceTerminalCard.d.ts.map +1 -1
  13. package/lib/components/ProviderCard/LegendMarketplaceTerminalCard.js +5 -11
  14. package/lib/components/ProviderCard/LegendMarketplaceTerminalCard.js.map +1 -1
  15. package/lib/components/ProviderCard/OrderProfileDetailModal.d.ts +26 -0
  16. package/lib/components/ProviderCard/OrderProfileDetailModal.d.ts.map +1 -0
  17. package/lib/components/ProviderCard/OrderProfileDetailModal.js +36 -0
  18. package/lib/components/ProviderCard/OrderProfileDetailModal.js.map +1 -0
  19. package/lib/components/ProviderCard/OrderProfileMultiselectModal.d.ts +26 -0
  20. package/lib/components/ProviderCard/OrderProfileMultiselectModal.d.ts.map +1 -0
  21. package/lib/components/ProviderCard/OrderProfileMultiselectModal.js +31 -0
  22. package/lib/components/ProviderCard/OrderProfileMultiselectModal.js.map +1 -0
  23. package/lib/components/ProviderCard/orderProfileUtils.d.ts +71 -0
  24. package/lib/components/ProviderCard/orderProfileUtils.d.ts.map +1 -0
  25. package/lib/components/ProviderCard/orderProfileUtils.js +122 -0
  26. package/lib/components/ProviderCard/orderProfileUtils.js.map +1 -0
  27. package/lib/index.css +2 -2
  28. package/lib/index.css.map +1 -1
  29. package/lib/package.json +1 -1
  30. package/lib/pages/Lakehouse/entitlements/PermitDataAccessRequest.d.ts.map +1 -1
  31. package/lib/pages/Lakehouse/entitlements/PermitDataAccessRequest.js +3 -0
  32. package/lib/pages/Lakehouse/entitlements/PermitDataAccessRequest.js.map +1 -1
  33. package/lib/pages/TerminalsAddons/LegendMarketplaceTerminalsAddons.d.ts.map +1 -1
  34. package/lib/pages/TerminalsAddons/LegendMarketplaceTerminalsAddons.js +42 -9
  35. package/lib/pages/TerminalsAddons/LegendMarketplaceTerminalsAddons.js.map +1 -1
  36. package/lib/stores/LegendMarketPlaceVendorDataStore.d.ts +6 -2
  37. package/lib/stores/LegendMarketPlaceVendorDataStore.d.ts.map +1 -1
  38. package/lib/stores/LegendMarketPlaceVendorDataStore.js +25 -2
  39. package/lib/stores/LegendMarketPlaceVendorDataStore.js.map +1 -1
  40. package/lib/stores/LegendMarketplaceBaseStore.d.ts +1 -1
  41. package/lib/stores/LegendMarketplaceBaseStore.d.ts.map +1 -1
  42. package/lib/stores/LegendMarketplaceBaseStore.js +10 -5
  43. package/lib/stores/LegendMarketplaceBaseStore.js.map +1 -1
  44. package/lib/stores/ai/LegendMarketplaceAIChatStore.d.ts +10 -0
  45. package/lib/stores/ai/LegendMarketplaceAIChatStore.d.ts.map +1 -1
  46. package/lib/stores/ai/LegendMarketplaceAIChatStore.js +115 -50
  47. package/lib/stores/ai/LegendMarketplaceAIChatStore.js.map +1 -1
  48. package/lib/stores/cart/CartStore.d.ts +14 -2
  49. package/lib/stores/cart/CartStore.d.ts.map +1 -1
  50. package/lib/stores/cart/CartStore.js +68 -5
  51. package/lib/stores/cart/CartStore.js.map +1 -1
  52. package/lib/stores/lakehouse/entitlements/EntitlementsDashboardState.d.ts +2 -1
  53. package/lib/stores/lakehouse/entitlements/EntitlementsDashboardState.d.ts.map +1 -1
  54. package/lib/stores/lakehouse/entitlements/EntitlementsDashboardState.js +8 -3
  55. package/lib/stores/lakehouse/entitlements/EntitlementsDashboardState.js.map +1 -1
  56. package/package.json +10 -10
  57. package/src/application/LegendMarketplaceApplicationConfig.ts +19 -11
  58. package/src/components/Pagination/PaginationControls.tsx +19 -17
  59. package/src/components/ProviderCard/LegendMarketplaceOrderProfileCard.tsx +246 -0
  60. package/src/components/ProviderCard/LegendMarketplaceTerminalCard.tsx +9 -16
  61. package/src/components/ProviderCard/OrderProfileDetailModal.tsx +224 -0
  62. package/src/components/ProviderCard/OrderProfileMultiselectModal.tsx +142 -0
  63. package/src/components/ProviderCard/orderProfileUtils.ts +165 -0
  64. package/src/pages/Lakehouse/entitlements/PermitDataAccessRequest.tsx +3 -0
  65. package/src/pages/TerminalsAddons/LegendMarketplaceTerminalsAddons.tsx +170 -21
  66. package/src/stores/LegendMarketPlaceVendorDataStore.tsx +33 -1
  67. package/src/stores/LegendMarketplaceBaseStore.ts +13 -9
  68. package/src/stores/ai/LegendMarketplaceAIChatStore.ts +273 -69
  69. package/src/stores/cart/CartStore.ts +90 -4
  70. package/src/stores/lakehouse/entitlements/EntitlementsDashboardState.ts +10 -1
  71. package/tsconfig.json +4 -0
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import type { TraderProfileItem } from '@finos/legend-server-marketplace';
17
+ export declare enum OrderProfileLabel {
18
+ CHIP_LABEL = "Order Profile",
19
+ ALREADY_HAVE_ACCESS = "Already have access",
20
+ ADD_TO_CART = "Add to cart",
21
+ IN_CART = "In Cart",
22
+ ADDING = "Adding...",
23
+ SELECT_TERMINAL_TITLE = "Select Terminal",
24
+ SELECT_TERMINAL_DESCRIPTION = "All Add-Ons will be added automatically after the terminal is confirmed.",
25
+ CANCEL = "Cancel",
26
+ CLOSE = "Close",
27
+ OWNED_SUFFIX = "(Owned)",
28
+ IN_CART_SUFFIX = "(In Cart)",
29
+ MODEL_PREFIX = "Model: ",
30
+ PRICE_TOTAL_SEPARATOR = " \u00B7 Total: ",
31
+ VIEW_DETAILS = "View details"
32
+ }
33
+ export declare enum OrderProfileTableHeader {
34
+ PRODUCT_NAME = "PRODUCT NAME",
35
+ PROVIDER = "PROVIDER",
36
+ CATEGORY = "CATEGORY",
37
+ COST_MONTHLY = "COST (Monthly)"
38
+ }
39
+ /**
40
+ * Returns a stable random product image URL for a given asset base URL.
41
+ * Intended to be called once inside a `useState` initialiser so the image
42
+ * does not change on re-renders.
43
+ */
44
+ export declare const getRandomImageUrl: (assetUrl: string) => string;
45
+ /** Formats a price as a plain USD string, e.g. "$1,234.56". Used in detail tables. */
46
+ export declare const formatItemPrice: (price: number) => string;
47
+ /** Formats a price with a "/month" suffix for display on cards. */
48
+ export declare const formatCardPrice: (price: number) => string;
49
+ export declare const formatAddToCartSuccessMessage: (productName: string) => string;
50
+ export declare const formatAddToCartErrorMessage: (productName: string, errorMessage: string) => string;
51
+ export declare const getItemSummary: (items: TraderProfileItem[]) => {
52
+ terminalCount: number;
53
+ addOnCount: number;
54
+ };
55
+ export declare const formatProfileSummaryLine: (terminalCount: number, addOnCount: number) => string;
56
+ /**
57
+ * Calculates the total price for a multiselect order profile.
58
+ * Finds the highest-priced terminal and sums it with its associated add-ons.
59
+ * Returns `undefined` when there are no terminal items.
60
+ */
61
+ export declare const calculateMultiselectTotalPrice: (items: TraderProfileItem[]) => number | undefined;
62
+ /**
63
+ * Groups items so that each vendor-profile (terminal) is immediately followed
64
+ * by its associated add-ons (matched by item.model). Unmatched add-ons are
65
+ * appended at the end.
66
+ */
67
+ export declare const groupOrderProfileItems: (items: TraderProfileItem[]) => {
68
+ item: TraderProfileItem;
69
+ isSubItem: boolean;
70
+ }[];
71
+ //# sourceMappingURL=orderProfileUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderProfileUtils.d.ts","sourceRoot":"","sources":["../../../src/components/ProviderCard/orderProfileUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAK1E,oBAAY,iBAAiB;IAC3B,UAAU,kBAAkB;IAC5B,mBAAmB,wBAAwB;IAC3C,WAAW,gBAAgB;IAC3B,OAAO,YAAY;IACnB,MAAM,cAAc;IACpB,qBAAqB,oBAAoB;IACzC,2BAA2B,6EAA6E;IACxG,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,YAAY,YAAY;IACxB,cAAc,cAAc;IAC5B,YAAY,YAAY;IACxB,qBAAqB,oBAAe;IACpC,YAAY,iBAAiB;CAC9B;AAED,oBAAY,uBAAuB;IACjC,YAAY,iBAAiB;IAC7B,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,YAAY,mBAAmB;CAChC;AAID;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,KAAG,MAIpD,CAAC;AAWF,sFAAsF;AACtF,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,MACnB,CAAC;AAE9B,mEAAmE;AACnE,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,KAAG,MACR,CAAC;AAIzC,eAAO,MAAM,6BAA6B,GAAI,aAAa,MAAM,KAAG,MACC,CAAC;AAEtE,eAAO,MAAM,2BAA2B,GACtC,aAAa,MAAM,EACnB,cAAc,MAAM,KACnB,MAAiE,CAAC;AAIrE,eAAO,MAAM,cAAc,GACzB,OAAO,iBAAiB,EAAE,KACzB;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAG7C,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,eAAe,MAAM,EACrB,YAAY,MAAM,KACjB,MAKF,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,GACzC,OAAO,iBAAiB,EAAE,KACzB,MAAM,GAAG,SAcX,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,OAAO,iBAAiB,EAAE,KACzB;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,EA0BjD,CAAC"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { MAX_PRODUCT_IMAGE_COUNT } from '../../stores/lakehouse/dataProducts/ProductCardState.js';
17
+ // ─── String labels ───────────────────────────────────────────────────────────
18
+ export var OrderProfileLabel;
19
+ (function (OrderProfileLabel) {
20
+ OrderProfileLabel["CHIP_LABEL"] = "Order Profile";
21
+ OrderProfileLabel["ALREADY_HAVE_ACCESS"] = "Already have access";
22
+ OrderProfileLabel["ADD_TO_CART"] = "Add to cart";
23
+ OrderProfileLabel["IN_CART"] = "In Cart";
24
+ OrderProfileLabel["ADDING"] = "Adding...";
25
+ OrderProfileLabel["SELECT_TERMINAL_TITLE"] = "Select Terminal";
26
+ OrderProfileLabel["SELECT_TERMINAL_DESCRIPTION"] = "All Add-Ons will be added automatically after the terminal is confirmed.";
27
+ OrderProfileLabel["CANCEL"] = "Cancel";
28
+ OrderProfileLabel["CLOSE"] = "Close";
29
+ OrderProfileLabel["OWNED_SUFFIX"] = "(Owned)";
30
+ OrderProfileLabel["IN_CART_SUFFIX"] = "(In Cart)";
31
+ OrderProfileLabel["MODEL_PREFIX"] = "Model: ";
32
+ OrderProfileLabel["PRICE_TOTAL_SEPARATOR"] = " \u00B7 Total: ";
33
+ OrderProfileLabel["VIEW_DETAILS"] = "View details";
34
+ })(OrderProfileLabel || (OrderProfileLabel = {}));
35
+ export var OrderProfileTableHeader;
36
+ (function (OrderProfileTableHeader) {
37
+ OrderProfileTableHeader["PRODUCT_NAME"] = "PRODUCT NAME";
38
+ OrderProfileTableHeader["PROVIDER"] = "PROVIDER";
39
+ OrderProfileTableHeader["CATEGORY"] = "CATEGORY";
40
+ OrderProfileTableHeader["COST_MONTHLY"] = "COST (Monthly)";
41
+ })(OrderProfileTableHeader || (OrderProfileTableHeader = {}));
42
+ // ─── Image URL ──────────────────────────────────────────────────────────────────
43
+ /**
44
+ * Returns a stable random product image URL for a given asset base URL.
45
+ * Intended to be called once inside a `useState` initialiser so the image
46
+ * does not change on re-renders.
47
+ */
48
+ export const getRandomImageUrl = (assetUrl) => {
49
+ const randomValue = crypto.getRandomValues(new Uint32Array(1))[0] ?? 0;
50
+ const randomIndex = (randomValue % MAX_PRODUCT_IMAGE_COUNT) + 1;
51
+ return `${assetUrl}/images${randomIndex}.jpg`;
52
+ };
53
+ // ─── Price formatting ─────────────────────────────────────────────────────────
54
+ const USD_FORMATTER = new Intl.NumberFormat('en-US', {
55
+ style: 'currency',
56
+ currency: 'USD',
57
+ minimumFractionDigits: 2,
58
+ maximumFractionDigits: 2,
59
+ });
60
+ /** Formats a price as a plain USD string, e.g. "$1,234.56". Used in detail tables. */
61
+ export const formatItemPrice = (price) => USD_FORMATTER.format(price);
62
+ /** Formats a price with a "/month" suffix for display on cards. */
63
+ export const formatCardPrice = (price) => `${USD_FORMATTER.format(price)}/month`;
64
+ // ─── Toast message formatters ────────────────────────────────────────────────
65
+ export const formatAddToCartSuccessMessage = (productName) => `Order profile ${productName} has been successfully added to cart.`;
66
+ export const formatAddToCartErrorMessage = (productName, errorMessage) => `Failed to add ${productName} to cart: ${errorMessage}`;
67
+ // ─── Item summary helpers ─────────────────────────────────────────────────────
68
+ export const getItemSummary = (items) => {
69
+ const terminalCount = items.filter((item) => item.isTerminal).length;
70
+ return { terminalCount, addOnCount: items.length - terminalCount };
71
+ };
72
+ export const formatProfileSummaryLine = (terminalCount, addOnCount) => {
73
+ const terminalLabel = terminalCount === 1 ? '1 Terminal' : `${terminalCount} Terminals`;
74
+ const addOnLabel = addOnCount === 1 ? '1 Add-On' : `${addOnCount} Add-Ons`;
75
+ return `${terminalLabel} · ${addOnLabel}`;
76
+ };
77
+ // ─── Multiselect price calculation ──────────────────────────────────────────
78
+ /**
79
+ * Calculates the total price for a multiselect order profile.
80
+ * Finds the highest-priced terminal and sums it with its associated add-ons.
81
+ * Returns `undefined` when there are no terminal items.
82
+ */
83
+ export const calculateMultiselectTotalPrice = (items) => {
84
+ const terminals = items.filter((item) => item.isTerminal && !item.isOwned);
85
+ if (terminals.length === 0) {
86
+ return undefined;
87
+ }
88
+ const highestTerminal = terminals.reduce((max, curr) => curr.price > max.price ? curr : max);
89
+ const addOns = items.filter((item) => !item.isTerminal && !item.isOwned && item.model === highestTerminal.model);
90
+ const addOnsTotal = addOns.reduce((sum, item) => sum + item.price, 0);
91
+ return highestTerminal.price + addOnsTotal;
92
+ };
93
+ // ─── Grouping ─────────────────────────────────────────────────────────────────
94
+ /**
95
+ * Groups items so that each vendor-profile (terminal) is immediately followed
96
+ * by its associated add-ons (matched by item.model). Unmatched add-ons are
97
+ * appended at the end.
98
+ */
99
+ export const groupOrderProfileItems = (items) => {
100
+ const result = [];
101
+ const terminals = items.filter((i) => i.isTerminal);
102
+ const addOns = items.filter((i) => !i.isTerminal);
103
+ const matchedAddonIds = new Set();
104
+ for (const terminal of terminals) {
105
+ result.push({ item: terminal, isSubItem: false });
106
+ if (terminal.model !== undefined && terminal.model !== null) {
107
+ for (const addon of addOns) {
108
+ if (addon.model === terminal.model && !matchedAddonIds.has(addon.id)) {
109
+ result.push({ item: addon, isSubItem: true });
110
+ matchedAddonIds.add(addon.id);
111
+ }
112
+ }
113
+ }
114
+ }
115
+ for (const addon of addOns) {
116
+ if (!matchedAddonIds.has(addon.id)) {
117
+ result.push({ item: addon, isSubItem: false });
118
+ }
119
+ }
120
+ return result;
121
+ };
122
+ //# sourceMappingURL=orderProfileUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderProfileUtils.js","sourceRoot":"","sources":["../../../src/components/ProviderCard/orderProfileUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AAElG,gFAAgF;AAEhF,MAAM,CAAN,IAAY,iBAeX;AAfD,WAAY,iBAAiB;IAC3B,iDAA4B,CAAA;IAC5B,gEAA2C,CAAA;IAC3C,gDAA2B,CAAA;IAC3B,wCAAmB,CAAA;IACnB,yCAAoB,CAAA;IACpB,8DAAyC,CAAA;IACzC,6HAAwG,CAAA;IACxG,sCAAiB,CAAA;IACjB,oCAAe,CAAA;IACf,6CAAwB,CAAA;IACxB,iDAA4B,CAAA;IAC5B,6CAAwB,CAAA;IACxB,8DAAoC,CAAA;IACpC,kDAA6B,CAAA;AAC/B,CAAC,EAfW,iBAAiB,KAAjB,iBAAiB,QAe5B;AAED,MAAM,CAAN,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,wDAA6B,CAAA;IAC7B,gDAAqB,CAAA;IACrB,gDAAqB,CAAA;IACrB,0DAA+B,CAAA;AACjC,CAAC,EALW,uBAAuB,KAAvB,uBAAuB,QAKlC;AAED,mFAAmF;AAEnF;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAU,EAAE;IAC5D,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,CAAC,WAAW,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAChE,OAAO,GAAG,QAAQ,UAAU,WAAW,MAAM,CAAC;AAChD,CAAC,CAAC;AAEF,iFAAiF;AAEjF,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;IACnD,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,KAAK;IACf,qBAAqB,EAAE,CAAC;IACxB,qBAAqB,EAAE,CAAC;CACzB,CAAC,CAAC;AAEH,sFAAsF;AACtF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAU,EAAE,CACvD,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE9B,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAa,EAAU,EAAE,CACvD,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;AAEzC,gFAAgF;AAEhF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,WAAmB,EAAU,EAAE,CAC3E,iBAAiB,WAAW,uCAAuC,CAAC;AAEtE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,WAAmB,EACnB,YAAoB,EACZ,EAAE,CAAC,iBAAiB,WAAW,aAAa,YAAY,EAAE,CAAC;AAErE,iFAAiF;AAEjF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAA0B,EACqB,EAAE;IACjD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IACrE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;AACrE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,aAAqB,EACrB,UAAkB,EACV,EAAE;IACV,MAAM,aAAa,GACjB,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,aAAa,YAAY,CAAC;IACpE,MAAM,UAAU,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,UAAU,CAAC;IAC3E,OAAO,GAAG,aAAa,MAAM,UAAU,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,KAA0B,EACN,EAAE;IACtB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CACrD,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CACpC,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CACzB,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,KAAK,CAC5E,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACtE,OAAO,eAAe,CAAC,KAAK,GAAG,WAAW,CAAC;AAC7C,CAAC,CAAC;AAEF,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,KAA0B,EACyB,EAAE;IACrD,MAAM,MAAM,GAAsD,EAAE,CAAC;IAErE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC5D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;oBACrE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9C,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}