pup-recorder 0.2.2 → 0.2.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/index.js CHANGED
@@ -1,470 +1,2 @@
1
- import 'source-map-support/register.js';
2
- import { logger, ConcurrencyLimiter, __using, __callDispose } from './chunk-CNRKD76V.js';
3
- export { AbortLink, ConcurrencyLimiter, DEFAULT_DURATION, DEFAULT_FPS, DEFAULT_HEIGHT, DEFAULT_OUT_DIR, DEFAULT_WIDTH, Logger, PUP_ARGS_KEY, RenderSchema, VIDEO_FORMATS, exec, isVideoFormat, logger, noerr, pargs, parseNumber, parseString, penv, pup, pupApp, pupDisableGPU, pupLogLevel, pupPkgRoot, pupUseInnerProxy } from './chunk-CNRKD76V.js';
4
- import { setTimeout as setTimeout$1 } from 'timers/promises';
5
- import { Log, FormatContext, FFmpegError, Codec, CodecContext, Rational, SoftwareScaleContext, Frame, Packet, FilterGraph, Filter, FilterInOut } from 'node-av';
6
- import { AV_LOG_ERROR, AV_LOG_WARNING, AV_SAMPLE_FMT_FLT, AV_PIX_FMT_YUVA420P, AV_SAMPLE_FMT_FLTP, FF_ENCODER_AAC, FF_ENCODER_LIBX265, AV_CODEC_FLAG_GLOBAL_HEADER, AV_PIX_FMT_BGRA, SWS_BILINEAR, AVERROR_EAGAIN, AVERROR_EOF, AV_CHANNEL_LAYOUT_STEREO } from 'node-av/constants';
7
- import { join } from 'path';
8
-
9
- // src/base/lazy.ts
10
- var Lazy = class {
11
- constructor(makeValue) {
12
- this.makeValue = makeValue;
13
- }
14
- get value() {
15
- if (!this._initialized) {
16
- this._value = this.makeValue();
17
- this._initialized = true;
18
- }
19
- return this._value;
20
- }
21
- get initialized() {
22
- return this._initialized;
23
- }
24
- _initialized = false;
25
- _value;
26
- };
27
-
28
- // src/base/timing.ts
29
- function sleep(ms) {
30
- return new Promise((resolve) => setTimeout(resolve, ms));
31
- }
32
- function periodical(callback, ms) {
33
- let token;
34
- let closed = false;
35
- async function tick(count) {
36
- await callback(count);
37
- if (closed) return;
38
- token = setTimeout(() => tick(count + 1), ms);
39
- }
40
- token = setTimeout(() => tick(0), ms);
41
- return () => {
42
- closed = true;
43
- clearTimeout(token);
44
- };
45
- }
46
-
47
- // src/base/retry.ts
48
- function useRetry({ fn, maxAttempts = 3, timeout }) {
49
- const timeoutError = new Error(`timeout over ${timeout}ms`);
50
- return async function(...args) {
51
- let attempt = 0;
52
- while (true) {
53
- try {
54
- const promises = [fn(...args)];
55
- if (timeout) {
56
- promises.push(
57
- setTimeout$1(timeout).then(() => {
58
- throw timeoutError;
59
- })
60
- );
61
- }
62
- return await Promise.race(promises);
63
- } catch (e) {
64
- attempt++;
65
- if (attempt >= maxAttempts) {
66
- throw e;
67
- }
68
- await sleep(Math.pow(2, attempt) * 100 + Math.random() * 100);
69
- }
70
- }
71
- };
72
- }
73
- var SAMPLE_FMT_NAME = {
74
- [AV_SAMPLE_FMT_FLT]: "flt",
75
- [AV_SAMPLE_FMT_FLTP]: "fltp"
76
- };
77
- var AudioEncoder = class _AudioEncoder {
78
- _ctx;
79
- _stream;
80
- _outRate;
81
- _outFmt;
82
- _frameSize;
83
- _pkt;
84
- _filterFrame;
85
- _graph;
86
- _bufSrc;
87
- _bufSink;
88
- _inRate;
89
- pts = 0n;
90
- constructor(ctx, stream, outFmt) {
91
- this._ctx = ctx;
92
- this._stream = stream;
93
- this._outRate = ctx.sampleRate;
94
- this._outFmt = outFmt;
95
- this._frameSize = ctx.frameSize;
96
- this._pkt = new Packet();
97
- this._pkt.alloc();
98
- this._filterFrame = new Frame();
99
- this._filterFrame.alloc();
100
- }
101
- static async create(opts) {
102
- const { outSampleRate, outSampleFmt, codecName, globalHeader, bitrate, muxer } = opts;
103
- const codec = Codec.findEncoderByName(codecName);
104
- if (!codec) throw new Error(`Audio encoder not found: ${codecName}`);
105
- const ctx = new CodecContext();
106
- ctx.allocContext3(codec);
107
- ctx.codecId = codec.id;
108
- ctx.sampleFormat = outSampleFmt;
109
- ctx.sampleRate = outSampleRate;
110
- ctx.channelLayout = AV_CHANNEL_LAYOUT_STEREO;
111
- ctx.timeBase = new Rational(1, outSampleRate);
112
- ctx.bitRate = BigInt(bitrate);
113
- if (globalHeader) ctx.setFlags(AV_CODEC_FLAG_GLOBAL_HEADER);
114
- FFmpegError.throwIfError(await ctx.open2(codec, null), "audioCtx.open2");
115
- const stream = muxer.addStream(ctx);
116
- return new _AudioEncoder(ctx, stream, outSampleFmt);
117
- }
118
- /** Called once when audio-meta arrives with the page's actual sample rate. */
119
- setInputRate(inSampleRate) {
120
- this._disposeGraph();
121
- this._inRate = inSampleRate;
122
- const graph = new FilterGraph();
123
- graph.alloc();
124
- const abuffer = Filter.getByName("abuffer");
125
- const srcArgs = `sample_rate=${inSampleRate}:sample_fmt=flt:channel_layout=stereo:time_base=1/${inSampleRate}`;
126
- const bufSrc = graph.createFilter(abuffer, "src", srcArgs);
127
- if (!bufSrc) throw new Error("Failed to create abuffer");
128
- const abuffersink = Filter.getByName("abuffersink");
129
- const bufSink = graph.createFilter(abuffersink, "sink");
130
- if (!bufSink) throw new Error("Failed to create abuffersink");
131
- const fmtName = SAMPLE_FMT_NAME[this._outFmt] ?? "flt";
132
- const filterDesc = `aformat=sample_fmts=${fmtName}:sample_rates=${this._outRate}:channel_layouts=stereo,asetnsamples=n=${this._frameSize}:p=1`;
133
- const outputs = FilterInOut.createList([{ name: "in", filterCtx: bufSrc, padIdx: 0 }]);
134
- const inputs = FilterInOut.createList([{ name: "out", filterCtx: bufSink, padIdx: 0 }]);
135
- FFmpegError.throwIfError(graph.parsePtr(filterDesc, inputs, outputs), "graph.parsePtr");
136
- FFmpegError.throwIfError(graph.configSync(), "graph.config");
137
- this._graph = graph;
138
- this._bufSrc = bufSrc;
139
- this._bufSink = bufSink;
140
- }
141
- get stream() {
142
- return this._stream;
143
- }
144
- get timeBase() {
145
- return this._ctx.timeBase;
146
- }
147
- async encode(pcm, muxer) {
148
- var _stack = [];
149
- try {
150
- if (!this._bufSrc || !this._bufSink || !this._inRate) return;
151
- const src = new Float32Array(pcm.buffer, pcm.byteOffset, pcm.byteLength / 4);
152
- for (let i = 0; i < src.length; i++) {
153
- if (!isFinite(src[i])) src[i] = 0;
154
- }
155
- const nSamples = src.length >> 1;
156
- const frame = __using(_stack, Frame.fromAudioBuffer(Buffer.from(src.buffer, src.byteOffset, src.byteLength), {
157
- nbSamples: nSamples,
158
- format: AV_SAMPLE_FMT_FLT,
159
- sampleRate: this._inRate,
160
- channelLayout: AV_CHANNEL_LAYOUT_STEREO,
161
- pts: this.pts,
162
- timeBase: { num: 1, den: this._inRate }
163
- }));
164
- this.pts += BigInt(nSamples);
165
- FFmpegError.throwIfError(await this._bufSrc.buffersrcAddFrame(frame), "buffersrcAddFrame");
166
- await this._drainFilter(muxer);
167
- } catch (_) {
168
- var _error = _, _hasError = true;
169
- } finally {
170
- __callDispose(_stack, _error, _hasError);
171
- }
172
- }
173
- async flush(muxer) {
174
- if (this._bufSrc && this._bufSink) {
175
- await this._bufSrc.buffersrcAddFrame(null);
176
- await this._drainFilter(muxer);
177
- }
178
- await this._ctx.sendFrame(null);
179
- await this._drainCodec(muxer);
180
- }
181
- [Symbol.dispose]() {
182
- this._pkt.free();
183
- this._filterFrame.free();
184
- this._disposeGraph();
185
- this._ctx.freeContext();
186
- }
187
- /** Drain filter → send to codec → drain codec packets. */
188
- async _drainFilter(muxer) {
189
- const outFrame = this._filterFrame;
190
- while (true) {
191
- const r = await this._bufSink.buffersinkGetFrame(outFrame);
192
- if (r === AVERROR_EAGAIN || r === AVERROR_EOF) break;
193
- FFmpegError.throwIfError(r, "buffersinkGetFrame");
194
- FFmpegError.throwIfError(await this._ctx.sendFrame(outFrame), "audioCtx.sendFrame");
195
- outFrame.unref();
196
- await this._drainCodec(muxer);
197
- }
198
- }
199
- /** Drain codec packets to muxer. */
200
- async _drainCodec(muxer) {
201
- const pkt = this._pkt;
202
- while (true) {
203
- const r = await this._ctx.receivePacket(pkt);
204
- if (r === AVERROR_EAGAIN || r === AVERROR_EOF) break;
205
- FFmpegError.throwIfError(r, "audio.receivePacket");
206
- pkt.streamIndex = this._stream.index;
207
- pkt.rescaleTs(this._ctx.timeBase, this._stream.timeBase);
208
- await muxer.writePacket(pkt);
209
- pkt.unref();
210
- }
211
- }
212
- _disposeGraph() {
213
- this._graph?.[Symbol.dispose]();
214
- this._graph = void 0;
215
- this._bufSrc = void 0;
216
- this._bufSink = void 0;
217
- }
218
- };
219
- var FormatMuxer = class {
220
- _ctx;
221
- _opened = false;
222
- constructor(outPath) {
223
- this._ctx = new FormatContext();
224
- FFmpegError.throwIfError(this._ctx.allocOutputContext2(null, null, outPath), "allocOutputContext2");
225
- }
226
- addStream(codecCtx, codecTag) {
227
- const stream = this._ctx.newStream(null);
228
- stream.timeBase = codecCtx.timeBase;
229
- FFmpegError.throwIfError(stream.codecpar.fromContext(codecCtx), "codecpar.fromContext");
230
- if (codecTag) stream.codecpar.codecTag = codecTag;
231
- return stream;
232
- }
233
- async open() {
234
- if (this._opened) return;
235
- FFmpegError.throwIfError(await this._ctx.openOutput(), "openOutput");
236
- FFmpegError.throwIfError(await this._ctx.writeHeader(null), "writeHeader");
237
- this._opened = true;
238
- }
239
- async writePacket(pkt) {
240
- FFmpegError.throwIfError(await this._ctx.interleavedWriteFrame(pkt), "interleavedWriteFrame");
241
- }
242
- async finish() {
243
- if (!this._opened) return;
244
- await this._ctx.writeTrailer();
245
- await this._ctx.closeOutput();
246
- this._opened = false;
247
- }
248
- async [Symbol.asyncDispose]() {
249
- await this.finish();
250
- await this._ctx[Symbol.asyncDispose]();
251
- }
252
- };
253
- var VideoEncoder = class _VideoEncoder {
254
- _ctx;
255
- _sws;
256
- _src;
257
- _dst;
258
- _pkt;
259
- _stream;
260
- pts = 0n;
261
- constructor(ctx, sws, src, dst, pkt, stream) {
262
- this._ctx = ctx;
263
- this._sws = sws;
264
- this._src = src;
265
- this._dst = dst;
266
- this._pkt = pkt;
267
- this._stream = stream;
268
- }
269
- static async create(opts) {
270
- const { width, height, fps, codecName, pixFmt, codecTag, globalHeader, codecOpts, bitrate, muxer } = opts;
271
- const codec = Codec.findEncoderByName(codecName);
272
- if (!codec) throw new Error(`Video encoder not found: ${codecName}`);
273
- const ctx = new CodecContext();
274
- ctx.allocContext3(codec);
275
- ctx.codecId = codec.id;
276
- ctx.width = width;
277
- ctx.height = height;
278
- ctx.pixelFormat = pixFmt;
279
- ctx.timeBase = new Rational(1, fps);
280
- ctx.framerate = new Rational(fps, 1);
281
- ctx.gopSize = fps;
282
- ctx.bitRate = BigInt(bitrate);
283
- ctx.setOption("threads", "4");
284
- if (globalHeader) ctx.setFlags(AV_CODEC_FLAG_GLOBAL_HEADER);
285
- for (const [k, v] of Object.entries(codecOpts)) ctx.setOption(k, v);
286
- if (codecTag) ctx.codecTag = codecTag;
287
- FFmpegError.throwIfError(await ctx.open2(codec, null), "videoCtx.open2");
288
- const sws = new SoftwareScaleContext();
289
- sws.getContext(width, height, AV_PIX_FMT_BGRA, width, height, pixFmt, SWS_BILINEAR);
290
- const dst = new Frame();
291
- dst.alloc();
292
- dst.format = pixFmt;
293
- dst.width = width;
294
- dst.height = height;
295
- FFmpegError.throwIfError(dst.getBuffer(0), "dstFrame.getBuffer");
296
- const src = new Frame();
297
- src.alloc();
298
- src.format = AV_PIX_FMT_BGRA;
299
- src.width = width;
300
- src.height = height;
301
- FFmpegError.throwIfError(src.getBuffer(0), "srcFrame.getBuffer");
302
- const pkt = new Packet();
303
- pkt.alloc();
304
- const stream = muxer.addStream(ctx, codecTag);
305
- return new _VideoEncoder(ctx, sws, src, dst, pkt, stream);
306
- }
307
- get stream() {
308
- return this._stream;
309
- }
310
- get timeBase() {
311
- return this._ctx.timeBase;
312
- }
313
- async encode(bgra, muxer) {
314
- const { _src: src, _dst: dst, _sws: sws } = this;
315
- FFmpegError.throwIfError(src.makeWritable(), "src.makeWritable");
316
- FFmpegError.throwIfError(src.fromBuffer(bgra), "src.fromBuffer");
317
- src.pts = this.pts;
318
- FFmpegError.throwIfError(dst.makeWritable(), "dst.makeWritable");
319
- FFmpegError.throwIfError(await sws.scaleFrame(dst, src), "sws.scaleFrame");
320
- dst.pts = this.pts++;
321
- FFmpegError.throwIfError(await this._ctx.sendFrame(dst), "videoCtx.sendFrame");
322
- await this.drain(muxer);
323
- }
324
- async flush(muxer) {
325
- await this._ctx.sendFrame(null);
326
- await this.drain(muxer);
327
- }
328
- [Symbol.dispose]() {
329
- this._pkt.free();
330
- this._src.free();
331
- this._dst.free();
332
- this._sws[Symbol.dispose]();
333
- this._ctx.freeContext();
334
- }
335
- async drain(muxer) {
336
- const pkt = this._pkt;
337
- while (true) {
338
- const r = await this._ctx.receivePacket(pkt);
339
- if (r === AVERROR_EAGAIN || r === AVERROR_EOF) break;
340
- FFmpegError.throwIfError(r, "video.receivePacket");
341
- pkt.streamIndex = this._stream.index;
342
- pkt.rescaleTs(this._ctx.timeBase, this._stream.timeBase);
343
- await muxer.writePacket(pkt);
344
- pkt.unref();
345
- }
346
- }
347
- };
348
-
349
- // src/base/encoder/encoder.ts
350
- Log.setCallback((level, message) => {
351
- const msg = message.trimEnd();
352
- if (!msg) return;
353
- if (level <= AV_LOG_ERROR) logger.error(msg);
354
- else if (level <= AV_LOG_WARNING) logger.warn(msg);
355
- });
356
- var FORMAT_SPECS = {
357
- mp4: {
358
- videoCodecName: FF_ENCODER_LIBX265,
359
- pixFmt: AV_PIX_FMT_YUVA420P,
360
- codecTag: "hvc1",
361
- globalHeader: true,
362
- videoOpts: { preset: "ultrafast", "x265-params": "log-level=1" },
363
- audioCodecName: FF_ENCODER_AAC,
364
- audioSampleFmt: AV_SAMPLE_FMT_FLTP,
365
- outSampleRate: 44100
366
- },
367
- webm: {
368
- videoCodecName: "libvpx-vp9",
369
- pixFmt: AV_PIX_FMT_YUVA420P,
370
- globalHeader: false,
371
- videoOpts: { quality: "realtime", "cpu-used": "8" },
372
- audioCodecName: "libopus",
373
- audioSampleFmt: AV_SAMPLE_FMT_FLT,
374
- outSampleRate: 48e3
375
- }
376
- };
377
- var EncoderPipeline = class _EncoderPipeline {
378
- _states;
379
- constructor(states) {
380
- this._states = states;
381
- }
382
- static async create({
383
- width,
384
- height,
385
- fps,
386
- formats,
387
- outDir,
388
- withAudio = false,
389
- videoBitrate = 8e6,
390
- audioBitrate = 128e3
391
- }) {
392
- const states = await Promise.all(
393
- formats.map(async (format) => {
394
- const spec = FORMAT_SPECS[format];
395
- const outPath = join(outDir, `output.${format}`);
396
- const muxer = new FormatMuxer(outPath);
397
- const video = await VideoEncoder.create({
398
- width,
399
- height,
400
- fps,
401
- codecName: spec.videoCodecName,
402
- pixFmt: spec.pixFmt,
403
- codecTag: spec.codecTag,
404
- globalHeader: spec.globalHeader,
405
- codecOpts: spec.videoOpts,
406
- bitrate: videoBitrate,
407
- muxer
408
- });
409
- let audio;
410
- if (withAudio) {
411
- audio = await AudioEncoder.create({
412
- outSampleRate: spec.outSampleRate,
413
- outSampleFmt: spec.audioSampleFmt,
414
- codecName: spec.audioCodecName,
415
- globalHeader: spec.globalHeader,
416
- bitrate: audioBitrate,
417
- muxer
418
- });
419
- }
420
- await muxer.open();
421
- const limiter = new ConcurrencyLimiter(1);
422
- return { format, outPath, muxer, video, audio, limiter };
423
- })
424
- );
425
- return new _EncoderPipeline(states);
426
- }
427
- setupAudio(sampleRate) {
428
- for (const s of this._states) {
429
- s.audio?.setInputRate(sampleRate);
430
- }
431
- }
432
- async encodeFrame(bgra, _timestampUs) {
433
- await Promise.all(this._states.map((s) => s.limiter.schedule(() => s.video.encode(bgra, s.muxer))));
434
- }
435
- async encodeAudio(pcm) {
436
- await Promise.all(
437
- this._states.map((s) => {
438
- if (!s.audio) return Promise.resolve();
439
- return s.limiter.schedule(() => s.audio.encode(pcm, s.muxer));
440
- })
441
- );
442
- }
443
- async finish() {
444
- const result = {};
445
- await Promise.all(
446
- this._states.map(async (s) => {
447
- var _stack = [];
448
- try {
449
- await s.limiter.end();
450
- await s.audio?.flush(s.muxer);
451
- await s.video.flush(s.muxer);
452
- result[s.format] = s.outPath;
453
- const _a = __using(_stack, s.audio);
454
- const _v = __using(_stack, s.video);
455
- const _m = __using(_stack, s.muxer, true);
456
- } catch (_) {
457
- var _error = _, _hasError = true;
458
- } finally {
459
- var _promise = __callDispose(_stack, _error, _hasError);
460
- _promise && await _promise;
461
- }
462
- })
463
- );
464
- return result;
465
- }
466
- };
467
-
468
- export { EncoderPipeline, FormatMuxer, Lazy, periodical, sleep, useRetry };
469
- //# sourceMappingURL=index.js.map
470
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlL2xhenkudHMiLCIuLi9zcmMvYmFzZS90aW1pbmcudHMiLCIuLi9zcmMvYmFzZS9yZXRyeS50cyIsIi4uL3NyYy9iYXNlL2VuY29kZXIvYXVkaW8udHMiLCIuLi9zcmMvYmFzZS9lbmNvZGVyL211eGVyLnRzIiwiLi4vc3JjL2Jhc2UvZW5jb2Rlci92aWRlby50cyIsIi4uL3NyYy9iYXNlL2VuY29kZXIvZW5jb2Rlci50cyJdLCJuYW1lcyI6WyJzZXRUaW1lb3V0IiwiRkZtcGVnRXJyb3IiLCJDb2RlYyIsIkNvZGVjQ29udGV4dCIsIlJhdGlvbmFsIiwiQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSIiwiRnJhbWUiLCJQYWNrZXQiLCJBVkVSUk9SX0VBR0FJTiIsIkFWRVJST1JfRU9GIiwiQVZfUElYX0ZNVF9ZVVZBNDIwUCIsIkFWX1NBTVBMRV9GTVRfRkxUUCIsIkFWX1NBTVBMRV9GTVRfRkxUIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFTyxJQUFNLE9BQU4sTUFBYztBQUFBLEVBQ25CLFlBQXFCLFNBQUEsRUFBb0I7QUFBcEIsSUFBQSxJQUFBLENBQUEsU0FBQSxHQUFBLFNBQUE7QUFBQSxFQUFxQjtBQUFBLEVBRTFDLElBQUksS0FBQSxHQUFXO0FBQ2IsSUFBQSxJQUFJLENBQUMsS0FBSyxZQUFBLEVBQWM7QUFDdEIsTUFBQSxJQUFBLENBQUssTUFBQSxHQUFTLEtBQUssU0FBQSxFQUFVO0FBQzdCLE1BQUEsSUFBQSxDQUFLLFlBQUEsR0FBZSxJQUFBO0FBQUEsSUFDdEI7QUFDQSxJQUFBLE9BQU8sSUFBQSxDQUFLLE1BQUE7QUFBQSxFQUNkO0FBQUEsRUFFQSxJQUFJLFdBQUEsR0FBdUI7QUFDekIsSUFBQSxPQUFPLElBQUEsQ0FBSyxZQUFBO0FBQUEsRUFDZDtBQUFBLEVBRVEsWUFBQSxHQUFlLEtBQUE7QUFBQSxFQUNmLE1BQUE7QUFDVjs7O0FDakJPLFNBQVMsTUFBTSxFQUFBLEVBQVk7QUFDaEMsRUFBQSxPQUFPLElB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QUEsRUFDVDtBQUNGIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMS8zMC5cblxuZXhwb3J0IGNsYXNzIExhenk8VD4ge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBtYWtlVmFsdWU6ICgpID0+IFQpIHt9XG5cbiAgZ2V0IHZhbHVlKCk6IFQge1xuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5tYWtlVmFsdWUoKTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlITtcbiAgfVxuXG4gIGdldCBpbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQ7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIF92YWx1ZTogVCB8IHVuZGVmaW5lZDtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMDkuXG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGVyaW9kaWNhbChjYWxsYmFjazogKGNvdW50OiBudW1iZXIpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkLCBtczogbnVtYmVyKSB7XG4gIGxldCB0b2tlbjogTm9kZUpTLlRpbWVvdXQ7XG4gIGxldCBjbG9zZWQgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gdGljayhjb3VudDogbnVtYmVyKSB7XG4gICAgYXdhaXQgY2FsbGJhY2soY291bnQpO1xuICAgIGlmIChjbG9zZWQpIHJldHVybjtcbiAgICB0b2tlbiA9IHNldFRpbWVvdXQoKCkgPT4gdGljayhjb3VudCArIDEpLCBtcyk7XG4gIH1cbiAgdG9rZW4gPSBzZXRUaW1lb3V0KCgpID0+IHRpY2soMCksIG1zKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbG9zZWQgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dCh0b2tlbik7XG4gIH07XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA1LlxuXG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSBcInRpbWVycy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwiLi90aW1pbmdcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnM8QXJncyBleHRlbmRzIGFueVtdLCBSZXQ+IHtcbiAgZm46ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJldD47XG4gIG1heEF0dGVtcHRzPzogbnVtYmVyO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmV0cnk8QXJncyBleHRlbmRzIGFueVtdLCBSZXQ+KHsgZm4sIG1heEF0dGVtcHRzID0gMywgdGltZW91dCB9OiBSZXRyeU9wdGlvbnM8QXJncywgUmV0Pikge1xuICBjb25zdCB0aW1lb3V0RXJyb3IgPSBuZXcgRXJyb3IoYHRpbWVvdXQgb3ZlciAke3RpbWVvdXR9bXNgKTtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzOiBBcmdzKSB7XG4gICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtmbiguLi5hcmdzKV07XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgIHNldFRpbWVvdXQodGltZW91dCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHRocm93IHRpbWVvdXRFcnJvcjtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShwcm9taXNlcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgaWYgKGF0dGVtcHQgPj0gbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHNsZWVwKE1hdGgucG93KDIsIGF0dGVtcHQpICogMTAwICsgTWF0aC5yYW5kb20oKSAqIDEwMCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMy8yMS5cblxuaW1wb3J0IHtcbiAgQ29kZWMsXG4gIENvZGVjQ29udGV4dCxcbiAgRkZtcGVnRXJyb3IsXG4gIEZpbHRlcixcbiAgRmlsdGVyR3JhcGgsXG4gIEZpbHRlckluT3V0LFxuICBGcmFtZSxcbiAgUGFja2V0LFxuICBSYXRpb25hbCxcbiAgdHlwZSBGaWx0ZXJDb250ZXh0LFxufSBmcm9tIFwibm9kZS1hdlwiO1xuaW1wb3J0IHtcbiAgQVZfQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLFxuICBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIsXG4gIEFWX1NBTVBMRV9GTVRfRkxULFxuICBBVl9TQU1QTEVfRk1UX0ZMVFAsXG4gIEFWRVJST1JfRUFHQUlOLFxuICBBVkVSUk9SX0VPRixcbiAgdHlwZSBGRkF1ZGlvRW5jb2Rlcixcbn0gZnJvbSBcIm5vZGUtYXYvY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1hdE11eGVyIH0gZnJvbSBcIi4vbXV4ZXJcIjtcblxuY29uc3QgU0FNUExFX0ZNVF9OQU1FOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICBbQVZfU0FNUExFX0ZNVF9GTFRdOiBcImZsdFwiLFxuICBbQVZfU0FNUExFX0ZNVF9GTFRQXTogXCJmbHRwXCIsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGlvRW5jb2Rlck9wdGlvbnMge1xuICBvdXRTYW1wbGVSYXRlOiBudW1iZXI7XG4gIG91dFNhbXBsZUZtdDogdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUIHwgdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUUDtcbiAgY29kZWNOYW1lOiBGRkF1ZGlvRW5jb2RlcjtcbiAgZ2xvYmFsSGVhZGVyOiBib29sZWFuO1xuICBiaXRyYXRlOiBudW1iZXI7XG4gIG11eGVyOiBGb3JtYXRNdXhlcjtcbn1cblxudHlwZSBTdHJlYW0gPSBSZXR1cm5UeXBlPGltcG9ydChcIm5vZGUtYXZcIikuRm9ybWF0Q29udGV4dFtcIm5ld1N0cmVhbVwiXT47XG5cbmV4cG9ydCBjbGFzcyBBdWRpb0VuY29kZXIgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3R4OiBDb2RlY0NvbnRleHQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0cmVhbTogU3RyZWFtO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vdXRSYXRlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX291dEZtdDogdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUIHwgdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUUDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZnJhbWVTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BrdDogUGFja2V0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJGcmFtZTogRnJhbWU7XG5cbiAgcHJpdmF0ZSBfZ3JhcGg/OiBGaWx0ZXJHcmFwaDtcbiAgcHJpdmF0ZSBfYnVmU3JjPzogRmlsdGVyQ29udGV4dDtcbiAgcHJpdmF0ZSBfYnVmU2luaz86IEZpbHRlckNvbnRleHQ7XG4gIHByaXZhdGUgX2luUmF0ZT86IG51bWJlcjtcbiAgcHRzID0gMG47XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihjdHg6IENvZGVjQ29udGV4dCwgc3RyZWFtOiBTdHJlYW0sIG91dEZtdDogdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUIHwgdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUUCkge1xuICAgIHRoaXMuX2N0eCA9IGN0eDtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5fb3V0UmF0ZSA9IGN0eC5zYW1wbGVSYXRlO1xuICAgIHRoaXMuX291dEZtdCA9IG91dEZtdDtcbiAgICB0aGlzLl9mcmFtZVNpemUgPSBjdHguZnJhbWVTaXplO1xuXG4gICAgdGhpcy5fcGt0ID0gbmV3IFBhY2tldCgpO1xuICAgIHRoaXMuX3BrdC5hbGxvYygpO1xuXG4gICAgdGhpcy5fZmlsdGVyRnJhbWUgPSBuZXcgRnJhbWUoKTtcbiAgICB0aGlzLl9maWx0ZXJGcmFtZS5hbGxvYygpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZShvcHRzOiBBdWRpb0VuY29kZXJPcHRpb25zKTogUHJvbWlzZTxBdWRpb0VuY29kZXI+IHtcbiAgICBjb25zdCB7IG91dFNhbXBsZVJhdGUsIG91dFNhbXBsZUZtdCwgY29kZWNOYW1lLCBnbG9iYWxIZWFkZXIsIGJpdHJhdGUsIG11eGVyIH0gPSBvcHRzO1xuXG4gICAgY29uc3QgY29kZWMgPSBDb2RlYy5maW5kRW5jb2RlckJ5TmFtZShjb2RlY05hbWUpO1xuICAgIGlmICghY29kZWMpIHRocm93IG5ldyBFcnJvcihgQXVkaW8gZW5jb2RlciBub3QgZm91bmQ6ICR7Y29kZWNOYW1lfWApO1xuXG4gICAgY29uc3QgY3R4ID0gbmV3IENvZGVjQ29udGV4dCgpO1xuICAgIGN0eC5hbGxvY0NvbnRleHQzKGNvZGVjKTtcbiAgICBjdHguY29kZWNJZCA9IGNvZGVjLmlkO1xuICAgIGN0eC5zYW1wbGVGb3JtYXQgPSBvdXRTYW1wbGVGbXQ7XG4gICAgY3R4LnNhbXBsZVJhdGUgPSBvdXRTYW1wbGVSYXRlO1xuICAgIGN0eC5jaGFubmVsTGF5b3V0ID0gQVZfQ0hBTk5FTF9MQVlPVVRfU1RFUkVPO1xuICAgIGN0eC50aW1lQmFzZSA9IG5ldyBSYXRpb25hbCgxLCBvdXRTYW1wbGVSYXRlKTtcbiAgICBjdHguYml0UmF0ZSA9IEJpZ0ludChiaXRyYXRlKTtcbiAgICBpZiAoZ2xvYmFsSGVhZGVyKSBjdHguc2V0RmxhZ3MoQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgY3R4Lm9wZW4yKGNvZGVjLCBudWxsKSwgXCJhdWRpb0N0eC5vcGVuMlwiKTtcblxuICAgIGNvbnN0IHN0cmVhbSA9IG11eGVyLmFkZFN0cmVhbShjdHgpO1xuICAgIHJldHVybiBuZXcgQXVkaW9FbmNvZGVyKGN0eCwgc3RyZWFtLCBvdXRTYW1wbGVGbXQpO1xuICB9XG5cbiAgLyoqIENhbGxlZCBvbmNlIHdoZW4gYXVkaW8tbWV0YSBhcnJpdmVzIHdpdGggdGhlIHBhZ2UncyBhY3R1YWwgc2FtcGxlIHJhdGUuICovXG4gIHNldElucHV0UmF0ZShpblNhbXBsZVJhdGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2Rpc3Bvc2VHcmFwaCgpO1xuICAgIHRoaXMuX2luUmF0ZSA9IGluU2FtcGxlUmF0ZTtcblxuICAgIGNvbnN0IGdyYXBoID0gbmV3IEZpbHRlckdyYXBoKCk7XG4gICAgZ3JhcGguYWxsb2MoKTtcblxuICAgIC8vIGFidWZmZXIgc291cmNlOiBpbnRlcmxlYXZlZCBzdGVyZW8gZmxvYXQgZnJvbSBicm93c2VyXG4gICAgY29uc3QgYWJ1ZmZlciA9IEZpbHRlci5nZXRCeU5hbWUoXCJhYnVmZmVyXCIpITtcbiAgICBjb25zdCBzcmNBcmdzID0gYHNhbXBsZV9yYXRlPSR7aW5TYW1wbGVSYXRlfTpzYW1wbGVfZm10PWZsdDpjaGFubmVsX2xheW91dD1zdGVyZW86dGltZV9iYXNlPTEvJHtpblNhbXBsZVJhdGV9YDtcbiAgICBjb25zdCBidWZTcmMgPSBncmFwaC5jcmVhdGVGaWx0ZXIoYWJ1ZmZlciwgXCJzcmNcIiwgc3JjQXJncyk7XG4gICAgaWYgKCFidWZTcmMpIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgYWJ1ZmZlclwiKTtcblxuICAgIC8vIGFidWZmZXJzaW5rXG4gICAgY29uc3QgYWJ1ZmZlcnNpbmsgPSBGaWx0ZXIuZ2V0QnlOYW1lKFwiYWJ1ZmZlcnNpbmtcIikhO1xuICAgIGNvbnN0IGJ1ZlNpbmsgPSBncmFwaC5jcmVhdGVGaWx0ZXIoYWJ1ZmZlcnNpbmssIFwic2lua1wiKTtcbiAgICBpZiAoIWJ1ZlNpbmspIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgYWJ1ZmZlcnNpbmtcIik7XG5cbiAgICAvLyBQYXJzZSBmaWx0ZXIgY2hhaW46IGFmb3JtYXQgKyBhc2V0bnNhbXBsZXNcbiAgICBjb25zdCBmbXROYW1lID0gU0FNUExFX0ZNVF9OQU1FW3RoaXMuX291dEZtdF0gPz8gXCJmbHRcIjtcbiAgICBjb25zdCBmaWx0ZXJEZXNjID0gYGFmb3JtYXQ9c2FtcGxlX2ZtdHM9JHtmbXROYW1lfTpzYW1wbGVfcmF0ZXM9JHt0aGlzLl9vdXRSYXRlfTpjaGFubmVsX2xheW91dHM9c3RlcmVvLGFzZXRuc2FtcGxlcz1uPSR7dGhpcy5fZnJhbWVTaXplfTpwPTFgO1xuXG4gICAgY29uc3Qgb3V0cHV0cyA9IEZpbHRlckluT3V0LmNyZWF0ZUxpc3QoW3sgbmFtZTogXCJpblwiLCBmaWx0ZXJDdHg6IGJ1ZlNyYywgcGFkSWR4OiAwIH1dKTtcbiAgICBjb25zdCBpbnB1dHMgPSBGaWx0ZXJJbk91dC5jcmVhdGVMaXN0KFt7IG5hbWU6IFwib3V0XCIsIGZpbHRlckN0eDogYnVmU2luaywgcGFkSWR4OiAwIH1dKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoZ3JhcGgucGFyc2VQdHIoZmlsdGVyRGVzYywgaW5wdXRzLCBvdXRwdXRzKSwgXCJncmFwaC5wYXJzZVB0clwiKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoZ3JhcGguY29uZmlnU3luYygpLCBcImdyYXBoLmNvbmZpZ1wiKTtcblxuICAgIHRoaXMuX2dyYXBoID0gZ3JhcGg7XG4gICAgdGhpcy5fYnVmU3JjID0gYnVmU3JjO1xuICAgIHRoaXMuX2J1ZlNpbmsgPSBidWZTaW5rO1xuICB9XG5cbiAgZ2V0IHN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtO1xuICB9XG4gIGdldCB0aW1lQmFzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3R4LnRpbWVCYXNlO1xuICB9XG5cbiAgYXN5bmMgZW5jb2RlKHBjbTogQnVmZmVyLCBtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2J1ZlNyYyB8fCAhdGhpcy5fYnVmU2luayB8fCAhdGhpcy5faW5SYXRlKSByZXR1cm47XG5cbiAgICAvLyBJbi1wbGFjZSBzYW5pdGl6ZSDigJQgbXV0YXRlIHNvdXJjZSBkaXJlY3RseSwgbm8gY29weVxuICAgIGNvbnN0IHNyYyA9IG5ldyBGbG9hdDMyQXJyYXkocGNtLmJ1ZmZlciwgcGNtLmJ5dGVPZmZzZXQsIHBjbS5ieXRlTGVuZ3RoIC8gNCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghaXNGaW5pdGUoc3JjW2ldISkpIHNyY1tpXSA9IDA7XG4gICAgfVxuICAgIGNvbnN0IG5TYW1wbGVzID0gc3JjLmxlbmd0aCA+PiAxO1xuXG4gICAgdXNpbmcgZnJhbWUgPSBGcmFtZS5mcm9tQXVkaW9CdWZmZXIoQnVmZmVyLmZyb20oc3JjLmJ1ZmZlciwgc3JjLmJ5dGVPZmZzZXQsIHNyYy5ieXRlTGVuZ3RoKSwge1xuICAgICAgbmJTYW1wbGVzOiBuU2FtcGxlcyxcbiAgICAgIGZvcm1hdDogQVZfU0FNUExFX0ZNVF9GTFQsXG4gICAgICBzYW1wbGVSYXRlOiB0aGlzLl9pblJhdGUsXG4gICAgICBjaGFubmVsTGF5b3V0OiBBVl9DSEFOTkVMX0xBWU9VVF9TVEVSRU8sXG4gICAgICBwdHM6IHRoaXMucHRzLFxuICAgICAgdGltZUJhc2U6IHsgbnVtOiAxLCBkZW46IHRoaXMuX2luUmF0ZSB9LFxuICAgIH0pO1xuICAgIHRoaXMucHRzICs9IEJpZ0ludChuU2FtcGxlcyk7XG5cbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fYnVmU3JjLmJ1ZmZlcnNyY0FkZEZyYW1lKGZyYW1lKSwgXCJidWZmZXJzcmNBZGRGcmFtZVwiKTtcbiAgICBhd2FpdCB0aGlzLl9kcmFpbkZpbHRlcihtdXhlcik7XG4gIH1cblxuICBhc3luYyBmbHVzaChtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fYnVmU3JjICYmIHRoaXMuX2J1ZlNpbmspIHtcbiAgICAgIC8vIFNpZ25hbCBFT0YgdG8gZmlsdGVyIGdyYXBoXG4gICAgICBhd2FpdCB0aGlzLl9idWZTcmMuYnVmZmVyc3JjQWRkRnJhbWUobnVsbCk7XG4gICAgICBhd2FpdCB0aGlzLl9kcmFpbkZpbHRlcihtdXhlcik7XG4gICAgfVxuICAgIC8vIEZsdXNoIGNvZGVjXG4gICAgYXdhaXQgdGhpcy5fY3R4LnNlbmRGcmFtZShudWxsKTtcbiAgICBhd2FpdCB0aGlzLl9kcmFpbkNvZGVjKG11eGVyKTtcbiAgfVxuXG4gIFtTeW1ib2wuZGlzcG9zZV0oKTogdm9pZCB7XG4gICAgdGhpcy5fcGt0LmZyZWUoKTtcbiAgICB0aGlzLl9maWx0ZXJGcmFtZS5mcmVlKCk7XG4gICAgdGhpcy5fZGlzcG9zZUdyYXBoKCk7XG4gICAgdGhpcy5fY3R4LmZyZWVDb250ZXh0KCk7XG4gIH1cblxuICAvKiogRHJhaW4gZmlsdGVyIOKGkiBzZW5kIHRvIGNvZGVjIOKGkiBkcmFpbiBjb2RlYyBwYWNrZXRzLiAqL1xuICBwcml2YXRlIGFzeW5jIF9kcmFpbkZpbHRlcihtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvdXRGcmFtZSA9IHRoaXMuX2ZpbHRlckZyYW1lO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5fYnVmU2luayEuYnVmZmVyc2lua0dldEZyYW1lKG91dEZyYW1lKTtcbiAgICAgIGlmIChyID09PSBBVkVSUk9SX0VBR0FJTiB8fCByID09PSBBVkVSUk9SX0VPRikgYnJlYWs7XG4gICAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IociwgXCJidWZmZXJzaW5rR2V0RnJhbWVcIik7XG4gICAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fY3R4LnNlbmRGcmFtZShvdXRGcmFtZSksIFwiYXVkaW9DdHguc2VuZEZyYW1lXCIpO1xuICAgICAgb3V0RnJhbWUudW5yZWYoKTtcbiAgICAgIGF3YWl0IHRoaXMuX2RyYWluQ29kZWMobXV4ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEcmFpbiBjb2RlYyBwYWNrZXRzIHRvIG11eGVyLiAqL1xuICBwcml2YXRlIGFzeW5jIF9kcmFpbkNvZGVjKG11eGVyOiBGb3JtYXRNdXhlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBrdCA9IHRoaXMuX3BrdDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuX2N0eC5yZWNlaXZlUGFja2V0KHBrdCk7XG4gICAgICBpZiAociA9PT0gQVZFUlJPUl9FQUdBSU4gfHwgciA9PT0gQVZFUlJPUl9FT0YpIGJyZWFrO1xuICAgICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHIsIFwiYXVkaW8ucmVjZWl2ZVBhY2tldFwiKTtcbiAgICAgIHBrdC5zdHJlYW1JbmRleCA9IHRoaXMuX3N0cmVhbS5pbmRleDtcbiAgICAgIHBrdC5yZXNjYWxlVHModGhpcy5fY3R4LnRpbWVCYXNlLCB0aGlzLl9zdHJlYW0udGltZUJhc2UpO1xuICAgICAgYXdhaXQgbXV4ZXIud3JpdGVQYWNrZXQocGt0KTtcbiAgICAgIHBrdC51bnJlZigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2Rpc3Bvc2VHcmFwaCgpOiB2b2lkIHtcbiAgICAvLyBGaWx0ZXJHcmFwaC5mcmVlKCkgcmVsZWFzZXMgYWxsIGNvbnRhaW5lZCBmaWx0ZXIgY29udGV4dHNcbiAgICB0aGlzLl9ncmFwaD8uW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgIHRoaXMuX2dyYXBoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2J1ZlNyYyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9idWZTaW5rID0gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb2RlY0NvbnRleHQsIEZGbXBlZ0Vycm9yLCBGb3JtYXRDb250ZXh0LCBQYWNrZXQgfSBmcm9tIFwibm9kZS1hdlwiO1xuXG5leHBvcnQgY2xhc3MgRm9ybWF0TXV4ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdHg6IEZvcm1hdENvbnRleHQ7XG4gIHByaXZhdGUgX29wZW5lZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKG91dFBhdGg6IHN0cmluZykge1xuICAgIHRoaXMuX2N0eCA9IG5ldyBGb3JtYXRDb250ZXh0KCk7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHRoaXMuX2N0eC5hbGxvY091dHB1dENvbnRleHQyKG51bGwsIG51bGwsIG91dFBhdGgpLCBcImFsbG9jT3V0cHV0Q29udGV4dDJcIik7XG4gIH1cblxuICBhZGRTdHJlYW0oY29kZWNDdHg6IENvZGVjQ29udGV4dCwgY29kZWNUYWc/OiBzdHJpbmcpOiBSZXR1cm5UeXBlPEZvcm1hdENvbnRleHRbXCJuZXdTdHJlYW1cIl0+IHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9jdHgubmV3U3RyZWFtKG51bGwpO1xuICAgIHN0cmVhbS50aW1lQmFzZSA9IGNvZGVjQ3R4LnRpbWVCYXNlO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihzdHJlYW0uY29kZWNwYXIuZnJvbUNvbnRleHQoY29kZWNDdHgpLCBcImNvZGVjcGFyLmZyb21Db250ZXh0XCIpO1xuICAgIGlmIChjb2RlY1RhZykgc3RyZWFtLmNvZGVjcGFyLmNvZGVjVGFnID0gY29kZWNUYWc7XG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuXG4gIGFzeW5jIG9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX29wZW5lZCkgcmV0dXJuO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9jdHgub3Blbk91dHB1dCgpLCBcIm9wZW5PdXRwdXRcIik7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IHRoaXMuX2N0eC53cml0ZUhlYWRlcihudWxsKSwgXCJ3cml0ZUhlYWRlclwiKTtcbiAgICB0aGlzLl9vcGVuZWQgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgd3JpdGVQYWNrZXQocGt0OiBQYWNrZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fY3R4LmludGVybGVhdmVkV3JpdGVGcmFtZShwa3QpLCBcImludGVybGVhdmVkV3JpdGVGcmFtZVwiKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX29wZW5lZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuX2N0eC53cml0ZVRyYWlsZXIoKTtcbiAgICBhd2FpdCB0aGlzLl9jdHguY2xvc2VPdXRwdXQoKTtcbiAgICB0aGlzLl9vcGVuZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZpbmlzaCgpO1xuICAgIGF3YWl0IHRoaXMuX2N0eFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAzLzIxLlxuXG5pbXBvcnQgeyBDb2RlYywgQ29kZWNDb250ZXh0LCBGRm1wZWdFcnJvciwgRnJhbWUsIFBhY2tldCwgUmF0aW9uYWwsIFNvZnR3YXJlU2NhbGVDb250ZXh0IH0gZnJvbSBcIm5vZGUtYXZcIjtcbmltcG9ydCB7XG4gIEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUixcbiAgQVZfUElYX0ZNVF9CR1JBLFxuICBBVl9QSVhfRk1UX1lVVjQyMFAsXG4gIEFWX1BJWF9GTVRfWVVWQTQyMFAsXG4gIEFWRVJST1JfRUFHQUlOLFxuICBBVkVSUk9SX0VPRixcbiAgU1dTX0JJTElORUFSLFxuICB0eXBlIEZGVmlkZW9FbmNvZGVyLFxufSBmcm9tIFwibm9kZS1hdi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgRm9ybWF0TXV4ZXIgfSBmcm9tIFwiLi9tdXhlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpZGVvRW5jb2Rlck9wdGlvbnMge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgZnBzOiBudW1iZXI7XG4gIGNvZGVjTmFtZTogRkZWaWRlb0VuY29kZXI7XG4gIHBpeEZtdDogdHlwZW9mIEFWX1BJWF9GTVRfWVVWQTQyMFAgfCB0eXBlb2YgQVZfUElYX0ZNVF9ZVVY0MjBQO1xuICBjb2RlY1RhZz86IHN0cmluZztcbiAgZ2xvYmFsSGVhZGVyOiBib29sZWFuO1xuICBjb2RlY09wdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGJpdHJhdGU6IG51bWJlcjtcbiAgbXV4ZXI6IEZvcm1hdE11eGVyO1xufVxuXG50eXBlIFN0cmVhbSA9IFJldHVyblR5cGU8aW1wb3J0KFwibm9kZS1hdlwiKS5Gb3JtYXRDb250ZXh0W1wibmV3U3RyZWFtXCJdPjtcblxuZXhwb3J0IGNsYXNzIFZpZGVvRW5jb2RlciBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdHg6IENvZGVjQ29udGV4dDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3dzOiBTb2Z0d2FyZVNjYWxlQ29udGV4dDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3JjOiBGcmFtZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZHN0OiBGcmFtZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGt0OiBQYWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0cmVhbTogU3RyZWFtO1xuICBwdHMgPSAwbjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIGN0eDogQ29kZWNDb250ZXh0LFxuICAgIHN3czogU29mdHdhcmVTY2FsZUNvbnRleHQsXG4gICAgc3JjOiBGcmFtZSxcbiAgICBkc3Q6IEZyYW1lLFxuICAgIHBrdDogUGFja2V0LFxuICAgIHN0cmVhbTogU3RyZWFtLFxuICApIHtcbiAgICB0aGlzLl9jdHggPSBjdHg7XG4gICAgdGhpcy5fc3dzID0gc3dzO1xuICAgIHRoaXMuX3NyYyA9IHNyYztcbiAgICB0aGlzLl9kc3QgPSBkc3Q7XG4gICAgdGhpcy5fcGt0ID0gcGt0O1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUob3B0czogVmlkZW9FbmNvZGVyT3B0aW9ucyk6IFByb21pc2U8VmlkZW9FbmNvZGVyPiB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBmcHMsIGNvZGVjTmFtZSwgcGl4Rm10LCBjb2RlY1RhZywgZ2xvYmFsSGVhZGVyLCBjb2RlY09wdHMsIGJpdHJhdGUsIG11eGVyIH0gPSBvcHRzO1xuXG4gICAgY29uc3QgY29kZWMgPSBDb2RlYy5maW5kRW5jb2RlckJ5TmFtZShjb2RlY05hbWUpO1xuICAgIGlmICghY29kZWMpIHRocm93IG5ldyBFcnJvcihgVmlkZW8gZW5jb2RlciBub3QgZm91bmQ6ICR7Y29kZWNOYW1lfWApO1xuXG4gICAgY29uc3QgY3R4ID0gbmV3IENvZGVjQ29udGV4dCgpO1xuICAgIGN0eC5hbGxvY0NvbnRleHQzKGNvZGVjKTtcbiAgICBjdHguY29kZWNJZCA9IGNvZGVjLmlkO1xuICAgIGN0eC53aWR0aCA9IHdpZHRoO1xuICAgIGN0eC5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY3R4LnBpeGVsRm9ybWF0ID0gcGl4Rm10O1xuICAgIGN0eC50aW1lQmFzZSA9IG5ldyBSYXRpb25hbCgxLCBmcHMpO1xuICAgIGN0eC5mcmFtZXJhdGUgPSBuZXcgUmF0aW9uYWwoZnBzLCAxKTtcbiAgICBjdHguZ29wU2l6ZSA9IGZwcztcbiAgICBjdHguYml0UmF0ZSA9IEJpZ0ludChiaXRyYXRlKTtcbiAgICBjdHguc2V0T3B0aW9uKFwidGhyZWFkc1wiLCBcIjRcIik7XG4gICAgaWYgKGdsb2JhbEhlYWRlcikgY3R4LnNldEZsYWdzKEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUik7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoY29kZWNPcHRzKSkgY3R4LnNldE9wdGlvbihrLCB2KTtcbiAgICBpZiAoY29kZWNUYWcpIGN0eC5jb2RlY1RhZyA9IGNvZGVjVGFnO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCBjdHgub3BlbjIoY29kZWMsIG51bGwpLCBcInZpZGVvQ3R4Lm9wZW4yXCIpO1xuXG4gICAgY29uc3Qgc3dzID0gbmV3IFNvZnR3YXJlU2NhbGVDb250ZXh0KCk7XG4gICAgc3dzLmdldENvbnRleHQod2lkdGgsIGhlaWdodCwgQVZfUElYX0ZNVF9CR1JBLCB3aWR0aCwgaGVpZ2h0LCBwaXhGbXQsIFNXU19CSUxJTkVBUik7XG5cbiAgICBjb25zdCBkc3QgPSBuZXcgRnJhbWUoKTtcbiAgICBkc3QuYWxsb2MoKTtcbiAgICBkc3QuZm9ybWF0ID0gcGl4Rm10O1xuICAgIGRzdC53aWR0aCA9IHdpZHRoO1xuICAgIGRzdC5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGRzdC5nZXRCdWZmZXIoMCksIFwiZHN0RnJhbWUuZ2V0QnVmZmVyXCIpO1xuXG4gICAgLy8gUHJlLWFsbG9jYXRlIHNyYyBmcmFtZSAoQkdSQSwgcmV1c2VkIGV2ZXJ5IGVuY29kZSlcbiAgICBjb25zdCBzcmMgPSBuZXcgRnJhbWUoKTtcbiAgICBzcmMuYWxsb2MoKTtcbiAgICBzcmMuZm9ybWF0ID0gQVZfUElYX0ZNVF9CR1JBO1xuICAgIHNyYy53aWR0aCA9IHdpZHRoO1xuICAgIHNyYy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHNyYy5nZXRCdWZmZXIoMCksIFwic3JjRnJhbWUuZ2V0QnVmZmVyXCIpO1xuXG4gICAgLy8gUHJlLWFsbG9jYXRlIHJldXNhYmxlIHBhY2tldFxuICAgIGNvbnN0IHBrdCA9IG5ldyBQYWNrZXQoKTtcbiAgICBwa3QuYWxsb2MoKTtcblxuICAgIGNvbnN0IHN0cmVhbSA9IG11eGVyLmFkZFN0cmVhbShjdHgsIGNvZGVjVGFnKTtcbiAgICByZXR1cm4gbmV3IFZpZGVvRW5jb2RlcihjdHgsIHN3cywgc3JjLCBkc3QsIHBrdCwgc3RyZWFtKTtcbiAgfVxuXG4gIGdldCBzdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmVhbTtcbiAgfVxuICBnZXQgdGltZUJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N0eC50aW1lQmFzZTtcbiAgfVxuXG4gIGFzeW5jIGVuY29kZShiZ3JhOiBCdWZmZXIsIG11eGVyOiBGb3JtYXRNdXhlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgX3NyYzogc3JjLCBfZHN0OiBkc3QsIF9zd3M6IHN3cyB9ID0gdGhpcztcblxuICAgIC8vIFJldXNlIHNyYyBmcmFtZTogbWFrZVdyaXRhYmxlICsgZnJvbUJ1ZmZlciArIHB0c1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihzcmMubWFrZVdyaXRhYmxlKCksIFwic3JjLm1ha2VXcml0YWJsZVwiKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3Ioc3JjLmZyb21CdWZmZXIoYmdyYSksIFwic3JjLmZyb21CdWZmZXJcIik7XG4gICAgc3JjLnB0cyA9IHRoaXMucHRzO1xuXG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGRzdC5tYWtlV3JpdGFibGUoKSwgXCJkc3QubWFrZVdyaXRhYmxlXCIpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCBzd3Muc2NhbGVGcmFtZShkc3QsIHNyYyksIFwic3dzLnNjYWxlRnJhbWVcIik7XG5cbiAgICBkc3QucHRzID0gdGhpcy5wdHMrKztcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fY3R4LnNlbmRGcmFtZShkc3QpLCBcInZpZGVvQ3R4LnNlbmRGcmFtZVwiKTtcbiAgICBhd2FpdCB0aGlzLmRyYWluKG11eGVyKTtcbiAgfVxuXG4gIGFzeW5jIGZsdXNoKG11eGVyOiBGb3JtYXRNdXhlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuX2N0eC5zZW5kRnJhbWUobnVsbCk7XG4gICAgYXdhaXQgdGhpcy5kcmFpbihtdXhlcik7XG4gIH1cblxuICBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIHRoaXMuX3BrdC5mcmVlKCk7XG4gICAgdGhpcy5fc3JjLmZyZWUoKTtcbiAgICB0aGlzLl9kc3QuZnJlZSgpO1xuICAgIHRoaXMuX3N3c1tTeW1ib2wuZGlzcG9zZV0oKTtcbiAgICB0aGlzLl9jdHguZnJlZUNvbnRleHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZHJhaW4obXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGt0ID0gdGhpcy5fcGt0O1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5fY3R4LnJlY2VpdmVQYWNrZXQocGt0KTtcbiAgICAgIGlmIChyID09PSBBVkVSUk9SX0VBR0FJTiB8fCByID09PSBBVkVSUk9SX0VPRikgYnJlYWs7XG4gICAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IociwgXCJ2aWRlby5yZWNlaXZlUGFja2V0XCIpO1xuICAgICAgcGt0LnN0cmVhbUluZGV4ID0gdGhpcy5fc3RyZWFtLmluZGV4O1xuICAgICAgcGt0LnJlc2NhbGVUcyh0aGlzLl9jdHgudGltZUJhc2UsIHRoaXMuX3N0cmVhbS50aW1lQmFzZSk7XG4gICAgICBhd2FpdCBtdXhlci53cml0ZVBhY2tldChwa3QpO1xuICAgICAgcGt0LnVucmVmKCk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAzLzIxLlxuXG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwibm9kZS1hdlwiO1xuaW1wb3J0IHtcbiAgQVZfTE9HX0VSUk9SLFxuICBBVl9MT0dfV0FSTklORyxcbiAgQVZfUElYX0ZNVF9ZVVZBNDIwUCxcbiAgQVZfU0FNUExFX0ZNVF9GTFQsXG4gIEFWX1NBTVBMRV9GTVRfRkxUUCxcbiAgRkZfRU5DT0RFUl9BQUMsXG4gIEZGX0VOQ09ERVJfTElCWDI2NSxcbiAgdHlwZSBGRkF1ZGlvRW5jb2RlcixcbiAgdHlwZSBGRlZpZGVvRW5jb2Rlcixcbn0gZnJvbSBcIm5vZGUtYXYvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHR5cGUgeyBWaWRlb0Zvcm1hdCB9IGZyb20gXCIuLi8uLi9yZW5kZXJlci9zY2hlbWFcIjtcbmltcG9ydCB7IENvbmN1cnJlbmN5TGltaXRlciB9IGZyb20gXCIuLi9saW1pdGVyXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQXVkaW9FbmNvZGVyIH0gZnJvbSBcIi4vYXVkaW9cIjtcbmltcG9ydCB7IEZvcm1hdE11eGVyIH0gZnJvbSBcIi4vbXV4ZXJcIjtcbmltcG9ydCB7IFZpZGVvRW5jb2RlciB9IGZyb20gXCIuL3ZpZGVvXCI7XG5cbkxvZy5zZXRDYWxsYmFjaygobGV2ZWwsIG1lc3NhZ2UpID0+IHtcbiAgY29uc3QgbXNnID0gbWVzc2FnZS50cmltRW5kKCk7XG4gIGlmICghbXNnKSByZXR1cm47XG4gIGlmIChsZXZlbCA8PSBBVl9MT0dfRVJST1IpIGxvZ2dlci5lcnJvcihtc2cpO1xuICBlbHNlIGlmIChsZXZlbCA8PSBBVl9MT0dfV0FSTklORykgbG9nZ2VyLndhcm4obXNnKTtcbn0pO1xuXG5pbnRlcmZhY2UgRm9ybWF0U3BlYyB7XG4gIHZpZGVvQ29kZWNOYW1lOiBGRlZpZGVvRW5jb2RlcjtcbiAgcGl4Rm10OiB0eXBlb2YgQVZfUElYX0ZNVF9ZVVZBNDIwUDtcbiAgY29kZWNUYWc/OiBzdHJpbmc7XG4gIGdsb2JhbEhlYWRlcjogYm9vbGVhbjtcbiAgdmlkZW9PcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBhdWRpb0NvZGVjTmFtZTogRkZBdWRpb0VuY29kZXI7XG4gIGF1ZGlvU2FtcGxlRm10OiB0eXBlb2YgQVZfU0FNUExFX0ZNVF9GTFQgfCB0eXBlb2YgQVZfU0FNUExFX0ZNVF9GTFRQO1xuICBvdXRTYW1wbGVSYXRlOiBudW1iZXI7XG59XG5cbmNvbnN0IEZPUk1BVF9TUEVDUzogUmVjb3JkPFZpZGVvRm9ybWF0LCBGb3JtYXRTcGVjPiA9IHtcbiAgbXA0OiB7XG4gICAgdmlkZW9Db2RlY05hbWU6IEZGX0VOQ09ERVJfTElCWDI2NSxcbiAgICBwaXhGbXQ6IEFWX1BJWF9GTVRfWVVWQTQyMFAsXG4gICAgY29kZWNUYWc6IFwiaHZjMVwiLFxuICAgIGdsb2JhbEhlYWRlcjogdHJ1ZSxcbiAgICB2aWRlb09wdHM6IHsgcHJlc2V0OiBcInVsdHJhZmFzdFwiLCBcIngyNjUtcGFyYW1zXCI6IFwibG9nLWxldmVsPTFcIiB9LFxuICAgIGF1ZGlvQ29kZWNOYW1lOiBGRl9FTkNPREVSX0FBQyxcbiAgICBhdWRpb1NhbXBsZUZtdDogQVZfU0FNUExFX0ZNVF9GTFRQLFxuICAgIG91dFNhbXBsZVJhdGU6IDQ0XzEwMCxcbiAgfSxcbiAgd2VibToge1xuICAgIHZpZGVvQ29kZWNOYW1lOiBcImxpYnZweC12cDlcIiBhcyBGRlZpZGVvRW5jb2RlcixcbiAgICBwaXhGbXQ6IEFWX1BJWF9GTVRfWVVWQTQyMFAsXG4gICAgZ2xvYmFsSGVhZGVyOiBmYWxzZSxcbiAgICB2aWRlb09wdHM6IHsgcXVhbGl0eTogXCJyZWFsdGltZVwiLCBcImNwdS11c2VkXCI6IFwiOFwiIH0sXG4gICAgYXVkaW9Db2RlY05hbWU6IFwibGlib3B1c1wiIGFzIEZGQXVkaW9FbmNvZGVyLFxuICAgIGF1ZGlvU2FtcGxlRm10OiBBVl9TQU1QTEVfRk1UX0ZMVCxcbiAgICBvdXRTYW1wbGVSYXRlOiA0OF8wMDAsXG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgRm9ybWF0U3RhdGUge1xuICBmb3JtYXQ6IFZpZGVvRm9ybWF0O1xuICBvdXRQYXRoOiBzdHJpbmc7XG4gIG11eGVyOiBGb3JtYXRNdXhlcjtcbiAgdmlkZW86IFZpZGVvRW5jb2RlcjtcbiAgYXVkaW8/OiBBdWRpb0VuY29kZXI7XG4gIGxpbWl0ZXI6IENvbmN1cnJlbmN5TGltaXRlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbmNvZGVyUGlwZWxpbmVPcHRpb25zIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGZwczogbnVtYmVyO1xuICBmb3JtYXRzOiBWaWRlb0Zvcm1hdFtdO1xuICBvdXREaXI6IHN0cmluZztcbiAgd2l0aEF1ZGlvPzogYm9vbGVhbjtcbiAgdmlkZW9CaXRyYXRlPzogbnVtYmVyO1xuICBhdWRpb0JpdHJhdGU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIEVuY29kZXJSZXN1bHQgPSBQYXJ0aWFsPFJlY29yZDxWaWRlb0Zvcm1hdCwgc3RyaW5nPj47XG5cbmV4cG9ydCBjbGFzcyBFbmNvZGVyUGlwZWxpbmUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0ZXM6IEZvcm1hdFN0YXRlW107XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihzdGF0ZXM6IEZvcm1hdFN0YXRlW10pIHtcbiAgICB0aGlzLl9zdGF0ZXMgPSBzdGF0ZXM7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlKHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZnBzLFxuICAgIGZvcm1hdHMsXG4gICAgb3V0RGlyLFxuICAgIHdpdGhBdWRpbyA9IGZhbHNlLFxuICAgIHZpZGVvQml0cmF0ZSA9IDhfMDAwXzAwMCxcbiAgICBhdWRpb0JpdHJhdGUgPSAxMjhfMDAwLFxuICB9OiBFbmNvZGVyUGlwZWxpbmVPcHRpb25zKTogUHJvbWlzZTxFbmNvZGVyUGlwZWxpbmU+IHtcbiAgICBjb25zdCBzdGF0ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGZvcm1hdHMubWFwKGFzeW5jIChmb3JtYXQpID0+IHtcbiAgICAgICAgY29uc3Qgc3BlYyA9IEZPUk1BVF9TUEVDU1tmb3JtYXRdO1xuICAgICAgICBjb25zdCBvdXRQYXRoID0gam9pbihvdXREaXIsIGBvdXRwdXQuJHtmb3JtYXR9YCk7XG4gICAgICAgIGNvbnN0IG11eGVyID0gbmV3IEZvcm1hdE11eGVyKG91dFBhdGgpO1xuXG4gICAgICAgIGNvbnN0IHZpZGVvID0gYXdhaXQgVmlkZW9FbmNvZGVyLmNyZWF0ZSh7XG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGZwcyxcbiAgICAgICAgICBjb2RlY05hbWU6IHNwZWMudmlkZW9Db2RlY05hbWUsXG4gICAgICAgICAgcGl4Rm10OiBzcGVjLnBpeEZtdCxcbiAgICAgICAgICBjb2RlY1RhZzogc3BlYy5jb2RlY1RhZyxcbiAgICAgICAgICBnbG9iYWxIZWFkZXI6IHNwZWMuZ2xvYmFsSGVhZGVyLFxuICAgICAgICAgIGNvZGVjT3B0czogc3BlYy52aWRlb09wdHMsXG4gICAgICAgICAgYml0cmF0ZTogdmlkZW9CaXRyYXRlLFxuICAgICAgICAgIG11eGVyLFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgYXVkaW86IEF1ZGlvRW5jb2RlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHdpdGhBdWRpbykge1xuICAgICAgICAgIGF1ZGlvID0gYXdhaXQgQXVkaW9FbmNvZGVyLmNyZWF0ZSh7XG4gICAgICAgICAgICBvdXRTYW1wbGVSYXRlOiBzcGVjLm91dFNhbXBsZVJhdGUsXG4gICAgICAgICAgICBvdXRTYW1wbGVGbXQ6IHNwZWMuYXVkaW9TYW1wbGVGbXQsXG4gICAgICAgICAgICBjb2RlY05hbWU6IHNwZWMuYXVkaW9Db2RlY05hbWUsXG4gICAgICAgICAgICBnbG9iYWxIZWFkZXI6IHNwZWMuZ2xvYmFsSGVhZGVyLFxuICAgICAgICAgICAgYml0cmF0ZTogYXVkaW9CaXRyYXRlLFxuICAgICAgICAgICAgbXV4ZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBtdXhlci5vcGVuKCk7XG4gICAgICAgIGNvbnN0IGxpbWl0ZXIgPSBuZXcgQ29uY3VycmVuY3lMaW1pdGVyKDEpO1xuICAgICAgICByZXR1cm4geyBmb3JtYXQsIG91dFBhdGgsIG11eGVyLCB2aWRlbywgYXVkaW8sIGxpbWl0ZXIgfSBzYXRpc2ZpZXMgRm9ybWF0U3RhdGU7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBuZXcgRW5jb2RlclBpcGVsaW5lKHN0YXRlcyk7XG4gIH1cblxuICBzZXR1cEF1ZGlvKHNhbXBsZVJhdGU6IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcyBvZiB0aGlzLl9zdGF0ZXMpIHtcbiAgICAgIHMuYXVkaW8/LnNldElucHV0UmF0ZShzYW1wbGVSYXRlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBlbmNvZGVGcmFtZShiZ3JhOiBCdWZmZXIsIF90aW1lc3RhbXBVczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fc3RhdGVzLm1hcCgocykgPT4gcy5saW1pdGVyLnNjaGVkdWxlKCgpID0+IHMudmlkZW8uZW5jb2RlKGJncmEsIHMubXV4ZXIpKSkpO1xuICB9XG5cbiAgYXN5bmMgZW5jb2RlQXVkaW8ocGNtOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuX3N0YXRlcy5tYXAoKHMpID0+IHtcbiAgICAgICAgaWYgKCFzLmF1ZGlvKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybiBzLmxpbWl0ZXIuc2NoZWR1bGUoKCkgPT4gcy5hdWRpbyEuZW5jb2RlKHBjbSwgcy5tdXhlcikpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaCgpOiBQcm9taXNlPEVuY29kZXJSZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHQ6IEVuY29kZXJSZXN1bHQgPSB7fTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuX3N0YXRlcy5tYXAoYXN5bmMgKHMpID0+IHtcbiAgICAgICAgYXdhaXQgcy5saW1pdGVyLmVuZCgpO1xuICAgICAgICBhd2FpdCBzLmF1ZGlvPy5mbHVzaChzLm11eGVyKTtcbiAgICAgICAgYXdhaXQgcy52aWRlby5mbHVzaChzLm11eGVyKTtcbiAgICAgICAgcmVzdWx0W3MuZm9ybWF0XSA9IHMub3V0UGF0aDtcbiAgICAgICAgdXNpbmcgX2EgPSBzLmF1ZGlvO1xuICAgICAgICB1c2luZyBfdiA9IHMudmlkZW87XG4gICAgICAgIGF3YWl0IHVzaW5nIF9tID0gcy5tdXhlcjtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIl19
1
+ import'source-map-support/register.js';import {l,z,a,b}from'./chunk-SD4UOGME.js';export{y as AbortLink,z as ConcurrencyLimiter,t as DEFAULT_DURATION,s as DEFAULT_FPS,r as DEFAULT_HEIGHT,u as DEFAULT_OUT_DIR,q as DEFAULT_WIDTH,k as Logger,n as PUP_ARGS_KEY,x as RenderSchema,v as VIDEO_FORMATS,p as exec,w as isVideoFormat,l as logger,m as noerr,o as pargs,d as parseNumber,e as parseString,c as penv,A as pup,j as pupApp,h as pupDisableGPU,f as pupLogLevel,i as pupPkgRoot,g as pupUseInnerProxy}from'./chunk-SD4UOGME.js';import {setTimeout as setTimeout$1}from'timers/promises';import {Log,FormatContext,FFmpegError,Codec,CodecContext,Rational,SoftwareScaleContext,Frame,Packet,FilterGraph,Filter,FilterInOut}from'node-av';import {AV_LOG_ERROR,AV_LOG_WARNING,AV_SAMPLE_FMT_FLT,AV_PIX_FMT_YUVA420P,AV_SAMPLE_FMT_FLTP,FF_ENCODER_AAC,FF_ENCODER_LIBX265,AV_CODEC_FLAG_GLOBAL_HEADER,AV_PIX_FMT_BGRA,SWS_BILINEAR,AVERROR_EAGAIN,AVERROR_EOF,AV_CHANNEL_LAYOUT_STEREO}from'node-av/constants';import {join}from'path';var T=class{constructor(t){this.makeValue=t;}get value(){return this._initialized||(this._value=this.makeValue(),this._initialized=true),this._value}get initialized(){return this._initialized}_initialized=false;_value};function k(c){return new Promise(t=>setTimeout(t,c))}function We(c,t){let e,r=false;async function o(a){await c(a),!r&&(e=setTimeout(()=>o(a+1),t));}return e=setTimeout(()=>o(0),t),()=>{r=true,clearTimeout(e);}}function Je({fn:c,maxAttempts:t=3,timeout:e}){let r=new Error(`timeout over ${e}ms`);return async function(...o){let a=0;for(;;)try{let i=[c(...o)];return e&&i.push(setTimeout$1(e).then(()=>{throw r})),await Promise.race(i)}catch(i){if(a++,a>=t)throw i;await k(Math.pow(2,a)*100+Math.random()*100);}}}var te={[AV_SAMPLE_FMT_FLT]:"flt",[AV_SAMPLE_FMT_FLTP]:"fltp"},g=class c{_ctx;_stream;_outRate;_outFmt;_frameSize;_pkt;_filterFrame;_graph;_bufSrc;_bufSink;_inRate;pts=0n;constructor(t,e,r){this._ctx=t,this._stream=e,this._outRate=t.sampleRate,this._outFmt=r,this._frameSize=t.frameSize,this._pkt=new Packet,this._pkt.alloc(),this._filterFrame=new Frame,this._filterFrame.alloc();}static async create(t){let{outSampleRate:e,outSampleFmt:r,codecName:o,globalHeader:a,bitrate:i,muxer:d}=t,u=Codec.findEncoderByName(o);if(!u)throw new Error(`Audio encoder not found: ${o}`);let s=new CodecContext;s.allocContext3(u),s.codecId=u.id,s.sampleFormat=r,s.sampleRate=e,s.channelLayout=AV_CHANNEL_LAYOUT_STEREO,s.timeBase=new Rational(1,e),s.bitRate=BigInt(i),a&&s.setFlags(AV_CODEC_FLAG_GLOBAL_HEADER),FFmpegError.throwIfError(await s.open2(u,null),"audioCtx.open2");let m=d.addStream(s);return new c(s,m,r)}setInputRate(t){this._disposeGraph(),this._inRate=t;let e=new FilterGraph;e.alloc();let r=Filter.getByName("abuffer"),o=`sample_rate=${t}:sample_fmt=flt:channel_layout=stereo:time_base=1/${t}`,a=e.createFilter(r,"src",o);if(!a)throw new Error("Failed to create abuffer");let i=Filter.getByName("abuffersink"),d=e.createFilter(i,"sink");if(!d)throw new Error("Failed to create abuffersink");let s=`aformat=sample_fmts=${te[this._outFmt]??"flt"}:sample_rates=${this._outRate}:channel_layouts=stereo,asetnsamples=n=${this._frameSize}:p=1`,m=FilterInOut.createList([{name:"in",filterCtx:a,padIdx:0}]),p=FilterInOut.createList([{name:"out",filterCtx:d,padIdx:0}]);FFmpegError.throwIfError(e.parsePtr(s,p,m),"graph.parsePtr"),FFmpegError.throwIfError(e.configSync(),"graph.config"),this._graph=e,this._bufSrc=a,this._bufSink=d;}get stream(){return this._stream}get timeBase(){return this._ctx.timeBase}async encode(t,e){var i=[];try{if(!this._bufSrc||!this._bufSink||!this._inRate)return;let r=new Float32Array(t.buffer,t.byteOffset,t.byteLength/4);for(let m=0;m<r.length;m++)isFinite(r[m])||(r[m]=0);let o=r.length>>1;let a$1=a(i,Frame.fromAudioBuffer(Buffer.from(r.buffer,r.byteOffset,r.byteLength),{nbSamples:o,format:AV_SAMPLE_FMT_FLT,sampleRate:this._inRate,channelLayout:AV_CHANNEL_LAYOUT_STEREO,pts:this.pts,timeBase:{num:1,den:this._inRate}}));this.pts+=BigInt(o);FFmpegError.throwIfError(await this._bufSrc.buffersrcAddFrame(a$1),"buffersrcAddFrame");await this._drainFilter(e);}catch(d){var u=d,s=true;}finally{b(i,u,s);}}async flush(t){this._bufSrc&&this._bufSink&&(await this._bufSrc.buffersrcAddFrame(null),await this._drainFilter(t)),await this._ctx.sendFrame(null),await this._drainCodec(t);}[Symbol.dispose](){this._pkt.free(),this._filterFrame.free(),this._disposeGraph(),this._ctx.freeContext();}async _drainFilter(t){let e=this._filterFrame;for(;;){let r=await this._bufSink.buffersinkGetFrame(e);if(r===AVERROR_EAGAIN||r===AVERROR_EOF)break;FFmpegError.throwIfError(r,"buffersinkGetFrame"),FFmpegError.throwIfError(await this._ctx.sendFrame(e),"audioCtx.sendFrame"),e.unref(),await this._drainCodec(t);}}async _drainCodec(t){let e=this._pkt;for(;;){let r=await this._ctx.receivePacket(e);if(r===AVERROR_EAGAIN||r===AVERROR_EOF)break;FFmpegError.throwIfError(r,"audio.receivePacket"),e.streamIndex=this._stream.index,e.rescaleTs(this._ctx.timeBase,this._stream.timeBase),await t.writePacket(e),e.unref();}}_disposeGraph(){this._graph?.[Symbol.dispose](),this._graph=void 0,this._bufSrc=void 0,this._bufSink=void 0;}};var v=class{_ctx;_opened=false;constructor(t){this._ctx=new FormatContext,FFmpegError.throwIfError(this._ctx.allocOutputContext2(null,null,t),"allocOutputContext2");}addStream(t,e){let r=this._ctx.newStream(null);return r.timeBase=t.timeBase,FFmpegError.throwIfError(r.codecpar.fromContext(t),"codecpar.fromContext"),e&&(r.codecpar.codecTag=e),r}async open(){this._opened||(FFmpegError.throwIfError(await this._ctx.openOutput(),"openOutput"),FFmpegError.throwIfError(await this._ctx.writeHeader(null),"writeHeader"),this._opened=true);}async writePacket(t){FFmpegError.throwIfError(await this._ctx.interleavedWriteFrame(t),"interleavedWriteFrame");}async finish(){this._opened&&(await this._ctx.writeTrailer(),await this._ctx.closeOutput(),this._opened=false);}async[Symbol.asyncDispose](){await this.finish(),await this._ctx[Symbol.asyncDispose]();}};var S=class c{_ctx;_sws;_src;_dst;_pkt;_stream;pts=0n;constructor(t,e,r,o,a,i){this._ctx=t,this._sws=e,this._src=r,this._dst=o,this._pkt=a,this._stream=i;}static async create(t){let{width:e,height:r,fps:o,codecName:a,pixFmt:i,codecTag:d,globalHeader:u,codecOpts:s,bitrate:m,muxer:p}=t,h=Codec.findEncoderByName(a);if(!h)throw new Error(`Video encoder not found: ${a}`);let n=new CodecContext;n.allocContext3(h),n.codecId=h.id,n.width=e,n.height=r,n.pixelFormat=i,n.timeBase=new Rational(1,o),n.framerate=new Rational(o,1),n.gopSize=o,n.bitRate=BigInt(m),n.setOption("threads","4"),u&&n.setFlags(AV_CODEC_FLAG_GLOBAL_HEADER);for(let[W,X]of Object.entries(s))n.setOption(W,X);d&&(n.codecTag=d),FFmpegError.throwIfError(await n.open2(h,null),"videoCtx.open2");let y=new SoftwareScaleContext;y.getContext(e,r,AV_PIX_FMT_BGRA,e,r,i,SWS_BILINEAR);let f=new Frame;f.alloc(),f.format=i,f.width=e,f.height=r,FFmpegError.throwIfError(f.getBuffer(0),"dstFrame.getBuffer");let _=new Frame;_.alloc(),_.format=AV_PIX_FMT_BGRA,_.width=e,_.height=r,FFmpegError.throwIfError(_.getBuffer(0),"srcFrame.getBuffer");let C=new Packet;C.alloc();let U=p.addStream(n,d);return new c(n,y,_,f,C,U)}get stream(){return this._stream}get timeBase(){return this._ctx.timeBase}async encode(t,e){let{_src:r,_dst:o,_sws:a}=this;FFmpegError.throwIfError(r.makeWritable(),"src.makeWritable"),FFmpegError.throwIfError(r.fromBuffer(t),"src.fromBuffer"),r.pts=this.pts,FFmpegError.throwIfError(o.makeWritable(),"dst.makeWritable"),FFmpegError.throwIfError(await a.scaleFrame(o,r),"sws.scaleFrame"),o.pts=this.pts++,FFmpegError.throwIfError(await this._ctx.sendFrame(o),"videoCtx.sendFrame"),await this.drain(e);}async flush(t){await this._ctx.sendFrame(null),await this.drain(t);}[Symbol.dispose](){this._pkt.free(),this._src.free(),this._dst.free(),this._sws[Symbol.dispose](),this._ctx.freeContext();}async drain(t){let e=this._pkt;for(;;){let r=await this._ctx.receivePacket(e);if(r===AVERROR_EAGAIN||r===AVERROR_EOF)break;FFmpegError.throwIfError(r,"video.receivePacket"),e.streamIndex=this._stream.index,e.rescaleTs(this._ctx.timeBase,this._stream.timeBase),await t.writePacket(e),e.unref();}}};Log.setCallback((c,t)=>{let e=t.trimEnd();e&&(c<=AV_LOG_ERROR?l.error(e):c<=AV_LOG_WARNING&&l.warn(e));});var we={mp4:{videoCodecName:FF_ENCODER_LIBX265,pixFmt:AV_PIX_FMT_YUVA420P,codecTag:"hvc1",globalHeader:true,videoOpts:{preset:"ultrafast","x265-params":"log-level=1"},audioCodecName:FF_ENCODER_AAC,audioSampleFmt:AV_SAMPLE_FMT_FLTP,outSampleRate:44100},webm:{videoCodecName:"libvpx-vp9",pixFmt:AV_PIX_FMT_YUVA420P,globalHeader:false,videoOpts:{quality:"realtime","cpu-used":"8"},audioCodecName:"libopus",audioSampleFmt:AV_SAMPLE_FMT_FLT,outSampleRate:48e3}},$=class c{_states;constructor(t){this._states=t;}static async create({width:t,height:e,fps:r,formats:o,outDir:a,withAudio:i=false,videoBitrate:d=8e6,audioBitrate:u=128e3}){let s=await Promise.all(o.map(async m=>{let p=we[m],h=join(a,`output.${m}`),n=new v(h),y=await S.create({width:t,height:e,fps:r,codecName:p.videoCodecName,pixFmt:p.pixFmt,codecTag:p.codecTag,globalHeader:p.globalHeader,codecOpts:p.videoOpts,bitrate:d,muxer:n}),f;i&&(f=await g.create({outSampleRate:p.outSampleRate,outSampleFmt:p.audioSampleFmt,codecName:p.audioCodecName,globalHeader:p.globalHeader,bitrate:u,muxer:n})),await n.open();let _=new z(1);return {format:m,outPath:h,muxer:n,video:y,audio:f,limiter:_}}));return new c(s)}setupAudio(t){for(let e of this._states)e.audio?.setInputRate(t);}async encodeFrame(t,e){await Promise.all(this._states.map(r=>r.limiter.schedule(()=>r.video.encode(t,r.muxer))));}async encodeAudio(t){await Promise.all(this._states.map(e=>e.audio?e.limiter.schedule(()=>e.audio.encode(t,e.muxer)):Promise.resolve()));}async finish(){let t={};return await Promise.all(this._states.map(async e=>{var i=[];try{await e.limiter.end();await e.audio?.flush(e.muxer);await e.video.flush(e.muxer);t[e.format]=e.outPath;let r=a(i,e.audio);let o=a(i,e.video);let a$1=a(i,e.muxer,!0);}catch(d){var u=d,s=true;}finally{var m=b(i,u,s);m&&await m;}})),t}};export{$ as EncoderPipeline,v as FormatMuxer,T as Lazy,We as periodical,k as sleep,Je as useRetry};//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlL2xhenkudHMiLCIuLi9zcmMvYmFzZS90aW1pbmcudHMiLCIuLi9zcmMvYmFzZS9yZXRyeS50cyIsIi4uL3NyYy9iYXNlL2VuY29kZXIvYXVkaW8udHMiLCIuLi9zcmMvYmFzZS9lbmNvZGVyL211eGVyLnRzIiwiLi4vc3JjL2Jhc2UvZW5jb2Rlci92aWRlby50cyIsIi4uL3NyYy9iYXNlL2VuY29kZXIvZW5jb2Rlci50cyJdLCJuYW1lcyI6WyJMYXp5IiwibWFrZVZhbHVlIiwic2xlZXAiLCJtcyIsInJlc29sdmUiLCJwZXJpb2RpY2FsIiwiY2FsbGJhY2siLCJ0b2tlbiIsImNsb3NlZCIsInRpY2siLCJjb3VudCIsInVzZVJldHJ5IiwiZm4iLCJtYXhBdHRlbXB0cyIsInRpbWVvdXQiLCJ0aW1lb3V0RXJyb3IiLCJhcmdzIiwiYXR0ZW1wdCIsInByb21pc2VzIiwic2V0VGltZW91dCIsImUiLCJTQU1QTEVfRk1UX05BTUUiLCJBVl9TQU1QTEVfRk1UX0ZMVCIsIkFWX1NBTVBMRV9GTVRfRkxUUCIsIkF1ZGlvRW5jb2RlciIsIl9BdWRpb0VuY29kZXIiLCJjdHgiLCJzdHJlYW0iLCJvdXRGbXQiLCJQYWNrZXQiLCJGcmFtZSIsIm9wdHMiLCJvdXRTYW1wbGVSYXRlIiwib3V0U2FtcGxlRm10IiwiY29kZWNOYW1lIiwiZ2xvYmFsSGVhZGVyIiwiYml0cmF0ZSIsIm11eGVyIiwiY29kZWMiLCJDb2RlYyIsIkNvZGVjQ29udGV4dCIsIkFWX0NIQU5ORUxfTEFZT1VUX1NURVJFTyIsIlJhdGlvbmFsIiwiQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSIiwiRkZtcGVnRXJyb3IiLCJpblNhbXBsZVJhdGUiLCJncmFwaCIsIkZpbHRlckdyYXBoIiwiYWJ1ZmZlciIsIkZpbHRlciIsInNyY0FyZ3MiLCJidWZTcmMiLCJhYnVmZmVyc2luayIsImJ1ZlNpbmsiLCJmaWx0ZXJEZXNjIiwib3V0cHV0cyIsIkZpbHRlckluT3V0IiwiaW5wdXRzIiwicGNtIiwiX3N0YWNrIiwic3JjIiwiaSIsIm5TYW1wbGVzIiwiZnJhbWUiLCJfX3VzaW5nIiwiXyIsIl9lcnJvciIsIl9oYXNFcnJvciIsIl9fY2FsbERpc3Bvc2UiLCJvdXRGcmFtZSIsIkFWRVJST1JfRUFHQUlOIiwiQVZFUlJPUl9FT0YiLCJwa3QiLCJGb3JtYXRNdXhlciIsIm91dFBhdGgiLCJGb3JtYXRDb250ZXh0IiwiY29kZWNDdHgiLCJjb2RlY1RhZyIsIlZpZGVvRW5jb2RlciIsIl9WaWRlb0VuY29kZXIiLCJzd3MiLCJkc3QiLCJ3aWR0aCIsImhlaWdodCIsImZwcyIsInBpeEZtdCIsImNvZGVjT3B0cyIsImsiLCJ2IiwiU29mdHdhcmVTY2FsZUNvbnRleHQiLCJBVl9QSVhfRk1UX0JHUkEiLCJTV1NfQklMSU5FQVIiLCJiZ3JhIiwiTG9nIiwibGV2ZWwiLCJtZXNzYWdlIiwibXNnIiwiQVZfTE9HX0VSUk9SIiwibG9nZ2VyIiwiQVZfTE9HX1dBUk5JTkciLCJGT1JNQVRfU1BFQ1MiLCJGRl9FTkNPREVSX0xJQlgyNjUiLCJBVl9QSVhfRk1UX1lVVkE0MjBQIiwiRkZfRU5DT0RFUl9BQUMiLCJFbmNvZGVyUGlwZWxpbmUiLCJfRW5jb2RlclBpcGVsaW5lIiwic3RhdGVzIiwiZm9ybWF0cyIsIm91dERpciIsIndpdGhBdWRpbyIsInZpZGVvQml0cmF0ZSIsImF1ZGlvQml0cmF0ZSIsImZvcm1hdCIsInNwZWMiLCJqb2luIiwidmlkZW8iLCJhdWRpbyIsImxpbWl0ZXIiLCJDb25jdXJyZW5jeUxpbWl0ZXIiLCJzYW1wbGVSYXRlIiwicyIsIl90aW1lc3RhbXBVcyIsInJlc3VsdCIsIl9hIiwiX3YiLCJfbSIsIl9wcm9taXNlIl0sIm1hcHBpbmdzIjoiKytCQUVPLElBQU1BLENBQUFBLENBQU4sS0FBYyxDQUNuQixXQUFBLENBQXFCQyxDQUFBQSxDQUFvQixDQUFwQixJQUFBLENBQUEsU0FBQSxDQUFBQSxFQUFxQixDQUUxQyxJQUFJLEtBQUEsRUFBVyxDQUNiLE9BQUssSUFBQSxDQUFLLFlB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QUEsQ0FBQUUsQ0FBQUEsQ0FBQSxrQkFBQTJELENBQUFBLENBQUExRCxDQUFBQSxDQUFBVCxDQUFBQSxDQUFBTyxDQUFBQSxDQUFBQyxDQUFBQSxDQUFBQSxDQUFBMkQsQ0FBQUEsRUFBQSxNQUFBQSxFQUFBQSxDQUdGLENBQUMsQ0FDSCxDQUFBLENBQ09KLENBQ1QsQ0FDRiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDEvMzAuXG5cbmV4cG9ydCBjbGFzcyBMYXp5PFQ+IHtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgbWFrZVZhbHVlOiAoKSA9PiBUKSB7fVxuXG4gIGdldCB2YWx1ZSgpOiBUIHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMubWFrZVZhbHVlKCk7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92YWx1ZSE7XG4gIH1cblxuICBnZXQgaW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdmFsdWU6IFQgfCB1bmRlZmluZWQ7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcmlvZGljYWwoY2FsbGJhY2s6IChjb3VudDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCwgbXM6IG51bWJlcikge1xuICBsZXQgdG9rZW46IE5vZGVKUy5UaW1lb3V0O1xuICBsZXQgY2xvc2VkID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIHRpY2soY291bnQ6IG51bWJlcikge1xuICAgIGF3YWl0IGNhbGxiYWNrKGNvdW50KTtcbiAgICBpZiAoY2xvc2VkKSByZXR1cm47XG4gICAgdG9rZW4gPSBzZXRUaW1lb3V0KCgpID0+IHRpY2soY291bnQgKyAxKSwgbXMpO1xuICB9XG4gIHRva2VuID0gc2V0VGltZW91dCgoKSA9PiB0aWNrKDApLCBtcyk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQodG9rZW4pO1xuICB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wNS5cblxuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gXCJ0aW1lcnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIi4vdGltaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zPEFyZ3MgZXh0ZW5kcyBhbnlbXSwgUmV0PiB7XG4gIGZuOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXQ+O1xuICBtYXhBdHRlbXB0cz86IG51bWJlcjtcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJldHJ5PEFyZ3MgZXh0ZW5kcyBhbnlbXSwgUmV0Pih7IGZuLCBtYXhBdHRlbXB0cyA9IDMsIHRpbWVvdXQgfTogUmV0cnlPcHRpb25zPEFyZ3MsIFJldD4pIHtcbiAgY29uc3QgdGltZW91dEVycm9yID0gbmV3IEVycm9yKGB0aW1lb3V0IG92ZXIgJHt0aW1lb3V0fW1zYCk7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoLi4uYXJnczogQXJncykge1xuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbZm4oLi4uYXJncyldO1xuICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRpbWVvdXQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyB0aW1lb3V0RXJyb3I7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UocHJvbWlzZXMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgIGlmIChhdHRlbXB0ID49IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzbGVlcChNYXRoLnBvdygyLCBhdHRlbXB0KSAqIDEwMCArIE1hdGgucmFuZG9tKCkgKiAxMDApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDMvMjEuXG5cbmltcG9ydCB7XG4gIENvZGVjLFxuICBDb2RlY0NvbnRleHQsXG4gIEZGbXBlZ0Vycm9yLFxuICBGaWx0ZXIsXG4gIEZpbHRlckdyYXBoLFxuICBGaWx0ZXJJbk91dCxcbiAgRnJhbWUsXG4gIFBhY2tldCxcbiAgUmF0aW9uYWwsXG4gIHR5cGUgRmlsdGVyQ29udGV4dCxcbn0gZnJvbSBcIm5vZGUtYXZcIjtcbmltcG9ydCB7XG4gIEFWX0NIQU5ORUxfTEFZT1VUX1NURVJFTyxcbiAgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSLFxuICBBVl9TQU1QTEVfRk1UX0ZMVCxcbiAgQVZfU0FNUExFX0ZNVF9GTFRQLFxuICBBVkVSUk9SX0VBR0FJTixcbiAgQVZFUlJPUl9FT0YsXG4gIHR5cGUgRkZBdWRpb0VuY29kZXIsXG59IGZyb20gXCJub2RlLWF2L2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBGb3JtYXRNdXhlciB9IGZyb20gXCIuL211eGVyXCI7XG5cbmNvbnN0IFNBTVBMRV9GTVRfTkFNRTogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgW0FWX1NBTVBMRV9GTVRfRkxUXTogXCJmbHRcIixcbiAgW0FWX1NBTVBMRV9GTVRfRkxUUF06IFwiZmx0cFwiLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBBdWRpb0VuY29kZXJPcHRpb25zIHtcbiAgb3V0U2FtcGxlUmF0ZTogbnVtYmVyO1xuICBvdXRTYW1wbGVGbXQ6IHR5cGVvZiBBVl9TQU1QTEVfRk1UX0ZMVCB8IHR5cGVvZiBBVl9TQU1QTEVfRk1UX0ZMVFA7XG4gIGNvZGVjTmFtZTogRkZBdWRpb0VuY29kZXI7XG4gIGdsb2JhbEhlYWRlcjogYm9vbGVhbjtcbiAgYml0cmF0ZTogbnVtYmVyO1xuICBtdXhlcjogRm9ybWF0TXV4ZXI7XG59XG5cbnR5cGUgU3RyZWFtID0gUmV0dXJuVHlwZTxpbXBvcnQoXCJub2RlLWF2XCIpLkZvcm1hdENvbnRleHRbXCJuZXdTdHJlYW1cIl0+O1xuXG5leHBvcnQgY2xhc3MgQXVkaW9FbmNvZGVyIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2N0eDogQ29kZWNDb250ZXh0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9zdHJlYW06IFN0cmVhbTtcbiAgcHJpdmF0ZSByZWFkb25seSBfb3V0UmF0ZTogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vdXRGbXQ6IHR5cGVvZiBBVl9TQU1QTEVfRk1UX0ZMVCB8IHR5cGVvZiBBVl9TQU1QTEVfRk1UX0ZMVFA7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZyYW1lU2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wa3Q6IFBhY2tldDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyRnJhbWU6IEZyYW1lO1xuXG4gIHByaXZhdGUgX2dyYXBoPzogRmlsdGVyR3JhcGg7XG4gIHByaXZhdGUgX2J1ZlNyYz86IEZpbHRlckNvbnRleHQ7XG4gIHByaXZhdGUgX2J1ZlNpbms/OiBGaWx0ZXJDb250ZXh0O1xuICBwcml2YXRlIF9pblJhdGU/OiBudW1iZXI7XG4gIHB0cyA9IDBuO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoY3R4OiBDb2RlY0NvbnRleHQsIHN0cmVhbTogU3RyZWFtLCBvdXRGbXQ6IHR5cGVvZiBBVl9TQU1QTEVfRk1UX0ZMVCB8IHR5cGVvZiBBVl9TQU1QTEVfRk1UX0ZMVFApIHtcbiAgICB0aGlzLl9jdHggPSBjdHg7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuX291dFJhdGUgPSBjdHguc2FtcGxlUmF0ZTtcbiAgICB0aGlzLl9vdXRGbXQgPSBvdXRGbXQ7XG4gICAgdGhpcy5fZnJhbWVTaXplID0gY3R4LmZyYW1lU2l6ZTtcblxuICAgIHRoaXMuX3BrdCA9IG5ldyBQYWNrZXQoKTtcbiAgICB0aGlzLl9wa3QuYWxsb2MoKTtcblxuICAgIHRoaXMuX2ZpbHRlckZyYW1lID0gbmV3IEZyYW1lKCk7XG4gICAgdGhpcy5fZmlsdGVyRnJhbWUuYWxsb2MoKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUob3B0czogQXVkaW9FbmNvZGVyT3B0aW9ucyk6IFByb21pc2U8QXVkaW9FbmNvZGVyPiB7XG4gICAgY29uc3QgeyBvdXRTYW1wbGVSYXRlLCBvdXRTYW1wbGVGbXQsIGNvZGVjTmFtZSwgZ2xvYmFsSGVhZGVyLCBiaXRyYXRlLCBtdXhlciB9ID0gb3B0cztcblxuICAgIGNvbnN0IGNvZGVjID0gQ29kZWMuZmluZEVuY29kZXJCeU5hbWUoY29kZWNOYW1lKTtcbiAgICBpZiAoIWNvZGVjKSB0aHJvdyBuZXcgRXJyb3IoYEF1ZGlvIGVuY29kZXIgbm90IGZvdW5kOiAke2NvZGVjTmFtZX1gKTtcblxuICAgIGNvbnN0IGN0eCA9IG5ldyBDb2RlY0NvbnRleHQoKTtcbiAgICBjdHguYWxsb2NDb250ZXh0Myhjb2RlYyk7XG4gICAgY3R4LmNvZGVjSWQgPSBjb2RlYy5pZDtcbiAgICBjdHguc2FtcGxlRm9ybWF0ID0gb3V0U2FtcGxlRm10O1xuICAgIGN0eC5zYW1wbGVSYXRlID0gb3V0U2FtcGxlUmF0ZTtcbiAgICBjdHguY2hhbm5lbExheW91dCA9IEFWX0NIQU5ORUxfTEFZT1VUX1NURVJFTztcbiAgICBjdHgudGltZUJhc2UgPSBuZXcgUmF0aW9uYWwoMSwgb3V0U2FtcGxlUmF0ZSk7XG4gICAgY3R4LmJpdFJhdGUgPSBCaWdJbnQoYml0cmF0ZSk7XG4gICAgaWYgKGdsb2JhbEhlYWRlcikgY3R4LnNldEZsYWdzKEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUik7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IGN0eC5vcGVuMihjb2RlYywgbnVsbCksIFwiYXVkaW9DdHgub3BlbjJcIik7XG5cbiAgICBjb25zdCBzdHJlYW0gPSBtdXhlci5hZGRTdHJlYW0oY3R4KTtcbiAgICByZXR1cm4gbmV3IEF1ZGlvRW5jb2RlcihjdHgsIHN0cmVhbSwgb3V0U2FtcGxlRm10KTtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgb25jZSB3aGVuIGF1ZGlvLW1ldGEgYXJyaXZlcyB3aXRoIHRoZSBwYWdlJ3MgYWN0dWFsIHNhbXBsZSByYXRlLiAqL1xuICBzZXRJbnB1dFJhdGUoaW5TYW1wbGVSYXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9kaXNwb3NlR3JhcGgoKTtcbiAgICB0aGlzLl9pblJhdGUgPSBpblNhbXBsZVJhdGU7XG5cbiAgICBjb25zdCBncmFwaCA9IG5ldyBGaWx0ZXJHcmFwaCgpO1xuICAgIGdyYXBoLmFsbG9jKCk7XG5cbiAgICAvLyBhYnVmZmVyIHNvdXJjZTogaW50ZXJsZWF2ZWQgc3RlcmVvIGZsb2F0IGZyb20gYnJvd3NlclxuICAgIGNvbnN0IGFidWZmZXIgPSBGaWx0ZXIuZ2V0QnlOYW1lKFwiYWJ1ZmZlclwiKSE7XG4gICAgY29uc3Qgc3JjQXJncyA9IGBzYW1wbGVfcmF0ZT0ke2luU2FtcGxlUmF0ZX06c2FtcGxlX2ZtdD1mbHQ6Y2hhbm5lbF9sYXlvdXQ9c3RlcmVvOnRpbWVfYmFzZT0xLyR7aW5TYW1wbGVSYXRlfWA7XG4gICAgY29uc3QgYnVmU3JjID0gZ3JhcGguY3JlYXRlRmlsdGVyKGFidWZmZXIsIFwic3JjXCIsIHNyY0FyZ3MpO1xuICAgIGlmICghYnVmU3JjKSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gY3JlYXRlIGFidWZmZXJcIik7XG5cbiAgICAvLyBhYnVmZmVyc2lua1xuICAgIGNvbnN0IGFidWZmZXJzaW5rID0gRmlsdGVyLmdldEJ5TmFtZShcImFidWZmZXJzaW5rXCIpITtcbiAgICBjb25zdCBidWZTaW5rID0gZ3JhcGguY3JlYXRlRmlsdGVyKGFidWZmZXJzaW5rLCBcInNpbmtcIik7XG4gICAgaWYgKCFidWZTaW5rKSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gY3JlYXRlIGFidWZmZXJzaW5rXCIpO1xuXG4gICAgLy8gUGFyc2UgZmlsdGVyIGNoYWluOiBhZm9ybWF0ICsgYXNldG5zYW1wbGVzXG4gICAgY29uc3QgZm10TmFtZSA9IFNBTVBMRV9GTVRfTkFNRVt0aGlzLl9vdXRGbXRdID8/IFwiZmx0XCI7XG4gICAgY29uc3QgZmlsdGVyRGVzYyA9IGBhZm9ybWF0PXNhbXBsZV9mbXRzPSR7Zm10TmFtZX06c2FtcGxlX3JhdGVzPSR7dGhpcy5fb3V0UmF0ZX06Y2hhbm5lbF9sYXlvdXRzPXN0ZXJlbyxhc2V0bnNhbXBsZXM9bj0ke3RoaXMuX2ZyYW1lU2l6ZX06cD0xYDtcblxuICAgIGNvbnN0IG91dHB1dHMgPSBGaWx0ZXJJbk91dC5jcmVhdGVMaXN0KFt7IG5hbWU6IFwiaW5cIiwgZmlsdGVyQ3R4OiBidWZTcmMsIHBhZElkeDogMCB9XSk7XG4gICAgY29uc3QgaW5wdXRzID0gRmlsdGVySW5PdXQuY3JlYXRlTGlzdChbeyBuYW1lOiBcIm91dFwiLCBmaWx0ZXJDdHg6IGJ1ZlNpbmssIHBhZElkeDogMCB9XSk7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGdyYXBoLnBhcnNlUHRyKGZpbHRlckRlc2MsIGlucHV0cywgb3V0cHV0cyksIFwiZ3JhcGgucGFyc2VQdHJcIik7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGdyYXBoLmNvbmZpZ1N5bmMoKSwgXCJncmFwaC5jb25maWdcIik7XG5cbiAgICB0aGlzLl9ncmFwaCA9IGdyYXBoO1xuICAgIHRoaXMuX2J1ZlNyYyA9IGJ1ZlNyYztcbiAgICB0aGlzLl9idWZTaW5rID0gYnVmU2luaztcbiAgfVxuXG4gIGdldCBzdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmVhbTtcbiAgfVxuICBnZXQgdGltZUJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N0eC50aW1lQmFzZTtcbiAgfVxuXG4gIGFzeW5jIGVuY29kZShwY206IEJ1ZmZlciwgbXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9idWZTcmMgfHwgIXRoaXMuX2J1ZlNpbmsgfHwgIXRoaXMuX2luUmF0ZSkgcmV0dXJuO1xuXG4gICAgLy8gSW4tcGxhY2Ugc2FuaXRpemUg4oCUIG11dGF0ZSBzb3VyY2UgZGlyZWN0bHksIG5vIGNvcHlcbiAgICBjb25zdCBzcmMgPSBuZXcgRmxvYXQzMkFycmF5KHBjbS5idWZmZXIsIHBjbS5ieXRlT2Zmc2V0LCBwY20uYnl0ZUxlbmd0aCAvIDQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWlzRmluaXRlKHNyY1tpXSEpKSBzcmNbaV0gPSAwO1xuICAgIH1cbiAgICBjb25zdCBuU2FtcGxlcyA9IHNyYy5sZW5ndGggPj4gMTtcblxuICAgIHVzaW5nIGZyYW1lID0gRnJhbWUuZnJvbUF1ZGlvQnVmZmVyKEJ1ZmZlci5mcm9tKHNyYy5idWZmZXIsIHNyYy5ieXRlT2Zmc2V0LCBzcmMuYnl0ZUxlbmd0aCksIHtcbiAgICAgIG5iU2FtcGxlczogblNhbXBsZXMsXG4gICAgICBmb3JtYXQ6IEFWX1NBTVBMRV9GTVRfRkxULFxuICAgICAgc2FtcGxlUmF0ZTogdGhpcy5faW5SYXRlLFxuICAgICAgY2hhbm5lbExheW91dDogQVZfQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLFxuICAgICAgcHRzOiB0aGlzLnB0cyxcbiAgICAgIHRpbWVCYXNlOiB7IG51bTogMSwgZGVuOiB0aGlzLl9pblJhdGUgfSxcbiAgICB9KTtcbiAgICB0aGlzLnB0cyArPSBCaWdJbnQoblNhbXBsZXMpO1xuXG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IHRoaXMuX2J1ZlNyYy5idWZmZXJzcmNBZGRGcmFtZShmcmFtZSksIFwiYnVmZmVyc3JjQWRkRnJhbWVcIik7XG4gICAgYXdhaXQgdGhpcy5fZHJhaW5GaWx0ZXIobXV4ZXIpO1xuICB9XG5cbiAgYXN5bmMgZmx1c2gobXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2J1ZlNyYyAmJiB0aGlzLl9idWZTaW5rKSB7XG4gICAgICAvLyBTaWduYWwgRU9GIHRvIGZpbHRlciBncmFwaFxuICAgICAgYXdhaXQgdGhpcy5fYnVmU3JjLmJ1ZmZlcnNyY0FkZEZyYW1lKG51bGwpO1xuICAgICAgYXdhaXQgdGhpcy5fZHJhaW5GaWx0ZXIobXV4ZXIpO1xuICAgIH1cbiAgICAvLyBGbHVzaCBjb2RlY1xuICAgIGF3YWl0IHRoaXMuX2N0eC5zZW5kRnJhbWUobnVsbCk7XG4gICAgYXdhaXQgdGhpcy5fZHJhaW5Db2RlYyhtdXhlcik7XG4gIH1cblxuICBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIHRoaXMuX3BrdC5mcmVlKCk7XG4gICAgdGhpcy5fZmlsdGVyRnJhbWUuZnJlZSgpO1xuICAgIHRoaXMuX2Rpc3Bvc2VHcmFwaCgpO1xuICAgIHRoaXMuX2N0eC5mcmVlQ29udGV4dCgpO1xuICB9XG5cbiAgLyoqIERyYWluIGZpbHRlciDihpIgc2VuZCB0byBjb2RlYyDihpIgZHJhaW4gY29kZWMgcGFja2V0cy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBfZHJhaW5GaWx0ZXIobXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3V0RnJhbWUgPSB0aGlzLl9maWx0ZXJGcmFtZTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuX2J1ZlNpbmshLmJ1ZmZlcnNpbmtHZXRGcmFtZShvdXRGcmFtZSk7XG4gICAgICBpZiAociA9PT0gQVZFUlJPUl9FQUdBSU4gfHwgciA9PT0gQVZFUlJPUl9FT0YpIGJyZWFrO1xuICAgICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHIsIFwiYnVmZmVyc2lua0dldEZyYW1lXCIpO1xuICAgICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IHRoaXMuX2N0eC5zZW5kRnJhbWUob3V0RnJhbWUpLCBcImF1ZGlvQ3R4LnNlbmRGcmFtZVwiKTtcbiAgICAgIG91dEZyYW1lLnVucmVmKCk7XG4gICAgICBhd2FpdCB0aGlzLl9kcmFpbkNvZGVjKG11eGVyKTtcbiAgICB9XG4gIH1cblxuICAvKiogRHJhaW4gY29kZWMgcGFja2V0cyB0byBtdXhlci4gKi9cbiAgcHJpdmF0ZSBhc3luYyBfZHJhaW5Db2RlYyhtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwa3QgPSB0aGlzLl9wa3Q7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLl9jdHgucmVjZWl2ZVBhY2tldChwa3QpO1xuICAgICAgaWYgKHIgPT09IEFWRVJST1JfRUFHQUlOIHx8IHIgPT09IEFWRVJST1JfRU9GKSBicmVhaztcbiAgICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihyLCBcImF1ZGlvLnJlY2VpdmVQYWNrZXRcIik7XG4gICAgICBwa3Quc3RyZWFtSW5kZXggPSB0aGlzLl9zdHJlYW0uaW5kZXg7XG4gICAgICBwa3QucmVzY2FsZVRzKHRoaXMuX2N0eC50aW1lQmFzZSwgdGhpcy5fc3RyZWFtLnRpbWVCYXNlKTtcbiAgICAgIGF3YWl0IG11eGVyLndyaXRlUGFja2V0KHBrdCk7XG4gICAgICBwa3QudW5yZWYoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kaXNwb3NlR3JhcGgoKTogdm9pZCB7XG4gICAgLy8gRmlsdGVyR3JhcGguZnJlZSgpIHJlbGVhc2VzIGFsbCBjb250YWluZWQgZmlsdGVyIGNvbnRleHRzXG4gICAgdGhpcy5fZ3JhcGg/LltTeW1ib2wuZGlzcG9zZV0oKTtcbiAgICB0aGlzLl9ncmFwaCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9idWZTcmMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fYnVmU2luayA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29kZWNDb250ZXh0LCBGRm1wZWdFcnJvciwgRm9ybWF0Q29udGV4dCwgUGFja2V0IH0gZnJvbSBcIm5vZGUtYXZcIjtcblxuZXhwb3J0IGNsYXNzIEZvcm1hdE11eGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3R4OiBGb3JtYXRDb250ZXh0O1xuICBwcml2YXRlIF9vcGVuZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihvdXRQYXRoOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jdHggPSBuZXcgRm9ybWF0Q29udGV4dCgpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcih0aGlzLl9jdHguYWxsb2NPdXRwdXRDb250ZXh0MihudWxsLCBudWxsLCBvdXRQYXRoKSwgXCJhbGxvY091dHB1dENvbnRleHQyXCIpO1xuICB9XG5cbiAgYWRkU3RyZWFtKGNvZGVjQ3R4OiBDb2RlY0NvbnRleHQsIGNvZGVjVGFnPzogc3RyaW5nKTogUmV0dXJuVHlwZTxGb3JtYXRDb250ZXh0W1wibmV3U3RyZWFtXCJdPiB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fY3R4Lm5ld1N0cmVhbShudWxsKTtcbiAgICBzdHJlYW0udGltZUJhc2UgPSBjb2RlY0N0eC50aW1lQmFzZTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3Ioc3RyZWFtLmNvZGVjcGFyLmZyb21Db250ZXh0KGNvZGVjQ3R4KSwgXCJjb2RlY3Bhci5mcm9tQ29udGV4dFwiKTtcbiAgICBpZiAoY29kZWNUYWcpIHN0cmVhbS5jb2RlY3Bhci5jb2RlY1RhZyA9IGNvZGVjVGFnO1xuICAgIHJldHVybiBzdHJlYW07XG4gIH1cblxuICBhc3luYyBvcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9vcGVuZWQpIHJldHVybjtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fY3R4Lm9wZW5PdXRwdXQoKSwgXCJvcGVuT3V0cHV0XCIpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9jdHgud3JpdGVIZWFkZXIobnVsbCksIFwid3JpdGVIZWFkZXJcIik7XG4gICAgdGhpcy5fb3BlbmVkID0gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIHdyaXRlUGFja2V0KHBrdDogUGFja2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IHRoaXMuX2N0eC5pbnRlcmxlYXZlZFdyaXRlRnJhbWUocGt0KSwgXCJpbnRlcmxlYXZlZFdyaXRlRnJhbWVcIik7XG4gIH1cblxuICBhc3luYyBmaW5pc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9vcGVuZWQpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLl9jdHgud3JpdGVUcmFpbGVyKCk7XG4gICAgYXdhaXQgdGhpcy5fY3R4LmNsb3NlT3V0cHV0KCk7XG4gICAgdGhpcy5fb3BlbmVkID0gZmFsc2U7XG4gIH1cblxuICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5maW5pc2goKTtcbiAgICBhd2FpdCB0aGlzLl9jdHhbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcbiAgfVxufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMy8yMS5cblxuaW1wb3J0IHsgQ29kZWMsIENvZGVjQ29udGV4dCwgRkZtcGVnRXJyb3IsIEZyYW1lLCBQYWNrZXQsIFJhdGlvbmFsLCBTb2Z0d2FyZVNjYWxlQ29udGV4dCB9IGZyb20gXCJub2RlLWF2XCI7XG5pbXBvcnQge1xuICBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIsXG4gIEFWX1BJWF9GTVRfQkdSQSxcbiAgQVZfUElYX0ZNVF9ZVVY0MjBQLFxuICBBVl9QSVhfRk1UX1lVVkE0MjBQLFxuICBBVkVSUk9SX0VBR0FJTixcbiAgQVZFUlJPUl9FT0YsXG4gIFNXU19CSUxJTkVBUixcbiAgdHlwZSBGRlZpZGVvRW5jb2Rlcixcbn0gZnJvbSBcIm5vZGUtYXYvY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1hdE11eGVyIH0gZnJvbSBcIi4vbXV4ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWaWRlb0VuY29kZXJPcHRpb25zIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGZwczogbnVtYmVyO1xuICBjb2RlY05hbWU6IEZGVmlkZW9FbmNvZGVyO1xuICBwaXhGbXQ6IHR5cGVvZiBBVl9QSVhfRk1UX1lVVkE0MjBQIHwgdHlwZW9mIEFWX1BJWF9GTVRfWVVWNDIwUDtcbiAgY29kZWNUYWc/OiBzdHJpbmc7XG4gIGdsb2JhbEhlYWRlcjogYm9vbGVhbjtcbiAgY29kZWNPcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBiaXRyYXRlOiBudW1iZXI7XG4gIG11eGVyOiBGb3JtYXRNdXhlcjtcbn1cblxudHlwZSBTdHJlYW0gPSBSZXR1cm5UeXBlPGltcG9ydChcIm5vZGUtYXZcIikuRm9ybWF0Q29udGV4dFtcIm5ld1N0cmVhbVwiXT47XG5cbmV4cG9ydCBjbGFzcyBWaWRlb0VuY29kZXIgaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3R4OiBDb2RlY0NvbnRleHQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N3czogU29mdHdhcmVTY2FsZUNvbnRleHQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NyYzogRnJhbWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RzdDogRnJhbWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BrdDogUGFja2V0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9zdHJlYW06IFN0cmVhbTtcbiAgcHRzID0gMG47XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBjdHg6IENvZGVjQ29udGV4dCxcbiAgICBzd3M6IFNvZnR3YXJlU2NhbGVDb250ZXh0LFxuICAgIHNyYzogRnJhbWUsXG4gICAgZHN0OiBGcmFtZSxcbiAgICBwa3Q6IFBhY2tldCxcbiAgICBzdHJlYW06IFN0cmVhbSxcbiAgKSB7XG4gICAgdGhpcy5fY3R4ID0gY3R4O1xuICAgIHRoaXMuX3N3cyA9IHN3cztcbiAgICB0aGlzLl9zcmMgPSBzcmM7XG4gICAgdGhpcy5fZHN0ID0gZHN0O1xuICAgIHRoaXMuX3BrdCA9IHBrdDtcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlKG9wdHM6IFZpZGVvRW5jb2Rlck9wdGlvbnMpOiBQcm9taXNlPFZpZGVvRW5jb2Rlcj4ge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgZnBzLCBjb2RlY05hbWUsIHBpeEZtdCwgY29kZWNUYWcsIGdsb2JhbEhlYWRlciwgY29kZWNPcHRzLCBiaXRyYXRlLCBtdXhlciB9ID0gb3B0cztcblxuICAgIGNvbnN0IGNvZGVjID0gQ29kZWMuZmluZEVuY29kZXJCeU5hbWUoY29kZWNOYW1lKTtcbiAgICBpZiAoIWNvZGVjKSB0aHJvdyBuZXcgRXJyb3IoYFZpZGVvIGVuY29kZXIgbm90IGZvdW5kOiAke2NvZGVjTmFtZX1gKTtcblxuICAgIGNvbnN0IGN0eCA9IG5ldyBDb2RlY0NvbnRleHQoKTtcbiAgICBjdHguYWxsb2NDb250ZXh0Myhjb2RlYyk7XG4gICAgY3R4LmNvZGVjSWQgPSBjb2RlYy5pZDtcbiAgICBjdHgud2lkdGggPSB3aWR0aDtcbiAgICBjdHguaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGN0eC5waXhlbEZvcm1hdCA9IHBpeEZtdDtcbiAgICBjdHgudGltZUJhc2UgPSBuZXcgUmF0aW9uYWwoMSwgZnBzKTtcbiAgICBjdHguZnJhbWVyYXRlID0gbmV3IFJhdGlvbmFsKGZwcywgMSk7XG4gICAgY3R4LmdvcFNpemUgPSBmcHM7XG4gICAgY3R4LmJpdFJhdGUgPSBCaWdJbnQoYml0cmF0ZSk7XG4gICAgY3R4LnNldE9wdGlvbihcInRocmVhZHNcIiwgXCI0XCIpO1xuICAgIGlmIChnbG9iYWxIZWFkZXIpIGN0eC5zZXRGbGFncyhBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGNvZGVjT3B0cykpIGN0eC5zZXRPcHRpb24oaywgdik7XG4gICAgaWYgKGNvZGVjVGFnKSBjdHguY29kZWNUYWcgPSBjb2RlY1RhZztcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgY3R4Lm9wZW4yKGNvZGVjLCBudWxsKSwgXCJ2aWRlb0N0eC5vcGVuMlwiKTtcblxuICAgIGNvbnN0IHN3cyA9IG5ldyBTb2Z0d2FyZVNjYWxlQ29udGV4dCgpO1xuICAgIHN3cy5nZXRDb250ZXh0KHdpZHRoLCBoZWlnaHQsIEFWX1BJWF9GTVRfQkdSQSwgd2lkdGgsIGhlaWdodCwgcGl4Rm10LCBTV1NfQklMSU5FQVIpO1xuXG4gICAgY29uc3QgZHN0ID0gbmV3IEZyYW1lKCk7XG4gICAgZHN0LmFsbG9jKCk7XG4gICAgZHN0LmZvcm1hdCA9IHBpeEZtdDtcbiAgICBkc3Qud2lkdGggPSB3aWR0aDtcbiAgICBkc3QuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihkc3QuZ2V0QnVmZmVyKDApLCBcImRzdEZyYW1lLmdldEJ1ZmZlclwiKTtcblxuICAgIC8vIFByZS1hbGxvY2F0ZSBzcmMgZnJhbWUgKEJHUkEsIHJldXNlZCBldmVyeSBlbmNvZGUpXG4gICAgY29uc3Qgc3JjID0gbmV3IEZyYW1lKCk7XG4gICAgc3JjLmFsbG9jKCk7XG4gICAgc3JjLmZvcm1hdCA9IEFWX1BJWF9GTVRfQkdSQTtcbiAgICBzcmMud2lkdGggPSB3aWR0aDtcbiAgICBzcmMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihzcmMuZ2V0QnVmZmVyKDApLCBcInNyY0ZyYW1lLmdldEJ1ZmZlclwiKTtcblxuICAgIC8vIFByZS1hbGxvY2F0ZSByZXVzYWJsZSBwYWNrZXRcbiAgICBjb25zdCBwa3QgPSBuZXcgUGFja2V0KCk7XG4gICAgcGt0LmFsbG9jKCk7XG5cbiAgICBjb25zdCBzdHJlYW0gPSBtdXhlci5hZGRTdHJlYW0oY3R4LCBjb2RlY1RhZyk7XG4gICAgcmV0dXJuIG5ldyBWaWRlb0VuY29kZXIoY3R4LCBzd3MsIHNyYywgZHN0LCBwa3QsIHN0cmVhbSk7XG4gIH1cblxuICBnZXQgc3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW07XG4gIH1cbiAgZ2V0IHRpbWVCYXNlKCkge1xuICAgIHJldHVybiB0aGlzLl9jdHgudGltZUJhc2U7XG4gIH1cblxuICBhc3luYyBlbmNvZGUoYmdyYTogQnVmZmVyLCBtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IF9zcmM6IHNyYywgX2RzdDogZHN0LCBfc3dzOiBzd3MgfSA9IHRoaXM7XG5cbiAgICAvLyBSZXVzZSBzcmMgZnJhbWU6IG1ha2VXcml0YWJsZSArIGZyb21CdWZmZXIgKyBwdHNcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3Ioc3JjLm1ha2VXcml0YWJsZSgpLCBcInNyYy5tYWtlV3JpdGFibGVcIik7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHNyYy5mcm9tQnVmZmVyKGJncmEpLCBcInNyYy5mcm9tQnVmZmVyXCIpO1xuICAgIHNyYy5wdHMgPSB0aGlzLnB0cztcblxuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihkc3QubWFrZVdyaXRhYmxlKCksIFwiZHN0Lm1ha2VXcml0YWJsZVwiKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgc3dzLnNjYWxlRnJhbWUoZHN0LCBzcmMpLCBcInN3cy5zY2FsZUZyYW1lXCIpO1xuXG4gICAgZHN0LnB0cyA9IHRoaXMucHRzKys7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IHRoaXMuX2N0eC5zZW5kRnJhbWUoZHN0KSwgXCJ2aWRlb0N0eC5zZW5kRnJhbWVcIik7XG4gICAgYXdhaXQgdGhpcy5kcmFpbihtdXhlcik7XG4gIH1cblxuICBhc3luYyBmbHVzaChtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLl9jdHguc2VuZEZyYW1lKG51bGwpO1xuICAgIGF3YWl0IHRoaXMuZHJhaW4obXV4ZXIpO1xuICB9XG5cbiAgW1N5bWJvbC5kaXNwb3NlXSgpOiB2b2lkIHtcbiAgICB0aGlzLl9wa3QuZnJlZSgpO1xuICAgIHRoaXMuX3NyYy5mcmVlKCk7XG4gICAgdGhpcy5fZHN0LmZyZWUoKTtcbiAgICB0aGlzLl9zd3NbU3ltYm9sLmRpc3Bvc2VdKCk7XG4gICAgdGhpcy5fY3R4LmZyZWVDb250ZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRyYWluKG11eGVyOiBGb3JtYXRNdXhlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBrdCA9IHRoaXMuX3BrdDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgciA9IGF3YWl0IHRoaXMuX2N0eC5yZWNlaXZlUGFja2V0KHBrdCk7XG4gICAgICBpZiAociA9PT0gQVZFUlJPUl9FQUdBSU4gfHwgciA9PT0gQVZFUlJPUl9FT0YpIGJyZWFrO1xuICAgICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHIsIFwidmlkZW8ucmVjZWl2ZVBhY2tldFwiKTtcbiAgICAgIHBrdC5zdHJlYW1JbmRleCA9IHRoaXMuX3N0cmVhbS5pbmRleDtcbiAgICAgIHBrdC5yZXNjYWxlVHModGhpcy5fY3R4LnRpbWVCYXNlLCB0aGlzLl9zdHJlYW0udGltZUJhc2UpO1xuICAgICAgYXdhaXQgbXV4ZXIud3JpdGVQYWNrZXQocGt0KTtcbiAgICAgIHBrdC51bnJlZigpO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMy8yMS5cblxuaW1wb3J0IHsgTG9nIH0gZnJvbSBcIm5vZGUtYXZcIjtcbmltcG9ydCB7XG4gIEFWX0xPR19FUlJPUixcbiAgQVZfTE9HX1dBUk5JTkcsXG4gIEFWX1BJWF9GTVRfWVVWQTQyMFAsXG4gIEFWX1NBTVBMRV9GTVRfRkxULFxuICBBVl9TQU1QTEVfRk1UX0ZMVFAsXG4gIEZGX0VOQ09ERVJfQUFDLFxuICBGRl9FTkNPREVSX0xJQlgyNjUsXG4gIHR5cGUgRkZBdWRpb0VuY29kZXIsXG4gIHR5cGUgRkZWaWRlb0VuY29kZXIsXG59IGZyb20gXCJub2RlLWF2L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB0eXBlIHsgVmlkZW9Gb3JtYXQgfSBmcm9tIFwiLi4vLi4vcmVuZGVyZXIvc2NoZW1hXCI7XG5pbXBvcnQgeyBDb25jdXJyZW5jeUxpbWl0ZXIgfSBmcm9tIFwiLi4vbGltaXRlclwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEF1ZGlvRW5jb2RlciB9IGZyb20gXCIuL2F1ZGlvXCI7XG5pbXBvcnQgeyBGb3JtYXRNdXhlciB9IGZyb20gXCIuL211eGVyXCI7XG5pbXBvcnQgeyBWaWRlb0VuY29kZXIgfSBmcm9tIFwiLi92aWRlb1wiO1xuXG5Mb2cuc2V0Q2FsbGJhY2soKGxldmVsLCBtZXNzYWdlKSA9PiB7XG4gIGNvbnN0IG1zZyA9IG1lc3NhZ2UudHJpbUVuZCgpO1xuICBpZiAoIW1zZykgcmV0dXJuO1xuICBpZiAobGV2ZWwgPD0gQVZfTE9HX0VSUk9SKSBsb2dnZXIuZXJyb3IobXNnKTtcbiAgZWxzZSBpZiAobGV2ZWwgPD0gQVZfTE9HX1dBUk5JTkcpIGxvZ2dlci53YXJuKG1zZyk7XG59KTtcblxuaW50ZXJmYWNlIEZvcm1hdFNwZWMge1xuICB2aWRlb0NvZGVjTmFtZTogRkZWaWRlb0VuY29kZXI7XG4gIHBpeEZtdDogdHlwZW9mIEFWX1BJWF9GTVRfWVVWQTQyMFA7XG4gIGNvZGVjVGFnPzogc3RyaW5nO1xuICBnbG9iYWxIZWFkZXI6IGJvb2xlYW47XG4gIHZpZGVvT3B0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgYXVkaW9Db2RlY05hbWU6IEZGQXVkaW9FbmNvZGVyO1xuICBhdWRpb1NhbXBsZUZtdDogdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUIHwgdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUUDtcbiAgb3V0U2FtcGxlUmF0ZTogbnVtYmVyO1xufVxuXG5jb25zdCBGT1JNQVRfU1BFQ1M6IFJlY29yZDxWaWRlb0Zvcm1hdCwgRm9ybWF0U3BlYz4gPSB7XG4gIG1wNDoge1xuICAgIHZpZGVvQ29kZWNOYW1lOiBGRl9FTkNPREVSX0xJQlgyNjUsXG4gICAgcGl4Rm10OiBBVl9QSVhfRk1UX1lVVkE0MjBQLFxuICAgIGNvZGVjVGFnOiBcImh2YzFcIixcbiAgICBnbG9iYWxIZWFkZXI6IHRydWUsXG4gICAgdmlkZW9PcHRzOiB7IHByZXNldDogXCJ1bHRyYWZhc3RcIiwgXCJ4MjY1LXBhcmFtc1wiOiBcImxvZy1sZXZlbD0xXCIgfSxcbiAgICBhdWRpb0NvZGVjTmFtZTogRkZfRU5DT0RFUl9BQUMsXG4gICAgYXVkaW9TYW1wbGVGbXQ6IEFWX1NBTVBMRV9GTVRfRkxUUCxcbiAgICBvdXRTYW1wbGVSYXRlOiA0NF8xMDAsXG4gIH0sXG4gIHdlYm06IHtcbiAgICB2aWRlb0NvZGVjTmFtZTogXCJsaWJ2cHgtdnA5XCIgYXMgRkZWaWRlb0VuY29kZXIsXG4gICAgcGl4Rm10OiBBVl9QSVhfRk1UX1lVVkE0MjBQLFxuICAgIGdsb2JhbEhlYWRlcjogZmFsc2UsXG4gICAgdmlkZW9PcHRzOiB7IHF1YWxpdHk6IFwicmVhbHRpbWVcIiwgXCJjcHUtdXNlZFwiOiBcIjhcIiB9LFxuICAgIGF1ZGlvQ29kZWNOYW1lOiBcImxpYm9wdXNcIiBhcyBGRkF1ZGlvRW5jb2RlcixcbiAgICBhdWRpb1NhbXBsZUZtdDogQVZfU0FNUExFX0ZNVF9GTFQsXG4gICAgb3V0U2FtcGxlUmF0ZTogNDhfMDAwLFxuICB9LFxufTtcblxuaW50ZXJmYWNlIEZvcm1hdFN0YXRlIHtcbiAgZm9ybWF0OiBWaWRlb0Zvcm1hdDtcbiAgb3V0UGF0aDogc3RyaW5nO1xuICBtdXhlcjogRm9ybWF0TXV4ZXI7XG4gIHZpZGVvOiBWaWRlb0VuY29kZXI7XG4gIGF1ZGlvPzogQXVkaW9FbmNvZGVyO1xuICBsaW1pdGVyOiBDb25jdXJyZW5jeUxpbWl0ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5jb2RlclBpcGVsaW5lT3B0aW9ucyB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBmcHM6IG51bWJlcjtcbiAgZm9ybWF0czogVmlkZW9Gb3JtYXRbXTtcbiAgb3V0RGlyOiBzdHJpbmc7XG4gIHdpdGhBdWRpbz86IGJvb2xlYW47XG4gIHZpZGVvQml0cmF0ZT86IG51bWJlcjtcbiAgYXVkaW9CaXRyYXRlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBFbmNvZGVyUmVzdWx0ID0gUGFydGlhbDxSZWNvcmQ8VmlkZW9Gb3JtYXQsIHN0cmluZz4+O1xuXG5leHBvcnQgY2xhc3MgRW5jb2RlclBpcGVsaW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhdGVzOiBGb3JtYXRTdGF0ZVtdO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc3RhdGVzOiBGb3JtYXRTdGF0ZVtdKSB7XG4gICAgdGhpcy5fc3RhdGVzID0gc3RhdGVzO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZSh7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGZwcyxcbiAgICBmb3JtYXRzLFxuICAgIG91dERpcixcbiAgICB3aXRoQXVkaW8gPSBmYWxzZSxcbiAgICB2aWRlb0JpdHJhdGUgPSA4XzAwMF8wMDAsXG4gICAgYXVkaW9CaXRyYXRlID0gMTI4XzAwMCxcbiAgfTogRW5jb2RlclBpcGVsaW5lT3B0aW9ucyk6IFByb21pc2U8RW5jb2RlclBpcGVsaW5lPiB7XG4gICAgY29uc3Qgc3RhdGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmb3JtYXRzLm1hcChhc3luYyAoZm9ybWF0KSA9PiB7XG4gICAgICAgIGNvbnN0IHNwZWMgPSBGT1JNQVRfU1BFQ1NbZm9ybWF0XTtcbiAgICAgICAgY29uc3Qgb3V0UGF0aCA9IGpvaW4ob3V0RGlyLCBgb3V0cHV0LiR7Zm9ybWF0fWApO1xuICAgICAgICBjb25zdCBtdXhlciA9IG5ldyBGb3JtYXRNdXhlcihvdXRQYXRoKTtcblxuICAgICAgICBjb25zdCB2aWRlbyA9IGF3YWl0IFZpZGVvRW5jb2Rlci5jcmVhdGUoe1xuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBmcHMsXG4gICAgICAgICAgY29kZWNOYW1lOiBzcGVjLnZpZGVvQ29kZWNOYW1lLFxuICAgICAgICAgIHBpeEZtdDogc3BlYy5waXhGbXQsXG4gICAgICAgICAgY29kZWNUYWc6IHNwZWMuY29kZWNUYWcsXG4gICAgICAgICAgZ2xvYmFsSGVhZGVyOiBzcGVjLmdsb2JhbEhlYWRlcixcbiAgICAgICAgICBjb2RlY09wdHM6IHNwZWMudmlkZW9PcHRzLFxuICAgICAgICAgIGJpdHJhdGU6IHZpZGVvQml0cmF0ZSxcbiAgICAgICAgICBtdXhlcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGF1ZGlvOiBBdWRpb0VuY29kZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh3aXRoQXVkaW8pIHtcbiAgICAgICAgICBhdWRpbyA9IGF3YWl0IEF1ZGlvRW5jb2Rlci5jcmVhdGUoe1xuICAgICAgICAgICAgb3V0U2FtcGxlUmF0ZTogc3BlYy5vdXRTYW1wbGVSYXRlLFxuICAgICAgICAgICAgb3V0U2FtcGxlRm10OiBzcGVjLmF1ZGlvU2FtcGxlRm10LFxuICAgICAgICAgICAgY29kZWNOYW1lOiBzcGVjLmF1ZGlvQ29kZWNOYW1lLFxuICAgICAgICAgICAgZ2xvYmFsSGVhZGVyOiBzcGVjLmdsb2JhbEhlYWRlcixcbiAgICAgICAgICAgIGJpdHJhdGU6IGF1ZGlvQml0cmF0ZSxcbiAgICAgICAgICAgIG11eGVyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbXV4ZXIub3BlbigpO1xuICAgICAgICBjb25zdCBsaW1pdGVyID0gbmV3IENvbmN1cnJlbmN5TGltaXRlcigxKTtcbiAgICAgICAgcmV0dXJuIHsgZm9ybWF0LCBvdXRQYXRoLCBtdXhlciwgdmlkZW8sIGF1ZGlvLCBsaW1pdGVyIH0gc2F0aXNmaWVzIEZvcm1hdFN0YXRlO1xuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IEVuY29kZXJQaXBlbGluZShzdGF0ZXMpO1xuICB9XG5cbiAgc2V0dXBBdWRpbyhzYW1wbGVSYXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHMgb2YgdGhpcy5fc3RhdGVzKSB7XG4gICAgICBzLmF1ZGlvPy5zZXRJbnB1dFJhdGUoc2FtcGxlUmF0ZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZW5jb2RlRnJhbWUoYmdyYTogQnVmZmVyLCBfdGltZXN0YW1wVXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuX3N0YXRlcy5tYXAoKHMpID0+IHMubGltaXRlci5zY2hlZHVsZSgoKSA9PiBzLnZpZGVvLmVuY29kZShiZ3JhLCBzLm11eGVyKSkpKTtcbiAgfVxuXG4gIGFzeW5jIGVuY29kZUF1ZGlvKHBjbTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLl9zdGF0ZXMubWFwKChzKSA9PiB7XG4gICAgICAgIGlmICghcy5hdWRpbykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm4gcy5saW1pdGVyLnNjaGVkdWxlKCgpID0+IHMuYXVkaW8hLmVuY29kZShwY20sIHMubXV4ZXIpKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBhc3luYyBmaW5pc2goKTogUHJvbWlzZTxFbmNvZGVyUmVzdWx0PiB7XG4gICAgY29uc3QgcmVzdWx0OiBFbmNvZGVyUmVzdWx0ID0ge307XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLl9zdGF0ZXMubWFwKGFzeW5jIChzKSA9PiB7XG4gICAgICAgIGF3YWl0IHMubGltaXRlci5lbmQoKTtcbiAgICAgICAgYXdhaXQgcy5hdWRpbz8uZmx1c2gocy5tdXhlcik7XG4gICAgICAgIGF3YWl0IHMudmlkZW8uZmx1c2gocy5tdXhlcik7XG4gICAgICAgIHJlc3VsdFtzLmZvcm1hdF0gPSBzLm91dFBhdGg7XG4gICAgICAgIHVzaW5nIF9hID0gcy5hdWRpbztcbiAgICAgICAgdXNpbmcgX3YgPSBzLnZpZGVvO1xuICAgICAgICBhd2FpdCB1c2luZyBfbSA9IHMubXV4ZXI7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==