1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const ava_1 = require("ava");
|
4 | const uuid_1 = require("uuid");
|
5 | const cache_1 = require("../src/cache");
|
6 | const throttle_1 = require("../src/throttle");
|
7 | const functions_1 = require("./fixtures/functions");
|
8 | const util_1 = require("./fixtures/util");
|
9 | (0, ava_1.default)("deferred resolves its promise", async (t) => {
|
10 | const deferred = new throttle_1.Deferred();
|
11 | let resolved = false;
|
12 | deferred.promise.then(_ => (resolved = true));
|
13 | t.is(resolved, false);
|
14 | deferred.resolve();
|
15 | await deferred.promise;
|
16 | t.is(resolved, true);
|
17 | });
|
18 | (0, ava_1.default)("deferred rejects its promise", async (t) => {
|
19 | const deferred = new throttle_1.Deferred();
|
20 | let rejected = false;
|
21 | t.is(rejected, false);
|
22 | deferred.reject();
|
23 | try {
|
24 | await deferred.promise;
|
25 | }
|
26 | catch (_) {
|
27 | rejected = true;
|
28 | }
|
29 | t.is(rejected, true);
|
30 | });
|
31 | (0, ava_1.default)("deferred resolves only once", async (t) => {
|
32 | const deferred = new throttle_1.Deferred();
|
33 | let value = 0;
|
34 | deferred.promise.then(_ => value++);
|
35 | deferred.resolve();
|
36 | await deferred.promise;
|
37 | t.is(value, 1);
|
38 | deferred.resolve();
|
39 | await deferred.promise;
|
40 | t.is(value, 1);
|
41 | });
|
42 | (0, ava_1.default)("deferred cannot reject after resolving", async (t) => {
|
43 | const deferred = new throttle_1.Deferred();
|
44 | let value = 0;
|
45 | deferred.promise.then(_ => value++);
|
46 | deferred.resolve();
|
47 | await deferred.promise;
|
48 | t.is(value, 1);
|
49 | deferred.reject();
|
50 | await deferred.promise;
|
51 | t.is(value, 1);
|
52 | });
|
53 | ava_1.default.serial("funnel defaults to infinite concurrency (tested with 200)", t => (0, util_1.withClock)(async () => {
|
54 | const funnel = new throttle_1.Funnel(0);
|
55 | const promises = [];
|
56 | const N = 200;
|
57 | for (let i = 0; i < N; i++) {
|
58 | promises.push(funnel.push(() => (0, functions_1.timer)(300)));
|
59 | }
|
60 | const times = await Promise.all(promises);
|
61 | t.is((0, util_1.measureConcurrency)(times), N);
|
62 | }));
|
63 | ava_1.default.serial("funnel single concurrency is mutually exclusive", t => (0, util_1.withClock)(async () => {
|
64 | const funnel = new throttle_1.Funnel(1);
|
65 | const promises = [];
|
66 | const N = 10;
|
67 | for (let i = 0; i < N; i++) {
|
68 | promises.push(funnel.push(() => (0, functions_1.timer)(10)));
|
69 | }
|
70 | const times = await Promise.all(promises);
|
71 | t.is((0, util_1.measureConcurrency)(times), 1);
|
72 | }));
|
73 | ava_1.default.serial("funnel handles concurrency level 2", t => (0, util_1.withClock)(async () => {
|
74 | const funnel = new throttle_1.Funnel(2);
|
75 | const promises = [];
|
76 | const N = 10;
|
77 | for (let i = 0; i < N; i++) {
|
78 | promises.push(funnel.push(() => (0, functions_1.timer)(20)));
|
79 | }
|
80 | const times = await Promise.all(promises);
|
81 | t.is((0, util_1.measureConcurrency)(times), 2);
|
82 | }));
|
83 | ava_1.default.serial("funnel handles concurrency level 10", t => (0, util_1.withClock)(async () => {
|
84 | const funnel = new throttle_1.Funnel(10);
|
85 | const promises = [];
|
86 | const N = 100;
|
87 | for (let i = 0; i < N; i++) {
|
88 | promises.push(funnel.push(() => (0, functions_1.timer)(20)));
|
89 | }
|
90 | const times = await Promise.all(promises);
|
91 | t.is((0, util_1.measureConcurrency)(times), 10);
|
92 | }));
|
93 | ava_1.default.serial("funnel resumes after finishing a worker", t => (0, util_1.withClock)(async () => {
|
94 | const funnel = new throttle_1.Funnel(1);
|
95 | const time1 = await funnel.push(() => (0, functions_1.timer)(10));
|
96 | const time2 = await funnel.push(() => (0, functions_1.timer)(10));
|
97 | t.is((0, util_1.measureConcurrency)([time1, time2]), 1);
|
98 | }));
|
99 | (0, ava_1.default)("funnel clearing", async (t) => {
|
100 | const funnel = new throttle_1.Funnel(1);
|
101 | let count = 0;
|
102 | const promise0 = funnel.push(async () => count++);
|
103 | const promise1 = funnel.push(async () => count++);
|
104 | const promise2 = funnel.push(async () => count++);
|
105 | funnel.clear();
|
106 | t.is(await Promise.race([promise0, promise1, promise2, (0, util_1.sleep)(100).then(_ => "done")]), "done");
|
107 | t.is(count, 0);
|
108 | });
|
109 | (0, ava_1.default)("funnel gets executed asynchronously, not at the moment of push", async (t) => {
|
110 | const funnel = new throttle_1.Funnel(1);
|
111 | let n = 0;
|
112 | funnel.push(async () => {
|
113 | n++;
|
114 | });
|
115 | t.is(n, 0);
|
116 | await funnel.all();
|
117 | t.is(n, 1);
|
118 | });
|
119 | (0, ava_1.default)("funnel handles promise rejections without losing concurrency", async (t) => {
|
120 | const funnel = new throttle_1.Funnel(1);
|
121 | let executed = false;
|
122 | await t.throwsAsync(funnel.push(() => Promise.reject(new Error("message"))), { message: "message" });
|
123 | await funnel.push(async () => {
|
124 | executed = true;
|
125 | });
|
126 | t.is(executed, true);
|
127 | });
|
128 | (0, ava_1.default)("funnel.all() waits for all requests to finish", async (t) => {
|
129 | const funnel = new throttle_1.Funnel(1);
|
130 | let executed = false;
|
131 | funnel.push(async () => {
|
132 | await (0, util_1.sleep)(200);
|
133 | executed = true;
|
134 | return "first";
|
135 | });
|
136 | funnel.push(async () => "second");
|
137 | t.is(executed, false);
|
138 | const result = await funnel.all();
|
139 | t.is(result.length, 2);
|
140 | t.is(result[0], "first");
|
141 | t.is(result[1], "second");
|
142 | t.is(executed, true);
|
143 | });
|
144 | (0, ava_1.default)("funnel.all() ignores errors and waits for other requests to finish", async (t) => {
|
145 | const funnel = new throttle_1.Funnel(1);
|
146 | funnel.push(async () => {
|
147 | throw new Error();
|
148 | });
|
149 | funnel.push(async () => {
|
150 | await (0, util_1.sleep)(100);
|
151 | return "done";
|
152 | });
|
153 | const result = await funnel.all();
|
154 | t.is(result.length, 2);
|
155 | t.falsy(result[0]);
|
156 | t.is(result[1], "done");
|
157 | });
|
158 | (0, ava_1.default)("retryOp() retries failures", async (t) => {
|
159 | let attempts = 0;
|
160 | await (0, throttle_1.retryOp)(2, async () => {
|
161 | attempts++;
|
162 | throw new Error();
|
163 | }).catch(_ => { });
|
164 | t.is(attempts, 3);
|
165 | });
|
166 | (0, ava_1.default)("funnel shouldRetry parameter retries failures", async (t) => {
|
167 | const funnel = new throttle_1.Funnel(1, 2);
|
168 | let attempts = 0;
|
169 | let errors = 0;
|
170 | funnel
|
171 | .push(async () => {
|
172 | attempts++;
|
173 | throw Error();
|
174 | })
|
175 | .catch(_ => errors++);
|
176 | await funnel.all();
|
177 | t.is(attempts, 3);
|
178 | t.is(errors, 1);
|
179 | });
|
180 | (0, ava_1.default)("funnel cancellation", async (t) => {
|
181 | const funnel = new throttle_1.Funnel(1);
|
182 | let executed = 0;
|
183 | const promise = funnel.push(async () => {
|
184 | executed++;
|
185 | }, 0, () => "cancelled");
|
186 | await t.throwsAsync(promise);
|
187 | t.is(executed, 0);
|
188 | });
|
189 | (0, ava_1.default)("funnel processed and error counts", async (t) => {
|
190 | const funnel = new throttle_1.Funnel(2);
|
191 | funnel.push(async () => { });
|
192 | funnel.push(async () => Promise.reject());
|
193 | funnel.push(async () => { });
|
194 | funnel.push(async () => Promise.reject());
|
195 | funnel.push(async () => { });
|
196 | await funnel.all();
|
197 | t.is(funnel.processed, 3);
|
198 | t.is(funnel.errors, 2);
|
199 | });
|
200 | ava_1.default.serial("pump works for concurrency level 1", t => (0, util_1.withClock)(async () => {
|
201 | let executed = 0;
|
202 | const pump = new throttle_1.Pump({ concurrency: 1 }, () => {
|
203 | executed++;
|
204 | return (0, util_1.sleep)(100);
|
205 | });
|
206 | t.is(executed, 0);
|
207 | pump.start();
|
208 | await (0, util_1.sleep)(300);
|
209 | pump.stop();
|
210 | t.true(executed === 3);
|
211 | }));
|
212 | ava_1.default.serial("pump works for concurrency level 10", t => (0, util_1.withClock)(async () => {
|
213 | let executed = 0;
|
214 | const pump = new throttle_1.Pump({ concurrency: 10 }, () => {
|
215 | executed++;
|
216 | return (0, util_1.sleep)(100);
|
217 | });
|
218 | pump.start();
|
219 | await (0, util_1.sleep)(100);
|
220 | pump.stop();
|
221 | t.is(executed, 10);
|
222 | }));
|
223 | ava_1.default.serial("pump handles promise rejections without losing concurrency", t => (0, util_1.withClock)(async () => {
|
224 | let executed = 0;
|
225 | const pump = new throttle_1.Pump({ concurrency: 1, verbose: false }, () => {
|
226 | executed++;
|
227 | return (0, util_1.sleep)(100).then(_ => Promise.reject("hi"));
|
228 | });
|
229 | pump.start();
|
230 | await (0, util_1.sleep)(500);
|
231 | pump.stop();
|
232 | t.is(executed, 5);
|
233 | }));
|
234 | ava_1.default.serial("pump drain", t => (0, util_1.withClock)(async () => {
|
235 | let started = 0;
|
236 | let finished = 0;
|
237 | const N = 5;
|
238 | const pump = new throttle_1.Pump({ concurrency: N }, async () => {
|
239 | started++;
|
240 | await (0, util_1.sleep)(100);
|
241 | finished++;
|
242 | });
|
243 | t.is(started, 0);
|
244 | t.is(finished, 0);
|
245 | pump.start();
|
246 | await pump.drain();
|
247 | t.is(started, N);
|
248 | t.is(finished, N);
|
249 | }));
|
250 | ava_1.default.serial("memoize returns cached results for the same key", t => (0, util_1.withClock)(async () => {
|
251 | const promises = [];
|
252 | const N = 10;
|
253 | const timerFn = (0, throttle_1.throttle)({ memoize: true, concurrency: 1, rate: 10 }, _ => (0, functions_1.timer)(10));
|
254 | for (let i = 0; i < N; i++) {
|
255 | promises.push(timerFn("key"));
|
256 | }
|
257 | const times = await Promise.all(promises);
|
258 | t.is((0, util_1.measureConcurrency)(times), N);
|
259 | }));
|
260 | ava_1.default.serial("memoize runs the worker for different keys", t => (0, util_1.withClock)(async () => {
|
261 | const promises = [];
|
262 | const N = 10;
|
263 | const timerFn = (0, throttle_1.throttle)({ memoize: true, concurrency: 1, rate: 10 }, _ => (0, functions_1.timer)(10));
|
264 | for (let i = 0; i < N; i++) {
|
265 | promises.push(timerFn(i));
|
266 | }
|
267 | const times = await Promise.all(promises);
|
268 | t.is((0, util_1.measureConcurrency)(times), 1);
|
269 | }));
|
270 | async function withCache(fn) {
|
271 | const nonce = (0, uuid_1.v4)();
|
272 | const cache = new cache_1.PersistentCache(`.faast/test/${nonce}`);
|
273 | await fn(cache).catch(console.error);
|
274 | await cache.clear({ leaveEmptyDir: false });
|
275 | }
|
276 | (0, ava_1.default)("caching saves values and skips re-execution", t => withCache(async (cache) => {
|
277 | let counter = 0;
|
278 | function fn(_) {
|
279 | return Promise.resolve(counter++);
|
280 | }
|
281 | const mfn = (0, throttle_1.cacheFn)(cache, fn);
|
282 | await mfn(0);
|
283 | await mfn(7);
|
284 | await mfn(0);
|
285 | t.is(counter, 2);
|
286 | const mfn2 = (0, throttle_1.cacheFn)(cache, fn);
|
287 | await mfn2(0);
|
288 | await mfn2(7);
|
289 | await mfn2(0);
|
290 | await mfn2(10);
|
291 | t.is(counter, 3);
|
292 | }));
|
293 | (0, ava_1.default)("cache works with string arguments", async (t) => withCache(async (cache) => {
|
294 | let counter = 0;
|
295 | function fn(_) {
|
296 | return Promise.resolve(counter++);
|
297 | }
|
298 | const mfn = (0, throttle_1.cacheFn)(cache, fn);
|
299 | await mfn("a");
|
300 | await mfn("b");
|
301 | await mfn("a");
|
302 | t.is(counter, 2);
|
303 | }));
|
304 | (0, ava_1.default)("cache works with object arguments", async (t) => withCache(async (cache) => {
|
305 | let counter = 0;
|
306 | function fn(_) {
|
307 | return Promise.resolve(counter++);
|
308 | }
|
309 | const mfn = (0, throttle_1.cacheFn)(cache, fn);
|
310 | await mfn({ f: "field", i: 42 });
|
311 | await mfn({ f: "field", i: 1 });
|
312 | await mfn({ f: "other", i: 42 });
|
313 | await mfn({ f: "field", i: 42 });
|
314 | t.is(counter, 3);
|
315 | }));
|
316 | (0, ava_1.default)("cache does not save rejected promises from cached function", async (t) => withCache(async (cache) => {
|
317 | let counter = 0;
|
318 | function fn(_) {
|
319 | counter++;
|
320 | return Promise.reject(new Error("rejection"));
|
321 | }
|
322 | let caught = 0;
|
323 | const mfn = (0, throttle_1.cacheFn)(cache, fn);
|
324 | await mfn(1).catch(_ => caught++);
|
325 | await mfn(2).catch(_ => caught++);
|
326 | await mfn(1).catch(_ => caught++);
|
327 | t.is(counter, 3);
|
328 | t.is(caught, 3);
|
329 | }));
|
330 | function measureMaxRequestRatePerSecond(timings) {
|
331 | const requestsPerSecondStartingAt = timings
|
332 | .map(t => t.start)
|
333 | .map(t => timings.filter(({ start }) => start >= t && start < t + 1000).length);
|
334 | return Math.max(...requestsPerSecondStartingAt);
|
335 | }
|
336 | ava_1.default.serial("rate limiter restricts max request rate per second", t => (0, util_1.withClock)(async () => {
|
337 | const requestRate = 10;
|
338 | const rateLimiter = new throttle_1.RateLimiter(requestRate);
|
339 | const promises = [];
|
340 | for (let i = 0; i < 15; i++) {
|
341 | promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
|
342 | }
|
343 | const timings = await Promise.all(promises);
|
344 | t.is(measureMaxRequestRatePerSecond(timings), requestRate);
|
345 | }));
|
346 | ava_1.default.serial("rate limiter works across second boundaries", t => (0, util_1.withClock)(async () => {
|
347 | const requestRate = 10;
|
348 | const rateLimiter = new throttle_1.RateLimiter(requestRate);
|
349 | const promises = [];
|
350 | promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
|
351 | await (0, util_1.sleep)(900);
|
352 | for (let i = 0; i < 15; i++) {
|
353 | promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
|
354 | }
|
355 | const timings = await Promise.all(promises);
|
356 | t.is(measureMaxRequestRatePerSecond(timings), requestRate);
|
357 | }));
|
358 | ava_1.default.serial("rate limiter bursting allows for request rate beyond target rate", t => (0, util_1.withClock)(async () => {
|
359 | const requestRate = 10;
|
360 | const maxBurst = 5;
|
361 | const rateLimiter = new throttle_1.RateLimiter(requestRate, maxBurst);
|
362 | const promises = [];
|
363 | for (let i = 0; i < 15; i++) {
|
364 | promises.push(rateLimiter.push(() => (0, functions_1.timer)(0)));
|
365 | }
|
366 | const timings = await Promise.all(promises);
|
367 | const maxRate = measureMaxRequestRatePerSecond(timings);
|
368 | t.true(maxRate <= maxBurst + requestRate);
|
369 | t.true(maxRate > maxBurst);
|
370 | }));
|
371 | ava_1.default.serial("throttle limits max concurrency and rate", t => (0, util_1.withClock)(async () => {
|
372 | const concurrency = 10;
|
373 | const rate = 10;
|
374 | const timerFn = (0, throttle_1.throttle)({ concurrency, rate }, functions_1.timer);
|
375 | const promises = [];
|
376 | for (let i = 0; i < 15; i++) {
|
377 | promises.push(timerFn(1000));
|
378 | }
|
379 | const times = await Promise.all(promises);
|
380 | t.is((0, util_1.measureConcurrency)(times), concurrency);
|
381 | t.is(measureMaxRequestRatePerSecond(times), rate);
|
382 | }));
|
383 | ava_1.default.serial("throttle limits rate with single concurrency", t => (0, util_1.withClock)(async () => {
|
384 | const concurrency = 1;
|
385 | const rate = 10;
|
386 | const processTimeMs = 200;
|
387 | const timerFn = (0, throttle_1.throttle)({ concurrency, rate }, functions_1.timer);
|
388 | const promises = [];
|
389 | for (let i = 0; i < 10; i++) {
|
390 | promises.push(timerFn(processTimeMs));
|
391 | }
|
392 | const times = await Promise.all(promises);
|
393 | t.is((0, util_1.measureConcurrency)(times), concurrency);
|
394 | t.true(measureMaxRequestRatePerSecond(times) <= 1000 / processTimeMs + 1);
|
395 | }));
|
396 | (0, ava_1.default)("throttle memoize option", async (t) => {
|
397 | const concurrency = 1;
|
398 | const rate = 100;
|
399 | let counter = 0;
|
400 | const N = 5;
|
401 | async function fn(_) {
|
402 | counter++;
|
403 | }
|
404 | const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, memoize: true }, fn);
|
405 | const promises = [];
|
406 | for (let i = 0; i < N; i++) {
|
407 | promises.push(throttledFn(i));
|
408 | }
|
409 | for (let i = 0; i < N; i++) {
|
410 | promises.push(throttledFn(i));
|
411 | }
|
412 | await Promise.all(promises);
|
413 | t.is(counter, N);
|
414 | });
|
415 | (0, ava_1.default)("throttle cache option persists values", async (t) => withCache(async (cache) => {
|
416 | const concurrency = 1;
|
417 | const rate = 100;
|
418 | let counter = 0;
|
419 | async function fn(_) {
|
420 | return counter++;
|
421 | }
|
422 | const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, cache }, fn);
|
423 | const v = await throttledFn(10);
|
424 | t.is(v, 0);
|
425 | const throttledFn2 = (0, throttle_1.throttle)({ concurrency, rate, cache }, fn);
|
426 | const u1 = await throttledFn2(10);
|
427 | const u2 = await throttledFn2(20);
|
428 | t.is(u1, 0);
|
429 | t.is(u2, 1);
|
430 | t.is(counter, 2);
|
431 | }));
|
432 | (0, ava_1.default)("throttle cache and memoize options work together", async (t) => withCache(async (cache) => {
|
433 | const concurrency = 1;
|
434 | const rate = 100;
|
435 | let counter = 0;
|
436 | async function fn(_) {
|
437 | return counter++;
|
438 | }
|
439 | const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, memoize: true, cache }, fn);
|
440 | const v = await throttledFn(10);
|
441 | const v2 = await throttledFn(10);
|
442 | t.is(v, 0);
|
443 | t.is(v2, 0);
|
444 | const throttledFn2 = (0, throttle_1.throttle)({ concurrency, rate, memoize: true, cache }, fn);
|
445 | const u1 = await throttledFn2(10);
|
446 | const u2 = await throttledFn2(20);
|
447 | const u3 = await throttledFn2(10);
|
448 | t.is(u1, 0);
|
449 | t.is(u2, 1);
|
450 | t.is(u3, 0);
|
451 | t.is(counter, 2);
|
452 | }));
|
453 | ava_1.default.serial("throttle cancellation", async (t) => (0, util_1.withClock)(async () => {
|
454 | const concurrency = 10;
|
455 | const rate = 100;
|
456 | let counter = 0;
|
457 | async function fn(_) {
|
458 | return counter++;
|
459 | }
|
460 | const cancel = new throttle_1.Deferred();
|
461 | const throttledFn = (0, throttle_1.throttle)({ concurrency, rate, memoize: true, cancel: cancel.promise }, fn);
|
462 | throttledFn(1);
|
463 | throttledFn(2);
|
464 | throttledFn(3);
|
465 | await (0, util_1.sleep)(100);
|
466 | t.is(counter, 3);
|
467 | counter = 0;
|
468 | throttledFn(1);
|
469 | throttledFn(2);
|
470 | throttledFn(3);
|
471 | cancel.resolve();
|
472 | await (0, util_1.sleep)(100);
|
473 | t.is(counter, 0);
|
474 | }));
|
475 | (0, ava_1.default)("AsyncQueue works with enqueue before dequeue", async (t) => {
|
476 | const q = new throttle_1.AsyncQueue();
|
477 | q.enqueue(42);
|
478 | t.is(await q.next(), 42);
|
479 | });
|
480 | (0, ava_1.default)("AsyncQueue works with multiple enqueues before dequeue", async (t) => {
|
481 | const q = new throttle_1.AsyncQueue();
|
482 | q.enqueue(42);
|
483 | q.enqueue(43);
|
484 | t.is(await q.next(), 42);
|
485 | t.is(await q.next(), 43);
|
486 | });
|
487 | (0, ava_1.default)("AsyncQueue works with dequeue before enqueue", async (t) => {
|
488 | const q = new throttle_1.AsyncQueue();
|
489 | const promise = q.next();
|
490 | q.enqueue(42);
|
491 | t.is(await promise, 42);
|
492 | });
|
493 | (0, ava_1.default)("AsyncQueue works with multiple dequeues before enqueue", async (t) => {
|
494 | const q = new throttle_1.AsyncQueue();
|
495 | const promises = [q.next(), q.next()];
|
496 | q.enqueue(42);
|
497 | q.enqueue(43);
|
498 | t.deepEqual(await Promise.all(promises), [42, 43]);
|
499 | });
|
500 | (0, ava_1.default)("AsyncQueue transition from more enqueues to more dequeues", async (t) => {
|
501 | const q = new throttle_1.AsyncQueue();
|
502 | q.enqueue(42);
|
503 | t.is(await q.next(), 42);
|
504 | const promise = q.next();
|
505 | q.enqueue(100);
|
506 | t.is(await promise, 100);
|
507 | });
|
508 | (0, ava_1.default)("AsyncQueue transition from more dequeues to more enqueues", async (t) => {
|
509 | const q = new throttle_1.AsyncQueue();
|
510 | const promise = q.next();
|
511 | q.enqueue(42);
|
512 | q.enqueue(100);
|
513 | t.is(await promise, 42);
|
514 | t.is(await q.next(), 100);
|
515 | });
|
516 | (0, ava_1.default)("AsyncQueue handles async enqueueing", async (t) => {
|
517 | const q = new throttle_1.AsyncQueue();
|
518 | const promise = q.next();
|
519 | setTimeout(() => q.enqueue(99), 100);
|
520 | t.is(await promise, 99);
|
521 | });
|
522 | (0, ava_1.default)("AsyncQueue handles async dequeueing", async (t) => {
|
523 | t.plan(1);
|
524 | const q = new throttle_1.AsyncQueue();
|
525 | q.enqueue(88);
|
526 | await new Promise(resolve => setTimeout(async () => {
|
527 | t.is(await q.next(), 88);
|
528 | resolve();
|
529 | }, 100));
|
530 | });
|
531 | (0, ava_1.default)("AsyncQueue clear", async (t) => {
|
532 | const q = new throttle_1.AsyncQueue();
|
533 | q.enqueue(1);
|
534 | q.clear();
|
535 | q.enqueue(2);
|
536 | t.is(await q.next(), 2);
|
537 | const p1 = q.next();
|
538 | q.clear();
|
539 | const p2 = q.next();
|
540 | q.enqueue(3);
|
541 | t.is(await p2, 3);
|
542 | });
|
543 | async function toArray(iterable) {
|
544 | const result = [];
|
545 | for await (const value of iterable) {
|
546 | result.push(value);
|
547 | }
|
548 | return result;
|
549 | }
|
550 | async function take(q, n) {
|
551 | const result = [];
|
552 | for (let i = 0; i < n; i++) {
|
553 | result.push(await q.next());
|
554 | }
|
555 | return result;
|
556 | }
|
557 | (0, ava_1.default)("AsyncIterableQueue done function finishes iterator", async (t) => {
|
558 | const q = new throttle_1.AsyncIterableQueue();
|
559 | q.push(10);
|
560 | q.done();
|
561 | t.deepEqual(await toArray(q), [10]);
|
562 | // test times out if the done function doesn't work.
|
563 | });
|
564 | (0, ava_1.default)("AsyncIterableQueue done function finishes iterator with pending dequeus", async (t) => {
|
565 | const q = new throttle_1.AsyncIterableQueue();
|
566 | const value = q.next();
|
567 | q.done();
|
568 | t.is((await value).done, true);
|
569 | });
|
570 | (0, ava_1.default)("AsyncOrderedQueue reorders according to sequence value", async (t) => {
|
571 | const q = new throttle_1.AsyncOrderedQueue();
|
572 | q.push(42, 1);
|
573 | q.push(-42, 0);
|
574 | t.deepEqual(await take(q, 2), [-42, 42]);
|
575 | });
|
576 | (0, ava_1.default)("AsyncOrderedQueue takes the first value with a given sequence value", async (t) => {
|
577 | const q = new throttle_1.AsyncOrderedQueue();
|
578 | q.push(100, 1);
|
579 | q.push(101, 1);
|
580 | q.push(42, 0);
|
581 | t.deepEqual(await take(q, 2), [42, 100]);
|
582 | });
|
583 | (0, ava_1.default)("AsyncOrderedQueue pushImmediate pre-empts arrival order", async (t) => {
|
584 | const q = new throttle_1.AsyncOrderedQueue();
|
585 | q.push(42, 0);
|
586 | q.push(44, 2);
|
587 | q.pushImmediate(100);
|
588 | q.push(43, 1);
|
589 | t.is(await q.next(), 42);
|
590 | t.is(await q.next(), 100);
|
591 | t.is(await q.next(), 43);
|
592 | t.is(await q.next(), 44);
|
593 | });
|
594 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC10aHJvdHRsZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC91bml0LXRocm90dGxlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBdUI7QUFDdkIsK0JBQW9DO0FBQ3BDLHdDQUErQztBQUMvQyw4Q0FXeUI7QUFDekIsb0RBQXFEO0FBQ3JELDBDQUF1RTtBQUV2RSxJQUFBLGFBQUksRUFBQywrQkFBK0IsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFDLEVBQUU7SUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxtQkFBUSxFQUFFLENBQUM7SUFDaEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QixRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBQSxhQUFJLEVBQUMsOEJBQThCLEVBQUUsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFO0lBQzNDLE1BQU0sUUFBUSxHQUFHLElBQUksbUJBQVEsRUFBRSxDQUFDO0lBQ2hDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0QixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsSUFBSTtRQUNBLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQztLQUMxQjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1Is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WyJpbXBvcnQgdGVzdCBmcm9tIFwiYXZhXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgUGVyc2lzdGVudENhY2hlIH0gZnJvbSBcIi4uL3NyYy9jYWNoZVwiO1xuaW1wb3J0IHtcbiAgICBBc3luY09yZGVyZWRRdWV1ZSxcbiAgICBBc3luY1F1ZXVlLFxuICAgIGNhY2hlRm4sXG4gICAgRGVmZXJyZWQsXG4gICAgRnVubmVsLFxuICAgIFB1bXAsXG4gICAgUmF0ZUxpbWl0ZXIsXG4gICAgcmV0cnlPcCxcbiAgICB0aHJvdHRsZSxcbiAgICBBc3luY0l0ZXJhYmxlUXVldWVcbn0gZnJvbSBcIi4uL3NyYy90aHJvdHRsZVwiO1xuaW1wb3J0IHsgdGltZXIsIFRpbWluZyB9IGZyb20gXCIuL2ZpeHR1cmVzL2Z1bmN0aW9uc1wiO1xuaW1wb3J0IHsgbWVhc3VyZUNvbmN1cnJlbmN5LCBzbGVlcCwgd2l0aENsb2NrIH0gZnJvbSBcIi4vZml4dHVyZXMvdXRpbFwiO1xuXG50ZXN0KFwiZGVmZXJyZWQgcmVzb2x2ZXMgaXRzIHByb21pc2VcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBsZXQgcmVzb2x2ZWQgPSBmYWxzZTtcbiAgICBkZWZlcnJlZC5wcm9taXNlLnRoZW4oXyA9PiAocmVzb2x2ZWQgPSB0cnVlKSk7XG4gICAgdC5pcyhyZXNvbHZlZCwgZmFsc2UpO1xuICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICBhd2FpdCBkZWZlcnJlZC5wcm9taXNlO1xuICAgIHQuaXMocmVzb2x2ZWQsIHRydWUpO1xufSk7XG5cbnRlc3QoXCJkZWZlcnJlZCByZWplY3RzIGl0cyBwcm9taXNlXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IGRlZmVycmVkID0gbmV3IERlZmVycmVkKCk7XG4gICAgbGV0IHJlamVjdGVkID0gZmFsc2U7XG4gICAgdC5pcyhyZWplY3RlZCwgZmFsc2UpO1xuICAgIGRlZmVycmVkLnJlamVjdCgpO1xuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGRlZmVycmVkLnByb21pc2U7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgICByZWplY3RlZCA9IHRydWU7XG4gICAgfVxuICAgIHQuaXMocmVqZWN0ZWQsIHRydWUpO1xufSk7XG5cbnRlc3QoXCJkZWZlcnJlZCByZXNvbHZlcyBvbmx5IG9uY2VcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGRlZmVycmVkLnByb21pc2UudGhlbihfID0+IHZhbHVlKyspO1xuXG4gICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIGF3YWl0IGRlZmVycmVkLnByb21pc2U7XG4gICAgdC5pcyh2YWx1ZSwgMSk7XG5cbiAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgYXdhaXQgZGVmZXJyZWQucHJvbWlzZTtcbiAgICB0LmlzKHZhbHVlLCAxKTtcbn0pO1xuXG50ZXN0KFwiZGVmZXJyZWQgY2Fubm90IHJlamVjdCBhZnRlciByZXNvbHZpbmdcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGRlZmVycmVkLnByb21pc2UudGhlbihfID0+IHZhbHVlKyspO1xuXG4gICAgZGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIGF3YWl0IGRlZmVycmVkLnByb21pc2U7XG4gICAgdC5pcyh2YWx1ZSwgMSk7XG5cbiAgICBkZWZlcnJlZC5yZWplY3QoKTtcbiAgICBhd2FpdCBkZWZlcnJlZC5wcm9taXNlO1xuICAgIHQuaXModmFsdWUsIDEpO1xufSk7XG5cbnRlc3Quc2VyaWFsKFwiZnVubmVsIGRlZmF1bHRzIHRvIGluZmluaXRlIGNvbmN1cnJlbmN5ICh0ZXN0ZWQgd2l0aCAyMDApXCIsIHQgPT5cbiAgICB3aXRoQ2xvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBmdW5uZWwgPSBuZXcgRnVubmVsPFRpbWluZz4oMCk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGNvbnN0IE4gPSAyMDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGZ1bm5lbC5wdXNoKCgpID0+IHRpbWVyKDMwMCkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgdC5pcyhtZWFzdXJlQ29uY3VycmVuY3kodGltZXMpLCBOKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJmdW5uZWwgc2luZ2xlIGNvbmN1cnJlbmN5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZVwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVubmVsID0gbmV3IEZ1bm5lbDxUaW1pbmc+KDEpO1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBjb25zdCBOID0gMTA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKGZ1bm5lbC5wdXNoKCgpID0+IHRpbWVyKDEwKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB0LmlzKG1lYXN1cmVDb25jdXJyZW5jeSh0aW1lcyksIDEpO1xuICAgIH0pXG4pO1xuXG50ZXN0LnNlcmlhbChcImZ1bm5lbCBoYW5kbGVzIGNvbmN1cnJlbmN5IGxldmVsIDJcIiwgdCA9PlxuICAgIHdpdGhDbG9jayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZ1bm5lbCA9IG5ldyBGdW5uZWw8VGltaW5nPigyKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTiA9IDEwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChmdW5uZWwucHVzaCgoKSA9PiB0aW1lcigyMCkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgdC5pcyhtZWFzdXJlQ29uY3VycmVuY3kodGltZXMpLCAyKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJmdW5uZWwgaGFuZGxlcyBjb25jdXJyZW5jeSBsZXZlbCAxMFwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVubmVsID0gbmV3IEZ1bm5lbDxUaW1pbmc+KDEwKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTiA9IDEwMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goZnVubmVsLnB1c2goKCkgPT4gdGltZXIoMjApKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGltZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIHQuaXMobWVhc3VyZUNvbmN1cnJlbmN5KHRpbWVzKSwgMTApO1xuICAgIH0pXG4pO1xuXG50ZXN0LnNlcmlhbChcImZ1bm5lbCByZXN1bWVzIGFmdGVyIGZpbmlzaGluZyBhIHdvcmtlclwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVubmVsID0gbmV3IEZ1bm5lbDxUaW1pbmc+KDEpO1xuICAgICAgICBjb25zdCB0aW1lMSA9IGF3YWl0IGZ1bm5lbC5wdXNoKCgpID0+IHRpbWVyKDEwKSk7XG4gICAgICAgIGNvbnN0IHRpbWUyID0gYXdhaXQgZnVubmVsLnB1c2goKCkgPT4gdGltZXIoMTApKTtcbiAgICAgICAgdC5pcyhtZWFzdXJlQ29uY3VycmVuY3koW3RpbWUxLCB0aW1lMl0pLCAxKTtcbiAgICB9KVxuKTtcblxudGVzdChcImZ1bm5lbCBjbGVhcmluZ1wiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBmdW5uZWwgPSBuZXcgRnVubmVsPG51bWJlcj4oMSk7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBwcm9taXNlMCA9IGZ1bm5lbC5wdXNoKGFzeW5jICgpID0+IGNvdW50KyspO1xuICAgIGNvbnN0IHByb21pc2UxID0gZnVubmVsLnB1c2goYXN5bmMgKCkgPT4gY291bnQrKyk7XG4gICAgY29uc3QgcHJvbWlzZTIgPSBmdW5uZWwucHVzaChhc3luYyAoKSA9PiBjb3VudCsrKTtcbiAgICBmdW5uZWwuY2xlYXIoKTtcbiAgICB0LmlzKFxuICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3Byb21pc2UwLCBwcm9taXNlMSwgcHJvbWlzZTIsIHNsZWVwKDEwMCkudGhlbihfID0+IFwiZG9uZVwiKV0pLFxuICAgICAgICBcImRvbmVcIlxuICAgICk7XG4gICAgdC5pcyhjb3VudCwgMCk7XG59KTtcbnRlc3QoXCJmdW5uZWwgZ2V0cyBleGVjdXRlZCBhc3luY2hyb25vdXNseSwgbm90IGF0IHRoZSBtb21lbnQgb2YgcHVzaFwiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBmdW5uZWwgPSBuZXcgRnVubmVsKDEpO1xuICAgIGxldCBuID0gMDtcbiAgICBmdW5uZWwucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgIG4rKztcbiAgICB9KTtcbiAgICB0LmlzKG4sIDApO1xuICAgIGF3YWl0IGZ1bm5lbC5hbGwoKTtcbiAgICB0LmlzKG4sIDEpO1xufSk7XG50ZXN0KFwiZnVubmVsIGhhbmRsZXMgcHJvbWlzZSByZWplY3Rpb25zIHdpdGhvdXQgbG9zaW5nIGNvbmN1cnJlbmN5XCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IGZ1bm5lbCA9IG5ldyBGdW5uZWw8dm9pZD4oMSk7XG4gICAgbGV0IGV4ZWN1dGVkID0gZmFsc2U7XG4gICAgYXdhaXQgdC50aHJvd3NBc3luYyhcbiAgICAgICAgZnVubmVsLnB1c2goKCkgPT4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwibWVzc2FnZVwiKSkpLFxuICAgICAgICB7IG1lc3NhZ2U6IFwibWVzc2FnZVwiIH1cbiAgICApO1xuICAgIGF3YWl0IGZ1bm5lbC5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgZXhlY3V0ZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHQuaXMoZXhlY3V0ZWQsIHRydWUpO1xufSk7XG50ZXN0KFwiZnVubmVsLmFsbCgpIHdhaXRzIGZvciBhbGwgcmVxdWVzdHMgdG8gZmluaXNoXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IGZ1bm5lbCA9IG5ldyBGdW5uZWw8c3RyaW5nPigxKTtcbiAgICBsZXQgZXhlY3V0ZWQgPSBmYWxzZTtcbiAgICBmdW5uZWwucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDIwMCk7XG4gICAgICAgIGV4ZWN1dGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIFwiZmlyc3RcIjtcbiAgICB9KTtcbiAgICBmdW5uZWwucHVzaChhc3luYyAoKSA9PiBcInNlY29uZFwiKTtcbiAgICB0LmlzKGV4ZWN1dGVkLCBmYWxzZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZnVubmVsLmFsbCgpO1xuICAgIHQuaXMocmVzdWx0Lmxlbmd0aCwgMik7XG4gICAgdC5pcyhyZXN1bHRbMF0sIFwiZmlyc3RcIik7XG4gICAgdC5pcyhyZXN1bHRbMV0sIFwic2Vjb25kXCIpO1xuICAgIHQuaXMoZXhlY3V0ZWQsIHRydWUpO1xufSk7XG50ZXN0KFwiZnVubmVsLmFsbCgpIGlnbm9yZXMgZXJyb3JzIGFuZCB3YWl0cyBmb3Igb3RoZXIgcmVxdWVzdHMgdG8gZmluaXNoXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IGZ1bm5lbCA9IG5ldyBGdW5uZWw8c3RyaW5nPigxKTtcbiAgICBmdW5uZWwucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH0pO1xuICAgIGZ1bm5lbC5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICAgICAgcmV0dXJuIFwiZG9uZVwiO1xuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZ1bm5lbC5hbGwoKTtcbiAgICB0LmlzKHJlc3VsdC5sZW5ndGgsIDIpO1xuICAgIHQuZmFsc3kocmVzdWx0WzBdKTtcbiAgICB0LmlzKHJlc3VsdFsxXSwgXCJkb25lXCIpO1xufSk7XG5cbnRlc3QoXCJyZXRyeU9wKCkgcmV0cmllcyBmYWlsdXJlc1wiLCBhc3luYyB0ID0+IHtcbiAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgIGF3YWl0IHJldHJ5T3AoMiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9KS5jYXRjaChfID0+IHt9KTtcbiAgICB0LmlzKGF0dGVtcHRzLCAzKTtcbn0pO1xuXG50ZXN0KFwiZnVubmVsIHNob3VsZFJldHJ5IHBhcmFtZXRlciByZXRyaWVzIGZhaWx1cmVzXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IGZ1bm5lbCA9IG5ldyBGdW5uZWw8c3RyaW5nPigxLCAyKTtcbiAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgIGxldCBlcnJvcnMgPSAwO1xuICAgIGZ1bm5lbFxuICAgICAgICAucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKF8gPT4gZXJyb3JzKyspO1xuICAgIGF3YWl0IGZ1bm5lbC5hbGwoKTtcbiAgICB0LmlzKGF0dGVtcHRzLCAzKTtcbiAgICB0LmlzKGVycm9ycywgMSk7XG59KTtcblxudGVzdChcImZ1bm5lbCBjYW5jZWxsYXRpb25cIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgZnVubmVsID0gbmV3IEZ1bm5lbCgxKTtcbiAgICBsZXQgZXhlY3V0ZWQgPSAwO1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IGZ1bm5lbC5wdXNoKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBleGVjdXRlZCsrO1xuICAgICAgICB9LFxuICAgICAgICAwLFxuICAgICAgICAoKSA9PiBcImNhbmNlbGxlZFwiXG4gICAgKTtcbiAgICBhd2FpdCB0LnRocm93c0FzeW5jKHByb21pc2UpO1xuICAgIHQuaXMoZXhlY3V0ZWQsIDApO1xufSk7XG5cbnRlc3QoXCJmdW5uZWwgcHJvY2Vzc2VkIGFuZCBlcnJvciBjb3VudHNcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgZnVubmVsID0gbmV3IEZ1bm5lbCgyKTtcbiAgICBmdW5uZWwucHVzaChhc3luYyAoKSA9PiB7fSk7XG4gICAgZnVubmVsLnB1c2goYXN5bmMgKCkgPT4gUHJvbWlzZS5yZWplY3QoKSk7XG4gICAgZnVubmVsLnB1c2goYXN5bmMgKCkgPT4ge30pO1xuICAgIGZ1bm5lbC5wdXNoKGFzeW5jICgpID0+IFByb21pc2UucmVqZWN0KCkpO1xuICAgIGZ1bm5lbC5wdXNoKGFzeW5jICgpID0+IHt9KTtcblxuICAgIGF3YWl0IGZ1bm5lbC5hbGwoKTtcbiAgICB0LmlzKGZ1bm5lbC5wcm9jZXNzZWQsIDMpO1xuICAgIHQuaXMoZnVubmVsLmVycm9ycywgMik7XG59KTtcblxudGVzdC5zZXJpYWwoXCJwdW1wIHdvcmtzIGZvciBjb25jdXJyZW5jeSBsZXZlbCAxXCIsIHQgPT5cbiAgICB3aXRoQ2xvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgZXhlY3V0ZWQgPSAwO1xuICAgICAgICBjb25zdCBwdW1wID0gbmV3IFB1bXAoeyBjb25jdXJyZW5jeTogMSB9LCAoKSA9PiB7XG4gICAgICAgICAgICBleGVjdXRlZCsrO1xuICAgICAgICAgICAgcmV0dXJuIHNsZWVwKDEwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0LmlzKGV4ZWN1dGVkLCAwKTtcbiAgICAgICAgcHVtcC5zdGFydCgpO1xuICAgICAgICBhd2FpdCBzbGVlcCgzMDApO1xuICAgICAgICBwdW1wLnN0b3AoKTtcbiAgICAgICAgdC50cnVlKGV4ZWN1dGVkID09PSAzKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJwdW1wIHdvcmtzIGZvciBjb25jdXJyZW5jeSBsZXZlbCAxMFwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGV4ZWN1dGVkID0gMDtcbiAgICAgICAgY29uc3QgcHVtcCA9IG5ldyBQdW1wKHsgY29uY3VycmVuY3k6IDEwIH0sICgpID0+IHtcbiAgICAgICAgICAgIGV4ZWN1dGVkKys7XG4gICAgICAgICAgICByZXR1cm4gc2xlZXAoMTAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHB1bXAuc3RhcnQoKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICAgICAgcHVtcC5zdG9wKCk7XG4gICAgICAgIHQuaXMoZXhlY3V0ZWQsIDEwKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJwdW1wIGhhbmRsZXMgcHJvbWlzZSByZWplY3Rpb25zIHdpdGhvdXQgbG9zaW5nIGNvbmN1cnJlbmN5XCIsIHQgPT5cbiAgICB3aXRoQ2xvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgZXhlY3V0ZWQgPSAwO1xuICAgICAgICBjb25zdCBwdW1wID0gbmV3IFB1bXAoeyBjb25jdXJyZW5jeTogMSwgdmVyYm9zZTogZmFsc2UgfSwgKCkgPT4ge1xuICAgICAgICAgICAgZXhlY3V0ZWQrKztcbiAgICAgICAgICAgIHJldHVybiBzbGVlcCgxMDApLnRoZW4oXyA9PiBQcm9taXNlLnJlamVjdChcImhpXCIpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHB1bXAuc3RhcnQoKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoNTAwKTtcbiAgICAgICAgcHVtcC5zdG9wKCk7XG4gICAgICAgIHQuaXMoZXhlY3V0ZWQsIDUpO1xuICAgIH0pXG4pO1xuXG50ZXN0LnNlcmlhbChcInB1bXAgZHJhaW5cIiwgdCA9PlxuICAgIHdpdGhDbG9jayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBzdGFydGVkID0gMDtcbiAgICAgICAgbGV0IGZpbmlzaGVkID0gMDtcbiAgICAgICAgY29uc3QgTiA9IDU7XG5cbiAgICAgICAgY29uc3QgcHVtcCA9IG5ldyBQdW1wKHsgY29uY3VycmVuY3k6IE4gfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgc3RhcnRlZCsrO1xuICAgICAgICAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICAgICAgICAgIGZpbmlzaGVkKys7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHQuaXMoc3RhcnRlZCwgMCk7XG4gICAgICAgIHQuaXMoZmluaXNoZWQsIDApO1xuXG4gICAgICAgIHB1bXAuc3RhcnQoKTtcbiAgICAgICAgYXdhaXQgcHVtcC5kcmFpbigpO1xuICAgICAgICB0LmlzKHN0YXJ0ZWQsIE4pO1xuICAgICAgICB0LmlzKGZpbmlzaGVkLCBOKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJtZW1vaXplIHJldHVybnMgY2FjaGVkIHJlc3VsdHMgZm9yIHRoZSBzYW1lIGtleVwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTiA9IDEwO1xuICAgICAgICBjb25zdCB0aW1lckZuID0gdGhyb3R0bGUoeyBtZW1vaXplOiB0cnVlLCBjb25jdXJyZW5jeTogMSwgcmF0ZTogMTAgfSwgXyA9PlxuICAgICAgICAgICAgdGltZXIoMTApXG4gICAgICAgICk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRpbWVyRm4oXCJrZXlcIikpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB0LmlzKG1lYXN1cmVDb25jdXJyZW5jeSh0aW1lcyksIE4pO1xuICAgIH0pXG4pO1xuXG50ZXN0LnNlcmlhbChcIm1lbW9pemUgcnVucyB0aGUgd29ya2VyIGZvciBkaWZmZXJlbnQga2V5c1wiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgY29uc3QgTiA9IDEwO1xuICAgICAgICBjb25zdCB0aW1lckZuID0gdGhyb3R0bGUoeyBtZW1vaXplOiB0cnVlLCBjb25jdXJyZW5jeTogMSwgcmF0ZTogMTAgfSwgXyA9PlxuICAgICAgICAgICAgdGltZXIoMTApXG4gICAgICAgICk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRpbWVyRm4oaSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB0LmlzKG1lYXN1cmVDb25jdXJyZW5jeSh0aW1lcyksIDEpO1xuICAgIH0pXG4pO1xuXG5hc3luYyBmdW5jdGlvbiB3aXRoQ2FjaGUoZm46IChjYWNoZTogUGVyc2lzdGVudENhY2hlKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgY29uc3Qgbm9uY2UgPSB1dWlkdjQoKTtcbiAgICBjb25zdCBjYWNoZSA9IG5ldyBQZXJzaXN0ZW50Q2FjaGUoYC5mYWFzdC90ZXN0LyR7bm9uY2V9YCk7XG4gICAgYXdhaXQgZm4oY2FjaGUpLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuICAgIGF3YWl0IGNhY2hlLmNsZWFyKHsgbGVhdmVFbXB0eURpcjogZmFsc2UgfSk7XG59XG5cbnRlc3QoXCJjYWNoaW5nIHNhdmVzIHZhbHVlcyBhbmQgc2tpcHMgcmUtZXhlY3V0aW9uXCIsIHQgPT5cbiAgICB3aXRoQ2FjaGUoYXN5bmMgY2FjaGUgPT4ge1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgIGZ1bmN0aW9uIGZuKF86IG51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb3VudGVyKyspO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1mbiA9IGNhY2hlRm4oY2FjaGUsIGZuKTtcbiAgICAgICAgYXdhaXQgbWZuKDApO1xuICAgICAgICBhd2FpdCBtZm4oNyk7XG4gICAgICAgIGF3YWl0IG1mbigwKTtcbiAgICAgICAgdC5pcyhjb3VudGVyLCAyKTtcblxuICAgICAgICBjb25zdCBtZm4yID0gY2FjaGVGbihjYWNoZSwgZm4pO1xuICAgICAgICBhd2FpdCBtZm4yKDApO1xuICAgICAgICBhd2FpdCBtZm4yKDcpO1xuICAgICAgICBhd2FpdCBtZm4yKDApO1xuICAgICAgICBhd2FpdCBtZm4yKDEwKTtcbiAgICAgICAgdC5pcyhjb3VudGVyLCAzKTtcbiAgICB9KSk7XG5cbnRlc3QoXCJjYWNoZSB3b3JrcyB3aXRoIHN0cmluZyBhcmd1bWVudHNcIiwgYXN5bmMgdCA9PlxuICAgIHdpdGhDYWNoZShhc3luYyBjYWNoZSA9PiB7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcbiAgICAgICAgZnVuY3Rpb24gZm4oXzogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvdW50ZXIrKyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWZuID0gY2FjaGVGbihjYWNoZSwgZm4pO1xuICAgICAgICBhd2FpdCBtZm4oXCJhXCIpO1xuICAgICAgICBhd2FpdCBtZm4oXCJiXCIpO1xuICAgICAgICBhd2FpdCBtZm4oXCJhXCIpO1xuICAgICAgICB0LmlzKGNvdW50ZXIsIDIpO1xuICAgIH0pKTtcblxudGVzdChcImNhY2hlIHdvcmtzIHdpdGggb2JqZWN0IGFyZ3VtZW50c1wiLCBhc3luYyB0ID0+XG4gICAgd2l0aENhY2hlKGFzeW5jIGNhY2hlID0+IHtcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgICBmdW5jdGlvbiBmbihfOiB7IGY6IHN0cmluZzsgaTogbnVtYmVyIH0pIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY291bnRlcisrKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZm4gPSBjYWNoZUZuKGNhY2hlLCBmbik7XG4gICAgICAgIGF3YWl0IG1mbih7IGY6IFwiZmllbGRcIiwgaTogNDIgfSk7XG4gICAgICAgIGF3YWl0IG1mbih7IGY6IFwiZmllbGRcIiwgaTogMSB9KTtcbiAgICAgICAgYXdhaXQgbWZuKHsgZjogXCJvdGhlclwiLCBpOiA0MiB9KTtcbiAgICAgICAgYXdhaXQgbWZuKHsgZjogXCJmaWVsZFwiLCBpOiA0MiB9KTtcbiAgICAgICAgdC5pcyhjb3VudGVyLCAzKTtcbiAgICB9KSk7XG5cbnRlc3QoXCJjYWNoZSBkb2VzIG5vdCBzYXZlIHJlamVjdGVkIHByb21pc2VzIGZyb20gY2FjaGVkIGZ1bmN0aW9uXCIsIGFzeW5jIHQgPT5cbiAgICB3aXRoQ2FjaGUoYXN5bmMgY2FjaGUgPT4ge1xuICAgICAgICBsZXQgY291bnRlciA9IDA7XG4gICAgICAgIGZ1bmN0aW9uIGZuKF86IG51bWJlcikge1xuICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInJlamVjdGlvblwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhdWdodCA9IDA7XG4gICAgICAgIGNvbnN0IG1mbiA9IGNhY2hlRm4oY2FjaGUsIGZuKTtcbiAgICAgICAgYXdhaXQgbWZuKDEpLmNhdGNoKF8gPT4gY2F1Z2h0KyspO1xuICAgICAgICBhd2FpdCBtZm4oMikuY2F0Y2goXyA9PiBjYXVnaHQrKyk7XG4gICAgICAgIGF3YWl0IG1mbigxKS5jYXRjaChfID0+IGNhdWdodCsrKTtcbiAgICAgICAgdC5pcyhjb3VudGVyLCAzKTtcbiAgICAgICAgdC5pcyhjYXVnaHQsIDMpO1xuICAgIH0pKTtcblxuZnVuY3Rpb24gbWVhc3VyZU1heFJlcXVlc3RSYXRlUGVyU2Vjb25kKHRpbWluZ3M6IFRpbWluZ1tdKSB7XG4gICAgY29uc3QgcmVxdWVzdHNQZXJTZWNvbmRTdGFydGluZ0F0ID0gdGltaW5nc1xuICAgICAgICAubWFwKHQgPT4gdC5zdGFydClcbiAgICAgICAgLm1hcCh0ID0+IHRpbWluZ3MuZmlsdGVyKCh7IHN0YXJ0IH0pID0+IHN0YXJ0ID49IHQgJiYgc3RhcnQgPCB0ICsgMTAwMCkubGVuZ3RoKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoLi4ucmVxdWVzdHNQZXJTZWNvbmRTdGFydGluZ0F0KTtcbn1cblxudGVzdC5zZXJpYWwoXCJyYXRlIGxpbWl0ZXIgcmVzdHJpY3RzIG1heCByZXF1ZXN0IHJhdGUgcGVyIHNlY29uZFwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdFJhdGUgPSAxMDtcbiAgICAgICAgY29uc3QgcmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXI8VGltaW5nPihyZXF1ZXN0UmF0ZSk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPFRpbWluZz5bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE1OyBpKyspIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2gocmF0ZUxpbWl0ZXIucHVzaCgoKSA9PiB0aW1lcigwKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRpbWluZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIHQuaXMobWVhc3VyZU1heFJlcXVlc3RSYXRlUGVyU2Vjb25kKHRpbWluZ3MpLCByZXF1ZXN0UmF0ZSk7XG4gICAgfSlcbik7XG5cbnRlc3Quc2VyaWFsKFwicmF0ZSBsaW1pdGVyIHdvcmtzIGFjcm9zcyBzZWNvbmQgYm91bmRhcmllc1wiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdFJhdGUgPSAxMDtcbiAgICAgICAgY29uc3QgcmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXI8VGltaW5nPihyZXF1ZXN0UmF0ZSk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPFRpbWluZz5bXSA9IFtdO1xuICAgICAgICBwcm9taXNlcy5wdXNoKHJhdGVMaW1pdGVyLnB1c2goKCkgPT4gdGltZXIoMCkpKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoOTAwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHJhdGVMaW1pdGVyLnB1c2goKCkgPT4gdGltZXIoMCkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1pbmdzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB0LmlzKG1lYXN1cmVNYXhSZXF1ZXN0UmF0ZVBlclNlY29uZCh0aW1pbmdzKSwgcmVxdWVzdFJhdGUpO1xuICAgIH0pXG4pO1xuXG50ZXN0LnNlcmlhbChcInJhdGUgbGltaXRlciBidXJzdGluZyBhbGxvd3MgZm9yIHJlcXVlc3QgcmF0ZSBiZXlvbmQgdGFyZ2V0IHJhdGVcIiwgdCA9PlxuICAgIHdpdGhDbG9jayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RSYXRlID0gMTA7XG4gICAgICAgIGNvbnN0IG1heEJ1cnN0ID0gNTtcbiAgICAgICAgY29uc3QgcmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXI8VGltaW5nPihyZXF1ZXN0UmF0ZSwgbWF4QnVyc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxUaW1pbmc+W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHJhdGVMaW1pdGVyLnB1c2goKCkgPT4gdGltZXIoMCkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1pbmdzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBtYXhSYXRlID0gbWVhc3VyZU1heFJlcXVlc3RSYXRlUGVyU2Vjb25kKHRpbWluZ3MpO1xuICAgICAgICB0LnRydWUobWF4UmF0ZSA8PSBtYXhCdXJzdCArIHJlcXVlc3RSYXRlKTtcbiAgICAgICAgdC50cnVlKG1heFJhdGUgPiBtYXhCdXJzdCk7XG4gICAgfSlcbik7XG5cbnRlc3Quc2VyaWFsKFwidGhyb3R0bGUgbGltaXRzIG1heCBjb25jdXJyZW5jeSBhbmQgcmF0ZVwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29uY3VycmVuY3kgPSAxMDtcbiAgICAgICAgY29uc3QgcmF0ZSA9IDEwO1xuICAgICAgICBjb25zdCB0aW1lckZuID0gdGhyb3R0bGUoeyBjb25jdXJyZW5jeSwgcmF0ZSB9LCB0aW1lcik7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTU7IGkrKykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aW1lckZuKDEwMDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICB0LmlzKG1lYXN1cmVDb25jdXJyZW5jeSh0aW1lcyksIGNvbmN1cnJlbmN5KTtcbiAgICAgICAgdC5pcyhtZWFzdXJlTWF4UmVxdWVzdFJhdGVQZXJTZWNvbmQodGltZXMpLCByYXRlKTtcbiAgICB9KVxuKTtcblxudGVzdC5zZXJpYWwoXCJ0aHJvdHRsZSBsaW1pdHMgcmF0ZSB3aXRoIHNpbmdsZSBjb25jdXJyZW5jeVwiLCB0ID0+XG4gICAgd2l0aENsb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29uY3VycmVuY3kgPSAxO1xuICAgICAgICBjb25zdCByYXRlID0gMTA7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NUaW1lTXMgPSAyMDA7XG4gICAgICAgIGNvbnN0IHRpbWVyRm4gPSB0aHJvdHRsZSh7IGNvbmN1cnJlbmN5LCByYXRlIH0sIHRpbWVyKTtcblxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2godGltZXJGbihwcm9jZXNzVGltZU1zKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aW1lcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgdC5pcyhtZWFzdXJlQ29uY3VycmVuY3kodGltZXMpLCBjb25jdXJyZW5jeSk7XG4gICAgICAgIHQudHJ1ZShtZWFzdXJlTWF4UmVxdWVzdFJhdGVQZXJTZWNvbmQodGltZXMpIDw9IDEwMDAgLyBwcm9jZXNzVGltZU1zICsgMSk7XG4gICAgfSlcbik7XG5cbnRlc3QoXCJ0aHJvdHRsZSBtZW1vaXplIG9wdGlvblwiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IDE7XG4gICAgY29uc3QgcmF0ZSA9IDEwMDtcbiAgICBsZXQgY291bnRlciA9IDA7XG4gICAgY29uc3QgTiA9IDU7XG4gICAgYXN5bmMgZnVuY3Rpb24gZm4oXzogbnVtYmVyKSB7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICB9XG4gICAgY29uc3QgdGhyb3R0bGVkRm4gPSB0aHJvdHRsZSh7IGNvbmN1cnJlbmN5LCByYXRlLCBtZW1vaXplOiB0cnVlIH0sIGZuKTtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aHJvdHRsZWRGbihpKSk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2godGhyb3R0bGVkRm4oaSkpO1xuICAgIH1cblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICB0LmlzKGNvdW50ZXIsIE4pO1xufSk7XG5cbnRlc3QoXCJ0aHJvdHRsZSBjYWNoZSBvcHRpb24gcGVyc2lzdHMgdmFsdWVzXCIsIGFzeW5jIHQgPT5cbiAgICB3aXRoQ2FjaGUoYXN5bmMgY2FjaGUgPT4ge1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IDE7XG4gICAgICAgIGNvbnN0IHJhdGUgPSAxMDA7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICBhc3luYyBmdW5jdGlvbiBmbihfOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3VudGVyKys7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJvdHRsZWRGbiA9IHRocm90dGxlKHsgY29uY3VycmVuY3ksIHJhdGUsIGNhY2hlIH0sIGZuKTtcblxuICAgICAgICBjb25zdCB2ID0gYXdhaXQgdGhyb3R0bGVkRm4oMTApO1xuICAgICAgICB0LmlzKHYsIDApO1xuXG4gICAgICAgIGNvbnN0IHRocm90dGxlZEZuMiA9IHRocm90dGxlKHsgY29uY3VycmVuY3ksIHJhdGUsIGNhY2hlIH0sIGZuKTtcblxuICAgICAgICBjb25zdCB1MSA9IGF3YWl0IHRocm90dGxlZEZuMigxMCk7XG4gICAgICAgIGNvbnN0IHUyID0gYXdhaXQgdGhyb3R0bGVkRm4yKDIwKTtcblxuICAgICAgICB0LmlzKHUxLCAwKTtcbiAgICAgICAgdC5pcyh1MiwgMSk7XG4gICAgICAgIHQuaXMoY291bnRlciwgMik7XG4gICAgfSkpO1xuXG50ZXN0KFwidGhyb3R0bGUgY2FjaGUgYW5kIG1lbW9pemUgb3B0aW9ucyB3b3JrIHRvZ2V0aGVyXCIsIGFzeW5jIHQgPT5cbiAgICB3aXRoQ2FjaGUoYXN5bmMgY2FjaGUgPT4ge1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IDE7XG4gICAgICAgIGNvbnN0IHJhdGUgPSAxMDA7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICBhc3luYyBmdW5jdGlvbiBmbihfOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3VudGVyKys7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJvdHRsZWRGbiA9IHRocm90dGxlKHsgY29uY3VycmVuY3ksIHJhdGUsIG1lbW9pemU6IHRydWUsIGNhY2hlIH0sIGZuKTtcblxuICAgICAgICBjb25zdCB2ID0gYXdhaXQgdGhyb3R0bGVkRm4oMTApO1xuICAgICAgICBjb25zdCB2MiA9IGF3YWl0IHRocm90dGxlZEZuKDEwKTtcbiAgICAgICAgdC5pcyh2LCAwKTtcbiAgICAgICAgdC5pcyh2MiwgMCk7XG5cbiAgICAgICAgY29uc3QgdGhyb3R0bGVkRm4yID0gdGhyb3R0bGUoeyBjb25jdXJyZW5jeSwgcmF0ZSwgbWVtb2l6ZTogdHJ1ZSwgY2FjaGUgfSwgZm4pO1xuXG4gICAgICAgIGNvbnN0IHUxID0gYXdhaXQgdGhyb3R0bGVkRm4yKDEwKTtcbiAgICAgICAgY29uc3QgdTIgPSBhd2FpdCB0aHJvdHRsZWRGbjIoMjApO1xuICAgICAgICBjb25zdCB1MyA9IGF3YWl0IHRocm90dGxlZEZuMigxMCk7XG5cbiAgICAgICAgdC5pcyh1MSwgMCk7XG4gICAgICAgIHQuaXModTIsIDEpO1xuICAgICAgICB0LmlzKHUzLCAwKTtcblxuICAgICAgICB0LmlzKGNvdW50ZXIsIDIpO1xuICAgIH0pKTtcblxudGVzdC5zZXJpYWwoXCJ0aHJvdHRsZSBjYW5jZWxsYXRpb25cIiwgYXN5bmMgdCA9PlxuICAgIHdpdGhDbG9jayhhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gMTA7XG4gICAgICAgIGNvbnN0IHJhdGUgPSAxMDA7XG4gICAgICAgIGxldCBjb3VudGVyID0gMDtcblxuICAgICAgICBhc3luYyBmdW5jdGlvbiBmbihfOiBudW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3VudGVyKys7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FuY2VsID0gbmV3IERlZmVycmVkKCk7XG4gICAgICAgIGNvbnN0IHRocm90dGxlZEZuID0gdGhyb3R0bGUoXG4gICAgICAgICAgICB7IGNvbmN1cnJlbmN5LCByYXRlLCBtZW1vaXplOiB0cnVlLCBjYW5jZWw6IGNhbmNlbC5wcm9taXNlIH0sXG4gICAgICAgICAgICBmblxuICAgICAgICApO1xuICAgICAgICB0aHJvdHRsZWRGbigxKTtcbiAgICAgICAgdGhyb3R0bGVkRm4oMik7XG4gICAgICAgIHRocm90dGxlZEZuKDMpO1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgICAgICB0LmlzKGNvdW50ZXIsIDMpO1xuXG4gICAgICAgIGNvdW50ZXIgPSAwO1xuICAgICAgICB0aHJvdHRsZWRGbigxKTtcbiAgICAgICAgdGhyb3R0bGVkRm4oMik7XG4gICAgICAgIHRocm90dGxlZEZuKDMpO1xuICAgICAgICBjYW5jZWwucmVzb2x2ZSgpO1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgICAgICB0LmlzKGNvdW50ZXIsIDApO1xuICAgIH0pXG4pO1xuXG50ZXN0KFwiQXN5bmNRdWV1ZSB3b3JrcyB3aXRoIGVucXVldWUgYmVmb3JlIGRlcXVldWVcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgcSA9IG5ldyBBc3luY1F1ZXVlPG51bWJlcj4oKTtcbiAgICBxLmVucXVldWUoNDIpO1xuICAgIHQuaXMoYXdhaXQgcS5uZXh0KCksIDQyKTtcbn0pO1xuXG50ZXN0KFwiQXN5bmNRdWV1ZSB3b3JrcyB3aXRoIG11bHRpcGxlIGVucXVldWVzIGJlZm9yZSBkZXF1ZXVlXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IHEgPSBuZXcgQXN5bmNRdWV1ZTxudW1iZXI+KCk7XG4gICAgcS5lbnF1ZXVlKDQyKTtcbiAgICBxLmVucXVldWUoNDMpO1xuICAgIHQuaXMoYXdhaXQgcS5uZXh0KCksIDQyKTtcbiAgICB0LmlzKGF3YWl0IHEubmV4dCgpLCA0Myk7XG59KTtcblxudGVzdChcIkFzeW5jUXVldWUgd29ya3Mgd2l0aCBkZXF1ZXVlIGJlZm9yZSBlbnF1ZXVlXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IHEgPSBuZXcgQXN5bmNRdWV1ZTxudW1iZXI+KCk7XG4gICAgY29uc3QgcHJvbWlzZSA9IHEubmV4dCgpO1xuICAgIHEuZW5xdWV1ZSg0Mik7XG4gICAgdC5pcyhhd2FpdCBwcm9taXNlLCA0Mik7XG59KTtcblxudGVzdChcIkFzeW5jUXVldWUgd29ya3Mgd2l0aCBtdWx0aXBsZSBkZXF1ZXVlcyBiZWZvcmUgZW5xdWV1ZVwiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBxID0gbmV3IEFzeW5jUXVldWU8bnVtYmVyPigpO1xuICAgIGNvbnN0IHByb21pc2VzID0gW3EubmV4dCgpLCBxLm5leHQoKV07XG4gICAgcS5lbnF1ZXVlKDQyKTtcbiAgICBxLmVucXVldWUoNDMpO1xuICAgIHQuZGVlcEVxdWFsKGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKSwgWzQyLCA0M10pO1xufSk7XG5cbnRlc3QoXCJBc3luY1F1ZXVlIHRyYW5zaXRpb24gZnJvbSBtb3JlIGVucXVldWVzIHRvIG1vcmUgZGVxdWV1ZXNcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgcSA9IG5ldyBBc3luY1F1ZXVlPG51bWJlcj4oKTtcbiAgICBxLmVucXVldWUoNDIpO1xuICAgIHQuaXMoYXdhaXQgcS5uZXh0KCksIDQyKTtcbiAgICBjb25zdCBwcm9taXNlID0gcS5uZXh0KCk7XG4gICAgcS5lbnF1ZXVlKDEwMCk7XG4gICAgdC5pcyhhd2FpdCBwcm9taXNlLCAxMDApO1xufSk7XG5cbnRlc3QoXCJBc3luY1F1ZXVlIHRyYW5zaXRpb24gZnJvbSBtb3JlIGRlcXVldWVzIHRvIG1vcmUgZW5xdWV1ZXNcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgcSA9IG5ldyBBc3luY1F1ZXVlPG51bWJlcj4oKTtcbiAgICBjb25zdCBwcm9taXNlID0gcS5uZXh0KCk7XG4gICAgcS5lbnF1ZXVlKDQyKTtcbiAgICBxLmVucXVldWUoMTAwKTtcbiAgICB0LmlzKGF3YWl0IHByb21pc2UsIDQyKTtcbiAgICB0LmlzKGF3YWl0IHEubmV4dCgpLCAxMDApO1xufSk7XG5cbnRlc3QoXCJBc3luY1F1ZXVlIGhhbmRsZXMgYXN5bmMgZW5xdWV1ZWluZ1wiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBxID0gbmV3IEFzeW5jUXVldWU8bnVtYmVyPigpO1xuICAgIGNvbnN0IHByb21pc2UgPSBxLm5leHQoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHEuZW5xdWV1ZSg5OSksIDEwMCk7XG4gICAgdC5pcyhhd2FpdCBwcm9taXNlLCA5OSk7XG59KTtcblxudGVzdChcIkFzeW5jUXVldWUgaGFuZGxlcyBhc3luYyBkZXF1ZXVlaW5nXCIsIGFzeW5jIHQgPT4ge1xuICAgIHQucGxhbigxKTtcbiAgICBjb25zdCBxID0gbmV3IEFzeW5jUXVldWU8bnVtYmVyPigpO1xuICAgIHEuZW5xdWV1ZSg4OCk7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PlxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHQuaXMoYXdhaXQgcS5uZXh0KCksIDg4KTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMTAwKVxuICAgICk7XG59KTtcblxudGVzdChcIkFzeW5jUXVldWUgY2xlYXJcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgcSA9IG5ldyBBc3luY1F1ZXVlPG51bWJlcj4oKTtcbiAgICBxLmVucXVldWUoMSk7XG4gICAgcS5jbGVhcigpO1xuICAgIHEuZW5xdWV1ZSgyKTtcbiAgICB0LmlzKGF3YWl0IHEubmV4dCgpLCAyKTtcblxuICAgIGNvbnN0IHAxID0gcS5uZXh0KCk7XG4gICAgcS5jbGVhcigpO1xuICAgIGNvbnN0IHAyID0gcS5uZXh0KCk7XG4gICAgcS5lbnF1ZXVlKDMpO1xuICAgIHQuaXMoYXdhaXQgcDIsIDMpO1xufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlcmFibGU6IEFzeW5jSXRlcmFibGU8VD4gfCBJdGVyYWJsZTxUPikge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB0YWtlPFQ+KHE6IEFzeW5jT3JkZXJlZFF1ZXVlPFQ+LCBuOiBudW1iZXIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICByZXN1bHQucHVzaChhd2FpdCBxLm5leHQoKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbnRlc3QoXCJBc3luY0l0ZXJhYmxlUXVldWUgZG9uZSBmdW5jdGlvbiBmaW5pc2hlcyBpdGVyYXRvclwiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBxID0gbmV3IEFzeW5jSXRlcmFibGVRdWV1ZTxudW1iZXI+KCk7XG4gICAgcS5wdXNoKDEwKTtcbiAgICBxLmRvbmUoKTtcbiAgICB0LmRlZXBFcXVhbChhd2FpdCB0b0FycmF5KHEpLCBbMTBdKTtcbiAgICAvLyB0ZXN0IHRpbWVzIG91dCBpZiB0aGUgZG9uZSBmdW5jdGlvbiBkb2Vzbid0IHdvcmsuXG59KTtcblxudGVzdChcIkFzeW5jSXRlcmFibGVRdWV1ZSBkb25lIGZ1bmN0aW9uIGZpbmlzaGVzIGl0ZXJhdG9yIHdpdGggcGVuZGluZyBkZXF1ZXVzXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IHEgPSBuZXcgQXN5bmNJdGVyYWJsZVF1ZXVlPG51bWJlcj4oKTtcbiAgICBjb25zdCB2YWx1ZSA9IHEubmV4dCgpO1xuICAgIHEuZG9uZSgpO1xuICAgIHQuaXMoKGF3YWl0IHZhbHVlKS5kb25lLCB0cnVlKTtcbn0pO1xuXG50ZXN0KFwiQXN5bmNPcmRlcmVkUXVldWUgcmVvcmRlcnMgYWNjb3JkaW5nIHRvIHNlcXVlbmNlIHZhbHVlXCIsIGFzeW5jIHQgPT4ge1xuICAgIGNvbnN0IHEgPSBuZXcgQXN5bmNPcmRlcmVkUXVldWU8bnVtYmVyPigpO1xuICAgIHEucHVzaCg0MiwgMSk7XG4gICAgcS5wdXNoKC00MiwgMCk7XG4gICAgdC5kZWVwRXF1YWwoYXdhaXQgdGFrZShxLCAyKSwgWy00MiwgNDJdKTtcbn0pO1xuXG50ZXN0KFwiQXN5bmNPcmRlcmVkUXVldWUgdGFrZXMgdGhlIGZpcnN0IHZhbHVlIHdpdGggYSBnaXZlbiBzZXF1ZW5jZSB2YWx1ZVwiLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBxID0gbmV3IEFzeW5jT3JkZXJlZFF1ZXVlPG51bWJlcj4oKTtcbiAgICBxLnB1c2goMTAwLCAxKTtcbiAgICBxLnB1c2goMTAxLCAxKTtcbiAgICBxLnB1c2goNDIsIDApO1xuICAgIHQuZGVlcEVxdWFsKGF3YWl0IHRha2UocSwgMiksIFs0MiwgMTAwXSk7XG59KTtcblxudGVzdChcIkFzeW5jT3JkZXJlZFF1ZXVlIHB1c2hJbW1lZGlhdGUgcHJlLWVtcHRzIGFycml2YWwgb3JkZXJcIiwgYXN5bmMgdCA9PiB7XG4gICAgY29uc3QgcSA9IG5ldyBBc3luY09yZGVyZWRRdWV1ZTxudW1iZXI+KCk7XG4gICAgcS5wdXNoKDQyLCAwKTtcbiAgICBxLnB1c2goNDQsIDIpO1xuICAgIHEucHVzaEltbWVkaWF0ZSgxMDApO1xuICAgIHEucHVzaCg0MywgMSk7XG5cbiAgICB0LmlzKGF3YWl0IHEubmV4dCgpLCA0Mik7XG4gICAgdC5pcyhhd2FpdCBxLm5leHQoKSwgMTAwKTtcbiAgICB0LmlzKGF3YWl0IHEubmV4dCgpLCA0Myk7XG4gICAgdC5pcyhhd2FpdCBxLm5leHQoKSwgNDQpO1xufSk7XG4iXX0= |
\ | No newline at end of file |