@grnsft/if 1.1.0 → 1.1.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.
@@ -52,56 +52,56 @@ export declare const manifestSchema: z.ZodObject<{
52
52
  unit: z.ZodString;
53
53
  description: z.ZodString;
54
54
  'aggregation-method': z.ZodObject<{
55
- time: z.ZodEnum<["sum", "avg", "none", "copy"]>;
56
- component: z.ZodEnum<["sum", "avg", "none", "copy"]>;
55
+ time: z.ZodEnum<["sum", "avg", "none", "copy", "min", "max", "median"]>;
56
+ component: z.ZodEnum<["sum", "avg", "none", "copy", "min", "max", "median"]>;
57
57
  }, "strip", z.ZodTypeAny, {
58
- time: "sum" | "avg" | "none" | "copy";
59
- component: "sum" | "avg" | "none" | "copy";
58
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
59
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
60
60
  }, {
61
- time: "sum" | "avg" | "none" | "copy";
62
- component: "sum" | "avg" | "none" | "copy";
61
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
62
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
63
63
  }>;
64
64
  }, "strip", z.ZodTypeAny, {
65
65
  unit: string;
66
66
  description: string;
67
67
  'aggregation-method': {
68
- time: "sum" | "avg" | "none" | "copy";
69
- component: "sum" | "avg" | "none" | "copy";
68
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
69
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
70
70
  };
71
71
  }, {
72
72
  unit: string;
73
73
  description: string;
74
74
  'aggregation-method': {
75
- time: "sum" | "avg" | "none" | "copy";
76
- component: "sum" | "avg" | "none" | "copy";
75
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
76
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
77
77
  };
78
78
  }>>>>;
79
79
  outputs: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
80
80
  unit: z.ZodString;
81
81
  description: z.ZodString;
82
82
  'aggregation-method': z.ZodObject<{
83
- time: z.ZodEnum<["sum", "avg", "none", "copy"]>;
84
- component: z.ZodEnum<["sum", "avg", "none", "copy"]>;
83
+ time: z.ZodEnum<["sum", "avg", "none", "copy", "min", "max", "median"]>;
84
+ component: z.ZodEnum<["sum", "avg", "none", "copy", "min", "max", "median"]>;
85
85
  }, "strip", z.ZodTypeAny, {
86
- time: "sum" | "avg" | "none" | "copy";
87
- component: "sum" | "avg" | "none" | "copy";
86
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
87
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
88
88
  }, {
89
- time: "sum" | "avg" | "none" | "copy";
90
- component: "sum" | "avg" | "none" | "copy";
89
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
90
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
91
91
  }>;
92
92
  }, "strip", z.ZodTypeAny, {
93
93
  unit: string;
94
94
  description: string;
95
95
  'aggregation-method': {
96
- time: "sum" | "avg" | "none" | "copy";
97
- component: "sum" | "avg" | "none" | "copy";
96
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
97
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
98
98
  };
99
99
  }, {
100
100
  unit: string;
101
101
  description: string;
102
102
  'aggregation-method': {
103
- time: "sum" | "avg" | "none" | "copy";
104
- component: "sum" | "avg" | "none" | "copy";
103
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
104
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
105
105
  };
106
106
  }>>>>;
107
107
  }, "strip", z.ZodTypeAny, {
@@ -109,16 +109,16 @@ export declare const manifestSchema: z.ZodObject<{
109
109
  unit: string;
110
110
  description: string;
111
111
  'aggregation-method': {
112
- time: "sum" | "avg" | "none" | "copy";
113
- component: "sum" | "avg" | "none" | "copy";
112
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
113
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
114
114
  };
115
115
  }> | null | undefined;
116
116
  outputs?: Record<string, {
117
117
  unit: string;
118
118
  description: string;
119
119
  'aggregation-method': {
120
- time: "sum" | "avg" | "none" | "copy";
121
- component: "sum" | "avg" | "none" | "copy";
120
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
121
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
122
122
  };
123
123
  }> | null | undefined;
124
124
  }, {
@@ -126,16 +126,16 @@ export declare const manifestSchema: z.ZodObject<{
126
126
  unit: string;
127
127
  description: string;
128
128
  'aggregation-method': {
129
- time: "sum" | "avg" | "none" | "copy";
130
- component: "sum" | "avg" | "none" | "copy";
129
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
130
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
131
131
  };
132
132
  }> | null | undefined;
133
133
  outputs?: Record<string, {
134
134
  unit: string;
135
135
  description: string;
136
136
  'aggregation-method': {
137
- time: "sum" | "avg" | "none" | "copy";
138
- component: "sum" | "avg" | "none" | "copy";
137
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
138
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
139
139
  };
140
140
  }> | null | undefined;
141
141
  }>>;
@@ -149,16 +149,16 @@ export declare const manifestSchema: z.ZodObject<{
149
149
  unit: string;
150
150
  description: string;
151
151
  'aggregation-method': {
152
- time: "sum" | "avg" | "none" | "copy";
153
- component: "sum" | "avg" | "none" | "copy";
152
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
153
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
154
154
  };
155
155
  }> | null | undefined;
156
156
  outputs?: Record<string, {
157
157
  unit: string;
158
158
  description: string;
159
159
  'aggregation-method': {
160
- time: "sum" | "avg" | "none" | "copy";
161
- component: "sum" | "avg" | "none" | "copy";
160
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
161
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
162
162
  };
163
163
  }> | null | undefined;
164
164
  } | undefined;
@@ -172,16 +172,16 @@ export declare const manifestSchema: z.ZodObject<{
172
172
  unit: string;
173
173
  description: string;
174
174
  'aggregation-method': {
175
- time: "sum" | "avg" | "none" | "copy";
176
- component: "sum" | "avg" | "none" | "copy";
175
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
176
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
177
177
  };
178
178
  }> | null | undefined;
179
179
  outputs?: Record<string, {
180
180
  unit: string;
181
181
  description: string;
182
182
  'aggregation-method': {
183
- time: "sum" | "avg" | "none" | "copy";
184
- component: "sum" | "avg" | "none" | "copy";
183
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
184
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
185
185
  };
186
186
  }> | null | undefined;
187
187
  } | undefined;
@@ -197,16 +197,16 @@ export declare const manifestSchema: z.ZodObject<{
197
197
  unit: string;
198
198
  description: string;
199
199
  'aggregation-method': {
200
- time: "sum" | "avg" | "none" | "copy";
201
- component: "sum" | "avg" | "none" | "copy";
200
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
201
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
202
202
  };
203
203
  }> | null | undefined;
204
204
  outputs?: Record<string, {
205
205
  unit: string;
206
206
  description: string;
207
207
  'aggregation-method': {
208
- time: "sum" | "avg" | "none" | "copy";
209
- component: "sum" | "avg" | "none" | "copy";
208
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
209
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
210
210
  };
211
211
  }> | null | undefined;
212
212
  } | undefined;
@@ -222,16 +222,16 @@ export declare const manifestSchema: z.ZodObject<{
222
222
  unit: string;
223
223
  description: string;
224
224
  'aggregation-method': {
225
- time: "sum" | "avg" | "none" | "copy";
226
- component: "sum" | "avg" | "none" | "copy";
225
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
226
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
227
227
  };
228
228
  }> | null | undefined;
229
229
  outputs?: Record<string, {
230
230
  unit: string;
231
231
  description: string;
232
232
  'aggregation-method': {
233
- time: "sum" | "avg" | "none" | "copy";
234
- component: "sum" | "avg" | "none" | "copy";
233
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
234
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
235
235
  };
236
236
  }> | null | undefined;
237
237
  } | undefined;
@@ -302,16 +302,16 @@ export declare const manifestSchema: z.ZodObject<{
302
302
  unit: string;
303
303
  description: string;
304
304
  'aggregation-method': {
305
- time: "sum" | "avg" | "none" | "copy";
306
- component: "sum" | "avg" | "none" | "copy";
305
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
306
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
307
307
  };
308
308
  }> | null | undefined;
309
309
  outputs?: Record<string, {
310
310
  unit: string;
311
311
  description: string;
312
312
  'aggregation-method': {
313
- time: "sum" | "avg" | "none" | "copy";
314
- component: "sum" | "avg" | "none" | "copy";
313
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
314
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
315
315
  };
316
316
  }> | null | undefined;
317
317
  } | undefined;
@@ -357,16 +357,16 @@ export declare const manifestSchema: z.ZodObject<{
357
357
  unit: string;
358
358
  description: string;
359
359
  'aggregation-method': {
360
- time: "sum" | "avg" | "none" | "copy";
361
- component: "sum" | "avg" | "none" | "copy";
360
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
361
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
362
362
  };
363
363
  }> | null | undefined;
364
364
  outputs?: Record<string, {
365
365
  unit: string;
366
366
  description: string;
367
367
  'aggregation-method': {
368
- time: "sum" | "avg" | "none" | "copy";
369
- component: "sum" | "avg" | "none" | "copy";
368
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
369
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
370
370
  };
371
371
  }> | null | undefined;
372
372
  } | undefined;
@@ -416,16 +416,16 @@ export declare const validateManifest: (manifest: any) => {
416
416
  unit: string;
417
417
  description: string;
418
418
  'aggregation-method': {
419
- time: "sum" | "avg" | "none" | "copy";
420
- component: "sum" | "avg" | "none" | "copy";
419
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
420
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
421
421
  };
422
422
  }> | null | undefined;
423
423
  outputs?: Record<string, {
424
424
  unit: string;
425
425
  description: string;
426
426
  'aggregation-method': {
427
- time: "sum" | "avg" | "none" | "copy";
428
- component: "sum" | "avg" | "none" | "copy";
427
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
428
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
429
429
  };
430
430
  }> | null | undefined;
431
431
  } | undefined;
@@ -17,16 +17,16 @@ export declare const loadIfDiffFiles: (params: LoadDiffParams) => Promise<{
17
17
  unit: string;
18
18
  description: string;
19
19
  'aggregation-method': {
20
- time: "sum" | "avg" | "none" | "copy";
21
- component: "sum" | "avg" | "none" | "copy";
20
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
21
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
22
22
  };
23
23
  }> | null | undefined;
24
24
  outputs?: Record<string, {
25
25
  unit: string;
26
26
  description: string;
27
27
  'aggregation-method': {
28
- time: "sum" | "avg" | "none" | "copy";
29
- component: "sum" | "avg" | "none" | "copy";
28
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
29
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
30
30
  };
31
31
  }> | null | undefined;
32
32
  } | undefined;
@@ -12,16 +12,16 @@ export declare const parseIFCheckMetadataArgs: () => Promise<{
12
12
  unit: string;
13
13
  description: string;
14
14
  'aggregation-method': {
15
- time: "sum" | "avg" | "none" | "copy";
16
- component: "sum" | "avg" | "none" | "copy";
15
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
16
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
17
17
  };
18
18
  }> | null | undefined;
19
19
  outputs?: Record<string, {
20
20
  unit: string;
21
21
  description: string;
22
22
  'aggregation-method': {
23
- time: "sum" | "avg" | "none" | "copy";
24
- component: "sum" | "avg" | "none" | "copy";
23
+ time: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
24
+ component: "sum" | "avg" | "none" | "copy" | "min" | "max" | "median";
25
25
  };
26
26
  }> | null | undefined;
27
27
  } | undefined;
@@ -98,6 +98,10 @@ exports.TimeSync = (0, interfaces_1.PluginFactory)({
98
98
  }
99
99
  throw new InvalidDateInInputError(INVALID_DATE_TYPE(date));
100
100
  };
101
+ const isConstantMethod = (method) => method === 'copy' ||
102
+ method === 'min' ||
103
+ method === 'max' ||
104
+ method === 'median';
101
105
  /**
102
106
  * Calculates minimal factor.
103
107
  */
@@ -172,7 +176,7 @@ exports.TimeSync = (0, interfaces_1.PluginFactory)({
172
176
  acc[metric] = 0;
173
177
  return acc;
174
178
  }
175
- if (aggregationParams.time === 'copy') {
179
+ if (isConstantMethod(aggregationParams.time)) {
176
180
  acc[metric] = input[metric];
177
181
  return acc;
178
182
  }
@@ -230,7 +234,7 @@ exports.TimeSync = (0, interfaces_1.PluginFactory)({
230
234
  acc[metric] += input[metric];
231
235
  return;
232
236
  }
233
- if (aggregationParams.time === 'copy') {
237
+ if (isConstantMethod(aggregationParams.time)) {
234
238
  acc[metric] = input[metric];
235
239
  return;
236
240
  }
@@ -368,4 +372,4 @@ exports.TimeSync = (0, interfaces_1.PluginFactory)({
368
372
  return resampleInputs(sortedInputs, timeParams);
369
373
  },
370
374
  });
371
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL3RpbWUtc3luYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFFdkMsaUNBQXVFO0FBQ3ZFLDZCQUFzQjtBQUN0QixpREFBNkM7QUFVN0Msa0VBQTBEO0FBRTFELHlDQUFxQztBQUNyQyxtREFBMEQ7QUFDMUQsMkRBQXlEO0FBRXpELGdCQUFRLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUU3QixNQUFNLEVBQ0osV0FBVyxFQUNYLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ2xCLEdBQUcsY0FBTSxDQUFDO0FBRVgsTUFBTSxFQUNKLHFDQUFxQyxFQUNyQyxpQ0FBaUMsRUFDakMsbUNBQW1DLEVBQ25DLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDekIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixjQUFjLEdBQ2YsR0FBRyxnQkFBTyxDQUFDO0FBRVo7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDVSxRQUFBLFFBQVEsR0FBRyxJQUFBLDBCQUFhLEVBQXVCO0lBQzFELFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRTtZQUNOLFNBQVMsRUFBRTtnQkFDVCxXQUFXLEVBQUUsK0NBQStDO2dCQUM1RCxJQUFJLEVBQUUsU0FBUztnQkFDZixvQkFBb0IsRUFBRTtvQkFDcEIsSUFBSSxFQUFFLE1BQU07b0JBQ1osU0FBUyxFQUFFLE1BQU07aUJBQ2xCO2FBQ0Y7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsV0FBVyxFQUFFLHFDQUFxQztnQkFDbEQsSUFBSSxFQUFFLFNBQVM7Z0JBQ2Ysb0JBQW9CLEVBQUU7b0JBQ3BCLElBQUksRUFBRSxLQUFLO29CQUNYLFNBQVMsRUFBRSxNQUFNO2lCQUNsQjthQUNGO1NBQ0Y7S0FDRjtJQUNELGdCQUFnQixFQUFFLENBQUMsTUFBb0IsRUFBd0IsRUFBRTtRQUMvRCxJ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Q0FBQztDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNEYXRlfSBmcm9tICdub2RlOnV0aWwvdHlwZXMnO1xuXG5pbXBvcnQge1NldHRpbmdzLCBEYXRlVGltZSwgRGF0ZVRpbWVNYXliZVZhbGlkLCBJbnRlcnZhbH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHtFUlJPUlN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS91dGlscyc7XG5pbXBvcnQge1xuICBQbHVnaW5QYXJhbXMsXG4gIFBhZGRpbmdSZWNlaXB0LFxuICBNYXBwaW5nUGFyYW1zLFxuICBDb25maWdQYXJhbXMsXG4gIFRpbWVQYXJhbXMsXG4gIFRpbWVOb3JtYWxpemVyQ29uZmlnLFxufSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvdHlwZXMnO1xuXG5pbXBvcnQge3ZhbGlkYXRlfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdXRpbC92YWxpZGF0aW9ucyc7XG5cbmltcG9ydCB7U1RSSU5HU30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7Z2V0QWdncmVnYXRpb25JbmZvRm9yfSBmcm9tICcuLi8uLi9saWIvYWdncmVnYXRlJztcbmltcG9ydCB7UGx1Z2luRmFjdG9yeX0gZnJvbSAnQGdybnNmdC9pZi1jb3JlL2ludGVyZmFjZXMnO1xuXG5TZXR0aW5ncy5kZWZhdWx0Wm9uZSA9ICd1dGMnO1xuXG5jb25zdCB7XG4gIENvbmZpZ0Vycm9yLFxuICBJbnZhbGlkRGF0ZUluSW5wdXRFcnJvcixcbiAgSW52YWxpZFBhZGRpbmdFcnJvcixcbiAgSW52YWxpZElucHV0RXJyb3IsXG59ID0gRVJST1JTO1xuXG5jb25zdCB7XG4gIElOQ09NUEFUSUJMRV9SRVNPTFVUSU9OX1dJVEhfSU5URVJWQUwsXG4gIElOQ09NUEFUSUJMRV9SRVNPTFVUSU9OX1dJVEhfR0FQUyxcbiAgSU5DT01QQVRJQkxFX1JFU09MVVRJT05fV0lUSF9JTlBVVFMsXG4gIElOVkFMSURfT0JTRVJWQVRJT05fT1ZFUkxBUCxcbiAgQVZPSURJTkdfUEFERElOR19CWV9FREdFUyxcbiAgSU5WQUxJRF9EQVRFX1RZUEUsXG4gIFNUQVJUX0xPV0VSX0VORCxcbiAgTUlTU0lOR19DT05GSUcsXG59ID0gU1RSSU5HUztcblxuLyoqXG4gKiBUaW1lIHN5bmNocm9uaXphdGlvbiBwbHVnaW4gY29udmVydGVkIGludG8gZnJhbWV3b3JrIGludGVncmF0ZWQgdG9vbC5cbiAqIEl0IGNhbid0IGJlIHJlcXVlc3RlZCBpbiBgaW5pdGlhbGl6ZS5wbHVnaW5zYCBzZWN0aW9uIGFueW1vcmUuIEluc3RlYWQgZGVzY3JpYmUgY29uZmlndXJhdGlvbiBpbiBjb250ZXh0LlxuICogQGV4YW1wbGVcbiAqIGBgYHlhbWxcbiAqIG5hbWU6IHRpbWUtc3luY1xuICogZGVzY3JpcHRpb246IHNhbXBsZSBpbiB0aW1lIHN5bmMgbGliXG4gKiB0YWdzOiBzYW1wbGUsIHRpbWUsIHN5bmNcbiAqIHRpbWUtc3luYzpcbiAqICAgc3RhcnQtdGltZTogJzIwMjMtMTItMTJUMDA6MDA6MDAuMDAwWidcbiAqICAgZW5kLXRpbWU6ICcyMDIzLTEyLTEyVDAwOjAxOjAwLjAwMFonXG4gKiAgIGludGVydmFsOiA1XG4gKiAgIGFsbG93LXBhZGRpbmc6IHRydWVcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgVGltZVN5bmMgPSBQbHVnaW5GYWN0b3J5PFRpbWVOb3JtYWxpemVyQ29uZmlnPih7XG4gIG1ldGFkYXRhOiB7XG4gICAgaW5wdXRzOiB7XG4gICAgICB0aW1lc3RhbXA6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gdGhlIHRpbWUgb2Ygb2NjdXJyZW5jZSBvZiB0aGUgaW5wdXQnLFxuICAgICAgICB1bml0OiAnUkZDMzMzOScsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ25vbmUnLFxuICAgICAgICAgIGNvbXBvbmVudDogJ25vbmUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGR1cmF0aW9uOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIHRoZSBkdXJhdGlvbiBvZiB0aGUgaW5wdXQnLFxuICAgICAgICB1bml0OiAnc2Vjb25kcycsXG4gICAgICAgICdhZ2dyZWdhdGlvbi1tZXRob2QnOiB7XG4gICAgICAgICAgdGltZTogJ3N1bScsXG4gICAgICAgICAgY29tcG9uZW50OiAnbm9uZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNvbmZpZ1ZhbGlkYXRpb246IChjb25maWc6IENvbmZpZ1BhcmFtcyk6IFRpbWVOb3JtYWxpemVyQ29uZmlnID0+IHtcbiAgICBpZiAoIWNvbmZpZyB8fCAhT2JqZWN0LmtleXMoY29uZmlnKT8ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IoTUlTU0lOR19DT05GSUcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICAnc3RhcnQtdGltZSc6IHouc3RyaW5nKCkuZGF0ZXRpbWUoKSxcbiAgICAgICAgJ2VuZC10aW1lJzogei5zdHJpbmcoKS5kYXRldGltZSgpLFxuICAgICAgICBpbnRlcnZhbDogei5udW1iZXIoKSxcbiAgICAgICAgJ2FsbG93LXBhZGRpbmcnOiB6LmJvb2xlYW4oKSxcbiAgICAgICAgJ3Vwc2FtcGxpbmctcmVzb2x1dGlvbic6IHoubnVtYmVyKCkubWluKDEpLm9wdGlvbmFsKCksXG4gICAgICB9KVxuICAgICAgLnJlZmluZShkYXRhID0+IGRhdGFbJ3N0YXJ0LXRpbWUnXSA8IGRhdGFbJ2VuZC10aW1lJ10sIHtcbiAgICAgICAgbWVzc2FnZTogU1RBUlRfTE9XRVJfRU5ELFxuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdmFsaWRhdGU8ei5pbmZlcjx0eXBlb2Ygc2NoZW1hPj4oc2NoZW1hLCBjb25maWcpO1xuICB9LFxuICBpbnB1dFZhbGlkYXRpb246IChpbnB1dDogUGx1Z2luUGFyYW1zLCBfY29uZmlnOiBhbnksIGluZGV4PzogbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hID0gei5vYmplY3Qoe1xuICAgICAgdGltZXN0YW1wOiB6LnN0cmluZygpLmRhdGV0aW1lKHt9KS5vcih6LmRhdGUoKSksXG4gICAgICBkdXJhdGlvbjogei5udW1iZXIoKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+PihzY2hlbWEsIGlucHV0LCBpbmRleCk7XG4gIH0sXG4gIGltcGxlbWVudGF0aW9uOiBhc3luYyAoXG4gICAgaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSxcbiAgICBjb25maWcsXG4gICAgbWFwcGluZz86IE1hcHBpbmdQYXJhbXNcbiAgKSA9PiB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4gZHVyYXRpb24gaXMgY29tcGF0aWJsZSB3aXRoIGEgZ2l2ZW4gdGltZVN0ZXAuIElmIG5vdCwgdGhyb3dzIGFuIGVycm9yXG4gICAgICovXG4gICAgY29uc3QgdmFsaWRhdGVJbnRlcnZhbEZvclJlc2FtcGxlID0gKFxuICAgICAgZHVyYXRpb246IG51bWJlcixcbiAgICAgIHRpbWVTdGVwOiBudW1iZXIsXG4gICAgICBlcnJvck1lc3NhZ2U6IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGR1cmF0aW9uICUgdGltZVN0ZXAgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERhdGVzIGFyZSBwYXNzZWQgdG8gYHRpbWUtc3luY2AgYm90aCBpbiBJU08gODYwMSBmb3JtYXRcbiAgICAgKiBhbmQgYXMgYSBEYXRlIG9iamVjdCAoZnJvbSB0aGUgZGVzZXJpYWxpemF0aW9uIG9mIGEgWUFNTCBmaWxlKS5cbiAgICAgKiBJZiB0aGUgWUFNTCBwYXJzZXIgZmFpbHMgdG8gaWRlbnRpZnkgYXMgYSBkYXRlLCBpdCBwYXNzZXMgYXMgYSBzdHJpbmcuXG4gICAgICovXG4gICAgY29uc3QgcGFyc2VEYXRlID0gKGRhdGU6IERhdGUgfCBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghZGF0ZSkge1xuICAgICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCgnSW52YWxpZCBkYXRlJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0RhdGUoZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lLmZyb21KU0RhdGUoZGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIERhdGVUaW1lLmZyb21JU08oZGF0ZSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0ZUluSW5wdXRFcnJvcihJTlZBTElEX0RBVEVfVFlQRShkYXRlKSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgbWluaW1hbCBmYWN0b3IuXG4gICAgICovXG4gICAgY29uc3QgY29udmVydFBlckludGVydmFsID0gKFxuICAgICAgdmFsdWU6IG51bWJlcixcbiAgICAgIGR1cmF0aW9uOiBudW1iZXIsXG4gICAgICB0aW1lU3RlcDogbnVtYmVyXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBzYW1wbGVzTnVtYmVyID0gZHVyYXRpb24gLyB0aW1lU3RlcDtcblxuICAgICAgcmV0dXJuIHZhbHVlIC8gc2FtcGxlc051bWJlcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplIHRpbWUgcGVyIGdpdmVuIHNlY29uZC5cbiAgICAgKi9cbiAgICBjb25zdCBub3JtYWxpemVUaW1lUGVyU2Vjb25kID0gKFxuICAgICAgY3VycmVudFJvdW5kTW9tZW50OiBEYXRlIHwgc3RyaW5nLFxuICAgICAgaTogbnVtYmVyXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB0aGlzTW9tZW50ID0gcGFyc2VEYXRlKGN1cnJlbnRSb3VuZE1vbWVudCkuc3RhcnRPZignc2Vjb25kJyk7XG5cbiAgICAgIHJldHVybiB0aGlzTW9tZW50LnBsdXMoe3NlY29uZHM6IGl9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQnJlYWtzIGRvd24gaW5wdXQgcGVyIG1pbmltYWwgdGltZSB1bml0LlxuICAgICAqL1xuICAgIGNvbnN0IGJyZWFrRG93bklucHV0ID0gKFxuICAgICAgaW5wdXQ6IFBsdWdpblBhcmFtcyxcbiAgICAgIGk6IG51bWJlcixcbiAgICAgIHBhcmFtczogVGltZVBhcmFtc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgbWV0cmljcyA9IE9iamVjdC5rZXlzKGlucHV0KTtcbiAgICAgIGNvbnN0IHRpbWVTdGVwID0gcGFyYW1zLnVwc2FtcGxpbmdSZXNvbHV0aW9uO1xuXG4gICAgICByZXR1cm4gbWV0cmljcy5yZWR1Y2UoKGFjYywgbWV0cmljKSA9PiB7XG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0aW9uUGFyYW1zID0gZ2V0QWdncmVnYXRpb25JbmZvRm9yKG1ldHJpYyk7XG5cbiAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ3RpbWVzdGFtcCcpIHtcbiAgICAgICAgICBjb25zdCBwZXJTZWNvbmQgPSBub3JtYWxpemVUaW1lUGVyU2Vjb25kKGlucHV0LnRpbWVzdGFtcCwgaSk7XG4gICAgICAgICAgYWNjW21ldHJpY10gPSBwZXJTZWNvbmQudG9VVEMoKS50b0lTTygpID8/ICcnO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRyaWMgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9IHRpbWVTdGVwO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnbm9uZScpIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9IG51bGw7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgYWNjW21ldHJpY10gPVxuICAgICAgICAgIGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdzdW0nXG4gICAgICAgICAgICA/IGNvbnZlcnRQZXJJbnRlcnZhbChpbnB1dFttZXRyaWNdLCBpbnB1dFsnZHVyYXRpb24nXSwgdGltZVN0ZXApXG4gICAgICAgICAgICA6IGlucHV0W21ldHJpY107XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9IGFzIFBsdWdpblBhcmFtcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFBvcHVsYXRlcyBvYmplY3QgdG8gZmlsbCB0aGUgZ2FwcyBpbiBvYnNlcnZhdGlvbmFsIHRpbWVsaW5lIHVzaW5nIHplcm9pc2ggdmFsdWVzLlxuICAgICAqL1xuICAgIGNvbnN0IGZpbGxXaXRoWmVyb2lzaElucHV0ID0gKFxuICAgICAgaW5wdXQ6IFBsdWdpblBhcmFtcyxcbiAgICAgIG1pc3NpbmdUaW1lc3RhbXA6IERhdGVUaW1lTWF5YmVWYWxpZCxcbiAgICAgIHRpbWVTdGVwOiBudW1iZXJcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBPYmplY3Qua2V5cyhpbnB1dCk7XG4gICAgICByZXR1cm4gbWV0cmljcy5yZWR1Y2UoKGFjYywgbWV0cmljKSA9PiB7XG4gICAgICAgIGlmIChtZXRyaWMgPT09ICd0aW1lc3RhbXAnKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gPVxuICAgICAgICAgICAgbWlzc2luZ1RpbWVzdGFtcC5zdGFydE9mKCdzZWNvbmQnKS50b1VUQygpLnRvSVNPKCkgPz8gJyc7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ2R1cmF0aW9uJykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gdGltZVN0ZXA7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIG1ldHJpYyA9PT0gJ3RpbWUtcmVzZXJ2ZWQnIHx8XG4gICAgICAgICAgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgIG1hcHBpbmdbJ3RpbWUtcmVzZXJ2ZWQnXSAmJlxuICAgICAgICAgICAgbWV0cmljID09PSBtYXBwaW5nWyd0aW1lLXJlc2VydmVkJ10pXG4gICAgICAgICkge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gYWNjWydkdXJhdGlvbiddO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0aW9uUGFyYW1zID0gZ2V0QWdncmVnYXRpb25JbmZvRm9yKG1ldHJpYyk7XG5cbiAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdub25lJykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gbnVsbDtcblxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYWdncmVnYXRpb25QYXJhbXMudGltZSA9PT0gJ2F2ZycgfHxcbiAgICAgICAgICBhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnc3VtJ1xuICAgICAgICApIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9IDA7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdjb3B5Jykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9IGFzIFBsdWdpblBhcmFtcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZXJyb3Igb24gcGFkZGluZ2AgaXMgZW5hYmxlZCBhbmQgcGFkZGluZyBpcyBuZWVkZWQuIElmIHNvLCB0aGVuIHRocm93cyBlcnJvci5cbiAgICAgKi9cbiAgICBjb25zdCB2YWxpZGF0ZVBhZGRpbmcgPSAocGFkOiBQYWRkaW5nUmVjZWlwdCwgcGFyYW1zOiBUaW1lUGFyYW1zKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYWQ7XG4gICAgICBjb25zdCBpc1BhZGRpbmdOZWVkZWQgPSBzdGFydCB8fCBlbmQ7XG5cbiAgICAgIGlmICghcGFyYW1zLmFsbG93UGFkZGluZyAmJiBpc1BhZGRpbmdOZWVkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYWRkaW5nRXJyb3IoQVZPSURJTkdfUEFERElOR19CWV9FREdFUyhzdGFydCwgZW5kKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBwYWRkaW5nIGlzIG5lZWRlZCBlaXRoZXIgYXQgc3RhcnQgb2YgdGhlIHRpbWVsaW5lIG9yIHRoZSBlbmQgYW5kIHJldHVybnMgc3RhdHVzLlxuICAgICAqL1xuICAgIGNvbnN0IGNoZWNrRm9yUGFkZGluZyA9IChcbiAgICAgIGlucHV0czogUGx1Z2luUGFyYW1zW10sXG4gICAgICBwYXJhbXM6IFRpbWVQYXJhbXNcbiAgICApOiBQYWRkaW5nUmVjZWlwdCA9PiB7XG4gICAgICBjb25zdCBzdGFydERpZmZJblNlY29uZHMgPSBwYXJzZURhdGUoaW5wdXRzWzBdLnRpbWVzdGFtcClcbiAgICAgICAgLmRpZmYocGFyYW1zLnN0YXJ0VGltZSlcbiAgICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICAgIGNvbnN0IGxhc3RJbnB1dCA9IGlucHV0c1tpbnB1dHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGNvbnN0IGVuZERpZmZJblNlY29uZHMgPSBwYXJzZURhdGUobGFzdElucHV0LnRpbWVzdGFtcClcbiAgICAgICAgLnBsdXMoe3NlY29uZDogZXZhbChsYXN0SW5wdXQuZHVyYXRpb24pfSlcbiAgICAgICAgLmRpZmYocGFyYW1zLmVuZFRpbWUpXG4gICAgICAgIC5hcygnc2Vjb25kcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IHN0YXJ0RGlmZkluU2Vjb25kcyA+IDAsXG4gICAgICAgIGVuZDogZW5kRGlmZkluU2Vjb25kcyA8IDAsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGdpdmVuIGlucHV0cyBmcmFtZSwgbWVhbndoaWxlIGNoZWNraW5nIGlmIGFnZ3JlZ2F0aW9uIG1ldGhvZCBpcyBgc3VtYCwgdGhlbiBjYWxjdWxhdGVzIGl0LlxuICAgICAqIEZvciBtZXRob2RzIGlzIGBhdmdgIGFuZCBgbm9uZWAgY2FsY3VsYXRpbmcgYXZlcmFnZSBvZiB0aGUgZnJhbWUuXG4gICAgICovXG4gICAgY29uc3QgcmVzYW1wbGVJbnB1dEZyYW1lID0gKGlucHV0c0luVGltZXNsb3Q6IFBsdWdpblBhcmFtc1tdKSA9PlxuICAgICAgaW5wdXRzSW5UaW1lc2xvdC5yZWR1Y2UoKGFjYywgaW5wdXQsIGluZGV4LCBpbnB1dHMpID0+IHtcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IE9iamVjdC5rZXlzKGlucHV0KTtcblxuICAgICAgICBtZXRyaWNzLmZvckVhY2gobWV0cmljID0+IHtcbiAgICAgICAgICBjb25zdCBhZ2dyZWdhdGlvblBhcmFtcyA9IGdldEFnZ3JlZ2F0aW9uSW5mb0ZvcihtZXRyaWMpO1xuXG4gICAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ3RpbWVzdGFtcCcpIHtcbiAgICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRzWzBdW21ldHJpY107XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobWV0cmljID09PSAnZHVyYXRpb24nKSB7XG4gICAgICAgICAgICBhZ2dyZWdhdGlvblBhcmFtcy50aW1lID0gJ3N1bSc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdub25lJykge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjY1ttZXRyaWNdID0gYWNjW21ldHJpY10gPz8gMDtcblxuICAgICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnc3VtJykge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gKz0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnY29weScpIHtcbiAgICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIElmIHRpbWVzbG90IGNvbnRhaW5zIHJlY29yZHMgbW9yZSB0aGFuIG9uZSwgdGhlbiBkaXZpZGUgZWFjaCBtZXRyaWMgYnkgdGhlIHRpbWVzbG90IGxlbmd0aCxcbiAgICAgICAgICAgKiAgc28gdGhhdCB0aGVpciBzdW0geWllbGRzIHRoZSB0aW1lc2xvdCBhdmVyYWdlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlucHV0c0luVGltZXNsb3QubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgaW5kZXggPT09IGlucHV0c0luVGltZXNsb3QubGVuZ3RoIC0gMVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gLz0gaW5wdXRzSW5UaW1lc2xvdC5sZW5ndGg7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY2NbbWV0cmljXSArPSBpbnB1dFttZXRyaWNdO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgUGx1Z2luUGFyYW1zKTtcblxuICAgIC8qKlxuICAgICAqIFRha2VzIGVhY2ggYXJyYXkgZnJhbWUgd2l0aCBpbnRlcnZhbCBsZW5ndGgsIHRoZW4gYWdncmVnYXRpbmcgdGhlbSB0b2dldGhlciBhcyBmcm9tIHVuaXRzLnlhbWwgZmlsZS5cbiAgICAgKi9cbiAgICBjb25zdCByZXNhbXBsZUlucHV0cyA9IChpbnB1dHM6IFBsdWdpblBhcmFtc1tdLCBwYXJhbXM6IFRpbWVQYXJhbXMpID0+XG4gICAgICBpbnB1dHMucmVkdWNlKChhY2M6IFBsdWdpblBhcmFtc1tdLCBfaW5wdXQsIGluZGV4LCBpbnB1dHMpID0+IHtcbiAgICAgICAgY29uc3QgZnJhbWVTdGFydCA9XG4gICAgICAgICAgKGluZGV4ICogcGFyYW1zLmludGVydmFsKSAvIHBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbjtcbiAgICAgICAgY29uc3QgZnJhbWVFbmQgPVxuICAgICAgICAgICgoaW5kZXggKyAxKSAqIHBhcmFtcy5pbnRlcnZhbCkgLyBwYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb247XG5cbiAgICAgICAgY29uc3QgaW5wdXRzRnJhbWUgPSBpbnB1dHMuc2xpY2UoZnJhbWVTdGFydCwgZnJhbWVFbmQpO1xuICAgICAgICBjb25zdCByZXNhbXBsZWRJbnB1dCA9IHJlc2FtcGxlSW5wdXRGcmFtZShpbnB1dHNGcmFtZSk7XG5cbiAgICAgICAgLyoqIENoZWNrcyBpZiByZXNhbXBsZWQgaW5wdXQgaXMgbm90IGVtcHR5LCB0aGVuIGluY2x1ZGVzIGluIHJlc3VsdC4gKi9cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc2FtcGxlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYWNjLnB1c2gocmVzYW1wbGVkSW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIFtdIGFzIFBsdWdpblBhcmFtc1tdKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgemVyb2lzaCBpbnB1dHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9yIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0cyBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgY29uc3QgcGFkSW5wdXRzID0gKFxuICAgICAgaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSxcbiAgICAgIHBhZDogUGFkZGluZ1JlY2VpcHQsXG4gICAgICBwYXJhbXM6IFRpbWVQYXJhbXNcbiAgICApOiBQbHVnaW5QYXJhbXNbXSA9PiB7XG4gICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYWQ7XG4gICAgICBjb25zdCBwYWRkZWRGcm9tQmVnaW5uaW5nID0gW107XG5cbiAgICAgIGlmIChzdGFydCkge1xuICAgICAgICBwYWRkZWRGcm9tQmVnaW5uaW5nLnB1c2goXG4gICAgICAgICAgLi4uZ2V0WmVyb2lzaElucHV0UGVyU2Vjb25kQmV0d2VlblJhbmdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGFydERhdGU6IHBhcmFtcy5zdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZERhdGU6IHBhcnNlRGF0ZShpbnB1dHNbMF0udGltZXN0YW1wKSxcbiAgICAgICAgICAgICAgdGltZVN0ZXA6IHBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnB1dHNbMF1cbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhZGRlZEFycmF5ID0gcGFkZGVkRnJvbUJlZ2lubmluZy5jb25jYXQoaW5wdXRzKTtcblxuICAgICAgaWYgKGVuZCkge1xuICAgICAgICBjb25zdCBsYXN0SW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBsYXN0SW5wdXRFbmQgPSBwYXJzZURhdGUobGFzdElucHV0LnRpbWVzdGFtcCkucGx1cyh7XG4gICAgICAgICAgc2Vjb25kczogZXZhbChsYXN0SW5wdXQuZHVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICAgICAgcGFkZGVkQXJyYXkucHVzaChcbiAgICAgICAgICAuLi5nZXRaZXJvaXNoSW5wdXRQZXJTZWNvbmRCZXR3ZWVuUmFuZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZTogbGFzdElucHV0RW5kLFxuICAgICAgICAgICAgICBlbmREYXRlOiBwYXJhbXMuZW5kVGltZSxcbiAgICAgICAgICAgICAgdGltZVN0ZXA6IHBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0SW5wdXRcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYWRkZWRBcnJheTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQnJha2VzIGRvd24gdGhlIGdpdmVuIHJhbmdlIGJ5IDEgc2Vjb25kLCBhbmQgZ2VuZXJhdGVzIHplcm9pc2ggdmFsdWVzLlxuICAgICAqL1xuICAgIGNvbnN0IGdldFplcm9pc2hJbnB1dFBlclNlY29uZEJldHdlZW5SYW5nZSA9IChcbiAgICAgIHBhcmFtczogUGx1Z2luUGFyYW1zLFxuICAgICAgaW5wdXQ6IFBsdWdpblBhcmFtc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgYXJyYXk6IFBsdWdpblBhcmFtc1tdID0gW107XG4gICAgICB2YWxpZGF0ZUludGVydmFsRm9yUmVzYW1wbGUoXG4gICAgICAgIHBhcmFtcy5lbmREYXRlLmRpZmYocGFyYW1zLnN0YXJ0RGF0ZSkuYXMoJ3NlY29uZHMnKSxcbiAgICAgICAgcGFyYW1zLnRpbWVTdGVwLFxuICAgICAgICBJTkNPTVBBVElCTEVfUkVTT0xVVElPTl9XSVRIX0dBUFNcbiAgICAgICk7XG4gICAgICBjb25zdCBkYXRlUmFuZ2UgPSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKFxuICAgICAgICBwYXJhbXMuc3RhcnREYXRlLFxuICAgICAgICBwYXJhbXMuZW5kRGF0ZVxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCBpbnRlcnZhbCBvZiBkYXRlUmFuZ2Uuc3BsaXRCeSh7c2Vjb25kOiBwYXJhbXMudGltZVN0ZXB9KSkge1xuICAgICAgICBhcnJheS5wdXNoKFxuICAgICAgICAgIGZpbGxXaXRoWmVyb2lzaElucHV0KFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAvLyBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgc3RhcnQgd2lsbCBuZXZlciBiZSBudWxsXG4gICAgICAgICAgICAvLyBiZWNhdXNlIGlmIHdlIHBhc3MgYW4gaW52YWxpZCBzdGFydC9lbmREYXRlIHRvXG4gICAgICAgICAgICAvLyBJbnRlcnZhbCwgd2UgZ2V0IGEgemVybyBsZW5ndGggYXJyYXkgYXMgdGhlIHJhbmdlXG4gICAgICAgICAgICBpbnRlcnZhbC5zdGFydCB8fCBEYXRlVGltZS5pbnZhbGlkKCdub3QgZXhwZWN0ZWQgLSBzdGFydCBpcyBudWxsJyksXG4gICAgICAgICAgICBwYXJhbXMudGltZVN0ZXBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBDaGVja3MgaWYgaW5wdXQncyB0aW1lc3RhbXAgaXMgaW5jbHVkZWQgaW4gZ2xvYmFsIHNwZWNpZmllZCBwZXJpb2QgdGhlbiBsZWF2ZXMgaXQsIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBjb25zdCB0cmltSW5wdXRzQnlHbG9iYWxUaW1lbGluZSA9IChcbiAgICAgIGlucHV0czogUGx1Z2luUGFyYW1zW10sXG4gICAgICBwYXJhbXM6IFRpbWVQYXJhbXNcbiAgICApOiBQbHVnaW5QYXJhbXNbXSA9PlxuICAgICAgaW5wdXRzLnJlZHVjZSgoYWNjOiBQbHVnaW5QYXJhbXNbXSwgaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB7dGltZXN0YW1wfSA9IGl0ZW07XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBhcnNlRGF0ZSh0aW1lc3RhbXApID49IHBhcmFtcy5zdGFydFRpbWUgJiZcbiAgICAgICAgICBwYXJzZURhdGUodGltZXN0YW1wKSA8PSBwYXJhbXMuZW5kVGltZVxuICAgICAgICApIHtcbiAgICAgICAgICBhY2MucHVzaChpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSBhcyBQbHVnaW5QYXJhbXNbXSk7XG5cbiAgICAvKiogSW1wbGVtZW50YXRpb24gKi9cbiAgICBjb25zdCB0aW1lUGFyYW1zID0ge1xuICAgICAgc3RhcnRUaW1lOiBEYXRlVGltZS5mcm9tSVNPKGNvbmZpZ1snc3RhcnQtdGltZSddIGFzIHN0cmluZyksXG4gICAgICBlbmRUaW1lOiBEYXRlVGltZS5mcm9tSVNPKGNvbmZpZ1snZW5kLXRpbWUnXSBhcyBzdHJpbmcpLFxuICAgICAgaW50ZXJ2YWw6IGNvbmZpZy5pbnRlcnZhbCxcbiAgICAgIGFsbG93UGFkZGluZzogY29uZmlnWydhbGxvdy1wYWRkaW5nJ10sXG4gICAgICB1cHNhbXBsaW5nUmVzb2x1dGlvbjogY29uZmlnWyd1cHNhbXBsaW5nLXJlc29sdXRpb24nXVxuICAgICAgICA/IGNvbmZpZ1sndXBzYW1wbGluZy1yZXNvbHV0aW9uJ11cbiAgICAgICAgOiAxLFxuICAgIH07XG4gICAgdmFsaWRhdGVJbnRlcnZhbEZvclJlc2FtcGxlKFxuICAgICAgdGltZVBhcmFtcy5pbnRlcnZhbCxcbiAgICAgIHRpbWVQYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb24sXG4gICAgICBJTkNPTVBBVElCTEVfUkVTT0xVVElPTl9XSVRIX0lOVEVSVkFMXG4gICAgKTtcbiAgICBjb25zdCBwYWQgPSBjaGVja0ZvclBhZGRpbmcoaW5wdXRzLCB0aW1lUGFyYW1zKTtcbiAgICB2YWxpZGF0ZVBhZGRpbmcocGFkLCB0aW1lUGFyYW1zKTtcbiAgICBjb25zdCBwYWRkZWRJbnB1dHMgPSBwYWRJbnB1dHMoaW5wdXRzLCBwYWQsIHRpbWVQYXJhbXMpO1xuXG4gICAgY29uc3QgZmxhdHRlbklucHV0cyA9IHBhZGRlZElucHV0cy5yZWR1Y2UoXG4gICAgICAoYWNjOiBQbHVnaW5QYXJhbXNbXSwgaW5wdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb21lbnQgPSBwYXJzZURhdGUoaW5wdXQudGltZXN0YW1wKTtcblxuICAgICAgICAvKiogQ2hlY2tzIGlmIG5vdCB0aGUgZmlyc3QgaW5wdXQsIHRoZW4gY2hlY2sgY29uc2lzdGVuY3kgd2l0aCBwcmV2aW91cyBvbmVzLiAqL1xuICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNJbnB1dCA9IHBhZGRlZElucHV0c1tpbmRleCAtIDFdO1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5wdXRUaW1lc3RhbXAgPSBwYXJzZURhdGUocHJldmlvdXNJbnB1dC50aW1lc3RhbXApO1xuXG4gICAgICAgICAgLyoqIENoZWNrcyBmb3IgdGltZXN0YW1wcyBvdmVybGFwLiAqL1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBhcnNlRGF0ZShwcmV2aW91c0lucHV0LnRpbWVzdGFtcCkucGx1cyh7XG4gICAgICAgICAgICAgIHNlY29uZHM6IGV2YWwocHJldmlvdXNJbnB1dC5kdXJhdGlvbiksXG4gICAgICAgICAgICB9KSA+IGN1cnJlbnRNb21lbnRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSW5wdXRFcnJvcihJTlZBTElEX09CU0VSVkFUSU9OX09WRVJMQVApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbXBhcmVhYmxlVGltZSA9IHByZXZpb3VzSW5wdXRUaW1lc3RhbXAucGx1cyh7XG4gICAgICAgICAgICBzZWNvbmRzOiBldmFsKHByZXZpb3VzSW5wdXQuZHVyYXRpb24pLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdGltZWxpbmVHYXBTaXplID0gY3VycmVudE1vbWVudFxuICAgICAgICAgICAgLmRpZmYoY29tcGFyZWFibGVUaW1lKVxuICAgICAgICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICAgICAgICB2YWxpZGF0ZUludGVydmFsRm9yUmVzYW1wbGUoXG4gICAgICAgICAgICBpbnB1dC5kdXJhdGlvbixcbiAgICAgICAgICAgIHRpbWVQYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb24sXG4gICAgICAgICAgICBJTkNPTVBBVElCTEVfUkVTT0xVVElPTl9XSVRIX0lOUFVUU1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodGltZWxpbmVHYXBTaXplID4gMSkge1xuICAgICAgICAgICAgLyoqIENoZWNrcyBpZiB0aGVyZSBpcyBnYXAgaW4gdGltZWxpbmUuICovXG4gICAgICAgICAgICBhY2MucHVzaChcbiAgICAgICAgICAgICAgLi4uZ2V0WmVyb2lzaElucHV0UGVyU2Vjb25kQmV0d2VlblJhbmdlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogY29tcGFyZWFibGVUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kRGF0ZTogY3VycmVudE1vbWVudCxcbiAgICAgICAgICAgICAgICAgIHRpbWVTdGVwOiB0aW1lUGFyYW1zLnVwc2FtcGxpbmdSZXNvbHV0aW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5wdXRcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiogQnJlYWsgZG93biBjdXJyZW50IG9ic2VydmF0aW9uLiAqL1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICBpIDw9IGlucHV0LmR1cmF0aW9uIC0gdGltZVBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbjtcbiAgICAgICAgICBpICs9IHRpbWVQYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZElucHV0ID0gYnJlYWtEb3duSW5wdXQoaW5wdXQsIGksIHRpbWVQYXJhbXMpO1xuXG4gICAgICAgICAgYWNjLnB1c2gobm9ybWFsaXplZElucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmltSW5wdXRzQnlHbG9iYWxUaW1lbGluZShhY2MsIHRpbWVQYXJhbXMpO1xuICAgICAgfSxcbiAgICAgIFtdIGFzIFBsdWdpblBhcmFtc1tdXG4gICAgKTtcblxuICAgIGNvbnN0IHNvcnRlZElucHV0cyA9IGZsYXR0ZW5JbnB1dHMuc29ydCgoYSwgYikgPT5cbiAgICAgIHBhcnNlRGF0ZShhLnRpbWVzdGFtcCkuZGlmZihwYXJzZURhdGUoYi50aW1lc3RhbXApKS5hcygnc2Vjb25kcycpXG4gICAgKTtcblxuICAgIHJldHVybiByZXNhbXBsZUlucHV0cyhzb3J0ZWRJbnB1dHMsIHRpbWVQYXJhbXMpIGFzIFBsdWdpblBhcmFtc1tdO1xuICB9LFxufSk7XG4iXX0=
375
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaWYtcnVuL2J1aWx0aW5zL3RpbWUtc3luYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFFdkMsaUNBQXVFO0FBQ3ZFLDZCQUFzQjtBQUN0QixpREFBNkM7QUFVN0Msa0VBQTBEO0FBRTFELHlDQUFxQztBQUNyQyxtREFBMEQ7QUFDMUQsMkRBQXlEO0FBRXpELGdCQUFRLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUU3QixNQUFNLEVBQ0osV0FBVyxFQUNYLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ2xCLEdBQUcsY0FBTSxDQUFDO0FBRVgsTUFBTSxFQUNKLHFDQUFxQyxFQUNyQyxpQ0FBaUMsRUFDakMsbUNBQW1DLEVBQ25DLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDekIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixjQUFjLEdBQ2YsR0FBRyxnQkFBTyxDQUFDO0FBRVo7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDVSxRQUFBLFFBQVEsR0FBRyxJQUFBLDBCQUFhLEVBQXVCO0lBQzFELFFBQVEsRUFBRTtRQUNSLE1BQU0sRUFBRTtZQUNOLFNBQVMsRUFBRTtnQkFDVCxXQUFXLEVBQUUsK0NBQStDO2dCQUM1RCxJQUFJLEVBQUUsU0FBUztnQkFDZixvQkFBb0IsRUFBRTtvQkFDcEIsSUFBSSxFQUFFLE1BQU07b0JBQ1osU0FBUyxFQUFFLE1BQU07aUJBQ2xCO2FBQ0Y7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsV0FBVyxFQUFFLHFDQUFxQztnQkFDbEQsSUFBSSxFQUFFLFNBQVM7Z0JBQ2Ysb0JBQW9CLEVBQUU7b0JBQ3BCLElBQUksRUFBRSxLQUFLO29CQUNYLFNBQVMsRUFBRSxNQUFNO2lCQUNsQjthQUNGO1NBQ0Y7S0FDRjtJQUNELGdCQUFnQixFQUFFLENBQUMsTUFBb0IsRUFBd0IsRUFBRTtRQUMvRCxJ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QVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUNsRSxDQUFDO1FBRUYsT0FBTyxjQUFjLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBbUIsQ0FBQztJQUNwRSxDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0RhdGV9IGZyb20gJ25vZGU6dXRpbC90eXBlcyc7XG5cbmltcG9ydCB7U2V0dGluZ3MsIERhdGVUaW1lLCBEYXRlVGltZU1heWJlVmFsaWQsIEludGVydmFsfSBmcm9tICdsdXhvbic7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge0VSUk9SU30gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3V0aWxzJztcbmltcG9ydCB7XG4gIFBsdWdpblBhcmFtcyxcbiAgUGFkZGluZ1JlY2VpcHQsXG4gIE1hcHBpbmdQYXJhbXMsXG4gIENvbmZpZ1BhcmFtcyxcbiAgVGltZVBhcmFtcyxcbiAgVGltZU5vcm1hbGl6ZXJDb25maWcsXG59IGZyb20gJ0Bncm5zZnQvaWYtY29yZS90eXBlcyc7XG5cbmltcG9ydCB7dmFsaWRhdGV9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi91dGlsL3ZhbGlkYXRpb25zJztcblxuaW1wb3J0IHtTVFJJTkdTfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHtnZXRBZ2dyZWdhdGlvbkluZm9Gb3J9IGZyb20gJy4uLy4uL2xpYi9hZ2dyZWdhdGUnO1xuaW1wb3J0IHtQbHVnaW5GYWN0b3J5fSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvaW50ZXJmYWNlcyc7XG5cblNldHRpbmdzLmRlZmF1bHRab25lID0gJ3V0Yyc7XG5cbmNvbnN0IHtcbiAgQ29uZmlnRXJyb3IsXG4gIEludmFsaWREYXRlSW5JbnB1dEVycm9yLFxuICBJbnZhbGlkUGFkZGluZ0Vycm9yLFxuICBJbnZhbGlkSW5wdXRFcnJvcixcbn0gPSBFUlJPUlM7XG5cbmNvbnN0IHtcbiAgSU5DT01QQVRJQkxFX1JFU09MVVRJT05fV0lUSF9JTlRFUlZBTCxcbiAgSU5DT01QQVRJQkxFX1JFU09MVVRJT05fV0lUSF9HQVBTLFxuICBJTkNPTVBBVElCTEVfUkVTT0xVVElPTl9XSVRIX0lOUFVUUyxcbiAgSU5WQUxJRF9PQlNFUlZBVElPTl9PVkVSTEFQLFxuICBBVk9JRElOR19QQURESU5HX0JZX0VER0VTLFxuICBJTlZBTElEX0RBVEVfVFlQRSxcbiAgU1RBUlRfTE9XRVJfRU5ELFxuICBNSVNTSU5HX0NPTkZJRyxcbn0gPSBTVFJJTkdTO1xuXG4vKipcbiAqIFRpbWUgc3luY2hyb25pemF0aW9uIHBsdWdpbiBjb252ZXJ0ZWQgaW50byBmcmFtZXdvcmsgaW50ZWdyYXRlZCB0b29sLlxuICogSXQgY2FuJ3QgYmUgcmVxdWVzdGVkIGluIGBpbml0aWFsaXplLnBsdWdpbnNgIHNlY3Rpb24gYW55bW9yZS4gSW5zdGVhZCBkZXNjcmliZSBjb25maWd1cmF0aW9uIGluIGNvbnRleHQuXG4gKiBAZXhhbXBsZVxuICogYGBgeWFtbFxuICogbmFtZTogdGltZS1zeW5jXG4gKiBkZXNjcmlwdGlvbjogc2FtcGxlIGluIHRpbWUgc3luYyBsaWJcbiAqIHRhZ3M6IHNhbXBsZSwgdGltZSwgc3luY1xuICogdGltZS1zeW5jOlxuICogICBzdGFydC10aW1lOiAnMjAyMy0xMi0xMlQwMDowMDowMC4wMDBaJ1xuICogICBlbmQtdGltZTogJzIwMjMtMTItMTJUMDA6MDE6MDAuMDAwWidcbiAqICAgaW50ZXJ2YWw6IDVcbiAqICAgYWxsb3ctcGFkZGluZzogdHJ1ZVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBUaW1lU3luYyA9IFBsdWdpbkZhY3Rvcnk8VGltZU5vcm1hbGl6ZXJDb25maWc+KHtcbiAgbWV0YWRhdGE6IHtcbiAgICBpbnB1dHM6IHtcbiAgICAgIHRpbWVzdGFtcDoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ3JlZmVycyB0byB0aGUgdGltZSBvZiBvY2N1cnJlbmNlIG9mIHRoZSBpbnB1dCcsXG4gICAgICAgIHVuaXQ6ICdSRkMzMzM5JyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnbm9uZScsXG4gICAgICAgICAgY29tcG9uZW50OiAnbm9uZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZHVyYXRpb246IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gdGhlIGR1cmF0aW9uIG9mIHRoZSBpbnB1dCcsXG4gICAgICAgIHVuaXQ6ICdzZWNvbmRzJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHtcbiAgICAgICAgICB0aW1lOiAnc3VtJyxcbiAgICAgICAgICBjb21wb25lbnQ6ICdub25lJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY29uZmlnVmFsaWRhdGlvbjogKGNvbmZpZzogQ29uZmlnUGFyYW1zKTogVGltZU5vcm1hbGl6ZXJDb25maWcgPT4ge1xuICAgIGlmICghY29uZmlnIHx8ICFPYmplY3Qua2V5cyhjb25maWcpPy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBDb25maWdFcnJvcihNSVNTSU5HX0NPTkZJRyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hID0gelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgICdzdGFydC10aW1lJzogei5zdHJpbmcoKS5kYXRldGltZSgpLFxuICAgICAgICAnZW5kLXRpbWUnOiB6LnN0cmluZygpLmRhdGV0aW1lKCksXG4gICAgICAgIGludGVydmFsOiB6Lm51bWJlcigpLFxuICAgICAgICAnYWxsb3ctcGFkZGluZyc6IHouYm9vbGVhbigpLFxuICAgICAgICAndXBzYW1wbGluZy1yZXNvbHV0aW9uJzogei5udW1iZXIoKS5taW4oMSkub3B0aW9uYWwoKSxcbiAgICAgIH0pXG4gICAgICAucmVmaW5lKGRhdGEgPT4gZGF0YVsnc3RhcnQtdGltZSddIDwgZGF0YVsnZW5kLXRpbWUnXSwge1xuICAgICAgICBtZXNzYWdlOiBTVEFSVF9MT1dFUl9FTkQsXG4gICAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+PihzY2hlbWEsIGNvbmZpZyk7XG4gIH0sXG4gIGlucHV0VmFsaWRhdGlvbjogKGlucHV0OiBQbHVnaW5QYXJhbXMsIF9jb25maWc6IGFueSwgaW5kZXg/OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBzY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgICB0aW1lc3RhbXA6IHouc3RyaW5nKCkuZGF0ZXRpbWUoe30pLm9yKHouZGF0ZSgpKSxcbiAgICAgIGR1cmF0aW9uOiB6Lm51bWJlcigpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRlPHouaW5mZXI8dHlwZW9mIHNjaGVtYT4+KHNjaGVtYSwgaW5wdXQsIGluZGV4KTtcbiAgfSxcbiAgaW1wbGVtZW50YXRpb246IGFzeW5jIChcbiAgICBpbnB1dHM6IFBsdWdpblBhcmFtc1tdLFxuICAgIGNvbmZpZyxcbiAgICBtYXBwaW5nPzogTWFwcGluZ1BhcmFtc1xuICApID0+IHtcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiBkdXJhdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggYSBnaXZlbiB0aW1lU3RlcC4gSWYgbm90LCB0aHJvd3MgYW4gZXJyb3JcbiAgICAgKi9cbiAgICBjb25zdCB2YWxpZGF0ZUludGVydmFsRm9yUmVzYW1wbGUgPSAoXG4gICAgICBkdXJhdGlvbjogbnVtYmVyLFxuICAgICAgdGltZVN0ZXA6IG51bWJlcixcbiAgICAgIGVycm9yTWVzc2FnZTogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoZHVyYXRpb24gJSB0aW1lU3RlcCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRGF0ZXMgYXJlIHBhc3NlZCB0byBgdGltZS1zeW5jYCBib3RoIGluIElTTyA4NjAxIGZvcm1hdFxuICAgICAqIGFuZCBhcyBhIERhdGUgb2JqZWN0IChmcm9tIHRoZSBkZXNlcmlhbGl6YXRpb24gb2YgYSBZQU1MIGZpbGUpLlxuICAgICAqIElmIHRoZSBZQU1MIHBhcnNlciBmYWlscyB0byBpZGVudGlmeSBhcyBhIGRhdGUsIGl0IHBhc3NlcyBhcyBhIHN0cmluZy5cbiAgICAgKi9cbiAgICBjb25zdCBwYXJzZURhdGUgPSAoZGF0ZTogRGF0ZSB8IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFkYXRlKSB7XG4gICAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKCdJbnZhbGlkIGRhdGUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRGF0ZShkYXRlKSkge1xuICAgICAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkYXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUlTTyhkYXRlKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRlSW5JbnB1dEVycm9yKElOVkFMSURfREFURV9UWVBFKGRhdGUpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaXNDb25zdGFudE1ldGhvZCA9IChtZXRob2Q6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICAgIG1ldGhvZCA9PT0gJ2NvcHknIHx8XG4gICAgICBtZXRob2QgPT09ICdtaW4nIHx8XG4gICAgICBtZXRob2QgPT09ICdtYXgnIHx8XG4gICAgICBtZXRob2QgPT09ICdtZWRpYW4nO1xuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyBtaW5pbWFsIGZhY3Rvci5cbiAgICAgKi9cbiAgICBjb25zdCBjb252ZXJ0UGVySW50ZXJ2YWwgPSAoXG4gICAgICB2YWx1ZTogbnVtYmVyLFxuICAgICAgZHVyYXRpb246IG51bWJlcixcbiAgICAgIHRpbWVTdGVwOiBudW1iZXJcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHNhbXBsZXNOdW1iZXIgPSBkdXJhdGlvbiAvIHRpbWVTdGVwO1xuXG4gICAgICByZXR1cm4gdmFsdWUgLyBzYW1wbGVzTnVtYmVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgdGltZSBwZXIgZ2l2ZW4gc2Vjb25kLlxuICAgICAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZVRpbWVQZXJTZWNvbmQgPSAoXG4gICAgICBjdXJyZW50Um91bmRNb21lbnQ6IERhdGUgfCBzdHJpbmcsXG4gICAgICBpOiBudW1iZXJcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHRoaXNNb21lbnQgPSBwYXJzZURhdGUoY3VycmVudFJvdW5kTW9tZW50KS5zdGFydE9mKCdzZWNvbmQnKTtcblxuICAgICAgcmV0dXJuIHRoaXNNb21lbnQucGx1cyh7c2Vjb25kczogaX0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBCcmVha3MgZG93biBpbnB1dCBwZXIgbWluaW1hbCB0aW1lIHVuaXQuXG4gICAgICovXG4gICAgY29uc3QgYnJlYWtEb3duSW5wdXQgPSAoXG4gICAgICBpbnB1dDogUGx1Z2luUGFyYW1zLFxuICAgICAgaTogbnVtYmVyLFxuICAgICAgcGFyYW1zOiBUaW1lUGFyYW1zXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBtZXRyaWNzID0gT2JqZWN0LmtleXMoaW5wdXQpO1xuICAgICAgY29uc3QgdGltZVN0ZXAgPSBwYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb247XG5cbiAgICAgIHJldHVybiBtZXRyaWNzLnJlZHVjZSgoYWNjLCBtZXRyaWMpID0+IHtcbiAgICAgICAgY29uc3QgYWdncmVnYXRpb25QYXJhbXMgPSBnZXRBZ2dyZWdhdGlvbkluZm9Gb3IobWV0cmljKTtcblxuICAgICAgICBpZiAobWV0cmljID09PSAndGltZXN0YW1wJykge1xuICAgICAgICAgIGNvbnN0IHBlclNlY29uZCA9IG5vcm1hbGl6ZVRpbWVQZXJTZWNvbmQoaW5wdXQudGltZXN0YW1wLCBpKTtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9IHBlclNlY29uZC50b1VUQygpLnRvSVNPKCkgPz8gJyc7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ2R1cmF0aW9uJykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gdGltZVN0ZXA7XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdub25lJykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gbnVsbDtcblxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBhY2NbbWV0cmljXSA9XG4gICAgICAgICAgYWdncmVnYXRpb25QYXJhbXMudGltZSA9PT0gJ3N1bSdcbiAgICAgICAgICAgID8gY29udmVydFBlckludGVydmFsKGlucHV0W21ldHJpY10sIGlucHV0WydkdXJhdGlvbiddLCB0aW1lU3RlcClcbiAgICAgICAgICAgIDogaW5wdXRbbWV0cmljXTtcblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgUGx1Z2luUGFyYW1zKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUG9wdWxhdGVzIG9iamVjdCB0byBmaWxsIHRoZSBnYXBzIGluIG9ic2VydmF0aW9uYWwgdGltZWxpbmUgdXNpbmcgemVyb2lzaCB2YWx1ZXMuXG4gICAgICovXG4gICAgY29uc3QgZmlsbFdpdGhaZXJvaXNoSW5wdXQgPSAoXG4gICAgICBpbnB1dDogUGx1Z2luUGFyYW1zLFxuICAgICAgbWlzc2luZ1RpbWVzdGFtcDogRGF0ZVRpbWVNYXliZVZhbGlkLFxuICAgICAgdGltZVN0ZXA6IG51bWJlclxuICAgICkgPT4ge1xuICAgICAgY29uc3QgbWV0cmljcyA9IE9iamVjdC5rZXlzKGlucHV0KTtcbiAgICAgIHJldHVybiBtZXRyaWNzLnJlZHVjZSgoYWNjLCBtZXRyaWMpID0+IHtcbiAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ3RpbWVzdGFtcCcpIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSA9XG4gICAgICAgICAgICBtaXNzaW5nVGltZXN0YW1wLnN0YXJ0T2YoJ3NlY29uZCcpLnRvVVRDKCkudG9JU08oKSA/PyAnJztcblxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0cmljID09PSAnZHVyYXRpb24nKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gPSB0aW1lU3RlcDtcblxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgbWV0cmljID09PSAndGltZS1yZXNlcnZlZCcgfHxcbiAgICAgICAgICAobWFwcGluZyAmJlxuICAgICAgICAgICAgbWFwcGluZ1sndGltZS1yZXNlcnZlZCddICYmXG4gICAgICAgICAgICBtZXRyaWMgPT09IG1hcHBpbmdbJ3RpbWUtcmVzZXJ2ZWQnXSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gPSBhY2NbJ2R1cmF0aW9uJ107XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWdncmVnYXRpb25QYXJhbXMgPSBnZXRBZ2dyZWdhdGlvbkluZm9Gb3IobWV0cmljKTtcblxuICAgICAgICBpZiAoYWdncmVnYXRpb25QYXJhbXMudGltZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gPSBudWxsO1xuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnYXZnJyB8fFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdzdW0nXG4gICAgICAgICkge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gMDtcblxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdGFudE1ldGhvZChhZ2dyZWdhdGlvblBhcmFtcy50aW1lKSkge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9IGFzIFBsdWdpblBhcmFtcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZXJyb3Igb24gcGFkZGluZ2AgaXMgZW5hYmxlZCBhbmQgcGFkZGluZyBpcyBuZWVkZWQuIElmIHNvLCB0aGVuIHRocm93cyBlcnJvci5cbiAgICAgKi9cbiAgICBjb25zdCB2YWxpZGF0ZVBhZGRpbmcgPSAocGFkOiBQYWRkaW5nUmVjZWlwdCwgcGFyYW1zOiBUaW1lUGFyYW1zKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYWQ7XG4gICAgICBjb25zdCBpc1BhZGRpbmdOZWVkZWQgPSBzdGFydCB8fCBlbmQ7XG5cbiAgICAgIGlmICghcGFyYW1zLmFsbG93UGFkZGluZyAmJiBpc1BhZGRpbmdOZWVkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYWRkaW5nRXJyb3IoQVZPSURJTkdfUEFERElOR19CWV9FREdFUyhzdGFydCwgZW5kKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBwYWRkaW5nIGlzIG5lZWRlZCBlaXRoZXIgYXQgc3RhcnQgb2YgdGhlIHRpbWVsaW5lIG9yIHRoZSBlbmQgYW5kIHJldHVybnMgc3RhdHVzLlxuICAgICAqL1xuICAgIGNvbnN0IGNoZWNrRm9yUGFkZGluZyA9IChcbiAgICAgIGlucHV0czogUGx1Z2luUGFyYW1zW10sXG4gICAgICBwYXJhbXM6IFRpbWVQYXJhbXNcbiAgICApOiBQYWRkaW5nUmVjZWlwdCA9PiB7XG4gICAgICBjb25zdCBzdGFydERpZmZJblNlY29uZHMgPSBwYXJzZURhdGUoaW5wdXRzWzBdLnRpbWVzdGFtcClcbiAgICAgICAgLmRpZmYocGFyYW1zLnN0YXJ0VGltZSlcbiAgICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICAgIGNvbnN0IGxhc3RJbnB1dCA9IGlucHV0c1tpbnB1dHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGNvbnN0IGVuZERpZmZJblNlY29uZHMgPSBwYXJzZURhdGUobGFzdElucHV0LnRpbWVzdGFtcClcbiAgICAgICAgLnBsdXMoe3NlY29uZDogZXZhbChsYXN0SW5wdXQuZHVyYXRpb24pfSlcbiAgICAgICAgLmRpZmYocGFyYW1zLmVuZFRpbWUpXG4gICAgICAgIC5hcygnc2Vjb25kcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IHN0YXJ0RGlmZkluU2Vjb25kcyA+IDAsXG4gICAgICAgIGVuZDogZW5kRGlmZkluU2Vjb25kcyA8IDAsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGdpdmVuIGlucHV0cyBmcmFtZSwgbWVhbndoaWxlIGNoZWNraW5nIGlmIGFnZ3JlZ2F0aW9uIG1ldGhvZCBpcyBgc3VtYCwgdGhlbiBjYWxjdWxhdGVzIGl0LlxuICAgICAqIEZvciBtZXRob2RzIGlzIGBhdmdgIGFuZCBgbm9uZWAgY2FsY3VsYXRpbmcgYXZlcmFnZSBvZiB0aGUgZnJhbWUuXG4gICAgICovXG4gICAgY29uc3QgcmVzYW1wbGVJbnB1dEZyYW1lID0gKGlucHV0c0luVGltZXNsb3Q6IFBsdWdpblBhcmFtc1tdKSA9PlxuICAgICAgaW5wdXRzSW5UaW1lc2xvdC5yZWR1Y2UoKGFjYywgaW5wdXQsIGluZGV4LCBpbnB1dHMpID0+IHtcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IE9iamVjdC5rZXlzKGlucHV0KTtcblxuICAgICAgICBtZXRyaWNzLmZvckVhY2gobWV0cmljID0+IHtcbiAgICAgICAgICBjb25zdCBhZ2dyZWdhdGlvblBhcmFtcyA9IGdldEFnZ3JlZ2F0aW9uSW5mb0ZvcihtZXRyaWMpO1xuXG4gICAgICAgICAgaWYgKG1ldHJpYyA9PT0gJ3RpbWVzdGFtcCcpIHtcbiAgICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRzWzBdW21ldHJpY107XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobWV0cmljID09PSAnZHVyYXRpb24nKSB7XG4gICAgICAgICAgICBhZ2dyZWdhdGlvblBhcmFtcy50aW1lID0gJ3N1bSc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUgPT09ICdub25lJykge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjY1ttZXRyaWNdID0gYWNjW21ldHJpY10gPz8gMDtcblxuICAgICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtcy50aW1lID09PSAnc3VtJykge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gKz0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc0NvbnN0YW50TWV0aG9kKGFnZ3JlZ2F0aW9uUGFyYW1zLnRpbWUpKSB7XG4gICAgICAgICAgICBhY2NbbWV0cmljXSA9IGlucHV0W21ldHJpY107XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBJZiB0aW1lc2xvdCBjb250YWlucyByZWNvcmRzIG1vcmUgdGhhbiBvbmUsIHRoZW4gZGl2aWRlIGVhY2ggbWV0cmljIGJ5IHRoZSB0aW1lc2xvdCBsZW5ndGgsXG4gICAgICAgICAgICogIHNvIHRoYXQgdGhlaXIgc3VtIHlpZWxkcyB0aGUgdGltZXNsb3QgYXZlcmFnZS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpbnB1dHNJblRpbWVzbG90Lmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgIGluZGV4ID09PSBpbnB1dHNJblRpbWVzbG90Lmxlbmd0aCAtIDFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGFjY1ttZXRyaWNdIC89IGlucHV0c0luVGltZXNsb3QubGVuZ3RoO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWNjW21ldHJpY10gKz0gaW5wdXRbbWV0cmljXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9IGFzIFBsdWdpblBhcmFtcyk7XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyBlYWNoIGFycmF5IGZyYW1lIHdpdGggaW50ZXJ2YWwgbGVuZ3RoLCB0aGVuIGFnZ3JlZ2F0aW5nIHRoZW0gdG9nZXRoZXIgYXMgZnJvbSB1bml0cy55YW1sIGZpbGUuXG4gICAgICovXG4gICAgY29uc3QgcmVzYW1wbGVJbnB1dHMgPSAoaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSwgcGFyYW1zOiBUaW1lUGFyYW1zKSA9PlxuICAgICAgaW5wdXRzLnJlZHVjZSgoYWNjOiBQbHVnaW5QYXJhbXNbXSwgX2lucHV0LCBpbmRleCwgaW5wdXRzKSA9PiB7XG4gICAgICAgIGNvbnN0IGZyYW1lU3RhcnQgPVxuICAgICAgICAgIChpbmRleCAqIHBhcmFtcy5pbnRlcnZhbCkgLyBwYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb247XG4gICAgICAgIGNvbnN0IGZyYW1lRW5kID1cbiAgICAgICAgICAoKGluZGV4ICsgMSkgKiBwYXJhbXMuaW50ZXJ2YWwpIC8gcGFyYW1zLnVwc2FtcGxpbmdSZXNvbHV0aW9uO1xuXG4gICAgICAgIGNvbnN0IGlucHV0c0ZyYW1lID0gaW5wdXRzLnNsaWNlKGZyYW1lU3RhcnQsIGZyYW1lRW5kKTtcbiAgICAgICAgY29uc3QgcmVzYW1wbGVkSW5wdXQgPSByZXNhbXBsZUlucHV0RnJhbWUoaW5wdXRzRnJhbWUpO1xuXG4gICAgICAgIC8qKiBDaGVja3MgaWYgcmVzYW1wbGVkIGlucHV0IGlzIG5vdCBlbXB0eSwgdGhlbiBpbmNsdWRlcyBpbiByZXN1bHQuICovXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhyZXNhbXBsZWRJbnB1dCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGFjYy5wdXNoKHJlc2FtcGxlZElucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSBhcyBQbHVnaW5QYXJhbXNbXSk7XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIHplcm9pc2ggaW5wdXRzIGZyb20gdGhlIGJlZ2lubmluZyBvciBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dHMgaWYgbmVlZGVkLlxuICAgICAqL1xuICAgIGNvbnN0IHBhZElucHV0cyA9IChcbiAgICAgIGlucHV0czogUGx1Z2luUGFyYW1zW10sXG4gICAgICBwYWQ6IFBhZGRpbmdSZWNlaXB0LFxuICAgICAgcGFyYW1zOiBUaW1lUGFyYW1zXG4gICAgKTogUGx1Z2luUGFyYW1zW10gPT4ge1xuICAgICAgY29uc3Qge3N0YXJ0LCBlbmR9ID0gcGFkO1xuICAgICAgY29uc3QgcGFkZGVkRnJvbUJlZ2lubmluZyA9IFtdO1xuXG4gICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgcGFkZGVkRnJvbUJlZ2lubmluZy5wdXNoKFxuICAgICAgICAgIC4uLmdldFplcm9pc2hJbnB1dFBlclNlY29uZEJldHdlZW5SYW5nZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RhcnREYXRlOiBwYXJhbXMuc3RhcnRUaW1lLFxuICAgICAgICAgICAgICBlbmREYXRlOiBwYXJzZURhdGUoaW5wdXRzWzBdLnRpbWVzdGFtcCksXG4gICAgICAgICAgICAgIHRpbWVTdGVwOiBwYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRzWzBdXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWRkZWRBcnJheSA9IHBhZGRlZEZyb21CZWdpbm5pbmcuY29uY2F0KGlucHV0cyk7XG5cbiAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgY29uc3QgbGFzdElucHV0ID0gaW5wdXRzW2lucHV0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgbGFzdElucHV0RW5kID0gcGFyc2VEYXRlKGxhc3RJbnB1dC50aW1lc3RhbXApLnBsdXMoe1xuICAgICAgICAgIHNlY29uZHM6IGV2YWwobGFzdElucHV0LmR1cmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHBhZGRlZEFycmF5LnB1c2goXG4gICAgICAgICAgLi4uZ2V0WmVyb2lzaElucHV0UGVyU2Vjb25kQmV0d2VlblJhbmdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdGFydERhdGU6IGxhc3RJbnB1dEVuZCxcbiAgICAgICAgICAgICAgZW5kRGF0ZTogcGFyYW1zLmVuZFRpbWUsXG4gICAgICAgICAgICAgIHRpbWVTdGVwOiBwYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdElucHV0XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFkZGVkQXJyYXk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEJyYWtlcyBkb3duIHRoZSBnaXZlbiByYW5nZSBieSAxIHNlY29uZCwgYW5kIGdlbmVyYXRlcyB6ZXJvaXNoIHZhbHVlcy5cbiAgICAgKi9cbiAgICBjb25zdCBnZXRaZXJvaXNoSW5wdXRQZXJTZWNvbmRCZXR3ZWVuUmFuZ2UgPSAoXG4gICAgICBwYXJhbXM6IFBsdWdpblBhcmFtcyxcbiAgICAgIGlucHV0OiBQbHVnaW5QYXJhbXNcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGFycmF5OiBQbHVnaW5QYXJhbXNbXSA9IFtdO1xuICAgICAgdmFsaWRhdGVJbnRlcnZhbEZvclJlc2FtcGxlKFxuICAgICAgICBwYXJhbXMuZW5kRGF0ZS5kaWZmKHBhcmFtcy5zdGFydERhdGUpLmFzKCdzZWNvbmRzJyksXG4gICAgICAgIHBhcmFtcy50aW1lU3RlcCxcbiAgICAgICAgSU5DT01QQVRJQkxFX1JFU09MVVRJT05fV0lUSF9HQVBTXG4gICAgICApO1xuICAgICAgY29uc3QgZGF0ZVJhbmdlID0gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhcbiAgICAgICAgcGFyYW1zLnN0YXJ0RGF0ZSxcbiAgICAgICAgcGFyYW1zLmVuZERhdGVcbiAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgaW50ZXJ2YWwgb2YgZGF0ZVJhbmdlLnNwbGl0Qnkoe3NlY29uZDogcGFyYW1zLnRpbWVTdGVwfSkpIHtcbiAgICAgICAgYXJyYXkucHVzaChcbiAgICAgICAgICBmaWxsV2l0aFplcm9pc2hJbnB1dChcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgLy8gYXMgZmFyIGFzIEkgY2FuIHRlbGwsIHN0YXJ0IHdpbGwgbmV2ZXIgYmUgbnVsbFxuICAgICAgICAgICAgLy8gYmVjYXVzZSBpZiB3ZSBwYXNzIGFuIGludmFsaWQgc3RhcnQvZW5kRGF0ZSB0b1xuICAgICAgICAgICAgLy8gSW50ZXJ2YWwsIHdlIGdldCBhIHplcm8gbGVuZ3RoIGFycmF5IGFzIHRoZSByYW5nZVxuICAgICAgICAgICAgaW50ZXJ2YWwuc3RhcnQgfHwgRGF0ZVRpbWUuaW52YWxpZCgnbm90IGV4cGVjdGVkIC0gc3RhcnQgaXMgbnVsbCcpLFxuICAgICAgICAgICAgcGFyYW1zLnRpbWVTdGVwXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcblxuICAgIC8qXG4gICAgICogQ2hlY2tzIGlmIGlucHV0J3MgdGltZXN0YW1wIGlzIGluY2x1ZGVkIGluIGdsb2JhbCBzcGVjaWZpZWQgcGVyaW9kIHRoZW4gbGVhdmVzIGl0LCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgY29uc3QgdHJpbUlucHV0c0J5R2xvYmFsVGltZWxpbmUgPSAoXG4gICAgICBpbnB1dHM6IFBsdWdpblBhcmFtc1tdLFxuICAgICAgcGFyYW1zOiBUaW1lUGFyYW1zXG4gICAgKTogUGx1Z2luUGFyYW1zW10gPT5cbiAgICAgIGlucHV0cy5yZWR1Y2UoKGFjYzogUGx1Z2luUGFyYW1zW10sIGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3Qge3RpbWVzdGFtcH0gPSBpdGVtO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBwYXJzZURhdGUodGltZXN0YW1wKSA+PSBwYXJhbXMuc3RhcnRUaW1lICYmXG4gICAgICAgICAgcGFyc2VEYXRlKHRpbWVzdGFtcCkgPD0gcGFyYW1zLmVuZFRpbWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgYWNjLnB1c2goaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgW10gYXMgUGx1Z2luUGFyYW1zW10pO1xuXG4gICAgLyoqIEltcGxlbWVudGF0aW9uICovXG4gICAgY29uc3QgdGltZVBhcmFtcyA9IHtcbiAgICAgIHN0YXJ0VGltZTogRGF0ZVRpbWUuZnJvbUlTTyhjb25maWdbJ3N0YXJ0LXRpbWUnXSBhcyBzdHJpbmcpLFxuICAgICAgZW5kVGltZTogRGF0ZVRpbWUuZnJvbUlTTyhjb25maWdbJ2VuZC10aW1lJ10gYXMgc3RyaW5nKSxcbiAgICAgIGludGVydmFsOiBjb25maWcuaW50ZXJ2YWwsXG4gICAgICBhbGxvd1BhZGRpbmc6IGNvbmZpZ1snYWxsb3ctcGFkZGluZyddLFxuICAgICAgdXBzYW1wbGluZ1Jlc29sdXRpb246IGNvbmZpZ1sndXBzYW1wbGluZy1yZXNvbHV0aW9uJ11cbiAgICAgICAgPyBjb25maWdbJ3Vwc2FtcGxpbmctcmVzb2x1dGlvbiddXG4gICAgICAgIDogMSxcbiAgICB9O1xuICAgIHZhbGlkYXRlSW50ZXJ2YWxGb3JSZXNhbXBsZShcbiAgICAgIHRpbWVQYXJhbXMuaW50ZXJ2YWwsXG4gICAgICB0aW1lUGFyYW1zLnVwc2FtcGxpbmdSZXNvbHV0aW9uLFxuICAgICAgSU5DT01QQVRJQkxFX1JFU09MVVRJT05fV0lUSF9JTlRFUlZBTFxuICAgICk7XG4gICAgY29uc3QgcGFkID0gY2hlY2tGb3JQYWRkaW5nKGlucHV0cywgdGltZVBhcmFtcyk7XG4gICAgdmFsaWRhdGVQYWRkaW5nKHBhZCwgdGltZVBhcmFtcyk7XG4gICAgY29uc3QgcGFkZGVkSW5wdXRzID0gcGFkSW5wdXRzKGlucHV0cywgcGFkLCB0aW1lUGFyYW1zKTtcblxuICAgIGNvbnN0IGZsYXR0ZW5JbnB1dHMgPSBwYWRkZWRJbnB1dHMucmVkdWNlKFxuICAgICAgKGFjYzogUGx1Z2luUGFyYW1zW10sIGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50TW9tZW50ID0gcGFyc2VEYXRlKGlucHV0LnRpbWVzdGFtcCk7XG5cbiAgICAgICAgLyoqIENoZWNrcyBpZiBub3QgdGhlIGZpcnN0IGlucHV0LCB0aGVuIGNoZWNrIGNvbnNpc3RlbmN5IHdpdGggcHJldmlvdXMgb25lcy4gKi9cbiAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5wdXQgPSBwYWRkZWRJbnB1dHNbaW5kZXggLSAxXTtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0lucHV0VGltZXN0YW1wID0gcGFyc2VEYXRlKHByZXZpb3VzSW5wdXQudGltZXN0YW1wKTtcblxuICAgICAgICAgIC8qKiBDaGVja3MgZm9yIHRpbWVzdGFtcHMgb3ZlcmxhcC4gKi9cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJzZURhdGUocHJldmlvdXNJbnB1dC50aW1lc3RhbXApLnBsdXMoe1xuICAgICAgICAgICAgICBzZWNvbmRzOiBldmFsKHByZXZpb3VzSW5wdXQuZHVyYXRpb24pLFxuICAgICAgICAgICAgfSkgPiBjdXJyZW50TW9tZW50XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZElucHV0RXJyb3IoSU5WQUxJRF9PQlNFUlZBVElPTl9PVkVSTEFQKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21wYXJlYWJsZVRpbWUgPSBwcmV2aW91c0lucHV0VGltZXN0YW1wLnBsdXMoe1xuICAgICAgICAgICAgc2Vjb25kczogZXZhbChwcmV2aW91c0lucHV0LmR1cmF0aW9uKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHRpbWVsaW5lR2FwU2l6ZSA9IGN1cnJlbnRNb21lbnRcbiAgICAgICAgICAgIC5kaWZmKGNvbXBhcmVhYmxlVGltZSlcbiAgICAgICAgICAgIC5hcygnc2Vjb25kcycpO1xuXG4gICAgICAgICAgdmFsaWRhdGVJbnRlcnZhbEZvclJlc2FtcGxlKFxuICAgICAgICAgICAgaW5wdXQuZHVyYXRpb24sXG4gICAgICAgICAgICB0aW1lUGFyYW1zLnVwc2FtcGxpbmdSZXNvbHV0aW9uLFxuICAgICAgICAgICAgSU5DT01QQVRJQkxFX1JFU09MVVRJT05fV0lUSF9JTlBVVFNcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHRpbWVsaW5lR2FwU2l6ZSA+IDEpIHtcbiAgICAgICAgICAgIC8qKiBDaGVja3MgaWYgdGhlcmUgaXMgZ2FwIGluIHRpbWVsaW5lLiAqL1xuICAgICAgICAgICAgYWNjLnB1c2goXG4gICAgICAgICAgICAgIC4uLmdldFplcm9pc2hJbnB1dFBlclNlY29uZEJldHdlZW5SYW5nZShcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBzdGFydERhdGU6IGNvbXBhcmVhYmxlVGltZSxcbiAgICAgICAgICAgICAgICAgIGVuZERhdGU6IGN1cnJlbnRNb21lbnQsXG4gICAgICAgICAgICAgICAgICB0aW1lU3RlcDogdGltZVBhcmFtcy51cHNhbXBsaW5nUmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlucHV0XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqIEJyZWFrIGRvd24gY3VycmVudCBvYnNlcnZhdGlvbi4gKi9cbiAgICAgICAgZm9yIChcbiAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgaSA8PSBpbnB1dC5kdXJhdGlvbiAtIHRpbWVQYXJhbXMudXBzYW1wbGluZ1Jlc29sdXRpb247XG4gICAgICAgICAgaSArPSB0aW1lUGFyYW1zLnVwc2FtcGxpbmdSZXNvbHV0aW9uXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJbnB1dCA9IGJyZWFrRG93bklucHV0KGlucHV0LCBpLCB0aW1lUGFyYW1zKTtcblxuICAgICAgICAgIGFjYy5wdXNoKG5vcm1hbGl6ZWRJbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJpbUlucHV0c0J5R2xvYmFsVGltZWxpbmUoYWNjLCB0aW1lUGFyYW1zKTtcbiAgICAgIH0sXG4gICAgICBbXSBhcyBQbHVnaW5QYXJhbXNbXVxuICAgICk7XG5cbiAgICBjb25zdCBzb3J0ZWRJbnB1dHMgPSBmbGF0dGVuSW5wdXRzLnNvcnQoKGEsIGIpID0+XG4gICAgICBwYXJzZURhdGUoYS50aW1lc3RhbXApLmRpZmYocGFyc2VEYXRlKGIudGltZXN0YW1wKSkuYXMoJ3NlY29uZHMnKVxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzYW1wbGVJbnB1dHMoc29ydGVkSW5wdXRzLCB0aW1lUGFyYW1zKSBhcyBQbHVnaW5QYXJhbXNbXTtcbiAgfSxcbn0pO1xuIl19
@@ -13,7 +13,8 @@ const { AGGREGATION_TIME_METRICS } = config_1.CONFIG;
13
13
  */
14
14
  const aggregateOutputsIntoOne = (outputs, metrics, isTemporal) => {
15
15
  const metricsWithTime = metrics.concat(AGGREGATION_TIME_METRICS);
16
- return outputs.reduce((acc, output, index) => {
16
+ const medianBuckets = {};
17
+ const result = outputs.reduce((acc, output, index) => {
17
18
  for (const metric of metricsWithTime) {
18
19
  if (!(metric in output)) {
19
20
  throw new MissingAggregationParamError(METRIC_MISSING(metric, index));
@@ -28,6 +29,7 @@ const aggregateOutputsIntoOne = (outputs, metrics, isTemporal) => {
28
29
  const aggregationParams = (0, aggregate_1.getAggregationInfoFor)(metric);
29
30
  /** Checks either its a temporal aggregation (vertical), then chooses `component`, otherwise `time`. */
30
31
  const aggregationType = isTemporal ? 'component' : 'time';
32
+ const method = aggregationParams[aggregationType];
31
33
  if (aggregationParams[aggregationType] === 'none') {
32
34
  continue;
33
35
  }
@@ -35,18 +37,67 @@ const aggregateOutputsIntoOne = (outputs, metrics, isTemporal) => {
35
37
  acc[metric] = output[metric];
36
38
  continue;
37
39
  }
38
- acc[metric] = acc[metric] ?? 0;
39
- acc[metric] += parseFloat(output[metric]);
40
+ const n = Number(output[metric]);
41
+ const value = Number.isFinite(n) ? n : 0;
42
+ switch (method) {
43
+ case 'median': {
44
+ if (!medianBuckets[metric])
45
+ medianBuckets[metric] = [];
46
+ medianBuckets[metric].push(value);
47
+ break;
48
+ }
49
+ case 'min': {
50
+ const cur = acc[metric] ?? Number.POSITIVE_INFINITY;
51
+ acc[metric] = Math.min(cur, value);
52
+ break;
53
+ }
54
+ case 'max': {
55
+ const cur = acc[metric] ?? Number.NEGATIVE_INFINITY;
56
+ acc[metric] = Math.max(cur, value);
57
+ break;
58
+ }
59
+ case 'sum':
60
+ case 'avg': {
61
+ const cur = acc[metric] ?? 0;
62
+ acc[metric] = cur + value;
63
+ break;
64
+ }
65
+ default: {
66
+ throw new Error(`Unsupported aggregation method: ${String(method)} for ${metric}`);
67
+ break;
68
+ }
69
+ }
40
70
  /** Checks for the last iteration. */
41
71
  if (index === outputs.length - 1) {
42
- if (aggregationParams[aggregationType] === 'avg') {
43
- acc[metric] /= outputs.length;
72
+ switch (method) {
73
+ case 'avg': {
74
+ acc[metric] /= outputs.length;
75
+ break;
76
+ }
77
+ case 'median': {
78
+ const arr = medianBuckets[metric] ?? [];
79
+ if (arr.length === 0) {
80
+ acc[metric] = 0;
81
+ }
82
+ else {
83
+ arr.sort((a, b) => a - b);
84
+ const mid = Math.floor(arr.length / 2);
85
+ acc[metric] =
86
+ arr.length % 2 === 0
87
+ ? (arr[mid - 1] + arr[mid]) / 2
88
+ : arr[mid];
89
+ }
90
+ break;
91
+ }
92
+ default:
93
+ break;
44
94
  }
45
95
  }
46
96
  }
47
97
  }
48
98
  return acc;
49
99
  }, {});
100
+ return result;
50
101
  };
51
102
  exports.aggregateOutputsIntoOne = aggregateOutputsIntoOne;
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRpb24taGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLXJ1bi91dGlsL2FnZ3JlZ2F0aW9uLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBNkM7QUFHN0Msc0NBQTBDO0FBSTFDLGdEQUF1RDtBQUV2RCxNQUFNLEVBQUMsNEJBQTRCLEVBQUMsR0FBRyxjQUFNLENBQUM7QUFDOUMsTUFBTSxFQUFDLGNBQWMsRUFBQyxHQUFHLGdCQUFPLENBQUM7QUFDakMsTUFBTSxFQUFDLHdCQUF3QixFQUFDLEdBQUcsZUFBTSxDQUFDO0FBRTFDOzs7R0FHRztBQUNJLE1BQU0sdUJBQXVCLEdBQUcsQ0FDckMsT0FBdUIsRUFDdkIsT0FBaUIsRUFDakIsVUFBb0IsRUFDcEIsRUFBRTtJQUNGLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUVqRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksZUFBZSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxJQUFJLDRCQUE0QixDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUN2RTtZQUVELGdGQUFnRjtZQUNoRixJQUFJLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDN0MsSUFBSSxVQUFVLEVBQUU7b0JBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDOUI7YUFDRjtpQkFBTTtnQkFDTCxNQUFNLGlCQUFpQixHQUFHLElBQUEsaUNBQXFCLEVBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hELHdHQUF3RztnQkFDeEcsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFFMUQsSUFBSSxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsS0FBSyxNQUFNLEVBQUU7b0JBQ2pELFNBQVM7aUJBQ1Y7Z0JBRUQsSUFBSSxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsS0FBSyxNQUFNLEVBQUU7b0JBQ2pELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzdCLFNBQVM7aUJBQ1Y7Z0JBRUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBRTFDLHFDQUFxQztnQkFDckMsSUFBSSxLQUFLLEtBQUssT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ2hDLElBQUksaUJBQWlCLENBQUMsZUFBZSxDQUFDLEtBQUssS0FBSyxFQUFFO3dCQUNoRCxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQztxQkFDL0I7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBdUIsQ0FBQyxDQUFDO0FBQzlCLENBQUMsQ0FBQztBQTlDVyxRQUFBLHVCQUF1QiwyQkE4Q2xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFUlJPUlN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS91dGlscyc7XG5pbXBvcnQge1BsdWdpblBhcmFtc30gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3R5cGVzJztcblxuaW1wb3J0IHtDT05GSUcsIFNUUklOR1N9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmltcG9ydCB7QWdncmVnYXRpb25SZXN1bHR9IGZyb20gJy4uL3R5cGVzL2FnZ3JlZ2F0aW9uJztcblxuaW1wb3J0IHtnZXRBZ2dyZWdhdGlvbkluZm9Gb3J9IGZyb20gJy4uL2xpYi9hZ2dyZWdhdGUnO1xuXG5jb25zdCB7TWlzc2luZ0FnZ3JlZ2F0aW9uUGFyYW1FcnJvcn0gPSBFUlJPUlM7XG5jb25zdCB7TUVUUklDX01JU1NJTkd9ID0gU1RSSU5HUztcbmNvbnN0IHtBR0dSRUdBVElPTl9USU1FX01FVFJJQ1N9ID0gQ09ORklHO1xuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgY2hpbGQgbm9kZSBsZXZlbCBtZXRyaWNzLiBBcHBlbmRzIGFnZ3JlZ2F0aW9uIGFkZGl0aW9uYWwgcGFyYW1zIHRvIG1ldHJpY3MuXG4gKiBPdGhlcndpc2UgaXRlcmF0ZXMgb3ZlciBvdXRwdXRzIGJ5IGFnZ3JlZ2F0aW5nIHBlciBnaXZlbiBgbWV0cmljc2AuXG4gKi9cbmV4cG9ydCBjb25zdCBhZ2dyZWdhdGVPdXRwdXRzSW50b09uZSA9IChcbiAgb3V0cHV0czogUGx1Z2luUGFyYW1zW10sXG4gIG1ldHJpY3M6IHN0cmluZ1tdLFxuICBpc1RlbXBvcmFsPzogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IG1ldHJpY3NXaXRoVGltZSA9IG1ldHJpY3MuY29uY2F0KEFHR1JFR0FUSU9OX1RJTUVfTUVUUklDUyk7XG5cbiAgcmV0dXJuIG91dHB1dHMucmVkdWNlKChhY2MsIG91dHB1dCwgaW5kZXgpID0+IHtcbiAgICBmb3IgKGNvbnN0IG1ldHJpYyBvZiBtZXRyaWNzV2l0aFRpbWUpIHtcbiAgICAgIGlmICghKG1ldHJpYyBpbiBvdXRwdXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBNaXNzaW5nQWdncmVnYXRpb25QYXJhbUVycm9yKE1FVFJJQ19NSVNTSU5HKG1ldHJpYywgaW5kZXgpKTtcbiAgICAgIH1cblxuICAgICAgLyoqIENoZWNrcyBpZiBtZXRyaWMgaXMgdGltZXN0YW1wIG9yIGR1cmF0aW9uLCB0aGVuIGFkZHMgdG8gYWdncmVnYXRlZCB2YWx1ZS4gKi9cbiAgICAgIGlmIChBR0dSRUdBVElPTl9USU1FX01FVFJJQ1MuaW5jbHVkZXMobWV0cmljKSkge1xuICAgICAgICBpZiAoaXNUZW1wb3JhbCkge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gb3V0cHV0W21ldHJpY107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0aW9uUGFyYW1zID0gZ2V0QWdncmVnYXRpb25JbmZvRm9yKG1ldHJpYyk7XG4gICAgICAgIC8qKiBDaGVja3MgZWl0aGVyIGl0cyBhIHRlbXBvcmFsIGFnZ3JlZ2F0aW9uICh2ZXJ0aWNhbCksIHRoZW4gY2hvb3NlcyBgY29tcG9uZW50YCwgb3RoZXJ3aXNlIGB0aW1lYC4gICovXG4gICAgICAgIGNvbnN0IGFnZ3JlZ2F0aW9uVHlwZSA9IGlzVGVtcG9yYWwgPyAnY29tcG9uZW50JyA6ICd0aW1lJztcblxuICAgICAgICBpZiAoYWdncmVnYXRpb25QYXJhbXNbYWdncmVnYXRpb25UeXBlXSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWdncmVnYXRpb25QYXJhbXNbYWdncmVnYXRpb25UeXBlXSA9PT0gJ2NvcHknKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gPSBvdXRwdXRbbWV0cmljXTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjY1ttZXRyaWNdID0gYWNjW21ldHJpY10gPz8gMDtcbiAgICAgICAgYWNjW21ldHJpY10gKz0gcGFyc2VGbG9hdChvdXRwdXRbbWV0cmljXSk7XG5cbiAgICAgICAgLyoqIENoZWNrcyBmb3IgdGhlIGxhc3QgaXRlcmF0aW9uLiAqL1xuICAgICAgICBpZiAoaW5kZXggPT09IG91dHB1dHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGlmIChhZ2dyZWdhdGlvblBhcmFtc1thZ2dyZWdhdGlvblR5cGVdID09PSAnYXZnJykge1xuICAgICAgICAgICAgYWNjW21ldHJpY10gLz0gb3V0cHV0cy5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgQWdncmVnYXRpb25SZXN1bHQpO1xufTtcbiJdfQ==
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRpb24taGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLXJ1bi91dGlsL2FnZ3JlZ2F0aW9uLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBNkM7QUFHN0Msc0NBQTBDO0FBSTFDLGdEQUF1RDtBQUV2RCxNQUFNLEVBQUMsNEJBQTRCLEVBQUMsR0FBRyxjQUFNLENBQUM7QUFDOUMsTUFBTSxFQUFDLGNBQWMsRUFBQyxHQUFHLGdCQUFPLENBQUM7QUFDakMsTUFBTSxFQUFDLHdCQUF3QixFQUFDLEdBQUcsZUFBTSxDQUFDO0FBRTFDOzs7R0FHRztBQUNJLE1BQU0sdUJBQXVCLEdBQUcsQ0FDckMsT0FBdUIsRUFDdkIsT0FBaUIsRUFDakIsVUFBb0IsRUFDcEIsRUFBRTtJQUNGLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUdqRSxNQUFNLGFBQWEsR0FBa0IsRUFBRSxDQUFDO0lBRXhDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQ25ELEtBQUssTUFBTSxNQUFNLElBQUksZUFBZSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxJQUFJLDRCQUE0QixDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUN2RTtZQUVELGdGQUFnRjtZQUNoRixJQUFJLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDN0MsSUFBSSxVQUFVLEVBQUU7b0JBQ2QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDOUI7YUFDRjtpQkFBTTtnQkFDTCxNQUFNLGlCQUFpQixHQUFH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RSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dDQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0NBQ3ZDLEdBQUcsQ0FBQyxNQUFNLENBQUM7b0NBQ1QsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQzt3Q0FDbEIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO3dDQUMvQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzZCQUNoQjs0QkFDRCxNQUFNO3lCQUNQO3dCQUNEOzRCQUNFLE1BQU07cUJBQ1Q7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBdUIsQ0FBQyxDQUFDO0lBQzVCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQTVHVyxRQUFBLHVCQUF1QiwyQkE0R2xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFUlJPUlN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS91dGlscyc7XG5pbXBvcnQge1BsdWdpblBhcmFtc30gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3R5cGVzJztcblxuaW1wb3J0IHtDT05GSUcsIFNUUklOR1N9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmltcG9ydCB7QWdncmVnYXRpb25SZXN1bHR9IGZyb20gJy4uL3R5cGVzL2FnZ3JlZ2F0aW9uJztcblxuaW1wb3J0IHtnZXRBZ2dyZWdhdGlvbkluZm9Gb3J9IGZyb20gJy4uL2xpYi9hZ2dyZWdhdGUnO1xuXG5jb25zdCB7TWlzc2luZ0FnZ3JlZ2F0aW9uUGFyYW1FcnJvcn0gPSBFUlJPUlM7XG5jb25zdCB7TUVUUklDX01JU1NJTkd9ID0gU1RSSU5HUztcbmNvbnN0IHtBR0dSRUdBVElPTl9USU1FX01FVFJJQ1N9ID0gQ09ORklHO1xuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgY2hpbGQgbm9kZSBsZXZlbCBtZXRyaWNzLiBBcHBlbmRzIGFnZ3JlZ2F0aW9uIGFkZGl0aW9uYWwgcGFyYW1zIHRvIG1ldHJpY3MuXG4gKiBPdGhlcndpc2UgaXRlcmF0ZXMgb3ZlciBvdXRwdXRzIGJ5IGFnZ3JlZ2F0aW5nIHBlciBnaXZlbiBgbWV0cmljc2AuXG4gKi9cbmV4cG9ydCBjb25zdCBhZ2dyZWdhdGVPdXRwdXRzSW50b09uZSA9IChcbiAgb3V0cHV0czogUGx1Z2luUGFyYW1zW10sXG4gIG1ldHJpY3M6IHN0cmluZ1tdLFxuICBpc1RlbXBvcmFsPzogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IG1ldHJpY3NXaXRoVGltZSA9IG1ldHJpY3MuY29uY2F0KEFHR1JFR0FUSU9OX1RJTUVfTUVUUklDUyk7XG5cbiAgdHlwZSBNZWRpYW5CdWNrZXRzID0gUmVjb3JkPHN0cmluZywgbnVtYmVyW10+O1xuICBjb25zdCBtZWRpYW5CdWNrZXRzOiBNZWRpYW5CdWNrZXRzID0ge307XG5cbiAgY29uc3QgcmVzdWx0ID0gb3V0cHV0cy5yZWR1Y2UoKGFjYywgb3V0cHV0LCBpbmRleCkgPT4ge1xuICAgIGZvciAoY29uc3QgbWV0cmljIG9mIG1ldHJpY3NXaXRoVGltZSkge1xuICAgICAgaWYgKCEobWV0cmljIGluIG91dHB1dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdBZ2dyZWdhdGlvblBhcmFtRXJyb3IoTUVUUklDX01JU1NJTkcobWV0cmljLCBpbmRleCkpO1xuICAgICAgfVxuXG4gICAgICAvKiogQ2hlY2tzIGlmIG1ldHJpYyBpcyB0aW1lc3RhbXAgb3IgZHVyYXRpb24sIHRoZW4gYWRkcyB0byBhZ2dyZWdhdGVkIHZhbHVlLiAqL1xuICAgICAgaWYgKEFHR1JFR0FUSU9OX1RJTUVfTUVUUklDUy5pbmNsdWRlcyhtZXRyaWMpKSB7XG4gICAgICAgIGlmIChpc1RlbXBvcmFsKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gPSBvdXRwdXRbbWV0cmljXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYWdncmVnYXRpb25QYXJhbXMgPSBnZXRBZ2dyZWdhdGlvbkluZm9Gb3IobWV0cmljKTtcbiAgICAgICAgLyoqIENoZWNrcyBlaXRoZXIgaXRzIGEgdGVtcG9yYWwgYWdncmVnYXRpb24gKHZlcnRpY2FsKSwgdGhlbiBjaG9vc2VzIGBjb21wb25lbnRgLCBvdGhlcndpc2UgYHRpbWVgLiAgKi9cbiAgICAgICAgY29uc3QgYWdncmVnYXRpb25UeXBlID0gaXNUZW1wb3JhbCA/ICdjb21wb25lbnQnIDogJ3RpbWUnO1xuXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IGFnZ3JlZ2F0aW9uUGFyYW1zW2FnZ3JlZ2F0aW9uVHlwZV0gYXNcbiAgICAgICAgICB8ICdub25lJ1xuICAgICAgICAgIHwgJ2NvcHknXG4gICAgICAgICAgfCAnc3VtJ1xuICAgICAgICAgIHwgJ2F2ZydcbiAgICAgICAgICB8ICdtaW4nXG4gICAgICAgICAgfCAnbWF4J1xuICAgICAgICAgIHwgJ21lZGlhbic7XG5cbiAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zW2FnZ3JlZ2F0aW9uVHlwZV0gPT09ICdub25lJykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uUGFyYW1zW2FnZ3JlZ2F0aW9uVHlwZV0gPT09ICdjb3B5Jykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gb3V0cHV0W21ldHJpY107XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuID0gTnVtYmVyKG91dHB1dFttZXRyaWNdKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBOdW1iZXIuaXNGaW5pdGUobikgPyBuIDogMDtcblxuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgIGNhc2UgJ21lZGlhbic6IHtcbiAgICAgICAgICAgIGlmICghbWVkaWFuQnVja2V0c1ttZXRyaWNdKSBtZWRpYW5CdWNrZXRzW21ldHJpY10gPSBbXTtcbiAgICAgICAgICAgIG1lZGlhbkJ1Y2tldHNbbWV0cmljXSEucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbWluJzoge1xuICAgICAgICAgICAgY29uc3QgY3VyID0gKGFjY1ttZXRyaWNdIGFzIG51bWJlcikgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgYWNjW21ldHJpY10gPSBNYXRoLm1pbihjdXIsIHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdtYXgnOiB7XG4gICAgICAgICAgICBjb25zdCBjdXIgPSAoYWNjW21ldHJpY10gYXMgbnVtYmVyKSA/PyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICBhY2NbbWV0cmljXSA9IE1hdGgubWF4KGN1ciwgdmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3N1bSc6XG4gICAgICAgICAgY2FzZSAnYXZnJzoge1xuICAgICAgICAgICAgY29uc3QgY3VyID0gKGFjY1ttZXRyaWNdIGFzIG51bWJlcikgPz8gMDtcbiAgICAgICAgICAgIGFjY1ttZXRyaWNdID0gY3VyICsgdmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVW5zdXBwb3J0ZWQgYWdncmVnYXRpb24gbWV0aG9kOiAke1N0cmluZyhtZXRob2QpfSBmb3IgJHttZXRyaWN9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBDaGVja3MgZm9yIHRoZSBsYXN0IGl0ZXJhdGlvbi4gKi9cbiAgICAgICAgaWYgKGluZGV4ID09PSBvdXRwdXRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgICAgY2FzZSAnYXZnJzoge1xuICAgICAgICAgICAgICBhY2NbbWV0cmljXSAvPSBvdXRwdXRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtZWRpYW4nOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGFyciA9IG1lZGlhbkJ1Y2tldHNbbWV0cmljXSA/PyBbXTtcbiAgICAgICAgICAgICAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBhY2NbbWV0cmljXSA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJyLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKGFyci5sZW5ndGggLyAyKTtcbiAgICAgICAgICAgICAgICBhY2NbbWV0cmljXSA9XG4gICAgICAgICAgICAgICAgICBhcnIubGVuZ3RoICUgMiA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IChhcnJbbWlkIC0gMV0gKyBhcnJbbWlkXSkgLyAyXG4gICAgICAgICAgICAgICAgICAgIDogYXJyW21pZF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBBZ2dyZWdhdGlvblJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIl19
@@ -18,10 +18,18 @@
18
18
 
19
19
  ## Branch names and purposes
20
20
 
21
- Our main repositories all have two branches: `main` and `release`.
22
- Here are the rules applied to each branch:
21
+ ### `if`
23
22
 
24
- ### `if`, `if-plugins`, `if-unofficial-plugins` and `if-exhaust-plugins`
23
+ #### `main`
24
+ - target branch for PRs and releases
25
+ - PRs can be merged into `main` with two core team reviews, one being QA
26
+ - pushing directly to `main` is forbidden - all changes are by PR (except the signed version-bump commit from the release workflow)
27
+ - PRs will not be merged if they do not pass CI/CD
28
+ - npm packages are published from `main` when a GitHub Release is published
29
+
30
+ ### `if-plugins`, `if-unofficial-plugins` and `if-exhaust-plugins`
31
+
32
+ These repositories still use two branches: `main` and `release`.
25
33
 
26
34
  #### `main`
27
35
  - target branch for PRs
@@ -56,20 +64,39 @@ Here are the rules applied to each branch:
56
64
 
57
65
  ### When can we break our rules?
58
66
 
59
- - `release` branches have the strictest rules. We should never override the process outlined above for `release` branches in any repository.
67
+ - `release` branches (where used) have the strictest rules. We should never override the process outlined above for `release` branches in those repositories.
60
68
  - On `main` we can be slightly more flexible. It is acceptable to skip QA for PRs that only change typos, documentation or comments. Any changes to source code or tests should be QA approved before merge.
61
69
  - In emergency scenarios where an urgent hotfix is required it might be required to skip QA review on `main` branches - this should only happen with QA authorization so QA can retroactively test as soon as possible.
62
70
 
63
71
  ### How to create a release
64
72
 
65
- Creating a release of `if`, `if-plugins` or `if-unofficial-plugins` is achieved by following these steps:
73
+ #### `if`
74
+
75
+ 1. Ensure `main` contains the changes you want to ship and QA has approved.
76
+ 2. In GitHub, go to **Releases → Draft a new release**.
77
+ 3. Create a tag on `main` using the `v` prefix (for example `v1.2.0` or `v1.2.0-beta.0`).
78
+ 4. Check **Set as a pre-release** for beta releases. This publishes to npm with the `beta` dist-tag; stable releases use `latest`.
79
+ 5. Publish the release. CI runs tests, bumps `package.json` / `package-lock.json` on `main`, pushes a signed commit, and publishes to npm.
80
+
81
+ The version-bump commit uses the same SSH signing key as local commits. Configure these repository settings first:
82
+
83
+ - **Variable** `RELEASE_USER_EMAIL` — email on your GitHub account (for example `narhovhannisian@gmail.com`)
84
+ - **Variable** `RELEASE_USER_NAME` — optional; name used for release commits
85
+ - **Secret** `RELEASE_DEPLOY_KEY` — private key for the repo deploy key (write access)
86
+ - **Secret** `RELEASE_SSH_PRIVATE_KEY` — the same SSH **private** key you use locally for commit signing
87
+ - **Secret** `NPM_TOKEN` — npm publish token
88
+
89
+ Add the deploy key under **Settings → Deploy keys** (write access). Add **Deploy keys** to the ruleset bypass list for `main` so the release workflow can push directly.
90
+
91
+ The matching SSH **public** signing key must be added to your GitHub account under **Settings → SSH and GPG keys → Signing Key** (this is separate from the deploy key).
92
+
93
+ To retry a failed release without publishing a new GitHub Release, go to **Actions → Release → Run workflow**, enter the tag (for example `v1.1.1`), and run it.
94
+
95
+ We use [semantic versioning](https://semver.org/) to number our releases.
66
96
 
67
- 1) core team member creates a tagged release on `main`
68
- 2) new tagged release triggers automatic commit to be pushed to `main` that updates package and lock files that include new version numbers
69
- 3) `main` branch is manually merged into `release` by core team member
70
- 4) merging into release triggers automatic new release to be created on npm
97
+ #### `if-plugins` and `if-unofficial-plugins`
71
98
 
72
- We use [semantic versioning](https://semver.org/) to number our releases.
99
+ Follow the release process documented in those repositories (merge `main` into `release`, then publish from `release`).
73
100
  ## DCO
74
101
 
75
102
  We require contributors to conform to the DCO agreement on our repositories. This means either signing commits or explicitly adding a DCO commit message. This ensures all contributors agree to the conditions imposed by our licenses and adhere to our expected practices. The DCO must be satisfied in order to PRs to be merged.
@@ -128,11 +155,11 @@ We aim to release fortnightly, every other Tuesday. We release npm packages for
128
155
 
129
156
  ## Hotfixes
130
157
 
131
- We will hotfix by raising PRs into `release` when necessary. These PRs require sign-off by a core developer and our QA engineer.
158
+ For `if`, hotfixes are raised as PRs into `main`, then shipped via a GitHub Release once QA approves.
132
159
 
133
- If more than two hotfixes are required on a particular release, the team will call a spike meeting to determine the causes of the bugs, identify any changes required to our QA process and determine next steps for fixing the release.
160
+ For repositories that use a `release` branch, we hotfix by raising PRs into `release` when necessary. Those PRs require sign-off by a core developer and our QA engineer.
134
161
 
135
- Hotfixes on release can be merged back into `main` when they have been fully QA tested.
162
+ If more than two hotfixes are required on a particular release, the team will call a spike meeting to determine the causes of the bugs, identify any changes required to our QA process and determine next steps for fixing the release.
136
163
 
137
164
  We intend for hotfixes to be as infrequent as possible.
138
165
 
@@ -14,7 +14,7 @@ execution:
14
14
  node-version: 18.19.1
15
15
  date-time: 2025-06-03T00:12:17.558Z (UTC)
16
16
  dependencies:
17
- - '@grnsft/if-core@0.0.30'
17
+ - '@grnsft/if-core@0.0.31'
18
18
  - axios@1.8.3
19
19
  - csv-parse@5.5.6
20
20
  - csv-stringify@6.4.6
@@ -214,7 +214,7 @@ execution:
214
214
  node-version: 18.19.1
215
215
  date-time: 2025-06-02T14:32:59.071Z (UTC)
216
216
  dependencies:
217
- - '@grnsft/if-core@0.0.30'
217
+ - '@grnsft/if-core@0.0.31'
218
218
  - axios@1.8.3
219
219
  - csv-parse@5.5.6
220
220
  - csv-stringify@6.4.6
@@ -22,7 +22,7 @@ execution:
22
22
  node-version: 18.19.1
23
23
  date-time: 2025-06-02T14:32:40.906Z (UTC)
24
24
  dependencies:
25
- - '@grnsft/if-core@0.0.30'
25
+ - '@grnsft/if-core@0.0.31'
26
26
  - axios@1.8.3
27
27
  - csv-parse@5.5.6
28
28
  - csv-stringify@6.4.6
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@grnsft/if",
3
3
  "description": "Impact Framework",
4
- "version": "1.1.0",
4
+ "version": "1.1.1",
5
5
  "author": {
6
6
  "name": "Green Software Foundation",
7
7
  "email": "info@gsf.com"
@@ -20,7 +20,7 @@
20
20
  "url": "https://github.com/Green-Software-Foundation/if/issues/new?assignees=&labels=feedback&projects=&template=feedback.md&title=Feedback+-+"
21
21
  },
22
22
  "dependencies": {
23
- "@grnsft/if-core": "^0.0.30",
23
+ "@grnsft/if-core": "^0.0.31",
24
24
  "axios": "^1.7.2",
25
25
  "csv-parse": "^5.5.6",
26
26
  "csv-stringify": "^6.4.6",
@@ -45,12 +45,12 @@
45
45
  "@types/node": "^20.8.9",
46
46
  "axios-mock-adapter": "^1.22.0",
47
47
  "cross-env": "7.0.3",
48
+ "eslint": "^8.57.1",
48
49
  "fixpack": "^4.0.0",
49
50
  "gts": "^5.0.0",
50
51
  "husky": "^8.0.0",
51
52
  "jest": "^29.6.1",
52
53
  "lint-staged": "^15.2.2",
53
- "release-it": "^19.0.3",
54
54
  "rimraf": "^5.0.5",
55
55
  "ts-jest": "^29.1.1",
56
56
  "typescript": "^5.1.6"
@@ -94,7 +94,6 @@
94
94
  "pre-commit": "lint-staged",
95
95
  "prepare": "husky install",
96
96
  "prepublishOnly": "npm run build",
97
- "release": "release-it",
98
97
  "test": "jest --verbose"
99
98
  },
100
99
  "stability": "stable"
@@ -92,6 +92,8 @@ Sometimes there might be discontinuities in the time series between one `observa
92
92
 
93
93
  To solve this problem, for all but the first `observation` in the `inputs` array, we grab the `timestamp` and `duration` from the previous `observation` and check that `timestamp[N] + duration[N] == timestamp[N+1]`. If this condition is not satisfied, we backfill the missing data with a "zero-observation" which is identical to the surrounding observations except any values whose `aggregation-method` is `sum` are set to zero. This is equivalent to assuming that when there is no data available, the app being monitored is switched off.
94
94
 
95
+ For metrics whose `aggregation-method` is `min`, `max` or `median`, Time-Sync treats them as constant-like during normalization, so the gap is backfilled by copying the most recent available value rather than zeroing it. This preserves the semantic meaning of these statistics until they are properly reduced during the later aggregation stage.
96
+
95
97
  The end result of this gap-filling is that we have continuous 1 second resolution data that can be resampled to a new temporal resolution.
96
98
 
97
99
  ```ts
@@ -178,6 +180,7 @@ For example, for `interval = 10` and this time-series
178
180
  setting the `upsampling-resolution` to `10s` is preferable to the default behavior.
179
181
  If the default behavior were used, the model would create `300` samples of `1s` each, which would be inefficient. By setting a custom `upsampling-resolution` of `10s`, the model only generates `30` samples, each representing `10s`.
180
182
 
183
+ While for `sum`, the value is divided evenly across the slice so that the sum over the original duration is preserved, for `avg` or `copy` or `min` or `max` or `median`, it is treated like a per-second constant because using a base resolution can significantly reduce computation while still preserving the statistical meaning of these values during normalization.
181
184
 
182
185
  #### Assumptions and limitations
183
186
 
package/.release-it.json DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "git": {
3
- "requireBranch": false,
4
- "requireUpstream": true,
5
- "commit": true,
6
- "commitMessage": "chore(release): ${version} ✨",
7
- "push": true,
8
- "pushArgs": ["--follow-tags"],
9
- "tag": false
10
- },
11
- "github": {
12
- "tokenRef": "GITHUB_TOKEN",
13
- "preRelease": true
14
- },
15
- "npm": {
16
- "publish": false
17
- }
18
- }