@pipeline-builder/pipeline-manager 3.1.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 (110) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +74 -0
  3. package/cdk.json +91 -0
  4. package/config.yml +94 -0
  5. package/dist/boilerplate.d.ts +3 -0
  6. package/dist/boilerplate.d.ts.map +1 -0
  7. package/dist/boilerplate.js +58 -0
  8. package/dist/cdk.json +91 -0
  9. package/dist/cli.d.ts +62 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +372 -0
  12. package/dist/commands/bootstrap.d.ts +11 -0
  13. package/dist/commands/bootstrap.d.ts.map +1 -0
  14. package/dist/commands/bootstrap.js +159 -0
  15. package/dist/commands/create-pipeline.d.ts +12 -0
  16. package/dist/commands/create-pipeline.d.ts.map +1 -0
  17. package/dist/commands/create-pipeline.js +291 -0
  18. package/dist/commands/deploy.d.ts +15 -0
  19. package/dist/commands/deploy.d.ts.map +1 -0
  20. package/dist/commands/deploy.js +167 -0
  21. package/dist/commands/get-pipeline.d.ts +13 -0
  22. package/dist/commands/get-pipeline.d.ts.map +1 -0
  23. package/dist/commands/get-pipeline.js +97 -0
  24. package/dist/commands/get-plugin.d.ts +13 -0
  25. package/dist/commands/get-plugin.d.ts.map +1 -0
  26. package/dist/commands/get-plugin.js +98 -0
  27. package/dist/commands/list-pipelines.d.ts +20 -0
  28. package/dist/commands/list-pipelines.d.ts.map +1 -0
  29. package/dist/commands/list-pipelines.js +172 -0
  30. package/dist/commands/list-plugins.d.ts +20 -0
  31. package/dist/commands/list-plugins.d.ts.map +1 -0
  32. package/dist/commands/list-plugins.js +167 -0
  33. package/dist/commands/login.d.ts +21 -0
  34. package/dist/commands/login.d.ts.map +1 -0
  35. package/dist/commands/login.js +179 -0
  36. package/dist/commands/setup-events.d.ts +15 -0
  37. package/dist/commands/setup-events.d.ts.map +1 -0
  38. package/dist/commands/setup-events.js +177 -0
  39. package/dist/commands/status.d.ts +11 -0
  40. package/dist/commands/status.d.ts.map +1 -0
  41. package/dist/commands/status.js +89 -0
  42. package/dist/commands/store-token.d.ts +20 -0
  43. package/dist/commands/store-token.d.ts.map +1 -0
  44. package/dist/commands/store-token.js +233 -0
  45. package/dist/commands/synth.d.ts +21 -0
  46. package/dist/commands/synth.d.ts.map +1 -0
  47. package/dist/commands/synth.js +143 -0
  48. package/dist/commands/upload-plugin.d.ts +21 -0
  49. package/dist/commands/upload-plugin.d.ts.map +1 -0
  50. package/dist/commands/upload-plugin.js +311 -0
  51. package/dist/commands/version.d.ts +12 -0
  52. package/dist/commands/version.d.ts.map +1 -0
  53. package/dist/commands/version.js +223 -0
  54. package/dist/config/cli.constants.d.ts +101 -0
  55. package/dist/config/cli.constants.d.ts.map +1 -0
  56. package/dist/config/cli.constants.js +165 -0
  57. package/dist/config.yml +94 -0
  58. package/dist/templates/events-stack.json +141 -0
  59. package/dist/types/config.d.ts +44 -0
  60. package/dist/types/config.d.ts.map +1 -0
  61. package/dist/types/config.js +5 -0
  62. package/dist/types/error.d.ts +61 -0
  63. package/dist/types/error.d.ts.map +1 -0
  64. package/dist/types/error.js +39 -0
  65. package/dist/types/index.d.ts +8 -0
  66. package/dist/types/index.d.ts.map +1 -0
  67. package/dist/types/index.js +26 -0
  68. package/dist/types/pipeline.d.ts +144 -0
  69. package/dist/types/pipeline.d.ts.map +1 -0
  70. package/dist/types/pipeline.js +5 -0
  71. package/dist/types/plugin.d.ts +160 -0
  72. package/dist/types/plugin.d.ts.map +1 -0
  73. package/dist/types/plugin.js +5 -0
  74. package/dist/utils/api-client.d.ts +26 -0
  75. package/dist/utils/api-client.d.ts.map +1 -0
  76. package/dist/utils/api-client.js +160 -0
  77. package/dist/utils/audit-log.d.ts +8 -0
  78. package/dist/utils/audit-log.d.ts.map +1 -0
  79. package/dist/utils/audit-log.js +53 -0
  80. package/dist/utils/auth-guard.d.ts +16 -0
  81. package/dist/utils/auth-guard.d.ts.map +1 -0
  82. package/dist/utils/auth-guard.js +25 -0
  83. package/dist/utils/aws-secrets.d.ts +21 -0
  84. package/dist/utils/aws-secrets.d.ts.map +1 -0
  85. package/dist/utils/aws-secrets.js +74 -0
  86. package/dist/utils/banner.d.ts +19 -0
  87. package/dist/utils/banner.d.ts.map +1 -0
  88. package/dist/utils/banner.js +59 -0
  89. package/dist/utils/cdk-utils.d.ts +51 -0
  90. package/dist/utils/cdk-utils.d.ts.map +1 -0
  91. package/dist/utils/cdk-utils.js +101 -0
  92. package/dist/utils/command-utils.d.ts +56 -0
  93. package/dist/utils/command-utils.d.ts.map +1 -0
  94. package/dist/utils/command-utils.js +138 -0
  95. package/dist/utils/config-loader.d.ts +27 -0
  96. package/dist/utils/config-loader.d.ts.map +1 -0
  97. package/dist/utils/config-loader.js +166 -0
  98. package/dist/utils/error-handler.d.ts +29 -0
  99. package/dist/utils/error-handler.d.ts.map +1 -0
  100. package/dist/utils/error-handler.js +255 -0
  101. package/dist/utils/list-command-utils.d.ts +23 -0
  102. package/dist/utils/list-command-utils.d.ts.map +1 -0
  103. package/dist/utils/list-command-utils.js +60 -0
  104. package/dist/utils/output-utils.d.ts +60 -0
  105. package/dist/utils/output-utils.d.ts.map +1 -0
  106. package/dist/utils/output-utils.js +320 -0
  107. package/dist/utils/rate-limiter.d.ts +14 -0
  108. package/dist/utils/rate-limiter.d.ts.map +1 -0
  109. package/dist/utils/rate-limiter.js +73 -0
  110. package/package.json +144 -0
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.NetworkError = exports.ValidationError = exports.ERROR_CODES = void 0;
9
+ exports.handleError = handleError;
10
+ const picocolors_1 = __importDefault(require("picocolors"));
11
+ const cli_constants_1 = require("../config/cli.constants");
12
+ const types_1 = require("../types");
13
+ Object.defineProperty(exports, "ERROR_CODES", { enumerable: true, get: function () { return types_1.ERROR_CODES; } });
14
+ const { bold, dim, red, yellow, cyan } = picocolors_1.default;
15
+ /**
16
+ * Format and handle errors with colored output
17
+ */
18
+ function handleError(err, code = types_1.ERROR_CODES.GENERAL, options = {}) {
19
+ const { debug = false, exit = true, logToConsole = true, context, correlationId = (0, cli_constants_1.generateExecutionId)(), } = options;
20
+ if (logToConsole) {
21
+ const divider = '─'.repeat(process.stdout.columns || 80);
22
+ const errorId = `ERR-${correlationId}`;
23
+ console.error('\n' + red(bold('✗ ERROR')) + dim(` [${errorId}]`) + '\n');
24
+ console.error(dim(divider));
25
+ if (err instanceof Error) {
26
+ console.error(red(bold('Message:')), err.message);
27
+ if (err.name !== 'Error') {
28
+ console.error(red('Type:'), err.name);
29
+ }
30
+ // Show Validation error details
31
+ if (err instanceof ValidationError) {
32
+ if (err.field)
33
+ console.error(red('Field:'), err.field);
34
+ if (err.value !== undefined)
35
+ console.error(red('Value:'), sanitizeValue(err.value));
36
+ if (err.rule)
37
+ console.error(red('Rule:'), err.rule);
38
+ if (err.expected)
39
+ console.error(red('Expected:'), err.expected);
40
+ }
41
+ // Show Network error details
42
+ if (err instanceof NetworkError) {
43
+ if (err.url)
44
+ console.error(red('URL:'), sanitizeUrl(err.url));
45
+ if (err.timeout)
46
+ console.error(red('Timeout:'), `${err.timeout}ms`);
47
+ console.error(red('Request Made:'), err.requestMade ? 'Yes' : 'No');
48
+ console.error(red('Response Received:'), err.responseReceived ? 'Yes' : 'No');
49
+ if (err.cause)
50
+ console.error(red('Caused by:'), err.cause.message);
51
+ }
52
+ // Show Axios error details
53
+ if (isAxiosError(err)) {
54
+ const status = err.response?.status;
55
+ const url = err.config?.url;
56
+ if (status) {
57
+ console.error(red('Status:'), status);
58
+ console.error(red('Status Text:'), getHttpStatusText(status));
59
+ }
60
+ if (url)
61
+ console.error(red('URL:'), sanitizeUrl(url));
62
+ if (err.response?.data) {
63
+ console.error(red('Response:'));
64
+ console.error(dim(sanitizeErrorData(err.response.data)));
65
+ }
66
+ }
67
+ // Show CDK/execSync error details (stderr captured from child process)
68
+ if ('stderr' in err && err.stderr) {
69
+ const stderr = err.stderr.toString().trim();
70
+ if (stderr) {
71
+ console.error(red('CDK Output:'));
72
+ console.error(dim(stderr));
73
+ }
74
+ }
75
+ console.error(red('Code:'), getErrorCodeName(code));
76
+ console.error(dim('Error ID:'), dim(errorId));
77
+ if (context && Object.keys(context).length > 0) {
78
+ console.error('');
79
+ console.error(red('Context:'));
80
+ Object.entries(context).forEach(([key, value]) => {
81
+ console.error(` ${cyan(key)}:`, dim(sanitizeValue(value)));
82
+ });
83
+ }
84
+ if (debug && err.stack) {
85
+ console.error('');
86
+ console.error(dim('Stack trace:'));
87
+ console.error(dim(sanitizeStackTrace(err.stack)));
88
+ }
89
+ }
90
+ else {
91
+ console.error(red('Error:'), String(err));
92
+ console.error(red('Code:'), getErrorCodeName(code));
93
+ console.error(dim('Error ID:'), dim(errorId));
94
+ }
95
+ console.error(dim(divider));
96
+ if (!debug) {
97
+ console.error(yellow('💡 Tip:'), dim('Run with --debug flag to see full stack trace'));
98
+ }
99
+ const suggestion = getErrorSuggestion(err, code);
100
+ if (suggestion) {
101
+ console.error(yellow('💡 Suggestion:'), dim(suggestion));
102
+ }
103
+ console.error('');
104
+ }
105
+ if (exit) {
106
+ process.exitCode = code;
107
+ process.exit(code);
108
+ }
109
+ throw err;
110
+ }
111
+ // --- Error classes (only those actually used) ---
112
+ /**
113
+ * Validation error class
114
+ */
115
+ class ValidationError extends Error {
116
+ field;
117
+ value;
118
+ rule;
119
+ expected;
120
+ constructor(message, field, value, rule, expected) {
121
+ super(message);
122
+ this.field = field;
123
+ this.value = value;
124
+ this.rule = rule;
125
+ this.expected = expected;
126
+ this.name = 'ValidationError';
127
+ Error.captureStackTrace(this, this.constructor);
128
+ }
129
+ }
130
+ exports.ValidationError = ValidationError;
131
+ /**
132
+ * Network error class
133
+ */
134
+ class NetworkError extends Error {
135
+ url;
136
+ cause;
137
+ timeout;
138
+ requestMade;
139
+ responseReceived;
140
+ constructor(message, url, cause, timeout, requestMade = true, responseReceived = false) {
141
+ super(message);
142
+ this.url = url;
143
+ this.cause = cause;
144
+ this.timeout = timeout;
145
+ this.requestMade = requestMade;
146
+ this.responseReceived = responseReceived;
147
+ this.name = 'NetworkError';
148
+ Error.captureStackTrace(this, this.constructor);
149
+ }
150
+ }
151
+ exports.NetworkError = NetworkError;
152
+ // --- Private helpers ---
153
+ function getErrorCodeName(code) {
154
+ const entry = Object.entries(types_1.ERROR_CODES).find(([_, value]) => value === code);
155
+ return entry ? `${entry[0]} (${code})` : String(code);
156
+ }
157
+ function getHttpStatusText(status) {
158
+ const statusTexts = {
159
+ 400: 'Bad Request',
160
+ 401: 'Unauthorized',
161
+ 403: 'Forbidden',
162
+ 404: 'Not Found',
163
+ 408: 'Request Timeout',
164
+ 409: 'Conflict',
165
+ 422: 'Unprocessable Entity',
166
+ 429: 'Too Many Requests',
167
+ 500: 'Internal Server Error',
168
+ 502: 'Bad Gateway',
169
+ 503: 'Service Unavailable',
170
+ 504: 'Gateway Timeout',
171
+ };
172
+ return statusTexts[status] || 'Unknown';
173
+ }
174
+ function getErrorSuggestion(err, code) {
175
+ if (code === types_1.ERROR_CODES.AUTHENTICATION) {
176
+ return 'Check that PLATFORM_TOKEN environment variable is set correctly';
177
+ }
178
+ if (code === types_1.ERROR_CODES.NETWORK) {
179
+ return 'Check your internet connection and API endpoint URL';
180
+ }
181
+ if (code === types_1.ERROR_CODES.CONFIGURATION) {
182
+ return 'Run "cli version --check-config" to verify configuration';
183
+ }
184
+ if (code === types_1.ERROR_CODES.NOT_FOUND) {
185
+ return 'Verify the resource ID exists and you have access to it';
186
+ }
187
+ if (err instanceof Error && err.message.includes('cdk')) {
188
+ return 'Check the CDK output above for CloudFormation errors. Run with --debug for full details';
189
+ }
190
+ if (err instanceof ValidationError && err.field) {
191
+ return `Check the value provided for "${err.field}"`;
192
+ }
193
+ if (isAxiosError(err)) {
194
+ const status = err.response?.status;
195
+ if (status === 401 || status === 403)
196
+ return 'Check your authentication token and permissions';
197
+ if (status === 429)
198
+ return 'Rate limit exceeded - wait a moment before retrying';
199
+ if (status && status >= 500)
200
+ return 'Server error - try again later or contact support';
201
+ }
202
+ return null;
203
+ }
204
+ function sanitizeErrorData(data) {
205
+ if (typeof data === 'string')
206
+ return data;
207
+ if (typeof data === 'object' && data !== null) {
208
+ const sanitized = { ...data };
209
+ ['token', 'password', 'secret', 'apiKey', 'authorization', 'jwt', 'credential', 'bearer'].forEach(field => {
210
+ if (field in sanitized)
211
+ sanitized[field] = '[REDACTED]';
212
+ });
213
+ return JSON.stringify(sanitized, null, 2);
214
+ }
215
+ return String(data);
216
+ }
217
+ function sanitizeUrl(url) {
218
+ try {
219
+ const urlObj = new URL(url);
220
+ ['token', 'key', 'secret', 'password', 'apiKey'].forEach(param => {
221
+ if (urlObj.searchParams.has(param))
222
+ urlObj.searchParams.set(param, '[REDACTED]');
223
+ });
224
+ return urlObj.toString();
225
+ }
226
+ catch {
227
+ return url;
228
+ }
229
+ }
230
+ function sanitizeValue(value) {
231
+ if (value === null)
232
+ return 'null';
233
+ if (value === undefined)
234
+ return 'undefined';
235
+ if (typeof value === 'string') {
236
+ if (value.length > 20 && /^[A-Za-z0-9+/=_-]+$/.test(value)) {
237
+ return `${value.substring(0, 8)}...[REDACTED]`;
238
+ }
239
+ return value.length > 100 ? value.substring(0, 97) + '...' : value;
240
+ }
241
+ if (typeof value === 'object')
242
+ return sanitizeErrorData(value);
243
+ const str = String(value);
244
+ return str.length > 100 ? str.substring(0, 97) + '...' : str;
245
+ }
246
+ function sanitizeStackTrace(stack) {
247
+ return stack.split('\n').slice(0, 10).map(line => line.replace(/\/.*?\//g, '.../')).join('\n');
248
+ }
249
+ function isAxiosError(err) {
250
+ return (typeof err === 'object' &&
251
+ err !== null &&
252
+ 'isAxiosError' in err &&
253
+ err.isAxiosError === true);
254
+ }
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9lcnJvci1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7Ozs7QUFvQnRDLGtDQThHQztBQWhJRCw0REFBOEI7QUFDOUIsMkRBQThEO0FBQzlELG9DQUtrQjtBQUtULDRGQVRQLG1CQUFXLE9BU087QUFIcEIsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxvQkFBSSxDQUFDO0FBTTlDOztHQUVHO0FBQ0gsU0FBZ0IsV0FBVyxDQUN6QixHQUFZLEVBQ1osT0FBa0IsbUJBQVcsQ0FBQyxPQUFPLEVBQ3JDLFVBQStCLEVBQUU7SUFFakMsTUFBTSxFQUNKLEtBQUssR0FBRyxLQUFLLEVBQ2IsSUFBSSxHQUFHLElBQUksRUFDWCxZQUFZLEdBQUcsSUFBSSxFQUNuQixPQUFPLEVBQ1AsYUFBYSxHQUFHLElBQUEsbUNBQW1CLEdBQUUsR0FDdEMsR0FBRyxPQUFPLENBQUM7SUFFWixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxhQUFhLEVBQUUsQ0FBQztRQUV2QyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN6RSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRTVCLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVsRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBRUQsZ0NBQWdDO1lBQ2hDLElBQUksR0FBRyxZQUFZLGVBQWUsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLEdBQUcsQ0FBQyxLQUFLO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLFNBQVM7b0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNwRixJQUFJLEdBQUcsQ0FBQyxJQUFJO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxHQUFHLENBQUMsUUFBUTtvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEUsQ0FBQztZQUVELDZCQUE2QjtZQUM3QixJQUFJLEdBQUcsWUFBWSxZQUFZLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxHQUFHLENBQUMsR0FBRztvQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELElBQUksR0FBRyxDQUFDLE9BQU87b0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlFLElBQUksR0FBRyxDQUFDLEtBQUs7b0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBRUQsMkJBQTJCO1lBQzNCLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO2dCQUNwQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztnQkFDNUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDaEUsQ0FBQztnQkFDRCxJQUFJLEdBQUc7b0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztvQkFDdkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELENBQUM7WUFDSCxDQUFDO1lBRUQsdUVBQXVFO1lBQ3ZFLElBQUksUUFBUSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sTUFBTSxHQUFJLEdBQUcsQ0FBQyxNQUEwQixDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNqRSxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7b0JBQ2xDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNwRCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUU5QyxJQUFJLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO29CQUMvQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELElBQUksS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRTVCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sR0FBRyxDQUFDO0FBQ1osQ0FBQztBQUVELG1EQUFtRDtBQUVuRDs7R0FFRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxLQUFLO0lBRy9CO0lBQ0E7SUFDQTtJQUNBO0lBTFQsWUFDRSxPQUFlLEVBQ1IsS0FBYyxFQUNkLEtBQWUsRUFDZixJQUFhLEVBQ2IsUUFBaUI7UUFFeEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBTFIsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUNkLFVBQUssR0FBTCxLQUFLLENBQVU7UUFDZixTQUFJLEdBQUosSUFBSSxDQUFTO1FBQ2IsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUd4QixJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO1FBQzlCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQVpELDBDQVlDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLFlBQWEsU0FBUSxLQUFLO0lBRzVCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFOVCxZQUNFLE9BQWUsRUFDUixHQUFZLEVBQ1osS0FBYSxFQUNiLE9BQWdCLEVBQ2hCLGNBQXVCLElBQUksRUFDM0IsbUJBQTRCLEtBQUs7UUFFeEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBTlIsUUFBRyxHQUFILEdBQUcsQ0FBUztRQUNaLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMzQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBR3hDLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDO1FBQzNCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRjtBQWJELG9DQWFDO0FBRUQsMEJBQTBCO0FBRTFCLFNBQVMsZ0JBQWdCLENBQUMsSUFBZTtJQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQy9FLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQWM7SUFDdkMsTUFBTSxXQUFXLEdBQTJCO1FBQzFDLEdBQUcsRUFBRSxhQUFhO1FBQ2xCLEdBQUcsRUFBRSxjQUFjO1FBQ25CLEdBQUcsRUFBRSxXQUFXO1FBQ2hCLEdBQUcsRUFBRSxXQUFXO1FBQ2hCLEdBQUcsRUFBRSxpQkFBaUI7UUFDdEIsR0FBRyxFQUFFLFVBQVU7UUFDZixHQUFHLEVBQUUsc0JBQXNCO1FBQzNCLEdBQUcsRUFBRSxtQkFBbUI7UUFDeEIsR0FBRyxFQUFFLHVCQUF1QjtRQUM1QixHQUFHLEVBQUUsYUFBYTtRQUNsQixHQUFHLEVBQUUscUJBQXFCO1FBQzFCLEdBQUcsRUFBRSxpQkFBaUI7S0FDdkIsQ0FBQztJQUNGLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxHQUFZLEVBQUUsSUFBZTtJQUN2RCxJQUFJLElBQUksS0FBSyxtQkFBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3hDLE9BQU8saUVBQWlFLENBQUM7SUFDM0UsQ0FBQztJQUNELElBQUksSUFBSSxLQUFLLG1CQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakMsT0FBTyxxREFBcUQsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssbUJBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QyxPQUFPLDBEQUEwRCxDQUFDO0lBQ3BFLENBQUM7SUFDRCxJQUFJLElBQUksS0FBSyxtQkFBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25DLE9BQU8seURBQXlELENBQUM7SUFDbkUsQ0FBQztJQUNELElBQUksR0FBRyxZQUFZLEtBQUssSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hELE9BQU8seUZBQXlGLENBQUM7SUFDbkcsQ0FBQztJQUNELElBQUksR0FBRyxZQUFZLGVBQWUsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEQsT0FBTyxpQ0FBaUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO1FBQ3BDLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssR0FBRztZQUFFLE9BQU8saURBQWlELENBQUM7UUFDL0YsSUFBSSxNQUFNLEtBQUssR0FBRztZQUFFLE9BQU8scURBQXFELENBQUM7UUFDakYsSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLEdBQUc7WUFBRSxPQUFPLG1EQUFtRCxDQUFDO0lBQzFGLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQWE7SUFDdEMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDMUMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzlDLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQTZCLENBQUM7UUFDekQsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hHLElBQUksS0FBSyxJQUFJLFNBQVM7Z0JBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsR0FBVztJQUM5QixJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDL0QsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ25GLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNsQyxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDNUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNELE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDO1FBQ2pELENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNyRSxDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsT0FBTyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDL0QsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsS0FBYTtJQUN2QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsR0FBWTtJQUNoQyxPQUFPLENBQ0wsT0FBTyxHQUFHLEtBQUssUUFBUTtRQUN2QixHQUFHLEtBQUssSUFBSTtRQUNaLGNBQWMsSUFBSSxHQUFHO1FBQ3BCLEdBQStCLENBQUMsWUFBWSxLQUFLLElBQUksQ0FDdkQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUV4ZWN1dGlvbklkIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgRVJST1JfQ09ERVMsXG4gIEVycm9yQ29kZSxcbiAgRXJyb3JIYW5kbGVyT3B0aW9ucyxcbiAgQXhpb3NFcnJvckxpa2UsXG59IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgeyBib2xkLCBkaW0sIHJlZCwgeWVsbG93LCBjeWFuIH0gPSBwaWNvO1xuXG4vLyBSZS1leHBvcnQgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgeyBFUlJPUl9DT0RFUyB9O1xuZXhwb3J0IHR5cGUgeyBFcnJvckNvZGUgfTtcblxuLyoqXG4gKiBGb3JtYXQgYW5kIGhhbmRsZSBlcnJvcnMgd2l0aCBjb2xvcmVkIG91dHB1dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoXG4gIGVycjogdW5rbm93bixcbiAgY29kZTogRXJyb3JDb2RlID0gRVJST1JfQ09ERVMuR0VORVJBTCxcbiAgb3B0aW9uczogRXJyb3JIYW5kbGVyT3B0aW9ucyA9IHt9LFxuKTogbmV2ZXIge1xuICBjb25zdCB7XG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBleGl0ID0gdHJ1ZSxcbiAgICBsb2dUb0NvbnNvbGUgPSB0cnVlLFxuICAgIGNvbnRleHQsXG4gICAgY29ycmVsYXRpb25JZCA9IGdlbmVyYXRlRXhlY3V0aW9uSWQoKSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKGxvZ1RvQ29uc29sZSkge1xuICAgIGNvbnN0IGRpdmlkZXIgPSAn4pSAJy5yZXBlYXQocHJvY2Vzcy5zdGRvdXQuY29sdW1ucyB8fCA4MCk7XG4gICAgY29uc3QgZXJyb3JJZCA9IGBFUlItJHtjb3JyZWxhdGlvbklkfWA7XG5cbiAgICBjb25zb2xlLmVycm9yKCdcXG4nICsgcmVkKGJvbGQoJ+KclyBFUlJPUicpKSArIGRpbShgIFske2Vycm9ySWR9XWApICsgJ1xcbicpO1xuICAgIGNvbnNvbGUuZXJyb3IoZGltKGRpdmlkZXIpKTtcblxuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihyZWQoYm9sZCgnTWVzc2FnZTonKSksIGVyci5tZXNzYWdlKTtcblxuICAgICAgaWYgKGVyci5uYW1lICE9PSAnRXJyb3InKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IocmVkKCdUeXBlOicpLCBlcnIubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgVmFsaWRhdGlvbiBlcnJvciBkZXRhaWxzXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgIGlmIChlcnIuZmllbGQpIGNvbnNvbGUuZXJyb3IocmVkKCdGaWVsZDonKSwgZXJyLmZpZWxkKTtcbiAgICAgICAgaWYgKGVyci52YWx1ZSAhPT0gdW5kZWZpbmVkKSBjb25zb2xlLmVycm9yKHJlZCgnVmFsdWU6JyksIHNhbml0aXplVmFsdWUoZXJyLnZhbHVlKSk7XG4gICAgICAgIGlmIChlcnIucnVsZSkgY29uc29sZS5lcnJvcihyZWQoJ1J1bGU6JyksIGVyci5ydWxlKTtcbiAgICAgICAgaWYgKGVyci5leHBlY3RlZCkgY29uc29sZS5lcnJvcihyZWQoJ0V4cGVjdGVkOicpLCBlcnIuZXhwZWN0ZWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG93IE5ldHdvcmsgZXJyb3IgZGV0YWlsc1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5ldHdvcmtFcnJvcikge1xuICAgICAgICBpZiAoZXJyLnVybCkgY29uc29sZS5lcnJvcihyZWQoJ1VSTDonKSwgc2FuaXRpemVVcmwoZXJyLnVybCkpO1xuICAgICAgICBpZiAoZXJyLnRpbWVvdXQpIGNvbnNvbGUuZXJyb3IocmVkKCdUaW1lb3V0OicpLCBgJHtlcnIudGltZW91dH1tc2ApO1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlZCgnUmVxdWVzdCBNYWRlOicpLCBlcnIucmVxdWVzdE1hZGUgPyAnWWVzJyA6ICdObycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlZCgnUmVzcG9uc2UgUmVjZWl2ZWQ6JyksIGVyci5yZXNwb25zZVJlY2VpdmVkID8gJ1llcycgOiAnTm8nKTtcbiAgICAgICAgaWYgKGVyci5jYXVzZSkgY29uc29sZS5lcnJvcihyZWQoJ0NhdXNlZCBieTonKSwgZXJyLmNhdXNlLm1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG93IEF4aW9zIGVycm9yIGRldGFpbHNcbiAgICAgIGlmIChpc0F4aW9zRXJyb3IoZXJyKSkge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBlcnIucmVzcG9uc2U/LnN0YXR1cztcbiAgICAgICAgY29uc3QgdXJsID0gZXJyLmNvbmZpZz8udXJsO1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihyZWQoJ1N0YXR1czonKSwgc3RhdHVzKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHJlZCgnU3RhdHVzIFRleHQ6JyksIGdldEh0dHBTdGF0dXNUZXh0KHN0YXR1cykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cmwpIGNvbnNvbGUuZXJyb3IocmVkKCdVUkw6JyksIHNhbml0aXplVXJsKHVybCkpO1xuICAgICAgICBpZiAoZXJyLnJlc3BvbnNlPy5kYXRhKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihyZWQoJ1Jlc3BvbnNlOicpKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGRpbShzYW5pdGl6ZUVycm9yRGF0YShlcnIucmVzcG9uc2UuZGF0YSkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTaG93IENESy9leGVjU3luYyBlcnJvciBkZXRhaWxzIChzdGRlcnIgY2FwdHVyZWQgZnJvbSBjaGlsZCBwcm9jZXNzKVxuICAgICAgaWYgKCdzdGRlcnInIGluIGVyciAmJiBlcnIuc3RkZXJyKSB7XG4gICAgICAgIGNvbnN0IHN0ZGVyciA9IChlcnIuc3RkZXJyIGFzIEJ1ZmZlciB8IHN0cmluZykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHJlZCgnQ0RLIE91dHB1dDonKSk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihkaW0oc3RkZXJyKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5lcnJvcihyZWQoJ0NvZGU6JyksIGdldEVycm9yQ29kZU5hbWUoY29kZSkpO1xuICAgICAgY29uc29sZS5lcnJvcihkaW0oJ0Vycm9yIElEOicpLCBkaW0oZXJyb3JJZCkpO1xuXG4gICAgICBpZiAoY29udGV4dCAmJiBPYmplY3Qua2V5cyhjb250ZXh0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlZCgnQ29udGV4dDonKSk7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbnRleHQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgJHtjeWFuKGtleSl9OmAsIGRpbShzYW5pdGl6ZVZhbHVlKHZhbHVlKSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlYnVnICYmIGVyci5zdGFjaykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihkaW0oJ1N0YWNrIHRyYWNlOicpKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihkaW0oc2FuaXRpemVTdGFja1RyYWNlKGVyci5zdGFjaykpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihyZWQoJ0Vycm9yOicpLCBTdHJpbmcoZXJyKSk7XG4gICAgICBjb25zb2xlLmVycm9yKHJlZCgnQ29kZTonKSwgZ2V0RXJyb3JDb2RlTmFtZShjb2RlKSk7XG4gICAgICBjb25zb2xlLmVycm9yKGRpbSgnRXJyb3IgSUQ6JyksIGRpbShlcnJvcklkKSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcihkaW0oZGl2aWRlcikpO1xuXG4gICAgaWYgKCFkZWJ1Zykge1xuICAgICAgY29uc29sZS5lcnJvcih5ZWxsb3coJ/CfkqEgVGlwOicpLCBkaW0oJ1J1biB3aXRoIC0tZGVidWcgZmxhZyB0byBzZWUgZnVsbCBzdGFjayB0cmFjZScpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWdnZXN0aW9uID0gZ2V0RXJyb3JTdWdnZXN0aW9uKGVyciwgY29kZSk7XG4gICAgaWYgKHN1Z2dlc3Rpb24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoeWVsbG93KCfwn5KhIFN1Z2dlc3Rpb246JyksIGRpbShzdWdnZXN0aW9uKSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcignJyk7XG4gIH1cblxuICBpZiAoZXhpdCkge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSBjb2RlO1xuICAgIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfVxuXG4gIHRocm93IGVycjtcbn1cblxuLy8gLS0tIEVycm9yIGNsYXNzZXMgKG9ubHkgdGhvc2UgYWN0dWFsbHkgdXNlZCkgLS0tXG5cbi8qKlxuICogVmFsaWRhdGlvbiBlcnJvciBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIGZpZWxkPzogc3RyaW5nLFxuICAgIHB1YmxpYyB2YWx1ZT86IHVua25vd24sXG4gICAgcHVibGljIHJ1bGU/OiBzdHJpbmcsXG4gICAgcHVibGljIGV4cGVjdGVkPzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnVmFsaWRhdGlvbkVycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vKipcbiAqIE5ldHdvcmsgZXJyb3IgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyB1cmw/OiBzdHJpbmcsXG4gICAgcHVibGljIGNhdXNlPzogRXJyb3IsXG4gICAgcHVibGljIHRpbWVvdXQ/OiBudW1iZXIsXG4gICAgcHVibGljIHJlcXVlc3RNYWRlOiBib29sZWFuID0gdHJ1ZSxcbiAgICBwdWJsaWMgcmVzcG9uc2VSZWNlaXZlZDogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnTmV0d29ya0Vycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vLyAtLS0gUHJpdmF0ZSBoZWxwZXJzIC0tLVxuXG5mdW5jdGlvbiBnZXRFcnJvckNvZGVOYW1lKGNvZGU6IEVycm9yQ29kZSk6IHN0cmluZyB7XG4gIGNvbnN0IGVudHJ5ID0gT2JqZWN0LmVudHJpZXMoRVJST1JfQ09ERVMpLmZpbmQoKFtfLCB2YWx1ZV0pID0+IHZhbHVlID09PSBjb2RlKTtcbiAgcmV0dXJuIGVudHJ5ID8gYCR7ZW50cnlbMF19ICgke2NvZGV9KWAgOiBTdHJpbmcoY29kZSk7XG59XG5cbmZ1bmN0aW9uIGdldEh0dHBTdGF0dXNUZXh0KHN0YXR1czogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhdHVzVGV4dHM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgNDAwOiAnQmFkIFJlcXVlc3QnLFxuICAgIDQwMTogJ1VuYXV0aG9yaXplZCcsXG4gICAgNDAzOiAnRm9yYmlkZGVuJyxcbiAgICA0MDQ6ICdOb3QgRm91bmQnLFxuICAgIDQwODogJ1JlcXVlc3QgVGltZW91dCcsXG4gICAgNDA5OiAnQ29uZmxpY3QnLFxuICAgIDQyMjogJ1VucHJvY2Vzc2FibGUgRW50aXR5JyxcbiAgICA0Mjk6ICdUb28gTWFueSBSZXF1ZXN0cycsXG4gICAgNTAwOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICA1MDI6ICdCYWQgR2F0ZXdheScsXG4gICAgNTAzOiAnU2VydmljZSBVbmF2YWlsYWJsZScsXG4gICAgNTA0OiAnR2F0ZXdheSBUaW1lb3V0JyxcbiAgfTtcbiAgcmV0dXJuIHN0YXR1c1RleHRzW3N0YXR1c10gfHwgJ1Vua25vd24nO1xufVxuXG5mdW5jdGlvbiBnZXRFcnJvclN1Z2dlc3Rpb24oZXJyOiB1bmtub3duLCBjb2RlOiBFcnJvckNvZGUpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGNvZGUgPT09IEVSUk9SX0NPREVTLkFVVEhFTlRJQ0FUSU9OKSB7XG4gICAgcmV0dXJuICdDaGVjayB0aGF0IFBMQVRGT1JNX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCBjb3JyZWN0bHknO1xuICB9XG4gIGlmIChjb2RlID09PSBFUlJPUl9DT0RFUy5ORVRXT1JLKSB7XG4gICAgcmV0dXJuICdDaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24gYW5kIEFQSSBlbmRwb2ludCBVUkwnO1xuICB9XG4gIGlmIChjb2RlID09PSBFUlJPUl9DT0RFUy5DT05GSUdVUkFUSU9OKSB7XG4gICAgcmV0dXJuICdSdW4gXCJjbGkgdmVyc2lvbiAtLWNoZWNrLWNvbmZpZ1wiIHRvIHZlcmlmeSBjb25maWd1cmF0aW9uJztcbiAgfVxuICBpZiAoY29kZSA9PT0gRVJST1JfQ09ERVMuTk9UX0ZPVU5EKSB7XG4gICAgcmV0dXJuICdWZXJpZnkgdGhlIHJlc291cmNlIElEIGV4aXN0cyBhbmQgeW91IGhhdmUgYWNjZXNzIHRvIGl0JztcbiAgfVxuICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ2NkaycpKSB7XG4gICAgcmV0dXJuICdDaGVjayB0aGUgQ0RLIG91dHB1dCBhYm92ZSBmb3IgQ2xvdWRGb3JtYXRpb24gZXJyb3JzLiBSdW4gd2l0aCAtLWRlYnVnIGZvciBmdWxsIGRldGFpbHMnO1xuICB9XG4gIGlmIChlcnIgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IgJiYgZXJyLmZpZWxkKSB7XG4gICAgcmV0dXJuIGBDaGVjayB0aGUgdmFsdWUgcHJvdmlkZWQgZm9yIFwiJHtlcnIuZmllbGR9XCJgO1xuICB9XG4gIGlmIChpc0F4aW9zRXJyb3IoZXJyKSkge1xuICAgIGNvbnN0IHN0YXR1cyA9IGVyci5yZXNwb25zZT8uc3RhdHVzO1xuICAgIGlmIChzdGF0dXMgPT09IDQwMSB8fCBzdGF0dXMgPT09IDQwMykgcmV0dXJuICdDaGVjayB5b3VyIGF1dGhlbnRpY2F0aW9uIHRva2VuIGFuZCBwZXJtaXNzaW9ucyc7XG4gICAgaWYgKHN0YXR1cyA9PT0gNDI5KSByZXR1cm4gJ1JhdGUgbGltaXQgZXhjZWVkZWQgLSB3YWl0IGEgbW9tZW50IGJlZm9yZSByZXRyeWluZyc7XG4gICAgaWYgKHN0YXR1cyAmJiBzdGF0dXMgPj0gNTAwKSByZXR1cm4gJ1NlcnZlciBlcnJvciAtIHRyeSBhZ2FpbiBsYXRlciBvciBjb250YWN0IHN1cHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZUVycm9yRGF0YShkYXRhOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgcmV0dXJuIGRhdGE7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHNhbml0aXplZCA9IHsgLi4uZGF0YSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIFsndG9rZW4nLCAncGFzc3dvcmQnLCAnc2VjcmV0JywgJ2FwaUtleScsICdhdXRob3JpemF0aW9uJywgJ2p3dCcsICdjcmVkZW50aWFsJywgJ2JlYXJlciddLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgaWYgKGZpZWxkIGluIHNhbml0aXplZCkgc2FuaXRpemVkW2ZpZWxkXSA9ICdbUkVEQUNURURdJztcbiAgICB9KTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2FuaXRpemVkLCBudWxsLCAyKTtcbiAgfVxuICByZXR1cm4gU3RyaW5nKGRhdGEpO1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuICAgIFsndG9rZW4nLCAna2V5JywgJ3NlY3JldCcsICdwYXNzd29yZCcsICdhcGlLZXknXS5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgIGlmICh1cmxPYmouc2VhcmNoUGFyYW1zLmhhcyhwYXJhbSkpIHVybE9iai5zZWFyY2hQYXJhbXMuc2V0KHBhcmFtLCAnW1JFREFDVEVEXScpO1xuICAgIH0pO1xuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZVZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuICd1bmRlZmluZWQnO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiAyMCAmJiAvXltBLVphLXowLTkrLz1fLV0rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgJHt2YWx1ZS5zdWJzdHJpbmcoMCwgOCl9Li4uW1JFREFDVEVEXWA7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiAxMDAgPyB2YWx1ZS5zdWJzdHJpbmcoMCwgOTcpICsgJy4uLicgOiB2YWx1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHNhbml0aXplRXJyb3JEYXRhKHZhbHVlKTtcbiAgY29uc3Qgc3RyID0gU3RyaW5nKHZhbHVlKTtcbiAgcmV0dXJuIHN0ci5sZW5ndGggPiAxMDAgPyBzdHIuc3Vic3RyaW5nKDAsIDk3KSArICcuLi4nIDogc3RyO1xufVxuXG5mdW5jdGlvbiBzYW5pdGl6ZVN0YWNrVHJhY2Uoc3RhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdGFjay5zcGxpdCgnXFxuJykuc2xpY2UoMCwgMTApLm1hcChsaW5lID0+IGxpbmUucmVwbGFjZSgvXFwvLio/XFwvL2csICcuLi4vJykpLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBpc0F4aW9zRXJyb3IoZXJyOiB1bmtub3duKTogZXJyIGlzIEF4aW9zRXJyb3JMaWtlIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgZXJyID09PSAnb2JqZWN0JyAmJlxuICAgIGVyciAhPT0gbnVsbCAmJlxuICAgICdpc0F4aW9zRXJyb3InIGluIGVyciAmJlxuICAgIChlcnIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmlzQXhpb3NFcnJvciA9PT0gdHJ1ZVxuICApO1xufVxuIl19
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Common filter parameters shared by all list commands.
3
+ */
4
+ export interface CommonFilterParams {
5
+ id?: string | string[];
6
+ isActive?: boolean;
7
+ limit?: number;
8
+ offset?: number;
9
+ sort?: string;
10
+ }
11
+ /**
12
+ * Extract common filter parameters (id, isActive, limit, offset, sort) from CLI options.
13
+ */
14
+ export declare function buildCommonFilters(options: Record<string, unknown>): CommonFilterParams;
15
+ /**
16
+ * Display pagination settings for a list command.
17
+ */
18
+ export declare function displayPaginationInfo(filterParams: CommonFilterParams): void;
19
+ /**
20
+ * Display result summary after a list query completes.
21
+ */
22
+ export declare function displayListResults(items: unknown[], total: number | undefined, hasMore: boolean, entityName: string, duration: number, filterParams: CommonFilterParams): void;
23
+ //# sourceMappingURL=list-command-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-command-utils.d.ts","sourceRoot":"","sources":["../../src/utils/list-command-utils.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAmBvF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAQ5E;AAGD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EAAE,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,kBAAkB,GAC/B,IAAI,CAgBN"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ // Copyright 2026 Pipeline Builder Contributors
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.buildCommonFilters = buildCommonFilters;
6
+ exports.displayPaginationInfo = displayPaginationInfo;
7
+ exports.displayListResults = displayListResults;
8
+ const output_utils_1 = require("./output-utils");
9
+ const cli_constants_1 = require("../config/cli.constants");
10
+ /**
11
+ * Extract common filter parameters (id, isActive, limit, offset, sort) from CLI options.
12
+ */
13
+ function buildCommonFilters(options) {
14
+ const params = {};
15
+ if (options.id) {
16
+ const idValue = options.id;
17
+ params.id = idValue.includes(',') ? idValue.split(',').map((s) => s.trim()) : idValue;
18
+ }
19
+ if (options.isActive !== undefined) {
20
+ params.isActive = (0, cli_constants_1.validateBoolean)(options.isActive, 'is-active');
21
+ }
22
+ params.limit = (0, cli_constants_1.validateNumber)(options.limit, 'limit', 1, 1000);
23
+ params.offset = (0, cli_constants_1.validateNumber)(options.offset, 'offset', 0);
24
+ const sort = (0, cli_constants_1.validateSort)(options.sort);
25
+ if (sort)
26
+ params.sort = sort;
27
+ return params;
28
+ }
29
+ /**
30
+ * Display pagination settings for a list command.
31
+ */
32
+ function displayPaginationInfo(filterParams) {
33
+ console.log('');
34
+ (0, output_utils_1.printInfo)('Pagination Settings');
35
+ (0, output_utils_1.printKeyValue)({
36
+ Limit: (filterParams.limit ?? 50).toString(),
37
+ Offset: (filterParams.offset ?? 0).toString(),
38
+ Sort: filterParams.sort || 'createdAt:desc',
39
+ });
40
+ }
41
+ /**
42
+ * Display result summary after a list query completes.
43
+ */
44
+ function displayListResults(items, total, hasMore, entityName, duration, filterParams) {
45
+ (0, output_utils_1.printKeyValue)({
46
+ [`${entityName} Found`]: items.length.toString(),
47
+ 'Total Available': total !== undefined ? total.toString() : 'Unknown',
48
+ 'Has More': hasMore ? 'Yes' : 'No',
49
+ 'Request Duration': (0, cli_constants_1.formatDuration)(duration),
50
+ });
51
+ if (hasMore) {
52
+ const currentOffset = filterParams.offset || 0;
53
+ const nextOffset = currentOffset + (filterParams.limit || 50);
54
+ console.log('');
55
+ (0, output_utils_1.printInfo)('More results available', {
56
+ hint: `Use --offset ${nextOffset} to see next page`,
57
+ });
58
+ }
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1jb21tYW5kLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xpc3QtY29tbWFuZC11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsK0NBQStDO0FBQy9DLHNDQUFzQzs7QUFtQnRDLGdEQW1CQztBQUtELHNEQVFDO0FBTUQsZ0RBdUJDO0FBOUVELGlEQUEwRDtBQUMxRCwyREFBd0c7QUFheEc7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxPQUFnQztJQUNqRSxNQUFNLE1BQU0sR0FBdUIsRUFBRSxDQUFDO0lBRXRDLElBQUksT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEVBQVksQ0FBQztRQUNyQyxNQUFNLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ2hHLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFBLCtCQUFlLEVBQUMsT0FBTyxDQUFDLFFBQWtCLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBQSw4QkFBYyxFQUFDLE9BQU8sQ0FBQyxLQUF3QixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEYsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFBLDhCQUFjLEVBQUMsT0FBTyxDQUFDLE1BQXlCLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRS9FLE1BQU0sSUFBSSxHQUFHLElBQUEsNEJBQVksRUFBQyxPQUFPLENBQUMsSUFBMEIsQ0FBQyxDQUFDO0lBQzlELElBQUksSUFBSTtRQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBRTdCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLFlBQWdDO0lBQ3BFLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsSUFBQSx3QkFBUyxFQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDakMsSUFBQSw0QkFBYSxFQUFDO1FBQ1osS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDNUMsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDN0MsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLElBQUksZ0JBQWdCO0tBQzVDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFHRDs7R0FFRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxLQUFnQixFQUNoQixLQUF5QixFQUN6QixPQUFnQixFQUNoQixVQUFrQixFQUNsQixRQUFnQixFQUNoQixZQUFnQztJQUVoQyxJQUFBLDRCQUFhLEVBQUM7UUFDWixDQUFDLEdBQUcsVUFBVSxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUNoRCxpQkFBaUIsRUFBRSxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDckUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ2xDLGtCQUFrQixFQUFFLElBQUEsOEJBQWMsRUFBQyxRQUFRLENBQUM7S0FDN0MsQ0FBQyxDQUFDO0lBRUgsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLGFBQWEsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixJQUFBLHdCQUFTLEVBQUMsd0JBQXdCLEVBQUU7WUFDbEMsSUFBSSxFQUFFLGdCQUFnQixVQUFVLG1CQUFtQjtTQUNwRCxDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBwcmludEluZm8sIHByaW50S2V5VmFsdWUgfSBmcm9tICcuL291dHB1dC11dGlscyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiwgdmFsaWRhdGVCb29sZWFuLCB2YWxpZGF0ZU51bWJlciwgdmFsaWRhdGVTb3J0IH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMnO1xuXG4vKipcbiAqIENvbW1vbiBmaWx0ZXIgcGFyYW1ldGVycyBzaGFyZWQgYnkgYWxsIGxpc3QgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uRmlsdGVyUGFyYW1zIHtcbiAgaWQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgaXNBY3RpdmU/OiBib29sZWFuO1xuICBsaW1pdD86IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBzb3J0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgY29tbW9uIGZpbHRlciBwYXJhbWV0ZXJzIChpZCwgaXNBY3RpdmUsIGxpbWl0LCBvZmZzZXQsIHNvcnQpIGZyb20gQ0xJIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbW1vbkZpbHRlcnMob3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBDb21tb25GaWx0ZXJQYXJhbXMge1xuICBjb25zdCBwYXJhbXM6IENvbW1vbkZpbHRlclBhcmFtcyA9IHt9O1xuXG4gIGlmIChvcHRpb25zLmlkKSB7XG4gICAgY29uc3QgaWRWYWx1ZSA9IG9wdGlvbnMuaWQgYXMgc3RyaW5nO1xuICAgIHBhcmFtcy5pZCA9IGlkVmFsdWUuaW5jbHVkZXMoJywnKSA/IGlkVmFsdWUuc3BsaXQoJywnKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpIDogaWRWYWx1ZTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYXJhbXMuaXNBY3RpdmUgPSB2YWxpZGF0ZUJvb2xlYW4ob3B0aW9ucy5pc0FjdGl2ZSBhcyBzdHJpbmcsICdpcy1hY3RpdmUnKTtcbiAgfVxuXG4gIHBhcmFtcy5saW1pdCA9IHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMubGltaXQgYXMgc3RyaW5nIHwgbnVtYmVyLCAnbGltaXQnLCAxLCAxMDAwKTtcbiAgcGFyYW1zLm9mZnNldCA9IHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMub2Zmc2V0IGFzIHN0cmluZyB8IG51bWJlciwgJ29mZnNldCcsIDApO1xuXG4gIGNvbnN0IHNvcnQgPSB2YWxpZGF0ZVNvcnQob3B0aW9ucy5zb3J0IGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gIGlmIChzb3J0KSBwYXJhbXMuc29ydCA9IHNvcnQ7XG5cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuLyoqXG4gKiBEaXNwbGF5IHBhZ2luYXRpb24gc2V0dGluZ3MgZm9yIGEgbGlzdCBjb21tYW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheVBhZ2luYXRpb25JbmZvKGZpbHRlclBhcmFtczogQ29tbW9uRmlsdGVyUGFyYW1zKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcHJpbnRJbmZvKCdQYWdpbmF0aW9uIFNldHRpbmdzJyk7XG4gIHByaW50S2V5VmFsdWUoe1xuICAgIExpbWl0OiAoZmlsdGVyUGFyYW1zLmxpbWl0ID8/IDUwKS50b1N0cmluZygpLFxuICAgIE9mZnNldDogKGZpbHRlclBhcmFtcy5vZmZzZXQgPz8gMCkudG9TdHJpbmcoKSxcbiAgICBTb3J0OiBmaWx0ZXJQYXJhbXMuc29ydCB8fCAnY3JlYXRlZEF0OmRlc2MnLFxuICB9KTtcbn1cblxuXG4vKipcbiAqIERpc3BsYXkgcmVzdWx0IHN1bW1hcnkgYWZ0ZXIgYSBsaXN0IHF1ZXJ5IGNvbXBsZXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlMaXN0UmVzdWx0cyhcbiAgaXRlbXM6IHVua25vd25bXSxcbiAgdG90YWw6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgaGFzTW9yZTogYm9vbGVhbixcbiAgZW50aXR5TmFtZTogc3RyaW5nLFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICBmaWx0ZXJQYXJhbXM6IENvbW1vbkZpbHRlclBhcmFtcyxcbik6IHZvaWQge1xuICBwcmludEtleVZhbHVlKHtcbiAgICBbYCR7ZW50aXR5TmFtZX0gRm91bmRgXTogaXRlbXMubGVuZ3RoLnRvU3RyaW5nKCksXG4gICAgJ1RvdGFsIEF2YWlsYWJsZSc6IHRvdGFsICE9PSB1bmRlZmluZWQgPyB0b3RhbC50b1N0cmluZygpIDogJ1Vua25vd24nLFxuICAgICdIYXMgTW9yZSc6IGhhc01vcmUgPyAnWWVzJyA6ICdObycsXG4gICAgJ1JlcXVlc3QgRHVyYXRpb24nOiBmb3JtYXREdXJhdGlvbihkdXJhdGlvbiksXG4gIH0pO1xuXG4gIGlmIChoYXNNb3JlKSB7XG4gICAgY29uc3QgY3VycmVudE9mZnNldCA9IGZpbHRlclBhcmFtcy5vZmZzZXQgfHwgMDtcbiAgICBjb25zdCBuZXh0T2Zmc2V0ID0gY3VycmVudE9mZnNldCArIChmaWx0ZXJQYXJhbXMubGltaXQgfHwgNTApO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBwcmludEluZm8oJ01vcmUgcmVzdWx0cyBhdmFpbGFibGUnLCB7XG4gICAgICBoaW50OiBgVXNlIC0tb2Zmc2V0ICR7bmV4dE9mZnNldH0gdG8gc2VlIG5leHQgcGFnZWAsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,60 @@
1
+ import { OutputFormat } from '../config/cli.constants';
2
+ /**
3
+ * Options for outputData function
4
+ */
5
+ export interface OutputOptions {
6
+ format?: OutputFormat;
7
+ file?: string;
8
+ pretty?: boolean;
9
+ silent?: boolean;
10
+ append?: boolean;
11
+ }
12
+ /**
13
+ * Table column configuration
14
+ */
15
+ export interface TableColumn {
16
+ header: string;
17
+ key: string;
18
+ width?: number;
19
+ align?: 'left' | 'center' | 'right';
20
+ formatter?: (value: unknown) => string;
21
+ }
22
+ export declare function printSuccess(message: string, data?: unknown): void;
23
+ export declare function printInfo(message: string, data?: unknown): void;
24
+ export declare function printWarning(message: string, data?: unknown): void;
25
+ export declare function printError(message: string, data?: unknown): void;
26
+ export declare function printDebug(message: string, data?: unknown): void;
27
+ /**
28
+ * Output data in specified format (console or file)
29
+ */
30
+ export declare function outputData(data: unknown, options?: OutputOptions): void;
31
+ export declare function formatTable(data: unknown[], columns?: TableColumn[]): string;
32
+ export declare function ensureOutputDirectory(outputPath: string): void;
33
+ export declare function fileExists(filePath: string): boolean;
34
+ export declare function printSection(title: string, subtitle?: string): void;
35
+ export declare function printKeyValue(data: Record<string, unknown>, options?: {
36
+ indent?: number;
37
+ separator?: string;
38
+ }): void;
39
+ export declare function printDivider(char?: string, width?: number): void;
40
+ /**
41
+ * Unwrap a sendSuccess API envelope: { success, statusCode, data: { ... } }
42
+ * Returns the inner `data` object, or the original response if not wrapped.
43
+ */
44
+ export declare function unwrapEnvelope(response: unknown): Record<string, unknown>;
45
+ /**
46
+ * Extract a single entity from an API response, handling envelope formats.
47
+ * Tries: payload[entityKey], payload directly (if identifierKey exists), or undefined.
48
+ */
49
+ export declare function extractSingleResponse<T>(response: unknown, entityKey: string, identifierKey: string): T | undefined;
50
+ export interface ListResponseResult<T> {
51
+ items: T[];
52
+ total?: number;
53
+ hasMore: boolean;
54
+ }
55
+ /**
56
+ * Extract items from an API list response, handling multiple response formats.
57
+ * Supports: `{ <key>: T[] }`, `{ items: T[] }`, `T[]`, or invalid formats.
58
+ */
59
+ export declare function extractListResponse<T>(response: unknown, itemsKey: string): ListResponseResult<T>;
60
+ //# sourceMappingURL=output-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-utils.d.ts","sourceRoot":"","sources":["../../src/utils/output-utils.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,YAAY,EAGb,MAAM,yBAAyB,CAAC;AAMjC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACxC;AA8BD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAyC;AAC5G,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAsC;AACtG,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAsC;AACzG,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAuC;AAExG,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAEhE;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,aAAkB,GAAG,IAAI,CAuC3E;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM,CA0D5E;AAgED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAY9D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAID,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAOnE;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,IAAI,CAWN;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAGrE;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAQnH;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,CA6BjG"}