@aitos/core 1.0.0 → 1.0.1
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/dist/acs.d.ts +108 -0
- package/dist/acs.js +719 -0
- package/dist/atoms/calculation.d.ts +7 -0
- package/dist/atoms/calculation.js +95 -0
- package/dist/atoms/control.d.ts +11 -0
- package/dist/atoms/control.js +269 -0
- package/dist/atoms/judgment.d.ts +14 -0
- package/dist/atoms/judgment.js +193 -0
- package/dist/atoms/manipulation.d.ts +22 -0
- package/dist/atoms/manipulation.js +371 -0
- package/dist/atoms/state.d.ts +3 -0
- package/dist/atoms/state.js +35 -0
- package/dist/atoms/telemetry.d.ts +6 -0
- package/dist/atoms/telemetry.js +135 -0
- package/dist/atoms/time.d.ts +5 -0
- package/dist/atoms/time.js +71 -0
- package/dist/atoms/tool-calls.d.ts +2 -0
- package/dist/atoms/tool-calls.js +106 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +52 -0
- package/dist/runtime.d.ts +50 -0
- package/dist/runtime.js +408 -0
- package/dist/types.d.ts +123 -0
- package/dist/types.js +3 -0
- package/package.json +21 -7
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAtAtom = exports.toUpperAtom = exports.toLowerAtom = exports.trimAtom = exports.replaceAtom = exports.startsWithAtom = exports.containsAtom = exports.toNumAtom = exports.formatAtom = exports.filterAtom = exports.mergeAtom = exports.valuesAtom = exports.keysAtom = exports.setPropAtom = exports.getPropAtom = exports.sliceAtom = exports.popAtom = exports.pushAtom = exports.lenAtom = exports.splitAtom = exports.concatAtom = void 0;
|
|
4
|
+
exports.concatAtom = {
|
|
5
|
+
name: 'concat',
|
|
6
|
+
version: '1.0.0',
|
|
7
|
+
meta: {
|
|
8
|
+
input: [
|
|
9
|
+
{ name: 'a', type: 'any' },
|
|
10
|
+
{ name: 'b', type: 'any' }
|
|
11
|
+
],
|
|
12
|
+
output: { type: 'any' }
|
|
13
|
+
},
|
|
14
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
15
|
+
execute: async (input, context) => {
|
|
16
|
+
if (Array.isArray(input.a) && Array.isArray(input.b)) {
|
|
17
|
+
return { success: true, data: [...input.a, ...input.b] };
|
|
18
|
+
}
|
|
19
|
+
return { success: true, data: String(input.a) + String(input.b) };
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
exports.splitAtom = {
|
|
23
|
+
name: 'split',
|
|
24
|
+
version: '1.0.0',
|
|
25
|
+
meta: {
|
|
26
|
+
input: [
|
|
27
|
+
{ name: 'text', type: 'string' },
|
|
28
|
+
{ name: 'separator', type: 'string' }
|
|
29
|
+
],
|
|
30
|
+
output: { type: 'array' }
|
|
31
|
+
},
|
|
32
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
33
|
+
execute: async (input, context) => {
|
|
34
|
+
return { success: true, data: input.text.split(input.separator) };
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
exports.lenAtom = {
|
|
38
|
+
name: 'len',
|
|
39
|
+
version: '1.0.0',
|
|
40
|
+
meta: {
|
|
41
|
+
input: [
|
|
42
|
+
{ name: 'value', type: 'any' }
|
|
43
|
+
],
|
|
44
|
+
output: { type: 'number' }
|
|
45
|
+
},
|
|
46
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
47
|
+
execute: async (input, context) => {
|
|
48
|
+
if (input.value === null || input.value === undefined) {
|
|
49
|
+
return { success: true, data: 0 };
|
|
50
|
+
}
|
|
51
|
+
return { success: true, data: input.value.length };
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
exports.pushAtom = {
|
|
55
|
+
name: 'push',
|
|
56
|
+
version: '1.0.0',
|
|
57
|
+
meta: {
|
|
58
|
+
input: [
|
|
59
|
+
{ name: 'array', type: 'array' },
|
|
60
|
+
{ name: 'value', type: 'any' }
|
|
61
|
+
],
|
|
62
|
+
output: { type: 'array' }
|
|
63
|
+
},
|
|
64
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
65
|
+
execute: async (input, context) => {
|
|
66
|
+
const arr = [...input.array, input.value];
|
|
67
|
+
return { success: true, data: arr };
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
exports.popAtom = {
|
|
71
|
+
name: 'pop',
|
|
72
|
+
version: '1.0.0',
|
|
73
|
+
meta: {
|
|
74
|
+
input: [
|
|
75
|
+
{ name: 'array', type: 'array' }
|
|
76
|
+
],
|
|
77
|
+
output: { type: 'any' }
|
|
78
|
+
},
|
|
79
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
80
|
+
execute: async (input, context) => {
|
|
81
|
+
const arr = [...input.array];
|
|
82
|
+
const value = arr.pop();
|
|
83
|
+
return { success: true, data: value };
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
exports.sliceAtom = {
|
|
87
|
+
name: 'slice',
|
|
88
|
+
version: '1.0.0',
|
|
89
|
+
meta: {
|
|
90
|
+
input: [
|
|
91
|
+
{ name: 'array', type: 'array|string' },
|
|
92
|
+
{ name: 'start', type: 'number' },
|
|
93
|
+
{ name: 'end', type: 'number' }
|
|
94
|
+
],
|
|
95
|
+
output: { type: 'array|string' }
|
|
96
|
+
},
|
|
97
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
98
|
+
execute: async (input, context) => {
|
|
99
|
+
if (typeof input.array === 'string') {
|
|
100
|
+
return { success: true, data: input.array.slice(input.start, input.end) };
|
|
101
|
+
}
|
|
102
|
+
return { success: true, data: input.array.slice(input.start, input.end) };
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
exports.getPropAtom = {
|
|
106
|
+
name: 'getProp',
|
|
107
|
+
version: '1.0.0',
|
|
108
|
+
meta: {
|
|
109
|
+
input: [
|
|
110
|
+
{ name: 'obj', type: 'object' },
|
|
111
|
+
{ name: 'key', type: 'any' }
|
|
112
|
+
],
|
|
113
|
+
output: { type: 'any' }
|
|
114
|
+
},
|
|
115
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
116
|
+
execute: async (input, context) => {
|
|
117
|
+
return { success: true, data: input.obj?.[input.key] ?? null };
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
exports.setPropAtom = {
|
|
121
|
+
name: 'setProp',
|
|
122
|
+
version: '1.0.0',
|
|
123
|
+
meta: {
|
|
124
|
+
input: [
|
|
125
|
+
{ name: 'obj', type: 'object' },
|
|
126
|
+
{ name: 'key', type: 'any' },
|
|
127
|
+
{ name: 'value', type: 'any' }
|
|
128
|
+
],
|
|
129
|
+
output: { type: 'any' }
|
|
130
|
+
},
|
|
131
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
132
|
+
execute: async (input, context) => {
|
|
133
|
+
if (Array.isArray(input.obj)) {
|
|
134
|
+
const arr = [...input.obj];
|
|
135
|
+
arr[Number(input.key)] = input.value;
|
|
136
|
+
return { success: true, data: arr };
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
const obj = { ...input.obj };
|
|
140
|
+
obj[input.key] = input.value;
|
|
141
|
+
return { success: true, data: obj };
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
exports.keysAtom = {
|
|
146
|
+
name: 'keys',
|
|
147
|
+
version: '1.0.0',
|
|
148
|
+
meta: {
|
|
149
|
+
input: [
|
|
150
|
+
{ name: 'obj', type: 'object' }
|
|
151
|
+
],
|
|
152
|
+
output: { type: 'array' }
|
|
153
|
+
},
|
|
154
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
155
|
+
execute: async (input, context) => {
|
|
156
|
+
return { success: true, data: Object.keys(input.obj || {}) };
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
exports.valuesAtom = {
|
|
160
|
+
name: 'values',
|
|
161
|
+
version: '1.0.0',
|
|
162
|
+
meta: {
|
|
163
|
+
input: [
|
|
164
|
+
{ name: 'obj', type: 'object' }
|
|
165
|
+
],
|
|
166
|
+
output: { type: 'array' }
|
|
167
|
+
},
|
|
168
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
169
|
+
execute: async (input, context) => {
|
|
170
|
+
return { success: true, data: Object.values(input.obj || {}) };
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
exports.mergeAtom = {
|
|
174
|
+
name: 'merge',
|
|
175
|
+
version: '1.0.0',
|
|
176
|
+
meta: {
|
|
177
|
+
input: [
|
|
178
|
+
{ name: 'a', type: 'object' },
|
|
179
|
+
{ name: 'b', type: 'object' }
|
|
180
|
+
],
|
|
181
|
+
output: { type: 'object' }
|
|
182
|
+
},
|
|
183
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
184
|
+
execute: async (input, context) => {
|
|
185
|
+
return { success: true, data: { ...input.a, ...input.b } };
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
exports.filterAtom = {
|
|
189
|
+
name: 'filter',
|
|
190
|
+
version: '1.0.0',
|
|
191
|
+
meta: {
|
|
192
|
+
input: [
|
|
193
|
+
{ name: 'array', type: 'array', description: 'Array to filter' },
|
|
194
|
+
{ name: 'nodes', type: 'object', description: 'Graph to execute for each item, should return boolean' },
|
|
195
|
+
{ name: 'itemKey', type: 'string', description: 'Key to store current item in store' },
|
|
196
|
+
{ name: 'indexKey', type: 'string', description: 'Optional key to store current index' }
|
|
197
|
+
],
|
|
198
|
+
output: { type: 'array', description: 'Filtered array' }
|
|
199
|
+
},
|
|
200
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
201
|
+
execute: async (input, context) => {
|
|
202
|
+
if (!context.executeGraph) {
|
|
203
|
+
return { success: true, data: [] };
|
|
204
|
+
}
|
|
205
|
+
if (!Array.isArray(input.array)) {
|
|
206
|
+
return { success: false, error: 'Input is not an array' };
|
|
207
|
+
}
|
|
208
|
+
const result = [];
|
|
209
|
+
for (let i = 0; i < input.array.length; i++) {
|
|
210
|
+
context.store.set(input.itemKey, input.array[i]);
|
|
211
|
+
if (input.indexKey) {
|
|
212
|
+
context.store.set(input.indexKey, i);
|
|
213
|
+
}
|
|
214
|
+
const results = await context.executeGraph(input.nodes, context.currentScope);
|
|
215
|
+
const lastNodeId = input.nodes.order[input.nodes.order.length - 1];
|
|
216
|
+
const shouldKeep = results[lastNodeId];
|
|
217
|
+
if (shouldKeep === true) {
|
|
218
|
+
result.push(input.array[i]);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return { success: true, data: result };
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
exports.formatAtom = {
|
|
225
|
+
name: 'format',
|
|
226
|
+
version: '1.0.0',
|
|
227
|
+
meta: {
|
|
228
|
+
input: [
|
|
229
|
+
{ name: 'template', type: 'string', description: 'Template string with {placeholder} syntax' }
|
|
230
|
+
],
|
|
231
|
+
output: { type: 'string', description: 'Formatted string with placeholders replaced' }
|
|
232
|
+
},
|
|
233
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
234
|
+
execute: async (input, context) => {
|
|
235
|
+
let result = input.template;
|
|
236
|
+
for (const [key, value] of Object.entries(input)) {
|
|
237
|
+
if (key === 'template')
|
|
238
|
+
continue;
|
|
239
|
+
const placeholder = `{${key}}`;
|
|
240
|
+
const strValue = (typeof value === 'object' && value !== null) ? JSON.stringify(value, null, 2) : String(value);
|
|
241
|
+
result = result.replace(new RegExp(placeholder.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), strValue);
|
|
242
|
+
}
|
|
243
|
+
return { success: true, data: result };
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
exports.toNumAtom = {
|
|
247
|
+
name: 'toNum',
|
|
248
|
+
version: '1.0.0',
|
|
249
|
+
meta: {
|
|
250
|
+
input: [
|
|
251
|
+
{ name: 'value', type: 'any', description: 'Value to convert to number' }
|
|
252
|
+
],
|
|
253
|
+
output: { type: 'number', description: 'Numeric value or NaN if conversion fails' }
|
|
254
|
+
},
|
|
255
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
256
|
+
execute: async (input, context) => {
|
|
257
|
+
const num = Number(input.value);
|
|
258
|
+
return { success: true, data: num };
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
exports.containsAtom = {
|
|
262
|
+
name: 'contains',
|
|
263
|
+
version: '1.0.0',
|
|
264
|
+
meta: {
|
|
265
|
+
input: [
|
|
266
|
+
{ name: 'text', type: 'string', description: 'String to search in' },
|
|
267
|
+
{ name: 'search', type: 'string', description: 'String to search for' }
|
|
268
|
+
],
|
|
269
|
+
output: { type: 'boolean', description: 'True if text contains search' }
|
|
270
|
+
},
|
|
271
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
272
|
+
execute: async (input, context) => {
|
|
273
|
+
return { success: true, data: String(input.text).includes(String(input.search)) };
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
exports.startsWithAtom = {
|
|
277
|
+
name: 'startsWith',
|
|
278
|
+
version: '1.0.0',
|
|
279
|
+
meta: {
|
|
280
|
+
input: [
|
|
281
|
+
{ name: 'text', type: 'string', description: 'String to check' },
|
|
282
|
+
{ name: 'prefix', type: 'string', description: 'Prefix to check for' }
|
|
283
|
+
],
|
|
284
|
+
output: { type: 'boolean', description: 'True if text starts with prefix' }
|
|
285
|
+
},
|
|
286
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
287
|
+
execute: async (input, context) => {
|
|
288
|
+
return { success: true, data: String(input.text).startsWith(String(input.prefix)) };
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
exports.replaceAtom = {
|
|
292
|
+
name: 'replace',
|
|
293
|
+
version: '1.0.0',
|
|
294
|
+
meta: {
|
|
295
|
+
input: [
|
|
296
|
+
{ name: 'text', type: 'string', description: 'Source string' },
|
|
297
|
+
{ name: 'search', type: 'string', description: 'Substring to find' },
|
|
298
|
+
{ name: 'replacement', type: 'string', description: 'Replacement string' }
|
|
299
|
+
],
|
|
300
|
+
output: { type: 'string', description: 'String with first occurrence replaced' }
|
|
301
|
+
},
|
|
302
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
303
|
+
execute: async (input, context) => {
|
|
304
|
+
return { success: true, data: String(input.text).replace(String(input.search), String(input.replacement)) };
|
|
305
|
+
},
|
|
306
|
+
};
|
|
307
|
+
exports.trimAtom = {
|
|
308
|
+
name: 'trim',
|
|
309
|
+
version: '1.0.0',
|
|
310
|
+
meta: {
|
|
311
|
+
input: [
|
|
312
|
+
{ name: 'text', type: 'string', description: 'String to trim' }
|
|
313
|
+
],
|
|
314
|
+
output: { type: 'string', description: 'Trimmed string' }
|
|
315
|
+
},
|
|
316
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
317
|
+
execute: async (input, context) => {
|
|
318
|
+
return { success: true, data: String(input.text).trim() };
|
|
319
|
+
},
|
|
320
|
+
};
|
|
321
|
+
exports.toLowerAtom = {
|
|
322
|
+
name: 'toLower',
|
|
323
|
+
version: '1.0.0',
|
|
324
|
+
meta: {
|
|
325
|
+
input: [
|
|
326
|
+
{ name: 'text', type: 'string', description: 'String to convert' }
|
|
327
|
+
],
|
|
328
|
+
output: { type: 'string', description: 'Lowercase string' }
|
|
329
|
+
},
|
|
330
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
331
|
+
execute: async (input, context) => {
|
|
332
|
+
return { success: true, data: String(input.text).toLowerCase() };
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
exports.toUpperAtom = {
|
|
336
|
+
name: 'toUpper',
|
|
337
|
+
version: '1.0.0',
|
|
338
|
+
meta: {
|
|
339
|
+
input: [
|
|
340
|
+
{ name: 'text', type: 'string', description: 'String to convert' }
|
|
341
|
+
],
|
|
342
|
+
output: { type: 'string', description: 'Uppercase string' }
|
|
343
|
+
},
|
|
344
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
345
|
+
execute: async (input, context) => {
|
|
346
|
+
return { success: true, data: String(input.text).toUpperCase() };
|
|
347
|
+
},
|
|
348
|
+
};
|
|
349
|
+
exports.getAtAtom = {
|
|
350
|
+
name: 'getAt',
|
|
351
|
+
version: '1.0.0',
|
|
352
|
+
meta: {
|
|
353
|
+
input: [
|
|
354
|
+
{ name: 'array', type: 'array', description: 'Array to index into' },
|
|
355
|
+
{ name: 'index', type: 'number', description: 'Index to retrieve' }
|
|
356
|
+
],
|
|
357
|
+
output: { type: 'any', description: 'Element at the given index' }
|
|
358
|
+
},
|
|
359
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
360
|
+
execute: async (input, context) => {
|
|
361
|
+
if (!Array.isArray(input.array)) {
|
|
362
|
+
return { success: false, error: 'Input is not an array' };
|
|
363
|
+
}
|
|
364
|
+
const idx = Number(input.index);
|
|
365
|
+
if (idx < 0 || idx >= input.array.length) {
|
|
366
|
+
return { success: true, data: null };
|
|
367
|
+
}
|
|
368
|
+
return { success: true, data: input.array[idx] };
|
|
369
|
+
},
|
|
370
|
+
};
|
|
371
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaXB1bGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F0b21zL21hbmlwdWxhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFYSxRQUFBLFVBQVUsR0FBUztJQUM5QixJQUFJLEVBQUUsUUFBUTtJQUNkLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRTtZQUNMLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQzFCLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1NBQzNCO1FBQ0QsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtLQUN4QjtJQUNELGVBQWUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO0lBQ3BFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBeUIsRUFBRSxPQUFnQixFQUFtQixFQUFFO1FBQzlFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUM7Q0FDRixDQUFDO0FBRVcsUUFBQSxTQUFTLEdBQVM7SUFDN0Is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RUFBRSxJQUFJLEVBQUU7SUFDcEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFzQyxFQUFFLE9BQWdCLEVBQW1CLEVBQUU7UUFDM0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLENBQUM7UUFDNUQsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0b20sIENvbnRleHQsIFJlc3VsdCwgR3JhcGggfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBjb25jYXRBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAnY29uY2F0JyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdhJywgdHlwZTogJ2FueScgfSxcbiAgICAgIHsgbmFtZTogJ2InLCB0eXBlOiAnYW55JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FueScgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IGE6IGFueTsgYjogYW55IH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0LmEpICYmIEFycmF5LmlzQXJyYXkoaW5wdXQuYikpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFsuLi5pbnB1dC5hLCAuLi5pbnB1dC5iXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBTdHJpbmcoaW5wdXQuYSkgKyBTdHJpbmcoaW5wdXQuYikgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBzcGxpdEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdzcGxpdCcsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAndGV4dCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICB7IG5hbWU6ICdzZXBhcmF0b3InLCB0eXBlOiAnc3RyaW5nJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FycmF5JyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgdGV4dDogc3RyaW5nOyBzZXBhcmF0b3I6IHN0cmluZyB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBpbnB1dC50ZXh0LnNwbGl0KGlucHV0LnNlcGFyYXRvcikgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBsZW5BdG9tOiBBdG9tID0ge1xuICBuYW1lOiAnbGVuJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICd2YWx1ZScsIHR5cGU6ICdhbnknIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnbnVtYmVyJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgdmFsdWU6IHN0cmluZyB8IGFueVtdIHwgbnVsbCB8IHVuZGVmaW5lZCB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBpZiAoaW5wdXQudmFsdWUgPT09IG51bGwgfHwgaW5wdXQudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogMCB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBpbnB1dC52YWx1ZS5sZW5ndGggfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBwdXNoQXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ3B1c2gnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2FycmF5JywgdHlwZTogJ2FycmF5JyB9LFxuICAgICAgeyBuYW1lOiAndmFsdWUnLCB0eXBlOiAnYW55JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FycmF5JyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgYXJyYXk6IGFueVtdOyB2YWx1ZTogYW55IH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGNvbnN0IGFyciA9IFsuLi5pbnB1dC5hcnJheSwgaW5wdXQudmFsdWVdO1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IGFyciB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHBvcEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdwb3AnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2FycmF5JywgdHlwZTogJ2FycmF5JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FueScgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IGFycmF5OiBhbnlbXSB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBjb25zdCBhcnIgPSBbLi4uaW5wdXQuYXJyYXldO1xuICAgIGNvbnN0IHZhbHVlID0gYXJyLnBvcCgpO1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHZhbHVlIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc2xpY2VBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAnc2xpY2UnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2FycmF5JywgdHlwZTogJ2FycmF5fHN0cmluZycgfSxcbiAgICAgIHsgbmFtZTogJ3N0YXJ0JywgdHlwZTogJ251bWJlcicgfSxcbiAgICAgIHsgbmFtZTogJ2VuZCcsIHR5cGU6ICdudW1iZXInIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnYXJyYXl8c3RyaW5nJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgYXJyYXk6IGFueVtdIHwgc3RyaW5nOyBzdGFydDogbnVtYmVyOyBlbmQ/OiBudW1iZXIgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dC5hcnJheSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IGlucHV0LmFycmF5LnNsaWNlKGlucHV0LnN0YXJ0LCBpbnB1dC5lbmQpIH07XG4gICAgfVxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IGlucHV0LmFycmF5LnNsaWNlKGlucHV0LnN0YXJ0LCBpbnB1dC5lbmQpIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UHJvcEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdnZXRQcm9wJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdvYmonLCB0eXBlOiAnb2JqZWN0JyB9LFxuICAgICAgeyBuYW1lOiAna2V5JywgdHlwZTogJ2FueScgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdhbnknIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyBvYmo6IGFueTsga2V5OiBzdHJpbmcgfCBudW1iZXIgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogaW5wdXQub2JqPy5baW5wdXQua2V5XSA/PyBudWxsIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc2V0UHJvcEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdzZXRQcm9wJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdvYmonLCB0eXBlOiAnb2JqZWN0JyB9LFxuICAgICAgeyBuYW1lOiAna2V5JywgdHlwZTogJ2FueScgfSxcbiAgICAgIHsgbmFtZTogJ3ZhbHVlJywgdHlwZTogJ2FueScgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdhbnknIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyBvYmo6IGFueTsga2V5OiBzdHJpbmcgfCBudW1iZXI7IHZhbHVlOiBhbnkgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQub2JqKSkge1xuICAgICAgY29uc3QgYXJyID0gWy4uLmlucHV0Lm9ial07XG4gICAgICBhcnJbTnVtYmVyKGlucHV0LmtleSldID0gaW5wdXQudmFsdWU7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBhcnIgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb2JqID0geyAuLi5pbnB1dC5vYmogfTtcbiAgICAgIG9ialtpbnB1dC5rZXldID0gaW5wdXQudmFsdWU7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBvYmogfTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qga2V5c0F0b206IEF0b20gPSB7XG4gIG5hbWU6ICdrZXlzJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdvYmonLCB0eXBlOiAnb2JqZWN0JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FycmF5JyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgb2JqOiBhbnkgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogT2JqZWN0LmtleXMoaW5wdXQub2JqIHx8IHt9KSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHZhbHVlc0F0b206IEF0b20gPSB7XG4gIG5hbWU6ICd2YWx1ZXMnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ29iaicsIHR5cGU6ICdvYmplY3QnIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnYXJyYXknIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyBvYmo6IGFueSB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBPYmplY3QudmFsdWVzKGlucHV0Lm9iaiB8fCB7fSkgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBtZXJnZUF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdtZXJnZScsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAnYScsIHR5cGU6ICdvYmplY3QnIH0sXG4gICAgICB7IG5hbWU6ICdiJywgdHlwZTogJ29iamVjdCcgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdvYmplY3QnIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyBhOiBhbnk7IGI6IGFueSB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiB7IC4uLmlucHV0LmEsIC4uLmlucHV0LmIgfSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZpbHRlckF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdmaWx0ZXInLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2FycmF5JywgdHlwZTogJ2FycmF5JywgZGVzY3JpcHRpb246ICdBcnJheSB0byBmaWx0ZXInIH0sXG4gICAgICB7IG5hbWU6ICdub2RlcycsIHR5cGU6ICdvYmplY3QnLCBkZXNjcmlwdGlvbjogJ0dyYXBoIHRvIGV4ZWN1dGUgZm9yIGVhY2ggaXRlbSwgc2hvdWxkIHJldHVybiBib29sZWFuJyB9LFxuICAgICAgeyBuYW1lOiAnaXRlbUtleScsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ0tleSB0byBzdG9yZSBjdXJyZW50IGl0ZW0gaW4gc3RvcmUnIH0sXG4gICAgICB7IG5hbWU6ICdpbmRleEtleScsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIGtleSB0byBzdG9yZSBjdXJyZW50IGluZGV4JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FycmF5JywgZGVzY3JpcHRpb246ICdGaWx0ZXJlZCBhcnJheScgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IFxuICAgIGFycmF5OiBhbnlbXTsgXG4gICAgbm9kZXM6IEdyYXBoOyBcbiAgICBpdGVtS2V5OiBzdHJpbmc7XG4gICAgaW5kZXhLZXk/OiBzdHJpbmc7XG4gIH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGlmICghY29udGV4dC5leGVjdXRlR3JhcGgpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFtdIH07XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0LmFycmF5KSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnSW5wdXQgaXMgbm90IGFuIGFycmF5JyB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0LmFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb250ZXh0LnN0b3JlLnNldChpbnB1dC5pdGVtS2V5LCBpbnB1dC5hcnJheVtpXSk7XG4gICAgICBpZiAoaW5wdXQuaW5kZXhLZXkpIHtcbiAgICAgICAgY29udGV4dC5zdG9yZS5zZXQoaW5wdXQuaW5kZXhLZXksIGkpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgY29udGV4dC5leGVjdXRlR3JhcGgoaW5wdXQubm9kZXMsIGNvbnRleHQuY3VycmVudFNjb3BlKTtcbiAgICAgIGNvbnN0IGxhc3ROb2RlSWQgPSBpbnB1dC5ub2Rlcy5vcmRlcltpbnB1dC5ub2Rlcy5vcmRlci5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IHNob3VsZEtlZXAgPSByZXN1bHRzW2xhc3ROb2RlSWRdO1xuICAgICAgXG4gICAgICBpZiAoc2hvdWxkS2VlcCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXN1bHQucHVzaChpbnB1dC5hcnJheVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHJlc3VsdCB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdmb3JtYXQnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ3RlbXBsYXRlJywgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnVGVtcGxhdGUgc3RyaW5nIHdpdGgge3BsYWNlaG9sZGVyfSBzeW50YXgnIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdGb3JtYXR0ZWQgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzIHJlcGxhY2VkJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgdGVtcGxhdGU6IHN0cmluZzsgW2tleTogc3RyaW5nXTogYW55IH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGxldCByZXN1bHQgPSBpbnB1dC50ZW1wbGF0ZTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICAgIGlmIChrZXkgPT09ICd0ZW1wbGF0ZScpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBgeyR7a2V5fX1gO1xuICAgICAgY29uc3Qgc3RyVmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMikgOiBTdHJpbmcodmFsdWUpO1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UobmV3IFJlZ0V4cChwbGFjZWhvbGRlci5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpLCAnZycpLCBzdHJWYWx1ZSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHJlc3VsdCB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRvTnVtQXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ3RvTnVtJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICd2YWx1ZScsIHR5cGU6ICdhbnknLCBkZXNjcmlwdGlvbjogJ1ZhbHVlIHRvIGNvbnZlcnQgdG8gbnVtYmVyJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ251bWJlcicsIGRlc2NyaXB0aW9uOiAnTnVtZXJpYyB2YWx1ZSBvciBOYU4gaWYgY29udmVyc2lvbiBmYWlscycgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IHZhbHVlOiBhbnkgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgY29uc3QgbnVtID0gTnVtYmVyKGlucHV0LnZhbHVlKTtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBudW0gfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBjb250YWluc0F0b206IEF0b20gPSB7XG4gIG5hbWU6ICdjb250YWlucycsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAndGV4dCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0cmluZyB0byBzZWFyY2ggaW4nIH0sXG4gICAgICB7IG5hbWU6ICdzZWFyY2gnLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdTdHJpbmcgdG8gc2VhcmNoIGZvcicgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdib29sZWFuJywgZGVzY3JpcHRpb246ICdUcnVlIGlmIHRleHQgY29udGFpbnMgc2VhcmNoJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgdGV4dDogc3RyaW5nOyBzZWFyY2g6IHN0cmluZyB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBTdHJpbmcoaW5wdXQudGV4dCkuaW5jbHVkZXMoU3RyaW5nKGlucHV0LnNlYXJjaCkpIH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRzV2l0aEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdzdGFydHNXaXRoJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICd0ZXh0JywgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnU3RyaW5nIHRvIGNoZWNrJyB9LFxuICAgICAgeyBuYW1lOiAncHJlZml4JywgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnUHJlZml4IHRvIGNoZWNrIGZvcicgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdib29sZWFuJywgZGVzY3JpcHRpb246ICdUcnVlIGlmIHRleHQgc3RhcnRzIHdpdGggcHJlZml4JyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgdGV4dDogc3RyaW5nOyBwcmVmaXg6IHN0cmluZyB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBTdHJpbmcoaW5wdXQudGV4dCkuc3RhcnRzV2l0aChTdHJpbmcoaW5wdXQucHJlZml4KSkgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCByZXBsYWNlQXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ3JlcGxhY2UnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ3RleHQnLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdTb3VyY2Ugc3RyaW5nJyB9LFxuICAgICAgeyBuYW1lOiAnc2VhcmNoJywgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnU3Vic3RyaW5nIHRvIGZpbmQnIH0sXG4gICAgICB7IG5hbWU6ICdyZXBsYWNlbWVudCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1JlcGxhY2VtZW50IHN0cmluZycgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0cmluZyB3aXRoIGZpcnN0IG9jY3VycmVuY2UgcmVwbGFjZWQnIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyB0ZXh0OiBzdHJpbmc7IHNlYXJjaDogc3RyaW5nOyByZXBsYWNlbWVudDogc3RyaW5nIH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFN0cmluZyhpbnB1dC50ZXh0KS5yZXBsYWNlKFN0cmluZyhpbnB1dC5zZWFyY2gpLCBTdHJpbmcoaW5wdXQucmVwbGFjZW1lbnQpKSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRyaW1BdG9tOiBBdG9tID0ge1xuICBuYW1lOiAndHJpbScsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAndGV4dCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0cmluZyB0byB0cmltJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnVHJpbW1lZCBzdHJpbmcnIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyB0ZXh0OiBzdHJpbmcgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogU3RyaW5nKGlucHV0LnRleHQpLnRyaW0oKSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRvTG93ZXJBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAndG9Mb3dlcicsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAndGV4dCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0cmluZyB0byBjb252ZXJ0JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnTG93ZXJjYXNlIHN0cmluZycgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IHRleHQ6IHN0cmluZyB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBTdHJpbmcoaW5wdXQudGV4dCkudG9Mb3dlckNhc2UoKSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHRvVXBwZXJBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAndG9VcHBlcicsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAndGV4dCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0cmluZyB0byBjb252ZXJ0JyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnVXBwZXJjYXNlIHN0cmluZycgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IHRleHQ6IHN0cmluZyB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBTdHJpbmcoaW5wdXQudGV4dCkudG9VcHBlckNhc2UoKSB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGdldEF0QXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ2dldEF0JyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdhcnJheScsIHR5cGU6ICdhcnJheScsIGRlc2NyaXB0aW9uOiAnQXJyYXkgdG8gaW5kZXggaW50bycgfSxcbiAgICAgIHsgbmFtZTogJ2luZGV4JywgdHlwZTogJ251bWJlcicsIGRlc2NyaXB0aW9uOiAnSW5kZXggdG8gcmV0cmlldmUnIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnYW55JywgZGVzY3JpcHRpb246ICdFbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleCcgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IGFycmF5OiBhbnlbXTsgaW5kZXg6IG51bWJlciB9LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQuYXJyYXkpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdJbnB1dCBpcyBub3QgYW4gYXJyYXknIH07XG4gICAgfVxuICAgIGNvbnN0IGlkeCA9IE51bWJlcihpbnB1dC5pbmRleCk7XG4gICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IGlucHV0LmFycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogbnVsbCB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBpbnB1dC5hcnJheVtpZHhdIH07XG4gIH0sXG59O1xuIl19
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setAtom = exports.getAtom = void 0;
|
|
4
|
+
exports.getAtom = {
|
|
5
|
+
name: 'get',
|
|
6
|
+
version: '1.0.0',
|
|
7
|
+
meta: {
|
|
8
|
+
input: [
|
|
9
|
+
{ name: 'key', type: 'string', description: 'State key name' }
|
|
10
|
+
],
|
|
11
|
+
output: { type: 'any', description: 'Stored value' }
|
|
12
|
+
},
|
|
13
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
14
|
+
execute: async (input, context) => {
|
|
15
|
+
const value = context.store.get(input.key);
|
|
16
|
+
return { success: true, data: value ?? null };
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
exports.setAtom = {
|
|
20
|
+
name: 'set',
|
|
21
|
+
version: '1.0.0',
|
|
22
|
+
meta: {
|
|
23
|
+
input: [
|
|
24
|
+
{ name: 'key', type: 'string', description: 'State key name' },
|
|
25
|
+
{ name: 'value', type: 'any', description: 'Value to store' }
|
|
26
|
+
],
|
|
27
|
+
output: { type: 'any', description: 'The value that was set' }
|
|
28
|
+
},
|
|
29
|
+
characteristics: { stateless: true, atomic: true, composable: true },
|
|
30
|
+
execute: async (input, context) => {
|
|
31
|
+
context.store.set(input.key, input.value);
|
|
32
|
+
return { success: true, data: input.value };
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXRvbXMvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSxPQUFPLEdBQVM7SUFDM0IsSUFBSSxFQUFFLEtBQUs7SUFDWCxPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUU7UUFDSixLQUFLLEVBQUU7WUFDTCxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUU7U0FDL0Q7UUFDRCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUU7S0FDckQ7SUFDRCxlQUFlLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtJQUNwRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQXNCLEVBQUUsT0FBZ0IsRUFBbUIsRUFBRTtRQUMzRSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0NBQ0YsQ0FBQztBQUVXLFFBQUEsT0FBTyxHQUFTO0lBQzNCLElBQUksRUFBRSxLQUFLO0lBQ1gsT0FBTyxFQUFFLE9BQU87SUFDaEIsSUFBSSxFQUFFO1FBQ0osS0FBSyxFQUFFO1lBQ0wsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFO1lBQzlELEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRTtTQUM5RDtRQUNELE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLHdCQUF3QixFQUFFO0tBQy9EO0lBQ0QsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7SUFDcEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFrQyxFQUFFLE9BQWdCLEVBQW1CLEVBQUU7UUFDdkYsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0b20sIENvbnRleHQsIFJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGdldEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdnZXQnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ1N0YXRlIGtleSBuYW1lJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FueScsIGRlc2NyaXB0aW9uOiAnU3RvcmVkIHZhbHVlJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsga2V5OiBzdHJpbmcgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250ZXh0LnN0b3JlLmdldChpbnB1dC5rZXkpO1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHZhbHVlID8/IG51bGwgfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAnc2V0JyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdrZXknLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdTdGF0ZSBrZXkgbmFtZScgfSxcbiAgICAgIHsgbmFtZTogJ3ZhbHVlJywgdHlwZTogJ2FueScsIGRlc2NyaXB0aW9uOiAnVmFsdWUgdG8gc3RvcmUnIH1cbiAgICBdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnYW55JywgZGVzY3JpcHRpb246ICdUaGUgdmFsdWUgdGhhdCB3YXMgc2V0JyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBhbnkgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgY29udGV4dC5zdG9yZS5zZXQoaW5wdXQua2V5LCBpbnB1dC52YWx1ZSk7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogaW5wdXQudmFsdWUgfTtcbiAgfSxcbn07XG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Atom } from '../types';
|
|
2
|
+
export declare const getTelemetryStatsAtom: Atom;
|
|
3
|
+
export declare const resetTelemetryAtom: Atom;
|
|
4
|
+
export declare const flushTelemetryAtom: Atom;
|
|
5
|
+
export declare const getTelemetryHistoryAtom: Atom;
|
|
6
|
+
export declare const analyzeTelemetryAtom: Atom;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeTelemetryAtom = exports.getTelemetryHistoryAtom = exports.flushTelemetryAtom = exports.resetTelemetryAtom = exports.getTelemetryStatsAtom = void 0;
|
|
4
|
+
exports.getTelemetryStatsAtom = {
|
|
5
|
+
name: 'getTelemetryStats',
|
|
6
|
+
version: '1.0.0',
|
|
7
|
+
meta: {
|
|
8
|
+
input: [],
|
|
9
|
+
output: { type: 'array', description: 'Aggregated telemetry statistics per atom' }
|
|
10
|
+
},
|
|
11
|
+
characteristics: { stateless: false, atomic: true, composable: true },
|
|
12
|
+
execute: async (_input, context) => {
|
|
13
|
+
if (!context.runtime) {
|
|
14
|
+
return { success: false, error: 'Runtime not available' };
|
|
15
|
+
}
|
|
16
|
+
const stats = context.runtime.getTelemetryStats();
|
|
17
|
+
return { success: true, data: stats };
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
exports.resetTelemetryAtom = {
|
|
21
|
+
name: 'resetTelemetry',
|
|
22
|
+
version: '1.0.0',
|
|
23
|
+
meta: {
|
|
24
|
+
input: [],
|
|
25
|
+
output: { type: 'null', description: 'Clears all telemetry data' }
|
|
26
|
+
},
|
|
27
|
+
characteristics: { stateless: false, atomic: true, composable: true },
|
|
28
|
+
execute: async (_input, context) => {
|
|
29
|
+
if (!context.runtime) {
|
|
30
|
+
return { success: false, error: 'Runtime not available' };
|
|
31
|
+
}
|
|
32
|
+
context.runtime.resetTelemetry();
|
|
33
|
+
return { success: true, data: null };
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
exports.flushTelemetryAtom = {
|
|
37
|
+
name: 'flushTelemetry',
|
|
38
|
+
version: '1.0.0',
|
|
39
|
+
meta: {
|
|
40
|
+
input: [],
|
|
41
|
+
output: { type: 'object', description: 'Flush result with snapshot info' }
|
|
42
|
+
},
|
|
43
|
+
characteristics: { stateless: false, atomic: true, composable: true },
|
|
44
|
+
execute: async (_input, context) => {
|
|
45
|
+
if (!context.runtime) {
|
|
46
|
+
return { success: false, error: 'Runtime not available' };
|
|
47
|
+
}
|
|
48
|
+
const snapshot = context.runtime.flushTelemetry();
|
|
49
|
+
return { success: true, data: { flushed: true, timestamp: snapshot.timestamp } };
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.getTelemetryHistoryAtom = {
|
|
53
|
+
name: 'getTelemetryHistory',
|
|
54
|
+
version: '1.0.0',
|
|
55
|
+
meta: {
|
|
56
|
+
input: [],
|
|
57
|
+
output: { type: 'array', description: 'Historical telemetry snapshots' }
|
|
58
|
+
},
|
|
59
|
+
characteristics: { stateless: false, atomic: true, composable: true },
|
|
60
|
+
execute: async (_input, context) => {
|
|
61
|
+
if (!context.runtime) {
|
|
62
|
+
return { success: false, error: 'Runtime not available' };
|
|
63
|
+
}
|
|
64
|
+
const history = context.runtime.getTelemetryHistory();
|
|
65
|
+
return { success: true, data: history };
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
exports.analyzeTelemetryAtom = {
|
|
69
|
+
name: 'analyzeTelemetry',
|
|
70
|
+
version: '1.0.0',
|
|
71
|
+
meta: {
|
|
72
|
+
input: [],
|
|
73
|
+
output: { type: 'object', description: 'Telemetry analysis with summary, top atoms, error hotspots, and graph usage' }
|
|
74
|
+
},
|
|
75
|
+
characteristics: { stateless: false, atomic: true, composable: true },
|
|
76
|
+
execute: async (_input, context) => {
|
|
77
|
+
if (!context.runtime) {
|
|
78
|
+
return { success: false, error: 'Runtime not available' };
|
|
79
|
+
}
|
|
80
|
+
const stats = context.runtime.getTelemetryStats();
|
|
81
|
+
if (stats.length === 0) {
|
|
82
|
+
return { success: true, data: { found: false, message: 'No telemetry data available yet' } };
|
|
83
|
+
}
|
|
84
|
+
const totalCalls = stats.reduce((sum, s) => sum + s.count, 0);
|
|
85
|
+
const totalErrors = stats.reduce((sum, s) => sum + s.errorCount, 0);
|
|
86
|
+
const avgDuration = Math.round(stats.reduce((sum, s) => sum + s.avgDuration * s.count, 0) / totalCalls);
|
|
87
|
+
const topAtoms = [...stats]
|
|
88
|
+
.sort((a, b) => b.count - a.count)
|
|
89
|
+
.slice(0, 10);
|
|
90
|
+
const errorHotspots = stats
|
|
91
|
+
.filter(s => s.errorRate > 0)
|
|
92
|
+
.sort((a, b) => b.errorRate - a.errorRate);
|
|
93
|
+
const graphUsage = stats.reduce((acc, s) => {
|
|
94
|
+
for (const g of s.graphs) {
|
|
95
|
+
if (!acc[g])
|
|
96
|
+
acc[g] = { calls: 0, errors: 0 };
|
|
97
|
+
acc[g].calls += s.count;
|
|
98
|
+
acc[g].errors += s.errorCount;
|
|
99
|
+
}
|
|
100
|
+
return acc;
|
|
101
|
+
}, {});
|
|
102
|
+
return {
|
|
103
|
+
success: true,
|
|
104
|
+
data: {
|
|
105
|
+
found: true,
|
|
106
|
+
summary: {
|
|
107
|
+
totalAtoms: stats.length,
|
|
108
|
+
totalCalls,
|
|
109
|
+
totalErrors,
|
|
110
|
+
errorRate: totalCalls > 0
|
|
111
|
+
? Math.round((totalErrors / totalCalls) * 10000) / 100
|
|
112
|
+
: 0,
|
|
113
|
+
avgDuration,
|
|
114
|
+
},
|
|
115
|
+
topAtoms: topAtoms.map(a => ({
|
|
116
|
+
name: a.atom,
|
|
117
|
+
calls: a.count,
|
|
118
|
+
avgDuration: a.avgDuration,
|
|
119
|
+
errorRate: a.errorRate,
|
|
120
|
+
})),
|
|
121
|
+
errorHotspots: errorHotspots.map(a => ({
|
|
122
|
+
name: a.atom,
|
|
123
|
+
errorRate: a.errorRate,
|
|
124
|
+
errorCount: a.errorCount,
|
|
125
|
+
totalCalls: a.count,
|
|
126
|
+
})),
|
|
127
|
+
graphUsage: Object.entries(graphUsage)
|
|
128
|
+
.map(([name, data]) => ({ name, ...data }))
|
|
129
|
+
.sort((a, b) => b.calls - a.calls),
|
|
130
|
+
timestamp: Date.now(),
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F0b21zL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFYSxRQUFBLHFCQUFxQixHQUFTO0lBQ3pDLElBQUksRUFBRSxtQkFBbUI7SUFDekIsT0FBTyxFQUFFLE9BQU87SUFDaEIsSUFBSSxFQUFFO1FBQ0osS0FBSyxFQUFFLEVBQUU7UUFDVCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSwwQ0FBMEMsRUFBRTtLQUNuRjtJQUNELGVBQWUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO0lBQ3JFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBVyxFQUFFLE9BQWdCLEVBQW1CLEVBQUU7UUFDaEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBQ0YsQ0FBQztBQUVXLFFBQUEsa0JBQWtCLEdBQVM7SUFDdEMsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUU7UUFDSixLQUFLLEVBQUUsRUFBRTtRQUNULE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLDJCQUEyQixFQUFFO0tBQ25FO0lBQ0QsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFB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LFdBQVc7aUJBQ1o7Z0JBQ0QsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMzQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7b0JBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO29CQUNkLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVztvQkFDMUIsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO2lCQUN2QixDQUFDLENBQUM7Z0JBQ0gsYUFBYSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7b0JBQ1osU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO29CQUN0QixVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVU7b0JBQ3hCLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSztpQkFDcEIsQ0FBQyxDQUFDO2dCQUNILFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztxQkFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUMxQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2FBQ3RCO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXRvbSwgQ29udGV4dCwgUmVzdWx0LCBUZWxlbWV0cnlTdGF0cyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGdldFRlbGVtZXRyeVN0YXRzQXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ2dldFRlbGVtZXRyeVN0YXRzJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2FycmF5JywgZGVzY3JpcHRpb246ICdBZ2dyZWdhdGVkIHRlbGVtZXRyeSBzdGF0aXN0aWNzIHBlciBhdG9tJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IGZhbHNlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKF9pbnB1dDogYW55LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBpZiAoIWNvbnRleHQucnVudGltZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnUnVudGltZSBub3QgYXZhaWxhYmxlJyB9O1xuICAgIH1cbiAgICBjb25zdCBzdGF0cyA9IGNvbnRleHQucnVudGltZS5nZXRUZWxlbWV0cnlTdGF0cygpO1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHN0YXRzIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXNldFRlbGVtZXRyeUF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdyZXNldFRlbGVtZXRyeScsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW10sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdudWxsJywgZGVzY3JpcHRpb246ICdDbGVhcnMgYWxsIHRlbGVtZXRyeSBkYXRhJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IGZhbHNlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKF9pbnB1dDogYW55LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBpZiAoIWNvbnRleHQucnVudGltZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnUnVudGltZSBub3QgYXZhaWxhYmxlJyB9O1xuICAgIH1cbiAgICBjb250ZXh0LnJ1bnRpbWUucmVzZXRUZWxlbWV0cnkoKTtcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBudWxsIH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBmbHVzaFRlbGVtZXRyeUF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdmbHVzaFRlbGVtZXRyeScsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW10sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdvYmplY3QnLCBkZXNjcmlwdGlvbjogJ0ZsdXNoIHJlc3VsdCB3aXRoIHNuYXBzaG90IGluZm8nIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogZmFsc2UsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoX2lucHV0OiBhbnksIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGlmICghY29udGV4dC5ydW50aW1lKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdSdW50aW1lIG5vdCBhdmFpbGFibGUnIH07XG4gICAgfVxuICAgIGNvbnN0IHNuYXBzaG90ID0gY29udGV4dC5ydW50aW1lLmZsdXNoVGVsZW1ldHJ5KCk7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogeyBmbHVzaGVkOiB0cnVlLCB0aW1lc3RhbXA6IHNuYXBzaG90LnRpbWVzdGFtcCB9IH07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZWxlbWV0cnlIaXN0b3J5QXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ2dldFRlbGVtZXRyeUhpc3RvcnknLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtdLFxuICAgIG91dHB1dDogeyB0eXBlOiAnYXJyYXknLCBkZXNjcmlwdGlvbjogJ0hpc3RvcmljYWwgdGVsZW1ldHJ5IHNuYXBzaG90cycgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiBmYWxzZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQ6IGFueSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgaWYgKCFjb250ZXh0LnJ1bnRpbWUpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1J1bnRpbWUgbm90IGF2YWlsYWJsZScgfTtcbiAgICB9XG4gICAgY29uc3QgaGlzdG9yeSA9IGNvbnRleHQucnVudGltZS5nZXRUZWxlbWV0cnlIaXN0b3J5KCk7XG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogaGlzdG9yeSB9O1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgYW5hbHl6ZVRlbGVtZXRyeUF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdhbmFseXplVGVsZW1ldHJ5JyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ29iamVjdCcsIGRlc2NyaXB0aW9uOiAnVGVsZW1ldHJ5IGFuYWx5c2lzIHdpdGggc3VtbWFyeSwgdG9wIGF0b21zLCBlcnJvciBob3RzcG90cywgYW5kIGdyYXBoIHVzYWdlJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IGZhbHNlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKF9pbnB1dDogYW55LCBjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBpZiAoIWNvbnRleHQucnVudGltZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnUnVudGltZSBub3QgYXZhaWxhYmxlJyB9O1xuICAgIH1cbiAgICBjb25zdCBzdGF0czogVGVsZW1ldHJ5U3RhdHNbXSA9IGNvbnRleHQucnVudGltZS5nZXRUZWxlbWV0cnlTdGF0cygpO1xuXG4gICAgaWYgKHN0YXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogeyBmb3VuZDogZmFsc2UsIG1lc3NhZ2U6ICdObyB0ZWxlbWV0cnkgZGF0YSBhdmFpbGFibGUgeWV0JyB9IH07XG4gICAgfVxuXG4gICAgY29uc3QgdG90YWxDYWxscyA9IHN0YXRzLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyBzLmNvdW50LCAwKTtcbiAgICBjb25zdCB0b3RhbEVycm9ycyA9IHN0YXRzLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyBzLmVycm9yQ291bnQsIDApO1xuICAgIGNvbnN0IGF2Z0R1cmF0aW9uID0gTWF0aC5yb3VuZChcbiAgICAgIHN0YXRzLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyBzLmF2Z0R1cmF0aW9uICogcy5jb3VudCwgMCkgLyB0b3RhbENhbGxzXG4gICAgKTtcblxuICAgIGNvbnN0IHRvcEF0b21zID0gWy4uLnN0YXRzXVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY291bnQgLSBhLmNvdW50KVxuICAgICAgLnNsaWNlKDAsIDEwKTtcblxuICAgIGNvbnN0IGVycm9ySG90c3BvdHMgPSBzdGF0c1xuICAgICAgLmZpbHRlcihzID0+IHMuZXJyb3JSYXRlID4gMClcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmVycm9yUmF0ZSAtIGEuZXJyb3JSYXRlKTtcblxuICAgIGNvbnN0IGdyYXBoVXNhZ2UgPSBzdGF0cy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgeyBjYWxsczogbnVtYmVyOyBlcnJvcnM6IG51bWJlciB9Pj4oXG4gICAgICAoYWNjLCBzKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZyBvZiBzLmdyYXBocykge1xuICAgICAgICAgIGlmICghYWNjW2ddKSBhY2NbZ10gPSB7IGNhbGxzOiAwLCBlcnJvcnM6IDAgfTtcbiAgICAgICAgICBhY2NbZ10uY2FsbHMgKz0gcy5jb3VudDtcbiAgICAgICAgICBhY2NbZ10uZXJyb3JzICs9IHMuZXJyb3JDb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge31cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZvdW5kOiB0cnVlLFxuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgdG90YWxBdG9tczogc3RhdHMubGVuZ3RoLFxuICAgICAgICAgIHRvdGFsQ2FsbHMsXG4gICAgICAgICAgdG90YWxFcnJvcnMsXG4gICAgICAgICAgZXJyb3JSYXRlOiB0b3RhbENhbGxzID4gMFxuICAgICAgICAgICAgPyBNYXRoLnJvdW5kKCh0b3RhbEVycm9ycyAvIHRvdGFsQ2FsbHMpICogMTAwMDApIC8gMTAwXG4gICAgICAgICAgICA6IDAsXG4gICAgICAgICAgYXZnRHVyYXRpb24sXG4gICAgICAgIH0sXG4gICAgICAgIHRvcEF0b21zOiB0b3BBdG9tcy5tYXAoYSA9PiAoe1xuICAgICAgICAgIG5hbWU6IGEuYXRvbSxcbiAgICAgICAgICBjYWxsczogYS5jb3VudCxcbiAgICAgICAgICBhdmdEdXJhdGlvbjogYS5hdmdEdXJhdGlvbixcbiAgICAgICAgICBlcnJvclJhdGU6IGEuZXJyb3JSYXRlLFxuICAgICAgICB9KSksXG4gICAgICAgIGVycm9ySG90c3BvdHM6IGVycm9ySG90c3BvdHMubWFwKGEgPT4gKHtcbiAgICAgICAgICBuYW1lOiBhLmF0b20sXG4gICAgICAgICAgZXJyb3JSYXRlOiBhLmVycm9yUmF0ZSxcbiAgICAgICAgICBlcnJvckNvdW50OiBhLmVycm9yQ291bnQsXG4gICAgICAgICAgdG90YWxDYWxsczogYS5jb3VudCxcbiAgICAgICAgfSkpLFxuICAgICAgICBncmFwaFVzYWdlOiBPYmplY3QuZW50cmllcyhncmFwaFVzYWdlKVxuICAgICAgICAgIC5tYXAoKFtuYW1lLCBkYXRhXSkgPT4gKHsgbmFtZSwgLi4uZGF0YSB9KSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5jYWxscyAtIGEuY2FsbHMpLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbiJdfQ==
|