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