@cloudbase/storage 2.23.4-alpha.0 → 2.24.0

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,689 @@
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() {
73
+ var _this = _super !== null && _super.apply(this, arguments) || this;
74
+ _this.shouldThrowOnError = false;
75
+ _this.bucketId = '';
76
+ return _this;
77
+ }
78
+ SupabaseFileAPILikeStorage.prototype.throwOnError = function () {
79
+ this.shouldThrowOnError = true;
80
+ return this;
81
+ };
82
+ SupabaseFileAPILikeStorage.prototype.from = function (bucket) {
83
+ this.bucketId = bucket || '';
84
+ return this;
85
+ };
86
+ SupabaseFileAPILikeStorage.prototype.upload = function (path, fileBody, fileOptions) {
87
+ return __awaiter(this, void 0, void 0, function () {
88
+ var options, cacheControl, contentType, metadata, cloudPath, uploadFileParams, headers, result, error_1;
89
+ return __generator(this, function (_a) {
90
+ switch (_a.label) {
91
+ case 0:
92
+ options = __assign({ upsert: true }, fileOptions);
93
+ cacheControl = options.cacheControl, contentType = options.contentType, metadata = options.metadata;
94
+ _a.label = 1;
95
+ case 1:
96
+ _a.trys.push([1, 3, , 4]);
97
+ cloudPath = this._getCloudPath(path);
98
+ uploadFileParams = {
99
+ cloudPath: cloudPath,
100
+ filePath: fileBody,
101
+ };
102
+ if (cacheControl || contentType || metadata) {
103
+ headers = {};
104
+ if (cacheControl) {
105
+ headers['cache-control'] = cacheControl;
106
+ }
107
+ if (contentType) {
108
+ headers['content-type'] = contentType;
109
+ }
110
+ if (metadata) {
111
+ headers['x-cos-metadata-metadata'] = this.toBase64(JSON.stringify(metadata));
112
+ }
113
+ uploadFileParams.headers = headers;
114
+ }
115
+ return [4, this.uploadFile(uploadFileParams)];
116
+ case 2:
117
+ result = _a.sent();
118
+ if (!result.fileID) {
119
+ throw new Error(JSON.stringify({
120
+ code: ERRORS.OPERATION_FAIL,
121
+ msg: "[".concat(storage_1.COMPONENT_NAME, ".update] no fileID returned"),
122
+ }));
123
+ }
124
+ return [2, {
125
+ data: {
126
+ id: result.fileID,
127
+ path: path,
128
+ fullPath: path,
129
+ },
130
+ error: null,
131
+ }];
132
+ case 3:
133
+ error_1 = _a.sent();
134
+ if (this.shouldThrowOnError)
135
+ throw error_1;
136
+ if ((0, errors_1.isStorageError)(error_1)) {
137
+ return [2, {
138
+ data: null,
139
+ error: error_1,
140
+ }];
141
+ }
142
+ throw error_1;
143
+ case 4: return [2];
144
+ }
145
+ });
146
+ });
147
+ };
148
+ SupabaseFileAPILikeStorage.prototype.uploadToSignedUrl = function (path, _token, fileBody, fileOptions) {
149
+ return __awaiter(this, void 0, void 0, function () {
150
+ return __generator(this, function (_a) {
151
+ return [2, this.upload(path, fileBody, fileOptions)];
152
+ });
153
+ });
154
+ };
155
+ SupabaseFileAPILikeStorage.prototype.createSignedUploadUrl = function (path) {
156
+ return __awaiter(this, void 0, void 0, function () {
157
+ var cloudPath, metadata, error_2;
158
+ return __generator(this, function (_a) {
159
+ switch (_a.label) {
160
+ case 0:
161
+ _a.trys.push([0, 2, , 3]);
162
+ cloudPath = this._getCloudPath(path);
163
+ return [4, this.getUploadMetadata({ cloudPath: cloudPath })];
164
+ case 1:
165
+ metadata = (_a.sent()).data;
166
+ return [2, {
167
+ data: {
168
+ signedUrl: metadata.url,
169
+ token: metadata.token,
170
+ path: path,
171
+ authorization: metadata.authorization,
172
+ id: metadata.fileId,
173
+ cosFileId: metadata.cosFileId,
174
+ downloadUrl: metadata.download_url,
175
+ },
176
+ error: null,
177
+ }];
178
+ case 2:
179
+ error_2 = _a.sent();
180
+ if (this.shouldThrowOnError)
181
+ throw error_2;
182
+ return [2, {
183
+ data: null,
184
+ error: error_2 instanceof errors_1.StorageError ? error_2 : new errors_1.StorageError(error_2.message),
185
+ }];
186
+ case 3: return [2];
187
+ }
188
+ });
189
+ });
190
+ };
191
+ SupabaseFileAPILikeStorage.prototype.update = function (path, fileBody, fileOptions) {
192
+ return __awaiter(this, void 0, void 0, function () {
193
+ return __generator(this, function (_a) {
194
+ return [2, this.upload(path, fileBody, __assign(__assign({}, fileOptions), { upsert: true }))];
195
+ });
196
+ });
197
+ };
198
+ SupabaseFileAPILikeStorage.prototype.move = function (fromPath, toPath) {
199
+ return __awaiter(this, void 0, void 0, function () {
200
+ var result, error_3;
201
+ return __generator(this, function (_a) {
202
+ switch (_a.label) {
203
+ case 0:
204
+ _a.trys.push([0, 2, , 3]);
205
+ return [4, this.copyFile({
206
+ fileList: [
207
+ {
208
+ srcPath: this._getCloudPath(fromPath),
209
+ dstPath: this._getCloudPath(toPath),
210
+ overwrite: true,
211
+ removeOriginal: true,
212
+ },
213
+ ],
214
+ })];
215
+ case 1:
216
+ result = _a.sent();
217
+ if (result.fileList[0].code && result.fileList[0].code !== 'SUCCESS') {
218
+ throw new errors_1.StorageError(result.fileList[0].message || 'Move failed');
219
+ }
220
+ return [2, {
221
+ data: { message: "File moved from ".concat(fromPath, " to ").concat(toPath) },
222
+ error: null,
223
+ }];
224
+ case 2:
225
+ error_3 = _a.sent();
226
+ if (this.shouldThrowOnError)
227
+ throw error_3;
228
+ if ((0, errors_1.isStorageError)(error_3)) {
229
+ return [2, {
230
+ data: null,
231
+ error: error_3,
232
+ }];
233
+ }
234
+ throw error_3;
235
+ case 3: return [2];
236
+ }
237
+ });
238
+ });
239
+ };
240
+ SupabaseFileAPILikeStorage.prototype.copy = function (fromPath, toPath) {
241
+ return __awaiter(this, void 0, void 0, function () {
242
+ var result, error_4;
243
+ return __generator(this, function (_a) {
244
+ switch (_a.label) {
245
+ case 0:
246
+ _a.trys.push([0, 2, , 3]);
247
+ return [4, this.copyFile({
248
+ fileList: [
249
+ {
250
+ srcPath: this._getCloudPath(fromPath),
251
+ dstPath: this._getCloudPath(toPath),
252
+ overwrite: true,
253
+ removeOriginal: false,
254
+ },
255
+ ],
256
+ })];
257
+ case 1:
258
+ result = _a.sent();
259
+ if (result.fileList[0].code && result.fileList[0].code !== 'SUCCESS') {
260
+ throw new errors_1.StorageError(result.fileList[0].message || 'Copy failed');
261
+ }
262
+ return [2, {
263
+ data: { path: this._getCloudPath(toPath) },
264
+ error: null,
265
+ }];
266
+ case 2:
267
+ error_4 = _a.sent();
268
+ if (this.shouldThrowOnError)
269
+ throw error_4;
270
+ if ((0, errors_1.isStorageError)(error_4)) {
271
+ return [2, { data: null, error: error_4 }];
272
+ }
273
+ throw error_4;
274
+ case 3: return [2];
275
+ }
276
+ });
277
+ });
278
+ };
279
+ SupabaseFileAPILikeStorage.prototype.createSignedUrl = function (path, expiresIn, options) {
280
+ return __awaiter(this, void 0, void 0, function () {
281
+ var cloudPath, result, signedUrl, queryParams, transformQuery, separator, error_5;
282
+ return __generator(this, function (_a) {
283
+ switch (_a.label) {
284
+ case 0:
285
+ _a.trys.push([0, 2, , 3]);
286
+ cloudPath = this._normalizeCloudId(path);
287
+ return [4, this.getTempFileURL({
288
+ fileList: [
289
+ {
290
+ fileID: cloudPath,
291
+ maxAge: expiresIn,
292
+ },
293
+ ],
294
+ })];
295
+ case 1:
296
+ result = _a.sent();
297
+ if (result.fileList[0].code !== 'SUCCESS') {
298
+ throw new errors_1.StorageError("Failed to create signed URL: [".concat(result.fileList[0].code, "] ").concat(result.fileList[0].fileID));
299
+ }
300
+ signedUrl = result.fileList[0].download_url;
301
+ queryParams = [];
302
+ if ((options === null || options === void 0 ? void 0 : options.download) !== undefined) {
303
+ if (typeof options.download === 'string') {
304
+ queryParams.push("download=".concat(encodeURIComponent(options.download)));
305
+ }
306
+ else if (options.download === true) {
307
+ queryParams.push('download=true');
308
+ }
309
+ }
310
+ if (options === null || options === void 0 ? void 0 : options.transform) {
311
+ transformQuery = this._transformOptsToQueryString(options.transform);
312
+ if (transformQuery) {
313
+ queryParams.push(transformQuery);
314
+ }
315
+ }
316
+ if (queryParams.length > 0) {
317
+ separator = signedUrl.includes('?') ? '&' : '?';
318
+ signedUrl = "".concat(signedUrl).concat(separator).concat(queryParams.join('&'));
319
+ }
320
+ return [2, {
321
+ data: { signedUrl: signedUrl },
322
+ error: null,
323
+ }];
324
+ case 2:
325
+ error_5 = _a.sent();
326
+ if (this.shouldThrowOnError)
327
+ throw error_5;
328
+ if ((0, errors_1.isStorageError)(error_5)) {
329
+ return [2, {
330
+ data: null,
331
+ error: error_5,
332
+ }];
333
+ }
334
+ throw error_5;
335
+ case 3: return [2];
336
+ }
337
+ });
338
+ });
339
+ };
340
+ SupabaseFileAPILikeStorage.prototype.createSignedUrls = function (paths, expiresIn) {
341
+ return __awaiter(this, void 0, void 0, function () {
342
+ var fileList, result, error_6;
343
+ var _this = this;
344
+ return __generator(this, function (_a) {
345
+ switch (_a.label) {
346
+ case 0:
347
+ _a.trys.push([0, 2, , 3]);
348
+ fileList = paths.map(function (p) { return ({
349
+ fileID: _this._normalizeCloudId(p),
350
+ maxAge: expiresIn,
351
+ }); });
352
+ return [4, this.getTempFileURL({ fileList: fileList })];
353
+ case 1:
354
+ result = _a.sent();
355
+ return [2, {
356
+ data: result.fileList.map(function (item, index) { return ({
357
+ path: paths[index],
358
+ signedUrl: item.tempFileURL || '',
359
+ error: item.code === 'SUCCESS' ? null : item.message,
360
+ }); }),
361
+ error: null,
362
+ }];
363
+ case 2:
364
+ error_6 = _a.sent();
365
+ if (this.shouldThrowOnError)
366
+ throw error_6;
367
+ if ((0, errors_1.isStorageError)(error_6)) {
368
+ return [2, {
369
+ data: null,
370
+ error: error_6,
371
+ }];
372
+ }
373
+ throw error_6;
374
+ case 3: return [2];
375
+ }
376
+ });
377
+ });
378
+ };
379
+ SupabaseFileAPILikeStorage.prototype.download = function (path, options) {
380
+ return __awaiter(this, void 0, void 0, function () {
381
+ var error_7;
382
+ var _a;
383
+ var _this = this;
384
+ return __generator(this, function (_b) {
385
+ switch (_b.label) {
386
+ case 0:
387
+ _b.trys.push([0, 2, , 3]);
388
+ _a = {};
389
+ return [4, (function () { return __awaiter(_this, void 0, void 0, function () {
390
+ var signedUrlResult, tmpUrl, data;
391
+ var _a;
392
+ return __generator(this, function (_b) {
393
+ switch (_b.label) {
394
+ case 0: return [4, this.createSignedUrl(path, 600, { transform: options })];
395
+ case 1:
396
+ signedUrlResult = _b.sent();
397
+ if (signedUrlResult.error) {
398
+ throw signedUrlResult.error;
399
+ }
400
+ tmpUrl = encodeURI((_a = signedUrlResult.data) === null || _a === void 0 ? void 0 : _a.signedUrl);
401
+ return [4, this.request.reqClass.get({
402
+ url: tmpUrl,
403
+ headers: {},
404
+ responseType: 'blob',
405
+ })];
406
+ case 2:
407
+ data = (_b.sent()).data;
408
+ if (!data) {
409
+ throw new errors_1.StorageError('Download failed: no file content');
410
+ }
411
+ return [2, new Blob([data])];
412
+ }
413
+ });
414
+ }); })()];
415
+ case 1: return [2, (_a.data = _b.sent(),
416
+ _a.error = null,
417
+ _a)];
418
+ case 2:
419
+ error_7 = _b.sent();
420
+ if (this.shouldThrowOnError)
421
+ throw error_7;
422
+ if ((0, errors_1.isStorageError)(error_7)) {
423
+ return [2, {
424
+ data: null,
425
+ error: error_7,
426
+ }];
427
+ }
428
+ throw error_7;
429
+ case 3: return [2];
430
+ }
431
+ });
432
+ });
433
+ };
434
+ SupabaseFileAPILikeStorage.prototype.info = function (pathOrFileId) {
435
+ return __awaiter(this, void 0, void 0, function () {
436
+ var isFileId, displayName, bucketId, fileInfo, item, now, lastModified, error_8;
437
+ return __generator(this, function (_a) {
438
+ switch (_a.label) {
439
+ case 0:
440
+ _a.trys.push([0, 2, , 3]);
441
+ isFileId = pathOrFileId.startsWith('cloud://');
442
+ displayName = isFileId ? this._extractPathFromFileId(pathOrFileId) : pathOrFileId;
443
+ bucketId = isFileId ? this._extractBucketFromFileId(pathOrFileId) : this.bucketId;
444
+ return [4, this.getFileInfo({
445
+ fileList: [this._normalizeCloudId(pathOrFileId)],
446
+ })];
447
+ case 1:
448
+ fileInfo = _a.sent();
449
+ item = fileInfo.fileList[0];
450
+ if (item.code !== 'SUCCESS') {
451
+ throw new errors_1.StorageError(item.message);
452
+ }
453
+ now = new Date().toISOString();
454
+ lastModified = (item.lastModified ? new Date(item.lastModified) : new Date()).toISOString();
455
+ return [2, {
456
+ data: {
457
+ id: item.fileID,
458
+ version: '1',
459
+ name: displayName,
460
+ bucketId: bucketId,
461
+ updatedAt: lastModified,
462
+ createdAt: lastModified,
463
+ lastAccessedAt: now,
464
+ size: item.size,
465
+ cacheControl: item.cacheControl,
466
+ contentType: item.contentType,
467
+ etag: item.etag,
468
+ lastModified: lastModified,
469
+ metadata: {},
470
+ },
471
+ error: null,
472
+ }];
473
+ case 2:
474
+ error_8 = _a.sent();
475
+ if (this.shouldThrowOnError)
476
+ throw error_8;
477
+ return [2, {
478
+ data: null,
479
+ error: error_8 instanceof errors_1.StorageError ? error_8 : new errors_1.StorageError(error_8.message),
480
+ }];
481
+ case 3: return [2];
482
+ }
483
+ });
484
+ });
485
+ };
486
+ SupabaseFileAPILikeStorage.prototype.exists = function (pathOrFileId) {
487
+ return __awaiter(this, void 0, void 0, function () {
488
+ var fileInfo, item, error_9;
489
+ return __generator(this, function (_a) {
490
+ switch (_a.label) {
491
+ case 0:
492
+ _a.trys.push([0, 2, , 3]);
493
+ return [4, this.getFileInfo({
494
+ fileList: [this._normalizeCloudId(pathOrFileId)],
495
+ })];
496
+ case 1:
497
+ fileInfo = _a.sent();
498
+ item = fileInfo.fileList[0];
499
+ if (item.code === 'FILE_NOT_FOUND') {
500
+ return [2, {
501
+ data: false,
502
+ error: null,
503
+ }];
504
+ }
505
+ if (item.code !== 'SUCCESS') {
506
+ throw new errors_1.StorageError(item.message);
507
+ }
508
+ return [2, { data: true, error: null }];
509
+ case 2:
510
+ error_9 = _a.sent();
511
+ if (this.shouldThrowOnError)
512
+ throw error_9;
513
+ throw error_9;
514
+ case 3: return [2];
515
+ }
516
+ });
517
+ });
518
+ };
519
+ SupabaseFileAPILikeStorage.prototype.getPublicUrl = function (path, options) {
520
+ return __awaiter(this, void 0, void 0, function () {
521
+ var res;
522
+ return __generator(this, function (_a) {
523
+ switch (_a.label) {
524
+ case 0: return [4, this.createSignedUrl(path, 600, options)];
525
+ case 1:
526
+ res = _a.sent();
527
+ if (res.data) {
528
+ return [2, {
529
+ data: { publicUrl: res.data.signedUrl },
530
+ }];
531
+ }
532
+ return [2, { data: null, error: res.error }];
533
+ }
534
+ });
535
+ });
536
+ };
537
+ SupabaseFileAPILikeStorage.prototype.remove = function (paths) {
538
+ return __awaiter(this, void 0, void 0, function () {
539
+ var chunkSize_1, pathChunks, i, fileInfoResults, fileInfoMap_1, fileList, result, failedFiles, now_1, error_10;
540
+ var _this = this;
541
+ return __generator(this, function (_a) {
542
+ switch (_a.label) {
543
+ case 0:
544
+ _a.trys.push([0, 3, , 4]);
545
+ chunkSize_1 = 10;
546
+ pathChunks = [];
547
+ for (i = 0; i < paths.length; i += chunkSize_1) {
548
+ pathChunks.push(paths.slice(i, i + chunkSize_1));
549
+ }
550
+ return [4, Promise.all(pathChunks.map(function (chunk) { return Promise.all(chunk.map(function (path) { return _this.info(path); })); }))];
551
+ case 1:
552
+ fileInfoResults = _a.sent();
553
+ fileInfoMap_1 = new Map();
554
+ fileInfoResults.flat().forEach(function (result, index) {
555
+ if (result.data) {
556
+ fileInfoMap_1.set(paths[Math.floor(index / chunkSize_1) * chunkSize_1 + (index % chunkSize_1)], result.data);
557
+ }
558
+ });
559
+ fileList = paths.map(function (p) { return _this._normalizeCloudId(p); });
560
+ return [4, this.deleteFile({ fileList: fileList })];
561
+ case 2:
562
+ result = _a.sent();
563
+ failedFiles = result.fileList.filter(function (item) { return item.code !== 'SUCCESS'; });
564
+ if (failedFiles.length > 0) {
565
+ throw new errors_1.StorageError("Delete failed for ".concat(failedFiles.length, " file(s)"));
566
+ }
567
+ now_1 = new Date().toISOString();
568
+ return [2, {
569
+ data: paths.map(function (p) {
570
+ var info = fileInfoMap_1.get(p);
571
+ return {
572
+ name: info === null || info === void 0 ? void 0 : info.name,
573
+ id: info === null || info === void 0 ? void 0 : info.id,
574
+ bucket_id: info === null || info === void 0 ? void 0 : info.bucketId,
575
+ owner: undefined,
576
+ updated_at: (info === null || info === void 0 ? void 0 : info.updatedAt) || now_1,
577
+ created_at: info === null || info === void 0 ? void 0 : info.createdAt,
578
+ last_accessed_at: (info === null || info === void 0 ? void 0 : info.lastAccessedAt) || now_1,
579
+ metadata: (info === null || info === void 0 ? void 0 : info.metadata) || {},
580
+ buckets: {
581
+ id: info === null || info === void 0 ? void 0 : info.bucketId,
582
+ name: info === null || info === void 0 ? void 0 : info.bucketId,
583
+ owner: undefined,
584
+ public: false,
585
+ created_at: '',
586
+ updated_at: now_1,
587
+ },
588
+ };
589
+ }),
590
+ error: null,
591
+ }];
592
+ case 3:
593
+ error_10 = _a.sent();
594
+ if (this.shouldThrowOnError)
595
+ throw error_10;
596
+ if ((0, errors_1.isStorageError)(error_10)) {
597
+ return [2, {
598
+ data: null,
599
+ error: error_10,
600
+ }];
601
+ }
602
+ throw error_10;
603
+ case 4: return [2];
604
+ }
605
+ });
606
+ });
607
+ };
608
+ SupabaseFileAPILikeStorage.prototype.list = function () {
609
+ return __awaiter(this, void 0, void 0, function () {
610
+ return __generator(this, function (_a) {
611
+ throw new errors_1.StorageError('Not implemented');
612
+ });
613
+ });
614
+ };
615
+ SupabaseFileAPILikeStorage.prototype._getCloudPath = function (path) {
616
+ var cleanPath = path.replace(/^\/|\/$/g, '').replace(/\/+/g, '/');
617
+ return cleanPath;
618
+ };
619
+ SupabaseFileAPILikeStorage.prototype._normalizeCloudId = function (path) {
620
+ var _a;
621
+ if (/^cloud:\/\//.test(path)) {
622
+ return path;
623
+ }
624
+ var cleanPath = this._getCloudPath(path);
625
+ if (this.bucketId) {
626
+ var envId = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.env) || '';
627
+ if (envId) {
628
+ return "cloud://".concat(envId, ".").concat(this.bucketId, "/").concat(cleanPath);
629
+ }
630
+ }
631
+ else {
632
+ throw new errors_1.StorageError('bucketId is not set');
633
+ }
634
+ };
635
+ SupabaseFileAPILikeStorage.prototype.toBase64 = function (data) {
636
+ if (typeof Buffer !== 'undefined') {
637
+ return Buffer.from(data).toString('base64');
638
+ }
639
+ return btoa(data);
640
+ };
641
+ SupabaseFileAPILikeStorage.prototype._transformOptsToQueryString = function (transform) {
642
+ var params = ['imageMogr2'];
643
+ if (transform.width || transform.height) {
644
+ var width = transform.width || '';
645
+ var height = transform.height || '';
646
+ if (transform.resize === 'fill') {
647
+ params.push("thumbnail/".concat(width, "x").concat(height, "!"));
648
+ }
649
+ else if (transform.resize === 'contain') {
650
+ params.push("thumbnail/".concat(width, "x").concat(height));
651
+ }
652
+ else {
653
+ params.push("thumbnail/".concat(width, "x").concat(height, "^"));
654
+ }
655
+ }
656
+ if (transform.format && transform.format !== 'origin') {
657
+ params.push("format/".concat(transform.format));
658
+ }
659
+ if (transform.quality !== undefined) {
660
+ var quality = Math.max(1, Math.min(100, transform.quality));
661
+ params.push("quality/".concat(quality));
662
+ }
663
+ return params.join('/');
664
+ };
665
+ SupabaseFileAPILikeStorage.prototype._extractPathFromFileId = function (fileId) {
666
+ var withoutProtocol = fileId.replace(/^cloud:\/\//, '');
667
+ var parts = withoutProtocol.split('/');
668
+ if (parts.length < 2) {
669
+ return fileId;
670
+ }
671
+ return parts.slice(1).join('/');
672
+ };
673
+ SupabaseFileAPILikeStorage.prototype._extractBucketFromFileId = function (fileId) {
674
+ var withoutProtocol = fileId.replace(/^cloud:\/\//, '');
675
+ var parts = withoutProtocol.split('/');
676
+ if (parts.length < 1) {
677
+ return '';
678
+ }
679
+ var envAndBucket = parts[0];
680
+ var dotIndex = envAndBucket.indexOf('.');
681
+ if (dotIndex === -1) {
682
+ return envAndBucket;
683
+ }
684
+ return envAndBucket.substring(dotIndex + 1);
685
+ };
686
+ return SupabaseFileAPILikeStorage;
687
+ }(storage_1.CloudbaseStorage));
688
+ exports.SupabaseFileAPILikeStorage = SupabaseFileAPILikeStorage;
689
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3VwYWJhc2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBZ0Q7QUFFaEQsc0NBQTZEO0FBRzdELG1DQUF1RDtBQUUvQyxJQUFBLE1BQU0sR0FBSyxxQkFBUyxPQUFkLENBQWM7QUFFNUI7SUFBZ0QsOENBQWdCO0lBQWhFO1FBQUEscUVBZ3RCQztRQS9zQlMsd0JBQWtCLEdBQUcsS0FBSyxDQUFBO1FBQzFCLGNBQVEsR0FBRyxFQUFFLENBQUE7O0lBOHNCdkIsQ0FBQztJQTVzQkMsaURBQVksR0FBWjtRQUNFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7UUFDOUIsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQseUNBQUksR0FBSixVQUFLLE1BQWU7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFBO1FBQzVCLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVLLDJDQUFNLEdBQVosVUFDRSxJQUFZLEVBQ1osUUFBa0IsRUFDbEIsV0FBeUI7Ozs7Ozt3QkFJbkIsT0FBTyxjQUFLLE1BQU0sRUFBRSxJQUFJLElBQUssV0FBVyxDQUFFLENBQUE7d0JBQ3hDLFlBQVksR0FBNEIsT0FBTyxhQUFuQyxFQUFFLFdBQVcsR0FBZSxPQUFPLFlBQXRCLEVBQUUsUUFBUSxHQUFLLE9BQU8sU0FBWixDQUFZOzs7O3dCQUUvQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTt3QkFDcEMsZ0JBQWdCLEdBQWtEOzRCQUN0RSxTQUFTLFdBQUE7NEJBQ1QsUUFBUSxFQUFFLFFBQWU7eUJBQzFCLENBQUE7d0JBRUQsSUFBSSxZQUFZLElBQUksV0FBVyxJQUFJLFFB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Q0FBQTtTQUNWO1FBSUQsSUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRzdCLElBQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFMUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFFbkIsT0FBTyxZQUFZLENBQUE7U0FDcEI7UUFHRCxPQUFPLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFDSCxpQ0FBQztBQUFELENBQUMsQUFodEJELENBQWdELDBCQUFnQixHQWd0Qi9EO0FBaHRCWSxnRUFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcblxuaW1wb3J0IHsgQ2xvdWRiYXNlU3RvcmFnZSwgQ09NUE9ORU5UX05BTUUgfSBmcm9tICcuLi9zdG9yYWdlJ1xuXG5pbXBvcnQgeyBDYW1lbGl6ZSwgRmlsZUJvZHksIEZpbGVPYmplY3QsIEZpbGVPYmplY3RWMiwgRmlsZU9wdGlvbnMsIFRyYW5zZm9ybU9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgaXNTdG9yYWdlRXJyb3IsIFN0b3JhZ2VFcnJvciB9IGZyb20gJy4vZXJyb3JzJ1xuXG5jb25zdCB7IEVSUk9SUyB9ID0gY29uc3RhbnRzXG5cbmV4cG9ydCBjbGFzcyBTdXBhYmFzZUZpbGVBUElMaWtlU3RvcmFnZSBleHRlbmRzIENsb3VkYmFzZVN0b3JhZ2Uge1xuICBwcml2YXRlIHNob3VsZFRocm93T25FcnJvciA9IGZhbHNlXG4gIHByaXZhdGUgYnVja2V0SWQgPSAnJ1xuXG4gIHRocm93T25FcnJvcigpOiB0aGlzIHtcbiAgICB0aGlzLnNob3VsZFRocm93T25FcnJvciA9IHRydWVcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZnJvbShidWNrZXQ/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmJ1Y2tldElkID0gYnVja2V0IHx8ICcnXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGFzeW5jIHVwbG9hZChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgZmlsZUJvZHk6IEZpbGVCb2R5LFxuICAgIGZpbGVPcHRpb25zPzogRmlsZU9wdGlvbnMsXG4gICk6IFByb21pc2U8XG4gICAgeyBkYXRhOiB7IGlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZyB9OyBlcnJvcjogbnVsbCB9IHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH1cbiAgICA+IHtcbiAgICBjb25zdCBvcHRpb25zID0geyB1cHNlcnQ6IHRydWUsIC4uLmZpbGVPcHRpb25zIH1cbiAgICBjb25zdCB7IGNhY2hlQ29udHJvbCwgY29udGVudFR5cGUsIG1ldGFkYXRhIH0gPSBvcHRpb25zXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsb3VkUGF0aCA9IHRoaXMuX2dldENsb3VkUGF0aChwYXRoKVxuICAgICAgY29uc3QgdXBsb2FkRmlsZVBhcmFtczogUGFyYW1ldGVyczxDbG91ZGJhc2VTdG9yYWdlWyd1cGxvYWRGaWxlJ10+WzBdID0ge1xuICAgICAgICBjbG91ZFBhdGgsXG4gICAgICAgIGZpbGVQYXRoOiBmaWxlQm9keSBhcyBhbnksXG4gICAgICB9XG5cbiAgICAgIGlmIChjYWNoZUNvbnRyb2wgfHwgY29udGVudFR5cGUgfHwgbWV0YWRhdGEpIHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgICAgIGlmIChjYWNoZUNvbnRyb2wpIHtcbiAgICAgICAgICBoZWFkZXJzWydjYWNoZS1jb250cm9sJ10gPSBjYWNoZUNvbnRyb2xcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9IGNvbnRlbnRUeXBlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgICAgICBoZWFkZXJzWyd4LWNvcy1tZXRhZGF0YS1tZXRhZGF0YSddID0gdGhpcy50b0Jhc2U2NChKU09OLnN0cmluZ2lmeShtZXRhZGF0YSkpXG4gICAgICAgIH1cblxuICAgICAgICB1cGxvYWRGaWxlUGFyYW1zLmhlYWRlcnMgPSBoZWFkZXJzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudXBsb2FkRmlsZSh1cGxvYWRGaWxlUGFyYW1zKVxuXG4gICAgICAvLyBJVXBsb2FkRmlsZVJlcyDmsqHmnIkgY29kZSDlrZfmrrXvvIzlpoLmnpzmsqHmnIkgZmlsZUlEIOWImeihqOekuuWksei0pVxuICAgICAgaWYgKCFyZXN1bHQuZmlsZUlEKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29kZTogRVJST1JTLk9QRVJBVElPTl9GQUlMLFxuICAgICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS51cGRhdGVdIG5vIGZpbGVJRCByZXR1cm5lZGAsXG4gICAgICAgIH0pLClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGlkOiByZXN1bHQuZmlsZUlELFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgZnVsbFBhdGg6IHBhdGgsXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwbG9hZFRvU2lnbmVkVXJsKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBfdG9rZW46IHN0cmluZyxcbiAgICBmaWxlQm9keTogRmlsZUJvZHksXG4gICAgZmlsZU9wdGlvbnM/OiBGaWxlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxcbiAgICB7IGRhdGE6IHsgaWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nIH07IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICAgID4ge1xuICAgIHJldHVybiB0aGlzLnVwbG9hZChwYXRoLCBmaWxlQm9keSwgZmlsZU9wdGlvbnMpXG4gIH1cblxuICBhc3luYyBjcmVhdGVTaWduZWRVcGxvYWRVcmwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxcbiAgfCB7XG4gICAgZGF0YToge1xuICAgICAgc2lnbmVkVXJsOiBzdHJpbmdcbiAgICAgIHRva2VuOiBzdHJpbmdcbiAgICAgIHBhdGg6IHN0cmluZ1xuICAgICAgLy8gQ2xvdWRCYXNlIOmineWklueahOWFg+aVsOaNruWtl+autVxuICAgICAgYXV0aG9yaXphdGlvbj86IHN0cmluZ1xuICAgICAgaWQ/OiBzdHJpbmdcbiAgICAgIGNvc0ZpbGVJZD86IHN0cmluZ1xuICAgICAgZG93bmxvYWRVcmw/OiBzdHJpbmdcbiAgICB9XG4gICAgZXJyb3I6IG51bGxcbiAgfVxuICB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9XG4gID4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbG91ZFBhdGggPSB0aGlzLl9nZXRDbG91ZFBhdGgocGF0aClcblxuICAgICAgY29uc3QgeyBkYXRhOiBtZXRhZGF0YSB9ID0gYXdhaXQgdGhpcy5nZXRVcGxvYWRNZXRhZGF0YSh7IGNsb3VkUGF0aCB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgc2lnbmVkVXJsOiBtZXRhZGF0YS51cmwsXG4gICAgICAgICAgdG9rZW46IG1ldGFkYXRhLnRva2VuLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgLy8g6L+U5ZueIENsb3VkQmFzZSDnmoTpop3lpJblhYPmlbDmja7vvIzkvpsgdXBsb2FkVG9TaWduZWRVcmwg5L2/55SoXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogbWV0YWRhdGEuYXV0aG9yaXphdGlvbixcbiAgICAgICAgICBpZDogbWV0YWRhdGEuZmlsZUlkLFxuICAgICAgICAgIGNvc0ZpbGVJZDogbWV0YWRhdGEuY29zRmlsZUlkLFxuICAgICAgICAgIGRvd25sb2FkVXJsOiBtZXRhZGF0YS5kb3dubG9hZF91cmwsXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvciA/IGVycm9yIDogbmV3IFN0b3JhZ2VFcnJvcihlcnJvci5tZXNzYWdlKSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGUoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGVCb2R5OiBGaWxlQm9keSxcbiAgICBmaWxlT3B0aW9ucz86IEZpbGVPcHRpb25zLFxuICApOiBQcm9taXNlPFxuICAgIHsgZGF0YTogeyBpZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmcgfTsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9XG4gICAgPiB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkKHBhdGgsIGZpbGVCb2R5LCB7IC4uLmZpbGVPcHRpb25zLCB1cHNlcnQ6IHRydWUgfSlcbiAgfVxuXG4gIGFzeW5jIG1vdmUoXG4gICAgZnJvbVBhdGg6IHN0cmluZyxcbiAgICB0b1BhdGg6IHN0cmluZyxcbiAgICAvLyBvcHRpb25zPzogRGVzdGluYXRpb25PcHRpb25zLFxuICApOiBQcm9taXNlPHsgZGF0YTogeyBtZXNzYWdlOiBzdHJpbmcgfTsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29weUZpbGUoe1xuICAgICAgICBmaWxlTGlzdDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNyY1BhdGg6IHRoaXMuX2dldENsb3VkUGF0aChmcm9tUGF0aCksXG4gICAgICAgICAgICBkc3RQYXRoOiB0aGlzLl9nZXRDbG91ZFBhdGgodG9QYXRoKSxcbiAgICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlbW92ZU9yaWdpbmFsOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KVxuXG4gICAgICBpZiAocmVzdWx0LmZpbGVMaXN0WzBdLmNvZGUgJiYgcmVzdWx0LmZpbGVMaXN0WzBdLmNvZGUgIT09ICdTVUNDRVNTJykge1xuICAgICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKHJlc3VsdC5maWxlTGlzdFswXS5tZXNzYWdlIHx8ICdNb3ZlIGZhaWxlZCcpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHsgbWVzc2FnZTogYEZpbGUgbW92ZWQgZnJvbSAke2Zyb21QYXRofSB0byAke3RvUGF0aH1gIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNvcHkoXG4gICAgZnJvbVBhdGg6IHN0cmluZyxcbiAgICB0b1BhdGg6IHN0cmluZyxcbiAgICAvLyBvcHRpb25zPzogRGVzdGluYXRpb25PcHRpb25zLFxuICApOiBQcm9taXNlPHsgZGF0YTogeyBwYXRoOiBzdHJpbmcgfTsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29weUZpbGUoe1xuICAgICAgICBmaWxlTGlzdDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNyY1BhdGg6IHRoaXMuX2dldENsb3VkUGF0aChmcm9tUGF0aCksXG4gICAgICAgICAgICBkc3RQYXRoOiB0aGlzLl9nZXRDbG91ZFBhdGgodG9QYXRoKSxcbiAgICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlbW92ZU9yaWdpbmFsOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSlcblxuICAgICAgaWYgKHJlc3VsdC5maWxlTGlzdFswXS5jb2RlICYmIHJlc3VsdC5maWxlTGlzdFswXS5jb2RlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihyZXN1bHQuZmlsZUxpc3RbMF0ubWVzc2FnZSB8fCAnQ29weSBmYWlsZWQnKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7IHBhdGg6IHRoaXMuX2dldENsb3VkUGF0aCh0b1BhdGgpIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTaWduZWRVcmwoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGV4cGlyZXNJbjogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBkb3dubG9hZD86IHN0cmluZyB8IGJvb2xlYW5cbiAgICAgIHRyYW5zZm9ybT86IFRyYW5zZm9ybU9wdGlvbnNcbiAgICB9LFxuICApOiBQcm9taXNlPHsgZGF0YTogeyBzaWduZWRVcmw6IHN0cmluZyB9OyBlcnJvcjogbnVsbCB9IHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xvdWRQYXRoID0gdGhpcy5fbm9ybWFsaXplQ2xvdWRJZChwYXRoKVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRUZW1wRmlsZVVSTCh7XG4gICAgICAgIGZpbGVMaXN0OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsZUlEOiBjbG91ZFBhdGgsXG4gICAgICAgICAgICBtYXhBZ2U6IGV4cGlyZXNJbixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSlcblxuICAgICAgLy8gSUdldEZpbGVVcmxJdGVtIOaciSBjb2RlIOWtl+auteS9huayoeaciSBtZXNzYWdlIOWtl+autVxuICAgICAgaWYgKHJlc3VsdC5maWxlTGlzdFswXS5jb2RlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBzaWduZWQgVVJMOiBbJHtyZXN1bHQuZmlsZUxpc3RbMF0uY29kZX1dICR7cmVzdWx0LmZpbGVMaXN0WzBdLmZpbGVJRH1gKVxuICAgICAgfVxuXG4gICAgICBsZXQgc2lnbmVkVXJsID0gcmVzdWx0LmZpbGVMaXN0WzBdLmRvd25sb2FkX3VybFxuXG4gICAgICAvLyDmnoTlu7rmn6Xor6Llj4LmlbBcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBzdHJpbmdbXSA9IFtdXG5cbiAgICAgIC8vIOWmguaenOaciSBkb3dubG9hZCDlj4LmlbDvvIzmt7vliqDliLAgVVJMIOS4rVxuICAgICAgaWYgKG9wdGlvbnM/LmRvd25sb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmRvd25sb2FkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIC8vIGRvd25sb2FkIOaYr+aWh+S7tuWQjVxuICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goYGRvd25sb2FkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnMuZG93bmxvYWQpfWApXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kb3dubG9hZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIC8vIGRvd25sb2FkIOaYryB0cnVl77yM5L2/55So5Y6f5paH5Lu25ZCN5oiW6buY6K6k5YC8XG4gICAgICAgICAgcXVlcnlQYXJhbXMucHVzaCgnZG93bmxvYWQ9dHJ1ZScpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g5aaC5p6c5pyJ5Zu+54mH6L2s5o2i5Y+C5pWw77yM5re75Yqg5YiwIFVSTCDkuK1cbiAgICAgIGlmIChvcHRpb25zPy50cmFuc2Zvcm0pIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtUXVlcnkgPSB0aGlzLl90cmFuc2Zvcm1PcHRzVG9RdWVyeVN0cmluZyhvcHRpb25zLnRyYW5zZm9ybSlcbiAgICAgICAgaWYgKHRyYW5zZm9ybVF1ZXJ5KSB7XG4gICAgICAgICAgcXVlcnlQYXJhbXMucHVzaCh0cmFuc2Zvcm1RdWVyeSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDmi7zmjqXmiYDmnInmn6Xor6Llj4LmlbBcbiAgICAgIGlmIChxdWVyeVBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHNpZ25lZFVybC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nXG4gICAgICAgIHNpZ25lZFVybCA9IGAke3NpZ25lZFVybH0ke3NlcGFyYXRvcn0ke3F1ZXJ5UGFyYW1zLmpvaW4oJyYnKX1gXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHsgc2lnbmVkVXJsIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNpZ25lZFVybHMoXG4gICAgcGF0aHM6IHN0cmluZ1tdLFxuICAgIGV4cGlyZXNJbjogbnVtYmVyLFxuICAgIC8vIG9wdGlvbnM/OiB7XG4gICAgLy8gICBkb3dubG9hZD86IHN0cmluZyB8IGJvb2xlYW5cbiAgICAvLyB9LFxuICApOiBQcm9taXNlPFxuICAgIHwgeyBkYXRhOiBBcnJheTx7IHBhdGg6IHN0cmluZzsgc2lnbmVkVXJsOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfCBudWxsIH0+OyBlcnJvcjogbnVsbCB9XG4gICAgfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICAgID4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlTGlzdCA9IHBhdGhzLm1hcChwID0+ICh7XG4gICAgICAgIGZpbGVJRDogdGhpcy5fbm9ybWFsaXplQ2xvdWRJZChwKSxcbiAgICAgICAgbWF4QWdlOiBleHBpcmVzSW4sXG4gICAgICB9KSlcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRUZW1wRmlsZVVSTCh7IGZpbGVMaXN0IH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3VsdC5maWxlTGlzdC5tYXAoKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgICAgICBwYXRoOiBwYXRoc1tpbmRleF0sXG4gICAgICAgICAgc2lnbmVkVXJsOiBpdGVtLnRlbXBGaWxlVVJMIHx8ICcnLFxuICAgICAgICAgIGVycm9yOiBpdGVtLmNvZGUgPT09ICdTVUNDRVNTJyA/IG51bGwgOiBpdGVtLm1lc3NhZ2UsXG4gICAgICAgIH0pKSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvclxuICAgICAgaWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZG93bmxvYWQoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUcmFuc2Zvcm1PcHRpb25zLFxuICApOiBQcm9taXNlPHtcbiAgICAgIGRhdGE6IEJsb2JcbiAgICAgIGVycm9yOiBTdG9yYWdlRXJyb3IgfCBudWxsXG4gICAgfT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNpZ25lZFVybFJlc3VsdCA9IGF3YWl0IHRoaXMuY3JlYXRlU2lnbmVkVXJsKHBhdGgsIDYwMCwgeyB0cmFuc2Zvcm06IG9wdGlvbnMgfSlcbiAgICAgICAgICBpZiAoc2lnbmVkVXJsUmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBzaWduZWRVcmxSZXN1bHQuZXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdG1wVXJsID0gZW5jb2RlVVJJKHNpZ25lZFVybFJlc3VsdC5kYXRhPy5zaWduZWRVcmwpXG5cbiAgICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0ICh0aGlzIGFzIGFueSkucmVxdWVzdC5yZXFDbGFzcy5nZXQoe1xuICAgICAgICAgICAgdXJsOiB0bXBVcmwsXG4gICAgICAgICAgICBoZWFkZXJzOiB7fSwgLy8g5LiL6L296LWE5rqQ6K+35rGC5LiN57uP6L+Hc2VydmljZe+8jGhlYWRlcua4heepulxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcignRG93bmxvYWQgZmFpbGVkOiBubyBmaWxlIGNvbnRlbnQnKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIOWwhiBCdWZmZXIg6L2s5o2i5Li6IFVpbnQ4QXJyYXkg5Lul5YW85a65IEJsb2JcbiAgICAgICAgICByZXR1cm4gbmV3IEJsb2IoW2RhdGFdKVxuICAgICAgICB9KSgpLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5paH5Lu25L+h5oGvXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlSWQgLSDnm7jlr7not6/lvoTvvIjlpoIgJ2ltYWdlcy9waG90by5qcGcn77yJ5oiWIENsb3VkQmFzZSBmaWxlSUTvvIjku6UgJ2Nsb3VkOi8vJyDlvIDlpLTvvIlcbiAgICogQHJldHVybnMg5paH5Lu25L+h5oGv5a+56LGhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8g5L2/55So55u45a+56Lev5b6EXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYnVja2V0LmluZm8oJ2ltYWdlcy9waG90by5qcGcnKVxuICAgKlxuICAgKiAvLyDkvb/nlKggQ2xvdWRCYXNlIGZpbGVJRFxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGJ1Y2tldC5pbmZvKCdjbG91ZDovL2Vudi1pZC54eHh4LXh4eHgvaW1hZ2VzL3Bob3RvLmpwZycpXG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgaW5mbyhwYXRoT3JGaWxlSWQ6IHN0cmluZywpOiBQcm9taXNlPHsgZGF0YTogQ2FtZWxpemU8RmlsZU9iamVjdFYyPjsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWIpOaWreaYryBmaWxlSUQg6L+Y5piv55u45a+56Lev5b6EXG4gICAgICBjb25zdCBpc0ZpbGVJZCA9IHBhdGhPckZpbGVJZC5zdGFydHNXaXRoKCdjbG91ZDovLycpXG4gICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGlzRmlsZUlkID8gdGhpcy5fZXh0cmFjdFBhdGhGcm9tRmlsZUlkKHBhdGhPckZpbGVJZCkgOiBwYXRoT3JGaWxlSWRcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gaXNGaWxlSWQgPyB0aGlzLl9leHRyYWN0QnVja2V0RnJvbUZpbGVJZChwYXRoT3JGaWxlSWQpIDogdGhpcy5idWNrZXRJZFxuXG4gICAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0RmlsZUluZm8oe1xuICAgICAgICBmaWxlTGlzdDogW3RoaXMuX25vcm1hbGl6ZUNsb3VkSWQocGF0aE9yRmlsZUlkKV0sXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBpdGVtID0gZmlsZUluZm8uZmlsZUxpc3RbMF1cblxuICAgICAgaWYgKGl0ZW0uY29kZSAhPT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoaXRlbS5tZXNzYWdlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgIGNvbnN0IGxhc3RNb2RpZmllZCA9IChpdGVtLmxhc3RNb2RpZmllZCA/IG5ldyBEYXRlKGl0ZW0ubGFzdE1vZGlmaWVkKSA6IG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBpZDogaXRlbS5maWxlSUQsXG4gICAgICAgICAgdmVyc2lvbjogJzEnLFxuICAgICAgICAgIG5hbWU6IGRpc3BsYXlOYW1lLFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbGFzdE1vZGlmaWVkLFxuICAgICAgICAgIGNyZWF0ZWRBdDogbGFzdE1vZGlmaWVkLFxuICAgICAgICAgIGxhc3RBY2Nlc3NlZEF0OiBub3csXG4gICAgICAgICAgc2l6ZTogaXRlbS5zaXplLFxuICAgICAgICAgIGNhY2hlQ29udHJvbDogaXRlbS5jYWNoZUNvbnRyb2wsXG4gICAgICAgICAgY29udGVudFR5cGU6IGl0ZW0uY29udGVudFR5cGUsXG4gICAgICAgICAgZXRhZzogaXRlbS5ldGFnLFxuICAgICAgICAgIGxhc3RNb2RpZmllZCxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvciA/IGVycm9yIDogbmV3IFN0b3JhZ2VFcnJvcihlcnJvci5tZXNzYWdlKSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBleGlzdHMocGF0aE9yRmlsZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGF0YTogYm9vbGVhbjsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWIpOaWreaYryBmaWxlSUQg6L+Y5piv55u45a+56Lev5b6EXG4gICAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0RmlsZUluZm8oe1xuICAgICAgICBmaWxlTGlzdDogW3RoaXMuX25vcm1hbGl6ZUNsb3VkSWQocGF0aE9yRmlsZUlkKV0sXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBpdGVtID0gZmlsZUluZm8uZmlsZUxpc3RbMF1cblxuICAgICAgaWYgKGl0ZW0uY29kZSA9PT0gJ0ZJTEVfTk9UX0ZPVU5EJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLmNvZGUgIT09ICdTVUNDRVNTJykge1xuICAgICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKGl0ZW0ubWVzc2FnZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGF0YTogdHJ1ZSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0UHVibGljVXJsKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgZG93bmxvYWQ/OiBzdHJpbmcgfCBib29sZWFuXG4gICAgICB0cmFuc2Zvcm0/OiBUcmFuc2Zvcm1PcHRpb25zXG4gICAgfSxcbiAgKTogUHJvbWlzZTxcbiAgICB8IHtcbiAgICAgIGRhdGE6IHsgcHVibGljVXJsOiBzdHJpbmcgfVxuICAgIH1cbiAgICB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9XG4gICAgPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jcmVhdGVTaWduZWRVcmwocGF0aCwgNjAwLCBvcHRpb25zKVxuXG4gICAgaWYgKHJlcy5kYXRhKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7IHB1YmxpY1VybDogcmVzLmRhdGEuc2lnbmVkVXJsIH0sXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3I6IHJlcy5lcnJvciBhcyBTdG9yYWdlRXJyb3IgfVxuICB9XG5cbiAgYXN5bmMgcmVtb3ZlKHBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8eyBkYXRhOiBGaWxlT2JqZWN0W107IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDliIbnu4Tojrflj5bmlofku7bkv6Hmga/vvIzmr4/nu4TmnIDlpJoxMOS4qlxuICAgICAgY29uc3QgY2h1bmtTaXplID0gMTBcbiAgICAgIGNvbnN0IHBhdGhDaHVua3M6IHN0cmluZ1tdW10gPSBbXVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkgKz0gY2h1bmtTaXplKSB7XG4gICAgICAgIHBhdGhDaHVua3MucHVzaChwYXRocy5zbGljZShpLCBpICsgY2h1bmtTaXplKSlcbiAgICAgIH1cblxuICAgICAgLy8g5bm26KGM6I635Y+W5omA5pyJ5YiG57uE55qE5paH5Lu25L+h5oGvXG4gICAgICBjb25zdCBmaWxlSW5mb1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwYXRoQ2h1bmtzLm1hcChjaHVuayA9PiBQcm9taXNlLmFsbChjaHVuay5tYXAocGF0aCA9PiB0aGlzLmluZm8ocGF0aCkpKSksKVxuXG4gICAgICAvLyDlkIjlubbmiYDmnInmlofku7bkv6Hmga/lubbmnoTlu7rmmKDlsITooajvvIhwYXRoIC0+IGZpbGVJbmZv77yJXG4gICAgICBjb25zdCBmaWxlSW5mb01hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYW1lbGl6ZTxGaWxlT2JqZWN0VjI+PigpXG4gICAgICBmaWxlSW5mb1Jlc3VsdHMuZmxhdCgpLmZvckVhY2goKHJlc3VsdCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5kYXRhKSB7XG4gICAgICAgICAgZmlsZUluZm9NYXAuc2V0KHBhdGhzW01hdGguZmxvb3IoaW5kZXggLyBjaHVua1NpemUpICogY2h1bmtTaXplICsgKGluZGV4ICUgY2h1bmtTaXplKV0sIHJlc3VsdC5kYXRhKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyDmiafooYzliKDpmaTmk43kvZxcbiAgICAgIGNvbnN0IGZpbGVMaXN0ID0gcGF0aHMubWFwKHAgPT4gdGhpcy5fbm9ybWFsaXplQ2xvdWRJZChwKSlcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZGVsZXRlRmlsZSh7IGZpbGVMaXN0IH0pXG5cbiAgICAgIC8vIElEZWxldGVGaWxlUmVzIOeahCBmaWxlTGlzdCDmlbDnu4TkuK3mr4/kuKrpobnmnIkgY29kZSDlrZfmrrVcbiAgICAgIGNvbnN0IGZhaWxlZEZpbGVzID0gcmVzdWx0LmZpbGVMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0uY29kZSAhPT0gJ1NVQ0NFU1MnKVxuICAgICAgaWYgKGZhaWxlZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihgRGVsZXRlIGZhaWxlZCBmb3IgJHtmYWlsZWRGaWxlcy5sZW5ndGh9IGZpbGUocylgKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgICAgLy8g5L2/55So6I635Y+W5Yiw55qE5paH5Lu25L+h5oGv5p6E5bu66L+U5Zue5pWw5o2uXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBwYXRocy5tYXAoKHApID0+IHtcbiAgICAgICAgICBjb25zdCBpbmZvID0gZmlsZUluZm9NYXAuZ2V0KHApXG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogaW5mbz8ubmFtZSxcbiAgICAgICAgICAgIGlkOiBpbmZvPy5pZCxcbiAgICAgICAgICAgIGJ1Y2tldF9pZDogaW5mbz8uYnVja2V0SWQsXG4gICAgICAgICAgICBvd25lcjogdW5kZWZpbmVkLCAvLyDml6Dms5XorqHnrpdvd25lclxuICAgICAgICAgICAgdXBkYXRlZF9hdDogaW5mbz8udXBkYXRlZEF0IHx8IG5vdyxcbiAgICAgICAgICAgIGNyZWF0ZWRfYXQ6IGluZm8/LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIGxhc3RfYWNjZXNzZWRfYXQ6IGluZm8/Lmxhc3RBY2Nlc3NlZEF0IHx8IG5vdyxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBpbmZvPy5tZXRhZGF0YSB8fCB7fSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVE9ETzog6I635Y+W6KGl5YWoIEJ1Y2tldCDkv6Hmga9cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYnVja2V0czoge1xuICAgICAgICAgICAgICBpZDogaW5mbz8uYnVja2V0SWQsXG4gICAgICAgICAgICAgIG5hbWU6IGluZm8/LmJ1Y2tldElkLFxuICAgICAgICAgICAgICBvd25lcjogdW5kZWZpbmVkLCAvLyDml6Dms5XorqHnrpdvd25lclxuICAgICAgICAgICAgICBwdWJsaWM6IGZhbHNlLCAvLyDmnKrnn6VcbiAgICAgICAgICAgICAgY3JlYXRlZF9hdDogJycsIC8vIOacquefpVxuICAgICAgICAgICAgICB1cGRhdGVkX2F0OiBub3csIC8vIOacquefpVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyBsaXN0KCkge1xuICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBwcml2YXRlIF9nZXRDbG91ZFBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyDmuIXnkIbot6/lvoTvvJrnp7vpmaTpppblsL7mlpzmnaDvvIzlkIjlubblpJrkuKrmlpzmnaBcbiAgICBjb25zdCBjbGVhblBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC98XFwvJC9nLCAnJykucmVwbGFjZSgvXFwvKy9nLCAnLycpXG5cbiAgICAvLyDlkKbliJnov5Tlm57muIXnkIblkI7nmoTnm7jlr7not6/lvoRcbiAgICByZXR1cm4gY2xlYW5QYXRoXG4gIH1cblxuICBwcml2YXRlIF9ub3JtYWxpemVDbG91ZElkKHBhdGg6IHN0cmluZykge1xuICAgIC8vIOWmguaenOW3sue7j+aYryBjbG91ZDovLyDmoLzlvI/vvIznm7TmjqXov5Tlm55cbiAgICBpZiAoL15jbG91ZDpcXC9cXC8vLnRlc3QocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICAgIGNvbnN0IGNsZWFuUGF0aCA9IHRoaXMuX2dldENsb3VkUGF0aChwYXRoKVxuXG4gICAgLy8g5aaC5p6c6K6+572u5LqGIGJ1Y2tldElk77yM5p6E5bu65a6M5pW055qEIGNsb3VkOi8vIOi3r+W+hFxuICAgIGlmICh0aGlzLmJ1Y2tldElkKSB7XG4gICAgICAvLyDojrflj5bnjq/looMgSURcbiAgICAgIGNvbnN0IGVudklkID0gdGhpcy5jb25maWc/LmVudiB8fCAnJ1xuICAgICAgaWYgKGVudklkKSB7XG4gICAgICAgIHJldHVybiBgY2xvdWQ6Ly8ke2VudklkfS4ke3RoaXMuYnVja2V0SWR9LyR7Y2xlYW5QYXRofWBcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcignYnVja2V0SWQgaXMgbm90IHNldCcpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b0Jhc2U2NChkYXRhOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShkYXRhKS50b1N0cmluZygnYmFzZTY0JylcbiAgICB9XG4gICAgcmV0dXJuIGJ0b2EoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiDlsIYgVHJhbnNmb3JtT3B0aW9ucyDovazmjaLkuLrohb7orq/kupHmlbDmja7kuIfosaHnmoQgaW1hZ2VNb2dyMiDmn6Xor6LlrZfnrKbkuLJcbiAgICpcbiAgICog6IW+6K6v5LqR5pWw5o2u5LiH6LGh5L2/55SoIGltYWdlTW9ncjIg5o6l5Y+j6L+b6KGM5Zu+54mH5aSE55CG77yM5pSv5oyB5Lul5LiL5Y+C5pWw77yaXG4gICAqIC0gL3RodW1ibmFpbC88V2lkdGg+eDxIZWlnaHQ+IC0g57yp5pS+XG4gICAqIC0gL2Zvcm1hdC88Rm9ybWF0PiAtIOagvOW8j+i9rOaNolxuICAgKiAtIC9xdWFsaXR5LzxRdWFsaXR5PiAtIOi0qOmHj+iwg+aVtFxuICAgKiAtIC9ycXVhbGl0eS88UXVhbGl0eT4gLSDnm7jlr7notKjph49cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zZm9ybSAtIFN1cGFiYXNlIFRyYW5zZm9ybU9wdGlvbnNcbiAgICogQHJldHVybnMg6IW+6K6v5LqR5pWw5o2u5LiH6LGh55qE5p+l6K+i5a2X56ym5LiyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogX3RyYW5zZm9ybU9wdHNUb1F1ZXJ5U3RyaW5nKHsgd2lkdGg6IDMwMCwgaGVpZ2h0OiAyMDAsIHF1YWxpdHk6IDgwLCBmb3JtYXQ6ICdvcmlnaW4nIH0pXG4gICAqIC8vIOi/lOWbnjogJ2ltYWdlTW9ncjIvdGh1bWJuYWlsLzMwMHgyMDAvcXVhbGl0eS84MCdcbiAgICogYGBgXG4gICAqL1xuICBwcml2YXRlIF90cmFuc2Zvcm1PcHRzVG9RdWVyeVN0cmluZyh0cmFuc2Zvcm06IFRyYW5zZm9ybU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbJ2ltYWdlTW9ncjInXVxuXG4gICAgLy8g5aSE55CG57yp5pS+5Y+C5pWwXG4gICAgaWYgKHRyYW5zZm9ybS53aWR0aCB8fCB0cmFuc2Zvcm0uaGVpZ2h0KSB7XG4gICAgICBjb25zdCB3aWR0aCA9IHRyYW5zZm9ybS53aWR0aCB8fCAnJ1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdHJhbnNmb3JtLmhlaWdodCB8fCAnJ1xuXG4gICAgICAvLyDmoLnmja4gcmVzaXplIOaooeW8j+mAieaLqeS4jeWQjOeahOe8qeaUvuaWueW8j1xuICAgICAgaWYgKHRyYW5zZm9ybS5yZXNpemUgPT09ICdmaWxsJykge1xuICAgICAgICAvLyBmaWxsOiDlvLrliLbnvKnmlL7liLDmjIflrprlsLrlr7jvvIzlj6/og73lj5jlvaJcbiAgICAgICAgcGFyYW1zLnB1c2goYHRodW1ibmFpbC8ke3dpZHRofXgke2hlaWdodH0hYClcbiAgICAgIH0gZWxzZSBpZiAodHJhbnNmb3JtLnJlc2l6ZSA9PT0gJ2NvbnRhaW4nKSB7XG4gICAgICAgIC8vIGNvbnRhaW46IOetieavlOe8qeaUvu+8jOWujOaVtOaYvuekuuWcqOaMh+WumuWwuuWvuOWGhVxuICAgICAgICBwYXJhbXMucHVzaChgdGh1bWJuYWlsLyR7d2lkdGh9eCR7aGVpZ2h0fWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb3ZlciAo6buY6K6kKTog562J5q+U57yp5pS+77yM5aGr5YWF5oyH5a6a5bC65a+477yM5Y+v6IO96KOB5YmqXG4gICAgICAgIC8vIOS9v+eUqCAvdGh1bWJuYWlsLzxXaWR0aD54PEhlaWdodD5eIOihqOekuuWhq+WFheaooeW8j1xuICAgICAgICBwYXJhbXMucHVzaChgdGh1bWJuYWlsLyR7d2lkdGh9eCR7aGVpZ2h0fV5gKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOWkhOeQhuagvOW8j+i9rOaNolxuICAgIC8vIGZvcm1hdDogJ29yaWdpbicg6KGo56S65L+d5oyB5Y6f5qC85byP77yM5LiN5Lyg5q2k5Y+C5pWwXG4gICAgaWYgKHRyYW5zZm9ybS5mb3JtYXQgJiYgdHJhbnNmb3JtLmZvcm1hdCAhPT0gJ29yaWdpbicpIHtcbiAgICAgIHBhcmFtcy5wdXNoKGBmb3JtYXQvJHt0cmFuc2Zvcm0uZm9ybWF0fWApXG4gICAgfVxuXG4gICAgLy8g5aSE55CG6LSo6YeP5Y+C5pWwXG4gICAgaWYgKHRyYW5zZm9ybS5xdWFsaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIOiFvuiur+S6keaVsOaNruS4h+ixoeeahCBxdWFsaXR5IOWPguaVsOiMg+WbtOaYryAxLTEwMFxuICAgICAgY29uc3QgcXVhbGl0eSA9IE1hdGgubWF4KDEsIE1hdGgubWluKDEwMCwgdHJhbnNmb3JtLnF1YWxpdHkpKVxuICAgICAgcGFyYW1zLnB1c2goYHF1YWxpdHkvJHtxdWFsaXR5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcy5qb2luKCcvJylcbiAgfVxuXG4gIC8qKlxuICAgKiDku44gQ2xvdWRCYXNlIGZpbGVJRCDkuK3mj5Dlj5bmlofku7bot6/lvoRcbiAgICpcbiAgICogQHBhcmFtIGZpbGVJZCAtIENsb3VkQmFzZSBmaWxlSUQgKOagvOW8jzogY2xvdWQ6Ly9lbnYtaWQuYnVja2V0L3BhdGgvdG8vZmlsZS5qcGcpXG4gICAqIEByZXR1cm5zIOaPkOWPlueahOaWh+S7tui3r+W+hFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIF9leHRyYWN0UGF0aEZyb21GaWxlSWQoJ2Nsb3VkOi8vdGVzdC1lbnYudGVzdC1idWNrZXQvaW1hZ2VzL3Bob3RvLmpwZycpXG4gICAqIC8vIOi/lOWbnjogJ2ltYWdlcy9waG90by5qcGcnXG4gICAqXG4gICAqIF9leHRyYWN0UGF0aEZyb21GaWxlSWQoJ2Nsb3VkOi8vdGVzdC1lbnYudGVzdC1idWNrZXQvZmlsZS50eHQnKVxuICAgKiAvLyDov5Tlm546ICdmaWxlLnR4dCdcbiAgICogYGBgXG4gICAqL1xuICBwcml2YXRlIF9leHRyYWN0UGF0aEZyb21GaWxlSWQoZmlsZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGZpbGVJRCDmoLzlvI86IGNsb3VkOi8vZW52LWlkLmJ1Y2tldC9wYXRoL3RvL2ZpbGUuanBnXG4gICAgLy8g6ZyA6KaB5o+Q5Y+W56ys5LiA5LiqIC8g5ZCO6Z2i55qE5omA5pyJ5YaF5a6577yI5YyF5ousIGJ1Y2tldCDlkozot6/lvoTvvIlcbiAgICAvLyDnhLblkI7lho3mj5Dlj5YgYnVja2V0IOWQjumdoueahOi3r+W+hOmDqOWIhlxuXG4gICAgLy8g56e76ZmkIGNsb3VkOi8vIOWJjee8gFxuICAgIGNvbnN0IHdpdGhvdXRQcm90b2NvbCA9IGZpbGVJZC5yZXBsYWNlKC9eY2xvdWQ6XFwvXFwvLywgJycpXG5cbiAgICAvLyDliIblibLkuLogW2Vudi1pZC5idWNrZXQsIHBhdGgsIHRvLCBmaWxlLmpwZ11cbiAgICBjb25zdCBwYXJ0cyA9IHdpdGhvdXRQcm90b2NvbC5zcGxpdCgnLycpXG5cbiAgICBpZiAocGFydHMubGVuZ3RoIDwgMikge1xuICAgICAgLy8g5aaC5p6c5peg5rOV6Kej5p6Q77yM6L+U5Zue5a6M5pW055qEIGZpbGVJRFxuICAgICAgcmV0dXJuIGZpbGVJZFxuICAgIH1cblxuICAgIC8vIOenu+mZpOesrOS4gOmDqOWIhu+8iGVudi1pZC5idWNrZXTvvInvvIzov5Tlm57liankvZnot6/lvoRcbiAgICByZXR1cm4gcGFydHMuc2xpY2UoMSkuam9pbignLycpXG4gIH1cblxuICAvKipcbiAgICog5LuOIENsb3VkQmFzZSBmaWxlSUQg5Lit5o+Q5Y+WIGJ1Y2tldCDlkI3np7BcbiAgICpcbiAgICogQHBhcmFtIGZpbGVJZCAtIENsb3VkQmFzZSBmaWxlSUQgKOagvOW8jzogY2xvdWQ6Ly9lbnYtaWQuYnVja2V0L3BhdGgvdG8vZmlsZS5qcGcpXG4gICAqIEByZXR1cm5zIOaPkOWPlueahCBidWNrZXQg5ZCN56ewXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogX2V4dHJhY3RCdWNrZXRGcm9tRmlsZUlkKCdjbG91ZDovL3Rlc3QtZW52LnRlc3QtYnVja2V0L2ltYWdlcy9waG90by5qcGcnKVxuICAgKiAvLyDov5Tlm546ICd0ZXN0LWJ1Y2tldCdcbiAgICpcbiAgICogX2V4dHJhY3RCdWNrZXRGcm9tRmlsZUlkKCdjbG91ZDovL3Byb2QtZW52Lm15LWJ1Y2tldC9maWxlLnR4dCcpXG4gICAqIC8vIOi/lOWbnjogJ215LWJ1Y2tldCdcbiAgICogYGBgXG4gICAqL1xuICBwcml2YXRlIF9leHRyYWN0QnVja2V0RnJvbUZpbGVJZChmaWxlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gZmlsZUlEIOagvOW8jzogY2xvdWQ6Ly9lbnYtaWQuYnVja2V0L3BhdGgvdG8vZmlsZS5qcGdcbiAgICAvLyDpnIDopoHmj5Dlj5YgZW52LWlkLmJ1Y2tldCDkuK3nmoQgYnVja2V0IOmDqOWIhlxuXG4gICAgLy8g56e76ZmkIGNsb3VkOi8vIOWJjee8gFxuICAgIGNvbnN0IHdpdGhvdXRQcm90b2NvbCA9IGZpbGVJZC5yZXBsYWNlKC9eY2xvdWQ6XFwvXFwvLywgJycpXG5cbiAgICAvLyDliIblibLkuLogW2Vudi1pZC5idWNrZXQsIHBhdGgsIHRvLCBmaWxlLmpwZ11cbiAgICBjb25zdCBwYXJ0cyA9IHdpdGhvdXRQcm90b2NvbC5zcGxpdCgnLycpXG5cbiAgICBpZiAocGFydHMubGVuZ3RoIDwgMSkge1xuICAgICAgLy8g5aaC5p6c5peg5rOV6Kej5p6Q77yM6L+U5Zue6buY6K6kIGJ1Y2tldFxuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgLy8g56ys5LiA6YOo5YiG5pivIGVudi1pZC5idWNrZXTvvIzmj5Dlj5YgYnVja2V0IOmDqOWIhlxuICAgIC8vIOagvOW8jzogZW52LWlkLmJ1Y2tldCDmiJYgZW52LWlkLmJ1Y2tldC1uYW1lXG4gICAgY29uc3QgZW52QW5kQnVja2V0ID0gcGFydHNbMF1cblxuICAgIC8vIOafpeaJvuesrOS4gOS4queCueeahOS9jee9rlxuICAgIGNvbnN0IGRvdEluZGV4ID0gZW52QW5kQnVja2V0LmluZGV4T2YoJy4nKVxuXG4gICAgaWYgKGRvdEluZGV4ID09PSAtMSkge1xuICAgICAgLy8g5aaC5p6c5rKh5pyJ54K577yM6L+U5Zue5pW05Liq5a2X56ym5LiyXG4gICAgICByZXR1cm4gZW52QW5kQnVja2V0XG4gICAgfVxuXG4gICAgLy8g6L+U5Zue54K55ZCO6Z2i55qE6YOo5YiG77yIYnVja2V0IOWQjeensO+8iVxuICAgIHJldHVybiBlbnZBbmRCdWNrZXQuc3Vic3RyaW5nKGRvdEluZGV4ICsgMSlcbiAgfVxufVxuIl19