@avantguardllc/n8n-nodes-halopsa 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,3 +1,9 @@
1
+ <p align="center">
2
+ <a href="https://n8n.io"><img src="https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-logo.png" alt="n8n" height="40" /></a>
3
+ &nbsp;&nbsp;&nbsp;&nbsp;
4
+ <a href="https://avantguard.it"><img src="https://i0.wp.com/avantguard.it/wp-content/uploads/2024/02/NewLogoSmalNoPicl.png?fit=398%2C71" alt="AvantGuard" height="40" /></a>
5
+ </p>
6
+
1
7
  # HaloPSA n8n Node
2
8
 
3
9
  ![n8n community node](https://img.shields.io/badge/n8n-community%20node-ff6d5a) ![npm](https://img.shields.io/npm/v/%40avantguardllc%2Fn8n-nodes-halopsa)
@@ -48,8 +48,9 @@ class HaloPSAApi {
48
48
  {
49
49
  displayName: 'Scope',
50
50
  name: 'scope',
51
- type: 'hidden',
51
+ type: 'string',
52
52
  default: '',
53
+ description: 'Space-separated list of OAuth2 scopes to request',
53
54
  },
54
55
  {
55
56
  displayName: 'Auth URI Query Parameters',
@@ -1 +1 @@
1
- {"version":3,"file":"HaloPSAApi.credentials.js","sourceRoot":"","sources":["../../credentials/HaloPSAApi.credentials.ts"],"names":[],"mappings":";;;AAKA,MAAa,UAAU;IAAvB;QACC,SAAI,GAAG,YAAY,CAAC;QACpB,gBAAW,GAAG,oBAAoB,CAAC;QACnC,qBAAgB,GAAG,EAAE,CAAC;QAEtB,YAAO,GAAG,CAAC,WAAW,CAAC,CAAC;QAExB,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,YAAY;gBACzB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,mBAAmB;aAC5B;YACD;gBACC,WAAW,EAAE,WAAW;gBACxB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,oCAAoC;aACjD;YACD;gBACC,WAAW,EAAE,eAAe;gBAC5B,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,wCAAwC;aACrD;YACD;gBACC,WAAW,EAAE,mBAAmB;gBAChC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,sCAAsC;aAC/C;YACD;gBACC,WAAW,EAAE,kBAAkB;gBAC/B,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,kCAAkC;gBAC3C,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,0CAA0C;aACvD;YACD;gBACC,WAAW,EAAE,OAAO;gBACpB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;aACX;YACD;gBACC,WAAW,EAAE,2BAA2B;gBACxC,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;aACX;YACD;gBACC,WAAW,EAAE,gBAAgB;gBAC7B,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,QAAQ;aACjB;YACD;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,2CAA2C;aACxD;SACD,CAAC;IACH,CAAC;CAAA;AAxED,gCAwEC"}
1
+ {"version":3,"file":"HaloPSAApi.credentials.js","sourceRoot":"","sources":["../../credentials/HaloPSAApi.credentials.ts"],"names":[],"mappings":";;;AAKA,MAAa,UAAU;IAAvB;QACC,SAAI,GAAG,YAAY,CAAC;QACpB,gBAAW,GAAG,oBAAoB,CAAC;QACnC,qBAAgB,GAAG,EAAE,CAAC;QAEtB,YAAO,GAAG,CAAC,WAAW,CAAC,CAAC;QAExB,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,YAAY;gBACzB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,mBAAmB;aAC5B;YACD;gBACC,WAAW,EAAE,WAAW;gBACxB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,oCAAoC;aACjD;YACD;gBACC,WAAW,EAAE,eAAe;gBAC5B,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,wCAAwC;aACrD;YACD;gBACC,WAAW,EAAE,mBAAmB;gBAChC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,sCAAsC;aAC/C;YACD;gBACC,WAAW,EAAE,kBAAkB;gBAC/B,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,kCAAkC;gBAC3C,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,0CAA0C;aACvD;YACD;gBACC,WAAW,EAAE,OAAO;gBACpB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,kDAAkD;aAC/D;YACD;gBACC,WAAW,EAAE,2BAA2B;gBACxC,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;aACX;YACD;gBACC,WAAW,EAAE,gBAAgB;gBAC7B,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,QAAQ;aACjB;YACD;gBACC,WAAW,EAAE,UAAU;gBACvB,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,2CAA2C;aACxD;SACD,CAAC;IACH,CAAC;CAAA;AAzED,gCAyEC"}
@@ -1,3 +1,3 @@
1
1
  import type { IExecuteFunctions, ILoadOptionsFunctions, IHttpRequestMethods } from 'n8n-workflow';
2
- export declare function apiRequest(this: IExecuteFunctions | ILoadOptionsFunctions, method: IHttpRequestMethods, resource: string, body?: object, query?: Record<string, string>, headers?: Record<string, string>): Promise<any>;
3
- export declare function apiRequestAllItems(this: IExecuteFunctions | ILoadOptionsFunctions, method: IHttpRequestMethods, resource: string, body?: object, query?: Record<string, string>): Promise<any[]>;
2
+ export declare function apiRequest(this: IExecuteFunctions | ILoadOptionsFunctions, method: IHttpRequestMethods, resource: string, body?: object, query?: Record<string, string>, headers?: Record<string, string>, debugLog?: any[], timeout?: number): Promise<any>;
3
+ export declare function apiRequestAllItems(this: IExecuteFunctions | ILoadOptionsFunctions, method: IHttpRequestMethods, resource: string, body?: object, query?: Record<string, string>, headers?: Record<string, string>, pagination?: Record<string, any>, debug?: boolean, timeout?: number): Promise<any[]>;
@@ -2,36 +2,211 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.apiRequest = apiRequest;
4
4
  exports.apiRequestAllItems = apiRequestAllItems;
5
- async function apiRequest(method, resource, body = {}, query = {}, headers = {}) {
5
+ const n8n_workflow_1 = require("n8n-workflow");
6
+ function getNestedValue(obj, path) {
7
+ if (!path)
8
+ return obj;
9
+ return path.split('.').reduce((current, key) => current === null || current === void 0 ? void 0 : current[key], obj);
10
+ }
11
+ async function apiRequest(method, resource, body = {}, query = {}, headers = {}, debugLog, timeout) {
6
12
  const credentials = await this.getCredentials('HaloPSAApi');
7
13
  const baseUrl = credentials.baseUrl || '/api';
14
+ const url = (resource.startsWith('http://') || resource.startsWith('https://'))
15
+ ? resource
16
+ : `${baseUrl}${resource}`;
8
17
  const options = {
9
18
  method,
10
- url: `${baseUrl}${resource}`,
11
- body,
19
+ url,
12
20
  qs: query,
13
- headers,
21
+ headers: {
22
+ 'Accept': 'application/json',
23
+ ...headers,
24
+ },
25
+ json: true,
26
+ ...(timeout ? { timeout } : {}),
14
27
  };
15
- return this.helpers.httpRequestWithAuthentication.call(this, 'HaloPSAApi', options);
28
+ if (['POST', 'PUT', 'PATCH'].includes(method) && body && Object.keys(body).length > 0) {
29
+ options.body = body;
30
+ }
31
+ if (debugLog) {
32
+ const qsString = Object.entries(query).map(([k, v]) => `${k}=${v}`).join('&');
33
+ debugLog.push({
34
+ url: qsString ? `${url}?${qsString}` : url,
35
+ method,
36
+ qs: { ...query },
37
+ headers: { 'Accept': 'application/json', ...headers },
38
+ body: body && Object.keys(body).length > 0 ? body : undefined,
39
+ });
40
+ }
41
+ try {
42
+ return await this.helpers.httpRequestWithAuthentication.call(this, 'HaloPSAApi', options);
43
+ }
44
+ catch (error) {
45
+ const message = error.message || '';
46
+ if (message.includes('text/html') || message.includes('Unsupported content type')) {
47
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `The server returned HTML instead of JSON. This usually means the Base URL is incorrect, authentication failed, or the endpoint does not exist. Verify your credentials and Base URL (${baseUrl}).`, { description: `Request: ${method} ${url}` });
48
+ }
49
+ if (message.includes('401') || message.includes('Unauthorized') || message.includes('invalid credentials')) {
50
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Authorization failed - please check your credentials', { description: `Request: ${method} ${url}` });
51
+ }
52
+ throw error;
53
+ }
16
54
  }
17
- async function apiRequestAllItems(method, resource, body = {}, query = {}) {
55
+ async function apiRequestAllItems(method, resource, body = {}, query = {}, headers = {}, pagination = {}, debug = false, timeout) {
56
+ var _a, _b, _c;
18
57
  const returnData = [];
19
- let responseData;
20
- let page = 1;
21
- do {
22
- query['page'] = String(page);
23
- responseData = await apiRequest.call(this, method, resource, body, query);
24
- if (Array.isArray(responseData)) {
25
- returnData.push(...responseData);
58
+ const debugLog = [];
59
+ const mode = pagination.paginationMode || 'offset';
60
+ const dataPath = (_a = pagination.dataPath) !== null && _a !== void 0 ? _a : '';
61
+ const maxPages = pagination.maxPages || 0;
62
+ const interval = pagination.requestInterval || 0;
63
+ let currentPage = 0;
64
+ let lastFirstItem = null;
65
+ if (mode === 'offset') {
66
+ const pageParam = pagination.pageParam || 'page';
67
+ const pageSize = pagination.pageSize || 50;
68
+ const sizeParam = pagination.sizeParam || '';
69
+ let paramValue = (_b = pagination.startValue) !== null && _b !== void 0 ? _b : 1;
70
+ const increment = (_c = pagination.increment) !== null && _c !== void 0 ? _c : 1;
71
+ if (sizeParam) {
72
+ query[sizeParam] = String(pageSize);
26
73
  }
27
- else if (responseData.data && Array.isArray(responseData.data)) {
28
- returnData.push(...responseData.data);
74
+ do {
75
+ query[pageParam] = String(paramValue);
76
+ const responseData = await apiRequest.call(this, method, resource, body, query, headers, debug ? debugLog : undefined, timeout);
77
+ const items = dataPath ? getNestedValue(responseData, dataPath) : responseData;
78
+ if (Array.isArray(items)) {
79
+ if (items.length === 0)
80
+ break;
81
+ const firstItemKey = JSON.stringify(items[0]);
82
+ if (lastFirstItem !== null && firstItemKey === lastFirstItem)
83
+ break;
84
+ lastFirstItem = firstItemKey;
85
+ returnData.push(...items);
86
+ if (sizeParam && items.length < pageSize)
87
+ break;
88
+ }
89
+ else if (items !== null && items !== undefined) {
90
+ returnData.push(items);
91
+ break;
92
+ }
93
+ else {
94
+ break;
95
+ }
96
+ paramValue += increment;
97
+ currentPage++;
98
+ if (maxPages > 0 && currentPage >= maxPages)
99
+ break;
100
+ if (interval > 0)
101
+ await new Promise(r => setTimeout(r, interval));
102
+ } while (true);
103
+ }
104
+ else if (mode === 'cursor') {
105
+ const cursorParam = pagination.cursorParam || 'cursor';
106
+ const cursorPath = pagination.cursorPath || '';
107
+ const pageSize = pagination.pageSize || 50;
108
+ const sizeParam = pagination.sizeParam || '';
109
+ let cursor = null;
110
+ if (sizeParam) {
111
+ query[sizeParam] = String(pageSize);
29
112
  }
30
- else {
31
- break;
113
+ do {
114
+ if (cursor) {
115
+ query[cursorParam] = cursor;
116
+ }
117
+ const responseData = await apiRequest.call(this, method, resource, body, query, headers, debug ? debugLog : undefined, timeout);
118
+ const items = dataPath ? getNestedValue(responseData, dataPath) : responseData;
119
+ if (Array.isArray(items)) {
120
+ if (items.length === 0)
121
+ break;
122
+ const firstItemKey = JSON.stringify(items[0]);
123
+ if (lastFirstItem !== null && firstItemKey === lastFirstItem)
124
+ break;
125
+ lastFirstItem = firstItemKey;
126
+ returnData.push(...items);
127
+ if (sizeParam && items.length < pageSize)
128
+ break;
129
+ }
130
+ else if (items !== null && items !== undefined) {
131
+ returnData.push(items);
132
+ break;
133
+ }
134
+ else {
135
+ break;
136
+ }
137
+ cursor = cursorPath ? getNestedValue(responseData, cursorPath) : null;
138
+ if (debug) {
139
+ debugLog.push({ _paginationExtracted: { cursorPath, cursorValue: cursor } });
140
+ }
141
+ currentPage++;
142
+ if (maxPages > 0 && currentPage >= maxPages)
143
+ break;
144
+ if (!cursor)
145
+ break;
146
+ if (interval > 0)
147
+ await new Promise(r => setTimeout(r, interval));
148
+ } while (true);
149
+ }
150
+ else if (mode === 'url') {
151
+ const nextUrlPath = pagination.nextUrlPath || '';
152
+ const pageSize = pagination.pageSize || 50;
153
+ const sizeParam = pagination.sizeParam || '';
154
+ let nextUrl = null;
155
+ let isFirstRequest = true;
156
+ if (sizeParam) {
157
+ query[sizeParam] = String(pageSize);
32
158
  }
33
- page++;
34
- } while (responseData.length > 0 || (responseData.data && responseData.data.length > 0));
159
+ do {
160
+ let responseData;
161
+ if (isFirstRequest || !nextUrl) {
162
+ responseData = await apiRequest.call(this, method, resource, body, query, headers, debug ? debugLog : undefined, timeout);
163
+ isFirstRequest = false;
164
+ }
165
+ else {
166
+ let nextResource = nextUrl;
167
+ const mergedQuery = { ...query };
168
+ if (nextUrl.startsWith('http://') || nextUrl.startsWith('https://')) {
169
+ const parsed = new URL(nextUrl);
170
+ parsed.searchParams.forEach((v, k) => { mergedQuery[k] = v; });
171
+ nextResource = parsed.origin + parsed.pathname;
172
+ }
173
+ responseData = await apiRequest.call(this, method, nextResource, body, mergedQuery, headers, debug ? debugLog : undefined, timeout);
174
+ }
175
+ const items = dataPath ? getNestedValue(responseData, dataPath) : responseData;
176
+ if (Array.isArray(items)) {
177
+ if (items.length === 0)
178
+ break;
179
+ const firstItemKey = JSON.stringify(items[0]);
180
+ if (lastFirstItem !== null && firstItemKey === lastFirstItem)
181
+ break;
182
+ lastFirstItem = firstItemKey;
183
+ returnData.push(...items);
184
+ if (sizeParam && items.length < pageSize)
185
+ break;
186
+ }
187
+ else if (items !== null && items !== undefined) {
188
+ returnData.push(items);
189
+ break;
190
+ }
191
+ else {
192
+ break;
193
+ }
194
+ nextUrl = nextUrlPath ? getNestedValue(responseData, nextUrlPath) : null;
195
+ if (debug) {
196
+ debugLog.push({ _paginationExtracted: { nextUrlPath, nextUrlValue: nextUrl } });
197
+ }
198
+ currentPage++;
199
+ if (maxPages > 0 && currentPage >= maxPages)
200
+ break;
201
+ if (!nextUrl)
202
+ break;
203
+ if (interval > 0)
204
+ await new Promise(r => setTimeout(r, interval));
205
+ } while (true);
206
+ }
207
+ if (debug && debugLog.length > 0) {
208
+ returnData.unshift({ __debugLog: debugLog });
209
+ }
35
210
  return returnData;
36
211
  }
37
212
  //# sourceMappingURL=GenericFunctions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../nodes/HaloPSA/GenericFunctions.ts"],"names":[],"mappings":";;AAOA,gCAoBC;AAED,gDAyBC;AA/CM,KAAK,UAAU,UAAU,CAE/B,MAA2B,EAC3B,QAAgB,EAChB,OAAe,EAAE,EACjB,QAAgC,EAAE,EAClC,UAAkC,EAAE;IAEpC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,OAAiB,IAAI,MAAM,CAAC;IAExD,MAAM,OAAO,GAAwB;QACpC,MAAM;QACN,GAAG,EAAE,GAAG,OAAO,GAAG,QAAQ,EAAE;QAC5B,IAAI;QACJ,EAAE,EAAE,KAAK;QACT,OAAO;KACP,CAAC;IAEF,OAAO,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;AACrF,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAEvC,MAA2B,EAC3B,QAAgB,EAChB,OAAe,EAAE,EACjB,QAAgC,EAAE;IAElC,MAAM,UAAU,GAAU,EAAE,CAAC;IAC7B,IAAI,YAAY,CAAC;IACjB,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,GAAG,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,YAAY,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACP,MAAM;QACP,CAAC;QACD,IAAI,EAAE,CAAC;IACR,CAAC,QAAQ,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;IAEzF,OAAO,UAAU,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"GenericFunctions.js","sourceRoot":"","sources":["../../../nodes/HaloPSA/GenericFunctions.ts"],"names":[],"mappings":";;AAaA,gCAmEC;AAED,gDAqKC;AAjPD,+CAAkD;AAElD,SAAS,cAAc,CAAC,GAAQ,EAAE,IAAY;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC;IACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAY,EAAE,GAAW,EAAE,EAAE,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AACnF,CAAC;AAEM,KAAK,UAAU,UAAU,CAE/B,MAA2B,EAC3B,QAAgB,EAChB,OAAe,EAAE,EACjB,QAAgC,EAAE,EAClC,UAAkC,EAAE,EACpC,QAAgB,EAChB,OAAgB;IAEhB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,OAAiB,IAAI,MAAM,CAAC;IAGxD,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC9E,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,EAAE,CAAC;IAE3B,MAAM,OAAO,GAAwB;QACpC,MAAM;QACN,GAAG;QACH,EAAE,EAAE,KAAK;QACT,OAAO,EAAE;YACR,QAAQ,EAAE,kBAAkB;YAC5B,GAAG,OAAO;SACV;QACD,IAAI,EAAE,IAAI;QACV,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/B,CAAC;IAGF,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvF,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAGD,IAAI,QAAQ,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9E,QAAQ,CAAC,IAAI,CAAC;YACb,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG;YAC1C,MAAM;YACN,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE;YAChB,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE;YACrD,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SAC7D,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACJ,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;YACnF,MAAM,IAAI,iCAAkB,CAC3B,IAAI,CAAC,OAAO,EAAE,EACd,wLAAwL,OAAO,IAAI,EACnM,EAAE,WAAW,EAAE,YAAY,MAAM,IAAI,GAAG,EAAE,EAAE,CAC5C,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC5G,MAAM,IAAI,iCAAkB,CAC3B,IAAI,CAAC,OAAO,EAAE,EACd,sDAAsD,EACtD,EAAE,WAAW,EAAE,YAAY,MAAM,IAAI,GAAG,EAAE,EAAE,CAC5C,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAEvC,MAA2B,EAC3B,QAAgB,EAChB,OAAe,EAAE,EACjB,QAAgC,EAAE,EAClC,UAAkC,EAAE,EACpC,aAAkC,EAAE,EACpC,QAAiB,KAAK,EACtB,OAAgB;;IAEhB,MAAM,UAAU,GAAU,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAU,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,IAAI,QAAQ,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAA,UAAU,CAAC,QAAQ,mCAAI,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,IAAI,CAAC,CAAC;IACjD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAkB,IAAI,CAAC;IAExC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,MAAM,CAAC;QACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC;QAC7C,IAAI,UAAU,GAAG,MAAA,UAAU,CAAC,UAAU,mCAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAA,UAAU,CAAC,SAAS,mCAAI,CAAC,CAAC;QAE5C,IAAI,SAAS,EAAE,CAAC;YACf,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QAED,GAAG,CAAC;YACH,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChI,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;YAE/E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,MAAM;gBAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,IAAI,aAAa,KAAK,IAAI,IAAI,YAAY,KAAK,aAAa;oBAAE,MAAM;gBACpE,aAAa,GAAG,YAAY,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;gBAE1B,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ;oBAAE,MAAM;YACjD,CAAC;iBAAM,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAClD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,MAAM;YACP,CAAC;iBAAM,CAAC;gBACP,MAAM;YACP,CAAC;YAED,UAAU,IAAI,SAAS,CAAC;YACxB,WAAW,EAAE,CAAC;YACd,IAAI,QAAQ,GAAG,CAAC,IAAI,WAAW,IAAI,QAAQ;gBAAE,MAAM;YACnD,IAAI,QAAQ,GAAG,CAAC;gBAAE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnE,CAAC,QAAQ,IAAI,EAAE;IAEhB,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,QAAQ,CAAC;QACvD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC;QAC7C,IAAI,MAAM,GAAkB,IAAI,CAAC;QAEjC,IAAI,SAAS,EAAE,CAAC;YACf,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QAED,GAAG,CAAC;YACH,IAAI,MAAM,EAAE,CAAC;gBACZ,KAAK,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;YAC7B,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChI,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;YAE/E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,MAAM;gBAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,IAAI,aAAa,KAAK,IAAI,IAAI,YAAY,KAAK,aAAa;oBAAE,MAAM;gBACpE,aAAa,GAAG,YAAY,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;gBAE1B,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ;oBAAE,MAAM;YACjD,CAAC;iBAAM,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAClD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,MAAM;YACP,CAAC;iBAAM,CAAC;gBACP,MAAM;YACP,CAAC;YAED,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtE,IAAI,KAAK,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC,EAAE,oBAAoB,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,WAAW,EAAE,CAAC;YACd,IAAI,QAAQ,GAAG,CAAC,IAAI,WAAW,IAAI,QAAQ;gBAAE,MAAM;YACnD,IAAI,CAAC,MAAM;gBAAE,MAAM;YACnB,IAAI,QAAQ,GAAG,CAAC;gBAAE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnE,CAAC,QAAQ,IAAI,EAAE;IAEhB,CAAC;SAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC;QAC7C,IAAI,OAAO,GAAkB,IAAI,CAAC;QAClC,IAAI,cAAc,GAAG,IAAI,CAAC;QAE1B,IAAI,SAAS,EAAE,CAAC;YACf,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QAED,GAAG,CAAC;YACH,IAAI,YAAY,CAAC;YACjB,IAAI,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC1H,cAAc,GAAG,KAAK,CAAC;YACxB,CAAC;iBAAM,CAAC;gBAGP,IAAI,YAAY,GAAW,OAAO,CAAC;gBACnC,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;gBACjC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBACrE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;oBAChC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAE/D,YAAY,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAChD,CAAC;gBACD,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACrI,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;YAE/E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,MAAM;gBAE9B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,IAAI,aAAa,KAAK,IAAI,IAAI,YAAY,KAAK,aAAa;oBAAE,MAAM;gBACpE,aAAa,GAAG,YAAY,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;gBAE1B,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ;oBAAE,MAAM;YACjD,CAAC;iBAAM,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAClD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,MAAM;YACP,CAAC;iBAAM,CAAC;gBACP,MAAM;YACP,CAAC;YAED,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACzE,IAAI,KAAK,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC,EAAE,oBAAoB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,WAAW,EAAE,CAAC;YACd,IAAI,QAAQ,GAAG,CAAC,IAAI,WAAW,IAAI,QAAQ;gBAAE,MAAM;YACnD,IAAI,CAAC,OAAO;gBAAE,MAAM;YACpB,IAAI,QAAQ,GAAG,CAAC;gBAAE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnE,CAAC,QAAQ,IAAI,EAAE;IAChB,CAAC;IAED,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC"}