@libs-ui/utils 0.1.1-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +3 -0
  2. package/base64.d.ts +5 -0
  3. package/cache.d.ts +42 -0
  4. package/color.d.ts +11 -0
  5. package/communicate-micro.d.ts +16 -0
  6. package/constants.d.ts +10 -0
  7. package/crypto-3rd.d.ts +7 -0
  8. package/crypto.d.ts +8 -0
  9. package/dangerous-object.d.ts +79 -0
  10. package/date.d.ts +44 -0
  11. package/dom.d.ts +52 -0
  12. package/download.d.ts +3 -0
  13. package/esm2022/base64.mjs +43 -0
  14. package/esm2022/cache.mjs +388 -0
  15. package/esm2022/color.mjs +133 -0
  16. package/esm2022/communicate-micro.mjs +149 -0
  17. package/esm2022/constants.mjs +11 -0
  18. package/esm2022/crypto-3rd.mjs +38 -0
  19. package/esm2022/crypto.mjs +41 -0
  20. package/esm2022/dangerous-object.mjs +149 -0
  21. package/esm2022/date.mjs +191 -0
  22. package/esm2022/dom.mjs +256 -0
  23. package/esm2022/download.mjs +41 -0
  24. package/esm2022/file.mjs +90 -0
  25. package/esm2022/format-number.mjs +66 -0
  26. package/esm2022/format-text.mjs +149 -0
  27. package/esm2022/function-check-embed-frame.mjs +10 -0
  28. package/esm2022/get-smart-axis-scale.mjs +174 -0
  29. package/esm2022/helpers.mjs +651 -0
  30. package/esm2022/http-params.mjs +80 -0
  31. package/esm2022/index.mjs +30 -0
  32. package/esm2022/inject-token.mjs +5 -0
  33. package/esm2022/key-cache.mjs +31 -0
  34. package/esm2022/key-code.mjs +123 -0
  35. package/esm2022/language.mjs +70 -0
  36. package/esm2022/libs-ui-utils.mjs +5 -0
  37. package/esm2022/pattern.mjs +62 -0
  38. package/esm2022/random.mjs +42 -0
  39. package/esm2022/two-way-signal-object.mjs +131 -0
  40. package/esm2022/uri.mjs +25 -0
  41. package/esm2022/url-search-params.mjs +99 -0
  42. package/esm2022/uuid.mjs +18 -0
  43. package/esm2022/xss-filter.mjs +10 -0
  44. package/fesm2022/libs-ui-utils.mjs +3234 -0
  45. package/fesm2022/libs-ui-utils.mjs.map +1 -0
  46. package/file.d.ts +18 -0
  47. package/format-number.d.ts +2 -0
  48. package/format-text.d.ts +11 -0
  49. package/function-check-embed-frame.d.ts +2 -0
  50. package/get-smart-axis-scale.d.ts +34 -0
  51. package/helpers.d.ts +270 -0
  52. package/http-params.d.ts +37 -0
  53. package/index.d.ts +29 -0
  54. package/inject-token.d.ts +4 -0
  55. package/key-cache.d.ts +1 -0
  56. package/key-code.d.ts +122 -0
  57. package/language.d.ts +37 -0
  58. package/package.json +29 -0
  59. package/pattern.d.ts +20 -0
  60. package/random.d.ts +3 -0
  61. package/two-way-signal-object.d.ts +15 -0
  62. package/uri.d.ts +5 -0
  63. package/url-search-params.d.ts +25 -0
  64. package/uuid.d.ts +1 -0
  65. package/xss-filter.d.ts +3 -0
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ ## utils
2
+
3
+ This library was generated with [Nx](https://nx.dev).
package/base64.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare const base64Encode: (value: string) => string;
2
+ export declare const base64Decode: (value: string) => string;
3
+ export declare const convertBase64ToBlob: (dataBase64: string) => Blob;
4
+ export declare const convertFileToBase64_ObjectUrl: (file: File) => Promise<string | ArrayBuffer>;
5
+ export declare const convertFileToBase64: (file: File) => Promise<string | ArrayBuffer>;
package/cache.d.ts ADDED
@@ -0,0 +1,42 @@
1
+ import { TYPE_LANGUAGE_SUPPORT } from '@libs-ui/interfaces-types';
2
+ export declare class UtilsCache {
3
+ static readonly CACHE_EXPIRE_TIME_DEFAULT: number;
4
+ static readonly CACHE_EXPIRE_NONE = -1;
5
+ static readonly idService: string;
6
+ static typeKeyClearLocalStorage: string;
7
+ private static languageKeyCache;
8
+ private static listKeyKeepWhenClearALll;
9
+ private static initdEvent?;
10
+ private static storage;
11
+ private static dbName;
12
+ private static itemIndexByKey;
13
+ private static dbVersion;
14
+ private static db;
15
+ static init(config: {
16
+ indexedDBName?: string;
17
+ languageKeyCache?: string;
18
+ typeKeyClearLocalStorage?: string;
19
+ listKeyKeepWhenClearAll?: Array<string>;
20
+ }): void;
21
+ static setLang(lang: TYPE_LANGUAGE_SUPPORT): void;
22
+ static getLang(): TYPE_LANGUAGE_SUPPORT;
23
+ private static openDB;
24
+ private static getObjectStore;
25
+ private static get LocalStorage();
26
+ private static getLocalStorageFakeOnSafari;
27
+ private static getLocalStorageFake;
28
+ static GetAsync<T = any>(key: string, default_value?: any, isKeyMD5?: boolean): Promise<T>;
29
+ static Get<T = any>(key: string, default_value?: any): T;
30
+ static GetDefaultValueBySpecificKey(key: string, default_value: any): any;
31
+ static SetAsync<T = any>(key: string, value: any, expireTimeBySecond?: number, isKeyMD5?: boolean): Promise<T>;
32
+ static Set(key: string, value: any, expireTimeBySecond?: number): boolean;
33
+ static ClearAsync(key: string, isMD5?: boolean): Promise<void>;
34
+ static Clear(key: string): void;
35
+ static ClearAllAsync(): Promise<void>;
36
+ static ClearAll(): void;
37
+ private static GetDataByKeys;
38
+ private static SetDataByKey;
39
+ static DeleteKeyStartWithAsync(keyCacheStartWith: string, isKeyMD5?: boolean): Promise<unknown>;
40
+ static DeleteKeyStartWith(keyCache: string, isMD5?: boolean): void;
41
+ static DeleteDatabaseIndexDB(dbName?: string): Promise<unknown>;
42
+ }
package/color.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export interface IColorContrastFromOrigin {
2
+ step: number;
3
+ label: string;
4
+ light: string;
5
+ dark: string;
6
+ }
7
+ export declare const colorStepContrastFromOrigin: (color: string, stepNumber: number) => IColorContrastFromOrigin | undefined;
8
+ export declare const colorContrastFromOrigin: (color: string) => Array<IColorContrastFromOrigin>;
9
+ export declare const rgbToHex: (rgb: any) => string;
10
+ export declare const listColorDefine: Array<string>;
11
+ export declare const getColorById: (str: string) => string;
@@ -0,0 +1,16 @@
1
+ import { Subject } from 'rxjs';
2
+ export declare class UtilsCommunicateMicroKeyGlobal {
3
+ static KEY_MESSAGE_MODAL: string;
4
+ }
5
+ export declare class UtilsCommunicateMicro {
6
+ private static initdEvent?;
7
+ private static subs;
8
+ private static allMessageSub;
9
+ static initEvent(currentWindow: Window, onDestroy: Subject<void>): void;
10
+ static PostMessageToParent(data: any): void;
11
+ static PostMessageToChildren(data: any): void;
12
+ static PostMessageToOpener(data: any): void;
13
+ private static convertData;
14
+ static GetMessage(messageType: string | Array<string>): Subject<MessageEvent>;
15
+ private static initSubject;
16
+ }
package/constants.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export declare const ERROR_MESSAGE_EMPTY_VALID = "i18n_valid_empty_message";
2
+ export declare const ERROR_MESSAGE_PATTEN_VALID = "i18n_valid_pattern_message";
3
+ export declare const ERROR_MESSAGE_MIN_VALID = "i18n_message_error_input_min_value";
4
+ export declare const ERROR_MESSAGE_MAX_VALID = "i18n_message_error_input_max_value";
5
+ export declare const ERROR_MESSAGE_MIN_LENGTH = "i18n_message_error_input_min_length";
6
+ export declare const ERROR_MESSAGE_MAX_LENGTH = "i18n_message_error_input_max_length";
7
+ export declare const CHARACTER_DATA_EMPTY = "__";
8
+ export declare const DEFAULT_START_PAGE_0 = "defaultStartPage0";
9
+ export declare const COMMUNICATE_MICRO_PREFIX_TYPE = "3RD_INTEGRATE_MICRO_SITE_";
10
+ export declare const COMMUNICATE_MICRO_KEY_GET_ALL_MESSAGE = "MICRO_SITES_ALL_MESSAGE";
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @description Thiết lập key mã hóa
3
+ * @param value key mã hóa, độ dài bằng 24 hoặc 32 ký tự.
4
+ */
5
+ export declare const setKeyCrypto3rd: (value: string) => void;
6
+ export declare const encrypt3rd: (plainData: string) => string;
7
+ export declare const decrypt3rd: (encryptedData: string) => string;
package/crypto.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @description Thiết lập key mã hóa
3
+ * @param value key mã hóa, độ dài bằng 24 hoặc 32 ký tự.
4
+ */
5
+ export declare const setKeyCrypto: (value: string) => void;
6
+ export declare const encrypt: (plainData: string) => string;
7
+ export declare const decrypt: (encryptedData: string) => string;
8
+ export declare const md5: (plainData: string) => string;
@@ -0,0 +1,79 @@
1
+ import { HttpParams } from '@angular/common/http';
2
+ import { TemplateRef, ElementRef } from '@angular/core';
3
+ import { Dayjs } from 'dayjs';
4
+ import { Observable } from 'rxjs';
5
+ /**
6
+ * Kiểm tra xem đối tượng có phải là browser global object không
7
+ */
8
+ export declare const isBrowserGlobalObject: (obj: any) => obj is Window | Document | Window | Document | typeof globalThis;
9
+ /**
10
+ * Kiểm tra xem đối tượng có phải là DOM object không
11
+ */
12
+ export declare const isDOMObject: (obj: any) => obj is HTMLElement | Node | Element;
13
+ /**
14
+ * Kiểm tra xem đối tượng có phải là browser API object không
15
+ */
16
+ export declare const isBrowserAPIObject: (obj: any) => boolean;
17
+ /**
18
+ * Kiểm tra constructor name có nằm trong danh sách nguy hiểm không
19
+ */
20
+ export declare const hasDangerousConstructorName: (obj: any) => boolean;
21
+ /**
22
+ * Kiểm tra xem đối tượng có phải là DOM object hoặc browser object nguy hiểm không
23
+ * Những đối tượng này có thể gây ra circular reference và maximum call stack
24
+ */
25
+ export declare const isDangerousObject: (obj: any) => boolean;
26
+ /**
27
+ * Kiểm tra đối tượng có phải là Angular/Framework object không
28
+ */
29
+ export declare const isFrameworkObject: <T = any>(obj: any) => obj is TemplateRef<T> | ElementRef<T>;
30
+ /**
31
+ * Kiểm tra đối tượng có phải là File/Blob object không
32
+ */
33
+ export declare const isFile: (obj: any) => obj is File | Blob;
34
+ /**
35
+ * Kiểm tra đối tượng có phải là Built-in object không
36
+ */
37
+ export declare const isBuiltInObject: (obj: any) => obj is Date | RegExp | HttpParams;
38
+ /**
39
+ * Kiểm tra đối tượng có phải là RegExp object không
40
+ */
41
+ export declare const isRegExp: (obj: any) => obj is RegExp;
42
+ /**
43
+ * Kiểm tra đối tượng có phải là Async object không
44
+ */
45
+ export declare const isAsyncObject: <T = any>(obj: any) => obj is Promise<T> | Observable<T>;
46
+ /**
47
+ * Kiểm tra đối tượng có phải là Special object cần bỏ qua không
48
+ * Bao gồm: Framework objects, File objects, Built-in objects, Async objects
49
+ */
50
+ export declare const isSpecialObject: (obj: any) => boolean;
51
+ /**
52
+ * Kiểm tra đối tượng có phải là dayjs object không
53
+ */
54
+ export declare const isDayjsObject: (obj: any) => obj is Dayjs;
55
+ /**
56
+ * Kiểm tra đối tượng có phải là object cần bỏ qua trong quá trình convert không
57
+ */
58
+ export declare const isSkippableObject: (obj: any) => boolean;
59
+ /**
60
+ * Kiểm tra đối tượng có phải là Map object không
61
+ */
62
+ export declare const isMap: <T = any>(obj: any) => obj is Map<string, T>;
63
+ /**
64
+ * Kiểm tra đối tượng có phải là Set object không
65
+ */
66
+ export declare const isSet: <T = any>(obj: any) => obj is Set<T>;
67
+ /**
68
+ * Kiểm tra đối tượng có phải là Array object không
69
+ */
70
+ export declare const isArray: <T = any>(obj: any) => obj is Array<T>;
71
+ /**
72
+ * Kiểm tra đối tượng có phải là object cần trả về nguyên trạng không
73
+ * Bao gồm: dangerous objects, special objects, dayjs objects
74
+ */
75
+ export declare const isReturnAsIsObject: (obj: any) => boolean;
76
+ /**
77
+ * Kiểm tra xem đối tượng có an toàn để clone/convert không
78
+ */
79
+ export declare const isSafeToProcess: (obj: any) => boolean;
package/date.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ import { GetDayjsConfig, GetDayjsReturn, NonNullableDate } from '@libs-ui/interfaces-types';
2
+ import dayjs from 'dayjs';
3
+ import 'dayjs/locale/en';
4
+ import 'dayjs/locale/vi';
5
+ export declare const setDefaultTimeZone: (localeZone?: string) => void;
6
+ export type TYPE_FUNCTION_FORMAT_DATE = (time: dayjs.ConfigType, formatOutput: string, lang?: string) => string;
7
+ export declare const updateFunctionFormatDate: (functionCustom: TYPE_FUNCTION_FORMAT_DATE) => void;
8
+ /**
9
+ * @description Lấy đối tượng dayjs theo config
10
+ * @param config nếu không có config sẽ trả về đối tượng dayjs là thời gian hiện tại
11
+ * @param config.date thời gian cần lấy
12
+ * @param config.returnDayjsIfConfigDateNotExist true nếu muốn trả về đối tượng dayjs nếu config.date không có
13
+ * @param config.utc true nếu muốn lấy thời gian UTC
14
+ * @param config.formatOfDate định dạng thời gian đang được truyền vào
15
+ */
16
+ export declare const getDayjs: <C extends GetDayjsConfig | undefined = undefined>(config?: C) => GetDayjsReturn<C>;
17
+ /**
18
+ * @description Kiểm tra xem hai ngày có khác nhau không (khác ngày trong tuần)
19
+ * @param date1 ngày thứ nhất cần so sánh
20
+ * @param date2 ngày thứ hai cần so sánh
21
+ * @returns true nếu hai ngày khác nhau, false nếu giống nhau hoặc không thể so sánh
22
+ */
23
+ export declare const isDifferenceDay: (date1: NonNullableDate, date2: NonNullableDate) => boolean;
24
+ /**
25
+ * @description Kiểm tra xem hai ngày có khác tháng không
26
+ * @param date1 ngày thứ nhất cần so sánh
27
+ * @param date2 ngày thứ hai cần so sánh
28
+ * @returns true nếu hai ngày khác tháng, false nếu cùng tháng hoặc không thể so sánh
29
+ */
30
+ export declare const isDifferenceMonth: (date1: NonNullableDate, date2: NonNullableDate) => boolean;
31
+ /**
32
+ * @description Kiểm tra xem hai ngày có khác năm không
33
+ * @param date1 ngày thứ nhất cần so sánh
34
+ * @param date2 ngày thứ hai cần so sánh
35
+ * @returns true nếu hai ngày khác năm, false nếu cùng năm hoặc không thể so sánh
36
+ */
37
+ export declare const isDifferenceYear: (date1: NonNullableDate, date2: NonNullableDate) => boolean;
38
+ /**
39
+ * @description Lấy ra chuỗi thời gian hiển thị theo định dạng và ngôn ngữ
40
+ * @param date thời gian cần định dạng
41
+ * @param format định dạng thời gian muốn lấy ra
42
+ * @param lang lấy theo ngôn ngữ
43
+ */
44
+ export declare const formatDate: (date: dayjs.ConfigType, formatOutput?: string, lang?: string, formatInput?: string) => string;
package/dom.d.ts ADDED
@@ -0,0 +1,52 @@
1
+ import { IBoundingClientRect } from '@libs-ui/interfaces-types';
2
+ import DeviceDetector from 'device-detector-js';
3
+ import Delta from 'quill-delta';
4
+ import { Subject } from 'rxjs';
5
+ export declare const getDeviceInfo: () => DeviceDetector.DeviceDetectorResult;
6
+ export declare const getPlatFromBrowser: () => string;
7
+ export declare const getEventNameHandleClick: string;
8
+ export declare const getDocumentByString: (htmlStr: string) => Document;
9
+ export declare const cloneIBoundingClientRect: (rect: IBoundingClientRect) => IBoundingClientRect;
10
+ export declare const setStylesElement: (el: HTMLElement, styles: Record<string, string>) => void;
11
+ export declare const getViewport: (win?: Window) => {
12
+ width: number;
13
+ height: number;
14
+ };
15
+ export declare const setCaretPosition: (element: HTMLTextAreaElement | HTMLInputElement, position: number) => void;
16
+ export declare const checkViewInScreen: (container: HTMLElement, element: HTMLElement, elementScroll?: HTMLElement, maxTopLeft?: {
17
+ top?: number;
18
+ left?: number;
19
+ }) => boolean;
20
+ export declare const checkMouseOverInContainer: (mousePosition: {
21
+ clientX: number;
22
+ clientY: number;
23
+ }, element?: HTMLElement, rect?: DOMRect) => boolean;
24
+ export declare const getDragEventByElement: (config: {
25
+ elementMouseDown: HTMLElement;
26
+ functionMouseDown?: (event: MouseEvent) => void;
27
+ isStartWithMouseDownEvent?: boolean;
28
+ elementMouseMove?: HTMLElement;
29
+ functionMouseMove?: (event: MouseEvent) => void;
30
+ elementMouseUp?: HTMLElement;
31
+ functionMouseUp?: (event: MouseEvent) => void;
32
+ onDestroy: Subject<any>;
33
+ }) => import("rxjs").Observable<MouseEvent>;
34
+ export declare const getHTMLFromQuill: (data: Delta | string, options?: {
35
+ getRootHtml?: boolean;
36
+ replaceNewLineTo?: string;
37
+ replaceTagBRTo?: string;
38
+ replaceBrToDiv?: boolean;
39
+ functionReplaceDelta?: (op: Delta) => void;
40
+ replaceTags?: {
41
+ tag: string;
42
+ replaceTo: string;
43
+ }[];
44
+ }) => Promise<string>;
45
+ export declare const convertHtmlToDivBlocks: (html: string) => string;
46
+ export declare const getDeltaFromHTML: (html: string) => Promise<Delta>;
47
+ export declare const processPasteData: (e: ClipboardEvent, config: {
48
+ element: HTMLElement;
49
+ handlerPasteFile?: (files: FileList) => void;
50
+ callBack?: (positonReturn: "file" | "range" | "content" | "no-content") => void;
51
+ }) => Promise<void>;
52
+ export declare const insertContentWithRange: (content: string, savedRange: Range, element: HTMLElement) => void;
package/download.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare const downloadFileByUrlUseXmlRequest: (fileUrl: string, filename: string) => void;
2
+ export declare const downloadFileByUrl: (fileUrl: string, filename: string, onlyOpen?: boolean) => Promise<void>;
3
+ export declare const downloadImageFromELement: (imageElement: HTMLImageElement, typeFileDownload?: string, nameFile?: string) => void;
@@ -0,0 +1,43 @@
1
+ import { encodeURI, decodeURI } from './uri';
2
+ export const base64Encode = (value) => {
3
+ return btoa(encodeURI(value));
4
+ };
5
+ export const base64Decode = (value) => {
6
+ return decodeURI(atob(value));
7
+ };
8
+ export const convertBase64ToBlob = (dataBase64) => {
9
+ const BASE64_MARKER = ';base64,';
10
+ if (dataBase64.indexOf(BASE64_MARKER) === -1) {
11
+ const parts = dataBase64.split(',');
12
+ const contentType = parts[0].split(':')[1];
13
+ const raw = parts[1];
14
+ const blob = new Blob([raw], { type: contentType });
15
+ return blob;
16
+ }
17
+ const parts = dataBase64.split(BASE64_MARKER);
18
+ const contentType = parts[0].split(':')[1];
19
+ const raw = window.atob(parts[1]);
20
+ const rawLength = raw.length;
21
+ const uInt8Array = new Uint8Array(rawLength);
22
+ for (let i = 0; i < rawLength; ++i) {
23
+ uInt8Array[i] = raw.charCodeAt(i);
24
+ }
25
+ const blob = new Blob([uInt8Array], { type: contentType });
26
+ return blob;
27
+ };
28
+ export const convertFileToBase64_ObjectUrl = async (file) => {
29
+ if (!file.type.match(/image.*/)) {
30
+ return URL.createObjectURL(file);
31
+ }
32
+ return await convertFileToBase64(file);
33
+ };
34
+ export const convertFileToBase64 = (file) => {
35
+ return new Promise((resolve) => {
36
+ const reader = new FileReader();
37
+ reader.readAsDataURL(file);
38
+ reader.onload = (event) => {
39
+ resolve(event.target?.result ?? '');
40
+ };
41
+ });
42
+ };
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZTY0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvYmFzZTY0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRTdDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO0lBQzVDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO0lBQzVDLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsVUFBa0IsRUFBRSxFQUFFO0lBQ3hELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQztJQUVqQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUVwRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRTNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsS0FBSyxFQUFFLElBQVUsRUFBaUMsRUFBRTtJQUMvRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sTUFBTSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLElBQVUsRUFBaUMsRUFBRTtJQUMvRSxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUVoQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlbmNvZGVVUkksIGRlY29kZVVSSSB9IGZyb20gJy4vdXJpJztcblxuZXhwb3J0IGNvbnN0IGJhc2U2NEVuY29kZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBidG9hKGVuY29kZVVSSSh2YWx1ZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGJhc2U2NERlY29kZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBkZWNvZGVVUkkoYXRvYih2YWx1ZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRCYXNlNjRUb0Jsb2IgPSAoZGF0YUJhc2U2NDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IEJBU0U2NF9NQVJLRVIgPSAnO2Jhc2U2NCwnO1xuXG4gIGlmIChkYXRhQmFzZTY0LmluZGV4T2YoQkFTRTY0X01BUktFUikgPT09IC0xKSB7XG4gICAgY29uc3QgcGFydHMgPSBkYXRhQmFzZTY0LnNwbGl0KCcsJyk7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSBwYXJ0c1swXS5zcGxpdCgnOicpWzFdO1xuICAgIGNvbnN0IHJhdyA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbcmF3XSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcblxuICAgIHJldHVybiBibG9iO1xuICB9XG4gIGNvbnN0IHBhcnRzID0gZGF0YUJhc2U2NC5zcGxpdChCQVNFNjRfTUFSS0VSKTtcbiAgY29uc3QgY29udGVudFR5cGUgPSBwYXJ0c1swXS5zcGxpdCgnOicpWzFdO1xuICBjb25zdCByYXcgPSB3aW5kb3cuYXRvYihwYXJ0c1sxXSk7XG4gIGNvbnN0IHJhd0xlbmd0aCA9IHJhdy5sZW5ndGg7XG4gIGNvbnN0IHVJbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShyYXdMZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3TGVuZ3RoOyArK2kpIHtcbiAgICB1SW50OEFycmF5W2ldID0gcmF3LmNoYXJDb2RlQXQoaSk7XG4gIH1cblxuICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3VJbnQ4QXJyYXldLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xuXG4gIHJldHVybiBibG9iO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRGaWxlVG9CYXNlNjRfT2JqZWN0VXJsID0gYXN5bmMgKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZyB8IEFycmF5QnVmZmVyPiA9PiB7XG4gIGlmICghZmlsZS50eXBlLm1hdGNoKC9pbWFnZS4qLykpIHtcbiAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBjb252ZXJ0RmlsZVRvQmFzZTY0KGZpbGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRGaWxlVG9CYXNlNjQgPSAoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nIHwgQXJyYXlCdWZmZXI+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgIHJlc29sdmUoZXZlbnQudGFyZ2V0Py5yZXN1bHQgPz8gJycpO1xuICAgIH07XG4gIH0pO1xufTtcbiJdfQ==