@recursyve/nice-data-filter-kit 12.1.28 → 13.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_index.scss +1 -7
- package/{esm2015/lib/api/dto/saved-reports.dto.js → esm2020/lib/api/dto/saved-reports.dto.mjs} +0 -0
- package/esm2020/lib/api/filter.api.mjs +51 -0
- package/{esm2015/lib/api/models/saved-reports.model.js → esm2020/lib/api/models/saved-reports.model.mjs} +0 -0
- package/{esm2015/lib/api/public-api.js → esm2020/lib/api/public-api.mjs} +0 -0
- package/esm2020/lib/api/saved-report.api.mjs +48 -0
- package/esm2020/lib/components/base-list/base-list.component.mjs +288 -0
- package/{esm2015/lib/components/base-list/base-list.constant.js → esm2020/lib/components/base-list/base-list.constant.mjs} +0 -0
- package/esm2020/lib/components/base-list/base-list.module.mjs +171 -0
- package/{esm2015/lib/components/base-list/directives/base-list-buttons.directive.js → esm2020/lib/components/base-list/directives/base-list-buttons.directive.mjs} +3 -3
- package/{esm2015/lib/components/base-list/directives/base-list-cards.directive.js → esm2020/lib/components/base-list/directives/base-list-cards.directive.mjs} +3 -3
- package/{esm2015/lib/components/base-list/directives/base-list-custom-content.directive.js → esm2020/lib/components/base-list/directives/base-list-custom-content.directive.mjs} +3 -3
- package/esm2020/lib/components/base-list/directives/base-list-directives.module.mjs +45 -0
- package/esm2020/lib/components/base-list/directives/base-list-filters.directive.mjs +14 -0
- package/{esm2015/lib/components/base-list/directives/base-list-table.directive.js → esm2020/lib/components/base-list/directives/base-list-table.directive.mjs} +3 -3
- package/{esm2015/lib/components/base-list/directives/base-list-title.directive.js → esm2020/lib/components/base-list/directives/base-list-title.directive.mjs} +3 -3
- package/{esm2015/lib/components/base-list/models/columns.model.js → esm2020/lib/components/base-list/models/columns.model.mjs} +0 -0
- package/{esm2015/lib/components/base-list/models/export.model.js → esm2020/lib/components/base-list/models/export.model.mjs} +0 -0
- package/esm2020/lib/components/base-list/models/layout.model.mjs +149 -0
- package/esm2020/lib/components/base-list/providers/base-filter.service.mjs +34 -0
- package/{esm2015/lib/components/base-list/providers/base-list-saved-report.service.js → esm2020/lib/components/base-list/providers/base-list-saved-report.service.mjs} +3 -3
- package/esm2020/lib/components/base-list/public-api.mjs +17 -0
- package/esm2020/lib/components/base-list/store/base-list.query.mjs +35 -0
- package/esm2020/lib/components/base-list/store/base-list.service.mjs +341 -0
- package/esm2020/lib/components/base-list/store/base-list.store.mjs +81 -0
- package/{esm2015/lib/components/multi-state-list/models/list-states.model.js → esm2020/lib/components/multi-state-list/models/list-states.model.mjs} +0 -0
- package/esm2020/lib/components/multi-state-list/multi-state-list.component.mjs +71 -0
- package/{esm2015/lib/components/multi-state-list/multi-state-list.constant.js → esm2020/lib/components/multi-state-list/multi-state-list.constant.mjs} +0 -0
- package/{esm2015/lib/components/multi-state-list/multi-state-list.module.js → esm2020/lib/components/multi-state-list/multi-state-list.module.mjs} +6 -14
- package/{esm2015/lib/components/multi-state-list/providers/multi-state-filter.service.js → esm2020/lib/components/multi-state-list/providers/multi-state-filter.service.mjs} +0 -0
- package/{esm2015/lib/components/multi-state-list/public-api.js → esm2020/lib/components/multi-state-list/public-api.mjs} +0 -0
- package/{esm2015/lib/components/multi-state-list/store/multi-state-list.query.js → esm2020/lib/components/multi-state-list/store/multi-state-list.query.mjs} +3 -3
- package/{esm2015/lib/components/multi-state-list/store/multi-state-list.service.js → esm2020/lib/components/multi-state-list/store/multi-state-list.service.mjs} +5 -6
- package/esm2020/lib/components/multi-state-list/store/multi-state-list.store.mjs +24 -0
- package/{esm2015/lib/components/public-api.js → esm2020/lib/components/public-api.mjs} +0 -0
- package/esm2020/lib/components/query-builder/filter-selection/filter-selection.component.mjs +41 -0
- package/{esm2015/lib/components/query-builder/pipes/filter-group-icon.pipe.js → esm2020/lib/components/query-builder/pipes/filter-group-icon.pipe.mjs} +3 -3
- package/{esm2015/lib/components/query-builder/providers/filter-group.service.js → esm2020/lib/components/query-builder/providers/filter-group.service.mjs} +0 -0
- package/{esm2015/lib/components/query-builder/public-api.js → esm2020/lib/components/query-builder/public-api.mjs} +0 -0
- package/{esm2015/lib/components/query-builder/query-builder-trigger.directive.js → esm2020/lib/components/query-builder/query-builder-trigger.directive.mjs} +3 -3
- package/esm2020/lib/components/query-builder/query-builder.component.mjs +93 -0
- package/{esm2015/lib/components/query-builder/query-builder.form.js → esm2020/lib/components/query-builder/query-builder.form.mjs} +0 -0
- package/esm2020/lib/components/query-builder/query-builder.module.mjs +116 -0
- package/esm2020/lib/components/query-builder/rule/components/date/date-filter.component.mjs +29 -0
- package/{esm2015/lib/components/query-builder/rule/components/filter.component.js → esm2020/lib/components/query-builder/rule/components/filter.component.mjs} +3 -3
- package/esm2020/lib/components/query-builder/rule/components/number/number-filter.component.mjs +28 -0
- package/esm2020/lib/components/query-builder/rule/components/radio/radio-filter.component.mjs +30 -0
- package/esm2020/lib/components/query-builder/rule/components/select/select-filter.component.mjs +83 -0
- package/esm2020/lib/components/query-builder/rule/components/text/text-filter.component.mjs +31 -0
- package/esm2020/lib/components/query-builder/rule/rule.component.mjs +78 -0
- package/{esm2015/lib/components/query-builder/utils/qb-filter.utils.js → esm2020/lib/components/query-builder/utils/qb-filter.utils.mjs} +23 -9
- package/{esm2015/lib/models/filter.model.js → esm2020/lib/models/filter.model.mjs} +0 -0
- package/{esm2015/lib/models/public-api.js → esm2020/lib/models/public-api.mjs} +0 -0
- package/{esm2015/lib/models/query.model.js → esm2020/lib/models/query.model.mjs} +0 -0
- package/{esm2015/lib/utils/date.adapter.js → esm2020/lib/utils/date.adapter.mjs} +3 -3
- package/esm2020/lib/utils/filter.utils.mjs +40 -0
- package/{esm2015/lib/utils/public-api.js → esm2020/lib/utils/public-api.mjs} +0 -0
- package/{esm2015/lib/utils/query-params.utils.js → esm2020/lib/utils/query-params.utils.mjs} +0 -0
- package/{esm2015/lib/utils/string.utils.js → esm2020/lib/utils/string.utils.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/{esm2015/recursyve-nice-data-filter-kit.js → esm2020/recursyve-nice-data-filter-kit.mjs} +0 -0
- package/fesm2015/recursyve-nice-data-filter-kit.mjs +2448 -0
- package/fesm2015/recursyve-nice-data-filter-kit.mjs.map +1 -0
- package/fesm2020/recursyve-nice-data-filter-kit.mjs +2446 -0
- package/fesm2020/recursyve-nice-data-filter-kit.mjs.map +1 -0
- package/lib/components/base-list/base-list.component.d.ts +3 -1
- package/lib/components/base-list/base-list.module.d.ts +15 -16
- package/lib/components/base-list/directives/base-list-directives.module.d.ts +2 -1
- package/lib/components/base-list/directives/base-list-filters.directive.d.ts +8 -0
- package/lib/components/base-list/models/layout.model.d.ts +1 -5
- package/lib/components/base-list/public-api.d.ts +1 -0
- package/lib/components/base-list/store/base-list.service.d.ts +1 -0
- package/lib/components/multi-state-list/multi-state-list.module.d.ts +15 -16
- package/lib/components/query-builder/query-builder.module.d.ts +10 -11
- package/package.json +30 -16
- package/src/lib/components/base-list/base-list.theme.scss +5 -5
- package/src/lib/components/query-builder/rule/rule.theme.scss +1 -1
- package/src/lib/nice-data-filter.theme.scss +7 -0
- package/bundles/recursyve-nice-data-filter-kit.umd.js +0 -3153
- package/bundles/recursyve-nice-data-filter-kit.umd.js.map +0 -1
- package/esm2015/lib/api/filter.api.js +0 -52
- package/esm2015/lib/api/saved-report.api.js +0 -49
- package/esm2015/lib/components/base-list/base-list.component.js +0 -290
- package/esm2015/lib/components/base-list/base-list.module.js +0 -180
- package/esm2015/lib/components/base-list/directives/base-list-directives.module.js +0 -40
- package/esm2015/lib/components/base-list/models/layout.model.js +0 -155
- package/esm2015/lib/components/base-list/providers/base-filter.service.js +0 -40
- package/esm2015/lib/components/base-list/public-api.js +0 -16
- package/esm2015/lib/components/base-list/store/base-list.query.js +0 -35
- package/esm2015/lib/components/base-list/store/base-list.service.js +0 -327
- package/esm2015/lib/components/base-list/store/base-list.store.js +0 -78
- package/esm2015/lib/components/multi-state-list/multi-state-list.component.js +0 -75
- package/esm2015/lib/components/multi-state-list/store/multi-state-list.store.js +0 -22
- package/esm2015/lib/components/query-builder/filter-selection/filter-selection.component.js +0 -48
- package/esm2015/lib/components/query-builder/query-builder.component.js +0 -100
- package/esm2015/lib/components/query-builder/query-builder.module.js +0 -120
- package/esm2015/lib/components/query-builder/rule/components/date/date-filter.component.js +0 -35
- package/esm2015/lib/components/query-builder/rule/components/number/number-filter.component.js +0 -34
- package/esm2015/lib/components/query-builder/rule/components/radio/radio-filter.component.js +0 -36
- package/esm2015/lib/components/query-builder/rule/components/select/select-filter.component.js +0 -94
- package/esm2015/lib/components/query-builder/rule/components/text/text-filter.component.js +0 -37
- package/esm2015/lib/components/query-builder/rule/rule.component.js +0 -86
- package/esm2015/lib/utils/filter.utils.js +0 -41
- package/fesm2015/recursyve-nice-data-filter-kit.js +0 -2485
- package/fesm2015/recursyve-nice-data-filter-kit.js.map +0 -1
package/_index.scss
CHANGED
|
@@ -1,7 +1 @@
|
|
|
1
|
-
@
|
|
2
|
-
@import "src/lib/components/query-builder/query-builder.theme";
|
|
3
|
-
|
|
4
|
-
@mixin nice-data-filter-kit-theme($theme) {
|
|
5
|
-
@include nice-base-list-theme($theme);
|
|
6
|
-
@include nice-query-builder-theme($theme);
|
|
7
|
-
}
|
|
1
|
+
@forward "src/lib/nice-data-filter.theme" show nice-data-filter-kit-theme;
|
package/{esm2015/lib/api/dto/saved-reports.dto.js → esm2020/lib/api/dto/saved-reports.dto.mjs}
RENAMED
|
File without changes
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { QueryParamsUtils } from "../utils/query-params.utils";
|
|
2
|
+
export class NiceFilterApi {
|
|
3
|
+
constructor(filterApiUrl, path, http) {
|
|
4
|
+
this.filterApiUrl = filterApiUrl;
|
|
5
|
+
this.path = path;
|
|
6
|
+
this.http = http;
|
|
7
|
+
}
|
|
8
|
+
filter(queryModel) {
|
|
9
|
+
return this.http.post(this.url("filter"), queryModel);
|
|
10
|
+
}
|
|
11
|
+
filterCount(queryModel) {
|
|
12
|
+
return this.http.post(this.url("filter-count"), queryModel);
|
|
13
|
+
}
|
|
14
|
+
downloadData(type, queryModel) {
|
|
15
|
+
return this.http.post(this.url(`download/${type}`), queryModel, { responseType: "blob" });
|
|
16
|
+
}
|
|
17
|
+
getPrintableHtml(queryModel) {
|
|
18
|
+
return this.http.post(this.url(`download/html`), queryModel, { responseType: "text" });
|
|
19
|
+
}
|
|
20
|
+
getFilterConfig() {
|
|
21
|
+
return this.http.get(this.url("filter/config"));
|
|
22
|
+
}
|
|
23
|
+
searchFilterValue(id, value) {
|
|
24
|
+
if (value === undefined) {
|
|
25
|
+
value = "";
|
|
26
|
+
}
|
|
27
|
+
return this.http.get(this.url(`filter/config/value?id=${id}&value=${value}`));
|
|
28
|
+
}
|
|
29
|
+
searchFilterResourceValue(id, resourceId) {
|
|
30
|
+
return this.http.get(this.url(`filter/config/id?id=${id}&resourceId=${resourceId}`));
|
|
31
|
+
}
|
|
32
|
+
url(...args) {
|
|
33
|
+
const [route, queryParams] = this.transformUrlArgs(args);
|
|
34
|
+
const params = queryParams ? `?${QueryParamsUtils.fromObject(queryParams)}` : "";
|
|
35
|
+
if (route) {
|
|
36
|
+
return `${this.filterApiUrl}/${this.path}/${route}${params}`;
|
|
37
|
+
}
|
|
38
|
+
return `${this.filterApiUrl}/${this.path}${params}`;
|
|
39
|
+
}
|
|
40
|
+
transformUrlArgs(args) {
|
|
41
|
+
const [routeOfQueryParams, query] = args;
|
|
42
|
+
if (args.length === 1) {
|
|
43
|
+
if (typeof routeOfQueryParams === "string") {
|
|
44
|
+
return [routeOfQueryParams];
|
|
45
|
+
}
|
|
46
|
+
return ["", routeOfQueryParams];
|
|
47
|
+
}
|
|
48
|
+
return [routeOfQueryParams ?? "", query];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvYXBpL2ZpbHRlci5hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFL0QsTUFBTSxPQUFPLGFBQWE7SUFDdEIsWUFBb0IsWUFBb0IsRUFBVSxJQUFZLEVBQVksSUFBZ0I7UUFBdEUsaUJBQVksR0FBWixZQUFZLENBQVE7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVksU0FBSSxHQUFKLElBQUksQ0FBWTtJQUFHLENBQUM7SUFFdkYsTUFBTSxDQUFDLFVBQTRCO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQW9CLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVNLFdBQVcsQ0FBQyxVQUE0QjtRQUMzQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFZLEVBQUUsVUFBNEI7UUFDMUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsVUFBNEI7UUFDaEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFTSxlQUFlO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQTZCLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU0saUJBQWlCLENBQUMsRUFBVSxFQUFFLEtBQWE7UUFDOUMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3JCLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDZDtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQXNCLElBQUksQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsVUFBVSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkcsQ0FBQztJQUVNLHlCQUF5QixDQUFDLEVBQVUsRUFBRSxVQUFrQjtRQUMzRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFvQixJQUFJLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLGVBQWUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFJUyxHQUFHLENBQUMsR0FBRyxJQUFnQztRQUM3QyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRixJQUFJLEtBQUssRUFBRTtZQUNQLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDO1NBQ2hFO1FBRUQsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBZ0M7UUFDckQsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25CLElBQUksT0FBTyxrQkFBa0IsS0FBSyxRQUFRLEVBQUU7Z0JBQ3hDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQy9CO1lBRUQsT0FBTyxDQUFDLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsT0FBTyxDQUFFLGtCQUE2QixJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbCwgRmlsdGVyUXVlcnlNb2RlbCwgRmlsdGVyUmVzdWx0TW9kZWwsIFNlbGVjdEZpbHRlclZhbHVlIH0gZnJvbSBcIi4uL21vZGVscy9maWx0ZXIubW9kZWxcIjtcbmltcG9ydCB7IFF1ZXJ5UGFyYW1zVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvcXVlcnktcGFyYW1zLnV0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBOaWNlRmlsdGVyQXBpPFQ+IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZpbHRlckFwaVVybDogc3RyaW5nLCBwcml2YXRlIHBhdGg6IHN0cmluZywgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQpIHt9XG5cbiAgICBwdWJsaWMgZmlsdGVyKHF1ZXJ5TW9kZWw6IEZpbHRlclF1ZXJ5TW9kZWwpOiBPYnNlcnZhYmxlPEZpbHRlclJlc3VsdE1vZGVsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxGaWx0ZXJSZXN1bHRNb2RlbD4odGhpcy51cmwoXCJmaWx0ZXJcIiksIHF1ZXJ5TW9kZWwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWx0ZXJDb3VudChxdWVyeU1vZGVsOiBGaWx0ZXJRdWVyeU1vZGVsKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PG51bWJlcj4odGhpcy51cmwoXCJmaWx0ZXItY291bnRcIiksIHF1ZXJ5TW9kZWwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkb3dubG9hZERhdGEodHlwZTogc3RyaW5nLCBxdWVyeU1vZGVsOiBGaWx0ZXJRdWVyeU1vZGVsKTogT2JzZXJ2YWJsZTxCbG9iPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnVybChgZG93bmxvYWQvJHt0eXBlfWApLCBxdWVyeU1vZGVsLCB7IHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFByaW50YWJsZUh0bWwocXVlcnlNb2RlbDogRmlsdGVyUXVlcnlNb2RlbCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnVybChgZG93bmxvYWQvaHRtbGApLCBxdWVyeU1vZGVsLCB7IHJlc3BvbnNlVHlwZTogXCJ0ZXh0XCIgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpbHRlckNvbmZpZygpOiBPYnNlcnZhYmxlPEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbFtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbFtdPih0aGlzLnVybChcImZpbHRlci9jb25maWdcIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWFyY2hGaWx0ZXJWYWx1ZShpZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZWxlY3RGaWx0ZXJWYWx1ZVtdPiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxTZWxlY3RGaWx0ZXJWYWx1ZVtdPih0aGlzLnVybChgZmlsdGVyL2NvbmZpZy92YWx1ZT9pZD0ke2lkfSZ2YWx1ZT0ke3ZhbHVlfWApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VhcmNoRmlsdGVyUmVzb3VyY2VWYWx1ZShpZDogc3RyaW5nLCByZXNvdXJjZUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFNlbGVjdEZpbHRlclZhbHVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFNlbGVjdEZpbHRlclZhbHVlPih0aGlzLnVybChgZmlsdGVyL2NvbmZpZy9pZD9pZD0ke2lkfSZyZXNvdXJjZUlkPSR7cmVzb3VyY2VJZH1gKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHVybChyb3V0ZT86IHN0cmluZywgcXVlcnlQYXJhbXM/OiBvYmplY3QpOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHVybChxdWVyeVBhcmFtczogb2JqZWN0KTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCB1cmwoLi4uYXJnczogW3N0cmluZyB8IG9iamVjdCwgb2JqZWN0P10pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbcm91dGUsIHF1ZXJ5UGFyYW1zXSA9IHRoaXMudHJhbnNmb3JtVXJsQXJncyhhcmdzKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gcXVlcnlQYXJhbXMgPyBgPyR7UXVlcnlQYXJhbXNVdGlscy5mcm9tT2JqZWN0KHF1ZXJ5UGFyYW1zKX1gIDogXCJcIjtcbiAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5maWx0ZXJBcGlVcmx9LyR7dGhpcy5wYXRofS8ke3JvdXRlfSR7cGFyYW1zfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dGhpcy5maWx0ZXJBcGlVcmx9LyR7dGhpcy5wYXRofSR7cGFyYW1zfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1VcmxBcmdzKGFyZ3M6IFtzdHJpbmcgfCBvYmplY3QsIG9iamVjdD9dKTogW3JvdXRlOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zPzogb2JqZWN0XSB7XG4gICAgICAgIGNvbnN0IFtyb3V0ZU9mUXVlcnlQYXJhbXMsIHF1ZXJ5XSA9IGFyZ3M7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZU9mUXVlcnlQYXJhbXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3JvdXRlT2ZRdWVyeVBhcmFtc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbXCJcIiwgcm91dGVPZlF1ZXJ5UGFyYW1zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbKHJvdXRlT2ZRdWVyeVBhcmFtcyBhcyBzdHJpbmcpID8/IFwiXCIsIHF1ZXJ5XTtcbiAgICB9XG59XG4iXX0=
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { QueryParamsUtils } from "../utils/query-params.utils";
|
|
2
|
+
export class NiceSavedReportsApi {
|
|
3
|
+
constructor(filterApiUrl, path, http) {
|
|
4
|
+
this.filterApiUrl = filterApiUrl;
|
|
5
|
+
this.path = path;
|
|
6
|
+
this.http = http;
|
|
7
|
+
}
|
|
8
|
+
create(dto) {
|
|
9
|
+
return this.http.post(this.url(), dto);
|
|
10
|
+
}
|
|
11
|
+
getAll() {
|
|
12
|
+
return this.http.get(this.url());
|
|
13
|
+
}
|
|
14
|
+
getByTable(table) {
|
|
15
|
+
return this.http.get(this.url(`${table}`));
|
|
16
|
+
}
|
|
17
|
+
getTopByTable(table) {
|
|
18
|
+
return this.http.get(this.url(`${table}/top`));
|
|
19
|
+
}
|
|
20
|
+
hit(id) {
|
|
21
|
+
return this.http.put(this.url(`${id}/hit`), null);
|
|
22
|
+
}
|
|
23
|
+
update(id, dto) {
|
|
24
|
+
return this.http.put(this.url(`${id}`), dto);
|
|
25
|
+
}
|
|
26
|
+
delete(id) {
|
|
27
|
+
return this.http.delete(this.url(`${id}`));
|
|
28
|
+
}
|
|
29
|
+
url(...args) {
|
|
30
|
+
const [route, queryParams] = this.transformUrlArgs(args);
|
|
31
|
+
const params = queryParams ? `?${QueryParamsUtils.fromObject(queryParams)}` : "";
|
|
32
|
+
if (route) {
|
|
33
|
+
return `${this.filterApiUrl}/${this.path}/${route}${params}`;
|
|
34
|
+
}
|
|
35
|
+
return `${this.filterApiUrl}/${this.path}${params}`;
|
|
36
|
+
}
|
|
37
|
+
transformUrlArgs(args) {
|
|
38
|
+
const [routeOfQueryParams, query] = args;
|
|
39
|
+
if (args.length === 1) {
|
|
40
|
+
if (typeof routeOfQueryParams === "string") {
|
|
41
|
+
return [routeOfQueryParams];
|
|
42
|
+
}
|
|
43
|
+
return ["", routeOfQueryParams];
|
|
44
|
+
}
|
|
45
|
+
return [routeOfQueryParams ?? "", query];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtcmVwb3J0LmFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvYXBpL3NhdmVkLXJlcG9ydC5hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFJL0QsTUFBTSxPQUFPLG1CQUFtQjtJQUM1QixZQUFvQixZQUFvQixFQUFVLElBQVksRUFBWSxJQUFnQjtRQUF0RSxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7UUFBWSxTQUFJLEdBQUosSUFBSSxDQUFZO0lBQUcsQ0FBQztJQUV2RixNQUFNLENBQUMsR0FBdUI7UUFDakMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBbUIsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTSxNQUFNO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBcUIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFhO1FBQzNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQXFCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVNLGFBQWEsQ0FBQyxLQUF5QjtRQUMxQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFxQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTSxHQUFHLENBQUMsRUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTSxNQUFNLENBQUMsRUFBVSxFQUFFLEdBQXVCO1FBQzdDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQW1CLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTSxNQUFNLENBQUMsRUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUlTLEdBQUcsQ0FBQyxHQUFHLElBQWdDO1FBQzdDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pGLElBQUksS0FBSyxFQUFFO1lBQ1AsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7U0FDaEU7UUFFRCxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFnQztRQUNyRCxNQUFNLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxPQUFPLGtCQUFrQixLQUFLLFFBQVEsRUFBRTtnQkFDeEMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDL0I7WUFFRCxPQUFPLENBQUMsRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7U0FDbkM7UUFFRCxPQUFPLENBQUUsa0JBQTZCLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgUXVlcnlQYXJhbXNVdGlscyB9IGZyb20gXCIuLi91dGlscy9xdWVyeS1wYXJhbXMudXRpbHNcIjtcbmltcG9ydCB7IE5pY2VTYXZlZFJlcG9ydER0byB9IGZyb20gXCIuL2R0by9zYXZlZC1yZXBvcnRzLmR0b1wiO1xuaW1wb3J0IHsgTmljZVNhdmVkUmVwb3J0cyB9IGZyb20gXCIuL21vZGVscy9zYXZlZC1yZXBvcnRzLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBOaWNlU2F2ZWRSZXBvcnRzQXBpIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZpbHRlckFwaVVybDogc3RyaW5nLCBwcml2YXRlIHBhdGg6IHN0cmluZywgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlKGR0bzogTmljZVNhdmVkUmVwb3J0RHRvKTogT2JzZXJ2YWJsZTxOaWNlU2F2ZWRSZXBvcnRzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxOaWNlU2F2ZWRSZXBvcnRzPih0aGlzLnVybCgpLCBkdG8pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbGwoKTogT2JzZXJ2YWJsZTxOaWNlU2F2ZWRSZXBvcnRzW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TmljZVNhdmVkUmVwb3J0c1tdPih0aGlzLnVybCgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QnlUYWJsZSh0YWJsZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxOaWNlU2F2ZWRSZXBvcnRzW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TmljZVNhdmVkUmVwb3J0c1tdPih0aGlzLnVybChgJHt0YWJsZX1gKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRvcEJ5VGFibGUodGFibGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8TmljZVNhdmVkUmVwb3J0c1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5pY2VTYXZlZFJlcG9ydHNbXT4odGhpcy51cmwoYCR7dGFibGV9L3RvcGApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGl0KGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odGhpcy51cmwoYCR7aWR9L2hpdGApLCBudWxsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKGlkOiBudW1iZXIsIGR0bzogTmljZVNhdmVkUmVwb3J0RHRvKTogT2JzZXJ2YWJsZTxOaWNlU2F2ZWRSZXBvcnRzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PE5pY2VTYXZlZFJlcG9ydHM+KHRoaXMudXJsKGAke2lkfWApLCBkdG8pO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTx2b2lkPih0aGlzLnVybChgJHtpZH1gKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHVybChyb3V0ZT86IHN0cmluZywgcXVlcnlQYXJhbXM/OiBvYmplY3QpOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHVybChxdWVyeVBhcmFtczogb2JqZWN0KTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCB1cmwoLi4uYXJnczogW3N0cmluZyB8IG9iamVjdCwgb2JqZWN0P10pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbcm91dGUsIHF1ZXJ5UGFyYW1zXSA9IHRoaXMudHJhbnNmb3JtVXJsQXJncyhhcmdzKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gcXVlcnlQYXJhbXMgPyBgPyR7UXVlcnlQYXJhbXNVdGlscy5mcm9tT2JqZWN0KHF1ZXJ5UGFyYW1zKX1gIDogXCJcIjtcbiAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5maWx0ZXJBcGlVcmx9LyR7dGhpcy5wYXRofS8ke3JvdXRlfSR7cGFyYW1zfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dGhpcy5maWx0ZXJBcGlVcmx9LyR7dGhpcy5wYXRofSR7cGFyYW1zfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1VcmxBcmdzKGFyZ3M6IFtzdHJpbmcgfCBvYmplY3QsIG9iamVjdD9dKTogW3JvdXRlOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zPzogb2JqZWN0XSB7XG4gICAgICAgIGNvbnN0IFtyb3V0ZU9mUXVlcnlQYXJhbXMsIHF1ZXJ5XSA9IGFyZ3M7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZU9mUXVlcnlQYXJhbXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3JvdXRlT2ZRdWVyeVBhcmFtc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbXCJcIiwgcm91dGVPZlF1ZXJ5UGFyYW1zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbKHJvdXRlT2ZRdWVyeVBhcmFtcyBhcyBzdHJpbmcpID8/IFwiXCIsIHF1ZXJ5XTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { Component, ContentChild, ContentChildren, EventEmitter, Inject, Input, Optional, Output, TemplateRef } from "@angular/core";
|
|
2
|
+
import { MediaObserver } from "@angular/flex-layout";
|
|
3
|
+
import { MatBottomSheet } from "@angular/material/bottom-sheet";
|
|
4
|
+
import { ActivatedRoute, Router } from "@angular/router";
|
|
5
|
+
import { ExportBottomSheetComponent } from "@recursyve/nice-ui-kit.v2";
|
|
6
|
+
import { Subject } from "rxjs";
|
|
7
|
+
import { debounceTime, distinctUntilChanged, map, switchMap } from "rxjs/operators";
|
|
8
|
+
import { BASE_LIST_LAYOUT, ENABLE_QUERY_BUILDER, EXPORTS_SETTINGS, TABLE_COLUMNS } from "./base-list.constant";
|
|
9
|
+
import { NiceBaseListButtonsDirective } from "./directives/base-list-buttons.directive";
|
|
10
|
+
import { NiceBaseListCardsDirective } from "./directives/base-list-cards.directive";
|
|
11
|
+
import { NiceBaseListCustomContentDirective } from "./directives/base-list-custom-content.directive";
|
|
12
|
+
import { NiceBaseListFiltersDirective } from "./directives/base-list-filters.directive";
|
|
13
|
+
import { NiceBaseListTableDirective } from "./directives/base-list-table.directive";
|
|
14
|
+
import { NiceBaseListTitleDirective } from "./directives/base-list-title.directive";
|
|
15
|
+
import { LayoutContent } from "./models/layout.model";
|
|
16
|
+
import { NiceBaseListQuery } from "./store/base-list.query";
|
|
17
|
+
import { NiceBaseListService } from "./store/base-list.service";
|
|
18
|
+
import { NiceBaseListStore } from "./store/base-list.store";
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
import * as i1 from "./store/base-list.query";
|
|
21
|
+
import * as i2 from "./store/base-list.service";
|
|
22
|
+
import * as i3 from "@angular/router";
|
|
23
|
+
import * as i4 from "@angular/material/bottom-sheet";
|
|
24
|
+
import * as i5 from "@angular/flex-layout";
|
|
25
|
+
import * as i6 from "@angular/material/icon";
|
|
26
|
+
import * as i7 from "@angular/material/button";
|
|
27
|
+
import * as i8 from "@angular/material/paginator";
|
|
28
|
+
import * as i9 from "@angular/material/card";
|
|
29
|
+
import * as i10 from "../query-builder/query-builder.component";
|
|
30
|
+
import * as i11 from "@angular/material/table";
|
|
31
|
+
import * as i12 from "@angular/material/sort";
|
|
32
|
+
import * as i13 from "@angular/common";
|
|
33
|
+
import * as i14 from "@angular/forms";
|
|
34
|
+
import * as i15 from "../query-builder/query-builder-trigger.directive";
|
|
35
|
+
import * as i16 from "@angular/material/tooltip";
|
|
36
|
+
import * as i17 from "@angular/material/badge";
|
|
37
|
+
import * as i18 from "@recursyve/nice-ui-kit.v2";
|
|
38
|
+
import * as i19 from "@angular/material/core";
|
|
39
|
+
import * as i20 from "@ngx-translate/core";
|
|
40
|
+
export class NiceBaseListComponent {
|
|
41
|
+
constructor(enableQueryBuilder, listLayout, columns, exportsSettings, query, service, activatedRoute, bottomSheet, router, mediaObserver) {
|
|
42
|
+
this.enableQueryBuilder = enableQueryBuilder;
|
|
43
|
+
this.listLayout = listLayout;
|
|
44
|
+
this.columns = columns;
|
|
45
|
+
this.exportsSettings = exportsSettings;
|
|
46
|
+
this.query = query;
|
|
47
|
+
this.service = service;
|
|
48
|
+
this.activatedRoute = activatedRoute;
|
|
49
|
+
this.bottomSheet = bottomSheet;
|
|
50
|
+
this.router = router;
|
|
51
|
+
this.mediaObserver = mediaObserver;
|
|
52
|
+
this.mode = "normal";
|
|
53
|
+
this.layout = "page";
|
|
54
|
+
this.layoutContent = LayoutContent.Table;
|
|
55
|
+
this.autoChangeLayout = true;
|
|
56
|
+
this.autoLoad = true;
|
|
57
|
+
this.canExport = true;
|
|
58
|
+
this.disableRouting = false;
|
|
59
|
+
this.customExport = [];
|
|
60
|
+
this.newPage = new EventEmitter();
|
|
61
|
+
this.defaultPageSizeOptions = [10, 25, 50, 100];
|
|
62
|
+
this.columnNames = [];
|
|
63
|
+
this.loading$ = this.query.selectLoading();
|
|
64
|
+
this.filterResult$ = this.query.selectFilterResult();
|
|
65
|
+
this.data$ = this.query.selectData();
|
|
66
|
+
this.recordsFiltered$ = this.filterResult$.pipe(map(f => f && f.total));
|
|
67
|
+
this.showQueryBuilder$ = this.query.selectShowQueryBuilder();
|
|
68
|
+
this.filterParameters$ = this.query.selectFilterParameters();
|
|
69
|
+
this.index$ = this.filterParameters$.pipe(map(f => Math.floor((f.start ?? 0) / (f.length ?? 1))));
|
|
70
|
+
this.length$ = this.filterParameters$.pipe(map(f => f.length));
|
|
71
|
+
this.isEmpty$ = this.recordsFiltered$.pipe(map(r => r === 0));
|
|
72
|
+
this.searchQuery$ = this.filterParameters$.pipe(map(f => f.search));
|
|
73
|
+
this.filterConfig$ = this.query.selectFilterConfig();
|
|
74
|
+
this.sortColumn$ = this.filterParameters$.pipe(map(f => (f.order && f.order.column) ?? ""));
|
|
75
|
+
this.sortDirection$ = this.filterParameters$.pipe(map(f => f.order && f.order.direction));
|
|
76
|
+
this.filterConfigLoading$ = this.query.selectFilterConfigLoading();
|
|
77
|
+
this.rules$ = this.filterParameters$.pipe(map(parameters => parameters.rules));
|
|
78
|
+
this.rulesCount$ = this.filterParameters$.pipe(map(parameters => parameters.rules?.length ?? 0));
|
|
79
|
+
this.searchText$ = new Subject();
|
|
80
|
+
this.setColumn(columns);
|
|
81
|
+
}
|
|
82
|
+
get prefixButtons() {
|
|
83
|
+
return this.buttons?.find(x => x.position === "prefix")?.template;
|
|
84
|
+
}
|
|
85
|
+
get suffixButtons() {
|
|
86
|
+
return this.buttons?.find(x => x.position === "suffix")?.template;
|
|
87
|
+
}
|
|
88
|
+
async ngOnInit() {
|
|
89
|
+
await this.service.init();
|
|
90
|
+
this.service.loadQueryParams(this.autoLoad);
|
|
91
|
+
this.searchText$
|
|
92
|
+
.pipe(debounceTime(300), distinctUntilChanged(), switchMap((search) => {
|
|
93
|
+
this.service.resetPaging();
|
|
94
|
+
return this.service.searchData(search);
|
|
95
|
+
}))
|
|
96
|
+
.subscribe();
|
|
97
|
+
this.mediaObserver.asObservable().subscribe(() => {
|
|
98
|
+
if (!this.autoChangeLayout) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (this.mediaObserver.isActive("lt-md") && this.layoutContent === LayoutContent.Table) {
|
|
102
|
+
this.layoutContent = LayoutContent.Cards;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.layoutContent = LayoutContent.Table;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
ngOnDestroy() {
|
|
110
|
+
this.service.closeSubscriptions();
|
|
111
|
+
}
|
|
112
|
+
ngOnChanges(changes) {
|
|
113
|
+
if ("mode" in changes) {
|
|
114
|
+
this.service.setMode(changes.mode.currentValue);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
setLoading(loading) {
|
|
118
|
+
this.service.setLoading(loading);
|
|
119
|
+
}
|
|
120
|
+
clickToggleShowQueryBuilder() {
|
|
121
|
+
this.service.toggleQueryBuilder();
|
|
122
|
+
}
|
|
123
|
+
onUpdateRules(rules) {
|
|
124
|
+
this.service.updateGlobalRules(rules);
|
|
125
|
+
}
|
|
126
|
+
onQueryBuilderFilterSelected(filterConfigurationModel) {
|
|
127
|
+
this.service.addRuleFromConfig(filterConfigurationModel);
|
|
128
|
+
}
|
|
129
|
+
onUpdatePage(pageEvent) {
|
|
130
|
+
this.service.loadNewPage(pageEvent.pageIndex * pageEvent.pageSize, pageEvent.pageSize);
|
|
131
|
+
this.newPage.emit(pageEvent);
|
|
132
|
+
}
|
|
133
|
+
onUpdateSearch(search) {
|
|
134
|
+
this.searchText$.next(search);
|
|
135
|
+
}
|
|
136
|
+
getFilterRule$(id) {
|
|
137
|
+
return this.filterParameters$.pipe(map(f => {
|
|
138
|
+
return (f.rules &&
|
|
139
|
+
f.rules[0] &&
|
|
140
|
+
f.rules[0].rules &&
|
|
141
|
+
f.rules[0].rules.find((r) => r.id === id));
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
onUpdateSort(sort) {
|
|
145
|
+
if (!sort.active || !sort.direction) {
|
|
146
|
+
sort = {
|
|
147
|
+
active: "id",
|
|
148
|
+
direction: "asc"
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
this.service.loadData({
|
|
152
|
+
order: sort.active && sort.direction ? { column: sort.active, direction: sort.direction } : null
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
updateRule(id, newRule) {
|
|
156
|
+
this.service.updateRule(id, newRule);
|
|
157
|
+
}
|
|
158
|
+
updateRules(rules) {
|
|
159
|
+
this.service.updateRules(rules);
|
|
160
|
+
}
|
|
161
|
+
clickExport() {
|
|
162
|
+
const exports = [];
|
|
163
|
+
if (this.exportsSettings.xlsx) {
|
|
164
|
+
exports.push({
|
|
165
|
+
type: "xlsx",
|
|
166
|
+
onClickExport: () => this.clickXlsx()
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
else if (this.exportsSettings.csv) {
|
|
170
|
+
exports.push({
|
|
171
|
+
type: "csv",
|
|
172
|
+
onClickExport: () => this.clickCsv()
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
else if (this.exportsSettings.pdf) {
|
|
176
|
+
exports.push({
|
|
177
|
+
type: "pdf",
|
|
178
|
+
onClickExport: () => this.clickPdf()
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
this.bottomSheet.open(ExportBottomSheetComponent, {
|
|
182
|
+
data: {
|
|
183
|
+
exportStrategies: [
|
|
184
|
+
...exports,
|
|
185
|
+
...this.customExport
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
navigate(item) {
|
|
191
|
+
if (this.navigateFn) {
|
|
192
|
+
this.navigateFn(this.baseRoute, item);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
const route = this.routeFn ? this.routeFn(item) : [(this.baseRoute || "") + item?.id];
|
|
196
|
+
this.router.navigate(typeof route === "string" ? [route] : route, { relativeTo: this.activatedRoute });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
clickXlsx() {
|
|
200
|
+
this.service.downloadData("xlsx");
|
|
201
|
+
}
|
|
202
|
+
clickCsv() {
|
|
203
|
+
this.service.downloadData("csv");
|
|
204
|
+
}
|
|
205
|
+
clickPrint() {
|
|
206
|
+
this.service.printData();
|
|
207
|
+
}
|
|
208
|
+
clickPdf() {
|
|
209
|
+
this.service.downloadData("pdf");
|
|
210
|
+
}
|
|
211
|
+
setColumn(columns) {
|
|
212
|
+
this.columns = columns;
|
|
213
|
+
this.columnNames = columns.map(x => x.id);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
NiceBaseListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NiceBaseListComponent, deps: [{ token: ENABLE_QUERY_BUILDER, optional: true }, { token: BASE_LIST_LAYOUT }, { token: TABLE_COLUMNS }, { token: EXPORTS_SETTINGS }, { token: i1.NiceBaseListQuery }, { token: i2.NiceBaseListService }, { token: i3.ActivatedRoute }, { token: i4.MatBottomSheet }, { token: i3.Router }, { token: i5.MediaObserver }], target: i0.ɵɵFactoryTarget.Component });
|
|
217
|
+
NiceBaseListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: NiceBaseListComponent, selector: "nice-base-list", inputs: { mode: "mode", layout: "layout", layoutContent: "layoutContent", autoChangeLayout: "autoChangeLayout", baseRoute: "baseRoute", routeFn: "routeFn", navigateFn: "navigateFn", autoLoad: "autoLoad", pageTitle: "pageTitle", canExport: "canExport", disableRouting: "disableRouting", customExport: "customExport" }, outputs: { newPage: "newPage" }, providers: [
|
|
218
|
+
NiceBaseListQuery,
|
|
219
|
+
NiceBaseListService,
|
|
220
|
+
NiceBaseListStore
|
|
221
|
+
], queries: [{ propertyName: "title", first: true, predicate: NiceBaseListTitleDirective, descendants: true, read: TemplateRef }, { propertyName: "table", first: true, predicate: NiceBaseListTableDirective, descendants: true, read: TemplateRef }, { propertyName: "cards", first: true, predicate: NiceBaseListCardsDirective, descendants: true, read: TemplateRef }, { propertyName: "customContent", first: true, predicate: NiceBaseListCustomContentDirective, descendants: true, read: TemplateRef }, { propertyName: "filters", first: true, predicate: NiceBaseListFiltersDirective, descendants: true, read: TemplateRef }, { propertyName: "buttons", predicate: NiceBaseListButtonsDirective }], usesOnChanges: true, ngImport: i0, template: "<div class=\"list page-layout carded fullwidth inner-scroll\" *ngIf=\"layout === 'page'; else content\">\n <div class=\"center\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n</div>\n\n<ng-template #content>\n <ng-container *ngIf=\"listLayout.xl\">\n <div class=\"hidden xl:block\">\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.xl }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"listLayout.lg\">\n <div class=\"hidden lg:block xl:hidden\">\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.lg }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"listLayout.md\">\n <div class=\"hidden md:block lg:hidden\">\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.md }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"listLayout.sm\">\n <div class=\"hidden sm:block md:hidden\">\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.sm }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"listLayout.xs\">\n <div class=\"block sm:hidden\">\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.xs }\"></ng-container>\n </div>\n </ng-container>\n\n <div\n [class.hidden]=\"!!listLayout.xs\"\n [class.block]=\"!listLayout.xs\"\n [class.sm:hidden]=\"!!listLayout.sm\"\n [class.sm:block]=\"!listLayout.sm\"\n [class.md:hidden]=\"!!listLayout.md\"\n [class.md:block]=\"!listLayout.md\"\n [class.lg:hidden]=\"!!listLayout.lg\"\n [class.lg:block]=\"!listLayout.lg\"\n [class.xl:hidden]=\"!!listLayout.xl\"\n [class.xl:block]=\"!listLayout.xl\"\n >\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.default }\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #pageLayout let-layout=\"layout\">\n <ng-container *ngIf=\"layout?.length; else isObject\">\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: { classes: ['flex flex-col'], items: layout } }\"></ng-container>\n </ng-container>\n\n <ng-template #isObject>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: layout }\"></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template #contentLayout let-layout=\"layout\">\n <div [ngClass]=\"layout.classes\">\n <ng-container *ngFor=\"let item of layout.items\">\n <ng-container *ngIf=\"item.name; else childIsLayout\">\n <ng-container *ngTemplateOutlet=\"layoutItem; context: { item: item }\"></ng-container>\n </ng-container>\n <ng-template #childIsLayout>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: item }\"></ng-container>\n </ng-template>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #layoutItem let-item=\"item\">\n <ng-container *ngIf=\"item.name === 'title' && title\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"title\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'search'\">\n <div [ngClass]=\"item.classes\">\n <div class=\"search-wrapper mx-md-0\">\n <div class=\"search flex flex-auto justify-start items-center\">\n <mat-icon>search</mat-icon>\n <input [ngModel]=\"searchQuery$ | async\" (ngModelChange)=\"onUpdateSearch($event)\" [placeholder]=\"'general.search' | translate\" />\n <ng-container *ngIf=\"enableQueryBuilder\">\n <button\n *ngIf=\"!(showQueryBuilder$ | async) && !(rulesCount$ | async)\"\n mat-icon-button\n niceQueryBuilderTrigger\n [queryBuilderFilters]=\"filterConfig$ | async\"\n [queryBuilderFiltersLoading]=\"(filterConfigLoading$ | async) || false\"\n (queryBuilderFilterSelected)=\"onQueryBuilderFilterSelected($event)\"\n [matTooltip]=\"'general.query_builder.show_advanced_search' | translate\"\n >\n <mat-icon\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n filter_list\n </mat-icon>\n </button>\n <button\n mat-icon-button\n *ngIf=\"!(showQueryBuilder$ | async) && (rulesCount$ | async)\"\n [disabled]=\"filterConfigLoading$ | async\"\n (click)=\"clickToggleShowQueryBuilder()\"\n [matTooltip]=\"'general.query_builder.show_advanced_search' | translate\"\n >\n <mat-icon\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n filter_list\n </mat-icon>\n </button>\n <button\n mat-icon-button\n *ngIf=\"showQueryBuilder$ | async\"\n (click)=\"clickToggleShowQueryBuilder()\"\n [matTooltip]=\"'general.query_builder.close_advanced_search' | translate\"\n >\n <mat-icon>\n clear\n </mat-icon>\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'prefixButtons' && prefixButtons\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"prefixButtons\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'suffixButtons' && suffixButtons\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"suffixButtons\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'exportButtons' && canExport\">\n <div [ngClass]=\"item.classes\" [class.mr-2]=\"!!suffixButtons\" [class.ml-2]=\"!!prefixButtons\">\n <button\n (click)=\"clickPrint()\"\n [disabled]=\"loading$ | async\"\n [matTooltip]=\"'general.print' | translate\"\n class=\"list-button mr-2\"\n mat-mini-fab\n >\n <mat-icon>print</mat-icon>\n </button>\n\n <button\n (click)=\"clickExport()\"\n [disabled]=\"loading$ | async\"\n [matTooltip]=\"'general.export' | translate\"\n class=\"list-button mr-2\"\n mat-mini-fab\n >\n <mat-icon>cloud_download</mat-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'content'\">\n <ng-container *ngIf=\"layoutContent === 'table' && table\">\n <ng-container *ngTemplateOutlet=\"tableLayout; context: { item: item }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'cards' && cards\">\n <ng-container *ngTemplateOutlet=\"cardsLayout; context: { item: item }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'custom' && customContent\">\n <ng-container *ngTemplateOutlet=\"customLayout; context: { item: item }\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'pagination' && layoutContent !== 'custom'\">\n <div [ngClass]=\"item.classes\">\n <mat-paginator\n (page)=\"onUpdatePage($event)\"\n [length]=\"recordsFiltered$ | async\"\n [pageIndex]=\"index$ | async\"\n [pageSizeOptions]=\"defaultPageSizeOptions\"\n [pageSize]=\"length$ | async\"\n [showFirstLastButtons]=\"true\"\n >\n </mat-paginator>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'queryBuilder' && enableQueryBuilder\">\n <div class=\"flex flex-col\" *ngIf=\"showQueryBuilder$ | async\">\n <mat-card class=\"my-4\" [niceLoadingOverlay]=\"filterConfigLoading$ | async\">\n <mat-card-content class=\"flex flex-col\">\n <div class=\"flex flex-auto\">\n <nice-query-builder\n [filterConfigs]=\"filterConfig$ | async\"\n [ngModel]=\"rules$ | async\"\n (ngModelChange)=\"onUpdateRules($event)\"\n (close)=\"clickToggleShowQueryBuilder()\"\n ></nice-query-builder>\n </div>\n </mat-card-content>\n </mat-card>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'filters' && filters\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"filters\"></ng-container>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #tableLayout let-item=\"item\">\n <div [ngClass]=\"item.classes\">\n <div\n [niceLoadingOverlay]=\"loading$ | async\"\n class=\"content-card base-list flex flex-col justify-between\"\n >\n <mat-table\n (matSortChange)=\"onUpdateSort($event)\"\n [dataSource]=\"data$\"\n [matSortActive]=\"(sortColumn$ | async) || ''\"\n [matSortDirection]=\"(sortDirection$ | async) || ''\"\n class=\"flex flex-col flex-auto\"\n matSort\n >\n <mat-header-row *matHeaderRowDef=\"columnNames; sticky: true\"></mat-header-row>\n\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.sortable\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ng-container\n *ngTemplateOutlet=\"table; context: { column: column.id, header: true }\"\n ></ng-container>\n </mat-header-cell>\n </ng-container>\n <ng-container *ngIf=\"!column.sortable\">\n <mat-header-cell *matHeaderCellDef>\n <ng-container\n *ngTemplateOutlet=\"table; context: { column: column.id, header: true }\"\n ></ng-container>\n </mat-header-cell>\n </ng-container>\n\n <mat-cell *matCellDef=\"let item\">\n <ng-container\n *ngTemplateOutlet=\"table; context: { column: column.id, data: true, item: item }\"\n ></ng-container>\n </mat-cell>\n </ng-container>\n\n <ng-container *ngIf=\"disableRouting; else withRouting\">\n <mat-row *matRowDef=\"let item; columns: columnNames;\" class=\"item\"></mat-row>\n </ng-container>\n\n <ng-template #withRouting>\n <mat-row\n *matRowDef=\"let item; columns: columnNames;\"\n (click)=\"navigate(item)\"\n class=\"item clickable\"\n matRipple\n >\n </mat-row>\n </ng-template>\n </mat-table>\n </div>\n </div>\n</ng-template>\n\n<ng-template #cardsLayout let-item=\"item\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngFor=\"let data of data$ | async\">\n <ng-container *ngTemplateOutlet=\"cards; context: { item: data }\"></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #customLayout let-item=\"item\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"customContent; context: { data: data$ | async }\"></ng-container>\n </div>\n</ng-template>\n", components: [{ type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i8.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { type: i9.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i10.QueryBuilderComponent, selector: "nice-query-builder", inputs: ["filterConfigs", "currentSavedReport", "loading"], outputs: ["close", "createReport", "updateReport"] }, { type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i12.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }], directives: [{ type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i15.QueryBuilderTriggerDirective, selector: "[niceQueryBuilderTrigger]", inputs: ["queryBuilderFilters", "queryBuilderFiltersLoading"], outputs: ["queryBuilderFilterSelected"] }, { type: i16.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i17.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgeColor", "matBadgeOverlap", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { type: i18.NiceLoadingDirective, selector: "[niceLoadingOverlay]", inputs: ["niceLoadingOverlay"] }, { type: i9.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i12.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i11.MatCellDef, selector: "[matCellDef]" }, { type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { type: i19.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }], pipes: { "async": i13.AsyncPipe, "translate": i20.TranslatePipe } });
|
|
222
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NiceBaseListComponent, decorators: [{
|
|
223
|
+
type: Component,
|
|
224
|
+
args: [{ selector: "nice-base-list", providers: [
|
|
225
|
+
NiceBaseListQuery,
|
|
226
|
+
NiceBaseListService,
|
|
227
|
+
NiceBaseListStore
|
|
228
|
+
], template: "<div class=\"list page-layout carded fullwidth inner-scroll\" *ngIf=\"layout === 'page'; else content\">\n <div class=\"center\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n</div>\n\n<ng-template #content>\n <ng-container *ngIf=\"listLayout.xl\">\n <div class=\"hidden xl:block\">\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.xl }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"listLayout.lg\">\n <div class=\"hidden lg:block xl:hidden\">\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.lg }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"listLayout.md\">\n <div class=\"hidden md:block lg:hidden\">\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.md }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"listLayout.sm\">\n <div class=\"hidden sm:block md:hidden\">\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.sm }\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"listLayout.xs\">\n <div class=\"block sm:hidden\">\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.xs }\"></ng-container>\n </div>\n </ng-container>\n\n <div\n [class.hidden]=\"!!listLayout.xs\"\n [class.block]=\"!listLayout.xs\"\n [class.sm:hidden]=\"!!listLayout.sm\"\n [class.sm:block]=\"!listLayout.sm\"\n [class.md:hidden]=\"!!listLayout.md\"\n [class.md:block]=\"!listLayout.md\"\n [class.lg:hidden]=\"!!listLayout.lg\"\n [class.lg:block]=\"!listLayout.lg\"\n [class.xl:hidden]=\"!!listLayout.xl\"\n [class.xl:block]=\"!listLayout.xl\"\n >\n <ng-container *ngTemplateOutlet=\"pageLayout; context: { layout: listLayout.default }\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #pageLayout let-layout=\"layout\">\n <ng-container *ngIf=\"layout?.length; else isObject\">\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: { classes: ['flex flex-col'], items: layout } }\"></ng-container>\n </ng-container>\n\n <ng-template #isObject>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: layout }\"></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template #contentLayout let-layout=\"layout\">\n <div [ngClass]=\"layout.classes\">\n <ng-container *ngFor=\"let item of layout.items\">\n <ng-container *ngIf=\"item.name; else childIsLayout\">\n <ng-container *ngTemplateOutlet=\"layoutItem; context: { item: item }\"></ng-container>\n </ng-container>\n <ng-template #childIsLayout>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: item }\"></ng-container>\n </ng-template>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #layoutItem let-item=\"item\">\n <ng-container *ngIf=\"item.name === 'title' && title\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"title\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'search'\">\n <div [ngClass]=\"item.classes\">\n <div class=\"search-wrapper mx-md-0\">\n <div class=\"search flex flex-auto justify-start items-center\">\n <mat-icon>search</mat-icon>\n <input [ngModel]=\"searchQuery$ | async\" (ngModelChange)=\"onUpdateSearch($event)\" [placeholder]=\"'general.search' | translate\" />\n <ng-container *ngIf=\"enableQueryBuilder\">\n <button\n *ngIf=\"!(showQueryBuilder$ | async) && !(rulesCount$ | async)\"\n mat-icon-button\n niceQueryBuilderTrigger\n [queryBuilderFilters]=\"filterConfig$ | async\"\n [queryBuilderFiltersLoading]=\"(filterConfigLoading$ | async) || false\"\n (queryBuilderFilterSelected)=\"onQueryBuilderFilterSelected($event)\"\n [matTooltip]=\"'general.query_builder.show_advanced_search' | translate\"\n >\n <mat-icon\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n filter_list\n </mat-icon>\n </button>\n <button\n mat-icon-button\n *ngIf=\"!(showQueryBuilder$ | async) && (rulesCount$ | async)\"\n [disabled]=\"filterConfigLoading$ | async\"\n (click)=\"clickToggleShowQueryBuilder()\"\n [matTooltip]=\"'general.query_builder.show_advanced_search' | translate\"\n >\n <mat-icon\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n filter_list\n </mat-icon>\n </button>\n <button\n mat-icon-button\n *ngIf=\"showQueryBuilder$ | async\"\n (click)=\"clickToggleShowQueryBuilder()\"\n [matTooltip]=\"'general.query_builder.close_advanced_search' | translate\"\n >\n <mat-icon>\n clear\n </mat-icon>\n </button>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'prefixButtons' && prefixButtons\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"prefixButtons\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'suffixButtons' && suffixButtons\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"suffixButtons\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'exportButtons' && canExport\">\n <div [ngClass]=\"item.classes\" [class.mr-2]=\"!!suffixButtons\" [class.ml-2]=\"!!prefixButtons\">\n <button\n (click)=\"clickPrint()\"\n [disabled]=\"loading$ | async\"\n [matTooltip]=\"'general.print' | translate\"\n class=\"list-button mr-2\"\n mat-mini-fab\n >\n <mat-icon>print</mat-icon>\n </button>\n\n <button\n (click)=\"clickExport()\"\n [disabled]=\"loading$ | async\"\n [matTooltip]=\"'general.export' | translate\"\n class=\"list-button mr-2\"\n mat-mini-fab\n >\n <mat-icon>cloud_download</mat-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'content'\">\n <ng-container *ngIf=\"layoutContent === 'table' && table\">\n <ng-container *ngTemplateOutlet=\"tableLayout; context: { item: item }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'cards' && cards\">\n <ng-container *ngTemplateOutlet=\"cardsLayout; context: { item: item }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'custom' && customContent\">\n <ng-container *ngTemplateOutlet=\"customLayout; context: { item: item }\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'pagination' && layoutContent !== 'custom'\">\n <div [ngClass]=\"item.classes\">\n <mat-paginator\n (page)=\"onUpdatePage($event)\"\n [length]=\"recordsFiltered$ | async\"\n [pageIndex]=\"index$ | async\"\n [pageSizeOptions]=\"defaultPageSizeOptions\"\n [pageSize]=\"length$ | async\"\n [showFirstLastButtons]=\"true\"\n >\n </mat-paginator>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'queryBuilder' && enableQueryBuilder\">\n <div class=\"flex flex-col\" *ngIf=\"showQueryBuilder$ | async\">\n <mat-card class=\"my-4\" [niceLoadingOverlay]=\"filterConfigLoading$ | async\">\n <mat-card-content class=\"flex flex-col\">\n <div class=\"flex flex-auto\">\n <nice-query-builder\n [filterConfigs]=\"filterConfig$ | async\"\n [ngModel]=\"rules$ | async\"\n (ngModelChange)=\"onUpdateRules($event)\"\n (close)=\"clickToggleShowQueryBuilder()\"\n ></nice-query-builder>\n </div>\n </mat-card-content>\n </mat-card>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'filters' && filters\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"filters\"></ng-container>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #tableLayout let-item=\"item\">\n <div [ngClass]=\"item.classes\">\n <div\n [niceLoadingOverlay]=\"loading$ | async\"\n class=\"content-card base-list flex flex-col justify-between\"\n >\n <mat-table\n (matSortChange)=\"onUpdateSort($event)\"\n [dataSource]=\"data$\"\n [matSortActive]=\"(sortColumn$ | async) || ''\"\n [matSortDirection]=\"(sortDirection$ | async) || ''\"\n class=\"flex flex-col flex-auto\"\n matSort\n >\n <mat-header-row *matHeaderRowDef=\"columnNames; sticky: true\"></mat-header-row>\n\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.sortable\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ng-container\n *ngTemplateOutlet=\"table; context: { column: column.id, header: true }\"\n ></ng-container>\n </mat-header-cell>\n </ng-container>\n <ng-container *ngIf=\"!column.sortable\">\n <mat-header-cell *matHeaderCellDef>\n <ng-container\n *ngTemplateOutlet=\"table; context: { column: column.id, header: true }\"\n ></ng-container>\n </mat-header-cell>\n </ng-container>\n\n <mat-cell *matCellDef=\"let item\">\n <ng-container\n *ngTemplateOutlet=\"table; context: { column: column.id, data: true, item: item }\"\n ></ng-container>\n </mat-cell>\n </ng-container>\n\n <ng-container *ngIf=\"disableRouting; else withRouting\">\n <mat-row *matRowDef=\"let item; columns: columnNames;\" class=\"item\"></mat-row>\n </ng-container>\n\n <ng-template #withRouting>\n <mat-row\n *matRowDef=\"let item; columns: columnNames;\"\n (click)=\"navigate(item)\"\n class=\"item clickable\"\n matRipple\n >\n </mat-row>\n </ng-template>\n </mat-table>\n </div>\n </div>\n</ng-template>\n\n<ng-template #cardsLayout let-item=\"item\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngFor=\"let data of data$ | async\">\n <ng-container *ngTemplateOutlet=\"cards; context: { item: data }\"></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #customLayout let-item=\"item\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"customContent; context: { data: data$ | async }\"></ng-container>\n </div>\n</ng-template>\n" }]
|
|
229
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
230
|
+
type: Optional
|
|
231
|
+
}, {
|
|
232
|
+
type: Inject,
|
|
233
|
+
args: [ENABLE_QUERY_BUILDER]
|
|
234
|
+
}] }, { type: undefined, decorators: [{
|
|
235
|
+
type: Inject,
|
|
236
|
+
args: [BASE_LIST_LAYOUT]
|
|
237
|
+
}] }, { type: undefined, decorators: [{
|
|
238
|
+
type: Inject,
|
|
239
|
+
args: [TABLE_COLUMNS]
|
|
240
|
+
}] }, { type: undefined, decorators: [{
|
|
241
|
+
type: Inject,
|
|
242
|
+
args: [EXPORTS_SETTINGS]
|
|
243
|
+
}] }, { type: i1.NiceBaseListQuery }, { type: i2.NiceBaseListService }, { type: i3.ActivatedRoute }, { type: i4.MatBottomSheet }, { type: i3.Router }, { type: i5.MediaObserver }]; }, propDecorators: { title: [{
|
|
244
|
+
type: ContentChild,
|
|
245
|
+
args: [NiceBaseListTitleDirective, { read: TemplateRef }]
|
|
246
|
+
}], buttons: [{
|
|
247
|
+
type: ContentChildren,
|
|
248
|
+
args: [NiceBaseListButtonsDirective]
|
|
249
|
+
}], table: [{
|
|
250
|
+
type: ContentChild,
|
|
251
|
+
args: [NiceBaseListTableDirective, { read: TemplateRef }]
|
|
252
|
+
}], cards: [{
|
|
253
|
+
type: ContentChild,
|
|
254
|
+
args: [NiceBaseListCardsDirective, { read: TemplateRef }]
|
|
255
|
+
}], customContent: [{
|
|
256
|
+
type: ContentChild,
|
|
257
|
+
args: [NiceBaseListCustomContentDirective, { read: TemplateRef }]
|
|
258
|
+
}], filters: [{
|
|
259
|
+
type: ContentChild,
|
|
260
|
+
args: [NiceBaseListFiltersDirective, { read: TemplateRef }]
|
|
261
|
+
}], mode: [{
|
|
262
|
+
type: Input
|
|
263
|
+
}], layout: [{
|
|
264
|
+
type: Input
|
|
265
|
+
}], layoutContent: [{
|
|
266
|
+
type: Input
|
|
267
|
+
}], autoChangeLayout: [{
|
|
268
|
+
type: Input
|
|
269
|
+
}], baseRoute: [{
|
|
270
|
+
type: Input
|
|
271
|
+
}], routeFn: [{
|
|
272
|
+
type: Input
|
|
273
|
+
}], navigateFn: [{
|
|
274
|
+
type: Input
|
|
275
|
+
}], autoLoad: [{
|
|
276
|
+
type: Input
|
|
277
|
+
}], pageTitle: [{
|
|
278
|
+
type: Input
|
|
279
|
+
}], canExport: [{
|
|
280
|
+
type: Input
|
|
281
|
+
}], disableRouting: [{
|
|
282
|
+
type: Input
|
|
283
|
+
}], customExport: [{
|
|
284
|
+
type: Input
|
|
285
|
+
}], newPage: [{
|
|
286
|
+
type: Output
|
|
287
|
+
}] } });
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlLWxpc3QvYmFzZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlLWxpc3QvYmFzZS1saXN0LnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sV0FBVyxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsMEJBQTBCLEVBQWtCLE1BQU0sMkJBQTJCLENBQUM7QUFDdkYsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0csT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDeEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDcEYsT0FB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QUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTWVkaWFPYnNlcnZlciB9IGZyb20gXCJAYW5ndWxhci9mbGV4LWxheW91dFwiO1xuaW1wb3J0IHsgTWF0Qm90dG9tU2hlZXQgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYm90dG9tLXNoZWV0XCI7XG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBTb3J0IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NvcnRcIjtcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBFeHBvcnRCb3R0b21TaGVldENvbXBvbmVudCwgRXhwb3J0U3RyYXRlZ3kgfSBmcm9tIFwiQHJlY3Vyc3l2ZS9uaWNlLXVpLWtpdC52MlwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgRmlsdGVyQ29uZmlndXJhdGlvbk1vZGVsIH0gZnJvbSBcIi4uLy4uL21vZGVscy9maWx0ZXIubW9kZWxcIjtcbmltcG9ydCB7IFF1ZXJ5TW9kZWwsIFF1ZXJ5UnVsZU1vZGVsIH0gZnJvbSBcIi4uLy4uL21vZGVscy9xdWVyeS5tb2RlbFwiO1xuaW1wb3J0IHsgQkFTRV9MSVNUX0xBWU9VVCwgRU5BQkxFX1FVRVJZX0JVSUxERVIsIEVYUE9SVFNfU0VUVElOR1MsIFRBQkxFX0NPTFVNTlMgfSBmcm9tIFwiLi9iYXNlLWxpc3QuY29uc3RhbnRcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdEJ1dHRvbnNEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC1idXR0b25zLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgTmljZUJhc2VMaXN0Q2FyZHNEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC1jYXJkcy5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdEN1c3RvbUNvbnRlbnREaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC1jdXN0b20tY29udGVudC5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdEZpbHRlcnNEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC1maWx0ZXJzLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgTmljZUJhc2VMaXN0VGFibGVEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC10YWJsZS5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdFRpdGxlRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9iYXNlLWxpc3QtdGl0bGUuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBUYWJsZUNvbHVtbnMgfSBmcm9tIFwiLi9tb2RlbHMvY29sdW1ucy5tb2RlbFwiO1xuaW1wb3J0IHsgRXhwb3J0U2V0dGluZ3MgfSBmcm9tIFwiLi9tb2RlbHMvZXhwb3J0Lm1vZGVsXCI7XG5pbXBvcnQgeyBCYXNlTGlzdExheW91dCwgTGF5b3V0Q29udGVudCB9IGZyb20gXCIuL21vZGVscy9sYXlvdXQubW9kZWxcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdFF1ZXJ5IH0gZnJvbSBcIi4vc3RvcmUvYmFzZS1saXN0LnF1ZXJ5XCI7XG5pbXBvcnQgeyBOaWNlQmFzZUxpc3RTZXJ2aWNlIH0gZnJvbSBcIi4vc3RvcmUvYmFzZS1saXN0LnNlcnZpY2VcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdFN0b3JlIH0gZnJvbSBcIi4vc3RvcmUvYmFzZS1saXN0LnN0b3JlXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm5pY2UtYmFzZS1saXN0XCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9iYXNlLWxpc3QudGVtcGxhdGUuaHRtbFwiLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBOaWNlQmFzZUxpc3RRdWVyeSxcbiAgICAgICAgTmljZUJhc2VMaXN0U2VydmljZSxcbiAgICAgICAgTmljZUJhc2VMaXN0U3RvcmVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE5pY2VCYXNlTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuICAgIEBDb250ZW50Q2hpbGQoTmljZUJhc2VMaXN0VGl0bGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgdGl0bGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAQ29udGVudENoaWxkcmVuKE5pY2VCYXNlTGlzdEJ1dHRvbnNEaXJlY3RpdmUpXG4gICAgcHVibGljIGJ1dHRvbnM6IE5pY2VCYXNlTGlzdEJ1dHRvbnNEaXJlY3RpdmVbXTtcblxuICAgIEBDb250ZW50Q2hpbGQoTmljZUJhc2VMaXN0VGFibGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgdGFibGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAQ29udGVudENoaWxkKE5pY2VCYXNlTGlzdENhcmRzRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGNhcmRzOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQENvbnRlbnRDaGlsZChOaWNlQmFzZUxpc3RDdXN0b21Db250ZW50RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGN1c3RvbUNvbnRlbnQ6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAQ29udGVudENoaWxkKE5pY2VCYXNlTGlzdEZpbHRlcnNEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZmlsdGVyczogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1vZGU6IFwibm9ybWFsXCIgfCBcImluZmluaXRlLXNjcm9sbFwiID0gXCJub3JtYWxcIjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxheW91dDogXCJwYWdlXCIgfCBcImNvbXBvbmVudFwiID0gXCJwYWdlXCI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsYXlvdXRDb250ZW50ID0gTGF5b3V0Q29udGVudC5UYWJsZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGF1dG9DaGFuZ2VMYXlvdXQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYmFzZVJvdXRlOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3V0ZUZuOiAoaXRlbTogYW55KSA9PiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG5hdmlnYXRlRm46IChiYXNlUm91dGU6IHN0cmluZywgaXRlbTogYW55KSA9PiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhdXRvTG9hZCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwYWdlVGl0bGU6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNhbkV4cG9ydCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlUm91dGluZyA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VzdG9tRXhwb3J0OiBFeHBvcnRTdHJhdGVneVtdID0gW107XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgbmV3UGFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZUV2ZW50PigpO1xuXG4gICAgcHVibGljIGRlZmF1bHRQYWdlU2l6ZU9wdGlvbnMgPSBbMTAsIDI1LCA1MCwgMTAwXTtcbiAgICBwdWJsaWMgY29sdW1uTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBwdWJsaWMgbG9hZGluZyQgPSB0aGlzLnF1ZXJ5LnNlbGVjdExvYWRpbmcoKTtcblxuICAgIHB1YmxpYyBmaWx0ZXJSZXN1bHQkID0gdGhpcy5xdWVyeS5zZWxlY3RGaWx0ZXJSZXN1bHQoKTtcbiAgICBwdWJsaWMgZGF0YSQgPSB0aGlzLnF1ZXJ5LnNlbGVjdERhdGEoKTtcbiAgICBwdWJsaWMgcmVjb3Jkc0ZpbHRlcmVkJCA9IHRoaXMuZmlsdGVyUmVzdWx0JC5waXBlKG1hcChmID0+IGYgJiYgZi50b3RhbCkpO1xuXG4gICAgcHVibGljIHNob3dRdWVyeUJ1aWxkZXIkID0gdGhpcy5xdWVyeS5zZWxlY3RTaG93UXVlcnlCdWlsZGVyKCk7XG4gICAgcHVibGljIGZpbHRlclBhcmFtZXRlcnMkID0gdGhpcy5xdWVyeS5zZWxlY3RGaWx0ZXJQYXJhbWV0ZXJzKCk7XG4gICAgcHVibGljIGluZGV4JCA9IHRoaXMuZmlsdGVyUGFyYW1ldGVycyQucGlwZShtYXAoZiA9PiBNYXRoLmZsb29yKChmLnN0YXJ0ID8/IDApIC8gKGYubGVuZ3RoID8/IDEpKSkpO1xuICAgIHB1YmxpYyBsZW5ndGgkID0gdGhpcy5maWx0ZXJQYXJhbWV0ZXJzJC5waXBlKG1hcChmID0+IGYubGVuZ3RoKSk7XG4gICAgcHVibGljIGlzRW1wdHkkID0gdGhpcy5yZWNvcmRzRmlsdGVyZWQkLnBpcGUobWFwKHIgPT4gciA9PT0gMCkpO1xuICAgIHB1YmxpYyBzZWFyY2hRdWVyeSQgPSB0aGlzLmZpbHRlclBhcmFtZXRlcnMkLnBpcGUobWFwKGYgPT4gZi5zZWFyY2gpKTtcbiAgICBwdWJsaWMgZmlsdGVyQ29uZmlnJCA9IHRoaXMucXVlcnkuc2VsZWN0RmlsdGVyQ29uZmlnKCk7XG4gICAgcHVibGljIHNvcnRDb2x1bW4kID0gdGhpcy5maWx0ZXJQYXJhbWV0ZXJzJC5waXBlKG1hcChmID0+IChmLm9yZGVyICYmIGYub3JkZXIuY29sdW1uKSA/PyBcIlwiKSk7XG4gICAgcHVibGljIHNvcnREaXJlY3Rpb24kID0gdGhpcy5maWx0ZXJQYXJhbWV0ZXJzJC5waXBlKG1hcChmID0+IGYub3JkZXIgJiYgZi5vcmRlci5kaXJlY3Rpb24pKTtcblxuICAgIHB1YmxpYyBmaWx0ZXJDb25maWdMb2FkaW5nJCA9IHRoaXMucXVlcnkuc2VsZWN0RmlsdGVyQ29uZmlnTG9hZGluZygpO1xuICAgIHB1YmxpYyBydWxlcyQgPSB0aGlzLmZpbHRlclBhcmFtZXRlcnMkLnBpcGUobWFwKHBhcmFtZXRlcnMgPT4gcGFyYW1ldGVycy5ydWxlcykpO1xuICAgIHB1YmxpYyBydWxlc0NvdW50JCA9IHRoaXMuZmlsdGVyUGFyYW1ldGVycyQucGlwZShtYXAocGFyYW1ldGVycyA9PiBwYXJhbWV0ZXJzLnJ1bGVzPy5sZW5ndGggPz8gMCkpO1xuXG4gICAgcHJpdmF0ZSBzZWFyY2hUZXh0JCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBASW5qZWN0KEVOQUJMRV9RVUVSWV9CVUlMREVSKVxuICAgICAgICBwdWJsaWMgZW5hYmxlUXVlcnlCdWlsZGVyOiBib29sZWFuLFxuICAgICAgICBASW5qZWN0KEJBU0VfTElTVF9MQVlPVVQpXG4gICAgICAgIHB1YmxpYyBsaXN0TGF5b3V0OiBCYXNlTGlzdExheW91dCxcbiAgICAgICAgQEluamVjdChUQUJMRV9DT0xVTU5TKVxuICAgICAgICBwdWJsaWMgY29sdW1uczogVGFibGVDb2x1bW5zW10sXG4gICAgICAgIEBJbmplY3QoRVhQT1JUU19TRVRUSU5HUylcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBleHBvcnRzU2V0dGluZ3M6IEV4cG9ydFNldHRpbmdzLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcXVlcnk6IE5pY2VCYXNlTGlzdFF1ZXJ5LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogTmljZUJhc2VMaXN0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm90dG9tU2hlZXQ6IE1hdEJvdHRvbVNoZWV0LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIG1lZGlhT2JzZXJ2ZXI6IE1lZGlhT2JzZXJ2ZXJcbiAgICApIHtcbiAgICAgICAgdGhpcy5zZXRDb2x1bW4oY29sdW1ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcmVmaXhCdXR0b25zKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5idXR0b25zPy5maW5kKHggPT4geC5wb3NpdGlvbiA9PT0gXCJwcmVmaXhcIik/LnRlbXBsYXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3VmZml4QnV0dG9ucygpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnV0dG9ucz8uZmluZCh4ID0+IHgucG9zaXRpb24gPT09IFwic3VmZml4XCIpPy50ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VydmljZS5pbml0KCk7XG4gICAgICAgIHRoaXMuc2VydmljZS5sb2FkUXVlcnlQYXJhbXModGhpcy5hdXRvTG9hZCk7XG5cbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0JFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHNlYXJjaCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UucmVzZXRQYWdpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5zZWFyY2hEYXRhKHNlYXJjaCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgICAgICB0aGlzLm1lZGlhT2JzZXJ2ZXIuYXNPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdXRvQ2hhbmdlTGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5tZWRpYU9ic2VydmVyLmlzQWN0aXZlKFwibHQtbWRcIikgJiYgdGhpcy5sYXlvdXRDb250ZW50ID09PSBMYXlvdXRDb250ZW50LlRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb250ZW50ID0gTGF5b3V0Q29udGVudC5DYXJkcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb250ZW50ID0gTGF5b3V0Q29udGVudC5UYWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuY2xvc2VTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKFwibW9kZVwiIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5zZXRNb2RlKGNoYW5nZXMubW9kZS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldExvYWRpbmcobG9hZGluZzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2Uuc2V0TG9hZGluZyhsb2FkaW5nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tUb2dnbGVTaG93UXVlcnlCdWlsZGVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UudG9nZ2xlUXVlcnlCdWlsZGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVXBkYXRlUnVsZXMocnVsZXM6IFF1ZXJ5TW9kZWxbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlR2xvYmFsUnVsZXMocnVsZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblF1ZXJ5QnVpbGRlckZpbHRlclNlbGVjdGVkKGZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbDogRmlsdGVyQ29uZmlndXJhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS5hZGRSdWxlRnJvbUNvbmZpZyhmaWx0ZXJDb25maWd1cmF0aW9uTW9kZWwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblVwZGF0ZVBhZ2UocGFnZUV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmxvYWROZXdQYWdlKHBhZ2VFdmVudC5wYWdlSW5kZXggKiBwYWdlRXZlbnQucGFnZVNpemUsIHBhZ2VFdmVudC5wYWdlU2l6ZSk7XG4gICAgICAgIHRoaXMubmV3UGFnZS5lbWl0KHBhZ2VFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVXBkYXRlU2VhcmNoKHNlYXJjaDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCQubmV4dChzZWFyY2gpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWx0ZXJSdWxlJChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxRdWVyeVJ1bGVNb2RlbCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJQYXJhbWV0ZXJzJC5waXBlKFxuICAgICAgICAgICAgbWFwKGYgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIGYucnVsZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgZi5ydWxlc1swXSAmJlxuICAgICAgICAgICAgICAgICAgICBmLnJ1bGVzWzBdLnJ1bGVzICYmXG4gICAgICAgICAgICAgICAgICAgIChmLnJ1bGVzWzBdLnJ1bGVzLmZpbmQoKHIpID0+IChyIGFzIFF1ZXJ5UnVsZU1vZGVsKS5pZCA9PT0gaWQpIGFzIFF1ZXJ5UnVsZU1vZGVsKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblVwZGF0ZVNvcnQoc29ydDogU29ydCk6IHZvaWQge1xuICAgICAgICBpZiAoIXNvcnQuYWN0aXZlIHx8ICFzb3J0LmRpcmVjdGlvbikge1xuICAgICAgICAgICAgc29ydCA9IHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IFwiaWRcIixcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFwiYXNjXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlcnZpY2UubG9hZERhdGEoe1xuICAgICAgICAgICAgb3JkZXI6IHNvcnQuYWN0aXZlICYmIHNvcnQuZGlyZWN0aW9uID8geyBjb2x1bW46IHNvcnQuYWN0aXZlLCBkaXJlY3Rpb246IHNvcnQuZGlyZWN0aW9uIH0gOiBudWxsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVSdWxlKGlkOiBzdHJpbmcsIG5ld1J1bGU6IFF1ZXJ5UnVsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS51cGRhdGVSdWxlKGlkLCBuZXdSdWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlUnVsZXMocnVsZXM6IFF1ZXJ5UnVsZU1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZVJ1bGVzKHJ1bGVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tFeHBvcnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGV4cG9ydHMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuZXhwb3J0c1NldHRpbmdzLnhsc3gpIHtcbiAgICAgICAgICAgIGV4cG9ydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ4bHN4XCIsXG4gICAgICAgICAgICAgICAgb25DbGlja0V4cG9ydDogKCkgPT4gdGhpcy5jbGlja1hsc3goKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5leHBvcnRzU2V0dGluZ3MuY3N2KSB7XG4gICAgICAgICAgICBleHBvcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiY3N2XCIsXG4gICAgICAgICAgICAgICAgb25DbGlja0V4cG9ydDogKCkgPT4gdGhpcy5jbGlja0NzdigpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV4cG9ydHNTZXR0aW5ncy5wZGYpIHtcbiAgICAgICAgICAgIGV4cG9ydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJwZGZcIixcbiAgICAgICAgICAgICAgICBvbkNsaWNrRXhwb3J0OiAoKSA9PiB0aGlzLmNsaWNrUGRmKClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm90dG9tU2hlZXQub3BlbihFeHBvcnRCb3R0b21TaGVldENvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGV4cG9ydFN0cmF0ZWdpZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgLi4uZXhwb3J0cyxcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5jdXN0b21FeHBvcnRcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuYXZpZ2F0ZShpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdGVGbikge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZUZuKHRoaXMuYmFzZVJvdXRlLCBpdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5yb3V0ZUZuID8gdGhpcy5yb3V0ZUZuKGl0ZW0pIDogWyh0aGlzLmJhc2VSb3V0ZSB8fCBcIlwiKSArIGl0ZW0/LmlkXTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKHR5cGVvZiByb3V0ZSA9PT0gXCJzdHJpbmdcIiA/IFtyb3V0ZV0gOiByb3V0ZSwgeyByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrWGxzeCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmRvd25sb2FkRGF0YShcInhsc3hcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrQ3N2KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuZG93bmxvYWREYXRhKFwiY3N2XCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGlja1ByaW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UucHJpbnREYXRhKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrUGRmKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuZG93bmxvYWREYXRhKFwicGRmXCIpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXRDb2x1bW4oY29sdW1uczogVGFibGVDb2x1bW5zW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lcyA9IGNvbHVtbnMubWFwKHggPT4geC5pZCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImxpc3QgcGFnZS1sYXlvdXQgY2FyZGVkIGZ1bGx3aWR0aCBpbm5lci1zY3JvbGxcIiAqbmdJZj1cImxheW91dCA9PT0gJ3BhZ2UnOyBlbHNlIGNvbnRlbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNjb250ZW50PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaXN0TGF5b3V0LnhsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4geGw6YmxvY2tcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdlTGF5b3V0OyBjb250ZXh0OiB7IGxheW91dDogbGlzdExheW91dC54bCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpc3RMYXlvdXQubGdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhpZGRlbiBsZzpibG9jayB4bDpoaWRkZW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdlTGF5b3V0OyBjb250ZXh0OiB7IGxheW91dDogbGlzdExheW91dC5sZyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpc3RMYXlvdXQubWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhpZGRlbiBtZDpibG9jayBsZzpoaWRkZW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdlTGF5b3V0OyBjb250ZXh0OiB7IGxheW91dDogbGlzdExheW91dC5tZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpc3RMYXlvdXQuc21cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhpZGRlbiBzbTpibG9jayBtZDpoaWRkZW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdlTGF5b3V0OyBjb250ZXh0OiB7IGxheW91dDogbGlzdExheW91dC5zbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxpc3RMYXlvdXQueHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJsb2NrIHNtOmhpZGRlblwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2VMYXlvdXQ7IGNvbnRleHQ6IHsgbGF5b3V0OiBsaXN0TGF5b3V0LnhzIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2XG4gICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiISFsaXN0TGF5b3V0LnhzXCJcbiAgICAgICAgW2NsYXNzLmJsb2NrXT1cIiFsaXN0TGF5b3V0LnhzXCJcbiAgICAgICAgW2NsYXNzLnNtOmhpZGRlbl09XCIhIWxpc3RMYXlvdXQuc21cIlxuICAgICAgICBbY2xhc3Muc206YmxvY2tdPVwiIWxpc3RMYXlvdXQuc21cIlxuICAgICAgICBbY2xhc3MubWQ6aGlkZGVuXT1cIiEhbGlzdExheW91dC5tZFwiXG4gICAgICAgIFtjbGFzcy5tZDpibG9ja109XCIhbGlzdExheW91dC5tZFwiXG4gICAgICAgIFtjbGFzcy5sZzpoaWRkZW5dPVwiISFsaXN0TGF5b3V0LmxnXCJcbiAgICAgICAgW2NsYXNzLmxnOmJsb2NrXT1cIiFsaXN0TGF5b3V0LmxnXCJcbiAgICAgICAgW2NsYXNzLnhsOmhpZGRlbl09XCIhIWxpc3RMYXlvdXQueGxcIlxuICAgICAgICBbY2xhc3MueGw6YmxvY2tdPVwiIWxpc3RMYXlvdXQueGxcIlxuICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2VMYXlvdXQ7IGNvbnRleHQ6IHsgbGF5b3V0OiBsaXN0TGF5b3V0LmRlZmF1bHQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwYWdlTGF5b3V0IGxldC1sYXlvdXQ9XCJsYXlvdXRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGF5b3V0Py5sZW5ndGg7IGVsc2UgaXNPYmplY3RcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRMYXlvdXQ7IGNvbnRleHQ6IHsgbGF5b3V0OiB7IGNsYXNzZXM6IFsnZmxleCBmbGV4LWNvbCddLCBpdGVtczogbGF5b3V0IH0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNpc09iamVjdD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRMYXlvdXQ7IGNvbnRleHQ6IHsgbGF5b3V0OiBsYXlvdXQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRlbnRMYXlvdXQgbGV0LWxheW91dD1cImxheW91dFwiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwibGF5b3V0LmNsYXNzZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsYXlvdXQuaXRlbXNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWU7IGVsc2UgY2hpbGRJc0xheW91dFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYXlvdXRJdGVtOyBjb250ZXh0OiB7IGl0ZW06IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoaWxkSXNMYXlvdXQ+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRMYXlvdXQ7IGNvbnRleHQ6IHsgbGF5b3V0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsYXlvdXRJdGVtIGxldC1pdGVtPVwiaXRlbVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICd0aXRsZScgJiYgdGl0bGVcIj5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdzZWFyY2gnXCI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLXdyYXBwZXIgbXgtbWQtMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2ggZmxleCBmbGV4LWF1dG8ganVzdGlmeS1zdGFydCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbbmdNb2RlbF09XCJzZWFyY2hRdWVyeSQgfCBhc3luY1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlU2VhcmNoKCRldmVudClcIiBbcGxhY2Vob2xkZXJdPVwiJ2dlbmVyYWwuc2VhcmNoJyB8IHRyYW5zbGF0ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbmFibGVRdWVyeUJ1aWxkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhKHNob3dRdWVyeUJ1aWxkZXIkIHwgYXN5bmMpICYmICEocnVsZXNDb3VudCQgfCBhc3luYylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZVF1ZXJ5QnVpbGRlclRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5QnVpbGRlckZpbHRlcnNdPVwiZmlsdGVyQ29uZmlnJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5QnVpbGRlckZpbHRlcnNMb2FkaW5nXT1cIihmaWx0ZXJDb25maWdMb2FkaW5nJCB8IGFzeW5jKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxdWVyeUJ1aWxkZXJGaWx0ZXJTZWxlY3RlZCk9XCJvblF1ZXJ5QnVpbGRlckZpbHRlclNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInZ2VuZXJhbC5xdWVyeV9idWlsZGVyLnNob3dfYWR2YW5jZWRfc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRCYWRnZV09XCJydWxlc0NvdW50JCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEJhZGdlSGlkZGVuXT1cIiEocnVsZXNDb3VudCQgfCBhc3luYylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9saXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhKHNob3dRdWVyeUJ1aWxkZXIkIHwgYXN5bmMpICYmIChydWxlc0NvdW50JCB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJDb25maWdMb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrVG9nZ2xlU2hvd1F1ZXJ5QnVpbGRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2dlbmVyYWwucXVlcnlfYnVpbGRlci5zaG93X2FkdmFuY2VkX3NlYXJjaCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VdPVwicnVsZXNDb3VudCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRCYWRnZUhpZGRlbl09XCIhKHJ1bGVzQ291bnQkIHwgYXN5bmMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0QmFkZ2VDb2xvcj1cImFjY2VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dRdWVyeUJ1aWxkZXIkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja1RvZ2dsZVNob3dRdWVyeUJ1aWxkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2dlbmVyYWwucXVlcnlfYnVpbGRlci5jbG9zZV9hZHZhbmNlZF9zZWFyY2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdwcmVmaXhCdXR0b25zJyAmJiBwcmVmaXhCdXR0b25zXCI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJlZml4QnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdzdWZmaXhCdXR0b25zJyAmJiBzdWZmaXhCdXR0b25zXCI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3VmZml4QnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdleHBvcnRCdXR0b25zJyAmJiBjYW5FeHBvcnRcIj5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIiBbY2xhc3MubXItMl09XCIhIXN1ZmZpeEJ1dHRvbnNcIiBbY2xhc3MubWwtMl09XCIhIXByZWZpeEJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrUHJpbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2dlbmVyYWwucHJpbnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWJ1dHRvbiBtci0yXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0LW1pbmktZmFiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPnByaW50PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0V4cG9ydCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInZ2VuZXJhbC5leHBvcnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWJ1dHRvbiBtci0yXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0LW1pbmktZmFiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3VkX2Rvd25sb2FkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdjb250ZW50J1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGF5b3V0Q29udGVudCA9PT0gJ3RhYmxlJyAmJiB0YWJsZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlTGF5b3V0OyBjb250ZXh0OiB7IGl0ZW06IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dENvbnRlbnQgPT09ICdjYXJkcycgJiYgY2FyZHNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXJkc0xheW91dDsgY29udGV4dDogeyBpdGVtOiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYXlvdXRDb250ZW50ID09PSAnY3VzdG9tJyAmJiBjdXN0b21Db250ZW50XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tTGF5b3V0OyBjb250ZXh0OiB7IGl0ZW06IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdwYWdpbmF0aW9uJyAmJiBsYXlvdXRDb250ZW50ICE9PSAnY3VzdG9tJ1wiPlxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3Nlc1wiPlxuICAgICAgICAgICAgPG1hdC1wYWdpbmF0b3JcbiAgICAgICAgICAgICAgICAocGFnZSk9XCJvblVwZGF0ZVBhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2xlbmd0aF09XCJyZWNvcmRzRmlsdGVyZWQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFtwYWdlSW5kZXhdPVwiaW5kZXgkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiZGVmYXVsdFBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cImxlbmd0aCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdxdWVyeUJ1aWxkZXInICYmIGVuYWJsZVF1ZXJ5QnVpbGRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwic2hvd1F1ZXJ5QnVpbGRlciQgfCBhc3luY1wiPlxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibXktNFwiIFtuaWNlTG9hZGluZ092ZXJsYXldPVwiZmlsdGVyQ29uZmlnTG9hZGluZyQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuaWNlLXF1ZXJ5LWJ1aWxkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyQ29uZmlnc109XCJmaWx0ZXJDb25maWckIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInJ1bGVzJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblVwZGF0ZVJ1bGVzKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZSk9XCJjbGlja1RvZ2dsZVNob3dRdWVyeUJ1aWxkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9uaWNlLXF1ZXJ5LWJ1aWxkZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0ubmFtZSA9PT0gJ2ZpbHRlcnMnICYmIGZpbHRlcnNcIj5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmaWx0ZXJzXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0YWJsZUxheW91dCBsZXQtaXRlbT1cIml0ZW1cIj5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3Nlc1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25pY2VMb2FkaW5nT3ZlcmxheV09XCJsb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnQtY2FyZCBiYXNlLWxpc3QgZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LXRhYmxlXG4gICAgICAgICAgICAgICAgICAgIChtYXRTb3J0Q2hhbmdlKT1cIm9uVXBkYXRlU29ydCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YSRcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0U29ydEFjdGl2ZV09XCIoc29ydENvbHVtbiQgfCBhc3luYykgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0U29ydERpcmVjdGlvbl09XCIoc29ydERpcmVjdGlvbiQgfCBhc3luYykgfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0U29ydFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uTmFtZXM7IHN0aWNreTogdHJ1ZVwiPjwvbWF0LWhlYWRlci1yb3c+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uc29ydGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGU7IGNvbnRleHQ6IHsgY29sdW1uOiBjb2x1bW4uaWQsIGhlYWRlcjogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLnNvcnRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGU7IGNvbnRleHQ6IHsgY29sdW1uOiBjb2x1bW4uaWQsIGhlYWRlcjogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZTsgY29udGV4dDogeyBjb2x1bW46IGNvbHVtbi5pZCwgZGF0YTogdHJ1ZSwgaXRlbTogaXRlbSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNhYmxlUm91dGluZzsgZWxzZSB3aXRoUm91dGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IGl0ZW07IGNvbHVtbnM6IGNvbHVtbk5hbWVzO1wiIGNsYXNzPVwiaXRlbVwiPjwvbWF0LXJvdz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjd2l0aFJvdXRpbmc+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCBpdGVtOyBjb2x1bW5zOiBjb2x1bW5OYW1lcztcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtIGNsaWNrYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0UmlwcGxlXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtcm93PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L21hdC10YWJsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NhcmRzTGF5b3V0IGxldC1pdGVtPVwiaXRlbVwiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGEgb2YgZGF0YSQgfCBhc3luY1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcmRzOyBjb250ZXh0OiB7IGl0ZW06IGRhdGEgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY3VzdG9tTGF5b3V0IGxldC1pdGVtPVwiaXRlbVwiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Db250ZW50OyBjb250ZXh0OiB7IGRhdGE6IGRhdGEkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|