@workflow/core 4.8.1 → 4.8.3

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/step.js CHANGED
@@ -3,7 +3,7 @@ import { withResolvers } from '@workflow/utils';
3
3
  import { EventConsumerResult } from './events-consumer.js';
4
4
  import { WorkflowSuspension } from './global.js';
5
5
  import { stepLogger } from './logger.js';
6
- import { scheduleWhenIdle, } from './private.js';
6
+ import { awaitEarlierDeliveries, registerDeliveryBarrier, scheduleWhenIdle, } from './private.js';
7
7
  import { hydrateStepReturnValue } from './serialization.js';
8
8
  import { getOrHydrateStepReturnValue } from './step-hydration-cache.js';
9
9
  export function createUseStep(ctx) {
@@ -100,6 +100,16 @@ export function createUseStep(ctx) {
100
100
  ctx.invocationsQueue.delete(event.correlationId);
101
101
  // Step failed - chain through promiseQueue to ensure
102
102
  // deterministic ordering of all promise resolutions/rejections.
103
+ //
104
+ // The rejection is as branch-deciding as a success: it decides
105
+ // whether a `try`/`catch` continuation runs, and therefore which
106
+ // ULIDs the follow-up `useStep` calls draw. So it is ordered by
107
+ // event-log position exactly like `step_completed` below — see there
108
+ // for why the deferral is captured here, at event-consumption time,
109
+ // and awaited off the serial queue.
110
+ const eventIndex = ctx.eventsConsumer.eventIndex;
111
+ const barrier = registerDeliveryBarrier(ctx, eventIndex, 'step');
112
+ const earlierDelivered = awaitEarlierDeliveries(ctx, eventIndex, 'step');
103
113
  ctx.promiseQueue = ctx.promiseQueue.then(() => {
104
114
  const errorData = event.eventData.error;
105
115
  const isErrorObject = typeof errorData === 'object' && errorData !== null;
@@ -114,7 +124,10 @@ export function createUseStep(ctx) {
114
124
  if (errorStack) {
115
125
  error.stack = errorStack;
116
126
  }
117
- reject(error);
127
+ void earlierDelivered.then(() => {
128
+ barrier.markDelivered();
129
+ reject(error);
130
+ });
118
131
  });
119
132
  return EventConsumerResult.Finished;
120
133
  }
@@ -133,27 +146,80 @@ export function createUseStep(ctx) {
133
146
  // across an invocation for a sequential N-step workflow. The
134
147
  // per-run `stepHydrationCache` short-circuits that work on
135
148
  // subsequent replays. Crucially, the cache lookup happens INSIDE
136
- // this same promiseQueue slot (and still resolves via `resolve`),
137
- // so a cache hit occupies the exact same position in the ordered
138
- // delivery chain a re-hydrate would have preserving the
139
- // determinism that pendingDeliveries, the delivery barriers, and
140
- // Promise.race/all replay depend on. Only primitive results are
141
- // memoized; non-primitives re-hydrate fresh each replay so a shared
142
- // reference can never carry a mutation between replays.
149
+ // this same promiseQueue slot, so a cache hit occupies the exact
150
+ // same position in the ordered delivery chain a re-hydrate would
151
+ // have preserving the determinism that pendingDeliveries, the
152
+ // delivery barriers, and Promise.race/all replay depend on. Only
153
+ // primitive results are memoized; non-primitives re-hydrate fresh
154
+ // each replay so a shared reference can never carry a mutation
155
+ // between replays.
156
+ //
157
+ // Hydration cost is what makes this delivery's timing unstable
158
+ // across replays of one invocation: the first replay pays the full
159
+ // decrypt/decompress/revive, later replays memo-hit a primitive
160
+ // result in `stepHydrationCache` and finish in a hop or two. A
161
+ // workflow awaiting this result on one branch and a `sleep()` or
162
+ // hook payload on another would therefore allocate its follow-up
163
+ // step ULIDs in a different order on a warm replay than the
164
+ // invocation that WROTE those `step_created` events did — a
165
+ // permanent `ReplayDivergenceError`. So the result is ordered by
166
+ // event-log position through the delivery-barrier registry (see
167
+ // `ctx.pendingDeliveryBarriers`):
168
+ // - Register a 'step' barrier at this event's index so a
169
+ // LATER-in-log wait/hook delivery is handed over only after it.
170
+ // - Hydrate inside this serial queue slot (keeping async
171
+ // deserialization in event-log order) but only CAPTURE the
172
+ // outcome; then defer behind every EARLIER-in-log wait and hook
173
+ // delivery before resolving, and mark this step delivered.
174
+ //
175
+ // The deferral is captured HERE, while consuming the event, and not
176
+ // inside the queue slot. Two reasons, both load-bearing:
177
+ // - Determinism: the set of earlier deliveries is then a function of
178
+ // log position alone. Captured later it would depend on how much
179
+ // hydration the earlier deliveries had already finished — the very
180
+ // coupling this barrier exists to remove.
181
+ // - Coverage: an earlier delivery whose own hydration slot runs
182
+ // first on this serial queue has usually already resolved (and so
183
+ // deregistered its barrier) by the time a later slot starts. Read
184
+ // at slot start, its barrier would be invisible and this step
185
+ // would not defer at all. Every event in one drain window is
186
+ // consumed before any slot runs, so capturing at consumption time
187
+ // sees all of them.
188
+ //
189
+ // The deferral runs OFF the serial queue: it may wait on an earlier
190
+ // wait/hook delivery whose own resolution is driven by this queue,
191
+ // and blocking a queue slot on that would deadlock the queue (the
192
+ // same constraint sleep.ts and hook.ts document). `pendingDeliveries`
193
+ // is likewise released inside the slot, before the detached defer, so
194
+ // `scheduleWhenIdle` can still reach idle and retire the barriers
195
+ // this deferral may be waiting on.
143
196
  const completedEventId = event.eventId;
144
197
  const serializedResult = event.eventData.result;
198
+ const eventIndex = ctx.eventsConsumer.eventIndex;
199
+ const barrier = registerDeliveryBarrier(ctx, eventIndex, 'step');
200
+ let outcome;
201
+ const earlierDelivered = awaitEarlierDeliveries(ctx, eventIndex, 'step');
145
202
  ctx.pendingDeliveries++;
146
203
  ctx.promiseQueue = ctx.promiseQueue.then(async () => {
147
204
  try {
148
205
  const hydratedResult = await getOrHydrateStepReturnValue(ctx.stepHydrationCache, completedEventId, () => hydrateStepReturnValue(serializedResult, ctx.runId, ctx.encryptionKey, ctx.globalThis));
149
- resolve(hydratedResult);
206
+ outcome = { ok: true, value: hydratedResult };
150
207
  }
151
208
  catch (error) {
152
- reject(error);
209
+ outcome = { ok: false, error };
153
210
  }
154
211
  finally {
155
212
  ctx.pendingDeliveries--;
156
213
  }
214
+ void earlierDelivered.then(() => {
215
+ barrier.markDelivered();
216
+ if (outcome.ok) {
217
+ resolve(outcome.value);
218
+ }
219
+ else {
220
+ reject(outcome.error);
221
+ }
222
+ });
157
223
  });
158
224
  return EventConsumerResult.Finished;
159
225
  }
@@ -251,4 +317,4 @@ export function createUseStep(ctx) {
251
317
  return stepFunction;
252
318
  };
253
319
  }
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxnQkFBZ0IsR0FFakIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFeEUsTUFBTSxVQUFVLGFBQWEsQ0FBQyxHQUFnQztJQUM1RCxPQUFPLFNBQVMsT0FBTyxDQUNyQixRQUFnQixFQUNoQixhQUFrRDtRQUVsRCx1RkFBdUY7UUFDdkYsTUFBTSxZQUFZLEdBQUcsVUFFbkIsR0FBRyxJQUFVO1lBRWIsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsYUFBYSxFQUFVLENBQUM7WUFFN0QsTUFBTSxhQUFhLEdBQUcsUUFBUSxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztZQUVuRCxNQUFNLFNBQVMsR0FBNEI7Z0JBQ3pDLElBQUksRUFBRSxNQUFNO2dCQUNaLGFBQWE7Z0JBQ2IsUUFBUTtnQkFDUixJQUFJO2FBQ0wsQ0FBQztZQUVGLHVFQUF1RTtZQUN2RSw4REFBOEQ7WUFDOUQsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUMvRCxTQUFTLENBQUMsT0FBTyxHQUFHLElBQW9CLENBQUM7WUFDM0MsQ0FBQztZQUVELGlFQUFpRTtZQUNqRSxNQUFNLFdBQVcsR0FBRyxhQUFhLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLFNBQVMsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVuRCxVQUFVLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFO2dCQUN0QyxhQUFhO2dCQUNiLFFBQVE7Z0JBQ1IsSUFBSTthQUNMLENBQUMsQ0FBQztZQUNILEdBQUcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDWCxxR0FBcUc7b0JBQ3JHLHlEQUF5RDtvQkFDekQsMkVBQTJFO29CQUMzRSx1RkFBdUY7b0JBQ3ZGLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7d0JBQ3pCLEdBQUcsQ0FBQyxlQUFlLENBQ2pCLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FDN0QsQ0FBQztvQkFDSixDQUFDLENBQUMsQ0FBQztvQkFDSCxPQUFPLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztnQkFDekMsQ0FBQztnQkFFRCxVQUFVLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFO29CQUNqRCxhQUFhO29CQUNiLFFBQVE7b0JBQ1IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNyQixxQkFBcUIsRUFBRSxLQUFLLENBQUMsYUFBYTtvQkFDMUMsT0FBTyxFQUFFLGFBQWEsS0FBSyxLQUFLLENBQUMsYUFBYTtvQkFDOUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2lCQUMzQixDQUFDLENBQUM7Z0JBRUgsSUFBSSxLQUFLLENBQUMsYUFBYSxLQUFLLGFBQWEsRUFBRSxDQUFDO29CQUMxQyx1RkFBdUY7b0JBQ3ZGLE9BQU8sbUJBQW1CLENBQUMsV0FBVyxDQUFDO2dCQUN6QyxDQUFDO2dCQUVELE1BQU0sYUFBYSxHQUNqQixXQUFXLElBQUksS0FBSztvQkFDcEIsS0FBSyxDQUFDLFNBQVM7b0JBQ2YsVUFBVSxJQUFJLEtBQUssQ0FBQyxTQUFTO29CQUMzQixDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRO29CQUMxQixDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUVoQixJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsSUFBSSxhQUFhLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3BFLEdBQUcsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO3dCQUM1QyxHQUFHLENBQUMsZUFBZSxDQUNqQixJQUFJLHFCQUFxQixDQUN2QixpQ0FBaUMsS0FBSyxDQUFDLFNBQVMsUUFBUSxhQUFhLGdCQUFnQixhQUFhLHdDQUF3QyxRQUFRLEdBQUcsRUFDckosRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUMzQixDQUNGLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7b0JBQ0gsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7Z0JBQ3RDLENBQUM7Z0JBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLGNBQWMsRUFBRSxDQUFDO29CQUN2QywwRUFBMEU7b0JBQzFFLDJFQUEyRTtvQkFDM0UsMENBQTBDO29CQUMxQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUMxRCxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7d0JBQzVDLDhEQUE4RDt3QkFDOUQsZ0VBQWdFO3dCQUNoRSxHQUFHLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTs0QkFDNUMsTUFBTSxDQUNKLElBQUkscUJBQXFCLENBQ3ZCLDJCQUEyQixhQUFhLEtBQUssUUFBUSw2Q0FBNkMsRUFDbEcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUMzQixDQUNGLENBQUM7d0JBQ0osQ0FBQyxDQUFDLENBQUM7d0JBQ0gsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7b0JBQ3RDLENBQUM7b0JBQ0QsU0FBUyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7b0JBQ2pDLHNFQUFzRTtvQkFDdEUsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7Z0JBQ3RDLENBQUM7Z0JBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLGNBQWMsRUFBRSxDQUFDO29CQUN2QyxzRkFBc0Y7b0JBQ3RGLHlGQUF5RjtvQkFDekYsZ0NBQWdDO29CQUNoQyxPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztnQkFDdEMsQ0FBQztnQkFFRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssZUFBZSxFQUFFLENBQUM7b0JBQ3hDLGdGQUFnRjtvQkFDaEYsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7Z0JBQ3RDLENBQUM7Z0JBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLGFBQWEsRUFBRSxDQUFDO29CQUN0QywwREFBMEQ7b0JBQzFELEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNqRCxxREFBcUQ7b0JBQ3JELGdFQUFnRTtvQkFDaEUsR0FBRyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7d0JBQzVDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO3dCQUN4QyxNQUFNLGFBQWEsR0FDakIsT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUM7d0JBRXRELE1BQU0sWUFBWSxHQUFHLGFBQWE7NEJBQ2hDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDOzRCQUN4QyxDQUFDLENBQUMsT0FBTyxTQUFTLEtBQUssUUFBUTtnQ0FDN0IsQ0FBQyxDQUFDLFNBQVM7Z0NBQ1gsQ0FBQyxDQUFDLGVBQWUsQ0FBQzt3QkFFdEIsTUFBTSxVQUFVLEdBQ2QsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzs0QkFDN0MsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7d0JBRXhCLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUMzQyxJQUFJLFVBQVUsRUFBRSxDQUFDOzRCQUNmLEtBQUssQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO3dCQUMzQixDQUFDO3dCQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEIsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7Z0JBQ3RDLENBQUM7Z0JBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLGdCQUFnQixFQUFFLENBQUM7b0JBQ3pDLDBEQUEwRDtvQkFDMUQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBRWpELHFFQUFxRTtvQkFDckUsb0VBQW9FO29CQUNwRSwwREFBMEQ7b0JBQzFELDREQUE0RDtvQkFDNUQsaUVBQWlFO29CQUNqRSxtRUFBbUU7b0JBQ25FLEVBQUU7b0JBQ0YsK0RBQStEO29CQUMvRCxxRUFBcUU7b0JBQ3JFLDZEQUE2RDtvQkFDN0QsMkRBQTJEO29CQUMzRCxpRUFBaUU7b0JBQ2pFLGtFQUFrRTtvQkFDbEUsaUVBQWlFO29CQUNqRSwwREFBMEQ7b0JBQzFELGlFQUFpRTtvQkFDakUsZ0VBQWdFO29CQUNoRSxvRUFBb0U7b0JBQ3BFLHdEQUF3RDtvQkFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO29CQUN2QyxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO29CQUNoRCxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDeEIsR0FBRyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTt3QkFDbEQsSUFBSSxDQUFDOzRCQUNILE1BQU0sY0FBYyxHQUFHLE1BQU0sMkJBQTJCLENBQ3RELEdBQUcsQ0FBQyxrQkFBa0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLEdBQUcsRUFBRSxDQUNILHNCQUFzQixDQUNwQixnQkFBZ0IsRUFDaEIsR0FBRyxDQUFDLEtBQUssRUFDVCxHQUFHLENBQUMsYUFBYSxFQUNqQixHQUFHLENBQUMsVUFBVSxDQUNmLENBQ0osQ0FBQzs0QkFDRixPQUFPLENBQUMsY0FBd0IsQ0FBQyxDQUFDO3dCQUNwQyxDQUFDO3dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7NEJBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNoQixDQUFDO2dDQUFTLENBQUM7NEJBQ1QsR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7d0JBQzFCLENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsT0FBTyxtQkFBbUIsQ0FBQyxRQUFRLENBQUM7Z0JBQ3RDLENBQUM7Z0JBRUQsMEVBQTBFO2dCQUMxRSxHQUFHLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDNUMsR0FBRyxDQUFDLGVBQWUsQ0FDakIsSUFBSSxxQkFBcUIsQ0FDdkIscURBQXFELGFBQWEsV0FBVyxRQUFRLE1BQU0sS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUM3RyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQzNCLENBQ0YsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQztRQUVGLHFFQUFxRTtRQUNyRSwrRUFBK0U7UUFDL0UsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoRCxNQUFNLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUU7WUFDMUMsS0FBSyxFQUFFLFlBQVk7U0FDcEIsQ0FBQyxDQUFDO1FBRUgsMEVBQTBFO1FBQzFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRTtZQUM1QyxLQUFLLEVBQUUsUUFBUTtZQUNmLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLEtBQUs7U0FDcEIsQ0FBQyxDQUFDO1FBRUgseURBQXlEO1FBQ3pELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUU7Z0JBQ3JELEtBQUssRUFBRSxhQUFhO2dCQUNwQixRQUFRLEVBQUUsS0FBSztnQkFDZixVQUFVLEVBQUUsS0FBSztnQkFDakIsWUFBWSxFQUFFLEtBQUs7YUFDcEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELGtFQUFrRTtRQUNsRSxzRUFBc0U7UUFDdEUsc0VBQXNFO1FBQ3RFLG9FQUFvRTtRQUNwRSxtRUFBbUU7UUFDbkUsK0RBQStEO1FBQy9ELCtEQUErRDtRQUMvRCx1REFBdUQ7UUFDdkQsRUFBRTtRQUNGLHNFQUFzRTtRQUN0RSw4QkFBOEI7UUFDOUIsZ0VBQWdFO1FBQ2hFLG1FQUFtRTtRQUNuRSx5RUFBeUU7UUFDekUsZ0VBQWdFO1FBQ2hFLG9FQUFvRTtRQUNwRSxvRUFBb0U7UUFDcEUsbUVBQW1FO1FBQ25FLHFFQUFxRTtRQUNyRSxzRUFBc0U7UUFDdEUsb0VBQW9FO1FBQ3BFLGtFQUFrRTtRQUNsRSwrREFBK0Q7UUFDL0QscUVBQXFFO1FBQ3JFLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRTtZQUMxQyxLQUFLLEVBQUUsVUFFTCxPQUFnQixFQUNoQixHQUFHLFdBQXNCO2dCQUV6QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ3hDLElBQUksRUFDSixPQUFPLEVBQ1AsR0FBRyxXQUFXLENBQ2YsQ0FBQztnQkFDRixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7b0JBQ3JDLEtBQUssRUFBRSxRQUFRO29CQUNmLFFBQVEsRUFBRSxLQUFLO29CQUNmLFVBQVUsRUFBRSxLQUFLO29CQUNqQixZQUFZLEVBQUUsS0FBSztpQkFDcEIsQ0FBQyxDQUFDO2dCQUNILElBQUksYUFBYSxFQUFFLENBQUM7b0JBQ2xCLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFO3dCQUM5QyxLQUFLLEVBQUUsYUFBYTt3QkFDcEIsUUFBUSxFQUFFLEtBQUs7d0JBQ2YsVUFBVSxFQUFFLEtBQUs7d0JBQ2pCLFlBQVksRUFBRSxLQUFLO3FCQUNwQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxhQUFhLEVBQUU7b0JBQzFDLEtBQUssRUFBRSxPQUFPO29CQUNkLFFBQVEsRUFBRSxLQUFLO29CQUNmLFVBQVUsRUFBRSxLQUFLO29CQUNqQixZQUFZLEVBQUUsS0FBSztpQkFDcEIsQ0FBQyxDQUFDO2dCQUNILElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFO3dCQUMxQyxLQUFLLEVBQUUsV0FBVzt3QkFDbEIsUUFBUSxFQUFFLEtBQUs7d0JBQ2YsVUFBVSxFQUFFLEtBQUs7d0JBQ2pCLFlBQVksRUFBRSxLQUFLO3FCQUNwQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxRQUFRLEVBQUUsS0FBSztZQUNmLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFlBQVksRUFBRSxLQUFLO1NBQ3BCLENBQUMsQ0FBQztRQUVILE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYXRhbEVycm9yLCBSZXBsYXlEaXZlcmdlbmNlRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB7IHR5cGUgU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0sIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHN0ZXBMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBzY2hlZHVsZVdoZW5JZGxlLFxuICB0eXBlIFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbn0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi9zY2hlbWFzLmpzJztcbmltcG9ydCB7IGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgZ2V0T3JIeWRyYXRlU3RlcFJldHVyblZhbHVlIH0gZnJvbSAnLi9zdGVwLWh5ZHJhdGlvbi1jYWNoZS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVVc2VTdGVwKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiB1c2VTdGVwPEFyZ3MgZXh0ZW5kcyBTZXJpYWxpemFibGVbXSwgUmVzdWx0PihcbiAgICBzdGVwTmFtZTogc3RyaW5nLFxuICAgIGNsb3N1cmVWYXJzRm4/OiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCBTZXJpYWxpemFibGU+XG4gICkge1xuICAgIC8vIFVzZSBhIHJlZ3VsYXIgZnVuY3Rpb24gKG5vdCBhcnJvdykgc28gd2UgY2FuIGNhcHR1cmUgYHRoaXNgIHdoZW4gaW52b2tlZCBhcyBhIG1ldGhvZFxuICAgIGNvbnN0IHN0ZXBGdW5jdGlvbiA9IGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IHVua25vd24sXG4gICAgICAuLi5hcmdzOiBBcmdzXG4gICAgKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgICAgIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH0gPSB3aXRoUmVzb2x2ZXJzPFJlc3VsdD4oKTtcblxuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGBzdGVwXyR7Y3R4LmdlbmVyYXRlVWxpZCgpfWA7XG5cbiAgICAgIGNvbnN0IHF1ZXVlSXRlbTogU3RlcEludm9jYXRpb25RdWV1ZUl0ZW0gPSB7XG4gICAgICAgIHR5cGU6ICdzdGVwJyxcbiAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICB9O1xuXG4gICAgICAvLyBDYXB0dXJlIGB0aGlzYCB2YWx1ZSBmb3IgbWV0aG9kIGludm9jYXRpb25zIChlLmcuLCBNeUNsYXNzLm1ldGhvZCgpKVxuICAgICAgLy8gT25seSBpbmNsdWRlIGlmIGB0aGlzYCBpcyBkZWZpbmVkIGFuZCBub3QgdGhlIGdsb2JhbCBvYmplY3RcbiAgICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQgJiYgdGhpcyAhPT0gbnVsbCAmJiB0aGlzICE9PSBnbG9iYWxUaGlzKSB7XG4gICAgICAgIHF1ZXVlSXRlbS50aGlzVmFsID0gdGhpcyBhcyBTZXJpYWxpemFibGU7XG4gICAgICB9XG5cbiAgICAgIC8vIEludm9rZSB0aGUgY2xvc3VyZSB2YXJpYWJsZXMgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjbG9zdXJlIHNjb3BlXG4gICAgICBjb25zdCBjbG9zdXJlVmFycyA9IGNsb3N1cmVWYXJzRm4/LigpO1xuICAgICAgaWYgKGNsb3N1cmVWYXJzKSB7XG4gICAgICAgIHF1ZXVlSXRlbS5jbG9zdXJlVmFycyA9IGNsb3N1cmVWYXJzO1xuICAgICAgfVxuXG4gICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwgcXVldWVJdGVtKTtcblxuICAgICAgc3RlcExvZ2dlci5kZWJ1ZygnU3RlcCBjb25zdW1lciBzZXR1cCcsIHtcbiAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICB9KTtcbiAgICAgIGN0eC5ldmVudHNDb25zdW1lci5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGV2ZW50cywgc28gdGhpcyBzdGVwIGhhcyBlaXRoZXIgbm90IGJlZW4gcnVuIG9yIGlzIGN1cnJlbnRseSBydW5uaW5nLlxuICAgICAgICAgIC8vIENydWNpYWxseSwgaWYgd2UgZ290IGhlcmUsIHRoZW4gdGhpcyBzdGVwIFByb21pc2UgZG9lc1xuICAgICAgICAgIC8vIG5vdCByZXNvbHZlIHNvIHRoYXQgdGhlIHVzZXIgd29ya2Zsb3cgY29kZSBkb2VzIG5vdCBwcm9jZWVkIGFueSBmdXJ0aGVyLlxuICAgICAgICAgIC8vIE5vdGlmeSB0aGUgd29ya2Zsb3cgaGFuZGxlciB0aGF0IHRoaXMgc3RlcCBoYXMgbm90IGJlZW4gcnVuIC8gaGFzIG5vdCBjb21wbGV0ZWQgeWV0LlxuICAgICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBzdGVwTG9nZ2VyLmRlYnVnKCdTdGVwIGNvbnN1bWVyIGV2ZW50IHByb2Nlc3NpbmcnLCB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICBhcmdzOiBhcmdzLmpvaW4oJywgJyksXG4gICAgICAgICAgaW5jb21pbmdDb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGlzTWF0Y2g6IGNvcnJlbGF0aW9uSWQgPT09IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChldmVudC5jb3JyZWxhdGlvbklkICE9PSBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gdGhpcyBldmVudCAtIHRoZSBjb3JyZWxhdGlvbklkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgZW50aXR5XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudFN0ZXBOYW1lID1cbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBldmVudCAmJlxuICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YSAmJlxuICAgICAgICAgICdzdGVwTmFtZScgaW4gZXZlbnQuZXZlbnREYXRhXG4gICAgICAgICAgICA/IGV2ZW50LmV2ZW50RGF0YS5zdGVwTmFtZVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBldmVudFN0ZXBOYW1lID09PSAnc3RyaW5nJyAmJiBldmVudFN0ZXBOYW1lICE9PSBzdGVwTmFtZSkge1xuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IHN0ZXAgZXZlbnQgJHtldmVudC5ldmVudFR5cGV9IGZvciAke2NvcnJlbGF0aW9uSWR9IGJlbG9uZ3MgdG8gXCIke2V2ZW50U3RlcE5hbWV9XCIsIGJ1dCB0aGUgY3VycmVudCBzdGVwIGNvbnN1bWVyIGlzIFwiJHtzdGVwTmFtZX1cImAsXG4gICAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgLy8gU3RlcCBoYXMgYmVlbiBjcmVhdGVkIChyZWdpc3RlcmVkIGZvciBleGVjdXRpb24pIC0gbWFyayBhcyBoYXZpbmcgZXZlbnRcbiAgICAgICAgICAvLyBidXQga2VlcCBpbiBxdWV1ZSBzbyBzdXNwZW5zaW9uIGhhbmRsZXIga25vd3MgdG8gcXVldWUgZXhlY3V0aW9uIHdpdGhvdXRcbiAgICAgICAgICAvLyBjcmVhdGluZyBhIGR1cGxpY2F0ZSBzdGVwX2NyZWF0ZWQgZXZlbnRcbiAgICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgaWYgKCFxdWV1ZUl0ZW0gfHwgcXVldWVJdGVtLnR5cGUgIT09ICdzdGVwJykge1xuICAgICAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgZXZlbnQgbG9nIGNvcnJ1cHRpb24gLSBzdGVwX2NyZWF0ZWQgcmVjZWl2ZWRcbiAgICAgICAgICAgIC8vIGJ1dCB0aGUgc3RlcCB3YXMgbmV2ZXIgaW52b2tlZCBpbiB0aGUgd29ya2Zsb3cgZHVyaW5nIHJlcGxheS5cbiAgICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogc3RlcCAke2NvcnJlbGF0aW9uSWR9ICgke3N0ZXBOYW1lfSkgY3JlYXRlZCBidXQgbm90IGZvdW5kIGluIGludm9jYXRpb24gcXVldWVgLFxuICAgICAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAvLyBDb250aW51ZSB3YWl0aW5nIGZvciBzdGVwX3N0YXJ0ZWQvc3RlcF9jb21wbGV0ZWQvc3RlcF9mYWlsZWQgZXZlbnRzXG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgICAgIC8vIFN0ZXAgd2FzIHN0YXJ0ZWQgLSBkb24ndCBkbyBhbnl0aGluZy4gVGhlIHN0ZXAgaXMgbGVmdCBpbiB0aGUgaW52b2NhdGlvblF1ZXVlIHdoaWNoXG4gICAgICAgICAgLy8gd2lsbCBhbGxvdyBpdCB0byBiZSByZS1lbnF1ZXVlZC4gV2UgcmVseSBvbiB0aGUgcXVldWUncyBpZGVtcG90ZW5jeSB0byBwcmV2ZW50IGl0IGZyb21cbiAgICAgICAgICAvLyBhY3R1YWxseSBiZWluZyBvdmVyIGVucXVldWVkLlxuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnKSB7XG4gICAgICAgICAgLy8gU3RlcCBpcyBiZWluZyByZXRyaWVkIC0ganVzdCBjb25zdW1lIHRoZSBldmVudCBhbmQgd2FpdCBmb3IgbmV4dCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpIHtcbiAgICAgICAgICAvLyBUZXJtaW5hbCBzdGF0ZSAtIHdlIGNhbiByZW1vdmUgdGhlIGludm9jYXRpb25RdWV1ZSBpdGVtXG4gICAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIC8vIFN0ZXAgZmFpbGVkIC0gY2hhaW4gdGhyb3VnaCBwcm9taXNlUXVldWUgdG8gZW5zdXJlXG4gICAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBvcmRlcmluZyBvZiBhbGwgcHJvbWlzZSByZXNvbHV0aW9ucy9yZWplY3Rpb25zLlxuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gZXZlbnQuZXZlbnREYXRhLmVycm9yO1xuICAgICAgICAgICAgY29uc3QgaXNFcnJvck9iamVjdCA9XG4gICAgICAgICAgICAgIHR5cGVvZiBlcnJvckRhdGEgPT09ICdvYmplY3QnICYmIGVycm9yRGF0YSAhPT0gbnVsbDtcblxuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gaXNFcnJvck9iamVjdFxuICAgICAgICAgICAgICA/IChlcnJvckRhdGEubWVzc2FnZSA/PyAnVW5rbm93biBlcnJvcicpXG4gICAgICAgICAgICAgIDogdHlwZW9mIGVycm9yRGF0YSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IGVycm9yRGF0YVxuICAgICAgICAgICAgICAgIDogJ1Vua25vd24gZXJyb3InO1xuXG4gICAgICAgICAgICBjb25zdCBlcnJvclN0YWNrID1cbiAgICAgICAgICAgICAgKGlzRXJyb3JPYmplY3QgPyBlcnJvckRhdGEuc3RhY2sgOiB1bmRlZmluZWQpID8/XG4gICAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YS5zdGFjaztcblxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgICAgICAgICAgZXJyb3Iuc3RhY2sgPSBlcnJvclN0YWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcpIHtcbiAgICAgICAgICAvLyBUZXJtaW5hbCBzdGF0ZSAtIHdlIGNhbiByZW1vdmUgdGhlIGludm9jYXRpb25RdWV1ZSBpdGVtXG4gICAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuXG4gICAgICAgICAgLy8gU3RlcCBoYXMgY29tcGxldGVkLCBzbyByZXNvbHZlIHRoZSBQcm9taXNlIHdpdGggdGhlIGNhY2hlZCByZXN1bHQuXG4gICAgICAgICAgLy8gVGhlIGh5ZHJhdGlvbiBpcyBhc3luYyAoZS5nLiwgZGVjcnlwdGlvbiksIHNvIHdlIGNoYWluIGl0IHRocm91Z2hcbiAgICAgICAgICAvLyBjdHgucHJvbWlzZVF1ZXVlIHRvIGVuc3VyZSB0aGF0IGV2ZW4gaWYgZGVzZXJpYWxpemF0aW9uXG4gICAgICAgICAgLy8gdGFrZXMgdmFyaWFibGUgdGltZSwgcHJvbWlzZXMgcmVzb2x2ZSBpbiBldmVudCBsb2cgb3JkZXIuXG4gICAgICAgICAgLy8gRWFjaCBzdGVwJ3MgaHlkcmF0aW9uICsgcmVzb2x2ZSB3YWl0cyBmb3IgYWxsIHByaW9yIGh5ZHJhdGlvbnNcbiAgICAgICAgICAvLyB0byBjb21wbGV0ZSBiZWZvcmUgZXhlY3V0aW5nLCBwcmVzZXJ2aW5nIGRldGVybWluaXN0aWMgb3JkZXJpbmcuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBNZW1vaXphdGlvbjogb24gZXZlcnkgcmVwbGF5IHRoaXMgY29uc3VtZXIgcmUtcnVucyBhbmQgd291bGRcbiAgICAgICAgICAvLyBvdGhlcndpc2UgcmUtZGVjcnlwdCArIHJlLXBhcnNlIHRoZSBzYW1lIHNlcmlhbGl6ZWQgcmVzdWx0IOKAlCBPKE7CsilcbiAgICAgICAgICAvLyBhY3Jvc3MgYW4gaW52b2NhdGlvbiBmb3IgYSBzZXF1ZW50aWFsIE4tc3RlcCB3b3JrZmxvdy4gVGhlXG4gICAgICAgICAgLy8gcGVyLXJ1biBgc3RlcEh5ZHJhdGlvbkNhY2hlYCBzaG9ydC1jaXJjdWl0cyB0aGF0IHdvcmsgb25cbiAgICAgICAgICAvLyBzdWJzZXF1ZW50IHJlcGxheXMuIENydWNpYWxseSwgdGhlIGNhY2hlIGxvb2t1cCBoYXBwZW5zIElOU0lERVxuICAgICAgICAgIC8vIHRoaXMgc2FtZSBwcm9taXNlUXVldWUgc2xvdCAoYW5kIHN0aWxsIHJlc29sdmVzIHZpYSBgcmVzb2x2ZWApLFxuICAgICAgICAgIC8vIHNvIGEgY2FjaGUgaGl0IG9jY3VwaWVzIHRoZSBleGFjdCBzYW1lIHBvc2l0aW9uIGluIHRoZSBvcmRlcmVkXG4gICAgICAgICAgLy8gZGVsaXZlcnkgY2hhaW4gYSByZS1oeWRyYXRlIHdvdWxkIGhhdmUg4oCUIHByZXNlcnZpbmcgdGhlXG4gICAgICAgICAgLy8gZGV0ZXJtaW5pc20gdGhhdCBwZW5kaW5nRGVsaXZlcmllcywgdGhlIGRlbGl2ZXJ5IGJhcnJpZXJzLCBhbmRcbiAgICAgICAgICAvLyBQcm9taXNlLnJhY2UvYWxsIHJlcGxheSBkZXBlbmQgb24uIE9ubHkgcHJpbWl0aXZlIHJlc3VsdHMgYXJlXG4gICAgICAgICAgLy8gbWVtb2l6ZWQ7IG5vbi1wcmltaXRpdmVzIHJlLWh5ZHJhdGUgZnJlc2ggZWFjaCByZXBsYXkgc28gYSBzaGFyZWRcbiAgICAgICAgICAvLyByZWZlcmVuY2UgY2FuIG5ldmVyIGNhcnJ5IGEgbXV0YXRpb24gYmV0d2VlbiByZXBsYXlzLlxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZEV2ZW50SWQgPSBldmVudC5ldmVudElkO1xuICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRSZXN1bHQgPSBldmVudC5ldmVudERhdGEucmVzdWx0O1xuICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgaHlkcmF0ZWRSZXN1bHQgPSBhd2FpdCBnZXRPckh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgY3R4LnN0ZXBIeWRyYXRpb25DYWNoZSxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRFdmVudElkLFxuICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICBjdHgucnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGN0eC5lbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICBjdHguZ2xvYmFsVGhpc1xuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXNvbHZlKGh5ZHJhdGVkUmVzdWx0IGFzIFJlc3VsdCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIHJlcGxheSBpbnN0YWxsZWQgYSBkaWZmZXJlbnQgY29uc3VtZXIgdGhhbiB0aGUgc3RvcmVkIGV2ZW50IG5lZWRzLlxuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBVbmV4cGVjdGVkIGV2ZW50IHR5cGUgZm9yIHN0ZXAgJHtjb3JyZWxhdGlvbklkfSAobmFtZTogJHtzdGVwTmFtZX0pIFwiJHtldmVudC5ldmVudFR5cGV9XCJgLFxuICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgLy8gRW5zdXJlIHRoZSBcIm5hbWVcIiBwcm9wZXJ0eSBtYXRjaGVzIHRoZSBvcmlnaW5hbCBzdGVwIGZ1bmN0aW9uIG5hbWVcbiAgICAvLyBFeHRyYWN0IGZ1bmN0aW9uIG5hbWUgZnJvbSBzdGVwTmFtZSAoZm9ybWF0OiBcInN0ZXAvL2ZpbGVwYXRoLy9mdW5jdGlvbk5hbWVcIilcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBzdGVwTmFtZS5zcGxpdCgnLy8nKS5wb3AoKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3RlcEZ1bmN0aW9uLCAnbmFtZScsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbk5hbWUsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdGhlIHN0ZXAgZnVuY3Rpb24gaWRlbnRpZmllciB0byB0aGUgc3RlcCBmdW5jdGlvbiBmb3Igc2VyaWFsaXphdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdGVwRnVuY3Rpb24sICdzdGVwSWQnLCB7XG4gICAgICB2YWx1ZTogc3RlcE5hbWUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBTdG9yZSB0aGUgY2xvc3VyZSB2YXJpYWJsZXMgZnVuY3Rpb24gZm9yIHNlcmlhbGl6YXRpb25cbiAgICBpZiAoY2xvc3VyZVZhcnNGbikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0ZXBGdW5jdGlvbiwgJ19fY2xvc3VyZVZhcnNGbicsIHtcbiAgICAgICAgdmFsdWU6IGNsb3N1cmVWYXJzRm4sXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBPdmVycmlkZSBgLmJpbmRgIHNvIHRoZSBib3VuZCBmdW5jdGlvbiBwcmVzZXJ2ZXMgdGhlIHN0ZXAgcHJveHlcbiAgICAvLyBtZXRhZGF0YSB0aGF0IGBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyYCByZWxpZXMgb24gZm9yIHNlcmlhbGl6YXRpb24uXG4gICAgLy8gV2l0aG91dCB0aGlzIG92ZXJyaWRlLCBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgIHdvdWxkIHJldHVybiBhIG5ld1xuICAgIC8vIGZ1bmN0aW9uIHRoYXQgZG9lc24ndCBpbmhlcml0IGBzdGVwSWRgLCBgX19jbG9zdXJlVmFyc0ZuYCwgb3IgYW55XG4gICAgLy8gb3RoZXIgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsIHByb3h5IOKAlCBzbyB0aGUgU3RlcEZ1bmN0aW9uXG4gICAgLy8gcmVkdWNlciB3b3VsZCByZWZ1c2UgdG8gc2VyaWFsaXplIGl0IChpdCdkIGxvb2sgbGlrZSBhIHBsYWluXG4gICAgLy8gZnVuY3Rpb24pLCBhbmQgYSBgdXNlU3RlcCguLi4pLmJpbmQodGhpcylgIHByb3h5IHRoYXQgZmxvd2VkXG4gICAgLy8gdGhyb3VnaCB3b3JrZmxvdyBzZXJpYWxpemF0aW9uIHdvdWxkIHNpbGVudGx5IGJyZWFrLlxuICAgIC8vXG4gICAgLy8gVGhlIG92ZXJyaWRlIHN0YXNoZXMgdGhyZWUgcGllY2VzIG9mIHN0YXRlIG9uIHRoZSBib3VuZCBmdW5jdGlvbiBzb1xuICAgIC8vIHRoZSByb3VuZCB0cmlwIGlzIGZhaXRoZnVsOlxuICAgIC8vICAgLSBgc3RlcElkYCAgICAgICAgICAgICDigJQgYWxyZWFkeSBzZXQgb24gdGhlIG9yaWdpbmFsIHByb3h5LlxuICAgIC8vICAgLSBgX19jbG9zdXJlVmFyc0ZuYCAgICDigJQgb25seSB3aGVuIHRoZSBvcmlnaW5hbCBwcm94eSBoYWQgb25lLlxuICAgIC8vICAgLSBgX19ib3VuZFRoaXNgICAgICAgICDigJQgdGhlIHJlY2VpdmVyIHBhc3NlZCB0byBgLmJpbmQodGhpc0FyZywg4oCmKWAuXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWx3YXlzIHNldCAoZXZlbiB3aGVuIGB0aGlzQXJnYCBpc1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBudWxsYC9gdW5kZWZpbmVkYCkgc28gdGhlIHJlZHVjZXIgY2FuXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluZ3Vpc2ggXCJ3YXMgYm91bmRcIiBmcm9tIFwid2Fzbid0XCIuXG4gICAgLy8gICAtIGBfX2JvdW5kQXJnc2AgICAgICAgIOKAlCBvbmx5IHdoZW4gdGhlIHVzZXIgc3VwcGxpZWQgcHJlZmlsbGVkXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzIChgLmJpbmQodGhpc0FyZywgeCwgeSlgKS4gVGhlXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dDIHBsdWdpbiBvbmx5IGV2ZXIgZW1pdHMgYC5iaW5kKHRoaXMpYFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZGF5LCBzbyB0aGlzIGlzIHJhcmUgaW4gcHJhY3RpY2U7IHdlXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgY2FwdHVyZSBpdCBzbyB0aGUgcGFydGlhbCBhcmdzXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vydml2ZSBzZXJpYWxpemF0aW9uIHJhdGhlciB0aGFuXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsZW50bHkgZGlzYXBwZWFyaW5nIG9uIHRoZSBzdGVwIHNpZGUuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0ZXBGdW5jdGlvbiwgJ2JpbmQnLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gKFxuICAgICAgICB0aGlzOiB0eXBlb2Ygc3RlcEZ1bmN0aW9uLFxuICAgICAgICB0aGlzQXJnOiB1bmtub3duLFxuICAgICAgICAuLi5wYXJ0aWFsQXJnczogdW5rbm93bltdXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgYm91bmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5jYWxsKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpc0FyZyxcbiAgICAgICAgICAuLi5wYXJ0aWFsQXJnc1xuICAgICAgICApO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYm91bmQsICdzdGVwSWQnLCB7XG4gICAgICAgICAgdmFsdWU6IHN0ZXBOYW1lLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNsb3N1cmVWYXJzRm4pIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYm91bmQsICdfX2Nsb3N1cmVWYXJzRm4nLCB7XG4gICAgICAgICAgICB2YWx1ZTogY2xvc3VyZVZhcnNGbixcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYm91bmQsICdfX2JvdW5kVGhpcycsIHtcbiAgICAgICAgICB2YWx1ZTogdGhpc0FyZyxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwYXJ0aWFsQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJvdW5kLCAnX19ib3VuZEFyZ3MnLCB7XG4gICAgICAgICAgICB2YWx1ZTogcGFydGlhbEFyZ3MsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJvdW5kO1xuICAgICAgfSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBzdGVwRnVuY3Rpb247XG4gIH07XG59XG4iXX0=
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFnQyxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixHQUVqQixNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RSxNQUFNLFVBQVUsYUFBYSxDQUFDLEdBQWdDO0lBQzVELE9BQU8sU0FBUyxPQUFPLENBQ3JCLFFBQWdCLEVBQ2hCLGFBQWtEO1FBRWxELHVGQUF1RjtRQUN2RixNQUFNLFlBQVksR0FBRyxVQUVuQixHQUFHLElBQVU7WUFFYixNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxhQUFhLEVBQVUsQ0FBQztZQUU3RCxNQUFNLGFBQWEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBRW5ELE1BQU0sU0FBUyxHQUE0QjtnQkFDekMsSUFBSSxFQUFFLE1BQU07Z0JBQ1osYUFBYTtnQkFDYixRQUFRO2dCQUNSLElBQUk7YUFDTCxDQUFDO1lBRUYsdUVBQXVFO1lBQ3ZFLDhEQUE4RDtZQUM5RCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJ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QUFVLEVBQUUsS0FBSztvQkFDakIsWUFBWSxFQUFFLEtBQUs7aUJBQ3BCLENBQUMsQ0FBQztnQkFDSCxJQUFJLGFBQWEsRUFBRSxDQUFDO29CQUNsQixNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRTt3QkFDOUMsS0FBSyxFQUFFLGFBQWE7d0JBQ3BCLFFBQVEsRUFBRSxLQUFLO3dCQUNmLFVBQVUsRUFBRSxLQUFLO3dCQUNqQixZQUFZLEVBQUUsS0FBSztxQkFDcEIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFO29CQUMxQyxLQUFLLEVBQUUsT0FBTztvQkFDZCxRQUFRLEVBQUUsS0FBSztvQkFDZixVQUFVLEVBQUUsS0FBSztvQkFDakIsWUFBWSxFQUFFLEtBQUs7aUJBQ3BCLENBQUMsQ0FBQztnQkFDSCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzNCLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRTt3QkFDMUMsS0FBSyxFQUFFLFdBQVc7d0JBQ2xCLFFBQVEsRUFBRSxLQUFLO3dCQUNmLFVBQVUsRUFBRSxLQUFLO3dCQUNqQixZQUFZLEVBQUUsS0FBSztxQkFDcEIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVLEVBQUUsS0FBSztZQUNqQixZQUFZLEVBQUUsS0FBSztTQUNwQixDQUFDLENBQUM7UUFFSCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmF0YWxFcnJvciwgUmVwbGF5RGl2ZXJnZW5jZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyB3aXRoUmVzb2x2ZXJzIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IEV2ZW50Q29uc3VtZXJSZXN1bHQgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyB0eXBlIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLCBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5pbXBvcnQgeyBzdGVwTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgYXdhaXRFYXJsaWVyRGVsaXZlcmllcyxcbiAgcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIsXG4gIHNjaGVkdWxlV2hlbklkbGUsXG4gIHR5cGUgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxufSBmcm9tICcuL3ByaXZhdGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuaW1wb3J0IHsgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZSB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBnZXRPckh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUgfSBmcm9tICcuL3N0ZXAtaHlkcmF0aW9uLWNhY2hlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVzZVN0ZXAoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVzZVN0ZXA8QXJncyBleHRlbmRzIFNlcmlhbGl6YWJsZVtdLCBSZXN1bHQ+KFxuICAgIHN0ZXBOYW1lOiBzdHJpbmcsXG4gICAgY2xvc3VyZVZhcnNGbj86ICgpID0+IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6YWJsZT5cbiAgKSB7XG4gICAgLy8gVXNlIGEgcmVndWxhciBmdW5jdGlvbiAobm90IGFycm93KSBzbyB3ZSBjYW4gY2FwdHVyZSBgdGhpc2Agd2hlbiBpbnZva2VkIGFzIGEgbWV0aG9kXG4gICAgY29uc3Qgc3RlcEZ1bmN0aW9uID0gZnVuY3Rpb24gKFxuICAgICAgdGhpczogdW5rbm93bixcbiAgICAgIC4uLmFyZ3M6IEFyZ3NcbiAgICApOiBQcm9taXNlPFJlc3VsdD4ge1xuICAgICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSA9IHdpdGhSZXNvbHZlcnM8UmVzdWx0PigpO1xuXG4gICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYHN0ZXBfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcblxuICAgICAgY29uc3QgcXVldWVJdGVtOiBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSA9IHtcbiAgICAgICAgdHlwZTogJ3N0ZXAnLFxuICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhcHR1cmUgYHRoaXNgIHZhbHVlIGZvciBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4sIE15Q2xhc3MubWV0aG9kKCkpXG4gICAgICAvLyBPbmx5IGluY2x1ZGUgaWYgYHRoaXNgIGlzIGRlZmluZWQgYW5kIG5vdCB0aGUgZ2xvYmFsIG9iamVjdFxuICAgICAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCAmJiB0aGlzICE9PSBudWxsICYmIHRoaXMgIT09IGdsb2JhbFRoaXMpIHtcbiAgICAgICAgcXVldWVJdGVtLnRoaXNWYWwgPSB0aGlzIGFzIFNlcmlhbGl6YWJsZTtcbiAgICAgIH1cblxuICAgICAgLy8gSW52b2tlIHRoZSBjbG9zdXJlIHZhcmlhYmxlcyBmdW5jdGlvbiB0byBnZXQgdGhlIGNsb3N1cmUgc2NvcGVcbiAgICAgIGNvbnN0IGNsb3N1cmVWYXJzID0gY2xvc3VyZVZhcnNGbj8uKCk7XG4gICAgICBpZiAoY2xvc3VyZVZhcnMpIHtcbiAgICAgICAgcXVldWVJdGVtLmNsb3N1cmVWYXJzID0gY2xvc3VyZVZhcnM7XG4gICAgICB9XG5cbiAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCBxdWV1ZUl0ZW0pO1xuXG4gICAgICBzdGVwTG9nZ2VyLmRlYnVnKCdTdGVwIGNvbnN1bWVyIHNldHVwJywge1xuICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgYXJncyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmV2ZW50c0NvbnN1bWVyLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZXZlbnRzLCBzbyB0aGlzIHN0ZXAgaGFzIGVpdGhlciBub3QgYmVlbiBydW4gb3IgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gICAgICAgICAgLy8gQ3J1Y2lhbGx5LCBpZiB3ZSBnb3QgaGVyZSwgdGhlbiB0aGlzIHN0ZXAgUHJvbWlzZSBkb2VzXG4gICAgICAgICAgLy8gbm90IHJlc29sdmUgc28gdGhhdCB0aGUgdXNlciB3b3JrZmxvdyBjb2RlIGRvZXMgbm90IHByb2NlZWQgYW55IGZ1cnRoZXIuXG4gICAgICAgICAgLy8gTm90aWZ5IHRoZSB3b3JrZmxvdyBoYW5kbGVyIHRoYXQgdGhpcyBzdGVwIGhhcyBub3QgYmVlbiBydW4gLyBoYXMgbm90IGNvbXBsZXRlZCB5ZXQuXG4gICAgICAgICAgc2NoZWR1bGVXaGVuSWRsZShjdHgsICgpID0+IHtcbiAgICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ZXBMb2dnZXIuZGVidWcoJ1N0ZXAgY29uc3VtZXIgZXZlbnQgcHJvY2Vzc2luZycsIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIGFyZ3M6IGFyZ3Muam9pbignLCAnKSxcbiAgICAgICAgICBpbmNvbWluZ0NvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgaXNNYXRjaDogY29ycmVsYXRpb25JZCA9PT0gZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50IC0gdGhlIGNvcnJlbGF0aW9uSWQgYmVsb25ncyB0byBhIGRpZmZlcmVudCBlbnRpdHlcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50U3RlcE5hbWUgPVxuICAgICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmXG4gICAgICAgICAgZXZlbnQuZXZlbnREYXRhICYmXG4gICAgICAgICAgJ3N0ZXBOYW1lJyBpbiBldmVudC5ldmVudERhdGFcbiAgICAgICAgICAgID8gZXZlbnQuZXZlbnREYXRhLnN0ZXBOYW1lXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50U3RlcE5hbWUgPT09ICdzdHJpbmcnICYmIGV2ZW50U3RlcE5hbWUgIT09IHN0ZXBOYW1lKSB7XG4gICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogc3RlcCBldmVudCAke2V2ZW50LmV2ZW50VHlwZX0gZm9yICR7Y29ycmVsYXRpb25JZH0gYmVsb25ncyB0byBcIiR7ZXZlbnRTdGVwTmFtZX1cIiwgYnV0IHRoZSBjdXJyZW50IHN0ZXAgY29uc3VtZXIgaXMgXCIke3N0ZXBOYW1lfVwiYCxcbiAgICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcpIHtcbiAgICAgICAgICAvLyBTdGVwIGhhcyBiZWVuIGNyZWF0ZWQgKHJlZ2lzdGVyZWQgZm9yIGV4ZWN1dGlvbikgLSBtYXJrIGFzIGhhdmluZyBldmVudFxuICAgICAgICAgIC8vIGJ1dCBrZWVwIGluIHF1ZXVlIHNvIHN1c3BlbnNpb24gaGFuZGxlciBrbm93cyB0byBxdWV1ZSBleGVjdXRpb24gd2l0aG91dFxuICAgICAgICAgIC8vIGNyZWF0aW5nIGEgZHVwbGljYXRlIHN0ZXBfY3JlYXRlZCBldmVudFxuICAgICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICBpZiAoIXF1ZXVlSXRlbSB8fCBxdWV1ZUl0ZW0udHlwZSAhPT0gJ3N0ZXAnKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGluZGljYXRlcyBldmVudCBsb2cgY29ycnVwdGlvbiAtIHN0ZXBfY3JlYXRlZCByZWNlaXZlZFxuICAgICAgICAgICAgLy8gYnV0IHRoZSBzdGVwIHdhcyBuZXZlciBpbnZva2VkIGluIHRoZSB3b3JrZmxvdyBkdXJpbmcgcmVwbGF5LlxuICAgICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBzdGVwICR7Y29ycmVsYXRpb25JZH0gKCR7c3RlcE5hbWV9KSBjcmVhdGVkIGJ1dCBub3QgZm91bmQgaW4gaW52b2NhdGlvbiBxdWV1ZWAsXG4gICAgICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIC8vIENvbnRpbnVlIHdhaXRpbmcgZm9yIHN0ZXBfc3RhcnRlZC9zdGVwX2NvbXBsZXRlZC9zdGVwX2ZhaWxlZCBldmVudHNcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgLy8gU3RlcCB3YXMgc3RhcnRlZCAtIGRvbid0IGRvIGFueXRoaW5nLiBUaGUgc3RlcCBpcyBsZWZ0IGluIHRoZSBpbnZvY2F0aW9uUXVldWUgd2hpY2hcbiAgICAgICAgICAvLyB3aWxsIGFsbG93IGl0IHRvIGJlIHJlLWVucXVldWVkLiBXZSByZWx5IG9uIHRoZSBxdWV1ZSdzIGlkZW1wb3RlbmN5IHRvIHByZXZlbnQgaXQgZnJvbVxuICAgICAgICAgIC8vIGFjdHVhbGx5IGJlaW5nIG92ZXIgZW5xdWV1ZWQuXG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgICAgICAvLyBTdGVwIGlzIGJlaW5nIHJldHJpZWQgLSBqdXN0IGNvbnN1bWUgdGhlIGV2ZW50IGFuZCB3YWl0IGZvciBuZXh0IHN0ZXBfc3RhcnRlZFxuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJykge1xuICAgICAgICAgIC8vIFRlcm1pbmFsIHN0YXRlIC0gd2UgY2FuIHJlbW92ZSB0aGUgaW52b2NhdGlvblF1ZXVlIGl0ZW1cbiAgICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgLy8gU3RlcCBmYWlsZWQgLSBjaGFpbiB0aHJvdWdoIHByb21pc2VRdWV1ZSB0byBlbnN1cmVcbiAgICAgICAgICAvLyBkZXRlcm1pbmlzdGljIG9yZGVyaW5nIG9mIGFsbCBwcm9taXNlIHJlc29sdXRpb25zL3JlamVjdGlvbnMuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgcmVqZWN0aW9uIGlzIGFzIGJyYW5jaC1kZWNpZGluZyBhcyBhIHN1Y2Nlc3M6IGl0IGRlY2lkZXNcbiAgICAgICAgICAvLyB3aGV0aGVyIGEgYHRyeWAvYGNhdGNoYCBjb250aW51YXRpb24gcnVucywgYW5kIHRoZXJlZm9yZSB3aGljaFxuICAgICAgICAgIC8vIFVMSURzIHRoZSBmb2xsb3ctdXAgYHVzZVN0ZXBgIGNhbGxzIGRyYXcuIFNvIGl0IGlzIG9yZGVyZWQgYnlcbiAgICAgICAgICAvLyBldmVudC1sb2cgcG9zaXRpb24gZXhhY3RseSBsaWtlIGBzdGVwX2NvbXBsZXRlZGAgYmVsb3cg4oCUIHNlZSB0aGVyZVxuICAgICAgICAgIC8vIGZvciB3aHkgdGhlIGRlZmVycmFsIGlzIGNhcHR1cmVkIGhlcmUsIGF0IGV2ZW50LWNvbnN1bXB0aW9uIHRpbWUsXG4gICAgICAgICAgLy8gYW5kIGF3YWl0ZWQgb2ZmIHRoZSBzZXJpYWwgcXVldWUuXG4gICAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IGN0eC5ldmVudHNDb25zdW1lci5ldmVudEluZGV4O1xuICAgICAgICAgIGNvbnN0IGJhcnJpZXIgPSByZWdpc3RlckRlbGl2ZXJ5QmFycmllcihjdHgsIGV2ZW50SW5kZXgsICdzdGVwJyk7XG4gICAgICAgICAgY29uc3QgZWFybGllckRlbGl2ZXJlZCA9IGF3YWl0RWFybGllckRlbGl2ZXJpZXMoXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBldmVudEluZGV4LFxuICAgICAgICAgICAgJ3N0ZXAnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGV2ZW50LmV2ZW50RGF0YS5lcnJvcjtcbiAgICAgICAgICAgIGNvbnN0IGlzRXJyb3JPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgZXJyb3JEYXRhID09PSAnb2JqZWN0JyAmJiBlcnJvckRhdGEgIT09IG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGlzRXJyb3JPYmplY3RcbiAgICAgICAgICAgICAgPyAoZXJyb3JEYXRhLm1lc3NhZ2UgPz8gJ1Vua25vd24gZXJyb3InKVxuICAgICAgICAgICAgICA6IHR5cGVvZiBlcnJvckRhdGEgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBlcnJvckRhdGFcbiAgICAgICAgICAgICAgICA6ICdVbmtub3duIGVycm9yJztcblxuICAgICAgICAgICAgY29uc3QgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgIChpc0Vycm9yT2JqZWN0ID8gZXJyb3JEYXRhLnN0YWNrIDogdW5kZWZpbmVkKSA/P1xuICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEuc3RhY2s7XG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEZhdGFsRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIGlmIChlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgIGVycm9yLnN0YWNrID0gZXJyb3JTdGFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgZWFybGllckRlbGl2ZXJlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcpIHtcbiAgICAgICAgICAvLyBUZXJtaW5hbCBzdGF0ZSAtIHdlIGNhbiByZW1vdmUgdGhlIGludm9jYXRpb25RdWV1ZSBpdGVtXG4gICAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuXG4gICAgICAgICAgLy8gU3RlcCBoYXMgY29tcGxldGVkLCBzbyByZXNvbHZlIHRoZSBQcm9taXNlIHdpdGggdGhlIGNhY2hlZCByZXN1bHQuXG4gICAgICAgICAgLy8gVGhlIGh5ZHJhdGlvbiBpcyBhc3luYyAoZS5nLiwgZGVjcnlwdGlvbiksIHNvIHdlIGNoYWluIGl0IHRocm91Z2hcbiAgICAgICAgICAvLyBjdHgucHJvbWlzZVF1ZXVlIHRvIGVuc3VyZSB0aGF0IGV2ZW4gaWYgZGVzZXJpYWxpemF0aW9uXG4gICAgICAgICAgLy8gdGFrZXMgdmFyaWFibGUgdGltZSwgcHJvbWlzZXMgcmVzb2x2ZSBpbiBldmVudCBsb2cgb3JkZXIuXG4gICAgICAgICAgLy8gRWFjaCBzdGVwJ3MgaHlkcmF0aW9uICsgcmVzb2x2ZSB3YWl0cyBmb3IgYWxsIHByaW9yIGh5ZHJhdGlvbnNcbiAgICAgICAgICAvLyB0byBjb21wbGV0ZSBiZWZvcmUgZXhlY3V0aW5nLCBwcmVzZXJ2aW5nIGRldGVybWluaXN0aWMgb3JkZXJpbmcuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBNZW1vaXphdGlvbjogb24gZXZlcnkgcmVwbGF5IHRoaXMgY29uc3VtZXIgcmUtcnVucyBhbmQgd291bGRcbiAgICAgICAgICAvLyBvdGhlcndpc2UgcmUtZGVjcnlwdCArIHJlLXBhcnNlIHRoZSBzYW1lIHNlcmlhbGl6ZWQgcmVzdWx0IOKAlCBPKE7CsilcbiAgICAgICAgICAvLyBhY3Jvc3MgYW4gaW52b2NhdGlvbiBmb3IgYSBzZXF1ZW50aWFsIE4tc3RlcCB3b3JrZmxvdy4gVGhlXG4gICAgICAgICAgLy8gcGVyLXJ1biBgc3RlcEh5ZHJhdGlvbkNhY2hlYCBzaG9ydC1jaXJjdWl0cyB0aGF0IHdvcmsgb25cbiAgICAgICAgICAvLyBzdWJzZXF1ZW50IHJlcGxheXMuIENydWNpYWxseSwgdGhlIGNhY2hlIGxvb2t1cCBoYXBwZW5zIElOU0lERVxuICAgICAgICAgIC8vIHRoaXMgc2FtZSBwcm9taXNlUXVldWUgc2xvdCwgc28gYSBjYWNoZSBoaXQgb2NjdXBpZXMgdGhlIGV4YWN0XG4gICAgICAgICAgLy8gc2FtZSBwb3NpdGlvbiBpbiB0aGUgb3JkZXJlZCBkZWxpdmVyeSBjaGFpbiBhIHJlLWh5ZHJhdGUgd291bGRcbiAgICAgICAgICAvLyBoYXZlIOKAlCBwcmVzZXJ2aW5nIHRoZSBkZXRlcm1pbmlzbSB0aGF0IHBlbmRpbmdEZWxpdmVyaWVzLCB0aGVcbiAgICAgICAgICAvLyBkZWxpdmVyeSBiYXJyaWVycywgYW5kIFByb21pc2UucmFjZS9hbGwgcmVwbGF5IGRlcGVuZCBvbi4gT25seVxuICAgICAgICAgIC8vIHByaW1pdGl2ZSByZXN1bHRzIGFyZSBtZW1vaXplZDsgbm9uLXByaW1pdGl2ZXMgcmUtaHlkcmF0ZSBmcmVzaFxuICAgICAgICAgIC8vIGVhY2ggcmVwbGF5IHNvIGEgc2hhcmVkIHJlZmVyZW5jZSBjYW4gbmV2ZXIgY2FycnkgYSBtdXRhdGlvblxuICAgICAgICAgIC8vIGJldHdlZW4gcmVwbGF5cy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEh5ZHJhdGlvbiBjb3N0IGlzIHdoYXQgbWFrZXMgdGhpcyBkZWxpdmVyeSdzIHRpbWluZyB1bnN0YWJsZVxuICAgICAgICAgIC8vIGFjcm9zcyByZXBsYXlzIG9mIG9uZSBpbnZvY2F0aW9uOiB0aGUgZmlyc3QgcmVwbGF5IHBheXMgdGhlIGZ1bGxcbiAgICAgICAgICAvLyBkZWNyeXB0L2RlY29tcHJlc3MvcmV2aXZlLCBsYXRlciByZXBsYXlzIG1lbW8taGl0IGEgcHJpbWl0aXZlXG4gICAgICAgICAgLy8gcmVzdWx0IGluIGBzdGVwSHlkcmF0aW9uQ2FjaGVgIGFuZCBmaW5pc2ggaW4gYSBob3Agb3IgdHdvLiBBXG4gICAgICAgICAgLy8gd29ya2Zsb3cgYXdhaXRpbmcgdGhpcyByZXN1bHQgb24gb25lIGJyYW5jaCBhbmQgYSBgc2xlZXAoKWAgb3JcbiAgICAgICAgICAvLyBob29rIHBheWxvYWQgb24gYW5vdGhlciB3b3VsZCB0aGVyZWZvcmUgYWxsb2NhdGUgaXRzIGZvbGxvdy11cFxuICAgICAgICAgIC8vIHN0ZXAgVUxJRHMgaW4gYSBkaWZmZXJlbnQgb3JkZXIgb24gYSB3YXJtIHJlcGxheSB0aGFuIHRoZVxuICAgICAgICAgIC8vIGludm9jYXRpb24gdGhhdCBXUk9URSB0aG9zZSBgc3RlcF9jcmVhdGVkYCBldmVudHMgZGlkIOKAlCBhXG4gICAgICAgICAgLy8gcGVybWFuZW50IGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgLiBTbyB0aGUgcmVzdWx0IGlzIG9yZGVyZWQgYnlcbiAgICAgICAgICAvLyBldmVudC1sb2cgcG9zaXRpb24gdGhyb3VnaCB0aGUgZGVsaXZlcnktYmFycmllciByZWdpc3RyeSAoc2VlXG4gICAgICAgICAgLy8gYGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2ApOlxuICAgICAgICAgIC8vICAtIFJlZ2lzdGVyIGEgJ3N0ZXAnIGJhcnJpZXIgYXQgdGhpcyBldmVudCdzIGluZGV4IHNvIGFcbiAgICAgICAgICAvLyAgICBMQVRFUi1pbi1sb2cgd2FpdC9ob29rIGRlbGl2ZXJ5IGlzIGhhbmRlZCBvdmVyIG9ubHkgYWZ0ZXIgaXQuXG4gICAgICAgICAgLy8gIC0gSHlkcmF0ZSBpbnNpZGUgdGhpcyBzZXJpYWwgcXVldWUgc2xvdCAoa2VlcGluZyBhc3luY1xuICAgICAgICAgIC8vICAgIGRlc2VyaWFsaXphdGlvbiBpbiBldmVudC1sb2cgb3JkZXIpIGJ1dCBvbmx5IENBUFRVUkUgdGhlXG4gICAgICAgICAgLy8gICAgb3V0Y29tZTsgdGhlbiBkZWZlciBiZWhpbmQgZXZlcnkgRUFSTElFUi1pbi1sb2cgd2FpdCBhbmQgaG9va1xuICAgICAgICAgIC8vICAgIGRlbGl2ZXJ5IGJlZm9yZSByZXNvbHZpbmcsIGFuZCBtYXJrIHRoaXMgc3RlcCBkZWxpdmVyZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgZGVmZXJyYWwgaXMgY2FwdHVyZWQgSEVSRSwgd2hpbGUgY29uc3VtaW5nIHRoZSBldmVudCwgYW5kIG5vdFxuICAgICAgICAgIC8vIGluc2lkZSB0aGUgcXVldWUgc2xvdC4gVHdvIHJlYXNvbnMsIGJvdGggbG9hZC1iZWFyaW5nOlxuICAgICAgICAgIC8vICAtIERldGVybWluaXNtOiB0aGUgc2V0IG9mIGVhcmxpZXIgZGVsaXZlcmllcyBpcyB0aGVuIGEgZnVuY3Rpb24gb2ZcbiAgICAgICAgICAvLyAgICBsb2cgcG9zaXRpb24gYWxvbmUuIENhcHR1cmVkIGxhdGVyIGl0IHdvdWxkIGRlcGVuZCBvbiBob3cgbXVjaFxuICAgICAgICAgIC8vICAgIGh5ZHJhdGlvbiB0aGUgZWFybGllciBkZWxpdmVyaWVzIGhhZCBhbHJlYWR5IGZpbmlzaGVkIOKAlCB0aGUgdmVyeVxuICAgICAgICAgIC8vICAgIGNvdXBsaW5nIHRoaXMgYmFycmllciBleGlzdHMgdG8gcmVtb3ZlLlxuICAgICAgICAgIC8vICAtIENvdmVyYWdlOiBhbiBlYXJsaWVyIGRlbGl2ZXJ5IHdob3NlIG93biBoeWRyYXRpb24gc2xvdCBydW5zXG4gICAgICAgICAgLy8gICAgZmlyc3Qgb24gdGhpcyBzZXJpYWwgcXVldWUgaGFzIHVzdWFsbHkgYWxyZWFkeSByZXNvbHZlZCAoYW5kIHNvXG4gICAgICAgICAgLy8gICAgZGVyZWdpc3RlcmVkIGl0cyBiYXJyaWVyKSBieSB0aGUgdGltZSBhIGxhdGVyIHNsb3Qgc3RhcnRzLiBSZWFkXG4gICAgICAgICAgLy8gICAgYXQgc2xvdCBzdGFydCwgaXRzIGJhcnJpZXIgd291bGQgYmUgaW52aXNpYmxlIGFuZCB0aGlzIHN0ZXBcbiAgICAgICAgICAvLyAgICB3b3VsZCBub3QgZGVmZXIgYXQgYWxsLiBFdmVyeSBldmVudCBpbiBvbmUgZHJhaW4gd2luZG93IGlzXG4gICAgICAgICAgLy8gICAgY29uc3VtZWQgYmVmb3JlIGFueSBzbG90IHJ1bnMsIHNvIGNhcHR1cmluZyBhdCBjb25zdW1wdGlvbiB0aW1lXG4gICAgICAgICAgLy8gICAgc2VlcyBhbGwgb2YgdGhlbS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBkZWZlcnJhbCBydW5zIE9GRiB0aGUgc2VyaWFsIHF1ZXVlOiBpdCBtYXkgd2FpdCBvbiBhbiBlYXJsaWVyXG4gICAgICAgICAgLy8gd2FpdC9ob29rIGRlbGl2ZXJ5IHdob3NlIG93biByZXNvbHV0aW9uIGlzIGRyaXZlbiBieSB0aGlzIHF1ZXVlLFxuICAgICAgICAgIC8vIGFuZCBibG9ja2luZyBhIHF1ZXVlIHNsb3Qgb24gdGhhdCB3b3VsZCBkZWFkbG9jayB0aGUgcXVldWUgKHRoZVxuICAgICAgICAgIC8vIHNhbWUgY29uc3RyYWludCBzbGVlcC50cyBhbmQgaG9vay50cyBkb2N1bWVudCkuIGBwZW5kaW5nRGVsaXZlcmllc2BcbiAgICAgICAgICAvLyBpcyBsaWtld2lzZSByZWxlYXNlZCBpbnNpZGUgdGhlIHNsb3QsIGJlZm9yZSB0aGUgZGV0YWNoZWQgZGVmZXIsIHNvXG4gICAgICAgICAgLy8gYHNjaGVkdWxlV2hlbklkbGVgIGNhbiBzdGlsbCByZWFjaCBpZGxlIGFuZCByZXRpcmUgdGhlIGJhcnJpZXJzXG4gICAgICAgICAgLy8gdGhpcyBkZWZlcnJhbCBtYXkgYmUgd2FpdGluZyBvbi5cbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWRFdmVudElkID0gZXZlbnQuZXZlbnRJZDtcbiAgICAgICAgICBjb25zdCBzZXJpYWxpemVkUmVzdWx0ID0gZXZlbnQuZXZlbnREYXRhLnJlc3VsdDtcbiAgICAgICAgICBjb25zdCBldmVudEluZGV4ID0gY3R4LmV2ZW50c0NvbnN1bWVyLmV2ZW50SW5kZXg7XG4gICAgICAgICAgY29uc3QgYmFycmllciA9IHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKGN0eCwgZXZlbnRJbmRleCwgJ3N0ZXAnKTtcbiAgICAgICAgICBsZXQgb3V0Y29tZTpcbiAgICAgICAgICAgIHwgeyBvazogdHJ1ZTsgdmFsdWU6IFJlc3VsdCB9XG4gICAgICAgICAgICB8IHsgb2s6IGZhbHNlOyBlcnJvcjogdW5rbm93biB9O1xuICAgICAgICAgIGNvbnN0IGVhcmxpZXJEZWxpdmVyZWQgPSBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgZXZlbnRJbmRleCxcbiAgICAgICAgICAgICdzdGVwJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzKys7XG4gICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBoeWRyYXRlZFJlc3VsdCA9IGF3YWl0IGdldE9ySHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICBjdHguc3RlcEh5ZHJhdGlvbkNhY2hlLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEV2ZW50SWQsXG4gICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRSZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIGN0eC5ydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxUaGlzXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG91dGNvbWUgPSB7IG9rOiB0cnVlLCB2YWx1ZTogaHlkcmF0ZWRSZXN1bHQgYXMgUmVzdWx0IH07XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBvdXRjb21lID0geyBvazogZmFsc2UsIGVycm9yIH07XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZvaWQgZWFybGllckRlbGl2ZXJlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICAgIGlmIChvdXRjb21lLm9rKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShvdXRjb21lLnZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3Qob3V0Y29tZS5lcnJvcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyByZXBsYXkgaW5zdGFsbGVkIGEgZGlmZmVyZW50IGNvbnN1bWVyIHRoYW4gdGhlIHN0b3JlZCBldmVudCBuZWVkcy5cbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogVW5leHBlY3RlZCBldmVudCB0eXBlIGZvciBzdGVwICR7Y29ycmVsYXRpb25JZH0gKG5hbWU6ICR7c3RlcE5hbWV9KSBcIiR7ZXZlbnQuZXZlbnRUeXBlfVwiYCxcbiAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB0aGUgXCJuYW1lXCIgcHJvcGVydHkgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgc3RlcCBmdW5jdGlvbiBuYW1lXG4gICAgLy8gRXh0cmFjdCBmdW5jdGlvbiBuYW1lIGZyb20gc3RlcE5hbWUgKGZvcm1hdDogXCJzdGVwLy9maWxlcGF0aC8vZnVuY3Rpb25OYW1lXCIpXG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3RlcE5hbWUuc3BsaXQoJy8vJykucG9wKCk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0ZXBGdW5jdGlvbiwgJ25hbWUnLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb25OYW1lLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIHRoZSBzdGVwIGZ1bmN0aW9uIGlkZW50aWZpZXIgdG8gdGhlIHN0ZXAgZnVuY3Rpb24gZm9yIHNlcmlhbGl6YXRpb25cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3RlcEZ1bmN0aW9uLCAnc3RlcElkJywge1xuICAgICAgdmFsdWU6IHN0ZXBOYW1lLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gU3RvcmUgdGhlIGNsb3N1cmUgdmFyaWFibGVzIGZ1bmN0aW9uIGZvciBzZXJpYWxpemF0aW9uXG4gICAgaWYgKGNsb3N1cmVWYXJzRm4pIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdGVwRnVuY3Rpb24sICdfX2Nsb3N1cmVWYXJzRm4nLCB7XG4gICAgICAgIHZhbHVlOiBjbG9zdXJlVmFyc0ZuLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gT3ZlcnJpZGUgYC5iaW5kYCBzbyB0aGUgYm91bmQgZnVuY3Rpb24gcHJlc2VydmVzIHRoZSBzdGVwIHByb3h5XG4gICAgLy8gbWV0YWRhdGEgdGhhdCBgZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcmAgcmVsaWVzIG9uIGZvciBzZXJpYWxpemF0aW9uLlxuICAgIC8vIFdpdGhvdXQgdGhpcyBvdmVycmlkZSwgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCB3b3VsZCByZXR1cm4gYSBuZXdcbiAgICAvLyBmdW5jdGlvbiB0aGF0IGRvZXNuJ3QgaW5oZXJpdCBgc3RlcElkYCwgYF9fY2xvc3VyZVZhcnNGbmAsIG9yIGFueVxuICAgIC8vIG90aGVyIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbCBwcm94eSDigJQgc28gdGhlIFN0ZXBGdW5jdGlvblxuICAgIC8vIHJlZHVjZXIgd291bGQgcmVmdXNlIHRvIHNlcmlhbGl6ZSBpdCAoaXQnZCBsb29rIGxpa2UgYSBwbGFpblxuICAgIC8vIGZ1bmN0aW9uKSwgYW5kIGEgYHVzZVN0ZXAoLi4uKS5iaW5kKHRoaXMpYCBwcm94eSB0aGF0IGZsb3dlZFxuICAgIC8vIHRocm91Z2ggd29ya2Zsb3cgc2VyaWFsaXphdGlvbiB3b3VsZCBzaWxlbnRseSBicmVhay5cbiAgICAvL1xuICAgIC8vIFRoZSBvdmVycmlkZSBzdGFzaGVzIHRocmVlIHBpZWNlcyBvZiBzdGF0ZSBvbiB0aGUgYm91bmQgZnVuY3Rpb24gc29cbiAgICAvLyB0aGUgcm91bmQgdHJpcCBpcyBmYWl0aGZ1bDpcbiAgICAvLyAgIC0gYHN0ZXBJZGAgICAgICAgICAgICAg4oCUIGFscmVhZHkgc2V0IG9uIHRoZSBvcmlnaW5hbCBwcm94eS5cbiAgICAvLyAgIC0gYF9fY2xvc3VyZVZhcnNGbmAgICAg4oCUIG9ubHkgd2hlbiB0aGUgb3JpZ2luYWwgcHJveHkgaGFkIG9uZS5cbiAgICAvLyAgIC0gYF9fYm91bmRUaGlzYCAgICAgICAg4oCUIHRoZSByZWNlaXZlciBwYXNzZWQgdG8gYC5iaW5kKHRoaXNBcmcsIOKApilgLlxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsd2F5cyBzZXQgKGV2ZW4gd2hlbiBgdGhpc0FyZ2AgaXNcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbnVsbGAvYHVuZGVmaW5lZGApIHNvIHRoZSByZWR1Y2VyIGNhblxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Rpbmd1aXNoIFwid2FzIGJvdW5kXCIgZnJvbSBcIndhc24ndFwiLlxuICAgIC8vICAgLSBgX19ib3VuZEFyZ3NgICAgICAgICDigJQgb25seSB3aGVuIHRoZSB1c2VyIHN1cHBsaWVkIHByZWZpbGxlZFxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyAoYC5iaW5kKHRoaXNBcmcsIHgsIHkpYCkuIFRoZVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXQyBwbHVnaW4gb25seSBldmVyIGVtaXRzIGAuYmluZCh0aGlzKWBcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RheSwgc28gdGhpcyBpcyByYXJlIGluIHByYWN0aWNlOyB3ZVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIGNhcHR1cmUgaXQgc28gdGhlIHBhcnRpYWwgYXJnc1xuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnZpdmUgc2VyaWFsaXphdGlvbiByYXRoZXIgdGhhblxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVudGx5IGRpc2FwcGVhcmluZyBvbiB0aGUgc3RlcCBzaWRlLlxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdGVwRnVuY3Rpb24sICdiaW5kJywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIChcbiAgICAgICAgdGhpczogdHlwZW9mIHN0ZXBGdW5jdGlvbixcbiAgICAgICAgdGhpc0FyZzogdW5rbm93bixcbiAgICAgICAgLi4ucGFydGlhbEFyZ3M6IHVua25vd25bXVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGJvdW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXNBcmcsXG4gICAgICAgICAgLi4ucGFydGlhbEFyZ3NcbiAgICAgICAgKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJvdW5kLCAnc3RlcElkJywge1xuICAgICAgICAgIHZhbHVlOiBzdGVwTmFtZSxcbiAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjbG9zdXJlVmFyc0ZuKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJvdW5kLCAnX19jbG9zdXJlVmFyc0ZuJywge1xuICAgICAgICAgICAgdmFsdWU6IGNsb3N1cmVWYXJzRm4sXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJvdW5kLCAnX19ib3VuZFRoaXMnLCB7XG4gICAgICAgICAgdmFsdWU6IHRoaXNBcmcsXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocGFydGlhbEFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShib3VuZCwgJ19fYm91bmRBcmdzJywge1xuICAgICAgICAgICAgdmFsdWU6IHBhcnRpYWxBcmdzLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib3VuZDtcbiAgICAgIH0sXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RlcEZ1bmN0aW9uO1xuICB9O1xufVxuIl19
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "4.8.1";
1
+ export declare const version = "4.8.3";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '4.8.1';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGdlbnZlcnNpb24uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICc0LjguMSdcbiJdfQ==
2
+ export const version = '4.8.3';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGdlbnZlcnNpb24uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICc0LjguMydcbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vm/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IAEb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB;;;iCAoG1B,MAAM;EAItC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vm/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IAEb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB;;;iCAyG1B,MAAM;EAItC"}
package/dist/vm/index.js CHANGED
@@ -17,15 +17,18 @@ export function createContext(options) {
17
17
  const g = runInContext('globalThis', context);
18
18
  // Deterministic `Math.random()`
19
19
  g.Math.random = rng;
20
- // Override `Date` constructor to return fixed time when called without arguments
20
+ // Override `Date` constructor to return fixed time when called without
21
+ // arguments. Constructing through `Reflect.construct` with `new.target`
22
+ // keeps subclassing intact (e.g. `TZDate` from `@date-fns/tz`), while a
23
+ // plain function (rather than a `class`) keeps `Date()` callable without
24
+ // `new`, which per spec ignores its arguments and returns the time string.
21
25
  const Date_ = g.Date;
22
26
  // biome-ignore lint/suspicious/noShadowRestrictedNames: We're shadowing the global `Date` property to make it deterministic.
23
27
  g.Date = function Date(...args) {
24
- if (args.length === 0) {
25
- return new Date_(fixedTimestamp);
28
+ if (new.target === undefined) {
29
+ return new Date_(fixedTimestamp).toString();
26
30
  }
27
- // @ts-expect-error - Args is `Date` constructor arguments
28
- return new Date_(...args);
31
+ return Reflect.construct(Date_, args.length === 0 ? [fixedTimestamp] : args, new.target);
29
32
  };
30
33
  g.Date.prototype = Date_.prototype;
31
34
  // Preserve static methods
@@ -99,4 +102,4 @@ export function createContext(options) {
99
102
  },
100
103
  };
101
104
  }
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdm0vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLElBQUksZUFBZSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pFLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFRN0M7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUE2QjtJQUN6RCxJQUFJLEVBQUUsY0FBYyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ2pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDekIsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLGVBQWUsRUFBRSxDQUFDO0lBRWxDLE1BQU0sQ0FBQyxHQUFzQixZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWpFLGdDQUFnQztJQUNoQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFFcEIsaUZBQWlGO0lBQ2pGLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDckIsNkhBQTZIO0lBQzVILENBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxJQUFJLENBQzdCLEdBQUcsSUFBK0M7UUFFbEQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELDBEQUEwRDtRQUMxRCxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQyxD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L0MsQ0FBQyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztJQUV6QixvRUFBb0U7SUFDcEUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXRDLGlFQUFpRTtJQUNoRSxDQUFDLENBQUMsTUFBYyxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDLE1BQWMsQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBRXJFLHNDQUFzQztJQUN0QyxDQUFDLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNkLENBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRTNDLE9BQU87UUFDTCxPQUFPO1FBQ1AsVUFBVSxFQUFFLENBQUM7UUFDYixlQUFlLEVBQUUsQ0FBQyxTQUFpQixFQUFFLEVBQUU7WUFDckMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUM3QixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBydW5JbkNvbnRleHQsIGNyZWF0ZUNvbnRleHQgYXMgdm1DcmVhdGVDb250ZXh0IH0gZnJvbSAnbm9kZTp2bSc7XG5pbXBvcnQgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IGluc3RhbGxVaW50OEFycmF5QmFzZTY0IH0gZnJvbSAnLi91aW50OGFycmF5LWJhc2U2NC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSYW5kb21VVUlEIH0gZnJvbSAnLi91dWlkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVDb250ZXh0T3B0aW9ucyB7XG4gIHNlZWQ6IHN0cmluZztcbiAgLy8gRml4ZWQgdGltZXN0YW1wIGZvciBkZXRlcm1pbmlzdGljIERhdGUgb3BlcmF0aW9uc1xuICBmaXhlZFRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBOb2RlLmpzIGB2bS5Db250ZXh0YCBjb25maWd1cmVkIHRvIGJlIHVzYWJsZSBmb3JcbiAqIGV4ZWN1dGluZyB3b3JrZmxvdyBsb2dpYyBpbiBhIGRldGVybWluaXN0aWMgZW52aXJvbm1lbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGNvbnRleHQuXG4gKiBAcmV0dXJucyBUaGUgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQob3B0aW9uczogQ3JlYXRlQ29udGV4dE9wdGlvbnMpIHtcbiAgbGV0IHsgZml4ZWRUaW1lc3RhbXAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHsgc2VlZCB9ID0gb3B0aW9ucztcbiAgY29uc3Qgcm5nID0gc2VlZHJhbmRvbShzZWVkKTtcbiAgY29uc3QgY29udGV4dCA9IHZtQ3JlYXRlQ29udGV4dCgpO1xuXG4gIGNvbnN0IGc6IHR5cGVvZiBnbG9iYWxUaGlzID0gcnVuSW5Db250ZXh0KCdnbG9iYWxUaGlzJywgY29udGV4dCk7XG5cbiAgLy8gRGV0ZXJtaW5pc3RpYyBgTWF0aC5yYW5kb20oKWBcbiAgZy5NYXRoLnJhbmRvbSA9IHJuZztcblxuICAvLyBPdmVycmlkZSBgRGF0ZWAgY29uc3RydWN0b3IgdG8gcmV0dXJuIGZpeGVkIHRpbWUgd2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHNcbiAgY29uc3QgRGF0ZV8gPSBnLkRhdGU7XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9TaGFkb3dSZXN0cmljdGVkTmFtZXM6IFdlJ3JlIHNoYWRvd2luZyB0aGUgZ2xvYmFsIGBEYXRlYCBwcm9wZXJ0eSB0byBtYWtlIGl0IGRldGVybWluaXN0aWMuXG4gIChnIGFzIGFueSkuRGF0ZSA9IGZ1bmN0aW9uIERhdGUoXG4gICAgLi4uYXJnczogUGFyYW1ldGVyczwodHlwZW9mIGdsb2JhbFRoaXMpWydEYXRlJ10+W11cbiAgKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVfKGZpeGVkVGltZXN0YW1wKTtcbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEFyZ3MgaXMgYERhdGVgIGNvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgIHJldHVybiBuZXcgRGF0ZV8oLi4uYXJncyk7XG4gIH07XG4gIChnIGFzIGFueSkuRGF0ZS5wcm90b3R5cGUgPSBEYXRlXy5wcm90b3R5cGU7XG4gIC8vIFByZXNlcnZlIHN0YXRpYyBtZXRob2RzXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihnLkRhdGUsIERhdGVfKTtcbiAgZy5EYXRlLm5vdyA9ICgpID0+IGZpeGVkVGltZXN0YW1wO1xuXG4gIC8vIERldGVybWluaXN0aWMgYGNyeXB0b2AgdXNpbmcgUHJveHkgdG8gYXZvaWQgbXV0YXRpbmcgZ2xvYmFsIG9iamVjdHNcbiAgY29uc3Qgb3JpZ2luYWxDcnlwdG8gPSBnbG9iYWxUaGlzLmNyeXB0bztcbiAgY29uc3Qgb3JpZ2luYWxTdWJ0bGUgPSBvcmlnaW5hbENyeXB0by5zdWJ0bGU7XG5cbiAgZnVuY3Rpb24gZ2V0UmFuZG9tVmFsdWVzKGFycmF5OiBVaW50OEFycmF5KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgYXJyYXlbaV0gPSBNYXRoLmZsb29yKHJuZygpICogMjU2KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgY29uc3QgcmFuZG9tVVVJRCA9IGNyZWF0ZVJhbmRvbVVVSUQocm5nKTtcblxuICBjb25zdCBib3VuZERpZ2VzdCA9IG9yaWdpbmFsU3VidGxlLmRpZ2VzdC5iaW5kKG9yaWdpbmFsU3VidGxlKTtcblxuICBnLmNyeXB0byA9IG5ldyBQcm94eShvcmlnaW5hbENyeXB0bywge1xuICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgIGlmIChwcm9wID09PSAnZ2V0UmFuZG9tVmFsdWVzJykge1xuICAgICAgICByZXR1cm4gZ2V0UmFuZG9tVmFsdWVzO1xuICAgICAgfVxuICAgICAgaWYgKHByb3AgPT09ICdyYW5kb21VVUlEJykge1xuICAgICAgICByZXR1cm4gcmFuZG9tVVVJRDtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wID09PSAnc3VidGxlJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KG9yaWdpbmFsU3VidGxlLCB7XG4gICAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdnZW5lcmF0ZUtleScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wID09PSAnZGlnZXN0Jykge1xuICAgICAgICAgICAgICByZXR1cm4gYm91bmREaWdlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3AgYXMga2V5b2YgdHlwZW9mIG9yaWdpbmFsU3VidGxlXTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXRbcHJvcCBhcyBrZXlvZiB0eXBlb2Ygb3JpZ2luYWxDcnlwdG9dO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8vIFByb3BhZ2F0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgKGcgYXMgYW55KS5wcm9jZXNzID0ge1xuICAgIGVudjogT2JqZWN0LmZyZWV6ZSh7IC4uLnByb2Nlc3MuZW52IH0pLFxuICB9O1xuXG4gIC8vIFN0YXRlbGVzcyArIHN5bmNocm9ub3VzIFdlYiBBUElzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIGluc2lkZSB0aGUgc2FuZGJveFxuICBnLkRPTUV4Y2VwdGlvbiA9IGdsb2JhbFRoaXMuRE9NRXhjZXB0aW9uO1xuICBnLkhlYWRlcnMgPSBnbG9iYWxUaGlzLkhlYWRlcnM7XG4gIGcuVGV4dEVuY29kZXIgPSBnbG9iYWxUaGlzLlRleHRFbmNvZGVyO1xuICBnLlRleHREZWNvZGVyID0gZ2xvYmFsVGhpcy5UZXh0RGVjb2RlcjtcbiAgZy5jb25zb2xlID0gZ2xvYmFsVGhpcy5jb25zb2xlO1xuICBnLlVSTCA9IGdsb2JhbFRoaXMuVVJMO1xuICBnLlVSTFNlYXJjaFBhcmFtcyA9IGdsb2JhbFRoaXMuVVJMU2VhcmNoUGFyYW1zO1xuICBnLnN0cnVjdHVyZWRDbG9uZSA9IGdsb2JhbFRoaXMuc3RydWN0dXJlZENsb25lO1xuICBnLmF0b2IgPSBnbG9iYWxUaGlzLmF0b2I7XG4gIGcuYnRvYSA9IGdsb2JhbFRoaXMuYnRvYTtcblxuICAvLyBUQzM5IFVpbnQ4QXJyYXkgYmFzZTY0L2hleCBwb2x5ZmlsbCAocHJvcG9zYWwtYXJyYXlidWZmZXItYmFzZTY0KVxuICBpbnN0YWxsVWludDhBcnJheUJhc2U2NChnLlVpbnQ4QXJyYXkpO1xuXG4gIC8vIFRDMzkgRXhwbGljaXQgUmVzb3VyY2UgTWFuYWdlbWVudCBwb2x5ZmlsbCBmb3IgYHVzaW5nYCBrZXl3b3JkXG4gIChnLlN5bWJvbCBhcyBhbnkpLmRpc3Bvc2UgPz89IFN5bWJvbC5mb3IoJ1N5bWJvbC5kaXNwb3NlJyk7XG4gIChnLlN5bWJvbCBhcyBhbnkpLmFzeW5jRGlzcG9zZSA/Pz0gU3ltYm9sLmZvcignU3ltYm9sLmFzeW5jRGlzcG9zZScpO1xuXG4gIC8vIEhBQ0s6IFNoaW0gYGV4cG9ydHNgIGZvciB0aGUgYnVuZGxlXG4gIGcuZXhwb3J0cyA9IHt9O1xuICAoZyBhcyBhbnkpLm1vZHVsZSA9IHsgZXhwb3J0czogZy5leHBvcnRzIH07XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZXh0LFxuICAgIGdsb2JhbFRoaXM6IGcsXG4gICAgdXBkYXRlVGltZXN0YW1wOiAodGltZXN0YW1wOiBudW1iZXIpID0+IHtcbiAgICAgIGZpeGVkVGltZXN0YW1wID0gdGltZXN0YW1wO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdm0vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLElBQUksZUFBZSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3pFLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFRN0M7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxPQUE2QjtJQUN6RCxJQUFJLEVBQUUsY0FBYyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ2pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDekIsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLGVBQWUsRUFBRSxDQUFDO0lBRWxDLE1BQU0sQ0FBQyxHQUFzQixZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWpFLGdDQUFnQztJQUNoQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFFcEIsdUVBQXVFO0lBQ3ZFLHdFQUF3RTtJQUN4RSx3RUFBd0U7SUFDeEUseUVBQXlFO0lBQ3pFLDJFQUEyRTtJQUMzRSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3JCLDZIQUE2SDtJQUM1SCxDQUFTLENBQUMsSUFBSSxHQUFHLFNBQVMsSUFBSSxDQUFDLEdBQUcsSUFBVztRQUM1QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBQ0Qs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QyxPQUFPLENBQUM7SUFDL0IsQ0FBQyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztJQUMvQyxDQUFDLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUM7SUFDL0MsQ0FBQyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztJQUV6QixvRUFBb0U7SUFDcEUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXRDLGlFQUFpRTtJQUNoRSxDQUFDLENBQUMsTUFBYyxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDLE1BQWMsQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBRXJFLHNDQUFzQztJQUN0QyxDQUFDLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNkLENBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRTNDLE9BQU87UUFDTCxPQUFPO1FBQ1AsVUFBVSxFQUFFLENBQUM7UUFDYixlQUFlLEVBQUUsQ0FBQyxTQUFpQixFQUFFLEVBQUU7WUFDckMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUM3QixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBydW5JbkNvbnRleHQsIGNyZWF0ZUNvbnRleHQgYXMgdm1DcmVhdGVDb250ZXh0IH0gZnJvbSAnbm9kZTp2bSc7XG5pbXBvcnQgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IGluc3RhbGxVaW50OEFycmF5QmFzZTY0IH0gZnJvbSAnLi91aW50OGFycmF5LWJhc2U2NC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSYW5kb21VVUlEIH0gZnJvbSAnLi91dWlkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVDb250ZXh0T3B0aW9ucyB7XG4gIHNlZWQ6IHN0cmluZztcbiAgLy8gRml4ZWQgdGltZXN0YW1wIGZvciBkZXRlcm1pbmlzdGljIERhdGUgb3BlcmF0aW9uc1xuICBmaXhlZFRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBOb2RlLmpzIGB2bS5Db250ZXh0YCBjb25maWd1cmVkIHRvIGJlIHVzYWJsZSBmb3JcbiAqIGV4ZWN1dGluZyB3b3JrZmxvdyBsb2dpYyBpbiBhIGRldGVybWluaXN0aWMgZW52aXJvbm1lbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGNvbnRleHQuXG4gKiBAcmV0dXJucyBUaGUgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQob3B0aW9uczogQ3JlYXRlQ29udGV4dE9wdGlvbnMpIHtcbiAgbGV0IHsgZml4ZWRUaW1lc3RhbXAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHsgc2VlZCB9ID0gb3B0aW9ucztcbiAgY29uc3Qgcm5nID0gc2VlZHJhbmRvbShzZWVkKTtcbiAgY29uc3QgY29udGV4dCA9IHZtQ3JlYXRlQ29udGV4dCgpO1xuXG4gIGNvbnN0IGc6IHR5cGVvZiBnbG9iYWxUaGlzID0gcnVuSW5Db250ZXh0KCdnbG9iYWxUaGlzJywgY29udGV4dCk7XG5cbiAgLy8gRGV0ZXJtaW5pc3RpYyBgTWF0aC5yYW5kb20oKWBcbiAgZy5NYXRoLnJhbmRvbSA9IHJuZztcblxuICAvLyBPdmVycmlkZSBgRGF0ZWAgY29uc3RydWN0b3IgdG8gcmV0dXJuIGZpeGVkIHRpbWUgd2hlbiBjYWxsZWQgd2l0aG91dFxuICAvLyBhcmd1bWVudHMuIENvbnN0cnVjdGluZyB0aHJvdWdoIGBSZWZsZWN0LmNvbnN0cnVjdGAgd2l0aCBgbmV3LnRhcmdldGBcbiAgLy8ga2VlcHMgc3ViY2xhc3NpbmcgaW50YWN0IChlLmcuIGBUWkRhdGVgIGZyb20gYEBkYXRlLWZucy90emApLCB3aGlsZSBhXG4gIC8vIHBsYWluIGZ1bmN0aW9uIChyYXRoZXIgdGhhbiBhIGBjbGFzc2ApIGtlZXBzIGBEYXRlKClgIGNhbGxhYmxlIHdpdGhvdXRcbiAgLy8gYG5ld2AsIHdoaWNoIHBlciBzcGVjIGlnbm9yZXMgaXRzIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgdGltZSBzdHJpbmcuXG4gIGNvbnN0IERhdGVfID0gZy5EYXRlO1xuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vU2hhZG93UmVzdHJpY3RlZE5hbWVzOiBXZSdyZSBzaGFkb3dpbmcgdGhlIGdsb2JhbCBgRGF0ZWAgcHJvcGVydHkgdG8gbWFrZSBpdCBkZXRlcm1pbmlzdGljLlxuICAoZyBhcyBhbnkpLkRhdGUgPSBmdW5jdGlvbiBEYXRlKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgaWYgKG5ldy50YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlXyhmaXhlZFRpbWVzdGFtcCkudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlZmxlY3QuY29uc3RydWN0KFxuICAgICAgRGF0ZV8sXG4gICAgICBhcmdzLmxlbmd0aCA9PT0gMCA/IFtmaXhlZFRpbWVzdGFtcF0gOiBhcmdzLFxuICAgICAgbmV3LnRhcmdldFxuICAgICk7XG4gIH07XG4gIChnIGFzIGFueSkuRGF0ZS5wcm90b3R5cGUgPSBEYXRlXy5wcm90b3R5cGU7XG4gIC8vIFByZXNlcnZlIHN0YXRpYyBtZXRob2RzXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihnLkRhdGUsIERhdGVfKTtcbiAgZy5EYXRlLm5vdyA9ICgpID0+IGZpeGVkVGltZXN0YW1wO1xuXG4gIC8vIERldGVybWluaXN0aWMgYGNyeXB0b2AgdXNpbmcgUHJveHkgdG8gYXZvaWQgbXV0YXRpbmcgZ2xvYmFsIG9iamVjdHNcbiAgY29uc3Qgb3JpZ2luYWxDcnlwdG8gPSBnbG9iYWxUaGlzLmNyeXB0bztcbiAgY29uc3Qgb3JpZ2luYWxTdWJ0bGUgPSBvcmlnaW5hbENyeXB0by5zdWJ0bGU7XG5cbiAgZnVuY3Rpb24gZ2V0UmFuZG9tVmFsdWVzKGFycmF5OiBVaW50OEFycmF5KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgYXJyYXlbaV0gPSBNYXRoLmZsb29yKHJuZygpICogMjU2KTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgY29uc3QgcmFuZG9tVVVJRCA9IGNyZWF0ZVJhbmRvbVVVSUQocm5nKTtcblxuICBjb25zdCBib3VuZERpZ2VzdCA9IG9yaWdpbmFsU3VidGxlLmRpZ2VzdC5iaW5kKG9yaWdpbmFsU3VidGxlKTtcblxuICBnLmNyeXB0byA9IG5ldyBQcm94eShvcmlnaW5hbENyeXB0bywge1xuICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgIGlmIChwcm9wID09PSAnZ2V0UmFuZG9tVmFsdWVzJykge1xuICAgICAgICByZXR1cm4gZ2V0UmFuZG9tVmFsdWVzO1xuICAgICAgfVxuICAgICAgaWYgKHByb3AgPT09ICdyYW5kb21VVUlEJykge1xuICAgICAgICByZXR1cm4gcmFuZG9tVVVJRDtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wID09PSAnc3VidGxlJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KG9yaWdpbmFsU3VidGxlLCB7XG4gICAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdnZW5lcmF0ZUtleScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wID09PSAnZGlnZXN0Jykge1xuICAgICAgICAgICAgICByZXR1cm4gYm91bmREaWdlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3AgYXMga2V5b2YgdHlwZW9mIG9yaWdpbmFsU3VidGxlXTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXRbcHJvcCBhcyBrZXlvZiB0eXBlb2Ygb3JpZ2luYWxDcnlwdG9dO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8vIFByb3BhZ2F0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgKGcgYXMgYW55KS5wcm9jZXNzID0ge1xuICAgIGVudjogT2JqZWN0LmZyZWV6ZSh7IC4uLnByb2Nlc3MuZW52IH0pLFxuICB9O1xuXG4gIC8vIFN0YXRlbGVzcyArIHN5bmNocm9ub3VzIFdlYiBBUElzIHRoYXQgYXJlIG1hZGUgYXZhaWxhYmxlIGluc2lkZSB0aGUgc2FuZGJveFxuICBnLkRPTUV4Y2VwdGlvbiA9IGdsb2JhbFRoaXMuRE9NRXhjZXB0aW9uO1xuICBnLkhlYWRlcnMgPSBnbG9iYWxUaGlzLkhlYWRlcnM7XG4gIGcuVGV4dEVuY29kZXIgPSBnbG9iYWxUaGlzLlRleHRFbmNvZGVyO1xuICBnLlRleHREZWNvZGVyID0gZ2xvYmFsVGhpcy5UZXh0RGVjb2RlcjtcbiAgZy5jb25zb2xlID0gZ2xvYmFsVGhpcy5jb25zb2xlO1xuICBnLlVSTCA9IGdsb2JhbFRoaXMuVVJMO1xuICBnLlVSTFNlYXJjaFBhcmFtcyA9IGdsb2JhbFRoaXMuVVJMU2VhcmNoUGFyYW1zO1xuICBnLnN0cnVjdHVyZWRDbG9uZSA9IGdsb2JhbFRoaXMuc3RydWN0dXJlZENsb25lO1xuICBnLmF0b2IgPSBnbG9iYWxUaGlzLmF0b2I7XG4gIGcuYnRvYSA9IGdsb2JhbFRoaXMuYnRvYTtcblxuICAvLyBUQzM5IFVpbnQ4QXJyYXkgYmFzZTY0L2hleCBwb2x5ZmlsbCAocHJvcG9zYWwtYXJyYXlidWZmZXItYmFzZTY0KVxuICBpbnN0YWxsVWludDhBcnJheUJhc2U2NChnLlVpbnQ4QXJyYXkpO1xuXG4gIC8vIFRDMzkgRXhwbGljaXQgUmVzb3VyY2UgTWFuYWdlbWVudCBwb2x5ZmlsbCBmb3IgYHVzaW5nYCBrZXl3b3JkXG4gIChnLlN5bWJvbCBhcyBhbnkpLmRpc3Bvc2UgPz89IFN5bWJvbC5mb3IoJ1N5bWJvbC5kaXNwb3NlJyk7XG4gIChnLlN5bWJvbCBhcyBhbnkpLmFzeW5jRGlzcG9zZSA/Pz0gU3ltYm9sLmZvcignU3ltYm9sLmFzeW5jRGlzcG9zZScpO1xuXG4gIC8vIEhBQ0s6IFNoaW0gYGV4cG9ydHNgIGZvciB0aGUgYnVuZGxlXG4gIGcuZXhwb3J0cyA9IHt9O1xuICAoZyBhcyBhbnkpLm1vZHVsZSA9IHsgZXhwb3J0czogZy5leHBvcnRzIH07XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZXh0LFxuICAgIGdsb2JhbFRoaXM6IGcsXG4gICAgdXBkYXRlVGltZXN0YW1wOiAodGltZXN0YW1wOiBudW1iZXIpID0+IHtcbiAgICAgIGZpeGVkVGltZXN0YW1wID0gdGltZXN0YW1wO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/workflow/hook.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAI3D,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AA6BvB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,2BAA2B,IAChC,CAAC,GAAG,GAAG,EAAE,UAAS,WAAgB,KAAG,IAAI,CAAC,CAAC,CAAC,CAkb5E"}
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/workflow/hook.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAI3D,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AA6BvB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,2BAA2B,IAChC,CAAC,GAAG,GAAG,EAAE,UAAS,WAAgB,KAAG,IAAI,CAAC,CAAC,CAAC,CA2d5E"}