@snabcentr/client-ui 4.8.1 → 4.9.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/brands-list/index.d.ts +1 -0
- package/brands-list/sc-brand-list-item.d.ts +21 -0
- package/brands-list/sc-brands-list.component.d.ts +2 -4
- package/catalog/catalog-filters/sc-catalog-filters.component.d.ts +14 -3
- package/catalog/catalog-filters/tokens/sc-catalog-products-filters.d.ts +3 -3
- package/esm2022/brands-list/index.mjs +2 -1
- package/esm2022/brands-list/sc-brand-list-item.mjs +2 -0
- package/esm2022/brands-list/sc-brands-list.component.mjs +3 -3
- package/esm2022/catalog/catalog-filters/sc-catalog-filters.component.mjs +41 -16
- package/esm2022/catalog/catalog-filters/tokens/sc-catalog-products-filters.mjs +4 -4
- package/fesm2022/snabcentr-client-ui.mjs +43 -18
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/package.json +3 -3
- package/release_notes.tmp +6 -2
package/brands-list/index.d.ts
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Элемент списка брендов.
|
|
3
|
+
*/
|
|
4
|
+
export interface ScBrandListItem {
|
|
5
|
+
/**
|
|
6
|
+
* URL изображения бренда.
|
|
7
|
+
*/
|
|
8
|
+
src: string;
|
|
9
|
+
/**
|
|
10
|
+
* Альтернативный текст изображения.
|
|
11
|
+
*/
|
|
12
|
+
alt: string;
|
|
13
|
+
/**
|
|
14
|
+
* Ширина изображения в пикселях.
|
|
15
|
+
*/
|
|
16
|
+
width: number;
|
|
17
|
+
/**
|
|
18
|
+
* Высота изображения в пикселях.
|
|
19
|
+
*/
|
|
20
|
+
height: number;
|
|
21
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ScBrandListItem } from './sc-brand-list-item';
|
|
1
2
|
import * as i0 from "@angular/core";
|
|
2
3
|
/**
|
|
3
4
|
* Компонент списка брэндов.
|
|
@@ -6,10 +7,7 @@ export declare class ScBrandsListComponent {
|
|
|
6
7
|
/**
|
|
7
8
|
* Список элементов брендов.
|
|
8
9
|
*/
|
|
9
|
-
items:
|
|
10
|
-
src: string;
|
|
11
|
-
alt: string;
|
|
12
|
-
}>;
|
|
10
|
+
items: ScBrandListItem[];
|
|
13
11
|
static ɵfac: i0.ɵɵFactoryDeclaration<ScBrandsListComponent, never>;
|
|
14
12
|
static ɵcmp: i0.ɵɵComponentDeclaration<ScBrandsListComponent, "sc-brands-list", never, { "items": { "alias": "items"; "required": false; }; }, {}, never, never, false, never>;
|
|
15
13
|
}
|
|
@@ -69,6 +69,12 @@ export declare class ScCatalogFiltersComponent {
|
|
|
69
69
|
* @param filters Массив фильтров для создания контролов.
|
|
70
70
|
*/
|
|
71
71
|
protected updateFormControls(filters: ScCatalogFilter[]): void;
|
|
72
|
+
/**
|
|
73
|
+
* Возвращает текущие применённые фильтры из хранилища фильтров.
|
|
74
|
+
*
|
|
75
|
+
* Позволяет восстанавливать выбранные значения при пересоздании компонента (повторное открытие диалога или блока фильтров).
|
|
76
|
+
*/
|
|
77
|
+
private getAppliedFilters;
|
|
72
78
|
/**
|
|
73
79
|
* Преобразует значения формы в объект фильтров свойств.
|
|
74
80
|
*
|
|
@@ -83,14 +89,16 @@ export declare class ScCatalogFiltersComponent {
|
|
|
83
89
|
* Различие в API-выводе для одиночного значения (boolean вместо массива) обрабатывается в {@link processCheckboxFilter}.
|
|
84
90
|
*
|
|
85
91
|
* @param checkboxFilter Фильтр типа checkbox.
|
|
92
|
+
* @param appliedValue Применённое ранее значение фильтра из хранилища фильтров.
|
|
86
93
|
*/
|
|
87
|
-
protected createCheckboxFormControl(checkboxFilter: ScICheckboxFilter): FormGroup<Record<string, FormControl<boolean>>>;
|
|
94
|
+
protected createCheckboxFormControl(checkboxFilter: ScICheckboxFilter, appliedValue?: ScPropertyFilters[string]): FormGroup<Record<string, FormControl<boolean>>>;
|
|
88
95
|
/**
|
|
89
96
|
* Создаёт {@link FormGroup} для range: {@code from}, {@code to}, {@code slider} (кортеж для {@link TuiRange}).
|
|
90
97
|
*
|
|
91
98
|
* @param rangeFilter Фильтр типа range.
|
|
99
|
+
* @param appliedValue Применённое ранее значение фильтра из хранилища фильтров.
|
|
92
100
|
*/
|
|
93
|
-
protected createRangeFormControl(rangeFilter: ScRangeFilter): FormGroup<{
|
|
101
|
+
protected createRangeFormControl(rangeFilter: ScRangeFilter, appliedValue?: ScPropertyFilters[string]): FormGroup<{
|
|
94
102
|
from: FormControl<number>;
|
|
95
103
|
to: FormControl<number>;
|
|
96
104
|
slider: FormControl<[number, number]>;
|
|
@@ -115,8 +123,9 @@ export declare class ScCatalogFiltersComponent {
|
|
|
115
123
|
* Создает FormControl для toggle.
|
|
116
124
|
*
|
|
117
125
|
* @param toggleFilter Фильтр типа toggle.
|
|
126
|
+
* @param appliedValue Применённое ранее значение фильтра из хранилища фильтров.
|
|
118
127
|
*/
|
|
119
|
-
protected createToggleFormControl(toggleFilter: ScToggleFilter): FormControl<boolean>;
|
|
128
|
+
protected createToggleFormControl(toggleFilter: ScToggleFilter, appliedValue?: ScPropertyFilters[string]): FormControl<boolean>;
|
|
120
129
|
/**
|
|
121
130
|
* Обрабатывает checkbox: FormGroup → string[] выбранных id; для единственного значения — boolean (как toggle).
|
|
122
131
|
*
|
|
@@ -173,6 +182,8 @@ export declare class ScCatalogFiltersComponent {
|
|
|
173
182
|
protected onShowResultsClick(): void;
|
|
174
183
|
/**
|
|
175
184
|
* Сбрасывает все фильтры к исходным значениям.
|
|
185
|
+
*
|
|
186
|
+
* @param emitEvent Признак необходимости эмитить события изменения контролов (false — тихий сброс без отправки значений в хранилище фильтров).
|
|
176
187
|
*/
|
|
177
188
|
private resetAllFilters;
|
|
178
189
|
static ɵfac: i0.ɵɵFactoryDeclaration<ScCatalogFiltersComponent, never>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { InjectionToken } from '@angular/core';
|
|
2
2
|
import { ScPropertyFilters } from '@snabcentr/client-core';
|
|
3
|
-
import {
|
|
3
|
+
import { BehaviorSubject } from 'rxjs';
|
|
4
4
|
/**
|
|
5
|
-
* Токен для инъекции {@link
|
|
5
|
+
* Токен для инъекции {@link BehaviorSubject} для хранения фильтров продуктов.
|
|
6
6
|
*/
|
|
7
|
-
export declare const SC_CATALOG_PRODUCTS_FILTERS: InjectionToken<
|
|
7
|
+
export declare const SC_CATALOG_PRODUCTS_FILTERS: InjectionToken<BehaviorSubject<ScPropertyFilters>>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './sc-brand-list-item';
|
|
1
2
|
export * from './sc-brands-list.component';
|
|
2
3
|
export * from './sc-brands-list.module';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvYnJhbmRzLWxpc3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMseUJBQXlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NjLWJyYW5kLWxpc3QtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWJyYW5kcy1saXN0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWJyYW5kcy1saXN0Lm1vZHVsZSc7XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtYnJhbmQtbGlzdC1pdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2JyYW5kcy1saXN0L3NjLWJyYW5kLWxpc3QtaXRlbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDQrdC70LXQvNC10L3RgiDRgdC/0LjRgdC60LAg0LHRgNC10L3QtNC+0LIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NCcmFuZExpc3RJdGVtIHtcbiAgICAvKipcbiAgICAgKiBVUkwg0LjQt9C+0LHRgNCw0LbQtdC90LjRjyDQsdGA0LXQvdC00LAuXG4gICAgICovXG4gICAgc3JjOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDQkNC70YzRgtC10YDQvdCw0YLQuNCy0L3Ri9C5INGC0LXQutGB0YIg0LjQt9C+0LHRgNCw0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBhbHQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqINCo0LjRgNC40L3QsCDQuNC30L7QsdGA0LDQttC10L3QuNGPINCyINC/0LjQutGB0LXQu9GP0YUuXG4gICAgICovXG4gICAgd2lkdGg6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqINCS0YvRgdC+0YLQsCDQuNC30L7QsdGA0LDQttC10L3QuNGPINCyINC/0LjQutGB0LXQu9GP0YUuXG4gICAgICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG4iXX0=
|
|
@@ -13,12 +13,12 @@ export class ScBrandsListComponent {
|
|
|
13
13
|
this.items = [];
|
|
14
14
|
}
|
|
15
15
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScBrandsListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
16
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ScBrandsListComponent, selector: "sc-brands-list", inputs: { items: "items" }, ngImport: i0, template: "<!-- TODO: TASK:[#9893] \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439, \u043F\u0440\u0438 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0440\u0435\u043D\u0434\u043E\u0432. -->\n<div class=\"flex flex-col gap-4\">\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n <div\n *ngFor=\"let _ of [].constructor(3)\"\n class=\"animate-scroll-slow scroll-slow-revert flex shrink-0 items-center gap-16\"\n >\n <div\n *tuiRepeatTimes=\"let index of items.length - (items.length - (items.length % 2)) / 2\"\n class=\"flex items-center justify-center\"\n >\n
|
|
16
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ScBrandsListComponent, selector: "sc-brands-list", inputs: { items: "items" }, ngImport: i0, template: "<!-- TODO: TASK:[#9893] \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439, \u043F\u0440\u0438 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0440\u0435\u043D\u0434\u043E\u0432. -->\n<div class=\"flex flex-col gap-4\">\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n <div\n *ngFor=\"let _ of [].constructor(3)\"\n class=\"animate-scroll-slow scroll-slow-revert flex shrink-0 items-center gap-16\"\n >\n <div\n *tuiRepeatTimes=\"let index of items.length - (items.length - (items.length % 2)) / 2\"\n class=\"flex items-center justify-center\"\n >\n @let brandItem = items[index + (items.length - (items.length % 2)) / 2];\n <img\n [src]=\"brandItem.src\"\n [alt]=\"items[index].alt\"\n [attr.width]=\"brandItem.width\"\n [attr.height]=\"brandItem.height\"\n />\n </div>\n </div>\n </div>\n <div class=\"absolute -right-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-transparent to-tui-base-01\"></div>\n </div>\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n <div\n *ngFor=\"let _ of [].constructor(3)\"\n class=\"animate-scroll-slow flex shrink-0 items-center gap-16\"\n >\n <div\n *tuiRepeatTimes=\"let index of (items.length - (items.length % 2)) / 2\"\n class=\"flex items-center justify-center\"\n >\n @let brandItem = items[index];\n <img\n [src]=\"brandItem.src\"\n [alt]=\"brandItem.alt\"\n [attr.width]=\"brandItem.width\"\n [attr.height]=\"brandItem.height\"\n />\n </div>\n </div>\n </div>\n <div class=\"absolute -right-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-transparent to-tui-base-01\"></div>\n </div>\n</div>\n", styles: [".scroll-slow-revert{animation-direction:reverse!important;animation-delay:-15s!important}@keyframes scroll-slow{0%{transform:translate(0)}to{transform:translate(calc(-100% - 3rem))}}.animate-scroll-slow{animation:scroll-slow 30s linear infinite}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
17
17
|
}
|
|
18
18
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScBrandsListComponent, decorators: [{
|
|
19
19
|
type: Component,
|
|
20
|
-
args: [{ selector: 'sc-brands-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- TODO: TASK:[#9893] \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439, \u043F\u0440\u0438 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0440\u0435\u043D\u0434\u043E\u0432. -->\n<div class=\"flex flex-col gap-4\">\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n <div\n *ngFor=\"let _ of [].constructor(3)\"\n class=\"animate-scroll-slow scroll-slow-revert flex shrink-0 items-center gap-16\"\n >\n <div\n *tuiRepeatTimes=\"let index of items.length - (items.length - (items.length % 2)) / 2\"\n class=\"flex items-center justify-center\"\n >\n
|
|
20
|
+
args: [{ selector: 'sc-brands-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- TODO: TASK:[#9893] \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439, \u043F\u0440\u0438 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0440\u0435\u043D\u0434\u043E\u0432. -->\n<div class=\"flex flex-col gap-4\">\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n <div\n *ngFor=\"let _ of [].constructor(3)\"\n class=\"animate-scroll-slow scroll-slow-revert flex shrink-0 items-center gap-16\"\n >\n <div\n *tuiRepeatTimes=\"let index of items.length - (items.length - (items.length % 2)) / 2\"\n class=\"flex items-center justify-center\"\n >\n @let brandItem = items[index + (items.length - (items.length % 2)) / 2];\n <img\n [src]=\"brandItem.src\"\n [alt]=\"items[index].alt\"\n [attr.width]=\"brandItem.width\"\n [attr.height]=\"brandItem.height\"\n />\n </div>\n </div>\n </div>\n <div class=\"absolute -right-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-transparent to-tui-base-01\"></div>\n </div>\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n <div\n *ngFor=\"let _ of [].constructor(3)\"\n class=\"animate-scroll-slow flex shrink-0 items-center gap-16\"\n >\n <div\n *tuiRepeatTimes=\"let index of (items.length - (items.length % 2)) / 2\"\n class=\"flex items-center justify-center\"\n >\n @let brandItem = items[index];\n <img\n [src]=\"brandItem.src\"\n [alt]=\"brandItem.alt\"\n [attr.width]=\"brandItem.width\"\n [attr.height]=\"brandItem.height\"\n />\n </div>\n </div>\n </div>\n <div class=\"absolute -right-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-transparent to-tui-base-01\"></div>\n </div>\n</div>\n", styles: [".scroll-slow-revert{animation-direction:reverse!important;animation-delay:-15s!important}@keyframes scroll-slow{0%{transform:translate(0)}to{transform:translate(calc(-100% - 3rem))}}.animate-scroll-slow{animation:scroll-slow 30s linear infinite}\n"] }]
|
|
21
21
|
}], propDecorators: { items: [{
|
|
22
22
|
type: Input
|
|
23
23
|
}] } });
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtYnJhbmRzLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2JyYW5kcy1saXN0L3NjLWJyYW5kcy1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9icmFuZHMtbGlzdC9zYy1icmFuZHMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQUkxRTs7R0FFRztBQU9ILE1BQU0sT0FBTyxxQkFBcUI7SUFObEM7UUFPSTs7V0FFRztRQUVJLFVBQUssR0FBc0IsRUFBRSxDQUFDO0tBQ3hDOytHQU5ZLHFCQUFxQjttR0FBckIscUJBQXFCLGtGQ2JsQyxxM0ZBaURBOzs0RkRwQ2EscUJBQXFCO2tCQU5qQyxTQUFTOytCQUNJLGdCQUFnQixtQkFHVCx1QkFBdUIsQ0FBQyxNQUFNOzhCQU94QyxLQUFLO3NCQURYLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTY0JyYW5kTGlzdEl0ZW0gfSBmcm9tICcuL3NjLWJyYW5kLWxpc3QtaXRlbSc7XG5cbi8qKlxuICog0JrQvtC80L/QvtC90LXQvdGCINGB0L/QuNGB0LrQsCDQsdGA0Y3QvdC00L7Qsi5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzYy1icmFuZHMtbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLWJyYW5kcy1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zYy1icmFuZHMtbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTY0JyYW5kc0xpc3RDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqINCh0L/QuNGB0L7QuiDRjdC70LXQvNC10L3RgtC+0LIg0LHRgNC10L3QtNC+0LIuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXRlbXM6IFNjQnJhbmRMaXN0SXRlbVtdID0gW107XG59XG4iLCI8IS0tIFRPRE86IFRBU0s6WyM5ODkzXSDQlNC+0LHQsNCy0LjRgtGMINGA0LDQt9C00LXQu9C10L3QuNC1INC90LAg0L3QtdGB0LrQvtC70YzQutC+INGB0YLRgNC+0Log0LjQt9C+0LHRgNCw0LbQtdC90LjQuSwg0L/RgNC4INGD0LLQtdC70LjRh9C10L3QuNC4INC60L7Qu9C40YfQtdGB0YLQstCwINCx0YDQtdC90LTQvtCyLiAtLT5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSAtbGVmdC0xIHRvcC0wIHotMTAgYmxvY2sgaC1mdWxsIHctMTIgYmctZ3JhZGllbnQtdG8tciBmcm9tLXR1aS1iYXNlLTAxIHRvLXRyYW5zcGFyZW50XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNlbGVjdC1ub25lIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMTIgb3ZlcmZsb3ctaGlkZGVuIGNvbnRyYXN0LTE1MCBzYXR1cmF0ZS0wXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IF8gb2YgW10uY29uc3RydWN0b3IoMylcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYW5pbWF0ZS1zY3JvbGwtc2xvdyBzY3JvbGwtc2xvdy1yZXZlcnQgZmxleCBzaHJpbmstMCBpdGVtcy1jZW50ZXIgZ2FwLTE2XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICp0dWlSZXBlYXRUaW1lcz1cImxldCBpbmRleCBvZiBpdGVtcy5sZW5ndGggLSAoaXRlbXMubGVuZ3RoIC0gKGl0ZW1zLmxlbmd0aCAlIDIpKSAvIDJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBsZXQgYnJhbmRJdGVtID0gaXRlbXNbaW5kZXggKyAoaXRlbXMubGVuZ3RoIC0gKGl0ZW1zLmxlbmd0aCAlIDIpKSAvIDJdO1xuICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImJyYW5kSXRlbS5zcmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsdF09XCJpdGVtc1tpbmRleF0uYWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLndpZHRoXT1cImJyYW5kSXRlbS53aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwiYnJhbmRJdGVtLmhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSAtcmlnaHQtMSB0b3AtMCB6LTEwIGJsb2NrIGgtZnVsbCB3LTEyIGJnLWdyYWRpZW50LXRvLXIgZnJvbS10cmFuc3BhcmVudCB0by10dWktYmFzZS0wMVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgLWxlZnQtMSB0b3AtMCB6LTEwIGJsb2NrIGgtZnVsbCB3LTEyIGJnLWdyYWRpZW50LXRvLXIgZnJvbS10dWktYmFzZS0wMSB0by10cmFuc3BhcmVudFwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzZWxlY3Qtbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTEyIG92ZXJmbG93LWhpZGRlbiBjb250cmFzdC0xNTAgc2F0dXJhdGUtMFwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBfIG9mIFtdLmNvbnN0cnVjdG9yKDMpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFuaW1hdGUtc2Nyb2xsLXNsb3cgZmxleCBzaHJpbmstMCBpdGVtcy1jZW50ZXIgZ2FwLTE2XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICp0dWlSZXBlYXRUaW1lcz1cImxldCBpbmRleCBvZiAoaXRlbXMubGVuZ3RoIC0gKGl0ZW1zLmxlbmd0aCAlIDIpKSAvIDJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBsZXQgYnJhbmRJdGVtID0gaXRlbXNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImJyYW5kSXRlbS5zcmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsdF09XCJicmFuZEl0ZW0uYWx0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLndpZHRoXT1cImJyYW5kSXRlbS53aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwiYnJhbmRJdGVtLmhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSAtcmlnaHQtMSB0b3AtMCB6LTEwIGJsb2NrIGgtZnVsbCB3LTEyIGJnLWdyYWRpZW50LXRvLXIgZnJvbS10cmFuc3BhcmVudCB0by10dWktYmFzZS0wMVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|