color-util-helpers 1.0.2 → 1.0.6
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 +110 -4
- package/color-util-helpers-1.0.6.tgz +0 -0
- package/esm2022/lib/color-grab.directive.mjs +185 -0
- package/esm2022/lib/color-lighten-darken.service.mjs +79 -0
- package/esm2022/lib/color-pallette.service.mjs +24 -9
- package/esm2022/lib/color-scheme.service.mjs +113 -0
- package/esm2022/lib/color-utilities-demo/color-utilities-demo.component.mjs +41 -0
- package/esm2022/lib/color-utils.module.mjs +38 -0
- package/esm2022/lib/text-color.service.mjs +32 -11
- package/esm2022/public-api.mjs +6 -1
- package/fesm2022/color-util-helpers.mjs +528 -55
- package/fesm2022/color-util-helpers.mjs.map +1 -1
- package/lib/color-grab.directive.d.ts +31 -0
- package/lib/color-lighten-darken.service.d.ts +10 -0
- package/lib/color-pallette.service.d.ts +18 -0
- package/lib/color-scheme.service.d.ts +45 -0
- package/lib/color-utilities-demo/color-utilities-demo.component.d.ts +34 -0
- package/lib/color-utils.module.d.ts +12 -0
- package/lib/text-color.service.d.ts +3 -0
- package/package.json +1 -1
- package/public-api.d.ts +5 -0
- package/color-util-helpers-1.0.2.tgz +0 -0
package/README.md
CHANGED
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
# Color Utilities
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This lib contains a variety of very useful color utils
|
|
4
|
+
|
|
5
|
+
- Color conversion (HEX<->RGB)
|
|
6
|
+
- Generate a Color Pallette (from image - eg: Pintrest before image loads)
|
|
7
|
+
- Color Extractor Directive (from inline image - eg: Pintrest before image loads)
|
|
8
|
+
- Text Color - provides the color to use (you provide light and dark) based on color provided
|
|
9
|
+
- Color Lighten Darken - Takes a color and you can darken or lighten
|
|
10
|
+
- Generate Random Color - This function generates a random hue value between 0 and 360 degrees, and random saturation and lightness values between 50% and 100%.
|
|
11
|
+
- Color Grabber - Directive when applied to a div will get the average color of the provided url of an image and then change the background color.
|
|
12
|
+
|
|
13
|
+
## Demo
|
|
14
|
+
|
|
15
|
+
Import the `ColorUtilsModule`
|
|
16
|
+
|
|
17
|
+
add the selector `<app-color-utilities-demo></app-color-utilities-demo>`
|
|
18
|
+
|
|
19
|
+
## Color Conversion Service
|
|
4
20
|
|
|
5
21
|
Converts RGB to HEX or HEX to RGB
|
|
6
22
|
|
|
23
|
+
### Installation
|
|
24
|
+
|
|
25
|
+
npm install color-util-helpers
|
|
26
|
+
|
|
7
27
|
### Usage
|
|
8
28
|
|
|
9
29
|
rgbToHex(rgb: number[]): string
|
|
@@ -11,7 +31,11 @@ Converts RGB to HEX or HEX to RGB
|
|
|
11
31
|
hexToRgb(hex: string): string
|
|
12
32
|
|
|
13
33
|
|
|
14
|
-
## Color Pallette
|
|
34
|
+
## Color Pallette Service and Directive
|
|
35
|
+
|
|
36
|
+
### Usage
|
|
37
|
+
|
|
38
|
+
Because this is a Directive - import the `ColorExtractorDirective`
|
|
15
39
|
|
|
16
40
|
define image path
|
|
17
41
|
|
|
@@ -56,11 +80,93 @@ CSS Style
|
|
|
56
80
|
justify-content: center;
|
|
57
81
|
}
|
|
58
82
|
|
|
59
|
-
## Text Color
|
|
83
|
+
## Text Color Service
|
|
60
84
|
|
|
61
85
|
Provide a color that is used for a background and then provide the lightColor and darkColor
|
|
62
86
|
The function will return the appropriate color based on the background color provided
|
|
63
87
|
|
|
64
88
|
### Usage
|
|
65
89
|
|
|
66
|
-
|
|
90
|
+
This function takes `bgColor` and by providing the `lightColor` and `darkColor` compares them to the background and returns the color that will best work for the visibility of the background color.
|
|
91
|
+
|
|
92
|
+
These colors may be represented as RGB or HEX
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
textColorForBgColor(bgColor: string, lightColor: string, darkColor: string)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
This function takes two colors and compares them and returns the darker color.
|
|
99
|
+
The color may be represented as RGB or HEX
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
isColorDarker(color1: string, color2: string)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Color Lighten Darken Service
|
|
106
|
+
|
|
107
|
+
This function takes a color and percentage of lightness/darkness and returns the new color. The amount is a value between 0-1. This function changes the HSL of the color keeping the saturation values.
|
|
108
|
+
|
|
109
|
+
Example: .5 is 50%.
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
lighten(color: string, amount: number)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
darken(color: string, amount: number)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Generate Random Color Service
|
|
120
|
+
|
|
121
|
+
This function takes a color '#3498db' and lightens the color by 20% and also darkens the color by 20%.
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
const color = '#3498db'; // Your color
|
|
125
|
+
const lighterColor = lighten(color, 0.2); // 20% lighter
|
|
126
|
+
const darkerColor = darken(color, 0.2); // 20% darker
|
|
127
|
+
|
|
128
|
+
console.log(lighterColor, darkerColor);
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
# Color Grabber
|
|
132
|
+
|
|
133
|
+
This Angular Directive when applied to a div will get the average color of the provided url of an image and then change the background color to that color. Any test inside the div will be colored white or black based on the average color of the image that best suites it.
|
|
134
|
+
|
|
135
|
+
## Usage
|
|
136
|
+
|
|
137
|
+
Because this is a Directive - import the `ColorUtilitiesModule`
|
|
138
|
+
In the following example, the mat-card container has the `colorGrab` directive applied.
|
|
139
|
+
|
|
140
|
+
The `[imageUrl]="image"` is the image to grab the color from.
|
|
141
|
+
|
|
142
|
+
The `[light]="'#FFFFFF'"` is the light color to use if the average color is dark.
|
|
143
|
+
The `[dark]="'#000000'"` is the dark color to use if the average color is light.
|
|
144
|
+
|
|
145
|
+
The mat-card contaner background color will change to this color
|
|
146
|
+
|
|
147
|
+
The Text inside this container will also change ether to black or white depending what suites best based on that colors image.
|
|
148
|
+
|
|
149
|
+
To use in the directive, use the following
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
image = "https://picsum.photos/id/1/5616/3744"
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
<mat-card style="margin: 8px;"
|
|
157
|
+
colorGrab [imageUrl]="image" [light]="'rgb(220, 220, 220)'" [dark]="'rgb(47, 79, 79)'"
|
|
158
|
+
class="box"
|
|
159
|
+
>
|
|
160
|
+
<h3>{{ item.author }}</h3>
|
|
161
|
+
<img [src]="image" width="160" height="120" style="object-fit: cover;">
|
|
162
|
+
</mat-card>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Paramiter
|
|
166
|
+
|
|
167
|
+
> imageUrl - provide the full URL of the image (png, jpg)
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
colorGrab [imageUrl]="item.download_url"
|
|
171
|
+
```
|
|
172
|
+
|
|
Binary file
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { Directive, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class ColorGrabberDirective {
|
|
4
|
+
constructor(el) {
|
|
5
|
+
this.el = el;
|
|
6
|
+
}
|
|
7
|
+
ngOnInit() {
|
|
8
|
+
const canvas = document.createElement('canvas');
|
|
9
|
+
canvas.width = 1;
|
|
10
|
+
canvas.height = 1;
|
|
11
|
+
this.ctx = canvas.getContext('2d');
|
|
12
|
+
const img = new Image();
|
|
13
|
+
img.src = this.imageUrl || '';
|
|
14
|
+
img.setAttribute('crossOrigin', '');
|
|
15
|
+
img.onload = () => {
|
|
16
|
+
this.ctx?.drawImage(img, 0, 0, 1, 1);
|
|
17
|
+
const imageData = this.ctx?.getImageData(0, 0, 1, 1);
|
|
18
|
+
if (imageData && imageData.data) {
|
|
19
|
+
const i = imageData.data;
|
|
20
|
+
const rgbColor = `rgba(${i[0]},${i[1]},${i[2]},${i[3]})`;
|
|
21
|
+
const hexColor = "#" + ((1 << 24) + (i[0] << 16) + (i[1] << 8) + i[2]).toString(16).slice(1);
|
|
22
|
+
const textColor = this.textColorBasedOnBgColor(hexColor, this.light, this.dark);
|
|
23
|
+
const hsv = this.RGB2HSV({ r: i[0], g: i[1], b: i[2] });
|
|
24
|
+
hsv.hue = this.HueShift(hsv.hue, 135.0);
|
|
25
|
+
const secondaryColor = this.HSV2RGB(hsv);
|
|
26
|
+
const highlightColor = this.lightenDarkenColor(secondaryColor.hex, 50);
|
|
27
|
+
this.el.nativeElement.style.backgroundColor = rgbColor;
|
|
28
|
+
this.el.nativeElement.style.color = textColor;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.error("Failed to get image data.");
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
textColorBasedOnBgColor(bgColor, lightColor = '#FFFFFF', darkColor = '#000000') {
|
|
36
|
+
const color = (bgColor.charAt(0) === '#') ? bgColor.substring(1, 7) : bgColor;
|
|
37
|
+
const r = parseInt(color.substring(0, 2), 16); // hexToR
|
|
38
|
+
const g = parseInt(color.substring(2, 4), 16); // hexToG
|
|
39
|
+
const b = parseInt(color.substring(4, 6), 16); // hexToB
|
|
40
|
+
const uicolors = [r / 255, g / 255, b / 255];
|
|
41
|
+
const c = uicolors.map((col) => {
|
|
42
|
+
if (col <= 0.03928)
|
|
43
|
+
return col / 12.92;
|
|
44
|
+
return Math.pow((col + 0.055) / 1.055, 2.4);
|
|
45
|
+
});
|
|
46
|
+
const L = (0.2126 * c[0]) + (0.7152 * c[1]) + (0.0722 * c[2]);
|
|
47
|
+
return (L > 0.179) ? darkColor : lightColor;
|
|
48
|
+
}
|
|
49
|
+
RGB2HSV(rgb) {
|
|
50
|
+
const hsv = { saturation: 0, hue: 0, value: 0 };
|
|
51
|
+
const max = this.max3(rgb.r, rgb.g, rgb.b);
|
|
52
|
+
const dif = max - this.min3(rgb.r, rgb.g, rgb.b);
|
|
53
|
+
hsv.saturation = (max == 0.0) ? 0 : (100 * dif / max);
|
|
54
|
+
if (hsv.saturation == 0) {
|
|
55
|
+
hsv.hue = 0;
|
|
56
|
+
}
|
|
57
|
+
else if (rgb.r == max) {
|
|
58
|
+
hsv.hue = 60.0 * (rgb.g - rgb.b) / dif;
|
|
59
|
+
}
|
|
60
|
+
else if (rgb.g == max) {
|
|
61
|
+
hsv.hue = 120.0 + 60.0 * (rgb.b - rgb.r) / dif;
|
|
62
|
+
}
|
|
63
|
+
else if (rgb.b == max) {
|
|
64
|
+
hsv.hue = 240.0 + 60.0 * (rgb.r - rgb.g) / dif;
|
|
65
|
+
}
|
|
66
|
+
if (hsv.hue < 0.0)
|
|
67
|
+
hsv.hue += 360.0;
|
|
68
|
+
hsv.value = Math.round(max * 100 / 255);
|
|
69
|
+
hsv.hue = Math.round(hsv.hue);
|
|
70
|
+
hsv.saturation = Math.round(hsv.saturation);
|
|
71
|
+
return hsv;
|
|
72
|
+
}
|
|
73
|
+
HSV2RGB(hsv) {
|
|
74
|
+
const rgb = { r: 0, g: 0, b: 0 };
|
|
75
|
+
if (hsv.saturation == 0) {
|
|
76
|
+
rgb.r = rgb.g = rgb.b = Math.round(hsv.value * 2.55);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
hsv.hue /= 60;
|
|
80
|
+
hsv.saturation /= 100;
|
|
81
|
+
hsv.value /= 100;
|
|
82
|
+
const i = Math.floor(hsv.hue);
|
|
83
|
+
const f = hsv.hue - i;
|
|
84
|
+
const p = hsv.value * (1 - hsv.saturation);
|
|
85
|
+
const q = hsv.value * (1 - hsv.saturation * f);
|
|
86
|
+
const t = hsv.value * (1 - hsv.saturation * (1 - f));
|
|
87
|
+
switch (i) {
|
|
88
|
+
case 0:
|
|
89
|
+
rgb.r = hsv.value;
|
|
90
|
+
rgb.g = t;
|
|
91
|
+
rgb.b = p;
|
|
92
|
+
break;
|
|
93
|
+
case 1:
|
|
94
|
+
rgb.r = q;
|
|
95
|
+
rgb.g = hsv.value;
|
|
96
|
+
rgb.b = p;
|
|
97
|
+
break;
|
|
98
|
+
case 2:
|
|
99
|
+
rgb.r = p;
|
|
100
|
+
rgb.g = hsv.value;
|
|
101
|
+
rgb.b = t;
|
|
102
|
+
break;
|
|
103
|
+
case 3:
|
|
104
|
+
rgb.r = p;
|
|
105
|
+
rgb.g = q;
|
|
106
|
+
rgb.b = hsv.value;
|
|
107
|
+
break;
|
|
108
|
+
case 4:
|
|
109
|
+
rgb.r = t;
|
|
110
|
+
rgb.g = p;
|
|
111
|
+
rgb.b = hsv.value;
|
|
112
|
+
break;
|
|
113
|
+
default:
|
|
114
|
+
rgb.r = hsv.value;
|
|
115
|
+
rgb.g = p;
|
|
116
|
+
rgb.b = q;
|
|
117
|
+
}
|
|
118
|
+
rgb.r = Math.round(rgb.r * 255);
|
|
119
|
+
rgb.g = Math.round(rgb.g * 255);
|
|
120
|
+
rgb.b = Math.round(rgb.b * 255);
|
|
121
|
+
}
|
|
122
|
+
const rgbColor = `rgba(${rgb.r},${rgb.g},${rgb.b},${1})`;
|
|
123
|
+
const hexColor = "#" + ((1 << 24) + (rgb.r << 16) + (rgb.g << 8) + rgb.b).toString(16).slice(1);
|
|
124
|
+
return { rgb: rgbColor, hex: hexColor };
|
|
125
|
+
}
|
|
126
|
+
HueShift(h, s) {
|
|
127
|
+
h += s;
|
|
128
|
+
while (h >= 360.0)
|
|
129
|
+
h -= 360.0;
|
|
130
|
+
while (h < 0.0)
|
|
131
|
+
h += 360.0;
|
|
132
|
+
return h;
|
|
133
|
+
}
|
|
134
|
+
min3(a, b, c) {
|
|
135
|
+
return (a < b) ? ((a < c) ? a : c) : ((b < c) ? b : c);
|
|
136
|
+
}
|
|
137
|
+
max3(a, b, c) {
|
|
138
|
+
return (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
|
|
139
|
+
}
|
|
140
|
+
lightenDarkenColor(colorCode, amount) {
|
|
141
|
+
var usePound = false;
|
|
142
|
+
if (colorCode[0] == "#") {
|
|
143
|
+
colorCode = colorCode.slice(1);
|
|
144
|
+
usePound = true;
|
|
145
|
+
}
|
|
146
|
+
var num = parseInt(colorCode, 16);
|
|
147
|
+
var r = (num >> 16) + amount;
|
|
148
|
+
if (r > 255) {
|
|
149
|
+
r = 255;
|
|
150
|
+
}
|
|
151
|
+
else if (r < 0) {
|
|
152
|
+
r = 0;
|
|
153
|
+
}
|
|
154
|
+
var b = ((num >> 8) & 0x00FF) + amount;
|
|
155
|
+
if (b > 255) {
|
|
156
|
+
b = 255;
|
|
157
|
+
}
|
|
158
|
+
else if (b < 0) {
|
|
159
|
+
b = 0;
|
|
160
|
+
}
|
|
161
|
+
var g = (num & 0x0000FF) + amount;
|
|
162
|
+
if (g > 255) {
|
|
163
|
+
g = 255;
|
|
164
|
+
}
|
|
165
|
+
else if (g < 0) {
|
|
166
|
+
g = 0;
|
|
167
|
+
}
|
|
168
|
+
return (usePound ? "#" : "") + (g | (b << 8) | (r << 16)).toString(16);
|
|
169
|
+
}
|
|
170
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorGrabberDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
171
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ColorGrabberDirective, selector: "[colorGrabber]", inputs: { imageUrl: "imageUrl", light: "light", dark: "dark" }, ngImport: i0 }); }
|
|
172
|
+
}
|
|
173
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorGrabberDirective, decorators: [{
|
|
174
|
+
type: Directive,
|
|
175
|
+
args: [{
|
|
176
|
+
selector: '[colorGrabber]'
|
|
177
|
+
}]
|
|
178
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { imageUrl: [{
|
|
179
|
+
type: Input
|
|
180
|
+
}], light: [{
|
|
181
|
+
type: Input
|
|
182
|
+
}], dark: [{
|
|
183
|
+
type: Input
|
|
184
|
+
}] } });
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItZ3JhYi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2xvci11dGlscy9zcmMvbGliL2NvbG9yLWdyYWIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQUtyRSxNQUFNLE9BQU8scUJBQXFCO0lBUWhDLFlBQW9CLEVBQWM7UUFBZCxPQUFFLEdBQUYsRUFBRSxDQUFZO0lBQUksQ0FBQztJQUV2QyxRQUFRO1FBRU4sTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNqQixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVsQixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUE2QixDQUFDO1FBRS9ELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEIsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUM5QixHQUFHLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVwQyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFckQsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksRUFB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Z0JBQUUsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFBO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFFN0MsQ0FBQyxDQUFDLENBQUE7UUFFRixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUU3RCxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtJQUU3QyxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQThCO1FBRXBDLE1BQU0sR0FBRyxHQUFHLEVBQUUsVUFBVSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQTtRQUU3QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM5QyxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFFLEdBQUcsQ0FBQyxDQUFBLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFBLENBQUMsR0FBRyxHQUFDLEdBQUcsR0FBQyxHQUFHLENBQUMsQ0FBQTtRQUUzQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLEdBQUcsQ0FB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QUFHLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUVsQyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUU7WUFDVCxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQ1g7YUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1Q7UUFFRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRXhFLENBQUM7K0dBcE1VLHFCQUFxQjttR0FBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQUhqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCO2lHQUtVLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY29sb3JHcmFiYmVyXSdcbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JHcmFiYmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcblxuICBjdHg/OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRcblxuICBASW5wdXQoKSBpbWFnZVVybD86IHN0cmluZ1xuICBASW5wdXQoKSBsaWdodD86IHN0cmluZ1xuICBASW5wdXQoKSBkYXJrPzogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSAxO1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuXG4gICAgdGhpcy5jdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhcyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICBpbWcuc3JjID0gdGhpcy5pbWFnZVVybCB8fCAnJztcbiAgICBpbWcuc2V0QXR0cmlidXRlKCdjcm9zc09yaWdpbicsICcnKTtcblxuICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmN0eD8uZHJhd0ltYWdlKGltZywgMCwgMCwgMSwgMSk7XG4gICAgICBjb25zdCBpbWFnZURhdGEgPSB0aGlzLmN0eD8uZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpO1xuXG4gICAgICBpZiAoaW1hZ2VEYXRhICYmIGltYWdlRGF0YS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IGkgPSBpbWFnZURhdGEuZGF0YTtcblxuICAgICAgICBjb25zdCByZ2JDb2xvciA9IGByZ2JhKCR7aVswXX0sJHtpWzFdfSwke2lbMl19LCR7aVszXX0pYDtcbiAgICAgICAgY29uc3QgaGV4Q29sb3IgPSBcIiNcIiArICgoMSA8PCAyNCkgKyAoaVswXSA8PCAxNikgKyAoaVsxXSA8PCA4KSArIGlbMl0pLnRvU3RyaW5nKDE2KS5zbGljZSgxKTtcblxuICAgICAgICBjb25zdCB0ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvckJhc2VkT25CZ0NvbG9yKGhleENvbG9yLCB0aGlzLmxpZ2h0LCB0aGlzLmRhcmspO1xuXG4gICAgICAgIGNvbnN0IGhzdiA9IHRoaXMuUkdCMkhTVih7IHI6IGlbMF0sIGc6IGlbMV0sIGI6IGlbMl0gfSk7XG4gICAgICAgIGhzdi5odWUgPSB0aGlzLkh1ZVNoaWZ0KGhzdi5odWUsIDEzNS4wKTtcblxuICAgICAgICBjb25zdCBzZWNvbmRhcnlDb2xvciA9IHRoaXMuSFNWMlJHQihoc3YpO1xuICAgICAgICBjb25zdCBoaWdobGlnaHRDb2xvciA9IHRoaXMubGlnaHRlbkRhcmtlbkNvbG9yKHNlY29uZGFyeUNvbG9yLmhleCwgNTApO1xuXG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSByZ2JDb2xvcjtcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLmNvbG9yID0gdGV4dENvbG9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBnZXQgaW1hZ2UgZGF0YS5cIik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHRleHRDb2xvckJhc2VkT25CZ0NvbG9yKFxuICAgIGJnQ29sb3I6IHN0cmluZyxcbiAgICBsaWdodENvbG9yOiBzdHJpbmcgPSAnI0ZGRkZGRicsXG4gICAgZGFya0NvbG9yOiBzdHJpbmcgPSAnIzAwMDAwMCdcbiAgICApIHtcblxuICAgIGNvbnN0IGNvbG9yID0gKGJnQ29sb3IuY2hhckF0KDApID09PSAnIycpID8gYmdDb2xvci5zdWJzdHJpbmcoMSwgNykgOiBiZ0NvbG9yXG5cbiAgICBjb25zdCByID0gcGFyc2VJbnQoY29sb3Iuc3Vic3RyaW5nKDAsIDIpLCAxNikgLy8gaGV4VG9SXG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGNvbG9yLnN1YnN0cmluZygyLCA0KSwgMTYpIC8vIGhleFRvR1xuICAgIGNvbnN0IGIgPSBwYXJzZUludChjb2xvci5zdWJzdHJpbmcoNCwgNiksIDE2KSAvLyBoZXhUb0JcblxuICAgIGNvbnN0IHVpY29sb3JzID0gW3IgLyAyNTUsIGcgLyAyNTUsIGIgLyAyNTVdXG5cbiAgICBjb25zdCBjID0gdWljb2xvcnMubWFwKChjb2wpID0+IHtcblxuICAgICAgaWYgKGNvbCA8PSAwLjAzOTI4KSByZXR1cm4gY29sIC8gMTIuOTJcbiAgICAgIHJldHVybiBNYXRoLnBvdygoY29sICsgMC4wNTUpIC8gMS4wNTUsIDIuNClcblxuICAgIH0pXG5cbiAgICBjb25zdCBMID0gKDAuMjEyNiAqIGNbMF0pICsgKDAuNzE1MiAqIGNbMV0pICsgKDAuMDcyMiAqIGNbMl0pXG5cbiAgICByZXR1cm4gKEwgPiAwLjE3OSkgPyBkYXJrQ29sb3IgOiBsaWdodENvbG9yXG5cbiAgfVxuXG4gIFJHQjJIU1YocmdiOiB7IHI6IGFueSwgZzogYW55LCBiOiBhbnl9KSB7XG5cbiAgICBjb25zdCBoc3YgPSB7IHNhdHVyYXRpb246MCwgaHVlOjAsIHZhbHVlOiAwIH1cblxuICAgIGNvbnN0IG1heCA9IHRoaXMubWF4MyhyZ2IucixyZ2IuZyxyZ2IuYilcbiAgICBjb25zdCBkaWYgPSBtYXggLSB0aGlzLm1pbjMocmdiLnIscmdiLmcscmdiLmIpXG4gICAgaHN2LnNhdHVyYXRpb24gPSAobWF4PT0wLjApPzA6KDEwMCpkaWYvbWF4KVxuXG4gICAgaWYgKGhzdi5zYXR1cmF0aW9uID09IDApIHtcbiAgICAgIGhzdi5odWU9MFxuICAgIH0gZWxzZSBpZiAocmdiLnIgPT0gbWF4KSB7XG4gICAgICBoc3YuaHVlPTYwLjAqKHJnYi5nLXJnYi5iKS9kaWZcbiAgICB9IGVsc2UgaWYgKHJnYi5nID09IG1heCkge1xuICAgICAgaHN2Lmh1ZT0xMjAuMCs2MC4wKihyZ2IuYi1yZ2IucikvZGlmXG4gICAgfSBlbHNlIGlmIChyZ2IuYiA9PSBtYXgpIHtcbiAgICAgIGhzdi5odWU9MjQwLjArNjAuMCoocmdiLnItcmdiLmcpL2RpZlxuICAgIH1cblxuICAgIGlmIChoc3YuaHVlPDAuMCkgaHN2Lmh1ZSs9MzYwLjBcblxuICAgIGhzdi52YWx1ZSA9IE1hdGgucm91bmQobWF4KjEwMC8yNTUpXG4gICAgaHN2Lmh1ZSA9IE1hdGgucm91bmQoaHN2Lmh1ZSlcbiAgICBoc3Yuc2F0dXJhdGlvbiA9IE1hdGgucm91bmQoaHN2LnNhdHVyYXRpb24pXG5cbiAgICByZXR1cm4gaHN2XG4gIH1cblxuICBIU1YyUkdCKGhzdjogYW55KSB7XG5cbiAgICBjb25zdCByZ2IgPSB7IHI6IDAsIGc6IDAsIGI6IDB9XG5cbiAgICBpZiAoaHN2LnNhdHVyYXRpb249PTApIHtcbiAgICAgIHJnYi5yID0gcmdiLmcgPSByZ2IuYiA9IE1hdGgucm91bmQoaHN2LnZhbHVlKjIuNTUpXG4gICAgfSBlbHNlIHtcblxuICAgICAgaHN2Lmh1ZS89NjBcbiAgICAgIGhzdi5zYXR1cmF0aW9uLz0xMDBcbiAgICAgIGhzdi52YWx1ZS89MTAwXG4gICAgICBjb25zdCBpID0gTWF0aC5mbG9vcihoc3YuaHVlKVxuICAgICAgY29uc3QgZiA9IGhzdi5odWUtaVxuXG4gICAgICBjb25zdCBwID0gaHN2LnZhbHVlKigxLWhzdi5zYXR1cmF0aW9uKVxuICAgICAgY29uc3QgcSA9IGhzdi52YWx1ZSooMS1oc3Yuc2F0dXJhdGlvbipmKVxuICAgICAgY29uc3QgdCA9IGhzdi52YWx1ZSooMS1oc3Yuc2F0dXJhdGlvbiooMS1mKSlcblxuICAgICAgc3dpdGNoKGkpIHtcblxuICAgICAgY2FzZSAwOiByZ2Iucj1oc3YudmFsdWU7IHJnYi5nPXQ7IHJnYi5iPXA7IGJyZWFrXG4gICAgICBjYXNlIDE6IHJnYi5yPXE7IHJnYi5nPWhzdi52YWx1ZTsgcmdiLmI9cDsgYnJlYWtcbiAgICAgIGNhc2UgMjogcmdiLnI9cDsgcmdiLmc9aHN2LnZhbHVlOyByZ2IuYj10OyBicmVha1xuICAgICAgY2FzZSAzOiByZ2Iucj1wOyByZ2IuZz1xOyByZ2IuYj1oc3YudmFsdWU7IGJyZWFrXG4gICAgICBjYXNlIDQ6IHJnYi5yPXQ7IHJnYi5nPXA7IHJnYi5iPWhzdi52YWx1ZTsgYnJlYWtcblxuICAgICAgZGVmYXVsdDogcmdiLnI9aHN2LnZhbHVlOyByZ2IuZz1wOyByZ2IuYj1xXG5cbiAgICAgIH1cblxuICAgICAgcmdiLnIgPSBNYXRoLnJvdW5kKHJnYi5yKjI1NSlcbiAgICAgIHJnYi5nID0gTWF0aC5yb3VuZChyZ2IuZyoyNTUpXG4gICAgICByZ2IuYiA9IE1hdGgucm91bmQocmdiLmIqMjU1KVxuXG4gICAgfVxuXG4gICAgY29uc3QgcmdiQ29sb3IgPSBgcmdiYSgke3JnYi5yfSwke3JnYi5nfSwke3JnYi5ifSwkezF9KWBcbiAgICBjb25zdCBoZXhDb2xvciA9IFwiI1wiICsgKCgxIDw8IDI0KSArIChyZ2IuciA8PCAxNikgKyAocmdiLmcgPDwgOCkgKyByZ2IuYikudG9TdHJpbmcoMTYpLnNsaWNlKDEpXG5cbiAgICByZXR1cm4geyByZ2I6IHJnYkNvbG9yLCBoZXg6IGhleENvbG9yIH1cbiAgfVxuXG4gIEh1ZVNoaWZ0KGg6IGFueSwgczogYW55KSB7XG4gICAgaCArPSBzXG4gICAgd2hpbGUgKGg+PTM2MC4wKSBoLT0zNjAuMFxuICAgIHdoaWxlIChoPDAuMCkgaCs9MzYwLjBcbiAgICByZXR1cm4gaFxuICB9XG5cbiAgbWluMyhhOiBhbnksIGI6IGFueSwgYzogYW55KSB7XG4gICAgcmV0dXJuIChhPGIpPygoYTxjKT9hOmMpOigoYjxjKT9iOmMpXG4gIH1cblxuICBtYXgzKGE6IGFueSwgYjogYW55LCBjOiBhbnkpIHtcbiAgICByZXR1cm4gKGE+Yik/KChhPmMpP2E6Yyk6KChiPmMpP2I6YylcbiAgfVxuXG4gIGxpZ2h0ZW5EYXJrZW5Db2xvcihjb2xvckNvZGU6IGFueSwgYW1vdW50OiBudW1iZXIpIHtcblxuICAgIHZhciB1c2VQb3VuZCA9IGZhbHNlO1xuXG4gICAgaWYgKGNvbG9yQ29kZVswXSA9PSBcIiNcIikge1xuICAgICAgICBjb2xvckNvZGUgPSBjb2xvckNvZGUuc2xpY2UoMSk7XG4gICAgICAgIHVzZVBvdW5kID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbnVtID0gcGFyc2VJbnQoY29sb3JDb2RlLCAxNik7XG5cbiAgICB2YXIgciA9IChudW0gPj4gMTYpICsgYW1vdW50O1xuXG4gICAgaWYgKHIgPiAyNTUpIHtcbiAgICAgICAgciA9IDI1NTtcbiAgICB9IGVsc2UgaWYgKHIgPCAwKSB7XG4gICAgICAgIHIgPSAwO1xuICAgIH1cblxuICAgIHZhciBiID0gKChudW0gPj4gOCkgJiAweDAwRkYpICsgYW1vdW50O1xuXG4gICAgaWYgKGIgPiAyNTUpIHtcbiAgICAgICAgYiA9IDI1NTtcbiAgICB9IGVsc2UgaWYgKGIgPCAwKSB7XG4gICAgICAgIGIgPSAwO1xuICAgIH1cblxuICAgIHZhciBnID0gKG51bSAmIDB4MDAwMEZGKSArIGFtb3VudDtcblxuICAgIGlmIChnID4gMjU1KSB7XG4gICAgICAgIGcgPSAyNTU7XG4gICAgfSBlbHNlIGlmIChnIDwgMCkge1xuICAgICAgICBnID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKHVzZVBvdW5kID8gXCIjXCIgOiBcIlwiKSArIChnIHwgKGIgPDwgOCkgfCAociA8PCAxNikpLnRvU3RyaW5nKDE2KVxuXG4gIH1cblxufVxuIl19
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { TextColorService } from './text-color.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class ColorLightenDarkenService {
|
|
5
|
+
// const color = '#3498db'; // Your color
|
|
6
|
+
// const lighterColor = lighten(color, 0.2); // 20% lighter
|
|
7
|
+
// const darkerColor = darken(color, 0.2); // 20% darker
|
|
8
|
+
// console.log(lighterColor, darkerColor);
|
|
9
|
+
constructor() {
|
|
10
|
+
this.colors = inject(TextColorService);
|
|
11
|
+
}
|
|
12
|
+
lighten(color, amount) {
|
|
13
|
+
const rgb = this.colors.fixColor(color);
|
|
14
|
+
// const rgb = color.match(/\w\w/g)?.map((x) => parseInt(x, 16)) || [];
|
|
15
|
+
// Convert RGB to HSL
|
|
16
|
+
let [r, g, b] = rgb.map((c) => c / 255);
|
|
17
|
+
const max = Math.max(r, g, b), min = Math.min(r, g, b);
|
|
18
|
+
let h = 0, s = 0, l = (max + min) / 2;
|
|
19
|
+
if (max !== min) {
|
|
20
|
+
const d = max - min;
|
|
21
|
+
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
22
|
+
switch (max) {
|
|
23
|
+
case r:
|
|
24
|
+
h = (g - b) / d + (g < b ? 6 : 0);
|
|
25
|
+
break;
|
|
26
|
+
case g:
|
|
27
|
+
h = (b - r) / d + 2;
|
|
28
|
+
break;
|
|
29
|
+
case b:
|
|
30
|
+
h = (r - g) / d + 4;
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
h /= 6;
|
|
34
|
+
}
|
|
35
|
+
// Modify the lightness and clamp it to [0, 1]
|
|
36
|
+
l = Math.min(1, l + amount);
|
|
37
|
+
// Convert HSL back to RGB
|
|
38
|
+
if (s === 0) {
|
|
39
|
+
r = g = b = l; // achromatic
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const hue2rgb = (p, q, t) => {
|
|
43
|
+
if (t < 0)
|
|
44
|
+
t += 1;
|
|
45
|
+
if (t > 1)
|
|
46
|
+
t -= 1;
|
|
47
|
+
if (t < 1 / 6)
|
|
48
|
+
return p + (q - p) * 6 * t;
|
|
49
|
+
if (t < 1 / 2)
|
|
50
|
+
return q;
|
|
51
|
+
if (t < 2 / 3)
|
|
52
|
+
return p + (q - p) * (2 / 3 - t) * 6;
|
|
53
|
+
return p;
|
|
54
|
+
};
|
|
55
|
+
const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
|
|
56
|
+
const p = 2 * l - q;
|
|
57
|
+
r = hue2rgb(p, q, h + 1 / 3);
|
|
58
|
+
g = hue2rgb(p, q, h);
|
|
59
|
+
b = hue2rgb(p, q, h - 1 / 3);
|
|
60
|
+
}
|
|
61
|
+
// Convert RGB back to hexadecimal color
|
|
62
|
+
const toHex = (x) => Math.round(x * 255)
|
|
63
|
+
.toString(16)
|
|
64
|
+
.padStart(2, '0');
|
|
65
|
+
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
66
|
+
}
|
|
67
|
+
darken(color, amount) {
|
|
68
|
+
return this.lighten(color, -amount);
|
|
69
|
+
}
|
|
70
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorLightenDarkenService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
71
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorLightenDarkenService, providedIn: 'root' }); }
|
|
72
|
+
}
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ColorLightenDarkenService, decorators: [{
|
|
74
|
+
type: Injectable,
|
|
75
|
+
args: [{
|
|
76
|
+
providedIn: 'root'
|
|
77
|
+
}]
|
|
78
|
+
}], ctorParameters: function () { return []; } });
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItbGlnaHRlbi1kYXJrZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbG9yLXV0aWxzL3NyYy9saWIvY29sb3ItbGlnaHRlbi1kYXJrZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFLeEQsTUFBTSxPQUFPLHlCQUF5QjtJQUlwQyx5Q0FBeUM7SUFDekMsMkRBQTJEO0lBQzNELDBEQUEwRDtJQUUxRCwwQ0FBMEM7SUFFNUM7UUFSRSxXQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFRbkIsQ0FBQztJQUVmLE9BQU8sQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUVuQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2Qyx1RUFBdUU7UUFFdkUscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUNQLENBQUMsR0FBRyxDQUFDLEVBQ0wsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0QixJQUFJLEdBQUcsS0FBSyxHQUFHLEVBQUU7WUFDZixNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1lBQ3BCLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDcEQsUUFBUSxHQUFHLEVBQUU7Z0JBQ1gsS0FBSyxDQUFDO29CQUNKLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsQyxNQUFNO2dCQUNSLEtBQUssQ0FBQztvQkFDSixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDcEIsTUFBTTtnQkFDUixLQUFLLENBQUM7b0JBQ0osQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3BCLE1BQU07YUFDVDtZQUNELENBQUMsSUFBSSxDQUFDLENBQUM7U0FDUjtRQUVELDhDQUE4QztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRTVCLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDWCxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhO1NBQzdCO2FBQU07WUFDTCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxHQUFHLENBQUM7b0JBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztvQkFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztvQkFBRSxPQUFPLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7b0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEQsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDLENBQUM7WUFDRixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQixDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM3QixDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFFRCx3Q0FBd0M7UUFDeEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDaEIsUUFBUSxDQUFDLEVBQUUsQ0FBQzthQUNaLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNsQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQzsrR0ExRVUseUJBQXlCO21IQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs7NEZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGV4dENvbG9yU2VydmljZSB9IGZyb20gJy4vdGV4dC1jb2xvci5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ29sb3JMaWdodGVuRGFya2VuU2VydmljZSB7XG5cbiAgY29sb3JzID0gaW5qZWN0KFRleHRDb2xvclNlcnZpY2UpXG5cbiAgLy8gY29uc3QgY29sb3IgPSAnIzM0OThkYic7IC8vIFlvdXIgY29sb3JcbiAgLy8gY29uc3QgbGlnaHRlckNvbG9yID0gbGlnaHRlbihjb2xvciwgMC4yKTsgLy8gMjAlIGxpZ2h0ZXJcbiAgLy8gY29uc3QgZGFya2VyQ29sb3IgPSBkYXJrZW4oY29sb3IsIDAuMik7ICAgLy8gMjAlIGRhcmtlclxuXG4gIC8vIGNvbnNvbGUubG9nKGxpZ2h0ZXJDb2xvciwgZGFya2VyQ29sb3IpO1xuXG5jb25zdHJ1Y3RvcigpIHsgfVxuXG4gIGxpZ2h0ZW4oY29sb3I6IHN0cmluZywgYW1vdW50OiBudW1iZXIpIHtcblxuICAgIGNvbnN0IHJnYiA9IHRoaXMuY29sb3JzLmZpeENvbG9yKGNvbG9yKVxuICAgIC8vIGNvbnN0IHJnYiA9IGNvbG9yLm1hdGNoKC9cXHdcXHcvZyk/Lm1hcCgoeCkgPT4gcGFyc2VJbnQoeCwgMTYpKSB8fCBbXTtcblxuICAgIC8vIENvbnZlcnQgUkdCIHRvIEhTTFxuICAgIGxldCBbciwgZywgYl0gPSByZ2IubWFwKChjKSA9PiBjIC8gMjU1KTtcbiAgICBjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuICAgIGxldCBoID0gMCxcbiAgICAgIHMgPSAwLFxuICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjtcblxuICAgIGlmIChtYXggIT09IG1pbikge1xuICAgICAgY29uc3QgZCA9IG1heCAtIG1pbjtcbiAgICAgIHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKTtcbiAgICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICAgIGNhc2UgcjpcbiAgICAgICAgICBoID0gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgZzpcbiAgICAgICAgICBoID0gKGIgLSByKSAvIGQgKyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGI6XG4gICAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGggLz0gNjtcbiAgICB9XG5cbiAgICAvLyBNb2RpZnkgdGhlIGxpZ2h0bmVzcyBhbmQgY2xhbXAgaXQgdG8gWzAsIDFdXG4gICAgbCA9IE1hdGgubWluKDEsIGwgKyBhbW91bnQpO1xuXG4gICAgLy8gQ29udmVydCBIU0wgYmFjayB0byBSR0JcbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgciA9IGcgPSBiID0gbDsgLy8gYWNocm9tYXRpY1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBodWUycmdiID0gKHA6IG51bWJlciwgcTogbnVtYmVyLCB0OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHQgPCAwKSB0ICs9IDE7XG4gICAgICAgIGlmICh0ID4gMSkgdCAtPSAxO1xuICAgICAgICBpZiAodCA8IDEgLyA2KSByZXR1cm4gcCArIChxIC0gcCkgKiA2ICogdDtcbiAgICAgICAgaWYgKHQgPCAxIC8gMikgcmV0dXJuIHE7XG4gICAgICAgIGlmICh0IDwgMiAvIDMpIHJldHVybiBwICsgKHEgLSBwKSAqICgyIC8gMyAtIHQpICogNjtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgICB9O1xuICAgICAgY29uc3QgcSA9IGwgPCAwLjUgPyBsICogKDEgKyBzKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICBjb25zdCBwID0gMiAqIGwgLSBxO1xuICAgICAgciA9IGh1ZTJyZ2IocCwgcSwgaCArIDEgLyAzKTtcbiAgICAgIGcgPSBodWUycmdiKHAsIHEsIGgpO1xuICAgICAgYiA9IGh1ZTJyZ2IocCwgcSwgaCAtIDEgLyAzKTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IFJHQiBiYWNrIHRvIGhleGFkZWNpbWFsIGNvbG9yXG4gICAgY29uc3QgdG9IZXggPSAoeDogbnVtYmVyKSA9PlxuICAgICAgTWF0aC5yb3VuZCh4ICogMjU1KVxuICAgICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAgIC5wYWRTdGFydCgyLCAnMCcpO1xuICAgIHJldHVybiBgIyR7dG9IZXgocil9JHt0b0hleChnKX0ke3RvSGV4KGIpfWA7XG4gIH1cblxuICBkYXJrZW4oY29sb3I6IHN0cmluZywgYW1vdW50OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5saWdodGVuKGNvbG9yLCAtYW1vdW50KTtcbiAgfVxuXG59XG4iXX0=
|
|
@@ -40,7 +40,15 @@ export class ColorPalletteService {
|
|
|
40
40
|
// justify-content: center;
|
|
41
41
|
// }
|
|
42
42
|
this.palette = new BehaviorSubject([]);
|
|
43
|
+
this.palette$ = this.palette.asObservable();
|
|
43
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Retrieves a color palette from an image at the specified path.
|
|
47
|
+
*
|
|
48
|
+
* @param imagePath - The path to the image to extract the color palette from.
|
|
49
|
+
* @param colors - The number of colors to include in the palette (default is 3).
|
|
50
|
+
* @returns An observable that emits the generated color palette.
|
|
51
|
+
*/
|
|
44
52
|
getColorsFromImage(imagePath, colors = 3) {
|
|
45
53
|
const image = new Image();
|
|
46
54
|
image.src = imagePath;
|
|
@@ -49,10 +57,17 @@ export class ColorPalletteService {
|
|
|
49
57
|
this.palette.next(data);
|
|
50
58
|
};
|
|
51
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Generates a color palette from an image.
|
|
62
|
+
*
|
|
63
|
+
* @param image - The HTML image element to extract the color palette from.
|
|
64
|
+
* @param colorCount - The number of colors to include in the palette (default is 6).
|
|
65
|
+
* @returns An array of color objects, each with a hex color and a complementary hex color.
|
|
66
|
+
*/
|
|
52
67
|
generateColorPalette(image, colorCount = 6) {
|
|
53
|
-
const canvas = document.createElement(
|
|
54
|
-
const context = canvas.getContext(
|
|
55
|
-
if (!context
|
|
68
|
+
const canvas = document.createElement("canvas");
|
|
69
|
+
const context = canvas.getContext("2d");
|
|
70
|
+
if (!context)
|
|
56
71
|
return;
|
|
57
72
|
canvas.width = image.width;
|
|
58
73
|
canvas.height = image.height;
|
|
@@ -78,8 +93,8 @@ export class ColorPalletteService {
|
|
|
78
93
|
const luminance2 = this.getLuminance(color2);
|
|
79
94
|
return luminance2 - luminance1;
|
|
80
95
|
});
|
|
81
|
-
const palette = quantizedColors.map(color => {
|
|
82
|
-
const complementaryColor = color.map(component => 255 - component);
|
|
96
|
+
const palette = quantizedColors.map((color) => {
|
|
97
|
+
const complementaryColor = color.map((component) => 255 - component);
|
|
83
98
|
const hexColor = this.colorConversionService.rgbToHex(color);
|
|
84
99
|
const hexComplementaryColor = this.colorConversionService.rgbToHex(complementaryColor);
|
|
85
100
|
return { color: hexColor, complementaryColor: hexComplementaryColor };
|
|
@@ -114,12 +129,12 @@ export class ColorPalletteService {
|
|
|
114
129
|
return [meanR, meanG, meanB];
|
|
115
130
|
}
|
|
116
131
|
kMeansColorQuantization(colors, k) {
|
|
117
|
-
|
|
132
|
+
let clusterCenters = [];
|
|
118
133
|
for (let i = 0; i < k; i++) {
|
|
119
134
|
const randomColor = colors[Math.floor(Math.random() * colors.length)];
|
|
120
135
|
clusterCenters.push(randomColor);
|
|
121
136
|
}
|
|
122
|
-
|
|
137
|
+
let clusters = [];
|
|
123
138
|
for (let i = 0; i < colors.length; i++) {
|
|
124
139
|
const color = colors[i];
|
|
125
140
|
let minDistance = Infinity;
|
|
@@ -134,7 +149,7 @@ export class ColorPalletteService {
|
|
|
134
149
|
}
|
|
135
150
|
clusters.push({ color, center: nearestCenter });
|
|
136
151
|
}
|
|
137
|
-
|
|
152
|
+
let updatedCenters = [];
|
|
138
153
|
for (let i = 0; i < clusterCenters.length; i++) {
|
|
139
154
|
const center = clusterCenters[i];
|
|
140
155
|
const clusterColors = clusters.filter(c => c.center === center).map(c => c.color);
|
|
@@ -154,4 +169,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
154
169
|
providedIn: 'root'
|
|
155
170
|
}]
|
|
156
171
|
}], ctorParameters: function () { return [{ type: i1.ColorConversionService }]; } });
|
|
157
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGFsbGV0dGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbG9yLXV0aWxzL3NyYy9saWIvY29sb3ItcGFsbGV0dGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUE7OztBQU10QyxNQUFNLE9BQU8sb0JBQW9CO0lBMEMvQixZQUNVLHNCQUE4QztRQUE5QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBekN4RCxvQkFBb0I7UUFDcEIseUVBQXlFO1FBRXpFLGFBQWE7UUFDYiw0RUFBNEU7UUFFNUUsY0FBYztRQUNkLHdDQUF3QztRQUN4QyxtQ0FBbUM7UUFDbkMsZUFBZTtRQUNmLDBCQUEwQjtRQUMxQixxREFBcUQ7UUFDckQsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLDBCQUEwQjtRQUMxQixrRUFBa0U7UUFDbEUsWUFBWTtRQUNaLHdCQUF3QjtRQUN4QixpQkFBaUI7UUFDakIsYUFBYTtRQUNiLFNBQVM7UUFFVCxNQUFNO1FBQ04sV0FBVztRQUNYLG9CQUFvQjtRQUNwQixxQkFBcUI7UUFDckIsZ0NBQWdDO1FBQ2hDLG9CQUFvQjtRQUNwQixtQkFBbUI7UUFDbkIscUJBQXFCO1FBQ3JCLHFCQUFxQjtRQUNyQix1QkFBdUI7UUFDdkIsNkJBQTZCO1FBQzdCLCtCQUErQjtRQUMvQixJQUFJO1FBRUksWUFBTyxHQUFHLElBQUksZUFBZSxDQUFrRCxFQUFFLENBQUMsQ0FBQTtJQUl0RixDQUFDO0lBRUwsa0JBQWtCLENBQUMsU0FBaUIsRUFBRSxNQUFNLEdBQUcsQ0FBQztRQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFBO1FBQ3pCLEtBQUssQ0FBQyxHQUFHLEdB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QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgeyBDb2xvckNvbnZlcnNpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb2xvci1jb252ZXJzaW9uLnNlcnZpY2UnXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb2xvclBhbGxldHRlU2VydmljZSB7XHJcblxyXG4gIC8vIGRlZmluZSBpbWFnZSBwYXRoXHJcbiAgLy8gdGhpcy5jb2xvclNlbGVjdGlvblNlcnZpY2UuZ2V0Q29sb3JzRnJvbUltYWdlKCcuLi9hc3NldHMvc2FtcGxlMi5qcGcnKVxyXG5cclxuICAvLyBnZXQgY29sb3JzXHJcbiAgLy8gdGhpcy5jb2xvclNlbGVjdGlvblNlcnZpY2UucGFsZXR0ZS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnBhbGV0dGUgPSBkYXRhKVxyXG5cclxuICAvLyBzYW1wbGUgaHRtbFxyXG4gIC8vICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sb3Igb2YgcGFsZXR0ZVwiPlxyXG4gIC8vICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cclxuICAvLyAgICAgICAgIDxkaXZcclxuICAvLyAgICAgICAgICAgICBjbGFzcz1cImJveFwiXHJcbiAgLy8gICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY29sb3IuY29sb3JcIlxyXG4gIC8vICAgICAgICAgPlxyXG4gIC8vICAgICAgICAgQ29sb3JcclxuICAvLyAgICAgICAgIDwvZGl2PlxyXG4gIC8vICAgICAgICAgPGRpdlxyXG4gIC8vICAgICAgICAgICAgIGNsYXNzPVwiYm94XCJcclxuICAvLyAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJjb2xvci5jb21wbGVtZW50YXJ5Q29sb3JcIlxyXG4gIC8vICAgICAgICAgPlxyXG4gIC8vICAgICAgICAgQ29tcGxlbWVudGFyeVxyXG4gIC8vICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgIDwvZGl2PlxyXG4gIC8vIDwvZGl2PlxyXG5cclxuICAvLyBDU1NcclxuICAvLyAgIC5ib3gge1xyXG4gIC8vICAgICB3aWR0aDogMTAwcHg7XHJcbiAgLy8gICAgIGhlaWdodDogMTAwcHg7XHJcbiAgLy8gICAgIGJvcmRlcjogc29saWQgdGhpbiBibGFjaztcclxuICAvLyAgICAgY29sb3I6IGJsYWNrO1xyXG4gIC8vICAgICBtYXJnaW46IDRweDtcclxuICAvLyAgICAgcGFkZGluZzogMTZweDtcclxuICAvLyAgICAgZGlzcGxheTogZmxleDtcclxuICAvLyAgICAgZmxleC13cmFwOiB3cmFwO1xyXG4gIC8vICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XHJcbiAgLy8gICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBwYWxldHRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IGNvbG9yOiBzdHJpbmcsIGNvbXBsZW1lbnRhcnlDb2xvcjogc3RyaW5nIH1bXT4oW10pXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjb2xvckNvbnZlcnNpb25TZXJ2aWNlOiBDb2xvckNvbnZlcnNpb25TZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgZ2V0Q29sb3JzRnJvbUltYWdlKGltYWdlUGF0aDogc3RyaW5nLCBjb2xvcnMgPSAzKSB7XHJcblxyXG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKVxyXG4gICAgaW1hZ2Uuc3JjID0gaW1hZ2VQYXRoXHJcblxyXG4gICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5nZW5lcmF0ZUNvbG9yUGFsZXR0ZShpbWFnZSwgY29sb3JzKSB8fCBbXVxyXG4gICAgICB0aGlzLnBhbGV0dGUubmV4dChkYXRhKVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGdlbmVyYXRlQ29sb3JQYWxldHRlKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50LCBjb2xvckNvdW50ID0gNikge1xyXG5cclxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcclxuXHJcbiAgICBpZighY29udGV4dCB8fCAhaW1hZ2UpIHJldHVyblxyXG5cclxuICAgIGNhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoXHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0XHJcbiAgICBjb250ZXh0LmRyYXdJbWFnZShpbWFnZSwgMCwgMClcclxuXHJcbiAgICAvLyBHZXQgdGhlIGltYWdlIGRhdGFcclxuICAgIGNvbnN0IGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodClcclxuICAgIGNvbnN0IHBpeGVscyA9IGltYWdlRGF0YS5kYXRhXHJcbiAgICBjb25zdCBwaXhlbENvdW50ID0gaW1hZ2VEYXRhLndpZHRoICogaW1hZ2VEYXRhLmhlaWdodFxyXG5cclxuICAgIC8vIEJ1aWxkIGFuIGFycmF5IG9mIFJHQiBjb2xvcnNcclxuICAgIGNvbnN0IGNvbG9ycyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBpeGVsQ291bnQ7IGkrKykge1xyXG4gICAgICBjb25zdCBvZmZzZXQgPSBpICogNFxyXG4gICAgICBjb25zdCByID0gcGl4ZWxzW29mZnNldF1cclxuICAgICAgY29uc3QgZyA9IHBpeGVsc1tvZmZzZXQgKyAxXVxyXG4gICAgICBjb25zdCBiID0gcGl4ZWxzW29mZnNldCArIDJdXHJcbiAgICAgIGNvbG9ycy5wdXNoKFtyLCBnLCBiXSlcclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBjb2xvciBxdWFudGl6YXRpb24gdXNpbmcgay1tZWFucyBjbHVzdGVyaW5nXHJcbiAgICBjb25zdCBxdWFudGl6ZWRDb2xvcnMgPSB0aGlzLmtNZWFuc0NvbG9yUXVhbnRpemF0aW9uKGNvbG9ycywgY29sb3JDb3VudClcclxuXHJcbiAgICAvLyBPcmRlciBjb2xvcnMgYnkgbHVtaW5hbmNlXHJcbiAgICBxdWFudGl6ZWRDb2xvcnMuc29ydCgoY29sb3IxLCBjb2xvcjIpID0+IHtcclxuICAgICAgY29uc3QgbHVtaW5hbmNlMSA9IHRoaXMuZ2V0THVtaW5hbmNlKGNvbG9yMSlcclxuICAgICAgY29uc3QgbHVtaW5hbmNlMiA9IHRoaXMuZ2V0THVtaW5hbmNlKGNvbG9yMilcclxuICAgICAgcmV0dXJuIGx1bWluYW5jZTIgLSBsdW1pbmFuY2UxXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IHBhbGV0dGUgPSBxdWFudGl6ZWRDb2xvcnMubWFwKGNvbG9yID0+IHtcclxuICAgICAgY29uc3QgY29tcGxlbWVudGFyeUNvbG9yID0gY29sb3IubWFwKGNvbXBvbmVudCA9PiAyNTUgLSBjb21wb25lbnQpXHJcbiAgICAgIGNvbnN0IGhleENvbG9yID0gdGhpcy5jb2xvckNvbnZlcnNpb25TZXJ2aWNlLnJnYlRvSGV4KGNvbG9yKVxyXG4gICAgICBjb25zdCBoZXhDb21wbGVtZW50YXJ5Q29sb3IgPSB0aGlzLmNvbG9yQ29udmVyc2lvblNlcnZpY2UucmdiVG9IZXgoY29tcGxlbWVudGFyeUNvbG9yKVxyXG4gICAgICByZXR1cm4geyBjb2xvcjogaGV4Q29sb3IsIGNvbXBsZW1lbnRhcnlDb2xvcjogaGV4Q29tcGxlbWVudGFyeUNvbG9yIH1cclxuICAgIH0pXHJcblxyXG4gICAgcmV0dXJuIHBhbGV0dGVcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0THVtaW5hbmNlKGNvbG9yOiBudW1iZXJbXSkge1xyXG4gICAgY29uc3QgW3IsIGcsIGJdID0gY29sb3JcclxuICAgIHJldHVybiAwLjI5OSAqIHIgKyAwLjU4NyAqIGcgKyAwLjExNCAqIGJcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlQ29sb3JEaXN0YW5jZShjb2xvcjE6IG51bWJlcltdLCBjb2xvcjI6IG51bWJlcltdKSB7XHJcbiAgICBjb25zdCBbcjEsIGcxLCBiMV0gPSBjb2xvcjFcclxuICAgIGNvbnN0IFtyMiwgZzIsIGIyXSA9IGNvbG9yMlxyXG4gICAgY29uc3QgZHIgPSByMiAtIHIxXHJcbiAgICBjb25zdCBkZyA9IGcyIC0gZzFcclxuICAgIGNvbnN0IGRiID0gYjIgLSBiMVxyXG4gICAgcmV0dXJuIE1hdGguc3FydChkciAqIGRyICsgZGcgKiBkZyArIGRiICogZGIpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZU1lYW5Db2xvcihjb2xvcnM6IG51bWJlcltdW10pIHtcclxuICAgIGxldCBzdW1SID0gMFxyXG4gICAgbGV0IHN1bUcgPSAwXHJcbiAgICBsZXQgc3VtQiA9IDBcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IFtyLCBnLCBiXSA9IGNvbG9yc1tpXVxyXG4gICAgICBzdW1SICs9IHJcclxuICAgICAgc3VtRyArPSBnXHJcbiAgICAgIHN1bUIgKz0gYlxyXG4gICAgfVxyXG4gICAgY29uc3QgbWVhblIgPSBNYXRoLnJvdW5kKHN1bVIgLyBjb2xvcnMubGVuZ3RoKVxyXG4gICAgY29uc3QgbWVhbkcgPSBNYXRoLnJvdW5kKHN1bUcgLyBjb2xvcnMubGVuZ3RoKVxyXG4gICAgY29uc3QgbWVhbkIgPSBNYXRoLnJvdW5kKHN1bUIgLyBjb2xvcnMubGVuZ3RoKVxyXG4gICAgcmV0dXJuIFttZWFuUiwgbWVhbkcsIG1lYW5CXVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBrTWVhbnNDb2xvclF1YW50aXphdGlvbihjb2xvcnM6IG51bWJlcltdW10sIGs6IG51bWJlcikge1xyXG4gICAgY29uc3QgY2x1c3RlckNlbnRlcnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrOyBpKyspIHtcclxuICAgICAgY29uc3QgcmFuZG9tQ29sb3IgPSBjb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29sb3JzLmxlbmd0aCldXHJcbiAgICAgIGNsdXN0ZXJDZW50ZXJzLnB1c2gocmFuZG9tQ29sb3IpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2x1c3RlcnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY29sb3IgPSBjb2xvcnNbaV1cclxuICAgICAgbGV0IG1pbkRpc3RhbmNlID0gSW5maW5pdHlcclxuICAgICAgbGV0IG5lYXJlc3RDZW50ZXIgPSBudWxsXHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2x1c3RlckNlbnRlcnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBjb25zdCBjZW50ZXIgPSBjbHVzdGVyQ2VudGVyc1tqXVxyXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gdGhpcy5jYWxjdWxhdGVDb2xvckRpc3RhbmNlKGNvbG9yLCBjZW50ZXIpXHJcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcclxuICAgICAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2VcclxuICAgICAgICAgIG5lYXJlc3RDZW50ZXIgPSBjZW50ZXJcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2x1c3RlcnMucHVzaCh7IGNvbG9yLCBjZW50ZXI6IG5lYXJlc3RDZW50ZXIgfSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkQ2VudGVycyA9IFtdXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJDZW50ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNlbnRlciA9IGNsdXN0ZXJDZW50ZXJzW2ldXHJcbiAgICAgIGNvbnN0IGNsdXN0ZXJDb2xvcnMgPSBjbHVzdGVycy5maWx0ZXIoYyA9PiBjLmNlbnRlciA9PT0gY2VudGVyKS5tYXAoYyA9PiBjLmNvbG9yKVxyXG4gICAgICBpZiAoY2x1c3RlckNvbG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgdXBkYXRlZENlbnRlciA9IHRoaXMuY2FsY3VsYXRlTWVhbkNvbG9yKGNsdXN0ZXJDb2xvcnMpXHJcbiAgICAgICAgdXBkYXRlZENlbnRlcnMucHVzaCh1cGRhdGVkQ2VudGVyKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVwZGF0ZWRDZW50ZXJzXHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGFsbGV0dGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbG9yLXV0aWxzL3NyYy9saWIvY29sb3ItcGFsbGV0dGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUE7OztBQU10QyxNQUFNLE9BQU8sb0JBQW9CO0lBMkMvQixZQUNVLHNCQUE4QztRQUE5QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBMUN4RCxvQkFBb0I7UUFDcEIseUVBQXlFO1FBRXpFLGFBQWE7UUFDYiw0RUFBNEU7UUFFNUUsY0FBYztRQUNkLHdDQUF3QztRQUN4QyxtQ0FBbUM7UUFDbkMsZUFBZTtRQUNmLDBCQUEwQjtRQUMxQixxREFBcUQ7UUFDckQsWUFBWTtRQUNaLGdCQUFnQjtRQUNoQixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLDBCQUEwQjtRQUMxQixrRUFBa0U7UUFDbEUsWUFBWTtRQUNaLHdCQUF3QjtRQUN4QixpQkFBaUI7UUFDakIsYUFBYTtRQUNiLFNBQVM7UUFFVCxNQUFNO1FBQ04sV0FBVztRQUNYLG9CQUFvQjtRQUNwQixxQkFBcUI7UUFDckIsZ0NBQWdDO1FBQ2hDLG9CQUFvQjtRQUNwQixtQkFBbUI7UUFDbkIscUJBQXFCO1FBQ3JCLHFCQUFxQjtRQUNyQix1QkFBdUI7UUFDdkIsNkJBQTZCO1FBQzdCLCtCQUErQjtRQUMvQixJQUFJO1FBRUksWUFBTyxHQUFHLElBQUksZUFBZSxDQUFrRCxFQUFFLENBQUMsQ0FBQTtRQUMxRixhQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQTtJQUlsQyxDQUFDO0lBRUw7Ozs7OztPQU1HO0lBQ0gsa0JBQWtCLENBQUMsU0FBaUIsRUFBRSxNQUFNLEdBQUcsQ0FB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QUU7WUFDdEMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzNCLElBQUksSUFBSSxDQUFDLENBQUE7WUFDVCxJQUFJLElBQUksQ0FBQyxDQUFBO1lBQ1QsSUFBSSxJQUFJLENBQUMsQ0FBQTtTQUNWO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDOUMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUVPLHVCQUF1QixDQUFDLE1BQWtCLEVBQUUsQ0FBUztRQUMzRCxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUE7UUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7WUFDckUsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtTQUNqQztRQUVELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQTtRQUNqQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdkIsSUFBSSxXQUFXLEdBQUcsUUFBUSxDQUFBO1lBQzFCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQTtZQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDOUMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO2dCQUMzRCxJQUFJLFFBQVEsR0FBRyxXQUFXLEVBQUU7b0JBQzFCLFdBQVcsR0FBRyxRQUFRLENBQUE7b0JBQ3RCLGFBQWEsR0FBRyxNQUFNLENBQUE7aUJBQ3ZCO2FBQ0Y7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFBO1NBQ2hEO1FBRUQsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFBO1FBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNoQyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDakYsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFBO2dCQUM1RCxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO2FBQ25DO1NBQ0Y7UUFFRCxPQUFPLGNBQWMsQ0FBQTtJQUN2QixDQUFDOytHQXJMVSxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnXHJcbmltcG9ydCB7IENvbG9yQ29udmVyc2lvblNlcnZpY2UgfSBmcm9tICcuL2NvbG9yLWNvbnZlcnNpb24uc2VydmljZSdcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENvbG9yUGFsbGV0dGVTZXJ2aWNlIHtcclxuXHJcbiAgLy8gZGVmaW5lIGltYWdlIHBhdGhcclxuICAvLyB0aGlzLmNvbG9yU2VsZWN0aW9uU2VydmljZS5nZXRDb2xvcnNGcm9tSW1hZ2UoJy4uL2Fzc2V0cy9zYW1wbGUyLmpwZycpXHJcblxyXG4gIC8vIGdldCBjb2xvcnNcclxuICAvLyB0aGlzLmNvbG9yU2VsZWN0aW9uU2VydmljZS5wYWxldHRlLnN1YnNjcmliZShkYXRhID0+IHRoaXMucGFsZXR0ZSA9IGRhdGEpXHJcblxyXG4gIC8vIHNhbXBsZSBodG1sXHJcbiAgLy8gICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2xvciBvZiBwYWxldHRlXCI+XHJcbiAgLy8gICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxyXG4gIC8vICAgICAgICAgPGRpdlxyXG4gIC8vICAgICAgICAgICAgIGNsYXNzPVwiYm94XCJcclxuICAvLyAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJjb2xvci5jb2xvclwiXHJcbiAgLy8gICAgICAgICA+XHJcbiAgLy8gICAgICAgICBDb2xvclxyXG4gIC8vICAgICAgICAgPC9kaXY+XHJcbiAgLy8gICAgICAgICA8ZGl2XHJcbiAgLy8gICAgICAgICAgICAgY2xhc3M9XCJib3hcIlxyXG4gIC8vICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImNvbG9yLmNvbXBsZW1lbnRhcnlDb2xvclwiXHJcbiAgLy8gICAgICAgICA+XHJcbiAgLy8gICAgICAgICBDb21wbGVtZW50YXJ5XHJcbiAgLy8gICAgICAgICA8L2Rpdj5cclxuICAvLyAgICAgPC9kaXY+XHJcbiAgLy8gPC9kaXY+XHJcblxyXG4gIC8vIENTU1xyXG4gIC8vICAgLmJveCB7XHJcbiAgLy8gICAgIHdpZHRoOiAxMDBweDtcclxuICAvLyAgICAgaGVpZ2h0OiAxMDBweDtcclxuICAvLyAgICAgYm9yZGVyOiBzb2xpZCB0aGluIGJsYWNrO1xyXG4gIC8vICAgICBjb2xvcjogYmxhY2s7XHJcbiAgLy8gICAgIG1hcmdpbjogNHB4O1xyXG4gIC8vICAgICBwYWRkaW5nOiAxNnB4O1xyXG4gIC8vICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gIC8vICAgICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgLy8gICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAvLyAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIHBhbGV0dGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHsgY29sb3I6IHN0cmluZywgY29tcGxlbWVudGFyeUNvbG9yOiBzdHJpbmcgfVtdPihbXSlcclxuICBwYWxldHRlJCA9IHRoaXMucGFsZXR0ZS5hc09ic2VydmFibGUoKVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29sb3JDb252ZXJzaW9uU2VydmljZTogQ29sb3JDb252ZXJzaW9uU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlcyBhIGNvbG9yIHBhbGV0dGUgZnJvbSBhbiBpbWFnZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaW1hZ2VQYXRoIC0gVGhlIHBhdGggdG8gdGhlIGltYWdlIHRvIGV4dHJhY3QgdGhlIGNvbG9yIHBhbGV0dGUgZnJvbS5cclxuICAgKiBAcGFyYW0gY29sb3JzIC0gVGhlIG51bWJlciBvZiBjb2xvcnMgdG8gaW5jbHVkZSBpbiB0aGUgcGFsZXR0ZSAoZGVmYXVsdCBpcyAzKS5cclxuICAgKiBAcmV0dXJucyBBbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGdlbmVyYXRlZCBjb2xvciBwYWxldHRlLlxyXG4gICAqL1xyXG4gIGdldENvbG9yc0Zyb21JbWFnZShpbWFnZVBhdGg6IHN0cmluZywgY29sb3JzID0gMykge1xyXG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgIGltYWdlLnNyYyA9IGltYWdlUGF0aDtcclxuXHJcbiAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdlbmVyYXRlQ29sb3JQYWxldHRlKGltYWdlLCBjb2xvcnMpIHx8IFtdO1xyXG4gICAgICB0aGlzLnBhbGV0dGUubmV4dChkYXRhKTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgYSBjb2xvciBwYWxldHRlIGZyb20gYW4gaW1hZ2UuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaW1hZ2UgLSBUaGUgSFRNTCBpbWFnZSBlbGVtZW50IHRvIGV4dHJhY3QgdGhlIGNvbG9yIHBhbGV0dGUgZnJvbS5cclxuICAgKiBAcGFyYW0gY29sb3JDb3VudCAtIFRoZSBudW1iZXIgb2YgY29sb3JzIHRvIGluY2x1ZGUgaW4gdGhlIHBhbGV0dGUgKGRlZmF1bHQgaXMgNikuXHJcbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgY29sb3Igb2JqZWN0cywgZWFjaCB3aXRoIGEgaGV4IGNvbG9yIGFuZCBhIGNvbXBsZW1lbnRhcnkgaGV4IGNvbG9yLlxyXG4gICAqL1xyXG4gIGdlbmVyYXRlQ29sb3JQYWxldHRlKGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50LCBjb2xvckNvdW50ID0gNikge1xyXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG5cclxuICAgIGlmICghY29udGV4dCkgcmV0dXJuO1xyXG5cclxuICAgIGNhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoO1xyXG4gICAgY2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcclxuICAgIGNvbnRleHQuZHJhd0ltYWdlKGltYWdlLCAwLCAwKTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIGltYWdlIGRhdGFcclxuICAgIGNvbnN0IGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XHJcbiAgICBjb25zdCBwaXhlbHMgPSBpbWFnZURhdGEuZGF0YTtcclxuICAgIGNvbnN0IHBpeGVsQ291bnQgPSBpbWFnZURhdGEud2lkdGggKiBpbWFnZURhdGEuaGVpZ2h0O1xyXG5cclxuICAgIC8vIEJ1aWxkIGFuIGFycmF5IG9mIFJHQiBjb2xvcnNcclxuICAgIGNvbnN0IGNvbG9ycyA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwaXhlbENvdW50OyBpKyspIHtcclxuICAgICAgY29uc3Qgb2Zmc2V0ID0gaSAqIDQ7XHJcbiAgICAgIGNvbnN0IHIgPSBwaXhlbHNbb2Zmc2V0XTtcclxuICAgICAgY29uc3QgZyA9IHBpeGVsc1tvZmZzZXQgKyAxXTtcclxuICAgICAgY29uc3QgYiA9IHBpeGVsc1tvZmZzZXQgKyAyXTtcclxuICAgICAgY29sb3JzLnB1c2goW3IsIGcsIGJdKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBjb2xvciBxdWFudGl6YXRpb24gdXNpbmcgay1tZWFucyBjbHVzdGVyaW5nXHJcbiAgICBjb25zdCBxdWFudGl6ZWRDb2xvcnMgPSB0aGlzLmtNZWFuc0NvbG9yUXVhbnRpemF0aW9uKGNvbG9ycywgY29sb3JDb3VudCk7XHJcblxyXG4gICAgLy8gT3JkZXIgY29sb3JzIGJ5IGx1bWluYW5jZVxyXG4gICAgcXVhbnRpemVkQ29sb3JzLnNvcnQoKGNvbG9yMSwgY29sb3IyKSA9PiB7XHJcbiAgICAgIGNvbnN0IGx1bWluYW5jZTEgPSB0aGlzLmdldEx1bWluYW5jZShjb2xvcjEpO1xyXG4gICAgICBjb25zdCBsdW1pbmFuY2UyID0gdGhpcy5nZXRMdW1pbmFuY2UoY29sb3IyKTtcclxuICAgICAgcmV0dXJuIGx1bWluYW5jZTIgLSBsdW1pbmFuY2UxO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgcGFsZXR0ZSA9IHF1YW50aXplZENvbG9ycy5tYXAoKGNvbG9yKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbXBsZW1lbnRhcnlDb2xvciA9IGNvbG9yLm1hcCgoY29tcG9uZW50KSA9PiAyNTUgLSBjb21wb25lbnQpO1xyXG4gICAgICBjb25zdCBoZXhDb2xvciA9IHRoaXMuY29sb3JDb252ZXJzaW9uU2VydmljZS5yZ2JUb0hleChjb2xvcik7XHJcbiAgICAgIGNvbnN0IGhleENvbXBsZW1lbnRhcnlDb2xvciA9XHJcbiAgICAgICAgdGhpcy5jb2xvckNvbnZlcnNpb25TZXJ2aWNlLnJnYlRvSGV4KGNvbXBsZW1lbnRhcnlDb2xvcik7XHJcbiAgICAgIHJldHVybiB7IGNvbG9yOiBoZXhDb2xvciwgY29tcGxlbWVudGFyeUNvbG9yOiBoZXhDb21wbGVtZW50YXJ5Q29sb3IgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBwYWxldHRlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMdW1pbmFuY2UoY29sb3I6IG51bWJlcltdKSB7XHJcbiAgICBjb25zdCBbciwgZywgYl0gPSBjb2xvclxyXG4gICAgcmV0dXJuIDAuMjk5ICogciArIDAuNTg3ICogZyArIDAuMTE0ICogYlxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVDb2xvckRpc3RhbmNlKGNvbG9yMTogbnVtYmVyW10sIGNvbG9yMjogbnVtYmVyW10pIHtcclxuICAgIGNvbnN0IFtyMSwgZzEsIGIxXSA9IGNvbG9yMVxyXG4gICAgY29uc3QgW3IyLCBnMiwgYjJdID0gY29sb3IyXHJcbiAgICBjb25zdCBkciA9IHIyIC0gcjFcclxuICAgIGNvbnN0IGRnID0gZzIgLSBnMVxyXG4gICAgY29uc3QgZGIgPSBiMiAtIGIxXHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KGRyICogZHIgKyBkZyAqIGRnICsgZGIgKiBkYilcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlTWVhbkNvbG9yKGNvbG9yczogbnVtYmVyW11bXSkge1xyXG4gICAgbGV0IHN1bVIgPSAwXHJcbiAgICBsZXQgc3VtRyA9IDBcclxuICAgIGxldCBzdW1CID0gMFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgW3IsIGcsIGJdID0gY29sb3JzW2ldXHJcbiAgICAgIHN1bVIgKz0gclxyXG4gICAgICBzdW1HICs9IGdcclxuICAgICAgc3VtQiArPSBiXHJcbiAgICB9XHJcbiAgICBjb25zdCBtZWFuUiA9IE1hdGgucm91bmQoc3VtUiAvIGNvbG9ycy5sZW5ndGgpXHJcbiAgICBjb25zdCBtZWFuRyA9IE1hdGgucm91bmQoc3VtRyAvIGNvbG9ycy5sZW5ndGgpXHJcbiAgICBjb25zdCBtZWFuQiA9IE1hdGgucm91bmQoc3VtQiAvIGNvbG9ycy5sZW5ndGgpXHJcbiAgICByZXR1cm4gW21lYW5SLCBtZWFuRywgbWVhbkJdXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGtNZWFuc0NvbG9yUXVhbnRpemF0aW9uKGNvbG9yczogbnVtYmVyW11bXSwgazogbnVtYmVyKSB7XHJcbiAgICBsZXQgY2x1c3RlckNlbnRlcnMgPSBbXVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrOyBpKyspIHtcclxuICAgICAgY29uc3QgcmFuZG9tQ29sb3IgPSBjb2xvcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY29sb3JzLmxlbmd0aCldXHJcbiAgICAgIGNsdXN0ZXJDZW50ZXJzLnB1c2gocmFuZG9tQ29sb3IpXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGNsdXN0ZXJzID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNvbG9yID0gY29sb3JzW2ldXHJcbiAgICAgIGxldCBtaW5EaXN0YW5jZSA9IEluZmluaXR5XHJcbiAgICAgIGxldCBuZWFyZXN0Q2VudGVyID0gbnVsbFxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNsdXN0ZXJDZW50ZXJzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgY29uc3QgY2VudGVyID0gY2x1c3RlckNlbnRlcnNbal1cclxuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMuY2FsY3VsYXRlQ29sb3JEaXN0YW5jZShjb2xvciwgY2VudGVyKVxyXG4gICAgICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7XHJcbiAgICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlXHJcbiAgICAgICAgICBuZWFyZXN0Q2VudGVyID0gY2VudGVyXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNsdXN0ZXJzLnB1c2goeyBjb2xvciwgY2VudGVyOiBuZWFyZXN0Q2VudGVyIH0pXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHVwZGF0ZWRDZW50ZXJzID0gW11cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlckNlbnRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2VudGVyID0gY2x1c3RlckNlbnRlcnNbaV1cclxuICAgICAgY29uc3QgY2x1c3RlckNvbG9ycyA9IGNsdXN0ZXJzLmZpbHRlcihjID0+IGMuY2VudGVyID09PSBjZW50ZXIpLm1hcChjID0+IGMuY29sb3IpXHJcbiAgICAgIGlmIChjbHVzdGVyQ29sb3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCB1cGRhdGVkQ2VudGVyID0gdGhpcy5jYWxjdWxhdGVNZWFuQ29sb3IoY2x1c3RlckNvbG9ycylcclxuICAgICAgICB1cGRhdGVkQ2VudGVycy5wdXNoKHVwZGF0ZWRDZW50ZXIpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdXBkYXRlZENlbnRlcnNcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|