@libs-ui/utils 0.2.355-9 → 0.2.356-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.
- package/README.md +633 -2
- package/base64.d.ts +25 -0
- package/cache.d.ts +73 -0
- package/collection.d.ts +12 -0
- package/color.d.ts +37 -0
- package/communicate-micro.d.ts +34 -1
- package/crypto-3rd.d.ts +12 -0
- package/crypto.d.ts +17 -0
- package/dangerous-object.d.ts +8 -1
- package/data.d.ts +5 -3
- package/date.d.ts +12 -0
- package/dom.d.ts +56 -0
- package/download.d.ts +21 -0
- package/esm2022/base64.mjs +27 -2
- package/esm2022/cache.mjs +74 -1
- package/esm2022/collection.mjs +13 -1
- package/esm2022/color.mjs +38 -1
- package/esm2022/communicate-micro.mjs +37 -5
- package/esm2022/crypto-3rd.mjs +13 -1
- package/esm2022/crypto.mjs +18 -1
- package/esm2022/dangerous-object.mjs +11 -2
- package/esm2022/data.mjs +6 -4
- package/esm2022/date.mjs +13 -1
- package/esm2022/dom.mjs +57 -1
- package/esm2022/download.mjs +22 -1
- package/esm2022/file.mjs +54 -1
- package/esm2022/format-number.mjs +31 -3
- package/esm2022/format-text.mjs +73 -2
- package/esm2022/function-check-embed-frame.mjs +28 -1
- package/esm2022/pattern.mjs +83 -3
- package/esm2022/trace.mjs +8 -1
- package/esm2022/two-way-signal-object.mjs +14 -1
- package/esm2022/uri.mjs +22 -3
- package/esm2022/url-search-params.mjs +68 -1
- package/esm2022/url.mjs +10 -1
- package/esm2022/uuid.mjs +7 -1
- package/esm2022/xss-filter.mjs +14 -1
- package/fesm2022/libs-ui-utils.mjs +723 -21
- package/fesm2022/libs-ui-utils.mjs.map +1 -1
- package/file.d.ts +53 -0
- package/format-number.d.ts +29 -1
- package/format-text.d.ts +71 -0
- package/function-check-embed-frame.d.ts +22 -0
- package/package.json +2 -2
- package/pattern.d.ts +81 -1
- package/trace.d.ts +7 -0
- package/two-way-signal-object.d.ts +13 -0
- package/uri.d.ts +20 -0
- package/url-search-params.d.ts +67 -0
- package/url.d.ts +9 -0
- package/uuid.d.ts +6 -0
- package/xss-filter.d.ts +13 -0
package/esm2022/cache.mjs
CHANGED
|
@@ -7,6 +7,10 @@ import { isEmbedFrame } from './function-check-embed-frame';
|
|
|
7
7
|
import { get, isNil } from './helpers';
|
|
8
8
|
import { UtilsLanguageConstants } from './language';
|
|
9
9
|
import { uuid } from './uuid';
|
|
10
|
+
/**
|
|
11
|
+
* Tiện ích quản lý Cache, hỗ trợ cả LocalStorage (đồng bộ) và IndexedDB (bất đồng bộ)
|
|
12
|
+
* Tự động mã hóa dữ liệu và xử lý thời gian hết hạn
|
|
13
|
+
*/
|
|
10
14
|
export class UtilsCache {
|
|
11
15
|
static CACHE_EXPIRE_TIME_DEFAULT = 5 * 60;
|
|
12
16
|
static CACHE_EXPIRE_NONE = -1;
|
|
@@ -20,6 +24,10 @@ export class UtilsCache {
|
|
|
20
24
|
static itemIndexByKey = 'key';
|
|
21
25
|
static dbVersion = 1;
|
|
22
26
|
static db = null;
|
|
27
|
+
/**
|
|
28
|
+
* Khởi tạo cấu hình cho Cache
|
|
29
|
+
* @param config Cấu hình khởi tạo (tên DB, key ngôn ngữ, event clear...)
|
|
30
|
+
*/
|
|
23
31
|
static init(config) {
|
|
24
32
|
if (this.initdEvent) {
|
|
25
33
|
return;
|
|
@@ -38,12 +46,20 @@ export class UtilsCache {
|
|
|
38
46
|
this.languageKeyCache = config.languageKeyCache;
|
|
39
47
|
}
|
|
40
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Lưu ngôn ngữ hiện tại vào cache
|
|
51
|
+
* @param lang Mã ngôn ngữ (vi, en, ...)
|
|
52
|
+
*/
|
|
41
53
|
static setLang(lang) {
|
|
42
54
|
if (!UtilsLanguageConstants.isSupported(lang)) {
|
|
43
55
|
throw Error(`Language not support ${lang}`);
|
|
44
56
|
}
|
|
45
57
|
this.Set(this.languageKeyCache, lang, this.CACHE_EXPIRE_NONE);
|
|
46
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Lấy ngôn ngữ từ cache
|
|
61
|
+
* @returns Mã ngôn ngữ
|
|
62
|
+
*/
|
|
47
63
|
static getLang() {
|
|
48
64
|
return this.Get(this.languageKeyCache, UtilsLanguageConstants.defaultLang());
|
|
49
65
|
}
|
|
@@ -141,6 +157,13 @@ export class UtilsCache {
|
|
|
141
157
|
},
|
|
142
158
|
};
|
|
143
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Lấy giá trị từ IndexedDB theo key (bất đồng bộ)
|
|
162
|
+
* @param key Khóa cache
|
|
163
|
+
* @param default_value Giá trị mặc định nếu không tìm thấy
|
|
164
|
+
* @param isKeyMD5 Nếu true, key đã là MD5. Nếu false (mặc định), sẽ tự động MD5 key.
|
|
165
|
+
* @returns Promise chứa giá trị đã giải mã
|
|
166
|
+
*/
|
|
144
167
|
static async GetAsync(key, default_value, isKeyMD5 = false) {
|
|
145
168
|
key = isKeyMD5 ? key : md5(key);
|
|
146
169
|
return new Promise(async (resolve) => {
|
|
@@ -169,6 +192,12 @@ export class UtilsCache {
|
|
|
169
192
|
};
|
|
170
193
|
});
|
|
171
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Lấy giá trị từ LocalStorage theo key (đồng bộ)
|
|
197
|
+
* @param key Khóa cache
|
|
198
|
+
* @param default_value Giá trị mặc định nếu không tìm thấy
|
|
199
|
+
* @returns Giá trị đã giải mã hoặc giá trị mặc định
|
|
200
|
+
*/
|
|
172
201
|
static Get(key, default_value) {
|
|
173
202
|
// support cho những file không thể inject UtilsCache
|
|
174
203
|
if (!key) {
|
|
@@ -197,6 +226,14 @@ export class UtilsCache {
|
|
|
197
226
|
static GetDefaultValueBySpecificKey(key, default_value) {
|
|
198
227
|
return default_value;
|
|
199
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* Lưu giá trị vào IndexedDB (bất đồng bộ)
|
|
231
|
+
* @param key Khóa cache
|
|
232
|
+
* @param value Giá trị cần lưu
|
|
233
|
+
* @param expireTimeBySecond Thời gian hết hạn (giây). Mặc định 5 phút. Dùng CACHE_EXPIRE_NONE để vĩnh viễn.
|
|
234
|
+
* @param isKeyMD5 Nếu true, key đã là MD5.
|
|
235
|
+
* @returns Promise chứa thông tin kết quả
|
|
236
|
+
*/
|
|
200
237
|
static async SetAsync(key, value, expireTimeBySecond = this.CACHE_EXPIRE_TIME_DEFAULT, isKeyMD5 = false) {
|
|
201
238
|
// support inject UtilsCache
|
|
202
239
|
return new Promise(async (resolve) => {
|
|
@@ -228,6 +265,13 @@ export class UtilsCache {
|
|
|
228
265
|
}
|
|
229
266
|
});
|
|
230
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* Lưu giá trị vào LocalStorage (đồng bộ)
|
|
270
|
+
* @param key Khóa cache
|
|
271
|
+
* @param value Giá trị cần lưu
|
|
272
|
+
* @param expireTimeBySecond Thời gian hết hạn (giây). Mặc định 5 phút.
|
|
273
|
+
* @returns true nếu thành công
|
|
274
|
+
*/
|
|
231
275
|
static Set(key, value, expireTimeBySecond = this.CACHE_EXPIRE_TIME_DEFAULT) {
|
|
232
276
|
// support cho những file không inject UtilsCache
|
|
233
277
|
const currentMillisecond = expireTimeBySecond === this.CACHE_EXPIRE_NONE ? this.CACHE_EXPIRE_NONE : new Date().valueOf() / 1000 + expireTimeBySecond;
|
|
@@ -244,6 +288,11 @@ export class UtilsCache {
|
|
|
244
288
|
return false;
|
|
245
289
|
}
|
|
246
290
|
}
|
|
291
|
+
/**
|
|
292
|
+
* Xóa một key trong IndexedDB
|
|
293
|
+
* @param key Khóa cần xóa
|
|
294
|
+
* @param isMD5 Nếu true, key đã được MD5.
|
|
295
|
+
*/
|
|
247
296
|
static async ClearAsync(key, isMD5 = false) {
|
|
248
297
|
return new Promise(async (resolve) => {
|
|
249
298
|
const objectStore = await this.getObjectStore();
|
|
@@ -260,12 +309,19 @@ export class UtilsCache {
|
|
|
260
309
|
};
|
|
261
310
|
});
|
|
262
311
|
}
|
|
312
|
+
/**
|
|
313
|
+
* Xóa một key trong LocalStorage
|
|
314
|
+
* @param key Khóa cần xóa
|
|
315
|
+
*/
|
|
263
316
|
static Clear(key) {
|
|
264
317
|
if (key.includes('kc-callback-')) {
|
|
265
318
|
return;
|
|
266
319
|
}
|
|
267
320
|
this.LocalStorage.removeItem(key);
|
|
268
321
|
}
|
|
322
|
+
/**
|
|
323
|
+
* Xóa toàn bộ dữ liệu trong IndexedDB
|
|
324
|
+
*/
|
|
269
325
|
static ClearAllAsync() {
|
|
270
326
|
return new Promise(async (resolve) => {
|
|
271
327
|
const objectStore = await this.getObjectStore();
|
|
@@ -283,6 +339,9 @@ export class UtilsCache {
|
|
|
283
339
|
};
|
|
284
340
|
});
|
|
285
341
|
}
|
|
342
|
+
/**
|
|
343
|
+
* Xóa toàn bộ dữ liệu trong LocalStorage (kiểm soát các key đặc biệt)
|
|
344
|
+
*/
|
|
286
345
|
static ClearAll() {
|
|
287
346
|
if (isEmbedFrame()) {
|
|
288
347
|
const data = {
|
|
@@ -326,6 +385,11 @@ export class UtilsCache {
|
|
|
326
385
|
this.Set(key, value, this.CACHE_EXPIRE_NONE);
|
|
327
386
|
});
|
|
328
387
|
}
|
|
388
|
+
/**
|
|
389
|
+
* Xóa tất cả các khóa bắt đầu bằng tiền tố nhất định trong IndexedDB
|
|
390
|
+
* @param keyCacheStartWith Tiền tố khóa
|
|
391
|
+
* @param isKeyMD5 Nếu true, tiền tố đã được MD5.
|
|
392
|
+
*/
|
|
329
393
|
static DeleteKeyStartWithAsync(keyCacheStartWith, isKeyMD5 = false) {
|
|
330
394
|
return new Promise(async (resolve) => {
|
|
331
395
|
const objectStore = await this.getObjectStore();
|
|
@@ -352,6 +416,11 @@ export class UtilsCache {
|
|
|
352
416
|
};
|
|
353
417
|
});
|
|
354
418
|
}
|
|
419
|
+
/**
|
|
420
|
+
* Xóa tất cả các khóa bắt đầu bằng tiền tố nhất định trong LocalStorage
|
|
421
|
+
* @param keyCache Tiền tố khóa
|
|
422
|
+
* @param isMD5 Nếu true, tiền tố sẽ được MD5 trước khi so sánh.
|
|
423
|
+
*/
|
|
355
424
|
static DeleteKeyStartWith(keyCache, isMD5 = false) {
|
|
356
425
|
keyCache = isMD5 ? md5(keyCache) : keyCache;
|
|
357
426
|
const keys = Object.keys(this.LocalStorage);
|
|
@@ -364,6 +433,10 @@ export class UtilsCache {
|
|
|
364
433
|
}
|
|
365
434
|
});
|
|
366
435
|
}
|
|
436
|
+
/**
|
|
437
|
+
* Xóa hoàn toàn cơ sở dữ liệu IndexedDB
|
|
438
|
+
* @param dbName Tên DB, mặc định theo cấu hình.
|
|
439
|
+
*/
|
|
367
440
|
static DeleteDatabaseIndexDB(dbName) {
|
|
368
441
|
return new Promise((resolve) => {
|
|
369
442
|
dbName = (dbName || this.dbName);
|
|
@@ -384,4 +457,4 @@ export class UtilsCache {
|
|
|
384
457
|
});
|
|
385
458
|
}
|
|
386
459
|
}
|
|
387
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7QUFDOUMsdURBQXVEO0FBR3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUU5QixNQUFNLE9BQU8sVUFBVTtJQUNkLE1BQU0sQ0FBVSx5QkFBeUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ25ELE1BQU0sQ0FBVSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2QyxNQUFNLENBQVUsU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQ25DLE1BQU0sQ0FBQyx3QkFBd0IsR0FBRyxtQ0FBbUMsQ0FBQztJQUVyRSxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUM7SUFDbkQsTUFBTSxDQUFDLHdCQUF3QixHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ2xELE1BQU0sQ0FBQyxVQUFVLENBQVc7SUFDNUIsTUFBTSxDQUFDLE9BQU8sQ0FBNkI7SUFDM0MsTUFBTSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUM7SUFDaEMsTUFBTSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDOUIsTUFBTSxDQUFDLFNBQVMsR0FBRyxD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QU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFDM0MsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLDJCQUEyQixFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQVMsQ0FBQyxDQUFDO1lBQ3RGLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3IgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgSUV2ZW50LCBUWVBFX0xBTkdVQUdFX1NVUFBPUlQgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IFV0aWxzQ29tbXVuaWNhdGVNaWNybyB9IGZyb20gJy4vY29tbXVuaWNhdGUtbWljcm8nO1xuaW1wb3J0IHsgZGVjcnlwdCwgZW5jcnlwdCwgbWQ1IH0gZnJvbSAnLi9jcnlwdG8nO1xuaW1wb3J0IHsgZ2V0RGV2aWNlSW5mbyB9IGZyb20gJy4vZG9tJztcbmltcG9ydCB7IGlzRW1iZWRGcmFtZSB9IGZyb20gJy4vZnVuY3Rpb24tY2hlY2stZW1iZWQtZnJhbWUnO1xuaW1wb3J0IHsgZ2V0LCBpc05pbCB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBVdGlsc0xhbmd1YWdlQ29uc3RhbnRzIH0gZnJvbSAnLi9sYW5ndWFnZSc7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnLi91dWlkJztcblxuZXhwb3J0IGNsYXNzIFV0aWxzQ2FjaGUge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENBQ0hFX0VYUElSRV9USU1FX0RFRkFVTFQgPSA1ICogNjA7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0FDSEVfRVhQSVJFX05PTkUgPSAtMTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZFNlcnZpY2UgPSB1dWlkKCk7XG4gIHB1YmxpYyBzdGF0aWMgdHlwZUtleUNsZWFyTG9jYWxTdG9yYWdlID0gJ0xJQlNfVUlfQ0xFQVJfTE9DQUxfU1RPUkFHRV9FVkVOVCc7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbGFuZ3VhZ2VLZXlDYWNoZSA9ICdTUjN4UUt4SGdmZmlDZXZQUVJyYWxnJztcbiAgcHJpdmF0ZSBzdGF0aWMgbGlzdEtleUtlZXBXaGVuQ2xlYXJBTGxsID0gQXJyYXk8c3RyaW5nPigpO1xuICBwcml2YXRlIHN0YXRpYyBpbml0ZEV2ZW50PzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBzdGF0aWMgc3RvcmFnZTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07XG4gIHByaXZhdGUgc3RhdGljIGRiTmFtZSA9ICdsaWJzLXVpLWNhY2hlJztcbiAgcHJpdmF0ZSBzdGF0aWMgaXRlbUluZGV4QnlLZXkgPSAna2V5JztcbiAgcHJpdmF0ZSBzdGF0aWMgZGJWZXJzaW9uID0gMTtcbiAgcHJpdmF0ZSBzdGF0aWMgZGI6IElEQkRhdGFiYXNlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHN0YXRpYyBpbml0KGNvbmZpZzogeyBpbmRleGVkREJOYW1lPzogc3RyaW5nOyBsYW5ndWFnZUtleUNhY2hlPzogc3RyaW5nOyB0eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2U/OiBzdHJpbmc7IGxpc3RLZXlLZWVwV2hlbkNsZWFyQWxsPzogQXJyYXk8c3RyaW5nPiB9KSB7XG4gICAgaWYgKHRoaXMuaW5pdGRFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluaXRkRXZlbnQgPSB0cnVlO1xuICAgIGlmIChjb25maWcuaW5kZXhlZERCTmFtZSkge1xuICAgICAgdGhpcy5kYk5hbWUgPSBjb25maWcuaW5kZXhlZERCTmFtZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy50eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHRoaXMudHlwZUtleUNsZWFyTG9jYWxTdG9yYWdlID0gY29uZmlnLnR5cGVLZXlDbGVhckxvY2FsU3RvcmFnZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5saXN0S2V5S2VlcFdoZW5DbGVhckFsbCkge1xuICAgICAgdGhpcy5saXN0S2V5S2VlcFdoZW5DbGVhckFMbGwgPSBjb25maWcubGlzdEtleUtlZXBXaGVuQ2xlYXJBbGw7XG4gICAgfVxuICAgIGlmIChjb25maWcubGFuZ3VhZ2VLZXlDYWNoZSkge1xuICAgICAgdGhpcy5sYW5ndWFnZUtleUNhY2hlID0gY29uZmlnLmxhbmd1YWdlS2V5Q2FjaGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXRMYW5nKGxhbmc6IFRZUEVfTEFOR1VBR0VfU1VQUE9SVCkge1xuICAgIGlmICghVXRpbHNMYW5ndWFnZUNvbnN0YW50cy5pc1N1cHBvcnRlZChsYW5nKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYExhbmd1YWdlIG5vdCBzdXBwb3J0ICR7bGFuZ31gKTtcbiAgICB9XG4gICAgdGhpcy5TZXQodGhpcy5sYW5ndWFnZUtleUNhY2hlLCBsYW5nLCB0aGlzLkNBQ0hFX0VYUElSRV9OT05FKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TGFuZygpOiBUWVBFX0xBTkdVQUdFX1NVUFBPUlQge1xuICAgIHJldHVybiB0aGlzLkdldCh0aGlzLmxhbmd1YWdlS2V5Q2FjaGUsIFV0aWxzTGFuZ3VhZ2VDb25zdGFudHMuZGVmYXVsdExhbmcoKSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBvcGVuREIoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsIHRoaXMuZGJWZXJzaW9uKTtcblxuICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZXZlbnQ6IElEQlZlcnNpb25DaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkYiA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xuXG4gICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh0aGlzLmRiTmFtZSkpIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMuZGJOYW1lLCB7IGtleVBhdGg6IHRoaXMuaXRlbUluZGV4QnlLZXkgfSk7XG5cbiAgICAgICAgICBvYmplY3RTdG9yZS5jcmVhdGVJbmRleCh0aGlzLml0ZW1JbmRleEJ5S2V5LCB0aGlzLml0ZW1JbmRleEJ5S2V5LCB7IHVuaXF1ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGIgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdFcnJvciBvcGVuaW5nIEluZGV4ZWREQjonLCBldmVudCk7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGdldE9iamVjdFN0b3JlKCkge1xuICAgIGlmICghdGhpcy5kYikge1xuICAgICAgYXdhaXQgdGhpcy5vcGVuREIoKTtcbiAgICB9XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiPy50cmFuc2FjdGlvbihbdGhpcy5kYk5hbWVdLCAncmVhZHdyaXRlJyk7XG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuZGJOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldCBMb2NhbFN0b3JhZ2UoKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoZ2V0RGV2aWNlSW5mbygpLnNhdGlzZmllcyh7IHNhZmFyaTogJz49MTYnIH0pKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxTdG9yYWdlRmFrZU9uU2FmYXJpKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5nZXRMb2NhbFN0b3JhZ2VGYWtlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUudHJhY2UoYExvY2FsU3RvcmFnZSBgLCBlcnJvcik7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMb2NhbFN0b3JhZ2VGYWtlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TG9jYWxTdG9yYWdlRmFrZU9uU2FmYXJpKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIXRoaXMuc3RvcmFnZSAmJiBPYmplY3Qua2V5cyhsb2NhbFN0b3JhZ2UpLmxlbmd0aCkge1xuICAgICAgdGhpcy5zdG9yYWdlID0geyAuLi5sb2NhbFN0b3JhZ2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2V0SXRlbTogKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB0aGlzLnN0b3JhZ2Vba2V5XSA9IHZhbHVlO1xuICAgICAgfSxcbiAgICAgIGdldEl0ZW06IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0b3JhZ2UgfHwgaXNOaWwodGhpcy5zdG9yYWdlW2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHRoaXMuc3RvcmFnZVtrZXldIGFzIHN0cmluZyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZT8uW2tleV07XG4gICAgICB9LFxuICAgICAgcmVtb3ZlSXRlbTogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2U/LltrZXldO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfSxcbiAgICAgIGNsZWFyOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmFnZSA9IHt9O1xuICAgICAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldExvY2FsU3RvcmFnZUZha2UoKSB7XG4gICAgaWYgKCF0aGlzLnN0b3JhZ2UpIHtcbiAgICAgIHRoaXMuc3RvcmFnZSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXRJdGVtOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmFnZVtrZXldID0gdmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbTogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2U/LltrZXldO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUl0ZW06IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zdG9yYWdlPy5ba2V5XTtcbiAgICAgIH0sXG4gICAgICBjbGVhcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3JhZ2UgPSB7fTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgR2V0QXN5bmM8VCA9IGFueT4oa2V5OiBzdHJpbmcsIGRlZmF1bHRfdmFsdWU/OiBhbnksIGlzS2V5TUQ1ID0gZmFsc2UpOiBQcm9taXNlPFQ+IHtcbiAgICBrZXkgPSBpc0tleU1ENSA/IGtleSA6IG1kNShrZXkpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0U3RvcmUoKTtcblxuICAgICAgaWYgKCFvYmplY3RTdG9yZSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWZhdWx0X3ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZS5nZXQoa2V5KTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdC5yZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWZhdWx0X3ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShkZWNyeXB0KHJlcXVlc3QucmVzdWx0LnZhbHVlKSk7XG5cbiAgICAgICAgaWYgKGRhdGEuZXhwaXJlID09PSB0aGlzLkNBQ0hFX0VYUElSRV9OT05FKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YS5qc29uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAvIDEwMDA7XG5cbiAgICAgICAgaWYgKGRhdGEuZXhwaXJlIDwgY3VycmVudE1pbGxpc2Vjb25kKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoZGVmYXVsdF92YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhLmpzb24pO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLnRyYWNlKGBHZXQga2V5ICR7a2V5fSBFcnJvciwgcmV0dXJuIGRlZmF1bHQgdmFsdWU6ICR7ZGVmYXVsdF92YWx1ZX1gKTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZGVmYXVsdF92YWx1ZSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBHZXQ8VCA9IGFueT4oa2V5OiBzdHJpbmcsIGRlZmF1bHRfdmFsdWU/OiBhbnkpOiBUIHtcbiAgICAvLyBzdXBwb3J0IGNobyBuaOG7r25nIGZpbGUga2jDtG5nIHRo4buDIGluamVjdCBVdGlsc0NhY2hlXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLkdldERlZmF1bHRWYWx1ZUJ5U3BlY2lmaWNLZXkoa2V5LCBkZWZhdWx0X3ZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuTG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcblxuICAgIGlmICghY2FjaGVkRGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuR2V0RGVmYXVsdFZhbHVlQnlTcGVjaWZpY0tleShrZXksIGRlZmF1bHRfdmFsdWUpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZGVjcnlwdChjYWNoZWREYXRhKSk7XG5cbiAgICAgIGlmIChkYXRhLmV4cGlyZSA9PT0gdGhpcy5DQUNIRV9FWFBJUkVfTk9ORSkge1xuICAgICAgICByZXR1cm4gZGF0YS52YWx1ZSA/PyBkZWZhdWx0X3ZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE1pbGxpc2Vjb25kID0gbmV3IERhdGUoKS52YWx1ZU9mKCkgLyAxMDAwO1xuXG4gICAgICBpZiAoZGF0YS5leHBpcmUgPCBjdXJyZW50TWlsbGlzZWNvbmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0RGVmYXVsdFZhbHVlQnlTcGVjaWZpY0tleShrZXksIGRlZmF1bHRfdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YS52YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS50cmFjZShgR2V0IGtleSAke2tleX0gRXJyb3IsIHJldHVybiBkZWZhdWx0IHZhbHVlOiAke2RlZmF1bHRfdmFsdWV9YCwgZXJyb3IpO1xuXG4gICAgICByZXR1cm4gdGhpcy5HZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleSwgZGVmYXVsdF92YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBHZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleTogc3RyaW5nLCBkZWZhdWx0X3ZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgU2V0QXN5bmM8VCA9IGFueT4oa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGV4cGlyZVRpbWVCeVNlY29uZCA9IHRoaXMuQ0FDSEVfRVhQSVJFX1RJTUVfREVGQVVMVCwgaXNLZXlNRDUgPSBmYWxzZSk6IFByb21pc2U8VD4ge1xuICAgIC8vIHN1cHBvcnQgaW5qZWN0IFV0aWxzQ2FjaGVcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RTdG9yZSgpO1xuXG4gICAgICBrZXkgPSBpc0tleU1ENSA/IGtleSA6IG1kNShrZXkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3VycmVudE1pbGxpc2Vjb25kID0gZXhwaXJlVGltZUJ5U2Vjb25kID09PSB0aGlzLkNBQ0hFX0VYUElSRV9OT05FID8gdGhpcy5DQUNIRV9FWFBJUkVfTk9ORSA6IG5ldyBEYXRlKCkudmFsdWVPZigpIC8gMTAwMCArIGV4cGlyZVRpbWVCeVNlY29uZDtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICAgIHZhbHVlOiBlbmNyeXB0KEpTT04uc3RyaW5naWZ5KHsganNvbjogdmFsdWUsIGV4cGlyZTogY3VycmVudE1pbGxpc2Vjb25kIH0pKSxcbiAgICAgICAgfTtcbiAgICAgICAgZGF0YVt0aGlzLml0ZW1JbmRleEJ5S2V5XSA9IGtleTtcblxuICAgICAgICBpZiAoIW9iamVjdFN0b3JlKSB7XG4gICAgICAgICAgY29uc29sZS50cmFjZShgQ2FuIG5vdCBvcGVuIG9iamVjdCBzdG9yZWApO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKHsga2V5LCBtZXNzYWdlRXJyb3I6ICdDYW4gbm90IG9wZW4gb2JqZWN0IHN0b3JlJyB9IGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG9iamVjdFN0b3JlPy5wdXQoZGF0YSk7XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBTZXQga2V5ICR7a2V5fSBTdWNjZXNzYCk7XG4gICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCBhcyBhbnkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUudHJhY2UoYFNldCBrZXkgJHtrZXl9IEVycm9yYCk7XG4gICAgICAgICAgcmVzb2x2ZSh7IGtleSwgbWVzc2FnZUVycm9yOiBnZXQoZXJyb3IgYXMgSUV2ZW50LCAnbWVzc2FnZScpIH0gYXMgYW55KTtcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UoYFNldCBrZXkgJHtrZXl9IEVycm9yYCk7XG4gICAgICAgIHJlc29sdmUoeyBrZXksIG1lc3NhZ2VFcnJvcjogZ2V0KGVycm9yLCAnbWVzc2FnZScpIH0gYXMgYW55KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBTZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGV4cGlyZVRpbWVCeVNlY29uZCA9IHRoaXMuQ0FDSEVfRVhQSVJFX1RJTUVfREVGQVVMVCk6IGJvb2xlYW4ge1xuICAgIC8vIHN1cHBvcnQgY2hvIG5o4buvbmcgZmlsZSBraMO0bmcgaW5qZWN0IFV0aWxzQ2FjaGVcbiAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSBleHBpcmVUaW1lQnlTZWNvbmQgPT09IHRoaXMuQ0FDSEVfRVhQSVJFX05PTkUgPyB0aGlzLkNBQ0hFX0VYUElSRV9OT05FIDogbmV3IERhdGUoKS52YWx1ZU9mKCkgLyAxMDAwICsgZXhwaXJlVGltZUJ5U2Vjb25kO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBleHBpcmU6IGN1cnJlbnRNaWxsaXNlY29uZCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBlbmNyeXB0KEpTT04uc3RyaW5naWZ5KGRhdGEpKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS50cmFjZShgU2V0IGtleSAke2tleX0gRXJyb3JgLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhc3luYyBDbGVhckFzeW5jKGtleTogc3RyaW5nLCBpc01ENSA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0U3RvcmUoKTtcblxuICAgICAgaWYgKCFvYmplY3RTdG9yZSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmRlbGV0ZShpc01ENSA/IGtleSA6IG1kNShrZXkpKTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoeyBjbGVhclN1Y2Nlc3M6IHRydWUgfSBhcyBhbnkpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc29sZS50cmFjZSgnRXJyb3IgZGVsZXRpbmcgS2V5OicsIGdldCgoZXZlbnQudGFyZ2V0IGFzIElEQlJlcXVlc3QpLmVycm9yLCAnbWVzc2FnZScpKTtcbiAgICAgICAgcmVzb2x2ZSh7IG1lc3NhZ2VFcnJvcjogZ2V0KChldmVudC50YXJnZXQgYXMgSURCUmVxdWVzdCkuZXJyb3IsICdtZXNzYWdlJyksIGNsZWFyU3VjY2VzczogZmFsc2UgfSBhcyBhbnkpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBDbGVhcihrZXk6IHN0cmluZykge1xuICAgIGlmIChrZXkuaW5jbHVkZXMoJ2tjLWNhbGxiYWNrLScpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuTG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgQ2xlYXJBbGxBc3luYygpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RTdG9yZSgpO1xuXG4gICAgICBpZiAoIW9iamVjdFN0b3JlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZS5jbGVhcigpO1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdjbGVhciBhbGwgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIHJlc29sdmUoeyBjbGVhclN1Y2Nlc3M6IHRydWUgfSBhcyBhbnkpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdFcnJvciBkZWxldGluZyBrZXk6JywgZ2V0KChldmVudC50YXJnZXQgYXMgSURCUmVxdWVzdCkuZXJyb3IsICdtZXNzYWdlJykpO1xuICAgICAgICByZXNvbHZlKHsgbWVzc2FnZUVycm9yOiBnZXQoKGV2ZW50LnRhcmdldCBhcyBJREJSZXF1ZXN0KS5lcnJvciwgJ21lc3NhZ2UnKSwgY2xlYXJTdWNjZXNzOiBmYWxzZSB9IGFzIGFueSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIENsZWFyQWxsKCkge1xuICAgIGlmIChpc0VtYmVkRnJhbWUoKSkge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgdHlwZTogdGhpcy50eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2UsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgaWRFdmVudDogdGhpcy5pZFNlcnZpY2UsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgVXRpbHNDb21tdW5pY2F0ZU1pY3JvLlBvc3RNZXNzYWdlVG9QYXJlbnQoZGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBbLi4udGhpcy5saXN0S2V5S2VlcFdoZW5DbGVhckFMbGxdO1xuICAgIE9iamVjdC5rZXlzKHRoaXMuTG9jYWxTdG9yYWdlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ2tjLWNhbGxiYWNrLScpKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RvcmVzID0gdGhpcy5HZXREYXRhQnlLZXlzKEFycmF5LmZyb20oa2V5cykpO1xuXG4gICAgdGhpcy5Mb2NhbFN0b3JhZ2UuY2xlYXIoKTtcblxuICAgIHRoaXMuU2V0RGF0YUJ5S2V5KHN0b3Jlcyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBHZXREYXRhQnlLZXlzKGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBjb25zdCBzdG9yZXMgPSBuZXcgTWFwKCk7XG5cbiAgICBrZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKCdrYy1jYWxsYmFjay0nKSkge1xuICAgICAgICBzdG9yZXMuc2V0KGtleSwgdGhpcy5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdG9yZXMuc2V0KGtleSwgdGhpcy5HZXQoa2V5KSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RvcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgU2V0RGF0YUJ5S2V5KHN0b3JlczogTWFwPHN0cmluZywgYW55Pikge1xuICAgIHN0b3Jlcy5mb3JFYWNoKCh2YWx1ZTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGtleS5pbmNsdWRlcygna2MtY2FsbGJhY2stJykpIHtcbiAgICAgICAgdGhpcy5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSB0aGlzLmxhbmd1YWdlS2V5Q2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGFuZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLlNldChrZXksIHZhbHVlLCB0aGlzLkNBQ0hFX0VYUElSRV9OT05FKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRGVsZXRlS2V5U3RhcnRXaXRoQXN5bmMoa2V5Q2FjaGVTdGFydFdpdGg6IHN0cmluZywgaXNLZXlNRDUgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSBhd2FpdCB0aGlzLmdldE9iamVjdFN0b3JlKCk7XG5cbiAgICAgIGlmICghb2JqZWN0U3RvcmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgfVxuXG4gICAgICAvLyBM4bqleSB04bqldCBj4bqjIGPDoWMga2V5cyB04burIGluZGV4XG4gICAgICBjb25zdCByZXF1ZXN0ID0gb2JqZWN0U3RvcmUuZ2V0QWxsKCk7XG5cbiAgICAgIGtleUNhY2hlU3RhcnRXaXRoID0gaXNLZXlNRDUgPyBrZXlDYWNoZVN0YXJ0V2l0aCA6IG1kNShrZXlDYWNoZVN0YXJ0V2l0aCk7XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gZS50YXJnZXQucmVzdWx0IGFzIEFycmF5PGFueT47XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS5mb3JFYWNoKChvYmopID0+IHtcbiAgICAgICAgICBpZiAob2JqW3RoaXMuaXRlbUluZGV4QnlLZXldLnN0YXJ0c1dpdGgoa2V5Q2FjaGVTdGFydFdpdGgpKSB7XG4gICAgICAgICAgICB0aGlzLkNsZWFyQXN5bmMob2JqW3RoaXMuaXRlbUluZGV4QnlLZXldLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXNvbHZlKHt9KTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRGVsZXRlS2V5U3RhcnRXaXRoKGtleUNhY2hlOiBzdHJpbmcsIGlzTUQ1ID0gZmFsc2UpIHtcbiAgICBrZXlDYWNoZSA9IGlzTUQ1ID8gbWQ1KGtleUNhY2hlKSA6IGtleUNhY2hlO1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLkxvY2FsU3RvcmFnZSk7XG5cbiAgICBpZiAoIWtleXMgfHwgIWtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChrZXlDYWNoZSkpIHtcbiAgICAgICAgdGhpcy5DbGVhcihrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBEZWxldGVEYXRhYmFzZUluZGV4REIoZGJOYW1lPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBkYk5hbWUgPSAoZGJOYW1lIHx8IHRoaXMuZGJOYW1lKSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKGRiTmFtZSBhcyBzdHJpbmcpO1xuXG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS50cmFjZSgnRGF0YWJhc2UgZGVsZXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgcmVzb2x2ZSh7IGRlbGV0ZVN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gKGV2ZW50LnRhcmdldCBhcyBJREJSZXF1ZXN0KS5lcnJvcjtcbiAgICAgICAgY29uc29sZS50cmFjZSgnRXJyb3IgZGVsZXRpbmcgZGF0YWJhc2U6JywgZXJyb3IpO1xuICAgICAgICByZXNvbHZlKHsgbWVzc2FnZUVycm9yOiBnZXQoKGVycm9yIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pIHx8IHt9LCAnbWVzc2FnZScpLCBkZWxldGVTdWNjZXNzOiBmYWxzZSB9IGFzIGFueSk7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uYmxvY2tlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS50cmFjZSgnRGVsZXRlIHJlcXVlc3QgaXMgYmxvY2tlZCcpO1xuICAgICAgICByZXNvbHZlKHsgbWVzc2FnZUVycm9yOiAnRGVsZXRlIHJlcXVlc3QgaXMgYmxvY2tlZCcsIGRlbGV0ZVN1Y2Nlc3M6IGZhbHNlIH0gYXMgYW55KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
460
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEM7QUFDOUMsdURBQXVEO0FBR3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUNkLE1BQU0sQ0FBVSx5QkFBeUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ25ELE1BQU0sQ0FBVSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2QyxNQUFNLENBQVUsU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQ25DLE1BQU0sQ0FBQyx3QkFBd0IsR0FBRyxtQ0FBbUMsQ0FBQztJQUVyRSxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUM7SUFDbkQsTUFBTSxDQUFDLHdCQUF3QixHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ2xELE1BQU0sQ0FBQyxVQUFVLENBQVc7SUFDNUIsTUFBTSxDQUFDLE9BQU8sQ0FBNkI7SUFDM0MsTUFBTSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUM7SUFDaEMsTUFBTSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDOUIsTUFBTSxDQUFD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QUEwQixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFFLEtBQTZCLElBQUksRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQVMsQ0FBQyxDQUFDO1lBQy9HLENBQUMsQ0FBQztZQUVGLE9BQU8sQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFO2dCQUN2QixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7Z0JBQzNDLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSwyQkFBMkIsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFTLENBQUMsQ0FBQztZQUN0RixDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmltcG9ydCB7IElFdmVudCwgVFlQRV9MQU5HVUFHRV9TVVBQT1JUIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBVdGlsc0NvbW11bmljYXRlTWljcm8gfSBmcm9tICcuL2NvbW11bmljYXRlLW1pY3JvJztcbmltcG9ydCB7IGRlY3J5cHQsIGVuY3J5cHQsIG1kNSB9IGZyb20gJy4vY3J5cHRvJztcbmltcG9ydCB7IGdldERldmljZUluZm8gfSBmcm9tICcuL2RvbSc7XG5pbXBvcnQgeyBpc0VtYmVkRnJhbWUgfSBmcm9tICcuL2Z1bmN0aW9uLWNoZWNrLWVtYmVkLWZyYW1lJztcbmltcG9ydCB7IGdldCwgaXNOaWwgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgVXRpbHNMYW5ndWFnZUNvbnN0YW50cyB9IGZyb20gJy4vbGFuZ3VhZ2UnO1xuaW1wb3J0IHsgdXVpZCB9IGZyb20gJy4vdXVpZCc7XG5cbi8qKlxuICogVGnhu4duIMOtY2ggcXXhuqNuIGzDvSBDYWNoZSwgaOG7lyB0cuG7oyBj4bqjIExvY2FsU3RvcmFnZSAoxJHhu5NuZyBi4buZKSB2w6AgSW5kZXhlZERCIChi4bqldCDEkeG7k25nIGLhu5kpXG4gKiBU4buxIMSR4buZbmcgbcOjIGjDs2EgZOG7ryBsaeG7h3UgdsOgIHjhu60gbMO9IHRo4budaSBnaWFuIGjhur90IGjhuqFuXG4gKi9cbmV4cG9ydCBjbGFzcyBVdGlsc0NhY2hlIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDQUNIRV9FWFBJUkVfVElNRV9ERUZBVUxUID0gNSAqIDYwO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENBQ0hFX0VYUElSRV9OT05FID0gLTE7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRTZXJ2aWNlID0gdXVpZCgpO1xuICBwdWJsaWMgc3RhdGljIHR5cGVLZXlDbGVhckxvY2FsU3RvcmFnZSA9ICdMSUJTX1VJX0NMRUFSX0xPQ0FMX1NUT1JBR0VfRVZFTlQnO1xuXG4gIHByaXZhdGUgc3RhdGljIGxhbmd1YWdlS2V5Q2FjaGUgPSAnU1IzeFFLeEhnZmZpQ2V2UFFScmFsZyc7XG4gIHByaXZhdGUgc3RhdGljIGxpc3RLZXlLZWVwV2hlbkNsZWFyQUxsbCA9IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5pdGRFdmVudD86IGJvb2xlYW47XG4gIHByaXZhdGUgc3RhdGljIHN0b3JhZ2U6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xuICBwcml2YXRlIHN0YXRpYyBkYk5hbWUgPSAnbGlicy11aS1jYWNoZSc7XG4gIHByaXZhdGUgc3RhdGljIGl0ZW1JbmRleEJ5S2V5ID0gJ2tleSc7XG4gIHByaXZhdGUgc3RhdGljIGRiVmVyc2lvbiA9IDE7XG4gIHByaXZhdGUgc3RhdGljIGRiOiBJREJEYXRhYmFzZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBLaOG7n2kgdOG6oW8gY+G6pXUgaMOsbmggY2hvIENhY2hlXG4gICAqIEBwYXJhbSBjb25maWcgQ+G6pXUgaMOsbmgga2jhu59pIHThuqFvICh0w6puIERCLCBrZXkgbmfDtG4gbmfhu68sIGV2ZW50IGNsZWFyLi4uKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpbml0KGNvbmZpZzogeyBpbmRleGVkREJOYW1lPzogc3RyaW5nOyBsYW5ndWFnZUtleUNhY2hlPzogc3RyaW5nOyB0eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2U/OiBzdHJpbmc7IGxpc3RLZXlLZWVwV2hlbkNsZWFyQWxsPzogQXJyYXk8c3RyaW5nPiB9KSB7XG4gICAgaWYgKHRoaXMuaW5pdGRFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluaXRkRXZlbnQgPSB0cnVlO1xuICAgIGlmIChjb25maWcuaW5kZXhlZERCTmFtZSkge1xuICAgICAgdGhpcy5kYk5hbWUgPSBjb25maWcuaW5kZXhlZERCTmFtZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy50eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHRoaXMudHlwZUtleUNsZWFyTG9jYWxTdG9yYWdlID0gY29uZmlnLnR5cGVLZXlDbGVhckxvY2FsU3RvcmFnZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5saXN0S2V5S2VlcFdoZW5DbGVhckFsbCkge1xuICAgICAgdGhpcy5saXN0S2V5S2VlcFdoZW5DbGVhckFMbGwgPSBjb25maWcubGlzdEtleUtlZXBXaGVuQ2xlYXJBbGw7XG4gICAgfVxuICAgIGlmIChjb25maWcubGFuZ3VhZ2VLZXlDYWNoZSkge1xuICAgICAgdGhpcy5sYW5ndWFnZUtleUNhY2hlID0gY29uZmlnLmxhbmd1YWdlS2V5Q2FjaGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEzGsHUgbmfDtG4gbmfhu68gaGnhu4duIHThuqFpIHbDoG8gY2FjaGVcbiAgICogQHBhcmFtIGxhbmcgTcOjIG5nw7RuIG5n4buvICh2aSwgZW4sIC4uLilcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0TGFuZyhsYW5nOiBUWVBFX0xBTkdVQUdFX1NVUFBPUlQpIHtcbiAgICBpZiAoIVV0aWxzTGFuZ3VhZ2VDb25zdGFudHMuaXNTdXBwb3J0ZWQobGFuZykpIHtcbiAgICAgIHRocm93IEVycm9yKGBMYW5ndWFnZSBub3Qgc3VwcG9ydCAke2xhbmd9YCk7XG4gICAgfVxuICAgIHRoaXMuU2V0KHRoaXMubGFuZ3VhZ2VLZXlDYWNoZSwgbGFuZywgdGhpcy5DQUNIRV9FWFBJUkVfTk9ORSk7XG4gIH1cblxuICAvKipcbiAgICogTOG6pXkgbmfDtG4gbmfhu68gdOG7qyBjYWNoZVxuICAgKiBAcmV0dXJucyBNw6MgbmfDtG4gbmfhu69cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0TGFuZygpOiBUWVBFX0xBTkdVQUdFX1NVUFBPUlQge1xuICAgIHJldHVybiB0aGlzLkdldCh0aGlzLmxhbmd1YWdlS2V5Q2FjaGUsIFV0aWxzTGFuZ3VhZ2VDb25zdGFudHMuZGVmYXVsdExhbmcoKSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBvcGVuREIoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsIHRoaXMuZGJWZXJzaW9uKTtcblxuICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZXZlbnQ6IElEQlZlcnNpb25DaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkYiA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xuXG4gICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh0aGlzLmRiTmFtZSkpIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMuZGJOYW1lLCB7IGtleVBhdGg6IHRoaXMuaXRlbUluZGV4QnlLZXkgfSk7XG5cbiAgICAgICAgICBvYmplY3RTdG9yZS5jcmVhdGVJbmRleCh0aGlzLml0ZW1JbmRleEJ5S2V5LCB0aGlzLml0ZW1JbmRleEJ5S2V5LCB7IHVuaXF1ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGIgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdFcnJvciBvcGVuaW5nIEluZGV4ZWREQjonLCBldmVudCk7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzeW5jIGdldE9iamVjdFN0b3JlKCkge1xuICAgIGlmICghdGhpcy5kYikge1xuICAgICAgYXdhaXQgdGhpcy5vcGVuREIoKTtcbiAgICB9XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRiPy50cmFuc2FjdGlvbihbdGhpcy5kYk5hbWVdLCAncmVhZHdyaXRlJyk7XG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuZGJOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldCBMb2NhbFN0b3JhZ2UoKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAoZ2V0RGV2aWNlSW5mbygpLnNhdGlzZmllcyh7IHNhZmFyaTogJz49MTYnIH0pKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxTdG9yYWdlRmFrZU9uU2FmYXJpKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5nZXRMb2NhbFN0b3JhZ2VGYWtlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUudHJhY2UoYExvY2FsU3RvcmFnZSBgLCBlcnJvcik7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMb2NhbFN0b3JhZ2VGYWtlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TG9jYWxTdG9yYWdlRmFrZU9uU2FmYXJpKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIXRoaXMuc3RvcmFnZSAmJiBPYmplY3Qua2V5cyhsb2NhbFN0b3JhZ2UpLmxlbmd0aCkge1xuICAgICAgdGhpcy5zdG9yYWdlID0geyAuLi5sb2NhbFN0b3JhZ2UgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2V0SXRlbTogKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICB0aGlzLnN0b3JhZ2Vba2V5XSA9IHZhbHVlO1xuICAgICAgfSxcbiAgICAgIGdldEl0ZW06IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0b3JhZ2UgfHwgaXNOaWwodGhpcy5zdG9yYWdlW2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHRoaXMuc3RvcmFnZVtrZXldIGFzIHN0cmluZyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZT8uW2tleV07XG4gICAgICB9LFxuICAgICAgcmVtb3ZlSXRlbTogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2U/LltrZXldO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgfSxcbiAgICAgIGNsZWFyOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmFnZSA9IHt9O1xuICAgICAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldExvY2FsU3RvcmFnZUZha2UoKSB7XG4gICAgaWYgKCF0aGlzLnN0b3JhZ2UpIHtcbiAgICAgIHRoaXMuc3RvcmFnZSA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXRJdGVtOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRoaXMuc3RvcmFnZVtrZXldID0gdmFsdWU7XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbTogKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2U/LltrZXldO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUl0ZW06IChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zdG9yYWdlPy5ba2V5XTtcbiAgICAgIH0sXG4gICAgICBjbGVhcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3JhZ2UgPSB7fTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBM4bqleSBnacOhIHRy4buLIHThu6sgSW5kZXhlZERCIHRoZW8ga2V5IChi4bqldCDEkeG7k25nIGLhu5kpXG4gICAqIEBwYXJhbSBrZXkgS2jDs2EgY2FjaGVcbiAgICogQHBhcmFtIGRlZmF1bHRfdmFsdWUgR2nDoSB0cuG7iyBt4bq3YyDEkeG7i25oIG7hur91IGtow7RuZyB0w6xtIHRo4bqleVxuICAgKiBAcGFyYW0gaXNLZXlNRDUgTuG6v3UgdHJ1ZSwga2V5IMSRw6MgbMOgIE1ENS4gTuG6v3UgZmFsc2UgKG3hurdjIMSR4buLbmgpLCBz4bq9IHThu7EgxJHhu5luZyBNRDUga2V5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIGNo4bupYSBnacOhIHRy4buLIMSRw6MgZ2nhuqNpIG3Do1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBHZXRBc3luYzxUID0gYW55PihrZXk6IHN0cmluZywgZGVmYXVsdF92YWx1ZT86IGFueSwgaXNLZXlNRDUgPSBmYWxzZSk6IFByb21pc2U8VD4ge1xuICAgIGtleSA9IGlzS2V5TUQ1ID8ga2V5IDogbWQ1KGtleSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RTdG9yZSgpO1xuXG4gICAgICBpZiAoIW9iamVjdFN0b3JlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKGRlZmF1bHRfdmFsdWUpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVxdWVzdCA9IG9iamVjdFN0b3JlLmdldChrZXkpO1xuXG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0LnJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKGRlZmF1bHRfdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGRlY3J5cHQocmVxdWVzdC5yZXN1bHQudmFsdWUpKTtcblxuICAgICAgICBpZiAoZGF0YS5leHBpcmUgPT09IHRoaXMuQ0FDSEVfRVhQSVJFX05PTkUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhLmpzb24pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNaWxsaXNlY29uZCA9IG5ldyBEYXRlKCkudmFsdWVPZigpIC8gMTAwMDtcblxuICAgICAgICBpZiAoZGF0YS5leHBpcmUgPCBjdXJyZW50TWlsbGlzZWNvbmQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWZhdWx0X3ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNvbHZlKGRhdGEuanNvbik7XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UoYEdldCBrZXkgJHtrZXl9IEVycm9yLCByZXR1cm4gZGVmYXVsdCB2YWx1ZTogJHtkZWZhdWx0X3ZhbHVlfWApO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShkZWZhdWx0X3ZhbHVlKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTOG6pXkgZ2nDoSB0cuG7iyB04burIExvY2FsU3RvcmFnZSB0aGVvIGtleSAoxJHhu5NuZyBi4buZKVxuICAgKiBAcGFyYW0ga2V5IEtow7NhIGNhY2hlXG4gICAqIEBwYXJhbSBkZWZhdWx0X3ZhbHVlIEdpw6EgdHLhu4sgbeG6t2MgxJHhu4tuaCBu4bq/dSBraMO0bmcgdMOsbSB0aOG6pXlcbiAgICogQHJldHVybnMgR2nDoSB0cuG7iyDEkcOjIGdp4bqjaSBtw6MgaG/hurdjIGdpw6EgdHLhu4sgbeG6t2MgxJHhu4tuaFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBHZXQ8VCA9IGFueT4oa2V5OiBzdHJpbmcsIGRlZmF1bHRfdmFsdWU/OiBhbnkpOiBUIHtcbiAgICAvLyBzdXBwb3J0IGNobyBuaOG7r25nIGZpbGUga2jDtG5nIHRo4buDIGluamVjdCBVdGlsc0NhY2hlXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLkdldERlZmF1bHRWYWx1ZUJ5U3BlY2lmaWNLZXkoa2V5LCBkZWZhdWx0X3ZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGVkRGF0YSA9IHRoaXMuTG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcblxuICAgIGlmICghY2FjaGVkRGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuR2V0RGVmYXVsdFZhbHVlQnlTcGVjaWZpY0tleShrZXksIGRlZmF1bHRfdmFsdWUpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZGVjcnlwdChjYWNoZWREYXRhKSk7XG5cbiAgICAgIGlmIChkYXRhLmV4cGlyZSA9PT0gdGhpcy5DQUNIRV9FWFBJUkVfTk9ORSkge1xuICAgICAgICByZXR1cm4gZGF0YS52YWx1ZSA/PyBkZWZhdWx0X3ZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudE1pbGxpc2Vjb25kID0gbmV3IERhdGUoKS52YWx1ZU9mKCkgLyAxMDAwO1xuXG4gICAgICBpZiAoZGF0YS5leHBpcmUgPCBjdXJyZW50TWlsbGlzZWNvbmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuR2V0RGVmYXVsdFZhbHVlQnlTcGVjaWZpY0tleShrZXksIGRlZmF1bHRfdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YS52YWx1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS50cmFjZShgR2V0IGtleSAke2tleX0gRXJyb3IsIHJldHVybiBkZWZhdWx0IHZhbHVlOiAke2RlZmF1bHRfdmFsdWV9YCwgZXJyb3IpO1xuXG4gICAgICByZXR1cm4gdGhpcy5HZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleSwgZGVmYXVsdF92YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBHZXREZWZhdWx0VmFsdWVCeVNwZWNpZmljS2V5KGtleTogc3RyaW5nLCBkZWZhdWx0X3ZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMxrB1IGdpw6EgdHLhu4sgdsOgbyBJbmRleGVkREIgKGLhuqV0IMSR4buTbmcgYuG7mSlcbiAgICogQHBhcmFtIGtleSBLaMOzYSBjYWNoZVxuICAgKiBAcGFyYW0gdmFsdWUgR2nDoSB0cuG7iyBj4bqnbiBsxrB1XG4gICAqIEBwYXJhbSBleHBpcmVUaW1lQnlTZWNvbmQgVGjhu51pIGdpYW4gaOG6v3QgaOG6oW4gKGdpw6J5KS4gTeG6t2MgxJHhu4tuaCA1IHBow7p0LiBEw7luZyBDQUNIRV9FWFBJUkVfTk9ORSDEkeG7gyB2xKluaCB2aeG7hW4uXG4gICAqIEBwYXJhbSBpc0tleU1ENSBO4bq/dSB0cnVlLCBrZXkgxJHDoyBsw6AgTUQ1LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIGNo4bupYSB0aMO0bmcgdGluIGvhur90IHF14bqjXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIFNldEFzeW5jPFQgPSBhbnk+KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBleHBpcmVUaW1lQnlTZWNvbmQgPSB0aGlzLkNBQ0hFX0VYUElSRV9USU1FX0RFRkFVTFQsIGlzS2V5TUQ1ID0gZmFsc2UpOiBQcm9taXNlPFQ+IHtcbiAgICAvLyBzdXBwb3J0IGluamVjdCBVdGlsc0NhY2hlXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0U3RvcmUoKTtcblxuICAgICAga2V5ID0gaXNLZXlNRDUgPyBrZXkgOiBtZDUoa2V5KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNaWxsaXNlY29uZCA9IGV4cGlyZVRpbWVCeVNlY29uZCA9PT0gdGhpcy5DQUNIRV9FWFBJUkVfTk9ORSA/IHRoaXMuQ0FDSEVfRVhQSVJFX05PTkUgOiBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAvIDEwMDAgKyBleHBpcmVUaW1lQnlTZWNvbmQ7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHtcbiAgICAgICAgICB2YWx1ZTogZW5jcnlwdChKU09OLnN0cmluZ2lmeSh7IGpzb246IHZhbHVlLCBleHBpcmU6IGN1cnJlbnRNaWxsaXNlY29uZCB9KSksXG4gICAgICAgIH07XG4gICAgICAgIGRhdGFbdGhpcy5pdGVtSW5kZXhCeUtleV0gPSBrZXk7XG5cbiAgICAgICAgaWYgKCFvYmplY3RTdG9yZSkge1xuICAgICAgICAgIGNvbnNvbGUudHJhY2UoYENhbiBub3Qgb3BlbiBvYmplY3Qgc3RvcmVgKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IGtleSwgbWVzc2FnZUVycm9yOiAnQ2FuIG5vdCBvcGVuIG9iamVjdCBzdG9yZScgfSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZT8ucHV0KGRhdGEpO1xuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgU2V0IGtleSAke2tleX0gU3VjY2Vzc2ApO1xuICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXN1bHQgYXMgYW55KTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLnRyYWNlKGBTZXQga2V5ICR7a2V5fSBFcnJvcmApO1xuICAgICAgICAgIHJlc29sdmUoeyBrZXksIG1lc3NhZ2VFcnJvcjogZ2V0KGVycm9yIGFzIElFdmVudCwgJ21lc3NhZ2UnKSB9IGFzIGFueSk7XG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKGBTZXQga2V5ICR7a2V5fSBFcnJvcmApO1xuICAgICAgICByZXNvbHZlKHsga2V5LCBtZXNzYWdlRXJyb3I6IGdldChlcnJvciwgJ21lc3NhZ2UnKSB9IGFzIGFueSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTMawdSBnacOhIHRy4buLIHbDoG8gTG9jYWxTdG9yYWdlICjEkeG7k25nIGLhu5kpXG4gICAqIEBwYXJhbSBrZXkgS2jDs2EgY2FjaGVcbiAgICogQHBhcmFtIHZhbHVlIEdpw6EgdHLhu4sgY+G6p24gbMawdVxuICAgKiBAcGFyYW0gZXhwaXJlVGltZUJ5U2Vjb25kIFRo4budaSBnaWFuIGjhur90IGjhuqFuIChnacOieSkuIE3hurdjIMSR4buLbmggNSBwaMO6dC5cbiAgICogQHJldHVybnMgdHJ1ZSBu4bq/dSB0aMOgbmggY8O0bmdcbiAgICovXG4gIHN0YXRpYyBTZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGV4cGlyZVRpbWVCeVNlY29uZCA9IHRoaXMuQ0FDSEVfRVhQSVJFX1RJTUVfREVGQVVMVCk6IGJvb2xlYW4ge1xuICAgIC8vIHN1cHBvcnQgY2hvIG5o4buvbmcgZmlsZSBraMO0bmcgaW5qZWN0IFV0aWxzQ2FjaGVcbiAgICBjb25zdCBjdXJyZW50TWlsbGlzZWNvbmQgPSBleHBpcmVUaW1lQnlTZWNvbmQgPT09IHRoaXMuQ0FDSEVfRVhQSVJFX05PTkUgPyB0aGlzLkNBQ0hFX0VYUElSRV9OT05FIDogbmV3IERhdGUoKS52YWx1ZU9mKCkgLyAxMDAwICsgZXhwaXJlVGltZUJ5U2Vjb25kO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBleHBpcmU6IGN1cnJlbnRNaWxsaXNlY29uZCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBlbmNyeXB0KEpTT04uc3RyaW5naWZ5KGRhdGEpKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS50cmFjZShgU2V0IGtleSAke2tleX0gRXJyb3JgLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFjDs2EgbeG7mXQga2V5IHRyb25nIEluZGV4ZWREQlxuICAgKiBAcGFyYW0ga2V5IEtow7NhIGPhuqduIHjDs2FcbiAgICogQHBhcmFtIGlzTUQ1IE7hur91IHRydWUsIGtleSDEkcOjIMSRxrDhu6NjIE1ENS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgQ2xlYXJBc3luYyhrZXk6IHN0cmluZywgaXNNRDUgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3Qgb2JqZWN0U3RvcmUgPSBhd2FpdCB0aGlzLmdldE9iamVjdFN0b3JlKCk7XG5cbiAgICAgIGlmICghb2JqZWN0U3RvcmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZS5kZWxldGUoaXNNRDUgPyBrZXkgOiBtZDUoa2V5KSk7XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHsgY2xlYXJTdWNjZXNzOiB0cnVlIH0gYXMgYW55KTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UoJ0Vycm9yIGRlbGV0aW5nIEtleTonLCBnZXQoKGV2ZW50LnRhcmdldCBhcyBJREJSZXF1ZXN0KS5lcnJvciwgJ21lc3NhZ2UnKSk7XG4gICAgICAgIHJlc29sdmUoeyBtZXNzYWdlRXJyb3I6IGdldCgoZXZlbnQudGFyZ2V0IGFzIElEQlJlcXVlc3QpLmVycm9yLCAnbWVzc2FnZScpLCBjbGVhclN1Y2Nlc3M6IGZhbHNlIH0gYXMgYW55KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogWMOzYSBt4buZdCBrZXkgdHJvbmcgTG9jYWxTdG9yYWdlXG4gICAqIEBwYXJhbSBrZXkgS2jDs2EgY+G6p24geMOzYVxuICAgKi9cbiAgc3RhdGljIENsZWFyKGtleTogc3RyaW5nKSB7XG4gICAgaWYgKGtleS5pbmNsdWRlcygna2MtY2FsbGJhY2stJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5Mb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFjDs2EgdG/DoG4gYuG7mSBk4buvIGxp4buHdSB0cm9uZyBJbmRleGVkREJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgQ2xlYXJBbGxBc3luYygpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG9iamVjdFN0b3JlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RTdG9yZSgpO1xuXG4gICAgICBpZiAoIW9iamVjdFN0b3JlKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZS5jbGVhcigpO1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdjbGVhciBhbGwgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIHJlc29sdmUoeyBjbGVhclN1Y2Nlc3M6IHRydWUgfSBhcyBhbnkpO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdFcnJvciBkZWxldGluZyBrZXk6JywgZ2V0KChldmVudC50YXJnZXQgYXMgSURCUmVxdWVzdCkuZXJyb3IsICdtZXNzYWdlJykpO1xuICAgICAgICByZXNvbHZlKHsgbWVzc2FnZUVycm9yOiBnZXQoKGV2ZW50LnRhcmdldCBhcyBJREJSZXF1ZXN0KS5lcnJvciwgJ21lc3NhZ2UnKSwgY2xlYXJTdWNjZXNzOiBmYWxzZSB9IGFzIGFueSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFjDs2EgdG/DoG4gYuG7mSBk4buvIGxp4buHdSB0cm9uZyBMb2NhbFN0b3JhZ2UgKGtp4buDbSBzb8OhdCBjw6FjIGtleSDEkeG6t2MgYmnhu4d0KVxuICAgKi9cbiAgc3RhdGljIENsZWFyQWxsKCkge1xuICAgIGlmIChpc0VtYmVkRnJhbWUoKSkge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgdHlwZTogdGhpcy50eXBlS2V5Q2xlYXJMb2NhbFN0b3JhZ2UsXG4gICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgaWRFdmVudDogdGhpcy5pZFNlcnZpY2UsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgVXRpbHNDb21tdW5pY2F0ZU1pY3JvLlBvc3RNZXNzYWdlVG9QYXJlbnQoZGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSBbLi4udGhpcy5saXN0S2V5S2VlcFdoZW5DbGVhckFMbGxdO1xuICAgIE9iamVjdC5rZXlzKHRoaXMuTG9jYWxTdG9yYWdlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkuaW5jbHVkZXMoJ2tjLWNhbGxiYWNrLScpKSB7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RvcmVzID0gdGhpcy5HZXREYXRhQnlLZXlzKEFycmF5LmZyb20oa2V5cykpO1xuXG4gICAgdGhpcy5Mb2NhbFN0b3JhZ2UuY2xlYXIoKTtcblxuICAgIHRoaXMuU2V0RGF0YUJ5S2V5KHN0b3Jlcyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBHZXREYXRhQnlLZXlzKGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBjb25zdCBzdG9yZXMgPSBuZXcgTWFwKCk7XG5cbiAgICBrZXlzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKCdrYy1jYWxsYmFjay0nKSkge1xuICAgICAgICBzdG9yZXMuc2V0KGtleSwgdGhpcy5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdG9yZXMuc2V0KGtleSwgdGhpcy5HZXQoa2V5KSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RvcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgU2V0RGF0YUJ5S2V5KHN0b3JlczogTWFwPHN0cmluZywgYW55Pikge1xuICAgIHN0b3Jlcy5mb3JFYWNoKCh2YWx1ZTogYW55LCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGtleS5pbmNsdWRlcygna2MtY2FsbGJhY2stJykpIHtcbiAgICAgICAgdGhpcy5Mb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSB0aGlzLmxhbmd1YWdlS2V5Q2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGFuZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLlNldChrZXksIHZhbHVlLCB0aGlzLkNBQ0hFX0VYUElSRV9OT05FKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBYw7NhIHThuqV0IGPhuqMgY8OhYyBraMOzYSBi4bqvdCDEkeG6p3UgYuG6sW5nIHRp4buBbiB04buRIG5o4bqldCDEkeG7i25oIHRyb25nIEluZGV4ZWREQlxuICAgKiBAcGFyYW0ga2V5Q2FjaGVTdGFydFdpdGggVGnhu4FuIHThu5Ega2jDs2FcbiAgICogQHBhcmFtIGlzS2V5TUQ1IE7hur91IHRydWUsIHRp4buBbiB04buRIMSRw6MgxJHGsOG7o2MgTUQ1LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBEZWxldGVLZXlTdGFydFdpdGhBc3luYyhrZXlDYWNoZVN0YXJ0V2l0aDogc3RyaW5nLCBpc0tleU1ENSA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBvYmplY3RTdG9yZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0U3RvcmUoKTtcblxuICAgICAgaWYgKCFvYmplY3RTdG9yZSkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEzhuqV5IHThuqV0IGPhuqMgY8OhYyBrZXlzIHThu6sgaW5kZXhcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBvYmplY3RTdG9yZS5nZXRBbGwoKTtcblxuICAgICAga2V5Q2FjaGVTdGFydFdpdGggPSBpc0tleU1ENSA/IGtleUNhY2hlU3RhcnRXaXRoIDogbWQ1KGtleUNhY2hlU3RhcnRXaXRoKTtcblxuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBlLnRhcmdldC5yZXN1bHQgYXMgQXJyYXk8YW55PjtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLmZvckVhY2goKG9iaikgPT4ge1xuICAgICAgICAgIGlmIChvYmpbdGhpcy5pdGVtSW5kZXhCeUtleV0uc3RhcnRzV2l0aChrZXlDYWNoZVN0YXJ0V2l0aCkpIHtcbiAgICAgICAgICAgIHRoaXMuQ2xlYXJBc3luYyhvYmpbdGhpcy5pdGVtSW5kZXhCeUtleV0sIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7fSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFjDs2EgdOG6pXQgY+G6oyBjw6FjIGtow7NhIGLhuq90IMSR4bqndSBi4bqxbmcgdGnhu4FuIHThu5EgbmjhuqV0IMSR4buLbmggdHJvbmcgTG9jYWxTdG9yYWdlXG4gICAqIEBwYXJhbSBrZXlDYWNoZSBUaeG7gW4gdOG7kSBraMOzYVxuICAgKiBAcGFyYW0gaXNNRDUgTuG6v3UgdHJ1ZSwgdGnhu4FuIHThu5Egc+G6vSDEkcaw4bujYyBNRDUgdHLGsOG7m2Mga2hpIHNvIHPDoW5oLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBEZWxldGVLZXlTdGFydFdpdGgoa2V5Q2FjaGU6IHN0cmluZywgaXNNRDUgPSBmYWxzZSkge1xuICAgIGtleUNhY2hlID0gaXNNRDUgPyBtZDUoa2V5Q2FjaGUpIDoga2V5Q2FjaGU7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuTG9jYWxTdG9yYWdlKTtcblxuICAgIGlmICgha2V5cyB8fCAha2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGtleUNhY2hlKSkge1xuICAgICAgICB0aGlzLkNsZWFyKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogWMOzYSBob8OgbiB0b8OgbiBjxqEgc+G7nyBk4buvIGxp4buHdSBJbmRleGVkREJcbiAgICogQHBhcmFtIGRiTmFtZSBUw6puIERCLCBt4bq3YyDEkeG7i25oIHRoZW8gY+G6pXUgaMOsbmguXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIERlbGV0ZURhdGFiYXNlSW5kZXhEQihkYk5hbWU/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGRiTmFtZSA9IChkYk5hbWUgfHwgdGhpcy5kYk5hbWUpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoZGJOYW1lIGFzIHN0cmluZyk7XG5cbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdEYXRhYmFzZSBkZWxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICByZXNvbHZlKHsgZGVsZXRlU3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoZXZlbnQudGFyZ2V0IGFzIElEQlJlcXVlc3QpLmVycm9yO1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdFcnJvciBkZWxldGluZyBkYXRhYmFzZTonLCBlcnJvcik7XG4gICAgICAgIHJlc29sdmUoeyBtZXNzYWdlRXJyb3I6IGdldCgoZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgYW55PikgfHwge30sICdtZXNzYWdlJyksIGRlbGV0ZVN1Y2Nlc3M6IGZhbHNlIH0gYXMgYW55KTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25ibG9ja2VkID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLnRyYWNlKCdEZWxldGUgcmVxdWVzdCBpcyBibG9ja2VkJyk7XG4gICAgICAgIHJlc29sdmUoeyBtZXNzYWdlRXJyb3I6ICdEZWxldGUgcmVxdWVzdCBpcyBibG9ja2VkJywgZGVsZXRlU3VjY2VzczogZmFsc2UgfSBhcyBhbnkpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
package/esm2022/collection.mjs
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thêm tất cả phần tử trong mảng vào một Set
|
|
3
|
+
* @param setStore Đối tượng Set mục tiêu
|
|
4
|
+
* @param data Mảng các phần tử cần thêm
|
|
5
|
+
* @returns Set sau khi đã thêm dữ liệu
|
|
6
|
+
*/
|
|
1
7
|
export const addArrayToSet = (setStore, data) => {
|
|
2
8
|
for (const value of data) {
|
|
3
9
|
setStore.add(value);
|
|
4
10
|
}
|
|
5
11
|
return setStore;
|
|
6
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* Chuyển đổi Set sang Array, có hỗ trợ mapping function
|
|
15
|
+
* @param data Đối tượng Set cần chuyển đổi
|
|
16
|
+
* @param functionMap Hàm mapping tùy chọn để biến đổi từng phần tử
|
|
17
|
+
* @returns Mảng kết quả
|
|
18
|
+
*/
|
|
7
19
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
20
|
export const convertSetToArray = (data, functionMap) => {
|
|
9
21
|
if (functionMap) {
|
|
@@ -11,4 +23,4 @@ export const convertSetToArray = (data, functionMap) => {
|
|
|
11
23
|
}
|
|
12
24
|
return [...data];
|
|
13
25
|
};
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL2NvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBSSxRQUFnQixFQUFFLElBQVMsRUFBVSxFQUFFO0lBQ3RFLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBbUIsSUFBWSxFQUFFLFdBQTZCLEVBQVksRUFBRTtJQUMzRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBd0IsQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRow6ptIHThuqV0IGPhuqMgcGjhuqduIHThu60gdHJvbmcgbeG6o25nIHbDoG8gbeG7mXQgU2V0XG4gKiBAcGFyYW0gc2V0U3RvcmUgxJDhu5FpIHTGsOG7o25nIFNldCBt4bulYyB0acOqdVxuICogQHBhcmFtIGRhdGEgTeG6o25nIGPDoWMgcGjhuqduIHThu60gY+G6p24gdGjDqm1cbiAqIEByZXR1cm5zIFNldCBzYXUga2hpIMSRw6MgdGjDqm0gZOG7ryBsaeG7h3VcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEFycmF5VG9TZXQgPSA8VD4oc2V0U3RvcmU6IFNldDxUPiwgZGF0YTogVFtdKTogU2V0PFQ+ID0+IHtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBkYXRhKSB7XG4gICAgc2V0U3RvcmUuYWRkKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gc2V0U3RvcmU7XG59O1xuXG4vKipcbiAqIENodXnhu4NuIMSR4buVaSBTZXQgc2FuZyBBcnJheSwgY8OzIGjhu5cgdHLhu6MgbWFwcGluZyBmdW5jdGlvblxuICogQHBhcmFtIGRhdGEgxJDhu5FpIHTGsOG7o25nIFNldCBj4bqnbiBjaHV54buDbiDEkeG7lWlcbiAqIEBwYXJhbSBmdW5jdGlvbk1hcCBIw6BtIG1hcHBpbmcgdMO5eSBjaOG7jW4gxJHhu4MgYmnhur9uIMSR4buVaSB04burbmcgcGjhuqduIHThu61cbiAqIEByZXR1cm5zIE3huqNuZyBr4bq/dCBxdeG6o1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTZXRUb0FycmF5ID0gPFQgPSBhbnksIFUgPSBhbnk+KGRhdGE6IFNldDxUPiwgZnVuY3Rpb25NYXA/OiAodmFsdWU6IFQpID0+IFUpOiBBcnJheTxVPiA9PiB7XG4gIGlmIChmdW5jdGlvbk1hcCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGRhdGEsIGZ1bmN0aW9uTWFwKTtcbiAgfVxuXG4gIHJldHVybiBbLi4uZGF0YV0gYXMgdW5rbm93biBhcyBBcnJheTxVPjtcbn07XG4iXX0=
|
package/esm2022/color.mjs
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
const step = 20;
|
|
2
2
|
const percent = 0.05;
|
|
3
|
+
/**
|
|
4
|
+
* Lấy cụ thể một shade hoặc tint của màu dựa trên bước (step)
|
|
5
|
+
* @param color Mã màu HEX (3 hoặc 6 ký tự)
|
|
6
|
+
* @param stepNumber Bước màu cần lấy (5, 10, 15... 100)
|
|
7
|
+
* @returns Đối tượng chứa thông tin bước màu và mã HEX light/dark
|
|
8
|
+
*/
|
|
3
9
|
export const colorStepContrastFromOrigin = (color, stepNumber) => {
|
|
4
10
|
return colorContrastFromOrigin(color).find((item) => item.step === stepNumber);
|
|
5
11
|
};
|
|
12
|
+
/**
|
|
13
|
+
* Tạo ra danh sách các sắc độ (shades & tints) từ một màu gốc
|
|
14
|
+
* @param color Mã màu HEX
|
|
15
|
+
* @returns Mảng các đối tượng chứa step, label, light hex và dark hex
|
|
16
|
+
*/
|
|
6
17
|
export const colorContrastFromOrigin = (color) => {
|
|
7
18
|
const parsedColorsArray = parseColorValues(color);
|
|
8
19
|
const colors = [];
|
|
@@ -55,6 +66,11 @@ const rgbShade = (rgb, i) => {
|
|
|
55
66
|
const rgbTint = (rgb, i) => {
|
|
56
67
|
return { red: rgb.red + (255 - rgb.red) * i * percent, green: rgb.green + (255 - rgb.green) * i * percent, blue: rgb.blue + (255 - rgb.blue) * i * percent };
|
|
57
68
|
};
|
|
69
|
+
/**
|
|
70
|
+
* Chuyển đổi đối tượng RGB sang mã HEX (không có dấu #)
|
|
71
|
+
* @param rgb Đối tượng chứa red, green, blue
|
|
72
|
+
* @returns Chuỗi HEX 6 ký tự
|
|
73
|
+
*/
|
|
58
74
|
export const rgbToHex = (rgb) => {
|
|
59
75
|
return intToHex(rgb.red) + intToHex(rgb.green) + intToHex(rgb.blue);
|
|
60
76
|
};
|
|
@@ -71,6 +87,9 @@ const pad = (number, length) => {
|
|
|
71
87
|
}
|
|
72
88
|
return str;
|
|
73
89
|
};
|
|
90
|
+
/**
|
|
91
|
+
* Danh sách các mã màu định nghĩa sẵn để sử dụng trong getColorById
|
|
92
|
+
*/
|
|
74
93
|
export const listColorDefine = [
|
|
75
94
|
'#E62222',
|
|
76
95
|
'#B81B1B',
|
|
@@ -118,6 +137,12 @@ export const listColorDefine = [
|
|
|
118
137
|
'#1A1A1A',
|
|
119
138
|
'#4D4D4D',
|
|
120
139
|
];
|
|
140
|
+
/**
|
|
141
|
+
* Lấy một màu định nghĩa sẵn dựa trên chuỗi đầu vào (như ID người dùng, tên...)
|
|
142
|
+
* Màu trả về là duy nhất và cố định cho cùng một chuỗi đầu vào.
|
|
143
|
+
* @param str Chuỗi để hash lấy màu
|
|
144
|
+
* @returns Mã màu HEX từ listColorDefine
|
|
145
|
+
*/
|
|
121
146
|
export const getColorById = (str) => {
|
|
122
147
|
let hashString = 0;
|
|
123
148
|
if (!str) {
|
|
@@ -130,6 +155,12 @@ export const getColorById = (str) => {
|
|
|
130
155
|
}
|
|
131
156
|
return listColorDefine[Math.abs(hashString) % listColorDefine.length];
|
|
132
157
|
};
|
|
158
|
+
/**
|
|
159
|
+
* Loại bỏ các thuộc tính màu sắc (color, background...) "gần trắng" khỏi chuỗi style CSS
|
|
160
|
+
* Giúp tránh việc hiển thị chữ trắng trên nền trắng khi merge style lung tung.
|
|
161
|
+
* @param style Chuỗi style CSS (ví dụ: "color: #fff; font-size: 14px;")
|
|
162
|
+
* @returns Chuỗi style đã được làm sạch
|
|
163
|
+
*/
|
|
133
164
|
export const detectAndCleanNearWhiteColors = (style) => {
|
|
134
165
|
if (!style)
|
|
135
166
|
return style;
|
|
@@ -156,6 +187,12 @@ export const detectAndCleanNearWhiteColors = (style) => {
|
|
|
156
187
|
.map(([k, v]) => `${k}: ${v}`)
|
|
157
188
|
.join('; ');
|
|
158
189
|
};
|
|
190
|
+
/**
|
|
191
|
+
* Kiểm tra một màu có phải là "gần trắng" hay không
|
|
192
|
+
* Dựa trên luminance > 0.95 và saturation < 0.1
|
|
193
|
+
* @param color Mã màu (HEX, RGB, RGBA hoặc tên màu CSS)
|
|
194
|
+
* @returns true nếu màu gần trắng
|
|
195
|
+
*/
|
|
159
196
|
export const isNearWhite = (color) => {
|
|
160
197
|
if (!color)
|
|
161
198
|
return false;
|
|
@@ -202,4 +239,4 @@ export const isNearWhite = (color) => {
|
|
|
202
239
|
// 2. và rất ít màu (saturation < 0.1)
|
|
203
240
|
return luminance > 0.95 && saturation < 0.1;
|
|
204
241
|
};
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9jb2xvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBRXJCLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQUMsS0FBYSxFQUFFLFVBQWtCLEVBQUUsRUFBRTtJQUMvRSxPQUFPLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQztBQUNqRixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEtBQWEsRUFBbUMsRUFBRTtJQUN4RixNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xELE1BQU0sTUFBTSxHQUFRLEVBQUUsQ0FBQztJQUN2QixJQUFJLGdCQUFnQixHQUFrQixFQUFFLENBQUM7SUFDekMsSUFBSSxlQUFlLEdBQWtCLEVBQUUsQ0FBQztJQUV4QyxJQUFJLGlCQUFpQixLQUFLLElBQUksRUFBRSxDQUFDO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsRCxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxlQUFlLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FB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QyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztBQUMvSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFRLEVBQUUsRUFBRTtJQUNuQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RFLENBQUMsQ0FBQztBQUNGLE1BQU0sUUFBUSxHQUFHLENBQUMsVUFBZSxFQUFFLEVBQUU7SUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbkosQ0FBQyxDQUFDO0FBQ0YsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFXLEVBQUUsRUFBRTtJQUMvQixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENB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VUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3JHLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXZCLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUV0QiwyQkFBMkI7SUFDM0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUUvRCwrQkFBK0I7SUFDL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3BDLE1BQU0sVUFBVSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBRXJELDhCQUE4QjtJQUM5QixpQ0FBaUM7SUFDakMsc0NBQXNDO0lBQ3RDLE9BQU8sU0FBUyxHQUFHLElBQUksSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBQzlDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbG9yQ29udHJhc3RGcm9tT3JpZ2luIHtcbiAgc3RlcDogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xuICBsaWdodDogc3RyaW5nO1xuICBkYXJrOiBzdHJpbmc7XG59XG5cbmNvbnN0IHN0ZXAgPSAyMDtcbmNvbnN0IHBlcmNlbnQgPSAwLjA1O1xuXG5leHBvcnQgY29uc3QgY29sb3JTdGVwQ29udHJhc3RGcm9tT3JpZ2luID0gKGNvbG9yOiBzdHJpbmcsIHN0ZXBOdW1iZXI6IG51bWJlcikgPT4ge1xuICByZXR1cm4gY29sb3JDb250cmFzdEZyb21PcmlnaW4oY29sb3IpLmZpbmQoKGl0ZW0pID0+IGl0ZW0uc3RlcCA9PT0gc3RlcE51bWJlcik7XG59O1xuXG5leHBvcnQgY29uc3QgY29sb3JDb250cmFzdEZyb21PcmlnaW4gPSAoY29sb3I6IHN0cmluZyk6IEFycmF5PElDb2xvckNvbnRyYXN0RnJvbU9yaWdpbj4gPT4ge1xuICBjb25zdCBwYXJzZWRDb2xvcnNBcnJheSA9IHBhcnNlQ29sb3JWYWx1ZXMoY29sb3IpO1xuICBjb25zdCBjb2xvcnM6IGFueSA9IFtdO1xuICBsZXQgY2FsY3VsYXRlZFNoYWRlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBsZXQgY2FsY3VsYXRlZFRpbnRzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgaWYgKHBhcnNlZENvbG9yc0FycmF5ICE9PSBudWxsKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJzZWRDb2xvcnNBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgY2FsY3VsYXRlZFNoYWRlcyA9IGNhbGN1bGF0ZVNoYWRlcyhwYXJzZWRDb2xvcnNBcnJheVtpXSk7XG4gICAgICBjYWxjdWxhdGVkVGludHMgPSBjYWxjdWxhdGVUaW50cyhwYXJzZWRDb2xvcnNBcnJheVtpXSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc3RlcDsgaSsrKSB7XG4gICAgICBjb2xvcnMucHVzaCh7IHN0ZXA6IGkgKiA1LCBsYWJlbDogYCR7aSAqIDV9JWAsIGRhcms6IGAjJHtjYWxjdWxhdGVkU2hhZGVzW2ldfWAsIGxpZ2h0OiBgIyR7Y2FsY3VsYXRlZFRpbnRzW2ldfWAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbG9ycztcbn07XG5cbmNvbnN0IHBhcnNlQ29sb3JWYWx1ZXMgPSAoY29sb3JWYWx1ZXM6IGFueSkgPT4ge1xuICBsZXQgY29sb3JWYWx1ZXNBcnJheSA9IGNvbG9yVmFsdWVzLm1hdGNoKC9cXGJbMC05QS1GYS1mXXszfVxcYnxbMC05QS1GYS1mXXs2fVxcYi9nKTtcblxuICBpZiAoY29sb3JWYWx1ZXNBcnJheSkge1xuICAgIGNvbG9yVmFsdWVzQXJyYXkgPSBjb2xvclZhbHVlc0FycmF5Lm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICBpZiAoaXRlbS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgbGV0IG5ld0l0ZW0gPSBpdGVtLnRvU3RyaW5nKCkuc3BsaXQoJycpO1xuXG4gICAgICAgIG5ld0l0ZW0gPSBuZXdJdGVtLnJlZHVjZSgoYWNjOiBhbnksIGl0OiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gYWNjICsgaXQgKyBpdDtcbiAgICAgICAgfSwgJycpO1xuXG4gICAgICAgIHJldHVybiBuZXdJdGVtO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb2xvclZhbHVlc0FycmF5O1xufTtcblxuY29uc3QgY2FsY3VsYXRlU2hhZGVzID0gKGNvbG9yVmFsdWU6IGFueSkgPT4ge1xuICByZXR1cm4gY2FsY3VsYXRlKGNvbG9yVmFsdWUsIHJnYlNoYWRlKS5jb25jYXQoJzAwMDAwMCcpO1xufTtcblxuY29uc3QgY2FsY3VsYXRlVGludHMgPSAoY29sb3JWYWx1ZTogYW55KSA9PiB7XG4gIHJldHVybiBjYWxjdWxhdGUoY29sb3JWYWx1ZSwgcmdiVGludCkuY29uY2F0KCdmZmZmZmYnKTtcbn07XG5cbmNvbnN0IGNhbGN1bGF0ZSA9IChjb2xvclZhbHVlOiBhbnksIHNoYWRlT3JUaW50OiBhbnkpID0+IHtcbiAgY29uc3QgY29sb3IgPSBoZXhUb1JHQihjb2xvclZhbHVlKTtcbiAgY29uc3Qgc2hhZGVWYWx1ZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXA7IGkrKykge1xuICAgIHNoYWRlVmFsdWVzW2ldID0gcmdiVG9IZXgoc2hhZGVPclRpbnQoY29sb3IsIGkpKTtcbiAgfVxuXG4gIHJldHVybiBzaGFkZVZhbHVlcztcbn07XG5cbmNvbnN0IHJnYlNoYWRlID0gKHJnYjogYW55LCBpOiBhbnkpID0+IHtcbiAgcmV0dXJuIHsgcmVkOiByZ2IucmVkICogKDEgLSBwZXJjZW50ICogaSksIGdyZWVuOiByZ2IuZ3JlZW4gKiAoMSAtIHBlcmNlbnQgKiBpKSwgYmx1ZTogcmdiLmJsdWUgKiAoMSAtIHBlcmNlbnQgKiBpKSB9O1xufTtcbmNvbnN0IHJnYlRpbnQgPSAocmdiOiBhbnksIGk6IGFueSkgPT4ge1xuICByZXR1cm4geyByZWQ6IHJnYi5yZWQgKyAoMjU1IC0gcmdiLnJlZCkgKiBpICogcGVyY2VudCwgZ3JlZW46IHJnYi5ncmVlbiArICgyNTUgLSByZ2IuZ3JlZW4pICogaSAqIHBlcmNlbnQsIGJsdWU6IHJnYi5ibHVlICsgKDI1NSAtIHJnYi5ibHVlKSAqIGkgKiBwZXJjZW50IH07XG59O1xuXG5leHBvcnQgY29uc3QgcmdiVG9IZXggPSAocmdiOiBhbnkpID0+IHtcbiAgcmV0dXJuIGludFRvSGV4KHJnYi5yZWQpICsgaW50VG9IZXgocmdiLmdyZWVuKSArIGludFRvSGV4KHJnYi5ibHVlKTtcbn07XG5jb25zdCBoZXhUb1JHQiA9IChjb2xvclZhbHVlOiBhbnkpID0+IHtcbiAgcmV0dXJuIHsgcmVkOiBwYXJzZUludChjb2xvclZhbHVlLnN1YnN0cigwLCAyKSwgMTYpLCBncmVlbjogcGFyc2VJbnQoY29sb3JWYWx1ZS5zdWJzdHIoMiwgMiksIDE2KSwgYmx1ZTogcGFyc2VJbnQoY29sb3JWYWx1ZS5zdWJzdHIoNCwgMiksIDE2KSB9O1xufTtcbmNvbnN0IGludFRvSGV4ID0gKHJnYmludDogYW55KSA9PiB7XG4gIHJldHVybiBwYWQoTWF0aC5taW4oTWF0aC5tYXgoTWF0aC5yb3VuZChyZ2JpbnQpLCAwKSwgMjU1KS50b1N0cmluZygxNiksIDIpO1xufTtcblxuY29uc3QgcGFkID0gKG51bWJlcjogYW55LCBsZW5ndGg6IGFueSkgPT4ge1xuICBsZXQgc3RyID0gJycgKyBudW1iZXI7XG5cbiAgd2hpbGUgKHN0ci5sZW5ndGggPCBsZW5ndGgpIHtcbiAgICBzdHIgPSAnMCcgKyBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufTtcblxuZXhwb3J0IGNvbnN0IGxpc3RDb2xvckRlZmluZTogQXJyYXk8c3RyaW5nPiA9IFtcbiAgJyNFNjIyMjInLFxuICAnI0I4MUIxQicsXG4gICcjRUI0RTRFJyxcbiAgJyNGOTczMTYnLFxuICAnI0M3NUMxMicsXG4gICcjRkE4RjQ1JyxcbiAgJyNGRkI3MDAnLFxuICAnI0NDOTIwMCcsXG4gICcjRkZDNTMzJyxcbiAgJyM4NENDMTYnLFxuICAnIzZBQTMxMicsXG4gICcjOWRkNjQ1JyxcbiAgJyMwMEJDNjInLFxuICAnIzAwQTc1NycsXG4gICcjMzNEQThBJyxcbiAgJyMwNkI2RDQnLFxuICAnIzFCNTlDNCcsXG4gICcjNEU4Q0Y3JyxcbiAgJyMwRUE1RTknLFxuICAnIzFCNTlDNCcsXG4gICcjNEU4Q0Y3JyxcbiAgJyMyMjZGRjUnLFxuICAnIzFCNTlDNCcsXG4gICcjNEU4Q0Y3JyxcbiAgJyM2MzY2RjEnLFxuICAnIzRGNTJDMScsXG4gICcjODI4NUY0JyxcbiAgJyM1QjA0QjMnLFxuICAnIzQ5MDM4RicsXG4gICcjN0MzNkMyJyxcbiAgJyNEOTQ2RUYnLFxuICAnI0FFMzhCRicsXG4gICcjRTE2QkYyJyxcbiAgJyNFQzQ4OTknLFxuICAnI0JEM0E3QScsXG4gICcjRjA2REFEJyxcbiAgJyNGNDNGNUUnLFxuICAnI0MzMzI0QicsXG4gICcjRjY2NTdFJyxcbiAgJyM3NTczODAnLFxuICAnIzVFNUM2NicsXG4gICcjOTE4Rjk5JyxcbiAgJyMyMDIwMjAnLFxuICAnIzFBMUExQScsXG4gICcjNEQ0RDREJyxcbl07XG5cbmV4cG9ydCBjb25zdCBnZXRDb2xvckJ5SWQgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgaGFzaFN0cmluZyA9IDA7XG5cbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBoYXNoU3RyaW5nID0gKGhhc2hTdHJpbmcgPDwgNSkgLSBoYXNoU3RyaW5nICsgY2hhcjtcbiAgICBoYXNoU3RyaW5nID0gaGFzaFN0cmluZyAmIGhhc2hTdHJpbmc7XG4gIH1cblxuICByZXR1cm4gbGlzdENvbG9yRGVmaW5lW01hdGguYWJzKGhhc2hTdHJpbmcpICUgbGlzdENvbG9yRGVmaW5lLmxlbmd0aF07XG59O1xuXG5leHBvcnQgY29uc3QgZGV0ZWN0QW5kQ2xlYW5OZWFyV2hpdGVDb2xvcnMgPSAoc3R5bGU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghc3R5bGUpIHJldHVybiBzdHlsZTtcblxuICBjb25zdCBzdHlsZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBydWxlcyA9IHN0eWxlXG4gICAgLnNwbGl0KCc7JylcbiAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGNvbnN0IFtrZXlSYXcsIHZhbHVlUmF3XSA9IHJ1bGUuc3BsaXQoJzonKS5tYXAoKHMpID0+IHMudHJpbSgpKTtcbiAgICBpZiAoIWtleVJhdyB8fCAhdmFsdWVSYXcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGtleSA9IGtleVJhdy50b0xvd2VyQ2FzZSgpO1xuICAgIHN0eWxlTWFwW2tleV0gPSB2YWx1ZVJhdztcbiAgfVxuXG4gIGNvbnN0IGNvbG9yS2V5cyA9IFsnY29sb3InLCAnYmFja2dyb3VuZCcsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2JvcmRlci1jb2xvciddO1xuICBmb3IgKGNvbnN0IGtleSBvZiBjb2xvcktleXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0eWxlTWFwW2tleV07XG4gICAgaWYgKHZhbHVlICYmIGlzTmVhcldoaXRlKHZhbHVlKSkge1xuICAgICAgZGVsZXRlIHN0eWxlTWFwW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHN0eWxlTWFwKVxuICAgIC5tYXAoKFtrLCB2XSkgPT4gYCR7a306ICR7dn1gKVxuICAgIC5qb2luKCc7ICcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzTmVhcldoaXRlID0gKGNvbG9yOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKCFjb2xvcikgcmV0dXJuIGZhbHNlO1xuICBjb2xvciA9IGNvbG9yLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIENodXnhu4NuIEhFWCwgUkdCIGhv4bq3YyB0w6puIG3DoHUgc2FuZyByLGcsYlxuICBjb25zdCBwYXJzZUNvbG9yID0gKGlucHV0OiBzdHJpbmcpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudWxsID0+IHtcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICBsZXQgaGV4ID0gaW5wdXQuc2xpY2UoMSk7XG4gICAgICBpZiAoaGV4Lmxlbmd0aCA9PT0gMylcbiAgICAgICAgaGV4ID0gaGV4XG4gICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgIC5tYXAoKGMpID0+IGMgKyBjKVxuICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc2xpY2UoMCwgMiksIDE2KTtcbiAgICAgIGNvbnN0IGcgPSBwYXJzZUludChoZXguc2xpY2UoMiwgNCksIDE2KTtcbiAgICAgIGNvbnN0IGIgPSBwYXJzZUludChoZXguc2xpY2UoNCwgNiksIDE2KTtcbiAgICAgIHJldHVybiBbciwgZywgYl07XG4gICAgfVxuXG4gICAgY29uc3QgcmdiTWF0Y2ggPSBpbnB1dC5tYXRjaCgvcmdiYT9cXHMqXFwoKFteKV0rKVxcKS8pO1xuICAgIGlmIChyZ2JNYXRjaCkge1xuICAgICAgY29uc3QgW3IsIGcsIGJdID0gcmdiTWF0Y2hbMV1cbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLnNsaWNlKDAsIDMpXG4gICAgICAgIC5tYXAoKHYpID0+IHBhcnNlRmxvYXQodi50cmltKCkpKTtcbiAgICAgIHJldHVybiBbciwgZywgYl07XG4gICAgfVxuXG4gICAgY29uc3Qgd2hpdGVOYW1lcyA9IFsnd2hpdGUnLCAnc25vdycsICdpdm9yeScsICdnaG9zdHdoaXRlJywgJ2Zsb3JhbHdoaXRlJywgJ3NlYXNoZWxsJywgJ3doaXRlc21va2UnXTtcbiAgICBpZiAod2hpdGVOYW1lcy5pbmNsdWRlcyhpbnB1dCkpIHJldHVybiBbMjU1LCAyNTUsIDI1NV07XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgY29uc3QgcmdiID0gcGFyc2VDb2xvcihjb2xvcik7XG4gIGlmICghcmdiKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgW3IsIGcsIGJdID0gcmdiO1xuXG4gIC8vIFTDrW5oIGx1bWluYW5jZSAoxJHhu5kgc8OhbmcpXG4gIGNvbnN0IGx1bWluYW5jZSA9ICgwLjIxMjYgKiByICsgMC43MTUyICogZyArIDAuMDcyMiAqIGIpIC8gMjU1O1xuXG4gIC8vIFTDrW5oIHNhdHVyYXRpb24gKMSR4buZIGLDo28gaMOyYSlcbiAgY29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYikgLyAyNTU7XG4gIGNvbnN0IG1pbiA9IE1hdGgubWluKHIsIGcsIGIpIC8gMjU1O1xuICBjb25zdCBzYXR1cmF0aW9uID0gbWF4ID09PSAwID8gMCA6IChtYXggLSBtaW4pIC8gbWF4O1xuXG4gIC8vIENo4buJIGNvaSBsw6AgXCJn4bqnbiB0cuG6r25nXCIgbuG6v3U6XG4gIC8vIDEuIHLhuqV0IHPDoW5nIChsdW1pbmFuY2UgPiAwLjk1KVxuICAvLyAyLiB2w6AgcuG6pXQgw610IG3DoHUgKHNhdHVyYXRpb24gPCAwLjEpXG4gIHJldHVybiBsdW1pbmFuY2UgPiAwLjk1ICYmIHNhdHVyYXRpb24gPCAwLjE7XG59O1xuIl19
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9jb2xvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDaEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBRXJCOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxFQUFFO0lBQy9FLE9BQU8sdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQ2pGLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEtBQWEsRUFBbUMsRUFBRTtJQUN4RixNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xELE1BQU0sTUFBTSxHQUFvQyxFQUFFLENBQUM7SUFDbkQsSUFBSSxnQkFBZ0IsR0FBa0IsRUFBRSxDQUFDO0lBQ3pDLElBQUksZUFBZSxHQUFrQixFQUFFLENBQUM7SUFFeEMsSUFBSSxpQkFBaUIsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEQsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekQsZUFBZSxHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUks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T0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFDL0osQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQVEsRUFBRSxFQUFFO0lBQ25DLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxVQUFlLEVBQUUsRUFBRTtJQUNuQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNuSixDQUFDLENBQUM7QUFFRixNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQVcsRUFBRSxFQUFFO0lBQy9CLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxD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QUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgaW50ZXJmYWNlIElDb2xvckNvbnRyYXN0RnJvbU9yaWdpbiB7XG4gIHN0ZXA6IG51bWJlcjtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGlnaHQ6IHN0cmluZztcbiAgZGFyazogc3RyaW5nO1xufVxuXG5jb25zdCBzdGVwID0gMjA7XG5jb25zdCBwZXJjZW50ID0gMC4wNTtcblxuLyoqXG4gKiBM4bqleSBj4bulIHRo4buDIG3hu5l0IHNoYWRlIGhv4bq3YyB0aW50IGPhu6dhIG3DoHUgZOG7sWEgdHLDqm4gYsaw4bubYyAoc3RlcClcbiAqIEBwYXJhbSBjb2xvciBNw6MgbcOgdSBIRVggKDMgaG/hurdjIDYga8O9IHThu7EpXG4gKiBAcGFyYW0gc3RlcE51bWJlciBCxrDhu5tjIG3DoHUgY+G6p24gbOG6pXkgKDUsIDEwLCAxNS4uLiAxMDApXG4gKiBAcmV0dXJucyDEkOG7kWkgdMaw4bujbmcgY2jhu6lhIHRow7RuZyB0aW4gYsaw4bubYyBtw6B1IHbDoCBtw6MgSEVYIGxpZ2h0L2RhcmtcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yU3RlcENvbnRyYXN0RnJvbU9yaWdpbiA9IChjb2xvcjogc3RyaW5nLCBzdGVwTnVtYmVyOiBudW1iZXIpID0+IHtcbiAgcmV0dXJuIGNvbG9yQ29udHJhc3RGcm9tT3JpZ2luKGNvbG9yKS5maW5kKChpdGVtKSA9PiBpdGVtLnN0ZXAgPT09IHN0ZXBOdW1iZXIpO1xufTtcblxuLyoqXG4gKiBU4bqhbyByYSBkYW5oIHPDoWNoIGPDoWMgc+G6r2MgxJHhu5kgKHNoYWRlcyAmIHRpbnRzKSB04burIG3hu5l0IG3DoHUgZ+G7kWNcbiAqIEBwYXJhbSBjb2xvciBNw6MgbcOgdSBIRVhcbiAqIEByZXR1cm5zIE3huqNuZyBjw6FjIMSR4buRaSB0xrDhu6NuZyBjaOG7qWEgc3RlcCwgbGFiZWwsIGxpZ2h0IGhleCB2w6AgZGFyayBoZXhcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yQ29udHJhc3RGcm9tT3JpZ2luID0gKGNvbG9yOiBzdHJpbmcpOiBBcnJheTxJQ29sb3JDb250cmFzdEZyb21PcmlnaW4+ID0+IHtcbiAgY29uc3QgcGFyc2VkQ29sb3JzQXJyYXkgPSBwYXJzZUNvbG9yVmFsdWVzKGNvbG9yKTtcbiAgY29uc3QgY29sb3JzOiBBcnJheTxJQ29sb3JDb250cmFzdEZyb21PcmlnaW4+ID0gW107XG4gIGxldCBjYWxjdWxhdGVkU2hhZGVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGxldCBjYWxjdWxhdGVkVGludHM6IEFycmF5PHN0cmluZz4gPSBbXTtcblxuICBpZiAocGFyc2VkQ29sb3JzQXJyYXkgIT09IG51bGwpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZENvbG9yc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjYWxjdWxhdGVkU2hhZGVzID0gY2FsY3VsYXRlU2hhZGVzKHBhcnNlZENvbG9yc0FycmF5W2ldKTtcbiAgICAgIGNhbGN1bGF0ZWRUaW50cyA9IGNhbGN1bGF0ZVRpbnRzKHBhcnNlZENvbG9yc0FycmF5W2ldKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwOyBpKyspIHtcbiAgICAgIGNvbG9ycy5wdXNoKHsgc3RlcDogaSAqIDUsIGxhYmVsOiBgJHtpICogNX0lYCwgZGFyazogYCMke2NhbGN1bGF0ZWRTaGFkZXNbaV19YCwgbGlnaHQ6IGAjJHtjYWxjdWxhdGVkVGludHNbaV19YCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29sb3JzO1xufTtcblxuY29uc3QgcGFyc2VDb2xvclZhbHVlcyA9IChjb2xvclZhbHVlczogYW55KSA9PiB7XG4gIGxldCBjb2xvclZhbHVlc0FycmF5ID0gY29sb3JWYWx1ZXMubWF0Y2goL1xcYlswLTlBLUZhLWZdezN9XFxifFswLTlBLUZhLWZdezZ9XFxiL2cpO1xuXG4gIGlmIChjb2xvclZhbHVlc0FycmF5KSB7XG4gICAgY29sb3JWYWx1ZXNBcnJheSA9IGNvbG9yVmFsdWVzQXJyYXkubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgIGlmIChpdGVtLmxlbmd0aCA9PT0gMykge1xuICAgICAgICBsZXQgbmV3SXRlbSA9IGl0ZW0udG9TdHJpbmcoKS5zcGxpdCgnJyk7XG5cbiAgICAgICAgbmV3SXRlbSA9IG5ld0l0ZW0ucmVkdWNlKChhY2M6IGFueSwgaXQ6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBhY2MgKyBpdCArIGl0O1xuICAgICAgICB9LCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIG5ld0l0ZW07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9yVmFsdWVzQXJyYXk7XG59O1xuXG5jb25zdCBjYWxjdWxhdGVTaGFkZXMgPSAoY29sb3JWYWx1ZTogYW55KSA9PiB7XG4gIHJldHVybiBjYWxjdWxhdGUoY29sb3JWYWx1ZSwgcmdiU2hhZGUpLmNvbmNhdCgnMDAwMDAwJyk7XG59O1xuXG5jb25zdCBjYWxjdWxhdGVUaW50cyA9IChjb2xvclZhbHVlOiBhbnkpID0+IHtcbiAgcmV0dXJuIGNhbGN1bGF0ZShjb2xvclZhbHVlLCByZ2JUaW50KS5jb25jYXQoJ2ZmZmZmZicpO1xufTtcblxuY29uc3QgY2FsY3VsYXRlID0gKGNvbG9yVmFsdWU6IGFueSwgc2hhZGVPclRpbnQ6IGFueSkgPT4ge1xuICBjb25zdCBjb2xvciA9IGhleFRvUkdCKGNvbG9yVmFsdWUpO1xuICBjb25zdCBzaGFkZVZhbHVlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcDsgaSsrKSB7XG4gICAgc2hhZGVWYWx1ZXNbaV0gPSByZ2JUb0hleChzaGFkZU9yVGludChjb2xvciwgaSkpO1xuICB9XG5cbiAgcmV0dXJuIHNoYWRlVmFsdWVzO1xufTtcblxuY29uc3QgcmdiU2hhZGUgPSAocmdiOiBhbnksIGk6IGFueSkgPT4ge1xuICByZXR1cm4geyByZWQ6IHJnYi5yZWQgKiAoMSAtIHBlcmNlbnQgKiBpKSwgZ3JlZW46IHJnYi5ncmVlbiAqICgxIC0gcGVyY2VudCAqIGkpLCBibHVlOiByZ2IuYmx1ZSAqICgxIC0gcGVyY2VudCAqIGkpIH07XG59O1xuXG5jb25zdCByZ2JUaW50ID0gKHJnYjogYW55LCBpOiBhbnkpID0+IHtcbiAgcmV0dXJuIHsgcmVkOiByZ2IucmVkICsgKDI1NSAtIHJnYi5yZWQpICogaSAqIHBlcmNlbnQsIGdyZWVuOiByZ2IuZ3JlZW4gKyAoMjU1IC0gcmdiLmdyZWVuKSAqIGkgKiBwZXJjZW50LCBibHVlOiByZ2IuYmx1ZSArICgyNTUgLSByZ2IuYmx1ZSkgKiBpICogcGVyY2VudCB9O1xufTtcblxuLyoqXG4gKiBDaHV54buDbiDEkeG7lWkgxJHhu5FpIHTGsOG7o25nIFJHQiBzYW5nIG3DoyBIRVggKGtow7RuZyBjw7MgZOG6pXUgIylcbiAqIEBwYXJhbSByZ2IgxJDhu5FpIHTGsOG7o25nIGNo4bupYSByZWQsIGdyZWVuLCBibHVlXG4gKiBAcmV0dXJucyBDaHXhu5dpIEhFWCA2IGvDvSB04buxXG4gKi9cbmV4cG9ydCBjb25zdCByZ2JUb0hleCA9IChyZ2I6IGFueSkgPT4ge1xuICByZXR1cm4gaW50VG9IZXgocmdiLnJlZCkgKyBpbnRUb0hleChyZ2IuZ3JlZW4pICsgaW50VG9IZXgocmdiLmJsdWUpO1xufTtcblxuY29uc3QgaGV4VG9SR0IgPSAoY29sb3JWYWx1ZTogYW55KSA9PiB7XG4gIHJldHVybiB7IHJlZDogcGFyc2VJbnQoY29sb3JWYWx1ZS5zdWJzdHIoMCwgMiksIDE2KSwgZ3JlZW46IHBhcnNlSW50KGNvbG9yVmFsdWUuc3Vic3RyKDIsIDIpLCAxNiksIGJsdWU6IHBhcnNlSW50KGNvbG9yVmFsdWUuc3Vic3RyKDQsIDIpLCAxNikgfTtcbn07XG5cbmNvbnN0IGludFRvSGV4ID0gKHJnYmludDogYW55KSA9PiB7XG4gIHJldHVybiBwYWQoTWF0aC5taW4oTWF0aC5tYXgoTWF0aC5yb3VuZChyZ2JpbnQpLCAwKSwgMjU1KS50b1N0cmluZygxNiksIDIpO1xufTtcblxuY29uc3QgcGFkID0gKG51bWJlcjogYW55LCBsZW5ndGg6IGFueSkgPT4ge1xuICBsZXQgc3RyID0gJycgKyBudW1iZXI7XG5cbiAgd2hpbGUgKHN0ci5sZW5ndGggPCBsZW5ndGgpIHtcbiAgICBzdHIgPSAnMCcgKyBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufTtcblxuLyoqXG4gKiBEYW5oIHPDoWNoIGPDoWMgbcOjIG3DoHUgxJHhu4tuaCBuZ2jEqWEgc+G6tW4gxJHhu4Mgc+G7rSBk4bulbmcgdHJvbmcgZ2V0Q29sb3JCeUlkXG4gKi9cbmV4cG9ydCBjb25zdCBsaXN0Q29sb3JEZWZpbmU6IEFycmF5PHN0cmluZz4gPSBbXG4gICcjRTYyMjIyJyxcbiAgJyNCODFCMUInLFxuICAnI0VCNEU0RScsXG4gICcjRjk3MzE2JyxcbiAgJyNDNzVDMTInLFxuICAnI0ZBOEY0NScsXG4gICcjRkZCNzAwJyxcbiAgJyNDQzkyMDAnLFxuICAnI0ZGQzUzMycsXG4gICcjODRDQzE2JyxcbiAgJyM2QUEzMTInLFxuICAnIzlkZDY0NScsXG4gICcjMDBCQzYyJyxcbiAgJyMwMEE3NTcnLFxuICAnIzMzREE4QScsXG4gICcjMDZCNkQ0JyxcbiAgJyMxQjU5QzQnLFxuICAnIzRFOENGNycsXG4gICcjMEVBNUU5JyxcbiAgJyMxQjU5QzQnLFxuICAnIzRFOENGNycsXG4gICcjMjI2RkY1JyxcbiAgJyMxQjU5QzQnLFxuICAnIzRFOENGNycsXG4gICcjNjM2NkYxJyxcbiAgJyM0RjUyQzEnLFxuICAnIzgyODVGNCcsXG4gICcjNUIwNEIzJyxcbiAgJyM0OTAzOEYnLFxuICAnIzdDMzZDMicsXG4gICcjRDk0NkVGJyxcbiAgJyNBRTM4QkYnLFxuICAnI0UxNkJGMicsXG4gICcjRUM0ODk5JyxcbiAgJyNCRDNBN0EnLFxuICAnI0YwNkRBRCcsXG4gICcjRjQzRjVFJyxcbiAgJyNDMzMyNEInLFxuICAnI0Y2NjU3RScsXG4gICcjNzU3MzgwJyxcbiAgJyM1RTVDNjYnLFxuICAnIzkxOEY5OScsXG4gICcjMjAyMDIwJyxcbiAgJyMxQTFBMUEnLFxuICAnIzRENEQ0RCcsXG5dO1xuXG4vKipcbiAqIEzhuqV5IG3hu5l0IG3DoHUgxJHhu4tuaCBuZ2jEqWEgc+G6tW4gZOG7sWEgdHLDqm4gY2h14buXaSDEkeG6p3UgdsOgbyAobmjGsCBJRCBuZ8aw4budaSBkw7luZywgdMOqbi4uLilcbiAqIE3DoHUgdHLhuqMgduG7gSBsw6AgZHV5IG5o4bqldCB2w6AgY+G7kSDEkeG7i25oIGNobyBjw7luZyBt4buZdCBjaHXhu5dpIMSR4bqndSB2w6BvLlxuICogQHBhcmFtIHN0ciBDaHXhu5dpIMSR4buDIGhhc2ggbOG6pXkgbcOgdVxuICogQHJldHVybnMgTcOjIG3DoHUgSEVYIHThu6sgbGlzdENvbG9yRGVmaW5lXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb2xvckJ5SWQgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgaGFzaFN0cmluZyA9IDA7XG5cbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBoYXNoU3RyaW5nID0gKGhhc2hTdHJpbmcgPDwgNSkgLSBoYXNoU3RyaW5nICsgY2hhcjtcbiAgICBoYXNoU3RyaW5nID0gaGFzaFN0cmluZyAmIGhhc2hTdHJpbmc7XG4gIH1cblxuICByZXR1cm4gbGlzdENvbG9yRGVmaW5lW01hdGguYWJzKGhhc2hTdHJpbmcpICUgbGlzdENvbG9yRGVmaW5lLmxlbmd0aF07XG59O1xuXG4vKipcbiAqIExv4bqhaSBi4buPIGPDoWMgdGh14buZYyB0w61uaCBtw6B1IHPhuq9jIChjb2xvciwgYmFja2dyb3VuZC4uLikgXCJn4bqnbiB0cuG6r25nXCIga2jhu49pIGNodeG7l2kgc3R5bGUgQ1NTXG4gKiBHacO6cCB0csOhbmggdmnhu4djIGhp4buDbiB0aOG7iyBjaOG7ryB0cuG6r25nIHRyw6puIG7hu4FuIHRy4bqvbmcga2hpIG1lcmdlIHN0eWxlIGx1bmcgdHVuZy5cbiAqIEBwYXJhbSBzdHlsZSBDaHXhu5dpIHN0eWxlIENTUyAodsOtIGThu6U6IFwiY29sb3I6ICNmZmY7IGZvbnQtc2l6ZTogMTRweDtcIilcbiAqIEByZXR1cm5zIENodeG7l2kgc3R5bGUgxJHDoyDEkcaw4bujYyBsw6BtIHPhuqFjaFxuICovXG5leHBvcnQgY29uc3QgZGV0ZWN0QW5kQ2xlYW5OZWFyV2hpdGVDb2xvcnMgPSAoc3R5bGU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghc3R5bGUpIHJldHVybiBzdHlsZTtcblxuICBjb25zdCBzdHlsZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBydWxlcyA9IHN0eWxlXG4gICAgLnNwbGl0KCc7JylcbiAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGNvbnN0IFtrZXlSYXcsIHZhbHVlUmF3XSA9IHJ1bGUuc3BsaXQoJzonKS5tYXAoKHMpID0+IHMudHJpbSgpKTtcbiAgICBpZiAoIWtleVJhdyB8fCAhdmFsdWVSYXcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGtleSA9IGtleVJhdy50b0xvd2VyQ2FzZSgpO1xuICAgIHN0eWxlTWFwW2tleV0gPSB2YWx1ZVJhdztcbiAgfVxuXG4gIGNvbnN0IGNvbG9yS2V5cyA9IFsnY29sb3InLCAnYmFja2dyb3VuZCcsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2JvcmRlci1jb2xvciddO1xuICBmb3IgKGNvbnN0IGtleSBvZiBjb2xvcktleXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0eWxlTWFwW2tleV07XG4gICAgaWYgKHZhbHVlICYmIGlzTmVhcldoaXRlKHZhbHVlKSkge1xuICAgICAgZGVsZXRlIHN0eWxlTWFwW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHN0eWxlTWFwKVxuICAgIC5tYXAoKFtrLCB2XSkgPT4gYCR7a306ICR7dn1gKVxuICAgIC5qb2luKCc7ICcpO1xufTtcblxuLyoqXG4gKiBLaeG7g20gdHJhIG3hu5l0IG3DoHUgY8OzIHBo4bqjaSBsw6AgXCJn4bqnbiB0cuG6r25nXCIgaGF5IGtow7RuZ1xuICogROG7sWEgdHLDqm4gbHVtaW5hbmNlID4gMC45NSB2w6Agc2F0dXJhdGlvbiA8IDAuMVxuICogQHBhcmFtIGNvbG9yIE3DoyBtw6B1IChIRVgsIFJHQiwgUkdCQSBob+G6t2MgdMOqbiBtw6B1IENTUylcbiAqIEByZXR1cm5zIHRydWUgbuG6v3UgbcOgdSBn4bqnbiB0cuG6r25nXG4gKi9cbmV4cG9ydCBjb25zdCBpc05lYXJXaGl0ZSA9IChjb2xvcjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGlmICghY29sb3IpIHJldHVybiBmYWxzZTtcbiAgY29sb3IgPSBjb2xvci50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDaHV54buDbiBIRVgsIFJHQiBob+G6t2MgdMOqbiBtw6B1IHNhbmcgcixnLGJcbiAgY29uc3QgcGFyc2VDb2xvciA9IChpbnB1dDogc3RyaW5nKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgbnVsbCA9PiB7XG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgbGV0IGhleCA9IGlucHV0LnNsaWNlKDEpO1xuICAgICAgaWYgKGhleC5sZW5ndGggPT09IDMpXG4gICAgICAgIGhleCA9IGhleFxuICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAubWFwKChjKSA9PiBjICsgYylcbiAgICAgICAgICAuam9pbignJyk7XG4gICAgICBjb25zdCByID0gcGFyc2VJbnQoaGV4LnNsaWNlKDAsIDIpLCAxNik7XG4gICAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnNsaWNlKDIsIDQpLCAxNik7XG4gICAgICBjb25zdCBiID0gcGFyc2VJbnQoaGV4LnNsaWNlKDQsIDYpLCAxNik7XG4gICAgICByZXR1cm4gW3IsIGcsIGJdO1xuICAgIH1cblxuICAgIGNvbnN0IHJnYk1hdGNoID0gaW5wdXQubWF0Y2goL3JnYmE/XFxzKlxcKChbXildKylcXCkvKTtcbiAgICBpZiAocmdiTWF0Y2gpIHtcbiAgICAgIGNvbnN0IFtyLCBnLCBiXSA9IHJnYk1hdGNoWzFdXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5zbGljZSgwLCAzKVxuICAgICAgICAubWFwKCh2KSA9PiBwYXJzZUZsb2F0KHYudHJpbSgpKSk7XG4gICAgICByZXR1cm4gW3IsIGcsIGJdO1xuICAgIH1cblxuICAgIGNvbnN0IHdoaXRlTmFtZXMgPSBbJ3doaXRlJywgJ3Nub3cnLCAnaXZvcnknLCAnZ2hvc3R3aGl0ZScsICdmbG9yYWx3aGl0ZScsICdzZWFzaGVsbCcsICd3aGl0ZXNtb2tlJ107XG4gICAgaWYgKHdoaXRlTmFtZXMuaW5jbHVkZXMoaW5wdXQpKSByZXR1cm4gWzI1NSwgMjU1LCAyNTVdO1xuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGNvbnN0IHJnYiA9IHBhcnNlQ29sb3IoY29sb3IpO1xuICBpZiAoIXJnYikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IFtyLCBnLCBiXSA9IHJnYjtcblxuICAvLyBUw61uaCBsdW1pbmFuY2UgKMSR4buZIHPDoW5nKVxuICBjb25zdCBsdW1pbmFuY2UgPSAoMC4yMTI2ICogciArIDAuNzE1MiAqIGcgKyAwLjA3MjIgKiBiKSAvIDI1NTtcblxuICAvLyBUw61uaCBzYXR1cmF0aW9uICjEkeG7mSBiw6NvIGjDsmEpXG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpIC8gMjU1O1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSAvIDI1NTtcbiAgY29uc3Qgc2F0dXJhdGlvbiA9IG1heCA9PT0gMCA/IDAgOiAobWF4IC0gbWluKSAvIG1heDtcblxuICAvLyBDaOG7iSBjb2kgbMOgIFwiZ+G6p24gdHLhuq9uZ1wiIG7hur91OlxuICAvLyAxLiBy4bqldCBzw6FuZyAobHVtaW5hbmNlID4gMC45NSlcbiAgLy8gMi4gdsOgIHLhuqV0IMOtdCBtw6B1IChzYXR1cmF0aW9uIDwgMC4xKVxuICByZXR1cm4gbHVtaW5hbmNlID4gMC45NSAmJiBzYXR1cmF0aW9uIDwgMC4xO1xufTtcbiJdfQ==
|