@recursyve/nice-data-filter-kit 13.1.6 → 13.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/esm2020/lib/api/filter.api.mjs +42 -1
  2. package/esm2020/lib/components/base-list/base-list.component.mjs +4 -4
  3. package/esm2020/lib/components/base-list/directives/base-list-table.directive.mjs +7 -4
  4. package/esm2020/lib/components/base-list/models/icons.model.mjs +1 -1
  5. package/esm2020/lib/components/base-list/providers/base-filter.service.mjs +7 -5
  6. package/esm2020/lib/components/multi-state-list/multi-state-list.component.mjs +3 -3
  7. package/esm2020/lib/components/multi-state-list/providers/multi-state-filter.service.mjs +1 -1
  8. package/esm2020/lib/components/query-builder/filter-selection/filter-selection.component.mjs +8 -7
  9. package/esm2020/lib/components/query-builder/pipes/filter-group-icon.pipe.mjs +8 -2
  10. package/esm2020/lib/components/query-builder/providers/filter-group.service.mjs +1 -1
  11. package/fesm2015/recursyve-nice-data-filter-kit.mjs +80 -25
  12. package/fesm2015/recursyve-nice-data-filter-kit.mjs.map +1 -1
  13. package/fesm2020/recursyve-nice-data-filter-kit.mjs +78 -25
  14. package/fesm2020/recursyve-nice-data-filter-kit.mjs.map +1 -1
  15. package/lib/api/filter.api.d.ts +27 -2
  16. package/lib/components/base-list/base-list.component.d.ts +2 -1
  17. package/lib/components/base-list/directives/base-list-table.directive.d.ts +2 -1
  18. package/lib/components/base-list/models/icons.model.d.ts +4 -0
  19. package/lib/components/base-list/providers/base-filter.service.d.ts +3 -3
  20. package/lib/components/multi-state-list/providers/multi-state-filter.service.d.ts +3 -3
  21. package/lib/components/query-builder/pipes/filter-group-icon.pipe.d.ts +2 -1
  22. package/lib/components/query-builder/providers/filter-group.service.d.ts +2 -1
  23. package/package.json +3 -3
@@ -48,4 +48,45 @@ export class NiceFilterApi {
48
48
  return [routeOfQueryParams ?? "", query];
49
49
  }
50
50
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvYXBpL2ZpbHRlci5hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFrQi9ELE1BQU0sT0FBTyxhQUFhO0lBQ3RCLFlBQW9CLFlBQW9CLEVBQVUsSUFBWSxFQUFZLElBQWdCO1FBQXRFLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFZLFNBQUksR0FBSixJQUFJLENBQVk7SUFDMUYsQ0FBQztJQUVNLE1BQU0sQ0FBQyxVQUE0QixFQUFFLFNBQTBCLEVBQUU7UUFDcEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBb0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVNLFdBQVcsQ0FBQyxVQUE0QjtRQUMzQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFZLEVBQUUsVUFBNEI7UUFDMUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsVUFBNEI7UUFDaEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzNGLENBQUM7SUFFTSxlQUFlLENBQUMsU0FBMEIsRUFBRTtRQUMvQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUE2QixJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxFQUFVLEVBQUUsS0FBYTtRQUM5QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDckIsS0FBSyxHQUFHLEVBQUUsQ0FBQztTQUNkO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBc0IsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsRUFBRSxVQUFVLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRU0seUJBQXlCLENBQUMsRUFBVSxFQUFFLFVBQWtCO1FBQzNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQW9CLElBQUksQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUUsZUFBZSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUlTLEdBQUcsQ0FBQyxHQUFHLElBQWdDO1FBQzdDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2pGLElBQUksS0FBSyxFQUFFO1lBQ1AsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7U0FDaEU7UUFFRCxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFnQztRQUNyRCxNQUFNLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxPQUFPLGtCQUFrQixLQUFLLFFBQVEsRUFBRTtnQkFDeEMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDL0I7WUFFRCxPQUFPLENBQUMsRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7U0FDbkM7UUFFRCxPQUFPLENBQUUsa0JBQTZCLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBDb250ZXh0LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1xuICAgIEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICBGaWx0ZXJRdWVyeU1vZGVsLFxuICAgIEZpbHRlclJlc3VsdE1vZGVsLFxuICAgIFNlbGVjdEZpbHRlclZhbHVlXG59IGZyb20gXCIuLi9tb2RlbHMvZmlsdGVyLm1vZGVsXCI7XG5pbXBvcnQgeyBRdWVyeVBhcmFtc1V0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL3F1ZXJ5LXBhcmFtcy51dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5pY2VIdHRwT3B0aW9ucyB7XG4gICAgaGVhZGVycz86IEh0dHBIZWFkZXJzIHwge1xuICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICB9O1xuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dDtcbiAgICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwge1xuICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICAgIH07XG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xuICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlQYXJhbXMge1xuICAgIFtwYXJhbTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgTmljZUZpbHRlckFwaTxUPiB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmaWx0ZXJBcGlVcmw6IHN0cmluZywgcHJpdmF0ZSBwYXRoOiBzdHJpbmcsIHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbHRlcihxdWVyeU1vZGVsOiBGaWx0ZXJRdWVyeU1vZGVsLCBvcHRpb246IE5pY2VIdHRwT3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxGaWx0ZXJSZXN1bHRNb2RlbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8RmlsdGVyUmVzdWx0TW9kZWw+KHRoaXMudXJsKFwiZmlsdGVyXCIpLCBxdWVyeU1vZGVsLCBvcHRpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaWx0ZXJDb3VudChxdWVyeU1vZGVsOiBGaWx0ZXJRdWVyeU1vZGVsKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PG51bWJlcj4odGhpcy51cmwoXCJmaWx0ZXItY291bnRcIiksIHF1ZXJ5TW9kZWwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkb3dubG9hZERhdGEodHlwZTogc3RyaW5nLCBxdWVyeU1vZGVsOiBGaWx0ZXJRdWVyeU1vZGVsKTogT2JzZXJ2YWJsZTxCbG9iPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnVybChgZG93bmxvYWQvJHt0eXBlfWApLCBxdWVyeU1vZGVsLCB7IHJlc3BvbnNlVHlwZTogXCJibG9iXCIgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFByaW50YWJsZUh0bWwocXVlcnlNb2RlbDogRmlsdGVyUXVlcnlNb2RlbCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnVybChgZG93bmxvYWQvaHRtbGApLCBxdWVyeU1vZGVsLCB7IHJlc3BvbnNlVHlwZTogXCJ0ZXh0XCIgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpbHRlckNvbmZpZyhvcHRpb246IE5pY2VIdHRwT3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxGaWx0ZXJDb25maWd1cmF0aW9uTW9kZWxbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxGaWx0ZXJDb25maWd1cmF0aW9uTW9kZWxbXT4odGhpcy51cmwoXCJmaWx0ZXIvY29uZmlnXCIpLCBvcHRpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWFyY2hGaWx0ZXJWYWx1ZShpZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZWxlY3RGaWx0ZXJWYWx1ZVtdPiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxTZWxlY3RGaWx0ZXJWYWx1ZVtdPih0aGlzLnVybChgZmlsdGVyL2NvbmZpZy92YWx1ZT9pZD0ke2lkfSZ2YWx1ZT0ke3ZhbHVlfWApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VhcmNoRmlsdGVyUmVzb3VyY2VWYWx1ZShpZDogc3RyaW5nLCByZXNvdXJjZUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFNlbGVjdEZpbHRlclZhbHVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFNlbGVjdEZpbHRlclZhbHVlPih0aGlzLnVybChgZmlsdGVyL2NvbmZpZy9pZD9pZD0ke2lkfSZyZXNvdXJjZUlkPSR7cmVzb3VyY2VJZH1gKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHVybChyb3V0ZT86IHN0cmluZywgcXVlcnlQYXJhbXM/OiBvYmplY3QpOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHVybChxdWVyeVBhcmFtczogb2JqZWN0KTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCB1cmwoLi4uYXJnczogW3N0cmluZyB8IG9iamVjdCwgb2JqZWN0P10pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbcm91dGUsIHF1ZXJ5UGFyYW1zXSA9IHRoaXMudHJhbnNmb3JtVXJsQXJncyhhcmdzKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gcXVlcnlQYXJhbXMgPyBgPyR7UXVlcnlQYXJhbXNVdGlscy5mcm9tT2JqZWN0KHF1ZXJ5UGFyYW1zKX1gIDogXCJcIjtcbiAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5maWx0ZXJBcGlVcmx9LyR7dGhpcy5wYXRofS8ke3JvdXRlfSR7cGFyYW1zfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dGhpcy5maWx0ZXJBcGlVcmx9LyR7dGhpcy5wYXRofSR7cGFyYW1zfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1VcmxBcmdzKGFyZ3M6IFtzdHJpbmcgfCBvYmplY3QsIG9iamVjdD9dKTogW3JvdXRlOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zPzogb2JqZWN0XSB7XG4gICAgICAgIGNvbnN0IFtyb3V0ZU9mUXVlcnlQYXJhbXMsIHF1ZXJ5XSA9IGFyZ3M7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZU9mUXVlcnlQYXJhbXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3JvdXRlT2ZRdWVyeVBhcmFtc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbXCJcIiwgcm91dGVPZlF1ZXJ5UGFyYW1zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbKHJvdXRlT2ZRdWVyeVBhcmFtcyBhcyBzdHJpbmcpID8/IFwiXCIsIHF1ZXJ5XTtcbiAgICB9XG59XG4iXX0=
51
+ export function mixinNiceFilterApi(base) {
52
+ return class extends base {
53
+ filter(queryModel, option = {}) {
54
+ return this.post("filter", queryModel, option);
55
+ }
56
+ filterCount(queryModel) {
57
+ return this.post("filter-count", queryModel);
58
+ }
59
+ downloadData(type, queryModel) {
60
+ return this.post(`download/${type}`, queryModel, { responseType: "blob" });
61
+ }
62
+ getPrintableHtml(queryModel) {
63
+ return this.post(`download/html`, queryModel, { responseType: "text" });
64
+ }
65
+ getFilterConfig(option = {}) {
66
+ return this.get("filter/config", option);
67
+ }
68
+ searchFilterValue(id, value) {
69
+ if (value === undefined) {
70
+ value = "";
71
+ }
72
+ return this.get("filter/config/value", {
73
+ params: {
74
+ id,
75
+ value
76
+ }
77
+ });
78
+ }
79
+ searchFilterResourceValue(id, resourceId) {
80
+ return this.get("filter/config/id", {
81
+ params: {
82
+ id,
83
+ resourceId
84
+ }
85
+ });
86
+ }
87
+ constructor(...args) {
88
+ super(...args);
89
+ }
90
+ };
91
+ }
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvYXBpL2ZpbHRlci5hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUE0Qi9ELE1BQU0sT0FBTyxhQUFhO0lBQ3RCLFlBQW9CLFlBQW9CLEVBQVUsSUFBWSxFQUFZLElBQWdCO1FBQXRFLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFZLFNBQUksR0FBSixJQUFJLENBQVk7SUFDMUYsQ0FBQztJQUVNLE1BQU0sQ0FBQyxVQUE0QixFQUFFLFNBQTBCLEVBQUU7UUFDcEUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBdUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVNLFdBQVcsQ0FBQyxVQUE0QjtRQUMzQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFZLEVBQUUsVUFBNEI7UUFDMUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsVUFBNEI7UUFDaEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVB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QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQTZCLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRU0saUJBQWlCLENBQUMsRUFBVSxFQUFFLEtBQWE7WUFDOUMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUNyQixLQUFLLEdBQUcsRUFBRSxDQUFDO2FBQ2Q7WUFFRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQXNCLHFCQUFxQixFQUFFO2dCQUN4RCxNQUFNLEVBQUU7b0JBQ0osRUFBRTtvQkFDRixLQUFLO2lCQUNSO2FBQ0osQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVNLHlCQUF5QixDQUFDLEVBQVUsRUFBRSxVQUFrQjtZQUMzRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQW9CLGtCQUFrQixFQUFFO2dCQUNuRCxNQUFNLEVBQUU7b0JBQ0osRUFBRTtvQkFDRixVQUFVO2lCQUNiO2FBQ0osQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELFlBQVksR0FBRyxJQUFXO1lBQ3RCLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ25CLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBDb250ZXh0LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHsgSHR0cE9wdGlvbnMsIE5pY2VIdHRwRXhjZXB0aW9uRmFjdG9yeSB9IGZyb20gXCJAcmVjdXJzeXZlL25pY2UtdWkta2l0LnYyXCI7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnN0cnVjdG9yLCBDb25zdHJ1Y3RvciB9IGZyb20gXCJAcmVjdXJzeXZlL25pY2UtdWkta2l0LnYyL2xpYi90eXBlcy9jb25zdHJ1Y3RvclwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1xuICAgIEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbCxcbiAgICBGaWx0ZXJRdWVyeU1vZGVsLFxuICAgIEZpbHRlclJlc3VsdE1vZGVsLFxuICAgIFNlbGVjdEZpbHRlclZhbHVlXG59IGZyb20gXCIuLi9tb2RlbHMvZmlsdGVyLm1vZGVsXCI7XG5pbXBvcnQgeyBRdWVyeVBhcmFtc1V0aWxzIH0gZnJvbSBcIi4uL3V0aWxzL3F1ZXJ5LXBhcmFtcy51dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5pY2VIdHRwT3B0aW9ucyB7XG4gICAgaGVhZGVycz86IEh0dHBIZWFkZXJzIHwge1xuICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICB9O1xuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dDtcbiAgICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwge1xuICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICAgIH07XG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xuICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlQYXJhbXMge1xuICAgIFtwYXJhbTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5pY2VGaWx0ZXJBcGlEZWZpbml0aW9uIHtcbiAgICBmaWx0ZXIocXVlcnlNb2RlbDogRmlsdGVyUXVlcnlNb2RlbCwgb3B0aW9uPzogSHR0cE9wdGlvbnMpOiBPYnNlcnZhYmxlPEZpbHRlclJlc3VsdE1vZGVsPjtcbiAgICBmaWx0ZXJDb3VudChxdWVyeU1vZGVsOiBGaWx0ZXJRdWVyeU1vZGVsKTogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAgIGRvd25sb2FkRGF0YSh0eXBlOiBzdHJpbmcsIHF1ZXJ5TW9kZWw6IEZpbHRlclF1ZXJ5TW9kZWwpOiBPYnNlcnZhYmxlPEJsb2I+O1xuICAgIGdldFByaW50YWJsZUh0bWwocXVlcnlNb2RlbDogRmlsdGVyUXVlcnlNb2RlbCk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBnZXRGaWx0ZXJDb25maWcob3B0aW9uPzogSHR0cE9wdGlvbnMpOiBPYnNlcnZhYmxlPEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbFtdPjtcbiAgICBzZWFyY2hGaWx0ZXJWYWx1ZShpZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZWxlY3RGaWx0ZXJWYWx1ZVtdPjtcbiAgICBzZWFyY2hGaWx0ZXJSZXNvdXJjZVZhbHVlKGlkOiBzdHJpbmcsIHJlc291cmNlSWQ6IG51bWJlcik6IE9ic2VydmFibGU8U2VsZWN0RmlsdGVyVmFsdWU+O1xufVxuXG5leHBvcnQgY2xhc3MgTmljZUZpbHRlckFwaTxUPiBpbXBsZW1lbnRzIE5pY2VGaWx0ZXJBcGlEZWZpbml0aW9uIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZpbHRlckFwaVVybDogc3RyaW5nLCBwcml2YXRlIHBhdGg6IHN0cmluZywgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmlsdGVyKHF1ZXJ5TW9kZWw6IEZpbHRlclF1ZXJ5TW9kZWwsIG9wdGlvbjogTmljZUh0dHBPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPEZpbHRlclJlc3VsdE1vZGVsPFQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxGaWx0ZXJSZXN1bHRNb2RlbDxUPj4odGhpcy51cmwoXCJmaWx0ZXJcIiksIHF1ZXJ5TW9kZWwsIG9wdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbHRlckNvdW50KHF1ZXJ5TW9kZWw6IEZpbHRlclF1ZXJ5TW9kZWwpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8bnVtYmVyPih0aGlzLnVybChcImZpbHRlci1jb3VudFwiKSwgcXVlcnlNb2RlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRvd25sb2FkRGF0YSh0eXBlOiBzdHJpbmcsIHF1ZXJ5TW9kZWw6IEZpbHRlclF1ZXJ5TW9kZWwpOiBPYnNlcnZhYmxlPEJsb2I+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMudXJsKGBkb3dubG9hZC8ke3R5cGV9YCksIHF1ZXJ5TW9kZWwsIHsgcmVzcG9uc2VUeXBlOiBcImJsb2JcIiB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UHJpbnRhYmxlSHRtbChxdWVyeU1vZGVsOiBGaWx0ZXJRdWVyeU1vZGVsKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMudXJsKGBkb3dubG9hZC9odG1sYCksIHF1ZXJ5TW9kZWwsIHsgcmVzcG9uc2VUeXBlOiBcInRleHRcIiB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmlsdGVyQ29uZmlnKG9wdGlvbjogTmljZUh0dHBPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbFtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbFtdPih0aGlzLnVybChcImZpbHRlci9jb25maWdcIiksIG9wdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIHNlYXJjaEZpbHRlclZhbHVlKGlkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlbGVjdEZpbHRlclZhbHVlW10+IHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFNlbGVjdEZpbHRlclZhbHVlW10+KHRoaXMudXJsKGBmaWx0ZXIvY29uZmlnL3ZhbHVlP2lkPSR7aWR9JnZhbHVlPSR7dmFsdWV9YCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWFyY2hGaWx0ZXJSZXNvdXJjZVZhbHVlKGlkOiBzdHJpbmcsIHJlc291cmNlSWQ6IG51bWJlcik6IE9ic2VydmFibGU8U2VsZWN0RmlsdGVyVmFsdWU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8U2VsZWN0RmlsdGVyVmFsdWU+KHRoaXMudXJsKGBmaWx0ZXIvY29uZmlnL2lkP2lkPSR7aWR9JnJlc291cmNlSWQ9JHtyZXNvdXJjZUlkfWApKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXJsKHJvdXRlPzogc3RyaW5nLCBxdWVyeVBhcmFtcz86IG9iamVjdCk6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgdXJsKHF1ZXJ5UGFyYW1zOiBvYmplY3QpOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHVybCguLi5hcmdzOiBbc3RyaW5nIHwgb2JqZWN0LCBvYmplY3Q/XSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IFtyb3V0ZSwgcXVlcnlQYXJhbXNdID0gdGhpcy50cmFuc2Zvcm1VcmxBcmdzKGFyZ3MpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBxdWVyeVBhcmFtcyA/IGA/JHtRdWVyeVBhcmFtc1V0aWxzLmZyb21PYmplY3QocXVlcnlQYXJhbXMpfWAgOiBcIlwiO1xuICAgICAgICBpZiAocm91dGUpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmZpbHRlckFwaVVybH0vJHt0aGlzLnBhdGh9LyR7cm91dGV9JHtwYXJhbXN9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt0aGlzLmZpbHRlckFwaVVybH0vJHt0aGlzLnBhdGh9JHtwYXJhbXN9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRyYW5zZm9ybVVybEFyZ3MoYXJnczogW3N0cmluZyB8IG9iamVjdCwgb2JqZWN0P10pOiBbcm91dGU6IHN0cmluZywgcXVlcnlQYXJhbXM/OiBvYmplY3RdIHtcbiAgICAgICAgY29uc3QgW3JvdXRlT2ZRdWVyeVBhcmFtcywgcXVlcnldID0gYXJncztcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlT2ZRdWVyeVBhcmFtcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbcm91dGVPZlF1ZXJ5UGFyYW1zXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFtcIlwiLCByb3V0ZU9mUXVlcnlQYXJhbXNdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFsocm91dGVPZlF1ZXJ5UGFyYW1zIGFzIHN0cmluZykgPz8gXCJcIiwgcXVlcnldO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBIYXNOaWNlRmlsdGVyQXBpRGVmaW5pdGlvbiB7XG4gICAgZXhjZXB0aW9uRmFjdG9yeTogTmljZUh0dHBFeGNlcHRpb25GYWN0b3J5O1xuICAgIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG4gICAgYXBpVXJsOiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xuXG4gICAgdXJsKHJvdXRlPzogc3RyaW5nKTogc3RyaW5nO1xuICAgIGRlbGV0ZTxUPihyb3V0ZT86IHN0cmluZywgb3B0aW9ucz86IEh0dHBPcHRpb25zKTogT2JzZXJ2YWJsZTxUPjtcbiAgICBnZXQ8VD4ocm91dGU/OiBzdHJpbmcsIG9wdGlvbnM/OiBIdHRwT3B0aW9ucyk6IE9ic2VydmFibGU8VD47XG4gICAgcGF0Y2g8VD4ocm91dGU/OiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiBIdHRwT3B0aW9ucyk6IE9ic2VydmFibGU8VD47XG4gICAgcG9zdDxUPihyb3V0ZT86IHN0cmluZywgYm9keT86IGFueSwgb3B0aW9ucz86IEh0dHBPcHRpb25zKTogT2JzZXJ2YWJsZTxUPjtcbiAgICBwdXQ8VD4ocm91dGU/OiBzdHJpbmcsIGJvZHk/OiBhbnksIG9wdGlvbnM/OiBIdHRwT3B0aW9ucyk6IE9ic2VydmFibGU8VD47XG59XG5cbmV4cG9ydCB0eXBlIE5pY2VGaWx0ZXJBcGlEZWZpbml0aW9uQ3RvciA9IENvbnN0cnVjdG9yPE5pY2VGaWx0ZXJBcGlEZWZpbml0aW9uPiAmIEFic3RyYWN0Q29uc3RydWN0b3I8TmljZUZpbHRlckFwaURlZmluaXRpb24+O1xuXG5leHBvcnQgZnVuY3Rpb24gbWl4aW5OaWNlRmlsdGVyQXBpPEMgZXh0ZW5kcyBBYnN0cmFjdENvbnN0cnVjdG9yPEhhc05pY2VGaWx0ZXJBcGlEZWZpbml0aW9uPj4oXG4gICAgYmFzZTogQyxcbik6IE5pY2VGaWx0ZXJBcGlEZWZpbml0aW9uQ3RvciAmIEM7XG5leHBvcnQgZnVuY3Rpb24gbWl4aW5OaWNlRmlsdGVyQXBpPEMgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxIYXNOaWNlRmlsdGVyQXBpRGVmaW5pdGlvbj4+KFxuICAgIGJhc2U6IEMsXG4pOiBOaWNlRmlsdGVyQXBpRGVmaW5pdGlvbkN0b3IgJiBDIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHtcbiAgICAgICAgcHVibGljIGZpbHRlcihxdWVyeU1vZGVsOiBGaWx0ZXJRdWVyeU1vZGVsLCBvcHRpb246IE5pY2VIdHRwT3B0aW9ucyA9IHt9KTogT2JzZXJ2YWJsZTxGaWx0ZXJSZXN1bHRNb2RlbD4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdDxGaWx0ZXJSZXN1bHRNb2RlbD4oXCJmaWx0ZXJcIiwgcXVlcnlNb2RlbCwgb3B0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBmaWx0ZXJDb3VudChxdWVyeU1vZGVsOiBGaWx0ZXJRdWVyeU1vZGVsKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvc3Q8bnVtYmVyPihcImZpbHRlci1jb3VudFwiLCBxdWVyeU1vZGVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBkb3dubG9hZERhdGEodHlwZTogc3RyaW5nLCBxdWVyeU1vZGVsOiBGaWx0ZXJRdWVyeU1vZGVsKTogT2JzZXJ2YWJsZTxCbG9iPiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb3N0KGBkb3dubG9hZC8ke3R5cGV9YCwgcXVlcnlNb2RlbCwgeyByZXNwb25zZVR5cGU6IFwiYmxvYlwiIH0gYXMgYW55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBnZXRQcmludGFibGVIdG1sKHF1ZXJ5TW9kZWw6IEZpbHRlclF1ZXJ5TW9kZWwpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zdChgZG93bmxvYWQvaHRtbGAsIHF1ZXJ5TW9kZWwsIHsgcmVzcG9uc2VUeXBlOiBcInRleHRcIiB9IGFzIGFueSk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgZ2V0RmlsdGVyQ29uZmlnKG9wdGlvbjogTmljZUh0dHBPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbFtdPiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQ8RmlsdGVyQ29uZmlndXJhdGlvbk1vZGVsW10+KFwiZmlsdGVyL2NvbmZpZ1wiLCBvcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHNlYXJjaEZpbHRlclZhbHVlKGlkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlbGVjdEZpbHRlclZhbHVlW10+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQ8U2VsZWN0RmlsdGVyVmFsdWVbXT4oXCJmaWx0ZXIvY29uZmlnL3ZhbHVlXCIsIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgc2VhcmNoRmlsdGVyUmVzb3VyY2VWYWx1ZShpZDogc3RyaW5nLCByZXNvdXJjZUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFNlbGVjdEZpbHRlclZhbHVlPiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQ8U2VsZWN0RmlsdGVyVmFsdWU+KFwiZmlsdGVyL2NvbmZpZy9pZFwiLCB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUlkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIl19
@@ -253,14 +253,14 @@ NiceBaseListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
253
253
  NiceBaseListQuery,
254
254
  NiceBaseListService,
255
255
  NiceBaseListStore
256
- ], 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: "emptyState", first: true, predicate: NiceBaseListEmptyStateDirective, 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, active: xlActive$ | async }\"></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, active: lgActive$ | async }\"></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, active: mdActive$ | async }\"></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, active: smActive$ | async }\"></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, active: xsActive$ | async }\"></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, active: defaultActive$ | async }\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #pageLayout let-layout=\"layout\" let-active=\"active\">\n <ng-container *ngIf=\"layout?.length; else isObject\">\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: { classes: ['flex flex-col'], items: layout }, active }\"></ng-container>\n </ng-container>\n\n <ng-template #isObject>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: layout, active }\"></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template #contentLayout let-layout=\"layout\" let-active=\"active\">\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, active }\"></ng-container>\n </ng-container>\n <ng-template #childIsLayout>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: item, active }\"></ng-container>\n </ng-template>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #layoutItem let-item=\"item\" let-active=\"active\">\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 [svgIcon]=\"icons.search.svgIcon\">{{ icons.search.matIcon }}</mat-icon>\n <input [ngModel]=\"searchQuery$ | async\" (ngModelChange)=\"onUpdateSearch($event)\" [placeholder]=\"'general.search' | translate\" />\n\n <ng-container *ngIf=\"searchButtons\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"searchButtons\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"enableQueryBuilder\">\n <button\n *ngIf=\"!(showQueryBuilder$ | async) && !(rulesCount$ | async) && (filterConfig$ | async).length > 0\"\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 [svgIcon]=\"icons.queryBuilder.svgIcon\"\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n {{ icons.queryBuilder.matIcon }}\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 [svgIcon]=\"icons.queryBuilder.svgIcon\"\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n {{ icons.queryBuilder.matIcon }}\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 [svgIcon]=\"icons.close.svgIcon\">{{ icons.close.matIcon }}</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 [svgIcon]=\"icons.print.svgIcon\">{{ icons.print.matIcon }}</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 [svgIcon]=\"icons.download.svgIcon\">{{ icons.download.matIcon }}</mat-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'content'\">\n <ng-container *ngIf=\"(isEmpty$ | async) && emptyState; else showData\">\n <ng-container *ngTemplateOutlet=\"emptyState\"></ng-container>\n </ng-container>\n <ng-template #showData>\n <ng-container *ngIf=\"layoutContent === 'table' && table\">\n <ng-container *ngTemplateOutlet=\"tableLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'cards' && cards\">\n <ng-container *ngTemplateOutlet=\"cardsLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'custom' && customContent\">\n <ng-container *ngTemplateOutlet=\"customLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n </ng-template>\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-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\" let-active=\"active\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngFor=\"let data of data$ | async\">\n <ng-container *ngTemplateOutlet=\"cards; context: { item: data, active }\"></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #customLayout let-item=\"item\" let-active=\"active\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"customContent; context: { $implicit: data$ | async, data: data$ | async, total: recordsFiltered$ | async, active }\"></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.NiceQueryBuilderComponent, 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: i5.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: i18.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }], pipes: { "async": i13.AsyncPipe, "translate": i19.TranslatePipe } });
256
+ ], queries: [{ propertyName: "title", first: true, predicate: NiceBaseListTitleDirective, descendants: true, read: TemplateRef }, { propertyName: "table", first: true, predicate: NiceBaseListTableDirective, descendants: true }, { 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: "emptyState", first: true, predicate: NiceBaseListEmptyStateDirective, 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, active: xlActive$ | async }\"></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, active: lgActive$ | async }\"></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, active: mdActive$ | async }\"></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, active: smActive$ | async }\"></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, active: xsActive$ | async }\"></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, active: defaultActive$ | async }\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #pageLayout let-layout=\"layout\" let-active=\"active\">\n <ng-container *ngIf=\"layout?.length; else isObject\">\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: { classes: ['flex flex-col'], items: layout }, active }\"></ng-container>\n </ng-container>\n\n <ng-template #isObject>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: layout, active }\"></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template #contentLayout let-layout=\"layout\" let-active=\"active\">\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, active }\"></ng-container>\n </ng-container>\n <ng-template #childIsLayout>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: item, active }\"></ng-container>\n </ng-template>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #layoutItem let-item=\"item\" let-active=\"active\">\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 [svgIcon]=\"icons.search.svgIcon\">{{ icons.search.matIcon }}</mat-icon>\n <input [ngModel]=\"searchQuery$ | async\" (ngModelChange)=\"onUpdateSearch($event)\" [placeholder]=\"'general.search' | translate\" />\n\n <ng-container *ngIf=\"searchButtons\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"searchButtons\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"enableQueryBuilder\">\n <button\n *ngIf=\"!(showQueryBuilder$ | async) && !(rulesCount$ | async) && (filterConfig$ | async).length > 0\"\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 [svgIcon]=\"icons.queryBuilder.svgIcon\"\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n {{ icons.queryBuilder.matIcon }}\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 [svgIcon]=\"icons.queryBuilder.svgIcon\"\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n {{ icons.queryBuilder.matIcon }}\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 [svgIcon]=\"icons.close.svgIcon\">{{ icons.close.matIcon }}</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 [svgIcon]=\"icons.print.svgIcon\">{{ icons.print.matIcon }}</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 [svgIcon]=\"icons.download.svgIcon\">{{ icons.download.matIcon }}</mat-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'content'\">\n <ng-container *ngIf=\"(isEmpty$ | async) && emptyState; else showData\">\n <ng-container *ngTemplateOutlet=\"emptyState\"></ng-container>\n </ng-container>\n <ng-template #showData>\n <ng-container *ngIf=\"layoutContent === 'table' && table\">\n <ng-container *ngTemplateOutlet=\"tableLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'cards' && cards\">\n <ng-container *ngTemplateOutlet=\"cardsLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'custom' && customContent\">\n <ng-container *ngTemplateOutlet=\"customLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n </ng-template>\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-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: table.stickyHeader\"></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.template; 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.template; 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.template; 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\" let-active=\"active\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngFor=\"let data of data$ | async\">\n <ng-container *ngTemplateOutlet=\"cards; context: { item: data, active }\"></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #customLayout let-item=\"item\" let-active=\"active\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"customContent; context: { $implicit: data$ | async, data: data$ | async, total: recordsFiltered$ | async, active }\"></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.NiceQueryBuilderComponent, 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: i5.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: i18.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }], pipes: { "async": i13.AsyncPipe, "translate": i19.TranslatePipe } });
257
257
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NiceBaseListComponent, decorators: [{
258
258
  type: Component,
259
259
  args: [{ selector: "nice-base-list", providers: [
260
260
  NiceBaseListQuery,
261
261
  NiceBaseListService,
262
262
  NiceBaseListStore
263
- ], 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, active: xlActive$ | async }\"></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, active: lgActive$ | async }\"></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, active: mdActive$ | async }\"></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, active: smActive$ | async }\"></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, active: xsActive$ | async }\"></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, active: defaultActive$ | async }\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #pageLayout let-layout=\"layout\" let-active=\"active\">\n <ng-container *ngIf=\"layout?.length; else isObject\">\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: { classes: ['flex flex-col'], items: layout }, active }\"></ng-container>\n </ng-container>\n\n <ng-template #isObject>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: layout, active }\"></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template #contentLayout let-layout=\"layout\" let-active=\"active\">\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, active }\"></ng-container>\n </ng-container>\n <ng-template #childIsLayout>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: item, active }\"></ng-container>\n </ng-template>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #layoutItem let-item=\"item\" let-active=\"active\">\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 [svgIcon]=\"icons.search.svgIcon\">{{ icons.search.matIcon }}</mat-icon>\n <input [ngModel]=\"searchQuery$ | async\" (ngModelChange)=\"onUpdateSearch($event)\" [placeholder]=\"'general.search' | translate\" />\n\n <ng-container *ngIf=\"searchButtons\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"searchButtons\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"enableQueryBuilder\">\n <button\n *ngIf=\"!(showQueryBuilder$ | async) && !(rulesCount$ | async) && (filterConfig$ | async).length > 0\"\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 [svgIcon]=\"icons.queryBuilder.svgIcon\"\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n {{ icons.queryBuilder.matIcon }}\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 [svgIcon]=\"icons.queryBuilder.svgIcon\"\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n {{ icons.queryBuilder.matIcon }}\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 [svgIcon]=\"icons.close.svgIcon\">{{ icons.close.matIcon }}</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 [svgIcon]=\"icons.print.svgIcon\">{{ icons.print.matIcon }}</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 [svgIcon]=\"icons.download.svgIcon\">{{ icons.download.matIcon }}</mat-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'content'\">\n <ng-container *ngIf=\"(isEmpty$ | async) && emptyState; else showData\">\n <ng-container *ngTemplateOutlet=\"emptyState\"></ng-container>\n </ng-container>\n <ng-template #showData>\n <ng-container *ngIf=\"layoutContent === 'table' && table\">\n <ng-container *ngTemplateOutlet=\"tableLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'cards' && cards\">\n <ng-container *ngTemplateOutlet=\"cardsLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'custom' && customContent\">\n <ng-container *ngTemplateOutlet=\"customLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n </ng-template>\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-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\" let-active=\"active\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngFor=\"let data of data$ | async\">\n <ng-container *ngTemplateOutlet=\"cards; context: { item: data, active }\"></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #customLayout let-item=\"item\" let-active=\"active\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"customContent; context: { $implicit: data$ | async, data: data$ | async, total: recordsFiltered$ | async, active }\"></ng-container>\n </div>\n</ng-template>\n" }]
263
+ ], 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, active: xlActive$ | async }\"></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, active: lgActive$ | async }\"></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, active: mdActive$ | async }\"></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, active: smActive$ | async }\"></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, active: xsActive$ | async }\"></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, active: defaultActive$ | async }\"></ng-container>\n </div>\n</ng-template>\n\n<ng-template #pageLayout let-layout=\"layout\" let-active=\"active\">\n <ng-container *ngIf=\"layout?.length; else isObject\">\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: { classes: ['flex flex-col'], items: layout }, active }\"></ng-container>\n </ng-container>\n\n <ng-template #isObject>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: layout, active }\"></ng-container>\n </ng-template>\n</ng-template>\n\n<ng-template #contentLayout let-layout=\"layout\" let-active=\"active\">\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, active }\"></ng-container>\n </ng-container>\n <ng-template #childIsLayout>\n <ng-container *ngTemplateOutlet=\"contentLayout; context: { layout: item, active }\"></ng-container>\n </ng-template>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #layoutItem let-item=\"item\" let-active=\"active\">\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 [svgIcon]=\"icons.search.svgIcon\">{{ icons.search.matIcon }}</mat-icon>\n <input [ngModel]=\"searchQuery$ | async\" (ngModelChange)=\"onUpdateSearch($event)\" [placeholder]=\"'general.search' | translate\" />\n\n <ng-container *ngIf=\"searchButtons\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"searchButtons\"></ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"enableQueryBuilder\">\n <button\n *ngIf=\"!(showQueryBuilder$ | async) && !(rulesCount$ | async) && (filterConfig$ | async).length > 0\"\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 [svgIcon]=\"icons.queryBuilder.svgIcon\"\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n {{ icons.queryBuilder.matIcon }}\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 [svgIcon]=\"icons.queryBuilder.svgIcon\"\n [matBadge]=\"rulesCount$ | async\"\n [matBadgeHidden]=\"!(rulesCount$ | async)\"\n matBadgeColor=\"accent\"\n >\n {{ icons.queryBuilder.matIcon }}\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 [svgIcon]=\"icons.close.svgIcon\">{{ icons.close.matIcon }}</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 [svgIcon]=\"icons.print.svgIcon\">{{ icons.print.matIcon }}</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 [svgIcon]=\"icons.download.svgIcon\">{{ icons.download.matIcon }}</mat-icon>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"item.name === 'content'\">\n <ng-container *ngIf=\"(isEmpty$ | async) && emptyState; else showData\">\n <ng-container *ngTemplateOutlet=\"emptyState\"></ng-container>\n </ng-container>\n <ng-template #showData>\n <ng-container *ngIf=\"layoutContent === 'table' && table\">\n <ng-container *ngTemplateOutlet=\"tableLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'cards' && cards\">\n <ng-container *ngTemplateOutlet=\"cardsLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"layoutContent === 'custom' && customContent\">\n <ng-container *ngTemplateOutlet=\"customLayout; context: { item: item, active }\"></ng-container>\n </ng-container>\n </ng-template>\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-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: table.stickyHeader\"></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.template; 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.template; 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.template; 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\" let-active=\"active\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngFor=\"let data of data$ | async\">\n <ng-container *ngTemplateOutlet=\"cards; context: { item: data, active }\"></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #customLayout let-item=\"item\" let-active=\"active\">\n <div [ngClass]=\"item.classes\">\n <ng-container *ngTemplateOutlet=\"customContent; context: { $implicit: data$ | async, data: data$ | async, total: recordsFiltered$ | async, active }\"></ng-container>\n </div>\n</ng-template>\n" }]
264
264
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
265
265
  type: Optional
266
266
  }, {
@@ -286,7 +286,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
286
286
  args: [NiceBaseListButtonsDirective]
287
287
  }], table: [{
288
288
  type: ContentChild,
289
- args: [NiceBaseListTableDirective, { read: TemplateRef }]
289
+ args: [NiceBaseListTableDirective]
290
290
  }], cards: [{
291
291
  type: ContentChild,
292
292
  args: [NiceBaseListCardsDirective, { read: TemplateRef }]
@@ -330,4 +330,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
330
330
  }], newPage: [{
331
331
  type: Output
332
332
  }] } });
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlLWxpc3QvYmFzZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlLWxpc3QvYmFzZS1saXN0LnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sV0FBVyxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwwQkFBMEIsRUFBa0IsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoSCxPQUFPLEVBQUUsYUFBYSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlwRixPQUFPLEVBQ0gsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDaEIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN4RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNwRixPQUFPLEVBQUUs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ZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBUZW1wbGF0ZVJlZlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTWF0Qm90dG9tU2hlZXQgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYm90dG9tLXNoZWV0XCI7XG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yXCI7XG5pbXBvcnQgeyBTb3J0IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NvcnRcIjtcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBFeHBvcnRCb3R0b21TaGVldENvbXBvbmVudCwgRXhwb3J0U3RyYXRlZ3ksIE5pY2VNZWRpYVdhdGNoZXJTZXJ2aWNlIH0gZnJvbSBcIkByZWN1cnN5dmUvbmljZS11aS1raXQudjJcIjtcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IFF1ZXJ5UGFyYW1zIH0gZnJvbSBcIi4uLy4uL2FwaS9maWx0ZXIuYXBpXCI7XG5pbXBvcnQgeyBGaWx0ZXJDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2ZpbHRlci5tb2RlbFwiO1xuaW1wb3J0IHsgUXVlcnlNb2RlbCwgUXVlcnlSdWxlTW9kZWwgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3F1ZXJ5Lm1vZGVsXCI7XG5pbXBvcnQge1xuICAgIEJBU0VfTElTVF9JQ09OUyxcbiAgICBCQVNFX0xJU1RfTEFZT1VULFxuICAgIEVOQUJMRV9RVUVSWV9CVUlMREVSLFxuICAgIEVYUE9SVFNfU0VUVElOR1MsXG4gICAgVEFCTEVfQ09MVU1OU1xufSBmcm9tIFwiLi9iYXNlLWxpc3QuY29uc3RhbnRcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdEJ1dHRvbnNEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC1idXR0b25zLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgTmljZUJhc2VMaXN0Q2FyZHNEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC1jYXJkcy5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdEN1c3RvbUNvbnRlbnREaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC1jdXN0b20tY29udGVudC5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdEVtcHR5U3RhdGVEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC1lbXB0eS1zdGF0ZS5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdEZpbHRlcnNEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC1maWx0ZXJzLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgTmljZUJhc2VMaXN0VGFibGVEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVzL2Jhc2UtbGlzdC10YWJsZS5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdFRpdGxlRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9iYXNlLWxpc3QtdGl0bGUuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBUYWJsZUNvbHVtbnMgfSBmcm9tIFwiLi9tb2RlbHMvY29sdW1ucy5tb2RlbFwiO1xuaW1wb3J0IHsgRXhwb3J0U2V0dGluZ3MgfSBmcm9tIFwiLi9tb2RlbHMvZXhwb3J0Lm1vZGVsXCI7XG5pbXBvcnQgeyBOaWNlQmFzZUljb25PcHRpb25zIH0gZnJvbSBcIi4vbW9kZWxzL2ljb25zLm1vZGVsXCI7XG5pbXBvcnQgeyBCYXNlTGlzdExheW91dCwgTGF5b3V0Q29udGVudCB9IGZyb20gXCIuL21vZGVscy9sYXlvdXQubW9kZWxcIjtcbmltcG9ydCB7IE5pY2VGaWx0ZXJTZXJ2aWNlIH0gZnJvbSBcIi4vcHJvdmlkZXJzL2Jhc2UtZmlsdGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdFF1ZXJ5IH0gZnJvbSBcIi4vc3RvcmUvYmFzZS1saXN0LnF1ZXJ5XCI7XG5pbXBvcnQgeyBOaWNlQmFzZUxpc3RTZXJ2aWNlIH0gZnJvbSBcIi4vc3RvcmUvYmFzZS1saXN0LnNlcnZpY2VcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdFN0b3JlIH0gZnJvbSBcIi4vc3RvcmUvYmFzZS1saXN0LnN0b3JlXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm5pY2UtYmFzZS1saXN0XCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9iYXNlLWxpc3QudGVtcGxhdGUuaHRtbFwiLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBOaWNlQmFzZUxpc3RRdWVyeSxcbiAgICAgICAgTmljZUJhc2VMaXN0U2VydmljZSxcbiAgICAgICAgTmljZUJhc2VMaXN0U3RvcmVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE5pY2VCYXNlTGlzdENvbXBvbmVudDxGaWx0ZXIgZXh0ZW5kcyBOaWNlRmlsdGVyU2VydmljZTxhbnk+ID0gTmljZUZpbHRlclNlcnZpY2U8YW55Pj4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgICBAQ29udGVudENoaWxkKE5pY2VCYXNlTGlzdFRpdGxlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHRpdGxlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQENvbnRlbnRDaGlsZHJlbihOaWNlQmFzZUxpc3RCdXR0b25zRGlyZWN0aXZlKVxuICAgIHB1YmxpYyBidXR0b25zOiBOaWNlQmFzZUxpc3RCdXR0b25zRGlyZWN0aXZlW107XG5cbiAgICBAQ29udGVudENoaWxkKE5pY2VCYXNlTGlzdFRhYmxlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHRhYmxlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQENvbnRlbnRDaGlsZChOaWNlQmFzZUxpc3RDYXJkc0RpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBjYXJkczogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBDb250ZW50Q2hpbGQoTmljZUJhc2VMaXN0Q3VzdG9tQ29udGVudERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBjdXN0b21Db250ZW50OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQENvbnRlbnRDaGlsZChOaWNlQmFzZUxpc3RGaWx0ZXJzRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGZpbHRlcnM6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAQ29udGVudENoaWxkKE5pY2VCYXNlTGlzdEVtcHR5U3RhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZW1wdHlTdGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1vZGU6IFwibm9ybWFsXCIgfCBcImluZmluaXRlLXNjcm9sbFwiID0gXCJub3JtYWxcIjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxheW91dDogXCJwYWdlXCIgfCBcImNvbXBvbmVudFwiID0gXCJwYWdlXCI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsYXlvdXRDb250ZW50ID0gTGF5b3V0Q29udGVudC5UYWJsZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGF1dG9DaGFuZ2VMYXlvdXQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYmFzZVJvdXRlOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3V0ZUZuOiAoaXRlbTogYW55KSA9PiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG5hdmlnYXRlRm46IChiYXNlUm91dGU6IHN0cmluZywgaXRlbTogYW55KSA9PiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhdXRvTG9hZCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwYWdlVGl0bGU6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNhbkV4cG9ydCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlUm91dGluZyA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VzdG9tRXhwb3J0OiBFeHBvcnRTdHJhdGVneVtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBxdWVyeVBhcmFtczogUXVlcnlQYXJhbXMgPSB7fTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNvbmZpZ1F1ZXJ5UGFyYW1zOiBRdWVyeVBhcmFtcyA9IHt9O1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG5ld1BhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VFdmVudD4oKTtcblxuICAgIHB1YmxpYyBkZWZhdWx0UGFnZVNpemVPcHRpb25zID0gWzEwLCAyNSwgNTAsIDEwMF07XG4gICAgcHVibGljIGNvbHVtbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHVibGljIGxvYWRpbmckID0gdGhpcy5xdWVyeS5zZWxlY3RMb2FkaW5nKCk7XG5cbiAgICBwdWJsaWMgZmlsdGVyUmVzdWx0JCA9IHRoaXMucXVlcnkuc2VsZWN0RmlsdGVyUmVzdWx0KCk7XG4gICAgcHVibGljIGRhdGEkID0gdGhpcy5xdWVyeS5zZWxlY3REYXRhKCk7XG4gICAgcHVibGljIHJlY29yZHNGaWx0ZXJlZCQgPSB0aGlzLmZpbHRlclJlc3VsdCQucGlwZShtYXAoZiA9PiBmICYmIGYudG90YWwpKTtcbiAgICBwdWJsaWMgaXNFbXB0eSQgPSB0aGlzLnF1ZXJ5LnNlbGVjdEVtcHR5KCk7XG5cbiAgICBwdWJsaWMgc2hvd1F1ZXJ5QnVpbGRlciQgPSB0aGlzLnF1ZXJ5LnNlbGVjdFNob3dRdWVyeUJ1aWxkZXIoKTtcbiAgICBwdWJsaWMgZmlsdGVyUGFyYW1ldGVycyQgPSB0aGlzLnF1ZXJ5LnNlbGVjdEZpbHRlclBhcmFtZXRlcnMoKTtcbiAgICBwdWJsaWMgaW5kZXgkID0gdGhpcy5maWx0ZXJQYXJhbWV0ZXJzJC5waXBlKG1hcChmID0+IE1hdGguZmxvb3IoKGYuc3RhcnQgPz8gMCkgLyAoZi5sZW5ndGggPz8gMSkpKSk7XG4gICAgcHVibGljIGxlbmd0aCQgPSB0aGlzLmZpbHRlclBhcmFtZXRlcnMkLnBpcGUobWFwKGYgPT4gZi5sZW5ndGgpKTtcbiAgICBwdWJsaWMgc2VhcmNoUXVlcnkkID0gdGhpcy5maWx0ZXJQYXJhbWV0ZXJzJC5waXBlKG1hcChmID0+IGYuc2VhcmNoKSk7XG4gICAgcHVibGljIGZpbHRlckNvbmZpZyQgPSB0aGlzLnF1ZXJ5LnNlbGVjdEZpbHRlckNvbmZpZygpO1xuICAgIHB1YmxpYyBzb3J0Q29sdW1uJCA9IHRoaXMuZmlsdGVyUGFyYW1ldGVycyQucGlwZShtYXAoZiA9PiAoZi5vcmRlciAmJiBmLm9yZGVyLmNvbHVtbikgPz8gXCJcIikpO1xuICAgIHB1YmxpYyBzb3J0RGlyZWN0aW9uJCA9IHRoaXMuZmlsdGVyUGFyYW1ldGVycyQucGlwZShtYXAoZiA9PiBmLm9yZGVyICYmIGYub3JkZXIuZGlyZWN0aW9uKSk7XG5cbiAgICBwdWJsaWMgZmlsdGVyQ29uZmlnTG9hZGluZyQgPSB0aGlzLnF1ZXJ5LnNlbGVjdEZpbHRlckNvbmZpZ0xvYWRpbmcoKTtcbiAgICBwdWJsaWMgcnVsZXMkID0gdGhpcy5maWx0ZXJQYXJhbWV0ZXJzJC5waXBlKG1hcChwYXJhbWV0ZXJzID0+IHBhcmFtZXRlcnMucnVsZXMpKTtcbiAgICBwdWJsaWMgcnVsZXNDb3VudCQgPSB0aGlzLmZpbHRlclBhcmFtZXRlcnMkLnBpcGUobWFwKHBhcmFtZXRlcnMgPT4gcGFyYW1ldGVycy5ydWxlcz8ubGVuZ3RoID8/IDApKTtcblxuICAgIHB1YmxpYyB4c0FjdGl2ZSQgPSB0aGlzLm1lZGlhV2F0Y2hlci54c0JyZWFrcG9pbnRBY3RpdmUkO1xuICAgIHB1YmxpYyBzbUFjdGl2ZSQgPSB0aGlzLm1lZGlhV2F0Y2hlci5zbUJyZWFrcG9pbnRBY3RpdmUkO1xuICAgIHB1YmxpYyBtZEFjdGl2ZSQgPSB0aGlzLm1lZGlhV2F0Y2hlci5tZEJyZWFrcG9pbnRBY3RpdmUkO1xuICAgIHB1YmxpYyBsZ0FjdGl2ZSQgPSB0aGlzLm1lZGlhV2F0Y2hlci5sZ0JyZWFrcG9pbnRBY3RpdmUkO1xuICAgIHB1YmxpYyB4bEFjdGl2ZSQgPSB0aGlzLm1lZGlhV2F0Y2hlci54bEJyZWFrcG9pbnRBY3RpdmUkO1xuICAgIHB1YmxpYyBkZWZhdWx0QWN0aXZlJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMueHNBY3RpdmUkLCB0aGlzLnNtQWN0aXZlJCwgdGhpcy5tZEFjdGl2ZSQsIHRoaXMubGdBY3RpdmUkLCB0aGlzLnhsQWN0aXZlJF0pLnBpcGUoXG4gICAgICAgIG1hcCgoW3hzLCBzbSwgbWQsIGxnLCB4bF0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB4cyAmJiAhdGhpcy5saXN0TGF5b3V0LnhzXG4gICAgICAgICAgICAgICAgfHwgc20gJiYgIXRoaXMubGlzdExheW91dC5zbVxuICAgICAgICAgICAgICAgIHx8IG1kICYmICF0aGlzLmxpc3RMYXlvdXQubWRcbiAgICAgICAgICAgICAgICB8fCBsZyAmJiAhdGhpcy5saXN0TGF5b3V0LmxnXG4gICAgICAgICAgICAgICAgfHwgeGwgJiYgIXRoaXMubGlzdExheW91dC54bDtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgcHJpdmF0ZSBzZWFyY2hUZXh0JCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBASW5qZWN0KEVOQUJMRV9RVUVSWV9CVUlMREVSKVxuICAgICAgICBwdWJsaWMgZW5hYmxlUXVlcnlCdWlsZGVyOiBib29sZWFuLFxuICAgICAgICBASW5qZWN0KEJBU0VfTElTVF9JQ09OUylcbiAgICAgICAgcHVibGljIGljb25zOiBOaWNlQmFzZUljb25PcHRpb25zLFxuICAgICAgICBASW5qZWN0KEJBU0VfTElTVF9MQVlPVVQpXG4gICAgICAgIHB1YmxpYyBsaXN0TGF5b3V0OiBCYXNlTGlzdExheW91dCxcbiAgICAgICAgQEluamVjdChUQUJMRV9DT0xVTU5TKVxuICAgICAgICBwdWJsaWMgY29sdW1uczogVGFibGVDb2x1bW5zW10sXG4gICAgICAgIEBJbmplY3QoRVhQT1JUU19TRVRUSU5HUylcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBleHBvcnRzU2V0dGluZ3M6IEV4cG9ydFNldHRpbmdzLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcXVlcnk6IE5pY2VCYXNlTGlzdFF1ZXJ5LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogTmljZUJhc2VMaXN0U2VydmljZTxGaWx0ZXI+LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib3R0b21TaGVldDogTWF0Qm90dG9tU2hlZXQsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbWVkaWFXYXRjaGVyOiBOaWNlTWVkaWFXYXRjaGVyU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLnNldENvbHVtbnMoY29sdW1ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcmVmaXhCdXR0b25zKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5idXR0b25zPy5maW5kKHggPT4geC5wb3NpdGlvbiA9PT0gXCJwcmVmaXhcIik/LnRlbXBsYXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3VmZml4QnV0dG9ucygpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnV0dG9ucz8uZmluZCh4ID0+IHgucG9zaXRpb24gPT09IFwic3VmZml4XCIpPy50ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaEJ1dHRvbnMoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1dHRvbnM/LmZpbmQoeCA9PiB4LnBvc2l0aW9uID09PSBcInNlYXJjaFwiKT8udGVtcGxhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNlcnZpY2UuaW5pdCh0aGlzLmNvbmZpZ1F1ZXJ5UGFyYW1zKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmxvYWRRdWVyeVBhcmFtcyh0aGlzLmF1dG9Mb2FkKTtcblxuICAgICAgICB0aGlzLnNlYXJjaFRleHQkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoc2VhcmNoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5yZXNldFBhZ2luZygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnNlYXJjaERhdGEoc2VhcmNoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIHRoaXMubWVkaWFXYXRjaGVyLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXV0b0NoYW5nZUxheW91dCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMubWVkaWFXYXRjaGVyLmlzQWN0aXZlKFwibHQtbWRcIikgJiYgdGhpcy5sYXlvdXRDb250ZW50ID09PSBMYXlvdXRDb250ZW50LlRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb250ZW50ID0gTGF5b3V0Q29udGVudC5DYXJkcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb250ZW50ID0gTGF5b3V0Q29udGVudC5UYWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuY2xvc2VTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKFwibW9kZVwiIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5zZXRNb2RlKGNoYW5nZXMubW9kZS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcInF1ZXJ5UGFyYW1zXCIgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnNldFF1ZXJ5UGFyYW1zKGNoYW5nZXMucXVlcnlQYXJhbXMuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2FkaW5nKGxvYWRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnNldExvYWRpbmcobG9hZGluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrVG9nZ2xlU2hvd1F1ZXJ5QnVpbGRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnRvZ2dsZVF1ZXJ5QnVpbGRlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblVwZGF0ZVJ1bGVzKHJ1bGVzOiBRdWVyeU1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZUdsb2JhbFJ1bGVzKHJ1bGVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25RdWVyeUJ1aWxkZXJGaWx0ZXJTZWxlY3RlZChmaWx0ZXJDb25maWd1cmF0aW9uTW9kZWw6IEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuYWRkUnVsZUZyb21Db25maWcoZmlsdGVyQ29uZmlndXJhdGlvbk1vZGVsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25VcGRhdGVQYWdlKHBhZ2VFdmVudDogUGFnZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS5sb2FkTmV3UGFnZShwYWdlRXZlbnQucGFnZUluZGV4ICogcGFnZUV2ZW50LnBhZ2VTaXplLCBwYWdlRXZlbnQucGFnZVNpemUpO1xuICAgICAgICB0aGlzLm5ld1BhZ2UuZW1pdChwYWdlRXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblVwZGF0ZVNlYXJjaChzZWFyY2g6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFRleHQkLm5leHQoc2VhcmNoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmlsdGVyUnVsZSQoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8UXVlcnlSdWxlTW9kZWwgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyUGFyYW1ldGVycyQucGlwZShcbiAgICAgICAgICAgIG1hcChmID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBmLnJ1bGVzICYmXG4gICAgICAgICAgICAgICAgICAgIGYucnVsZXNbMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgZi5ydWxlc1swXS5ydWxlcyAmJlxuICAgICAgICAgICAgICAgICAgICAoZi5ydWxlc1swXS5ydWxlcy5maW5kKChyKSA9PiAociBhcyBRdWVyeVJ1bGVNb2RlbCkuaWQgPT09IGlkKSBhcyBRdWVyeVJ1bGVNb2RlbClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25VcGRhdGVTb3J0KHNvcnQ6IFNvcnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbnVsbExhc3QgPSB0aGlzLmNvbHVtbnMuZmluZCgoeCkgPT4geC5pZCA9PT0gc29ydC5hY3RpdmUpPy5udWxsTGFzdDtcbiAgICAgICAgaWYgKCFzb3J0LmFjdGl2ZSB8fCAhc29ydC5kaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHNvcnQgPSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlOiBcImlkXCIsXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImFzY1wiXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXJ2aWNlLmxvYWREYXRhKHtcbiAgICAgICAgICAgIG9yZGVyOiBzb3J0LmFjdGl2ZSAmJiBzb3J0LmRpcmVjdGlvbiA/IHsgY29sdW1uOiBzb3J0LmFjdGl2ZSwgZGlyZWN0aW9uOiBzb3J0LmRpcmVjdGlvbiwgbnVsbExhc3QgfSA6IG51bGxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVJ1bGUoaWQ6IHN0cmluZywgbmV3UnVsZTogUXVlcnlSdWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZVJ1bGUoaWQsIG5ld1J1bGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVSdWxlcyhydWxlczogUXVlcnlSdWxlTW9kZWxbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlUnVsZXMocnVsZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGlja0V4cG9ydCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhwb3J0cyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5leHBvcnRzU2V0dGluZ3MueGxzeCkge1xuICAgICAgICAgICAgZXhwb3J0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInhsc3hcIixcbiAgICAgICAgICAgICAgICBvbkNsaWNrRXhwb3J0OiAoKSA9PiB0aGlzLmNsaWNrWGxzeCgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV4cG9ydHNTZXR0aW5ncy5jc3YpIHtcbiAgICAgICAgICAgIGV4cG9ydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJjc3ZcIixcbiAgICAgICAgICAgICAgICBvbkNsaWNrRXhwb3J0OiAoKSA9PiB0aGlzLmNsaWNrQ3N2KClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXhwb3J0c1NldHRpbmdzLnBkZikge1xuICAgICAgICAgICAgZXhwb3J0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInBkZlwiLFxuICAgICAgICAgICAgICAgIG9uQ2xpY2tFeHBvcnQ6ICgpID0+IHRoaXMuY2xpY2tQZGYoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib3R0b21TaGVldC5vcGVuKEV4cG9ydEJvdHRvbVNoZWV0Q29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZXhwb3J0U3RyYXRlZ2llczogW1xuICAgICAgICAgICAgICAgICAgICAuLi5leHBvcnRzLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmN1c3RvbUV4cG9ydFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlKGl0ZW06IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0ZUZuKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlRm4odGhpcy5iYXNlUm91dGUsIGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLnJvdXRlRm4gPyB0aGlzLnJvdXRlRm4oaXRlbSkgOiBbKHRoaXMuYmFzZVJvdXRlIHx8IFwiXCIpICsgaXRlbT8uaWRdO1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUodHlwZW9mIHJvdXRlID09PSBcInN0cmluZ1wiID8gW3JvdXRlXSA6IHJvdXRlLCB7IHJlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVkUm91dGUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tYbHN4KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuZG93bmxvYWREYXRhKFwieGxzeFwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tDc3YoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS5kb3dubG9hZERhdGEoXCJjc3ZcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrUHJpbnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS5wcmludERhdGEoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tQZGYoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS5kb3dubG9hZERhdGEoXCJwZGZcIik7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbHVtbnMoY29sdW1uczogVGFibGVDb2x1bW5zW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lcyA9IGNvbHVtbnMubWFwKHggPT4geC5pZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtbnMoY29sdW1uczogVGFibGVDb2x1bW5zW10sIHByZXBlbmQgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAocHJlcGVuZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRDb2x1bW5zKFtcbiAgICAgICAgICAgICAgICAuLi5jb2x1bW5zLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29sdW1uc1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbHVtbnMoW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29sdW1ucyxcbiAgICAgICAgICAgICAgICAuLi5jb2x1bW5zXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsaXN0IHBhZ2UtbGF5b3V0IGNhcmRlZCBmdWxsd2lkdGggaW5uZXItc2Nyb2xsXCIgKm5nSWY9XCJsYXlvdXQgPT09ICdwYWdlJzsgZWxzZSBjb250ZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjY29udGVudD5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGlzdExheW91dC54bFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuIHhsOmJsb2NrXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnZUxheW91dDsgY29udGV4dDogeyBsYXlvdXQ6IGxpc3RMYXlvdXQueGwsIGFjdGl2ZTogeGxBY3RpdmUkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaXN0TGF5b3V0LmxnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gbGc6YmxvY2sgeGw6aGlkZGVuXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnZUxheW91dDsgY29udGV4dDogeyBsYXlvdXQ6IGxpc3RMYXlvdXQubGcsIGFjdGl2ZTogbGdBY3RpdmUkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaXN0TGF5b3V0Lm1kXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gbWQ6YmxvY2sgbGc6aGlkZGVuXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnZUxheW91dDsgY29udGV4dDogeyBsYXlvdXQ6IGxpc3RMYXlvdXQubWQsIGFjdGl2ZTogbWRBY3RpdmUkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaXN0TGF5b3V0LnNtXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gc206YmxvY2sgbWQ6aGlkZGVuXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnZUxheW91dDsgY29udGV4dDogeyBsYXlvdXQ6IGxpc3RMYXlvdXQuc20sIGFjdGl2ZTogc21BY3RpdmUkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaXN0TGF5b3V0LnhzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJibG9jayBzbTpoaWRkZW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdlTGF5b3V0OyBjb250ZXh0OiB7IGxheW91dDogbGlzdExheW91dC54cywgYWN0aXZlOiB4c0FjdGl2ZSQgfCBhc3luYyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdlxuICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiEhbGlzdExheW91dC54c1wiXG4gICAgICAgIFtjbGFzcy5ibG9ja109XCIhbGlzdExheW91dC54c1wiXG4gICAgICAgIFtjbGFzcy5zbTpoaWRkZW5dPVwiISFsaXN0TGF5b3V0LnNtXCJcbiAgICAgICAgW2NsYXNzLnNtOmJsb2NrXT1cIiFsaXN0TGF5b3V0LnNtXCJcbiAgICAgICAgW2NsYXNzLm1kOmhpZGRlbl09XCIhIWxpc3RMYXlvdXQubWRcIlxuICAgICAgICBbY2xhc3MubWQ6YmxvY2tdPVwiIWxpc3RMYXlvdXQubWRcIlxuICAgICAgICBbY2xhc3MubGc6aGlkZGVuXT1cIiEhbGlzdExheW91dC5sZ1wiXG4gICAgICAgIFtjbGFzcy5sZzpibG9ja109XCIhbGlzdExheW91dC5sZ1wiXG4gICAgICAgIFtjbGFzcy54bDpoaWRkZW5dPVwiISFsaXN0TGF5b3V0LnhsXCJcbiAgICAgICAgW2NsYXNzLnhsOmJsb2NrXT1cIiFsaXN0TGF5b3V0LnhsXCJcbiAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdlTGF5b3V0OyBjb250ZXh0OiB7IGxheW91dDogbGlzdExheW91dC5kZWZhdWx0LCBhY3RpdmU6IGRlZmF1bHRBY3RpdmUkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwYWdlTGF5b3V0IGxldC1sYXlvdXQ9XCJsYXlvdXRcIiBsZXQtYWN0aXZlPVwiYWN0aXZlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dD8ubGVuZ3RoOyBlbHNlIGlzT2JqZWN0XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50TGF5b3V0OyBjb250ZXh0OiB7IGxheW91dDogeyBjbGFzc2VzOiBbJ2ZsZXggZmxleC1jb2wnXSwgaXRlbXM6IGxheW91dCB9LCBhY3RpdmUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNpc09iamVjdD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRMYXlvdXQ7IGNvbnRleHQ6IHsgbGF5b3V0OiBsYXlvdXQsIGFjdGl2ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29udGVudExheW91dCBsZXQtbGF5b3V0PVwibGF5b3V0XCIgbGV0LWFjdGl2ZT1cImFjdGl2ZVwiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwibGF5b3V0LmNsYXNzZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsYXlvdXQuaXRlbXNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWU7IGVsc2UgY2hpbGRJc0xheW91dFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYXlvdXRJdGVtOyBjb250ZXh0OiB7IGl0ZW06IGl0ZW0sIGFjdGl2ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hpbGRJc0xheW91dD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudExheW91dDsgY29udGV4dDogeyBsYXlvdXQ6IGl0ZW0sIGFjdGl2ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbGF5b3V0SXRlbSBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtYWN0aXZlPVwiYWN0aXZlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0ubmFtZSA9PT0gJ3RpdGxlJyAmJiB0aXRsZVwiPlxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3Nlc1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0ubmFtZSA9PT0gJ3NlYXJjaCdcIj5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtd3JhcHBlciBteC1tZC0wXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaCBmbGV4IGZsZXgtYXV0byBqdXN0aWZ5LXN0YXJ0IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW3N2Z0ljb25dPVwiaWNvbnMuc2VhcmNoLnN2Z0ljb25cIj57eyBpY29ucy5zZWFyY2gubWF0SWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbbmdNb2RlbF09XCJzZWFyY2hRdWVyeSQgfCBhc3luY1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlU2VhcmNoKCRldmVudClcIiBbcGxhY2Vob2xkZXJdPVwiJ2dlbmVyYWwuc2VhcmNoJyB8IHRyYW5zbGF0ZVwiIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlYXJjaEJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlYXJjaEJ1dHRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlUXVlcnlCdWlsZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIShzaG93UXVlcnlCdWlsZGVyJCB8IGFzeW5jKSAmJiAhKHJ1bGVzQ291bnQkIHwgYXN5bmMpICYmIChmaWx0ZXJDb25maWckIHwgYXN5bmMpLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZVF1ZXJ5QnVpbGRlclRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5QnVpbGRlckZpbHRlcnNdPVwiZmlsdGVyQ29uZmlnJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5QnVpbGRlckZpbHRlcnNMb2FkaW5nXT1cIihmaWx0ZXJDb25maWdMb2FkaW5nJCB8IGFzeW5jKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxdWVyeUJ1aWxkZXJGaWx0ZXJTZWxlY3RlZCk9XCJvblF1ZXJ5QnVpbGRlckZpbHRlclNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInZ2VuZXJhbC5xdWVyeV9idWlsZGVyLnNob3dfYWR2YW5jZWRfc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdmdJY29uXT1cImljb25zLnF1ZXJ5QnVpbGRlci5zdmdJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEJhZGdlXT1cInJ1bGVzQ291bnQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIShydWxlc0NvdW50JCB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaWNvbnMucXVlcnlCdWlsZGVyLm1hdEljb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEoc2hvd1F1ZXJ5QnVpbGRlciQgfCBhc3luYykgJiYgKHJ1bGVzQ291bnQkIHwgYXN5bmMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlckNvbmZpZ0xvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tUb2dnbGVTaG93UXVlcnlCdWlsZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInZ2VuZXJhbC5xdWVyeV9idWlsZGVyLnNob3dfYWR2YW5jZWRfc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdmdJY29uXT1cImljb25zLnF1ZXJ5QnVpbGRlci5zdmdJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEJhZGdlXT1cInJ1bGVzQ291bnQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIShydWxlc0NvdW50JCB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaWNvbnMucXVlcnlCdWlsZGVyLm1hdEljb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93UXVlcnlCdWlsZGVyJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tUb2dnbGVTaG93UXVlcnlCdWlsZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidnZW5lcmFsLnF1ZXJ5X2J1aWxkZXIuY2xvc2VfYWR2YW5jZWRfc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cImljb25zLmNsb3NlLnN2Z0ljb25cIj57eyBpY29ucy5jbG9zZS5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdwcmVmaXhCdXR0b25zJyAmJiBwcmVmaXhCdXR0b25zXCI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJlZml4QnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdzdWZmaXhCdXR0b25zJyAmJiBzdWZmaXhCdXR0b25zXCI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3VmZml4QnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdleHBvcnRCdXR0b25zJyAmJiBjYW5FeHBvcnRcIj5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIiBbY2xhc3MubXItMl09XCIhIXN1ZmZpeEJ1dHRvbnNcIiBbY2xhc3MubWwtMl09XCIhIXByZWZpeEJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrUHJpbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2dlbmVyYWwucHJpbnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWJ1dHRvbiBtci0yXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0LW1pbmktZmFiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cImljb25zLnByaW50LnN2Z0ljb25cIj57eyBpY29ucy5wcmludC5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0V4cG9ydCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInZ2VuZXJhbC5leHBvcnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWJ1dHRvbiBtci0yXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0LW1pbmktZmFiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cImljb25zLmRvd25sb2FkLnN2Z0ljb25cIj57eyBpY29ucy5kb3dubG9hZC5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdjb250ZW50J1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGlzRW1wdHkkIHwgYXN5bmMpICYmIGVtcHR5U3RhdGU7IGVsc2Ugc2hvd0RhdGFcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVN0YXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3Nob3dEYXRhPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dENvbnRlbnQgPT09ICd0YWJsZScgJiYgdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVMYXlvdXQ7IGNvbnRleHQ6IHsgaXRlbTogaXRlbSwgYWN0aXZlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dENvbnRlbnQgPT09ICdjYXJkcycgJiYgY2FyZHNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZHNMYXlvdXQ7IGNvbnRleHQ6IHsgaXRlbTogaXRlbSwgYWN0aXZlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dENvbnRlbnQgPT09ICdjdXN0b20nICYmIGN1c3RvbUNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tTGF5b3V0OyBjb250ZXh0OiB7IGl0ZW06IGl0ZW0sIGFjdGl2ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdwYWdpbmF0aW9uJyAmJiBsYXlvdXRDb250ZW50ICE9PSAnY3VzdG9tJ1wiPlxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3Nlc1wiPlxuICAgICAgICAgICAgPG1hdC1wYWdpbmF0b3JcbiAgICAgICAgICAgICAgICAocGFnZSk9XCJvblVwZGF0ZVBhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2xlbmd0aF09XCJyZWNvcmRzRmlsdGVyZWQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFtwYWdlSW5kZXhdPVwiaW5kZXgkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiZGVmYXVsdFBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cImxlbmd0aCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdxdWVyeUJ1aWxkZXInICYmIGVuYWJsZVF1ZXJ5QnVpbGRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwic2hvd1F1ZXJ5QnVpbGRlciQgfCBhc3luY1wiPlxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibXktNFwiIFtuaWNlTG9hZGluZ092ZXJsYXldPVwiZmlsdGVyQ29uZmlnTG9hZGluZyQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmljZS1xdWVyeS1idWlsZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlckNvbmZpZ3NdPVwiZmlsdGVyQ29uZmlnJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJydWxlcyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVSdWxlcygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiY2xpY2tUb2dnbGVTaG93UXVlcnlCdWlsZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmljZS1xdWVyeS1idWlsZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdmaWx0ZXJzJyAmJiBmaWx0ZXJzXCI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGFibGVMYXlvdXQgbGV0LWl0ZW09XCJpdGVtXCI+XG4gICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIFtuaWNlTG9hZGluZ092ZXJsYXldPVwibG9hZGluZyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50LWNhcmQgYmFzZS1saXN0IGZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC10YWJsZVxuICAgICAgICAgICAgICAgICAgICAobWF0U29ydENoYW5nZSk9XCJvblVwZGF0ZVNvcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGEkXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwiKHNvcnRDb2x1bW4kIHwgYXN5bmMpIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFNvcnREaXJlY3Rpb25dPVwiKHNvcnREaXJlY3Rpb24kIHwgYXN5bmMpIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgIG1hdFNvcnRcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtbk5hbWVzOyBzdGlja3k6IHRydWVcIj48L21hdC1oZWFkZXItcm93PlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIiBbbWF0Q29sdW1uRGVmXT1cImNvbHVtbi5pZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlOyBjb250ZXh0OiB7IGNvbHVtbjogY29sdW1uLmlkLCBoZWFkZXI6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5zb3J0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlOyBjb250ZXh0OiB7IGNvbHVtbjogY29sdW1uLmlkLCBoZWFkZXI6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaGVhZGVyLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGU7IGNvbnRleHQ6IHsgY29sdW1uOiBjb2x1bW4uaWQsIGRhdGE6IHRydWUsIGl0ZW06IGl0ZW0gfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNlbGw+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzYWJsZVJvdXRpbmc7IGVsc2Ugd2l0aFJvdXRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCBpdGVtOyBjb2x1bW5zOiBjb2x1bW5OYW1lcztcIiBjbGFzcz1cIml0ZW1cIj48L21hdC1yb3c+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3dpdGhSb3V0aW5nPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgaXRlbTsgY29sdW1uczogY29sdW1uTmFtZXM7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGUoaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbSBjbGlja2FibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFJpcHBsZVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXJvdz5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9tYXQtdGFibGU+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjYXJkc0xheW91dCBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtYWN0aXZlPVwiYWN0aXZlXCI+XG4gICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF0YSBvZiBkYXRhJCB8IGFzeW5jXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZHM7IGNvbnRleHQ6IHsgaXRlbTogZGF0YSwgYWN0aXZlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2N1c3RvbUxheW91dCBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtYWN0aXZlPVwiYWN0aXZlXCI+XG4gICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbUNvbnRlbnQ7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBkYXRhJCB8IGFzeW5jLCBkYXRhOiBkYXRhJCB8IGFzeW5jLCB0b3RhbDogcmVjb3Jkc0ZpbHRlcmVkJCB8IGFzeW5jLCBhY3RpdmUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlLWxpc3QvYmFzZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlLWxpc3QvYmFzZS1saXN0LnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBRU4sV0FBVyxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUdoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwwQkFBMEIsRUFBa0IsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoSCxPQUFPLEVBQUUsYUFBYSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlwRixPQUFPLEVBQ0gsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDaEIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN4RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNwRixPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMvRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN4RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNwRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUlwRixPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXNUQsTUFBTSxPQUFPLHFCQUFxQjtJQTJHOUIsWUFHVyxrQkFBMkIsRUFFM0IsS0FBMEIsRUFFMUIsVUFBMEIsRUFFMUIsT0FBdUIsRUFFYixlQUErQixFQUNoQyxLQUF3QixFQUN4QixPQUFvQyxFQUNuQyxjQUE4QixFQUM5QixXQUEyQixFQUMzQixNQUFjLEVBQ2QsWUFBcUM7UUFkL0MsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFTO1FBRTNCLFVBQUssR0FBTCxLQUFLLENBQXFCO1FBRTFCLGVBQVUsR0FBVixVQUFVLENBQWdCO1FBRTFCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBRWIsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQ2hDLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBQ3hCLFlBQU8sR0FBUCxPQUFPLENBQTZCO1FBQ25DLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGlCQUFZLEdBQVosWUFBWSxDQUF5QjtRQXJHbkQsU0FBSSxHQUFpQyxRQUFRLENBQUM7UUFHOUMsV0FBTSxHQUF5QixNQUFNLENBQUM7UUFHdEMsa0JBQWEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBR3BDLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQVl4QixhQUFRLEdBQUcsSUFBSSxDQUFDO1FBTWhCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFHakIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFHdkIsaUJBQVksR0FBcUIsRUFBRSxDQUFDO1FBR3BDLGdCQUFXLEdBQWdCLEVBQUUsQ0FBQztRQUc5QixzQkFBaUIsR0FBZ0IsRUFBRSxDQUFDO1FBR3BDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBRXhDLDJCQUFzQixHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0MsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFFM0IsYUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFdEMsa0JBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDaEQsVUFBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMscUJBQWdCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25FLGFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXBDLHNCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN4RCxzQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDeEQsV0FBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdGLFlBQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzFELGlCQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvRCxrQkFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNoRCxnQkFBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RixtQkFBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFckYseUJBQW9CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQzlELFdBQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFFLGdCQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVGLGNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELGNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELGNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELGNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELGNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELG1CQUFjLEdBQUcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3hILEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7bUJBQ3pCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTttQkFDekIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO21CQUN6QixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7bUJBQ3pCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUNMLENBQUM7UUFFTSxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFxQnhDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDdEUsQ0FBQztJQUVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDdEUsQ0FBQztJQUVELElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDdEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRO1FBQ2pCLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxXQUFXO2FBQ1gsSUFBSSxDQUNELFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsb0JBQW9CLEVBQUUsRUFDdEIsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUNMO2FBQ0EsU0FBUyxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3hCLE9BQU87YUFDVjtZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsS0FBSyxFQUFFO2dCQUNuRixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7YUFDNUM7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO2FBQzVDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sV0FBVztRQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQXNCO1FBQ3JDLElBQUksTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxhQUFhLElBQUksT0FBTyxFQUFFO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDakU7SUFDTCxDQUFDO0lBRU0sVUFBVSxDQUFDLE9BQWdCO1FBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSwyQkFBMkI7UUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFTSxhQUFhLENBQUMsS0FBbUI7UUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRU0sNEJBQTRCLENBQUMsd0JBQWtEO1FBQ2xGLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU0sWUFBWSxDQUFDLFNBQW9CO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxNQUFjO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxjQUFjLENBQUMsRUFBVTtRQUM1QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNKLE9BQU8sQ0FDSCxDQUFDLENBQUMsS0FBSztnQkFDUCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDVixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBRSxDQUFvQixDQUFDLEVBQUUsS0FBSyxFQUFFLENBQW9CLENBQ3BGLENBQUM7UUFDTixDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFVO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUM7UUFDMUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pDLElBQUksR0FBRztnQkFDSCxNQUFNLEVBQUUsSUFBSTtnQkFDWixTQUFTLEVBQUUsS0FBSzthQUNuQixDQUFDO1NBQ0w7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNsQixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQzdHLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxVQUFVLENBQUMsRUFBVSxFQUFFLE9BQXVCO1FBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sV0FBVyxDQUFDLEtBQXVCO1FBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTSxXQUFXO1FBQ2QsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUU7WUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDVCxJQUFJLEVBQUUsTUFBTTtnQkFDWixhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTthQUN4QyxDQUFDLENBQUM7U0FDTjthQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDVCxJQUFJLEVBQUUsS0FBSztnQkFDWCxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTthQUN2QyxDQUFDLENBQUM7U0FDTjthQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDVCxJQUFJLEVBQUUsS0FBSztnQkFDWCxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTthQUN2QyxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO1lBQzlDLElBQUksRUFBRTtnQkFDRixnQkFBZ0IsRUFBRTtvQkFDZCxHQUFHLE9BQU87b0JBQ1YsR0FBRyxJQUFJLENBQUMsWUFBWTtpQkFDdkI7YUFDSjtTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxRQUFRLENBQUMsSUFBUztRQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDMUc7SUFDTCxDQUFDO0lBRU0sU0FBUztRQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFVBQVU7UUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFVBQVUsQ0FBQyxPQUF1QjtRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLFVBQVUsQ0FBQyxPQUF1QixFQUFFLE9BQU8sR0FBRyxLQUFLO1FBQ3RELElBQUksT0FBTyxFQUFFO1lBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDWixHQUFHLE9BQU87Z0JBQ1YsR0FBRyxJQUFJLENBQUMsT0FBTzthQUNsQixDQUFDLENBQUM7U0FDTjthQUFNO1lBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDWixHQUFHLElBQUksQ0FBQyxPQUFPO2dCQUNmLEdBQUcsT0FBTzthQUNiLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQzs7a0hBeFRRLHFCQUFxQixrQkE2R2xCLG9CQUFvQiw2QkFFcEIsZUFBZSxhQUVmLGdCQUFnQixhQUVoQixhQUFhLGFBRWIsZ0JBQWdCO3NHQXJIbkIscUJBQXFCLDRjQU5uQjtRQUNQLGlCQUFpQjtRQUNqQixtQkFBbUI7UUFDbkIsaUJBQWlCO0tBQ3BCLDZEQUdhLDBCQUEwQiwyQkFBVSxXQUFXLHFEQU0vQywwQkFBMEIsd0VBRzFCLDBCQUEwQiwyQkFBVSxXQUFXLDZEQUcvQyxrQ0FBa0MsMkJBQVUsV0FBVyx1REFHdkQsNEJBQTRCLDJCQUFVLFdBQVcsMERBR2pELCtCQUErQiwyQkFBVSxXQUFXLDBDQWZqRCw0QkFBNEIsa0RDN0RqRCxzMGNBa1RBOzJGRHpQYSxxQkFBcUI7a0JBVGpDLFNBQVM7K0JBQ0ksZ0JBQWdCLGFBRWY7d0JBQ1AsaUJBQWlCO3dCQUNqQixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDcEI7OzBCQThHSSxRQUFROzswQkFDUixNQUFNOzJCQUFDLG9CQUFvQjs7MEJBRTNCLE1BQU07MkJBQUMsZUFBZTs7MEJBRXRCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFFdkIsTUFBTTsyQkFBQyxhQUFhOzswQkFFcEIsTUFBTTsyQkFBQyxnQkFBZ0I7bU9BbkhyQixLQUFLO3NCQURYLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUl4RCxPQUFPO3NCQURiLGVBQWU7dUJBQUMsNEJBQTRCO2dCQUl0QyxLQUFLO3NCQURYLFlBQVk7dUJBQUMsMEJBQTBCO2dCQUlqQyxLQUFLO3NCQURYLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUl4RCxhQUFhO3NCQURuQixZQUFZO3VCQUFDLGtDQUFrQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFJaEUsT0FBTztzQkFEYixZQUFZO3VCQUFDLDRCQUE0QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFJMUQsVUFBVTtzQkFEaEIsWUFBWTt1QkFBQywrQkFBK0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBSTdELElBQUk7c0JBRFYsS0FBSztnQkFJQyxNQUFNO3NCQURaLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLE9BQU87c0JBRGIsS0FBSztnQkFJQyxVQUFVO3NCQURoQixLQUFLO2dCQUlDLFFBQVE7c0JBRGQsS0FBSztnQkFJQyxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxXQUFXO3NCQURqQixLQUFLO2dCQUlDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFJQyxPQUFPO3NCQURiLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE1hdEJvdHRvbVNoZWV0IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2JvdHRvbS1zaGVldFwiO1xuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvclwiO1xuaW1wb3J0IHsgU29ydCB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zb3J0XCI7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgRXhwb3J0Qm90dG9tU2hlZXRDb21wb25lbnQsIEV4cG9ydFN0cmF0ZWd5LCBOaWNlTWVkaWFXYXRjaGVyU2VydmljZSB9IGZyb20gXCJAcmVjdXJzeXZlL25pY2UtdWkta2l0LnYyXCI7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBRdWVyeVBhcmFtcyB9IGZyb20gXCIuLi8uLi9hcGkvZmlsdGVyLmFwaVwiO1xuaW1wb3J0IHsgRmlsdGVyQ29uZmlndXJhdGlvbk1vZGVsIH0gZnJvbSBcIi4uLy4uL21vZGVscy9maWx0ZXIubW9kZWxcIjtcbmltcG9ydCB7IFF1ZXJ5TW9kZWwsIFF1ZXJ5UnVsZU1vZGVsIH0gZnJvbSBcIi4uLy4uL21vZGVscy9xdWVyeS5tb2RlbFwiO1xuaW1wb3J0IHtcbiAgICBCQVNFX0xJU1RfSUNPTlMsXG4gICAgQkFTRV9MSVNUX0xBWU9VVCxcbiAgICBFTkFCTEVfUVVFUllfQlVJTERFUixcbiAgICBFWFBPUlRTX1NFVFRJTkdTLFxuICAgIFRBQkxFX0NPTFVNTlNcbn0gZnJvbSBcIi4vYmFzZS1saXN0LmNvbnN0YW50XCI7XG5pbXBvcnQgeyBOaWNlQmFzZUxpc3RCdXR0b25zRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9iYXNlLWxpc3QtYnV0dG9ucy5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdENhcmRzRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9iYXNlLWxpc3QtY2FyZHMuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBOaWNlQmFzZUxpc3RDdXN0b21Db250ZW50RGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9iYXNlLWxpc3QtY3VzdG9tLWNvbnRlbnQuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBOaWNlQmFzZUxpc3RFbXB0eVN0YXRlRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9iYXNlLWxpc3QtZW1wdHktc3RhdGUuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBOaWNlQmFzZUxpc3RGaWx0ZXJzRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9iYXNlLWxpc3QtZmlsdGVycy5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IE5pY2VCYXNlTGlzdFRhYmxlRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9iYXNlLWxpc3QtdGFibGUuZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBOaWNlQmFzZUxpc3RUaXRsZURpcmVjdGl2ZSB9IGZyb20gXCIuL2RpcmVjdGl2ZXMvYmFzZS1saXN0LXRpdGxlLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgVGFibGVDb2x1bW5zIH0gZnJvbSBcIi4vbW9kZWxzL2NvbHVtbnMubW9kZWxcIjtcbmltcG9ydCB7IEV4cG9ydFNldHRpbmdzIH0gZnJvbSBcIi4vbW9kZWxzL2V4cG9ydC5tb2RlbFwiO1xuaW1wb3J0IHsgTmljZUJhc2VJY29uT3B0aW9ucyB9IGZyb20gXCIuL21vZGVscy9pY29ucy5tb2RlbFwiO1xuaW1wb3J0IHsgQmFzZUxpc3RMYXlvdXQsIExheW91dENvbnRlbnQgfSBmcm9tIFwiLi9tb2RlbHMvbGF5b3V0Lm1vZGVsXCI7XG5pbXBvcnQgeyBOaWNlRmlsdGVyU2VydmljZSB9IGZyb20gXCIuL3Byb3ZpZGVycy9iYXNlLWZpbHRlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOaWNlQmFzZUxpc3RRdWVyeSB9IGZyb20gXCIuL3N0b3JlL2Jhc2UtbGlzdC5xdWVyeVwiO1xuaW1wb3J0IHsgTmljZUJhc2VMaXN0U2VydmljZSB9IGZyb20gXCIuL3N0b3JlL2Jhc2UtbGlzdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOaWNlQmFzZUxpc3RTdG9yZSB9IGZyb20gXCIuL3N0b3JlL2Jhc2UtbGlzdC5zdG9yZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJuaWNlLWJhc2UtbGlzdFwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vYmFzZS1saXN0LnRlbXBsYXRlLmh0bWxcIixcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTmljZUJhc2VMaXN0UXVlcnksXG4gICAgICAgIE5pY2VCYXNlTGlzdFNlcnZpY2UsXG4gICAgICAgIE5pY2VCYXNlTGlzdFN0b3JlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBOaWNlQmFzZUxpc3RDb21wb25lbnQ8RmlsdGVyIGV4dGVuZHMgTmljZUZpbHRlclNlcnZpY2U8YW55PiA9IE5pY2VGaWx0ZXJTZXJ2aWNlPGFueT4+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gICAgQENvbnRlbnRDaGlsZChOaWNlQmFzZUxpc3RUaXRsZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyB0aXRsZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oTmljZUJhc2VMaXN0QnV0dG9uc0RpcmVjdGl2ZSlcbiAgICBwdWJsaWMgYnV0dG9uczogTmljZUJhc2VMaXN0QnV0dG9uc0RpcmVjdGl2ZVtdO1xuXG4gICAgQENvbnRlbnRDaGlsZChOaWNlQmFzZUxpc3RUYWJsZURpcmVjdGl2ZSlcbiAgICBwdWJsaWMgdGFibGU6IE5pY2VCYXNlTGlzdFRhYmxlRGlyZWN0aXZlO1xuXG4gICAgQENvbnRlbnRDaGlsZChOaWNlQmFzZUxpc3RDYXJkc0RpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBjYXJkczogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBDb250ZW50Q2hpbGQoTmljZUJhc2VMaXN0Q3VzdG9tQ29udGVudERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBjdXN0b21Db250ZW50OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQENvbnRlbnRDaGlsZChOaWNlQmFzZUxpc3RGaWx0ZXJzRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGZpbHRlcnM6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAQ29udGVudENoaWxkKE5pY2VCYXNlTGlzdEVtcHR5U3RhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZW1wdHlTdGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1vZGU6IFwibm9ybWFsXCIgfCBcImluZmluaXRlLXNjcm9sbFwiID0gXCJub3JtYWxcIjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGxheW91dDogXCJwYWdlXCIgfCBcImNvbXBvbmVudFwiID0gXCJwYWdlXCI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsYXlvdXRDb250ZW50ID0gTGF5b3V0Q29udGVudC5UYWJsZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGF1dG9DaGFuZ2VMYXlvdXQgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYmFzZVJvdXRlOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3V0ZUZuOiAoaXRlbTogYW55KSA9PiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG5hdmlnYXRlRm46IChiYXNlUm91dGU6IHN0cmluZywgaXRlbTogYW55KSA9PiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhdXRvTG9hZCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwYWdlVGl0bGU6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNhbkV4cG9ydCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlUm91dGluZyA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY3VzdG9tRXhwb3J0OiBFeHBvcnRTdHJhdGVneVtdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBxdWVyeVBhcmFtczogUXVlcnlQYXJhbXMgPSB7fTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNvbmZpZ1F1ZXJ5UGFyYW1zOiBRdWVyeVBhcmFtcyA9IHt9O1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG5ld1BhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VFdmVudD4oKTtcblxuICAgIHB1YmxpYyBkZWZhdWx0UGFnZVNpemVPcHRpb25zID0gWzEwLCAyNSwgNTAsIDEwMF07XG4gICAgcHVibGljIGNvbHVtbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHVibGljIGxvYWRpbmckID0gdGhpcy5xdWVyeS5zZWxlY3RMb2FkaW5nKCk7XG5cbiAgICBwdWJsaWMgZmlsdGVyUmVzdWx0JCA9IHRoaXMucXVlcnkuc2VsZWN0RmlsdGVyUmVzdWx0KCk7XG4gICAgcHVibGljIGRhdGEkID0gdGhpcy5xdWVyeS5zZWxlY3REYXRhKCk7XG4gICAgcHVibGljIHJlY29yZHNGaWx0ZXJlZCQgPSB0aGlzLmZpbHRlclJlc3VsdCQucGlwZShtYXAoZiA9PiBmICYmIGYudG90YWwpKTtcbiAgICBwdWJsaWMgaXNFbXB0eSQgPSB0aGlzLnF1ZXJ5LnNlbGVjdEVtcHR5KCk7XG5cbiAgICBwdWJsaWMgc2hvd1F1ZXJ5QnVpbGRlciQgPSB0aGlzLnF1ZXJ5LnNlbGVjdFNob3dRdWVyeUJ1aWxkZXIoKTtcbiAgICBwdWJsaWMgZmlsdGVyUGFyYW1ldGVycyQgPSB0aGlzLnF1ZXJ5LnNlbGVjdEZpbHRlclBhcmFtZXRlcnMoKTtcbiAgICBwdWJsaWMgaW5kZXgkID0gdGhpcy5maWx0ZXJQYXJhbWV0ZXJzJC5waXBlKG1hcChmID0+IE1hdGguZmxvb3IoKGYuc3RhcnQgPz8gMCkgLyAoZi5sZW5ndGggPz8gMSkpKSk7XG4gICAgcHVibGljIGxlbmd0aCQgPSB0aGlzLmZpbHRlclBhcmFtZXRlcnMkLnBpcGUobWFwKGYgPT4gZi5sZW5ndGgpKTtcbiAgICBwdWJsaWMgc2VhcmNoUXVlcnkkID0gdGhpcy5maWx0ZXJQYXJhbWV0ZXJzJC5waXBlKG1hcChmID0+IGYuc2VhcmNoKSk7XG4gICAgcHVibGljIGZpbHRlckNvbmZpZyQgPSB0aGlzLnF1ZXJ5LnNlbGVjdEZpbHRlckNvbmZpZygpO1xuICAgIHB1YmxpYyBzb3J0Q29sdW1uJCA9IHRoaXMuZmlsdGVyUGFyYW1ldGVycyQucGlwZShtYXAoZiA9PiAoZi5vcmRlciAmJiBmLm9yZGVyLmNvbHVtbikgPz8gXCJcIikpO1xuICAgIHB1YmxpYyBzb3J0RGlyZWN0aW9uJCA9IHRoaXMuZmlsdGVyUGFyYW1ldGVycyQucGlwZShtYXAoZiA9PiBmLm9yZGVyICYmIGYub3JkZXIuZGlyZWN0aW9uKSk7XG5cbiAgICBwdWJsaWMgZmlsdGVyQ29uZmlnTG9hZGluZyQgPSB0aGlzLnF1ZXJ5LnNlbGVjdEZpbHRlckNvbmZpZ0xvYWRpbmcoKTtcbiAgICBwdWJsaWMgcnVsZXMkID0gdGhpcy5maWx0ZXJQYXJhbWV0ZXJzJC5waXBlKG1hcChwYXJhbWV0ZXJzID0+IHBhcmFtZXRlcnMucnVsZXMpKTtcbiAgICBwdWJsaWMgcnVsZXNDb3VudCQgPSB0aGlzLmZpbHRlclBhcmFtZXRlcnMkLnBpcGUobWFwKHBhcmFtZXRlcnMgPT4gcGFyYW1ldGVycy5ydWxlcz8ubGVuZ3RoID8/IDApKTtcblxuICAgIHB1YmxpYyB4c0FjdGl2ZSQgPSB0aGlzLm1lZGlhV2F0Y2hlci54c0JyZWFrcG9pbnRBY3RpdmUkO1xuICAgIHB1YmxpYyBzbUFjdGl2ZSQgPSB0aGlzLm1lZGlhV2F0Y2hlci5zbUJyZWFrcG9pbnRBY3RpdmUkO1xuICAgIHB1YmxpYyBtZEFjdGl2ZSQgPSB0aGlzLm1lZGlhV2F0Y2hlci5tZEJyZWFrcG9pbnRBY3RpdmUkO1xuICAgIHB1YmxpYyBsZ0FjdGl2ZSQgPSB0aGlzLm1lZGlhV2F0Y2hlci5sZ0JyZWFrcG9pbnRBY3RpdmUkO1xuICAgIHB1YmxpYyB4bEFjdGl2ZSQgPSB0aGlzLm1lZGlhV2F0Y2hlci54bEJyZWFrcG9pbnRBY3RpdmUkO1xuICAgIHB1YmxpYyBkZWZhdWx0QWN0aXZlJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMueHNBY3RpdmUkLCB0aGlzLnNtQWN0aXZlJCwgdGhpcy5tZEFjdGl2ZSQsIHRoaXMubGdBY3RpdmUkLCB0aGlzLnhsQWN0aXZlJF0pLnBpcGUoXG4gICAgICAgIG1hcCgoW3hzLCBzbSwgbWQsIGxnLCB4bF0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB4cyAmJiAhdGhpcy5saXN0TGF5b3V0LnhzXG4gICAgICAgICAgICAgICAgfHwgc20gJiYgIXRoaXMubGlzdExheW91dC5zbVxuICAgICAgICAgICAgICAgIHx8IG1kICYmICF0aGlzLmxpc3RMYXlvdXQubWRcbiAgICAgICAgICAgICAgICB8fCBsZyAmJiAhdGhpcy5saXN0TGF5b3V0LmxnXG4gICAgICAgICAgICAgICAgfHwgeGwgJiYgIXRoaXMubGlzdExheW91dC54bDtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgcHJpdmF0ZSBzZWFyY2hUZXh0JCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBASW5qZWN0KEVOQUJMRV9RVUVSWV9CVUlMREVSKVxuICAgICAgICBwdWJsaWMgZW5hYmxlUXVlcnlCdWlsZGVyOiBib29sZWFuLFxuICAgICAgICBASW5qZWN0KEJBU0VfTElTVF9JQ09OUylcbiAgICAgICAgcHVibGljIGljb25zOiBOaWNlQmFzZUljb25PcHRpb25zLFxuICAgICAgICBASW5qZWN0KEJBU0VfTElTVF9MQVlPVVQpXG4gICAgICAgIHB1YmxpYyBsaXN0TGF5b3V0OiBCYXNlTGlzdExheW91dCxcbiAgICAgICAgQEluamVjdChUQUJMRV9DT0xVTU5TKVxuICAgICAgICBwdWJsaWMgY29sdW1uczogVGFibGVDb2x1bW5zW10sXG4gICAgICAgIEBJbmplY3QoRVhQT1JUU19TRVRUSU5HUylcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBleHBvcnRzU2V0dGluZ3M6IEV4cG9ydFNldHRpbmdzLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcXVlcnk6IE5pY2VCYXNlTGlzdFF1ZXJ5LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogTmljZUJhc2VMaXN0U2VydmljZTxGaWx0ZXI+LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib3R0b21TaGVldDogTWF0Qm90dG9tU2hlZXQsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbWVkaWFXYXRjaGVyOiBOaWNlTWVkaWFXYXRjaGVyU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLnNldENvbHVtbnMoY29sdW1ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcmVmaXhCdXR0b25zKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5idXR0b25zPy5maW5kKHggPT4geC5wb3NpdGlvbiA9PT0gXCJwcmVmaXhcIik/LnRlbXBsYXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3VmZml4QnV0dG9ucygpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnV0dG9ucz8uZmluZCh4ID0+IHgucG9zaXRpb24gPT09IFwic3VmZml4XCIpPy50ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaEJ1dHRvbnMoKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1dHRvbnM/LmZpbmQoeCA9PiB4LnBvc2l0aW9uID09PSBcInNlYXJjaFwiKT8udGVtcGxhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNlcnZpY2UuaW5pdCh0aGlzLmNvbmZpZ1F1ZXJ5UGFyYW1zKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmxvYWRRdWVyeVBhcmFtcyh0aGlzLmF1dG9Mb2FkKTtcblxuICAgICAgICB0aGlzLnNlYXJjaFRleHQkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoc2VhcmNoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5yZXNldFBhZ2luZygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnNlYXJjaERhdGEoc2VhcmNoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIHRoaXMubWVkaWFXYXRjaGVyLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXV0b0NoYW5nZUxheW91dCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMubWVkaWFXYXRjaGVyLmlzQWN0aXZlKFwibHQtbWRcIikgJiYgdGhpcy5sYXlvdXRDb250ZW50ID09PSBMYXlvdXRDb250ZW50LlRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb250ZW50ID0gTGF5b3V0Q29udGVudC5DYXJkcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb250ZW50ID0gTGF5b3V0Q29udGVudC5UYWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuY2xvc2VTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKFwibW9kZVwiIGluIGNoYW5nZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5zZXRNb2RlKGNoYW5nZXMubW9kZS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcInF1ZXJ5UGFyYW1zXCIgaW4gY2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnNldFF1ZXJ5UGFyYW1zKGNoYW5nZXMucXVlcnlQYXJhbXMuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2FkaW5nKGxvYWRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnNldExvYWRpbmcobG9hZGluZyk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrVG9nZ2xlU2hvd1F1ZXJ5QnVpbGRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnRvZ2dsZVF1ZXJ5QnVpbGRlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblVwZGF0ZVJ1bGVzKHJ1bGVzOiBRdWVyeU1vZGVsW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZUdsb2JhbFJ1bGVzKHJ1bGVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25RdWVyeUJ1aWxkZXJGaWx0ZXJTZWxlY3RlZChmaWx0ZXJDb25maWd1cmF0aW9uTW9kZWw6IEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuYWRkUnVsZUZyb21Db25maWcoZmlsdGVyQ29uZmlndXJhdGlvbk1vZGVsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25VcGRhdGVQYWdlKHBhZ2VFdmVudDogUGFnZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS5sb2FkTmV3UGFnZShwYWdlRXZlbnQucGFnZUluZGV4ICogcGFnZUV2ZW50LnBhZ2VTaXplLCBwYWdlRXZlbnQucGFnZVNpemUpO1xuICAgICAgICB0aGlzLm5ld1BhZ2UuZW1pdChwYWdlRXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblVwZGF0ZVNlYXJjaChzZWFyY2g6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFRleHQkLm5leHQoc2VhcmNoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmlsdGVyUnVsZSQoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8UXVlcnlSdWxlTW9kZWwgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyUGFyYW1ldGVycyQucGlwZShcbiAgICAgICAgICAgIG1hcChmID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBmLnJ1bGVzICYmXG4gICAgICAgICAgICAgICAgICAgIGYucnVsZXNbMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgZi5ydWxlc1swXS5ydWxlcyAmJlxuICAgICAgICAgICAgICAgICAgICAoZi5ydWxlc1swXS5ydWxlcy5maW5kKChyKSA9PiAociBhcyBRdWVyeVJ1bGVNb2RlbCkuaWQgPT09IGlkKSBhcyBRdWVyeVJ1bGVNb2RlbClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25VcGRhdGVTb3J0KHNvcnQ6IFNvcnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbnVsbExhc3QgPSB0aGlzLmNvbHVtbnMuZmluZCgoeCkgPT4geC5pZCA9PT0gc29ydC5hY3RpdmUpPy5udWxsTGFzdDtcbiAgICAgICAgaWYgKCFzb3J0LmFjdGl2ZSB8fCAhc29ydC5kaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHNvcnQgPSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlOiBcImlkXCIsXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImFzY1wiXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXJ2aWNlLmxvYWREYXRhKHtcbiAgICAgICAgICAgIG9yZGVyOiBzb3J0LmFjdGl2ZSAmJiBzb3J0LmRpcmVjdGlvbiA/IHsgY29sdW1uOiBzb3J0LmFjdGl2ZSwgZGlyZWN0aW9uOiBzb3J0LmRpcmVjdGlvbiwgbnVsbExhc3QgfSA6IG51bGxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVJ1bGUoaWQ6IHN0cmluZywgbmV3UnVsZTogUXVlcnlSdWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnVwZGF0ZVJ1bGUoaWQsIG5ld1J1bGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVSdWxlcyhydWxlczogUXVlcnlSdWxlTW9kZWxbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UudXBkYXRlUnVsZXMocnVsZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGlja0V4cG9ydCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhwb3J0cyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5leHBvcnRzU2V0dGluZ3MueGxzeCkge1xuICAgICAgICAgICAgZXhwb3J0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInhsc3hcIixcbiAgICAgICAgICAgICAgICBvbkNsaWNrRXhwb3J0OiAoKSA9PiB0aGlzLmNsaWNrWGxzeCgpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV4cG9ydHNTZXR0aW5ncy5jc3YpIHtcbiAgICAgICAgICAgIGV4cG9ydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJjc3ZcIixcbiAgICAgICAgICAgICAgICBvbkNsaWNrRXhwb3J0OiAoKSA9PiB0aGlzLmNsaWNrQ3N2KClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXhwb3J0c1NldHRpbmdzLnBkZikge1xuICAgICAgICAgICAgZXhwb3J0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInBkZlwiLFxuICAgICAgICAgICAgICAgIG9uQ2xpY2tFeHBvcnQ6ICgpID0+IHRoaXMuY2xpY2tQZGYoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib3R0b21TaGVldC5vcGVuKEV4cG9ydEJvdHRvbVNoZWV0Q29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZXhwb3J0U3RyYXRlZ2llczogW1xuICAgICAgICAgICAgICAgICAgICAuLi5leHBvcnRzLFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmN1c3RvbUV4cG9ydFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlKGl0ZW06IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXZpZ2F0ZUZuKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlRm4odGhpcy5iYXNlUm91dGUsIGl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgcm91dGUgPSB0aGlzLnJvdXRlRm4gPyB0aGlzLnJvdXRlRm4oaXRlbSkgOiBbKHRoaXMuYmFzZVJvdXRlIHx8IFwiXCIpICsgaXRlbT8uaWRdO1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUodHlwZW9mIHJvdXRlID09PSBcInN0cmluZ1wiID8gW3JvdXRlXSA6IHJvdXRlLCB7IHJlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVkUm91dGUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tYbHN4KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlcnZpY2UuZG93bmxvYWREYXRhKFwieGxzeFwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tDc3YoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS5kb3dubG9hZERhdGEoXCJjc3ZcIik7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrUHJpbnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS5wcmludERhdGEoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tQZGYoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VydmljZS5kb3dubG9hZERhdGEoXCJwZGZcIik7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbHVtbnMoY29sdW1uczogVGFibGVDb2x1bW5zW10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucztcbiAgICAgICAgdGhpcy5jb2x1bW5OYW1lcyA9IGNvbHVtbnMubWFwKHggPT4geC5pZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbHVtbnMoY29sdW1uczogVGFibGVDb2x1bW5zW10sIHByZXBlbmQgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAocHJlcGVuZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRDb2x1bW5zKFtcbiAgICAgICAgICAgICAgICAuLi5jb2x1bW5zLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29sdW1uc1xuICAgICAgICAgICAgXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbHVtbnMoW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29sdW1ucyxcbiAgICAgICAgICAgICAgICAuLi5jb2x1bW5zXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsaXN0IHBhZ2UtbGF5b3V0IGNhcmRlZCBmdWxsd2lkdGggaW5uZXItc2Nyb2xsXCIgKm5nSWY9XCJsYXlvdXQgPT09ICdwYWdlJzsgZWxzZSBjb250ZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjY29udGVudD5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGlzdExheW91dC54bFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuIHhsOmJsb2NrXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnZUxheW91dDsgY29udGV4dDogeyBsYXlvdXQ6IGxpc3RMYXlvdXQueGwsIGFjdGl2ZTogeGxBY3RpdmUkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaXN0TGF5b3V0LmxnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gbGc6YmxvY2sgeGw6aGlkZGVuXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnZUxheW91dDsgY29udGV4dDogeyBsYXlvdXQ6IGxpc3RMYXlvdXQubGcsIGFjdGl2ZTogbGdBY3RpdmUkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaXN0TGF5b3V0Lm1kXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gbWQ6YmxvY2sgbGc6aGlkZGVuXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnZUxheW91dDsgY29udGV4dDogeyBsYXlvdXQ6IGxpc3RMYXlvdXQubWQsIGFjdGl2ZTogbWRBY3RpdmUkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaXN0TGF5b3V0LnNtXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gc206YmxvY2sgbWQ6aGlkZGVuXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFnZUxheW91dDsgY29udGV4dDogeyBsYXlvdXQ6IGxpc3RMYXlvdXQuc20sIGFjdGl2ZTogc21BY3RpdmUkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaXN0TGF5b3V0LnhzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJibG9jayBzbTpoaWRkZW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdlTGF5b3V0OyBjb250ZXh0OiB7IGxheW91dDogbGlzdExheW91dC54cywgYWN0aXZlOiB4c0FjdGl2ZSQgfCBhc3luYyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdlxuICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiEhbGlzdExheW91dC54c1wiXG4gICAgICAgIFtjbGFzcy5ibG9ja109XCIhbGlzdExheW91dC54c1wiXG4gICAgICAgIFtjbGFzcy5zbTpoaWRkZW5dPVwiISFsaXN0TGF5b3V0LnNtXCJcbiAgICAgICAgW2NsYXNzLnNtOmJsb2NrXT1cIiFsaXN0TGF5b3V0LnNtXCJcbiAgICAgICAgW2NsYXNzLm1kOmhpZGRlbl09XCIhIWxpc3RMYXlvdXQubWRcIlxuICAgICAgICBbY2xhc3MubWQ6YmxvY2tdPVwiIWxpc3RMYXlvdXQubWRcIlxuICAgICAgICBbY2xhc3MubGc6aGlkZGVuXT1cIiEhbGlzdExheW91dC5sZ1wiXG4gICAgICAgIFtjbGFzcy5sZzpibG9ja109XCIhbGlzdExheW91dC5sZ1wiXG4gICAgICAgIFtjbGFzcy54bDpoaWRkZW5dPVwiISFsaXN0TGF5b3V0LnhsXCJcbiAgICAgICAgW2NsYXNzLnhsOmJsb2NrXT1cIiFsaXN0TGF5b3V0LnhsXCJcbiAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwYWdlTGF5b3V0OyBjb250ZXh0OiB7IGxheW91dDogbGlzdExheW91dC5kZWZhdWx0LCBhY3RpdmU6IGRlZmF1bHRBY3RpdmUkIHwgYXN5bmMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwYWdlTGF5b3V0IGxldC1sYXlvdXQ9XCJsYXlvdXRcIiBsZXQtYWN0aXZlPVwiYWN0aXZlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dD8ubGVuZ3RoOyBlbHNlIGlzT2JqZWN0XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50TGF5b3V0OyBjb250ZXh0OiB7IGxheW91dDogeyBjbGFzc2VzOiBbJ2ZsZXggZmxleC1jb2wnXSwgaXRlbXM6IGxheW91dCB9LCBhY3RpdmUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNpc09iamVjdD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRMYXlvdXQ7IGNvbnRleHQ6IHsgbGF5b3V0OiBsYXlvdXQsIGFjdGl2ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29udGVudExheW91dCBsZXQtbGF5b3V0PVwibGF5b3V0XCIgbGV0LWFjdGl2ZT1cImFjdGl2ZVwiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwibGF5b3V0LmNsYXNzZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsYXlvdXQuaXRlbXNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWU7IGVsc2UgY2hpbGRJc0xheW91dFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsYXlvdXRJdGVtOyBjb250ZXh0OiB7IGl0ZW06IGl0ZW0sIGFjdGl2ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hpbGRJc0xheW91dD5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudExheW91dDsgY29udGV4dDogeyBsYXlvdXQ6IGl0ZW0sIGFjdGl2ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbGF5b3V0SXRlbSBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtYWN0aXZlPVwiYWN0aXZlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0ubmFtZSA9PT0gJ3RpdGxlJyAmJiB0aXRsZVwiPlxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3Nlc1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0ubmFtZSA9PT0gJ3NlYXJjaCdcIj5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtd3JhcHBlciBteC1tZC0wXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaCBmbGV4IGZsZXgtYXV0byBqdXN0aWZ5LXN0YXJ0IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW3N2Z0ljb25dPVwiaWNvbnMuc2VhcmNoLnN2Z0ljb25cIj57eyBpY29ucy5zZWFyY2gubWF0SWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbbmdNb2RlbF09XCJzZWFyY2hRdWVyeSQgfCBhc3luY1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVXBkYXRlU2VhcmNoKCRldmVudClcIiBbcGxhY2Vob2xkZXJdPVwiJ2dlbmVyYWwuc2VhcmNoJyB8IHRyYW5zbGF0ZVwiIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlYXJjaEJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlYXJjaEJ1dHRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlUXVlcnlCdWlsZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIShzaG93UXVlcnlCdWlsZGVyJCB8IGFzeW5jKSAmJiAhKHJ1bGVzQ291bnQkIHwgYXN5bmMpICYmIChmaWx0ZXJDb25maWckIHwgYXN5bmMpLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmljZVF1ZXJ5QnVpbGRlclRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5QnVpbGRlckZpbHRlcnNdPVwiZmlsdGVyQ29uZmlnJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5QnVpbGRlckZpbHRlcnNMb2FkaW5nXT1cIihmaWx0ZXJDb25maWdMb2FkaW5nJCB8IGFzeW5jKSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxdWVyeUJ1aWxkZXJGaWx0ZXJTZWxlY3RlZCk9XCJvblF1ZXJ5QnVpbGRlckZpbHRlclNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInZ2VuZXJhbC5xdWVyeV9idWlsZGVyLnNob3dfYWR2YW5jZWRfc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdmdJY29uXT1cImljb25zLnF1ZXJ5QnVpbGRlci5zdmdJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEJhZGdlXT1cInJ1bGVzQ291bnQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIShydWxlc0NvdW50JCB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaWNvbnMucXVlcnlCdWlsZGVyLm1hdEljb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEoc2hvd1F1ZXJ5QnVpbGRlciQgfCBhc3luYykgJiYgKHJ1bGVzQ291bnQkIHwgYXN5bmMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlckNvbmZpZ0xvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tUb2dnbGVTaG93UXVlcnlCdWlsZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInZ2VuZXJhbC5xdWVyeV9idWlsZGVyLnNob3dfYWR2YW5jZWRfc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdmdJY29uXT1cImljb25zLnF1ZXJ5QnVpbGRlci5zdmdJY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEJhZGdlXT1cInJ1bGVzQ291bnQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QmFkZ2VIaWRkZW5dPVwiIShydWxlc0NvdW50JCB8IGFzeW5jKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaWNvbnMucXVlcnlCdWlsZGVyLm1hdEljb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93UXVlcnlCdWlsZGVyJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tUb2dnbGVTaG93UXVlcnlCdWlsZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidnZW5lcmFsLnF1ZXJ5X2J1aWxkZXIuY2xvc2VfYWR2YW5jZWRfc2VhcmNoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cImljb25zLmNsb3NlLnN2Z0ljb25cIj57eyBpY29ucy5jbG9zZS5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdwcmVmaXhCdXR0b25zJyAmJiBwcmVmaXhCdXR0b25zXCI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJlZml4QnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdzdWZmaXhCdXR0b25zJyAmJiBzdWZmaXhCdXR0b25zXCI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3VmZml4QnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdleHBvcnRCdXR0b25zJyAmJiBjYW5FeHBvcnRcIj5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIiBbY2xhc3MubXItMl09XCIhIXN1ZmZpeEJ1dHRvbnNcIiBbY2xhc3MubWwtMl09XCIhIXByZWZpeEJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrUHJpbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ2dlbmVyYWwucHJpbnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWJ1dHRvbiBtci0yXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0LW1pbmktZmFiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cImljb25zLnByaW50LnN2Z0ljb25cIj57eyBpY29ucy5wcmludC5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0V4cG9ydCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInZ2VuZXJhbC5leHBvcnQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWJ1dHRvbiBtci0yXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0LW1pbmktZmFiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIFtzdmdJY29uXT1cImljb25zLmRvd25sb2FkLnN2Z0ljb25cIj57eyBpY29ucy5kb3dubG9hZC5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdjb250ZW50J1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGlzRW1wdHkkIHwgYXN5bmMpICYmIGVtcHR5U3RhdGU7IGVsc2Ugc2hvd0RhdGFcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlbXB0eVN0YXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3Nob3dEYXRhPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dENvbnRlbnQgPT09ICd0YWJsZScgJiYgdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGVMYXlvdXQ7IGNvbnRleHQ6IHsgaXRlbTogaXRlbSwgYWN0aXZlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dENvbnRlbnQgPT09ICdjYXJkcycgJiYgY2FyZHNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZHNMYXlvdXQ7IGNvbnRleHQ6IHsgaXRlbTogaXRlbSwgYWN0aXZlIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxheW91dENvbnRlbnQgPT09ICdjdXN0b20nICYmIGN1c3RvbUNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tTGF5b3V0OyBjb250ZXh0OiB7IGl0ZW06IGl0ZW0sIGFjdGl2ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdwYWdpbmF0aW9uJyAmJiBsYXlvdXRDb250ZW50ICE9PSAnY3VzdG9tJ1wiPlxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3Nlc1wiPlxuICAgICAgICAgICAgPG1hdC1wYWdpbmF0b3JcbiAgICAgICAgICAgICAgICAocGFnZSk9XCJvblVwZGF0ZVBhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2xlbmd0aF09XCJyZWNvcmRzRmlsdGVyZWQkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFtwYWdlSW5kZXhdPVwiaW5kZXgkIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiZGVmYXVsdFBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW3BhZ2VTaXplXT1cImxlbmd0aCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdxdWVyeUJ1aWxkZXInICYmIGVuYWJsZVF1ZXJ5QnVpbGRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwic2hvd1F1ZXJ5QnVpbGRlciQgfCBhc3luY1wiPlxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibXktNFwiIFtuaWNlTG9hZGluZ092ZXJsYXldPVwiZmlsdGVyQ29uZmlnTG9hZGluZyQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmljZS1xdWVyeS1idWlsZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlckNvbmZpZ3NdPVwiZmlsdGVyQ29uZmlnJCB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJydWxlcyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25VcGRhdGVSdWxlcygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2UpPVwiY2xpY2tUb2dnbGVTaG93UXVlcnlCdWlsZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmljZS1xdWVyeS1idWlsZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLm5hbWUgPT09ICdmaWx0ZXJzJyAmJiBmaWx0ZXJzXCI+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc2VzXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZmlsdGVyc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGFibGVMYXlvdXQgbGV0LWl0ZW09XCJpdGVtXCI+XG4gICAgPGRpdiBbbmdDbGFzc109XCJpdGVtLmNsYXNzZXNcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIFtuaWNlTG9hZGluZ092ZXJsYXldPVwibG9hZGluZyQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjb250ZW50LWNhcmQgYmFzZS1saXN0IGZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC10YWJsZVxuICAgICAgICAgICAgICAgICAgICAobWF0U29ydENoYW5nZSk9XCJvblVwZGF0ZVNvcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGEkXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFNvcnRBY3RpdmVdPVwiKHNvcnRDb2x1bW4kIHwgYXN5bmMpIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFNvcnREaXJlY3Rpb25dPVwiKHNvcnREaXJlY3Rpb24kIHwgYXN5bmMpIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgIG1hdFNvcnRcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtbk5hbWVzOyBzdGlja3k6IHRhYmxlLnN0aWNreUhlYWRlclwiPjwvbWF0LWhlYWRlci1yb3c+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uc29ydGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGUudGVtcGxhdGU7IGNvbnRleHQ6IHsgY29sdW1uOiBjb2x1bW4uaWQsIGhlYWRlcjogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLnNvcnRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFibGUudGVtcGxhdGU7IGNvbnRleHQ6IHsgY29sdW1uOiBjb2x1bW4uaWQsIGhlYWRlcjogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZS50ZW1wbGF0ZTsgY29udGV4dDogeyBjb2x1bW46IGNvbHVtbi5pZCwgZGF0YTogdHJ1ZSwgaXRlbTogaXRlbSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNhYmxlUm91dGluZzsgZWxzZSB3aXRoUm91dGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IGl0ZW07IGNvbHVtbnM6IGNvbHVtbk5hbWVzO1wiIGNsYXNzPVwiaXRlbVwiPjwvbWF0LXJvdz5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjd2l0aFJvdXRpbmc+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCBpdGVtOyBjb2x1bW5zOiBjb2x1bW5OYW1lcztcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZShpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtIGNsaWNrYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0UmlwcGxlXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtcm93PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L21hdC10YWJsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NhcmRzTGF5b3V0IGxldC1pdGVtPVwiaXRlbVwiIGxldC1hY3RpdmU9XCJhY3RpdmVcIj5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3Nlc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXRhIG9mIGRhdGEkIHwgYXN5bmNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXJkczsgY29udGV4dDogeyBpdGVtOiBkYXRhLCBhY3RpdmUgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY3VzdG9tTGF5b3V0IGxldC1pdGVtPVwiaXRlbVwiIGxldC1hY3RpdmU9XCJhY3RpdmVcIj5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cIml0ZW0uY2xhc3Nlc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tQ29udGVudDsgY29udGV4dDogeyAkaW1wbGljaXQ6IGRhdGEkIHwgYXN5bmMsIGRhdGE6IGRhdGEkIHwgYXN5bmMsIHRvdGFsOiByZWNvcmRzRmlsdGVyZWQkIHwgYXN5bmMsIGFjdGl2ZSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -1,14 +1,17 @@
1
- import { Directive, TemplateRef } from "@angular/core";
1
+ import { Directive, Input, TemplateRef } from "@angular/core";
2
2
  import * as i0 from "@angular/core";
3
3
  export class NiceBaseListTableDirective {
4
4
  constructor(template) {
5
5
  this.template = template;
6
+ this.stickyHeader = true;
6
7
  }
7
8
  }
8
9
  NiceBaseListTableDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NiceBaseListTableDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
9
- NiceBaseListTableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.3", type: NiceBaseListTableDirective, selector: "[niceListTable]", ngImport: i0 });
10
+ NiceBaseListTableDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.3", type: NiceBaseListTableDirective, selector: "[niceListTable]", inputs: { stickyHeader: "stickyHeader" }, ngImport: i0 });
10
11
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: NiceBaseListTableDirective, decorators: [{
11
12
  type: Directive,
12
13
  args: [{ selector: "[niceListTable]" }]
13
- }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1saXN0LXRhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlLWxpc3QvZGlyZWN0aXZlcy9iYXNlLWxpc3QtdGFibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUd2RCxNQUFNLE9BQU8sMEJBQTBCO0lBQ25DLFlBQW1CLFFBQTBCO1FBQTFCLGFBQVEsR0FBUixRQUFRLENBQWtCO0lBQzdDLENBQUM7O3VIQUZRLDBCQUEwQjsyR0FBMUIsMEJBQTBCOzJGQUExQiwwQkFBMEI7a0JBRHRDLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIFRlbXBsYXRlUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiBcIltuaWNlTGlzdFRhYmxlXVwiIH0pXG5leHBvcnQgY2xhc3MgTmljZUJhc2VMaXN0VGFibGVEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIH1cbn1cbiJdfQ==
14
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; }, propDecorators: { stickyHeader: [{
15
+ type: Input
16
+ }] } });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1saXN0LXRhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtZGF0YS1maWx0ZXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9iYXNlLWxpc3QvZGlyZWN0aXZlcy9iYXNlLWxpc3QtdGFibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFHOUQsTUFBTSxPQUFPLDBCQUEwQjtJQUluQyxZQUFtQixRQUEwQjtRQUExQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUZ0QyxpQkFBWSxHQUFHLElBQUksQ0FBQztJQUczQixDQUFDOzt1SEFMUSwwQkFBMEI7MkdBQTFCLDBCQUEwQjsyRkFBMUIsMEJBQTBCO2tCQUR0QyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFO2tHQUcvQixZQUFZO3NCQURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgVGVtcGxhdGVSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6IFwiW25pY2VMaXN0VGFibGVdXCIgfSlcbmV4cG9ydCBjbGFzcyBOaWNlQmFzZUxpc3RUYWJsZURpcmVjdGl2ZSB7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc3RpY2t5SGVhZGVyID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIH1cbn1cbiJdfQ==
@@ -15,4 +15,4 @@ export const defaultIcons = {
15
15
  matIcon: "cloud_download"
16
16
  }
17
17
  };
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbnMubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uaWNlLWRhdGEtZmlsdGVyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS1saXN0L21vZGVscy9pY29ucy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQXdCO0lBQzdDLE1BQU0sRUFBRTtRQUNKLE9BQU8sRUFBRSxRQUFRO0tBQ3BCO0lBQ0QsWUFBWSxFQUFFO1FBQ1YsT0FBTyxFQUFFLGFBQWE7S0FDekI7SUFDRCxLQUFLLEVBQUU7UUFDSCxPQUFPLEVBQUUsT0FBTztLQUNuQjtJQUNELEtBQUssRUFBRTtRQUNILE9BQU8sRUFBRSxPQUFPO0tBQ25CO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFLGdCQUFnQjtLQUM1QjtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOaWNlQmFzZUxpc3RJY29ucyA9IHsgbWF0SWNvbjogc3RyaW5nOyBzdmdJY29uPzogc3RyaW5nOyB9IHwgeyBtYXRJY29uPzogc3RyaW5nOyBzdmdJY29uOiBzdHJpbmc7IH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmljZUJhc2VJY29uT3B0aW9ucyB7XG4gICAgc2VhcmNoPzogTmljZUJhc2VMaXN0SWNvbnM7XG4gICAgcXVlcnlCdWlsZGVyPzogTmljZUJhc2VMaXN0SWNvbnM7XG4gICAgY2xvc2U/OiBOaWNlQmFzZUxpc3RJY29ucztcbiAgICBwcmludD86IE5pY2VCYXNlTGlzdEljb25zO1xuICAgIGRvd25sb2FkPzogTmljZUJhc2VMaXN0SWNvbnM7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0SWNvbnM6IE5pY2VCYXNlSWNvbk9wdGlvbnMgPSB7XG4gICAgc2VhcmNoOiB7XG4gICAgICAgIG1hdEljb246IFwic2VhcmNoXCJcbiAgICB9LFxuICAgIHF1ZXJ5QnVpbGRlcjoge1xuICAgICAgICBtYXRJY29uOiBcImZpbHRlcl9saXN0XCJcbiAgICB9LFxuICAgIGNsb3NlOiB7XG4gICAgICAgIG1hdEljb246IFwiY2xvc2VcIlxuICAgIH0sXG4gICAgcHJpbnQ6IHtcbiAgICAgICAgbWF0SWNvbjogXCJwcmludFwiXG4gICAgfSxcbiAgICBkb3dubG9hZDoge1xuICAgICAgICBtYXRJY29uOiBcImNsb3VkX2Rvd25sb2FkXCJcbiAgICB9XG59O1xuIl19
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbnMubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uaWNlLWRhdGEtZmlsdGVyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS1saXN0L21vZGVscy9pY29ucy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFhQSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQXdCO0lBQzdDLE1BQU0sRUFBRTtRQUNKLE9BQU8sRUFBRSxRQUFRO0tBQ3BCO0lBQ0QsWUFBWSxFQUFFO1FBQ1YsT0FBTyxFQUFFLGFBQWE7S0FDekI7SUFDRCxLQUFLLEVBQUU7UUFDSCxPQUFPLEVBQUUsT0FBTztLQUNuQjtJQUNELEtBQUssRUFBRTtRQUNILE9BQU8sRUFBRSxPQUFPO0tBQ25CO0lBQ0QsUUFBUSxFQUFFO1FBQ04sT0FBTyxFQUFFLGdCQUFnQjtLQUM1QjtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOaWNlQmFzZUxpc3RJY29ucyA9XG4gICAgeyBtYXRJY29uOiBzdHJpbmc7IHN2Z0ljb24/OiBzdHJpbmc7IH0gfFxuICAgIHsgbWF0SWNvbj86IHN0cmluZzsgc3ZnSWNvbjogc3RyaW5nOyB9IHxcbiAgICB7IGNsYXNzOiBzdHJpbmcsIG1hdEljb24/OiBzdHJpbmc7IHN2Z0ljb24/OiBzdHJpbmc7IH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmljZUJhc2VJY29uT3B0aW9ucyB7XG4gICAgc2VhcmNoPzogTmljZUJhc2VMaXN0SWNvbnM7XG4gICAgcXVlcnlCdWlsZGVyPzogTmljZUJhc2VMaXN0SWNvbnM7XG4gICAgY2xvc2U/OiBOaWNlQmFzZUxpc3RJY29ucztcbiAgICBwcmludD86IE5pY2VCYXNlTGlzdEljb25zO1xuICAgIGRvd25sb2FkPzogTmljZUJhc2VMaXN0SWNvbnM7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0SWNvbnM6IE5pY2VCYXNlSWNvbk9wdGlvbnMgPSB7XG4gICAgc2VhcmNoOiB7XG4gICAgICAgIG1hdEljb246IFwic2VhcmNoXCJcbiAgICB9LFxuICAgIHF1ZXJ5QnVpbGRlcjoge1xuICAgICAgICBtYXRJY29uOiBcImZpbHRlcl9saXN0XCJcbiAgICB9LFxuICAgIGNsb3NlOiB7XG4gICAgICAgIG1hdEljb246IFwiY2xvc2VcIlxuICAgIH0sXG4gICAgcHJpbnQ6IHtcbiAgICAgICAgbWF0SWNvbjogXCJwcmludFwiXG4gICAgfSxcbiAgICBkb3dubG9hZDoge1xuICAgICAgICBtYXRJY29uOiBcImNsb3VkX2Rvd25sb2FkXCJcbiAgICB9XG59O1xuIl19