tango-app-ui-analyse-trax 3.0.0-dev → 3.3.1-alpha.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 (48) hide show
  1. package/esm2022/lib/components/add-checklist/add-checklist.component.mjs +1389 -0
  2. package/esm2022/lib/components/checklist/checklist.component.mjs +235 -0
  3. package/esm2022/lib/components/checklist-configure/checklist-configure.component.mjs +1809 -0
  4. package/esm2022/lib/components/dashboard/dashboard.component.mjs +515 -0
  5. package/esm2022/lib/components/dashboard-info/dashboard-info.component.mjs +503 -0
  6. package/esm2022/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.mjs +169 -0
  7. package/esm2022/lib/components/flags/flags.component.mjs +188 -0
  8. package/esm2022/lib/components/flags/flags.interface.mjs +2 -0
  9. package/esm2022/lib/components/flags-info/flags-info.component.mjs +257 -0
  10. package/esm2022/lib/components/flags-info/flags-info.interface.mjs +2 -0
  11. package/esm2022/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.mjs +71 -0
  12. package/esm2022/lib/components/gallery/gallery.component.mjs +280 -0
  13. package/esm2022/lib/components/managechecklist/managechecklist.component.mjs +11 -0
  14. package/esm2022/lib/components/pagination/pagination.component.mjs +62 -0
  15. package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +101 -0
  16. package/esm2022/lib/components/reports/reports.component.mjs +204 -0
  17. package/esm2022/lib/components/reports/reports.interface.mjs +2 -0
  18. package/esm2022/lib/components/tango-analyse-trax/tango-analyse-trax.component.mjs +27 -6
  19. package/esm2022/lib/components/trax-store/trax-store.component.mjs +144 -0
  20. package/esm2022/lib/components/traxpopup/traxpopup.component.mjs +64 -0
  21. package/esm2022/lib/services/trax.service.mjs +200 -0
  22. package/esm2022/lib/tango-analyse-trax-routing.module.mjs +62 -6
  23. package/esm2022/lib/tango-analyse-trax.module.mjs +82 -9
  24. package/fesm2022/tango-app-ui-analyse-trax.mjs +6211 -24
  25. package/fesm2022/tango-app-ui-analyse-trax.mjs.map +1 -1
  26. package/lib/components/add-checklist/add-checklist.component.d.ts +91 -0
  27. package/lib/components/checklist/checklist.component.d.ts +38 -0
  28. package/lib/components/checklist-configure/checklist-configure.component.d.ts +162 -0
  29. package/lib/components/dashboard/dashboard.component.d.ts +62 -0
  30. package/lib/components/dashboard-info/dashboard-info.component.d.ts +92 -0
  31. package/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.d.ts +39 -0
  32. package/lib/components/flags/flags.component.d.ts +40 -0
  33. package/lib/components/flags/flags.interface.d.ts +61 -0
  34. package/lib/components/flags-info/flags-info.component.d.ts +50 -0
  35. package/lib/components/flags-info/flags-info.interface.d.ts +207 -0
  36. package/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.d.ts +13 -0
  37. package/lib/components/gallery/gallery.component.d.ts +64 -0
  38. package/lib/components/managechecklist/managechecklist.component.d.ts +5 -0
  39. package/lib/components/pagination/pagination.component.d.ts +16 -0
  40. package/lib/components/reactive-select/reactive-select.component.d.ts +31 -0
  41. package/lib/components/reports/reports.component.d.ts +43 -0
  42. package/lib/components/reports/reports.interface.d.ts +44 -0
  43. package/lib/components/tango-analyse-trax/tango-analyse-trax.component.d.ts +10 -1
  44. package/lib/components/trax-store/trax-store.component.d.ts +43 -0
  45. package/lib/components/traxpopup/traxpopup.component.d.ts +22 -0
  46. package/lib/services/trax.service.d.ts +65 -0
  47. package/lib/tango-analyse-trax.module.d.ts +23 -3
  48. package/package.json +1 -1
@@ -0,0 +1,169 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { Subject, debounceTime, takeUntil } from "rxjs";
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/router";
5
+ import * as i2 from "tango-app-ui-global";
6
+ import * as i3 from "tango-app-ui-shared";
7
+ import * as i4 from "../../../services/trax.service";
8
+ import * as i5 from "@angular/common";
9
+ ;
10
+ export class MonthlyperformanceDatepickerComponent {
11
+ route;
12
+ router;
13
+ gs;
14
+ changeDetector;
15
+ toast;
16
+ TraxService;
17
+ currentYear = new Date().getFullYear();
18
+ currentMonth = new Date().getMonth();
19
+ dayNames = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
20
+ monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
21
+ headerData;
22
+ performanceData = []; // This will store the performance data from the API response
23
+ detach = new Subject();
24
+ destroy$ = new Subject();
25
+ receivedData = "Checklist";
26
+ selectedvalue;
27
+ monthlyPeformanceLoading = true;
28
+ monthlyPeformanceNoData = false;
29
+ monthlyperformce;
30
+ constructor(route, router, gs, changeDetector, toast, TraxService) {
31
+ this.route = route;
32
+ this.router = router;
33
+ this.gs = gs;
34
+ this.changeDetector = changeDetector;
35
+ this.toast = toast;
36
+ this.TraxService = TraxService;
37
+ }
38
+ ngOnDestroy() {
39
+ this.detach.next(true);
40
+ this.detach.complete();
41
+ }
42
+ ngOnChanges(changes) {
43
+ this.getMonthlyPeformanceData();
44
+ }
45
+ ngOnInit() {
46
+ this.route?.queryParams
47
+ ?.pipe(takeUntil(this.detach))
48
+ .subscribe((params) => {
49
+ if (params.type === 'Checklist') {
50
+ this.selectedvalue = params.checklist;
51
+ this.receivedData = 'Checklist';
52
+ // this.infoCardsData = params.checklistData ? JSON.parse(params.checklistData) : null;
53
+ }
54
+ else if (params.type === 'store') {
55
+ this.selectedvalue = params.store_id;
56
+ this.receivedData = 'Store';
57
+ }
58
+ else if (params.type === 'user') {
59
+ this.selectedvalue = params.userEmail;
60
+ this.receivedData = 'User';
61
+ }
62
+ });
63
+ this.gs.dataRangeValue
64
+ .pipe(takeUntil(this.destroy$), debounceTime(300))
65
+ .subscribe((data) => {
66
+ this.headerData = data;
67
+ if (this.receivedData === 'Checklist') {
68
+ this.getMonthlyPeformanceData();
69
+ }
70
+ else if (this.receivedData === 'User') {
71
+ this.getMonthlyPeformanceData();
72
+ }
73
+ else {
74
+ }
75
+ // this.performanceData = [
76
+ // { "date": 1, "colorClass": "primary900" },
77
+ // { "date": 3, "colorClass": "blue33B5FF" },
78
+ // { "date": 6, "colorClass": "redF04438" },
79
+ // { "date": 7, "colorClass": "lightBlue6BCAFF" },
80
+ // { "date": 8, "colorClass": "blue33B5FF" },
81
+ // { "date": 9, "colorClass": "primary900" },
82
+ // { "date": 12, "colorClass": "primary900" },
83
+ // { "date": 14, "colorClass": "orangeF79009" },
84
+ // { "date": 15, "colorClass": "blue33B5FF" },
85
+ // { "date": 18, "colorClass": "redF04438" }
86
+ // ];
87
+ });
88
+ }
89
+ getMonthlyPeformanceData() {
90
+ this.monthlyPeformanceLoading = true;
91
+ this.monthlyPeformanceNoData = true;
92
+ const requestData = {
93
+ fromDate: this.headerData.date.startDate,
94
+ toDate: this.headerData.date.endDate,
95
+ storeId: [
96
+ "11-1743",
97
+ "11-178",
98
+ "11-1413",
99
+ "11-1833",
100
+ "11-67",
101
+ "11-709"
102
+ ],
103
+ clientId: this.headerData.client,
104
+ groupByType: this.receivedData,
105
+ groupByValue: this.monthlyperformce,
106
+ };
107
+ this.TraxService.getMonthlyPeformanceData(requestData).pipe(takeUntil(this.destroy$)).subscribe((response) => {
108
+ if (response?.code === 200 && response?.status === "success") {
109
+ this.performanceData = response.data?.monthlyChartData || [];
110
+ this.monthlyPeformanceLoading = false;
111
+ this.monthlyPeformanceNoData = false;
112
+ this.changeDetector.detectChanges();
113
+ }
114
+ else {
115
+ this.performanceData = [];
116
+ this.monthlyPeformanceLoading = false;
117
+ this.monthlyPeformanceNoData = true;
118
+ }
119
+ }, error => {
120
+ this.performanceData = [];
121
+ this.monthlyPeformanceLoading = false;
122
+ this.monthlyPeformanceNoData = true;
123
+ this.changeDetector.detectChanges();
124
+ });
125
+ }
126
+ getDaysInMonth() {
127
+ const daysInMonth = new Date(this.currentYear, this.currentMonth + 1, 0).getDate();
128
+ return Array.from({ length: daysInMonth }, (_, i) => i + 1);
129
+ }
130
+ // Get empty days to align the first day of the month with the correct day of the week
131
+ getEmptyDays() {
132
+ const firstDayOfMonth = new Date(this.currentYear, this.currentMonth, 1).getDay();
133
+ return Array(firstDayOfMonth === 0 ? 6 : firstDayOfMonth - 1).fill(0);
134
+ }
135
+ // Get the class name for a given day based on the performance data
136
+ getDayClass(day) {
137
+ const predefinedDay = this.performanceData.find(d => d.date === day);
138
+ return predefinedDay ? predefinedDay.colorClass : '';
139
+ }
140
+ // Navigate to the previous month
141
+ previousMonth() {
142
+ if (this.currentMonth === 0) {
143
+ this.currentMonth = 11;
144
+ this.currentYear--;
145
+ }
146
+ else {
147
+ this.currentMonth--;
148
+ }
149
+ }
150
+ // Navigate to the next month
151
+ nextMonth() {
152
+ if (this.currentMonth === 11) {
153
+ this.currentMonth = 0;
154
+ this.currentYear++;
155
+ }
156
+ else {
157
+ this.currentMonth++;
158
+ }
159
+ }
160
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MonthlyperformanceDatepickerComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.GlobalStateService }, { token: i0.ChangeDetectorRef }, { token: i3.ToastService }, { token: i4.TraxService }], target: i0.ɵɵFactoryTarget.Component });
161
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MonthlyperformanceDatepickerComponent, selector: "lib-monthlyperformance-datepicker", inputs: { monthlyperformce: "monthlyperformce" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"calendar-container\">\r\n <div class=\"performanceheading\">Monthly Performance</div>\r\n <div *ngIf=\"!monthlyPeformanceLoading && !monthlyPeformanceNoData\" class=\"calendar\">\r\n <div class=\"calendar-header my-3\">\r\n <span class=\"cursor-pointer\" (click)=\"previousMonth()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M12.5 15L7.5 10L12.5 5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span>{{ monthNames[currentMonth] }} {{ currentYear }}</span>\r\n <span class=\"cursor-pointer\" (click)=\"nextMonth()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M7.5 15L12.5 10L7.5 5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"calendar-body my-4\">\r\n <div class=\"day-names\">\r\n <div *ngFor=\"let day of dayNames\">{{ day }}</div>\r\n </div>\r\n <div class=\"calendar-days\">\r\n <!-- Empty days to align the start of the month -->\r\n <div *ngFor=\"let _ of getEmptyDays()\" class=\"empty-day\"></div>\r\n <!-- Calendar days with dynamic color assignment via CSS classes -->\r\n <div *ngFor=\"let day of getDaysInMonth()\" [ngClass]=\"getDayClass(day)\" class=\"calendar-day\">\r\n {{ day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"monthlyPeformanceLoading\">\r\n <div class=\"row loader my-6 d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"monthlyPeformanceNoData && !monthlyPeformanceLoading\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Monthly Performance\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n</div>\r\n", styles: [".calendar-container{display:flex;padding:16px 24px;flex-direction:column;align-items:flex-start;gap:12px;border-radius:8px;background:#fff}.calendar{display:flex;flex-direction:column;align-items:center}.calendar-header{display:flex;justify-content:space-between;width:100%;color:var(--Gray-700, #344054);text-align:center;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.calendar-body{display:flex;flex-direction:column;width:100%}.day-names{display:grid;grid-template-columns:repeat(7,1fr);font-weight:700;margin-bottom:10px;text-align:center}.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}.empty-day{visibility:hidden}.calendar-days div{padding:10px;text-align:center;border-radius:50%;cursor:not-allowed}.selected-day{background-color:#00a3ff;color:#fff}.disabled-day{cursor:not-allowed}button{background-color:transparent;border:none;cursor:pointer;font-size:16px}.performanceheading{color:var(--Gray-900, #101828);font-size:18px;font-style:normal;font-weight:600;line-height:28px}.primary900{background-color:var(--Primary-900, #0085D2)}.blue33B5FF{background-color:#33b5ff}.lightBlue6BCAFF{background-color:#6bcaff}.orangeF79009{background-color:#f79009}.redF04438{background-color:#f04438}.calendar-day:hover{opacity:.8}.empty-day{width:40px;height:40px;display:inline-block}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .shimmer .image-card{height:90px;width:90px;float:right;border-radius:8px}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
162
+ }
163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MonthlyperformanceDatepickerComponent, decorators: [{
164
+ type: Component,
165
+ args: [{ selector: 'lib-monthlyperformance-datepicker', template: "<div class=\"calendar-container\">\r\n <div class=\"performanceheading\">Monthly Performance</div>\r\n <div *ngIf=\"!monthlyPeformanceLoading && !monthlyPeformanceNoData\" class=\"calendar\">\r\n <div class=\"calendar-header my-3\">\r\n <span class=\"cursor-pointer\" (click)=\"previousMonth()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M12.5 15L7.5 10L12.5 5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span>{{ monthNames[currentMonth] }} {{ currentYear }}</span>\r\n <span class=\"cursor-pointer\" (click)=\"nextMonth()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M7.5 15L12.5 10L7.5 5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"calendar-body my-4\">\r\n <div class=\"day-names\">\r\n <div *ngFor=\"let day of dayNames\">{{ day }}</div>\r\n </div>\r\n <div class=\"calendar-days\">\r\n <!-- Empty days to align the start of the month -->\r\n <div *ngFor=\"let _ of getEmptyDays()\" class=\"empty-day\"></div>\r\n <!-- Calendar days with dynamic color assignment via CSS classes -->\r\n <div *ngFor=\"let day of getDaysInMonth()\" [ngClass]=\"getDayClass(day)\" class=\"calendar-day\">\r\n {{ day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"monthlyPeformanceLoading\">\r\n <div class=\"row loader my-6 d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"monthlyPeformanceNoData && !monthlyPeformanceLoading\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 my-6\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"nodatamaintext mt-3\">No data found</div>\r\n <div class=\"nodatasubtext\">There is no result for Monthly Performance\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n</div>\r\n", styles: [".calendar-container{display:flex;padding:16px 24px;flex-direction:column;align-items:flex-start;gap:12px;border-radius:8px;background:#fff}.calendar{display:flex;flex-direction:column;align-items:center}.calendar-header{display:flex;justify-content:space-between;width:100%;color:var(--Gray-700, #344054);text-align:center;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.calendar-body{display:flex;flex-direction:column;width:100%}.day-names{display:grid;grid-template-columns:repeat(7,1fr);font-weight:700;margin-bottom:10px;text-align:center}.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}.empty-day{visibility:hidden}.calendar-days div{padding:10px;text-align:center;border-radius:50%;cursor:not-allowed}.selected-day{background-color:#00a3ff;color:#fff}.disabled-day{cursor:not-allowed}button{background-color:transparent;border:none;cursor:pointer;font-size:16px}.performanceheading{color:var(--Gray-900, #101828);font-size:18px;font-style:normal;font-weight:600;line-height:28px}.primary900{background-color:var(--Primary-900, #0085D2)}.blue33B5FF{background-color:#33b5ff}.lightBlue6BCAFF{background-color:#6bcaff}.orangeF79009{background-color:#f79009}.redF04438{background-color:#f04438}.calendar-day:hover{opacity:.8}.empty-day{width:40px;height:40px;display:inline-block}.nodatamaintext{font-family:Inter;font-size:16px;font-weight:600;line-height:24px;text-align:center;color:#101828}.nodatasubtext{font-family:Inter;font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#667085}.loader .title{width:65%}.loader .link{width:85%}.loader .description{width:95%}.loader .shimmer{padding:15px;width:95%;height:120px;margin:10px auto;background:#fff}.loader .shimmer .image-card{height:90px;width:90px;float:right;border-radius:8px}.loader .stroke{height:15px;background:#777;margin-top:20px}.loader .wrapper{width:0px;animation:fullView .5s forwards linear}@keyframes fullView{to{width:100%}}.loader .animate{animation:shimmer 3s;animation-iteration-count:infinite;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%}@keyframes shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}\n"] }]
166
+ }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.GlobalStateService }, { type: i0.ChangeDetectorRef }, { type: i3.ToastService }, { type: i4.TraxService }], propDecorators: { monthlyperformce: [{
167
+ type: Input
168
+ }] } });
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udGhseXBlcmZvcm1hbmNlLWRhdGVwaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYW5hbHlzZS10cmF4L3NyYy9saWIvY29tcG9uZW50cy9kYXNoYm9hcmQtaW5mby9tb250aGx5cGVyZm9ybWFuY2UtZGF0ZXBpY2tlci9tb250aGx5cGVyZm9ybWFuY2UtZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2Rhc2hib2FyZC1pbmZvL21vbnRobHlwZXJmb3JtYW5jZS1kYXRlcGlja2VyL21vbnRobHlwZXJmb3JtYW5jZS1kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUM7QUFFakgsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQWdDLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7OztBQUl0RixDQUFDO0FBT0QsTUFBTSxPQUFPLHFDQUFxQztJQWlCNUI7SUFBK0I7SUFBc0I7SUFBK0I7SUFBMEM7SUFDeEk7SUFqQlYsV0FBVyxHQUFXLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0MsWUFBWSxHQUFXLElBQUksSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0MsUUFBUSxHQUFhLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsVUFBVSxHQUFhLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVB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LElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNyRSxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLFNBQVM7UUFDUCxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssRUFBRSxFQUFFO1lBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQjthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQzt3R0ExSlUscUNBQXFDOzRGQUFyQyxxQ0FBcUMsZ0pDYmxELHcvRkE2REE7OzRGRGhEYSxxQ0FBcUM7a0JBTGpELFNBQVM7K0JBQ0UsbUNBQW1DOzhOQWtCcEMsZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFN1YmplY3QsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW1vbnRobHlwZXJmb3JtYW5jZS1kYXRlcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbW9udGhseXBlcmZvcm1hbmNlLWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9tb250aGx5cGVyZm9ybWFuY2UtZGF0ZXBpY2tlci5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIE1vbnRobHlwZXJmb3JtYW5jZURhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXN7XHJcbiAgY3VycmVudFllYXI6IG51bWJlciA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcclxuICBjdXJyZW50TW9udGg6IG51bWJlciA9IG5ldyBEYXRlKCkuZ2V0TW9udGgoKTtcclxuICBkYXlOYW1lczogc3RyaW5nW10gPSBbJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJywgJ1N1J107XHJcbiAgbW9udGhOYW1lczogc3RyaW5nW10gPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXTtcclxuICBoZWFkZXJEYXRhOiBhbnk7XHJcblxyXG4gIHBlcmZvcm1hbmNlRGF0YTogYW55W10gPSBbXTsgLy8gVGhpcyB3aWxsIHN0b3JlIHRoZSBwZXJmb3JtYW5jZSBkYXRhIGZyb20gdGhlIEFQSSByZXNwb25zZVxyXG4gIHByaXZhdGUgZGV0YWNoID0gbmV3IFN1YmplY3QoKTtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICByZWNlaXZlZERhdGE6IHN0cmluZyA9IFwiQ2hlY2tsaXN0XCI7XHJcbiAgc2VsZWN0ZWR2YWx1ZTogYW55O1xyXG4gIG1vbnRobHlQZWZvcm1hbmNlTG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgbW9udGhseVBlZm9ybWFuY2VOb0RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBtb250aGx5cGVyZm9ybWNlOiBzdHJpbmc7XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIFRyYXhTZXJ2aWNlOiBUcmF4U2VydmljZSxcclxuICApIHsgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXRhY2gubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGV0YWNoLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLmdldE1vbnRobHlQZWZvcm1hbmNlRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlPy5xdWVyeVBhcmFtc1xyXG4/LnBpcGUodGFrZVVudGlsKHRoaXMuZGV0YWNoKSlcclxuLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XHJcbiAgaWYgKHBhcmFtcy50eXBlID09PSAnQ2hlY2tsaXN0Jykge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkdmFsdWUgPSBwYXJhbXMuY2hlY2tsaXN0XHJcbiAgICB0aGlzLnJlY2VpdmVkRGF0YSA9ICdDaGVja2xpc3QnO1xyXG4gICAgLy8gdGhpcy5pbmZvQ2FyZHNEYXRhID0gcGFyYW1zLmNoZWNrbGlzdERhdGEgPyBKU09OLnBhcnNlKHBhcmFtcy5jaGVja2xpc3REYXRhKSA6IG51bGw7XHJcbiAgfSBlbHNlIGlmIChwYXJhbXMudHlwZSA9PT0gJ3N0b3JlJykge1xyXG4gICAgdGhpcy5zZWxlY3RlZHZhbHVlID0gcGFyYW1zLnN0b3JlX2lkXHJcbiAgICB0aGlzLnJlY2VpdmVkRGF0YSA9ICdTdG9yZSc7XHJcbiAgfSBlbHNlIGlmIChwYXJhbXMudHlwZSA9PT0gJ3VzZXInKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkdmFsdWUgPSBwYXJhbXMudXNlckVtYWlsXHJcbiAgICB0aGlzLnJlY2VpdmVkRGF0YSA9ICdVc2VyJztcclxuICB9XHJcbn0pO1xyXG5cclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmhlYWRlckRhdGEgPSBkYXRhO1xyXG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVkRGF0YSA9PT0gJ0NoZWNrbGlzdCcpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0TW9udGhseVBlZm9ybWFuY2VEYXRhKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlY2VpdmVkRGF0YSA9PT0gJ1VzZXInKSB7XHJcbiAgICAgICAgICB0aGlzLmdldE1vbnRobHlQZWZvcm1hbmNlRGF0YSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAgXHJcblxyXG5cclxuICAgICAgICAvLyB0aGlzLnBlcmZvcm1hbmNlRGF0YSA9IFtcclxuICAgICAgICAvLyAgIHsgXCJkYXRlXCI6IDEsIFwiY29sb3JDbGFzc1wiOiBcInByaW1hcnk5MDBcIiB9LFxyXG4gICAgICAgIC8vICAgeyBcImRhdGVcIjogMywgXCJjb2xvckNsYXNzXCI6IFwiYmx1ZTMzQjVGRlwiIH0sXHJcbiAgICAgICAgLy8gICB7IFwiZGF0ZVwiOiA2LCBcImNvbG9yQ2xhc3NcIjogXCJyZWRGMDQ0MzhcIiB9LFxyXG4gICAgICAgIC8vICAgeyBcImRhdGVcIjogNywgXCJjb2xvckNsYXNzXCI6IFwibGlnaHRCbHVlNkJDQUZGXCIgfSxcclxuICAgICAgICAvLyAgIHsgXCJkYXRlXCI6IDgsIFwiY29sb3JDbGFzc1wiOiBcImJsdWUzM0I1RkZcIiB9LFxyXG4gICAgICAgIC8vICAgeyBcImRhdGVcIjogOSwgXCJjb2xvckNsYXNzXCI6IFwicHJpbWFyeTkwMFwiIH0sXHJcbiAgICAgICAgLy8gICB7IFwiZGF0ZVwiOiAxMiwgXCJjb2xvckNsYXNzXCI6IFwicHJpbWFyeTkwMFwiIH0sXHJcbiAgICAgICAgLy8gICB7IFwiZGF0ZVwiOiAxNCwgXCJjb2xvckNsYXNzXCI6IFwib3JhbmdlRjc5MDA5XCIgfSxcclxuICAgICAgICAvLyAgIHsgXCJkYXRlXCI6IDE1LCBcImNvbG9yQ2xhc3NcIjogXCJibHVlMzNCNUZGXCIgfSxcclxuICAgICAgICAvLyAgIHsgXCJkYXRlXCI6IDE4LCBcImNvbG9yQ2xhc3NcIjogXCJyZWRGMDQ0MzhcIiB9XHJcbiAgICAgICAgLy8gXTtcclxuICAgICAgIFxyXG5cclxufSlcclxuICAgXHJcbiAgICBcclxuXHJcbiAgfVxyXG5cclxuICBnZXRNb250aGx5UGVmb3JtYW5jZURhdGEoKTogdm9pZCB7IFxyXG4gICAgdGhpcy5tb250aGx5UGVmb3JtYW5jZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5tb250aGx5UGVmb3JtYW5jZU5vRGF0YSA9IHRydWU7XHJcbiAgICBjb25zdCByZXF1ZXN0RGF0YSA9IHtcclxuICAgICAgZnJvbURhdGU6IHRoaXMuaGVhZGVyRGF0YS5kYXRlLnN0YXJ0RGF0ZSxcclxuICAgICAgdG9EYXRlOiB0aGlzLmhlYWRlckRhdGEuZGF0ZS5lbmREYXRlLFxyXG4gICAgICBzdG9yZUlkOiBbXHJcbiAgICAgICAgXCIxMS0xNzQzXCIsXHJcbiAgICAgICAgXCIxMS0xNzhcIixcclxuICAgICAgICBcIjExLTE0MTNcIixcclxuICAgICAgICBcIjExLTE4MzNcIixcclxuICAgICAgICBcIjExLTY3XCIsXHJcbiAgICAgICAgXCIxMS03MDlcIlxyXG4gICAgICBdLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhLmNsaWVudCxcclxuICAgICAgZ3JvdXBCeVR5cGU6IHRoaXMucmVjZWl2ZWREYXRhLFxyXG4gICAgICBncm91cEJ5VmFsdWU6IHRoaXMubW9udGhseXBlcmZvcm1jZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5UcmF4U2VydmljZS5nZXRNb250aGx5UGVmb3JtYW5jZURhdGEocmVxdWVzdERhdGEpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlPy5jb2RlID09PSAyMDAgJiYgcmVzcG9uc2U/LnN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1hbmNlRGF0YSA9IHJlc3BvbnNlLmRhdGE/Lm1vbnRobHlDaGFydERhdGEgfHwgW107XHJcbiAgICAgICAgdGhpcy5tb250aGx5UGVmb3JtYW5jZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm1vbnRobHlQZWZvcm1hbmNlTm9EYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZURhdGEgPSBbXVxyXG4gICAgICAgIHRoaXMubW9udGhseVBlZm9ybWFuY2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tb250aGx5UGVmb3JtYW5jZU5vRGF0YSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBlcnJvciA9PiB7XHJcbiAgICAgIHRoaXMucGVyZm9ybWFuY2VEYXRhID0gW11cclxuICAgICAgdGhpcy5tb250aGx5UGVmb3JtYW5jZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm1vbnRobHlQZWZvcm1hbmNlTm9EYXRhID0gdHJ1ZTtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldERheXNJbk1vbnRoKCk6IG51bWJlcltdIHtcclxuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGggKyAxLCAwKS5nZXREYXRlKCk7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogZGF5c0luTW9udGggfSwgKF8sIGkpID0+IGkgKyAxKTtcclxuICB9XHJcblxyXG4gIC8vIEdldCBlbXB0eSBkYXlzIHRvIGFsaWduIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoIHdpdGggdGhlIGNvcnJlY3QgZGF5IG9mIHRoZSB3ZWVrXHJcbiAgZ2V0RW1wdHlEYXlzKCk6IG51bWJlcltdIHtcclxuICAgIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoLCAxKS5nZXREYXkoKTtcclxuICAgIHJldHVybiBBcnJheShmaXJzdERheU9mTW9udGggPT09IDAgPyA2IDogZmlyc3REYXlPZk1vbnRoIC0gMSkuZmlsbCgwKTtcclxuICB9XHJcblxyXG4gIC8vIEdldCB0aGUgY2xhc3MgbmFtZSBmb3IgYSBnaXZlbiBkYXkgYmFzZWQgb24gdGhlIHBlcmZvcm1hbmNlIGRhdGFcclxuICBnZXREYXlDbGFzcyhkYXk6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwcmVkZWZpbmVkRGF5ID0gdGhpcy5wZXJmb3JtYW5jZURhdGEuZmluZChkID0+IGQuZGF0ZSA9PT0gZGF5KTtcclxuICAgIHJldHVybiBwcmVkZWZpbmVkRGF5ID8gcHJlZGVmaW5lZERheS5jb2xvckNsYXNzIDogJyc7XHJcbiAgfVxyXG5cclxuICAvLyBOYXZpZ2F0ZSB0byB0aGUgcHJldmlvdXMgbW9udGhcclxuICBwcmV2aW91c01vbnRoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudE1vbnRoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMTE7XHJcbiAgICAgIHRoaXMuY3VycmVudFllYXItLTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoLS07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBOYXZpZ2F0ZSB0byB0aGUgbmV4dCBtb250aFxyXG4gIG5leHRNb250aCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMTEpIHtcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAwO1xyXG4gICAgICB0aGlzLmN1cnJlbnRZZWFyKys7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aCsrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJwZXJmb3JtYW5jZWhlYWRpbmdcIj5Nb250aGx5IFBlcmZvcm1hbmNlPC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cIiFtb250aGx5UGVmb3JtYW5jZUxvYWRpbmcgJiYgIW1vbnRobHlQZWZvcm1hbmNlTm9EYXRhXCIgY2xhc3M9XCJjYWxlbmRhclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRlciBteS0zXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicHJldmlvdXNNb250aCgpXCI+XHJcbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTEyLjUgMTVMNy41IDEwTDEyLjUgNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxzcGFuPnt7IG1vbnRoTmFtZXNbY3VycmVudE1vbnRoXSB9fSB7eyBjdXJyZW50WWVhciB9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJuZXh0TW9udGgoKVwiPlxyXG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk03LjUgMTVMMTIuNSAxMEw3LjUgNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1ib2R5IG15LTRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRheS1uYW1lc1wiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlOYW1lc1wiPnt7IGRheSB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWRheXNcIj5cclxuICAgICAgICA8IS0tIEVtcHR5IGRheXMgdG8gYWxpZ24gdGhlIHN0YXJ0IG9mIHRoZSBtb250aCAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBfIG9mIGdldEVtcHR5RGF5cygpXCIgY2xhc3M9XCJlbXB0eS1kYXlcIj48L2Rpdj5cclxuICAgICAgICA8IS0tIENhbGVuZGFyIGRheXMgd2l0aCBkeW5hbWljIGNvbG9yIGFzc2lnbm1lbnQgdmlhIENTUyBjbGFzc2VzIC0tPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRheSBvZiBnZXREYXlzSW5Nb250aCgpXCIgW25nQ2xhc3NdPVwiZ2V0RGF5Q2xhc3MoZGF5KVwiIGNsYXNzPVwiY2FsZW5kYXItZGF5XCI+XHJcbiAgICAgICAgICB7eyBkYXkgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9udGhseVBlZm9ybWFuY2VMb2FkaW5nXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciAgbXktNiBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCJtb250aGx5UGVmb3JtYW5jZU5vRGF0YSAmJiAhbW9udGhseVBlZm9ybWFuY2VMb2FkaW5nXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBteS02XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibm9kYXRhbWFpbnRleHQgbXQtM1wiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGFzdWJ0ZXh0XCI+VGhlcmUgaXMgbm8gcmVzdWx0IGZvciBNb250aGx5IFBlcmZvcm1hbmNlXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG4iXX0=