@cloudbase/storage 2.23.4-alpha.0 → 2.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,706 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
44
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ exports.SupabaseFileAPILikeStorage = void 0;
66
+ var utilities_1 = require("@cloudbase/utilities");
67
+ var storage_1 = require("../storage");
68
+ var errors_1 = require("./errors");
69
+ var ERRORS = utilities_1.constants.ERRORS;
70
+ var SupabaseFileAPILikeStorage = (function (_super) {
71
+ __extends(SupabaseFileAPILikeStorage, _super);
72
+ function SupabaseFileAPILikeStorage(context) {
73
+ var _this = _super.call(this) || this;
74
+ _this.shouldThrowOnError = false;
75
+ _this.bucketId = '';
76
+ _this.context = context;
77
+ return _this;
78
+ }
79
+ Object.defineProperty(SupabaseFileAPILikeStorage.prototype, "config", {
80
+ get: function () {
81
+ var _a;
82
+ return (_a = this.context) === null || _a === void 0 ? void 0 : _a.config;
83
+ },
84
+ enumerable: false,
85
+ configurable: true
86
+ });
87
+ Object.defineProperty(SupabaseFileAPILikeStorage.prototype, "request", {
88
+ get: function () {
89
+ var _a;
90
+ return (_a = this.context) === null || _a === void 0 ? void 0 : _a.request;
91
+ },
92
+ enumerable: false,
93
+ configurable: true
94
+ });
95
+ SupabaseFileAPILikeStorage.prototype.throwOnError = function () {
96
+ this.shouldThrowOnError = true;
97
+ return this;
98
+ };
99
+ SupabaseFileAPILikeStorage.prototype.from = function (bucket) {
100
+ this.bucketId = bucket || '';
101
+ return this;
102
+ };
103
+ SupabaseFileAPILikeStorage.prototype.upload = function (path, fileBody, fileOptions) {
104
+ return __awaiter(this, void 0, void 0, function () {
105
+ var options, cacheControl, contentType, metadata, cloudPath, uploadFileParams, headers, result, error_1;
106
+ return __generator(this, function (_a) {
107
+ switch (_a.label) {
108
+ case 0:
109
+ options = __assign({ upsert: true }, fileOptions);
110
+ cacheControl = options.cacheControl, contentType = options.contentType, metadata = options.metadata;
111
+ _a.label = 1;
112
+ case 1:
113
+ _a.trys.push([1, 3, , 4]);
114
+ cloudPath = this._getCloudPath(path);
115
+ uploadFileParams = {
116
+ cloudPath: cloudPath,
117
+ filePath: fileBody,
118
+ };
119
+ if (cacheControl || contentType || metadata) {
120
+ headers = {};
121
+ if (cacheControl) {
122
+ headers['cache-control'] = cacheControl;
123
+ }
124
+ if (contentType) {
125
+ headers['content-type'] = contentType;
126
+ }
127
+ if (metadata) {
128
+ headers['x-cos-metadata-metadata'] = this.toBase64(JSON.stringify(metadata));
129
+ }
130
+ uploadFileParams.headers = headers;
131
+ }
132
+ return [4, this.uploadFile(uploadFileParams)];
133
+ case 2:
134
+ result = _a.sent();
135
+ if (!result.fileID) {
136
+ throw new Error(JSON.stringify({
137
+ code: ERRORS.OPERATION_FAIL,
138
+ msg: "[".concat(storage_1.COMPONENT_NAME, ".update] no fileID returned"),
139
+ }));
140
+ }
141
+ return [2, {
142
+ data: {
143
+ id: result.fileID,
144
+ path: path,
145
+ fullPath: path,
146
+ },
147
+ error: null,
148
+ }];
149
+ case 3:
150
+ error_1 = _a.sent();
151
+ if (this.shouldThrowOnError)
152
+ throw error_1;
153
+ if ((0, errors_1.isStorageError)(error_1)) {
154
+ return [2, {
155
+ data: null,
156
+ error: error_1,
157
+ }];
158
+ }
159
+ throw error_1;
160
+ case 4: return [2];
161
+ }
162
+ });
163
+ });
164
+ };
165
+ SupabaseFileAPILikeStorage.prototype.uploadToSignedUrl = function (path, _token, fileBody, fileOptions) {
166
+ return __awaiter(this, void 0, void 0, function () {
167
+ return __generator(this, function (_a) {
168
+ return [2, this.upload(path, fileBody, fileOptions)];
169
+ });
170
+ });
171
+ };
172
+ SupabaseFileAPILikeStorage.prototype.createSignedUploadUrl = function (path) {
173
+ return __awaiter(this, void 0, void 0, function () {
174
+ var cloudPath, metadata, error_2;
175
+ return __generator(this, function (_a) {
176
+ switch (_a.label) {
177
+ case 0:
178
+ _a.trys.push([0, 2, , 3]);
179
+ cloudPath = this._getCloudPath(path);
180
+ return [4, this.getUploadMetadata({ cloudPath: cloudPath })];
181
+ case 1:
182
+ metadata = (_a.sent()).data;
183
+ return [2, {
184
+ data: {
185
+ signedUrl: metadata.url,
186
+ token: metadata.token,
187
+ path: path,
188
+ authorization: metadata.authorization,
189
+ id: metadata.fileId,
190
+ cosFileId: metadata.cosFileId,
191
+ downloadUrl: metadata.download_url,
192
+ },
193
+ error: null,
194
+ }];
195
+ case 2:
196
+ error_2 = _a.sent();
197
+ if (this.shouldThrowOnError)
198
+ throw error_2;
199
+ return [2, {
200
+ data: null,
201
+ error: error_2 instanceof errors_1.StorageError ? error_2 : new errors_1.StorageError(error_2.message),
202
+ }];
203
+ case 3: return [2];
204
+ }
205
+ });
206
+ });
207
+ };
208
+ SupabaseFileAPILikeStorage.prototype.update = function (path, fileBody, fileOptions) {
209
+ return __awaiter(this, void 0, void 0, function () {
210
+ return __generator(this, function (_a) {
211
+ return [2, this.upload(path, fileBody, __assign(__assign({}, fileOptions), { upsert: true }))];
212
+ });
213
+ });
214
+ };
215
+ SupabaseFileAPILikeStorage.prototype.move = function (fromPath, toPath) {
216
+ return __awaiter(this, void 0, void 0, function () {
217
+ var result, error_3;
218
+ return __generator(this, function (_a) {
219
+ switch (_a.label) {
220
+ case 0:
221
+ _a.trys.push([0, 2, , 3]);
222
+ return [4, this.copyFile({
223
+ fileList: [
224
+ {
225
+ srcPath: this._getCloudPath(fromPath),
226
+ dstPath: this._getCloudPath(toPath),
227
+ overwrite: true,
228
+ removeOriginal: true,
229
+ },
230
+ ],
231
+ })];
232
+ case 1:
233
+ result = _a.sent();
234
+ if (result.fileList[0].code && result.fileList[0].code !== 'SUCCESS') {
235
+ throw new errors_1.StorageError(result.fileList[0].message || 'Move failed');
236
+ }
237
+ return [2, {
238
+ data: { message: "File moved from ".concat(fromPath, " to ").concat(toPath) },
239
+ error: null,
240
+ }];
241
+ case 2:
242
+ error_3 = _a.sent();
243
+ if (this.shouldThrowOnError)
244
+ throw error_3;
245
+ if ((0, errors_1.isStorageError)(error_3)) {
246
+ return [2, {
247
+ data: null,
248
+ error: error_3,
249
+ }];
250
+ }
251
+ throw error_3;
252
+ case 3: return [2];
253
+ }
254
+ });
255
+ });
256
+ };
257
+ SupabaseFileAPILikeStorage.prototype.copy = function (fromPath, toPath) {
258
+ return __awaiter(this, void 0, void 0, function () {
259
+ var result, error_4;
260
+ return __generator(this, function (_a) {
261
+ switch (_a.label) {
262
+ case 0:
263
+ _a.trys.push([0, 2, , 3]);
264
+ return [4, this.copyFile({
265
+ fileList: [
266
+ {
267
+ srcPath: this._getCloudPath(fromPath),
268
+ dstPath: this._getCloudPath(toPath),
269
+ overwrite: true,
270
+ removeOriginal: false,
271
+ },
272
+ ],
273
+ })];
274
+ case 1:
275
+ result = _a.sent();
276
+ if (result.fileList[0].code && result.fileList[0].code !== 'SUCCESS') {
277
+ throw new errors_1.StorageError(result.fileList[0].message || 'Copy failed');
278
+ }
279
+ return [2, {
280
+ data: { path: this._getCloudPath(toPath) },
281
+ error: null,
282
+ }];
283
+ case 2:
284
+ error_4 = _a.sent();
285
+ if (this.shouldThrowOnError)
286
+ throw error_4;
287
+ if ((0, errors_1.isStorageError)(error_4)) {
288
+ return [2, { data: null, error: error_4 }];
289
+ }
290
+ throw error_4;
291
+ case 3: return [2];
292
+ }
293
+ });
294
+ });
295
+ };
296
+ SupabaseFileAPILikeStorage.prototype.createSignedUrl = function (path, expiresIn, options) {
297
+ return __awaiter(this, void 0, void 0, function () {
298
+ var cloudPath, result, signedUrl, queryParams, transformQuery, separator, error_5;
299
+ return __generator(this, function (_a) {
300
+ switch (_a.label) {
301
+ case 0:
302
+ _a.trys.push([0, 2, , 3]);
303
+ cloudPath = this._normalizeCloudId(path);
304
+ return [4, this.getTempFileURL({
305
+ fileList: [
306
+ {
307
+ fileID: cloudPath,
308
+ maxAge: expiresIn,
309
+ },
310
+ ],
311
+ })];
312
+ case 1:
313
+ result = _a.sent();
314
+ if (result.fileList[0].code !== 'SUCCESS') {
315
+ throw new errors_1.StorageError("Failed to create signed URL: [".concat(result.fileList[0].code, "] ").concat(result.fileList[0].fileID));
316
+ }
317
+ signedUrl = result.fileList[0].download_url;
318
+ queryParams = [];
319
+ if ((options === null || options === void 0 ? void 0 : options.download) !== undefined) {
320
+ if (typeof options.download === 'string') {
321
+ queryParams.push("download=".concat(encodeURIComponent(options.download)));
322
+ }
323
+ else if (options.download === true) {
324
+ queryParams.push('download=true');
325
+ }
326
+ }
327
+ if (options === null || options === void 0 ? void 0 : options.transform) {
328
+ transformQuery = this._transformOptsToQueryString(options.transform);
329
+ if (transformQuery) {
330
+ queryParams.push(transformQuery);
331
+ }
332
+ }
333
+ if (queryParams.length > 0) {
334
+ separator = signedUrl.includes('?') ? '&' : '?';
335
+ signedUrl = "".concat(signedUrl).concat(separator).concat(queryParams.join('&'));
336
+ }
337
+ return [2, {
338
+ data: { signedUrl: signedUrl },
339
+ error: null,
340
+ }];
341
+ case 2:
342
+ error_5 = _a.sent();
343
+ if (this.shouldThrowOnError)
344
+ throw error_5;
345
+ if ((0, errors_1.isStorageError)(error_5)) {
346
+ return [2, {
347
+ data: null,
348
+ error: error_5,
349
+ }];
350
+ }
351
+ throw error_5;
352
+ case 3: return [2];
353
+ }
354
+ });
355
+ });
356
+ };
357
+ SupabaseFileAPILikeStorage.prototype.createSignedUrls = function (paths, expiresIn) {
358
+ return __awaiter(this, void 0, void 0, function () {
359
+ var fileList, result, error_6;
360
+ var _this = this;
361
+ return __generator(this, function (_a) {
362
+ switch (_a.label) {
363
+ case 0:
364
+ _a.trys.push([0, 2, , 3]);
365
+ fileList = paths.map(function (p) { return ({
366
+ fileID: _this._normalizeCloudId(p),
367
+ maxAge: expiresIn,
368
+ }); });
369
+ return [4, this.getTempFileURL({ fileList: fileList })];
370
+ case 1:
371
+ result = _a.sent();
372
+ return [2, {
373
+ data: result.fileList.map(function (item, index) { return ({
374
+ path: paths[index],
375
+ signedUrl: item.tempFileURL || '',
376
+ error: item.code === 'SUCCESS' ? null : item.message,
377
+ }); }),
378
+ error: null,
379
+ }];
380
+ case 2:
381
+ error_6 = _a.sent();
382
+ if (this.shouldThrowOnError)
383
+ throw error_6;
384
+ if ((0, errors_1.isStorageError)(error_6)) {
385
+ return [2, {
386
+ data: null,
387
+ error: error_6,
388
+ }];
389
+ }
390
+ throw error_6;
391
+ case 3: return [2];
392
+ }
393
+ });
394
+ });
395
+ };
396
+ SupabaseFileAPILikeStorage.prototype.download = function (path, options) {
397
+ return __awaiter(this, void 0, void 0, function () {
398
+ var error_7;
399
+ var _a;
400
+ var _this = this;
401
+ return __generator(this, function (_b) {
402
+ switch (_b.label) {
403
+ case 0:
404
+ _b.trys.push([0, 2, , 3]);
405
+ _a = {};
406
+ return [4, (function () { return __awaiter(_this, void 0, void 0, function () {
407
+ var signedUrlResult, tmpUrl, data;
408
+ var _a;
409
+ return __generator(this, function (_b) {
410
+ switch (_b.label) {
411
+ case 0: return [4, this.createSignedUrl(path, 600, { transform: options })];
412
+ case 1:
413
+ signedUrlResult = _b.sent();
414
+ if (signedUrlResult.error) {
415
+ throw signedUrlResult.error;
416
+ }
417
+ tmpUrl = encodeURI((_a = signedUrlResult.data) === null || _a === void 0 ? void 0 : _a.signedUrl);
418
+ return [4, this.request.reqClass.get({
419
+ url: tmpUrl,
420
+ headers: {},
421
+ responseType: 'blob',
422
+ })];
423
+ case 2:
424
+ data = (_b.sent()).data;
425
+ if (!data) {
426
+ throw new errors_1.StorageError('Download failed: no file content');
427
+ }
428
+ return [2, new Blob([data])];
429
+ }
430
+ });
431
+ }); })()];
432
+ case 1: return [2, (_a.data = _b.sent(),
433
+ _a.error = null,
434
+ _a)];
435
+ case 2:
436
+ error_7 = _b.sent();
437
+ if (this.shouldThrowOnError)
438
+ throw error_7;
439
+ if ((0, errors_1.isStorageError)(error_7)) {
440
+ return [2, {
441
+ data: null,
442
+ error: error_7,
443
+ }];
444
+ }
445
+ throw error_7;
446
+ case 3: return [2];
447
+ }
448
+ });
449
+ });
450
+ };
451
+ SupabaseFileAPILikeStorage.prototype.info = function (pathOrFileId) {
452
+ return __awaiter(this, void 0, void 0, function () {
453
+ var isFileId, displayName, bucketId, fileInfo, item, now, lastModified, error_8;
454
+ return __generator(this, function (_a) {
455
+ switch (_a.label) {
456
+ case 0:
457
+ _a.trys.push([0, 2, , 3]);
458
+ isFileId = pathOrFileId.startsWith('cloud://');
459
+ displayName = isFileId ? this._extractPathFromFileId(pathOrFileId) : pathOrFileId;
460
+ bucketId = isFileId ? this._extractBucketFromFileId(pathOrFileId) : this.bucketId;
461
+ return [4, this.getFileInfo({
462
+ fileList: [this._normalizeCloudId(pathOrFileId)],
463
+ })];
464
+ case 1:
465
+ fileInfo = _a.sent();
466
+ item = fileInfo.fileList[0];
467
+ if (item.code !== 'SUCCESS') {
468
+ throw new errors_1.StorageError(item.message);
469
+ }
470
+ now = new Date().toISOString();
471
+ lastModified = (item.lastModified ? new Date(item.lastModified) : new Date()).toISOString();
472
+ return [2, {
473
+ data: {
474
+ id: item.fileID,
475
+ version: '1',
476
+ name: displayName,
477
+ bucketId: bucketId,
478
+ updatedAt: lastModified,
479
+ createdAt: lastModified,
480
+ lastAccessedAt: now,
481
+ size: item.size,
482
+ cacheControl: item.cacheControl,
483
+ contentType: item.contentType,
484
+ etag: item.etag,
485
+ lastModified: lastModified,
486
+ metadata: {},
487
+ },
488
+ error: null,
489
+ }];
490
+ case 2:
491
+ error_8 = _a.sent();
492
+ if (this.shouldThrowOnError)
493
+ throw error_8;
494
+ return [2, {
495
+ data: null,
496
+ error: error_8 instanceof errors_1.StorageError ? error_8 : new errors_1.StorageError(error_8.message),
497
+ }];
498
+ case 3: return [2];
499
+ }
500
+ });
501
+ });
502
+ };
503
+ SupabaseFileAPILikeStorage.prototype.exists = function (pathOrFileId) {
504
+ return __awaiter(this, void 0, void 0, function () {
505
+ var fileInfo, item, error_9;
506
+ return __generator(this, function (_a) {
507
+ switch (_a.label) {
508
+ case 0:
509
+ _a.trys.push([0, 2, , 3]);
510
+ return [4, this.getFileInfo({
511
+ fileList: [this._normalizeCloudId(pathOrFileId)],
512
+ })];
513
+ case 1:
514
+ fileInfo = _a.sent();
515
+ item = fileInfo.fileList[0];
516
+ if (item.code === 'FILE_NOT_FOUND') {
517
+ return [2, {
518
+ data: false,
519
+ error: null,
520
+ }];
521
+ }
522
+ if (item.code !== 'SUCCESS') {
523
+ throw new errors_1.StorageError(item.message);
524
+ }
525
+ return [2, { data: true, error: null }];
526
+ case 2:
527
+ error_9 = _a.sent();
528
+ if (this.shouldThrowOnError)
529
+ throw error_9;
530
+ throw error_9;
531
+ case 3: return [2];
532
+ }
533
+ });
534
+ });
535
+ };
536
+ SupabaseFileAPILikeStorage.prototype.getPublicUrl = function (path, options) {
537
+ return __awaiter(this, void 0, void 0, function () {
538
+ var res;
539
+ return __generator(this, function (_a) {
540
+ switch (_a.label) {
541
+ case 0: return [4, this.createSignedUrl(path, 600, options)];
542
+ case 1:
543
+ res = _a.sent();
544
+ if (res.data) {
545
+ return [2, {
546
+ data: { publicUrl: res.data.signedUrl },
547
+ }];
548
+ }
549
+ return [2, { data: null, error: res.error }];
550
+ }
551
+ });
552
+ });
553
+ };
554
+ SupabaseFileAPILikeStorage.prototype.remove = function (paths) {
555
+ return __awaiter(this, void 0, void 0, function () {
556
+ var chunkSize_1, pathChunks, i, fileInfoResults, fileInfoMap_1, fileList, result, failedFiles, now_1, error_10;
557
+ var _this = this;
558
+ return __generator(this, function (_a) {
559
+ switch (_a.label) {
560
+ case 0:
561
+ _a.trys.push([0, 3, , 4]);
562
+ chunkSize_1 = 10;
563
+ pathChunks = [];
564
+ for (i = 0; i < paths.length; i += chunkSize_1) {
565
+ pathChunks.push(paths.slice(i, i + chunkSize_1));
566
+ }
567
+ return [4, Promise.all(pathChunks.map(function (chunk) { return Promise.all(chunk.map(function (path) { return _this.info(path); })); }))];
568
+ case 1:
569
+ fileInfoResults = _a.sent();
570
+ fileInfoMap_1 = new Map();
571
+ fileInfoResults.flat().forEach(function (result, index) {
572
+ if (result.data) {
573
+ fileInfoMap_1.set(paths[Math.floor(index / chunkSize_1) * chunkSize_1 + (index % chunkSize_1)], result.data);
574
+ }
575
+ });
576
+ fileList = paths.map(function (p) { return _this._normalizeCloudId(p); });
577
+ return [4, this.deleteFile({ fileList: fileList })];
578
+ case 2:
579
+ result = _a.sent();
580
+ failedFiles = result.fileList.filter(function (item) { return item.code !== 'SUCCESS'; });
581
+ if (failedFiles.length > 0) {
582
+ throw new errors_1.StorageError("Delete failed for ".concat(failedFiles.length, " file(s)"));
583
+ }
584
+ now_1 = new Date().toISOString();
585
+ return [2, {
586
+ data: paths.map(function (p) {
587
+ var info = fileInfoMap_1.get(p);
588
+ return {
589
+ name: info === null || info === void 0 ? void 0 : info.name,
590
+ id: info === null || info === void 0 ? void 0 : info.id,
591
+ bucket_id: info === null || info === void 0 ? void 0 : info.bucketId,
592
+ owner: undefined,
593
+ updated_at: (info === null || info === void 0 ? void 0 : info.updatedAt) || now_1,
594
+ created_at: info === null || info === void 0 ? void 0 : info.createdAt,
595
+ last_accessed_at: (info === null || info === void 0 ? void 0 : info.lastAccessedAt) || now_1,
596
+ metadata: (info === null || info === void 0 ? void 0 : info.metadata) || {},
597
+ buckets: {
598
+ id: info === null || info === void 0 ? void 0 : info.bucketId,
599
+ name: info === null || info === void 0 ? void 0 : info.bucketId,
600
+ owner: undefined,
601
+ public: false,
602
+ created_at: '',
603
+ updated_at: now_1,
604
+ },
605
+ };
606
+ }),
607
+ error: null,
608
+ }];
609
+ case 3:
610
+ error_10 = _a.sent();
611
+ if (this.shouldThrowOnError)
612
+ throw error_10;
613
+ if ((0, errors_1.isStorageError)(error_10)) {
614
+ return [2, {
615
+ data: null,
616
+ error: error_10,
617
+ }];
618
+ }
619
+ throw error_10;
620
+ case 4: return [2];
621
+ }
622
+ });
623
+ });
624
+ };
625
+ SupabaseFileAPILikeStorage.prototype.list = function () {
626
+ return __awaiter(this, void 0, void 0, function () {
627
+ return __generator(this, function (_a) {
628
+ throw new errors_1.StorageError('Not implemented');
629
+ });
630
+ });
631
+ };
632
+ SupabaseFileAPILikeStorage.prototype._getCloudPath = function (path) {
633
+ var cleanPath = path.replace(/^\/|\/$/g, '').replace(/\/+/g, '/');
634
+ return cleanPath;
635
+ };
636
+ SupabaseFileAPILikeStorage.prototype._normalizeCloudId = function (path) {
637
+ var _a;
638
+ if (/^cloud:\/\//.test(path)) {
639
+ return path;
640
+ }
641
+ var cleanPath = this._getCloudPath(path);
642
+ if (this.bucketId) {
643
+ var envId = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.env) || '';
644
+ if (envId) {
645
+ return "cloud://".concat(envId, ".").concat(this.bucketId, "/").concat(cleanPath);
646
+ }
647
+ }
648
+ else {
649
+ throw new errors_1.StorageError('bucketId is not set');
650
+ }
651
+ };
652
+ SupabaseFileAPILikeStorage.prototype.toBase64 = function (data) {
653
+ if (typeof Buffer !== 'undefined') {
654
+ return Buffer.from(data).toString('base64');
655
+ }
656
+ return btoa(data);
657
+ };
658
+ SupabaseFileAPILikeStorage.prototype._transformOptsToQueryString = function (transform) {
659
+ var params = ['imageMogr2'];
660
+ if (transform.width || transform.height) {
661
+ var width = transform.width || '';
662
+ var height = transform.height || '';
663
+ if (transform.resize === 'fill') {
664
+ params.push("thumbnail/".concat(width, "x").concat(height, "!"));
665
+ }
666
+ else if (transform.resize === 'contain') {
667
+ params.push("thumbnail/".concat(width, "x").concat(height));
668
+ }
669
+ else {
670
+ params.push("thumbnail/".concat(width, "x").concat(height, "^"));
671
+ }
672
+ }
673
+ if (transform.format && transform.format !== 'origin') {
674
+ params.push("format/".concat(transform.format));
675
+ }
676
+ if (transform.quality !== undefined) {
677
+ var quality = Math.max(1, Math.min(100, transform.quality));
678
+ params.push("quality/".concat(quality));
679
+ }
680
+ return params.join('/');
681
+ };
682
+ SupabaseFileAPILikeStorage.prototype._extractPathFromFileId = function (fileId) {
683
+ var withoutProtocol = fileId.replace(/^cloud:\/\//, '');
684
+ var parts = withoutProtocol.split('/');
685
+ if (parts.length < 2) {
686
+ return fileId;
687
+ }
688
+ return parts.slice(1).join('/');
689
+ };
690
+ SupabaseFileAPILikeStorage.prototype._extractBucketFromFileId = function (fileId) {
691
+ var withoutProtocol = fileId.replace(/^cloud:\/\//, '');
692
+ var parts = withoutProtocol.split('/');
693
+ if (parts.length < 1) {
694
+ return '';
695
+ }
696
+ var envAndBucket = parts[0];
697
+ var dotIndex = envAndBucket.indexOf('.');
698
+ if (dotIndex === -1) {
699
+ return envAndBucket;
700
+ }
701
+ return envAndBucket.substring(dotIndex + 1);
702
+ };
703
+ return SupabaseFileAPILikeStorage;
704
+ }(storage_1.CloudbaseStorage));
705
+ exports.SupabaseFileAPILikeStorage = SupabaseFileAPILikeStorage;
706
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3VwYWJhc2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBZ0Q7QUFFaEQsc0NBQWdGO0FBR2hGLG1DQUF1RDtBQUUvQyxJQUFBLE1BQU0sR0FBSyxxQkFBUyxPQUFkLENBQWM7QUFFNUI7SUFBZ0QsOENBQWdCO0lBSzlELG9DQUFZLE9BQTJCO1FBQXZDLFlBQ0UsaUJBQU8sU0FFUjtRQVBPLHdCQUFrQixHQUFHLEtBQUssQ0FBQTtRQUMxQixjQUFRLEdBQUcsRUFBRSxDQUFBO1FBS25CLEtBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBOztJQUN4QixDQUFDO0lBRUQsc0JBQUksOENBQU07YUFBVjs7WUFFRSxPQUFPLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsTUFBTSxDQUFBO1FBQzdCLENBQUM7OztPQUFBO0lBRUQsc0JBQUksK0NBQU87YUFBWDs7WUFFRSxPQUFPLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsT0FBTyxDQUFBO1FBQzlCLENBQUM7OztPQUFBO0lBRUQsaURBQVksR0FBWjtRQUNFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7UUFDOUIsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQseUNBQUksR0FBSixVQUFLLE1BQWU7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFBO1FBQzVCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVLLDJDQUFNLEdBQVosVUFDRSxJQUFZLEVBQ1osUUFBa0IsRUFDbEIsV0FBeUI7Ozs7Ozt3QkFJbkIsT0FBTyxjQUFLLE1BQU0sRUFBRSxJQUFJLElBQUssV0FBVyxDQUFFLENBQUE7d0JBQ3hDLFlBQVksR0FBNEIs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Q0FBQTtJQUNqQyxDQUFDO0lBaUJPLDZEQUF3QixHQUFoQyxVQUFpQyxNQUFjO1FBSzdDLElBQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBR3pELElBQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFeEMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUVwQixPQUFPLEVBQUUsQ0FBQTtTQUNWO1FBSUQsSUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRzdCLElBQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFMUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFFbkIsT0FBTyxZQUFZLENBQUE7U0FDcEI7UUFHRCxPQUFPLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFDSCxpQ0FBQztBQUFELENBQUMsQUFodUJELENBQWdELDBCQUFnQixHQWd1Qi9EO0FBaHVCWSxnRUFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcblxuaW1wb3J0IHsgQ2xvdWRiYXNlU3RvcmFnZSwgQ09NUE9ORU5UX05BTUUsIElDbG91ZGJhc2VDb250ZXh0IH0gZnJvbSAnLi4vc3RvcmFnZSdcblxuaW1wb3J0IHsgQ2FtZWxpemUsIEZpbGVCb2R5LCBGaWxlT2JqZWN0LCBGaWxlT2JqZWN0VjIsIEZpbGVPcHRpb25zLCBUcmFuc2Zvcm1PcHRpb25zIH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IGlzU3RvcmFnZUVycm9yLCBTdG9yYWdlRXJyb3IgfSBmcm9tICcuL2Vycm9ycydcblxuY29uc3QgeyBFUlJPUlMgfSA9IGNvbnN0YW50c1xuXG5leHBvcnQgY2xhc3MgU3VwYWJhc2VGaWxlQVBJTGlrZVN0b3JhZ2UgZXh0ZW5kcyBDbG91ZGJhc2VTdG9yYWdlIHtcbiAgcHJpdmF0ZSBzaG91bGRUaHJvd09uRXJyb3IgPSBmYWxzZVxuICBwcml2YXRlIGJ1Y2tldElkID0gJydcbiAgcHJpdmF0ZSBjb250ZXh0OiBJQ2xvdWRiYXNlQ29udGV4dFxuXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ/OiBJQ2xvdWRiYXNlQ29udGV4dCkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBnZXQgY29uZmlnKCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0Py5jb25maWdcbiAgfVxuXG4gIGdldCByZXF1ZXN0KCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0Py5yZXF1ZXN0XG4gIH1cblxuICB0aHJvd09uRXJyb3IoKTogdGhpcyB7XG4gICAgdGhpcy5zaG91bGRUaHJvd09uRXJyb3IgPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGZyb20oYnVja2V0Pzogc3RyaW5nKSB7XG4gICAgdGhpcy5idWNrZXRJZCA9IGJ1Y2tldCB8fCAnJ1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBhc3luYyB1cGxvYWQoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGVCb2R5OiBGaWxlQm9keSxcbiAgICBmaWxlT3B0aW9ucz86IEZpbGVPcHRpb25zLFxuICApOiBQcm9taXNlPFxuICAgIHsgZGF0YTogeyBpZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmcgfTsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9XG4gICAgPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgdXBzZXJ0OiB0cnVlLCAuLi5maWxlT3B0aW9ucyB9XG4gICAgY29uc3QgeyBjYWNoZUNvbnRyb2wsIGNvbnRlbnRUeXBlLCBtZXRhZGF0YSB9ID0gb3B0aW9uc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbG91ZFBhdGggPSB0aGlzLl9nZXRDbG91ZFBhdGgocGF0aClcbiAgICAgIGNvbnN0IHVwbG9hZEZpbGVQYXJhbXM6IFBhcmFtZXRlcnM8Q2xvdWRiYXNlU3RvcmFnZVsndXBsb2FkRmlsZSddPlswXSA9IHtcbiAgICAgICAgY2xvdWRQYXRoLFxuICAgICAgICBmaWxlUGF0aDogZmlsZUJvZHkgYXMgYW55LFxuICAgICAgfVxuXG4gICAgICBpZiAoY2FjaGVDb250cm9sIHx8IGNvbnRlbnRUeXBlIHx8IG1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fVxuICAgICAgICBpZiAoY2FjaGVDb250cm9sKSB7XG4gICAgICAgICAgaGVhZGVyc1snY2FjaGUtY29udHJvbCddID0gY2FjaGVDb250cm9sXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBjb250ZW50VHlwZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICAgICAgaGVhZGVyc1sneC1jb3MtbWV0YWRhdGEtbWV0YWRhdGEnXSA9IHRoaXMudG9CYXNlNjQoSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpKVxuICAgICAgICB9XG5cbiAgICAgICAgdXBsb2FkRmlsZVBhcmFtcy5oZWFkZXJzID0gaGVhZGVyc1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnVwbG9hZEZpbGUodXBsb2FkRmlsZVBhcmFtcylcblxuICAgICAgLy8gSVVwbG9hZEZpbGVSZXMg5rKh5pyJIGNvZGUg5a2X5q6177yM5aaC5p6c5rKh5pyJIGZpbGVJRCDliJnooajnpLrlpLHotKVcbiAgICAgIGlmICghcmVzdWx0LmZpbGVJRCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNvZGU6IEVSUk9SUy5PUEVSQVRJT05fRkFJTCxcbiAgICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0udXBkYXRlXSBubyBmaWxlSUQgcmV0dXJuZWRgLFxuICAgICAgICB9KSwpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBpZDogcmVzdWx0LmZpbGVJRCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIGZ1bGxQYXRoOiBwYXRoLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGxvYWRUb1NpZ25lZFVybChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgX3Rva2VuOiBzdHJpbmcsXG4gICAgZmlsZUJvZHk6IEZpbGVCb2R5LFxuICAgIGZpbGVPcHRpb25zPzogRmlsZU9wdGlvbnMsXG4gICk6IFByb21pc2U8XG4gICAgeyBkYXRhOiB7IGlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZyB9OyBlcnJvcjogbnVsbCB9IHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH1cbiAgICA+IHtcbiAgICByZXR1cm4gdGhpcy51cGxvYWQocGF0aCwgZmlsZUJvZHksIGZpbGVPcHRpb25zKVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2lnbmVkVXBsb2FkVXJsKHBhdGg6IHN0cmluZyk6IFByb21pc2U8XG4gIHwge1xuICAgIGRhdGE6IHtcbiAgICAgIHNpZ25lZFVybDogc3RyaW5nXG4gICAgICB0b2tlbjogc3RyaW5nXG4gICAgICBwYXRoOiBzdHJpbmdcbiAgICAgIC8vIENsb3VkQmFzZSDpop3lpJbnmoTlhYPmlbDmja7lrZfmrrVcbiAgICAgIGF1dGhvcml6YXRpb24/OiBzdHJpbmdcbiAgICAgIGlkPzogc3RyaW5nXG4gICAgICBjb3NGaWxlSWQ/OiBzdHJpbmdcbiAgICAgIGRvd25sb2FkVXJsPzogc3RyaW5nXG4gICAgfVxuICAgIGVycm9yOiBudWxsXG4gIH1cbiAgfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICA+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xvdWRQYXRoID0gdGhpcy5fZ2V0Q2xvdWRQYXRoKHBhdGgpXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogbWV0YWRhdGEgfSA9IGF3YWl0IHRoaXMuZ2V0VXBsb2FkTWV0YWRhdGEoeyBjbG91ZFBhdGggfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHNpZ25lZFVybDogbWV0YWRhdGEudXJsLFxuICAgICAgICAgIHRva2VuOiBtZXRhZGF0YS50b2tlbixcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIC8vIOi/lOWbniBDbG91ZEJhc2Ug55qE6aKd5aSW5YWD5pWw5o2u77yM5L6bIHVwbG9hZFRvU2lnbmVkVXJsIOS9v+eUqFxuICAgICAgICAgIGF1dGhvcml6YXRpb246IG1ldGFkYXRhLmF1dGhvcml6YXRpb24sXG4gICAgICAgICAgaWQ6IG1ldGFkYXRhLmZpbGVJZCxcbiAgICAgICAgICBjb3NGaWxlSWQ6IG1ldGFkYXRhLmNvc0ZpbGVJZCxcbiAgICAgICAgICBkb3dubG9hZFVybDogbWV0YWRhdGEuZG93bmxvYWRfdXJsLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IgPyBlcnJvciA6IG5ldyBTdG9yYWdlRXJyb3IoZXJyb3IubWVzc2FnZSksXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBmaWxlQm9keTogRmlsZUJvZHksXG4gICAgZmlsZU9wdGlvbnM/OiBGaWxlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxcbiAgICB7IGRhdGE6IHsgaWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nIH07IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICAgID4ge1xuICAgIHJldHVybiB0aGlzLnVwbG9hZChwYXRoLCBmaWxlQm9keSwgeyAuLi5maWxlT3B0aW9ucywgdXBzZXJ0OiB0cnVlIH0pXG4gIH1cblxuICBhc3luYyBtb3ZlKFxuICAgIGZyb21QYXRoOiBzdHJpbmcsXG4gICAgdG9QYXRoOiBzdHJpbmcsXG4gICAgLy8gb3B0aW9ucz86IERlc3RpbmF0aW9uT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx7IGRhdGE6IHsgbWVzc2FnZTogc3RyaW5nIH07IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvcHlGaWxlKHtcbiAgICAgICAgZmlsZUxpc3Q6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzcmNQYXRoOiB0aGlzLl9nZXRDbG91ZFBhdGgoZnJvbVBhdGgpLFxuICAgICAgICAgICAgZHN0UGF0aDogdGhpcy5fZ2V0Q2xvdWRQYXRoKHRvUGF0aCksXG4gICAgICAgICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgICAgICAgICByZW1vdmVPcmlnaW5hbDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSlcblxuICAgICAgaWYgKHJlc3VsdC5maWxlTGlzdFswXS5jb2RlICYmIHJlc3VsdC5maWxlTGlzdFswXS5jb2RlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihyZXN1bHQuZmlsZUxpc3RbMF0ubWVzc2FnZSB8fCAnTW92ZSBmYWlsZWQnKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7IG1lc3NhZ2U6IGBGaWxlIG1vdmVkIGZyb20gJHtmcm9tUGF0aH0gdG8gJHt0b1BhdGh9YCB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb3B5KFxuICAgIGZyb21QYXRoOiBzdHJpbmcsXG4gICAgdG9QYXRoOiBzdHJpbmcsXG4gICAgLy8gb3B0aW9ucz86IERlc3RpbmF0aW9uT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx7IGRhdGE6IHsgcGF0aDogc3RyaW5nIH07IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvcHlGaWxlKHtcbiAgICAgICAgZmlsZUxpc3Q6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzcmNQYXRoOiB0aGlzLl9nZXRDbG91ZFBhdGgoZnJvbVBhdGgpLFxuICAgICAgICAgICAgZHN0UGF0aDogdGhpcy5fZ2V0Q2xvdWRQYXRoKHRvUGF0aCksXG4gICAgICAgICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgICAgICAgICByZW1vdmVPcmlnaW5hbDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChyZXN1bHQuZmlsZUxpc3RbMF0uY29kZSAmJiByZXN1bHQuZmlsZUxpc3RbMF0uY29kZSAhPT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IocmVzdWx0LmZpbGVMaXN0WzBdLm1lc3NhZ2UgfHwgJ0NvcHkgZmFpbGVkJylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogeyBwYXRoOiB0aGlzLl9nZXRDbG91ZFBhdGgodG9QYXRoKSB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2lnbmVkVXJsKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBleHBpcmVzSW46IG51bWJlcixcbiAgICBvcHRpb25zPzoge1xuICAgICAgZG93bmxvYWQ/OiBzdHJpbmcgfCBib29sZWFuXG4gICAgICB0cmFuc2Zvcm0/OiBUcmFuc2Zvcm1PcHRpb25zXG4gICAgfSxcbiAgKTogUHJvbWlzZTx7IGRhdGE6IHsgc2lnbmVkVXJsOiBzdHJpbmcgfTsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsb3VkUGF0aCA9IHRoaXMuX25vcm1hbGl6ZUNsb3VkSWQocGF0aClcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0VGVtcEZpbGVVUkwoe1xuICAgICAgICBmaWxlTGlzdDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpbGVJRDogY2xvdWRQYXRoLFxuICAgICAgICAgICAgbWF4QWdlOiBleHBpcmVzSW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIElHZXRGaWxlVXJsSXRlbSDmnIkgY29kZSDlrZfmrrXkvYbmsqHmnIkgbWVzc2FnZSDlrZfmrrVcbiAgICAgIGlmIChyZXN1bHQuZmlsZUxpc3RbMF0uY29kZSAhPT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgc2lnbmVkIFVSTDogWyR7cmVzdWx0LmZpbGVMaXN0WzBdLmNvZGV9XSAke3Jlc3VsdC5maWxlTGlzdFswXS5maWxlSUR9YClcbiAgICAgIH1cblxuICAgICAgbGV0IHNpZ25lZFVybCA9IHJlc3VsdC5maWxlTGlzdFswXS5kb3dubG9hZF91cmxcblxuICAgICAgLy8g5p6E5bu65p+l6K+i5Y+C5pWwXG4gICAgICBjb25zdCBxdWVyeVBhcmFtczogc3RyaW5nW10gPSBbXVxuXG4gICAgICAvLyDlpoLmnpzmnIkgZG93bmxvYWQg5Y+C5pWw77yM5re75Yqg5YiwIFVSTCDkuK1cbiAgICAgIGlmIChvcHRpb25zPy5kb3dubG9hZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kb3dubG9hZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAvLyBkb3dubG9hZCDmmK/mlofku7blkI1cbiAgICAgICAgICBxdWVyeVBhcmFtcy5wdXNoKGBkb3dubG9hZD0ke2VuY29kZVVSSUNvbXBvbmVudChvcHRpb25zLmRvd25sb2FkKX1gKVxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZG93bmxvYWQgPT09IHRydWUpIHtcbiAgICAgICAgICAvLyBkb3dubG9hZCDmmK8gdHJ1Ze+8jOS9v+eUqOWOn+aWh+S7tuWQjeaIlum7mOiupOWAvFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goJ2Rvd25sb2FkPXRydWUnKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOWmguaenOacieWbvueJh+i9rOaNouWPguaVsO+8jOa3u+WKoOWIsCBVUkwg5LitXG4gICAgICBpZiAob3B0aW9ucz8udHJhbnNmb3JtKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybVF1ZXJ5ID0gdGhpcy5fdHJhbnNmb3JtT3B0c1RvUXVlcnlTdHJpbmcob3B0aW9ucy50cmFuc2Zvcm0pXG4gICAgICAgIGlmICh0cmFuc2Zvcm1RdWVyeSkge1xuICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2godHJhbnNmb3JtUXVlcnkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g5ou85o6l5omA5pyJ5p+l6K+i5Y+C5pWwXG4gICAgICBpZiAocXVlcnlQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSBzaWduZWRVcmwuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/J1xuICAgICAgICBzaWduZWRVcmwgPSBgJHtzaWduZWRVcmx9JHtzZXBhcmF0b3J9JHtxdWVyeVBhcmFtcy5qb2luKCcmJyl9YFxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7IHNpZ25lZFVybCB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTaWduZWRVcmxzKFxuICAgIHBhdGhzOiBzdHJpbmdbXSxcbiAgICBleHBpcmVzSW46IG51bWJlcixcbiAgICAvLyBvcHRpb25zPzoge1xuICAgIC8vICAgZG93bmxvYWQ/OiBzdHJpbmcgfCBib29sZWFuXG4gICAgLy8gfSxcbiAgKTogUHJvbWlzZTxcbiAgICB8IHsgZGF0YTogQXJyYXk8eyBwYXRoOiBzdHJpbmc7IHNpZ25lZFVybDogc3RyaW5nOyBlcnJvcjogc3RyaW5nIHwgbnVsbCB9PjsgZXJyb3I6IG51bGwgfVxuICAgIHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH1cbiAgICA+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZUxpc3QgPSBwYXRocy5tYXAocCA9PiAoe1xuICAgICAgICBmaWxlSUQ6IHRoaXMuX25vcm1hbGl6ZUNsb3VkSWQocCksXG4gICAgICAgIG1heEFnZTogZXhwaXJlc0luLFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0VGVtcEZpbGVVUkwoeyBmaWxlTGlzdCB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiByZXN1bHQuZmlsZUxpc3QubWFwKChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgcGF0aDogcGF0aHNbaW5kZXhdLFxuICAgICAgICAgIHNpZ25lZFVybDogaXRlbS50ZW1wRmlsZVVSTCB8fCAnJyxcbiAgICAgICAgICBlcnJvcjogaXRlbS5jb2RlID09PSAnU1VDQ0VTUycgPyBudWxsIDogaXRlbS5tZXNzYWdlLFxuICAgICAgICB9KSksXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRvd25sb2FkKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzogVHJhbnNmb3JtT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx7XG4gICAgICBkYXRhOiBCbG9iXG4gICAgICBlcnJvcjogU3RvcmFnZUVycm9yIHwgbnVsbFxuICAgIH0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBzaWduZWRVcmxSZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZVNpZ25lZFVybChwYXRoLCA2MDAsIHsgdHJhbnNmb3JtOiBvcHRpb25zIH0pXG4gICAgICAgICAgaWYgKHNpZ25lZFVybFJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgc2lnbmVkVXJsUmVzdWx0LmVycm9yXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHRtcFVybCA9IGVuY29kZVVSSShzaWduZWRVcmxSZXN1bHQuZGF0YT8uc2lnbmVkVXJsKVxuXG4gICAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCAodGhpcyBhcyBhbnkpLnJlcXVlc3QucmVxQ2xhc3MuZ2V0KHtcbiAgICAgICAgICAgIHVybDogdG1wVXJsLFxuICAgICAgICAgICAgaGVhZGVyczoge30sIC8vIOS4i+i9vei1hOa6kOivt+axguS4jee7j+i/h3NlcnZpY2XvvIxoZWFkZXLmuIXnqbpcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoJ0Rvd25sb2FkIGZhaWxlZDogbm8gZmlsZSBjb250ZW50JylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDlsIYgQnVmZmVyIOi9rOaNouS4uiBVaW50OEFycmF5IOS7peWFvOWuuSBCbG9iXG4gICAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtkYXRhXSlcbiAgICAgICAgfSkoKSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvclxuICAgICAgaWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluaWh+S7tuS/oeaBr1xuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZUlkIC0g55u45a+56Lev5b6E77yI5aaCICdpbWFnZXMvcGhvdG8uanBnJ++8ieaIliBDbG91ZEJhc2UgZmlsZUlE77yI5LulICdjbG91ZDovLycg5byA5aS077yJXG4gICAqIEByZXR1cm5zIOaWh+S7tuS/oeaBr+WvueixoVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIOS9v+eUqOebuOWvuei3r+W+hFxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGJ1Y2tldC5pbmZvKCdpbWFnZXMvcGhvdG8uanBnJylcbiAgICpcbiAgICogLy8g5L2/55SoIENsb3VkQmFzZSBmaWxlSURcbiAgICogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBidWNrZXQuaW5mbygnY2xvdWQ6Ly9lbnYtaWQueHh4eC14eHh4L2ltYWdlcy9waG90by5qcGcnKVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGluZm8ocGF0aE9yRmlsZUlkOiBzdHJpbmcsKTogUHJvbWlzZTx7IGRhdGE6IENhbWVsaXplPEZpbGVPYmplY3RWMj47IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDliKTmlq3mmK8gZmlsZUlEIOi/mOaYr+ebuOWvuei3r+W+hFxuICAgICAgY29uc3QgaXNGaWxlSWQgPSBwYXRoT3JGaWxlSWQuc3RhcnRzV2l0aCgnY2xvdWQ6Ly8nKVxuICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBpc0ZpbGVJZCA/IHRoaXMuX2V4dHJhY3RQYXRoRnJvbUZpbGVJZChwYXRoT3JGaWxlSWQpIDogcGF0aE9yRmlsZUlkXG4gICAgICBjb25zdCBidWNrZXRJZCA9IGlzRmlsZUlkID8gdGhpcy5fZXh0cmFjdEJ1Y2tldEZyb21GaWxlSWQocGF0aE9yRmlsZUlkKSA6IHRoaXMuYnVja2V0SWRcblxuICAgICAgY29uc3QgZmlsZUluZm8gPSBhd2FpdCB0aGlzLmdldEZpbGVJbmZvKHtcbiAgICAgICAgZmlsZUxpc3Q6IFt0aGlzLl9ub3JtYWxpemVDbG91ZElkKHBhdGhPckZpbGVJZCldLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgaXRlbSA9IGZpbGVJbmZvLmZpbGVMaXN0WzBdXG5cbiAgICAgIGlmIChpdGVtLmNvZGUgIT09ICdTVUNDRVNTJykge1xuICAgICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKGl0ZW0ubWVzc2FnZSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSAoaXRlbS5sYXN0TW9kaWZpZWQgPyBuZXcgRGF0ZShpdGVtLmxhc3RNb2RpZmllZCkgOiBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgaWQ6IGl0ZW0uZmlsZUlELFxuICAgICAgICAgIHZlcnNpb246ICcxJyxcbiAgICAgICAgICBuYW1lOiBkaXNwbGF5TmFtZSxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgICB1cGRhdGVkQXQ6IGxhc3RNb2RpZmllZCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IGxhc3RNb2RpZmllZCxcbiAgICAgICAgICBsYXN0QWNjZXNzZWRBdDogbm93LFxuICAgICAgICAgIHNpemU6IGl0ZW0uc2l6ZSxcbiAgICAgICAgICBjYWNoZUNvbnRyb2w6IGl0ZW0uY2FjaGVDb250cm9sLFxuICAgICAgICAgIGNvbnRlbnRUeXBlOiBpdGVtLmNvbnRlbnRUeXBlLFxuICAgICAgICAgIGV0YWc6IGl0ZW0uZXRhZyxcbiAgICAgICAgICBsYXN0TW9kaWZpZWQsXG4gICAgICAgICAgbWV0YWRhdGE6IHt9LFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBTdG9yYWdlRXJyb3IgPyBlcnJvciA6IG5ldyBTdG9yYWdlRXJyb3IoZXJyb3IubWVzc2FnZSksXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXhpc3RzKHBhdGhPckZpbGVJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRhdGE6IGJvb2xlYW47IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDliKTmlq3mmK8gZmlsZUlEIOi/mOaYr+ebuOWvuei3r+W+hFxuICAgICAgY29uc3QgZmlsZUluZm8gPSBhd2FpdCB0aGlzLmdldEZpbGVJbmZvKHtcbiAgICAgICAgZmlsZUxpc3Q6IFt0aGlzLl9ub3JtYWxpemVDbG91ZElkKHBhdGhPckZpbGVJZCldLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgaXRlbSA9IGZpbGVJbmZvLmZpbGVMaXN0WzBdXG5cbiAgICAgIGlmIChpdGVtLmNvZGUgPT09ICdGSUxFX05PVF9GT1VORCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5jb2RlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihpdGVtLm1lc3NhZ2UpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHRydWUsIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFB1YmxpY1VybChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGRvd25sb2FkPzogc3RyaW5nIHwgYm9vbGVhblxuICAgICAgdHJhbnNmb3JtPzogVHJhbnNmb3JtT3B0aW9uc1xuICAgIH0sXG4gICk6IFByb21pc2U8XG4gICAgfCB7XG4gICAgICBkYXRhOiB7IHB1YmxpY1VybDogc3RyaW5nIH1cbiAgICB9XG4gICAgfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICAgID4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY3JlYXRlU2lnbmVkVXJsKHBhdGgsIDYwMCwgb3B0aW9ucylcblxuICAgIGlmIChyZXMuZGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogeyBwdWJsaWNVcmw6IHJlcy5kYXRhLnNpZ25lZFVybCB9LFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiByZXMuZXJyb3IgYXMgU3RvcmFnZUVycm9yIH1cbiAgfVxuXG4gIGFzeW5jIHJlbW92ZShwYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHsgZGF0YTogRmlsZU9iamVjdFtdOyBlcnJvcjogbnVsbCB9IHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5YiG57uE6I635Y+W5paH5Lu25L+h5oGv77yM5q+P57uE5pyA5aSaMTDkuKpcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IDEwXG4gICAgICBjb25zdCBwYXRoQ2h1bmtzOiBzdHJpbmdbXVtdID0gW11cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpICs9IGNodW5rU2l6ZSkge1xuICAgICAgICBwYXRoQ2h1bmtzLnB1c2gocGF0aHMuc2xpY2UoaSwgaSArIGNodW5rU2l6ZSkpXG4gICAgICB9XG5cbiAgICAgIC8vIOW5tuihjOiOt+WPluaJgOacieWIhue7hOeahOaWh+S7tuS/oeaBr1xuICAgICAgY29uc3QgZmlsZUluZm9SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocGF0aENodW5rcy5tYXAoY2h1bmsgPT4gUHJvbWlzZS5hbGwoY2h1bmsubWFwKHBhdGggPT4gdGhpcy5pbmZvKHBhdGgpKSkpLClcblxuICAgICAgLy8g5ZCI5bm25omA5pyJ5paH5Lu25L+h5oGv5bm25p6E5bu65pig5bCE6KGo77yIcGF0aCAtPiBmaWxlSW5mb++8iVxuICAgICAgY29uc3QgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FtZWxpemU8RmlsZU9iamVjdFYyPj4oKVxuICAgICAgZmlsZUluZm9SZXN1bHRzLmZsYXQoKS5mb3JFYWNoKChyZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuZGF0YSkge1xuICAgICAgICAgIGZpbGVJbmZvTWFwLnNldChwYXRoc1tNYXRoLmZsb29yKGluZGV4IC8gY2h1bmtTaXplKSAqIGNodW5rU2l6ZSArIChpbmRleCAlIGNodW5rU2l6ZSldLCByZXN1bHQuZGF0YSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8g5omn6KGM5Yig6Zmk5pON5L2cXG4gICAgICBjb25zdCBmaWxlTGlzdCA9IHBhdGhzLm1hcChwID0+IHRoaXMuX25vcm1hbGl6ZUNsb3VkSWQocCkpXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRlbGV0ZUZpbGUoeyBmaWxlTGlzdCB9KVxuXG4gICAgICAvLyBJRGVsZXRlRmlsZVJlcyDnmoQgZmlsZUxpc3Qg5pWw57uE5Lit5q+P5Liq6aG55pyJIGNvZGUg5a2X5q61XG4gICAgICBjb25zdCBmYWlsZWRGaWxlcyA9IHJlc3VsdC5maWxlTGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtLmNvZGUgIT09ICdTVUNDRVNTJylcbiAgICAgIGlmIChmYWlsZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoYERlbGV0ZSBmYWlsZWQgZm9yICR7ZmFpbGVkRmlsZXMubGVuZ3RofSBmaWxlKHMpYClcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICAgIC8vIOS9v+eUqOiOt+WPluWIsOeahOaWh+S7tuS/oeaBr+aehOW7uui/lOWbnuaVsOaNrlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcGF0aHMubWFwKChwKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5mbyA9IGZpbGVJbmZvTWFwLmdldChwKVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGluZm8/Lm5hbWUsXG4gICAgICAgICAgICBpZDogaW5mbz8uaWQsXG4gICAgICAgICAgICBidWNrZXRfaWQ6IGluZm8/LmJ1Y2tldElkLFxuICAgICAgICAgICAgb3duZXI6IHVuZGVmaW5lZCwgLy8g5peg5rOV6K6h566Xb3duZXJcbiAgICAgICAgICAgIHVwZGF0ZWRfYXQ6IGluZm8/LnVwZGF0ZWRBdCB8fCBub3csXG4gICAgICAgICAgICBjcmVhdGVkX2F0OiBpbmZvPy5jcmVhdGVkQXQsXG4gICAgICAgICAgICBsYXN0X2FjY2Vzc2VkX2F0OiBpbmZvPy5sYXN0QWNjZXNzZWRBdCB8fCBub3csXG4gICAgICAgICAgICBtZXRhZGF0YTogaW5mbz8ubWV0YWRhdGEgfHwge30sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRPRE86IOiOt+WPluihpeWFqCBCdWNrZXQg5L+h5oGvXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ1Y2tldHM6IHtcbiAgICAgICAgICAgICAgaWQ6IGluZm8/LmJ1Y2tldElkLFxuICAgICAgICAgICAgICBuYW1lOiBpbmZvPy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgb3duZXI6IHVuZGVmaW5lZCwgLy8g5peg5rOV6K6h566Xb3duZXJcbiAgICAgICAgICAgICAgcHVibGljOiBmYWxzZSwgLy8g5pyq55+lXG4gICAgICAgICAgICAgIGNyZWF0ZWRfYXQ6ICcnLCAvLyDmnKrnn6VcbiAgICAgICAgICAgICAgdXBkYXRlZF9hdDogbm93LCAvLyDmnKrnn6VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvclxuICAgICAgaWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbGlzdCgpIHtcbiAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2xvdWRQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8g5riF55CG6Lev5b6E77ya56e76Zmk6aaW5bC+5pac5p2g77yM5ZCI5bm25aSa5Liq5pac5p2gXG4gICAgY29uc3QgY2xlYW5QYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpLnJlcGxhY2UoL1xcLysvZywgJy8nKVxuXG4gICAgLy8g5ZCm5YiZ6L+U5Zue5riF55CG5ZCO55qE55u45a+56Lev5b6EXG4gICAgcmV0dXJuIGNsZWFuUGF0aFxuICB9XG5cbiAgcHJpdmF0ZSBfbm9ybWFsaXplQ2xvdWRJZChwYXRoOiBzdHJpbmcpIHtcbiAgICAvLyDlpoLmnpzlt7Lnu4/mmK8gY2xvdWQ6Ly8g5qC85byP77yM55u05o6l6L+U5ZueXG4gICAgaWYgKC9eY2xvdWQ6XFwvXFwvLy50ZXN0KHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgICBjb25zdCBjbGVhblBhdGggPSB0aGlzLl9nZXRDbG91ZFBhdGgocGF0aClcblxuICAgIC8vIOWmguaenOiuvue9ruS6hiBidWNrZXRJZO+8jOaehOW7uuWujOaVtOeahCBjbG91ZDovLyDot6/lvoRcbiAgICBpZiAodGhpcy5idWNrZXRJZCkge1xuICAgICAgLy8g6I635Y+W546v5aKDIElEXG4gICAgICBjb25zdCBlbnZJZCA9IHRoaXMuY29uZmlnPy5lbnYgfHwgJydcbiAgICAgIGlmIChlbnZJZCkge1xuICAgICAgICByZXR1cm4gYGNsb3VkOi8vJHtlbnZJZH0uJHt0aGlzLmJ1Y2tldElkfS8ke2NsZWFuUGF0aH1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoJ2J1Y2tldElkIGlzIG5vdCBzZXQnKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdG9CYXNlNjQoZGF0YTogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgfVxuICAgIHJldHVybiBidG9hKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICog5bCGIFRyYW5zZm9ybU9wdGlvbnMg6L2s5o2i5Li66IW+6K6v5LqR5pWw5o2u5LiH6LGh55qEIGltYWdlTW9ncjIg5p+l6K+i5a2X56ym5LiyXG4gICAqXG4gICAqIOiFvuiur+S6keaVsOaNruS4h+ixoeS9v+eUqCBpbWFnZU1vZ3IyIOaOpeWPo+i/m+ihjOWbvueJh+WkhOeQhu+8jOaUr+aMgeS7peS4i+WPguaVsO+8mlxuICAgKiAtIC90aHVtYm5haWwvPFdpZHRoPng8SGVpZ2h0PiAtIOe8qeaUvlxuICAgKiAtIC9mb3JtYXQvPEZvcm1hdD4gLSDmoLzlvI/ovazmjaJcbiAgICogLSAvcXVhbGl0eS88UXVhbGl0eT4gLSDotKjph4/osIPmlbRcbiAgICogLSAvcnF1YWxpdHkvPFF1YWxpdHk+IC0g55u45a+56LSo6YePXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2Zvcm0gLSBTdXBhYmFzZSBUcmFuc2Zvcm1PcHRpb25zXG4gICAqIEByZXR1cm5zIOiFvuiur+S6keaVsOaNruS4h+ixoeeahOafpeivouWtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIF90cmFuc2Zvcm1PcHRzVG9RdWVyeVN0cmluZyh7IHdpZHRoOiAzMDAsIGhlaWdodDogMjAwLCBxdWFsaXR5OiA4MCwgZm9ybWF0OiAnb3JpZ2luJyB9KVxuICAgKiAvLyDov5Tlm546ICdpbWFnZU1vZ3IyL3RodW1ibmFpbC8zMDB4MjAwL3F1YWxpdHkvODAnXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBfdHJhbnNmb3JtT3B0c1RvUXVlcnlTdHJpbmcodHJhbnNmb3JtOiBUcmFuc2Zvcm1PcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gWydpbWFnZU1vZ3IyJ11cblxuICAgIC8vIOWkhOeQhue8qeaUvuWPguaVsFxuICAgIGlmICh0cmFuc2Zvcm0ud2lkdGggfHwgdHJhbnNmb3JtLmhlaWdodCkge1xuICAgICAgY29uc3Qgd2lkdGggPSB0cmFuc2Zvcm0ud2lkdGggfHwgJydcbiAgICAgIGNvbnN0IGhlaWdodCA9IHRyYW5zZm9ybS5oZWlnaHQgfHwgJydcblxuICAgICAgLy8g5qC55o2uIHJlc2l6ZSDmqKHlvI/pgInmi6nkuI3lkIznmoTnvKnmlL7mlrnlvI9cbiAgICAgIGlmICh0cmFuc2Zvcm0ucmVzaXplID09PSAnZmlsbCcpIHtcbiAgICAgICAgLy8gZmlsbDog5by65Yi257yp5pS+5Yiw5oyH5a6a5bC65a+477yM5Y+v6IO95Y+Y5b2iXG4gICAgICAgIHBhcmFtcy5wdXNoKGB0aHVtYm5haWwvJHt3aWR0aH14JHtoZWlnaHR9IWApXG4gICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybS5yZXNpemUgPT09ICdjb250YWluJykge1xuICAgICAgICAvLyBjb250YWluOiDnrYnmr5TnvKnmlL7vvIzlrozmlbTmmL7npLrlnKjmjIflrprlsLrlr7jlhoVcbiAgICAgICAgcGFyYW1zLnB1c2goYHRodW1ibmFpbC8ke3dpZHRofXgke2hlaWdodH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY292ZXIgKOm7mOiupCk6IOetieavlOe8qeaUvu+8jOWhq+WFheaMh+WumuWwuuWvuO+8jOWPr+iDveijgeWJqlxuICAgICAgICAvLyDkvb/nlKggL3RodW1ibmFpbC88V2lkdGg+eDxIZWlnaHQ+XiDooajnpLrloavlhYXmqKHlvI9cbiAgICAgICAgcGFyYW1zLnB1c2goYHRodW1ibmFpbC8ke3dpZHRofXgke2hlaWdodH1eYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDlpITnkIbmoLzlvI/ovazmjaJcbiAgICAvLyBmb3JtYXQ6ICdvcmlnaW4nIOihqOekuuS/neaMgeWOn+agvOW8j++8jOS4jeS8oOatpOWPguaVsFxuICAgIGlmICh0cmFuc2Zvcm0uZm9ybWF0ICYmIHRyYW5zZm9ybS5mb3JtYXQgIT09ICdvcmlnaW4nKSB7XG4gICAgICBwYXJhbXMucHVzaChgZm9ybWF0LyR7dHJhbnNmb3JtLmZvcm1hdH1gKVxuICAgIH1cblxuICAgIC8vIOWkhOeQhui0qOmHj+WPguaVsFxuICAgIGlmICh0cmFuc2Zvcm0ucXVhbGl0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyDohb7orq/kupHmlbDmja7kuIfosaHnmoQgcXVhbGl0eSDlj4LmlbDojIPlm7TmmK8gMS0xMDBcbiAgICAgIGNvbnN0IHF1YWxpdHkgPSBNYXRoLm1heCgxLCBNYXRoLm1pbigxMDAsIHRyYW5zZm9ybS5xdWFsaXR5KSlcbiAgICAgIHBhcmFtcy5wdXNoKGBxdWFsaXR5LyR7cXVhbGl0eX1gKVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXMuam9pbignLycpXG4gIH1cblxuICAvKipcbiAgICog5LuOIENsb3VkQmFzZSBmaWxlSUQg5Lit5o+Q5Y+W5paH5Lu26Lev5b6EXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlSWQgLSBDbG91ZEJhc2UgZmlsZUlEICjmoLzlvI86IGNsb3VkOi8vZW52LWlkLmJ1Y2tldC9wYXRoL3RvL2ZpbGUuanBnKVxuICAgKiBAcmV0dXJucyDmj5Dlj5bnmoTmlofku7bot6/lvoRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBfZXh0cmFjdFBhdGhGcm9tRmlsZUlkKCdjbG91ZDovL3Rlc3QtZW52LnRlc3QtYnVja2V0L2ltYWdlcy9waG90by5qcGcnKVxuICAgKiAvLyDov5Tlm546ICdpbWFnZXMvcGhvdG8uanBnJ1xuICAgKlxuICAgKiBfZXh0cmFjdFBhdGhGcm9tRmlsZUlkKCdjbG91ZDovL3Rlc3QtZW52LnRlc3QtYnVja2V0L2ZpbGUudHh0JylcbiAgICogLy8g6L+U5ZueOiAnZmlsZS50eHQnXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBfZXh0cmFjdFBhdGhGcm9tRmlsZUlkKGZpbGVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBmaWxlSUQg5qC85byPOiBjbG91ZDovL2Vudi1pZC5idWNrZXQvcGF0aC90by9maWxlLmpwZ1xuICAgIC8vIOmcgOimgeaPkOWPluesrOS4gOS4qiAvIOWQjumdoueahOaJgOacieWGheWuue+8iOWMheaLrCBidWNrZXQg5ZKM6Lev5b6E77yJXG4gICAgLy8g54S25ZCO5YaN5o+Q5Y+WIGJ1Y2tldCDlkI7pnaLnmoTot6/lvoTpg6jliIZcblxuICAgIC8vIOenu+mZpCBjbG91ZDovLyDliY3nvIBcbiAgICBjb25zdCB3aXRob3V0UHJvdG9jb2wgPSBmaWxlSWQucmVwbGFjZSgvXmNsb3VkOlxcL1xcLy8sICcnKVxuXG4gICAgLy8g5YiG5Ymy5Li6IFtlbnYtaWQuYnVja2V0LCBwYXRoLCB0bywgZmlsZS5qcGddXG4gICAgY29uc3QgcGFydHMgPSB3aXRob3V0UHJvdG9jb2wuc3BsaXQoJy8nKVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIOWmguaenOaXoOazleino+aekO+8jOi/lOWbnuWujOaVtOeahCBmaWxlSURcbiAgICAgIHJldHVybiBmaWxlSWRcbiAgICB9XG5cbiAgICAvLyDnp7vpmaTnrKzkuIDpg6jliIbvvIhlbnYtaWQuYnVja2V077yJ77yM6L+U5Zue5Ymp5L2Z6Lev5b6EXG4gICAgcmV0dXJuIHBhcnRzLnNsaWNlKDEpLmpvaW4oJy8nKVxuICB9XG5cbiAgLyoqXG4gICAqIOS7jiBDbG91ZEJhc2UgZmlsZUlEIOS4reaPkOWPliBidWNrZXQg5ZCN56ewXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlSWQgLSBDbG91ZEJhc2UgZmlsZUlEICjmoLzlvI86IGNsb3VkOi8vZW52LWlkLmJ1Y2tldC9wYXRoL3RvL2ZpbGUuanBnKVxuICAgKiBAcmV0dXJucyDmj5Dlj5bnmoQgYnVja2V0IOWQjeensFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIF9leHRyYWN0QnVja2V0RnJvbUZpbGVJZCgnY2xvdWQ6Ly90ZXN0LWVudi50ZXN0LWJ1Y2tldC9pbWFnZXMvcGhvdG8uanBnJylcbiAgICogLy8g6L+U5ZueOiAndGVzdC1idWNrZXQnXG4gICAqXG4gICAqIF9leHRyYWN0QnVja2V0RnJvbUZpbGVJZCgnY2xvdWQ6Ly9wcm9kLWVudi5teS1idWNrZXQvZmlsZS50eHQnKVxuICAgKiAvLyDov5Tlm546ICdteS1idWNrZXQnXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBfZXh0cmFjdEJ1Y2tldEZyb21GaWxlSWQoZmlsZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGZpbGVJRCDmoLzlvI86IGNsb3VkOi8vZW52LWlkLmJ1Y2tldC9wYXRoL3RvL2ZpbGUuanBnXG4gICAgLy8g6ZyA6KaB5o+Q5Y+WIGVudi1pZC5idWNrZXQg5Lit55qEIGJ1Y2tldCDpg6jliIZcblxuICAgIC8vIOenu+mZpCBjbG91ZDovLyDliY3nvIBcbiAgICBjb25zdCB3aXRob3V0UHJvdG9jb2wgPSBmaWxlSWQucmVwbGFjZSgvXmNsb3VkOlxcL1xcLy8sICcnKVxuXG4gICAgLy8g5YiG5Ymy5Li6IFtlbnYtaWQuYnVja2V0LCBwYXRoLCB0bywgZmlsZS5qcGddXG4gICAgY29uc3QgcGFydHMgPSB3aXRob3V0UHJvdG9jb2wuc3BsaXQoJy8nKVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgIC8vIOWmguaenOaXoOazleino+aekO+8jOi/lOWbnum7mOiupCBidWNrZXRcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIC8vIOesrOS4gOmDqOWIhuaYryBlbnYtaWQuYnVja2V077yM5o+Q5Y+WIGJ1Y2tldCDpg6jliIZcbiAgICAvLyDmoLzlvI86IGVudi1pZC5idWNrZXQg5oiWIGVudi1pZC5idWNrZXQtbmFtZVxuICAgIGNvbnN0IGVudkFuZEJ1Y2tldCA9IHBhcnRzWzBdXG5cbiAgICAvLyDmn6Xmib7nrKzkuIDkuKrngrnnmoTkvY3nva5cbiAgICBjb25zdCBkb3RJbmRleCA9IGVudkFuZEJ1Y2tldC5pbmRleE9mKCcuJylcblxuICAgIGlmIChkb3RJbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vIOWmguaenOayoeacieeCue+8jOi/lOWbnuaVtOS4quWtl+espuS4slxuICAgICAgcmV0dXJuIGVudkFuZEJ1Y2tldFxuICAgIH1cblxuICAgIC8vIOi/lOWbnueCueWQjumdoueahOmDqOWIhu+8iGJ1Y2tldCDlkI3np7DvvIlcbiAgICByZXR1cm4gZW52QW5kQnVja2V0LnN1YnN0cmluZyhkb3RJbmRleCArIDEpXG4gIH1cbn1cbiJdfQ==