@vuu-ui/vuu-data-test 2.1.19-beta.1 → 2.1.19-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/package.json +8 -9
  2. package/src/ArrayProxy.js +38 -0
  3. package/src/RuntimeVisualLink.js +45 -0
  4. package/src/SessionTable.js +49 -0
  5. package/src/Table.js +96 -0
  6. package/src/TickingArrayDataSource.js +208 -0
  7. package/src/UpdateGenerator.js +72 -0
  8. package/src/basket/BasketModule.js +272 -0
  9. package/src/basket/basket-schemas.js +355 -0
  10. package/src/basket/index.js +2 -0
  11. package/src/basket/reference-data/constituents.js +76 -0
  12. package/src/basket/reference-data/ftse100.js +686 -0
  13. package/src/basket/reference-data/hsi.js +1047 -0
  14. package/src/basket/reference-data/nasdaq100.js +812 -0
  15. package/src/basket/reference-data/prices.js +43 -0
  16. package/src/basket/reference-data/sp500.js +315 -0
  17. package/src/core/module/ModuleContainer.js +21 -0
  18. package/src/core/module/VuuModule.js +476 -0
  19. package/src/core/table/TableContainer.js +97 -0
  20. package/src/data-utils.js +53 -0
  21. package/src/index.js +13 -0
  22. package/src/local-datasource-provider/LocalDatasourceProvider.js +44 -0
  23. package/src/makeSuggestions.js +20 -0
  24. package/src/rowUpdates.js +0 -0
  25. package/src/schemas.js +19 -0
  26. package/src/session-table-utils.js +16 -0
  27. package/src/simul/SimulModule.js +175 -0
  28. package/src/simul/index.js +2 -0
  29. package/src/simul/reference-data/accounts.js +23 -0
  30. package/src/simul/reference-data/algos.js +9 -0
  31. package/src/simul/reference-data/currencies.js +8 -0
  32. package/src/simul/reference-data/index.js +5 -0
  33. package/src/simul/reference-data/instrument-prices.js +48 -0
  34. package/src/simul/reference-data/instruments-extended.js +12 -0
  35. package/src/simul/reference-data/instruments.js +67 -0
  36. package/src/simul/reference-data/isin-generator/convert-string-to-base-ten-number.js +2 -0
  37. package/src/simul/reference-data/isin-generator/fixtures/alphabet.js +27 -0
  38. package/src/simul/reference-data/isin-generator/fixtures/alphanumeric-values.js +7 -0
  39. package/src/simul/reference-data/isin-generator/fixtures/base-ten-numbers.js +13 -0
  40. package/src/simul/reference-data/isin-generator/generate-cusip-check-code.js +17 -0
  41. package/src/simul/reference-data/isin-generator/generate-cusip-without-check-code.js +8 -0
  42. package/src/simul/reference-data/isin-generator/generate-cusip.js +8 -0
  43. package/src/simul/reference-data/isin-generator/generate-random-alphanumeric.js +3 -0
  44. package/src/simul/reference-data/isin-generator/generate-random-base-ten-number.js +2 -0
  45. package/src/simul/reference-data/isin-generator/generate-random-string-of-alphanumeric-chars.js +7 -0
  46. package/src/simul/reference-data/isin-generator/generate-random-string-of-base-ten-chars.js +7 -0
  47. package/src/simul/reference-data/isin-generator/index.js +280 -0
  48. package/src/simul/reference-data/isin-generator/is-odd.js +2 -0
  49. package/src/simul/reference-data/locations.js +45 -0
  50. package/src/simul/reference-data/lotsizes.js +24 -0
  51. package/src/simul/reference-data/orderStatus.js +6 -0
  52. package/src/simul/reference-data/orders.js +64 -0
  53. package/src/simul/reference-data/parent-child-orders.js +117 -0
  54. package/src/simul/reference-data/priceStrategies.js +8 -0
  55. package/src/simul/reference-data/prices.js +78 -0
  56. package/src/simul/reference-data/sides.js +5 -0
  57. package/src/simul/simul-schemas.js +428 -0
  58. package/src/test/TestModule.js +95 -0
  59. package/src/test/index.js +1 -0
  60. package/src/test/test-schemas.js +74 -0
  61. package/src/vuu-row-generator.js +71 -0
@@ -0,0 +1,280 @@
1
+ import { generateCusip } from "./generate-cusip.js";
2
+ const countryCodes = [
3
+ "AD",
4
+ "AE",
5
+ "AF",
6
+ "AG",
7
+ "AI",
8
+ "AL",
9
+ "AM",
10
+ "AO",
11
+ "AQ",
12
+ "AR",
13
+ "AS",
14
+ "AT",
15
+ "AU",
16
+ "AW",
17
+ "AX",
18
+ "AZ",
19
+ "BA",
20
+ "BB",
21
+ "BD",
22
+ "BE",
23
+ "BF",
24
+ "BG",
25
+ "BH",
26
+ "BI",
27
+ "BJ",
28
+ "BL",
29
+ "BM",
30
+ "BN",
31
+ "BO",
32
+ "BQ",
33
+ "BR",
34
+ "BS",
35
+ "BT",
36
+ "BV",
37
+ "BW",
38
+ "BY",
39
+ "BZ",
40
+ "CA",
41
+ "CC",
42
+ "CD",
43
+ "CF",
44
+ "CG",
45
+ "CH",
46
+ "CI",
47
+ "CK",
48
+ "CL",
49
+ "CM",
50
+ "CN",
51
+ "CO",
52
+ "CR",
53
+ "CU",
54
+ "CV",
55
+ "CW",
56
+ "CX",
57
+ "CY",
58
+ "CZ",
59
+ "DE",
60
+ "DJ",
61
+ "DK",
62
+ "DM",
63
+ "DO",
64
+ "DZ",
65
+ "EC",
66
+ "EE",
67
+ "EG",
68
+ "EH",
69
+ "ER",
70
+ "ES",
71
+ "ET",
72
+ "FI",
73
+ "FJ",
74
+ "FK",
75
+ "FM",
76
+ "FO",
77
+ "FR",
78
+ "GA",
79
+ "GB",
80
+ "GD",
81
+ "GE",
82
+ "GF",
83
+ "GG",
84
+ "GH",
85
+ "GI",
86
+ "GL",
87
+ "GM",
88
+ "GN",
89
+ "GP",
90
+ "GQ",
91
+ "GR",
92
+ "GS",
93
+ "GT",
94
+ "GU",
95
+ "GW",
96
+ "GY",
97
+ "HK",
98
+ "HM",
99
+ "HN",
100
+ "HR",
101
+ "HT",
102
+ "HU",
103
+ "ID",
104
+ "IE",
105
+ "IL",
106
+ "IM",
107
+ "IN",
108
+ "IO",
109
+ "IQ",
110
+ "IR",
111
+ "IS",
112
+ "IT",
113
+ "JE",
114
+ "JM",
115
+ "JO",
116
+ "JP",
117
+ "KE",
118
+ "KG",
119
+ "KH",
120
+ "KI",
121
+ "KM",
122
+ "KN",
123
+ "KP",
124
+ "KR",
125
+ "KW",
126
+ "KY",
127
+ "KZ",
128
+ "LA",
129
+ "LB",
130
+ "LC",
131
+ "LI",
132
+ "LK",
133
+ "LR",
134
+ "LS",
135
+ "LT",
136
+ "LU",
137
+ "LV",
138
+ "LY",
139
+ "MA",
140
+ "MC",
141
+ "MD",
142
+ "ME",
143
+ "MF",
144
+ "MG",
145
+ "MH",
146
+ "MK",
147
+ "ML",
148
+ "MM",
149
+ "MN",
150
+ "MO",
151
+ "MP",
152
+ "MQ",
153
+ "MR",
154
+ "MS",
155
+ "MT",
156
+ "MU",
157
+ "MV",
158
+ "MW",
159
+ "MX",
160
+ "MY",
161
+ "MZ",
162
+ "NA",
163
+ "NC",
164
+ "NE",
165
+ "NF",
166
+ "NG",
167
+ "NI",
168
+ "NL",
169
+ "NO",
170
+ "NP",
171
+ "NR",
172
+ "NU",
173
+ "NZ",
174
+ "OM",
175
+ "PA",
176
+ "PE",
177
+ "PF",
178
+ "PG",
179
+ "PH",
180
+ "PK",
181
+ "PL",
182
+ "PM",
183
+ "PN",
184
+ "PR",
185
+ "PS",
186
+ "PT",
187
+ "PW",
188
+ "PY",
189
+ "QA",
190
+ "RE",
191
+ "RO",
192
+ "RS",
193
+ "RU",
194
+ "RW",
195
+ "SA",
196
+ "SB",
197
+ "SC",
198
+ "SD",
199
+ "SE",
200
+ "SG",
201
+ "SH",
202
+ "SI",
203
+ "SJ",
204
+ "SK",
205
+ "SL",
206
+ "SM",
207
+ "SN",
208
+ "SO",
209
+ "SR",
210
+ "SS",
211
+ "ST",
212
+ "SV",
213
+ "SX",
214
+ "SY",
215
+ "SZ",
216
+ "TC",
217
+ "TD",
218
+ "TF",
219
+ "TG",
220
+ "TH",
221
+ "TJ",
222
+ "TK",
223
+ "TL",
224
+ "TM",
225
+ "TN",
226
+ "TO",
227
+ "TR",
228
+ "TT",
229
+ "TV",
230
+ "TW",
231
+ "TZ",
232
+ "UA",
233
+ "UG",
234
+ "UM",
235
+ "US",
236
+ "UY",
237
+ "UZ",
238
+ "VA",
239
+ "VC",
240
+ "VE",
241
+ "VG",
242
+ "VI",
243
+ "VN",
244
+ "VU",
245
+ "WF",
246
+ "WS",
247
+ "YE",
248
+ "YT",
249
+ "ZA",
250
+ "ZM",
251
+ "ZW"
252
+ ];
253
+ const isin_generator_cusip = generateCusip();
254
+ const generateIsin = (cusip)=>{
255
+ const code = countryCodes[Math.floor(Math.random() * countryCodes.length)];
256
+ const isin = code + cusip + generateIsinCheckDigit(code + cusip + "0");
257
+ return isin;
258
+ };
259
+ const generateIsinCheckDigit = (isin)=>{
260
+ if (12 != isin.length) return false;
261
+ const v = [];
262
+ for(let i = isin.length - 2; i >= 0; i--){
263
+ const c = isin.charAt(i);
264
+ if (isNaN(parseInt(c))) {
265
+ const letterCode = isin.charCodeAt(i) - 55;
266
+ v.push(letterCode % 10);
267
+ if (letterCode > 9) v.push(Math.floor(letterCode / 10));
268
+ } else v.push(Number(c));
269
+ }
270
+ let sum = 0;
271
+ const l = v.length;
272
+ for(let i = 0; i < l; i++)if (i % 2 == 0) {
273
+ const d = 2 * v[i];
274
+ sum += Math.floor(d / 10);
275
+ sum += d % 10;
276
+ } else sum += v[i];
277
+ return (10 - sum % 10) % 10;
278
+ };
279
+ const isinGenerator = ()=>generateIsin(isin_generator_cusip);
280
+ export { isinGenerator };
@@ -0,0 +1,2 @@
1
+ const isOdd = (value)=>value % 2 === 1;
2
+ export { isOdd };
@@ -0,0 +1,45 @@
1
+ const locations = {
2
+ L: [
3
+ "London PLC",
4
+ "XLON/LSE-SETS"
5
+ ],
6
+ N: [
7
+ "Corporation",
8
+ "XNGS/NAS-GSM"
9
+ ],
10
+ AS: [
11
+ "B.V.",
12
+ "XAMS/ENA-MAIN"
13
+ ],
14
+ OQ: [
15
+ "Co.",
16
+ "XNYS/NYS-MAIN"
17
+ ],
18
+ PA: [
19
+ "Paris",
20
+ "PAR/EUR_FR"
21
+ ],
22
+ MI: [
23
+ "Milan",
24
+ "MIL/EUR_IT"
25
+ ],
26
+ FR: [
27
+ "Frankfurt",
28
+ "FR/EUR_DE"
29
+ ],
30
+ AT: [
31
+ "Athens",
32
+ "AT/EUR_GR"
33
+ ]
34
+ };
35
+ const suffixes = [
36
+ "L",
37
+ "N",
38
+ "OQ",
39
+ "AS",
40
+ "PA",
41
+ "MI",
42
+ "FR",
43
+ "AT"
44
+ ];
45
+ export { locations, suffixes };
@@ -0,0 +1,24 @@
1
+ const lotsizes = [
2
+ 1,
3
+ 2,
4
+ 5,
5
+ 10,
6
+ 50,
7
+ 50,
8
+ 70,
9
+ 100,
10
+ 100,
11
+ 100,
12
+ 120,
13
+ 150,
14
+ 150,
15
+ 200,
16
+ 500,
17
+ 700,
18
+ 1000,
19
+ 2000,
20
+ 2500,
21
+ 5000,
22
+ 10000
23
+ ];
24
+ export { lotsizes };
@@ -0,0 +1,6 @@
1
+ const orderStatus = [
2
+ "NEW",
3
+ "CANCELLED",
4
+ "FILLED"
5
+ ];
6
+ export { orderStatus };
@@ -0,0 +1,64 @@
1
+ import { currencies } from "./currencies.js";
2
+ import { getRic } from "./instruments.js";
3
+ import { random } from "../../data-utils.js";
4
+ import { buildDataColumnMap } from "../../Table.js";
5
+ import { schemas } from "../simul-schemas.js";
6
+ import { sides } from "./sides.js";
7
+ import TableContainer from "../../core/table/TableContainer.js";
8
+ const traders = [
9
+ "Trader A",
10
+ "Trader B",
11
+ "Trader C"
12
+ ];
13
+ const orderStatus = [
14
+ "Filled",
15
+ "Cancelled",
16
+ "New",
17
+ "Partial Exec",
18
+ "Booked",
19
+ "All Done"
20
+ ];
21
+ const isComplete = (status)=>[
22
+ "Filled",
23
+ "All Done",
24
+ "Booked"
25
+ ].includes(status);
26
+ const OrderColumnMap = {
27
+ ccy: 0,
28
+ created: 1,
29
+ filledQuantity: 2,
30
+ lastUpdate: 3,
31
+ orderId: 4,
32
+ quantity: 5,
33
+ ric: 6,
34
+ side: 7,
35
+ trader: 8
36
+ };
37
+ const ordersData = [];
38
+ const now = +new Date();
39
+ for(let i = 0; i < 100; i++){
40
+ const status = orderStatus[random(0, orderStatus.length - 1)];
41
+ const ccy = currencies[random(0, currencies.length - 1)];
42
+ const created = now;
43
+ const lastUpdate = now;
44
+ const orderId = `ORD${("0000" + i).slice(-4)}`;
45
+ const quantity = random(1000, 10000);
46
+ const filledQuantity = isComplete(status) ? quantity : "New" === status ? 0 : random(0, quantity);
47
+ const ric = getRic("AAP.L");
48
+ const side = sides[random(0, sides.length - 1)];
49
+ const trader = traders[random(0, traders.length - 1)];
50
+ ordersData.push([
51
+ status,
52
+ ccy,
53
+ created,
54
+ filledQuantity,
55
+ lastUpdate,
56
+ orderId,
57
+ quantity,
58
+ ric,
59
+ side,
60
+ trader
61
+ ]);
62
+ }
63
+ const ordersTable = TableContainer.createTable(schemas.orders, ordersData, buildDataColumnMap(schemas, "orders"));
64
+ export { OrderColumnMap, ordersData, ordersTable };
@@ -0,0 +1,117 @@
1
+ import { Clock } from "@vuu-ui/vuu-utils";
2
+ import TableContainer from "../../core/table/TableContainer.js";
3
+ import { random } from "../../data-utils.js";
4
+ import { buildDataColumnMap } from "../../Table.js";
5
+ import { schemas } from "../simul-schemas.js";
6
+ import { accounts } from "./accounts.js";
7
+ import { algos } from "./algos.js";
8
+ import { instrumentsData } from "./instruments.js";
9
+ import { orderStatus as external_orderStatus_js_orderStatus } from "./orderStatus.js";
10
+ import { sides } from "./sides.js";
11
+ const instrumentMap = buildDataColumnMap(schemas, "instruments");
12
+ const PARENT_ORDER_COUNT = 5000;
13
+ const CHILD_ORDER_COUNT = 20000;
14
+ const avgChildOrderPerOrder = Math.round(CHILD_ORDER_COUNT / PARENT_ORDER_COUNT);
15
+ const childMaxMultiple = 10;
16
+ const clock = new Clock().goBack(120, "minutes");
17
+ const parentOrdersTable = TableContainer.createTable(schemas.parentOrders, [], buildDataColumnMap(schemas, "parentOrders"));
18
+ const childOrdersTable = TableContainer.createTable(schemas.childOrders, [], buildDataColumnMap(schemas, "childOrders"));
19
+ let parentOrderCount = 0;
20
+ let childOrderCount = 0;
21
+ let notifyNewOrders = false;
22
+ function createParentAndChildOrders() {
23
+ parentOrderCount += 1;
24
+ const instrument = instrumentsData[random(0, instrumentsData.length - 1)];
25
+ const orderQuantity = 1000 * random(1, 100);
26
+ const orderStatus = external_orderStatus_js_orderStatus[random(0, external_orderStatus_js_orderStatus.length - 1)];
27
+ const filledQty = "FILLED" === orderStatus ? orderQuantity : "NEW" === orderStatus ? 0 : orderQuantity - random(100, orderQuantity);
28
+ const openQty = orderQuantity - filledQty;
29
+ const account = accounts[random(0, accounts.length - 1)];
30
+ const algo = algos[random(0, algos.length - 1)];
31
+ const averagePrice = 0;
32
+ const ccy = "GBP";
33
+ const exchange = instrument[instrumentMap.exchange];
34
+ const parentOrderIdAsInt = parentOrderCount;
35
+ const parentOrderId = parentOrderCount.toString().padStart(10, "0");
36
+ const price = 100;
37
+ const quantity = orderQuantity;
38
+ const ric = instrument[instrumentMap.ric];
39
+ const side = sides[random(0, sides.length - 1)];
40
+ const status = orderStatus;
41
+ const volLimit = 100;
42
+ const lastUpdate = clock.now;
43
+ const created = clock.now;
44
+ const numberOfChildOrders = random(0, avgChildOrderPerOrder * random(1, childMaxMultiple));
45
+ let remainingQty = orderQuantity;
46
+ for(let j = 0; j < numberOfChildOrders; j++){
47
+ childOrderCount += 1;
48
+ const childOrderQuantity = Math.round(remainingQty / (childOrderCount - j));
49
+ remainingQty -= childOrderQuantity;
50
+ const childOrderStatus = external_orderStatus_js_orderStatus[random(0, external_orderStatus_js_orderStatus.length - 1)];
51
+ const childFilledQty = "FILLED" === orderStatus ? childOrderQuantity : "NEW" === childOrderStatus ? 0 : childOrderQuantity - random(100, childOrderQuantity);
52
+ const childOpenQty = childOrderQuantity - childFilledQty;
53
+ const averagePrice = 0;
54
+ const childIdAsInt = childOrderCount;
55
+ const childId = childOrderCount.toString().padStart(10, "0");
56
+ const lastUpdate = 0;
57
+ const price = 100;
58
+ const strategy = 0;
59
+ childOrdersTable.insert([
60
+ account,
61
+ averagePrice,
62
+ ccy,
63
+ exchange,
64
+ childFilledQty,
65
+ childId,
66
+ childIdAsInt,
67
+ childOpenQty,
68
+ parentOrderId,
69
+ price,
70
+ childOrderQuantity,
71
+ ric,
72
+ side,
73
+ childOrderStatus,
74
+ strategy,
75
+ volLimit,
76
+ lastUpdate,
77
+ created
78
+ ], notifyNewOrders);
79
+ }
80
+ parentOrdersTable.insert([
81
+ account,
82
+ algo,
83
+ averagePrice,
84
+ ccy,
85
+ childOrderCount,
86
+ exchange,
87
+ filledQty,
88
+ parentOrderId,
89
+ parentOrderIdAsInt,
90
+ openQty,
91
+ price,
92
+ quantity,
93
+ ric,
94
+ side,
95
+ status,
96
+ volLimit,
97
+ lastUpdate,
98
+ created
99
+ ], notifyNewOrders);
100
+ }
101
+ function createInitialOrders() {
102
+ for(let i = 0; i < PARENT_ORDER_COUNT; i++){
103
+ clock.advance(random(0, 100));
104
+ createParentAndChildOrders();
105
+ }
106
+ }
107
+ let newOrderInterval;
108
+ function startGeneratingNewOrders() {
109
+ newOrderInterval = setInterval(createParentAndChildOrders, 100);
110
+ }
111
+ function stopGeneratingNewOrders() {
112
+ clearInterval(newOrderInterval);
113
+ }
114
+ createInitialOrders();
115
+ clock.showCurrentTime = true;
116
+ notifyNewOrders = true;
117
+ export { childOrdersTable, parentOrdersTable, startGeneratingNewOrders, stopGeneratingNewOrders };
@@ -0,0 +1,8 @@
1
+ const priceStrategies = [
2
+ "Peg to near touch",
3
+ "Limit",
4
+ "Strategy 3",
5
+ "Strategy 4",
6
+ "Strategy 5"
7
+ ];
8
+ export { priceStrategies };
@@ -0,0 +1,78 @@
1
+ import { buildDataColumnMap } from "../../Table.js";
2
+ import { BaseUpdateGenerator } from "../../UpdateGenerator.js";
3
+ import { schemas } from "../simul-schemas.js";
4
+ import { InstrumentColumnMap, instrumentsData } from "./instruments.js";
5
+ import { random } from "../../data-utils.js";
6
+ import constituents from "../../basket/reference-data/constituents.js";
7
+ import TableContainer from "../../core/table/TableContainer.js";
8
+ const { bid: prices_bid, bidSize: prices_bidSize, ask: prices_ask, askSize: prices_askSize } = buildDataColumnMap(schemas, "prices");
9
+ const pricesUpdateGenerator = new BaseUpdateGenerator({
10
+ bid: prices_bid,
11
+ bidSize: prices_bidSize,
12
+ ask: prices_ask,
13
+ askSize: prices_askSize
14
+ });
15
+ const now = Date.now();
16
+ const prices_lastUpdate = now;
17
+ const prices_created = now;
18
+ const pricesData = instrumentsData.map((instrument)=>{
19
+ const spread = random(0, 10);
20
+ const ric = instrument[InstrumentColumnMap.ric];
21
+ const priceSeed = 100;
22
+ const ask = priceSeed + spread / 2;
23
+ const askSize = random(1000, 3000);
24
+ const bid = priceSeed - spread / 2;
25
+ const bidSize = random(1000, 3000);
26
+ const close = priceSeed + random(0, 1) / 10;
27
+ const last = priceSeed + random(0, 1) / 10;
28
+ const open = priceSeed + random(0, 1) / 10;
29
+ const phase = "C";
30
+ const scenario = "close";
31
+ const lastUpdate = now;
32
+ const created = now;
33
+ return [
34
+ ask,
35
+ askSize,
36
+ bid,
37
+ bidSize,
38
+ close,
39
+ last,
40
+ open,
41
+ phase,
42
+ ric,
43
+ scenario,
44
+ lastUpdate,
45
+ created
46
+ ];
47
+ });
48
+ for (const [, , , lastTrade, ric] of constituents){
49
+ const priceSeed = parseFloat(String(lastTrade));
50
+ if (!isNaN(priceSeed)) {
51
+ const spread = random(0, 10);
52
+ const ask = priceSeed + spread / 2;
53
+ const askSize = random(1000, 3000);
54
+ const bid = priceSeed - spread / 2;
55
+ const bidSize = random(1000, 3000);
56
+ const close = priceSeed + random(0, 1) / 10;
57
+ const last = priceSeed + random(0, 1) / 10;
58
+ const open = priceSeed + random(0, 1) / 10;
59
+ const phase = "C";
60
+ const scenario = "close";
61
+ pricesData.push([
62
+ ask,
63
+ askSize,
64
+ bid,
65
+ bidSize,
66
+ close,
67
+ last,
68
+ open,
69
+ phase,
70
+ ric,
71
+ scenario,
72
+ prices_lastUpdate,
73
+ prices_created
74
+ ]);
75
+ }
76
+ }
77
+ const pricesTable = TableContainer.createTable(schemas.prices, pricesData, buildDataColumnMap(schemas, "prices"), pricesUpdateGenerator);
78
+ export { pricesData, pricesTable };
@@ -0,0 +1,5 @@
1
+ const sides = [
2
+ "BUY",
3
+ "SELL"
4
+ ];
5
+ export { sides };