pup-recorder 0.2.1 → 0.2.2

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.
@@ -0,0 +1,555 @@
1
+ import 'source-map-support/register.js';
2
+ import { createRequire } from 'module';
3
+ import { dirname, join } from 'path';
4
+ import { spawn } from 'child_process';
5
+ import z from 'zod';
6
+ import { readdir, readFile } from 'fs/promises';
7
+ import electron from 'electron';
8
+ import { platform } from 'os';
9
+ import { graphics } from 'systeminformation';
10
+
11
+ var __create = Object.create;
12
+ var __defProp = Object.defineProperty;
13
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
14
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
15
+ var __typeError = (msg) => {
16
+ throw TypeError(msg);
17
+ };
18
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
19
+ var __decoratorStart = (base) => [, , , __create(null)];
20
+ var __decoratorStrings = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"];
21
+ var __expectFn = (fn) => fn !== void 0 && typeof fn !== "function" ? __typeError("Function expected") : fn;
22
+ var __decoratorContext = (kind, name, done, metadata, fns) => ({ kind: __decoratorStrings[kind], name, metadata, addInitializer: (fn) => done._ ? __typeError("Already initialized") : fns.push(__expectFn(fn || null)) });
23
+ var __decoratorMetadata = (array, target) => __defNormalProp(target, __knownSymbol("metadata"), array[3]);
24
+ var __runInitializers = (array, flags, self, value) => {
25
+ for (var i = 0, fns = array[flags >> 1], n = fns && fns.length; i < n; i++) fns[i].call(self) ;
26
+ return value;
27
+ };
28
+ var __decorateElement = (array, flags, name, decorators, target, extra) => {
29
+ var it, done, ctx, access, k = flags & 7, s = false, p = false;
30
+ var j = 2 , key = __decoratorStrings[k + 5];
31
+ var extraInitializers = array[j] || (array[j] = []);
32
+ var desc = ((target = target.prototype), __getOwnPropDesc(target , name));
33
+ for (var i = decorators.length - 1; i >= 0; i--) {
34
+ ctx = __decoratorContext(k, name, done = {}, array[3], extraInitializers);
35
+ {
36
+ ctx.static = s, ctx.private = p, access = ctx.access = { has: (x) => name in x };
37
+ access.get = (x) => x[name];
38
+ }
39
+ it = (0, decorators[i])(desc[key] , ctx), done._ = 1;
40
+ __expectFn(it) && (desc[key] = it );
41
+ }
42
+ return desc && __defProp(target, name, desc), target;
43
+ };
44
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
45
+ var __using = (stack, value, async) => {
46
+ if (value != null) {
47
+ if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
48
+ var dispose, inner;
49
+ if (async) dispose = value[__knownSymbol("asyncDispose")];
50
+ if (dispose === void 0) {
51
+ dispose = value[__knownSymbol("dispose")];
52
+ if (async) inner = dispose;
53
+ }
54
+ if (typeof dispose !== "function") __typeError("Object not disposable");
55
+ if (inner) dispose = function() {
56
+ try {
57
+ inner.call(this);
58
+ } catch (e) {
59
+ return Promise.reject(e);
60
+ }
61
+ };
62
+ stack.push([async, dispose, value]);
63
+ } else if (async) {
64
+ stack.push([async]);
65
+ }
66
+ return value;
67
+ };
68
+ var __callDispose = (stack, error, hasError) => {
69
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
70
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
71
+ };
72
+ var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
73
+ var next = (it) => {
74
+ while (it = stack.pop()) {
75
+ try {
76
+ var result = it[1] && it[1].call(it[2]);
77
+ if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
78
+ } catch (e) {
79
+ fail(e);
80
+ }
81
+ }
82
+ if (hasError) throw error;
83
+ };
84
+ return next();
85
+ };
86
+
87
+ // src/base/env.ts
88
+ function penv(name, parser, defaultValue) {
89
+ try {
90
+ return parser(process.env[name]);
91
+ } catch {
92
+ return defaultValue;
93
+ }
94
+ }
95
+
96
+ // src/base/parser.ts
97
+ function parseNumber(x) {
98
+ if (typeof x === "number") {
99
+ return x;
100
+ }
101
+ const num = Number(x);
102
+ if (Number.isNaN(num)) {
103
+ throw new Error(`Value ${x} is not a valid number`);
104
+ }
105
+ return num;
106
+ }
107
+ function parseString(x) {
108
+ if (typeof x === "string") return x;
109
+ return String(x);
110
+ }
111
+ var require2 = createRequire(import.meta.url);
112
+ var env = process.env;
113
+ var pupLogLevel = penv("PUP_LOG_LEVEL", parseNumber, 2);
114
+ var pupUseInnerProxy = env["PUP_USE_INNER_PROXY"] === "1";
115
+ var pupDisableGPU = env["PUP_DISABLE_GPU"] === "1";
116
+ var pupPkgRoot = dirname(require2.resolve("pup-recorder/package.json"));
117
+ var pupApp = join(pupPkgRoot, "dist", "app.cjs");
118
+
119
+ // src/base/logging.ts
120
+ var DEBUG = "<pup@debug>";
121
+ var INFO = "<pup@info>";
122
+ var WARN = "<pup@warn>";
123
+ var ERROR = "<pup@error>";
124
+ var FATAL = "<pup@fatal>";
125
+ function stackHook(target, _context) {
126
+ return function(...messages) {
127
+ const processed = messages.map((msg) => {
128
+ return msg instanceof Error ? msg.stack ?? String(msg) : msg;
129
+ });
130
+ return target.call(this, ...processed);
131
+ };
132
+ }
133
+ var _fatal_dec, _error_dec, _warn_dec, _info_dec, _debug_dec, _init;
134
+ _debug_dec = [stackHook], _info_dec = [stackHook], _warn_dec = [stackHook], _error_dec = [stackHook], _fatal_dec = [stackHook];
135
+ var Logger = class {
136
+ constructor(_level = pupLogLevel) {
137
+ this._level = _level;
138
+ __runInitializers(_init, 5, this);
139
+ __publicField(this, "_impl");
140
+ this.impl = console;
141
+ }
142
+ get level() {
143
+ return this._level;
144
+ }
145
+ set level(value) {
146
+ this._level = value;
147
+ this.impl = this._impl ?? console;
148
+ }
149
+ get impl() {
150
+ return this._impl;
151
+ }
152
+ set impl(value) {
153
+ const debug = value.debug ?? console.debug;
154
+ const info = value.info ?? console.info;
155
+ const warn = value.warn ?? console.warn;
156
+ const error = value.error ?? console.error;
157
+ const lv = this._level;
158
+ this._impl = {
159
+ debug: lv >= 3 ? debug : void 0,
160
+ info: lv >= 2 ? info : void 0,
161
+ warn: lv >= 1 ? warn : void 0,
162
+ error: lv >= 0 ? error : void 0
163
+ };
164
+ }
165
+ debug(...messages) {
166
+ this.impl?.debug?.(DEBUG, ...messages);
167
+ }
168
+ info(...messages) {
169
+ this.impl?.info?.(INFO, ...messages);
170
+ }
171
+ warn(...messages) {
172
+ this.impl?.warn?.(WARN, ...messages);
173
+ }
174
+ error(...messages) {
175
+ this.impl?.error?.(ERROR, ...messages);
176
+ }
177
+ fatal(...messages) {
178
+ this.impl?.error?.(FATAL, ...messages);
179
+ process.exit(1);
180
+ }
181
+ dispatch(message) {
182
+ if (message.startsWith(DEBUG)) {
183
+ this.debug(message.slice(DEBUG.length + 1));
184
+ } else if (message.startsWith(INFO)) {
185
+ this.info(message.slice(INFO.length + 1));
186
+ } else if (message.startsWith(WARN)) {
187
+ this.warn(message.slice(WARN.length + 1));
188
+ } else if (message.startsWith(ERROR)) {
189
+ this.error(message.slice(ERROR.length + 1));
190
+ } else {
191
+ this.info(message);
192
+ }
193
+ }
194
+ attach(proc, name) {
195
+ return new Promise((resolve, reject) => {
196
+ this.debug(`${name}.attach`);
197
+ let fatal = "";
198
+ const dispatch = (data) => {
199
+ const message = data.toString();
200
+ if (message.startsWith(FATAL)) {
201
+ fatal += message.slice(FATAL.length + 1);
202
+ } else {
203
+ this.dispatch(message);
204
+ }
205
+ };
206
+ proc.stderr?.on("data", dispatch);
207
+ proc.stdout?.on("data", dispatch);
208
+ proc.on("message", dispatch).on("error", (err) => {
209
+ fatal += err.message;
210
+ proc.kill();
211
+ }).once("close", (code, signal) => {
212
+ if (code || signal || fatal) {
213
+ fatal ||= `command failed: ${proc.spawnargs.join(" ")}`;
214
+ this.debug(`${name}.close`, { code, signal, fatal });
215
+ reject(new Error(fatal));
216
+ } else {
217
+ this.debug(`${name}.close`);
218
+ resolve();
219
+ }
220
+ }).on("unhandledRejection", (reason) => {
221
+ this.error(`${name}.unhandled`, reason);
222
+ }).on("uncaughtExceptionMonitor", (err) => {
223
+ this.error(`${name}.unhandled`, err);
224
+ });
225
+ });
226
+ }
227
+ };
228
+ _init = __decoratorStart();
229
+ __decorateElement(_init, 1, "debug", _debug_dec, Logger);
230
+ __decorateElement(_init, 1, "info", _info_dec, Logger);
231
+ __decorateElement(_init, 1, "warn", _warn_dec, Logger);
232
+ __decorateElement(_init, 1, "error", _error_dec, Logger);
233
+ __decorateElement(_init, 1, "fatal", _fatal_dec, Logger);
234
+ __decoratorMetadata(_init, Logger);
235
+ var logger = new Logger();
236
+
237
+ // src/base/noerr.ts
238
+ function noerr(fn, defaultValue) {
239
+ return (...args) => {
240
+ try {
241
+ const ret = fn(...args);
242
+ if (ret instanceof Promise) {
243
+ return ret.catch(() => defaultValue);
244
+ }
245
+ return ret;
246
+ } catch {
247
+ return defaultValue;
248
+ }
249
+ };
250
+ }
251
+ var PUP_ARGS_KEY = "--pup-priv-args";
252
+ function pargs() {
253
+ const argv = process.argv;
254
+ let priv = argv.find((arg) => arg.startsWith(PUP_ARGS_KEY));
255
+ if (!priv) {
256
+ logger.debug("procargv", argv);
257
+ return process.argv;
258
+ }
259
+ const args = ["exec", ...argv.slice(-1)];
260
+ priv = Buffer.from(priv.split("=")[1], "base64").toString();
261
+ args.push(...JSON.parse(priv));
262
+ logger.debug("pupargs", args);
263
+ return args;
264
+ }
265
+ function exec(cmd, options) {
266
+ const parts = cmd.split(" ").filter((s) => s.length);
267
+ const [command, ...args] = parts;
268
+ if (!command) throw new Error("empty command");
269
+ const proc = spawn(command, args, {
270
+ stdio: "inherit",
271
+ ...options
272
+ });
273
+ return { process: proc, wait: logger.attach(proc, command) };
274
+ }
275
+ var DEFAULT_WIDTH = 1920;
276
+ var DEFAULT_HEIGHT = 1080;
277
+ var DEFAULT_FPS = 30;
278
+ var DEFAULT_DURATION = 5;
279
+ var DEFAULT_OUT_DIR = "out";
280
+ var VIDEO_FORMATS = ["mp4", "webm"];
281
+ function isVideoFormat(s) {
282
+ return VIDEO_FORMATS.includes(s);
283
+ }
284
+ var RenderSchema = z.object({
285
+ duration: z.number().optional().default(DEFAULT_DURATION).describe("Duration in seconds"),
286
+ width: z.number().optional().default(DEFAULT_WIDTH).describe("Video width"),
287
+ height: z.number().optional().default(DEFAULT_HEIGHT).describe("Video height"),
288
+ fps: z.number().optional().default(DEFAULT_FPS).describe("Frames per second"),
289
+ formats: z.array(z.enum(VIDEO_FORMATS)).optional().default(["mp4"]).describe(`Output video formats, allow ${VIDEO_FORMATS.join(", ")}`),
290
+ withAudio: z.boolean().optional().default(false).describe("Capture and encode audio"),
291
+ outDir: z.string().optional().default(DEFAULT_OUT_DIR).describe("Output directory"),
292
+ useInnerProxy: z.boolean().optional().default(false).describe("Use bilibili inner proxy for resource access"),
293
+ deterministic: z.boolean().optional().default(false).describe("Render by frame rather than recording")
294
+ });
295
+
296
+ // src/base/abort.ts
297
+ var AbortLink = class _AbortLink {
298
+ constructor(query, interval = 1e3) {
299
+ this.query = query;
300
+ this.interval = interval;
301
+ if (query) {
302
+ this.tick();
303
+ }
304
+ }
305
+ _callback;
306
+ _aborted;
307
+ _stopped = false;
308
+ static start(query, interval) {
309
+ return new _AbortLink(query, interval);
310
+ }
311
+ get aborted() {
312
+ return !this._stopped && this._aborted;
313
+ }
314
+ get stopped() {
315
+ return this._stopped;
316
+ }
317
+ async onAbort(callback) {
318
+ if (this._aborted) {
319
+ await callback();
320
+ } else {
321
+ this._callback = callback;
322
+ }
323
+ }
324
+ wait(...handles) {
325
+ const abort = new Promise((_, reject) => {
326
+ this.onAbort(async () => {
327
+ handles.forEach((h) => h.process.kill());
328
+ reject(new Error("aborted"));
329
+ });
330
+ });
331
+ return Promise.race([
332
+ abort,
333
+ Promise.all(handles.map((h) => h.wait))
334
+ //
335
+ ]);
336
+ }
337
+ stop() {
338
+ this._stopped = true;
339
+ }
340
+ tick() {
341
+ setTimeout(async () => {
342
+ if (this._stopped) {
343
+ return;
344
+ }
345
+ this._aborted = await this.query?.();
346
+ if (this._stopped) {
347
+ return;
348
+ }
349
+ if (this._aborted) {
350
+ await this._callback?.();
351
+ } else {
352
+ this.tick();
353
+ }
354
+ }, this.interval);
355
+ }
356
+ };
357
+
358
+ // src/base/limiter.ts
359
+ var ConcurrencyLimiter = class {
360
+ constructor(maxConcurrency) {
361
+ this.maxConcurrency = maxConcurrency;
362
+ }
363
+ _active = 0;
364
+ _queue = [];
365
+ _ended = false;
366
+ get active() {
367
+ return this._active;
368
+ }
369
+ get pending() {
370
+ return this._queue.length;
371
+ }
372
+ get stats() {
373
+ return `active: ${this.active}, pending: ${this.pending}`;
374
+ }
375
+ async schedule(fn) {
376
+ if (this._ended) {
377
+ throw new Error("ended");
378
+ }
379
+ return new Promise((resolve, reject) => {
380
+ const run = () => {
381
+ this._active++;
382
+ fn().then((v) => {
383
+ this._active--;
384
+ resolve(v);
385
+ this.next();
386
+ }).catch((e) => {
387
+ this._active--;
388
+ reject(e);
389
+ this.next();
390
+ });
391
+ };
392
+ this._queue.push(run);
393
+ this.next();
394
+ });
395
+ }
396
+ async end() {
397
+ if (this._ended) {
398
+ return;
399
+ }
400
+ this._ended = true;
401
+ while (this._active > 0 || this.pending > 0) {
402
+ await new Promise((r) => setTimeout(r, 50));
403
+ }
404
+ }
405
+ next() {
406
+ if (this._active < this.maxConcurrency) {
407
+ this._queue.shift()?.();
408
+ }
409
+ }
410
+ };
411
+ var TAG = "[HWAccel]";
412
+ var softwareVendors = ["microsoft", "vmware", "virtualbox", "llvmpipe", "softpipe", "swiftshader"];
413
+ function isSoftwareRenderer(vendor) {
414
+ const lower = vendor.toLowerCase();
415
+ return softwareVendors.some((v) => lower.includes(v));
416
+ }
417
+ async function detectGPUDriver() {
418
+ const { controllers } = await graphics();
419
+ if (platform() === "linux") {
420
+ try {
421
+ const files = await readdir("/dev/dri");
422
+ return files.some((f) => f.startsWith("renderD"));
423
+ } catch {
424
+ return false;
425
+ }
426
+ }
427
+ logger.debug(TAG, "GPU controllers:", controllers);
428
+ return controllers.some((c) => c.vendor.length > 0 && !isSoftwareRenderer(c.vendor));
429
+ }
430
+ var canIUseGPU = detectGPUDriver().then((result) => {
431
+ logger.debug(TAG, "gpu:", result);
432
+ return result;
433
+ });
434
+
435
+ // src/renderer/electron.ts
436
+ async function electronOpts() {
437
+ const opts = [
438
+ // 容器沙箱
439
+ "no-sandbox",
440
+ "disable-dev-shm-usage",
441
+ // 跨域/安全
442
+ "disable-web-security",
443
+ "disable-site-isolation-trials",
444
+ "ignore-certificate-errors",
445
+ // 录制行为
446
+ "disable-blink-features=AutomationControlled",
447
+ "mute-audio",
448
+ "autoplay-policy=no-user-gesture-required",
449
+ "disable-extensions",
450
+ // 渲染
451
+ "headless=new",
452
+ "force-device-scale-factor=1",
453
+ "force-color-profile=srgb",
454
+ "ignore-gpu-blocklist",
455
+ "use-gl=angle",
456
+ // 资源控制
457
+ "num-raster-threads=2",
458
+ "disable-background-networking",
459
+ "js-flags=--max-old-space-size=4096"
460
+ ];
461
+ if (pupLogLevel < 3) {
462
+ opts.push("log-level=3");
463
+ }
464
+ const enableGpu = await canIUseGPU && !pupDisableGPU;
465
+ if (!enableGpu) {
466
+ opts.push("use-angle=swiftshader", "enable-unsafe-swiftshader");
467
+ return opts;
468
+ }
469
+ opts.push("disable-gpu-sandbox", "enable-unsafe-webgpu");
470
+ const plat = platform();
471
+ if (plat === "darwin") {
472
+ opts.push("use-angle=metal");
473
+ } else if (plat === "win32") {
474
+ opts.push("use-angle=d3d11");
475
+ } else {
476
+ opts.push("use-angle=vulkan", "enable-features=Vulkan", "disable-vulkan-surface");
477
+ }
478
+ return opts;
479
+ }
480
+ var TAG2 = "[Electron]";
481
+ async function runElectronApp(size, args) {
482
+ const cmdParts = [];
483
+ const plat = platform();
484
+ if (plat === "linux") {
485
+ cmdParts.push(`xvfb-run`, `--auto-servernum`, `--server-args="-screen 0 ${size.width}x${size.height}x24"`);
486
+ }
487
+ const opts = await electronOpts();
488
+ const electronArgs = opts.map((a) => `--${a}`);
489
+ const base64Args = Buffer.from(JSON.stringify(args)).toString("base64");
490
+ electronArgs.push(`${PUP_ARGS_KEY}=${base64Args}`);
491
+ cmdParts.push(electron, ...electronArgs, pupApp);
492
+ const cmd = cmdParts.join(" ");
493
+ logger.debug(TAG2, cmd);
494
+ return exec(cmd, {
495
+ stdio: ["ignore", "pipe", "pipe"],
496
+ shell: plat === "linux",
497
+ env: { ...process.env, RUST_BACKTRACE: "full" }
498
+ });
499
+ }
500
+
501
+ // src/pup.ts
502
+ var TAG3 = "[pup]";
503
+ var PROGRESS_TAG = " progress: ";
504
+ async function runPupApp(source, options) {
505
+ logger.debug(TAG3, `runPupApp`, source, options);
506
+ const args = [source];
507
+ if (options.width) args.push("--width", `${options.width}`);
508
+ if (options.height) args.push("--height", `${options.height}`);
509
+ if (options.fps) args.push("--fps", `${options.fps}`);
510
+ if (options.duration) args.push("--duration", `${options.duration}`);
511
+ if (options.outDir) args.push("--out-dir", options.outDir);
512
+ if (options.formats?.length) args.push("--formats", options.formats.join(","));
513
+ if (options.withAudio) args.push("--with-audio");
514
+ if (options.useInnerProxy) args.push("--use-inner-proxy");
515
+ if (options.deterministic) args.push("--deterministic");
516
+ const w = options.width ?? DEFAULT_WIDTH;
517
+ const h = options.height ?? DEFAULT_HEIGHT;
518
+ const handle = await runElectronApp({ width: w, height: h }, args);
519
+ const counter = new ConcurrencyLimiter(1);
520
+ handle.process.stdout?.on("data", (data) => {
521
+ let message = data.toString().trim();
522
+ let start = message.indexOf(PROGRESS_TAG);
523
+ if (start < 0) {
524
+ return;
525
+ }
526
+ message = message.slice(start + PROGRESS_TAG.length);
527
+ const end = message.indexOf("%");
528
+ if (end < 0) {
529
+ return;
530
+ }
531
+ const progressStr = message.slice(0, end);
532
+ const progress = parseNumber(progressStr);
533
+ counter.schedule(async () => {
534
+ await options.onProgress?.(progress);
535
+ });
536
+ });
537
+ return { handle, counter };
538
+ }
539
+ async function pup(source, options) {
540
+ logger.debug(TAG3, `pup`, source, options);
541
+ const link = AbortLink.start(options.cancelQuery);
542
+ const outDir = options.outDir ?? "out";
543
+ const t0 = performance.now();
544
+ const { handle, counter } = await runPupApp(source, { ...options, outDir });
545
+ await link.wait(handle);
546
+ await counter.end();
547
+ link.stop();
548
+ logger.info(TAG3, `done in ${Math.round(performance.now() - t0)}ms`);
549
+ const sumPath = join(outDir, "summary.json");
550
+ return JSON.parse(await readFile(sumPath, "utf-8"));
551
+ }
552
+
553
+ export { AbortLink, ConcurrencyLimiter, DEFAULT_DURATION, DEFAULT_FPS, DEFAULT_HEIGHT, DEFAULT_OUT_DIR, DEFAULT_WIDTH, Logger, PUP_ARGS_KEY, RenderSchema, VIDEO_FORMATS, __callDispose, __using, exec, isVideoFormat, logger, noerr, pargs, parseNumber, parseString, penv, pup, pupApp, pupDisableGPU, pupLogLevel, pupPkgRoot, pupUseInnerProxy };
554
+ //# sourceMappingURL=chunk-CNRKD76V.js.map
555
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlL2Vudi50cyIsIi4uL3NyYy9iYXNlL3BhcnNlci50cyIsIi4uL3NyYy9iYXNlL2NvbnN0YW50cy50cyIsIi4uL3NyYy9iYXNlL2xvZ2dpbmcudHMiLCIuLi9zcmMvYmFzZS9ub2Vyci50cyIsIi4uL3NyYy9iYXNlL3Byb2Nlc3MudHMiLCIuLi9zcmMvcmVuZGVyZXIvc2NoZW1hLnRzIiwiLi4vc3JjL2Jhc2UvYWJvcnQudHMiLCIuLi9zcmMvYmFzZS9saW1pdGVyLnRzIiwiLi4vc3JjL2Jhc2UvaHdhY2NlbC50cyIsIi4uL3NyYy9yZW5kZXJlci9lbGVjdHJvbi50cyIsIi4uL3NyYy9wdXAudHMiXSwibmFtZXMiOlsicmVxdWlyZSIsInBsYXRmb3JtIiwiVEFHIiwiam9pbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTU8sU0FBUyxJQUFBLENBQVEsSUFBQSxFQUFjLE1BQUEsRUFBc0IsWUFBQSxFQUFpQztBQUMzRixFQUFBLElBQUk7QUFDRixJQUFBLE9BQU8sTUFBQSxDQUFPLE9BQUEsQ0FBUSxHQUFBLENBQUksSUFBSSxDQUFDLENBQUE7QUFBQSxFQUNqQyxDQUFBLENBQUEsTUFBUTtBQUNOLElBQUEsT0FBTyxZQUFBO0FBQUEsRUFDVDtBQUNGOzs7QUNWTyxTQUFTLFlBQVksQ0FBQSxFQUFvQjtBQUM5QyxFQUFBLElBQUksT0FBTyxNQUFNLFFBQUEsRUFBVTtBQUN6QixJQUFBLE9BQU8sQ0FBQTtBQUFBLEVBQ1Q7QUFDQSxFQUFBLE1BQU0sR0FBQSxHQUFNLE9BQU8sQ0FBQyxDQUFBO0FBQ3BCLEVBQUEsSUFBSSxNQUFBLENBQU8sS0FBQSxDQUFNLEdBQUcsQ0FBQSxFQUFHO0FBQ3JCLElBQUEsTUFBTSxJQUFJLEtBQUEsQ0FBTSxDQUFBLE1BQUEsRUFBUyxDQUFDLENBQUEsc0JBQUEsQ0FB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RUFBQSxNQUFNLEVBQUUsTUFBQSxFQUFRLE9BQUEsRUFBUSxHQUFJLE1BQU0sU0FBQSxDQUFVLE1BQUEsRUFBUSxFQUFFLEdBQUcsT0FBQSxFQUFTLE1BQUEsRUFBUSxDQUFBO0FBRTFFLEVBQUEsTUFBTSxJQUFBLENBQUssS0FBSyxNQUFNLENBQUE7QUFDdEIsRUFBQSxNQUFNLFFBQVEsR0FBQSxFQUFJO0FBQ2xCLEVBQUEsSUFBQSxDQUFLLElBQUEsRUFBSztBQUNWLEVBQUEsTUFBQSxDQUFPLElBQUEsQ0FBS0EsSUFBQUEsRUFBSyxDQUFBLFFBQUEsRUFBVyxJQUFBLENBQUssS0FBQSxDQUFNLFlBQVksR0FBQSxFQUFJLEdBQUksRUFBRSxDQUFDLENBQUEsRUFBQSxDQUFJLENBQUE7QUFFbEUsRUFBQSxNQUFNLE9BQUEsR0FBVUMsSUFBQUEsQ0FBSyxNQUFBLEVBQVEsY0FBYyxDQUFBO0FBQzNDLEVBQUEsT0FBTyxLQUFLLEtBQUEsQ0FBTSxNQUFNLFFBQUEsQ0FBUyxPQUFBLEVBQVMsT0FBTyxDQUFDLENBQUE7QUFDcEQiLCJmaWxlIjoiY2h1bmstQ05SS0Q3NlYuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzI1LlxuXG5leHBvcnQgdHlwZSBFbnZQYXJzZXI8VD4gPSAodmFsdWU6IHVua25vd24pID0+IFQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBwZW52PFQ+KG5hbWU6IHN0cmluZywgcGFyc2VyOiBFbnZQYXJzZXI8VD4sIGRlZmF1bHRWYWx1ZTogVCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gcGVudjxUPihuYW1lOiBzdHJpbmcsIHBhcnNlcjogRW52UGFyc2VyPFQ+LCBkZWZhdWx0VmFsdWU/OiBUKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBwZW52PFQ+KG5hbWU6IHN0cmluZywgcGFyc2VyOiBFbnZQYXJzZXI8VD4sIGRlZmF1bHRWYWx1ZT86IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VyKHByb2Nlc3MuZW52W25hbWVdKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMS8zMC5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTnVtYmVyKHg6IHVua25vd24pOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHggPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4geDtcbiAgfVxuICBjb25zdCBudW0gPSBOdW1iZXIoeCk7XG4gIGlmIChOdW1iZXIuaXNOYU4obnVtKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWUgJHt4fSBpcyBub3QgYSB2YWxpZCBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gbnVtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdHJpbmcoeDogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHg7XG4gIHJldHVybiBTdHJpbmcoeCk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBwZW52IH0gZnJvbSBcIi4vZW52XCI7XG5pbXBvcnQgeyBwYXJzZU51bWJlciB9IGZyb20gXCIuL3BhcnNlclwiO1xuXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG5cbmV4cG9ydCBjb25zdCBwdXBMb2dMZXZlbCA9IHBlbnYoXCJQVVBfTE9HX0xFVkVMXCIsIHBhcnNlTnVtYmVyLCAyKTtcbmV4cG9ydCBjb25zdCBwdXBVc2VJbm5lclByb3h5ID0gZW52W1wiUFVQX1VTRV9JTk5FUl9QUk9YWVwiXSA9PT0gXCIxXCI7XG5leHBvcnQgY29uc3QgcHVwRGlzYWJsZUdQVSA9IGVudltcIlBVUF9ESVNBQkxFX0dQVVwiXSA9PT0gXCIxXCI7XG5cbmV4cG9ydCBjb25zdCBwdXBQa2dSb290ID0gZGlybmFtZShyZXF1aXJlLnJlc29sdmUoXCJwdXAtcmVjb3JkZXIvcGFja2FnZS5qc29uXCIpKTtcbmV4cG9ydCBjb25zdCBwdXBBcHAgPSBqb2luKHB1cFBrZ1Jvb3QsIFwiZGlzdFwiLCBcImFwcC5janNcIik7XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA2LlxuXG5pbXBvcnQgeyBDaGlsZFByb2Nlc3MsIHR5cGUgU2VyaWFsaXphYmxlIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHB1cExvZ0xldmVsIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyTGlrZSB7XG4gIGRlYnVnPyh0aGlzOiB2b2lkLCAuLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZDtcblxuICBpbmZvPyh0aGlzOiB2b2lkLCAuLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZDtcblxuICB3YXJuPyh0aGlzOiB2b2lkLCAuLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZDtcblxuICBlcnJvcj8odGhpczogdm9pZCwgLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQ7XG59XG5cbmNvbnN0IERFQlVHID0gXCI8cHVwQGRlYnVnPlwiO1xuY29uc3QgSU5GTyA9IFwiPHB1cEBpbmZvPlwiO1xuY29uc3QgV0FSTiA9IFwiPHB1cEB3YXJuPlwiO1xuY29uc3QgRVJST1IgPSBcIjxwdXBAZXJyb3I+XCI7XG5jb25zdCBGQVRBTCA9IFwiPHB1cEBmYXRhbD5cIjtcblxuZnVuY3Rpb24gc3RhY2tIb29rKHRhcmdldDogRnVuY3Rpb24sIF9jb250ZXh0OiBDbGFzc01ldGhvZERlY29yYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGlzOiBMb2dnZXIsIC4uLm1lc3NhZ2VzOiB1bmtub3duW10pIHtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBtZXNzYWdlcy5tYXAoKG1zZykgPT4ge1xuICAgICAgcmV0dXJuIG1zZyBpbnN0YW5jZW9mIEVycm9yID8gKG1zZy5zdGFjayA/PyBTdHJpbmcobXNnKSkgOiBtc2c7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLnByb2Nlc3NlZCk7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dnZXIgaW1wbGVtZW50cyBMb2dnZXJMaWtlIHtcbiAgcHJpdmF0ZSBfaW1wbD86IExvZ2dlckxpa2U7XG5cbiAgZ2V0IGxldmVsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsO1xuICB9XG5cbiAgc2V0IGxldmVsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9sZXZlbCA9IHZhbHVlO1xuICAgIHRoaXMuaW1wbCA9IHRoaXMuX2ltcGwgPz8gY29uc29sZTtcbiAgfVxuXG4gIGdldCBpbXBsKCk6IExvZ2dlckxpa2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbXBsO1xuICB9XG5cbiAgc2V0IGltcGwodmFsdWU6IExvZ2dlckxpa2UpIHtcbiAgICBjb25zdCBkZWJ1ZyA9IHZhbHVlLmRlYnVnID8/IGNvbnNvbGUuZGVidWc7XG4gICAgY29uc3QgaW5mbyA9IHZhbHVlLmluZm8gPz8gY29uc29sZS5pbmZvO1xuICAgIGNvbnN0IHdhcm4gPSB2YWx1ZS53YXJuID8/IGNvbnNvbGUud2FybjtcbiAgICBjb25zdCBlcnJvciA9IHZhbHVlLmVycm9yID8/IGNvbnNvbGUuZXJyb3I7XG4gICAgY29uc3QgbHYgPSB0aGlzLl9sZXZlbDtcbiAgICB0aGlzLl9pbXBsID0ge1xuICAgICAgZGVidWc6IGx2ID49IDMgPyBkZWJ1ZyA6IHVuZGVmaW5lZCxcbiAgICAgIGluZm86IGx2ID49IDIgPyBpbmZvIDogdW5kZWZpbmVkLFxuICAgICAgd2FybjogbHYgPj0gMSA/IHdhcm4gOiB1bmRlZmluZWQsXG4gICAgICBlcnJvcjogbHYgPj0gMCA/IGVycm9yIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sZXZlbDogbnVtYmVyID0gcHVwTG9nTGV2ZWwpIHtcbiAgICB0aGlzLmltcGwgPSBjb25zb2xlO1xuICB9XG5cbiAgQHN0YWNrSG9va1xuICBkZWJ1ZyguLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5pbXBsPy5kZWJ1Zz8uKERFQlVHLCAuLi5tZXNzYWdlcyk7XG4gIH1cblxuICBAc3RhY2tIb29rXG4gIGluZm8oLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuaW1wbD8uaW5mbz8uKElORk8sIC4uLm1lc3NhZ2VzKTtcbiAgfVxuXG4gIEBzdGFja0hvb2tcbiAgd2FybiguLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5pbXBsPy53YXJuPy4oV0FSTiwgLi4ubWVzc2FnZXMpO1xuICB9XG5cbiAgQHN0YWNrSG9va1xuICBlcnJvciguLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5pbXBsPy5lcnJvcj8uKEVSUk9SLCAuLi5tZXNzYWdlcyk7XG4gIH1cblxuICBAc3RhY2tIb29rXG4gIGZhdGFsKC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmltcGw/LmVycm9yPy4oRkFUQUwsIC4uLm1lc3NhZ2VzKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIGlmIChtZXNzYWdlLnN0YXJ0c1dpdGgoREVCVUcpKSB7XG4gICAgICB0aGlzLmRlYnVnKG1lc3NhZ2Uuc2xpY2UoREVCVUcubGVuZ3RoICsgMSkpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS5zdGFydHNXaXRoKElORk8pKSB7XG4gICAgICB0aGlzLmluZm8obWVzc2FnZS5zbGljZShJTkZPLmxlbmd0aCArIDEpKTtcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2Uuc3RhcnRzV2l0aChXQVJOKSkge1xuICAgICAgdGhpcy53YXJuKG1lc3NhZ2Uuc2xpY2UoV0FSTi5sZW5ndGggKyAxKSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnN0YXJ0c1dpdGgoRVJST1IpKSB7XG4gICAgICB0aGlzLmVycm9yKG1lc3NhZ2Uuc2xpY2UoRVJST1IubGVuZ3RoICsgMSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluZm8obWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgYXR0YWNoKHByb2M6IENoaWxkUHJvY2VzcywgbmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGVidWcoYCR7bmFtZX0uYXR0YWNoYCk7XG4gICAgICBsZXQgZmF0YWw6IHN0cmluZyA9IFwiXCI7XG4gICAgICBjb25zdCBkaXNwYXRjaCA9IChkYXRhOiBCdWZmZXIgfCBTZXJpYWxpemFibGUpID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RhcnRzV2l0aChGQVRBTCkpIHtcbiAgICAgICAgICBmYXRhbCArPSBtZXNzYWdlLnNsaWNlKEZBVEFMLmxlbmd0aCArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlzcGF0Y2gobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBwcm9jLnN0ZGVycj8ub24oXCJkYXRhXCIsIGRpc3BhdGNoKTtcbiAgICAgIHByb2Muc3Rkb3V0Py5vbihcImRhdGFcIiwgZGlzcGF0Y2gpO1xuICAgICAgcHJvY1xuICAgICAgICAub24oXCJtZXNzYWdlXCIsIGRpc3BhdGNoKVxuICAgICAgICAub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgICAgZmF0YWwgKz0gZXJyLm1lc3NhZ2U7XG4gICAgICAgICAgcHJvYy5raWxsKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbmNlKFwiY2xvc2VcIiwgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICAgIGlmIChjb2RlIHx8IHNpZ25hbCB8fCBmYXRhbCkge1xuICAgICAgICAgICAgZmF0YWwgfHw9IGBjb21tYW5kIGZhaWxlZDogJHtwcm9jLnNwYXduYXJncy5qb2luKFwiIFwiKX1gO1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgJHtuYW1lfS5jbG9zZWAsIHsgY29kZSwgc2lnbmFsLCBmYXRhbCB9KTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZmF0YWwpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhgJHtuYW1lfS5jbG9zZWApO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKFwidW5oYW5kbGVkUmVqZWN0aW9uXCIsIChyZWFzb24pID0+IHtcbiAgICAgICAgICB0aGlzLmVycm9yKGAke25hbWV9LnVuaGFuZGxlZGAsIHJlYXNvbik7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbihcInVuY2F1Z2h0RXhjZXB0aW9uTW9uaXRvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvcihgJHtuYW1lfS51bmhhbmRsZWRgLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbmV4cG9ydCB7IGxvZ2dlciB9O1xuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8yNC5cblxuZXhwb3J0IGZ1bmN0aW9uIG5vZXJyPEZuIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksIEQ+KFxuICBmbjogRm4sXG4gIGRlZmF1bHRWYWx1ZTogRCxcbik6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPEZuPikgPT4gUmV0dXJuVHlwZTxGbj4gfCBEIHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHJldC5jYXRjaCgoKSA9PiBkZWZhdWx0VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMS8zMC5cblxuaW1wb3J0IHsgc3Bhd24sIHR5cGUgQ2hpbGRQcm9jZXNzLCB0eXBlIFNwYXduT3B0aW9ucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwiLi9sb2dnaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBQVVBfQVJHU19LRVkgPSBcIi0tcHVwLXByaXYtYXJnc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyZ3MoKSB7XG4gIGNvbnN0IGFyZ3YgPSBwcm9jZXNzLmFyZ3Y7XG4gIGxldCBwcml2ID0gYXJndi5maW5kKChhcmcpID0+IGFyZy5zdGFydHNXaXRoKFBVUF9BUkdTX0tFWSkpO1xuICBpZiAoIXByaXYpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJwcm9jYXJndlwiLCBhcmd2KTtcbiAgICByZXR1cm4gcHJvY2Vzcy5hcmd2O1xuICB9XG4gIGNvbnN0IGFyZ3MgPSBbXCJleGVjXCIsIC4uLmFyZ3Yuc2xpY2UoLTEpXTtcbiAgcHJpdiA9IEJ1ZmZlci5mcm9tKHByaXYuc3BsaXQoXCI9XCIpWzFdISwgXCJiYXNlNjRcIikudG9TdHJpbmcoKTtcbiAgYXJncy5wdXNoKC4uLkpTT04ucGFyc2UocHJpdikpO1xuICBsb2dnZXIuZGVidWcoXCJwdXBhcmdzXCIsIGFyZ3MpO1xuICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzSGFuZGxlIHtcbiAgcHJvY2VzczogQ2hpbGRQcm9jZXNzO1xuICB3YWl0OiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhjbWQ6IHN0cmluZywgb3B0aW9ucz86IFNwYXduT3B0aW9ucyk6IFByb2Nlc3NIYW5kbGUge1xuICBjb25zdCBwYXJ0cyA9IGNtZC5zcGxpdChcIiBcIikuZmlsdGVyKChzKSA9PiBzLmxlbmd0aCk7XG4gIGNvbnN0IFtjb21tYW5kLCAuLi5hcmdzXSA9IHBhcnRzO1xuICBpZiAoIWNvbW1hbmQpIHRocm93IG5ldyBFcnJvcihcImVtcHR5IGNvbW1hbmRcIik7XG4gIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzLCB7XG4gICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xuICByZXR1cm4geyBwcm9jZXNzOiBwcm9jLCB3YWl0OiBsb2dnZXIuYXR0YWNoKHByb2MsIGNvbW1hbmQpIH07XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA2LlxuXG5pbXBvcnQgeiBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9GaWxlcyB7XG4gIGNvdmVyOiBzdHJpbmc7XG4gIG1wND86IHN0cmluZztcbiAgd2VibT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0lEVEggPSAxOTIwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSEVJR0hUID0gMTA4MDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZQUyA9IDMwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRFVSQVRJT04gPSA1O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUX0RJUiA9IFwib3V0XCI7XG5leHBvcnQgY29uc3QgVklERU9fRk9STUFUUyA9IFtcIm1wNFwiLCBcIndlYm1cIl0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFZpZGVvRm9ybWF0ID0gKHR5cGVvZiBWSURFT19GT1JNQVRTKVtudW1iZXJdO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNWaWRlb0Zvcm1hdChzOiBzdHJpbmcpOiBzIGlzIFZpZGVvRm9ybWF0IHtcbiAgcmV0dXJuIFZJREVPX0ZPUk1BVFMuaW5jbHVkZXMocyBhcyBWaWRlb0Zvcm1hdCk7XG59XG5cbmV4cG9ydCBjb25zdCBSZW5kZXJTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGR1cmF0aW9uOiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVmYXVsdChERUZBVUxUX0RVUkFUSU9OKS5kZXNjcmliZShcIkR1cmF0aW9uIGluIHNlY29uZHNcIiksXG4gIHdpZHRoOiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVmYXVsdChERUZBVUxUX1dJRFRIKS5kZXNjcmliZShcIlZpZGVvIHdpZHRoXCIpLFxuICBoZWlnaHQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKS5kZWZhdWx0KERFRkFVTFRfSEVJR0hUKS5kZXNjcmliZShcIlZpZGVvIGhlaWdodFwiKSxcbiAgZnBzOiB6Lm51bWJlcigpLm9wdGlvbmFsKCkuZGVmYXVsdChERUZBVUxUX0ZQUykuZGVzY3JpYmUoXCJGcmFtZXMgcGVyIHNlY29uZFwiKSxcbiAgZm9ybWF0czogelxuICAgIC5hcnJheSh6LmVudW0oVklERU9fRk9STUFUUykpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVmYXVsdChbXCJtcDRcIl0pXG4gICAgLmRlc2NyaWJlKGBPdXRwdXQgdmlkZW8gZm9ybWF0cywgYWxsb3cgJHtWSURFT19GT1JNQVRTLmpvaW4oXCIsIFwiKX1gKSxcbiAgd2l0aEF1ZGlvOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLmRlZmF1bHQoZmFsc2UpLmRlc2NyaWJlKFwiQ2FwdHVyZSBhbmQgZW5jb2RlIGF1ZGlvXCIpLFxuICBvdXREaXI6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZWZhdWx0KERFRkFVTFRfT1VUX0RJUikuZGVzY3JpYmUoXCJPdXRwdXQgZGlyZWN0b3J5XCIpLFxuICB1c2VJbm5lclByb3h5OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLmRlZmF1bHQoZmFsc2UpLmRlc2NyaWJlKFwiVXNlIGJpbGliaWxpIGlubmVyIHByb3h5IGZvciByZXNvdXJjZSBhY2Nlc3NcIiksXG4gIGRldGVybWluaXN0aWM6IHouYm9vbGVhbigpLm9wdGlvbmFsKCkuZGVmYXVsdChmYWxzZSkuZGVzY3JpYmUoXCJSZW5kZXIgYnkgZnJhbWUgcmF0aGVyIHRoYW4gcmVjb3JkaW5nXCIpLFxufSk7XG5cbmV4cG9ydCB0eXBlIFJlbmRlck9wdGlvbnMgPSB6LmluZmVyPHR5cGVvZiBSZW5kZXJTY2hlbWE+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclJlc3VsdCB7XG4gIG9wdGlvbnM6IFJlbmRlck9wdGlvbnM7XG4gIHdyaXR0ZW46IG51bWJlcjtcbiAgZmlsZXM6IFZpZGVvRmlsZXM7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzExLlxuXG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NIYW5kbGUgfSBmcm9tIFwiLi9wcm9jZXNzXCI7XG5cbmV4cG9ydCB0eXBlIEFzeW5jVGFzayA9ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgQWJvcnRRdWVyeSA9ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuO1xuXG5leHBvcnQgY2xhc3MgQWJvcnRMaW5rIHtcbiAgcHJpdmF0ZSBfY2FsbGJhY2s/OiBBc3luY1Rhc2s7XG4gIHByaXZhdGUgX2Fib3J0ZWQ/OiBib29sZWFuO1xuICBwcml2YXRlIF9zdG9wcGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBxdWVyeT86IEFib3J0UXVlcnksXG4gICAgcmVhZG9ubHkgaW50ZXJ2YWw6IG51bWJlciA9IDEwMDAsXG4gICkge1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgdGhpcy50aWNrKCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHN0YXJ0KHF1ZXJ5PzogQWJvcnRRdWVyeSwgaW50ZXJ2YWw/OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEFib3J0TGluayhxdWVyeSwgaW50ZXJ2YWwpO1xuICB9XG5cbiAgZ2V0IGFib3J0ZWQoKSB7XG4gICAgcmV0dXJuICF0aGlzLl9zdG9wcGVkICYmIHRoaXMuX2Fib3J0ZWQ7XG4gIH1cblxuICBnZXQgc3RvcHBlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcHBlZDtcbiAgfVxuXG4gIGFzeW5jIG9uQWJvcnQoY2FsbGJhY2s6IEFzeW5jVGFzaykge1xuICAgIGlmICh0aGlzLl9hYm9ydGVkKSB7XG4gICAgICBhd2FpdCBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cbiAgfVxuXG4gIHdhaXQoLi4uaGFuZGxlczogUHJvY2Vzc0hhbmRsZVtdKSB7XG4gICAgY29uc3QgYWJvcnQgPSBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLm9uQWJvcnQoYXN5bmMgKCkgPT4ge1xuICAgICAgICBoYW5kbGVzLmZvckVhY2goKGgpID0+IGgucHJvY2Vzcy5raWxsKCkpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKFwiYWJvcnRlZFwiKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtcbiAgICAgIGFib3J0LFxuICAgICAgUHJvbWlzZS5hbGwoaGFuZGxlcy5tYXAoKGgpID0+IGgud2FpdCkpLCAvL1xuICAgIF0pO1xuICB9XG5cbiAgc3RvcCgpIHtcbiAgICB0aGlzLl9zdG9wcGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgdGljaygpIHtcbiAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9zdG9wcGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Fib3J0ZWQgPSBhd2FpdCB0aGlzLnF1ZXJ5Py4oKTtcbiAgICAgIGlmICh0aGlzLl9zdG9wcGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9hYm9ydGVkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2NhbGxiYWNrPy4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGljaygpO1xuICAgICAgfVxuICAgIH0sIHRoaXMuaW50ZXJ2YWwpO1xuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAxLzMwLlxuXG5leHBvcnQgY2xhc3MgQ29uY3VycmVuY3lMaW1pdGVyIHtcbiAgcHJpdmF0ZSBfYWN0aXZlID0gMDtcbiAgcHJpdmF0ZSBfcXVldWU6IFZvaWRGdW5jdGlvbltdID0gW107XG4gIHByaXZhdGUgX2VuZGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgbWF4Q29uY3VycmVuY3k6IG51bWJlcikge31cblxuICBnZXQgYWN0aXZlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuXG4gIGdldCBwZW5kaW5nKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBzdGF0cygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYWN0aXZlOiAke3RoaXMuYWN0aXZlfSwgcGVuZGluZzogJHt0aGlzLnBlbmRpbmd9YDtcbiAgfVxuXG4gIGFzeW5jIHNjaGVkdWxlPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuX2VuZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbmRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJ1biA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fYWN0aXZlKys7XG4gICAgICAgIGZuKClcbiAgICAgICAgICAudGhlbigodikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlLS07XG4gICAgICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZS0tO1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5fcXVldWUucHVzaChydW4pO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBlbmQoKSB7XG4gICAgaWYgKHRoaXMuX2VuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2VuZGVkID0gdHJ1ZTtcbiAgICB3aGlsZSAodGhpcy5fYWN0aXZlID4gMCB8fCB0aGlzLnBlbmRpbmcgPiAwKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbmV4dCgpIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlIDwgdGhpcy5tYXhDb25jdXJyZW5jeSkge1xuICAgICAgdGhpcy5fcXVldWUuc2hpZnQoKT8uKCk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzI3LlxuXG5pbXBvcnQgeyByZWFkZGlyIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgZ3JhcGhpY3MgfSBmcm9tIFwic3lzdGVtaW5mb3JtYXRpb25cIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZ2dpbmdcIjtcblxuY29uc3QgVEFHID0gXCJbSFdBY2NlbF1cIjtcblxuY29uc3Qgc29mdHdhcmVWZW5kb3JzID0gW1wibWljcm9zb2Z0XCIsIFwidm13YXJlXCIsIFwidmlydHVhbGJveFwiLCBcImxsdm1waXBlXCIsIFwic29mdHBpcGVcIiwgXCJzd2lmdHNoYWRlclwiXTtcblxuZnVuY3Rpb24gaXNTb2Z0d2FyZVJlbmRlcmVyKHZlbmRvcjogc3RyaW5nKSB7XG4gIGNvbnN0IGxvd2VyID0gdmVuZG9yLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBzb2Z0d2FyZVZlbmRvcnMuc29tZSgodikgPT4gbG93ZXIuaW5jbHVkZXModikpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RHUFVEcml2ZXIoKSB7XG4gIGNvbnN0IHsgY29udHJvbGxlcnMgfSA9IGF3YWl0IGdyYXBoaWNzKCk7XG4gIGlmIChwbGF0Zm9ybSgpID09PSBcImxpbnV4XCIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKFwiL2Rldi9kcmlcIik7XG4gICAgICByZXR1cm4gZmlsZXMuc29tZSgoZikgPT4gZi5zdGFydHNXaXRoKFwicmVuZGVyRFwiKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIFwiR1BVIGNvbnRyb2xsZXJzOlwiLCBjb250cm9sbGVycyk7XG4gIHJldHVybiBjb250cm9sbGVycy5zb21lKChjKSA9PiBjLnZlbmRvci5sZW5ndGggPiAwICYmICFpc1NvZnR3YXJlUmVuZGVyZXIoYy52ZW5kb3IpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNhbklVc2VHUFUgPSBkZXRlY3RHUFVEcml2ZXIoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgbG9nZ2VyLmRlYnVnKFRBRywgXCJncHU6XCIsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMjUuXG5cbmltcG9ydCBlbGVjdHJvbiwgeyB0eXBlIFNpemUgfSBmcm9tIFwiZWxlY3Ryb25cIjtcbmltcG9ydCB7IHBsYXRmb3JtIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBwdXBBcHAsIHB1cERpc2FibGVHUFUsIHB1cExvZ0xldmVsIH0gZnJvbSBcIi4uL2Jhc2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjYW5JVXNlR1BVIH0gZnJvbSBcIi4uL2Jhc2UvaHdhY2NlbFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jhc2UvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgZXhlYywgUFVQX0FSR1NfS0VZIH0gZnJvbSBcIi4uL2Jhc2UvcHJvY2Vzc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWxlY3Ryb25PcHRzKCkge1xuICBjb25zdCBvcHRzID0gW1xuICAgIC8vIOWuueWZqOaymeeusVxuICAgIFwibm8tc2FuZGJveFwiLFxuICAgIFwiZGlzYWJsZS1kZXYtc2htLXVzYWdlXCIsXG4gICAgLy8g6Leo5Z+fL+WuieWFqFxuICAgIFwiZGlzYWJsZS13ZWItc2VjdXJpdHlcIixcbiAgICBcImRpc2FibGUtc2l0ZS1pc29sYXRpb24tdHJpYWxzXCIsXG4gICAgXCJpZ25vcmUtY2VydGlmaWNhdGUtZXJyb3JzXCIsXG4gICAgLy8g5b2V5Yi26KGM5Li6XG4gICAgXCJkaXNhYmxlLWJsaW5rLWZlYXR1cmVzPUF1dG9tYXRpb25Db250cm9sbGVkXCIsXG4gICAgXCJtdXRlLWF1ZGlvXCIsXG4gICAgXCJhdXRvcGxheS1wb2xpY3k9bm8tdXNlci1nZXN0dXJlLXJlcXVpcmVkXCIsXG4gICAgXCJkaXNhYmxlLWV4dGVuc2lvbnNcIixcbiAgICAvLyDmuLLmn5NcbiAgICBcImhlYWRsZXNzPW5ld1wiLFxuICAgIFwiZm9yY2UtZGV2aWNlLXNjYWxlLWZhY3Rvcj0xXCIsXG4gICAgXCJmb3JjZS1jb2xvci1wcm9maWxlPXNyZ2JcIixcbiAgICBcImlnbm9yZS1ncHUtYmxvY2tsaXN0XCIsXG4gICAgXCJ1c2UtZ2w9YW5nbGVcIixcbiAgICAvLyDotYTmupDmjqfliLZcbiAgICBcIm51bS1yYXN0ZXItdGhyZWFkcz0yXCIsXG4gICAgXCJkaXNhYmxlLWJhY2tncm91bmQtbmV0d29ya2luZ1wiLFxuICAgIFwianMtZmxhZ3M9LS1tYXgtb2xkLXNwYWNlLXNpemU9NDA5NlwiLFxuICBdO1xuICBpZiAocHVwTG9nTGV2ZWwgPCAzKSB7XG4gICAgb3B0cy5wdXNoKFwibG9nLWxldmVsPTNcIik7XG4gIH1cblxuICBjb25zdCBlbmFibGVHcHUgPSAoYXdhaXQgY2FuSVVzZUdQVSkgJiYgIXB1cERpc2FibGVHUFU7XG4gIGlmICghZW5hYmxlR3B1KSB7XG4gICAgb3B0cy5wdXNoKFwidXNlLWFuZ2xlPXN3aWZ0c2hhZGVyXCIsIFwiZW5hYmxlLXVuc2FmZS1zd2lmdHNoYWRlclwiKTtcbiAgICByZXR1cm4gb3B0cztcbiAgfVxuXG4gIG9wdHMucHVzaChcImRpc2FibGUtZ3B1LXNhbmRib3hcIiwgXCJlbmFibGUtdW5zYWZlLXdlYmdwdVwiKTtcbiAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gIGlmIChwbGF0ID09PSBcImRhcndpblwiKSB7XG4gICAgb3B0cy5wdXNoKFwidXNlLWFuZ2xlPW1ldGFsXCIpO1xuICB9IGVsc2UgaWYgKHBsYXQgPT09IFwid2luMzJcIikge1xuICAgIG9wdHMucHVzaChcInVzZS1hbmdsZT1kM2QxMVwiKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzLnB1c2goXCJ1c2UtYW5nbGU9dnVsa2FuXCIsIFwiZW5hYmxlLWZlYXR1cmVzPVZ1bGthblwiLCBcImRpc2FibGUtdnVsa2FuLXN1cmZhY2VcIik7XG4gIH1cbiAgcmV0dXJuIG9wdHM7XG59XG5cbmNvbnN0IFRBRyA9IFwiW0VsZWN0cm9uXVwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuRWxlY3Ryb25BcHAoc2l6ZTogU2l6ZSwgYXJnczogdW5rbm93bltdKSB7XG4gIGNvbnN0IGNtZFBhcnRzOiB1bmtub3duW10gPSBbXTtcbiAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gIGlmIChwbGF0ID09PSBcImxpbnV4XCIpIHtcbiAgICBjbWRQYXJ0cy5wdXNoKGB4dmZiLXJ1bmAsIGAtLWF1dG8tc2VydmVybnVtYCwgYC0tc2VydmVyLWFyZ3M9XCItc2NyZWVuIDAgJHtzaXplLndpZHRofXgke3NpemUuaGVpZ2h0fXgyNFwiYCk7XG4gIH1cbiAgY29uc3Qgb3B0cyA9IGF3YWl0IGVsZWN0cm9uT3B0cygpO1xuICBjb25zdCBlbGVjdHJvbkFyZ3MgPSBvcHRzLm1hcCgoYSkgPT4gYC0tJHthfWApO1xuICBjb25zdCBiYXNlNjRBcmdzID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoYXJncykpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICBlbGVjdHJvbkFyZ3MucHVzaChgJHtQVVBfQVJHU19LRVl9PSR7YmFzZTY0QXJnc31gKTtcbiAgY21kUGFydHMucHVzaChlbGVjdHJvbiwgLi4uZWxlY3Ryb25BcmdzLCBwdXBBcHApO1xuICBjb25zdCBjbWQgPSBjbWRQYXJ0cy5qb2luKFwiIFwiKTtcbiAgbG9nZ2VyLmRlYnVnKFRBRywgY21kKTtcbiAgcmV0dXJuIGV4ZWMoY21kLCB7XG4gICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgIHNoZWxsOiBwbGF0ID09PSBcImxpbnV4XCIsXG4gICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBSVVNUX0JBQ0tUUkFDRTogXCJmdWxsXCIgfSxcbiAgfSk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBBYm9ydExpbmssIHR5cGUgQWJvcnRRdWVyeSB9IGZyb20gXCIuL2Jhc2UvYWJvcnRcIjtcbmltcG9ydCB7IENvbmN1cnJlbmN5TGltaXRlciB9IGZyb20gXCIuL2Jhc2UvbGltaXRlclwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vYmFzZS9sb2dnaW5nXCI7XG5pbXBvcnQgeyBwYXJzZU51bWJlciB9IGZyb20gXCIuL2Jhc2UvcGFyc2VyXCI7XG5pbXBvcnQgeyBydW5FbGVjdHJvbkFwcCB9IGZyb20gXCIuL3JlbmRlcmVyL2VsZWN0cm9uXCI7XG5pbXBvcnQgeyBERUZBVUxUX0hFSUdIVCwgREVGQVVMVF9XSURUSCwgdHlwZSBSZW5kZXJPcHRpb25zLCB0eXBlIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL3JlbmRlcmVyL3NjaGVtYVwiO1xuXG5jb25zdCBUQUcgPSBcIltwdXBdXCI7XG5jb25zdCBQUk9HUkVTU19UQUcgPSBcIiBwcm9ncmVzczogXCI7XG5cbmV4cG9ydCB0eXBlIFB1cFByb2dyZXNzQ2FsbGJhY2sgPSAocHJvZ3Jlc3M6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVwT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8UmVuZGVyT3B0aW9ucz4ge1xuICBjYW5jZWxRdWVyeT86IEFib3J0UXVlcnk7XG4gIG9uUHJvZ3Jlc3M/OiBQdXBQcm9ncmVzc0NhbGxiYWNrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1cFJlc3VsdCBleHRlbmRzIFJlbmRlclJlc3VsdCB7fVxuXG5hc3luYyBmdW5jdGlvbiBydW5QdXBBcHAoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IFB1cE9wdGlvbnMpIHtcbiAgbG9nZ2VyLmRlYnVnKFRBRywgYHJ1blB1cEFwcGAsIHNvdXJjZSwgb3B0aW9ucyk7XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbc291cmNlXTtcbiAgaWYgKG9wdGlvbnMud2lkdGgpIGFyZ3MucHVzaChcIi0td2lkdGhcIiwgYCR7b3B0aW9ucy53aWR0aH1gKTtcbiAgaWYgKG9wdGlvbnMuaGVpZ2h0KSBhcmdzLnB1c2goXCItLWhlaWdodFwiLCBgJHtvcHRpb25zLmhlaWdodH1gKTtcbiAgaWYgKG9wdGlvbnMuZnBzKSBhcmdzLnB1c2goXCItLWZwc1wiLCBgJHtvcHRpb25zLmZwc31gKTtcbiAgaWYgKG9wdGlvbnMuZHVyYXRpb24pIGFyZ3MucHVzaChcIi0tZHVyYXRpb25cIiwgYCR7b3B0aW9ucy5kdXJhdGlvbn1gKTtcbiAgaWYgKG9wdGlvbnMub3V0RGlyKSBhcmdzLnB1c2goXCItLW91dC1kaXJcIiwgb3B0aW9ucy5vdXREaXIpO1xuICBpZiAob3B0aW9ucy5mb3JtYXRzPy5sZW5ndGgpIGFyZ3MucHVzaChcIi0tZm9ybWF0c1wiLCBvcHRpb25zLmZvcm1hdHMuam9pbihcIixcIikpO1xuICBpZiAob3B0aW9ucy53aXRoQXVkaW8pIGFyZ3MucHVzaChcIi0td2l0aC1hdWRpb1wiKTtcbiAgaWYgKG9wdGlvbnMudXNlSW5uZXJQcm94eSkgYXJncy5wdXNoKFwiLS11c2UtaW5uZXItcHJveHlcIik7XG4gIGlmIChvcHRpb25zLmRldGVybWluaXN0aWMpIGFyZ3MucHVzaChcIi0tZGV0ZXJtaW5pc3RpY1wiKTtcblxuICBjb25zdCB3ID0gb3B0aW9ucy53aWR0aCA/PyBERUZBVUxUX1dJRFRIO1xuICBjb25zdCBoID0gb3B0aW9ucy5oZWlnaHQgPz8gREVGQVVMVF9IRUlHSFQ7XG4gIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHJ1bkVsZWN0cm9uQXBwKHsgd2lkdGg6IHcsIGhlaWdodDogaCB9LCBhcmdzKTtcbiAgY29uc3QgY291bnRlciA9IG5ldyBDb25jdXJyZW5jeUxpbWl0ZXIoMSk7XG4gIGhhbmRsZS5wcm9jZXNzLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICBsZXQgbWVzc2FnZSA9IGRhdGEudG9TdHJpbmcoKS50cmltKCk7XG4gICAgbGV0IHN0YXJ0ID0gbWVzc2FnZS5pbmRleE9mKFBST0dSRVNTX1RBRyk7XG4gICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtZXNzYWdlID0gbWVzc2FnZS5zbGljZShzdGFydCArIFBST0dSRVNTX1RBRy5sZW5ndGgpO1xuICAgIGNvbnN0IGVuZCA9IG1lc3NhZ2UuaW5kZXhPZihcIiVcIik7XG4gICAgaWYgKGVuZCA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3Jlc3NTdHIgPSBtZXNzYWdlLnNsaWNlKDAsIGVuZCk7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBwYXJzZU51bWJlcihwcm9ncmVzc1N0cik7XG4gICAgY291bnRlci5zY2hlZHVsZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBvcHRpb25zLm9uUHJvZ3Jlc3M/Lihwcm9ncmVzcyk7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4geyBoYW5kbGUsIGNvdW50ZXIgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1cChzb3VyY2U6IHN0cmluZywgb3B0aW9uczogUHVwT3B0aW9ucyk6IFByb21pc2U8UHVwUmVzdWx0PiB7XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIGBwdXBgLCBzb3VyY2UsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IGxpbmsgPSBBYm9ydExpbmsuc3RhcnQob3B0aW9ucy5jYW5jZWxRdWVyeSk7XG4gIGNvbnN0IG91dERpciA9IG9wdGlvbnMub3V0RGlyID8/IFwib3V0XCI7XG5cbiAgY29uc3QgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY29uc3QgeyBoYW5kbGUsIGNvdW50ZXIgfSA9IGF3YWl0IHJ1blB1cEFwcChzb3VyY2UsIHsgLi4ub3B0aW9ucywgb3V0RGlyIH0pO1xuXG4gIGF3YWl0IGxpbmsud2FpdChoYW5kbGUpO1xuICBhd2FpdCBjb3VudGVyLmVuZCgpO1xuICBsaW5rLnN0b3AoKTtcbiAgbG9nZ2VyLmluZm8oVEFHLCBgZG9uZSBpbiAke01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkgLSB0MCl9bXNgKTtcblxuICBjb25zdCBzdW1QYXRoID0gam9pbihvdXREaXIsIFwic3VtbWFyeS5qc29uXCIpO1xuICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShzdW1QYXRoLCBcInV0Zi04XCIpKSBhcyBSZW5kZXJSZXN1bHQ7XG59XG4iXX0=
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import 'source-map-support/register.js';
2
- import { RenderSchema, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_FPS, DEFAULT_DURATION, DEFAULT_OUT_DIR, pupUseInnerProxy, parseString, isVideoFormat, noerr, parseNumber, logger, pargs, pup } from './chunk-A5IYURQQ.js';
2
+ import { RenderSchema, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_FPS, DEFAULT_DURATION, DEFAULT_OUT_DIR, pupUseInnerProxy, parseString, isVideoFormat, noerr, parseNumber, logger, pargs, pup } from './chunk-CNRKD76V.js';
3
3
  import { program } from 'commander';
4
4
 
5
5
  async function makeCLI(name, callback) {
package/dist/index.d.ts CHANGED
@@ -4,6 +4,8 @@ export { AbortLink } from './_tsup-dts-rollup.js';
4
4
  export { pupLogLevel } from './_tsup-dts-rollup.js';
5
5
  export { pupUseInnerProxy } from './_tsup-dts-rollup.js';
6
6
  export { pupDisableGPU } from './_tsup-dts-rollup.js';
7
+ export { pupPkgRoot } from './_tsup-dts-rollup.js';
8
+ export { pupApp } from './_tsup-dts-rollup.js';
7
9
  export { penv } from './_tsup-dts-rollup.js';
8
10
  export { EnvParser } from './_tsup-dts-rollup.js';
9
11
  export { Lazy } from './_tsup-dts-rollup.js';