nmce-func 1.3.2 → 1.4.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 CHANGED
@@ -1,24 +1,24 @@
1
- # NmceFunc
2
-
3
- This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.5.
4
-
5
- ## Code scaffolding
6
-
7
- Run `ng generate component component-name --project nmce-func` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project nmce-func`.
8
- > Note: Don't forget to add `--project nmce-func` or else it will be added to the default project in your `angular.json` file.
9
-
10
- ## Build
11
-
12
- Run `ng build nmce-func` to build the project. The build artifacts will be stored in the `dist/` directory.
13
-
14
- ## Publishing
15
-
16
- After building your library with `ng build nmce-func`, go to the dist folder `cd dist/nmce-func` and run `npm publish`.
17
-
18
- ## Running unit tests
19
-
20
- Run `ng test nmce-func` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
-
22
- ## Further help
23
-
24
- To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
1
+ # NmceFunc
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.5.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project nmce-func` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project nmce-func`.
8
+ > Note: Don't forget to add `--project nmce-func` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build nmce-func` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build nmce-func`, go to the dist folder `cd dist/nmce-func` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test nmce-func` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -1,20 +1,30 @@
1
1
  /**
2
2
  * Currency calculations. Undefined input of number is considered zero, just like null.
3
+ * Simple functions for currency before you decide to use more comprehensive ones:
4
+ * https://github.com/scurker/currency.js
5
+ * https://github.com/dinerojs/dinero.js Up to date and popular
3
6
  */
4
7
  export declare class CurrencyFunc {
5
8
  private static DECIMAL_SEPARATOR;
6
9
  private static THOUSANDS_SEPARATOR;
7
10
  private static PADDING;
8
11
  /**
9
- *
12
+ * Banker rounding
10
13
  * @param num
11
- * @param decimalPlaces default 0
14
+ * @param decimalPlace default 0
15
+ */
16
+ static bankerRound(num: number | null | undefined, decimalPlace?: number): number;
17
+ /**
18
+ * Banker rounding to 5 cents
19
+ * @param num
20
+ * @returns
12
21
  */
13
- static bankerRound(num: number | null | undefined, decimalPlaces?: number): number;
14
22
  static bankerRoundTo5cents(num: number | null | undefined): number;
15
- static ceilTo5cents(num: number | null | undefined): number;
16
- static transformCurrency(value: number | string | undefined, fractionSize?: number): string;
17
- static parseCurrency(value: string | undefined, fractionSize?: number): string;
18
23
  static pad(num: number | null | undefined, size: number): string;
24
+ /**
25
+ * Sum array of numbers
26
+ * @param ns
27
+ * @returns
28
+ */
19
29
  static sum(ns: (number | null | undefined)[]): number;
20
30
  }
@@ -1,121 +1,118 @@
1
- import moment from 'moment';
2
1
  export declare class DateFunc {
2
+ /**
3
+ * At runtime, there's no simple guarantee that the input is Date. Sometimes you codes expect date, but the response from the Web service may give you string or number.
4
+ * This function give you safe parse of date data from I/O, not of your control.
5
+ * If the data is invalid, throws RangeError or TypeError.
6
+ * @param dt
7
+ * @returns
8
+ */
9
+ static dateDataToDate(dt: Date | string | number): Date;
10
+ /**
11
+ * Similar to dateDataToDate, but allow null and defined semantically.
12
+ * @param dt
13
+ * @returns
14
+ */
15
+ static dateDataToDateOrNull(dt: Date | string | number | null | undefined): Date | null | undefined;
3
16
  /**
4
17
  * Transform UTC DateTime to local date without H, M and S. For example, the month day of 2018-01-23T22:00:00Z is 24 in Australia.
5
18
  * @param dtUtc
6
- * @param offsetMinutes if not defined, it will be new Date().getTimezoneOffset(). //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
7
19
  */
8
- static dateTimeUtcToLocalDateNumber(dtUtc: Date | null | undefined): number;
20
+ static dateTimeUtcToLocalDateNumber(dtUtc: Date | string | number | null | undefined): number | null | undefined;
9
21
  /**
10
22
  * Date only. However, the date may still be in UTC.
11
23
  * @param dtUtc
24
+ * @returns new Date object.
12
25
  */
13
- static dateTimeUtcToLocalDate(dtUtc: Date | null | undefined): Date;
14
- static localISODateString(dtUtc: Date | null | undefined): string;
26
+ static dateTimeUtcToLocalDate(dtUtc: Date | string | number | null | undefined): Date | null | undefined;
15
27
  /**
16
- * locate date ONLY (no time) to UTC date.
17
- * @param dt if dt contain time info, it will become dt.setHours(0, 0, 0, 0)
28
+ * '2018-01-23T22:00:00Z' will become '2018-01-24' in Australia.
29
+ * @param dtUtc
30
+ * @returns new Date object.
18
31
  */
19
- static localDateToUtc(d: Date | number | null | undefined | string): Date;
20
- static getTimezoneOffset(): number;
32
+ static localISODateString(dtUtc: Date | string | number | null | undefined): string | null | undefined;
21
33
  /**
22
- * Transform UTC DateTime to local dateTime.
23
- * @param dtUtc
24
- * @param offsetMinutes if not defined, it will be new Date().getTimezoneOffset(). //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
34
+ * local date ONLY (no time) to UTC date.
35
+ * The input could be a string of yyyy-MM-dd, or a Date Object.
36
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
37
+ * While the time value at the heart of a Date object is UTC, the basic methods to fetch the date and time
38
+ * or its components all work in the local (i.e. host system) time zone and offset.
39
+ * @param dt if dt contain time info, it will become dt.setHours(0, 0, 0, 0)
25
40
  */
26
- static dateTimeUtcToLocalDateTime(dtUtc: Date | null | undefined): Date;
27
- static dateTimeUtcToLocaMoment(dtUtc: Date | null | undefined): moment.Moment;
28
- static getEndOfWeek(dt: Date | null | undefined | number): Date;
29
- static getStartOfWeek(dt: Date | null | undefined | number): Date;
30
- static getEndOfMonth(dt: Date | null | undefined | number): Date;
31
- static getStartOfMonth(dt: Date | null | undefined | number): Date;
32
- static getDaysBetweenDates(dt1: Date | null | undefined, dt2: Date | null | undefined): number;
33
- static getEndOfDate(dt: Date | null | undefined): Date;
34
- static getStartOfDate(dt: Date | null | undefined): Date;
35
- static getEndOfToday(): Date;
41
+ static localDateToUtc(d: Date | string | number | null | undefined | string): Date | null | undefined;
42
+ static getEndOfWeek(dt: Date | string | number): Date;
43
+ static getStartOfWeek(dt: Date | string | number): Date;
44
+ static getEndOfMonth(dt: Date | string | number): Date;
45
+ static getStartOfMonth(dt: Date | string | number): Date;
46
+ static getEndOfDate(dt: Date | string | number): Date;
47
+ static getStartOfDate(dt: Date | string | number): Date;
48
+ static getEndOfToday(): Date | null | undefined;
36
49
  static getStartOfToday(): Date;
37
- static addDays(dt: Date | null | undefined, days?: number): Date;
38
- static subtractDays(dt: Date | null | undefined, days?: number): Date;
50
+ static getDaysBetween(d1: Date | string | number, d2: Date | string | number): number;
51
+ static addDays(dt: Date | string | number, days: number): Date;
39
52
  /**
40
53
  * Start of today
41
54
  */
42
55
  static get today(): Date;
43
56
  static get now(): Date;
57
+ /**
58
+ * From now, next 5 minute mark. For example 2:23:44 will be 2:25:00;
59
+ * @returns
60
+ */
44
61
  static getNext5MinuteMark(): Date;
45
- static getYMD(d: Date): string;
46
- static getDMYWithSlash(d: Date): string;
47
- static getDMYHmWithSlash(d: Date): string;
48
- static getMcpTime(dt: Date | null | undefined): string;
62
+ static getYMD(d: Date | string | number): string;
63
+ static getDMYWithSlash(d: Date | string | number): string;
64
+ static getDMYHmWithSlash(d: Date | string | number): string;
49
65
  /**
50
- * In 24 hour format
51
- * @param dtUtc
66
+ *
67
+ * @param dtUtc In 24 hour format, and the date separator depending on the system or Luxon default locale
68
+ * @returns
52
69
  */
53
- static getLocalDMYHmWithSlash(dtUtc: Date | null | undefined): string;
70
+ static getDateTime24Simple(dtUtc: Date | string | number | null | undefined): string | null | undefined;
71
+ static setDefaultLocale(locale: string): void;
72
+ static getDefaultLocale(): string;
73
+ static setDefaultZone(zone: string): void;
74
+ static getDefaultZone(): string;
75
+ static isZoneValid(): boolean;
54
76
  /**
55
- * Offset minutes comparing with today
77
+ * For example, in AEST, it is -600.
78
+ * @returns
56
79
  */
57
- static getOffsetMinutes(dtUtc: Date | null | undefined | number): number;
58
- static getDaysBetween(d1?: Date | number | null | undefined, d2?: Date | number | null | undefined): number;
80
+ static getLocalTimezoneOffset(): number;
59
81
  /**
60
82
  * Get hour of the date. If Date is not defined, the hour will be current hour.
61
83
  * @param dtUtc
62
84
  */
63
- static getHour(dtUtc: Date | null | undefined | number): number;
64
- static getMinute(dtUtc: Date | null | undefined | number): number;
65
- static composeDateTime(dt: Date | null | undefined, h?: number, minute?: number): Date;
66
- static olderThan24Hours(d: Date | null | undefined): boolean;
67
- static olderThan24HoursUtc(dtUtc: Date | null | undefined): boolean;
68
- static olderThanHours(d: Date, hours: number): boolean;
69
- static olderThanHoursUtc(dtUtc: Date | null | undefined, hours: number): boolean;
70
- static olderThanMinutes(d: Date, minutes: number): boolean;
85
+ static getHour(dtUtc: Date | string | number): number;
86
+ static getMinute(dtUtc: Date | string | number): number;
87
+ static GetHM(dtUtc: Date | string | number): {
88
+ h: number;
89
+ m: number;
90
+ };
91
+ static composeDateTime(dt: Date | string | number, h?: number, minute?: number, second?: number): Date;
92
+ static olderThan24Hours(d: Date | string | number): boolean;
93
+ static olderThanHours(d: Date | string | number, hours: number): boolean;
94
+ static olderThanMinutes(d: Date | string | number, minutes: number): boolean;
71
95
  /**
72
96
  * It could be 11PM yesterday, and 1 AM today. Actually based on local today.
73
97
  */
74
- static olderThan1Day(dtUtc: Date | null | undefined): boolean;
75
- static getHourAge(d: Date): number;
76
- static getHourAgeUtc(dtUtc: Date | null | undefined): number;
98
+ static olderThan1Day(dtUtc: Date | string | number): boolean;
99
+ static getHourAge(d: Date | string | number): number;
77
100
  /**
78
- * Compare utc date with utc now.
101
+ * Compare date with now.
79
102
  * @param dtUtc
80
103
  */
81
- static getDayAgeUtc(dtUtc: Date | null | undefined): number;
104
+ static getDayAge(d: Date | string | number): number;
82
105
  /**
83
106
  * How many years from now.
84
107
  * @param d
85
108
  * @returns
86
109
  */
87
- static getAge(d: Date): number;
88
- /**
89
- * Year of date.
90
- * @param d
91
- * @returns
92
- */
93
- static getYear(d: Date): number;
94
- static getUtcNow(): Date;
95
- static addMinutes(d: Date, m: number): Date;
96
- static addMonth(d: Date, m: number): Date;
97
- static getDuration(d1: Date, d2: Date): moment.Duration;
110
+ static getAge(d: Date | string | number): number;
98
111
  /**
99
112
  * Convert minutes from midnight to HH:mm text
100
- * @param mins
101
- */
102
- static getHMFromMins(mins: number): string;
103
- static getMinutesSinceMidnight(d: Date | null | undefined): number;
104
- static getMinutesBetween(start: Date | null | undefined, end: Date | null | undefined): number;
105
- /**
106
- * Parse json string with date serialized into string, and get proper date object back
107
- * @param s
108
- */
109
- static dateSafeJsonParse(s: string): any;
110
- private static dateReviver;
111
- private static isSerializedDate;
112
- private static isString;
113
- static dateSafeParse(s: string | Date): Date;
114
- static composeDateWithMinutes(d: Date, minute: number): Date;
115
- /**
116
- * Safe compare since date data may be considered as string rather than date.
117
- * @param d1
118
- * @param d2
113
+ * @param minutes
119
114
  */
120
- static compare(d1: Date | undefined, d2: Date | undefined): number;
115
+ static getHMFromMins(minutes: number): string;
116
+ static getMinutesSinceMidnight(d: Date | string | number): number;
117
+ static getMinutesBetween(start: Date | string | number, end: Date | string | number): number;
121
118
  }
package/_func/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  export * from './addressFunc';
2
- export * from './authentication.service';
3
2
  export * from './currencyFunc';
4
3
  export * from './dateFunc';
5
4
  export * from './htmlPrintFunc';
@@ -46,4 +46,4 @@ export class AddressFunc {
46
46
  return googleBaseUrl + ss;
47
47
  }
48
48
  }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc0Z1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2FkZHJlc3NGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxXQUFXO0lBQ3ZCOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBdUIsRUFBRSxHQUF1QixFQUFFLElBQXdCLEVBQUUsS0FBeUIsRUFBRSxRQUE0QjtRQUMvSixPQUFPLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxHQUF1QixFQUFFLEdBQXVCLEVBQUUsSUFBd0IsRUFBRSxLQUF5QixFQUFFLFFBQTRCO1FBQ2pLLE9BQU8sV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBdUIsRUFBRSxHQUF1QixFQUFFLElBQXdCLEVBQUUsS0FBeUIsRUFBRSxRQUE0QixFQUFFLEdBQXVCO1FBQ2pMLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkosT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEdBQXVCLEVBQUUsR0FBdUIsRUFBRSxJQUF3QixFQUFFLEtBQXlCLEVBQUUsT0FBMkI7UUFDL0osTUFBTSxhQUFhLEdBQUcseUNBQXlDLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFxQixFQUFVLEVBQUU7WUFDN0MsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDO1lBQ1gsQ0FBQztZQUVELE9BQU8sR0FBRyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVELENBQUMsQ0FBQztRQUVGLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkUsT0FBTyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FFRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBBZGRyZXNzRnVuYyB7XG5cdC8qKlxuXHQgKiBDb21wb3NlIHRvIG9uZSBsaW5lIHNlcGFyYXRlZCBieSBjb21tYVxuXHQgKiBAcGFyYW0gc3QxXG5cdCAqIEBwYXJhbSBzdDJcblx0ICogQHBhcmFtIGNpdHlcblx0ICogQHBhcmFtIHN0YXRlXG5cdCAqIEBwYXJhbSBwb3N0Y29kZVxuXHQgKi9cblx0c3RhdGljIGNvbXBvc2VPbmVMaW5lQWRkcmVzcyhzdDE6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3QyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNpdHk6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgcG9zdGNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIEFkZHJlc3NGdW5jLmNvbXBvc2VBZGRyZXNzKHN0MSwgc3QyLCBjaXR5LCBzdGF0ZSwgcG9zdGNvZGUsICcsICcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbXBvc2UgdG8gbXVsdGlwbGUgc2VwYXJhdGVkIGJ5IFxcblxuXHQgKiBAcGFyYW0gc3QxXG5cdCAqIEBwYXJhbSBzdDJcblx0ICogQHBhcmFtIGNpdHlcblx0ICogQHBhcmFtIHN0YXRlXG5cdCAqIEBwYXJhbSBwb3N0Y29kZVxuXHQgKi9cblx0c3RhdGljIGNvbXBvc2VNdWx0aUxpbmVBZGRyZXNzKHN0MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdDI6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2l0eTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwb3N0Y29kZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gQWRkcmVzc0Z1bmMuY29tcG9zZUFkZHJlc3Moc3QxLCBzdDIsIGNpdHksIHN0YXRlLCBwb3N0Y29kZSwgJ1xcbicpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbXBvc2Ugd2l0aCBzZXBhcmF0b3Jcblx0ICogQHBhcmFtIHN0MVxuXHQgKiBAcGFyYW0gc3QyXG5cdCAqIEBwYXJhbSBjaXR5XG5cdCAqIEBwYXJhbSBzdGF0ZVxuXHQgKiBAcGFyYW0gcG9zdGNvZGVcblx0ICogQHBhcmFtIHNlcFxuXHQgKi9cblx0c3RhdGljIGNvbXBvc2VBZGRyZXNzKHN0MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdDI6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2l0eTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwb3N0Y29kZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzZXA6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgciA9IChzdDEgPyAoc3QxICsgc2VwKSA6ICcnKSArIChzdDIgPyAoc3QyICsgc2VwKSA6ICcnKSArIChjaXR5ID8gKGNpdHkgKyBzZXApIDogJycpICsgKHN0YXRlID8gKHN0YXRlICsgJyAnKSA6ICcnKSArIChwb3N0Y29kZSA/IHBvc3Rjb2RlIDogJycpO1xuXHRcdHJldHVybiByO1xuXHR9XG5cblx0c3RhdGljIGNvbXBvc2VHb29nbGVNYXBzQXVVcmwoc3QxOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0Mjogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvdW50cnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZ29vZ2xlQmFzZVVybCA9ICdodHRwczovL3d3dy5nb29nbGUuY29tLmF1L21hcHM/aGw9ZW4mcT0nO1xuXHRcdGNvbnN0IGZmZiA9IChzOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuXHRcdFx0aWYgKCFzKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICcrJyArIGVuY29kZVVSSUNvbXBvbmVudChzLnJlcGxhY2UoJyAnLCAnKycpKSArICcsJztcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc3MgPSBmZmYoc3QxKSArIGZmZihzdDIpICsgZmZmKGNpdHkpICsgZmZmKHN0YXRlKSArIGZmZihjb3VudHJ5KTtcblx0XHRyZXR1cm4gZ29vZ2xlQmFzZVVybCArIHNzO1xuXHR9XG5cbn1cbiJdfQ==
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc0Z1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2FkZHJlc3NGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxXQUFXO0lBQ3ZCOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBdUIsRUFBRSxHQUF1QixFQUFFLElBQXdCLEVBQUUsS0FBeUIsRUFBRSxRQUE0QjtRQUMvSixPQUFPLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxHQUF1QixFQUFFLEdBQXVCLEVBQUUsSUFBd0IsRUFBRSxLQUF5QixFQUFFLFFBQTRCO1FBQ2pLLE9BQU8sV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBdUIsRUFBRSxHQUF1QixFQUFFLElBQXdCLEVBQUUsS0FBeUIsRUFBRSxRQUE0QixFQUFFLEdBQXVCO1FBQ2pMLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkosT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEdBQXVCLEVBQUUsR0FBdUIsRUFBRSxJQUF3QixFQUFFLEtBQXlCLEVBQUUsT0FBMkI7UUFDL0osTUFBTSxhQUFhLEdBQUcseUNBQXlDLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFxQixFQUFVLEVBQUU7WUFDN0MsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDO1lBQ1gsQ0FBQztZQUVELE9BQU8sR0FBRyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzVELENBQUMsQ0FBQztRQUVGLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkUsT0FBTyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FFRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBBZGRyZXNzRnVuYyB7XHJcblx0LyoqXHJcblx0ICogQ29tcG9zZSB0byBvbmUgbGluZSBzZXBhcmF0ZWQgYnkgY29tbWFcclxuXHQgKiBAcGFyYW0gc3QxXHJcblx0ICogQHBhcmFtIHN0MlxyXG5cdCAqIEBwYXJhbSBjaXR5XHJcblx0ICogQHBhcmFtIHN0YXRlXHJcblx0ICogQHBhcmFtIHBvc3Rjb2RlXHJcblx0ICovXHJcblx0c3RhdGljIGNvbXBvc2VPbmVMaW5lQWRkcmVzcyhzdDE6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3QyOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNpdHk6IHN0cmluZyB8IHVuZGVmaW5lZCwgc3RhdGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgcG9zdGNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gQWRkcmVzc0Z1bmMuY29tcG9zZUFkZHJlc3Moc3QxLCBzdDIsIGNpdHksIHN0YXRlLCBwb3N0Y29kZSwgJywgJyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wb3NlIHRvIG11bHRpcGxlIHNlcGFyYXRlZCBieSBcXG5cclxuXHQgKiBAcGFyYW0gc3QxXHJcblx0ICogQHBhcmFtIHN0MlxyXG5cdCAqIEBwYXJhbSBjaXR5XHJcblx0ICogQHBhcmFtIHN0YXRlXHJcblx0ICogQHBhcmFtIHBvc3Rjb2RlXHJcblx0ICovXHJcblx0c3RhdGljIGNvbXBvc2VNdWx0aUxpbmVBZGRyZXNzKHN0MTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdDI6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2l0eTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwb3N0Y29kZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBBZGRyZXNzRnVuYy5jb21wb3NlQWRkcmVzcyhzdDEsIHN0MiwgY2l0eSwgc3RhdGUsIHBvc3Rjb2RlLCAnXFxuJyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wb3NlIHdpdGggc2VwYXJhdG9yXHJcblx0ICogQHBhcmFtIHN0MVxyXG5cdCAqIEBwYXJhbSBzdDJcclxuXHQgKiBAcGFyYW0gY2l0eVxyXG5cdCAqIEBwYXJhbSBzdGF0ZVxyXG5cdCAqIEBwYXJhbSBwb3N0Y29kZVxyXG5cdCAqIEBwYXJhbSBzZXBcclxuXHQgKi9cclxuXHRzdGF0aWMgY29tcG9zZUFkZHJlc3Moc3QxOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0Mjogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHBvc3Rjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHNlcDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IHIgPSAoc3QxID8gKHN0MSArIHNlcCkgOiAnJykgKyAoc3QyID8gKHN0MiArIHNlcCkgOiAnJykgKyAoY2l0eSA/IChjaXR5ICsgc2VwKSA6ICcnKSArIChzdGF0ZSA/IChzdGF0ZSArICcgJykgOiAnJykgKyAocG9zdGNvZGUgPyBwb3N0Y29kZSA6ICcnKTtcclxuXHRcdHJldHVybiByO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGNvbXBvc2VHb29nbGVNYXBzQXVVcmwoc3QxOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0Mjogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaXR5OiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvdW50cnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcblx0XHRjb25zdCBnb29nbGVCYXNlVXJsID0gJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20uYXUvbWFwcz9obD1lbiZxPSc7XHJcblx0XHRjb25zdCBmZmYgPSAoczogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcclxuXHRcdFx0aWYgKCFzKSB7XHJcblx0XHRcdFx0cmV0dXJuICcnO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gJysnICsgZW5jb2RlVVJJQ29tcG9uZW50KHMucmVwbGFjZSgnICcsICcrJykpICsgJywnO1xyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBzcyA9IGZmZihzdDEpICsgZmZmKHN0MikgKyBmZmYoY2l0eSkgKyBmZmYoc3RhdGUpICsgZmZmKGNvdW50cnkpO1xyXG5cdFx0cmV0dXJuIGdvb2dsZUJhc2VVcmwgKyBzcztcclxuXHR9XHJcblxyXG59XHJcbiJdfQ==
@@ -1,20 +1,23 @@
1
1
  /**
2
2
  * Currency calculations. Undefined input of number is considered zero, just like null.
3
+ * Simple functions for currency before you decide to use more comprehensive ones:
4
+ * https://github.com/scurker/currency.js
5
+ * https://github.com/dinerojs/dinero.js Up to date and popular
3
6
  */
4
7
  export class CurrencyFunc {
5
8
  static DECIMAL_SEPARATOR = '.';
6
9
  static THOUSANDS_SEPARATOR = ',';
7
10
  static PADDING = '000000';
8
11
  /**
9
- *
12
+ * Banker rounding
10
13
  * @param num
11
- * @param decimalPlaces default 0
14
+ * @param decimalPlace default 0
12
15
  */
13
- static bankerRound(num, decimalPlaces) {
16
+ static bankerRound(num, decimalPlace) {
14
17
  if (!num) {
15
18
  return 0;
16
19
  }
17
- const d = decimalPlaces || 0;
20
+ const d = decimalPlace || 0;
18
21
  const m = Math.pow(10, d);
19
22
  const n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
20
23
  const i = Math.floor(n), f = n - i;
@@ -22,51 +25,60 @@ export class CurrencyFunc {
22
25
  const r = (f > 0.5 - e && f < 0.5 + e) ?
23
26
  ((i % 2 === 0) ? i : i + 1) : Math.round(n);
24
27
  return d ? r / m : r;
28
+ // http://stackoverflow.com/questions/3108986/gaussian-bankers-rounding-in-javascript
25
29
  }
30
+ /**
31
+ * Banker rounding to 5 cents
32
+ * @param num
33
+ * @returns
34
+ */
26
35
  static bankerRoundTo5cents(num) {
27
36
  if (!num) {
28
37
  return 0;
29
38
  }
30
- const r = this.bankerRound(Math.ceil(num * 20 - 0.5) / 20, 2);
39
+ const r = this.bankerRound(Math.round(num / 0.05) * 0.05, 2);
31
40
  return r;
32
41
  }
33
- static ceilTo5cents(num) {
34
- if (!num) {
35
- return 0;
36
- }
37
- const r = this.bankerRound(Math.ceil(num * 20) / 20, 4);
38
- const roundup = Math.ceil(r * 10000) / 10000;
39
- return roundup;
40
- }
41
- static transformCurrency(value, fractionSize = 2) {
42
- let [integer, fraction = ''] = (value || '').toString()
43
- .split(this.DECIMAL_SEPARATOR);
44
- fraction = fractionSize > 0
45
- ? this.DECIMAL_SEPARATOR + (fraction + this.PADDING).substring(0, fractionSize)
46
- : '';
47
- integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, this.THOUSANDS_SEPARATOR);
48
- return integer + fraction;
49
- }
50
- static parseCurrency(value, fractionSize = 2) {
51
- let [integer, fraction = ''] = (value || '').split(this.DECIMAL_SEPARATOR);
52
- integer = integer.replace(new RegExp(this.THOUSANDS_SEPARATOR, 'g'), '');
53
- fraction = parseInt(fraction, 10) > 0 && fractionSize > 0
54
- ? this.DECIMAL_SEPARATOR + (fraction + this.PADDING).substring(0, fractionSize)
55
- : '';
56
- return integer + fraction;
57
- }
42
+ // static transformCurrency(value: number | string | undefined, fractionSize: number = 2): string { In favour of dinerojs
43
+ // let [integer, fraction = ''] = (value || '').toString()
44
+ // .split(this.DECIMAL_SEPARATOR);
45
+ // fraction = fractionSize > 0
46
+ // ? this.DECIMAL_SEPARATOR + (fraction + this.PADDING).substring(0, fractionSize)
47
+ // : '';
48
+ // integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, this.THOUSANDS_SEPARATOR);
49
+ // return integer + fraction;
50
+ // }
51
+ // static parseCurrency(value: string | undefined, fractionSize: number = 2): string {
52
+ // let [integer, fraction = ''] = (value || '').split(this.DECIMAL_SEPARATOR);
53
+ // integer = integer.replace(new RegExp(this.THOUSANDS_SEPARATOR, 'g'), '');
54
+ // fraction = parseInt(fraction, 10) > 0 && fractionSize > 0
55
+ // ? this.DECIMAL_SEPARATOR + (fraction + this.PADDING).substring(0, fractionSize)
56
+ // : '';
57
+ // return integer + fraction;
58
+ // }
58
59
  //http://stackoverflow.com/questions/2998784/how-to-output-integers-with-leading-zeros-in-javascript
59
60
  static pad(num, size) {
60
- num = null;
61
- let s = num + '';
61
+ if (num == null) {
62
+ return '';
63
+ }
64
+ if (num === 0) {
65
+ return '0';
66
+ }
67
+ const numText = num.toString();
68
+ let s = numText + '';
62
69
  while (s.length < size) {
63
70
  s = '0' + s;
64
71
  }
65
72
  return s;
66
73
  }
74
+ /**
75
+ * Sum array of numbers
76
+ * @param ns
77
+ * @returns
78
+ */
67
79
  static sum(ns) {
68
80
  const r = ns.reduce((a, b) => (a ?? 0) + (b ?? 0), 0);
69
81
  return r;
70
82
  }
71
83
  }
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3lGdW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbm1jZS1mdW5jL3NyYy9fZnVuYy9jdXJyZW5jeUZ1bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNoQixNQUFNLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUM7SUFFakMsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7SUFFbEM7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBOEIsRUFBRSxhQUFzQjtRQUN4RSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixPQUFPLENBQUMsQ0FBQztRQUNWLENBQUM7UUFFRCxNQUFNLENBQUMsR0FBRyxhQUFhLElBQUksQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtRQUNuRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLGlDQUFpQztRQUNqRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQThCO1FBQ3hELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNWLE9BQU8sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQThCO1FBQ2pELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNWLE9BQU8sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM3QyxPQUFPLE9BQU8sQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQWtDLEVBQUUsZUFBdUIsQ0FBQztRQUNwRixJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7YUFDckQsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRWhDLFFBQVEsR0FBRyxZQUFZLEdBQUcsQ0FBQztZQUMxQixDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQztZQUMvRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRU4sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFN0UsT0FBTyxPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQXlCLEVBQUUsZUFBdUIsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFM0UsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXpFLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQztZQUN4RCxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQztZQUMvRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRU4sT0FBTyxPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFHRCxvR0FBb0c7SUFDcEcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUE4QixFQUFFLElBQVk7UUFFdEQsR0FBRyxHQUFHLElBQUksQ0FBQztRQUNYLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDakIsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBaUM7UUFDM0MsTUFBTSxDQUFDLEdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxDQUFDO0lBQ1YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3VycmVuY3kgY2FsY3VsYXRpb25zLiBVbmRlZmluZWQgaW5wdXQgb2YgbnVtYmVyIGlzIGNvbnNpZGVyZWQgemVybywganVzdCBsaWtlIG51bGwuXG4gKi9cbmV4cG9ydCBjbGFzcyBDdXJyZW5jeUZ1bmMge1xuXHRwcml2YXRlIHN0YXRpYyBERUNJTUFMX1NFUEFSQVRPUiA9ICcuJztcblx0cHJpdmF0ZSBzdGF0aWMgVEhPVVNBTkRTX1NFUEFSQVRPUiA9ICcsJztcblxuXHRwcml2YXRlIHN0YXRpYyBQQURESU5HID0gJzAwMDAwMCc7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBudW1cblx0ICogQHBhcmFtIGRlY2ltYWxQbGFjZXMgZGVmYXVsdCAwXG5cdCAqL1xuXHRzdGF0aWMgYmFua2VyUm91bmQobnVtOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBkZWNpbWFsUGxhY2VzPzogbnVtYmVyKTogbnVtYmVyIHsvL2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzEwODk4Ni9nYXVzc2lhbi1iYW5rZXJzLXJvdW5kaW5nLWluLWphdmFzY3JpcHRcblx0XHRpZiAoIW51bSkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZCA9IGRlY2ltYWxQbGFjZXMgfHwgMDtcblx0XHRjb25zdCBtID0gTWF0aC5wb3coMTAsIGQpO1xuXHRcdGNvbnN0IG4gPSArKGQgPyBudW0gKiBtIDogbnVtKS50b0ZpeGVkKDgpOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvcnNcblx0XHRjb25zdCBpID0gTWF0aC5mbG9vcihuKSwgZiA9IG4gLSBpO1xuXHRcdGNvbnN0IGUgPSAxZS04OyAvLyBBbGxvdyBmb3Igcm91bmRpbmcgZXJyb3JzIGluIGZcblx0XHRjb25zdCByID0gKGYgPiAwLjUgLSBlICYmIGYgPCAwLjUgKyBlKSA/XG5cdFx0XHQoKGkgJSAyID09PSAwKSA/IGkgOiBpICsgMSkgOiBNYXRoLnJvdW5kKG4pO1xuXHRcdHJldHVybiBkID8gciAvIG0gOiByO1xuXHR9XG5cblx0c3RhdGljIGJhbmtlclJvdW5kVG81Y2VudHMobnVtOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0XHRpZiAoIW51bSkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Y29uc3QgciA9IHRoaXMuYmFua2VyUm91bmQoTWF0aC5jZWlsKG51bSAqIDIwIC0gMC41KSAvIDIwLCAyKTtcblx0XHRyZXR1cm4gcjtcblx0fVxuXG5cdHN0YXRpYyBjZWlsVG81Y2VudHMobnVtOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0XHRpZiAoIW51bSkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Y29uc3QgciA9IHRoaXMuYmFua2VyUm91bmQoTWF0aC5jZWlsKG51bSAqIDIwKSAvIDIwLCA0KTtcblx0XHRjb25zdCByb3VuZHVwID0gTWF0aC5jZWlsKHIgKiAxMDAwMCkgLyAxMDAwMDtcblx0XHRyZXR1cm4gcm91bmR1cDtcblx0fVxuXG5cdHN0YXRpYyB0cmFuc2Zvcm1DdXJyZW5jeSh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBmcmFjdGlvblNpemU6IG51bWJlciA9IDIpOiBzdHJpbmcge1xuXHRcdGxldCBbaW50ZWdlciwgZnJhY3Rpb24gPSAnJ10gPSAodmFsdWUgfHwgJycpLnRvU3RyaW5nKClcblx0XHRcdC5zcGxpdCh0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SKTtcblxuXHRcdGZyYWN0aW9uID0gZnJhY3Rpb25TaXplID4gMFxuXHRcdFx0PyB0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SICsgKGZyYWN0aW9uICsgdGhpcy5QQURESU5HKS5zdWJzdHJpbmcoMCwgZnJhY3Rpb25TaXplKVxuXHRcdFx0OiAnJztcblxuXHRcdGludGVnZXIgPSBpbnRlZ2VyLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csIHRoaXMuVEhPVVNBTkRTX1NFUEFSQVRPUik7XG5cblx0XHRyZXR1cm4gaW50ZWdlciArIGZyYWN0aW9uO1xuXHR9XG5cblx0c3RhdGljIHBhcnNlQ3VycmVuY3kodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgZnJhY3Rpb25TaXplOiBudW1iZXIgPSAyKTogc3RyaW5nIHtcblx0XHRsZXQgW2ludGVnZXIsIGZyYWN0aW9uID0gJyddID0gKHZhbHVlIHx8ICcnKS5zcGxpdCh0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SKTtcblxuXHRcdGludGVnZXIgPSBpbnRlZ2VyLnJlcGxhY2UobmV3IFJlZ0V4cCh0aGlzLlRIT1VTQU5EU19TRVBBUkFUT1IsICdnJyksICcnKTtcblxuXHRcdGZyYWN0aW9uID0gcGFyc2VJbnQoZnJhY3Rpb24sIDEwKSA+IDAgJiYgZnJhY3Rpb25TaXplID4gMFxuXHRcdFx0PyB0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SICsgKGZyYWN0aW9uICsgdGhpcy5QQURESU5HKS5zdWJzdHJpbmcoMCwgZnJhY3Rpb25TaXplKVxuXHRcdFx0OiAnJztcblxuXHRcdHJldHVybiBpbnRlZ2VyICsgZnJhY3Rpb247XG5cdH1cblxuXG5cdC8vaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yOTk4Nzg0L2hvdy10by1vdXRwdXQtaW50ZWdlcnMtd2l0aC1sZWFkaW5nLXplcm9zLWluLWphdmFzY3JpcHRcblx0c3RhdGljIHBhZChudW06IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIHNpemU6IG51bWJlcik6IHN0cmluZyB7XG5cblx0XHRudW0gPSBudWxsO1xuXHRcdGxldCBzID0gbnVtICsgJyc7XG5cdFx0d2hpbGUgKHMubGVuZ3RoIDwgc2l6ZSkgeyBzID0gJzAnICsgczsgfVxuXHRcdHJldHVybiBzO1xuXHR9XG5cblx0c3RhdGljIHN1bShuczogKG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpW10pOiBudW1iZXIge1xuXHRcdGNvbnN0IHIgPSA8bnVtYmVyPm5zLnJlZHVjZSgoYSwgYikgPT4gKGEgPz8gMCkgKyAoYiA/PyAwKSwgMCk7XG5cdFx0cmV0dXJuIHI7XG5cdH1cblxufVxuIl19
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3lGdW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbm1jZS1mdW5jL3NyYy9fZnVuYy9jdXJyZW5jeUZ1bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNoQixNQUFNLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUM7SUFFakMsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7SUFFbEM7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBOEIsRUFBRSxZQUFxQjtRQUN2RSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixPQUFPLENBQUMsQ0FBQztRQUNWLENBQUM7UUFFRCxNQUFNLENBQUMsR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtRQUNuRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLGlDQUFpQztRQUNqRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixxRkFBcUY7SUFDdEYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsR0FBOEI7UUFDeEQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1YsT0FBTyxDQUFDLENBQUM7UUFDVixDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQseUhBQXlIO0lBQ3pILDJEQUEyRDtJQUMzRCxvQ0FBb0M7SUFFcEMsK0JBQStCO0lBQy9CLG9GQUFvRjtJQUNwRixVQUFVO0lBRVYsaUZBQWlGO0lBRWpGLDhCQUE4QjtJQUM5QixJQUFJO0lBRUosc0ZBQXNGO0lBQ3RGLCtFQUErRTtJQUUvRSw2RUFBNkU7SUFFN0UsNkRBQTZEO0lBQzdELG9GQUFvRjtJQUNwRixVQUFVO0lBRVYsOEJBQThCO0lBQzlCLElBQUk7SUFHSixvR0FBb0c7SUFDcEcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUE4QixFQUFFLElBQVk7UUFDdEQsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFDLENBQUM7WUFDZixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxJQUFJLEdBQUcsS0FBSSxDQUFDLEVBQUMsQ0FBQztZQUNiLE9BQU8sR0FBRyxDQUFDO1FBQ1osQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUN4QyxPQUFPLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFpQztRQUMzQyxNQUFNLENBQUMsR0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLENBQUM7SUFDVixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEN1cnJlbmN5IGNhbGN1bGF0aW9ucy4gVW5kZWZpbmVkIGlucHV0IG9mIG51bWJlciBpcyBjb25zaWRlcmVkIHplcm8sIGp1c3QgbGlrZSBudWxsLlxyXG4gKiBTaW1wbGUgZnVuY3Rpb25zIGZvciBjdXJyZW5jeSBiZWZvcmUgeW91IGRlY2lkZSB0byB1c2UgbW9yZSBjb21wcmVoZW5zaXZlIG9uZXM6XHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zY3Vya2VyL2N1cnJlbmN5LmpzXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kaW5lcm9qcy9kaW5lcm8uanMgVXAgdG8gZGF0ZSBhbmQgcG9wdWxhclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEN1cnJlbmN5RnVuYyB7XHJcblx0cHJpdmF0ZSBzdGF0aWMgREVDSU1BTF9TRVBBUkFUT1IgPSAnLic7XHJcblx0cHJpdmF0ZSBzdGF0aWMgVEhPVVNBTkRTX1NFUEFSQVRPUiA9ICcsJztcclxuXHJcblx0cHJpdmF0ZSBzdGF0aWMgUEFERElORyA9ICcwMDAwMDAnO1xyXG5cclxuXHQvKipcclxuXHQgKiBCYW5rZXIgcm91bmRpbmdcclxuXHQgKiBAcGFyYW0gbnVtXHJcblx0ICogQHBhcmFtIGRlY2ltYWxQbGFjZSBkZWZhdWx0IDBcclxuXHQgKi9cclxuXHRzdGF0aWMgYmFua2VyUm91bmQobnVtOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBkZWNpbWFsUGxhY2U/OiBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0aWYgKCFudW0pIHtcclxuXHRcdFx0cmV0dXJuIDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZCA9IGRlY2ltYWxQbGFjZSB8fCAwO1xyXG5cdFx0Y29uc3QgbSA9IE1hdGgucG93KDEwLCBkKTtcclxuXHRcdGNvbnN0IG4gPSArKGQgPyBudW0gKiBtIDogbnVtKS50b0ZpeGVkKDgpOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvcnNcclxuXHRcdGNvbnN0IGkgPSBNYXRoLmZsb29yKG4pLCBmID0gbiAtIGk7XHJcblx0XHRjb25zdCBlID0gMWUtODsgLy8gQWxsb3cgZm9yIHJvdW5kaW5nIGVycm9ycyBpbiBmXHJcblx0XHRjb25zdCByID0gKGYgPiAwLjUgLSBlICYmIGYgPCAwLjUgKyBlKSA/XHJcblx0XHRcdCgoaSAlIDIgPT09IDApID8gaSA6IGkgKyAxKSA6IE1hdGgucm91bmQobik7XHJcblx0XHRyZXR1cm4gZCA/IHIgLyBtIDogcjtcclxuXHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzEwODk4Ni9nYXVzc2lhbi1iYW5rZXJzLXJvdW5kaW5nLWluLWphdmFzY3JpcHRcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJhbmtlciByb3VuZGluZyB0byA1IGNlbnRzXHJcblx0ICogQHBhcmFtIG51bSBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgYmFua2VyUm91bmRUbzVjZW50cyhudW06IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xyXG5cdFx0aWYgKCFudW0pIHtcclxuXHRcdFx0cmV0dXJuIDA7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgciA9IHRoaXMuYmFua2VyUm91bmQoTWF0aC5yb3VuZChudW0gLyAwLjA1KSAqIDAuMDUsIDIpO1xyXG5cdFx0cmV0dXJuIHI7XHJcblx0fVxyXG5cclxuXHQvLyBzdGF0aWMgdHJhbnNmb3JtQ3VycmVuY3kodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCwgZnJhY3Rpb25TaXplOiBudW1iZXIgPSAyKTogc3RyaW5nIHsgSW4gZmF2b3VyIG9mIGRpbmVyb2pzXHJcblx0Ly8gXHRsZXQgW2ludGVnZXIsIGZyYWN0aW9uID0gJyddID0gKHZhbHVlIHx8ICcnKS50b1N0cmluZygpXHJcblx0Ly8gXHRcdC5zcGxpdCh0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SKTtcclxuXHJcblx0Ly8gXHRmcmFjdGlvbiA9IGZyYWN0aW9uU2l6ZSA+IDBcclxuXHQvLyBcdFx0PyB0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SICsgKGZyYWN0aW9uICsgdGhpcy5QQURESU5HKS5zdWJzdHJpbmcoMCwgZnJhY3Rpb25TaXplKVxyXG5cdC8vIFx0XHQ6ICcnO1xyXG5cclxuXHQvLyBcdGludGVnZXIgPSBpbnRlZ2VyLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csIHRoaXMuVEhPVVNBTkRTX1NFUEFSQVRPUik7XHJcblxyXG5cdC8vIFx0cmV0dXJuIGludGVnZXIgKyBmcmFjdGlvbjtcclxuXHQvLyB9XHJcblxyXG5cdC8vIHN0YXRpYyBwYXJzZUN1cnJlbmN5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZyYWN0aW9uU2l6ZTogbnVtYmVyID0gMik6IHN0cmluZyB7XHJcblx0Ly8gXHRsZXQgW2ludGVnZXIsIGZyYWN0aW9uID0gJyddID0gKHZhbHVlIHx8ICcnKS5zcGxpdCh0aGlzLkRFQ0lNQUxfU0VQQVJBVE9SKTtcclxuXHJcblx0Ly8gXHRpbnRlZ2VyID0gaW50ZWdlci5yZXBsYWNlKG5ldyBSZWdFeHAodGhpcy5USE9VU0FORFNfU0VQQVJBVE9SLCAnZycpLCAnJyk7XHJcblxyXG5cdC8vIFx0ZnJhY3Rpb24gPSBwYXJzZUludChmcmFjdGlvbiwgMTApID4gMCAmJiBmcmFjdGlvblNpemUgPiAwXHJcblx0Ly8gXHRcdD8gdGhpcy5ERUNJTUFMX1NFUEFSQVRPUiArIChmcmFjdGlvbiArIHRoaXMuUEFERElORykuc3Vic3RyaW5nKDAsIGZyYWN0aW9uU2l6ZSlcclxuXHQvLyBcdFx0OiAnJztcclxuXHJcblx0Ly8gXHRyZXR1cm4gaW50ZWdlciArIGZyYWN0aW9uO1xyXG5cdC8vIH1cclxuXHJcblxyXG5cdC8vaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yOTk4Nzg0L2hvdy10by1vdXRwdXQtaW50ZWdlcnMtd2l0aC1sZWFkaW5nLXplcm9zLWluLWphdmFzY3JpcHRcclxuXHRzdGF0aWMgcGFkKG51bTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRcdGlmIChudW0gPT0gbnVsbCl7XHJcblx0XHRcdCByZXR1cm4gJyc7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKG51bSA9PT0wKXtcclxuXHRcdFx0cmV0dXJuICcwJztcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBudW1UZXh0ID0gbnVtLnRvU3RyaW5nKCk7XHJcblx0XHRsZXQgcyA9IG51bVRleHQgKyAnJztcclxuXHRcdHdoaWxlIChzLmxlbmd0aCA8IHNpemUpIHsgcyA9ICcwJyArIHM7IH1cclxuXHRcdHJldHVybiBzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU3VtIGFycmF5IG9mIG51bWJlcnNcclxuXHQgKiBAcGFyYW0gbnMgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIHN1bShuczogKG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpW10pOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgciA9IDxudW1iZXI+bnMucmVkdWNlKChhLCBiKSA9PiAoYSA/PyAwKSArIChiID8/IDApLCAwKTtcclxuXHRcdHJldHVybiByO1xyXG5cdH1cclxuXHJcbn1cclxuIl19