@memberjunction/integration-connectors 5.35.0 → 5.36.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.
Files changed (81) hide show
  1. package/dist/AptifyConnector.d.ts +88 -0
  2. package/dist/AptifyConnector.d.ts.map +1 -0
  3. package/dist/AptifyConnector.js +737 -0
  4. package/dist/AptifyConnector.js.map +1 -0
  5. package/dist/BettyConnector.d.ts +288 -0
  6. package/dist/BettyConnector.d.ts.map +1 -0
  7. package/dist/BettyConnector.js +909 -0
  8. package/dist/BettyConnector.js.map +1 -0
  9. package/dist/BlackbaudConnector.d.ts +64 -0
  10. package/dist/BlackbaudConnector.d.ts.map +1 -0
  11. package/dist/BlackbaudConnector.js +916 -0
  12. package/dist/BlackbaudConnector.js.map +1 -0
  13. package/dist/ConstantContactConnector.d.ts +126 -0
  14. package/dist/ConstantContactConnector.d.ts.map +1 -0
  15. package/dist/ConstantContactConnector.js +636 -0
  16. package/dist/ConstantContactConnector.js.map +1 -0
  17. package/dist/GrowthZoneConnector.d.ts +185 -0
  18. package/dist/GrowthZoneConnector.d.ts.map +1 -0
  19. package/dist/GrowthZoneConnector.js +745 -0
  20. package/dist/GrowthZoneConnector.js.map +1 -0
  21. package/dist/HubSpotConnector.d.ts +2 -2
  22. package/dist/HubSpotConnector.d.ts.map +1 -1
  23. package/dist/HubSpotConnector.js +3 -3
  24. package/dist/HubSpotConnector.js.map +1 -1
  25. package/dist/IMISConnector.d.ts +155 -0
  26. package/dist/IMISConnector.d.ts.map +1 -0
  27. package/dist/IMISConnector.js +686 -0
  28. package/dist/IMISConnector.js.map +1 -0
  29. package/dist/MJToMJConnector.d.ts +279 -0
  30. package/dist/MJToMJConnector.d.ts.map +1 -0
  31. package/dist/MJToMJConnector.js +893 -0
  32. package/dist/MJToMJConnector.js.map +1 -0
  33. package/dist/MagnetMailConnector.d.ts +163 -0
  34. package/dist/MagnetMailConnector.d.ts.map +1 -0
  35. package/dist/MagnetMailConnector.js +816 -0
  36. package/dist/MagnetMailConnector.js.map +1 -0
  37. package/dist/MailchimpConnector.d.ts +188 -0
  38. package/dist/MailchimpConnector.d.ts.map +1 -0
  39. package/dist/MailchimpConnector.js +753 -0
  40. package/dist/MailchimpConnector.js.map +1 -0
  41. package/dist/NetForumConnector.d.ts +51 -0
  42. package/dist/NetForumConnector.d.ts.map +1 -0
  43. package/dist/NetForumConnector.js +419 -0
  44. package/dist/NetForumConnector.js.map +1 -0
  45. package/dist/NetSuiteConnector.d.ts +70 -0
  46. package/dist/NetSuiteConnector.d.ts.map +1 -0
  47. package/dist/NetSuiteConnector.js +605 -0
  48. package/dist/NetSuiteConnector.js.map +1 -0
  49. package/dist/NimbleAMSConnector.d.ts +49 -0
  50. package/dist/NimbleAMSConnector.d.ts.map +1 -0
  51. package/dist/NimbleAMSConnector.js +408 -0
  52. package/dist/NimbleAMSConnector.js.map +1 -0
  53. package/dist/PropFuelConnector.d.ts +68 -0
  54. package/dist/PropFuelConnector.d.ts.map +1 -0
  55. package/dist/PropFuelConnector.js +514 -0
  56. package/dist/PropFuelConnector.js.map +1 -0
  57. package/dist/RasaConnector.d.ts +26 -0
  58. package/dist/RasaConnector.d.ts.map +1 -1
  59. package/dist/RasaConnector.js +233 -1
  60. package/dist/RasaConnector.js.map +1 -1
  61. package/dist/Reach360Connector.d.ts +165 -0
  62. package/dist/Reach360Connector.d.ts.map +1 -0
  63. package/dist/Reach360Connector.js +710 -0
  64. package/dist/Reach360Connector.js.map +1 -0
  65. package/dist/SharePointConnector.d.ts +181 -0
  66. package/dist/SharePointConnector.d.ts.map +1 -0
  67. package/dist/SharePointConnector.js +796 -0
  68. package/dist/SharePointConnector.js.map +1 -0
  69. package/dist/WicketConnector.d.ts +1 -0
  70. package/dist/WicketConnector.d.ts.map +1 -1
  71. package/dist/WicketConnector.js +6 -0
  72. package/dist/WicketConnector.js.map +1 -1
  73. package/dist/WildApricotConnector.d.ts +188 -0
  74. package/dist/WildApricotConnector.d.ts.map +1 -0
  75. package/dist/WildApricotConnector.js +1092 -0
  76. package/dist/WildApricotConnector.js.map +1 -0
  77. package/dist/index.d.ts +16 -0
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +16 -0
  80. package/dist/index.js.map +1 -1
  81. package/package.json +6 -6
@@ -0,0 +1,605 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ /**
8
+ * NetSuiteConnector — Integration connector for Oracle NetSuite ERP platform.
9
+ *
10
+ * API Documentation: https://system.netsuite.com/help/helpcenter/en_US/APIs/REST_API_Browser/record/v1/2023.1/index.html
11
+ *
12
+ * Auth: OAuth 1.0 Token-Based Authentication (TBA) — non-expiring tokens.
13
+ * Credentials: ConsumerKey, ConsumerSecret, TokenID, TokenSecret, AccountID
14
+ * Authorization header with HMAC-SHA256 signature per OAuth 1.0 spec.
15
+ * Base URL: https://{accountId}.suitetalk.api.netsuite.com/services/rest/record/v1
16
+ * SuiteQL: https://{accountId}.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql
17
+ * Pagination: limit/offset (max 1000 per page)
18
+ * Rate limits: 15 concurrent requests/account
19
+ * Incremental: SuiteQL queries with lastmodifieddate >= watermark
20
+ * CRUD: Full CRUD via REST Record API on ALL record types
21
+ *
22
+ * Discovery: DYNAMIC via GET /record/v1/metadata-catalog/
23
+ * - Enumerates ALL available record types for the account (100+ standard types)
24
+ * - Field metadata fetched per record type via GET /record/v1/metadata-catalog/{recordType}
25
+ * - New record types (including custom records) are picked up automatically
26
+ *
27
+ * API Categories:
28
+ * - REST Record API (implemented, dynamic) — direct CRUD on ALL record types via metadata catalog
29
+ * - SuiteQL API (implemented) — SQL-like queries for read + incremental sync
30
+ * - RESTlet API (NOT implemented) — custom SuiteScript server-side endpoints, not standard
31
+ * - SOAP/SuiteTalk SOAP (NOT implemented) — legacy XML, superseded by REST
32
+ * - CSV Import API (NOT implemented) — file-based batch upload, not API-driven
33
+ * - No webhooks/CDC — use SuiteQL lastmodifieddate polling instead
34
+ */
35
+ import { createHmac, randomBytes } from 'crypto';
36
+ import { RegisterClass } from '@memberjunction/global';
37
+ import { Metadata } from '@memberjunction/core';
38
+ import { BaseIntegrationConnector, BaseRESTIntegrationConnector, } from '@memberjunction/integration-engine';
39
+ // ─── Constants ────────────────────────────────────────────────────────────
40
+ const NS_PAGE_SIZE = 1000;
41
+ const MAX_RETRIES = 3;
42
+ const REQUEST_TIMEOUT_MS = 60_000;
43
+ const MIN_REQUEST_INTERVAL_MS = 100;
44
+ // Transaction record types in SuiteQL use the `transaction` table with a type filter.
45
+ // Non-transaction records query their own table (same name as REST endpoint).
46
+ const NS_TRANSACTION_TYPES = {
47
+ 'salesorder': 'SalesOrd', 'invoice': 'CustInvc', 'purchaseorder': 'PurchOrd',
48
+ 'journalentry': 'Journal', 'creditmemo': 'CustCred', 'vendorbill': 'VendBill',
49
+ 'vendorcredit': 'VendCred', 'vendorpayment': 'VendPymt', 'customerpayment': 'CustPymt',
50
+ 'customerrefund': 'CustRfnd', 'customerdeposit': 'CustDep', 'cashsale': 'CashSale',
51
+ 'cashrefund': 'CashRfnd', 'check': 'Check', 'deposit': 'Deposit',
52
+ 'expensereport': 'ExpRept', 'estimate': 'Estimate', 'returnauthorization': 'RtnAuth',
53
+ 'itemfulfillment': 'ItemShip', 'itemreceipt': 'ItemRcpt', 'transferorder': 'TrnfrOrd',
54
+ 'workorder': 'WorkOrd', 'assemblybuild': 'Build', 'inventoryadjustment': 'InvAdjst',
55
+ 'inventorytransfer': 'InvTrnfr', 'depositapplication': 'DepAppl',
56
+ };
57
+ // ─── Connector ────────────────────────────────────────────────────────────
58
+ let NetSuiteConnector = class NetSuiteConnector extends BaseRESTIntegrationConnector {
59
+ constructor() {
60
+ super(...arguments);
61
+ this.lastRequestTime = 0;
62
+ /** Cache of discovered record types: lowercase name → { name, href } */
63
+ this.recordTypeCache = new Map();
64
+ }
65
+ get IntegrationName() { return 'NetSuite'; }
66
+ get SupportsCreate() { return true; }
67
+ get SupportsUpdate() { return true; }
68
+ get SupportsDelete() { return true; }
69
+ GetIntegrationObjects() {
70
+ // Returns discovered objects with minimal fields — DiscoverFields() fills the rest
71
+ const objects = [];
72
+ for (const [, item] of this.recordTypeCache) {
73
+ objects.push({
74
+ Name: item.name,
75
+ DisplayName: this.FormatDisplayName(item.name),
76
+ Description: `NetSuite ${this.FormatDisplayName(item.name)} record`,
77
+ SupportsWrite: true,
78
+ Fields: [
79
+ { Name: 'id', DisplayName: 'Internal ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'NetSuite internal record ID' },
80
+ { Name: 'lastmodifieddate', DisplayName: 'Last Modified', Type: 'datetime', IsRequired: false, IsReadOnly: true, IsPrimaryKey: false, Description: 'Last modification date' },
81
+ ],
82
+ });
83
+ }
84
+ return objects;
85
+ }
86
+ GetActionGeneratorConfig() {
87
+ const config = super.GetActionGeneratorConfig();
88
+ if (!config)
89
+ return null;
90
+ config.IconClass = 'fa-solid fa-file-invoice-dollar';
91
+ config.CategoryDescription = 'NetSuite ERP — all record types discovered dynamically via metadata catalog';
92
+ config.ParentCategoryName = 'ERP/Finance';
93
+ config.IncludeSearch = true;
94
+ config.IncludeList = true;
95
+ return config;
96
+ }
97
+ // ─── Discovery (DYNAMIC via metadata-catalog) ──────────────────────
98
+ /**
99
+ * Discovers ALL available record types by calling the NetSuite REST metadata-catalog API.
100
+ * This covers 100+ standard record types plus any custom records (customrecord_{id}).
101
+ */
102
+ async DiscoverObjects(companyIntegration, contextUser) {
103
+ const auth = await this.Authenticate(companyIntegration, contextUser);
104
+ const catalogURL = `${auth.RecordBaseURL}/metadata-catalog/`;
105
+ const headers = this.BuildRequestHeaders(auth, catalogURL, 'GET');
106
+ // Add header to request JSON-schema format with type listing
107
+ headers['Accept'] = 'application/schema+json';
108
+ const response = await this.MakeHTTPRequest(auth, catalogURL, 'GET', headers);
109
+ if (response.Status !== 200) {
110
+ console.warn(`[NetSuite] Metadata catalog returned ${response.Status}, falling back to SuiteQL discovery`);
111
+ return this.DiscoverObjectsViaSuiteQL(auth);
112
+ }
113
+ const body = response.Body;
114
+ // The metadata-catalog returns { items: [{ name, href }, ...] } or { links: [...] }
115
+ const items = body['items']
116
+ ?? body['links']
117
+ ?? [];
118
+ this.recordTypeCache.clear();
119
+ const results = [];
120
+ for (const item of items) {
121
+ if (!item.name)
122
+ continue;
123
+ this.recordTypeCache.set(item.name.toLowerCase(), item);
124
+ results.push({
125
+ Name: item.name,
126
+ Label: this.FormatDisplayName(item.name),
127
+ Description: `NetSuite ${this.FormatDisplayName(item.name)} record`,
128
+ SupportsIncrementalSync: true, // All NS records support lastmodifieddate via SuiteQL
129
+ SupportsWrite: true, // All REST record types support full CRUD
130
+ });
131
+ }
132
+ // If catalog returned nothing, fall back to SuiteQL
133
+ if (results.length === 0) {
134
+ return this.DiscoverObjectsViaSuiteQL(auth);
135
+ }
136
+ return results;
137
+ }
138
+ /**
139
+ * Fallback: discover record types via SuiteQL query against the recordType table.
140
+ */
141
+ async DiscoverObjectsViaSuiteQL(auth) {
142
+ const query = `SELECT scriptid, name FROM customrecordtype UNION ALL SELECT 'customer' as scriptid, 'Customer' as name FROM dual`;
143
+ const url = `${auth.QueryBaseURL}/suiteql?limit=1000&offset=0`;
144
+ const headers = this.BuildRequestHeaders(auth, url, 'POST', true);
145
+ try {
146
+ const response = await this.MakeHTTPRequest(auth, url, 'POST', headers, { q: query });
147
+ if (response.Status === 200) {
148
+ const body = response.Body;
149
+ const results = [];
150
+ for (const item of (body.items ?? [])) {
151
+ const name = String(item['scriptid'] ?? item['name'] ?? '');
152
+ if (name) {
153
+ this.recordTypeCache.set(name.toLowerCase(), { name, href: '' });
154
+ results.push({
155
+ Name: name, Label: this.FormatDisplayName(name),
156
+ Description: `NetSuite ${this.FormatDisplayName(name)}`,
157
+ SupportsIncrementalSync: true, SupportsWrite: true,
158
+ });
159
+ }
160
+ }
161
+ if (results.length > 0)
162
+ return results;
163
+ }
164
+ }
165
+ catch {
166
+ // Fall through to hardcoded fallback
167
+ }
168
+ // Last resort: return a well-known set so the connector is usable even if discovery fails
169
+ return this.GetFallbackObjects();
170
+ }
171
+ GetFallbackObjects() {
172
+ const knownTypes = [
173
+ 'customer', 'vendor', 'employee', 'contact', 'partner', 'lead', 'prospect',
174
+ 'salesorder', 'invoice', 'purchaseorder', 'journalentry', 'creditmemo',
175
+ 'vendorbill', 'vendorcredit', 'vendorpayment', 'customerpayment', 'customerrefund',
176
+ 'cashsale', 'cashrefund', 'check', 'deposit', 'estimate', 'opportunity',
177
+ 'expensereport', 'returnauthorization', 'itemfulfillment', 'itemreceipt',
178
+ 'transferorder', 'workorder', 'assemblybuild', 'inventoryadjustment',
179
+ 'account', 'department', 'classification', 'location', 'subsidiary', 'currency',
180
+ 'inventoryitem', 'noninventoryitem', 'serviceitem', 'otherchargeitem',
181
+ 'discountitem', 'assemblyitem', 'kititem', 'giftcertificateitem',
182
+ 'task', 'phonecall', 'calendarevent', 'note', 'message',
183
+ 'supportcase', 'issue', 'solution',
184
+ 'job', 'charge', 'timeentry',
185
+ 'term', 'paymentmethod', 'salestaxitem',
186
+ 'file', 'folder',
187
+ ];
188
+ for (const name of knownTypes) {
189
+ this.recordTypeCache.set(name, { name, href: '' });
190
+ }
191
+ return knownTypes.map(name => ({
192
+ Name: name,
193
+ Label: this.FormatDisplayName(name),
194
+ Description: `NetSuite ${this.FormatDisplayName(name)} record`,
195
+ SupportsIncrementalSync: true,
196
+ SupportsWrite: true,
197
+ }));
198
+ }
199
+ /**
200
+ * Discovers fields for a record type by fetching its metadata via the REST API.
201
+ * Falls back to fetching one sample record and inferring field names/types.
202
+ */
203
+ async DiscoverFields(companyIntegration, objectName, contextUser) {
204
+ const auth = await this.Authenticate(companyIntegration, contextUser);
205
+ const recordType = objectName.toLowerCase();
206
+ // Try metadata endpoint first: GET /record/v1/metadata-catalog/{recordType}
207
+ try {
208
+ const metaURL = `${auth.RecordBaseURL}/metadata-catalog/${recordType}`;
209
+ const headers = this.BuildRequestHeaders(auth, metaURL, 'GET');
210
+ headers['Accept'] = 'application/schema+json';
211
+ const response = await this.MakeHTTPRequest(auth, metaURL, 'GET', headers);
212
+ if (response.Status === 200) {
213
+ return this.ParseFieldMetadata(response.Body);
214
+ }
215
+ }
216
+ catch {
217
+ // Fall through to sample-record approach
218
+ }
219
+ // Fallback: fetch one record and infer fields from the response
220
+ return this.InferFieldsFromSample(auth, recordType);
221
+ }
222
+ ParseFieldMetadata(body) {
223
+ const schema = body;
224
+ const properties = schema['properties'];
225
+ if (!properties)
226
+ return this.DefaultFields();
227
+ const fields = [];
228
+ const requiredFields = schema['required'] ?? [];
229
+ for (const [name, prop] of Object.entries(properties)) {
230
+ const nsType = String(prop['type'] ?? prop['format'] ?? 'string');
231
+ fields.push({
232
+ Name: name,
233
+ Label: String(prop['title'] ?? name),
234
+ Description: String(prop['description'] ?? ''),
235
+ DataType: this.MapNSFieldType(nsType),
236
+ IsRequired: requiredFields.includes(name),
237
+ IsUniqueKey: name === 'id',
238
+ IsReadOnly: prop['readOnly'] === true,
239
+ });
240
+ }
241
+ // Ensure PK exists
242
+ if (!fields.some(f => f.Name === 'id')) {
243
+ fields.unshift({
244
+ Name: 'id', Label: 'Internal ID', Description: 'NetSuite internal record ID',
245
+ DataType: 'string', IsRequired: false, IsUniqueKey: true, IsReadOnly: true,
246
+ });
247
+ }
248
+ return fields;
249
+ }
250
+ async InferFieldsFromSample(auth, recordType) {
251
+ try {
252
+ const url = `${auth.RecordBaseURL}/${recordType}?limit=1`;
253
+ const headers = this.BuildRequestHeaders(auth, url, 'GET');
254
+ const response = await this.MakeHTTPRequest(auth, url, 'GET', headers);
255
+ if (response.Status === 200) {
256
+ const body = response.Body;
257
+ const sample = (body.items ?? [])[0];
258
+ if (sample) {
259
+ const fields = [];
260
+ for (const [key, value] of Object.entries(sample)) {
261
+ if (key === 'links')
262
+ continue; // Skip HATEOAS links
263
+ fields.push({
264
+ Name: key,
265
+ Label: this.FormatDisplayName(key),
266
+ Description: '',
267
+ DataType: this.InferTypeFromValue(value),
268
+ IsRequired: false,
269
+ IsUniqueKey: key === 'id',
270
+ IsReadOnly: key === 'id' || key === 'lastmodifieddate' || key === 'datecreated',
271
+ });
272
+ }
273
+ return fields;
274
+ }
275
+ }
276
+ }
277
+ catch {
278
+ // Fall through
279
+ }
280
+ return this.DefaultFields();
281
+ }
282
+ DefaultFields() {
283
+ return [
284
+ { Name: 'id', Label: 'Internal ID', Description: 'NetSuite internal record ID', DataType: 'string', IsRequired: false, IsUniqueKey: true, IsReadOnly: true },
285
+ { Name: 'lastmodifieddate', Label: 'Last Modified', Description: 'Last modification date', DataType: 'datetime', IsRequired: false, IsUniqueKey: false, IsReadOnly: true },
286
+ ];
287
+ }
288
+ MapNSFieldType(nsType) {
289
+ const lower = nsType.toLowerCase();
290
+ if (lower.includes('integer') || lower === 'int')
291
+ return 'number';
292
+ if (lower.includes('float') || lower.includes('double') || lower.includes('currency') || lower.includes('decimal'))
293
+ return 'decimal';
294
+ if (lower.includes('boolean'))
295
+ return 'boolean';
296
+ if (lower.includes('date') || lower.includes('time'))
297
+ return 'datetime';
298
+ return 'string';
299
+ }
300
+ InferTypeFromValue(value) {
301
+ if (value === null || value === undefined)
302
+ return 'string';
303
+ if (typeof value === 'number')
304
+ return Number.isInteger(value) ? 'number' : 'decimal';
305
+ if (typeof value === 'boolean')
306
+ return 'boolean';
307
+ if (typeof value === 'string') {
308
+ if (/^\d{4}-\d{2}-\d{2}/.test(value))
309
+ return 'datetime';
310
+ return 'string';
311
+ }
312
+ return 'string';
313
+ }
314
+ FormatDisplayName(name) {
315
+ // Convert camelCase/lowercase to Title Case: "salesorder" → "Sales Order"
316
+ return name
317
+ .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase → camel Case
318
+ .replace(/([A-Z]+)/g, ' $1') // ABCDef → ABC Def
319
+ .replace(/[_-]/g, ' ') // snake_case → snake case
320
+ .trim()
321
+ .split(/\s+/)
322
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
323
+ .join(' ');
324
+ }
325
+ // ─── Auth ──────────────────────────────────────────────────────────
326
+ async Authenticate(companyIntegration, contextUser) {
327
+ const config = await this.ParseConfig(companyIntegration, contextUser);
328
+ const accountLower = config.AccountID.toLowerCase().replace('_', '-');
329
+ const recordBaseURL = `https://${accountLower}.suitetalk.api.netsuite.com/services/rest/record/v1`;
330
+ const queryBaseURL = `https://${accountLower}.suitetalk.api.netsuite.com/services/rest/query/v1`;
331
+ return {
332
+ Token: '', TokenType: 'OAuth1', Config: config,
333
+ RecordBaseURL: recordBaseURL, QueryBaseURL: queryBaseURL,
334
+ };
335
+ }
336
+ async ParseConfig(companyIntegration, contextUser, provider) {
337
+ const credentialID = companyIntegration.CredentialID;
338
+ if (credentialID) {
339
+ const md = provider ?? new Metadata();
340
+ const credential = await md.GetEntityObject('MJ: Credentials', contextUser);
341
+ const loaded = await credential.Load(credentialID);
342
+ if (loaded && credential.Values) {
343
+ const parsed = JSON.parse(credential.Values);
344
+ if (parsed['AccountID'] && parsed['ConsumerKey']) {
345
+ return {
346
+ AccountID: parsed['AccountID'], ConsumerKey: parsed['ConsumerKey'],
347
+ ConsumerSecret: parsed['ConsumerSecret'] ?? '',
348
+ TokenID: parsed['TokenID'] ?? '', TokenSecret: parsed['TokenSecret'] ?? '',
349
+ };
350
+ }
351
+ }
352
+ }
353
+ const configJson = companyIntegration.Configuration;
354
+ if (configJson) {
355
+ const parsed = JSON.parse(configJson);
356
+ return {
357
+ AccountID: parsed['AccountID'] ?? '', ConsumerKey: parsed['ConsumerKey'] ?? '',
358
+ ConsumerSecret: parsed['ConsumerSecret'] ?? '',
359
+ TokenID: parsed['TokenID'] ?? '', TokenSecret: parsed['TokenSecret'] ?? '',
360
+ };
361
+ }
362
+ throw new Error('No NetSuite credentials found. Set AccountID, ConsumerKey, ConsumerSecret, TokenID, TokenSecret.');
363
+ }
364
+ // ─── OAuth 1.0 TBA Signature ────────────────────────────────────────
365
+ BuildOAuth1Header(config, method, url) {
366
+ const timestamp = Math.floor(Date.now() / 1000).toString();
367
+ const nonce = randomBytes(16).toString('hex');
368
+ const oauthParams = {
369
+ oauth_consumer_key: config.ConsumerKey, oauth_nonce: nonce,
370
+ oauth_signature_method: 'HMAC-SHA256', oauth_timestamp: timestamp,
371
+ oauth_token: config.TokenID, oauth_version: '1.0',
372
+ };
373
+ let baseURL = url;
374
+ const queryPart = {};
375
+ const qIdx = url.indexOf('?');
376
+ if (qIdx !== -1) {
377
+ baseURL = url.substring(0, qIdx);
378
+ new URLSearchParams(url.substring(qIdx + 1)).forEach((v, k) => { queryPart[k] = v; });
379
+ }
380
+ const allParams = { ...oauthParams, ...queryPart };
381
+ const normalizedParams = Object.keys(allParams).sort()
382
+ .map(k => `${this.PercentEncode(k)}=${this.PercentEncode(allParams[k])}`).join('&');
383
+ const sigBaseString = `${method.toUpperCase()}&${this.PercentEncode(baseURL)}&${this.PercentEncode(normalizedParams)}`;
384
+ const signingKey = `${this.PercentEncode(config.ConsumerSecret)}&${this.PercentEncode(config.TokenSecret)}`;
385
+ const signature = createHmac('sha256', signingKey).update(sigBaseString).digest('base64');
386
+ const accountRealm = config.AccountID.replace('-', '_').toUpperCase();
387
+ const headerParams = { ...oauthParams, oauth_signature: signature };
388
+ const parts = Object.entries(headerParams).map(([k, v]) => `${k}="${v}"`).join(', ');
389
+ return `OAuth realm="${accountRealm}", ${parts}`;
390
+ }
391
+ PercentEncode(str) {
392
+ return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27')
393
+ .replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A');
394
+ }
395
+ // ─── TestConnection ────────────────────────────────────────────────
396
+ async TestConnection(companyIntegration, contextUser) {
397
+ try {
398
+ const auth = await this.Authenticate(companyIntegration, contextUser);
399
+ const url = `${auth.RecordBaseURL}/customer?limit=1`;
400
+ const headers = this.BuildRequestHeaders(auth, url, 'GET');
401
+ const response = await this.MakeHTTPRequest(auth, url, 'GET', headers);
402
+ if (response.Status === 200) {
403
+ const body = response.Body;
404
+ return { Success: true, Message: `Connected to NetSuite — ${body.totalResults ?? 0} customers` };
405
+ }
406
+ return { Success: false, Message: `API returned ${response.Status}` };
407
+ }
408
+ catch (err) {
409
+ return { Success: false, Message: err instanceof Error ? err.message : String(err) };
410
+ }
411
+ }
412
+ // ─── URL Building ──────────────────────────────────────────────────
413
+ GetBaseURL(_companyIntegration, auth) {
414
+ return auth.RecordBaseURL;
415
+ }
416
+ BuildPaginatedURL(basePath, _obj, _page, offset, _cursor) {
417
+ const sep = basePath.includes('?') ? '&' : '?';
418
+ return `${basePath}${sep}limit=${NS_PAGE_SIZE}&offset=${offset}`;
419
+ }
420
+ // ─── Response Parsing ──────────────────────────────────────────────
421
+ NormalizeResponse(rawBody, _responseDataKey) {
422
+ if (Array.isArray(rawBody))
423
+ return rawBody;
424
+ const body = rawBody;
425
+ if (Array.isArray(body['items']))
426
+ return body['items'];
427
+ if (body && Object.keys(body).length > 0)
428
+ return [body];
429
+ return [];
430
+ }
431
+ ExtractPaginationInfo(rawBody, _paginationType, _currentPage, currentOffset, _pageSize) {
432
+ const body = rawBody;
433
+ const records = this.NormalizeResponse(rawBody, null);
434
+ return { HasMore: body.hasMore ?? false, NextOffset: currentOffset + records.length };
435
+ }
436
+ // ─── Headers ───────────────────────────────────────────────────────
437
+ BuildHeaders(_auth) {
438
+ return { 'Accept': 'application/json', 'User-Agent': 'MemberJunction-Integration/1.0' };
439
+ }
440
+ BuildRequestHeaders(auth, url, method, hasBody = false) {
441
+ const headers = {
442
+ 'Authorization': this.BuildOAuth1Header(auth.Config, method, url),
443
+ 'Accept': 'application/json', 'User-Agent': 'MemberJunction-Integration/1.0',
444
+ };
445
+ if (hasBody)
446
+ headers['Content-Type'] = 'application/json';
447
+ return headers;
448
+ }
449
+ // ─── FetchChanges — generic for ANY record type ────────────────────
450
+ async FetchChanges(ctx) {
451
+ const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
452
+ const recordType = ctx.ObjectName.toLowerCase();
453
+ const offset = ctx.CurrentOffset ?? 0;
454
+ // Determine SuiteQL table: transactions use `transaction` table with type filter
455
+ const transType = NS_TRANSACTION_TYPES[recordType];
456
+ const suiteqlTable = transType ? 'transaction' : recordType;
457
+ const conditions = [];
458
+ if (transType)
459
+ conditions.push(`type = '${transType}'`);
460
+ if (ctx.WatermarkValue)
461
+ conditions.push(`lastmodifieddate >= '${ctx.WatermarkValue}'`);
462
+ const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';
463
+ const query = `SELECT * FROM ${suiteqlTable}${whereClause} ORDER BY lastmodifieddate`;
464
+ const url = `${auth.QueryBaseURL}/suiteql?limit=${NS_PAGE_SIZE}&offset=${offset}`;
465
+ const headers = this.BuildRequestHeaders(auth, url, 'POST', true);
466
+ const response = await this.MakeHTTPRequest(auth, url, 'POST', headers, { q: query });
467
+ if (response.Status < 200 || response.Status >= 300) {
468
+ throw new Error(`NetSuite SuiteQL error for ${recordType}: ${response.Status}`);
469
+ }
470
+ const body = response.Body;
471
+ const records = body.items ?? [];
472
+ const externalRecords = records.map(r => ({
473
+ ExternalID: String(r['id'] ?? ''), ObjectType: ctx.ObjectName, Fields: r,
474
+ }));
475
+ let newWatermark;
476
+ if (!body.hasMore) {
477
+ for (const r of records) {
478
+ const modified = r['lastmodifieddate'];
479
+ if (modified && (!newWatermark || modified > newWatermark))
480
+ newWatermark = modified;
481
+ }
482
+ }
483
+ return {
484
+ Records: externalRecords, HasMore: body.hasMore ?? false,
485
+ NextOffset: offset + records.length,
486
+ NewWatermarkValue: !body.hasMore ? newWatermark : undefined,
487
+ };
488
+ }
489
+ // ─── CRUD — generic for ANY record type ────────────────────────────
490
+ async CreateRecord(ctx) {
491
+ const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
492
+ const endpoint = ctx.ObjectName.toLowerCase();
493
+ const url = `${auth.RecordBaseURL}/${endpoint}`;
494
+ const headers = this.BuildRequestHeaders(auth, url, 'POST', true);
495
+ const response = await this.MakeHTTPRequest(auth, url, 'POST', headers, ctx.Attributes);
496
+ if (response.Status >= 200 && response.Status < 300) {
497
+ const location = response.Headers?.['location'] ?? '';
498
+ const idMatch = location.match(/\/(\d+)$/);
499
+ const id = idMatch ? idMatch[1] : String(response.Body?.['id'] ?? '');
500
+ return { Success: true, ExternalID: id, StatusCode: response.Status };
501
+ }
502
+ return this.BuildCRUDError(response, 'CreateRecord', ctx.ObjectName);
503
+ }
504
+ async UpdateRecord(ctx) {
505
+ const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
506
+ const endpoint = ctx.ObjectName.toLowerCase();
507
+ const url = `${auth.RecordBaseURL}/${endpoint}/${ctx.ExternalID}`;
508
+ const headers = this.BuildRequestHeaders(auth, url, 'PATCH', true);
509
+ const response = await this.MakeHTTPRequest(auth, url, 'PATCH', headers, ctx.Attributes);
510
+ if (response.Status >= 200 && response.Status < 300) {
511
+ return { Success: true, ExternalID: ctx.ExternalID, StatusCode: response.Status };
512
+ }
513
+ return this.BuildCRUDError(response, 'UpdateRecord', ctx.ObjectName);
514
+ }
515
+ async DeleteRecord(ctx) {
516
+ const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
517
+ const endpoint = ctx.ObjectName.toLowerCase();
518
+ const url = `${auth.RecordBaseURL}/${endpoint}/${ctx.ExternalID}`;
519
+ const headers = this.BuildRequestHeaders(auth, url, 'DELETE');
520
+ const response = await this.MakeHTTPRequest(auth, url, 'DELETE', headers);
521
+ if (response.Status === 204 || (response.Status >= 200 && response.Status < 300)) {
522
+ return { Success: true, ExternalID: ctx.ExternalID, StatusCode: response.Status };
523
+ }
524
+ return this.BuildCRUDError(response, 'DeleteRecord', ctx.ObjectName);
525
+ }
526
+ BuildCRUDError(response, operation, objectName) {
527
+ const bodyStr = typeof response.Body === 'string' ? response.Body : JSON.stringify(response.Body);
528
+ return {
529
+ Success: false, ExternalID: '', StatusCode: response.Status,
530
+ ErrorMessage: `${operation} failed for ${objectName}: HTTP ${response.Status} — ${bodyStr?.substring(0, 300)}`,
531
+ };
532
+ }
533
+ // ─── HTTP Transport ────────────────────────────────────────────────
534
+ async MakeHTTPRequest(_auth, url, method, headers, body) {
535
+ await this.Throttle();
536
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
537
+ const response = await this.FetchWithTimeout(url, method, headers, body);
538
+ this.lastRequestTime = Date.now();
539
+ if (response.status === 429) {
540
+ const delay = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 500, 60_000);
541
+ console.warn(`[NetSuite] Rate limited (429), backing off ${Math.round(delay)}ms`);
542
+ await this.Sleep(delay);
543
+ continue;
544
+ }
545
+ if (response.status >= 500 && attempt < MAX_RETRIES) {
546
+ const delay = Math.min(2000 * Math.pow(2, attempt), 60_000);
547
+ console.warn(`[NetSuite] Server error ${response.status}, retrying in ${delay}ms`);
548
+ await this.Sleep(delay);
549
+ continue;
550
+ }
551
+ const responseBody = await this.ParseBody(response);
552
+ return this.ToRESTResponse(response, responseBody);
553
+ }
554
+ throw new Error(`NetSuite request failed after ${MAX_RETRIES} retries: ${url}`);
555
+ }
556
+ async FetchWithTimeout(url, method, headers, body) {
557
+ const controller = new AbortController();
558
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
559
+ try {
560
+ const opts = { method, headers, signal: controller.signal };
561
+ if (body && (method === 'POST' || method === 'PUT' || method === 'PATCH'))
562
+ opts.body = JSON.stringify(body);
563
+ return await fetch(url, opts);
564
+ }
565
+ catch (err) {
566
+ if (err instanceof Error && err.name === 'AbortError')
567
+ throw new Error(`NetSuite request timed out: ${url}`);
568
+ throw err;
569
+ }
570
+ finally {
571
+ clearTimeout(timeoutId);
572
+ }
573
+ }
574
+ async ParseBody(response) {
575
+ const ct = response.headers.get('content-type') ?? '';
576
+ if (ct.includes('json'))
577
+ return response.json();
578
+ return response.text();
579
+ }
580
+ ToRESTResponse(response, body) {
581
+ const hdrs = {};
582
+ response.headers.forEach((v, k) => { hdrs[k.toLowerCase()] = v; });
583
+ return { Status: response.status, Body: body, Headers: hdrs };
584
+ }
585
+ async Throttle() {
586
+ const elapsed = Date.now() - this.lastRequestTime;
587
+ if (elapsed < MIN_REQUEST_INTERVAL_MS)
588
+ await this.Sleep(MIN_REQUEST_INTERVAL_MS - elapsed);
589
+ }
590
+ Sleep(ms) {
591
+ return new Promise(resolve => setTimeout(resolve, ms));
592
+ }
593
+ // ─── Default Field Mappings ────────────────────────────────────────
594
+ GetDefaultFieldMappings(objectName) {
595
+ // Dynamic — uses discovered fields from cache or returns PK-only default
596
+ return [{ SourceFieldName: 'id', DestinationFieldName: 'id', IsKeyField: true }];
597
+ }
598
+ };
599
+ NetSuiteConnector = __decorate([
600
+ RegisterClass(BaseIntegrationConnector, 'NetSuiteConnector')
601
+ ], NetSuiteConnector);
602
+ export { NetSuiteConnector };
603
+ // Tree-shaking prevention — REQUIRED
604
+ export function LoadNetSuiteConnector() { }
605
+ //# sourceMappingURL=NetSuiteConnector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetSuiteConnector.js","sourceRoot":"","sources":["../src/NetSuiteConnector.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAyC,MAAM,sBAAsB,CAAC;AAEvF,OAAO,EACH,wBAAwB,EACxB,4BAA4B,GAiB/B,MAAM,oCAAoC,CAAC;AAyC5C,6EAA6E;AAE7E,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,sFAAsF;AACtF,8EAA8E;AAC9E,MAAM,oBAAoB,GAA2B;IACjD,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU;IAC5E,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU;IAC7E,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU;IACtF,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU;IAClF,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;IAChE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,qBAAqB,EAAE,SAAS;IACpF,iBAAiB,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU;IACrF,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,qBAAqB,EAAE,UAAU;IACnF,mBAAmB,EAAE,UAAU,EAAE,oBAAoB,EAAE,SAAS;CACnE,CAAC;AAEF,6EAA6E;AAGtE,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,4BAA4B;IAA5D;;QACK,oBAAe,GAAG,CAAC,CAAC;QAC5B,wEAAwE;QAChE,oBAAe,GAAuC,IAAI,GAAG,EAAE,CAAC;IAslB5E,CAAC;IAplBG,IAAoB,eAAe,KAAa,OAAO,UAAU,CAAC,CAAC,CAAC;IACpE,IAAoB,cAAc,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;IAC9D,IAAoB,cAAc,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;IAC9D,IAAoB,cAAc,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;IAE9C,qBAAqB;QACjC,mFAAmF;QACnF,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC9C,WAAW,EAAE,YAAY,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;gBACnE,aAAa,EAAE,IAAI;gBACnB,MAAM,EAAE;oBACJ,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,6BAA6B,EAAE;oBAC/J,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE;iBAChL;aACJ,CAAC,CAAC;QACP,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;IAEe,wBAAwB;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,wBAAwB,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,CAAC,SAAS,GAAG,iCAAiC,CAAC;QACrD,MAAM,CAAC,mBAAmB,GAAG,6EAA6E,CAAC;QAC3G,MAAM,CAAC,kBAAkB,GAAG,aAAa,CAAC;QAC1C,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,sEAAsE;IAEtE;;;OAGG;IACa,KAAK,CAAC,eAAe,CACjC,kBAA8C,EAAE,WAAqB;QAErE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,WAAW,CAAkB,CAAC;QACvF,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,aAAa,oBAAoB,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAElE,6DAA6D;QAC7D,OAAO,CAAC,QAAQ,CAAC,GAAG,yBAAyB,CAAC;QAE9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,wCAAwC,QAAQ,CAAC,MAAM,qCAAqC,CAAC,CAAC;YAC3G,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAA+B,CAAC;QACtD,oFAAoF;QACpF,MAAM,KAAK,GAAI,IAAI,CAAC,OAAO,CAAyC;eAC5D,IAAI,CAAC,OAAO,CAAyC;eACtD,EAAE,CAAC;QAEV,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACzB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxC,WAAW,EAAE,YAAY,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;gBACnE,uBAAuB,EAAE,IAAI,EAAE,sDAAsD;gBACrF,aAAa,EAAE,IAAI,EAAa,0CAA0C;aAC7E,CAAC,CAAC;QACP,CAAC;QAED,oDAAoD;QACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,yBAAyB,CAAC,IAAmB;QACvD,MAAM,KAAK,GAAG,mHAAmH,CAAC;QAClI,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,8BAA8B,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAElE,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACtF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAuB,CAAC;gBAC9C,MAAM,OAAO,GAA2B,EAAE,CAAC;gBAC3C,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;oBACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC5D,IAAI,IAAI,EAAE,CAAC;wBACP,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;wBACjE,OAAO,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;4BAC/C,WAAW,EAAE,YAAY,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE;4BACvD,uBAAuB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI;yBACrD,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,OAAO,CAAC;YAC3C,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,qCAAqC;QACzC,CAAC;QAED,0FAA0F;QAC1F,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACrC,CAAC;IAEO,kBAAkB;QACtB,MAAM,UAAU,GAAG;YACf,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU;YAC1E,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY;YACtE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB;YAClF,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa;YACvE,eAAe,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,aAAa;YACxE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB;YACpE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU;YAC/E,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB;YACrE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,qBAAqB;YAChE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS;YACvD,aAAa,EAAE,OAAO,EAAE,UAAU;YAClC,KAAK,EAAE,QAAQ,EAAE,WAAW;YAC5B,MAAM,EAAE,eAAe,EAAE,cAAc;YACvC,MAAM,EAAE,QAAQ;SACnB,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YACnC,WAAW,EAAE,YAAY,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS;YAC9D,uBAAuB,EAAE,IAAI;YAC7B,aAAa,EAAE,IAAI;SACtB,CAAC,CAAC,CAAC;IACR,CAAC;IAED;;;OAGG;IACa,KAAK,CAAC,cAAc,CAChC,kBAA8C,EAAE,UAAkB,EAAE,WAAqB;QAEzF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,WAAW,CAAkB,CAAC;QACvF,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAE5C,4EAA4E;QAC5E,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,aAAa,qBAAqB,UAAU,EAAE,CAAC;YACvE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;YAC/D,OAAO,CAAC,QAAQ,CAAC,GAAG,yBAAyB,CAAC;YAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,yCAAyC;QAC7C,CAAC;QAED,gEAAgE;QAChE,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAEO,kBAAkB,CAAC,IAAa;QACpC,MAAM,MAAM,GAAG,IAA+B,CAAC;QAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAwD,CAAC;QAC/F,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;QAE7C,MAAM,MAAM,GAA0B,EAAE,CAAC;QACzC,MAAM,cAAc,GAAI,MAAM,CAAC,UAAU,CAAc,IAAI,EAAE,CAAC;QAE9D,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;gBACpC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;gBAC9C,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;gBACrC,UAAU,EAAE,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACzC,WAAW,EAAE,IAAI,KAAK,IAAI;gBAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI;aACxC,CAAC,CAAC;QACP,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC;gBACX,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,6BAA6B;gBAC5E,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI;aAC7E,CAAC,CAAC;QACP,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,IAAmB,EAAE,UAAkB;QACvE,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,IAAI,UAAU,UAAU,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACvE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAuB,CAAC;gBAC9C,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrC,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,MAAM,GAA0B,EAAE,CAAC;oBACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;wBAChD,IAAI,GAAG,KAAK,OAAO;4BAAE,SAAS,CAAC,qBAAqB;wBACpD,MAAM,CAAC,IAAI,CAAC;4BACR,IAAI,EAAE,GAAG;4BACT,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;4BAClC,WAAW,EAAE,EAAE;4BACf,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;4BACxC,UAAU,EAAE,KAAK;4BACjB,WAAW,EAAE,GAAG,KAAK,IAAI;4BACzB,UAAU,EAAE,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,kBAAkB,IAAI,GAAG,KAAK,aAAa;yBAClF,CAAC,CAAC;oBACP,CAAC;oBACD,OAAO,MAAM,CAAC;gBAClB,CAAC;YACL,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,eAAe;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IAEO,aAAa;QACjB,OAAO;YACH,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,6BAA6B,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAC5J,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,wBAAwB,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;SAC7K,CAAC;IACN,CAAC;IAEO,cAAc,CAAC,MAAc;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,KAAK;YAAE,OAAO,QAAQ,CAAC;QAClE,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QACrI,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAChD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,UAAU,CAAC;QACxE,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEO,kBAAkB,CAAC,KAAc;QACrC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,UAAU,CAAC;YACxD,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IAEO,iBAAiB,CAAC,IAAY;QAClC,0EAA0E;QAC1E,OAAO,IAAI;aACN,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAI,yBAAyB;aAChE,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAc,mBAAmB;aAC5D,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAqB,0BAA0B;aACpE,IAAI,EAAE;aACN,KAAK,CAAC,KAAK,CAAC;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9D,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,sEAAsE;IAE5D,KAAK,CAAC,YAAY,CACxB,kBAA8C,EAAE,WAAqB;QAErE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACtE,MAAM,aAAa,GAAG,WAAW,YAAY,qDAAqD,CAAC;QACnG,MAAM,YAAY,GAAG,WAAW,YAAY,oDAAoD,CAAC;QACjG,OAAO;YACH,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;YAC9C,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY;SAC1C,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,WAAW,CACrB,kBAA8C,EAAE,WAAsB,EAAE,QAA4B;QAEpG,MAAM,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC;QACrD,IAAI,YAAY,EAAE,CAAC;YACf,MAAM,EAAE,GAAG,QAAQ,IAAI,IAAI,QAAQ,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,eAAe,CAAqB,iBAAiB,EAAE,WAAW,CAAC,CAAC;YAChG,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAA2B,CAAC;gBACvE,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC/C,OAAO;wBACH,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;wBAClE,cAAc,EAAE,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE;wBAC9C,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;qBAC7E,CAAC;gBACN,CAAC;YACL,CAAC;QACL,CAAC;QACD,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,CAAC;QACpD,IAAI,UAAU,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAA2B,CAAC;YAChE,OAAO;gBACH,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;gBAC9E,cAAc,EAAE,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE;gBAC9C,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE;aAC7E,CAAC;QACN,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kGAAkG,CAAC,CAAC;IACxH,CAAC;IAED,uEAAuE;IAE/D,iBAAiB,CAAC,MAAgC,EAAE,MAAc,EAAE,GAAW;QACnF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE9C,MAAM,WAAW,GAA2B;YACxC,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK;YAC1D,sBAAsB,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS;YACjE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK;SACpD,CAAC;QAEF,IAAI,OAAO,GAAG,GAAG,CAAC;QAClB,MAAM,SAAS,GAA2B,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YACd,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACjC,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,SAAS,EAAE,CAAC;QACnD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE;aACjD,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAExF,MAAM,aAAa,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACvH,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5G,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE1F,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACtE,MAAM,YAAY,GAAG,EAAE,GAAG,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;QACpE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrF,OAAO,gBAAgB,YAAY,MAAM,KAAK,EAAE,CAAC;IACrD,CAAC;IAEO,aAAa,CAAC,GAAW;QAC7B,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACnE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3E,CAAC;IAED,sEAAsE;IAE/D,KAAK,CAAC,cAAc,CACvB,kBAA8C,EAAE,WAAqB;QAErE,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,WAAW,CAAkB,CAAC;YACvF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,mBAAmB,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACvE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAuB,CAAC;gBAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,2BAA2B,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;YACrG,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACzF,CAAC;IACL,CAAC;IAED,sEAAsE;IAE5D,UAAU,CAAC,mBAA+C,EAAE,IAAqB;QACvF,OAAQ,IAAsB,CAAC,aAAa,CAAC;IACjD,CAAC;IAEkB,iBAAiB,CAChC,QAAgB,EAAE,IAAyD,EAC3E,KAAa,EAAE,MAAc,EAAE,OAAgB;QAE/C,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/C,OAAO,GAAG,QAAQ,GAAG,GAAG,SAAS,YAAY,WAAW,MAAM,EAAE,CAAC;IACrE,CAAC;IAED,sEAAsE;IAE5D,iBAAiB,CAAC,OAAgB,EAAE,gBAA+B;QACzE,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,OAAoC,CAAC;QACxE,MAAM,IAAI,GAAG,OAAkC,CAAC;QAChD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,OAAO,CAA8B,CAAC;QACpF,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,OAAO,EAAE,CAAC;IACd,CAAC;IAES,qBAAqB,CAC3B,OAAgB,EAAE,eAA+B,EAAE,YAAoB,EAAE,aAAqB,EAAE,SAAiB;QAEjH,MAAM,IAAI,GAAG,OAA0B,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,EAAE,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAC1F,CAAC;IAED,sEAAsE;IAEnD,YAAY,CAAC,KAAsB;QAClD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,gCAAgC,EAAE,CAAC;IAC5F,CAAC;IAEO,mBAAmB,CACvB,IAAmB,EAAE,GAAW,EAAE,MAAc,EAAE,UAAmB,KAAK;QAE1E,MAAM,OAAO,GAA2B;YACpC,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC;YACjE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,gCAAgC;SAC/E,CAAC;QACF,IAAI,OAAO;YAAE,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC1D,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,sEAAsE;IAEtD,KAAK,CAAC,YAAY,CAAC,GAAiB;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,WAAW,CAAkB,CAAC;QAC/F,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC;QAEtC,iFAAiF;QACjF,MAAM,SAAS,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;QAE5D,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,SAAS;YAAE,UAAU,CAAC,IAAI,CAAC,WAAW,SAAS,GAAG,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,cAAc;YAAE,UAAU,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;QAEvF,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,KAAK,GAAG,iBAAiB,YAAY,GAAG,WAAW,4BAA4B,CAAC;QAEtF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,YAAY,kBAAkB,YAAY,WAAW,MAAM,EAAE,CAAC;QAClF,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtF,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAuB,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACjC,MAAM,eAAe,GAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxD,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;SAC3E,CAAC,CAAC,CAAC;QAEJ,IAAI,YAAgC,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,kBAAkB,CAAuB,CAAC;gBAC7D,IAAI,QAAQ,IAAI,CAAC,CAAC,YAAY,IAAI,QAAQ,GAAG,YAAY,CAAC;oBAAE,YAAY,GAAG,QAAQ,CAAC;YACxF,CAAC;QACL,CAAC;QAED,OAAO;YACH,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;YACxD,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM;YACnC,iBAAiB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;SAC9D,CAAC;IACN,CAAC;IAED,sEAAsE;IAEtD,KAAK,CAAC,YAAY,CAAC,GAAwB;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAgD,EAAE,GAAG,CAAC,WAAuB,CAAkB,CAAC;QACzI,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,IAAI,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QACxF,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAClD,MAAM,QAAQ,GAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,CAAwB,IAAI,EAAE,CAAC;YAC9E,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAE,QAAQ,CAAC,IAAgC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACnG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACzE,CAAC;IAEe,KAAK,CAAC,YAAY,CAAC,GAAwB;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAgD,EAAE,GAAG,CAAC,WAAuB,CAAkB,CAAC;QACzI,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,IAAI,QAAQ,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QACzF,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACtF,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACzE,CAAC;IAEe,KAAK,CAAC,YAAY,CAAC,GAAwB;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAgD,EAAE,GAAG,CAAC,WAAuB,CAAkB,CAAC;QACzI,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,IAAI,QAAQ,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;YAC/E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACtF,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACzE,CAAC;IAEO,cAAc,CAAC,QAAsB,EAAE,SAAiB,EAAE,UAAkB;QAChF,MAAM,OAAO,GAAG,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClG,OAAO;YACH,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3D,YAAY,EAAE,GAAG,SAAS,eAAe,UAAU,UAAU,QAAQ,CAAC,MAAM,MAAM,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;SACjH,CAAC;IACN,CAAC;IAED,sEAAsE;IAE5D,KAAK,CAAC,eAAe,CAC3B,KAAsB,EAAE,GAAW,EAAE,MAAc,EACnD,OAA+B,EAAE,IAAc;QAE/C,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACzE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAElC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC;gBAClF,OAAO,CAAC,IAAI,CAAC,8CAA8C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClF,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAC,SAAS;YACtC,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;gBAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,MAAM,iBAAiB,KAAK,IAAI,CAAC,CAAC;gBACnF,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAC,SAAS;YACtC,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,WAAW,aAAa,GAAG,EAAE,CAAC,CAAC;IACpF,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,GAAW,EAAE,MAAc,EAAE,OAA+B,EAAE,IAAc;QACvG,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC3E,IAAI,CAAC;YACD,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;YACzE,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,OAAO,CAAC;gBAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5G,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;YAC7G,MAAM,GAAG,CAAC;QACd,CAAC;gBAAS,CAAC;YAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,QAAkB;QACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,EAAsB,CAAC;QACpE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,cAAc,CAAC,QAAkB,EAAE,IAAa;QACpD,MAAM,IAAI,GAA2B,EAAE,CAAC;QACxC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;IAEO,KAAK,CAAC,QAAQ;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC;QAClD,IAAI,OAAO,GAAG,uBAAuB;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,uBAAuB,GAAG,OAAO,CAAC,CAAC;IAC/F,CAAC;IAEO,KAAK,CAAC,EAAU;QACpB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,sEAAsE;IAEtD,uBAAuB,CAAC,UAAkB;QACtD,yEAAyE;QACzE,OAAO,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,CAAC;CACJ,CAAA;AAzlBY,iBAAiB;IAD7B,aAAa,CAAC,wBAAwB,EAAE,mBAAmB,CAAC;GAChD,iBAAiB,CAylB7B;;AAED,qCAAqC;AACrC,MAAM,UAAU,qBAAqB,KAA+B,CAAC"}